ZGlmZiAtLWdpdCBhL2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0L3BvbS54bWwgYi9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9wb20ueG1sCmluZGV4IGNjZGIxODYuLmQwN2Y3OTEgMTAwNjQ0Ci0tLSBhL2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0L3BvbS54bWwKKysrIGIvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvcG9tLnhtbApAQCAtMTMxLDM4ICsxMzEsNiBAQAogICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgogICAgICAgICAgICAgPGJ1aWxkPgogICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8IS0tIEZldGNoZXMgZG9jcyBmcm9tICR7ZG9jcy5kb3dubG9hZC5kaXJlY3Rvcnl9IC0tPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmZldGNoLWRvY3M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZXhlYzwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0YWJsZT53Z2V0PC9leGVjdXRhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+LS1kaXJlY3RvcnktcHJlZml4PSR7ZG9jcy5kb3dubG9hZC5kaXJlY3Rvcnl9PC9hcmd1bWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+LS1kb21haW5zPWNoZW1pc3RyeS5hcGFjaGUub3JnPC9hcmd1bWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+LS1taXJyb3I8L2FyZ3VtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudD4tazwvYXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50Pi1ucDwvYXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50Pi0taW5jbHVkZS1kaXJlY3Rvcmllcz0vamF2YS88L2FyZ3VtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudD4tLWV4Y2x1ZGUtZGlyZWN0b3JpZXM9L2phdmEvMC40LjAvbWF2ZW4vLC9qYXZhLzAuNS4wL21hdmVuLywvamF2YS8wLjYuMC9tYXZlbi8sL2phdmEvMC43LjAvbWF2ZW4vPC9hcmd1bWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+JHtkb2NzLnN0YXJ0LnVybH08L2FyZ3VtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VjY2Vzc0NvZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdWNjZXNzQ29kZT44PC9zdWNjZXNzQ29kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VjY2Vzc0NvZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgpAQCAtMTgwLDkgKzE0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9tYWluL2Fzc2VtYmx5L3NlcnZlci13ZWJhcHBzLWFzc2VtYmx5LnhtbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL21haW4vYXNzZW1ibHkvZG9jcy1hc3NlbWJseS54bWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3I+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CmRpZmYgLS1naXQgYS9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9zcmMvbWFpbi9hc3NlbWJseS9kb2NzLWFzc2VtYmx5LnhtbCBiL2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0L3NyYy9tYWluL2Fzc2VtYmx5L2RvY3MtYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjEyODlmLi4wMDAwMDAwCi0tLSBhL2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0L3NyYy9tYWluL2Fzc2VtYmx5L2RvY3MtYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSAgICA8IS0tCi0gICAgICAgIExpY2UgbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yCi0gICAgICAgIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZwotICAgICAgICBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlCi0gICAgICAgIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZQotICAgICAgICB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4KLSAgICAgICAgYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieQotICAgICAgICBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQKLSAgICAgICAgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICAgICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICAgICAgICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAgLS0+Ci08YXNzZW1ibHkKLSAgICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjEiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4xIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMS54c2QiPgotICAgIDwhLS0gVG8gYnVpbGQgdGhpcywgcnVuICJtdm4gcGFja2FnZSBhc3NlbWJseTphc3NlbWJseSIgLS0+Ci0gICAgPGlkPmRvY3M8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2Rvd25sb2FkZWQtc2l0ZS9jaGVtaXN0cnkuYXBhY2hlLm9yZy9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNpdGVkb2NzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Kio8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3BhcmVudEJhc2VkaXJ9L3RhcmdldC9zaXRlL2FwaWRvY3M8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF2YWRvY3M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPCEtLSBsaWNlbnNlLCByZWFkbWUsIGV0Yy4gY2FsY3VsYXRlZCBhdCBidWlsZCB0aW1lIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5ERVBFTkRFTkNJRVM8L2V4Y2x1ZGU+Ci0JCSAgICAgICAgPGV4Y2x1ZGU+Tk9USUNFPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+REVQRU5ERU5DSUVTPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3RydW5rL1JFQURNRS50eHQgYi90cnVuay9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmZlZmZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BcGFjaGUgQ2hlbWlzdHJ5IE9wZW5DTUlTCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLU9wZW5DTUlTIGlzIGEgY29sbGVjdGlvbiBvZiBKYXZhIGxpYnJhcmllcywgZnJhbWV3b3JrcyBhbmQgdG9vbHMgYXJvdW5kCi10aGUgQ01JUyAoQ29udGVudCBNYW5hZ2VtZW50IEludGVyb3BlcmFiaWxpdHkgU2VydmljZXMpIHNwZWNpZmljYXRpb24uCi0KLU9wZW5DTUlTIHN1cHBvcnRzIHRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb25zCi0gLSBDTUlTIDEuMCA8aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvY21pcy9DTUlTL3YxLjAvY21pcy1zcGVjLXYxLjAuaHRtbD4KLSAtIENNSVMgMS4xIDxodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9jbWlzL0NNSVMvdjEuMS9DTUlTLXYxLjEuaHRtbD4KLQotCi1CdWlsZGluZyBPcGVuQ01JUwotPT09PT09PT09PT09PT09PT0KLQotWW91IGNhbiBidWlsZCBPcGVuQ01JUyBsaWtlIHRoaXM6Ci0KLSAgICBtdm4gY2xlYW4gaW5zdGFsbAotCi1Zb3UgbmVlZCBNYXZlbiAzIHdpdGggSmF2YSA2IChvciBoaWdoZXIpIGZvciB0aGUgYnVpbGQuCi1TZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE1BVkVOX09QVFMgdG8gCi0nLVhteDEwMjRtIC1YWDpNYXhQZXJtU2l6ZT0yNTZtJyB0byBnaXZlIE1hdmVuIG1vcmUgbWVtb3J5LgotCi1MaWNlbnNlIChzZWUgYWxzbyBwYWNrYWdlIHNwZWNpZmljIExJQ0VOU0UgZmlsZXMpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNvbGxlY3RpdmUgd29yazogQ29weXJpZ2h0IDIwMTAtMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi10aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi1UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1EZXBlbmRlbmNpZXMgd2l0aCAiV2VhayBDb3B5bGVmdCIgb3IgZHVhbCBsaWNlbnNlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotT3BlbkNNSVMgdXNlcyBzb21lIGxpYnJhcmllcyB3aXRoIG9wZW4gc291cmNlIGxpY2Vuc2VzIHRoYXQgcmVxdWlyZSByZWNpcHJvY2FsCi1saWNlbnNpbmcgd2hlbiBtb2RpZmllZC4gVGhlc2UgbGlicmFyaWVzIGFyZSBpbmNsdWRlZCBpbiB1bm1vZGlmaWVkIGJpbmFyeQotZm9ybSBhbmQgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGVybXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZQotQXBhY2hlIExpY2Vuc2UuCi0KLVNvbWUgbGlicmFyaWVzIHVzZWQgYnkgT3BlbkNNSVMgYXJlIGR1YWwtbGljZW5zZWQgdW5kZXIgZGlmZmVyZW50IG9wZW4gc291cmNlCi1saWNlbnNlcy4gVGhlc2UgbGlicmFyaWVzIGFyZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBsaWNlbnNlIHdob3NlIHRlcm1zCi1hcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBBcGFjaGUgTGljZW5zZS4KLQotU2VlIExJQ0VOU0UgZmlsZSBpbmNsdWRlZCBpbiBhbGwgQXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUyBwYWNrYWdlcyBmb3IgCi1mdWxsIGxpY2Vuc2luZyBkZXRhaWxzLgotCmRpZmYgLS1naXQgYS90cnVuay9fZGV2L0Zvcm1hdHRpbmdfcHJlc2V0cy54bWwgYi90cnVuay9fZGV2L0Zvcm1hdHRpbmdfcHJlc2V0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDI3NzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvX2Rldi9Gb3JtYXR0aW5nX3ByZXNldHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPCEtLQotCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLQotLS0+Ci0KLTxwcm9maWxlcyB2ZXJzaW9uPSIxMSI+Ci08cHJvZmlsZSBraW5kPSJDb2RlRm9ybWF0dGVyUHJvZmlsZSIgbmFtZT0iT3BlbkNNSVMiIHZlcnNpb249IjExIj4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbiIgdmFsdWU9IjgwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2UiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uIiB2YWx1ZT0iMiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bmsiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIgdmFsdWU9IjEuNSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fd3JhcHBlZF9saW5lcyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGwiIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2ZvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbiIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQiIHZhbHVlPSIxMjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb24iIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemUiIHZhbHVlPSI0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudCIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXIiIHZhbHVlPSJlcnJvciIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXIiIHZhbHVlPSJzcGFjZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5IiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3QiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZW5kX29mX2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWYiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2giIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm4iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3ciIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2giIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2siIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZiIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQiIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemUiIHZhbHVlPSI0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZSIgdmFsdWU9ImVuZF9vZl9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZSIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2giIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlIiB2YWx1ZT0iMS41Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSIyIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2ZvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZSIgdmFsdWU9ImVuYWJsZWQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZSIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGgiIHZhbHVlPSI4MCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHMiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5IiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucyIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jayIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fbGluZXNfaW5fY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybSIgdmFsdWU9IjEuNSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXIiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHMiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jayIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJlbmRfb2ZfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2ZvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cyIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlciIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW4iIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08L3Byb2ZpbGU+Ci08L3Byb2ZpbGVzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvX2Rldi9jb2RldGVtcGxhdGVzLnhtbCBiL3RydW5rL19kZXYvY29kZXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTc5ZTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvX2Rldi9jb2RldGVtcGxhdGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/Pjx0ZW1wbGF0ZXM+PHRlbXBsYXRlIGF1dG9pbnNlcnQ9ImZhbHNlIiBjb250ZXh0PSJuZXd0eXBlX2NvbnRleHQiIGRlbGV0ZWQ9ImZhbHNlIiBkZXNjcmlwdGlvbj0iTmV3bHkgY3JlYXRlZCBmaWxlcyIgZW5hYmxlZD0idHJ1ZSIgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZT0ibmV3dHlwZSI+LyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0ke3BhY2thZ2VfZGVjbGFyYXRpb259Ci0KLSR7dHlwZWNvbW1lbnR9Ci0ke3R5cGVfZGVjbGFyYXRpb259PC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvUkVBRE1FIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjMDkzMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLU9wZW5DTUlTIEFuZHJvaWQgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGUgT3BlbkNNSVMgQW5kcm9pZCBDbGllbnQgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGhvZHMgdG8gYWNjZXNzIGFuZCBtYW5hZ2UgQ01JUyBSZXBvc2l0b3J5Lg0KLQ0KLQ0KLU9wZW5DTUlTIENsaWVudCBCaW5kaW5ncyBzdXBwb3J0ZWQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotT3BlbkNNSVMgQW5kcm9pZCBDbGllbnQgc3VwcG9ydHMgdGhlIEF0b21QdWIgQmluZGluZyBhbmQgdGhlIEJyb3dzZXIgQmluZGluZy4NCi1UaGUgV2ViIFNlcnZpY2UgQmluZGluZyAoU09BUCBwcm90b2NvbCkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnkuDQotDQotDQotQW5kcm9pZCBWZXJzaW9uIFN1cHBvcnRlZA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1QcmV2aW91cyB2ZXJzaW9ucyBvZiBBbmRyb2lkIGRvbid0IGNvbnRhaW4gYWxsIGRlcGVuZGVuY2llcyByZXF1aXJlZCB0byBydW4gYW5kIHVzZSBPcGVuQ01JUyBBbmRyb2lkIGNsaWVudC4gIA0KLUl0J3Mgb25seSBzaW5jZSBBbmRyb2lkIDIuMyAoYWthIEdpbmdlcmJyZWFkKSBldmVyeXRoaW5nIHdvcmtzLiANCi1JbiBvdGhlciB0ZXJtcywgQW5kcm9pZCBjbGllbnQgc3VwcG9ydHMgQW5kcm9pZCAyLjMgYW5kIGFib3ZlLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gISEhIElNUE9SVEFOVCBOT1RFICEhIQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1PcGVuQ01JUyBBbmRyb2lkIENsaWVudCBpcyBhIFNZTkNIUk9OT1VTIGxpYnJhcnkgISANCi1JdCdzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBlbmNhcHN1bGF0ZSBhbGwgQ01JUyBvcGVyYXRpb25zIGluIGJhY2tncm91bmQgdGhyZWFkLiANCi1JbiBBbmRyb2lkIGl0J3MgcG9zc2libGUgdG8gdXNlDQotKwlTZXJ2aWNlcw0KLSsJTG9hZGVycw0KLSsJQXN5bmNUYXNrDQotKwlUaHJlYWQvSGFuZGxlcg0KLQ0KLUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRocmVhZCBhbmQgYmFja2dyb3VuZCB0YXNrIDogPGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvY29tcG9uZW50cy9wcm9jZXNzZXMtYW5kLXRocmVhZHMuaHRtbD4NCi0NCi0NCi1JbXBvcnRpbmcgdGhlIEFuZHJvaWQgT3BlbkNNSVMgQ2xpZW50IGludG8geW91ciBBbmRyb2lkIFByb2plY3QNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1UaGUgQW5kcm9pZCBPcGVuQ01JUyBDbGllbnQgcmVxdWlyZXMgU0xGNEogZm9yIGFuZHJvaWQuDQotRG93bmxvYWQgaXQgZnJvbSBoZXJlOiA8aHR0cDovL3d3dy5zbGY0ai5vcmcvYW5kcm9pZC8+DQotDQotUHV0IHRoZSBBbmRyb2lkIE9wZW5DTUlTIENsaWVudCBKYXIgYW5kIFNMRjRKIGphciBpbnRvIHlvdXIgQW5kcm9pZCBwcm9qZWN0IGxpYnMgZm9sZGVyLiANCi1Ob3cgeW91J3JlIHJlYWR5IHRvIHVzZSBPcGVuQ01JUyBpbnNpZGUgeW91ciBwcm9qZWN0Lg0KLQ0KLUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFByb2plY3QgbGlicyBmb2xkZXIgOiA8aHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tL3JlY2VudC9kZWFsaW5nd2l0aGRlcGVuZGVuY2llc2luYW5kcm9pZHByb2plY3RzPg0KLQ0KLUltcG9ydGluZyB0aGUgQW5kcm9pZCBPcGVuQ01JUyBDbGllbnQgd2l0aCBNYXZlbiANCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1JZiB5b3UgdXNlIE1hdmVuIHRvIGJ1aWxkIHlvdXIgQW5kcm9pZCBQcm9qZWN0LCBpdCdzIHBvc3NpYmxlIHRvIGFkZCB0aGlzIGxpYnJhcnkgYXMgTWF2ZW4gZGVwZW5kZW5jeS4NCi0NCi1BZGQgdG8geW91ciBwb20gcHJvamVjdCA6IA0KLQ0KLTxkZXBlbmRlbmNpZXM+DQotCS4uLg0KLQk8ZGVwZW5kZW5jeT4NCi0JCTxncm91cElkPmNvbS5nb29nbGUuYW5kcm9pZDwvZ3JvdXBJZD4NCi0JCTxhcnRpZmFjdElkPmFubm90YXRpb25zPC9hcnRpZmFjdElkPg0KLQk8L2RlcGVuZGVuY3k+DQotCTxkZXBlbmRlbmN5Pg0KLQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+DQotCQk8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQ8L2FydGlmYWN0SWQ+DQotCQk8dmVyc2lvbj54LnoueTwvdmVyc2lvbj4NCi0JCTxleGNsdXNpb25zPg0KLQkJCTxleGNsdXNpb24+DQotCQkJCTxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4NCi0JCQkJPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPg0KLQkJCTwvZXhjbHVzaW9uPg0KLQkJPC9leGNsdXNpb25zPg0KLQk8L2RlcGVuZGVuY3k+DQotCTxkZXBlbmRlbmN5Pg0KLQkJPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPg0KLQkJPGFydGlmYWN0SWQ+c2xmNGotYW5kcm9pZDwvYXJ0aWZhY3RJZD4NCi0JCTx2ZXJzaW9uPjEuNy41PC92ZXJzaW9uPg0KLQk8L2RlcGVuZGVuY3k+DQotCS4uLg0KLTwvZGVwZW5kZW5jaWVzPg0KLQ0KLQ0KLUNvZGUgc2FtcGxlDQotLS0tLS0tLS0tLS0NCi1UaGlzIGNvZGUgc2FtcGxlIGlsbHVzdHJhdGVzIGhvdyB0byBkaXNwbGF5IGluIGEgc2ltcGxlIFRleHRWaWV3IGEgbGlzdCBvZiBmb2xkZXIgY2hpbGRyZW4uDQotICANCi1wdWJsaWMgY2xhc3MgRmlyc3RPcGVuQ01JU0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgew0KLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsNCi0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjdGl2aXR5X21haW4pOw0KLSAgICAgICAgbmV3IEZpcnN0T3BlbkNNSVNBc3luY1Rhc2soKS5leGVjdXRlKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7DQotICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5hY3Rpdml0eV9tYWluLCBtZW51KTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgcHJpdmF0ZSBjbGFzcyBGaXJzdE9wZW5DTUlTQXN5bmNUYXNrIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIFN0cmluZz4NCi0gICAgew0KLSAgICAJQE92ZXJyaWRlDQotICAgIAlwcm90ZWN0ZWQgU3RyaW5nIGRvSW5CYWNrZ3JvdW5kKFZvaWQuLi4gYXJnMCkgew0KLSAgICAJCQ0KLSAgICAJCVNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5ID0gU2Vzc2lvbkZhY3RvcnlJbXBsLm5ld0luc3RhbmNlKCk7DQotICAgIAkJTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgCQlwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgImFkbWluIik7DQotICAgIAkJcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCAiYWRtaW4iKTsNCi0gICAgCQlwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkwsICJodHRwOi8vMTkyLjE2OC4xLjEwMDo4MDgwL2lubWVtb3J5L2F0b20vIik7DQotICAgIAkJcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQVRPTVBVQi52YWx1ZSgpKTsNCi0gICAgCQlSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBzZXNzaW9uRmFjdG9yeS5nZXRSZXBvc2l0b3JpZXMocGFyYW1ldGVyKS5nZXQoMCk7DQotICAgIAkJcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQsIHJlcG9zaXRvcnkuZ2V0SWQoKSk7DQotICAgIAkJU2Vzc2lvbiBzZXNzaW9uID0gc2Vzc2lvbkZhY3RvcnkuY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXIpOw0KLSAgICAJCQ0KLSAgICAJCVN0cmluZyBsaXN0Q2hpbGRyZW4gPSAiIjsNCi0gICAgCQlGb2xkZXIgbWVkaWFGb2xkZXIgPSAoRm9sZGVyKSBzZXNzaW9uLmdldE9iamVjdEJ5UGF0aCgiL21lZGlhIik7DQotICAgIAkJSXRlbUl0ZXJhYmxlPENtaXNPYmplY3Q+IGNoaWxkcmVuID0gbWVkaWFGb2xkZXIuZ2V0Q2hpbGRyZW4oKTsNCi0gICAgCSAgICBmb3IgKENtaXNPYmplY3QgbyA6IGNoaWxkcmVuKSB7DQotICAgIAkgICAgCWxpc3RDaGlsZHJlbiArPSBvLmdldE5hbWUoKSArICIgLSAiICsgby5nZXRUeXBlKCkuZ2V0RGlzcGxheU5hbWUoKSArICIgLSAiICsgby5nZXRDcmVhdGVkQnkoKSArICJcYlxuIjsNCi0gICAgCSAgICB9DQotICAgIAkJDQotICAgIAkJcmV0dXJuIGxpc3RDaGlsZHJlbjsNCi0gICAgCX0NCi0NCi0gICAgCUBPdmVycmlkZQ0KLSAgICAJcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShTdHJpbmcgcmVzdWx0KSB7DQotICAgIAkJVGV4dFZpZXcgdHYgPSAoVGV4dFZpZXcpIChGaXJzdE9wZW5DTUlTQWN0aXZpdHkudGhpcykuZmluZFZpZXdCeUlkKFIuaWQub3BlbmNtaXNfdGV4dCk7DQotICAgIAkJdHYuc2V0VGV4dChyZXN1bHQpOw0KLSAgICAJfQ0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDVkOTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotICAgIDwhLS0KLSAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieQotICAgICAgICBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQKLSAgICAgICAgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICAgICAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICAgICAgICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotCTxwYXJlbnQ+Ci0JCTxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotCQk8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0JCTx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLQkJPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0JPC9wYXJlbnQ+Ci0KLQk8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQ8L2FydGlmYWN0SWQ+Ci0JPG5hbWU+T3BlbkNNSVMgQW5kcm9pZCBDbGllbnQ8L25hbWU+Ci0JPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotCTxwcm9wZXJ0aWVzPgotCQk8cGFyZW50QmFzZWRpcj4uLi8uLi88L3BhcmVudEJhc2VkaXI+Ci0JPC9wcm9wZXJ0aWVzPgotCi0JPGRlcGVuZGVuY2llcz4KLQkJPGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5jb20uZ29vZ2xlLmFuZHJvaWQ8L2dyb3VwSWQ+Ci0JCQk8YXJ0aWZhY3RJZD5hbmRyb2lkPC9hcnRpZmFjdElkPgotCQkJPHZlcnNpb24+Mi4zLjM8L3ZlcnNpb24+Ci0JCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotCQk8L2RlcGVuZGVuY3k+Ci0JPC9kZXBlbmRlbmNpZXM+Ci0KLQk8YnVpbGQ+Ci0JCTxwbHVnaW5zPgotCQkgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAJCTxwcm9wZXJ0eSBuYW1lPSJnZW5kaXIiIHZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9vcGVuY21pcy1jb3JlIiAvPgotCi0JCQkJCQkJCTxwcm9wZXJ0eSBuYW1lPSJiYXNlZGlyIiB2YWx1ZT0iJHttYXZlbi5iYXNlZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtYXBpIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLi9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWltcGwiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGllbnQtYmluZGluZ3MiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsaWVudC1hcGkiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGllbnQtaW1wbCIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4vY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZWZpbGVzIiB2YWx1ZT0ic3JjL21haW4vamF2YSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQk8Y29weSB0b2Rpcj0iJHtnZW5kaXJ9Ij4KLQkJCQkJCQkJCTxmaWxlc2V0IGRpcj0iJHtjb21tb25zLWFwaX0vJHtzb3VyY2VmaWxlc30iPgotCQkJCQkJCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIgLz4KLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPGNvcHkgdG9kaXI9IiR7Z2VuZGlyfSI+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9IiR7Y29tbW9ucy1pbXBsfS8ke3NvdXJjZWZpbGVzfSI+Ci0JCQkJCQkJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgotCQkJCQkJCQkJCTxleGNsdWRlIG5hbWU9IioqL3R1YmUvKioiIC8+Ci0JCQkJCQkJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovamF4Yi8qKiIgLz4KLQkJCQkJCQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi93ZWJzZXJ2aWNlcy8qKiIgLz4KLQkJCQkJCQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9pbXBsL1dTQ29udmVydGVyLioiIC8+Ci0JCQkJCQkJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovaW1wbC9YTUxDb252ZXJ0ZXIuKiIgLz4KLQkJCQkJCQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9pbXBsL1hNTENvbnZlcnRlci4qIiAvPgotCQkJCQkJCQkJCTxleGNsdWRlIG5hbWU9IioqL2ltcGwvWE1MVXRpbHMuKiIgLz4KLQkJCQkJCQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9pbXBsL1hNTFdhbGtlci4qIiAvPgkJCQkJCQkJCQkKLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGNvcHkgdG9kaXI9IiR7Z2VuZGlyfSI+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9IiR7Y2xpZW50LWJpbmRpbmdzfS8ke3NvdXJjZWZpbGVzfSI+Ci0JCQkJCQkJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgotCQkJCQkJCQkJCTxleGNsdWRlIG5hbWU9IioqL3NwaS9MVFBBV1NTZWN1cml0eUF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuKiIgLz4KLQkJCQkJCQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9zcGkvbG9jYWwvKioiIC8+Ci0JCQkJCQkJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovc3BpL2h0dHAvRGVmYXVsdEh0dHBJbnZva2VyLioiIC8+Ci0JCQkJCQkJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovc3BpL2h0dHAvQXBhY2hlQ2xpZW50SHR0cEludm9rZXIuKiIgLz4KLQkJCQkJCQkJCQk8ZXhjbHVkZSBuYW1lPSIqKi9zcGkvd2Vic2VydmljZXMvKioiIC8+Ci0JCQkJCQkJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovc3BpL2F0b21wdWIvKioiIC8+Ci0JCQkJCQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJCQkJCTwvY29weT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAk8Y29weSB0b2Rpcj0iJHtnZW5kaXJ9Ij4KLQkJCQkJCQkJCTxmaWxlc2V0IGRpcj0iJHtjbGllbnQtYXBpfS8ke3NvdXJjZWZpbGVzfSI+Ci0JCQkJCQkJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQk8L2NvcHk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPGNvcHkgdG9kaXI9IiR7Z2VuZGlyfSI+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9IiR7Y2xpZW50LWltcGx9LyR7c291cmNlZmlsZXN9Ij4KLQkJCQkJCQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+Ci0JCQkJCQkJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovVHlwZVV0aWxzLmphdmEiIC8+Ci0JCQkJCQkJCQkJPGV4Y2x1ZGUgbmFtZT0iKiovb3NnaS8qKiIgLz4KLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJPC9jb3B5PgotCQkJCQkJCQkKLQkJCQkJCQkJPHJlcGxhY2UgZGlyPSIke2dlbmRpcn0iIHRva2VuPSJqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXIiIHZhbHVlPSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkhhbmRsZXJSZXNvbHZlciIgLz4gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotCQkJCTxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JCQkJPHZlcnNpb24+MS43PC92ZXJzaW9uPgotCQkJCTxleGVjdXRpb25zPgotCQkJCQk8ZXhlY3V0aW9uPgotCQkJCQkJPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotCQkJCQkJPGdvYWxzPgotCQkJCQkJCTxnb2FsPmFkZC1zb3VyY2U8L2dvYWw+Ci0JCQkJCQk8L2dvYWxzPgotICAgIAkJCSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgCQkJICAgICAgICAgICAgPHNvdXJjZXM+Ci0gICAJCQkJCQkJCTxzb3VyY2U+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vb3BlbmNtaXMtY29yZTwvc291cmNlPgotCQkJCQkJCTwvc291cmNlcz4KLQkJCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCQkJPC9leGVjdXRpb24+Ci0JCQkJPC9leGVjdXRpb25zPgotCQkJPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wYWNrPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF0dGFjaD50cnVlPC9hdHRhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQkJPC9wbHVnaW5zPgotCi0JPC9idWlsZD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzZWVmYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSAgICA8IS0tCi0gICAgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IKLSAgICAgICAgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICAgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nCi0gICAgICAgIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUKLSAgICAgICAgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlCi0gICAgICAgIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgotICAgICAgICBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0gICAgICAgIGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZAotICAgICAgICB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gICAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gICAgICAgIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAtLT4KLTxhc3NlbWJseQotICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjEgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4xLnhzZCI+Ci0gICAgPGlkPnBhY2s8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgICAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIAotICAgIDxmaWxlcz4KLSAgICAgICAgPGZpbGU+Ci0gICAgICAgICAgICA8c291cmNlPlJFQURNRTwvc291cmNlPgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPC9maWxlPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0uamFyPC9zb3VyY2U+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8L2ZpbGU+Ci0gICAgPC9maWxlcz4KLSAgICAKLSAgICA8ZmlsZVNldHM+Ci0gICAgICAgIDwhLS0gbGljZW5zZSwgcmVhZG1lLCBldGMuIGNhbGN1bGF0ZWQgYXQgYnVpbGQgdGltZSAtLT4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+IAotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9IYW5kbGVyUmVzb2x2ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvSGFuZGxlclJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2JiYWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9IYW5kbGVyUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpOwotCi0vKioKLSAqIER1bW15IGludGVyZmFjZSwgd2hpY2ggcmVwbGFjZXMgYSBKQVgtV1MgaW50ZXJmYWNlIHRoYXQgZG9lc24ndCBleGl0cyBvbgotICogQW5kcm9pZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBIYW5kbGVyUmVzb2x2ZXIgewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQWJzdHJhY3RBdG9tUHViU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0Fic3RyYWN0QXRvbVB1YlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4ZTcxZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQWJzdHJhY3RBdG9tUHViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsNCi0NCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5DbWlzQmluZGluZ3NIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLlJlcG9zaXRvcnlJbmZvQ2FjaGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuTGlua0FjY2VzczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUFjbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUJhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21MaW5rOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5SZXBvc2l0b3J5V29ya3NwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5TZXJ2aWNlRG9jOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuSHR0cEludm9rZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RvcmFnZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVW5hdXRob3JpemVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1ZlcnNpb25pbmdFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5SZXR1cm5WZXJzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnZlcnRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbEVudHJ5SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xMaXN0SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdERhdGFJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUG9saWN5SWRMaXN0SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0ltcGw7DQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7DQotDQotLyoqDQotICogQmFzZSBjbGFzcyBmb3IgYWxsIEF0b21QdWIgY2xpZW50IHNlcnZpY2VzLg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlIGltcGxlbWVudHMgTGlua0FjY2VzcyB7DQotDQotICAgIHByb3RlY3RlZCBlbnVtIElkZW50aWZpZXJUeXBlIHsNCi0gICAgICAgIElELCBQQVRIDQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT0xMRUNUSU9OID0gImNvbGxlY3Rpb24iOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1VSSV9URU1QTEFURSA9ICJ1cml0ZW1wbGF0ZSI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFUSF9TRUdNRU5UID0gInBhdGhTZWdtZW50IjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9SRUxBVElWRV9QQVRIX1NFR01FTlQgPSAicmVsYXRpdmVQYXRoU2VnbWVudCI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfTlVNX0lURU1TID0gIm51bUl0ZW1zIjsNCi0NCi0gICAgcHJpdmF0ZSBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uOw0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U2Vzc2lvbihCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7DQotICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHNlc3Npb24uDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgQmluZGluZ1Nlc3Npb24gZ2V0U2Vzc2lvbigpIHsNCi0gICAgICAgIHJldHVybiBzZXNzaW9uOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSBIVFRQIEludm9rZXIgb2JqZWN0Lg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEh0dHBJbnZva2VyIGdldEh0dHBJbnZva2VyKCkgew0KLSAgICAgICAgcmV0dXJuIENtaXNCaW5kaW5nc0hlbHBlci5nZXRIdHRwSW52b2tlcihzZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZSBkb2N1bWVudCBVUkwgb2YgdGhpcyBzZXNzaW9uLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2aWNlRG9jVVJMKCkgew0KLSAgICAgICAgT2JqZWN0IHVybCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkwpOw0KLSAgICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIFN0cmluZykgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSB1cmw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIHRoZSBDTUlTIHZlcnNpb24gb2YgdGhlIGdpdmVuIHJlcG9zaXRvcnkuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCkgew0KLSAgICAgICAgaWYgKENtaXNCaW5kaW5nc0hlbHBlci5nZXRGb3JjZWRDbWlzVmVyc2lvbihzZXNzaW9uKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIENtaXNCaW5kaW5nc0hlbHBlci5nZXRGb3JjZWRDbWlzVmVyc2lvbihzZXNzaW9uKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvQ2FjaGUgY2FjaGUgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0UmVwb3NpdG9yeUluZm9DYWNoZShzZXNzaW9uKTsNCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIGluZm8gPSBjYWNoZS5nZXQocmVwb3NpdG9yeUlkKTsNCi0NCi0gICAgICAgIGlmIChpbmZvID09IG51bGwpIHsNCi0gICAgICAgICAgICBMaXN0PFJlcG9zaXRvcnlJbmZvPiBpbmZvTGlzdCA9IGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7DQotICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoaW5mb0xpc3QpKSB7DQotICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvTGlzdC5nZXQoMCk7DQotICAgICAgICAgICAgICAgIGNhY2hlLnB1dChpbmZvKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gKGluZm8gPT0gbnVsbCA/IENtaXNWZXJzaW9uLkNNSVNfMV8wIDogaW5mby5nZXRDbWlzVmVyc2lvbigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tIGxpbmsgY2FjaGUgLS0tLQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgbGluayBjYWNoZSBvciBjcmVhdGVzIGEgbmV3IGNhY2hlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgTGlua0NhY2hlIGdldExpbmtDYWNoZSgpIHsNCi0gICAgICAgIExpbmtDYWNoZSBsaW5rQ2FjaGUgPSAoTGlua0NhY2hlKSBnZXRTZXNzaW9uKCkuZ2V0KFNwaVNlc3Npb25QYXJhbWV0ZXIuTElOS19DQUNIRSk7DQotICAgICAgICBpZiAobGlua0NhY2hlID09IG51bGwpIHsNCi0gICAgICAgICAgICBsaW5rQ2FjaGUgPSBuZXcgTGlua0NhY2hlKGdldFNlc3Npb24oKSk7DQotICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLnB1dChTcGlTZXNzaW9uUGFyYW1ldGVyLkxJTktfQ0FDSEUsIGxpbmtDYWNoZSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbGlua0NhY2hlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIGEgbGluayBmcm9tIHRoZSBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7DQotICAgICAgICBpZiAocmVwb3NpdG9yeUlkID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUmVwb3NpdG9yeSBpZCBtdXN0IGJlIHNldCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpZCA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBpZCBtdXN0IGJlIHNldCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBnZXRMaW5rQ2FjaGUoKS5nZXRMaW5rKHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgdHlwZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSBsaW5rIGZyb20gdGhlIGNhY2hlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCkgew0KLSAgICAgICAgcmV0dXJuIGdldExpbmsocmVwb3NpdG9yeUlkLCBpZCwgcmVsLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyBhIGxpbmsgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQgaW50byB0aGUgY2FjaGUgaWYNCi0gICAgICogaXQgaXMgbm90IHRoZXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBsb2FkTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7DQotICAgICAgICBTdHJpbmcgbGluayA9IGdldExpbmsocmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsNCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBpZCwgUmV0dXJuVmVyc2lvbi5USElTLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLA0KLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgbGluayA9IGdldExpbmsocmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBsaW5rOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IGxpbmsgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQgaW50byB0aGUNCi0gICAgICogY2FjaGUgaWYgaXQgaXMgbm90IHRoZXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBsb2FkQ29udGVudExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkKSB7DQotICAgICAgICByZXR1cm4gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBpZCwgQXRvbVB1YlBhcnNlci5MSU5LX1JFTF9DT05URU5ULCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyBhIHJlbmRpdGlvbiBjb250ZW50IGxpbmsgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQNCi0gICAgICogaW50byB0aGUgY2FjaGUgaWYgaXQgaXMgbm90IHRoZXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBsb2FkUmVuZGl0aW9uQ29udGVudExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkLCBTdHJpbmcgc3RyZWFtSWQpIHsNCi0gICAgICAgIHJldHVybiBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGlkLCBDb25zdGFudHMuUkVMX0FMVEVSTkFURSwgc3RyZWFtSWQpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgbGluayB0byB0aGUgY2FjaGUuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUsIFN0cmluZyBsaW5rKSB7DQotICAgICAgICBnZXRMaW5rQ2FjaGUoKS5hZGRMaW5rKHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgdHlwZSwgbGluayk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgYSBsaW5rIHRvIHRoZSBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkLCBBdG9tTGluayBsaW5rKSB7DQotICAgICAgICBnZXRMaW5rQ2FjaGUoKS5hZGRMaW5rKHJlcG9zaXRvcnlJZCwgaWQsIGxpbmsuZ2V0UmVsKCksIGxpbmsuZ2V0VHlwZSgpLCBsaW5rLmdldEhyZWYoKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbW92ZXMgYWxsIGxpbmtzIG9mIGFuIG9iamVjdC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUxpbmtzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCkgew0KLSAgICAgICAgZ2V0TGlua0NhY2hlKCkucmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBpZCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIExvY2tzIHRoZSBsaW5rIGNhY2hlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9ja0xpbmtzKCkgew0KLSAgICAgICAgZ2V0TGlua0NhY2hlKCkubG9ja0xpbmtzKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFVubG9ja3MgdGhlIGxpbmsgY2FjaGUuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1bmxvY2tMaW5rcygpIHsNCi0gICAgICAgIGdldExpbmtDYWNoZSgpLnVubG9ja0xpbmtzKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENoZWNrcyBhIGxpbmsgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgdGhyb3dMaW5rRXhjZXB0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUpIHsNCi0gICAgICAgIGludCBpbmRleCA9IGdldExpbmtDYWNoZSgpLmNoZWNrTGluayhyZXBvc2l0b3J5SWQsIGlkLCByZWwsIHR5cGUpOw0KLQ0KLSAgICAgICAgc3dpdGNoIChpbmRleCkgew0KLSAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSEiKTsNCi0gICAgICAgIGNhc2UgMToNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIG9iamVjdCEiKTsNCi0gICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHJlcG9zaXRvcnkgZm9yIHRoaXMgb2JqZWN0ISIpOw0KLSAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJObyBsaW5rIHdpdGggbWF0Y2hpbmcgbWVkaWEgdHlwZSEiKTsNCi0gICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5vdGhpbmcgd3JvbmchIEVpdGhlciB0aGlzIGlzIGEgYnVnIG9yIGEgdGhyZWFkaW5nIGlzc3VlLiIpOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlVua25vd24gZXJyb3IhIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSB0eXBlIGxpbmsgZnJvbSB0aGUgY2FjaGUuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7DQotICAgICAgICBpZiAocmVwb3NpdG9yeUlkID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUmVwb3NpdG9yeSBpZCBtdXN0IGJlIHNldCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0eXBlSWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGlkIG11c3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGdldExpbmtDYWNoZSgpLmdldFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCByZWwsIHR5cGUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIGEgdHlwZSBsaW5rIGZyb20gdGhlIGNhY2hlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcmVsKSB7DQotICAgICAgICByZXR1cm4gZ2V0VHlwZUxpbmsocmVwb3NpdG9yeUlkLCB0eXBlSWQsIHJlbCwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSBsaW5rIGZyb20gdGhlIGNhY2hlIGlmIGl0IGlzIHRoZXJlIG9yIGxvYWRzIGl0IGludG8gdGhlIGNhY2hlIGlmDQotICAgICAqIGl0IGlzIG5vdCB0aGVyZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgbG9hZFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7DQotICAgICAgICBTdHJpbmcgbGluayA9IGdldFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCByZWwsIHR5cGUpOw0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGdldFR5cGVEZWZpbml0aW9uSW50ZXJuYWwocmVwb3NpdG9yeUlkLCB0eXBlSWQpOw0KLSAgICAgICAgICAgIGxpbmsgPSBnZXRUeXBlTGluayhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgcmVsLCB0eXBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBsaW5rOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgdHlwZSBsaW5rIHRvIHRoZSBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlLCBTdHJpbmcgbGluaykgew0KLSAgICAgICAgZ2V0TGlua0NhY2hlKCkuYWRkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCB0eXBlSWQsIHJlbCwgdHlwZSwgbGluayk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgYSB0eXBlIGxpbmsgdG8gdGhlIGNhY2hlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVHlwZUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQXRvbUxpbmsgbGluaykgew0KLSAgICAgICAgZ2V0TGlua0NhY2hlKCkuYWRkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGxpbmsuZ2V0UmVsKCksIGxpbmsuZ2V0VHlwZSgpLCBsaW5rLmdldEhyZWYoKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlbW92ZXMgYWxsIGxpbmtzIG9mIGEgdHlwZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVR5cGVMaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQpIHsNCi0gICAgICAgIGdldExpbmtDYWNoZSgpLnJlbW92ZVR5cGVMaW5rcyhyZXBvc2l0b3J5SWQsIGlkKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTG9ja3MgdGhlIHR5cGUgbGluayBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGxvY2tUeXBlTGlua3MoKSB7DQotICAgICAgICBnZXRMaW5rQ2FjaGUoKS5sb2NrVHlwZUxpbmtzKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFVubG9ja3MgdGhlIHR5cGUgbGluayBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHVubG9ja1R5cGVMaW5rcygpIHsNCi0gICAgICAgIGdldExpbmtDYWNoZSgpLnVubG9ja1R5cGVMaW5rcygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIGEgY29sbGVjdGlvbiBmcm9tIHRoZSBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sbGVjdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgY29sbGVjdGlvbikgew0KLSAgICAgICAgcmV0dXJuIGdldExpbmtDYWNoZSgpLmdldENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBjb2xsZWN0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyBhIGNvbGxlY3Rpb24gZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQgaW50byB0aGUNCi0gICAgICogY2FjaGUgaWYgaXQgaXMgbm90IHRoZXJlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2FkQ29sbGVjdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgY29sbGVjdGlvbikgew0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBnZXRDb2xsZWN0aW9uKHJlcG9zaXRvcnlJZCwgY29sbGVjdGlvbik7DQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gY2FjaGUgcmVwb3NpdG9yeSBpbmZvDQotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yaWVzSW50ZXJuYWwocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgICAgICBsaW5rID0gZ2V0Q29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIGNvbGxlY3Rpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGxpbms7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgYSBjb2xsZWN0aW9uIHRvIHRoZSBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZENvbGxlY3Rpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGNvbGxlY3Rpb24sIFN0cmluZyBsaW5rKSB7DQotICAgICAgICBnZXRMaW5rQ2FjaGUoKS5hZGRDb2xsZWN0aW9uKHJlcG9zaXRvcnlJZCwgY29sbGVjdGlvbiwgbGluayk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSByZXBvc2l0b3J5IGxpbmsgZnJvbSB0aGUgY2FjaGUuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcG9zaXRvcnlMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyByZWwpIHsNCi0gICAgICAgIHJldHVybiBnZXRMaW5rQ2FjaGUoKS5nZXRSZXBvc2l0b3J5TGluayhyZXBvc2l0b3J5SWQsIHJlbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSByZXBvc2l0b3J5IGxpbmsgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQgaW50byB0aGUNCi0gICAgICogY2FjaGUgaWYgaXQgaXMgbm90IHRoZXJlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2FkUmVwb3NpdG9yeUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHJlbCkgew0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBnZXRSZXBvc2l0b3J5TGluayhyZXBvc2l0b3J5SWQsIHJlbCk7DQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gY2FjaGUgcmVwb3NpdG9yeSBpbmZvDQotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yaWVzSW50ZXJuYWwocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgICAgICBsaW5rID0gZ2V0UmVwb3NpdG9yeUxpbmsocmVwb3NpdG9yeUlkLCByZWwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGxpbms7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgYSByZXBvc2l0b3J5IGxpbmsgdG8gdGhlIGNhY2hlLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmVwb3NpdG9yeUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHJlbCwgU3RyaW5nIGxpbmspIHsNCi0gICAgICAgIGdldExpbmtDYWNoZSgpLmFkZFJlcG9zaXRvcnlMaW5rKHJlcG9zaXRvcnlJZCwgcmVsLCBsaW5rKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkcyBhIHJlcG9zaXRvcnkgbGluayB0byB0aGUgY2FjaGUuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSZXBvc2l0b3J5TGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBBdG9tTGluayBsaW5rKSB7DQotICAgICAgICBhZGRSZXBvc2l0b3J5TGluayhyZXBvc2l0b3J5SWQsIGxpbmsuZ2V0UmVsKCksIGxpbmsuZ2V0SHJlZigpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyBhbiBVUkkgdGVtcGxhdGUgZnJvbSB0aGUgY2FjaGUuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBsYXRlTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZSwgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKSB7DQotICAgICAgICByZXR1cm4gZ2V0TGlua0NhY2hlKCkuZ2V0VGVtcGxhdGVMaW5rKHJlcG9zaXRvcnlJZCwgdHlwZSwgcGFyYW1ldGVycyk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSB0ZW1wbGF0ZSBsaW5rIGZyb20gdGhlIGNhY2hlIGlmIGl0IGlzIHRoZXJlIG9yIGxvYWRzIGl0IGludG8gdGhlDQotICAgICAqIGNhY2hlIGlmIGl0IGlzIG5vdCB0aGVyZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgbG9hZFRlbXBsYXRlTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZSwgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKSB7DQotICAgICAgICBTdHJpbmcgbGluayA9IGdldFRlbXBsYXRlTGluayhyZXBvc2l0b3J5SWQsIHR5cGUsIHBhcmFtZXRlcnMpOw0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIGNhY2hlIHJlcG9zaXRvcnkgaW5mbw0KLSAgICAgICAgICAgIGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7DQotICAgICAgICAgICAgbGluayA9IGdldFRlbXBsYXRlTGluayhyZXBvc2l0b3J5SWQsIHR5cGUsIHBhcmFtZXRlcnMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGxpbms7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgYW4gVVJJIHRlbXBsYXRlIHRvIHRoZSBjYWNoZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRlbXBsYXRlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlLCBTdHJpbmcgbGluaykgew0KLSAgICAgICAgZ2V0TGlua0NhY2hlKCkuYWRkVGVtcGxhdGUocmVwb3NpdG9yeUlkLCB0eXBlLCBsaW5rKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tIGV4Y2VwdGlvbnMgLS0tLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29udmVydHMgYSBIVFRQIHN0YXR1cyBjb2RlIGludG8gYW4gRXhjZXB0aW9uLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIENtaXNCYXNlRXhjZXB0aW9uIGNvbnZlcnRTdGF0dXNDb2RlKGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgIFN0cmluZyBleGNlcHRpb24gPSBleHRyYWN0RXhjZXB0aW9uKGVycm9yQ29udGVudCk7DQotICAgICAgICBtZXNzYWdlID0gZXh0cmFjdEVycm9yTWVzc2FnZShtZXNzYWdlLCBlcnJvckNvbnRlbnQpOw0KLQ0KLSAgICAgICAgc3dpdGNoIChjb2RlKSB7DQotICAgICAgICBjYXNlIDMwMToNCi0gICAgICAgIGNhc2UgMzAyOg0KLSAgICAgICAgY2FzZSAzMDM6DQotICAgICAgICBjYXNlIDMwNzoNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJSZWRpcmVjdHMgYXJlIG5vdCBzdXBwb3J0ZWQgKEhUVFAgc3RhdHVzIGNvZGUgIiArIGNvZGUgKyAiKTogIg0KLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOw0KLSAgICAgICAgY2FzZSA0MDA6DQotICAgICAgICAgICAgaWYgKENtaXNGaWx0ZXJOb3RWYWxpZEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHMoZXhjZXB0aW9uKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNGaWx0ZXJOb3RWYWxpZEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgIGNhc2UgNDAxOg0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOw0KLSAgICAgICAgY2FzZSA0MDM6DQotICAgICAgICAgICAgaWYgKENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzKGV4Y2VwdGlvbikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgIGNhc2UgNDA0Og0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7DQotICAgICAgICBjYXNlIDQwNToNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgIGNhc2UgNDA3Og0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgIGNhc2UgNDA5Og0KLSAgICAgICAgICAgIGlmIChDbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzKGV4Y2VwdGlvbikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFscyhleGNlcHRpb24pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1ZlcnNpb25pbmdFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHMoZXhjZXB0aW9uKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFscyhleGNlcHRpb24pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgaWYgKENtaXNTdG9yYWdlRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFscyhleGNlcHRpb24pKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JDb250ZW50KSB7DQotICAgICAgICBpZiAoZXJyb3JDb250ZW50ID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGludCBiZWdpbiA9IGVycm9yQ29udGVudC5pbmRleE9mKCI8IS0tZXhjZXB0aW9uLS0+Iik7DQotICAgICAgICBpbnQgZW5kID0gZXJyb3JDb250ZW50LmluZGV4T2YoIjwhLS0vZXhjZXB0aW9uLS0+Iik7DQotDQotICAgICAgICBpZiAoYmVnaW4gPT0gLTEgfHwgZW5kID09IC0xIHx8IGJlZ2luID4gZW5kKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZXJyb3JDb250ZW50LnN1YnN0cmluZyhiZWdpbiArICI8IS0tZXhjZXB0aW9uLS0+Ii5sZW5ndGgoKSwgZW5kKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsNCi0gICAgICAgIGlmIChlcnJvckNvbnRlbnQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IGJlZ2luID0gZXJyb3JDb250ZW50LmluZGV4T2YoIjwhLS1tZXNzYWdlLS0+Iik7DQotICAgICAgICBpbnQgZW5kID0gZXJyb3JDb250ZW50LmluZGV4T2YoIjwhLS0vbWVzc2FnZS0tPiIpOw0KLQ0KLSAgICAgICAgaWYgKGJlZ2luID09IC0xIHx8IGVuZCA9PSAtMSB8fCBiZWdpbiA+IGVuZCkgew0KLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGVycm9yQ29udGVudC5zdWJzdHJpbmcoYmVnaW4gKyAiPCEtLW1lc3NhZ2UtLT4iLmxlbmd0aCgpLCBlbmQpOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0gaGVscGVycyAtLS0tDQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzKFN0cmluZyBuYW1lLCBBdG9tRWxlbWVudCBlbGVtZW50KSB7DQotICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3RyKFN0cmluZyBuYW1lLCBBdG9tRWxlbWVudCBlbGVtZW50KSB7DQotICAgICAgICByZXR1cm4gaXMobmFtZSwgZWxlbWVudCkgJiYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBTdHJpbmcpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW50KFN0cmluZyBuYW1lLCBBdG9tRWxlbWVudCBlbGVtZW50KSB7DQotICAgICAgICByZXR1cm4gaXMobmFtZSwgZWxlbWVudCkgJiYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc05leHRMaW5rKEF0b21FbGVtZW50IGVsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybiBDb25zdGFudHMuUkVMX05FWFQuZXF1YWxzKCgoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpLmdldFJlbCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIENNSVMgb2JqZWN0IHdpdGggcHJvcGVydGllcyBhbmQgcG9saWN5IGlkcy4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBPYmplY3REYXRhSW1wbCBjcmVhdGVPYmplY3QoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgY2hhbmdlVG9rZW4sIExpc3Q8U3RyaW5nPiBwb2xpY2llcykgew0KLSAgICAgICAgT2JqZWN0RGF0YUltcGwgb2JqZWN0ID0gbmV3IE9iamVjdERhdGFJbXBsKCk7DQotDQotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7DQotICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzSW1wbCgpOw0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICgoUHJvcGVydGllc0ltcGwpIHByb3BlcnRpZXMpDQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOLCBjaGFuZ2VUb2tlbikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlVG9rZW4gIT0gbnVsbCAmJiAhcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKSkgew0KLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwocHJvcGVydGllcyk7DQotICAgICAgICAgICAgKChQcm9wZXJ0aWVzSW1wbCkgcHJvcGVydGllcykuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5U3RyaW5nSW1wbChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4sIGNoYW5nZVRva2VuKSk7DQotICAgICAgICB9DQotICAgICAgICBvYmplY3Quc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIGlmIChwb2xpY2llcyAhPSBudWxsICYmICFwb2xpY2llcy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBQb2xpY3lJZExpc3RJbXBsIHBvbGljeUlkTGlzdCA9IG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7DQotICAgICAgICAgICAgcG9saWN5SWRMaXN0LnNldFBvbGljeUlkcyhwb2xpY2llcyk7DQotICAgICAgICAgICAgb2JqZWN0LnNldFBvbGljeUlkcyhwb2xpY3lJZExpc3QpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG9iamVjdDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIENNSVMgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBhbiBpZCBpbiB0aGUgcHJvcGVydHkgbGlzdC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBPYmplY3REYXRhIGNyZWF0ZUlkT2JqZWN0KFN0cmluZyBvYmplY3RJZCkgew0KLSAgICAgICAgT2JqZWN0RGF0YUltcGwgb2JqZWN0ID0gbmV3IE9iamVjdERhdGFJbXBsKCk7DQotDQotICAgICAgICBQcm9wZXJ0aWVzSW1wbCBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7DQotICAgICAgICBvYmplY3Quc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5SWRJbXBsKFByb3BlcnR5SWRzLk9CSkVDVF9JRCwgb2JqZWN0SWQpKTsNCi0NCi0gICAgICAgIHJldHVybiBvYmplY3Q7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhbiBpbnB1dCBzdHJlYW0uDQotICAgICAqLw0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHJvdGVjdGVkIDxUIGV4dGVuZHMgQXRvbUJhc2U+IFQgcGFyc2UoSW5wdXRTdHJlYW0gc3RyZWFtLCBDbGFzczxUPiBjbGF6eikgew0KLSAgICAgICAgQXRvbVB1YlBhcnNlciBwYXJzZXIgPSBuZXcgQXRvbVB1YlBhcnNlcihzdHJlYW0pOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBwYXJzZXIucGFyc2UoKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJQYXJzaW5nIGV4Y2VwdGlvbiEiLCBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEF0b21CYXNlIHBhcnNlUmVzdWx0ID0gcGFyc2VyLmdldFJlc3VsdHMoKTsNCi0NCi0gICAgICAgIGlmICghY2xhenouaXNJbnN0YW5jZShwYXJzZVJlc3VsdCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIlVuZXhwZWN0ZWQgZG9jdW1lbnQhIFJlY2VpdmVkOiAiDQotICAgICAgICAgICAgICAgICAgICArIChwYXJzZVJlc3VsdCA9PSBudWxsID8gInNvbWV0aGluZyB1bmtub3duIiA6IHBhcnNlUmVzdWx0LmdldFR5cGUoKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIChUKSBwYXJzZVJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGVyZm9ybXMgYSBHRVQgb24gYW4gVVJMLCBjaGVja3MgdGhlIHJlc3BvbnNlIGNvZGUgYW5kIHJldHVybnMgdGhlDQotICAgICAqIHJlc3VsdC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBSZXNwb25zZSByZWFkKFVybEJ1aWxkZXIgdXJsKSB7DQotICAgICAgICAvLyBtYWtlIHRoZSBjYWxsDQotICAgICAgICAvLyBMb2cuZCgiVVJMIiwgdXJsLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IGdldEh0dHBJbnZva2VyKCkuaW52b2tlR0VUKHVybCwgc2Vzc2lvbik7DQotDQotICAgICAgICAvLyBjaGVjayByZXNwb25zZSBjb2RlDQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDApIHsNCi0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0U3RhdHVzQ29kZShyZXNwLmdldFJlc3BvbnNlQ29kZSgpLCByZXNwLmdldFJlc3BvbnNlTWVzc2FnZSgpLCByZXNwLmdldEVycm9yQ29udGVudCgpLCBudWxsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXNwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQZXJmb3JtcyBhIFBPU1Qgb24gYW4gVVJMLCBjaGVja3MgdGhlIHJlc3BvbnNlIGNvZGUgYW5kIHJldHVybnMgdGhlDQotICAgICAqIHJlc3VsdC4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBSZXNwb25zZSBwb3N0KFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgY29udGVudFR5cGUsIE91dHB1dCB3cml0ZXIpIHsNCi0gICAgICAgIC8vIG1ha2UgdGhlIGNhbGwNCi0gICAgICAgIC8vIExvZy5kKCJVUkwiLCB1cmwudG9TdHJpbmcoKSk7DQotICAgICAgICBSZXNwb25zZSByZXNwID0gZ2V0SHR0cEludm9rZXIoKS5pbnZva2VQT1NUKHVybCwgY29udGVudFR5cGUsIHdyaXRlciwgc2Vzc2lvbik7DQotDQotICAgICAgICAvLyBjaGVjayByZXNwb25zZSBjb2RlDQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDEpIHsNCi0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0U3RhdHVzQ29kZShyZXNwLmdldFJlc3BvbnNlQ29kZSgpLCByZXNwLmdldFJlc3BvbnNlTWVzc2FnZSgpLCByZXNwLmdldEVycm9yQ29udGVudCgpLCBudWxsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXNwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQZXJmb3JtcyBhIFBVVCBvbiBhbiBVUkwsIGNoZWNrcyB0aGUgcmVzcG9uc2UgY29kZSBhbmQgcmV0dXJucyB0aGUNCi0gICAgICogcmVzdWx0Lg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFJlc3BvbnNlIHB1dChVcmxCdWlsZGVyIHVybCwgU3RyaW5nIGNvbnRlbnRUeXBlLCBPdXRwdXQgd3JpdGVyKSB7DQotICAgICAgICByZXR1cm4gcHV0KHVybCwgY29udGVudFR5cGUsIG51bGwsIHdyaXRlcik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBlcmZvcm1zIGEgUFVUIG9uIGFuIFVSTCwgY2hlY2tzIHRoZSByZXNwb25zZSBjb2RlIGFuZCByZXR1cm5zIHRoZQ0KLSAgICAgKiByZXN1bHQuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgUmVzcG9uc2UgcHV0KFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgY29udGVudFR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgT3V0cHV0IHdyaXRlcikgew0KLSAgICAgICAgLy8gbWFrZSB0aGUgY2FsbA0KLSAgICAgICAgLy8gTG9nLmQoIlVSTCIsIHVybC50b1N0cmluZygpKTsNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBnZXRIdHRwSW52b2tlcigpLmludm9rZVBVVCh1cmwsIGNvbnRlbnRUeXBlLCBoZWFkZXJzLCB3cml0ZXIsIHNlc3Npb24pOw0KLQ0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZQ0KLSAgICAgICAgaWYgKChyZXNwLmdldFJlc3BvbnNlQ29kZSgpIDwgMjAwKSB8fCAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSA+IDI5OSkpIHsNCi0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0U3RhdHVzQ29kZShyZXNwLmdldFJlc3BvbnNlQ29kZSgpLCByZXNwLmdldFJlc3BvbnNlTWVzc2FnZSgpLCByZXNwLmdldEVycm9yQ29udGVudCgpLCBudWxsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXNwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQZXJmb3JtcyBhIERFTEVURSBvbiBhbiBVUkwsIGNoZWNrcyB0aGUgcmVzcG9uc2UgY29kZSBhbmQgcmV0dXJucyB0aGUNCi0gICAgICogcmVzdWx0Lg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlKFVybEJ1aWxkZXIgdXJsKSB7DQotICAgICAgICAvLyBtYWtlIHRoZSBjYWxsDQotICAgICAgICAvLyBMb2cuZCgiVVJMIiwgdXJsLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IGdldEh0dHBJbnZva2VyKCkuaW52b2tlREVMRVRFKHVybCwgc2Vzc2lvbik7DQotDQotICAgICAgICAvLyBjaGVjayByZXNwb25zZSBjb2RlDQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDQpIHsNCi0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0U3RhdHVzQ29kZShyZXNwLmdldFJlc3BvbnNlQ29kZSgpLCByZXNwLmdldFJlc3BvbnNlTWVzc2FnZSgpLCByZXNwLmdldEVycm9yQ29udGVudCgpLCBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tIGNvbW1vbiBvcGVyYXRpb25zIC0tLS0NCi0NCi0gICAgLyoqDQotICAgICAqIENoZWNrcyBpZiBhdCBsZWFzdCBvbmUgQUNFIGxpc3QgaXMgbm90IGVtcHR5Lg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBY2xNZXJnZVJlcXVpcmVkKEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcykgew0KLSAgICAgICAgcmV0dXJuIChhZGRBY2VzICE9IG51bGwgJiYgYWRkQWNlcy5nZXRBY2VzKCkgIT0gbnVsbCAmJiAhYWRkQWNlcy5nZXRBY2VzKCkuaXNFbXB0eSgpKQ0KLSAgICAgICAgICAgICAgICB8fCAocmVtb3ZlQWNlcyAhPSBudWxsICYmIHJlbW92ZUFjZXMuZ2V0QWNlcygpICE9IG51bGwgJiYgIXJlbW92ZUFjZXMuZ2V0QWNlcygpLmlzRW1wdHkoKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1lcmdlcyB0aGUgbmV3IEFDTCBmcm9tIG9yaWdpbmFsLCBhZGQgYW5kIHJlbW92ZSBBQ0VzIGxpc3RzLg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIEFjbCBtZXJnZUFjbHMoQWNsIG9yaWdpbmFsQWNlcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzKSB7DQotICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gb3JpZ2luYWxzID0gY29udmVydEFjbFRvTWFwKG9yaWdpbmFsQWNlcyk7DQotICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gYWRkcyA9IGNvbnZlcnRBY2xUb01hcChhZGRBY2VzKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiByZW1vdmVzID0gY29udmVydEFjbFRvTWFwKHJlbW92ZUFjZXMpOw0KLSAgICAgICAgTGlzdDxBY2U+IG5ld0FjZXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oKTsNCi0NCi0gICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgb3JpZ2luYWwgQUNFcw0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gYWNlIDogb3JpZ2luYWxzLmVudHJ5U2V0KCkpIHsNCi0NCi0gICAgICAgICAgICAvLyBhZGQgcGVybWlzc2lvbnMNCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBhZGRQZXJtaXNzaW9ucyA9IGFkZHMuZ2V0KGFjZS5nZXRLZXkoKSk7DQotICAgICAgICAgICAgaWYgKGFkZFBlcm1pc3Npb25zICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgYWNlLmdldFZhbHVlKCkuYWRkQWxsKGFkZFBlcm1pc3Npb25zKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gcmVtb3ZlIHBlcm1pc3Npb25zDQotICAgICAgICAgICAgU2V0PFN0cmluZz4gcmVtb3ZlUGVybWlzc2lvbnMgPSByZW1vdmVzLmdldChhY2UuZ2V0S2V5KCkpOw0KLSAgICAgICAgICAgIGlmIChyZW1vdmVQZXJtaXNzaW9ucyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGFjZS5nZXRWYWx1ZSgpLnJlbW92ZUFsbChyZW1vdmVQZXJtaXNzaW9ucyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgQUNFDQotICAgICAgICAgICAgaWYgKCFhY2UuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgbmV3QWNlcy5hZGQobmV3IEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwobmV3IEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbChhY2UuZ2V0S2V5KCkpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhY2UuZ2V0VmFsdWUoKSkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIGFsbCBBQ0VzIHRoYXQgc2hvdWxkIGJlIGFkZGVkIGJ1dCBhcmUgbm90IGluIHRoZSBvcmlnaW5hbCBBQ0UNCi0gICAgICAgIC8vIGxpc3QNCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU2V0PFN0cmluZz4+IGFjZSA6IGFkZHMuZW50cnlTZXQoKSkgew0KLSAgICAgICAgICAgIGlmICghb3JpZ2luYWxzLmNvbnRhaW5zS2V5KGFjZS5nZXRLZXkoKSkgJiYgIWFjZS5nZXRWYWx1ZSgpLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBuZXdBY2VzLmFkZChuZXcgQWNjZXNzQ29udHJvbEVudHJ5SW1wbChuZXcgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsKGFjZS5nZXRLZXkoKSksDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFjZS5nZXRWYWx1ZSgpKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKG5ld0FjZXMpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb252ZXJ0cyBhIGxpc3Qgb2YgQUNFcyBpbnRvIE1hcCBmb3IgYmV0dGVyIGhhbmRsaW5nLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGNvbnZlcnRBY2xUb01hcChBY2wgYWNsKSB7DQotICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4oKTsNCi0NCi0gICAgICAgIGlmIChhY2wgPT0gbnVsbCB8fCBhY2wuZ2V0QWNlcygpID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChBY2UgYWNlIDogYWNsLmdldEFjZXMoKSkgew0KLSAgICAgICAgICAgIC8vIGRvbid0IGNvbnNpZGVyIGluZGlyZWN0IEFDRXMgLSB3ZSBjYW4ndCBjaGFuZ2UgdGhlbQ0KLSAgICAgICAgICAgIGlmICghYWNlLmlzRGlyZWN0KCkpIHsNCi0gICAgICAgICAgICAgICAgLy8gaWdub3JlDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBhbHRob3VnaCBhIHByaW5jaXBhbCBtdXN0IG5vdCBiZSBudWxsLCBjaGVjayBpdA0KLSAgICAgICAgICAgIGlmIChhY2UuZ2V0UHJpbmNpcGFsKCkgPT0gbnVsbCB8fCBhY2UuZ2V0UHJpbmNpcGFsKCkuZ2V0SWQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgU2V0PFN0cmluZz4gcGVybWlzc2lvbnMgPSByZXN1bHQuZ2V0KGFjZS5nZXRQcmluY2lwYWwoKS5nZXRJZCgpKTsNCi0gICAgICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChhY2UuZ2V0UHJpbmNpcGFsKCkuZ2V0SWQoKSwgcGVybWlzc2lvbnMpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoYWNlLmdldFBlcm1pc3Npb25zKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5hZGRBbGwoYWNlLmdldFBlcm1pc3Npb25zKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHJpZXZlcyB0aGUgU2VydmljZSBEb2N1bWVudCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGNhY2hlcyB0aGUgcmVwb3NpdG9yeQ0KLSAgICAgKiBpbmZvIG9iamVjdHMsIGNvbGxlY3Rpb25zLCBsaW5rcywgVVJJIHRlbXBsYXRlcywgZXRjLg0KLSAgICAgKi8NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgIHByb3RlY3RlZCBMaXN0PFJlcG9zaXRvcnlJbmZvPiBnZXRSZXBvc2l0b3JpZXNJbnRlcm5hbChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7DQotICAgICAgICBMaXN0PFJlcG9zaXRvcnlJbmZvPiByZXBJbmZvcyA9IG5ldyBBcnJheUxpc3Q8UmVwb3NpdG9yeUluZm8+KCk7DQotDQotICAgICAgICAvLyByZXRyaWV2ZSBzZXJ2aWNlIGRvYw0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihnZXRTZXJ2aWNlRG9jVVJMKCkpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVQT1NJVE9SWV9JRCwgcmVwb3NpdG9yeUlkKTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgU2VydmljZURvYyBzZXJ2aWNlRG9jID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgU2VydmljZURvYy5jbGFzcyk7DQotDQotICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIHdvcmtzcGFjZXMNCi0gICAgICAgIGZvciAoUmVwb3NpdG9yeVdvcmtzcGFjZSB3cyA6IHNlcnZpY2VEb2MuZ2V0V29ya3NwYWNlcygpKSB7DQotICAgICAgICAgICAgaWYgKHdzLmdldElkKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIG5vbi1DTUlTIHdvcmtzcGFjZQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogd3MuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXMoTkFNRV9DT0xMRUNUSU9OLCBlbGVtZW50KSkgew0KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBjb2xNYXAgPSAoTWFwPFN0cmluZywgU3RyaW5nPikgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIGFkZENvbGxlY3Rpb24od3MuZ2V0SWQoKSwgY29sTWFwLmdldCgiY29sbGVjdGlvblR5cGUiKSwgY29sTWFwLmdldCgiaHJlZiIpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZFJlcG9zaXRvcnlMaW5rKHdzLmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXMoTkFNRV9VUklfVEVNUExBVEUsIGVsZW1lbnQpKSB7DQotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHRlbXBNYXAgPSAoTWFwPFN0cmluZywgU3RyaW5nPikgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIGFkZFRlbXBsYXRlKHdzLmdldElkKCksIHRlbXBNYXAuZ2V0KCJ0eXBlIiksIHRlbXBNYXAuZ2V0KCJ0ZW1wbGF0ZSIpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgUmVwb3NpdG9yeUluZm8pIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlcEluZm9zLmFkZCgoUmVwb3NpdG9yeUluZm8pIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlcEluZm9zOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXRyaWV2ZXMgYW4gb2JqZWN0IGZyb20gdGhlIHNlcnZlciBhbmQgY2FjaGVzIHRoZSBsaW5rcy4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBPYmplY3REYXRhIGdldE9iamVjdEludGVybmFsKFN0cmluZyByZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlIGlkT3JQYXRoLCBTdHJpbmcgb2JqZWN0SWRPclBhdGgsDQotICAgICAgICAgICAgUmV0dXJuVmVyc2lvbiByZXR1cm5WZXJzaW9uLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLA0KLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsDQotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uc3RhbnRzLlBBUkFNX0lELCBvYmplY3RJZE9yUGF0aCk7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb25zdGFudHMuUEFSQU1fUEFUSCwgb2JqZWN0SWRPclBhdGgpOw0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uc3RhbnRzLlBBUkFNX1JFVFVSTl9WRVJTSU9OLCByZXR1cm5WZXJzaW9uKTsNCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsNCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9BQ0wsIGluY2x1ZGVBY2wpOw0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMsIGluY2x1ZGVQb2xpY3lJZHMpOw0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsNCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOw0KLQ0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkVGVtcGxhdGVMaW5rKHJlcG9zaXRvcnlJZCwgKGlkT3JQYXRoID09IElkZW50aWZpZXJUeXBlLklEID8gQ29uc3RhbnRzLlRFTVBMQVRFX09CSkVDVF9CWV9JRA0KLSAgICAgICAgICAgICAgICA6IENvbnN0YW50cy5URU1QTEFURV9PQkpFQ1RfQllfUEFUSCksIHBhcmFtZXRlcnMpOw0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBtaXNzaW5nIHRlbXBsYXRlIHBhcmFtZXRlciBpbiB0aGUgQ01JUyBzcGVjDQotICAgICAgICBpZiAocmV0dXJuVmVyc2lvbiAhPSBudWxsICYmIHJldHVyblZlcnNpb24gIT0gUmV0dXJuVmVyc2lvbi5USElTKSB7DQotICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVUVVJOX1ZFUlNJT04sIHJldHVyblZlcnNpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7DQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gd2UgZXhwZWN0IGEgQ01JUyBlbnRyeQ0KLSAgICAgICAgaWYgKGVudHJ5LmdldElkKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiUmVjZWl2ZWQgQXRvbSBlbnRyeSBpcyBub3QgYSBDTUlTIGVudHJ5ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9ja0xpbmtzKCk7DQotICAgICAgICBPYmplY3REYXRhIHJlc3VsdCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7DQotICAgICAgICAgICAgICAgICAgICBhZGRMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXRyaWV2ZXMgYSB0eXBlIGRlZmluaXRpb24uDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb25JbnRlcm5hbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkKSB7DQotDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9JRCwgdHlwZUlkKTsNCi0NCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZFRlbXBsYXRlTGluayhyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5URU1QTEFURV9UWVBFX0JZX0lELCBwYXJhbWV0ZXJzKTsNCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQ0KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQobmV3IFVybEJ1aWxkZXIobGluaykpOw0KLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUVudHJ5LmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIHdlIGV4cGVjdCBhIENNSVMgZW50cnkNCi0gICAgICAgIGlmIChlbnRyeS5nZXRJZCgpID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIlJlY2VpdmVkIEF0b20gZW50cnkgaXMgbm90IGEgQ01JUyBlbnRyeSEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxvY2tUeXBlTGlua3MoKTsNCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgcmVtb3ZlVHlwZUxpbmtzKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSk7DQotDQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGVudHJ5LmdldEVsZW1lbnRzKCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBUeXBlRGVmaW5pdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFR5cGVEZWZpbml0aW9uKSBlbGVtZW50LmdldE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICB1bmxvY2tUeXBlTGlua3MoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHJpZXZlcyB0aGUgQUNMIG9mIGFuIG9iamVjdC4NCi0gICAgICovDQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsSW50ZXJuYWwoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX0FDTCwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX0FDTCwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09OTFlfQkFTSUNfUEVSTUlTU0lPTlMsIG9ubHlCYXNpY1Blcm1pc3Npb25zKTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgQXRvbUFjbCBhY2wgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tQWNsLmNsYXNzKTsNCi0NCi0gICAgICAgIHJldHVybiBhY2wuZ2V0QUNMKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFVwZGF0ZXMgdGhlIEFDTCBvZiBhbiBvYmplY3QuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgQXRvbUFjbCB1cGRhdGVBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBmaW5hbCBBY2wgYWNsLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbikgew0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX0FDTCwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX0FDTCwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciBhY2xVcmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIGFjbFVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FDTF9QUk9QQUdBVElPTiwgYWNsUHJvcGFnYXRpb24pOw0KLQ0KLSAgICAgICAgZmluYWwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24gPSBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpOw0KLQ0KLSAgICAgICAgLy8gdXBkYXRlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcHV0KGFjbFVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wsIG5ldyBPdXRwdXQoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIFhtbFNlcmlhbGl6ZXIgd3JpdGVyID0gWE1MVXRpbHMuY3JlYXRlV3JpdGVyKG91dCk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLnN0YXJ0WG1sRG9jdW1lbnQod3JpdGVyKTsNCi0gICAgICAgICAgICAgICAgWE1MQ29udmVydGVyLndyaXRlQWNsKHdyaXRlciwgY21pc1ZlcnNpb24sIHRydWUsIGFjbCk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICAvLyBwYXJzZSBuZXcgZW50cnkNCi0gICAgICAgIHJldHVybiBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tQWNsLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQWNsU2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BY2xTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFmMTdhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BY2xTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUFjbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BY2xTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5FeHRlbmRlZEFjbFNlcnZpY2U7DQotDQotLyoqDQotICogQUNMIFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuDQotICovDQotcHVibGljIGNsYXNzIEFjbFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIEFjbFNlcnZpY2UsIEV4dGVuZGVkQWNsU2VydmljZSB7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvci4NCi0gICAgICovDQotICAgIHB1YmxpYyBBY2xTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7DQotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsDQotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgLy8gZmV0Y2ggdGhlIGN1cnJlbnQgQUNMDQotICAgICAgICBBY2wgb3JpZ2luYWxBY2VzID0gZ2V0QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZhbHNlLCBudWxsKTsNCi0NCi0gICAgICAgIC8vIGlmIG5vIGNoYW5nZXMgcmVxdWlyZWQsIGp1c3QgcmV0dXJuIHRoZSBBQ0wNCi0gICAgICAgIGlmICghaXNBY2xNZXJnZVJlcXVpcmVkKGFkZEFjZXMsIHJlbW92ZUFjZXMpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsQWNlczsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIG1lcmdlIEFDTHMNCi0gICAgICAgIEFjbCBuZXdBQ0wgPSBtZXJnZUFjbHMob3JpZ2luYWxBY2VzLCBhZGRBY2VzLCByZW1vdmVBY2VzKTsNCi0NCi0gICAgICAgIC8vIHVwZGF0ZSBBQ0wNCi0gICAgICAgIEF0b21BY2wgYWNsID0gdXBkYXRlQWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG5ld0FDTCwgYWNsUHJvcGFnYXRpb24pOw0KLSAgICAgICAgQWNsIHJlc3VsdCA9IGFjbC5nZXRBQ0woKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFjbCBnZXRBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIHJldHVybiBnZXRBY2xJbnRlcm5hbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgZXh0ZW5zaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQWNsIHNldEFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEFjbCBhY2VzKSB7DQotICAgICAgICBBdG9tQWNsIGFjbCA9IHVwZGF0ZUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2VzLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZKTsNCi0gICAgICAgIEFjbCByZXN1bHQgPSBhY2wuZ2V0QUNMKCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BdG9tRW50cnlXcml0ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BdG9tRW50cnlXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhOTM2ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQXRvbUVudHJ5V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQVRPTV9JRDsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQVRPTV9USVRMRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQVRPTV9VUERBVEVEOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19DT05URU5UOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19DT05URU5UX0JBU0U2NDsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQ09OVEVOVF9GSUxFTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQ09OVEVOVF9NRURJQVRZUEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0VOVFJZOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQmFzZTY0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuRGF0ZVRpbWVIZWxwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVJbXBsOw0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOw0KLQ0KLS8qKg0KLSAqIFdyaXRlcyBhIENNSVMgQXRvbSBlbnRyeSB0byBhbiBvdXRwdXQgc3RyZWFtLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdG9tRW50cnlXcml0ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA4ICogMTAyNDsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3REYXRhIG9iamVjdDsNCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW07DQotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtOw0KLSAgICBwcml2YXRlIGZpbmFsIFR5cGVEZWZpbml0aW9uIHR5cGVEZWY7DQotICAgIHByaXZhdGUgZmluYWwgQnVsa1VwZGF0ZUltcGwgYnVsa1VwZGF0ZTsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yIGZvciBvYmplY3RzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEF0b21FbnRyeVdyaXRlcihPYmplY3REYXRhIG9iamVjdCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsNCi0gICAgICAgIHRoaXMob2JqZWN0LCBjbWlzVmVyc2lvbiwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yIGZvciBvYmplY3RzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEF0b21FbnRyeVdyaXRlcihPYmplY3REYXRhIG9iamVjdCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSkgew0KLSAgICAgICAgaWYgKChvYmplY3QgPT0gbnVsbCkgfHwgKG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IGFuZCBwcm9wZXJ0aWVzIG11c3Qgbm90IGJlIG51bGwhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkgJiYgKGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKSA9PSBudWxsKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJNZWRpYSB0eXBlIG11c3QgYmUgc2V0IGlmIGEgc3RyZWFtIGlzIHByZXNlbnQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsNCi0gICAgICAgIHRoaXMuY21pc1ZlcnNpb24gPSBjbWlzVmVyc2lvbjsNCi0gICAgICAgIHRoaXMuY29udGVudFN0cmVhbSA9IGNvbnRlbnRTdHJlYW07DQotICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsICYmIGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKTsNCi0NCi0gICAgICAgICAgICAvLyBhdm9pZCBkb3VibGUgYnVmZmVyaW5nDQotICAgICAgICAgICAgaWYgKCEoaW4gaW5zdGFuY2VvZiBCdWZmZXJlZElucHV0U3RyZWFtKSAmJiAhKGluIGluc3RhbmNlb2YgQnl0ZUFycmF5SW5wdXRTdHJlYW0pKSB7DQotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluLCBCVUZGRVJfU0laRSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgc3RyZWFtID0gaW47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzdHJlYW0gPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy50eXBlRGVmID0gbnVsbDsNCi0gICAgICAgIHRoaXMuYnVsa1VwZGF0ZSA9IG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yIGZvciB0eXBlcy4NCi0gICAgICovDQotICAgIHB1YmxpYyBBdG9tRW50cnlXcml0ZXIoVHlwZURlZmluaXRpb24gdHlwZSwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBtdXN0IG5vdCBiZSBudWxsISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy50eXBlRGVmID0gdHlwZTsNCi0gICAgICAgIHRoaXMuY21pc1ZlcnNpb24gPSBjbWlzVmVyc2lvbjsNCi0gICAgICAgIHRoaXMub2JqZWN0ID0gbnVsbDsNCi0gICAgICAgIHRoaXMuY29udGVudFN0cmVhbSA9IG51bGw7DQotICAgICAgICB0aGlzLnN0cmVhbSA9IG51bGw7DQotICAgICAgICB0aGlzLmJ1bGtVcGRhdGUgPSBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYnVsayB1cGRhdGVzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEF0b21FbnRyeVdyaXRlcihCdWxrVXBkYXRlSW1wbCBidWxrVXBkYXRlKSB7DQotICAgICAgICBpZiAoYnVsa1VwZGF0ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkJ1bGsgdXBkYXRlIGRhdGEgbXVzdCBub3QgYmUgbnVsbCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuYnVsa1VwZGF0ZSA9IGJ1bGtVcGRhdGU7DQotICAgICAgICB0aGlzLnR5cGVEZWYgPSBudWxsOw0KLSAgICAgICAgdGhpcy5jbWlzVmVyc2lvbiA9IENtaXNWZXJzaW9uLkNNSVNfMV8xOw0KLSAgICAgICAgdGhpcy5vYmplY3QgPSBudWxsOw0KLSAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtID0gbnVsbDsNCi0gICAgICAgIHRoaXMuc3RyZWFtID0gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIHRoZSBlbnRyeSB0byBhbiBvdXRwdXQgc3RyZWFtLg0KLSAgICAgKiANCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIFhtbFNlcmlhbGl6ZXIgIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihvdXQpOw0KLQ0KLSAgICAgICAgLy8gc3RhcnQgZG9jDQotICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7DQotDQotICAgICAgICAvLyBzdGFydCBlbnRyeQ0KLSAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSwgVEFHX0VOVFJZKTsNCi0NCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIiIsIFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NKTsNCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIiIsIFhNTENvbnN0YW50cy5QUkVGSVhfQ01JUywgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9DTUlTKTsNCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIiIsIFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00pOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsICYmIGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIiIsIFhNTENvbnN0YW50cy5QUkVGSVhfQVBBQ0hFX0NIRU1JU1RZLFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBBQ0hFX0NIRU1JU1RSWSk7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotDQotICAgICAgICAvLyBhdG9tOmlkDQotICAgICAgICB3cml0ZVRhZyh3cml0ZXIsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSwgVEFHX0FUT01fSUQsICJ1cm46dXVpZDowMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMCIpOw0KLQ0KLSAgICAgICAgLy8gYXRvbTp0aXRsZQ0KLSAgICAgICAgd3JpdGVUYWcod3JpdGVyLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sIFRBR19BVE9NX1RJVExFLCBnZXRUaXRsZSgpKTsNCi0NCi0gICAgICAgIC8vIGF0b206dXBkYXRlZA0KLSAgICAgICAgd3JpdGVUYWcod3JpdGVyLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sIFRBR19BVE9NX1VQREFURUQsIGdldFVwZGF0ZWQoKSk7DQotDQotICAgICAgICAvLyBjb250ZW50DQotICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSwgVEFHX0NPTlRFTlQpOw0KLQ0KLSAgICAgICAgICAgIHdyaXRlVGFnKHdyaXRlciwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSwgVEFHX0NPTlRFTlRfTUVESUFUWVBFLCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtLmdldEZpbGVOYW1lKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFhNTENvbnN0YW50cy5QUkVGSVhfQVBBQ0hFX0NIRU1JU1RZLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQQUNIRV9DSEVNSVNUUlksDQotICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0NPTlRFTlRfRklMRU5BTUUsIGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCBUQUdfQ09OVEVOVF9CQVNFNjQpOw0KLSAgICAgICAgICAgIHdyaXRlQ29udGVudCh3cml0ZXIpOw0KLSAgICAgICAgICAgIHdyaXRlci5lbmRUYWcoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSwgVEFHX0NPTlRFTlRfQkFTRTY0KTsNCi0NCi0gICAgICAgICAgICB3cml0ZXIuZW5kVGFnKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sIFRBR19DT05URU5UKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIG9iamVjdA0KLSAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgWE1MQ29udmVydGVyLndyaXRlT2JqZWN0KHdyaXRlciwgY21pc1ZlcnNpb24sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sIG9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyB0eXBlDQotICAgICAgICBpZiAodHlwZURlZiAhPSBudWxsKSB7DQotICAgICAgICAgICAgWE1MQ29udmVydGVyLndyaXRlVHlwZURlZmluaXRpb24od3JpdGVyLCBjbWlzVmVyc2lvbiwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSwgdHlwZURlZik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBidWxrIHVwZGF0ZQ0KLSAgICAgICAgaWYgKGJ1bGtVcGRhdGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFhNTENvbnZlcnRlci53cml0ZUJ1bGtVcGRhdGUod3JpdGVyLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCBidWxrVXBkYXRlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGVuZCBlbnRyeQ0KLSAgICAgICAgd3JpdGVyLmVuZFRhZyhYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sIFRBR19FTlRSWSk7DQotDQotICAgICAgICAvLyBlbmQgZG9jdW1lbnQNCi0gICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLSBpbnRlcm5hbCAtLS0tDQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRpdGxlKCkgew0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOw0KLQ0KLSAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IG5hbWVQcm9wZXJ0eSA9IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsNCi0gICAgICAgICAgICBpZiAobmFtZVByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKChQcm9wZXJ0eVN0cmluZykgbmFtZVByb3BlcnR5KS5nZXRGaXJzdFZhbHVlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHR5cGVEZWYgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmICh0eXBlRGVmLmdldERpc3BsYXlOYW1lKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0eXBlRGVmLmdldERpc3BsYXlOYW1lKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ1bGtVcGRhdGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdCA9ICJCdWxrIFVwZGF0ZSBQcm9wZXJ0aWVzIjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ29udGVudChYbWxTZXJpYWxpemVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpDQotICAgICAgICBCYXNlNjQuSW5wdXRTdHJlYW0gYjY0c3RyZWFtID0gbmV3IEJhc2U2NC5JbnB1dFN0cmVhbShzdHJlYW0sIEJhc2U2NC5FTkNPREUpOw0KLQ0KLSAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsNCi0gICAgICAgIGludCBwb3MgPSAwOw0KLSAgICAgICAgaW50IGI7DQotDQotICAgICAgICB3aGlsZSAoKGIgPSBiNjRzdHJlYW0ucmVhZCgpKSA+IC0xKSB7DQotICAgICAgICAgICAgYnVmZmVyW3BvcysrXSA9IChjaGFyKSAoYiAmIDB4RkYpOw0KLSAgICAgICAgICAgIGlmIChwb3MgPT0gYnVmZmVyLmxlbmd0aCkgew0KLSAgICAgICAgICAgICAgICB3cml0ZXIudGV4dChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOw0KLSAgICAgICAgICAgICAgICBwb3MgPSAwOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwb3MgPiAwKSB7DQotICAgICAgICAgICAgd3JpdGVyLnRleHQoYnVmZmVyLCAwLCBwb3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVcGRhdGVkKCkgew0KLSAgICAgICAgcmV0dXJuIERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlVGFnKFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBTdHJpbmcgdGFnTmFtZVNwYWNlLCBTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIHRleHQpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHdyaXRlci5zdGFydFRhZyh0YWdOYW1lU3BhY2UsIHRhZ05hbWUpOw0KLSAgICAgICAgd3JpdGVyLnRleHQodGV4dCk7DQotICAgICAgICB3cml0ZXIuZW5kVGFnKHRhZ05hbWVTcGFjZSwgdGFnTmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0F0b21QdWJQYXJzZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BdG9tUHViUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzE5NjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0F0b21QdWJQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLkNPTlRFTlRfU1JDOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLkxJTktfSFJFRjsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5MSU5LX1JFTDsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5MSU5LX1RZUEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0FDTDsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQUxMT1dBQkxFQUNUSU9OUzsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQ0hJTERSRU47DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0NPTExFQ1RJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0NPTExFQ1RJT05fVFlQRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQ09OVEVOVDsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfRU5UUlk7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0ZFRUQ7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0hUTUw7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0xJTks7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX05VTV9JVEVNUzsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfT0JKRUNUOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19QQVRIX1NFR01FTlQ7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX1JFTEFUSVZFX1BBVEhfU0VHTUVOVDsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfUkVQT1NJVE9SWV9JTkZPOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19TRVJWSUNFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19URU1QTEFURV9URU1QTEFURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfVEVNUExBVEVfVFlQRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfVFlQRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfVVJJX1RFTVBMQVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19XT1JLU1BBQ0U7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUFjbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUFsbG93YWJsZUFjdGlvbnM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21CYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRmVlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUxpbms7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkh0bWxEb2M7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLlJlcG9zaXRvcnlXb3Jrc3BhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLlNlcnZpY2VEb2M7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RyYWludHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsNCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsNCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBdG9tUHViIFBhcnNlci4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXRvbVB1YlBhcnNlciB7DQotDQotICAgIC8vIHB1YmxpYyBjb25zdGFudHMNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19SRUxfQ09OVEVOVCA9ICJAQGNvbnRlbnRAQCI7DQotDQotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtOw0KLSAgICBwcml2YXRlIEF0b21CYXNlIHBhcnNlUmVzdWx0Ow0KLQ0KLSAgICBwdWJsaWMgQXRvbVB1YlBhcnNlcihJbnB1dFN0cmVhbSBzdHJlYW0pIHsNCi0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHN0cmVhbS4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQYXJzZXMgdGhlIHN0cmVhbS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYTUxVdGlscy5jcmVhdGVQYXJzZXIoc3RyZWFtKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00uZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19GRUVELmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdCA9IHBhcnNlRmVlZChwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19FTlRSWS5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXN1bHQgPSBwYXJzZUVudHJ5KHBhcnNlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9DTUlTLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfQUxMT1dBQkxFQUNUSU9OUy5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXN1bHQgPSBwYXJzZUFsbG93YWJsZUFjdGlvbnMocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfQUNMLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdCA9IHBhcnNlQUNMKHBhcnNlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BUFAuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19TRVJWSUNFLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdCA9IHBhcnNlU2VydmljZURvYyhwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19IVE1MLmVxdWFsc0lnbm9yZUNhc2UobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdCA9IG5ldyBIdG1sRG9jKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHN0cmVhbSBpcyByZWFkIGFuZCBjbG9zZWQgaW4gYWxsIGNhc2VzDQotICAgICAgICAgICAgSU9VdGlscy5jb25zdW1lQW5kQ2xvc2Uoc3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIHRoZSBwYXJzZSByZXN1bHRzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIEF0b21CYXNlIGdldFJlc3VsdHMoKSB7DQotICAgICAgICByZXR1cm4gcGFyc2VSZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhIHNlcnZpY2UgZG9jdW1lbnQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBTZXJ2aWNlRG9jIHBhcnNlU2VydmljZURvYyhYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgU2VydmljZURvYyByZXN1bHQgPSBuZXcgU2VydmljZURvYygpOw0KLQ0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7DQotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7DQotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBQLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19XT1JLU1BBQ0UuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZFdvcmtzcGFjZShwYXJzZVdvcmtzcGFjZShwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGEgd29ya3NwYWNlIGVsZW1lbnQgaW4gYSBzZXJ2aWNlIGRvY3VtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgUmVwb3NpdG9yeVdvcmtzcGFjZSBwYXJzZVdvcmtzcGFjZShYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgUmVwb3NpdG9yeVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBuZXcgUmVwb3NpdG9yeVdvcmtzcGFjZSgpOw0KLQ0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7DQotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7DQotICAgICAgICAgICAgICAgIEF0b21FbGVtZW50IGVsZW1lbnQgPSBwYXJzZVdvcmtzcGFjZUVsZW1lbnQocGFyc2VyKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIGV4dHJhY3QgdGhlIHdvcmtzcGFjZSBpZA0KLSAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQgIT0gbnVsbCkgJiYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5SW5mbykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5zZXRJZCgoKFJlcG9zaXRvcnlJbmZvKSBlbGVtZW50LmdldE9iamVjdCgpKS5nZXRJZCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdG8gd29ya3NwYWNlDQotICAgICAgICAgICAgICAgIHdvcmtzcGFjZS5hZGRFbGVtZW50KGVsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmICghWE1MVXRpbHMubmV4dChwYXJzZXIpKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsNCi0NCi0gICAgICAgIHJldHVybiB3b3Jrc3BhY2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhbiBBdG9tIGZlZWQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIEF0b21GZWVkIHBhcnNlRmVlZChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgQXRvbUZlZWQgcmVzdWx0ID0gbmV3IEF0b21GZWVkKCk7DQotDQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7DQotDQotICAgICAgICB3aGlsZSAodHJ1ZSkgew0KLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsNCi0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShwYXJzZXIuZ2V0TmFtZXNwYWNlKCksIHBhcnNlci5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19MSU5LLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KHBhcnNlTGluayhwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0VOVFJZLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbnRyeShwYXJzZUVudHJ5KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTlVNX0lURU1TLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KHBhcnNlQmlnSW50ZWdlcihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGFuIEF0b20gZW50cnkuDQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgQXRvbUVudHJ5IHBhcnNlRW50cnkoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIEF0b21FbnRyeSByZXN1bHQgPSBuZXcgQXRvbUVudHJ5KCk7DQotDQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7DQotDQotICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIHRhZ3MgaW4gZW50cnkNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOw0KLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgew0KLSAgICAgICAgICAgICAgICBBdG9tRWxlbWVudCBlbGVtZW50ID0gcGFyc2VFbGVtZW50KHBhcnNlcik7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0byBlbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQoZWxlbWVudCk7DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGFuZCBzZXQgb2JqZWN0IGlkDQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0SWQoKChPYmplY3REYXRhKSBlbGVtZW50LmdldE9iamVjdCgpKS5nZXRJZCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFR5cGVEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldElkKCgoVHlwZURlZmluaXRpb24pIGVsZW1lbnQuZ2V0T2JqZWN0KCkpLmdldElkKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGFuIEFsbG93YWJsZSBBY3Rpb25zIGRvY3VtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXRvbUFsbG93YWJsZUFjdGlvbnMgcGFyc2VBbGxvd2FibGVBY3Rpb25zKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gbmV3IEF0b21BbGxvd2FibGVBY3Rpb25zKFhNTENvbnZlcnRlci5jb252ZXJ0QWxsb3dhYmxlQWN0aW9ucyhwYXJzZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGFuIEFDTCBkb2N1bWVudC4NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIEF0b21BY2wgcGFyc2VBQ0woWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBuZXcgQXRvbUFjbChYTUxDb252ZXJ0ZXIuY29udmVydEFjbChwYXJzZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGFuIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgQXRvbUVsZW1lbnQgcGFyc2VFbGVtZW50KFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKHBhcnNlci5nZXROYW1lc3BhY2UoKSwgcGFyc2VyLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICBpZiAoVEFHX09CSkVDVC5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCBYTUxDb252ZXJ0ZXIuY29udmVydE9iamVjdChwYXJzZXIpKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19QQVRIX1NFR01FTlQuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpDQotICAgICAgICAgICAgICAgICAgICB8fCBUQUdfUkVMQVRJVkVfUEFUSF9TRUdNRU5ULmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUZXh0KHBhcnNlcik7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfVFlQRS5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCBYTUxDb252ZXJ0ZXIuY29udmVydFR5cGVEZWZpbml0aW9uKHBhcnNlcikpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0NISUxEUkVOLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VDaGlsZHJlbihwYXJzZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgew0KLSAgICAgICAgICAgIGlmIChUQUdfTElOSy5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlTGluayhwYXJzZXIpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0NPTlRFTlQuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUF0b21Db250ZW50U3JjKHBhcnNlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBpdCAtIHNraXAgaXQNCi0gICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQYXJzZXMgYSBjaGlsZHJlbiBlbGVtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBdG9tRWxlbWVudCBwYXJzZUNoaWxkcmVuKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBBdG9tRWxlbWVudCByZXN1bHQgPSBudWxsOw0KLSAgICAgICAgUU5hbWUgY2hpbGROYW1lID0gbmV3IFFOYW1lKHBhcnNlci5nZXROYW1lc3BhY2UoKSwgcGFyc2VyLmdldE5hbWUoKSk7DQotDQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7DQotDQotICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGNoaWxkcmVuIHRhZw0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7DQotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7DQotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChUQUdfRkVFRC5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQXRvbUVsZW1lbnQoY2hpbGROYW1lLCBwYXJzZUZlZWQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmICghWE1MVXRpbHMubmV4dChwYXJzZXIpKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhIHdvcmtzcGFjZSBlbGVtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXRvbUVsZW1lbnQgcGFyc2VXb3Jrc3BhY2VFbGVtZW50KFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKHBhcnNlci5nZXROYW1lc3BhY2UoKSwgcGFyc2VyLmdldE5hbWUoKSk7DQotDQotICAgICAgICBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICBpZiAoVEFHX1JFUE9TSVRPUllfSU5GTy5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCBYTUxDb252ZXJ0ZXIuY29udmVydFJlcG9zaXRvcnlJbmZvKHBhcnNlcikpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1VSSV9URU1QTEFURS5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGVtcGxhdGUocGFyc2VyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICBpZiAoVEFHX0xJTksuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUxpbmsocGFyc2VyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBQLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgew0KLSAgICAgICAgICAgIGlmIChUQUdfQ09MTEVDVElPTi5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29sbGVjdGlvbihwYXJzZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHdlIGRvbid0IGtub3cgaXQgLSBza2lwIGl0DQotICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGEgY29sbGVjdGlvbiB0YWcuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tRWxlbWVudCBwYXJzZUNvbGxlY3Rpb24oWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICByZXN1bHQucHV0KCJocmVmIiwgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJocmVmIikpOw0KLQ0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7DQotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7DQotICAgICAgICAgICAgICAgIFFOYW1lIHRhZ05hbWUgPSBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00uZXF1YWxzKHRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpDQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgVEFHX0NPTExFQ1RJT05fVFlQRS5lcXVhbHModGFnTmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoImNvbGxlY3Rpb25UeXBlIiwgWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCByZXN1bHQpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQYXJzZXMgYSB0ZW1wbGF0ZSB0YWcuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tRWxlbWVudCBwYXJzZVRlbXBsYXRlKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKHBhcnNlci5nZXROYW1lc3BhY2UoKSwgcGFyc2VyLmdldE5hbWUoKSk7DQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLQ0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7DQotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7DQotICAgICAgICAgICAgICAgIFFOYW1lIHRhZ05hbWUgPSBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00uZXF1YWxzKHRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX1RFTVBMQVRFX1RFTVBMQVRFLmVxdWFscyh0YWdOYW1lLmdldExvY2FsUGFydCgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoInRlbXBsYXRlIiwgWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfVEVNUExBVEVfVFlQRS5lcXVhbHModGFnTmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KCJ0eXBlIiwgWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhtbFB1bGxQYXJzZXIuRU5EX1RBRykgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAoIVhNTFV0aWxzLm5leHQocGFyc2VyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7DQotDQotICAgICAgICByZXR1cm4gbmV3IEF0b21FbGVtZW50KG5hbWUsIHJlc3VsdCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhIGxpbmsgdGFnLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXRvbUVsZW1lbnQgcGFyc2VMaW5rKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKHBhcnNlci5nZXROYW1lc3BhY2UoKSwgcGFyc2VyLmdldE5hbWUoKSk7DQotICAgICAgICBBdG9tTGluayByZXN1bHQgPSBuZXcgQXRvbUxpbmsoKTsNCi0NCi0gICAgICAgIC8vIHNhdmUgYXR0cmlidXRlcw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7DQotICAgICAgICAgICAgaWYgKExJTktfUkVMLmVxdWFscyhwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKSkpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldFJlbChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTElOS19IUkVGLmVxdWFscyhwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKSkpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldEhyZWYocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKExJTktfVFlQRS5lcXVhbHMocGFyc2VyLmdldEF0dHJpYnV0ZU5hbWUoaSkpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRUeXBlKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gc2tpcCBlbmNsb3NlZCB0YWdzLCBpZiBhbnkNCi0gICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgQXRvbUVsZW1lbnQobmFtZSwgcmVzdWx0KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGEgbGluayB0YWcuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tRWxlbWVudCBwYXJzZUF0b21Db250ZW50U3JjKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKHBhcnNlci5nZXROYW1lc3BhY2UoKSwgcGFyc2VyLmdldE5hbWUoKSk7DQotICAgICAgICBBdG9tTGluayByZXN1bHQgPSBuZXcgQXRvbUxpbmsoKTsNCi0gICAgICAgIHJlc3VsdC5zZXRSZWwoTElOS19SRUxfQ09OVEVOVCk7DQotDQotICAgICAgICAvLyBzYXZlIGF0dHJpYnV0ZXMNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgew0KLSAgICAgICAgICAgIGlmIChDT05URU5UX1NSQy5lcXVhbHMocGFyc2VyLmdldEF0dHJpYnV0ZU5hbWUoaSkpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIcmVmKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gc2tpcCBlbmNsb3NlZCB0YWdzLCBpZiBhbnkNCi0gICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgQXRvbUVsZW1lbnQobmFtZSwgcmVzdWx0KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGFyc2VzIGEgdGV4dCB0YWcuDQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIEF0b21FbGVtZW50IHBhcnNlVGV4dChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShwYXJzZXIuZ2V0TmFtZXNwYWNlKCksIHBhcnNlci5nZXROYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCBYTUxVdGlscy5yZWFkVGV4dChwYXJzZXIsIFhNTENvbnN0cmFpbnRzLk1BWF9TVFJJTkdfTEVOR1RIKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhIHRleHQgdGFnIGFuZCBjb252ZXJ0IGl0IGludG8gYW4gaW50ZWdlci4NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIEF0b21FbGVtZW50IHBhcnNlQmlnSW50ZWdlcihYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShwYXJzZXIuZ2V0TmFtZXNwYWNlKCksIHBhcnNlci5nZXROYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCBuZXcgQmlnSW50ZWdlcihYTUxVdGlscy5yZWFkVGV4dChwYXJzZXIsIFhNTENvbnN0cmFpbnRzLk1BWF9TVFJJTkdfTEVOR1RIKSkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9DbWlzQXRvbVB1YkNvbnN0YW50cy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0NtaXNBdG9tUHViQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OWNmMjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0NtaXNBdG9tUHViQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQ29uc3RhbnRzIGZvciBBdG9tUHViLg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbWlzQXRvbVB1YkNvbnN0YW50cyB7DQotDQotICAgIHByaXZhdGUgQ21pc0F0b21QdWJDb25zdGFudHMoKSB7DQotICAgIH0NCi0NCi0gICAgLy8gc2VydmljZSBkb2MNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NFUlZJQ0UgPSAic2VydmljZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19XT1JLU1BBQ0UgPSAid29ya3NwYWNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUE9TSVRPUllfSU5GTyA9ICJyZXBvc2l0b3J5SW5mbyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT0xMRUNUSU9OID0gImNvbGxlY3Rpb24iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09MTEVDVElPTl9UWVBFID0gImNvbGxlY3Rpb25UeXBlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1VSSV9URU1QTEFURSA9ICJ1cml0ZW1wbGF0ZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19URU1QTEFURV9URU1QTEFURSA9ICJ0ZW1wbGF0ZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19URU1QTEFURV9UWVBFID0gInR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTElOSyA9ICJsaW5rIjsNCi0NCi0gICAgLy8gYXRvbQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRPTV9JRCA9ICJpZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVE9NX1RJVExFID0gInRpdGxlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUT01fVVBEQVRFRCA9ICJ1cGRhdGVkIjsNCi0NCi0gICAgLy8gZmVlZA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRkVFRCA9ICJmZWVkIjsNCi0NCi0gICAgLy8gZW50cnkNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0VOVFJZID0gImVudHJ5IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09CSkVDVCA9ICJvYmplY3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTlVNX0lURU1TID0gIm51bUl0ZW1zIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBVEhfU0VHTUVOVCA9ICJwYXRoU2VnbWVudCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRUxBVElWRV9QQVRIX1NFR01FTlQgPSAicmVsYXRpdmVQYXRoU2VnbWVudCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFID0gInR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0hJTERSRU4gPSAiY2hpbGRyZW4iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVEVOVCA9ICJjb250ZW50IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRFTlRfTUVESUFUWVBFID0gIm1lZGlhdHlwZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX0JBU0U2NCA9ICJiYXNlNjQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVEVOVF9GSUxFTkFNRSA9ICJmaWxlbmFtZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRE9DVU1FTlRfVFlQRSA9ICJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0ZPTERFUl9UWVBFID0gImNtaXNUeXBlRm9sZGVyRGVmaW5pdGlvblR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFTEFUSU9OU0hJUF9UWVBFID0gImNtaXNUeXBlUmVsYXRpb25zaGlwRGVmaW5pdGlvblR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BPTElDWV9UWVBFID0gImNtaXNUeXBlUG9saWN5RGVmaW5pdGlvblR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lURU1fVFlQRSA9ICJjbWlzVHlwZUl0ZW1EZWZpbml0aW9uVHlwZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU0VDT05EQVJZX1RZUEUgPSAiY21pc1R5cGVTZWNvbmRhcnlEZWZpbml0aW9uVHlwZSI7DQotDQotICAgIC8vIGFsbG93YWJsZSBhY3Rpb25zDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BTExPV0FCTEVBQ1RJT05TID0gImFsbG93YWJsZUFjdGlvbnMiOw0KLQ0KLSAgICAvLyBBQ0wNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDTCA9ICJhY2wiOw0KLQ0KLSAgICAvLyBIVE1MDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19IVE1MID0gImh0bWwiOw0KLQ0KLSAgICAvLyBsaW5rcw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1JFTCA9ICJyZWwiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0hSRUYgPSAiaHJlZiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfVFlQRSA9ICJ0eXBlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9TUkMgPSAic3JjIjsNCi0NCi0gICAgLy8gQW5kcm9pZCBQYXJzZXIgU3BlY2lmaWMNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZID0gInByb3BlcnR5IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9JRCA9ICJpZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfTE9DQUxOQU1FID0gImxvY2FsTmFtZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfRElTUExBWU5BTUUgPSAiZGlzcGxheU5hbWUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1FVRVJZTkFNRSA9ICJxdWVyeU5hbWUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1ZBTFVFID0gInZhbHVlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9EQVRBVFlQRSA9ICJ0eXBlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9DQVJESU5BTElUWSA9ICJjYXJkaW5hbGl0eSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX0lEID0gInJlcG9zaXRvcnlJZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX05BTUUgPSAicmVwb3NpdG9yeU5hbWUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19ERVNDUklQVElPTiA9ICJyZXBvc2l0b3J5RGVzY3JpcHRpb24iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19WRU5ET1IgPSAidmVuZG9yTmFtZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX1BST0RVQ1QgPSAicHJvZHVjdE5hbWUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19QUk9EVUNUX1ZFUlNJT04gPSAicHJvZHVjdFZlcnNpb24iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19ST09UX0ZPTERFUl9JRCA9ICJyb290Rm9sZGVySWQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19SRVBPU0lUT1JZX1VSTCA9ICJyZXBvc2l0b3J5VXJsIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fUk9PVF9GT0xERVJfVVJMID0gInJvb3RGb2xkZXJVcmwiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19DQVBBQklMSVRJRVMgPSAiY2FwYWJpbGl0aWVzIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fQUNMX0NBUEFCSUxJVFkgPSAiYWNsQ2FwYWJpbGl0eSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX0NIQU5HRV9MT0NLX1RPS0VOID0gImxhdGVzdENoYW5nZUxvZ1Rva2VuIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fQ01JU19WRVJTSU9OX1NVUFBPUlRFRCA9ICJjbWlzVmVyc2lvblN1cHBvcnRlZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX1RISU5fQ0xJRU5UX1VSSSA9ICJ0aGluQ2xpZW50VVJJIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fQ0hBTkdFU19JTkNPTVBMRVRFID0gImNoYW5nZXNJbmNvbXBsZXRlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fQ0hBTkdFU19PTl9UWVBFID0gImNoYW5nZXNPblR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19QUklOQ0lQQUxfQU5PTllNT1VTID0gInByaW5jaXBhbEFub255bW91cyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX1BSSU5DSVBBTF9BTllPTkUgPSAicHJpbmNpcGFsQW55b25lIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBSRVBJTkZPX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX0lEKTsNCi0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoVEFHX1JFUElORk9fTkFNRSk7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX0RFU0NSSVBUSU9OKTsNCi0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoVEFHX1JFUElORk9fVkVORE9SKTsNCi0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoVEFHX1JFUElORk9fUFJPRFVDVCk7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX1BST0RVQ1RfVkVSU0lPTik7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX1JPT1RfRk9MREVSX0lEKTsNCi0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoVEFHX1JFUElORk9fUkVQT1NJVE9SWV9VUkwpOw0KLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChUQUdfUkVQSU5GT19ST09UX0ZPTERFUl9VUkwpOw0KLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChUQUdfUkVQSU5GT19DQVBBQklMSVRJRVMpOw0KLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChUQUdfUkVQSU5GT19BQ0xfQ0FQQUJJTElUWSk7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX0NIQU5HRV9MT0NLX1RPS0VOKTsNCi0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoVEFHX1JFUElORk9fQ01JU19WRVJTSU9OX1NVUFBPUlRFRCk7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX1RISU5fQ0xJRU5UX1VSSSk7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX0NIQU5HRVNfSU5DT01QTEVURSk7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX0NIQU5HRVNfT05fVFlQRSk7DQotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKFRBR19SRVBJTkZPX1BSSU5DSVBBTF9BTk9OWU1PVVMpOw0KLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChUQUdfUkVQSU5GT19QUklOQ0lQQUxfQU5ZT05FKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNMQ0FQX0FDTF9QUk9QQUdBVElPTiA9ICJwcm9wYWdhdGlvbiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xDQVBfU1VQUE9SVEVEX1BFUk1JU1NJT05TID0gInN1cHBvcnRlZFBlcm1pc3Npb25zIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDTENBUF9QRVJNSVNTSU9OUyA9ICJwZXJtaXNzaW9ucyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xDQVBfUEVSTUlTU0lPTl9QRVJNSVNTSU9OID0gInBlcm1pc3Npb24iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNMQ0FQX1BFUk1JU1NJT05fREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNMQ0FQX01BUFBJTkcgPSAibWFwcGluZyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xDQVBfTUFQUElOR19LRVkgPSAia2V5IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDTENBUF9NQVBQSU5HX1BFUk1JU1NJT04gPSAicGVybWlzc2lvbiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xDQVBfRElSRUNUID0gImRpcmVjdCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfQ09OVEVOVF9TVFJFQU1fVVBEQVRFUyA9ICJjYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0YWJpbGl0eSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfQ0hBTkdFUyA9ICJjYXBhYmlsaXR5Q2hhbmdlcyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfUkVORElUSU9OUyA9ICJjYXBhYmlsaXR5UmVuZGl0aW9ucyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfR0VUX0RFU0NFTkRBTlRTID0gImNhcGFiaWxpdHlHZXREZXNjZW5kYW50cyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfR0VUX0ZPTERFUl9UUkVFID0gImNhcGFiaWxpdHlHZXRGb2xkZXJUcmVlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9NVUxUSUZJTElORyA9ICJjYXBhYmlsaXR5TXVsdGlmaWxpbmciOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX1VORklMSU5HID0gImNhcGFiaWxpdHlVbmZpbGluZyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfVkVSU0lPTl9TUEVDSUZJQ19GSUxJTkcgPSAiY2FwYWJpbGl0eVZlcnNpb25TcGVjaWZpY0ZpbGluZyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfUFdDX1NFQVJDSEFCTEUgPSAiY2FwYWJpbGl0eVBXQ1NlYXJjaGFibGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX1BXQ19VUERBVEFCTEUgPSAiY2FwYWJpbGl0eVBXQ1VwZGF0YWJsZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfQUxMX1ZFUlNJT05TX1NFQVJDSEFCTEUgPSAiY2FwYWJpbGl0eUFsbFZlcnNpb25zU2VhcmNoYWJsZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfUVVFUlkgPSAiY2FwYWJpbGl0eVF1ZXJ5IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9KT0lOID0gImNhcGFiaWxpdHlKb2luIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9BQ0wgPSAiY2FwYWJpbGl0eUFDTCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfVFlQRV9JRCA9ICJpZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfREVGSU5JVElPTl9JRCA9ICJwcm9wZXJ0eURlZmluaXRpb25JZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUUgPSAibG9jYWxOYW1lIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9UWVBFX0xPQ0FMTkFNRVNQQUNFID0gImxvY2FsTmFtZXNwYWNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9UWVBFX0RJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9UWVBFX1FVRVJZTkFNRSA9ICJxdWVyeU5hbWUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1RZUEVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1RZUEVfUFJPUEVSVFlfVFlQRSA9ICJwcm9wZXJ0eVR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1RZUEVfQ0FSRElOQUxJVFkgPSAiY2FyZGluYWxpdHkiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1RZUEVfVVBEQVRBQklMSVRZID0gInVwZGF0YWJpbGl0eSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfVFlQRV9JTkhFUklURUQgPSAiaW5oZXJpdGVkIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9UWVBFX1JFUVVJUkVEID0gInJlcXVpcmVkIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9UWVBFX1FVRVJZQUJMRSA9ICJxdWVyeWFibGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1RZUEVfT1JERVJBQkxFID0gIm9yZGVyYWJsZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfVFlQRV9PUEVOQ0hPSUNFID0gIm9wZW5DaG9pY2UiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1RZUEVfTUFYX0xFTkdUSCA9ICJtYXhMZW5ndGgiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1RZUEVfTUlOX1ZBTFVFID0gIm1pblZhbHVlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9UWVBFX01BWF9WQUxVRSA9ICJtYXhWYWx1ZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfVFlQRV9QUkVDSVNJT04gPSAicHJlY2lzaW9uIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9UWVBFX1JFU09MVVRJT04gPSAicmVzb2x1dGlvbiI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRU5ESVRJT04gPSAicmVuZGl0aW9uIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9TVFJFQU1fSUQgPSAic3RyZWFtSWQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVORElUSU9OX01JTUVUWVBFID0gIm1pbWVUeXBlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9MRU5HVEggPSAibGVuZ3RoIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9LSU5EID0gImtpbmQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVORElUSU9OX1RJVExFID0gInRpdGxlIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9IRUlHSFQgPSAiaGVpZ2h0IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9XSURUSCA9ICJ3aWR0aCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRU5ESVRJT05fRE9DVU1FTlRfSUQgPSAicmVuZGl0aW9uRG9jdW1lbnRJZCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0VfUFJJTkNJUEFMID0gInByaW5jaXBhbCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0VfUFJJTkNJUEFMX0lEID0gInByaW5jaXBhbElkIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDRV9ESVJFQ1QgPSAiZGlyZWN0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJpZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTE9DQUxOQU1FID0gImxvY2FsTmFtZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTE9DQUxOQU1FU1BBQ0UgPSAibG9jYWxOYW1lc3BhY2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9RVUVSWU5BTUUgPSAicXVlcnlOYW1lIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQkFTRV9JRCA9ICJiYXNlSWQiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BBUkVOVF9JRCA9ICJwYXJlbnRJZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ1JFQVRBQkxFID0gImNyZWF0YWJsZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRklMRUFCTEUgPSAiZmlsZWFibGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1FVRVJZQUJMRSA9ICJxdWVyeWFibGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZVTExURVhUX0lOREVYRUQgPSAiZnVsbHRleHRJbmRleGVkIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JTkNMVURFX0lOX1NVUEVSVFlQRV9RVUVSWSA9ICJpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NPTlRST0xBQkxFX1BPTElDWSA9ICJjb250cm9sbGFibGVQb2xpY3kiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NPTlRST0xBQkxFX0FDTCA9ICJjb250cm9sbGFibGVBQ0wiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BST1BFUlRZX0RFRklOSVRJT05TID0gInByb3BlcnR5RGVmaW5pdGlvbnMiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NPTlRFTlRTVFJFQU1fQUxMT1dFRCA9ICJjb250ZW50U3RyZWFtQWxsb3dlZCI7IC8vIGRvY3VtZW50DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfVkVSU0lPTkFCTEUgPSAidmVyc2lvbmFibGUiOyAvLyBkb2N1bWVudA0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkFMVUUgPSAidmFsdWUiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUVVFUlkgPSAicXVlcnkiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUVVFUllfU1RBVEVNRU5UID0gInN0YXRlbWVudCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09CSkVDVF9BTExPV0FCTEVfQUNUSU9OUyA9ICJhbGxvd2FibGVBY3Rpb25zIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09CSkVDVF9SRUxBVElPTlNISVBTID0gInJlbGF0aW9uc2hpcHMiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT0JKRUNUX0NIQU5HRV9FVkVOVF9JTkZPID0gImNoYW5nZUV2ZW50SW5mbyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfQUNMID0gImFjbCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfRVhBQ1RfQUNMID0gImV4YWN0QUNMIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09CSkVDVF9QT0xJQ1lfSURTID0gInBvbGljeUlkcyI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfUkVORElUSU9OID0gInJlbmRpdGlvbiI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gT0JKRUNUX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBPQkpFQ1RfS0VZUy5hZGQoVEFHX09CSkVDVF9QUk9QRVJUSUVTKTsNCi0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChUQUdfT0JKRUNUX0FMTE9XQUJMRV9BQ1RJT05TKTsNCi0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChUQUdfT0JKRUNUX1JFTEFUSU9OU0hJUFMpOw0KLSAgICAgICAgT0JKRUNUX0tFWVMuYWRkKFRBR19PQkpFQ1RfQ0hBTkdFX0VWRU5UX0lORk8pOw0KLSAgICAgICAgT0JKRUNUX0tFWVMuYWRkKFRBR19PQkpFQ1RfQUNMKTsNCi0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChUQUdfT0JKRUNUX0VYQUNUX0FDTCk7DQotICAgICAgICBPQkpFQ1RfS0VZUy5hZGQoVEFHX09CSkVDVF9QT0xJQ1lfSURTKTsNCi0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChUQUdfT0JKRUNUX1JFTkRJVElPTik7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0NtaXNBdG9tUHViU3BpLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQ21pc0F0b21QdWJTcGkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZTk5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQ21pc0F0b21QdWJTcGkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkNtaXNTcGk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkFjbFNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkRpc2NvdmVyeVNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk11bHRpRmlsaW5nU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk9iamVjdFNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlBvbGljeVNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlcG9zaXRvcnlTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsNCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7DQotDQotLyoqDQotICogQ01JUyBBdG9tUHViIFNQSSBpbXBsZW1lbnRhdGlvbi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ21pc0F0b21QdWJTcGkgaW1wbGVtZW50cyBDbWlzU3BpIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENtaXNBdG9tUHViU3BpLmNsYXNzKTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnlTZXJ2aWNlIHJlcG9zaXRvcnlTZXJ2aWNlOw0KLSAgICBwcml2YXRlIGZpbmFsIE5hdmlnYXRpb25TZXJ2aWNlIG5hdmlnYXRpb25TZXJ2aWNlOw0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFNlcnZpY2Ugb2JqZWN0U2VydmljZTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uaW5nU2VydmljZSB2ZXJzaW9uaW5nU2VydmljZTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBEaXNjb3ZlcnlTZXJ2aWNlIGRpc2NvdmVyeVNlcnZpY2U7DQotICAgIHByaXZhdGUgZmluYWwgTXVsdGlGaWxpbmdTZXJ2aWNlIG11bHRpRmlsaW5nU2VydmljZTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBSZWxhdGlvbnNoaXBTZXJ2aWNlIHJlbGF0aW9uc2hpcFNlcnZpY2U7DQotICAgIHByaXZhdGUgZmluYWwgUG9saWN5U2VydmljZSBwb2xpY3lTZXJ2aWNlOw0KLSAgICBwcml2YXRlIGZpbmFsIEFjbFNlcnZpY2UgYWNsU2VydmljZTsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yLg0KLSAgICAgKi8NCi0gICAgcHVibGljIENtaXNBdG9tUHViU3BpKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsNCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIExPRy5kZWJ1ZygiU2Vzc2lvbiB7fTogSW5pdGlhbGl6aW5nIEF0b21QdWIgU1BJLi4uIiwgc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOw0KLQ0KLSAgICAgICAgcmVwb3NpdG9yeVNlcnZpY2UgPSBuZXcgUmVwb3NpdG9yeVNlcnZpY2VJbXBsKHNlc3Npb24pOw0KLSAgICAgICAgbmF2aWdhdGlvblNlcnZpY2UgPSBuZXcgTmF2aWdhdGlvblNlcnZpY2VJbXBsKHNlc3Npb24pOw0KLSAgICAgICAgb2JqZWN0U2VydmljZSA9IG5ldyBPYmplY3RTZXJ2aWNlSW1wbChzZXNzaW9uKTsNCi0gICAgICAgIHZlcnNpb25pbmdTZXJ2aWNlID0gbmV3IFZlcnNpb25pbmdTZXJ2aWNlSW1wbChzZXNzaW9uKTsNCi0gICAgICAgIGRpc2NvdmVyeVNlcnZpY2UgPSBuZXcgRGlzY292ZXJ5U2VydmljZUltcGwoc2Vzc2lvbik7DQotICAgICAgICBtdWx0aUZpbGluZ1NlcnZpY2UgPSBuZXcgTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbChzZXNzaW9uKTsNCi0gICAgICAgIHJlbGF0aW9uc2hpcFNlcnZpY2UgPSBuZXcgUmVsYXRpb25zaGlwU2VydmljZUltcGwoc2Vzc2lvbik7DQotICAgICAgICBwb2xpY3lTZXJ2aWNlID0gbmV3IFBvbGljeVNlcnZpY2VJbXBsKHNlc3Npb24pOw0KLSAgICAgICAgYWNsU2VydmljZSA9IG5ldyBBY2xTZXJ2aWNlSW1wbChzZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeVNlcnZpY2UgZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKSB7DQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeVNlcnZpY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlIGdldE5hdmlnYXRpb25TZXJ2aWNlKCkgew0KLSAgICAgICAgcmV0dXJuIG5hdmlnYXRpb25TZXJ2aWNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RTZXJ2aWNlIGdldE9iamVjdFNlcnZpY2UoKSB7DQotICAgICAgICByZXR1cm4gb2JqZWN0U2VydmljZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGlzY292ZXJ5U2VydmljZSBnZXREaXNjb3ZlcnlTZXJ2aWNlKCkgew0KLSAgICAgICAgcmV0dXJuIGRpc2NvdmVyeVNlcnZpY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlIGdldFZlcnNpb25pbmdTZXJ2aWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHZlcnNpb25pbmdTZXJ2aWNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNdWx0aUZpbGluZ1NlcnZpY2UgZ2V0TXVsdGlGaWxpbmdTZXJ2aWNlKCkgew0KLSAgICAgICAgcmV0dXJuIG11bHRpRmlsaW5nU2VydmljZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVsYXRpb25zaGlwU2VydmljZSBnZXRSZWxhdGlvbnNoaXBTZXJ2aWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcFNlcnZpY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvbGljeVNlcnZpY2UgZ2V0UG9saWN5U2VydmljZSgpIHsNCi0gICAgICAgIHJldHVybiBwb2xpY3lTZXJ2aWNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBY2xTZXJ2aWNlIGdldEFjbFNlcnZpY2UoKSB7DQotICAgICAgICByZXR1cm4gYWNsU2VydmljZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckFsbENhY2hlcygpIHsNCi0gICAgICAgIHNlc3Npb24ucmVtb3ZlKFNwaVNlc3Npb25QYXJhbWV0ZXIuTElOS19DQUNIRSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYXJSZXBvc2l0b3J5Q2FjaGUoU3RyaW5nIHJlcG9zaXRvcnlJZCkgew0KLSAgICAgICAgTGlua0NhY2hlIGxpbmtDYWNoZSA9IChMaW5rQ2FjaGUpIHNlc3Npb24uZ2V0KFNwaVNlc3Npb25QYXJhbWV0ZXIuTElOS19DQUNIRSk7DQotICAgICAgICBpZiAobGlua0NhY2hlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBsaW5rQ2FjaGUuY2xlYXJSZXBvc2l0b3J5KHJlcG9zaXRvcnlJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7DQotICAgICAgICAvLyBuby1vcCBmb3IgQXRvbVB1Yg0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0Rpc2NvdmVyeVNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTAxODMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0Rpc2NvdmVyeVNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRmVlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUxpbms7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RMaXN0SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlF1ZXJ5VHlwZUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkRpc2NvdmVyeVNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkV4dGVuZGVkSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7DQotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7DQotDQotLyoqDQotICogRGlzY292ZXJ5IFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuDQotICovDQotcHVibGljIGNsYXNzIERpc2NvdmVyeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIERpc2NvdmVyeVNlcnZpY2Ugew0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGlzY292ZXJ5U2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgew0KLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VMb2dUb2tlbiwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydGllcywNCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFDTCwgQmlnSW50ZWdlciBtYXhJdGVtcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbnVsbDsNCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbnVsbDsNCi0NCi0gICAgICAgIC8vIGlmIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0IGtub3cgdGhlIGNoYW5nZSBsb2cgdG9rZW4gYnV0IHRoZSBsaW5rIHRvDQotICAgICAgICAvLyB0aGUgbmV4dCBBdG9tIGZlZWQNCi0gICAgICAgIGlmIChjaGFuZ2VMb2dUb2tlbiBpbnN0YW5jZW9mIEV4dGVuZGVkSG9sZGVyICYmIGNoYW5nZUxvZ1Rva2VuLmdldFZhbHVlKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGxpbmsgPSAoU3RyaW5nKSAoKEV4dGVuZGVkSG9sZGVyPFN0cmluZz4pIGNoYW5nZUxvZ1Rva2VuKS5nZXRFeHRyYVZhbHVlKENvbnN0YW50cy5SRVBfUkVMX0NIQU5HRVMpOw0KLSAgICAgICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gaWYgdGhlIGFwcGxpY2F0aW9uIGRpZG4ndCBwcm92aWRlIGEgbGluayB0byBuZXh0IEF0b20gZmVlZA0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGxpbmsgPSBsb2FkUmVwb3NpdG9yeUxpbmsocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuUkVQX1JFTF9DSEFOR0VTKTsNCi0gICAgICAgICAgICBpZiAobGluayAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfTE9HX1RPS0VOLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2VMb2dUb2tlbiA9PSBudWxsID8gbnVsbCA6IGNoYW5nZUxvZ1Rva2VuLmdldFZhbHVlKCkpKTsNCi0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUFJPUEVSVElFUywgaW5jbHVkZVByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7DQotICAgICAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMsIGluY2x1ZGVQb2xpY3lJZHMpOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BQ0wsIGluY2x1ZGVBQ0wpOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMsIG1heEl0ZW1zKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIGNvbnRlbnQgY2hhbmdlcyBub3Qgc3VwcG9ydGVkISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7DQotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOw0KLSAgICAgICAgU3RyaW5nIGxhc3RDaGFuZ2VMb2dUb2tlbiA9IG51bGw7DQotDQotICAgICAgICAvLyBoYW5kbGUgdG9wIGxldmVsDQotICAgICAgICBTdHJpbmcgbmV4dExpbmsgPSBudWxsOw0KLSAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZmVlZC5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNOZXh0TGluayhlbGVtZW50KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsgPSAoKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKS5nZXRIcmVmKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW50KE5BTUVfTlVNX0lURU1TLCBlbGVtZW50KSkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMoKEJpZ0ludGVnZXIpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdHIoImNoYW5nZUxvZ1Rva2VuIiwgZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgbGFzdENoYW5nZUxvZ1Rva2VuID0gKFN0cmluZykgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBnZXQgdGhlIGNoYW5nZXMNCi0gICAgICAgIGlmICghZmVlZC5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmVzdWx0LnNldE9iamVjdHMobmV3IEFycmF5TGlzdDxPYmplY3REYXRhPihmZWVkLmdldEVudHJpZXMoKS5zaXplKCkpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7DQotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgaGl0ID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBoaXQgPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaGl0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRPYmplY3RzKCkuYWRkKGhpdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY2hhbmdlTG9nVG9rZW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIHRoZSBBdG9tUHViIGJpbmRpbmcgY2Fubm90IHJldHVybiBhIG5ldyBjaGFuZ2UgbG9nIHRva2VuLA0KLSAgICAgICAgICAgIC8vIGJ1dCBhbiBPcGVuQ01JUyBzZXJ2ZXIgdXNlcyBhIHByb3ByaWV0YXJ5IHRhZw0KLSAgICAgICAgICAgIGNoYW5nZUxvZ1Rva2VuLnNldFZhbHVlKGxhc3RDaGFuZ2VMb2dUb2tlbik7DQotDQotICAgICAgICAgICAgLy8gYnV0IHdlIGNhbiBwcm92aWRlIHRoZSBsaW5rIHRvIHRoZSBuZXh0IEF0b20gZmVlZA0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VMb2dUb2tlbiBpbnN0YW5jZW9mIEV4dGVuZGVkSG9sZGVyICYmIG5leHRMaW5rICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgKChFeHRlbmRlZEhvbGRlcjxTdHJpbmc+KSBjaGFuZ2VMb2dUb2tlbikuc2V0RXh0cmFWYWx1ZShDb25zdGFudHMuUkVQX1JFTF9DSEFOR0VTLCBuZXh0TGluayk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc3RhdGVtZW50LCBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLA0KLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLA0KLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIE9iamVjdExpc3RJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3RMaXN0SW1wbCgpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkQ29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5DT0xMRUNUSU9OX1FVRVJZKTsNCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkgb3IgcXVlcnkgbm90IHN1cHBvcnRlZCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotDQotICAgICAgICAvLyBjb21waWxlIHF1ZXJ5IHJlcXVlc3QNCi0gICAgICAgIGZpbmFsIFF1ZXJ5VHlwZUltcGwgcXVlcnkgPSBuZXcgUXVlcnlUeXBlSW1wbCgpOw0KLSAgICAgICAgcXVlcnkuc2V0U3RhdGVtZW50KHN0YXRlbWVudCk7DQotICAgICAgICBxdWVyeS5zZXRTZWFyY2hBbGxWZXJzaW9ucyhzZWFyY2hBbGxWZXJzaW9ucyk7DQotICAgICAgICBxdWVyeS5zZXRJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyhpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7DQotICAgICAgICBxdWVyeS5zZXRJbmNsdWRlUmVsYXRpb25zaGlwcyhpbmNsdWRlUmVsYXRpb25zaGlwcyk7DQotICAgICAgICBxdWVyeS5zZXRSZW5kaXRpb25GaWx0ZXIocmVuZGl0aW9uRmlsdGVyKTsNCi0gICAgICAgIHF1ZXJ5LnNldE1heEl0ZW1zKG1heEl0ZW1zKTsNCi0gICAgICAgIHF1ZXJ5LnNldFNraXBDb3VudChza2lwQ291bnQpOw0KLQ0KLSAgICAgICAgZmluYWwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24gPSBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpOw0KLQ0KLSAgICAgICAgLy8gcG9zdCB0aGUgcXVlcnkgYW5kIHBhcnNlIHJlc3VsdHMNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9RVUVSWSwgbmV3IE91dHB1dCgpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgWG1sU2VyaWFsaXplciB3cml0ZXIgPSBYTUxVdGlscy5jcmVhdGVXcml0ZXIob3V0KTsNCi0gICAgICAgICAgICAgICAgWE1MVXRpbHMuc3RhcnRYbWxEb2N1bWVudCh3cml0ZXIpOw0KLSAgICAgICAgICAgICAgICBYTUxDb252ZXJ0ZXIud3JpdGVRdWVyeSh3cml0ZXIsIGNtaXNWZXJzaW9uLCBxdWVyeSk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gaGFuZGxlIHRvcCBsZXZlbA0KLSAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZmVlZC5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNOZXh0TGluayhlbGVtZW50KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0ludChOQU1FX05VTV9JVEVNUywgZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKChCaWdJbnRlZ2VyKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBnZXQgdGhlIHJlc3VsdCBzZXQNCi0gICAgICAgIGlmICghZmVlZC5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmVzdWx0LnNldE9iamVjdHMobmV3IEFycmF5TGlzdDxPYmplY3REYXRhPihmZWVkLmdldEVudHJpZXMoKS5zaXplKCkpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7DQotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgaGl0ID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBoaXQgPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaGl0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRPYmplY3RzKCkuYWRkKGhpdCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9MaW5rQ2FjaGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9MaW5rQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwYzdmZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvTGlua0NhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuQ2FjaGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsLkNhY2hlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuQ29udGVudFR5cGVDYWNoZUxldmVsSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuTHJ1Q2FjaGVMZXZlbEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsLk1hcENhY2hlTGV2ZWxJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsNCi0NCi0vKioNCi0gKiBMaW5rIGNhY2hlLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMaW5rQ2FjaGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gS05PV05fTElOS1MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9BQ0wpOw0KLSAgICAgICAgS05PV05fTElOS1MuYWRkKENvbnN0YW50cy5SRUxfRE9XTik7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9VUCk7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFKTsNCi0gICAgICAgIEtOT1dOX0xJTktTLmFkZChDb25zdGFudHMuUkVMX1JFTEFUSU9OU0hJUFMpOw0KLSAgICAgICAgS05PV05fTElOS1MuYWRkKENvbnN0YW50cy5SRUxfU0VMRik7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9BTExPV0FCTEVBQ1RJT05TKTsNCi0gICAgICAgIEtOT1dOX0xJTktTLmFkZChDb25zdGFudHMuUkVMX0VESVRNRURJQSk7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9QT0xJQ0lFUyk7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9WRVJTSU9OSElTVE9SWSk7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9XT1JLSU5HQ09QWSk7DQotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQXRvbVB1YlBhcnNlci5MSU5LX1JFTF9DT05URU5UKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfU0laRV9SRVBPU0lUT1JJRVMgPSAxMDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBQ0hFX1NJWkVfVFlQRVMgPSAxMDA7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQUNIRV9TSVpFX09CSkVDVFMgPSA0MDA7DQotDQotICAgIHByaXZhdGUgZmluYWwgQ2FjaGUgbGlua0NhY2hlOw0KLSAgICBwcml2YXRlIGZpbmFsIENhY2hlIHR5cGVMaW5rQ2FjaGU7DQotICAgIHByaXZhdGUgZmluYWwgQ2FjaGUgY29sbGVjdGlvbkxpbmtDYWNoZTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBDYWNoZSB0ZW1wbGF0ZUNhY2hlOw0KLSAgICBwcml2YXRlIGZpbmFsIENhY2hlIHJlcG9zaXRvcnlMaW5rQ2FjaGU7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvci4NCi0gICAgICovDQotICAgIHB1YmxpYyBMaW5rQ2FjaGUoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgew0KLSAgICAgICAgaW50IHJlcENvdW50ID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DQUNIRV9TSVpFX1JFUE9TSVRPUklFUywgQ0FDSEVfU0laRV9SRVBPU0lUT1JJRVMpOw0KLSAgICAgICAgaWYgKHJlcENvdW50IDwgMSkgew0KLSAgICAgICAgICAgIHJlcENvdW50ID0gQ0FDSEVfU0laRV9SRVBPU0lUT1JJRVM7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgdHlwZUNvdW50ID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DQUNIRV9TSVpFX1RZUEVTLCBDQUNIRV9TSVpFX1RZUEVTKTsNCi0gICAgICAgIGlmICh0eXBlQ291bnQgPCAxKSB7DQotICAgICAgICAgICAgdHlwZUNvdW50ID0gQ0FDSEVfU0laRV9UWVBFUzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGludCBvYmpDb3VudCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9MSU5LUywgQ0FDSEVfU0laRV9PQkpFQ1RTKTsNCi0gICAgICAgIGlmIChvYmpDb3VudCA8IDEpIHsNCi0gICAgICAgICAgICBvYmpDb3VudCA9IENBQ0hFX1NJWkVfT0JKRUNUUzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGxpbmtDYWNoZSA9IG5ldyBDYWNoZUltcGwoIkxpbmsgQ2FjaGUiKTsNCi0gICAgICAgIGxpbmtDYWNoZS5pbml0aWFsaXplKG5ldyBTdHJpbmdbXSB7DQotICAgICAgICAgICAgICAgIE1hcENhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIE1hcENhY2hlTGV2ZWxJbXBsLkNBUEFDSVRZICsgIj0iICsgcmVwQ291bnQsIC8vIHJlcG9zaXRvcnkNCi0gICAgICAgICAgICAgICAgTHJ1Q2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTHJ1Q2FjaGVMZXZlbEltcGwuTUFYX0VOVFJJRVMgKyAiPSIgKyBvYmpDb3VudCwgLy8gaWQNCi0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPTEyIiwgLy8gcmVsDQotICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPTMsIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgTWFwQ2FjaGVMZXZlbEltcGwuU0lOR0xFX1ZBTFVFICsgIj10cnVlIiAvLyB0eXBlDQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIHR5cGVMaW5rQ2FjaGUgPSBuZXcgQ2FjaGVJbXBsKCJUeXBlIExpbmsgQ2FjaGUiKTsNCi0gICAgICAgIHR5cGVMaW5rQ2FjaGUuaW5pdGlhbGl6ZShuZXcgU3RyaW5nW10gew0KLSAgICAgICAgICAgICAgICBNYXBDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9IiArIHJlcENvdW50LCAvLyByZXBvc2l0b3J5DQotICAgICAgICAgICAgICAgIExydUNhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIExydUNhY2hlTGV2ZWxJbXBsLk1BWF9FTlRSSUVTICsgIj0iICsgdHlwZUNvdW50LCAvLyBpZA0KLSAgICAgICAgICAgICAgICBNYXBDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9MTIiLCAvLyByZWwNCi0gICAgICAgICAgICAgICAgQ29udGVudFR5cGVDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9MywiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXBDYWNoZUxldmVsSW1wbC5TSU5HTEVfVkFMVUUgKyAiPXRydWUiLy8gdHlwZQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBjb2xsZWN0aW9uTGlua0NhY2hlID0gbmV3IENhY2hlSW1wbCgiQ29sbGVjdGlvbiBMaW5rIENhY2hlIik7DQotICAgICAgICBjb2xsZWN0aW9uTGlua0NhY2hlLmluaXRpYWxpemUobmV3IFN0cmluZ1tdIHsNCi0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPSIgKyByZXBDb3VudCwgLy8gcmVwb3NpdG9yeQ0KLSAgICAgICAgICAgICAgICBNYXBDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9OCIgLy8gY29sbGVjdGlvbg0KLSAgICAgICAgfSk7DQotDQotICAgICAgICB0ZW1wbGF0ZUNhY2hlID0gbmV3IENhY2hlSW1wbCgiVVJJIFRlbXBsYXRlIENhY2hlIik7DQotICAgICAgICB0ZW1wbGF0ZUNhY2hlLmluaXRpYWxpemUobmV3IFN0cmluZ1tdIHsNCi0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPSIgKyByZXBDb3VudCwgLy8gcmVwb3NpdG9yeQ0KLSAgICAgICAgICAgICAgICBNYXBDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9NiIgLy8gdHlwZQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICByZXBvc2l0b3J5TGlua0NhY2hlID0gbmV3IENhY2hlSW1wbCgiUmVwb3NpdG9yeSBMaW5rIENhY2hlIik7DQotICAgICAgICByZXBvc2l0b3J5TGlua0NhY2hlLmluaXRpYWxpemUobmV3IFN0cmluZ1tdIHsNCi0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPSIgKyByZXBDb3VudCwgLy8gcmVwb3NpdG9yeQ0KLSAgICAgICAgICAgICAgICBNYXBDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9NiIgLy8gcmVsDQotICAgICAgICB9KTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkcyBhIGxpbmsuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUsIFN0cmluZyBsaW5rKSB7DQotICAgICAgICBpZiAoS05PV05fTElOS1MuY29udGFpbnMocmVsKSkgew0KLSAgICAgICAgICAgIGxpbmtDYWNoZS5wdXQobGluaywgcmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLlJFTF9BTFRFUk5BVEUuZXF1YWxzKHJlbCkpIHsNCi0gICAgICAgICAgICAvLyB1c2Ugc3RyZWFtSWQgaW5zdGVhZCBvZiB0eXBlIGFzIGRpc2NyaW1pbmF0aW5nIHBhcmFtZXRlcg0KLSAgICAgICAgICAgIFN0cmluZyBzdHJlYW1JZCA9IGV4dHJhY3RTdHJlYW1JZChsaW5rKTsNCi0gICAgICAgICAgICBpZiAoc3RyZWFtSWQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBsaW5rQ2FjaGUucHV0KGxpbmssIHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgc3RyZWFtSWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVHJpZXMgdG8gZXh0cmFjdCBhIHN0cmVhbUlkIGZyb20gYW4gYWx0ZXJuYXRlIGxpbmsuDQotICAgICAqLw0KLSAgICAvLyB0aGlzIGlzIG5vdCBzdHJpY3RseSBpbiB0aGUgc3BlYw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RTdHJlYW1JZChTdHJpbmcgbGluaykgew0KLSAgICAgICAgaW50IGkgPSBsaW5rLmxhc3RJbmRleE9mKCc/Jyk7DQotICAgICAgICBpZiAoaSA+IDApIHsNCi0gICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBsaW5rLnN1YnN0cmluZyhpICsgMSkuc3BsaXQoIiYiKTsNCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJhbSA6IHBhcmFtcykgew0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IHBhcmFtLnNwbGl0KCI9IiwgMik7DQotICAgICAgICAgICAgICAgIGlmIChwYXJ0c1swXS5lcXVhbHMoQ29uc3RhbnRzLlBBUkFNX1NUUkVBTV9JRCkgJiYgcGFydHMubGVuZ3RoID09IDIpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0c1sxXTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZW1vdmVzIGFsbCBsaW5rcyBvZiBhbiBvYmplY3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQpIHsNCi0gICAgICAgIGxpbmtDYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkLCBpZCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSBsaW5rLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUpIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBsaW5rQ2FjaGUuZ2V0KHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgdHlwZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSBsaW5rLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCkgew0KLSAgICAgICAgcmV0dXJuIGdldExpbmsocmVwb3NpdG9yeUlkLCBpZCwgcmVsLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2hlY2tzIGEgbGluay4NCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgY2hlY2tMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUpIHsNCi0gICAgICAgIHJldHVybiBsaW5rQ2FjaGUuY2hlY2socmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTG9ja3MgdGhlIGxpbmsgY2FjaGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBsb2NrTGlua3MoKSB7DQotICAgICAgICBsaW5rQ2FjaGUud3JpdGVMb2NrKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFVubG9ja3MgdGhlIGxpbmsgY2FjaGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB1bmxvY2tMaW5rcygpIHsNCi0gICAgICAgIGxpbmtDYWNoZS53cml0ZVVubG9jaygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgdHlwZSBsaW5rLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkVHlwZUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkLCBTdHJpbmcgcmVsLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGxpbmspIHsNCi0gICAgICAgIGlmIChLTk9XTl9MSU5LUy5jb250YWlucyhyZWwpKSB7DQotICAgICAgICAgICAgdHlwZUxpbmtDYWNoZS5wdXQobGluaywgcmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVtb3ZlcyBhbGwgbGlua3Mgb2YgYSB0eXBlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlVHlwZUxpbmtzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCkgew0KLSAgICAgICAgdHlwZUxpbmtDYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkLCBpZCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgYSB0eXBlIGxpbmsuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUpIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSB0eXBlTGlua0NhY2hlLmdldChyZXBvc2l0b3J5SWQsIGlkLCByZWwsIHR5cGUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBMb2NrcyB0aGUgdHlwZSBsaW5rIGNhY2hlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbG9ja1R5cGVMaW5rcygpIHsNCi0gICAgICAgIHR5cGVMaW5rQ2FjaGUud3JpdGVMb2NrKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFVubG9ja3MgdGhlIHR5cGUgbGluayBjYWNoZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHVubG9ja1R5cGVMaW5rcygpIHsNCi0gICAgICAgIHR5cGVMaW5rQ2FjaGUud3JpdGVVbmxvY2soKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkcyBhIGNvbGxlY3Rpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBjb2xsZWN0aW9uLCBTdHJpbmcgbGluaykgew0KLSAgICAgICAgY29sbGVjdGlvbkxpbmtDYWNoZS5wdXQobGluaywgcmVwb3NpdG9yeUlkLCBjb2xsZWN0aW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyBhIGNvbGxlY3Rpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGNvbGxlY3Rpb24pIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBjb2xsZWN0aW9uTGlua0NhY2hlLmdldChyZXBvc2l0b3J5SWQsIGNvbGxlY3Rpb24pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGFuIFVSSSB0ZW1wbGF0ZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGFkZFRlbXBsYXRlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlLCBTdHJpbmcgbGluaykgew0KLSAgICAgICAgdGVtcGxhdGVDYWNoZS5wdXQobGluaywgcmVwb3NpdG9yeUlkLCB0eXBlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyBhbiBVUkkgdGVtcGxhdGUgYW5kIHJlcGxhY2VzIHBsYWNlIGhvbGRlcnMgd2l0aCB0aGUgZ2l2ZW4NCi0gICAgICogcGFyYW1ldGVycy4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVtcGxhdGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMpIHsNCi0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IChTdHJpbmcpIHRlbXBsYXRlQ2FjaGUuZ2V0KHJlcG9zaXRvcnlJZCwgdHlwZSk7DQotICAgICAgICBpZiAodGVtcGxhdGUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBwYXJhbSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotDQotICAgICAgICBib29sZWFuIHBhcmFtTW9kZSA9IGZhbHNlOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZS5sZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICAgICAgY2hhciBjID0gdGVtcGxhdGUuY2hhckF0KGkpOw0KLQ0KLSAgICAgICAgICAgIGlmIChwYXJhbU1vZGUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ30nKSB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbU1vZGUgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gVXJsQnVpbGRlci5ub3JtYWxpemVQYXJhbWV0ZXIocGFyYW1ldGVycy5nZXQocGFyYW0udG9TdHJpbmcoKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtVmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoSU9VdGlscy5lbmNvZGVVUkwocGFyYW1WYWx1ZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uYXBwZW5kKGMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7DQotICAgICAgICAgICAgICAgICAgICBwYXJhbU1vZGUgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkcyBhIGNvbGxlY3Rpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5TGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcmVsLCBTdHJpbmcgbGluaykgew0KLSAgICAgICAgcmVwb3NpdG9yeUxpbmtDYWNoZS5wdXQobGluaywgcmVwb3NpdG9yeUlkLCByZWwpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIGEgY29sbGVjdGlvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHJlbCkgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHJlcG9zaXRvcnlMaW5rQ2FjaGUuZ2V0KHJlcG9zaXRvcnlJZCwgcmVsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVtb3ZlcyBhbGwgZW50cmllcyBvZiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBmcm9tIHRoZSBjYWNoZXMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjbGVhclJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCkgew0KLSAgICAgICAgbGlua0NhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOw0KLSAgICAgICAgdHlwZUxpbmtDYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgIGNvbGxlY3Rpb25MaW5rQ2FjaGUucmVtb3ZlKHJlcG9zaXRvcnlJZCk7DQotICAgICAgICB0ZW1wbGF0ZUNhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOw0KLSAgICAgICAgcmVwb3NpdG9yeUxpbmtDYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gIkxpbmsgQ2FjaGUgW2xpbmsgY2FjaGU9IiArIGxpbmtDYWNoZSArICIsIHR5cGUgbGluayBjYWNoZT0iICsgdHlwZUxpbmtDYWNoZQ0KLSAgICAgICAgICAgICAgICArICIsIGNvbGxlY3Rpb24gbGluayBjYWNoZT0iICsgY29sbGVjdGlvbkxpbmtDYWNoZSArICIsIHJlcG9zaXRvcnkgbGluayBjYWNoZT0iICsgcmVwb3NpdG9yeUxpbmtDYWNoZQ0KLSAgICAgICAgICAgICAgICArICIsICB0ZW1wbGF0ZSBjYWNoZT0iICsgdGVtcGxhdGVDYWNoZSArICJdIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL011bHRpRmlsaW5nU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyOGQxNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7DQotDQotLyoqDQotICogTXVsdGlGaWxpbmcgU2VydmljZSBBdG9tUHViIGNsaWVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2UgaW1wbGVtZW50cyBNdWx0aUZpbGluZ1NlcnZpY2Ugew0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqLw0KLSAgICBwdWJsaWMgTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7DQotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE9iamVjdFRvRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IGlkIG11c3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTF9WRVJTSU9OUywgYWxsVmVyc2lvbnMpOw0KLQ0KLSAgICAgICAgLy8gc2V0IHVwIG9iamVjdCBhbmQgd3JpdGVyDQotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZUlkT2JqZWN0KG9iamVjdElkKSwgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7DQotDQotICAgICAgICAvLyBwb3N0IGFkZE9iamVjdFRvRm9sZGVyIHJlcXVlc3QNCi0gICAgICAgIHBvc3QodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaWQgbXVzdCBiZSBzZXQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRDb2xsZWN0aW9uKHJlcG9zaXRvcnlJZCwgQ29uc3RhbnRzLkNPTExFQ1RJT05fVU5GSUxFRCk7DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHVuZmlsaW5nIG5vdCBzdXBwb3J0ZWQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVNT1ZFX0ZST00sIGZvbGRlcklkKTsNCi0NCi0gICAgICAgIC8vIHNldCB1cCBvYmplY3QgYW5kIHdyaXRlcg0KLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVJZE9iamVjdChvYmplY3RJZCksIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOw0KLQ0KLSAgICAgICAgLy8gcG9zdCByZW1vdmVPYmplY3RGcm9tRm9sZGVyIHJlcXVlc3QNCi0gICAgICAgIHBvc3QodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL05hdmlnYXRpb25TZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL05hdmlnYXRpb25TZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTVlMTU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9OYXZpZ2F0aW9uU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOw0KLQ0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21CYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVudHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRmVlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUxpbms7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckRhdGFJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdExpc3RJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0UGFyZW50RGF0YUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk5hdmlnYXRpb25TZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIE5hdmlnYXRpb24gU2VydmljZSBBdG9tUHViIGNsaWVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmF2aWdhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIE5hdmlnYXRpb25TZXJ2aWNlIHsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yLg0KLSAgICAgKi8NCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7DQotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckxpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwNCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwNCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbCgpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09SREVSX0JZLCBvcmRlckJ5KTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUEFUSF9TRUdNRU5ULCBpbmNsdWRlUGF0aFNlZ21lbnQpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCBza2lwQ291bnQpOw0KLQ0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7DQotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gaGFuZGxlIHRvcCBsZXZlbA0KLSAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZmVlZC5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNOZXh0TGluayhlbGVtZW50KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0ludChOQU1FX05VTV9JVEVNUywgZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKChCaWdJbnRlZ2VyKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuDQotICAgICAgICBpZiAoIWZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPihmZWVkLmdldEVudHJpZXMoKS5zaXplKCkpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7DQotICAgICAgICAgICAgICAgIE9iamVjdEluRm9sZGVyRGF0YUltcGwgY2hpbGQgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aFNlZ21lbnQgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2NrTGlua3MoKTsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0cihOQU1FX1BBVEhfU0VHTUVOVCwgZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFNlZ21lbnQgPSAoU3RyaW5nKSBlbGVtZW50LmdldE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBuZXcgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXRPYmplY3QoKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkLnNldFBhdGhTZWdtZW50KHBhdGhTZWdtZW50KTsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRPYmplY3RzKCkuYWRkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldERlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwNCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywNCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPigpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfREVTQ0VOREFOVFMpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfREVTQ0VOREFOVFMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BBVEhfU0VHTUVOVCwgaW5jbHVkZVBhdGhTZWdtZW50KTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIHByb2Nlc3MgdHJlZQ0KLSAgICAgICAgYWRkRGVzY2VuZGFudHNMZXZlbChyZXBvc2l0b3J5SWQsIGZlZWQsIHJlc3VsdCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldEZvbGRlclBhcmVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgT2JqZWN0RGF0YSByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX1VQLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsNCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9VUCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOw0KLQ0KLSAgICAgICAgLy8gcmVhZA0KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsNCi0NCi0gICAgICAgIEF0b21CYXNlIGJhc2UgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tQmFzZS5jbGFzcyk7DQotDQotICAgICAgICAvLyBnZXQgdGhlIGVudHJ5DQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBudWxsOw0KLSAgICAgICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBBdG9tRmVlZCkgew0KLSAgICAgICAgICAgIEF0b21GZWVkIGZlZWQgPSAoQXRvbUZlZWQpIGJhc2U7DQotICAgICAgICAgICAgaWYgKGZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlBhcmVudCBmZWVkIGlzIGVtcHR5ISIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbnRyeSA9IGZlZWQuZ2V0RW50cmllcygpLmdldCgwKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYmFzZSBpbnN0YW5jZW9mIEF0b21FbnRyeSkgew0KLSAgICAgICAgICAgIGVudHJ5ID0gKEF0b21FbnRyeSkgYmFzZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGRvY3VtZW50ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9ja0xpbmtzKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7DQotICAgICAgICAgICAgICAgICAgICBhZGRMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXRGb2xkZXJUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwNCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywNCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPigpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0ZPTERFUlRSRUUsIENvbnN0YW50cy5NRURJQVRZUEVfREVTQ0VOREFOVFMpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0ZPTERFUlRSRUUsIENvbnN0YW50cy5NRURJQVRZUEVfREVTQ0VOREFOVFMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BBVEhfU0VHTUVOVCwgaW5jbHVkZVBhdGhTZWdtZW50KTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIHByb2Nlc3MgdHJlZQ0KLSAgICAgICAgYWRkRGVzY2VuZGFudHNMZXZlbChyZXBvc2l0b3J5SWQsIGZlZWQsIHJlc3VsdCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLA0KLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLA0KLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFBhcmVudERhdGE+KCk7DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfVVAsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gcm9vdCBhbmQgdW5maWxlZCBvYmplY3RzIGhhdmUgbm8gVVAgbGluaw0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElWRV9QQVRIX1NFR01FTlQsIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50KTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLQ0KLSAgICAgICAgQXRvbUJhc2UgYmFzZSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21CYXNlLmNsYXNzKTsNCi0NCi0gICAgICAgIGlmIChiYXNlIGluc3RhbmNlb2YgQXRvbUZlZWQpIHsNCi0gICAgICAgICAgICAvLyBpdCdzIGEgZmVlZA0KLSAgICAgICAgICAgIEF0b21GZWVkIGZlZWQgPSAoQXRvbUZlZWQpIGJhc2U7DQotDQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBmZWVkDQotICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgew0KLSAgICAgICAgICAgICAgICBPYmplY3RQYXJlbnREYXRhSW1wbCBvYmplY3RQYXJlbnQgPSBwcm9jZXNzUGFyZW50RW50cnkoZW50cnksIHJlcG9zaXRvcnlJZCk7DQotDQotICAgICAgICAgICAgICAgIGlmIChvYmplY3RQYXJlbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChvYmplY3RQYXJlbnQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChiYXNlIGluc3RhbmNlb2YgQXRvbUVudHJ5KSB7DQotICAgICAgICAgICAgLy8gaXQncyBhbiBlbnRyeQ0KLSAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IChBdG9tRW50cnkpIGJhc2U7DQotDQotICAgICAgICAgICAgT2JqZWN0UGFyZW50RGF0YUltcGwgb2JqZWN0UGFyZW50ID0gcHJvY2Vzc1BhcmVudEVudHJ5KGVudHJ5LCByZXBvc2l0b3J5SWQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChvYmplY3RQYXJlbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG9iamVjdFBhcmVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE9iamVjdFBhcmVudERhdGFJbXBsIHByb2Nlc3NQYXJlbnRFbnRyeShBdG9tRW50cnkgZW50cnksIFN0cmluZyByZXBvc2l0b3J5SWQpIHsNCi0gICAgICAgIE9iamVjdFBhcmVudERhdGFJbXBsIHJlc3VsdCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoU2VnbWVudCA9IG51bGw7DQotDQotICAgICAgICBsb2NrTGlua3MoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2FjaGUNCi0gICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkNCi0gICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZExpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBPYmplY3REYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgT2JqZWN0UGFyZW50RGF0YUltcGwoKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKE5BTUVfUkVMQVRJVkVfUEFUSF9TRUdNRU5ULCBlbGVtZW50KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoU2VnbWVudCA9IChTdHJpbmcpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHQuc2V0UmVsYXRpdmVQYXRoU2VnbWVudChyZWxhdGl2ZVBhdGhTZWdtZW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0Q2hlY2tlZE91dERvY3MoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwNCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwNCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuQ09MTEVDVElPTl9DSEVDS0VET1VUKTsNCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkgb3IgY2hlY2tlZG91dCBjb2xsZWN0aW9uIG5vdCBzdXBwb3J0ZWQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRk9MREVSX0lELCBmb2xkZXJJZCk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9PUkRFUl9CWSwgb3JkZXJCeSk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgc2tpcENvdW50KTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIGhhbmRsZSB0b3AgbGV2ZWwNCi0gICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGZlZWQuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzTmV4dExpbmsoZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbnQoTkFNRV9OVU1fSVRFTVMsIGVsZW1lbnQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcygoQmlnSW50ZWdlcikgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gZ2V0IHRoZSBkb2N1bWVudHMNCi0gICAgICAgIGlmICghZmVlZC5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmVzdWx0LnNldE9iamVjdHMobmV3IEFycmF5TGlzdDxPYmplY3REYXRhPihmZWVkLmdldEVudHJpZXMoKS5zaXplKCkpKTsNCi0NCi0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7DQotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgY2hpbGQgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2NrTGlua3MoKTsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IChPYmplY3REYXRhKSBlbGVtZW50LmdldE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRPYmplY3RzKCkuYWRkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLSBpbnRlcm5hbCAtLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGRlc2NlbmRhbnRzIGxldmVsIHJlY3Vyc2l2ZWx5Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZERlc2NlbmRhbnRzTGV2ZWwoU3RyaW5nIHJlcG9zaXRvcnlJZCwgQXRvbUZlZWQgZmVlZCwgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gY29udGFpbmVyTGlzdCkgew0KLSAgICAgICAgaWYgKChmZWVkID09IG51bGwpIHx8IChmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBmZWVkDQotICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7DQotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCBvYmplY3RJbkZvbGRlciA9IG51bGw7DQotICAgICAgICAgICAgU3RyaW5nIHBhdGhTZWdtZW50ID0gbnVsbDsNCi0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBjaGlsZENvbnRhaW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPigpOw0KLQ0KLSAgICAgICAgICAgIGxvY2tMaW5rcygpOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgICAgIHJlbW92ZUxpbmtzKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSk7DQotDQotICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkNCi0gICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdEluRm9sZGVyID0gbmV3IE9iamVjdEluRm9sZGVyRGF0YUltcGwoKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpcyhOQU1FX1BBVEhfU0VHTUVOVCwgZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoU2VnbWVudCA9IChTdHJpbmcpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tRmVlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlc2NlbmRhbnRzTGV2ZWwocmVwb3NpdG9yeUlkLCAoQXRvbUZlZWQpIGVsZW1lbnQuZ2V0T2JqZWN0KCksIGNoaWxkQ29udGFpbmVyTGlzdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICB1bmxvY2tMaW5rcygpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAob2JqZWN0SW5Gb2xkZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBvYmplY3RJbkZvbGRlci5zZXRQYXRoU2VnbWVudChwYXRoU2VnbWVudCk7DQotICAgICAgICAgICAgICAgIE9iamVjdEluRm9sZGVyQ29udGFpbmVySW1wbCBjaGlsZENvbnRhaW5lciA9IG5ldyBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwob2JqZWN0SW5Gb2xkZXIpOw0KLSAgICAgICAgICAgICAgICBjaGlsZENvbnRhaW5lci5zZXRDaGlsZHJlbihjaGlsZENvbnRhaW5lckxpc3QpOw0KLSAgICAgICAgICAgICAgICBjb250YWluZXJMaXN0LmFkZChjaGlsZENvbnRhaW5lcik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9PYmplY3RTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL09iamVjdFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDRhODYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL09iamVjdFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tQWxsb3dhYmxlQWN0aW9uczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUZlZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21MaW5rOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5GYWlsZWRUb0RlbGV0ZURhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnN0cmFpbnRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5NaW1lSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuUmV0dXJuVmVyc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRmFpbGVkVG9EZWxldGVEYXRhSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBhcnRpYWxDb250ZW50U3RyZWFtSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5PYmplY3RTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIE9iamVjdCBTZXJ2aWNlIEF0b21QdWIgY2xpZW50Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2UgaW1wbGVtZW50cyBPYmplY3RTZXJ2aWNlIHsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yLg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdFNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsNCi0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwNCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsDQotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgY2hlY2tDcmVhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGZvbGRlcklkID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBDcmVhdGlvbiBvZiB1bmZpbGVkIG9iamVjdHMgdmlhIEF0b21QdWIgaXMgbm90IGRlZmluZWQgaW4gdGhlDQotICAgICAgICAgICAgLy8gQ01JUyAxLjAgc3BlY2lmaWNhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3cgdGhlIENNSVMgMS4xDQotICAgICAgICAgICAgLy8gZHJhZnQgYW5kIFBPU1RzIHRoZSBkb2N1bWVudCB0byB0aGUgVW5maWxlZCBjb2xsZWN0aW9uLg0KLQ0KLSAgICAgICAgICAgIGxpbmsgPSBsb2FkQ29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5DT0xMRUNUSU9OX1VORklMRUQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHVuZmlsaW5nIG5vdCBzdXBwb3J0ZWQhIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsNCi0NCi0gICAgICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9WRVJTSU9OSUdfU1RBVEUsIHZlcnNpb25pbmdTdGF0ZSk7DQotDQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyDQotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZU9iamVjdChwcm9wZXJ0aWVzLCBudWxsLCBwb2xpY2llcyksDQotICAgICAgICAgICAgICAgIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksIGNvbnRlbnRTdHJlYW0pOw0KLQ0KLSAgICAgICAgLy8gcG9zdCB0aGUgbmV3IGZvbGRlciBvYmplY3QNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlDQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gaGFuZGxlIEFDTCBtb2RpZmljYXRpb25zDQotICAgICAgICBoYW5kbGVBY2xNb2RpZmljYXRpb25zKHJlcG9zaXRvcnlJZCwgZW50cnksIGFkZEFjZXMsIHJlbW92ZUFjZXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldElkKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHNvdXJjZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsDQotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBQ0VzLCBBY2wgcmVtb3ZlQUNFcywNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQXRvbVB1YiBiaW5kaW5nISIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsDQotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIGNoZWNrQ3JlYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsNCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotDQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyDQotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZU9iamVjdChwcm9wZXJ0aWVzLCBudWxsLCBwb2xpY2llcyksDQotICAgICAgICAgICAgICAgIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOw0KLQ0KLSAgICAgICAgLy8gcG9zdCB0aGUgbmV3IGZvbGRlciBvYmplY3QNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlDQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gaGFuZGxlIEFDTCBtb2RpZmljYXRpb25zDQotICAgICAgICBoYW5kbGVBY2xNb2RpZmljYXRpb25zKHJlcG9zaXRvcnlJZCwgZW50cnksIGFkZEFjZXMsIHJlbW92ZUFjZXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldElkKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywNCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgY2hlY2tDcmVhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKGZvbGRlcklkID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBDcmVhdGlvbiBvZiB1bmZpbGVkIG9iamVjdHMgdmlhIEF0b21QdWIgaXMgbm90IGRlZmluZWQgaW4gdGhlDQotICAgICAgICAgICAgLy8gQ01JUyAxLjAgc3BlY2lmaWNhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3cgdGhlIENNSVMgMS4xDQotICAgICAgICAgICAgLy8gZHJhZnQgYW5kIFBPU1RzIHRoZSBwb2xpY3kgdG8gdGhlIFVuZmlsZWQgY29sbGVjdGlvbi4NCi0NCi0gICAgICAgICAgICBsaW5rID0gbG9hZENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuQ09MTEVDVElPTl9VTkZJTEVEKTsNCi0NCi0gICAgICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciB1bmZpbGluZyBub3Qgc3VwcG9ydGVkISIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7DQotDQotICAgICAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLQ0KLSAgICAgICAgLy8gc2V0IHVwIHdyaXRlcg0KLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVPYmplY3QocHJvcGVydGllcywgbnVsbCwgcG9saWNpZXMpLA0KLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpKTsNCi0NCi0gICAgICAgIC8vIHBvc3QgdGhlIG5ldyBmb2xkZXIgb2JqZWN0DQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIC8vIHBhcnNlIHRoZSByZXNwb25zZQ0KLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUVudHJ5LmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIGhhbmRsZSBBQ0wgbW9kaWZpY2F0aW9ucw0KLSAgICAgICAgaGFuZGxlQWNsTW9kaWZpY2F0aW9ucyhyZXBvc2l0b3J5SWQsIGVudHJ5LCBhZGRBY2VzLCByZW1vdmVBY2VzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeS5nZXRJZCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSXRlbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLA0KLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBjaGVja0NyZWF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IG51bGw7DQotDQotICAgICAgICBpZiAoZm9sZGVySWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGxpbmsgPSBsb2FkQ29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5DT0xMRUNUSU9OX1VORklMRUQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHVuZmlsaW5nIG5vdCBzdXBwb3J0ZWQhIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsNCi0NCi0gICAgICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotDQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyDQotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZU9iamVjdChwcm9wZXJ0aWVzLCBudWxsLCBwb2xpY2llcyksDQotICAgICAgICAgICAgICAgIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOw0KLQ0KLSAgICAgICAgLy8gcG9zdCB0aGUgbmV3IGZvbGRlciBvYmplY3QNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlDQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gaGFuZGxlIEFDTCBtb2RpZmljYXRpb25zDQotICAgICAgICBoYW5kbGVBY2xNb2RpZmljYXRpb25zKHJlcG9zaXRvcnlJZCwgZW50cnksIGFkZEFjZXMsIHJlbW92ZUFjZXMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldElkKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLA0KLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIGNoZWNrQ3JlYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgc291cmNlIGlkDQotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gc291cmNlSWRQcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQpOw0KLSAgICAgICAgaWYgKCEoc291cmNlSWRQcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlNvdXJjZSBJZCBpcyBub3Qgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUlkID0gKChQcm9wZXJ0eUlkKSBzb3VyY2VJZFByb3BlcnR5KS5nZXRGaXJzdFZhbHVlKCk7DQotICAgICAgICBpZiAoc291cmNlSWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgSWQgaXMgbm90IHNldCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBzb3VyY2VJZCwgQ29uc3RhbnRzLlJFTF9SRUxBVElPTlNISVBTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIHNvdXJjZUlkLCBDb25zdGFudHMuUkVMX1JFTEFUSU9OU0hJUFMsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLQ0KLSAgICAgICAgLy8gc2V0IHVwIHdyaXRlcg0KLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVPYmplY3QocHJvcGVydGllcywgbnVsbCwgcG9saWNpZXMpLA0KLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpKTsNCi0NCi0gICAgICAgIC8vIHBvc3QgdGhlIG5ldyBmb2xkZXIgb2JqZWN0DQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIC8vIHBhcnNlIHRoZSByZXNwb25zZQ0KLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUVudHJ5LmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIGhhbmRsZSBBQ0wgbW9kaWZpY2F0aW9ucw0KLSAgICAgICAgaGFuZGxlQWNsTW9kaWZpY2F0aW9ucyhyZXBvc2l0b3J5SWQsIGVudHJ5LCBhZGRBY2VzLCByZW1vdmVBY2VzKTsNCi0NCi0gICAgICAgIHJldHVybiBlbnRyeS5nZXRJZCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLA0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICAvLyB3ZSBuZWVkIGFuIG9iamVjdCBpZA0KLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaWQgbXVzdCBiZSBzZXQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsNCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZC5nZXRWYWx1ZSgpLCBDb25zdGFudHMuUkVMX1NFTEYsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy8gbm90IHJlcXVpcmVkIGJ5IHRoZSBDTUlTIHNwZWNpZmljYXRpb24NCi0gICAgICAgICAgICAvLyAtPiBrZWVwIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIE9wZW5DTUlTIHNlcnZlcnMNCi0gICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfVE9LRU4sIGNoYW5nZVRva2VuLmdldFZhbHVlKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gc2V0IHVwIHdyaXRlcg0KLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVPYmplY3QocHJvcGVydGllcywgY2hhbmdlVG9rZW4gPT0gbnVsbCA/IG51bGwNCi0gICAgICAgICAgICAgICAgOiBjaGFuZ2VUb2tlbi5nZXRWYWx1ZSgpLCBudWxsKSwgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7DQotDQotICAgICAgICAvLyB1cGRhdGUNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwdXQodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICAvLyBwYXJzZSBuZXcgZW50cnkNCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7DQotDQotICAgICAgICAvLyB3ZSBleHBlY3QgYSBDTUlTIGVudHJ5DQotICAgICAgICBpZiAoZW50cnkuZ2V0SWQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJSZWNlaXZlZCBBdG9tIGVudHJ5IGlzIG5vdCBhIENNSVMgZW50cnkhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBzZXQgb2JqZWN0IGlkDQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShlbnRyeS5nZXRJZCgpKTsNCi0NCi0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgY2hhbmdlVG9rZW4uc2V0VmFsdWUobnVsbCk7IC8vIGp1c3QgaW4gY2FzZQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9ja0xpbmtzKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7DQotICAgICAgICAgICAgICAgICAgICBhZGRMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBuZXcgY2hhbmdlIHRva2VuDQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlVG9rZW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY2hhbmdlVG9rZW5TdHIgPSBvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVRva2VuU3RyIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRva2VuLnNldFZhbHVlKCgoUHJvcGVydHlTdHJpbmcpIGNoYW5nZVRva2VuU3RyKS5nZXRGaXJzdFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICB1bmxvY2tMaW5rcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBidWxrVXBkYXRlUHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLA0KLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIFByb3BlcnRpZXMgcHJvcGVydGllcywNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYWRkU2Vjb25kYXJ5VHlwZUlkcywgTGlzdDxTdHJpbmc+IHJlbW92ZVNlY29uZGFyeVR5cGVJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgLy8gZmluZCBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRDb2xsZWN0aW9uKHJlcG9zaXRvcnlJZCwgQ29uc3RhbnRzLkNPTExFQ1RJT05fQlVMS19VUERBVEUpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciBidWxrIHVwZGF0ZSBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyDQotICAgICAgICBmaW5hbCBCdWxrVXBkYXRlSW1wbCBidWxrVXBkYXRlID0gbmV3IEJ1bGtVcGRhdGVJbXBsKCk7DQotICAgICAgICBidWxrVXBkYXRlLnNldE9iamVjdElkQW5kQ2hhbmdlVG9rZW4ob2JqZWN0SWRBbmRDaGFuZ2VUb2tlbik7DQotICAgICAgICBidWxrVXBkYXRlLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7DQotICAgICAgICBidWxrVXBkYXRlLnNldEFkZFNlY29uZGFyeVR5cGVJZHMoYWRkU2Vjb25kYXJ5VHlwZUlkcyk7DQotICAgICAgICBidWxrVXBkYXRlLnNldFJlbW92ZVNlY29uZGFyeVR5cGVJZHMocmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcyk7DQotDQotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGJ1bGtVcGRhdGUpOw0KLQ0KLSAgICAgICAgLy8gcG9zdCB0aGUgbmV3IGZvbGRlciBvYmplY3QNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KG5ldyBVcmxCdWlsZGVyKGxpbmspLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOw0KLSAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4oZmVlZA0KLSAgICAgICAgICAgICAgICAuZ2V0RW50cmllcygpLnNpemUoKSk7DQotDQotICAgICAgICAvLyBnZXQgdGhlIHJlc3VsdHMNCi0gICAgICAgIGlmICghZmVlZC5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7DQotDQotICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgew0KLSAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgbGlua3MgdGhpcyB0aW1lIGJlY2F1c2UgdGhleQ0KLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZWxvbmcgdG8gYSBuZXcgZG9jdW1lbnQgdmVyc2lvbg0KLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IChPYmplY3REYXRhKSBlbGVtZW50LmdldE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IG9iamVjdC5nZXRJZCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9IG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBjaGFuZ2VUb2tlblByb3AgPSBvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVRva2VuUHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUb2tlbiA9ICgoUHJvcGVydHlTdHJpbmcpIGNoYW5nZVRva2VuUHJvcCkuZ2V0Rmlyc3RWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbChpZCwgY2hhbmdlVG9rZW4pKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1NFTEYsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1NFTEYsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTF9WRVJTSU9OUywgYWxsVmVyc2lvbnMpOw0KLQ0KLSAgICAgICAgZGVsZXRlKHVybCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhaWxlZFRvRGVsZXRlRGF0YSBkZWxldGVUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywNCi0gICAgICAgICAgICBVbmZpbGVPYmplY3QgdW5maWxlT2JqZWN0cywgQm9vbGVhbiBjb250aW51ZU9uRmFpbHVyZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBkb3duIGxpbmtzDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgbnVsbCk7DQotICAgICAgICBTdHJpbmcgY2hpbGRyZW5MaW5rID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBmb3VuZCBvbmx5IGEgY2hpbGRyZW4gbGluaywgYnV0IG5vIGRlc2NlbmRhbnRzIGxpbmsNCi0gICAgICAgICAgICAvLyAtPiB0cnkgZm9sZGVyIHRyZWUgbGluaw0KLSAgICAgICAgICAgIGNoaWxkcmVuTGluayA9IGxpbms7DQotICAgICAgICAgICAgbGluayA9IG51bGw7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIGZvdW5kIG5vIG9yIHR3byBkb3duIGxpbmtzDQotICAgICAgICAgICAgLy8gLT4gZ2V0IG9ubHkgdGhlIGRlc2NlbmRhbnRzIGxpbmsNCi0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFLCBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGxpbmsgPSBjaGlsZHJlbkxpbms7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMX1ZFUlNJT05TLCBhbGxWZXJzaW9ucyk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9VTkZJTEVfT0JKRUNUUywgdW5maWxlT2JqZWN0cyk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DT05USU5VRV9PTl9GQUlMVVJFLCBjb250aW51ZU9uRmFpbHVyZSk7DQotDQotICAgICAgICAvLyBtYWtlIHRoZSBjYWxsDQotICAgICAgICBSZXNwb25zZSByZXNwID0gZ2V0SHR0cEludm9rZXIoKS5pbnZva2VERUxFVEUodXJsLCBnZXRTZXNzaW9uKCkpOw0KLQ0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZQ0KLSAgICAgICAgaWYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gMjAwIHx8IHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gMjAyIHx8IHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gMjA0KSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWlsZWRUb0RlbGV0ZURhdGFJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHJldHVybmVkIGFuIGludGVybmFsIHNlcnZlciBlcnJvciwgZ2V0IHRoZSByZW1haW5pbmcNCi0gICAgICAgIC8vIGNoaWxkcmVuIG9mIHRoZSBmb2xkZXIuIFdlIG9ubHkgcmV0cmlldmUgdGhlIGZpcnN0IGxldmVsLCBzaW5jZQ0KLSAgICAgICAgLy8gZ2V0RGVzY2VuZGFudHMoKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCByZXBvc2l0b3JpZXMuDQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSA9PSA1MDApIHsNCi0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsNCi0NCi0gICAgICAgICAgICBpZiAobGluayAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHdhbnQgdGhlIG9iamVjdCBpZHMNCi0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCAiY21pczpvYmplY3RJZCIpOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgZmFsc2UpOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FKTsNCi0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgImNtaXM6bm9uZSIpOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQsIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgLy8gMTAwMCBjaGlsZHJlbiBzaG91bGQgYmUgZW5vdWdoIHRvIGluZGljYXRlIGEgcHJvYmxlbQ0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMsIDEwMDApOw0KLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCAwKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UNCi0gICAgICAgICAgICAgICAgcmVzcCA9IHJlYWQodXJsKTsNCi0gICAgICAgICAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gcHJlcGFyZSByZXN1bHQNCi0gICAgICAgICAgICAgICAgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCByZXN1bHQgPSBuZXcgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCgpOw0KLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRJZHMoaWRzKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjaGlsZHJlbiBpZHMNCi0gICAgICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWRzLmFkZChlbnRyeS5nZXRJZCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRocm93IGNvbnZlcnRTdGF0dXNDb2RlKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCksIHJlc3AuZ2V0UmVzcG9uc2VNZXNzYWdlKCksIHJlc3AuZ2V0RXJyb3JDb250ZW50KCksIG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9BTExPV0FCTEVBQ1RJT05TLA0KLSAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0FMTE9XQUJMRUFDVElPTik7DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfQUxMT1dBQkxFQUNUSU9OUywNCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5NRURJQVRZUEVfQUxMT1dBQkxFQUNUSU9OKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotDQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQ0KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsNCi0gICAgICAgIEF0b21BbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tQWxsb3dhYmxlQWN0aW9ucy5jbGFzcyk7DQotDQotICAgICAgICByZXR1cm4gYWxsb3dhYmxlQWN0aW9ucy5nZXRBbGxvd2FibGVBY3Rpb25zKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwgQmlnSW50ZWdlciBvZmZzZXQsDQotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBudWxsOw0KLSAgICAgICAgaWYgKHN0cmVhbUlkICE9IG51bGwpIHsNCi0gICAgICAgICAgICAvLyB1c2UgdGhlIGFsdGVybmF0ZSBsaW5rIHBlciBzcGVjDQotICAgICAgICAgICAgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfQUxURVJOQVRFLCBzdHJlYW1JZCk7DQotICAgICAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBzdHJlYW1JZCA9IG51bGw7IC8vIHdlIGhhdmUgYSBmdWxsIFVSTCBub3cNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIEF0b21QdWJQYXJzZXIuTElOS19SRUxfQ09OVEVOVCwgbnVsbCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJObyBjb250ZW50IHN0cmVhbSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIC8vIHVzaW5nIHRoZSBjb250ZW50IFVSTCBhbmQgYWRkaW5nIGEgc3RyZWFtSWQgcGFyYW0NCi0gICAgICAgIC8vIGlzIG5vdCBzcGVjLWNvbXBsaWFudA0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1RSRUFNX0lELCBzdHJlYW1JZCk7DQotDQotICAgICAgICAvLyBnZXQgdGhlIGNvbnRlbnQNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBnZXRIdHRwSW52b2tlcigpLmludm9rZUdFVCh1cmwsIGdldFNlc3Npb24oKSwgb2Zmc2V0LCBsZW5ndGgpOw0KLQ0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZQ0KLSAgICAgICAgaWYgKChyZXNwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMCkgJiYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA2KSkgew0KLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRTdGF0dXNDb2RlKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCksIHJlc3AuZ2V0UmVzcG9uc2VNZXNzYWdlKCksIHJlc3AuZ2V0RXJyb3JDb250ZW50KCksIG51bGwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQ29udGVudFN0cmVhbUltcGwgcmVzdWx0Ow0KLSAgICAgICAgaWYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gMjA2KSB7DQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnRpYWxDb250ZW50U3RyZWFtSW1wbCgpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ29udGVudFN0cmVhbUltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcC5nZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iKTsNCi0gICAgICAgIGlmIChjb250ZW50RGlzcG9zaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZpbGVuYW1lID0gTWltZUhlbHBlci5kZWNvZGVDb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZShjb250ZW50RGlzcG9zaXRpb24pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzdWx0LnNldEZpbGVOYW1lKGZpbGVuYW1lKTsNCi0gICAgICAgIHJlc3VsdC5zZXRMZW5ndGgocmVzcC5nZXRDb250ZW50TGVuZ3RoKCkpOw0KLSAgICAgICAgcmVzdWx0LnNldE1pbWVUeXBlKHJlc3AuZ2V0Q29udGVudFR5cGVIZWFkZXIoKSk7DQotICAgICAgICByZXN1bHQuc2V0U3RyZWFtKHJlc3AuZ2V0U3RyZWFtKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLA0KLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsDQotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQUNMLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBvYmplY3RJZCwgUmV0dXJuVmVyc2lvbi5USElTLCBmaWx0ZXIsDQotICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQUNMLCBleHRlbnNpb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdEJ5UGF0aChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywNCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLA0KLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFDTCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SW50ZXJuYWwocmVwb3NpdG9yeUlkLCBJZGVudGlmaWVyVHlwZS5QQVRILCBwYXRoLCBSZXR1cm5WZXJzaW9uLlRISVMsIGZpbHRlciwNCi0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBQ0wsIGV4dGVuc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBvYmplY3RJZCwgUmV0dXJuVmVyc2lvbi5USElTLCBmaWx0ZXIsDQotICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsICJjbWlzOm5vbmUiLCBCb29sZWFuLkZBTFNFLCBCb29sZWFuLkZBTFNFLCBleHRlbnNpb24pOw0KLQ0KLSAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRQcm9wZXJ0aWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsDQotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBvYmplY3RJZCwgUmV0dXJuVmVyc2lvbi5USElTLA0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIEJvb2xlYW4uRkFMU0UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbi5GQUxTRSwNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSwgZXh0ZW5zaW9uKTsNCi0NCi0gICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVzdWx0ID0gb2JqZWN0LmdldFJlbmRpdGlvbnMoKTsNCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBTdHJpbmcgdGFyZ2V0Rm9sZGVySWQsIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IGlkIG11c3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCh0YXJnZXRGb2xkZXJJZCA9PSBudWxsKSB8fCAodGFyZ2V0Rm9sZGVySWQubGVuZ3RoKCkgPT0gMCkgfHwgKHNvdXJjZUZvbGRlcklkID09IG51bGwpDQotICAgICAgICAgICAgICAgIHx8IChzb3VyY2VGb2xkZXJJZC5sZW5ndGgoKSA9PSAwKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgYW5kIHRhcmdldCBmb2xkZXIgbXVzdCBiZSBzZXQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgdGFyZ2V0Rm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgdGFyZ2V0Rm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU09VUkNFX0ZPTERFUl9JRCwgc291cmNlRm9sZGVySWQpOw0KLQ0KLSAgICAgICAgLy8gc2V0IHVwIG9iamVjdCBhbmQgd3JpdGVyDQotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZUlkT2JqZWN0KG9iamVjdElkLmdldFZhbHVlKCkpLA0KLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpKTsNCi0NCi0gICAgICAgIC8vIHBvc3QgbW92ZSByZXF1ZXN0DQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIC8vIHBhcnNlIHRoZSByZXNwb25zZQ0KLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUVudHJ5LmNsYXNzKTsNCi0NCi0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKGVudHJ5LmdldElkKCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIHNldE9yQXBwZW5kQ29udGVudChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvdmVyd3JpdGVGbGFnLCBjaGFuZ2VUb2tlbiwgY29udGVudFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIGV4dGVuc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICAvLyB3ZSBuZWVkIGFuIG9iamVjdCBpZA0KLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgSUQgbXVzdCBiZSBzZXQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlJFTF9FRElUTUVESUEsIG51bGwpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfRURJVE1FRElBLCBudWxsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotICAgICAgICBpZiAoY2hhbmdlVG9rZW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0NIQU5HRV9UT0tFTiwgY2hhbmdlVG9rZW4uZ2V0VmFsdWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBkZWxldGUodXJsKTsNCi0NCi0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKG51bGwpOw0KLSAgICAgICAgaWYgKGNoYW5nZVRva2VuICE9IG51bGwpIHsNCi0gICAgICAgICAgICBjaGFuZ2VUb2tlbi5zZXRWYWx1ZShudWxsKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwNCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmssIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgc2V0T3JBcHBlbmRDb250ZW50KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG51bGwsIGNoYW5nZVRva2VuLCBjb250ZW50U3RyZWFtLCBpc0xhc3RDaHVuaywgdHJ1ZSwgZXh0ZW5zaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tIGludGVybmFsIC0tLS0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NyZWF0ZVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7DQotICAgICAgICBpZiAoKHByb3BlcnRpZXMgPT0gbnVsbCkgfHwgKHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpID09IG51bGwpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnRpZXMgbXVzdCBiZSBzZXQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoIXByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQgKyAiIG11c3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLk9CSkVDVF9JRCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgIiArIFByb3BlcnR5SWRzLk9CSkVDVF9JRCArICIgbXVzdCBub3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBIYW5kbGVzIEFDTCBtb2RpZmljYXRpb25zIG9mIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cy4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBY2xNb2RpZmljYXRpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIEF0b21FbnRyeSBlbnRyeSwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzKSB7DQotICAgICAgICBpZiAoIWlzQWNsTWVyZ2VSZXF1aXJlZChhZGRBY2VzLCByZW1vdmVBY2VzKSkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEFjbCBvcmlnaW5hbEFjZXMgPSBnZXRBY2xJbnRlcm5hbChyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIEJvb2xlYW4uRkFMU0UsIG51bGwpOw0KLQ0KLSAgICAgICAgaWYgKG9yaWdpbmFsQWNlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy8gbWVyZ2UgYW5kIHVwZGF0ZSBBQ0wNCi0gICAgICAgICAgICBBY2wgbmV3QUNMID0gbWVyZ2VBY2xzKG9yaWdpbmFsQWNlcywgYWRkQWNlcywgcmVtb3ZlQWNlcyk7DQotICAgICAgICAgICAgaWYgKG5ld0FDTCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHVwZGF0ZUFjbChyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIG5ld0FDTCwgbnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIG9yIGFwcGVuZHMgY29udGVudC4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBzZXRPckFwcGVuZENvbnRlbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIGlzTGFzdENodW5rLCBib29sZWFuIGFwcGVuZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIC8vIHdlIG5lZWQgYW4gb2JqZWN0IGlkDQotICAgICAgICBpZiAoKG9iamVjdElkID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpID09IG51bGwpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJRCBtdXN0IGJlIHNldCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHdlIG5lZWQgY29udGVudA0KLSAgICAgICAgaWYgKChjb250ZW50U3RyZWFtID09IG51bGwpIHx8IChjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpID09IG51bGwpIHx8IChjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkgPT0gbnVsbCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ29udGVudCBtdXN0IGJlIHNldCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZC5nZXRWYWx1ZSgpLCBDb25zdGFudHMuUkVMX0VESVRNRURJQSwgbnVsbCk7DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlJFTF9FRElUTUVESUEsIG51bGwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQ0hBTkdFX1RPS0VOLCBjaGFuZ2VUb2tlbi5nZXRWYWx1ZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChhcHBlbmQpIHsNCi0gICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BUFBFTkQsIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fSVNfTEFTVF9DSFVOSywgaXNMYXN0Q2h1bmspOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9PVkVSV1JJVEVfRkxBRywgb3ZlcndyaXRlRmxhZyk7DQotICAgICAgICB9DQotDQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpOw0KLQ0KLSAgICAgICAgLy8gQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIgZm9yIHRoZSBmaWxlbmFtZQ0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbnVsbDsNCi0gICAgICAgIGlmIChjb250ZW50U3RyZWFtLmdldEZpbGVOYW1lKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGhlYWRlcnMgPSBDb2xsZWN0aW9ucw0KLSAgICAgICAgICAgICAgICAgICAgLnNpbmdsZXRvbk1hcCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWltZUhlbHBlci5DT05URU5UX0RJU1BPU0lUSU9OLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW1lSGVscGVyLmVuY29kZUNvbnRlbnREaXNwb3NpdGlvbihNaW1lSGVscGVyLkRJU1BPU0lUSU9OX0FUVEFDSE1FTlQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBzZW5kIGNvbnRlbnQNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwdXQodXJsLCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCksIGhlYWRlcnMsIG5ldyBPdXRwdXQoKSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHN0cmVhbSwgb3V0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIC8vIGNoZWNrIHJlc3BvbnNlIGNvZGUgZnVydGhlcg0KLSAgICAgICAgaWYgKChyZXNwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMCkgJiYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgIT0gMjAxKSAmJiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDQpKSB7DQotICAgICAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7DQotICAgICAgICB9DQotDQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShudWxsKTsNCi0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgY2hhbmdlVG9rZW4uc2V0VmFsdWUobnVsbCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1BvbGljeVNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvUG9saWN5U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjNmI2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvUG9saWN5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21GZWVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tTGluazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLk91dHB1dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlBvbGljeVNlcnZpY2U7DQotDQotLyoqDQotICogUG9saWN5IFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuDQotICovDQotcHVibGljIGNsYXNzIFBvbGljeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIFBvbGljeVNlcnZpY2Ugew0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUG9saWN5U2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgew0KLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfUE9MSUNJRVMsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfUE9MSUNJRVMsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLQ0KLSAgICAgICAgLy8gc2V0IHVwIG9iamVjdCBhbmQgd3JpdGVyDQotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZUlkT2JqZWN0KG9iamVjdElkKSwgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7DQotDQotICAgICAgICAvLyBwb3N0IGFwcGx5UG9saWN5IHJlcXVlc3QNCi0gICAgICAgIHBvc3QodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QXBwbGllZFBvbGljaWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3REYXRhPigpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIGdldCB0aGUgcG9saWNpZXMNCi0gICAgICAgIGlmICghZmVlZC5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgew0KLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIHBvbGljeSA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkNCi0gICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBPYmplY3REYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHBvbGljeSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICAvLyB3ZSBuZWVkIGEgcG9saWN5IGlkDQotICAgICAgICBpZiAocG9saWN5SWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQb2xpY3kgaWQgbXVzdCBiZSBzZXQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfUE9MSUNJRVMsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfUE9MSUNJRVMsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpOw0KLQ0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7DQotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgcG9saWN5DQotICAgICAgICBTdHJpbmcgcG9saWN5TGluayA9IG51bGw7DQotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7DQotDQotICAgICAgICBpZiAoIWZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsNCi0gICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQXRvbUxpbmsgYXRvbUxpbmsgPSAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5SRUxfU0VMRi5lcXVhbHMoYXRvbUxpbmsuZ2V0UmVsKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeUxpbmsgPSBhdG9tTGluay5nZXRIcmVmKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9ICgoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKSkuZ2V0SWQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5SWQuZXF1YWxzKGlkKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgew0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBpZiBmb3VuZCwgZGVsZXRlIGl0DQotICAgICAgICBpZiAoZm91bmQgJiYgKHBvbGljeUxpbmsgIT0gbnVsbCkpIHsNCi0gICAgICAgICAgICBkZWxldGUobmV3IFVybEJ1aWxkZXIocG9saWN5TGluaykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9SZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlbGF0aW9uc2hpcFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZGVlM2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlbGF0aW9uc2hpcFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsNCi0NCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21GZWVkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tTGluazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5SZWxhdGlvbnNoaXBEaXJlY3Rpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0TGlzdEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7DQotDQotLyoqDQotICogUmVsYXRpb25zaGlwIFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuDQotICovDQotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIFJlbGF0aW9uc2hpcFNlcnZpY2Ugew0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqLw0KLSAgICBwdWJsaWMgUmVsYXRpb25zaGlwU2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgew0KLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRPYmplY3RSZWxhdGlvbnNoaXBzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsDQotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywNCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9SRUxBVElPTlNISVBTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1JFTEFUSU9OU0hJUFMsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1VCX1JFTEFUSU9OU0hJUF9UWVBFUywgaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUF9ESVJFQ1RJT04sIHJlbGF0aW9uc2hpcERpcmVjdGlvbik7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9UWVBFX0lELCB0eXBlSWQpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgc2tpcENvdW50KTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIGhhbmRsZSB0b3AgbGV2ZWwNCi0gICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGZlZWQuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzTmV4dExpbmsoZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbnQoTkFNRV9OVU1fSVRFTVMsIGVsZW1lbnQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcygoQmlnSW50ZWdlcikgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gZ2V0IHRoZSBjaGlsZHJlbg0KLSAgICAgICAgaWYgKCFmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICByZXN1bHQuc2V0T2JqZWN0cyhuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KGZlZWQuZ2V0RW50cmllcygpLnNpemUoKSkpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsNCi0gICAgICAgICAgICAgICAgT2JqZWN0RGF0YSByZWxhdGlvbnNoaXAgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2NrTGlua3MoKTsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXAgPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICB1bmxvY2tMaW5rcygpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQocmVsYXRpb25zaGlwKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhiNWZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9SZXBvc2l0b3J5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUZlZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21MaW5rOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlRGVmaW5pdGlvbkxpc3RJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsNCi0NCi0vKioNCi0gKiBSZXBvc2l0b3J5IFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuDQotICovDQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2UgaW1wbGVtZW50cyBSZXBvc2l0b3J5U2VydmljZSB7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvci4NCi0gICAgICovDQotICAgIHB1YmxpYyBSZXBvc2l0b3J5U2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgew0KLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcmllc0ludGVybmFsKG51bGwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHJlcG9zaXRvcnlJbmZvcyA9IGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7DQotDQotICAgICAgICBpZiAocmVwb3NpdG9yeUluZm9zLnNpemUoKSA9PSAwKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiUmVwb3NpdG9yeSAnIiArIHJlcG9zaXRvcnlJZCArICInbm90IGZvdW5kISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmZvcy5zaXplKCkgPT0gMSkgew0KLSAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5SW5mb3MuZ2V0KDApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgcmVwb3NpdG9yeQ0KLSAgICAgICAgZm9yIChSZXBvc2l0b3J5SW5mbyBpbmZvIDogcmVwb3NpdG9yeUluZm9zKSB7DQotICAgICAgICAgICAgaWYgKGluZm8uZ2V0SWQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoaW5mby5nZXRJZCgpLmVxdWFscyhyZXBvc2l0b3J5SWQpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlJlcG9zaXRvcnkgJyIgKyByZXBvc2l0b3J5SWQgKyAiJ25vdCBmb3VuZCEiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICByZXR1cm4gZ2V0VHlwZURlZmluaXRpb25JbnRlcm5hbChyZXBvc2l0b3J5SWQsIHR5cGVJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywNCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsIHJlc3VsdCA9IG5ldyBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsKCk7DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IG51bGw7DQotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsNCi0gICAgICAgICAgICBsaW5rID0gbG9hZENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFUyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGxpbmsgPSBsb2FkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCB0eXBlSWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHR5cGUhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUFJPUEVSVFlfREVGSU5JVElPTlMsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgc2tpcENvdW50KTsNCi0NCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOw0KLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIGhhbmRsZSB0b3AgbGV2ZWwNCi0gICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGZlZWQuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzTmV4dExpbmsoZWxlbWVudCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbnQoTkFNRV9OVU1fSVRFTVMsIGVsZW1lbnQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcygoQmlnSW50ZWdlcikgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzdWx0LnNldExpc3QobmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbj4oZmVlZC5nZXRFbnRyaWVzKCkuc2l6ZSgpKSk7DQotDQotICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuDQotICAgICAgICBpZiAoIWZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsNCi0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gY2hpbGQgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2NrVHlwZUxpbmtzKCk7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgVHlwZURlZmluaXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSAoVHlwZURlZmluaXRpb24pIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICAgICAgdW5sb2NrVHlwZUxpbmtzKCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRMaXN0KCkuYWRkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLA0KLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4oKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbnVsbDsNCi0gICAgICAgIGlmICh0eXBlSWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGxpbmsgPSBsb2FkUmVwb3NpdG9yeUxpbmsocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuUkVQX1JFTF9UWVBFREVTQyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGxpbmsgPSBsb2FkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCB0eXBlSWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHR5cGUhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOw0KLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREVQVEgsIGRlcHRoKTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BST1BFUlRZX0RFRklOSVRJT05TLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyk7DQotDQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQ0KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsNCi0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7DQotDQotICAgICAgICAvLyBwcm9jZXNzIHRyZWUNCi0gICAgICAgIGFkZFR5cGVEZXNjZW5kYW50c0xldmVsKHJlcG9zaXRvcnlJZCwgZmVlZCwgcmVzdWx0KTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZHMgdHlwZSBkZXNjZW5kYW50cyBsZXZlbCByZWN1cnNpdmVseS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBhZGRUeXBlRGVzY2VuZGFudHNMZXZlbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBBdG9tRmVlZCBmZWVkLCBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBjb250YWluZXJMaXN0KSB7DQotICAgICAgICBpZiAoKGZlZWQgPT0gbnVsbCkgfHwgKGZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGZlZWQNCi0gICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsNCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgY2hpbGRDb250YWluZXIgPSBudWxsOw0KLSAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGNoaWxkQ29udGFpbmVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+KCk7DQotDQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQ0KLSAgICAgICAgICAgIGxvY2tUeXBlTGlua3MoKTsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgVHlwZURlZmluaXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZENvbnRhaW5lciA9IG5ldyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwoKFR5cGVEZWZpbml0aW9uKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21GZWVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZURlc2NlbmRhbnRzTGV2ZWwocmVwb3NpdG9yeUlkLCAoQXRvbUZlZWQpIGVsZW1lbnQuZ2V0T2JqZWN0KCksIGNoaWxkQ29udGFpbmVyTGlzdCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICB1bmxvY2tUeXBlTGlua3MoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGNoaWxkQ29udGFpbmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgY2hpbGRDb250YWluZXIuc2V0Q2hpbGRyZW4oY2hpbGRDb250YWluZXJMaXN0KTsNCi0gICAgICAgICAgICAgICAgY29udGFpbmVyTGlzdC5hZGQoY2hpbGRDb250YWluZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gY3JlYXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBkZWZpbml0aW9uIG11c3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHBhcmVudElkID0gdHlwZS5nZXRQYXJlbnRUeXBlSWQoKTsNCi0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgZGVmaW5pdGlvbiBoYXMgbm8gcGFyZW50IHR5cGUgaWQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRUeXBlTGluayhyZXBvc2l0b3J5SWQsIHBhcmVudElkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciBwYXJlbnQgdHlwZSEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHNldCB1cCB3cml0ZXINCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIodHlwZSwgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7DQotDQotICAgICAgICAvLyBwb3N0IHRoZSBuZXcgdHlwZSBkZWZpbml0aW9uDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdChuZXcgVXJsQnVpbGRlcihsaW5rKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlDQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gd2UgZXhwZWN0IGEgQ01JUyBlbnRyeQ0KLSAgICAgICAgaWYgKGVudHJ5LmdldElkKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiUmVjZWl2ZWQgQXRvbSBlbnRyeSBpcyBub3QgYSBDTUlTIGVudHJ5ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbG9ja1R5cGVMaW5rcygpOw0KLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2FjaGUNCi0gICAgICAgICAgICByZW1vdmVUeXBlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7DQotICAgICAgICAgICAgICAgICAgICBhZGRUeXBlTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFR5cGVEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoVHlwZURlZmluaXRpb24pIGVsZW1lbnQuZ2V0T2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIHVubG9ja1R5cGVMaW5rcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBkZWZpbml0aW9uIG11c3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHR5cGVJZCA9IHR5cGUuZ2V0SWQoKTsNCi0gICAgICAgIGlmICh0eXBlSWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGRlZmluaXRpb24gaGFzIG5vIHR5cGUgaWQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rDQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9JRCwgdHlwZUlkKTsNCi0NCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZFRlbXBsYXRlTGluayhyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5URU1QTEFURV9UWVBFX0JZX0lELCBwYXJhbWV0ZXJzKTsNCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkgb3IgdHlwZSEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHNldCB1cCB3cml0ZXINCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIodHlwZSwgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7DQotDQotICAgICAgICAvLyBwb3N0IHRoZSBuZXcgdHlwZSBkZWZpbml0aW9uDQotICAgICAgICBSZXNwb25zZSByZXNwID0gcHV0KG5ldyBVcmxCdWlsZGVyKGxpbmspLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICAvLyBwYXJzZSB0aGUgcmVzcG9uc2UNCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7DQotDQotICAgICAgICAvLyB3ZSBleHBlY3QgYSBDTUlTIGVudHJ5DQotICAgICAgICBpZiAoZW50cnkuZ2V0SWQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJSZWNlaXZlZCBBdG9tIGVudHJ5IGlzIG5vdCBhIENNSVMgZW50cnkhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBsb2NrVHlwZUxpbmtzKCk7DQotICAgICAgICBUeXBlRGVmaW5pdGlvbiByZXN1bHQgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQ0KLSAgICAgICAgICAgIHJlbW92ZVR5cGVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkNCi0gICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgVHlwZURlZmluaXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChUeXBlRGVmaW5pdGlvbikgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgdW5sb2NrVHlwZUxpbmtzKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9JRCwgdHlwZUlkKTsNCi0NCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZFRlbXBsYXRlTGluayhyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5URU1QTEFURV9UWVBFX0JZX0lELCBwYXJhbWV0ZXJzKTsNCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBkZWxldGUobmV3IFVybEJ1aWxkZXIobGluaykpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9TcGlTZXNzaW9uUGFyYW1ldGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvU3BpU2Vzc2lvblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjEyZjUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9TcGlTZXNzaW9uUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOw0KLQ0KLS8qKg0KLSAqIEludGVybmFsIHNlc3Npb24gcGFyYW1ldGVycy4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgU3BpU2Vzc2lvblBhcmFtZXRlciB7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQ0FDSEUgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLmxpbmtjYWNoZSI7DQotDQotICAgIHByaXZhdGUgU3BpU2Vzc2lvblBhcmFtZXRlcigpIHsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzc0MWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1ZlcnNpb25pbmdTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUZlZWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21MaW5rOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlJldHVyblZlcnNpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbExpc3RJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlZlcnNpb25pbmdTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIFZlcnNpb25pbmcgU2VydmljZSBBdG9tUHViIGNsaWVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgVmVyc2lvbmluZ1NlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIFZlcnNpb25pbmdTZXJ2aWNlIHsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7DQotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sDQotICAgICAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQpIHsNCi0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IGlkIG11c3QgYmUgc2V0ISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluaw0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkQ29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5DT0xMRUNUSU9OX0NIRUNLRURPVVQpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciBjaGVja2Vkb3V0IGNvbGxlY3Rpb24gbm90IHN1cHBvcnRlZCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotDQotICAgICAgICAvLyBzZXQgdXAgb2JqZWN0IGFuZCB3cml0ZXINCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoY3JlYXRlSWRPYmplY3Qob2JqZWN0SWQuZ2V0VmFsdWUoKSksDQotICAgICAgICAgICAgICAgIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOw0KLQ0KLSAgICAgICAgLy8gcG9zdCBtb3ZlIHJlcXVlc3QNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsNCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlDQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUoZW50cnkuZ2V0SWQoKSk7DQotDQotICAgICAgICBsb2NrTGlua3MoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2FjaGUNCi0gICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkNCi0gICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZExpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICB1bmxvY2tMaW5rcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGNvbnRlbnRDb3BpZWQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGNvbnRlbnRDb3BpZWQuc2V0VmFsdWUobnVsbCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsNCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHByZWZlciB3b3JraW5nIGNvcHkgbGluayBpZiBhdmFpbGFibGUNCi0gICAgICAgIC8vICh3b3JrYXJvdW5kIGZvciBub24tY29tcGxpYW50IHJlcG9zaXRvcmllcykNCi0gICAgICAgIFN0cmluZyB3Y0xpbmsgPSBnZXRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfV09SS0lOR0NPUFksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOw0KLSAgICAgICAgaWYgKHdjTGluayAhPSBudWxsKSB7DQotICAgICAgICAgICAgbGluayA9IHdjTGluazsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRlbGV0ZShuZXcgVXJsQnVpbGRlcihsaW5rKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2hlY2tJbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBtYWpvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLA0KLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoZWNraW5Db21tZW50LCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIC8vIHdlIG5lZWQgYW4gb2JqZWN0IGlkDQotICAgICAgICBpZiAoKG9iamVjdElkID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBpZCBtdXN0IGJlIHNldCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZC5nZXRWYWx1ZSgpLCBDb25zdGFudHMuUkVMX1NFTEYsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOw0KLQ0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfU0VMRiwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBwcmVmZXIgd29ya2luZyBjb3B5IGxpbmsgaWYgYXZhaWxhYmxlDQotICAgICAgICAvLyAod29ya2Fyb3VuZCBmb3Igbm9uLWNvbXBsaWFudCByZXBvc2l0b3JpZXMpDQotICAgICAgICBTdHJpbmcgd2NMaW5rID0gZ2V0TGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfV09SS0lOR0NPUFksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOw0KLSAgICAgICAgaWYgKHdjTGluayAhPSBudWxsKSB7DQotICAgICAgICAgICAgbGluayA9IHdjTGluazsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEVDS0lOX0NPTU1FTlQsIGNoZWNraW5Db21tZW50KTsNCi0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BSk9SLCBtYWpvcik7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEVDS19JTiwgInRydWUiKTsNCi0NCi0gICAgICAgIC8vIHNldCB1cCB3cml0ZXINCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoY3JlYXRlT2JqZWN0KHByb3BlcnRpZXMsIG51bGwsIHBvbGljaWVzKSwNCi0gICAgICAgICAgICAgICAgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgY29udGVudFN0cmVhbSk7DQotDQotICAgICAgICAvLyB1cGRhdGUNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwdXQodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICAvLyBwYXJzZSBuZXcgZW50cnkNCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7DQotDQotICAgICAgICAvLyB3ZSBleHBlY3QgYSBDTUlTIGVudHJ5DQotICAgICAgICBpZiAoZW50cnkuZ2V0SWQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJSZWNlaXZlZCBBdG9tIGVudHJ5IGlzIG5vdCBhIENNSVMgZW50cnkhIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBzZXQgb2JqZWN0IGlkDQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShlbnRyeS5nZXRJZCgpKTsNCi0NCi0gICAgICAgIEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCBvcmlnaW5hbEFjZXMgPSBudWxsOw0KLQ0KLSAgICAgICAgbG9ja0xpbmtzKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlDQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7DQotICAgICAgICAgICAgICAgICAgICBhZGRMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdCBjdXJyZW50IEFDTA0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0QWNsKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQWNlcyA9IG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwob2JqZWN0LmdldEFjbCgpLmdldEFjZXMoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBY2VzLnNldEV4YWN0KG9iamVjdC5pc0V4YWN0QWNsKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICB1bmxvY2tMaW5rcygpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gaGFuZGxlIEFDTCBtb2RpZmljYXRpb25zDQotICAgICAgICBpZiAoKG9yaWdpbmFsQWNlcyAhPSBudWxsKSAmJiAoaXNBY2xNZXJnZVJlcXVpcmVkKGFkZEFjZXMsIHJlbW92ZUFjZXMpKSkgew0KLSAgICAgICAgICAgIC8vIG1lcmdlIGFuZCB1cGRhdGUgQUNMDQotICAgICAgICAgICAgQWNsIG5ld0FDTCA9IG1lcmdlQWNscyhvcmlnaW5hbEFjZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMpOw0KLSAgICAgICAgICAgIGlmIChuZXdBQ0wgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB1cGRhdGVBY2wocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCBuZXdBQ0wsIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBbGxWZXJzaW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIFN0cmluZyBmaWx0ZXIsDQotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsNCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9WRVJTSU9OSElTVE9SWSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsNCi0NCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9WRVJTSU9OSElTVE9SWSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7DQotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOw0KLQ0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UNCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7DQotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gZ2V0IHRoZSB2ZXJzaW9ucw0KLSAgICAgICAgaWYgKCFmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7DQotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgdmVyc2lvbiA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgIGxvY2tMaW5rcygpOw0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2FjaGUNCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpbmtzKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSk7DQotDQotICAgICAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5DQotICAgICAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBPYmplY3REYXRhKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICB1bmxvY2tMaW5rcygpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodmVyc2lvbik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsDQotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsDQotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBQ0wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgUmV0dXJuVmVyc2lvbiByZXR1cm5WZXJzaW9uID0gUmV0dXJuVmVyc2lvbi5MQVRFU1Q7DQotICAgICAgICBpZiAoKG1ham9yICE9IG51bGwpICYmIChtYWpvci5ib29sZWFuVmFsdWUoKSkpIHsNCi0gICAgICAgICAgICByZXR1cm5WZXJzaW9uID0gUmV0dXJuVmVyc2lvbi5MQVNURVNUTUFKT1I7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SW50ZXJuYWwocmVwb3NpdG9yeUlkLCBJZGVudGlmaWVyVHlwZS5JRCwgb2JqZWN0SWQsIHJldHVyblZlcnNpb24sIGZpbHRlciwNCi0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBQ0wsIGV4dGVuc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsDQotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBSZXR1cm5WZXJzaW9uIHJldHVyblZlcnNpb24gPSBSZXR1cm5WZXJzaW9uLkxBVEVTVDsNCi0gICAgICAgIGlmICgobWFqb3IgIT0gbnVsbCkgJiYgKG1ham9yLmJvb2xlYW5WYWx1ZSgpKSkgew0KLSAgICAgICAgICAgIHJldHVyblZlcnNpb24gPSBSZXR1cm5WZXJzaW9uLkxBU1RFU1RNQUpPUjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0T2JqZWN0SW50ZXJuYWwocmVwb3NpdG9yeUlkLCBJZGVudGlmaWVyVHlwZS5JRCwgb2JqZWN0SWQsIHJldHVyblZlcnNpb24sIGZpbHRlciwNCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgImNtaXM6bm9uZSIsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uRkFMU0UsIGV4dGVuc2lvbik7DQotDQotICAgICAgICByZXR1cm4gb2JqZWN0LmdldFByb3BlcnRpZXMoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tQWNsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tQWNsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjcxMWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUFjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOw0KLQ0KLS8qKg0KLSAqIEF0b21BY2wuDQotICovDQotcHVibGljIGNsYXNzIEF0b21BY2wgZXh0ZW5kcyBBdG9tQmFzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwcml2YXRlIEFjbCBhY2w7DQotDQotICAgIHB1YmxpYyBBdG9tQWNsKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQXRvbUFjbChBY2wgYWNsKSB7DQotICAgICAgICB0aGlzKCk7DQotICAgICAgICB0aGlzLmFjbCA9IGFjbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuICJBQ0wiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBY2wgZ2V0QUNMKCkgew0KLSAgICAgICAgcmV0dXJuIGFjbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBQ0woQWNsIGFjbCkgew0KLSAgICAgICAgdGhpcy5hY2wgPSBhY2w7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUFsbG93YWJsZUFjdGlvbnMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21BbGxvd2FibGVBY3Rpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjBmMjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUFsbG93YWJsZUFjdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7DQotDQotLyoqDQotICogQXRvbUFsbG93YWJsZUFjdGlvbnMuDQotICovDQotcHVibGljIGNsYXNzIEF0b21BbGxvd2FibGVBY3Rpb25zIGV4dGVuZHMgQXRvbUJhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0gICAgcHJpdmF0ZSBBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnM7DQotDQotICAgIHB1YmxpYyBBdG9tQWxsb3dhYmxlQWN0aW9ucygpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEF0b21BbGxvd2FibGVBY3Rpb25zKEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9ucykgew0KLSAgICAgICAgdGhpcygpOw0KLSAgICAgICAgdGhpcy5hbGxvd2FibGVBY3Rpb25zID0gYWxsb3dhYmxlQWN0aW9uczsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuICJBbGxvd2FibGUgQWN0aW9ucyI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFsbG93YWJsZUFjdGlvbnMgZ2V0QWxsb3dhYmxlQWN0aW9ucygpIHsNCi0gICAgICAgIHJldHVybiBhbGxvd2FibGVBY3Rpb25zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93YWJsZUFjdGlvbnMoQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zKSB7DQotICAgICAgICB0aGlzLmFsbG93YWJsZUFjdGlvbnMgPSBhbGxvd2FibGVBY3Rpb25zOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21CYXNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTI2OWMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21CYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHM7DQotDQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBCYXNlIHR5cGUgZm9yIEF0b20gcmVzcG9uc2VzLg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdG9tQmFzZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8QXRvbUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxBdG9tRWxlbWVudD4oKTsNCi0NCi0gICAgcHJvdGVjdGVkIEF0b21CYXNlKCkgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZSgpOw0KLQ0KLSAgICBwdWJsaWMgTGlzdDxBdG9tRWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7DQotICAgICAgICByZXR1cm4gZWxlbWVudHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChBdG9tRWxlbWVudCBlbGVtZW50KSB7DQotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgZWxlbWVudHMuYWRkKGVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21FbGVtZW50LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE1YjhkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHM7DQotDQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLS8qKg0KLSAqIEF0b20gRWxlbWVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXRvbUVsZW1lbnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBuYW1lOw0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBvYmplY3Q7DQotDQotICAgIHB1YmxpYyBBdG9tRWxlbWVudChRTmFtZSBuYW1lLCBPYmplY3Qgb2JqZWN0KSB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7DQotICAgICAgICByZXR1cm4gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsNCi0gICAgICAgIHJldHVybiBvYmplY3Q7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gbmFtZSArICI6ICIgKyBvYmplY3Q7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUVudHJ5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxOGY3NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsNCi0NCi0vKioNCi0gKiBBdG9tIEVudHJ5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdG9tRW50cnkgZXh0ZW5kcyBBdG9tQmFzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBpZDsNCi0NCi0gICAgcHVibGljIEF0b21FbnRyeSgpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCi0gICAgICAgIHJldHVybiAiQXRvbSBFbnRyeSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCi0gICAgICAgIHJldHVybiBpZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsNCi0gICAgICAgIHRoaXMuaWQgPSBpZDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIHJldHVybiAiRW50cnkgXCIiICsgaWQgKyAiXCI6ICIgKyBnZXRFbGVtZW50cygpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21GZWVkLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tRmVlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNhZDFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21GZWVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEF0b20gRmVlZC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXRvbUZlZWQgZXh0ZW5kcyBBdG9tQmFzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8QXRvbUVudHJ5PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxBdG9tRW50cnk+KCk7DQotDQotICAgIHB1YmxpYyBBdG9tRmVlZCgpIHsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuICJBdG9tIEZlZWQiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEF0b21FbnRyeT4gZ2V0RW50cmllcygpIHsNCi0gICAgICAgIHJldHVybiBlbnRyaWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5KEF0b21FbnRyeSBlbnRyeSkgew0KLSAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gIkZlZWQgOiAiICsgZ2V0RWxlbWVudHMoKSArICIgIiArIGVudHJpZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUxpbmsuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTBmODMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsNCi0NCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotDQotLyoqDQotICogQXRvbSBMaW5rLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdG9tTGluayBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByZWw7DQotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7DQotICAgIHByaXZhdGUgU3RyaW5nIGhyZWY7DQotDQotICAgIHB1YmxpYyBBdG9tTGluaygpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbCgpIHsNCi0gICAgICAgIHJldHVybiByZWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UmVsKFN0cmluZyByZWwpIHsNCi0gICAgICAgIHRoaXMucmVsID0gcmVsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCi0gICAgICAgIHJldHVybiB0eXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsNCi0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRIcmVmKCkgew0KLSAgICAgICAgcmV0dXJuIGhyZWY7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgew0KLSAgICAgICAgdGhpcy5ocmVmID0gaHJlZjsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIHJldHVybiAiTGluazogcmVsPVwiIiArIHJlbCArICJcIiB0eXBlPVwiIiArIHR5cGUgKyAiXCIgaHJlZj1cIiIgKyBocmVmICsgIlwiIjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9IdG1sRG9jLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9IdG1sRG9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmU4M2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvSHRtbERvYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzOw0KLQ0KLXB1YmxpYyBjbGFzcyBIdG1sRG9jIGV4dGVuZHMgQXRvbUJhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCi0gICAgICAgIHJldHVybiAiSFRNTCBkb2N1bWVudCI7DQotICAgIH0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvUmVwb3NpdG9yeVdvcmtzcGFjZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvUmVwb3NpdG9yeVdvcmtzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQyZDQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL1JlcG9zaXRvcnlXb3Jrc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsNCi0NCi0vKioNCi0gKiBSZXBvc2l0b3J5IHdvcmtzcGFjZS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVdvcmtzcGFjZSBleHRlbmRzIEF0b21CYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGlkOw0KLQ0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeVdvcmtzcGFjZSgpIHsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuICJSZXBvc2l0b3J5IFdvcmtzcGFjZSI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCi0gICAgICAgIHJldHVybiBpZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsNCi0gICAgICAgIHRoaXMuaWQgPSBpZDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIHJldHVybiAiV29ya3NwYWNlIFwiIiArIGlkICsgIlwiOiAiICsgZ2V0RWxlbWVudHMoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9TZXJ2aWNlRG9jLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9TZXJ2aWNlRG9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2E1YjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvU2VydmljZURvYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBTZXJ2aWNlIERvYy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VydmljZURvYyBleHRlbmRzIEF0b21CYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotDQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXBvc2l0b3J5V29ya3NwYWNlPiB3b3Jrc3BhY2VzID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5V29ya3NwYWNlPigpOw0KLQ0KLSAgICBwdWJsaWMgU2VydmljZURvYygpIHsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuICJTZXJ2aWNlIERvY3VtZW50IjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5V29ya3NwYWNlPiBnZXRXb3Jrc3BhY2VzKCkgew0KLSAgICAgICAgcmV0dXJuIHdvcmtzcGFjZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkV29ya3NwYWNlKFJlcG9zaXRvcnlXb3Jrc3BhY2Ugd3MpIHsNCi0gICAgICAgIGlmICh3cyAhPSBudWxsKSB7DQotICAgICAgICAgICAgd29ya3NwYWNlcy5hZGQod3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuICJTZXJ2aWNlIERvYzogIiArIHdvcmtzcGFjZXM7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0FwYWNoZUNsaWVudEh0dHBJbnZva2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2h0dHAvQXBhY2hlQ2xpZW50SHR0cEludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3MzhjOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2h0dHAvQXBhY2hlQ2xpZW50SHR0cEludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXI7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQ7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuQ21pc0JpbmRpbmdzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQucGFyYW1zLkNsaWVudFBOYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5Db25uZWN0VGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5wYXJhbXMuQ29ubk1hbmFnZXJQTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4ucGFyYW1zLkNvbm5QZXJSb3V0ZUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLkxheWVyZWRTb2NrZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5QbGFpblNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuU2NoZW1lUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLkJyb3dzZXJDb21wYXRIb3N0bmFtZVZlcmlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llT3JpZ2luOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb29raWUuQ29va2llU3BlYzsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29va2llLkNvb2tpZVNwZWNGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb29raWUuTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlByb3h5U2VsZWN0b3JSb3V0ZVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi50c2NjbS5UaHJlYWRTYWZlQ2xpZW50Q29ubk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY29va2llLkNvb2tpZVNwZWNCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cENvbm5lY3Rpb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOwotCi0vKioKLSAqIEEge0BsaW5rIEh0dHBJbnZva2VyfSB0aGF0IHVzZXMgVGhlIEFwYWNoZSBIVFRQIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIEFwYWNoZUNsaWVudEh0dHBJbnZva2VyIGV4dGVuZHMgQWJzdHJhY3RBcGFjaGVDbGllbnRIdHRwSW52b2tlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdOT1JFX0NPT0tJRVMgPSAiaWdub3JlQ29va2llcyI7Ci0KLSAgICBwcm90ZWN0ZWQgRGVmYXVsdEh0dHBDbGllbnQgY3JlYXRlSHR0cENsaWVudChVcmxCdWlsZGVyIHVybCwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICAvLyBzZXQgcGFyYW1zCi0gICAgICAgIEh0dHBQYXJhbXMgcGFyYW1zID0gY3JlYXRlRGVmYXVsdEh0dHBQYXJhbXMoc2Vzc2lvbik7Ci0gICAgICAgIHBhcmFtcy5zZXRQYXJhbWV0ZXIoQ2xpZW50UE5hbWVzLkNPT0tJRV9QT0xJQ1ksIElHTk9SRV9DT09LSUVTKTsKLQotICAgICAgICAvLyBzZXQgbWF4IGNvbm5lY3Rpb24KLSAgICAgICAgU3RyaW5nIG1heENvbm5TdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAubWF4Q29ubmVjdGlvbnMiLCAiNSIpOwotICAgICAgICBpbnQgbWF4Q29ubiA9IDU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXhDb25uID0gSW50ZWdlci5wYXJzZUludChtYXhDb25uU3RyKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICAgICAgcGFyYW1zLnNldEludFBhcmFtZXRlcihDb25uTWFuYWdlclBOYW1lcy5NQVhfVE9UQUxfQ09OTkVDVElPTlMsIG1heENvbm4gKiA0KTsKLSAgICAgICAgcGFyYW1zLnNldFBhcmFtZXRlcihDb25uTWFuYWdlclBOYW1lcy5NQVhfQ09OTkVDVElPTlNfUEVSX1JPVVRFLCBuZXcgQ29ublBlclJvdXRlQmVhbihtYXhDb25uKSk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIHNjaGVtZSByZWdpc3RyeQotICAgICAgICBTY2hlbWVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBTY2hlbWVSZWdpc3RyeSgpOwotICAgICAgICByZWdpc3RyeS5yZWdpc3RlcihuZXcgU2NoZW1lKCJodHRwIiwgUGxhaW5Tb2NrZXRGYWN0b3J5LmdldFNvY2tldEZhY3RvcnkoKSwgODApKTsKLSAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIobmV3IFNjaGVtZSgiaHR0cHMiLCBnZXRTU0xTb2NrZXRGYWN0b3J5KHVybCwgc2Vzc2lvbiksIDQ0MykpOwotCi0gICAgICAgIC8vIHNldCB1cCBjb25uZWN0aW9uIG1hbmFnZXIKLSAgICAgICAgVGhyZWFkU2FmZUNsaWVudENvbm5NYW5hZ2VyIGNvbm5NYW5hZ2VyID0gbmV3IFRocmVhZFNhZmVDbGllbnRDb25uTWFuYWdlcihwYXJhbXMsIHJlZ2lzdHJ5KTsKLQotICAgICAgICAvLyBzZXQgdXAgcHJveHkKLSAgICAgICAgUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lciByb3V0ZVBsYW5uZXIgPSBuZXcgUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lcihyZWdpc3RyeSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIGNsaWVudAotICAgICAgICBEZWZhdWx0SHR0cENsaWVudCBodHRwY2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KGNvbm5NYW5hZ2VyLCBwYXJhbXMpOwotICAgICAgICBodHRwY2xpZW50LnNldFJvdXRlUGxhbm5lcihyb3V0ZVBsYW5uZXIpOwotICAgICAgICBodHRwY2xpZW50LmdldENvb2tpZVNwZWNzKCkucmVnaXN0ZXIoSUdOT1JFX0NPT0tJRVMsIG5ldyBJZ25vcmVTcGVjRmFjdG9yeSgpKTsKLQotICAgICAgICByZXR1cm4gaHR0cGNsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYSBTU0wgU29ja2V0IEZhY3RvcnkgZm9yIHRoZSBBcGFjaGUgSFRUUCBDbGllbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMYXllcmVkU29ja2V0RmFjdG9yeSBnZXRTU0xTb2NrZXRGYWN0b3J5KGZpbmFsIFVybEJ1aWxkZXIgdXJsLCBmaW5hbCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIC8vIGdldCBhdXRoZW50aWNhdGlvbiBwcm92aWRlcgotICAgICAgICBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGF1dGhQcm92aWRlciA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKHNlc3Npb24pOwotCi0gICAgICAgIC8vIGNoZWNrIFNTTCBTb2NrZXQgRmFjdG9yeQotICAgICAgICBmaW5hbCBTU0xTb2NrZXRGYWN0b3J5IHNmID0gYXV0aFByb3ZpZGVyLmdldFNTTFNvY2tldEZhY3RvcnkoKTsKLSAgICAgICAgaWYgKHNmID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG5vIGN1c3RvbSBmYWN0b3J5IC0+IHJldHVybiBkZWZhdWx0IGZhY3RvcnkKLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuU1NMU29ja2V0RmFjdG9yeS5nZXRTb2NrZXRGYWN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBob3N0YW1lIHZlcmlmaWVyIGFuZCB1c2UgZGVmYXVsdCBpZiBub3Qgc2V0Ci0gICAgICAgIGZpbmFsIEhvc3RuYW1lVmVyaWZpZXIgaHYgPSAoYXV0aFByb3ZpZGVyLmdldEhvc3RuYW1lVmVyaWZpZXIoKSA9PSBudWxsID8gbmV3IEJyb3dzZXJDb21wYXRIb3N0bmFtZVZlcmlmaWVyKCkKLSAgICAgICAgICAgICAgICA6IGF1dGhQcm92aWRlci5nZXRIb3N0bmFtZVZlcmlmaWVyKCkpOwotCi0gICAgICAgIC8vIGJ1aWxkIG5ldyBzb2NrZXQgZmFjdG9yeQotICAgICAgICByZXR1cm4gbmV3IExheWVyZWRTb2NrZXRGYWN0b3J5KCkgewotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZShTb2NrZXQgc29jaykgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTU0xTb2NrZXQpIHNmLmNyZWF0ZVNvY2tldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldChTb2NrZXQgc29ja2V0LCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGJvb2xlYW4gYXV0b0Nsb3NlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KSBzZi5jcmVhdGVTb2NrZXQoc29ja2V0LCBob3N0LCBwb3J0LCBhdXRvQ2xvc2UpOwotICAgICAgICAgICAgICAgIHZlcmlmeShodiwgaG9zdCwgc3NsU29ja2V0KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBzc2xTb2NrZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTb2NrZXQgY29ubmVjdFNvY2tldChTb2NrZXQgc29jaywgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBJbmV0QWRkcmVzcyBsb2NhbEFkZHJlc3MsIGludCBsb2NhbFBvcnQsCi0gICAgICAgICAgICAgICAgICAgIEh0dHBQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KSAoc29jayAhPSBudWxsID8gc29jayA6IGNyZWF0ZVNvY2tldCgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2NhbEFkZHJlc3MgIT0gbnVsbCB8fCBsb2NhbFBvcnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFBvcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvcnQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXNhID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGxvY2FsQWRkcmVzcywgbG9jYWxQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgc3NsU29ja2V0LmJpbmQoaXNhKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyByZW1vdGVBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpOwotCi0gICAgICAgICAgICAgICAgaW50IGNvbm5UaW1lb3V0ID0gSHR0cENvbm5lY3Rpb25QYXJhbXMuZ2V0Q29ubmVjdGlvblRpbWVvdXQocGFyYW1zKTsKLSAgICAgICAgICAgICAgICBpbnQgc29UaW1lb3V0ID0gSHR0cENvbm5lY3Rpb25QYXJhbXMuZ2V0U29UaW1lb3V0KHBhcmFtcyk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzc2xTb2NrZXQuc2V0U29UaW1lb3V0KHNvVGltZW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIHNzbFNvY2tldC5jb25uZWN0KHJlbW90ZUFkZHJlc3MsIGNvbm5UaW1lb3V0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlU29ja2V0KHNvY2spOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ubmVjdFRpbWVvdXRFeGNlcHRpb24oIkNvbm5lY3QgdG8gIiArIHJlbW90ZUFkZHJlc3MgKyAiIHRpbWVkIG91dCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2ZXJpZnkoaHYsIGhvc3QsIHNzbFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3NsU29ja2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29va2llcyBzcGVjIGZhY3RvcnkgdGhhdCBpZ25vcmVzIGNvb2tpZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWdub3JlU3BlY0ZhY3RvcnkgaW1wbGVtZW50cyBDb29raWVTcGVjRmFjdG9yeSB7Ci0gICAgICAgIHB1YmxpYyBDb29raWVTcGVjIG5ld0luc3RhbmNlKGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvb2tpZVNwZWNCYXNlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIExpc3Q8Q29va2llPiBwYXJzZShIZWFkZXIgaGVhZGVyLCBDb29raWVPcmlnaW4gb3JpZ2luKSB0aHJvd3MgTWFsZm9ybWVkQ29va2llRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBMaXN0PEhlYWRlcj4gZm9ybWF0Q29va2llcyhMaXN0PENvb2tpZT4gY29va2llcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIEhlYWRlciBnZXRWZXJzaW9uSGVhZGVyKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0RlZmF1bHRIdHRwSW52b2tlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0RlZmF1bHRIdHRwSW52b2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM4MGMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9EZWZhdWx0SHR0cEludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5DbGllbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNtaXNCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEh0dHBJbnZva2VyIGltcGxlbWVudHMgSHR0cEludm9rZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERlZmF1bHRIdHRwSW52b2tlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAyICogMTAyNCAqIDEwMjQ7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdEh0dHBJbnZva2VyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZSBpbnZva2VHRVQoVXJsQnVpbGRlciB1cmwsIEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgcmV0dXJuIGludm9rZSh1cmwsICJHRVQiLCBudWxsLCBudWxsLCBudWxsLCBzZXNzaW9uLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlR0VUKFVybEJ1aWxkZXIgdXJsLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uLCBCaWdJbnRlZ2VyIG9mZnNldCwgQmlnSW50ZWdlciBsZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZSh1cmwsICJHRVQiLCBudWxsLCBudWxsLCBudWxsLCBzZXNzaW9uLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZVBPU1QoVXJsQnVpbGRlciB1cmwsIFN0cmluZyBjb250ZW50VHlwZSwgT3V0cHV0IHdyaXRlciwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICByZXR1cm4gaW52b2tlKHVybCwgIlBPU1QiLCBjb250ZW50VHlwZSwgbnVsbCwgd3JpdGVyLCBzZXNzaW9uLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlUFVUKFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgY29udGVudFR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgT3V0cHV0IHdyaXRlciwKLSAgICAgICAgICAgIEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgcmV0dXJuIGludm9rZSh1cmwsICJQVVQiLCBjb250ZW50VHlwZSwgaGVhZGVycywgd3JpdGVyLCBzZXNzaW9uLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlREVMRVRFKFVybEJ1aWxkZXIgdXJsLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UodXJsLCAiREVMRVRFIiwgbnVsbCwgbnVsbCwgbnVsbCwgc2Vzc2lvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXNwb25zZSBpbnZva2UoVXJsQnVpbGRlciB1cmwsIFN0cmluZyBtZXRob2QsIFN0cmluZyBjb250ZW50VHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAotICAgICAgICAgICAgT3V0cHV0IHdyaXRlciwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQmlnSW50ZWdlciBvZmZzZXQsIEJpZ0ludGVnZXIgbGVuZ3RoKSB7Ci0gICAgICAgIGludCByZXNwQ29kZSA9IC0xOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBsb2cgYmVmb3JlIGNvbm5lY3QKLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiU2Vzc2lvbiB7fToge30ge30iLCBzZXNzaW9uLmdldFNlc3Npb25JZCgpLCBtZXRob2QsIHVybCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbm5lY3QKLSAgICAgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIChuZXcgVVJMKHVybC50b1N0cmluZygpKSkub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdE1ldGhvZChtZXRob2QpOwotICAgICAgICAgICAgY29ubi5zZXREb0lucHV0KHRydWUpOwotICAgICAgICAgICAgY29ubi5zZXREb091dHB1dCh3cml0ZXIgIT0gbnVsbCk7Ci0gICAgICAgICAgICBjb25uLnNldEFsbG93VXNlckludGVyYWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIGNvbm4uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLSAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJVc2VyLUFnZW50IiwgQ2xpZW50VmVyc2lvbi5PUEVOQ01JU19DTElFTlQpOwotCi0gICAgICAgICAgICAvLyB0aW1lb3V0cwotICAgICAgICAgICAgaW50IGNvbm5lY3RUaW1lb3V0ID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DT05ORUNUX1RJTUVPVVQsIC0xKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0VGltZW91dCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChjb25uZWN0VGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCByZWFkVGltZW91dCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUkVBRF9USU1FT1VULCAtMSk7Ci0gICAgICAgICAgICBpZiAocmVhZFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgY29udGVudCB0eXBlCi0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZXQgb3RoZXIgaGVhZGVycwotICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoaGVhZGVyLmdldEtleSgpLCBoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGUKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aFByb3ZpZGVyID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoc2Vzc2lvbik7Ci0gICAgICAgICAgICBpZiAoYXV0aFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGh0dHBIZWFkZXJzID0gYXV0aFByb3ZpZGVyLmdldEhUVFBIZWFkZXJzKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoaHR0cEhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVyIDogaHR0cEhlYWRlcnMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5nZXRLZXkoKSAhPSBudWxsICYmIGhlYWRlci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgIWhlYWRlci5nZXRWYWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBoZWFkZXIuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJ1c2VyLWFnZW50IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCBoZWFkZXIuZ2V0VmFsdWUoKS5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogaGVhZGVyLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29ubiBpbnN0YW5jZW9mIEh0dHBzVVJMQ29ubmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNmID0gYXV0aFByb3ZpZGVyLmdldFNTTFNvY2tldEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoSHR0cHNVUkxDb25uZWN0aW9uKSBjb25uKS5zZXRTU0xTb2NrZXRGYWN0b3J5KHNmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEhvc3RuYW1lVmVyaWZpZXIgaHYgPSBhdXRoUHJvdmlkZXIuZ2V0SG9zdG5hbWVWZXJpZmllcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChIdHRwc1VSTENvbm5lY3Rpb24pIGNvbm4pLnNldEhvc3RuYW1lVmVyaWZpZXIoaHYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByYW5nZQotICAgICAgICAgICAgaWYgKChvZmZzZXQgIT0gbnVsbCkgfHwgKGxlbmd0aCAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiYnl0ZXM9Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG9mZnNldCA9PSBudWxsKSB8fCAob2Zmc2V0LnNpZ251bSgpID09IC0xKSkgewotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9mZnNldC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKTsKLQotICAgICAgICAgICAgICAgIGlmICgobGVuZ3RoICE9IG51bGwpICYmIChsZW5ndGguc2lnbnVtKCkgPT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9mZnNldC5hZGQobGVuZ3RoLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIlJhbmdlIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uCi0gICAgICAgICAgICBPYmplY3QgY29tcHJlc3Npb24gPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkNPTVBSRVNTSU9OKTsKLSAgICAgICAgICAgIGlmICgoY29tcHJlc3Npb24gIT0gbnVsbCkgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4oY29tcHJlc3Npb24udG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAsZGVmbGF0ZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsb2NhbGUKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLmdldChDbWlzQmluZGluZ3NIZWxwZXIuQUNDRVBUX0xBTkdVQUdFKSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQtTGFuZ3VhZ2UiLCBzZXNzaW9uLmdldChDbWlzQmluZGluZ3NIZWxwZXIuQUNDRVBUX0xBTkdVQUdFKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2VuZCBkYXRhCi0gICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL05vdCBzdXBwb3J0ZWQgd2l0aCBBbGwgc2VydmVyLgotICAgICAgICAgICAgICAgIC8vY29ubi5zZXRDaHVua2VkU3RyZWFtaW5nTW9kZSgoNjQgKiAxMDI0KSAtIDEpOwotCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGNvbm5PdXQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGNsaWVudENvbXByZXNzaW9uID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DTElFTlRfQ09NUFJFU1NJT04pOwotICAgICAgICAgICAgICAgIGlmICgoY2xpZW50Q29tcHJlc3Npb24gIT0gbnVsbCkgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4oY2xpZW50Q29tcHJlc3Npb24udG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpOwotICAgICAgICAgICAgICAgICAgICBjb25uT3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oY29ubi5nZXRPdXRwdXRTdHJlYW0oKSwgNDA5Nik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubk91dCA9IGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShjb25uT3V0LCBCVUZGRVJfU0laRSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKG91dCk7Ci0gICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29ubk91dCBpbnN0YW5jZW9mIEdaSVBPdXRwdXRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgKChHWklQT3V0cHV0U3RyZWFtKSBjb25uT3V0KS5maW5pc2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbm5lY3QKLSAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpOwotCi0gICAgICAgICAgICAvLyBnZXQgc3RyZWFtLCBpZiBwcmVzZW50Ci0gICAgICAgICAgICByZXNwQ29kZSA9IGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoKHJlc3BDb2RlID09IDIwMCkgfHwgKHJlc3BDb2RlID09IDIwMSkgfHwgKHJlc3BDb2RlID09IDIwMykgfHwgKHJlc3BDb2RlID09IDIwNikpIHsKLSAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9nIGFmdGVyIGNvbm5lY3QKLSAgICAgICAgICAgIGlmIChMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPRy50cmFjZSgiU2Vzc2lvbiB7fToge30ge30gPiBIZWFkZXJzOiB7fSIsIHNlc3Npb24uZ2V0U2Vzc2lvbklkKCksIG1ldGhvZCwgdXJsLCBjb25uCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SGVhZGVyRmllbGRzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZvcndhcmQgcmVzcG9uc2UgSFRUUCBoZWFkZXJzCi0gICAgICAgICAgICBpZiAoYXV0aFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdXRoUHJvdmlkZXIucHV0UmVzcG9uc2VIZWFkZXJzKHVybC50b1N0cmluZygpLCByZXNwQ29kZSwgY29ubi5nZXRIZWFkZXJGaWVsZHMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzcG9uc2UKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVzcENvZGUsIGNvbm4uZ2V0UmVzcG9uc2VNZXNzYWdlKCksIGNvbm4uZ2V0SGVhZGVyRmllbGRzKCksIGlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBjb25uLmdldEVycm9yU3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIHN0YXR1cyA9IChyZXNwQ29kZSA+IDAgPyAiIChIVFRQIHN0YXR1cyBjb2RlICIgKyByZXNwQ29kZSArICIpIiA6ICIiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGFjY2VzcyBcIiIgKyB1cmwgKyAiXCIiICsgc3RhdHVzICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9YTUxDb252ZXJ0ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9YTUxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5MGUxOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGw7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RhbnRzLio7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOw0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2xDYXBhYmlsaXRpZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DaGFuZ2VFdmVudEluZm87DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DbWlzRXh0ZW5zaW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNyZWF0YWJsZVByb3BlcnR5VHlwZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25GZWF0dXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBlcm1pc3Npb25NYXBwaW5nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUG9saWN5SWRMaXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJpbmNpcGFsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5Qm9vbGVhbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0ZVRpbWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURlY2ltYWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUh0bWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUlkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJbnRlZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVVyaTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUGVybWlzc2lvbkRlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SWREZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5VXJpRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlTXV0YWJpbGl0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5QWNsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDaGFuZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Sm9pbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5T3JkZXJCeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UXVlcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVJlbmRpdGlvbnM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2hhbmdlVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Db250ZW50U3RyZWFtQWxsb3dlZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZVJlc29sdXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGVjaW1hbFByZWNpc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuU3VwcG9ydGVkUGVybWlzc2lvbnM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0VHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbExpc3RJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BbGxvd2FibGVBY3Rpb25zSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DaG9pY2VJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkV4dGVuc2lvbkZlYXR1cmVJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRm9sZGVyVHlwZURlZmluaXRpb25JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuSXRlbVR5cGVEZWZpbml0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0RGF0YUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5QZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBvbGljeUlkTGlzdEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lUeXBlRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlCb29sZWFuSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5VXJpSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlF1ZXJ5VHlwZUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZW5kaXRpb25EYXRhSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUluZm9JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZU11dGFiaWxpdHlJbXBsOw0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOw0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsNCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsNCi0NCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MQ29udmVydGVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFhNTENvbnZlcnRlci5jbGFzcyk7DQotDQotICAgIHByaXZhdGUgWE1MQ29udmVydGVyKCkgew0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyAtLS0gd3JpdGVycyAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVJlcG9zaXRvcnlJbmZvKFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIG5hbWVzcGFjZSwNCi0gICAgICAgICAgICBSZXBvc2l0b3J5SW5mbyBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZXIuc3RhcnRUYWcobmFtZXNwYWNlLCBUQUdfUkVQT1NJVE9SWV9JTkZPKTsNCi0NCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19JRCwgc291cmNlLmdldElkKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX05BTUUsIHNvdXJjZS5nZXROYW1lKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0RFU0NSSVBUSU9OLCBzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fVkVORE9SLCBzb3VyY2UuZ2V0VmVuZG9yTmFtZSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19QUk9EVUNULCBzb3VyY2UuZ2V0UHJvZHVjdE5hbWUoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fUFJPRFVDVF9WRVJTSU9OLCBzb3VyY2UuZ2V0UHJvZHVjdFZlcnNpb24oKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fUk9PVF9GT0xERVJfSUQsIHNvdXJjZS5nZXRSb290Rm9sZGVySWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fQ0hBTkdFX0xPR19UT0tFTiwNCi0gICAgICAgICAgICAgICAgc291cmNlLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCkpOw0KLSAgICAgICAgd3JpdGVSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzKHdyaXRlciwgY21pc1ZlcnNpb24sIHNvdXJjZS5nZXRDYXBhYmlsaXRpZXMoKSk7DQotICAgICAgICB3cml0ZUFjbENhcGFiaWxpdGllcyh3cml0ZXIsIGNtaXNWZXJzaW9uLCBzb3VyY2UuZ2V0QWNsQ2FwYWJpbGl0aWVzKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0NNSVNfVkVSU0lPTl9TVVBQT1JURUQsDQotICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRDbWlzVmVyc2lvblN1cHBvcnRlZCgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19USElOX0NMSUVOVF9VUkksIHNvdXJjZS5nZXRUaGluQ2xpZW50VXJpKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0NIQU5HRVNfSU5DT01QTEVURSwNCi0gICAgICAgICAgICAgICAgc291cmNlLmdldENoYW5nZXNJbmNvbXBsZXRlKCkpOw0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRDaGFuZ2VzT25UeXBlKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoQmFzZVR5cGVJZCBiYXNlVHlwZSA6IHNvdXJjZS5nZXRDaGFuZ2VzT25UeXBlKCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGNtaXNWZXJzaW9uID09IENtaXNWZXJzaW9uLkNNSVNfMV8wICYmIGJhc2VUeXBlID09IEJhc2VUeXBlSWQuQ01JU19JVEVNKSB7DQotICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiUmVjZWl2ZXIgb25seSB1bmRlcnN0YW5kcyBDTUlTIDEuMCBidXQgdGhlIENoYW5nZXMgT24gVHlwZSBsaXN0IGluIHRoZSBSZXBvc2l0b3J5IGluZm8gY29udGFpbnMgdGhlIGJhc2UgdHlwZSBJdGVtLiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBJdGVtIGJhc2UgdHlwZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIik7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fQ0hBTkdFU19PTl9UWVBFLCBiYXNlVHlwZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX1BSSU5DSVBBTF9JRF9BTk9OWU1PVVMsDQotICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRQcmluY2lwYWxJZEFub255bW91cygpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19QUklOQ0lQQUxfSURfQU5ZT05FLA0KLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0UHJpbmNpcGFsSWRBbnlvbmUoKSk7DQotICAgICAgICBpZiAoY21pc1ZlcnNpb24gIT0gQ21pc1ZlcnNpb24uQ01JU18xXzAgJiYgc291cmNlLmdldEV4dGVuc2lvbkZlYXR1cmVzKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoRXh0ZW5zaW9uRmVhdHVyZSBmZWF0dXJlIDogc291cmNlLmdldEV4dGVuc2lvbkZlYXR1cmVzKCkpIHsNCi0gICAgICAgICAgICAgICAgd3JpdGVFeHRlbmRlZEZlYXR1cmVzKHdyaXRlciwgY21pc1ZlcnNpb24sIGZlYXR1cmUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHNvdXJjZSk7DQotICAgICAgICB3cml0ZXIuZW5kVGFnKG5hbWVzcGFjZSwgVEFHX1JFUE9TSVRPUllfSU5GTyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlUmVwb3NpdG9yeUNhcGFiaWxpdGllcyhYbWxTZXJpYWxpemVyIHdyaXRlciwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sDQotICAgICAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0NBUEFCSUxJVElFUyk7DQotDQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9BQ0wsIHNvdXJjZS5nZXRBY2xDYXBhYmlsaXR5KCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfQUxMX1ZFUlNJT05TX1NFQVJDSEFCTEUsDQotICAgICAgICAgICAgICAgIHNvdXJjZS5pc0FsbFZlcnNpb25zU2VhcmNoYWJsZVN1cHBvcnRlZCgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0NIQU5HRVMsIHNvdXJjZS5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0NPTlRFTlRfU1RSRUFNX1VQREFUQUJJTElUWSwNCi0gICAgICAgICAgICAgICAgc291cmNlLmdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0dFVF9ERVNDRU5EQU5UUywgc291cmNlLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9HRVRfRk9MREVSX1RSRUUsIHNvdXJjZS5pc0dldEZvbGRlclRyZWVTdXBwb3J0ZWQoKSk7DQotICAgICAgICBpZiAoY21pc1ZlcnNpb24gIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsNCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9PUkRFUl9CWSwgc291cmNlLmdldE9yZGVyQnlDYXBhYmlsaXR5KCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfTVVMVElGSUxJTkcsIHNvdXJjZS5pc011bHRpZmlsaW5nU3VwcG9ydGVkKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfUFdDX1NFQVJDSEFCTEUsIHNvdXJjZS5pc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9QV0NfVVBEQVRBQkxFLCBzb3VyY2UuaXNQd2NVcGRhdGFibGVTdXBwb3J0ZWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9RVUVSWSwgc291cmNlLmdldFF1ZXJ5Q2FwYWJpbGl0eSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX1JFTkRJVElPTlMsIHNvdXJjZS5nZXRSZW5kaXRpb25zQ2FwYWJpbGl0eSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX1VORklMSU5HLCBzb3VyY2UuaXNVbmZpbGluZ1N1cHBvcnRlZCgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX1ZFUlNJT05fU1BFQ0lGSUNfRklMSU5HLA0KLSAgICAgICAgICAgICAgICBzb3VyY2UuaXNWZXJzaW9uU3BlY2lmaWNGaWxpbmdTdXBwb3J0ZWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9KT0lOLCBzb3VyY2UuZ2V0Sm9pbkNhcGFiaWxpdHkoKSk7DQotICAgICAgICBpZiAoY21pc1ZlcnNpb24gIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsNCi0gICAgICAgICAgICBpZiAoc291cmNlLmdldENyZWF0YWJsZVByb3BlcnR5VHlwZXMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIENyZWF0YWJsZVByb3BlcnR5VHlwZXMgY3JlYXRhYmxlUHJvcGVydHlUeXBlcyA9IHNvdXJjZS5nZXRDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKCk7DQotDQotICAgICAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVMpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoY3JlYXRhYmxlUHJvcGVydHlUeXBlcy5jYW5DcmVhdGUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5VHlwZSBwdCA6IGNyZWF0YWJsZVByb3BlcnR5VHlwZXMuY2FuQ3JlYXRlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfQ0FOQ1JFQVRFLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIGNyZWF0YWJsZVByb3BlcnR5VHlwZXMpOw0KLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0NSRUFUQUJMRV9QUk9QRVJUWV9UWVBFUyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzID0gc291cmNlLmdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKTsNCi0NCi0gICAgICAgICAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVMpOw0KLQ0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lELA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SWQoKSk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfTE9DQUxOQU1FLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywNCi0gICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfTE9DQUxOQU1FU1BBQ0UsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRMb2NhbE5hbWVzcGFjZSgpKTsNCi0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19ESVNQTEFZTkFNRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERpc3BsYXlOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX1FVRVJZTkFNRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldFF1ZXJ5TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19ERVNDUklQVElPTiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NSRUFURUFCTEUsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDcmVhdGFibGUoKSk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRklMRUFCTEUsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRGaWxlYWJsZSgpKTsNCi0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19RVUVSWUFCTEUsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRRdWVyeWFibGUoKSk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19GVUxMVEVYVElOREVYRUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRGdWxsdGV4dEluZGV4ZWQoKSk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19JTkNMVURFRElOU1VQRVJUWVRQRVFVRVJZLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOw0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywNCi0gICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ09OVFJPTEFCTEVQT0xJQ1ksDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDb250cm9sbGFibGVQb2xpY3koKSk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DT05UUk9MQUJMRUFDTCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENvbnRyb2xsYWJsZUFjbCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyk7DQotICAgICAgICAgICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFUyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsNCi0gICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0NBUEFCSUxJVElFUyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQWNsQ2FwYWJpbGl0aWVzKFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgQWNsQ2FwYWJpbGl0aWVzIHNvdXJjZSkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19BQ0xfQ0FQQUJJTElUSUVTKTsNCi0NCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQUNMQ0FQX1NVUFBPUlRFRF9QRVJNSVNTSU9OUywNCi0gICAgICAgICAgICAgICAgc291cmNlLmdldFN1cHBvcnRlZFBlcm1pc3Npb25zKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19BQ0xDQVBfQUNMX1BST1BBR0FUSU9OLCBzb3VyY2UuZ2V0QWNsUHJvcGFnYXRpb24oKSk7DQotICAgICAgICBpZiAoc291cmNlLmdldFBlcm1pc3Npb25zKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbkRlZmluaXRpb24gcGQgOiBzb3VyY2UuZ2V0UGVybWlzc2lvbnMoKSkgew0KLSAgICAgICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTlMpOw0KLQ0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9QRVJNSVNTSU9OX1BFUk1JU1NJT04sIHBkLmdldElkKCkpOw0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9QRVJNSVNTSU9OX0RFU0NSSVBUSU9OLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldERlc2NyaXB0aW9uKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBwZCk7DQotICAgICAgICAgICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTlMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0UGVybWlzc2lvbk1hcHBpbmcoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChQZXJtaXNzaW9uTWFwcGluZyBwbSA6IHNvdXJjZS5nZXRQZXJtaXNzaW9uTWFwcGluZygpLnZhbHVlcygpKSB7DQotICAgICAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9QRVJNSVNTSU9OX01BUFBJTkcpOw0KLQ0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9NQVBQSU5HX0tFWSwgcG0uZ2V0S2V5KCkpOw0KLSAgICAgICAgICAgICAgICBpZiAocG0uZ2V0UGVybWlzc2lvbnMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwZXJtIDogcG0uZ2V0UGVybWlzc2lvbnMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQUNMQ0FQX01BUFBJTkdfUEVSTUlTU0lPTiwgcGVybSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgcG0pOw0KLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfQUNMQ0FQX1BFUk1JU1NJT05fTUFQUElORyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsNCi0gICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0FDTF9DQVBBQklMSVRJRVMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUV4dGVuZGVkRmVhdHVyZXMoWG1sU2VyaWFsaXplciB3cml0ZXIsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBFeHRlbnNpb25GZWF0dXJlIHNvdXJjZSkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19FWFRFTkRFRF9GRUFUVVJFUyk7DQotDQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0ZFQVRVUkVfSUQsIHNvdXJjZS5nZXRJZCgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfRkVBVFVSRV9VUkwsIHNvdXJjZS5nZXRVcmwoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0ZFQVRVUkVfQ09NTU9OX05BTUUsIHNvdXJjZS5nZXRDb21tb25OYW1lKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19GRUFUVVJFX1ZFUlNJT05fTEFCRUwsIHNvdXJjZS5nZXRWZXJzaW9uTGFiZWwoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0ZFQVRVUkVfREVTQ1JJUFRJT04sIHNvdXJjZS5nZXREZXNjcmlwdGlvbigpKTsNCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0RmVhdHVyZURhdGEoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGRhdGEgOiBzb3VyY2UuZ2V0RmVhdHVyZURhdGEoKS5lbnRyeVNldCgpKSB7DQotICAgICAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX0ZFQVRVUkVfREFUQSk7DQotDQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfRkVBVFVSRV9EQVRBX0tFWSwgZGF0YS5nZXRLZXkoKSk7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfRkVBVFVSRV9EQVRBX1ZBTFVFLCBkYXRhLmdldFZhbHVlKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfRkVBVFVSRV9EQVRBKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOw0KLSAgICAgICAgd3JpdGVyLmVuZFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fRVhURU5ERURfRkVBVFVSRVMpOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIC0tLSBkZWZpbml0aW9uIHdyaXRlcnMgLS0tDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVR5cGVEZWZpbml0aW9uKFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIG5hbWVzcGFjZSwNCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsNCi0gICAgICAgICAgICBpZiAoc291cmNlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfSVRFTSkgew0KLSAgICAgICAgICAgICAgICBMT0cud2FybigiUmVjZWl2ZXIgb25seSB1bmRlcnN0YW5kcyBDTUlTIDEuMC4gSXQgbWF5IG5vdCBhYmxlIHRvIGhhbmRsZSBhbiBJdGVtIHR5cGUgZGVmaW5pdGlvbi4iKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWSkgew0KLSAgICAgICAgICAgICAgICBMT0cud2FybigiUmVjZWl2ZXIgb25seSB1bmRlcnN0YW5kcyBDTUlTIDEuMC4gSXQgbWF5IG5vdCBhYmxlIHRvIGhhbmRsZSBhIFNlY29uZGFyeSB0eXBlIGRlZmluaXRpb24uIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVyLnNldFByZWZpeChQUkVGSVhfWFNJLCBOQU1FU1BBQ0VfWFNJKTsNCi0gICAgICAgIHdyaXRlci5zdGFydFRhZyhuYW1lc3BhY2UsIFRBR19UWVBFKTsNCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIiIsIFhNTENvbnN0YW50cy5QUkVGSVhfWFNJLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1hTSSk7DQotDQotICAgICAgICBpZiAoc291cmNlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQpIHsNCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKE5BTUVTUEFDRV9YU0ksICJ0eXBlIiwgUFJFRklYX0NNSVMgKyAiOiIgKyBBVFRSX0RPQ1VNRU5UX1RZUEUpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19GT0xERVIpIHsNCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKE5BTUVTUEFDRV9YU0ksICJ0eXBlIiwgUFJFRklYX0NNSVMgKyAiOiIgKyBBVFRSX0ZPTERFUl9UWVBFKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQKSB7DQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZShOQU1FU1BBQ0VfWFNJLCAidHlwZSIsIFBSRUZJWF9DTUlTICsgIjoiICsgQVRUUl9SRUxBVElPTlNISVBfVFlQRSk7DQotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX1BPTElDWSkgew0KLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoTkFNRVNQQUNFX1hTSSwgInR5cGUiLCBQUkVGSVhfQ01JUyArICI6IiArIEFUVFJfUE9MSUNZX1RZUEUpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19JVEVNKSB7DQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZShOQU1FU1BBQ0VfWFNJLCAidHlwZSIsIFBSRUZJWF9DTUlTICsgIjoiICsgQVRUUl9JVEVNX1RZUEUpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkpIHsNCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKE5BTUVTUEFDRV9YU0ksICJ0eXBlIiwgUFJFRklYX0NNSVMgKyAiOiIgKyBBVFRSX1NFQ09OREFSWV9UWVBFKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJUeXBlIGRlZmluaXRpb24gaGFzIG5vIGJhc2UgdHlwZSBpZCEiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9JRCwgc291cmNlLmdldElkKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0xPQ0FMTkFNRSwgc291cmNlLmdldExvY2FsTmFtZSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9MT0NBTE5BTUVTUEFDRSwgc291cmNlLmdldExvY2FsTmFtZXNwYWNlKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0RJU1BMQVlOQU1FLCBzb3VyY2UuZ2V0RGlzcGxheU5hbWUoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfUVVFUllOQU1FLCBzb3VyY2UuZ2V0UXVlcnlOYW1lKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0RFU0NSSVBUSU9OLCBzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfQkFTRV9JRCwgc291cmNlLmdldEJhc2VUeXBlSWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfUEFSRU5UX0lELCBzb3VyY2UuZ2V0UGFyZW50VHlwZUlkKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0NSRUFUQUJMRSwgc291cmNlLmlzQ3JlYXRhYmxlKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0ZJTEVBQkxFLCBzb3VyY2UuaXNGaWxlYWJsZSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9RVUVSWUFCTEUsIHNvdXJjZS5pc1F1ZXJ5YWJsZSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9GVUxMVEVYVF9JTkRFWEVELCBzb3VyY2UuaXNGdWxsdGV4dEluZGV4ZWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfSU5DTFVERV9JTl9TVVBFUlRZUEVfUVVFUlksDQotICAgICAgICAgICAgICAgIHNvdXJjZS5pc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9DT05UUk9MQUJMRV9QT0xJQ1ksIHNvdXJjZS5pc0NvbnRyb2xsYWJsZVBvbGljeSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9DT05UUk9MQUJMRV9BQ0wsIHNvdXJjZS5pc0NvbnRyb2xsYWJsZUFjbCgpKTsNCi0gICAgICAgIGlmIChjbWlzVmVyc2lvbiAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCAmJiBzb3VyY2UuZ2V0VHlwZU11dGFiaWxpdHkoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgVHlwZU11dGFiaWxpdHkgdG0gPSBzb3VyY2UuZ2V0VHlwZU11dGFiaWxpdHkoKTsNCi0NCi0gICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX1RZUEVfTVVUQUJJTElUWSk7DQotDQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX1RZUEVfTVVUQUJJTElUWV9DUkVBVEUsIHRtLmNhbkNyZWF0ZSgpKTsNCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZX1VQREFURSwgdG0uY2FuVXBkYXRlKCkpOw0KLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9UWVBFX01VVEFCSUxJVFlfREVMRVRFLCB0bS5jYW5EZWxldGUoKSk7DQotDQotICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgdG0pOw0KLSAgICAgICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX1RZUEVfTVVUQUJJTElUWSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoc291cmNlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcGQgOiBzb3VyY2UuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnZhbHVlcygpKSB7DQotICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHlEZWZpbml0aW9uKHdyaXRlciwgY21pc1ZlcnNpb24sIHBkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgew0KLSAgICAgICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gZG9jRGVmID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pIHNvdXJjZTsNCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfVkVSU0lPTkFCTEUsIGRvY0RlZi5pc1ZlcnNpb25hYmxlKCkpOw0KLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9DT05URU5UU1RSRUFNX0FMTE9XRUQsDQotICAgICAgICAgICAgICAgICAgICBkb2NEZWYuZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHsNCi0gICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiByZWxEZWYgPSAoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHNvdXJjZTsNCi0gICAgICAgICAgICBpZiAocmVsRGVmLmdldEFsbG93ZWRTb3VyY2VUeXBlSWRzKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IHJlbERlZi5nZXRBbGxvd2VkU291cmNlVHlwZUlkcygpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9BTExPV0VEX1NPVVJDRV9UWVBFUywgaWQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChyZWxEZWYuZ2V0QWxsb3dlZFRhcmdldFR5cGVJZHMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogcmVsRGVmLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0FMTE9XRURfVEFSR0VUX1RZUEVTLCBpZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOw0KLSAgICAgICAgd3JpdGVyLmVuZFRhZyhuYW1lc3BhY2UsIFRBR19UWVBFKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVQcm9wZXJ0eURlZmluaXRpb24oWG1sU2VyaWFsaXplciB3cml0ZXIsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLA0KLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc291cmNlLmdldFByb3BlcnR5VHlwZSgpID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5IHR5cGUgZm9yIHByb3BlcnR5IGRlZmluaXRpb24gJyIgKyBzb3VyY2UuZ2V0SWQoKSArICInIGlzIG5vdCBzZXQhIik7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgdGFnTmFtZSA9ICIiOw0KLSAgICAgICAgc3dpdGNoIChzb3VyY2UuZ2V0UHJvcGVydHlUeXBlKCkpIHsNCi0gICAgICAgIGNhc2UgU1RSSU5HOg0KLSAgICAgICAgICAgIHRhZ05hbWUgPSBUQUdfVFlQRV9QUk9QX0RFRl9TVFJJTkc7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIElEOg0KLSAgICAgICAgICAgIHRhZ05hbWUgPSBUQUdfVFlQRV9QUk9QX0RFRl9JRDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgSU5URUdFUjoNCi0gICAgICAgICAgICB0YWdOYW1lID0gVEFHX1RZUEVfUFJPUF9ERUZfSU5URUdFUjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgQk9PTEVBTjoNCi0gICAgICAgICAgICB0YWdOYW1lID0gVEFHX1RZUEVfUFJPUF9ERUZfQk9PTEVBTjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgREFURVRJTUU6DQotICAgICAgICAgICAgdGFnTmFtZSA9IFRBR19UWVBFX1BST1BfREVGX0RBVEVUSU1FOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBERUNJTUFMOg0KLSAgICAgICAgICAgIHRhZ05hbWUgPSBUQUdfVFlQRV9QUk9QX0RFRl9ERUNJTUFMOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBIVE1MOg0KLSAgICAgICAgICAgIHRhZ05hbWUgPSBUQUdfVFlQRV9QUk9QX0RFRl9IVE1MOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBVUkk6DQotICAgICAgICAgICAgdGFnTmFtZSA9IFRBR19UWVBFX1BST1BfREVGX1VSSTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQcm9wZXJ0eSBkZWZpbnRpb24gaGFzIG5vIHByb3BlcnR5IHR5cGUhIik7DQotICAgICAgICB9DQotICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIHRhZ05hbWUpOw0KLQ0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX0lELCBzb3VyY2UuZ2V0SWQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfTE9DQUxOQU1FLCBzb3VyY2UuZ2V0TG9jYWxOYW1lKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX0xPQ0FMTkFNRVNQQUNFLA0KLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0TG9jYWxOYW1lc3BhY2UoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfRElTUExBWU5BTUUsIHNvdXJjZS5nZXREaXNwbGF5TmFtZSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9RVUVSWU5BTUUsIHNvdXJjZS5nZXRRdWVyeU5hbWUoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfREVTQ1JJUFRJT04sIHNvdXJjZS5nZXREZXNjcmlwdGlvbigpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9QUk9QRVJUWV9UWVBFLCBzb3VyY2UuZ2V0UHJvcGVydHlUeXBlKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX0NBUkRJTkFMSVRZLCBzb3VyY2UuZ2V0Q2FyZGluYWxpdHkoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfVVBEQVRBQklMSVRZLCBzb3VyY2UuZ2V0VXBkYXRhYmlsaXR5KCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX0lOSEVSSVRFRCwgc291cmNlLmlzSW5oZXJpdGVkKCkpOw0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX1JFUVVJUkVELCBzb3VyY2UuaXNSZXF1aXJlZCgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9RVUVSWUFCTEUsIHNvdXJjZS5pc1F1ZXJ5YWJsZSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9PUkRFUkFCTEUsIHNvdXJjZS5pc09yZGVyYWJsZSgpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9PUEVOQ0hPSUNFLCBzb3VyY2UuaXNPcGVuQ2hvaWNlKCkpOw0KLQ0KLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbikgew0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiBkZWYgPSAoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKSBzb3VyY2U7DQotDQotICAgICAgICAgICAgaWYgKGRlZi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHkod3JpdGVyLCBuZXcgUHJvcGVydHlTdHJpbmdJbXBsKChTdHJpbmcpIG51bGwsIGRlZi5nZXREZWZhdWx0VmFsdWUoKSksIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfTUFYX0xFTkdUSCwgZGVmLmdldE1heExlbmd0aCgpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlJZERlZmluaXRpb24pIHsNCi0gICAgICAgICAgICBQcm9wZXJ0eUlkRGVmaW5pdGlvbiBkZWYgPSAoUHJvcGVydHlJZERlZmluaXRpb24pIHNvdXJjZTsNCi0NCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIG5ldyBQcm9wZXJ0eUlkSW1wbCgoU3RyaW5nKSBudWxsLCBkZWYuZ2V0RGVmYXVsdFZhbHVlKCkpLCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHsNCi0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uIGRlZiA9IChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSBzb3VyY2U7DQotDQotICAgICAgICAgICAgaWYgKGRlZi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHkod3JpdGVyLCBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbCgoU3RyaW5nKSBudWxsLCBkZWYuZ2V0RGVmYXVsdFZhbHVlKCkpLCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX01BWF9WQUxVRSwgZGVmLmdldE1heFZhbHVlKCkpOw0KLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9NSU5fVkFMVUUsIGRlZi5nZXRNaW5WYWx1ZSgpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbikgew0KLSAgICAgICAgICAgIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24gZGVmID0gKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24pIHNvdXJjZTsNCi0NCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIG5ldyBQcm9wZXJ0eUJvb2xlYW5JbXBsKChTdHJpbmcpIG51bGwsIGRlZi5nZXREZWZhdWx0VmFsdWUoKSksIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHsNCi0gICAgICAgICAgICBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbiBkZWYgPSAoUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHNvdXJjZTsNCi0NCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIG5ldyBQcm9wZXJ0eURhdGVUaW1lSW1wbCgoU3RyaW5nKSBudWxsLCBkZWYuZ2V0RGVmYXVsdFZhbHVlKCkpLCB0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX1JFU09MVVRJT04sDQotICAgICAgICAgICAgICAgICAgICBkZWYuZ2V0RGF0ZVRpbWVSZXNvbHV0aW9uKCkpOw0KLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbiBkZWYgPSAoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgc291cmNlOw0KLQ0KLSAgICAgICAgICAgIGlmIChkZWYuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5KHdyaXRlciwgbmV3IFByb3BlcnR5RGVjaW1hbEltcGwoKFN0cmluZykgbnVsbCwgZGVmLmdldERlZmF1bHRWYWx1ZSgpKSwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9NQVhfVkFMVUUsIGRlZi5nZXRNYXhWYWx1ZSgpKTsNCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfTUlOX1ZBTFVFLCBkZWYuZ2V0TWluVmFsdWUoKSk7DQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX1BSRUNJU0lPTiwgZGVmLmdldFByZWNpc2lvbigpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlIdG1sRGVmaW5pdGlvbikgew0KLSAgICAgICAgICAgIFByb3BlcnR5SHRtbERlZmluaXRpb24gZGVmID0gKFByb3BlcnR5SHRtbERlZmluaXRpb24pIHNvdXJjZTsNCi0NCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIG5ldyBQcm9wZXJ0eUh0bWxJbXBsKChTdHJpbmcpIG51bGwsIGRlZi5nZXREZWZhdWx0VmFsdWUoKSksIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlVcmlEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgUHJvcGVydHlVcmlEZWZpbml0aW9uIGRlZiA9IChQcm9wZXJ0eVVyaURlZmluaXRpb24pIHNvdXJjZTsNCi0NCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIG5ldyBQcm9wZXJ0eVVyaUltcGwoKFN0cmluZykgbnVsbCwgZGVmLmdldERlZmF1bHRWYWx1ZSgpKSwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRDaG9pY2VzKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoQ2hvaWNlPD8+IGMgOiBzb3VyY2UuZ2V0Q2hvaWNlcygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlQ2hvaWNlKHdyaXRlciwgc291cmNlLmdldFByb3BlcnR5VHlwZSgpLCBjKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHNvdXJjZSk7DQotICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCB0YWdOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQ2hvaWNlKFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBQcm9wZXJ0eVR5cGUgcHJvcFR5cGUsIENob2ljZTw/PiBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRSk7DQotDQotICAgICAgICBpZiAoc291cmNlLmdldERpc3BsYXlOYW1lKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdyaXRlci5hdHRyaWJ1dGUoIiIsIEFUVFJfUFJPUEVSVFlfVFlQRV9DSE9JQ0VfRElTUExBWU5BTUUsIHNvdXJjZS5nZXREaXNwbGF5TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0VmFsdWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgc3dpdGNoIChwcm9wVHlwZSkgew0KLSAgICAgICAgICAgIGNhc2UgU1RSSU5HOg0KLSAgICAgICAgICAgIGNhc2UgSUQ6DQotICAgICAgICAgICAgY2FzZSBIVE1MOg0KLSAgICAgICAgICAgIGNhc2UgVVJJOg0KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IChMaXN0PFN0cmluZz4pIHNvdXJjZS5nZXRWYWx1ZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFLCB2YWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBJTlRFR0VSOg0KLSAgICAgICAgICAgICAgICBmb3IgKEJpZ0ludGVnZXIgdmFsdWUgOiAoTGlzdDxCaWdJbnRlZ2VyPikgc291cmNlLmdldFZhbHVlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0VfVkFMVUUsIHZhbHVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIEJPT0xFQU46DQotICAgICAgICAgICAgICAgIGZvciAoQm9vbGVhbiB2YWx1ZSA6IChMaXN0PEJvb2xlYW4+KSBzb3VyY2UuZ2V0VmFsdWUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRV9WQUxVRSwgdmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgREFURVRJTUU6DQotICAgICAgICAgICAgICAgIGZvciAoR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUgOiAoTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4pIHNvdXJjZS5nZXRWYWx1ZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFLCB2YWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBERUNJTUFMOg0KLSAgICAgICAgICAgICAgICBmb3IgKEJpZ0RlY2ltYWwgdmFsdWUgOiAoTGlzdDxCaWdEZWNpbWFsPikgc291cmNlLmdldFZhbHVlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0VfVkFMVUUsIHZhbHVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hvaWNlKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoQ2hvaWNlPD8+IGMgOiBzb3VyY2UuZ2V0Q2hvaWNlKCkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVDaG9pY2Uod3JpdGVyLCBwcm9wVHlwZSwgYyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIC0tLSBvYmplY3Qgd3JpdGVycyAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlT2JqZWN0KFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIG5hbWVzcGFjZSwgT2JqZWN0RGF0YSBzb3VyY2UpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHdyaXRlT2JqZWN0KHdyaXRlciwgY21pc1ZlcnNpb24sIGZhbHNlLCBUQUdfT0JKRUNULCBuYW1lc3BhY2UsIHNvdXJjZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlT2JqZWN0KFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgYm9vbGVhbiByb290LCBTdHJpbmcgbmFtZSwNCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlLCBPYmplY3REYXRhIHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChjbWlzVmVyc2lvbiA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgew0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19JVEVNKSB7DQotICAgICAgICAgICAgICAgIExPRy53YXJuKCJSZWNlaXZlciBvbmx5IHVuZGVyc3RhbmRzIENNSVMgMS4wLiBJdCBtYXkgbm90IGJlIGFibGUgdG8gaGFuZGxlIGFuIEl0ZW0gb2JqZWN0LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyb290KSB7DQotICAgICAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKE5BTUVTUEFDRV9DTUlTLCBuYW1lKTsNCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCIiLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMpOw0KLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5BTUVTUEFDRV9DTUlTOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcobmFtZXNwYWNlLCBuYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0UHJvcGVydGllcygpICE9IG51bGwpIHsNCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBzb3VyY2UuZ2V0UHJvcGVydGllcygpOw0KLQ0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX09CSkVDVF9QUk9QRVJUSUVTKTsNCi0NCi0gICAgICAgICAgICBpZiAocHJvcGVydGllcy5nZXRQcm9wZXJ0eUxpc3QoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5IDogcHJvcGVydGllcy5nZXRQcm9wZXJ0eUxpc3QoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIHByb3BlcnR5LCBmYWxzZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgd3JpdGVyLmVuZFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX09CSkVDVF9QUk9QRVJUSUVTKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0QWxsb3dhYmxlQWN0aW9ucygpICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZUFsbG93YWJsZUFjdGlvbnMod3JpdGVyLCBjbWlzVmVyc2lvbiwgZmFsc2UsIHNvdXJjZS5nZXRBbGxvd2FibGVBY3Rpb25zKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRSZWxhdGlvbnNoaXBzKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSByZWwgOiBzb3VyY2UuZ2V0UmVsYXRpb25zaGlwcygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChyZWwgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPYmplY3Qod3JpdGVyLCBjbWlzVmVyc2lvbiwgZmFsc2UsIFRBR19PQkpFQ1RfUkVMQVRJT05TSElQLCBOQU1FU1BBQ0VfQ01JUywgcmVsKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIENoYW5nZUV2ZW50SW5mbyBpbmZvID0gc291cmNlLmdldENoYW5nZUV2ZW50SW5mbygpOw0KLQ0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX09CSkVDVF9DSEFOR0VfRVZFTlRfSU5GTyk7DQotDQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DSEFOR0VfRVZFTlRfVFlQRSwgaW5mby5nZXRDaGFuZ2VUeXBlKCkpOw0KLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0hBTkdFX0VWRU5UX1RJTUUsIGluZm8uZ2V0Q2hhbmdlVGltZSgpKTsNCi0NCi0gICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBpbmZvKTsNCi0gICAgICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfT0JKRUNUX0NIQU5HRV9FVkVOVF9JTkZPKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0QWNsKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdyaXRlQWNsKHdyaXRlciwgY21pc1ZlcnNpb24sIGZhbHNlLCBzb3VyY2UuZ2V0QWNsKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19PQkpFQ1RfRVhBQ1RfQUNMLCBzb3VyY2UuaXNFeGFjdEFjbCgpKTsNCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0UG9saWN5SWRzKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFBvbGljeUlkTGlzdCBwaWRzID0gc291cmNlLmdldFBvbGljeUlkcygpOw0KLQ0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX09CSkVDVF9QT0xJQ1lfSURTKTsNCi0NCi0gICAgICAgICAgICBpZiAocGlkcy5nZXRQb2xpY3lJZHMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogcGlkcy5nZXRQb2xpY3lJZHMoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BPTElDWV9JRCwgaWQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHBpZHMpOw0KLSAgICAgICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19PQkpFQ1RfUE9MSUNZX0lEUyk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoc291cmNlLmdldFJlbmRpdGlvbnMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChSZW5kaXRpb25EYXRhIHJlbmQgOiBzb3VyY2UuZ2V0UmVuZGl0aW9ucygpKSB7DQotICAgICAgICAgICAgICAgIGlmIChyZW5kICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX09CSkVDVF9SRU5ESVRJT04pOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRU5ESVRJT05fU1RSRUFNX0lELCByZW5kLmdldFN0cmVhbUlkKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRU5ESVRJT05fTUlNRVRZUEUsIHJlbmQuZ2V0TWltZVR5cGUoKSk7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFTkRJVElPTl9MRU5HVEgsIHJlbmQuZ2V0QmlnTGVuZ3RoKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRU5ESVRJT05fS0lORCwgcmVuZC5nZXRLaW5kKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRU5ESVRJT05fVElUTEUsIHJlbmQuZ2V0VGl0bGUoKSk7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFTkRJVElPTl9IRUlHSFQsIHJlbmQuZ2V0QmlnSGVpZ2h0KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRU5ESVRJT05fV0lEVEgsIHJlbmQuZ2V0QmlnV2lkdGgoKSk7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFTkRJVElPTl9ET0NVTUVOVF9JRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZC5nZXRSZW5kaXRpb25Eb2N1bWVudElkKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgcmVuZCk7DQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfT0JKRUNUX1JFTkRJVElPTik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOw0KLSAgICAgICAgd3JpdGVyLmVuZFRhZyhuYW1lc3BhY2UsIG5hbWUpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVQcm9wZXJ0eShYbWxTZXJpYWxpemVyIHdyaXRlciwgUHJvcGVydHlEYXRhPD8+IHNvdXJjZSwgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZSkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUU7DQotICAgICAgICBpZiAoaXNEZWZhdWx0VmFsdWUpIHsNCi0gICAgICAgICAgICB0YWdOYW1lID0gVEFHX1BST1BFUlRZX1RZUEVfREVBVUxUX1ZBTFVFOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpIHsNCi0gICAgICAgICAgICAgICAgdGFnTmFtZSA9IFRBR19QUk9QX1NUUklORzsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpIHsNCi0gICAgICAgICAgICAgICAgdGFnTmFtZSA9IFRBR19QUk9QX0lEOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlJbnRlZ2VyKSB7DQotICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBUQUdfUFJPUF9JTlRFR0VSOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuKSB7DQotICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBUQUdfUFJPUF9CT09MRUFOOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZSkgew0KLSAgICAgICAgICAgICAgICB0YWdOYW1lID0gVEFHX1BST1BfREFURVRJTUU7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY2ltYWwpIHsNCi0gICAgICAgICAgICAgICAgdGFnTmFtZSA9IFRBR19QUk9QX0RFQ0lNQUw7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWwpIHsNCi0gICAgICAgICAgICAgICAgdGFnTmFtZSA9IFRBR19QUk9QX0hUTUw7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaSkgew0KLSAgICAgICAgICAgICAgICB0YWdOYW1lID0gVEFHX1BST1BfVVJJOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eSEiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIHRhZ05hbWUpOw0KLQ0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRJZCgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKG51bGwsIEFUVFJfUFJPUEVSVFlfSUQsIHNvdXJjZS5nZXRJZCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0RGlzcGxheU5hbWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZShudWxsLCBBVFRSX1BST1BFUlRZX0RJU1BMQVlOQU1FLCBzb3VyY2UuZ2V0RGlzcGxheU5hbWUoKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoc291cmNlLmdldExvY2FsTmFtZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKG51bGwsIEFUVFJfUFJPUEVSVFlfTE9DQUxOQU1FLCBzb3VyY2UuZ2V0TG9jYWxOYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRRdWVyeU5hbWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZShudWxsLCBBVFRSX1BST1BFUlRZX1FVRVJZTkFNRSwgc291cmNlLmdldFF1ZXJ5TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICgoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpIHx8IChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkKSB8fCAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlIdG1sKQ0KLSAgICAgICAgICAgICAgICB8fCAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlVcmkpKSB7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IChMaXN0PFN0cmluZz4pIHNvdXJjZS5nZXRWYWx1ZXMoKTsNCi0gICAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVkFMVUUsIHZhbHVlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlJbnRlZ2VyKSB7DQotICAgICAgICAgICAgTGlzdDxCaWdJbnRlZ2VyPiB2YWx1ZXMgPSAoKFByb3BlcnR5SW50ZWdlcikgc291cmNlKS5nZXRWYWx1ZXMoKTsNCi0gICAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIHZhbHVlIDogdmFsdWVzKSB7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1ZBTFVFLCB2YWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5Qm9vbGVhbikgew0KLSAgICAgICAgICAgIExpc3Q8Qm9vbGVhbj4gdmFsdWVzID0gKChQcm9wZXJ0eUJvb2xlYW4pIHNvdXJjZSkuZ2V0VmFsdWVzKCk7DQotICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZvciAoQm9vbGVhbiB2YWx1ZSA6IHZhbHVlcykgew0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9WQUxVRSwgdmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lKSB7DQotICAgICAgICAgICAgTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gdmFsdWVzID0gKChQcm9wZXJ0eURhdGVUaW1lKSBzb3VyY2UpLmdldFZhbHVlcygpOw0KLSAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBmb3IgKEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlIDogdmFsdWVzKSB7DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1ZBTFVFLCB2YWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbCkgew0KLSAgICAgICAgICAgIExpc3Q8QmlnRGVjaW1hbD4gdmFsdWVzID0gKChQcm9wZXJ0eURlY2ltYWwpIHNvdXJjZSkuZ2V0VmFsdWVzKCk7DQotICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCB2YWx1ZSA6IHZhbHVlcykgew0KLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9WQUxVRSwgdmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsNCi0gICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIHRhZ05hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUFsbG93YWJsZUFjdGlvbnMoWG1sU2VyaWFsaXplciB3cml0ZXIsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBib29sZWFuIHJvb3QsDQotICAgICAgICAgICAgQWxsb3dhYmxlQWN0aW9ucyBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAocm9vdCkgew0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgImFsbG93YWJsZUFjdGlvbnMiKTsNCi0gICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKCIiLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19PQkpFQ1RfQUxMT1dBQkxFX0FDVElPTlMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoQWN0aW9uIGFjdGlvbiA6IEFjdGlvbi52YWx1ZXMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoc291cmNlLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhhY3Rpb24pKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IEFjdGlvbi5DQU5fQ1JFQVRFX0lURU0gJiYgY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiUmVjZWl2ZXIgb25seSB1bmRlcnN0YW5kcyBDTUlTIDEuMCBidXQgdGhlIEFsbG93YWJsZSBBY3Rpb25zIGNvbnRhaW4gdGhlIGNhbkNyZWF0ZUl0ZW0gYWN0aW9uLiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgY2FuQ3JlYXRlSXRlbSBhY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBBbGxvd2FibGUgQWN0aW9ucy4iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBhY3Rpb24udmFsdWUoKSwgQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHNvdXJjZSk7DQotICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfT0JKRUNUX0FMTE9XQUJMRV9BQ1RJT05TKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVBY2woWG1sU2VyaWFsaXplciB3cml0ZXIsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBib29sZWFuIHJvb3QsIEFjbCBzb3VyY2UpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChyb290KSB7DQotICAgICAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKE5BTUVTUEFDRV9DTUlTLCAiYWNsIik7DQotICAgICAgICAgICAgd3JpdGVyLmF0dHJpYnV0ZSgiIiwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfT0JKRUNUX0FDTCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc291cmNlLmdldEFjZXMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChBY2UgYWNlIDogc291cmNlLmdldEFjZXMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTF9QRVJNSVNTSVNPTlMpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjZS5nZXRQcmluY2lwYWwoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJpbmNpcGFsIHByaW5jaXBhbCA9IGFjZS5nZXRQcmluY2lwYWwoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19BQ0VfUFJJTkNJUEFMKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDRV9QUklOQ0lQQUxfSUQsIHByaW5jaXBhbC5nZXRJZCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBwcmluY2lwYWwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19BQ0VfUFJJTkNJUEFMKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChhY2UuZ2V0UGVybWlzc2lvbnMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGVybSA6IGFjZS5nZXRQZXJtaXNzaW9ucygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQUNFX1BFUk1JU1NJT05TLCBwZXJtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDRV9JU19ESVJFQ1QsIGFjZS5pc0RpcmVjdCgpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIGFjZSk7DQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZW5kVGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfQUNMX1BFUk1JU1NJU09OUyk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOw0KLSAgICAgICAgd3JpdGVyLmVuZFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX09CSkVDVF9BQ0wpOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0NCi0gICAgLy8gLS0tIHF1ZXJ5IC0tLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVF1ZXJ5KFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgUXVlcnlUeXBlSW1wbCBzb3VyY2UpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlci5zdGFydFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZKTsNCi0gICAgICAgIHdyaXRlci5hdHRyaWJ1dGUobnVsbCwgWE1MQ29uc3RhbnRzLlBSRUZJWF9DTUlTLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMpOw0KLQ0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19RVUVSWV9TVEFURU1FTlQsIHNvdXJjZS5nZXRTdGF0ZW1lbnQoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZX1NFQVJDSEFMTFZFUlNJT05TLCBzb3VyY2UuZ2V0U2VhcmNoQWxsVmVyc2lvbnMoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZX0lOQ0xVREVBTExPV0FCTEVBQ1RJT05TLA0KLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZX0lOQ0xVREVSRUxBVElPTlNISVBTLA0KLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoKSk7DQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZX1JFTkRJVElPTkZJTFRFUiwgc291cmNlLmdldFJlbmRpdGlvbkZpbHRlcigpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUVVFUllfTUFYSVRFTVMsIHNvdXJjZS5nZXRNYXhJdGVtcygpKTsNCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUVVFUllfU0tJUENPVU5ULCBzb3VyY2UuZ2V0U2tpcENvdW50KCkpOw0KLQ0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsNCi0gICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19RVUVSWSk7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyAtLS0gYnVsayB1cGRhdGUgLS0tDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQnVsa1VwZGF0ZShYbWxTZXJpYWxpemVyIHdyaXRlciwgU3RyaW5nIG5hbWVzcGFjZSwgQnVsa1VwZGF0ZUltcGwgYnVsa1VwZGF0ZSkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGJ1bGtVcGRhdGUgPT0gbnVsbCB8fCBidWxrVXBkYXRlLmdldE9iamVjdElkQW5kQ2hhbmdlVG9rZW4oKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKG5hbWVzcGFjZSwgVEFHX0JVTEtfVVBEQVRFKTsNCi0NCi0gICAgICAgIGZvciAoQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4gaWRBbmRUb2tlbiA6IGJ1bGtVcGRhdGUuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpKSB7DQotICAgICAgICAgICAgaWYgKGlkQW5kVG9rZW4gPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgd3JpdGVyLnN0YXJ0VGFnKE5BTUVTUEFDRV9DTUlTLCBUQUdfQlVMS19VUERBVEVfSURfQU5EX1RPS0VOKTsNCi0NCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0lEQU5EVE9LRU5fSUQsIGlkQW5kVG9rZW4uZ2V0SWQoKSk7DQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19JREFORFRPS0VOX0NIQU5HRVRPS0VOLCBpZEFuZFRva2VuLmdldENoYW5nZVRva2VuKCkpOw0KLQ0KLSAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIGlkQW5kVG9rZW4pOw0KLSAgICAgICAgICAgIHdyaXRlci5lbmRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19CVUxLX1VQREFURV9JRF9BTkRfVE9LRU4pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ1bGtVcGRhdGUuZ2V0UHJvcGVydGllcygpICE9IG51bGwpIHsNCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBidWxrVXBkYXRlLmdldFByb3BlcnRpZXMoKTsNCi0gICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcoTkFNRVNQQUNFX0NNSVMsIFRBR19CVUxLX1VQREFURV9QUk9QRVJUSUVTKTsNCi0NCi0gICAgICAgICAgICBpZiAocHJvcGVydGllcy5nZXRQcm9wZXJ0eUxpc3QoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5IDogcHJvcGVydGllcy5nZXRQcm9wZXJ0eUxpc3QoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIHByb3BlcnR5LCBmYWxzZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgcHJvcGVydGllcyk7DQotICAgICAgICAgICAgd3JpdGVyLmVuZFRhZyhOQU1FU1BBQ0VfQ01JUywgVEFHX0JVTEtfVVBEQVRFX1BST1BFUlRJRVMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ1bGtVcGRhdGUuZ2V0QWRkU2Vjb25kYXJ5VHlwZUlkcygpICE9IG51bGwpIHsNCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGJ1bGtVcGRhdGUuZ2V0QWRkU2Vjb25kYXJ5VHlwZUlkcygpKSB7DQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQlVMS19VUERBVEVfQUREX1NFQ09OREFSWV9UWVBFUywgaWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChidWxrVXBkYXRlLmdldFJlbW92ZVNlY29uZGFyeVR5cGVJZHMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBidWxrVXBkYXRlLmdldFJlbW92ZVNlY29uZGFyeVR5cGVJZHMoKSkgew0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0JVTEtfVVBEQVRFX1JFTU9WRV9TRUNPTkRBUllfVFlQRVMsIGlkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZXIuZW5kVGFnKG5hbWVzcGFjZSwgVEFHX0JVTEtfVVBEQVRFKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIC0tLSBleHRlbnNpb24gd3JpdGVycyAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVFeHRlbnNpb25zKFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBFeHRlbnNpb25zRGF0YSBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICBMaW5rZWRMaXN0PFN0cmluZz4gbnMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7DQotDQotICAgICAgICBpZiAoc291cmNlLmdldEV4dGVuc2lvbnMoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBlbGVtZW50IDogc291cmNlLmdldEV4dGVuc2lvbnMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbkVsZW1lbnQod3JpdGVyLCBlbGVtZW50LCBucyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVFeHRlbnNpb25FbGVtZW50KFhtbFNlcmlhbGl6ZXIgd3JpdGVyLCBDbWlzRXh0ZW5zaW9uRWxlbWVudCBzb3VyY2UsIExpbmtlZExpc3Q8U3RyaW5nPiBucykNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5nZXROYW1lKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOw0KLSAgICAgICAgLy8gYm9vbGVhbiBhZGRlZE5hbWVzcGFjZSA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXROYW1lc3BhY2UoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgKiBTdHJpbmcgcHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChzb3VyY2UuZ2V0TmFtZXNwYWNlKCksIGZhbHNlKTsNCi0gICAgICAgICAgICAgKiBpZiAocHJlZml4ID09IG51bGwpIHsgaW50IHAgPSBucy5pbmRleE9mKHNvdXJjZS5nZXROYW1lc3BhY2UoKSk7DQotICAgICAgICAgICAgICogDQotICAgICAgICAgICAgICogaWYgKHAgPT0gLTEpIHsgcHJlZml4ID0gImUiICsgKG5zLnNpemUoKSArIDEpOw0KLSAgICAgICAgICAgICAqIG5zLmFkZChzb3VyY2UuZ2V0TmFtZXNwYWNlKCkpOyBhZGRlZE5hbWVzcGFjZSA9IHRydWU7IH0gZWxzZSB7DQotICAgICAgICAgICAgICogcHJlZml4ID0gImUiICsgKHAgKyAxKTsgfSB9DQotICAgICAgICAgICAgICovDQotDQotICAgICAgICAgICAgbmFtZXNwYWNlID0gc291cmNlLmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhzb3VyY2UuZ2V0TmFtZXNwYWNlKCksIHNvdXJjZS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogaWYgKGFkZGVkTmFtZXNwYWNlKSB7IHdyaXRlci5hdHRyaWJ1dGUoIiIsIHByZWZpeCwNCi0gICAgICAgICAgICAgKiBzb3VyY2UuZ2V0TmFtZXNwYWNlKCkpOyB9DQotICAgICAgICAgICAgICovDQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhudWxsLCBzb3VyY2UuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpIHsNCi0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gYXR0ciA6IHNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZW50cnlTZXQoKSkgew0KLSAgICAgICAgICAgICAgICB3cml0ZXIuYXR0cmlidXRlKG51bGwsIGF0dHIuZ2V0S2V5KCksIGF0dHIuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRWYWx1ZSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3cml0ZXIudGV4dChzb3VyY2UuZ2V0VmFsdWUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hpbGRyZW4oKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZvciAoQ21pc0V4dGVuc2lvbkVsZW1lbnQgY2hpbGQgOiBzb3VyY2UuZ2V0Q2hpbGRyZW4oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25FbGVtZW50KHdyaXRlciwgY2hpbGQsIG5zKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlci5lbmRUYWcobmFtZXNwYWNlLCBzb3VyY2UuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBpZiAoYWRkZWROYW1lc3BhY2UpIHsgbnMucmVtb3ZlTGFzdCgpOyB9DQotICAgICAgICAgKi8NCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gLS0tIHBhcnNlcnMgLS0tDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnlJbmZvIGNvbnZlcnRSZXBvc2l0b3J5SW5mbyhYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIFJFUE9TSVRPUllfSU5GT19QQVJTRVIud2FsayhwYXJzZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb24gY29udmVydFR5cGVEZWZpbml0aW9uKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gVFlQRV9ERUZfUEFSU0VSLndhbGsocGFyc2VyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdERhdGEgY29udmVydE9iamVjdChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIE9CSkVDVF9QQVJTRVIud2FsayhwYXJzZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUXVlcnlUeXBlSW1wbCBjb252ZXJ0UXVlcnkoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBRVUVSWV9QQVJTRVIud2FsayhwYXJzZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQWxsb3dhYmxlQWN0aW9ucyBjb252ZXJ0QWxsb3dhYmxlQWN0aW9ucyhYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIEFMTE9XQUJMRV9BQ1RJT05TX1BBUlNFUi53YWxrKHBhcnNlcik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBBY2wgY29udmVydEFjbChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIEFDTF9QQVJTRVIud2FsayhwYXJzZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQnVsa1VwZGF0ZUltcGwgY29udmVydEJ1bGtVcGRhdGUoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBCVUxLX1VQREFURV9QQVJTRVIud2FsayhwYXJzZXIpOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyAtLS0gcmVwb3NpdG9yeSBpbmZvIHBhcnNlciAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxSZXBvc2l0b3J5SW5mb0ltcGw+IFJFUE9TSVRPUllfSU5GT19QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFJlcG9zaXRvcnlJbmZvSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBSZXBvc2l0b3J5SW5mb0ltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIFJlcG9zaXRvcnlJbmZvSW1wbCB0YXJnZXQpDQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19JRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJZChyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19OQU1FKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE5hbWUocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fREVTQ1JJUFRJT04pKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVzY3JpcHRpb24ocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fVkVORE9SKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFZlbmRvck5hbWUocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fUFJPRFVDVCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQcm9kdWN0TmFtZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19QUk9EVUNUX1ZFUlNJT04pKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJvZHVjdFZlcnNpb24ocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fUk9PVF9GT0xERVJfSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Um9vdEZvbGRlcihyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19DSEFOR0VfTE9HX1RPS0VOKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldExhdGVzdENoYW5nZUxvZ1Rva2VuKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX0NBUEFCSUxJVElFUykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYXBhYmlsaXRpZXMoQ0FQQUJJTElUSUVTX1BBUlNFUi53YWxrKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX0FDTF9DQVBBQklMSVRJRVMpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QWNsQ2FwYWJpbGl0aWVzKEFDTF9DQVBBQklMSVRJRVNfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fQ01JU19WRVJTSU9OX1NVUFBPUlRFRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDbWlzVmVyc2lvblN1cHBvcnRlZChyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19USElOX0NMSUVOVF9VUkkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VGhpbkNsaWVudFVyaShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19DSEFOR0VTX0lOQ09NUExFVEUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2hhbmdlc0luY29tcGxldGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fQ0hBTkdFU19PTl9UWVBFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENoYW5nZXNPblR5cGUoYWRkVG9MaXN0KHRhcmdldC5nZXRDaGFuZ2VzT25UeXBlKCksIHJlYWRFbnVtKHBhcnNlciwgQmFzZVR5cGVJZC5jbGFzcykpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19QUklOQ0lQQUxfSURfQU5PTllNT1VTKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByaW5jaXBhbEFub255bW91cyhyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19QUklOQ0lQQUxfSURfQU5ZT05FKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByaW5jaXBhbEFueW9uZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19FWFRFTkRFRF9GRUFUVVJFUykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRFeHRlbnNpb25GZWF0dXJlKGFkZFRvTGlzdCh0YXJnZXQuZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhURU5ERURfRkVBVFVSRVNfUEFSU0VSLndhbGsocGFyc2VyKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGw+IENBUEFCSUxJVElFU19QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsPigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsIHByZXBhcmVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpDQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsIHRhcmdldCkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfQUNMKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhcGFiaWxpdHlBY2wocmVhZEVudW0ocGFyc2VyLCBDYXBhYmlsaXR5QWNsLmNsYXNzKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9BTExfVkVSU0lPTlNfU0VBUkNIQUJMRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRBbGxWZXJzaW9uc1NlYXJjaGFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9DSEFOR0VTKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhcGFiaWxpdHlDaGFuZ2VzKHJlYWRFbnVtKHBhcnNlciwgQ2FwYWJpbGl0eUNoYW5nZXMuY2xhc3MpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX0NPTlRFTlRfU1RSRUFNX1VQREFUQUJJTElUWSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMocmVhZEVudW0ocGFyc2VyLCBDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMuY2xhc3MpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX0dFVF9ERVNDRU5EQU5UUykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTdXBwb3J0c0dldERlc2NlbmRhbnRzKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfR0VUX0ZPTERFUl9UUkVFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFN1cHBvcnRzR2V0Rm9sZGVyVHJlZShyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX09SREVSX0JZKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhcGFiaWxpdHlPcmRlckJ5KHJlYWRFbnVtKHBhcnNlciwgQ2FwYWJpbGl0eU9yZGVyQnkuY2xhc3MpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX01VTFRJRklMSU5HKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFN1cHBvcnRzTXVsdGlmaWxpbmcocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9QV0NfU0VBUkNIQUJMRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc1B3Y1NlYXJjaGFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9QV0NfVVBEQVRBQkxFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzUHdjVXBkYXRhYmxlKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfUVVFUlkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FwYWJpbGl0eVF1ZXJ5KHJlYWRFbnVtKHBhcnNlciwgQ2FwYWJpbGl0eVF1ZXJ5LmNsYXNzKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9SRU5ESVRJT05TKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhcGFiaWxpdHlSZW5kaXRpb24ocmVhZEVudW0ocGFyc2VyLCBDYXBhYmlsaXR5UmVuZGl0aW9ucy5jbGFzcykpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfVU5GSUxJTkcpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0U3VwcG9ydHNVbmZpbGluZyhyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX1ZFUlNJT05fU1BFQ0lGSUNfRklMSU5HKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfSk9JTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYXBhYmlsaXR5Sm9pbihyZWFkRW51bShwYXJzZXIsIENhcGFiaWxpdHlKb2luLmNsYXNzKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVMpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcyhDUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoTkVXX1RZUEVTX1NFVFRBQkxFX0FUVFJJQlVURVNfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxDcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbD4gQ1JFQVRBQkxFX1BST1BFUlRZX1RZUEVTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8Q3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgQ3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgQ3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfQ0FOQ1JFQVRFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmNhbkNyZWF0ZSgpLmFkZChyZWFkRW51bShwYXJzZXIsIFByb3BlcnR5VHlwZS5jbGFzcykpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGw+IE5FV19UWVBFU19TRVRUQUJMRV9BVFRSSUJVVEVTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lEKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldElkKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19MT0NBTE5BTUUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0TG9jYWxOYW1lKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19MT0NBTE5BTUVTUEFDRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRMb2NhbE5hbWVzcGFjZShyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRElTUExBWU5BTUUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0RGlzcGxheU5hbWUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX1FVRVJZTkFNRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRRdWVyeU5hbWUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0RFU0NSSVBUSU9OKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldERlc2NyaXB0aW9uKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DUkVBVEVBQkxFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldENyZWF0YWJsZShyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRklMRUFCTEUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0RmlsZWFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX1FVRVJZQUJMRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRRdWVyeWFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0ZVTExURVhUSU5ERVhFRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRGdWxsdGV4dEluZGV4ZWQocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lOQ0xVREVESU5TVVBFUlRZVFBFUVVFUlkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DT05UUk9MQUJMRVBPTElDWSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRDb250cm9sbGFibGVQb2xpY3kocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFQUNMKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldENvbnRyb2xsYWJsZUFjbChyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPEFjbENhcGFiaWxpdGllc0RhdGFJbXBsPiBBQ0xfQ0FQQUJJTElUSUVTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0FDTENBUF9TVVBQT1JURURfUEVSTUlTU0lPTlMpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0U3VwcG9ydGVkUGVybWlzc2lvbnMocmVhZEVudW0ocGFyc2VyLCBTdXBwb3J0ZWRQZXJtaXNzaW9ucy5jbGFzcykpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0xDQVBfQUNMX1BST1BBR0FUSU9OKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEFjbFByb3BhZ2F0aW9uKHJlYWRFbnVtKHBhcnNlciwgQWNsUHJvcGFnYXRpb24uY2xhc3MpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNMQ0FQX1BFUk1JU1NJT05TKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YShhZGRUb0xpc3QodGFyZ2V0LmdldFBlcm1pc3Npb25zKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fREVGSU5JVElPTl9QQVJTRVIud2FsayhwYXJzZXIpKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0FDTENBUF9QRVJNSVNTSU9OX01BUFBJTkcpKSB7DQotICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uTWFwcGluZyBwbSA9IFBFUk1JU1NJT05fTUFQUElOR19QQVJTRVIud2FsayhwYXJzZXIpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUGVybWlzc2lvbk1hcHBpbmc+IG1hcHBpbmcgPSB0YXJnZXQuZ2V0UGVybWlzc2lvbk1hcHBpbmcoKTsNCi0gICAgICAgICAgICAgICAgICAgIG1hcHBpbmcucHV0KHBtLmdldEtleSgpLCBwbSk7DQotDQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsPiBQRVJNSVNTSU9OX0RFRklOSVRJT05fUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsPigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsIHRhcmdldCkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTl9QRVJNSVNTSU9OKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElkKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTl9ERVNDUklQVElPTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXNjcmlwdGlvbihyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGw+IFBFUk1JU1NJT05fTUFQUElOR19QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0FDTENBUF9NQVBQSU5HX0tFWSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRLZXkocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0FDTENBUF9NQVBQSU5HX1BFUk1JU1NJT04pKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UGVybWlzc2lvbnMoYWRkVG9MaXN0KHRhcmdldC5nZXRQZXJtaXNzaW9ucygpLCByZWFkVGV4dChwYXJzZXIpKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxFeHRlbnNpb25GZWF0dXJlSW1wbD4gRVhURU5ERURfRkVBVFVSRVNfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxFeHRlbnNpb25GZWF0dXJlSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBFeHRlbnNpb25GZWF0dXJlSW1wbCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25GZWF0dXJlSW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBFeHRlbnNpb25GZWF0dXJlSW1wbCB0YXJnZXQpDQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfRkVBVFVSRV9JRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJZChyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfRkVBVFVSRV9VUkwpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VXJsKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19GRUFUVVJFX0NPTU1PTl9OQU1FKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENvbW1vbk5hbWUocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0ZFQVRVUkVfVkVSU0lPTl9MQUJFTCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRWZXJzaW9uTGFiZWwocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0ZFQVRVUkVfREVTQ1JJUFRJT04pKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVzY3JpcHRpb24ocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0ZFQVRVUkVfREFUQSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRhdGEgPSBGRUFUVVJFX0RBVEFfUEFSU0VSLndhbGsocGFyc2VyKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVyZURhdGEgPSB0YXJnZXQuZ2V0RmVhdHVyZURhdGEoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVEYXRhLnB1dChkYXRhWzBdLCBkYXRhWzFdKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPFN0cmluZ1tdPiBGRUFUVVJFX0RBVEFfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxTdHJpbmdbXT4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMl07DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIFN0cmluZ1tdIHRhcmdldCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19GRUFUVVJFX0RBVEFfS0VZKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gcmVhZFRleHQocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfRkVBVFVSRV9EQVRBX1ZBTFVFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WzFdID0gcmVhZFRleHQocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gLS0tIGRlZmluaXRpb24gcGFyc2VycyAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPEFic3RyYWN0VHlwZURlZmluaXRpb24+IFRZUEVfREVGX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWJzdHJhY3RUeXBlRGVmaW5pdGlvbj4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIHByZXBhcmVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgICAgICBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7DQotDQotICAgICAgICAgICAgU3RyaW5nIHR5cGVBdHRyID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKE5BTUVTUEFDRV9YU0ksICJ0eXBlIik7DQotICAgICAgICAgICAgaWYgKHR5cGVBdHRyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfRE9DVU1FTlRfVFlQRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCgpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfRk9MREVSX1RZUEUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgRm9sZGVyVHlwZURlZmluaXRpb25JbXBsKCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUF0dHIuZW5kc1dpdGgoQVRUUl9SRUxBVElPTlNISVBfVFlQRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwoKTsNCi0gICAgICAgICAgICAgICAgICAgICgoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldEFsbG93ZWRTb3VyY2VUeXBlcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7DQotICAgICAgICAgICAgICAgICAgICAoKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRBbGxvd2VkVGFyZ2V0VHlwZXMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfUE9MSUNZX1RZUEUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUG9saWN5VHlwZURlZmluaXRpb25JbXBsKCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUF0dHIuZW5kc1dpdGgoQVRUUl9JVEVNX1RZUEUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCgpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfU0VDT05EQVJZX1RZUEUpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgcmVhZCB0eXBlIGRlZmluaXRpb24hIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEFic3RyYWN0VHlwZURlZmluaXRpb24gdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfTE9DQUxOQU1FKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldExvY2FsTmFtZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9MT0NBTE5BTUVTUEFDRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRMb2NhbE5hbWVzcGFjZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9ESVNQTEFZTkFNRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREaXNwbGF5TmFtZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9RVUVSWU5BTUUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UXVlcnlOYW1lKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0RFU0NSSVBUSU9OKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlc2NyaXB0aW9uKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0JBU0VfSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZUlkIGJhc2VUeXBlID0gcmVhZEVudW0ocGFyc2VyLCBCYXNlVHlwZUlkLmNsYXNzKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYmFzZSB0eXBlISIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEJhc2VUeXBlSWQoYmFzZVR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BBUkVOVF9JRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQYXJlbnRUeXBlSWQocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQ1JFQVRBQkxFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzQ3JlYXRhYmxlKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0ZJTEVBQkxFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzRmlsZWFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfUVVFUllBQkxFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzUXVlcnlhYmxlKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0ZVTExURVhUX0lOREVYRUQpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNGdWxsdGV4dEluZGV4ZWQocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfSU5DTFVERV9JTl9TVVBFUlRZUEVfUVVFUlkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQ09OVFJPTEFCTEVfUE9MSUNZKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzQ29udHJvbGxhYmxlUG9saWN5KHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0NPTlRST0xBQkxFX0FDTCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc0NvbnRyb2xsYWJsZUFjbChyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9UWVBFX01VVEFCSUxJVFkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VHlwZU11dGFiaWxpdHkoVFlQRV9NVVRBQklMSVRZX1BBUlNFUi53YWxrKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX1NUUklORykgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfSUQpDQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfQk9PTEVBTikgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfSU5URUdFUikNCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9EQVRFVElNRSkgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfREVDSU1BTCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9IVE1MKSB8fCBpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9VUkkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHlEZWZpbml0aW9uKFBST1BFUlRZX1RZUEVfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9WRVJTSU9OQUJMRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldElzVmVyc2lvbmFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQ09OVEVOVFNUUkVBTV9BTExPV0VEKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0Q29udGVudFN0cmVhbUFsbG93ZWQocmVhZEVudW0ocGFyc2VyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbUFsbG93ZWQuY2xhc3MpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQUxMT1dFRF9TT1VSQ0VfVFlQRVMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsIHJlbFRhcmdldCA9IChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwpIHRhcmdldDsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZWxUYXJnZXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbGxvd2VkU291cmNlVHlwZXMoYWRkVG9MaXN0KHJlbFRhcmdldC5nZXRBbGxvd2VkU291cmNlVHlwZUlkcygpLCByZWFkVGV4dChwYXJzZXIpKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQUxMT1dFRF9UQVJHRVRfVFlQRVMpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsIHJlbFRhcmdldCA9IChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwpIHRhcmdldDsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZWxUYXJnZXQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbGxvd2VkVGFyZ2V0VHlwZXMoYWRkVG9MaXN0KHJlbFRhcmdldC5nZXRBbGxvd2VkVGFyZ2V0VHlwZUlkcygpLCByZWFkVGV4dChwYXJzZXIpKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8VHlwZU11dGFiaWxpdHlJbXBsPiBUWVBFX01VVEFCSUxJVFlfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxUeXBlTXV0YWJpbGl0eUltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgVHlwZU11dGFiaWxpdHlJbXBsIHByZXBhcmVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVNdXRhYmlsaXR5SW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBUeXBlTXV0YWJpbGl0eUltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZX0NSRUFURSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5DcmVhdGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZX1VQREFURSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5VcGRhdGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZX0RFTEVURSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5EZWxldGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gUFJPUEVSVFlfVFlQRV9QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+PigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IHByZXBhcmVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpDQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9TVFJJTkcpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9JRCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfQk9PTEVBTikpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9JTlRFR0VSKSkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwoKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX0RBVEVUSU1FKSkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsKCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9ERUNJTUFMKSkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwoKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX0hUTUwpKSB7DQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfVVJJKSkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCByZWFkIHByb3BlcnR5IHR5cGUgZGVmaW5pdGlvbiEiKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248Pz4gdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfTE9DQUxOQU1FKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldExvY2FsTmFtZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUVTUEFDRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRMb2NhbE5hbWVzcGFjZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9ESVNQTEFZTkFNRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREaXNwbGF5TmFtZShyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9RVUVSWU5BTUUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UXVlcnlOYW1lKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFU0NSSVBUSU9OKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlc2NyaXB0aW9uKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX1BST1BFUlRZX1RZUEUpKSB7DQotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUgcHJvcFR5cGUgPSByZWFkRW51bShwYXJzZXIsIFByb3BlcnR5VHlwZS5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFR5cGUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IHR5cGUhIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJvcGVydHlUeXBlKHByb3BUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DQVJESU5BTElUWSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5ID0gcmVhZEVudW0ocGFyc2VyLCBDYXJkaW5hbGl0eS5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZGluYWxpdHkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNhcmRpbmFsaXR5ISIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhcmRpbmFsaXR5KGNhcmRpbmFsaXR5KTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9VUERBVEFCSUxJVFkpKSB7DQotICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkYXRhYmlsaXR5ID0gcmVhZEVudW0ocGFyc2VyLCBVcGRhdGFiaWxpdHkuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0YWJpbGl0eSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdXBkYXRhYmlsaXR5ISIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFVwZGF0YWJpbGl0eSh1cGRhdGFiaWxpdHkpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0lOSEVSSVRFRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc0luaGVyaXRlZChyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9SRVFVSVJFRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc1JlcXVpcmVkKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX1FVRVJZQUJMRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc1F1ZXJ5YWJsZShyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9PUkRFUkFCTEUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNPcmRlcmFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfT1BFTkNIT0lDRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc09wZW5DaG9pY2UocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVN0cmluZyBwcm9wID0gUFJPUEVSVFlfU1RSSU5HX1BBUlNFUi53YWxrKHBhcnNlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX1NUUklOR19QQVJTRVIuYWRkVG9DaG9pY2VMaXN0KHBhcnNlciwgKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwpIHRhcmdldCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfTUFYX0xFTkdUSCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0TWF4TGVuZ3RoKHJlYWRJbnRlZ2VyKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkIHByb3AgPSBQUk9QRVJUWV9JRF9QQVJTRVIud2FsayhwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlJZERlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX1NUUklOR19QQVJTRVIuYWRkVG9DaG9pY2VMaXN0KHBhcnNlciwgKFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCkgdGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJvb2xlYW4gcHJvcCA9IFBST1BFUlRZX0JPT0xFQU5fUEFSU0VSLndhbGsocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX0JPT0xFQU5fUEFSU0VSLmFkZFRvQ2hvaWNlTGlzdChwYXJzZXIsIChQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCkgdGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUludGVnZXIgcHJvcCA9IFBST1BFUlRZX0lOVEVHRVJfUEFSU0VSLndhbGsocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX0lOVEVHRVJfUEFSU0VSLmFkZFRvQ2hvaWNlTGlzdChwYXJzZXIsIChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9NQVhfVkFMVUUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXRNYXhWYWx1ZShyZWFkSW50ZWdlcihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9NSU5fVkFMVUUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXRNaW5WYWx1ZShyZWFkSW50ZWdlcihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEYXRlVGltZSBwcm9wID0gUFJPUEVSVFlfREFURVRJTUVfUEFSU0VSLndhbGsocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZXMoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIT0lDRV9EQVRFVElNRV9QQVJTRVIuYWRkVG9DaG9pY2VMaXN0KHBhcnNlciwgKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9SRVNPTFVUSU9OKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERhdGVUaW1lUmVzb2x1dGlvbihyZWFkRW51bShwYXJzZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZVJlc29sdXRpb24uY2xhc3MpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlY2ltYWwgcHJvcCA9IFBST1BFUlRZX0RFQ0lNQUxfUEFSU0VSLndhbGsocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX0RFQ0lNQUxfUEFSU0VSLmFkZFRvQ2hvaWNlTGlzdChwYXJzZXIsIChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9NQVhfVkFMVUUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXRNYXhWYWx1ZShyZWFkRGVjaW1hbChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9NSU5fVkFMVUUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXRNaW5WYWx1ZShyZWFkRGVjaW1hbChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9QUkVDSVNJT04pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXRQcmVjaXNpb24oRGVjaW1hbFByZWNpc2lvbg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tVmFsdWUocmVhZEludGVnZXIocGFyc2VyKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWQgZW51bSB2YWx1ZSAtIGlnbm9yZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUh0bWwgcHJvcCA9IFBST1BFUlRZX0hUTUxfUEFSU0VSLndhbGsocGFyc2VyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX1NUUklOR19QQVJTRVIuYWRkVG9DaG9pY2VMaXN0KHBhcnNlciwgKFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsKSB0YXJnZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlVcmkgcHJvcCA9IFBST1BFUlRZX1VSSV9QQVJTRVIud2FsayhwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZXMoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIT0lDRV9TVFJJTkdfUEFSU0VSLmFkZFRvQ2hvaWNlTGlzdChwYXJzZXIsIChQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsKSB0YXJnZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hvaWNlQXRvbVB1YlhNTFdhbGtlcjxTdHJpbmc+IENIT0lDRV9TVFJJTkdfUEFSU0VSID0gbmV3IENob2ljZUF0b21QdWJYTUxXYWxrZXI8U3RyaW5nPigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIENob2ljZUltcGw8U3RyaW5nPiBjcmVhdGVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgQ2hvaWNlSW1wbDxTdHJpbmc+IHRhcmdldCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZShhZGRUb0xpc3QodGFyZ2V0LmdldFZhbHVlKCksIHJlYWRUZXh0KHBhcnNlcikpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZENob2ljZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgQ2hvaWNlSW1wbDxTdHJpbmc+IHRhcmdldCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHRhcmdldC5zZXRDaG9pY2UoYWRkVG9MaXN0KHRhcmdldC5nZXRDaG9pY2UoKSwgQ0hPSUNFX1NUUklOR19QQVJTRVIud2FsayhwYXJzZXIpKSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENob2ljZUF0b21QdWJYTUxXYWxrZXI8Qm9vbGVhbj4gQ0hPSUNFX0JPT0xFQU5fUEFSU0VSID0gbmV3IENob2ljZUF0b21QdWJYTUxXYWxrZXI8Qm9vbGVhbj4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBDaG9pY2VJbXBsPEJvb2xlYW4+IGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlSW1wbDxCb29sZWFuPigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgQ2hvaWNlSW1wbDxCb29sZWFuPiB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZSgpLCByZWFkQm9vbGVhbihwYXJzZXIpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDaG9pY2UoWG1sUHVsbFBhcnNlciBwYXJzZXIsIENob2ljZUltcGw8Qm9vbGVhbj4gdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGFyZ2V0LnNldENob2ljZShhZGRUb0xpc3QodGFyZ2V0LmdldENob2ljZSgpLCBDSE9JQ0VfQk9PTEVBTl9QQVJTRVIud2FsayhwYXJzZXIpKSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENob2ljZUF0b21QdWJYTUxXYWxrZXI8QmlnSW50ZWdlcj4gQ0hPSUNFX0lOVEVHRVJfUEFSU0VSID0gbmV3IENob2ljZUF0b21QdWJYTUxXYWxrZXI8QmlnSW50ZWdlcj4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBDaG9pY2VJbXBsPEJpZ0ludGVnZXI+IGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlSW1wbDxCaWdJbnRlZ2VyPigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgQ2hvaWNlSW1wbDxCaWdJbnRlZ2VyPiB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZSgpLCByZWFkSW50ZWdlcihwYXJzZXIpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDaG9pY2UoWG1sUHVsbFBhcnNlciBwYXJzZXIsIENob2ljZUltcGw8QmlnSW50ZWdlcj4gdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGFyZ2V0LnNldENob2ljZShhZGRUb0xpc3QodGFyZ2V0LmdldENob2ljZSgpLCBDSE9JQ0VfSU5URUdFUl9QQVJTRVIud2FsayhwYXJzZXIpKSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENob2ljZUF0b21QdWJYTUxXYWxrZXI8R3JlZ29yaWFuQ2FsZW5kYXI+IENIT0lDRV9EQVRFVElNRV9QQVJTRVIgPSBuZXcgQ2hvaWNlQXRvbVB1YlhNTFdhbGtlcjxHcmVnb3JpYW5DYWxlbmRhcj4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBDaG9pY2VJbXBsPEdyZWdvcmlhbkNhbGVuZGFyPiBjcmVhdGVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZUltcGw8R3JlZ29yaWFuQ2FsZW5kYXI+KCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBDaG9pY2VJbXBsPEdyZWdvcmlhbkNhbGVuZGFyPiB0YXJnZXQpDQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZSgpLCByZWFkRGF0ZVRpbWUocGFyc2VyKSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hvaWNlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBDaG9pY2VJbXBsPEdyZWdvcmlhbkNhbGVuZGFyPiB0YXJnZXQpDQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0Q2hvaWNlKGFkZFRvTGlzdCh0YXJnZXQuZ2V0Q2hvaWNlKCksIENIT0lDRV9EQVRFVElNRV9QQVJTRVIud2FsayhwYXJzZXIpKSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENob2ljZUF0b21QdWJYTUxXYWxrZXI8QmlnRGVjaW1hbD4gQ0hPSUNFX0RFQ0lNQUxfUEFSU0VSID0gbmV3IENob2ljZUF0b21QdWJYTUxXYWxrZXI8QmlnRGVjaW1hbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBDaG9pY2VJbXBsPEJpZ0RlY2ltYWw+IGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlSW1wbDxCaWdEZWNpbWFsPigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgQ2hvaWNlSW1wbDxCaWdEZWNpbWFsPiB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZSgpLCByZWFkRGVjaW1hbChwYXJzZXIpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDaG9pY2UoWG1sUHVsbFBhcnNlciBwYXJzZXIsIENob2ljZUltcGw8QmlnRGVjaW1hbD4gdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGFyZ2V0LnNldENob2ljZShhZGRUb0xpc3QodGFyZ2V0LmdldENob2ljZSgpLCBDSE9JQ0VfREVDSU1BTF9QQVJTRVIud2FsayhwYXJzZXIpKSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENob2ljZUF0b21QdWJYTUxXYWxrZXI8VD4gZXh0ZW5kcyBYTUxXYWxrZXI8Q2hvaWNlSW1wbDxUPj4gew0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkVG9DaG9pY2VMaXN0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjxUPiBwcm9wRGVmKQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcHJvcERlZi5zZXRDaG9pY2VzKGFkZFRvTGlzdChwcm9wRGVmLmdldENob2ljZXMoKSwgd2FsayhwYXJzZXIpKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ2hvaWNlSW1wbDxUPiBjcmVhdGVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpOw0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgQ2hvaWNlSW1wbDxUPiBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgQ2hvaWNlSW1wbDxUPiByZXN1bHQgPSBjcmVhdGVUYXJnZXQocGFyc2VyLCBuYW1lKTsNCi0NCi0gICAgICAgICAgICBpZiAocGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCkgPiAwKSB7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHIgPSBwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChBVFRSX1BST1BFUlRZX1RZUEVfQ0hPSUNFX0RJU1BMQVlOQU1FLmVxdWFscyhhdHRyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXREaXNwbGF5TmFtZShwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIENob2ljZUltcGw8VD4gdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYWRkVmFsdWUocGFyc2VyLCB0YXJnZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRV9DSE9JQ0UpKSB7DQotICAgICAgICAgICAgICAgICAgICBhZGRDaG9pY2UocGFyc2VyLCB0YXJnZXQpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkVmFsdWUoWG1sUHVsbFBhcnNlciBwYXJzZXIsIENob2ljZUltcGw8VD4gdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsNCi0NCi0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZENob2ljZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgQ2hvaWNlSW1wbDxUPiB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyAtLS0gb2JqZWN0cyBhbmQgbGlzdHMgcGFyc2VycyAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxPYmplY3REYXRhSW1wbD4gT0JKRUNUX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8T2JqZWN0RGF0YUltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YUltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0RGF0YUltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgT2JqZWN0RGF0YUltcGwgdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX09CSkVDVF9QUk9QRVJUSUVTKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByb3BlcnRpZXMoUFJPUEVSVElFU19QQVJTRVIud2FsayhwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfT0JKRUNUX0FMTE9XQUJMRV9BQ1RJT05TKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEFsbG93YWJsZUFjdGlvbnMoQUxMT1dBQkxFX0FDVElPTlNfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX09CSkVDVF9SRUxBVElPTlNISVApKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UmVsYXRpb25zaGlwcyhhZGRUb0xpc3QodGFyZ2V0LmdldFJlbGF0aW9uc2hpcHMoKSwgT0JKRUNUX1BBUlNFUi53YWxrKHBhcnNlcikpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfT0JKRUNUX0NIQU5HRV9FVkVOVF9JTkZPKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENoYW5nZUV2ZW50SW5mbyhDSEFOR0VfRVZFTlRfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX09CSkVDVF9BQ0wpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QWNsKEFDTF9QQVJTRVIud2FsayhwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfT0JKRUNUX0VYQUNUX0FDTCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc0V4YWN0QWNsKHJlYWRCb29sZWFuKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19PQkpFQ1RfUE9MSUNZX0lEUykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQb2xpY3lJZHMoUE9MSUNZX0lEU19QQVJTRVIud2FsayhwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfT0JKRUNUX1JFTkRJVElPTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRSZW5kaXRpb25zKGFkZFRvTGlzdCh0YXJnZXQuZ2V0UmVuZGl0aW9ucygpLCBSRU5ESVRJT05fUEFSU0VSLndhbGsocGFyc2VyKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UHJvcGVydGllc0ltcGw+IFBST1BFUlRJRVNfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxQcm9wZXJ0aWVzSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzSW1wbCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0aWVzSW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBQcm9wZXJ0aWVzSW1wbCB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUF9TVFJJTkcpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfU1RSSU5HX1BBUlNFUi53YWxrKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QX0lEKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZFByb3BlcnR5KFBST1BFUlRZX0lEX1BBUlNFUi53YWxrKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QX0JPT0xFQU4pKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfQk9PTEVBTl9QQVJTRVIud2FsayhwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUF9JTlRFR0VSKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZFByb3BlcnR5KFBST1BFUlRZX0lOVEVHRVJfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BfREFURVRJTUUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfREFURVRJTUVfUEFSU0VSLndhbGsocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BfREVDSU1BTCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRQcm9wZXJ0eShQUk9QRVJUWV9ERUNJTUFMX1BBUlNFUi53YWxrKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QX0hUTUwpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfSFRNTF9QQVJTRVIud2FsayhwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUF9VUkkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfVVJJX1BBUlNFUi53YWxrKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8QWxsb3dhYmxlQWN0aW9uc0ltcGw+IEFMTE9XQUJMRV9BQ1RJT05TX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWxsb3dhYmxlQWN0aW9uc0ltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgQWxsb3dhYmxlQWN0aW9uc0ltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQWxsb3dhYmxlQWN0aW9uc0ltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgQWxsb3dhYmxlQWN0aW9uc0ltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IEFjdGlvbi5mcm9tVmFsdWUobmFtZS5nZXRMb2NhbFBhcnQoKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBTZXQ8QWN0aW9uPiBhY3Rpb25zID0gdGFyZ2V0LmdldEFsbG93YWJsZUFjdGlvbnMoKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRCb29sZWFuKHBhcnNlcikpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5hZGQoYWN0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uIHRhZyAtPiBpZ25vcmUNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxDaGFuZ2VFdmVudEluZm9EYXRhSW1wbD4gQ0hBTkdFX0VWRU5UX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8Q2hhbmdlRXZlbnRJbmZvRGF0YUltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NIQU5HRV9FVkVOVF9UWVBFKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENoYW5nZVR5cGUocmVhZEVudW0ocGFyc2VyLCBDaGFuZ2VUeXBlLmNsYXNzKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NIQU5HRV9FVkVOVF9USU1FKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENoYW5nZVRpbWUocmVhZERhdGVUaW1lKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8QWNjZXNzQ29udHJvbExpc3RJbXBsPiBBQ0xfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxBY2Nlc3NDb250cm9sTGlzdEltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgQWNjZXNzQ29udHJvbExpc3RJbXBsIHByZXBhcmVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBBY2Nlc3NDb250cm9sTGlzdEltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0FDTF9QRVJNSVNTSVNPTlMpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QWNlcyhhZGRUb0xpc3QodGFyZ2V0LmdldEFjZXMoKSwgQUNFX1BBUlNFUi53YWxrKHBhcnNlcikpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPEFjY2Vzc0NvbnRyb2xFbnRyeUltcGw+IEFDRV9QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPEFjY2Vzc0NvbnRyb2xFbnRyeUltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgQWNjZXNzQ29udHJvbEVudHJ5SW1wbCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwgdGFyZ2V0KQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0FDRV9QUklOQ0lQQUwpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJpbmNpcGFsKFBSSU5DSVBBTF9QQVJTRVIud2FsayhwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNFX1BFUk1JU1NJT05TKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFBlcm1pc3Npb25zKGFkZFRvTGlzdCh0YXJnZXQuZ2V0UGVybWlzc2lvbnMoKSwgcmVhZFRleHQocGFyc2VyKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0VfSVNfRElSRUNUKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERpcmVjdChyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbD4gUFJJTkNJUEFMX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsPigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsIHRhcmdldCkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0VfUFJJTkNJUEFMX0lEKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElkKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UG9saWN5SWRMaXN0SW1wbD4gUE9MSUNZX0lEU19QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFBvbGljeUlkTGlzdEltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgUG9saWN5SWRMaXN0SW1wbCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIFBvbGljeUlkTGlzdEltcGwgdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BPTElDWV9JRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQb2xpY3lJZHMoYWRkVG9MaXN0KHRhcmdldC5nZXRQb2xpY3lJZHMoKSwgcmVhZFRleHQocGFyc2VyKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UmVuZGl0aW9uRGF0YUltcGw+IFJFTkRJVElPTl9QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFJlbmRpdGlvbkRhdGFJbXBsPigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIFJlbmRpdGlvbkRhdGFJbXBsIHByZXBhcmVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFJlbmRpdGlvbkRhdGFJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIFJlbmRpdGlvbkRhdGFJbXBsIHRhcmdldCkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fU1RSRUFNX0lEKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFN0cmVhbUlkKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fTUlNRVRZUEUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0TWltZVR5cGUocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFTkRJVElPTl9MRU5HVEgpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QmlnTGVuZ3RoKHJlYWRJbnRlZ2VyKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fS0lORCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRLaW5kKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fVElUTEUpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VGl0bGUocmVhZFRleHQocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFTkRJVElPTl9IRUlHSFQpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QmlnSGVpZ2h0KHJlYWRJbnRlZ2VyKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fV0lEVEgpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QmlnV2lkdGgocmVhZEludGVnZXIocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFTkRJVElPTl9ET0NVTUVOVF9JRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRSZW5kaXRpb25Eb2N1bWVudElkKHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gLS0tIHByb3BlcnR5IHBhcnNlcnMgLS0tDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUF0b21QdWJYTUxXYWxrZXI8UHJvcGVydHlTdHJpbmdJbXBsPiBQUk9QRVJUWV9TVFJJTkdfUEFSU0VSID0gbmV3IFByb3BlcnR5U3RyaW5nQXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eVN0cmluZ0ltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgUHJvcGVydHlTdHJpbmdJbXBsIGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlTdHJpbmdJbXBsKCk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5QXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eUlkSW1wbD4gUFJPUEVSVFlfSURfUEFSU0VSID0gbmV3IFByb3BlcnR5U3RyaW5nQXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eUlkSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBQcm9wZXJ0eUlkSW1wbCBjcmVhdGVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SWRJbXBsKCk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5QXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eUh0bWxJbXBsPiBQUk9QRVJUWV9IVE1MX1BBUlNFUiA9IG5ldyBQcm9wZXJ0eVN0cmluZ0F0b21QdWJYTUxXYWxrZXI8UHJvcGVydHlIdG1sSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBQcm9wZXJ0eUh0bWxJbXBsIGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlIdG1sSW1wbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUF0b21QdWJYTUxXYWxrZXI8UHJvcGVydHlVcmlJbXBsPiBQUk9QRVJUWV9VUklfUEFSU0VSID0gbmV3IFByb3BlcnR5U3RyaW5nQXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eVVyaUltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgUHJvcGVydHlVcmlJbXBsIGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlVcmlJbXBsKCk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5QXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eUJvb2xlYW5JbXBsPiBQUk9QRVJUWV9CT09MRUFOX1BBUlNFUiA9IG5ldyBQcm9wZXJ0eUF0b21QdWJYTUxXYWxrZXI8UHJvcGVydHlCb29sZWFuSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBQcm9wZXJ0eUJvb2xlYW5JbXBsIGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlCb29sZWFuSW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgUHJvcGVydHlCb29sZWFuSW1wbCB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWVzKGFkZFRvTGlzdCh0YXJnZXQuZ2V0VmFsdWVzKCksIHJlYWRCb29sZWFuKHBhcnNlcikpKTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlBdG9tUHViWE1MV2Fsa2VyPFByb3BlcnR5SW50ZWdlckltcGw+IFBST1BFUlRZX0lOVEVHRVJfUEFSU0VSID0gbmV3IFByb3BlcnR5QXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eUludGVnZXJJbXBsPigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIFByb3BlcnR5SW50ZWdlckltcGwgY3JlYXRlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUludGVnZXJJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBQcm9wZXJ0eUludGVnZXJJbXBsIHRhcmdldCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZXMoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZXMoKSwgcmVhZEludGVnZXIocGFyc2VyKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUF0b21QdWJYTUxXYWxrZXI8UHJvcGVydHlEZWNpbWFsSW1wbD4gUFJPUEVSVFlfREVDSU1BTF9QQVJTRVIgPSBuZXcgUHJvcGVydHlBdG9tUHViWE1MV2Fsa2VyPFByb3BlcnR5RGVjaW1hbEltcGw+KCkgew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgUHJvcGVydHlEZWNpbWFsSW1wbCBjcmVhdGVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGVjaW1hbEltcGwoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWUoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFByb3BlcnR5RGVjaW1hbEltcGwgdGFyZ2V0KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGFyZ2V0LnNldFZhbHVlcyhhZGRUb0xpc3QodGFyZ2V0LmdldFZhbHVlcygpLCByZWFkRGVjaW1hbChwYXJzZXIpKSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5QXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eURhdGVUaW1lSW1wbD4gUFJPUEVSVFlfREFURVRJTUVfUEFSU0VSID0gbmV3IFByb3BlcnR5QXRvbVB1YlhNTFdhbGtlcjxQcm9wZXJ0eURhdGVUaW1lSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBQcm9wZXJ0eURhdGVUaW1lSW1wbCBjcmVhdGVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBQcm9wZXJ0eURhdGVUaW1lSW1wbCB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWVzKGFkZFRvTGlzdCh0YXJnZXQuZ2V0VmFsdWVzKCksIHJlYWREYXRlVGltZShwYXJzZXIpKSk7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFByb3BlcnR5QXRvbVB1YlhNTFdhbGtlcjxUIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eURhdGE8Pz4+IGV4dGVuZHMgWE1MV2Fsa2VyPFQ+IHsNCi0NCi0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGNyZWF0ZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSk7DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBUIHByZXBhcmVUYXJnZXQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBUIHJlc3VsdCA9IGNyZWF0ZVRhcmdldChwYXJzZXIsIG5hbWUpOw0KLQ0KLSAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEFUVFJfUFJPUEVSVFlfSUQuZXF1YWxzKGF0dHIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldElkKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFUVFJfUFJPUEVSVFlfTE9DQUxOQU1FLmVxdWFscyhhdHRyKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWUocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVRUUl9QUk9QRVJUWV9ESVNQTEFZTkFNRS5lcXVhbHMoYXR0cikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0RGlzcGxheU5hbWUocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVRUUl9QUk9QRVJUWV9RVUVSWU5BTUUuZXF1YWxzKGF0dHIpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFF1ZXJ5TmFtZShwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRWYWx1ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVCB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uOw0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBUIHRhcmdldCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9WQUxVRSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGFkZFZhbHVlKHBhcnNlciwgdGFyZ2V0KTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQcm9wZXJ0eVN0cmluZ0F0b21QdWJYTUxXYWxrZXI8VCBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlEYXRhPFN0cmluZz4+IGV4dGVuZHMNCi0gICAgICAgICAgICBQcm9wZXJ0eUF0b21QdWJYTUxXYWxrZXI8VD4gew0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYbWxQdWxsUGFyc2VyIHBhcnNlciwgVCB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWVzKGFkZFRvTGlzdCh0YXJnZXQuZ2V0VmFsdWVzKCksIHJlYWRUZXh0KHBhcnNlcikpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyAtLS0gcXVlcnkgcGFyc2VyIC0tLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UXVlcnlUeXBlSW1wbD4gUVVFUllfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxRdWVyeVR5cGVJbXBsPigpIHsNCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHJvdGVjdGVkIFF1ZXJ5VHlwZUltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUXVlcnlUeXBlSW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBRdWVyeVR5cGVJbXBsIHRhcmdldCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19RVUVSWV9TVEFURU1FTlQpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0U3RhdGVtZW50KHJlYWRUZXh0KHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19RVUVSWV9TRUFSQ0hBTExWRVJTSU9OUykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTZWFyY2hBbGxWZXJzaW9ucyhyZWFkQm9vbGVhbihwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUVVFUllfSU5DTFVERUFMTE9XQUJMRUFDVElPTlMpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMocmVhZEJvb2xlYW4ocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1FVRVJZX0lOQ0xVREVSRUxBVElPTlNISVBTKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEluY2x1ZGVSZWxhdGlvbnNoaXBzKHJlYWRFbnVtKHBhcnNlciwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUVVFUllfUkVORElUSU9ORklMVEVSKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFJlbmRpdGlvbkZpbHRlcihyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUVVFUllfTUFYSVRFTVMpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0TWF4SXRlbXMocmVhZEludGVnZXIocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1FVRVJZX1NLSVBDT1VOVCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTa2lwQ291bnQocmVhZEludGVnZXIocGFyc2VyKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIC0tLSBidWxrIHVwZGF0ZSBwYXJzZXIgLS0tDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxCdWxrVXBkYXRlSW1wbD4gQlVMS19VUERBVEVfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxCdWxrVXBkYXRlSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBCdWxrVXBkYXRlSW1wbCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWxrVXBkYXRlSW1wbCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBCdWxrVXBkYXRlSW1wbCB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQlVMS19VUERBVEVfSURfQU5EX1RPS0VOKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE9iamVjdElkQW5kQ2hhbmdlVG9rZW4oYWRkVG9MaXN0KHRhcmdldC5nZXRPYmplY3RJZEFuZENoYW5nZVRva2VuKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0FORF9UT0tFTl9QQVJTRVIud2FsayhwYXJzZXIpKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0JVTEtfVVBEQVRFX1BST1BFUlRJRVMpKSB7DQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJvcGVydGllcyhQUk9QRVJUSUVTX1BBUlNFUi53YWxrKHBhcnNlcikpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19CVUxLX1VQREFURV9BRERfU0VDT05EQVJZX1RZUEVTKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEFkZFNlY29uZGFyeVR5cGVJZHMoYWRkVG9MaXN0KHRhcmdldC5nZXRBZGRTZWNvbmRhcnlUeXBlSWRzKCksIHJlYWRUZXh0KHBhcnNlcikpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQlVMS19VUERBVEVfUkVNT1ZFX1NFQ09OREFSWV9UWVBFUykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRSZW1vdmVTZWNvbmRhcnlUeXBlSWRzKGFkZFRvTGlzdCh0YXJnZXQuZ2V0UmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcygpLCByZWFkVGV4dChwYXJzZXIpKSk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH07DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw+IElEX0FORF9UT0tFTl9QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbD4oKSB7DQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwgcHJlcGFyZVRhcmdldChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSkNCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWG1sUHVsbFBhcnNlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbCB0YXJnZXQpDQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfSURBTkRUT0tFTl9JRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJZChyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfSURBTkRUT0tFTl9ORVdJRCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXROZXdJZChyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfSURBTkRUT0tFTl9DSEFOR0VUT0tFTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDaGFuZ2VUb2tlbihyZWFkVGV4dChwYXJzZXIpKTsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfTsNCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTFV0aWxzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5YWQyOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247DQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50Ow0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOw0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOw0KLQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxVdGlscyB7DQotDQotICAgIHByaXZhdGUgWE1MVXRpbHMoKSB7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gLS0tIHdyaXRlciAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBuZXcgWE1MIHdyaXRlci4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgWG1sU2VyaWFsaXplciBjcmVhdGVXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydCBvdXQgIT0gbnVsbDsNCi0NCi0gICAgICAgIFhtbFNlcmlhbGl6ZXIgd3JpdGVyID0gWG1sLm5ld1NlcmlhbGl6ZXIoKTsNCi0gICAgICAgIHdyaXRlci5zZXRPdXRwdXQob3V0LCBJT1V0aWxzLlVURjgpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gd3JpdGVyOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTdGFydHMgYSBYTUwgZG9jdW1lbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRYbWxEb2N1bWVudChYbWxTZXJpYWxpemVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydCB3cml0ZXIgIT0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgd3JpdGVyLnNldFByZWZpeChYTUxDb25zdGFudHMuUFJFRklYX0FUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7DQotICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFhNTENvbnN0YW50cy5QUkVGSVhfQ01JUywgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9DTUlTKTsNCi0gICAgICAgIHdyaXRlci5zZXRQcmVmaXgoWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSk7DQotICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFhNTENvbnN0YW50cy5QUkVGSVhfQVBBQ0hFX0NIRU1JU1RZLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQQUNIRV9DSEVNSVNUUlkpOw0KLQ0KLSAgICAgICAgd3JpdGVyLnN0YXJ0RG9jdW1lbnQoIlVURi04IiwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBFbmRzIGEgWE1MIGRvY3VtZW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuZFhtbERvY3VtZW50KFhtbFNlcmlhbGl6ZXIgd3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgYXNzZXJ0IHdyaXRlciAhPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICAvLyBlbmQgZG9jdW1lbnQNCi0gICAgICAgIHdyaXRlci5lbmREb2N1bWVudCgpOw0KLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQotICAgICAgICB3cml0ZXIudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIGEgU3RyaW5nIHRhZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShYbWxTZXJpYWxpemVyIHdyaXRlciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHRhZywgU3RyaW5nIHZhbHVlKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBhc3NlcnQgd3JpdGVyICE9IG51bGw7DQotDQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdyaXRlci5zdGFydFRhZyhudWxsLCB0YWcpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB3cml0ZXIuc3RhcnRUYWcobmFtZXNwYWNlLCB0YWcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd3JpdGVyLnRleHQodmFsdWUpOw0KLSAgICAgICAgd3JpdGVyLmVuZFRhZyhuYW1lc3BhY2UsIHRhZyk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFdyaXRlcyBhbiBJbnRlZ2VyIHRhZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShYbWxTZXJpYWxpemVyIHdyaXRlciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHRhZywgQmlnSW50ZWdlciB2YWx1ZSkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgYXNzZXJ0IHdyaXRlciAhPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZSh3cml0ZXIsIHByZWZpeCwgbmFtZXNwYWNlLCB0YWcsIHZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZXMgYSBEZWNpbWFsIHRhZy4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShYbWxTZXJpYWxpemVyIHdyaXRlciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHRhZywgQmlnRGVjaW1hbCB2YWx1ZSkNCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgYXNzZXJ0IHdyaXRlciAhPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotDQotICAgICAgICB3cml0ZSh3cml0ZXIsIHByZWZpeCwgbmFtZXNwYWNlLCB0YWcsIHZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZXMgYSBEYXRlVGltZSB0YWcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoWG1sU2VyaWFsaXplciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyB0YWcsIEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBhc3NlcnQgd3JpdGVyICE9IG51bGw7DQotDQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlKHdyaXRlciwgcHJlZml4LCBuYW1lc3BhY2UsIHRhZywgRGF0ZVRpbWVIZWxwZXIuZm9ybWF0WG1sRGF0ZVRpbWUodmFsdWUpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIGEgQm9vbGVhbiB0YWcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoWG1sU2VyaWFsaXplciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyB0YWcsIEJvb2xlYW4gdmFsdWUpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydCB3cml0ZXIgIT0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGUod3JpdGVyLCBwcmVmaXgsIG5hbWVzcGFjZSwgdGFnLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZXMgYW4gRW51bSB0YWcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoWG1sU2VyaWFsaXplciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyB0YWcsIEVudW08Pz4gdmFsdWUpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydCB3cml0ZXIgIT0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0IGVudW1WYWx1ZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZW51bVZhbHVlID0gdmFsdWUuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInZhbHVlIiwgbmV3IENsYXNzWzBdKS5pbnZva2UodmFsdWUsIG5ldyBPYmplY3RbMF0pOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IGVudW0gdmFsdWUiLCBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdyaXRlKHdyaXRlciwgcHJlZml4LCBuYW1lc3BhY2UsIHRhZywgZW51bVZhbHVlLnRvU3RyaW5nKCkpOw0KLSAgICB9DQotDQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyAtLS0tIHBhcnNlciAtLS0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGVzIGEgbmV3IFhNTCBwYXJzZXIgd2l0aCBPcGVuQ01JUyBkZWZhdWx0IHNldHRpbmdzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBYbWxQdWxsUGFyc2VyIGNyZWF0ZVBhcnNlcihJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gWG1sLm5ld1B1bGxQYXJzZXIoKTsNCi0gICAgICAgIHBhcnNlci5zZXRJbnB1dChzdHJlYW0sIElPVXRpbHMuVVRGOCk7DQotICAgICAgICByZXR1cm4gcGFyc2VyOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNb3ZlcyB0aGUgcGFyc2VyIHRvIHRoZSBuZXh0IGVsZW1lbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmV4dChYbWxQdWxsUGFyc2VyIHBhcnNlcikgew0KLSAgICAgICAgYXNzZXJ0IHBhcnNlciAhPSBudWxsOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAoaGFzTmV4dChwYXJzZXIpKSB7DQotICAgICAgICAgICAgICAgIHBhcnNlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIEVPRiBleGNlcHRpb25zDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOZXh0KFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7DQotDQotICAgICAgICByZXR1cm4gcGFyc2VyLmdldEV2ZW50VHlwZSgpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTa2lwcyBhIHRhZyBvciBzdWJ0cmVlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXAoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydCBwYXJzZXIgIT0gbnVsbDsNCi0NCi0gICAgICAgIGludCBsZXZlbCA9IDE7DQotICAgICAgICB3aGlsZSAobmV4dChwYXJzZXIpKSB7DQotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOw0KLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgew0KLSAgICAgICAgICAgICAgICBsZXZlbCsrOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSB7DQotICAgICAgICAgICAgICAgIGxldmVsLS07DQotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5leHQocGFyc2VyKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTW92ZXMgdGhlIHBhcnNlciB0byB0aGUgbmV4dCBzdGFydCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbm90aGVyIHN0YXJ0IGVsZW1lbnQgaGFzIGJlZW4gZm91bmQsDQotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGZpbmROZXh0U3RhcnRFbGVtZW5ldChYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydCBwYXJzZXIgIT0gbnVsbDsNCi0NCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGhhc05leHQocGFyc2VyKSkgew0KLSAgICAgICAgICAgICAgICBwYXJzZXIubmV4dCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFBhcnNlcyBhIHRhZyB0aGF0IGNvbnRhaW5zIHRleHQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkVGV4dChYbWxQdWxsUGFyc2VyIHBhcnNlciwgaW50IG1heExlbmd0aCkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgYXNzZXJ0IHBhcnNlciAhPSBudWxsOw0KLSAgICAgICAgYXNzZXJ0IG1heExlbmd0aCA+PSAwOw0KLQ0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotDQotICAgICAgICBuZXh0KHBhcnNlcik7DQotDQotICAgICAgICB3aGlsZSAodHJ1ZSkgew0KLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsNCi0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHKSB7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWG1sUHVsbFBhcnNlci5URVhUKSB7DQotICAgICAgICAgICAgICAgIGludCBsZW4gPSAwOw0KLSAgICAgICAgICAgICAgICBpZiAocGFyc2VyLmdldFRleHQoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBsZW4gPSBwYXJzZXIuZ2V0VGV4dCgpLmxlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgKyBsZW4gPiBtYXhMZW5ndGgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGxpbWl0IGV4Y2VlZGVkISIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhcnNlci5nZXRUZXh0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigiVW5leHBlY3RlZCB0YWc6ICIgKyBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKCFuZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIC0tLS0gRE9NIHN0dWZmIC0tLQ0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbmV3RG9tRG9jdW1lbnQoKSB7DQotICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSB1c2VkIG9uIEFuZHJvaWQhIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTFdhbGtlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQvY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTFdhbGtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWU5YjdmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9YTUxXYWxrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzLm5leHQ7DQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHMuc2tpcDsNCi0NCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNtaXNFeHRlbnNpb25FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsOw0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOw0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxXYWxrZXI8VD4gew0KLSAgICBwdWJsaWMgVCB3YWxrKFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBmaW5hbCBUIHJlc3VsdCA9IHByZXBhcmVUYXJnZXQocGFyc2VyLCBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKSk7DQotDQotICAgICAgICBuZXh0KHBhcnNlcik7DQotDQotICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIHRhZ3MNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOw0KLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgew0KLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKHBhcnNlci5nZXROYW1lc3BhY2UoKSwgcGFyc2VyLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIGlmICghcmVhZChwYXJzZXIsIG5hbWUsIHJlc3VsdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFeHRlbnNpb25zRGF0YSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV4dGVuc2lvbihwYXJzZXIsIChFeHRlbnNpb25zRGF0YSkgcmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwYXJzZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCFuZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NtaXNOYW1lc3BhY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQ01JUy5oYXNoQ29kZSgpID09IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuaGFzaENvZGUoKQ0KLSAgICAgICAgICAgICAgICAmJiBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXRvbU5hbWVzcGFjZShRTmFtZSBuYW1lKSB7DQotICAgICAgICByZXR1cm4gWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLmhhc2hDb2RlKCkgPT0gbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5oYXNoQ29kZSgpDQotICAgICAgICAgICAgICAgICYmIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWcoUU5hbWUgbmFtZSwgU3RyaW5nIHRhZykgew0KLSAgICAgICAgcmV0dXJuIHRhZy5oYXNoQ29kZSgpID09IG5hbWUuZ2V0TG9jYWxQYXJ0KCkuaGFzaENvZGUoKSAmJiB0YWcuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUV4dGVuc2lvbihYbWxQdWxsUGFyc2VyIHBhcnNlciwgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9ucyA9IGV4dERhdGEuZ2V0RXh0ZW5zaW9ucygpOw0KLSAgICAgICAgaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PigpOw0KLSAgICAgICAgICAgIGV4dERhdGEuc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChleHRlbnNpb25zLnNpemUoKSArIDEgPiBYTUxDb25zdHJhaW50cy5NQVhfRVhURU5TSU9OU19XSURUSCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUb28gbWFueSBleHRlbnNpb25zISIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZXh0ZW5zaW9ucy5hZGQoaGFuZGxlRXh0ZW5zaW9uTGV2ZWwocGFyc2VyLCAwKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbWlzRXh0ZW5zaW9uRWxlbWVudCBoYW5kbGVFeHRlbnNpb25MZXZlbChmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlciwgZmluYWwgaW50IGxldmVsKQ0KLSAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIGZpbmFsIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUocGFyc2VyLmdldE5hbWVzcGFjZSgpLCBwYXJzZXIuZ2V0TmFtZSgpKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlcyA9IG51bGw7DQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCi0gICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGNoaWxkcmVuID0gbnVsbDsNCi0NCi0gICAgICAgIGlmIChwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKSA+IDApIHsNCi0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotDQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpLCBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5leHQocGFyc2VyKTsNCi0NCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOw0KLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLkVORF9UQUcpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLlRFWFQpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBwYXJzZXIuZ2V0VGV4dCgpOw0KLSAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgKyBzLmxlbmd0aCgpID4gWE1MQ29uc3RyYWludHMuTUFYX1NUUklOR19MRU5HVEgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGxpbWl0IGV4Y2VlZGVkISIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRykgew0KLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgKyAxID4gWE1MQ29uc3RyYWludHMuTUFYX0VYVEVOU0lPTlNfREVQVEgpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJFeHRlbnNpb25zIHRyZWUgdG9vIGRlZXAhIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uc2l6ZSgpICsgMSA+IFhNTENvbnN0cmFpbnRzLk1BWF9FWFRFTlNJT05TX1dJRFRIKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9ucyB0cmVlIHRvbyB3aWRlISIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChoYW5kbGVFeHRlbnNpb25MZXZlbChwYXJzZXIsIGxldmVsICsgMSkpOw0KLQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKCFuZXh0KHBhcnNlcikpIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmV4dChwYXJzZXIpOw0KLQ0KLSAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNFeHRlbnNpb25FbGVtZW50SW1wbChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lLmdldExvY2FsUGFydCgpLCBhdHRyaWJ1dGVzLCBjaGlsZHJlbik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUuZ2V0TG9jYWxQYXJ0KCksIGF0dHJpYnV0ZXMsIHNiLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCA8Uz4gTGlzdDxTPiBhZGRUb0xpc3QoTGlzdDxTPiBsaXN0LCBTIHZhbHVlKSB7DQotICAgICAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8Uz4oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGxpc3QuYWRkKHZhbHVlKTsNCi0NCi0gICAgICAgIHJldHVybiBsaXN0Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZFRleHQoZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBYTUxVdGlscy5yZWFkVGV4dChwYXJzZXIsIFhNTENvbnN0cmFpbnRzLk1BWF9TVFJJTkdfTEVOR1RIKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiByZWFkQm9vbGVhbihmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZFRleHQocGFyc2VyKTsNCi0NCi0gICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKHZhbHVlKSB8fCAiMSIuZXF1YWxzKHZhbHVlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHModmFsdWUpIHx8ICIwIi5lcXVhbHModmFsdWUpKSB7DQotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7DQotICAgICAgICB9DQotDQotICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBib29sZWFuIHZhbHVlISIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyIHJlYWRJbnRlZ2VyKGZpbmFsIFhtbFB1bGxQYXJzZXIgcGFyc2VyKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSByZWFkVGV4dChwYXJzZXIpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcih2YWx1ZSk7DQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGludGVnZXIgdmFsdWUhIiwgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVhZERlY2ltYWwoZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlYWRUZXh0KHBhcnNlcik7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCh2YWx1ZSk7DQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRlY2ltYWwgdmFsdWUhIiwgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEdyZWdvcmlhbkNhbGVuZGFyIHJlYWREYXRlVGltZShmaW5hbCBYbWxQdWxsUGFyc2VyIHBhcnNlcikgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZFRleHQocGFyc2VyKTsNCi0NCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIHJlc3VsdCA9IERhdGVUaW1lSGVscGVyLnBhcnNlWG1sRGF0ZVRpbWUodmFsdWUpOw0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGF0ZXRpbWUgdmFsdWUhIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwdWJsaWMgPEUgZXh0ZW5kcyBFbnVtPEU+PiBFIHJlYWRFbnVtKGZpbmFsIFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBmaW5hbCBDbGFzczxFPiBjbGF6eikNCi0gICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7DQotDQotICAgICAgICByZXR1cm4gQ21pc0VudW1IZWxwZXIuZnJvbVZhbHVlKHJlYWRUZXh0KHBhcnNlciksIGNsYXp6KTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBwcmVwYXJlVGFyZ2V0KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsNCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlciwgUU5hbWUgbmFtZSwgVCB0YXJnZXQpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjExNzYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIEJyaWRnZSBXQVIgcGFja2FnaW5nPC9uYW1lPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1OYW1lPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZTwvQnVuZGxlLU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlPC9CdW5kbGUtU3ltYm9saWNOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtVmVyc2lvbj4wLjAuMTwvQnVuZGxlLVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPmphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwLGphdmF4LnNlcnZsZXQucmVzb3VyY2VzPC9JbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLUNsYXNzcGF0aD4uPC9CdW5kbGUtQ2xhc3NwYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxXZWItQ29udGV4dFBhdGg+YnJpZGdlPC9XZWItQ29udGV4dFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8b3ZlcmxheXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcmxheT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvb3ZlcmxheT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVybGF5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi9USElSRC1QQVJUWS1MSUNFTlNFUzwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9vdmVybGF5PgotICAgICAgICAgICAgICAgICAgICA8L292ZXJsYXlzPgotICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZUNsYXNzZXM+dHJ1ZTwvYXJjaGl2ZUNsYXNzZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxhdHRhY2hDbGFzc2VzPnRydWU8L2F0dGFjaENsYXNzZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lY2xpcHNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjk8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gY29weSB0aGUgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHNlcnZlciBiaW5kaW5ncyBoZXJlLCBiZWNhdXNlIG12biBlY2xpcHNlIGlnbm9yZXMgdGhlbSBmcm9tIGEgLndhciAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL0Fic3RyYWN0QnJpZGdlU2VydmljZUZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9BYnN0cmFjdEJyaWRnZVNlcnZpY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDM2YmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL0Fic3RyYWN0QnJpZGdlU2VydmljZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ2xhc3NMb2FkZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuQWJzdHJhY3RTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyLkNhbGxDb250ZXh0QXdhcmVDbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyLkNvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCcmlkZ2VTZXJ2aWNlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2VydmljZUZhY3RvcnkgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJREdFX1RFTVBfRElSRUNUT1JZID0gImJyaWRnZS50ZW1wRGlyZWN0b3J5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklER0VfTUVNT1JZX1RIRVJFU0hPTEQgPSAiYnJpZGdlLm1lbW9yeVRocmVzaG9sZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJREdFX01BWF9DT05URU5UX1NJWkUgPSAiYnJpZGdlLm1heENvbnRlbnRTaXplIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfQ0xBU1MgPSAic2VydmljZS5jbGFzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9ERUZBVUxUX01BWF9JVEVNU19PQkpFQ1RTID0gInNlcnZpY2UuZGVmYXVsdE1heEl0ZW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RFRkFVTFRfREVQVEhfT0JKRUNUUyA9ICJzZXJ2aWNlLmRlZmF1bHREZXB0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9ERUZBVUxUX01BWF9JVEVNU19UWVBFUyA9ICJzZXJ2aWNlLmRlZmF1bHRUeXBlc01heEl0ZW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RFRkFVTFRfREVQVEhfVFlQRVMgPSAic2VydmljZS5kZWZhdWx0VHlwZXNEZXB0aCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfTUFYX0lURU1TX09CSkVDVFMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwMDAwKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfREVQVEhfT0JKRUNUUyA9IEJpZ0ludGVnZXIudmFsdWVPZigxMDApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9NQVhfSVRFTVNfVFlQRVMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwMCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX0RFUFRIX1RZUEVTID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwKTsKLQotICAgIHByaXZhdGUgVGhyZWFkTG9jYWw8Q2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlPiB0aHJlYWRMb2NhbFNlcnZpY2UgPSBuZXcgVGhyZWFkTG9jYWw8Q2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlPigpOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7Ci0KLSAgICBwcml2YXRlIENsYXNzPD8+IHNlcnZpY2VDbGFzczsKLQotICAgIHByaXZhdGUgQmlnSW50ZWdlciBkZWZhdWx0TWF4SXRlbXM7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGRlZmF1bHREZXB0aDsKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgZGVmYXVsdFR5cGVzTWF4SXRlbXM7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGRlZmF1bHRUeXBlc0RlcHRoOwotCi0gICAgcHJpdmF0ZSBGaWxlIHRlbXBEaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBpbnQgbWVtb3J5VGhyZXNob2xkOwotICAgIHByaXZhdGUgbG9uZyBtYXhDb250ZW50U2l6ZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0KLSAgICAgICAgLy8gZ2V0IGJyaWRnZSBjb25maWd1cmF0aW9uCi0gICAgICAgIFN0cmluZyB0ZW1wRGlyZWN0b3J5U3RyID0gcGFyYW1ldGVycy5nZXQoQlJJREdFX1RFTVBfRElSRUNUT1JZKTsKLSAgICAgICAgdGVtcERpcmVjdG9yeSA9ICh0ZW1wRGlyZWN0b3J5U3RyID09IG51bGwgfHwgdGVtcERpcmVjdG9yeVN0ci50cmltKCkubGVuZ3RoKCkgPT0gMCA/IHN1cGVyLmdldFRlbXBEaXJlY3RvcnkoKQotICAgICAgICAgICAgICAgIDogbmV3IEZpbGUodGVtcERpcmVjdG9yeVN0ci50cmltKCkpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG1lbW9yeVRocmVzaG9sZFN0ciA9IHBhcmFtZXRlcnMuZ2V0KEJSSURHRV9NRU1PUllfVEhFUkVTSE9MRCk7Ci0gICAgICAgICAgICBtZW1vcnlUaHJlc2hvbGQgPSAobWVtb3J5VGhyZXNob2xkU3RyID09IG51bGwgfHwgbWVtb3J5VGhyZXNob2xkU3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwID8gc3VwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lbW9yeVRocmVzaG9sZCgpIDogSW50ZWdlci5wYXJzZUludChtZW1vcnlUaHJlc2hvbGRTdHIudHJpbSgpKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBtYXhDb250ZW50U2l6ZVN0ciA9IHBhcmFtZXRlcnMuZ2V0KEJSSURHRV9NQVhfQ09OVEVOVF9TSVpFKTsKLSAgICAgICAgICAgIG1heENvbnRlbnRTaXplID0gKG1heENvbnRlbnRTaXplU3RyID09IG51bGwgfHwgbWF4Q29udGVudFNpemVTdHIudHJpbSgpLmxlbmd0aCgpID09IDAgPyBzdXBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0TWF4Q29udGVudFNpemUoKSA6IExvbmcucGFyc2VMb25nKG1heENvbnRlbnRTaXplU3RyLnRyaW0oKSkpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBwYXJzZSBicmlkZSBjb25maWd1cmF0aW9uIHZhbHVlczogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgc2VydmljZSBjbGFzcwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcGFyYW1ldGVycy5nZXQoU0VSVklDRV9DTEFTUyk7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTZXJ2aWNlIGNsYXNzIG5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ2xhc3MgPSBDbGFzc0xvYWRlclV0aWwubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlcnZpY2UgY2xhc3MgbmFtZSBjYW5ub3QgYmUgZm91bmQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNsYXNzLmlzQXNzaWduYWJsZUZyb20oRmlsdGVyQ21pc1NlcnZpY2UuY2xhc3MpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2VydmljZSBjbGFzcyBpcyBub3QgYSBzdWIgY2xhc3Mgb2YgRmlsdGVyQ21pc1NlcnZpY2UhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgc2VydmljZSBkZWZhdWx0cwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVmYXVsdE1heEl0ZW1zID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihTRVJWSUNFX0RFRkFVTFRfTUFYX0lURU1TX09CSkVDVFMsIERFRkFVTFRfTUFYX0lURU1TX09CSkVDVFMpOwotICAgICAgICAgICAgZGVmYXVsdERlcHRoID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihTRVJWSUNFX0RFRkFVTFRfREVQVEhfT0JKRUNUUywgREVGQVVMVF9ERVBUSF9PQkpFQ1RTKTsKLSAgICAgICAgICAgIGRlZmF1bHRUeXBlc01heEl0ZW1zID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihTRVJWSUNFX0RFRkFVTFRfTUFYX0lURU1TX1RZUEVTLCBERUZBVUxUX01BWF9JVEVNU19UWVBFUyk7Ci0gICAgICAgICAgICBkZWZhdWx0VHlwZXNEZXB0aCA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIoU0VSVklDRV9ERUZBVUxUX0RFUFRIX1RZUEVTLCBERUZBVUxUX0RFUFRIX1RZUEVTKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2Ugc2VydmljZSBkZWZhdWx0IHZhbHVlczogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzU2VydmljZSBnZXRTZXJ2aWNlKENhbGxDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQ2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlIHNlcnZpY2UgPSB0aHJlYWRMb2NhbFNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBuZXcgQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIoY3JlYXRlU2VydmljZShjb250ZXh0KSwgZGVmYXVsdFR5cGVzTWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUeXBlc0RlcHRoLCBkZWZhdWx0TWF4SXRlbXMsIGRlZmF1bHREZXB0aCk7Ci0gICAgICAgICAgICB0aHJlYWRMb2NhbFNlcnZpY2Uuc2V0KHNlcnZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VydmljZS5zZXRDYWxsQ29udGV4dChjb250ZXh0KTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHNlcnZpY2UgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEZpbHRlckNtaXNTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoQ2FsbENvbnRleHQgY29udGV4dCk7Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0U2VydmljZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWxlIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB0ZW1wRGlyZWN0b3J5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5VGhyZXNob2xkKCkgewotICAgICAgICByZXR1cm4gbWVtb3J5VGhyZXNob2xkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldE1heENvbnRlbnRTaXplKCkgewotICAgICAgICByZXR1cm4gbWF4Q29udGVudFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIEJpZ0ludGVnZXIgcGFyYW1ldGVyIGZyb20gdGhlIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihTdHJpbmcga2V5LCBCaWdJbnRlZ2VyIGRlZikgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldChrZXkpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcih2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL0NhY2hlZEJpbmRpbmdDbWlzU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL0NhY2hlZEJpbmRpbmdDbWlzU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzMxYzk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9DYWNoZWRCaW5kaW5nQ21pc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkFjbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRGlzY292ZXJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Qb2xpY3lTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuVmVyc2lvbmluZ1NlcnZpY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYSBmcmFtZXdvcmsgdG8gY2FjaGUgYSB7QGxpbmsgQ21pc0JpbmRpbmd9IG9iamVjdCBmb3IgYQotICoge0BsaW5rIEZpbHRlckNtaXNTZXJ2aWNlfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENhY2hlZEJpbmRpbmdDbWlzU2VydmljZSBleHRlbmRzIEZpbHRlckNtaXNTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBDbWlzQmluZGluZyBjbGllbnRCaW5kaW5nOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbENvbnRleHQoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlci5zZXRDYWxsQ29udGV4dChjb250ZXh0KTsKLQotICAgICAgICBjbGllbnRCaW5kaW5nID0gZ2V0Q21pc0JpbmRpbmdGcm9tQ2FjaGUoKTsKLSAgICAgICAgaWYgKGNsaWVudEJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xpZW50QmluZGluZyA9IHB1dENtaXNCaW5kaW5nSW50b0NhY2hlKGNyZWF0ZUNtaXNCaW5kaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNhY2hlZCB7QGxpbmsgQ21pc0JpbmRpbmd9IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotICAgICAqIGFwcHJvcHJpYXRlIG9iamVjdCBjYW4gYmUgZm91bmQgaW4gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBDbWlzQmluZGluZyBnZXRDbWlzQmluZGluZ0Zyb21DYWNoZSgpOwotCi0gICAgLyoqCi0gICAgICogUHV0cyB0aGUgcHJvdmlkZWQge0BsaW5rIENtaXNCaW5kaW5nfSBvYmplY3QgaW50byB0aGUgY2FjaGUgYW5kCi0gICAgICogYXNzb2NpYXRlcyBpdCBzb21laG93IHdpdGggdGhlIGN1cnJlbnQge0BsaW5rIENhbGxDb250ZXh0fS4KLSAgICAgKiAKLSAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWF5IHJldHVybiBhbm90aGVyIHtAbGluayBDbWlzQmluZGluZ30gb2JqZWN0IGlmCi0gICAgICogYW5vdGhlciB0aHJlYWQgaGFzIGFscmVhZHkgYWRkZWQgYW4gb2JqZWN0IGZvciB0aGUgY3VycmVudAotICAgICAqIHtAbGluayBDYWxsQ29udGV4dH0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IENtaXNCaW5kaW5nIHB1dENtaXNCaW5kaW5nSW50b0NhY2hlKENtaXNCaW5kaW5nIGJpbmRpbmcpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ21pc0JpbmRpbmd9IG9iamVjdCBiYXNlZCBvbiB0aGUgY3VycmVudAotICAgICAqIHtAbGluayBDYWxsQ29udGV4dH0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IENtaXNCaW5kaW5nIGNyZWF0ZUNtaXNCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBDbWlzQmluZGluZ30gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQmluZGluZyBnZXRDbWlzQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudEJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpIHsKLSAgICAgICAgcmV0dXJuIChIdHRwU2VydmxldFJlcXVlc3QpIGdldENhbGxDb250ZXh0KCkuZ2V0KENhbGxDb250ZXh0LkhUVFBfU0VSVkxFVF9SRVFVRVNUKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVwb3NpdG9yeVNlcnZpY2UgZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRCaW5kaW5nLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlIGdldE5hdmlnYXRpb25TZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gY2xpZW50QmluZGluZy5nZXROYXZpZ2F0aW9uU2VydmljZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RTZXJ2aWNlIGdldE9iamVjdFNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRCaW5kaW5nLmdldE9iamVjdFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmVyc2lvbmluZ1NlcnZpY2UgZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRCaW5kaW5nLmdldFZlcnNpb25pbmdTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpc2NvdmVyeVNlcnZpY2UgZ2V0RGlzY292ZXJ5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudEJpbmRpbmcuZ2V0RGlzY292ZXJ5U2VydmljZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNdWx0aUZpbGluZ1NlcnZpY2UgZ2V0TXVsdGlGaWxpbmdTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gY2xpZW50QmluZGluZy5nZXRNdWx0aUZpbGluZ1NlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVsYXRpb25zaGlwU2VydmljZSBnZXRSZWxhdGlvbnNoaXBTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gY2xpZW50QmluZGluZy5nZXRSZWxhdGlvbnNoaXBTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFjbFNlcnZpY2UgZ2V0QWNsU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudEJpbmRpbmcuZ2V0QWNsU2VydmljZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQb2xpY3lTZXJ2aWNlIGdldFBvbGljeVNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRCaW5kaW5nLmdldFBvbGljeVNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgY2xpZW50QmluZGluZyA9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL0ZpbHRlckNtaXNTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvRmlsdGVyQ21pc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmNDY2Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvRmlsdGVyQ21pc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlci5BYnN0cmFjdENtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQWNsU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Qb2xpY3lTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuVmVyc2lvbmluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQud3JhcHBlci5DYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2U7Ci0KLS8qKgotICogRm9yd2FyZHMgaW5jb21pbmcgY2FsbHMgdG8gYSBDTUlTIHJlcG9zaXRvcnkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWx0ZXJDbWlzU2VydmljZSBleHRlbmRzIEFic3RyYWN0Q21pc1NlcnZpY2UgaW1wbGVtZW50cyBDYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2UsCi0gICAgICAgIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgQ2FsbENvbnRleHQgY29udGV4dDsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBhZnRlciB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkIHRvIGJyaWRnZSBzZXJ2aWNlIGZhY3RvcnkKLSAgICAgKiBAcGFyYW0gbG9jawotICAgICAqICAgICAgICAgICAgYSBsb2NrIG9iamVjdCBzaGFyZWQgYnkgYWxsIHNlcnZpY2UgaW5zdGFuY2VzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIHJlcXVlc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbENvbnRleHQoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY2FsbCBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBDYWxsQ29udGV4dCBnZXRDYWxsQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNsaWVudCByZXBvc2l0b3J5IHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFJlcG9zaXRvcnlTZXJ2aWNlIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY2xpZW50IG5hdmlnYXRpb24gc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTmF2aWdhdGlvblNlcnZpY2UgZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjbGllbnQgb2JqZWN0IHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9iamVjdFNlcnZpY2UgZ2V0T2JqZWN0U2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNsaWVudCB2ZXJzaW9uaW5nIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFZlcnNpb25pbmdTZXJ2aWNlIGdldFZlcnNpb25pbmdTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY2xpZW50IGRpc2NvdmVyeSBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBEaXNjb3ZlcnlTZXJ2aWNlIGdldERpc2NvdmVyeVNlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjbGllbnQgbXVsdGlmaWxpbmcgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTXVsdGlGaWxpbmdTZXJ2aWNlIGdldE11bHRpRmlsaW5nU2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNsaWVudCByZWxhdGlvbnNoaXAgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgUmVsYXRpb25zaGlwU2VydmljZSBnZXRSZWxhdGlvbnNoaXBTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgY2xpZW50IEFDTCBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBBY2xTZXJ2aWNlIGdldEFjbFNlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjbGllbnQgcG9saWN5IHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFBvbGljeVNlcnZpY2UgZ2V0UG9saWN5U2VydmljZSgpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0UmVwb3NpdG9yeUluZm9zKGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRUeXBlRGVzY2VuZGFudHMocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGRlcHRoLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRDaGlsZHJlbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIG9yZGVyQnksIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldERlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0Rm9sZGVyVHJlZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldE5hdmlnYXRpb25TZXJ2aWNlKCkuZ2V0Rm9sZGVyVHJlZShyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBkZXB0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gZ2V0T2JqZWN0UGFyZW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRPYmplY3RQYXJlbnRzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldEZvbGRlclBhcmVudChyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0Q2hlY2tlZE91dERvY3MoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRDaGVja2VkT3V0RG9jcyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIG9yZGVyQnksCi0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jcmVhdGUocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0U2VydmljZSgpLmNyZWF0ZURvY3VtZW50KHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwKLSAgICAgICAgICAgICAgICBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldE9iamVjdFNlcnZpY2UoKS5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UocmVwb3NpdG9yeUlkLCBzb3VyY2VJZCwgcHJvcGVydGllcywgZm9sZGVySWQsCi0gICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldE9iamVjdFNlcnZpY2UoKS5jcmVhdGVGb2xkZXIocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbGF0aW9uc2hpcChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RTZXJ2aWNlKCkKLSAgICAgICAgICAgICAgICAuY3JlYXRlUmVsYXRpb25zaGlwKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RTZXJ2aWNlKCkuY3JlYXRlUG9saWN5KHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFsbG93YWJsZUFjdGlvbnMgZ2V0QWxsb3dhYmxlQWN0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0U2VydmljZSgpLmdldEFsbG93YWJsZUFjdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RTZXJ2aWNlKCkuZ2V0T2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RTZXJ2aWNlKCkuZ2V0UHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RTZXJ2aWNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0UmVuZGl0aW9ucyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwYXRoLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RTZXJ2aWNlKCkuZ2V0T2JqZWN0QnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc3RyZWFtSWQsIEJpZ0ludGVnZXIgb2Zmc2V0LAotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0U2VydmljZSgpLmdldENvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgc3RyZWFtSWQsIG9mZnNldCwgbGVuZ3RoLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZ2V0T2JqZWN0U2VydmljZSgpLnVwZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY2hhbmdlVG9rZW4sIHByb3BlcnRpZXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbW92ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgU3RyaW5nIHRhcmdldEZvbGRlcklkLCBTdHJpbmcgc291cmNlRm9sZGVySWQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZ2V0T2JqZWN0U2VydmljZSgpLm1vdmVPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdGFyZ2V0Rm9sZGVySWQsIHNvdXJjZUZvbGRlcklkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBnZXRPYmplY3RTZXJ2aWNlKCkuZGVsZXRlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdE9yQ2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIFRPRE86IHJld29yayAtPiBvYmplY3QgY2FjaGUKLSAgICAgICAgZ2V0T2JqZWN0U2VydmljZSgpLmRlbGV0ZU9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmFpbGVkVG9EZWxldGVEYXRhIGRlbGV0ZVRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0U2VydmljZSgpLmRlbGV0ZVRyZWUocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgYWxsVmVyc2lvbnMsIHVuZmlsZU9iamVjdHMsIGNvbnRpbnVlT25GYWlsdXJlLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBvdmVyd3JpdGVGbGFnLAotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGdldE9iamVjdFNlcnZpY2UoKS5zZXRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGNoYW5nZVRva2VuLCBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZ2V0T2JqZWN0U2VydmljZSgpLmRlbGV0ZUNvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY2hhbmdlVG9rZW4sIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKSB7Ci0gICAgICAgIGdldFZlcnNpb25pbmdTZXJ2aWNlKCkuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uLCBjb250ZW50Q29waWVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBnZXRWZXJzaW9uaW5nU2VydmljZSgpLmNhbmNlbENoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2hlY2tJbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBtYWpvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hlY2tpbkNvbW1lbnQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGdldFZlcnNpb25pbmdTZXJ2aWNlKCkuY2hlY2tJbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBtYWpvciwgcHJvcGVydGllcywgY29udGVudFN0cmVhbSwgY2hlY2tpbkNvbW1lbnQsCi0gICAgICAgICAgICAgICAgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3RPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBtYWpvciwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRWZXJzaW9uaW5nU2VydmljZSgpLmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBtYWpvciwKLSAgICAgICAgICAgICAgICBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QWxsVmVyc2lvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRWZXJzaW9uaW5nU2VydmljZSgpLmdldEFsbFZlcnNpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgZmlsdGVyLAotICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0RGlzY292ZXJ5U2VydmljZSgpLmdldENvbnRlbnRDaGFuZ2VzKHJlcG9zaXRvcnlJZCwgY2hhbmdlTG9nVG9rZW4sIGluY2x1ZGVQcm9wZXJ0aWVzLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgbWF4SXRlbXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0RGlzY292ZXJ5U2VydmljZSgpLnF1ZXJ5KHJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRPYmplY3RUb0ZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBnZXRNdWx0aUZpbGluZ1NlcnZpY2UoKS5hZGRPYmplY3RUb0ZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgYWxsVmVyc2lvbnMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGdldE11bHRpRmlsaW5nU2VydmljZSgpLnJlbW92ZU9iamVjdEZyb21Gb2xkZXIocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZm9sZGVySWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlbGF0aW9uc2hpcFNlcnZpY2UoKS5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcywKLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIHR5cGVJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0QWNsU2VydmljZSgpLmFwcGx5QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGFjbFByb3BhZ2F0aW9uLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWNlcywgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24pIHsKLSAgICAgICAgQWNsIG9yZ0FjbCA9IGdldEFjbFNlcnZpY2UoKS5nZXRBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0KLSAgICAgICAgQWNsIHJlbW92ZUFjZXMgPSBudWxsOwotICAgICAgICBpZiAob3JnQWNsICE9IG51bGwgJiYgb3JnQWNsLmdldEFjZXMoKSAhPSBudWxsICYmICFvcmdBY2wuZ2V0QWNlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgTGlzdDxBY2U+IGRpcmVjdEFjZXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oKTsKLQotICAgICAgICAgICAgZm9yIChBY2UgYWNlIDogb3JnQWNsLmdldEFjZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChhY2UuaXNEaXJlY3QoKSkgewotICAgICAgICAgICAgICAgICAgICBkaXJlY3RBY2VzLmFkZChhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFkaXJlY3RBY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUFjZXMgPSBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKGRpcmVjdEFjZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldEFjbFNlcnZpY2UoKS5hcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2VzLCByZW1vdmVBY2VzLCBhY2xQcm9wYWdhdGlvbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFjbCBnZXRBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldEFjbFNlcnZpY2UoKS5nZXRBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgb25seUJhc2ljUGVybWlzc2lvbnMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBnZXRQb2xpY3lTZXJ2aWNlKCkuYXBwbHlQb2xpY3kocmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QXBwbGllZFBvbGljaWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0UG9saWN5U2VydmljZSgpLmdldEFwcGxpZWRQb2xpY2llcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZ2V0UG9saWN5U2VydmljZSgpLnJlbW92ZVBvbGljeShyZXBvc2l0b3J5SWQsIHBvbGljeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0SW5mbyBnZXRPYmplY3RJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICAvLyBUT0RPOiBhZGQgaW50ZWxsaWdlbnQgb2JqZWN0IGluZm8gY2FjaGUKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE9iamVjdEluZm8ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdEluZm8gZ2V0T2JqZWN0SW5mb0ludGVybihTdHJpbmcgcmVwb3NpdG9yeUlkLCBPYmplY3REYXRhIG9iamVjdCkgewotICAgICAgICAvLyBUT0RPOiBhZGQgaW50ZWxsaWdlbnQgb2JqZWN0IGluZm8gY2FjaGUKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE9iamVjdEluZm9JbnRlcm4ocmVwb3NpdG9yeUlkLCBvYmplY3QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICBjb250ZXh0ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvY2xpZW50L1NpbXBsZUNtaXNCaW5kaW5nRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL2NsaWVudC9TaW1wbGVDbWlzQmluZGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwMTIxYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvY2xpZW50L1NpbXBsZUNtaXNCaW5kaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLkNtaXNCaW5kaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLQotLyoqCi0gKiBDcmVhdGVzIGEge0BsaW5rIENtaXNCaW5kaW5nfSBvYmplY3QgZm9yIGEgc2V0IG9mIHBhcmFtZXRlcnMgYW5kIGEKLSAqIHtAbGluayBDYWxsQ29udGV4dH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVDbWlzQmluZGluZ0ZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ21pc0JpbmRpbmdGYWN0b3J5IEJJTkRJTkdfRkFDVE9SWSA9IENtaXNCaW5kaW5nRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgcHVibGljIHN0YXRpYyBDbWlzQmluZGluZyBjcmVhdGVDbWlzQmluZGluZyhDYWxsQ29udGV4dCBjb250ZXh0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPihiaW5kaW5nUGFyYW1ldGVycyk7Ci0KLSAgICAgICAgLy8gZm9yd2FyZCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgY29udGV4dC5nZXRVc2VybmFtZSgpKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5QQVNTV09SRCwgY29udGV4dC5nZXRQYXNzd29yZCgpKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGJpbmRpbmcgb2JqZWN0Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZVN0ciA9IHBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFKTsKLSAgICAgICAgQmluZGluZ1R5cGUgYmluZGluZ1R5cGUgPSBCaW5kaW5nVHlwZS5mcm9tVmFsdWUoYmluZGluZ1R5cGVTdHIpOwotCi0gICAgICAgIENtaXNCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotICAgICAgICBzd2l0Y2ggKGJpbmRpbmdUeXBlKSB7Ci0gICAgICAgIGNhc2UgV0VCU0VSVklDRVM6Ci0gICAgICAgICAgICBiaW5kaW5nID0gQklORElOR19GQUNUT1JZLmNyZWF0ZUNtaXNXZWJTZXJ2aWNlc0JpbmRpbmcocGFyYW1ldGVycyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUk9XU0VSOgotICAgICAgICAgICAgYmluZGluZyA9IEJJTkRJTkdfRkFDVE9SWS5jcmVhdGVDbWlzQnJvd3NlckJpbmRpbmcocGFyYW1ldGVycyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJpbmRpbmcgPSBCSU5ESU5HX0ZBQ1RPUlkuY3JlYXRlQ21pc0F0b21QdWJCaW5kaW5nKHBhcmFtZXRlcnMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvaHR0cHNlc3Npb24vSHR0cFNlc3Npb25CcmlkZ2VTZXJ2aWNlRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL2h0dHBzZXNzaW9uL0h0dHBTZXNzaW9uQnJpZGdlU2VydmljZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4ZGYxOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvaHR0cHNlc3Npb24vSHR0cFNlc3Npb25CcmlkZ2VTZXJ2aWNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5odHRwc2Vzc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icmlkZ2UuQWJzdHJhY3RCcmlkZ2VTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icmlkZ2UuRmlsdGVyQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSHR0cFNlc3Npb25CcmlkZ2VTZXJ2aWNlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QnJpZGdlU2VydmljZUZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZpbHRlckNtaXNTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBIdHRwU2Vzc2lvbkNtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IChIdHRwU2Vzc2lvbkNtaXNTZXJ2aWNlKSBnZXRTZXJ2aWNlQ2xhc3MoKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIHNlcnZpY2UgaW5zdGFuY2U6ICIgKyBlLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlcnZpY2UuaW5pdChnZXRQYXJhbWV0ZXJzKCksIGxvY2spOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL2h0dHBzZXNzaW9uL0h0dHBTZXNzaW9uQ21pc1NlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9odHRwc2Vzc2lvbi9IdHRwU2Vzc2lvbkNtaXNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTM5MTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL2h0dHBzZXNzaW9uL0h0dHBTZXNzaW9uQ21pc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icmlkZ2UuaHR0cHNlc3Npb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icmlkZ2UuQ2FjaGVkQmluZGluZ0NtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkNtaXNCaW5kaW5nOwotCi0vKioKLSAqIFVzZXMgSFRUUCBzZXNzaW9ucyB0byBjYWNoZSB7QGxpbmsgQ21pc0JpbmRpbmd9IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIdHRwU2Vzc2lvbkNtaXNTZXJ2aWNlIGV4dGVuZHMgQ2FjaGVkQmluZGluZ0NtaXNTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqIEtleSBpbiB0aGUgSFRUUCBzZXNzaW9uLiAqKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTX0JJTkRJTkcgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlLmJpbmRpbmciOwotCi0gICAgcHJpdmF0ZSBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2s7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrKSB7Ci0gICAgICAgIGluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHRoaXMubG9jayA9IGxvY2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNCaW5kaW5nIGdldENtaXNCaW5kaW5nRnJvbUNhY2hlKCkgewotICAgICAgICBIdHRwU2Vzc2lvbiBodHRwU2Vzc2lvbiA9IGdldEh0dHBTZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgaWYgKGh0dHBTZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoQ21pc0JpbmRpbmcpIGh0dHBTZXNzaW9uLmdldEF0dHJpYnV0ZShDTUlTX0JJTkRJTkcpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNCaW5kaW5nIHB1dENtaXNCaW5kaW5nSW50b0NhY2hlKENtaXNCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHR0cFNlc3Npb24gPSBnZXRIdHRwU2Vzc2lvbih0cnVlKTsKLQotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENtaXNCaW5kaW5nIGV4aXN0aW5nQmluZGluZyA9IChDbWlzQmluZGluZykgaHR0cFNlc3Npb24uZ2V0QXR0cmlidXRlKENNSVNfQklORElORyk7Ci0gICAgICAgICAgICBpZiAoZXhpc3RpbmdCaW5kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBodHRwU2Vzc2lvbi5zZXRBdHRyaWJ1dGUoQ01JU19CSU5ESU5HLCBiaW5kaW5nKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZyA9IGV4aXN0aW5nQmluZGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgSHR0cFNlc3Npb259LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjcmVhdGUKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNyZWF0ZSBhIG5ldyBzZXNzaW9uLCA8Y29kZT5mYWxzZTwvY29kZT4KLSAgICAgKiAgICAgICAgICAgIHRvIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0SHR0cFNlc3Npb24oYm9vbGVhbiBjcmVhdGUpIHsKLSAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlc3Npb24oY3JlYXRlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvaHR0cHNlc3Npb24vc2FtcGxlL1NpbXBsZUZvcndhcmRpbmdDbWlzU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL2h0dHBzZXNzaW9uL3NhbXBsZS9TaW1wbGVGb3J3YXJkaW5nQ21pc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmYmYxZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvaHR0cHNlc3Npb24vc2FtcGxlL1NpbXBsZUZvcndhcmRpbmdDbWlzU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5odHRwc2Vzc2lvbi5zYW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlLkZpbHRlckNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5jbGllbnQuU2ltcGxlQ21pc0JpbmRpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5odHRwc2Vzc2lvbi5IdHRwU2Vzc2lvbkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLQotLyoqCi0gKiBWZXJ5IHNpbXBsZSBleGFtcGxlIG9mIGEgY29uY3JldGUge0BsaW5rIEZpbHRlckNtaXNTZXJ2aWNlfSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUZvcndhcmRpbmdDbWlzU2VydmljZSBleHRlbmRzIEh0dHBTZXNzaW9uQ21pc1NlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19QQVJBTUVURVJTX1BSRUZJWCA9ICJmb3J3YXJkaW5nLmJpbmRpbmcuIjsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBiaW5kaW5nUGFyYW1ldGVyczsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgLy8gZ2F0aGVyIGJpbmRpbmcgcGFyYW1ldGVycwotICAgICAgICBiaW5kaW5nUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBwIDogcGFyYW1ldGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAocC5nZXRLZXkoKS5zdGFydHNXaXRoKEJJTkRJTkdfUEFSQU1FVEVSU19QUkVGSVgpKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ1BhcmFtZXRlcnMucHV0KHAuZ2V0S2V5KCkuc3Vic3RyaW5nKEJJTkRJTkdfUEFSQU1FVEVSU19QUkVGSVgubGVuZ3RoKCkpLCBwLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNCaW5kaW5nIGNyZWF0ZUNtaXNCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gU2ltcGxlQ21pc0JpbmRpbmdGYWN0b3J5LmNyZWF0ZUNtaXNCaW5kaW5nKGdldENhbGxDb250ZXh0KCksIGJpbmRpbmdQYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwSW5mbyA9IGdldENtaXNCaW5kaW5nKCkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5SWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUluZm9JbXBsIG5ld1JlcEluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKHJlcEluZm8pOwotICAgICAgICBuZXdSZXBJbmZvLnNldERlc2NyaXB0aW9uKHJlcEluZm8uZ2V0RGVzY3JpcHRpb24oKSArICIgKGZvcndhcmRlZCBieSB0aGUgT3BlbkNNSVMgQnJpZGdlKSIpOwotCi0gICAgICAgIHJldHVybiBuZXdSZXBJbmZvOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL2xydWNhY2hlL0NtaXNCaW5kaW5nQ2FjaGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9scnVjYWNoZS9DbWlzQmluZGluZ0NhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTQyMzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvYnJpZGdlL2xydWNhY2hlL0NtaXNCaW5kaW5nQ2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icmlkZ2UubHJ1Y2FjaGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLQotLyoqCi0gKiBTaW1wbGUgTFJVIGNhY2hlIGZvciB7QGxpbmsgQ21pc0JpbmRpbmd9IG9iamVjdHMuIFRoZSBjYWNoZSBrZXkgaXMgY29uc2lzdHMKLSAqIG9mIHRoZSByZXBvc2l0b3J5IGlkIGFuZCB0aGUgdXNlci4KLSAqLwotcHVibGljIGNsYXNzIENtaXNCaW5kaW5nQ2FjaGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoTWFwPFN0cmluZywgQ21pc0JpbmRpbmc+IGNhY2hlOwotCi0gICAgcHVibGljIENtaXNCaW5kaW5nQ2FjaGUoZmluYWwgaW50IHNpemUpIHsKLSAgICAgICAgY2FjaGUgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIENtaXNCaW5kaW5nPihzaXplICsgMSwgMC43MGYsIHRydWUpIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PFN0cmluZywgQ21pc0JpbmRpbmc+IGVsZGVzdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzaXplKCkgPiBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzQmluZGluZyBnZXRDbWlzQmluZGluZyhDYWxsQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChnZXRDYWNoZUtleShjb250ZXh0KSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNCaW5kaW5nIHB1dENtaXNCaW5kaW5nKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0Q2FjaGVLZXkoY29udGV4dCk7Ci0gICAgICAgICAgICBDbWlzQmluZGluZyBleHRpc3RpbmdCaW5kaW5nID0gY2FjaGUuZ2V0KGdldENhY2hlS2V5KGNvbnRleHQpKTsKLSAgICAgICAgICAgIGlmIChleHRpc3RpbmdCaW5kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWNoZS5wdXQoa2V5LCBiaW5kaW5nKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZyA9IGV4dGlzdGluZ0JpbmRpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2FjaGVLZXkoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gY29udGV4dC5nZXRSZXBvc2l0b3J5SWQoKTsKLSAgICAgICAgU3RyaW5nIHVzZXIgPSBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IChyZXBvc2l0b3J5SWQgPT0gbnVsbCA/ICIiIDogcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgaWYgKHVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAga2V5ID0ga2V5ICsgIlxuIiArIHVzZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9scnVjYWNoZS9McnVDYWNoZUJyaWRnZVNlcnZpY2VGYWN0b3J5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvbHJ1Y2FjaGUvTHJ1Q2FjaGVCcmlkZ2VTZXJ2aWNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQzZTdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9scnVjYWNoZS9McnVDYWNoZUJyaWRnZVNlcnZpY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlLmxydWNhY2hlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5BYnN0cmFjdEJyaWRnZVNlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5GaWx0ZXJDbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBMcnVDYWNoZUJyaWRnZVNlcnZpY2VGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RCcmlkZ2VTZXJ2aWNlRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFID0gImNhY2hlLnNpemUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FDSEVfU0laRSA9IDEwMDA7Ci0KLSAgICBwcml2YXRlIENtaXNCaW5kaW5nQ2FjaGUgY2FjaGU7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotCi0gICAgICAgIC8vIGluaXRpYWxpemUgTFJVIGNhY2hlCi0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBzaXplU3RyID0gcGFyYW1ldGVycy5nZXQoQ0FDSEVfU0laRSk7Ci0gICAgICAgICAgICBzaXplID0gKHNpemVTdHIgPT0gbnVsbCB8fCBzaXplU3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwID8gREVGQVVMVF9DQUNIRV9TSVpFIDogSW50ZWdlci5wYXJzZUludChzaXplU3RyCi0gICAgICAgICAgICAgICAgICAgIC50cmltKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgY2FjaGUgY29uZmlndXJhdGlvbiB2YWx1ZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYWNoZSA9IG5ldyBDbWlzQmluZGluZ0NhY2hlKHNpemUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBGaWx0ZXJDbWlzU2VydmljZSBjcmVhdGVTZXJ2aWNlKENhbGxDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgTHJ1Q2FjaGVDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSAoTHJ1Q2FjaGVDbWlzU2VydmljZSkgZ2V0U2VydmljZUNsYXNzKCkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBzZXJ2aWNlIGluc3RhbmNlOiAiICsgZSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXJ2aWNlLmluaXQoZ2V0UGFyYW1ldGVycygpLCBjYWNoZSk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9scnVjYWNoZS9McnVDYWNoZUNtaXNTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icmlkZ2UvbHJ1Y2FjaGUvTHJ1Q2FjaGVDbWlzU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA5YjE5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2JyaWRnZS9scnVjYWNoZS9McnVDYWNoZUNtaXNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlLmxydWNhY2hlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJyaWRnZS5DYWNoZWRCaW5kaW5nQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci0KLS8qKgotICogVXNlcyBhIExSVSBjYWNoZSB0byBjYWNoZSB7QGxpbmsgQ21pc0JpbmRpbmd9IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMcnVDYWNoZUNtaXNTZXJ2aWNlIGV4dGVuZHMgQ2FjaGVkQmluZGluZ0NtaXNTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBDbWlzQmluZGluZ0NhY2hlIGNhY2hlOwotCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIENtaXNCaW5kaW5nQ2FjaGUgY2FjaGUpIHsKLSAgICAgICAgaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzQmluZGluZyBnZXRDbWlzQmluZGluZ0Zyb21DYWNoZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhY2hlLmdldENtaXNCaW5kaW5nKGdldENhbGxDb250ZXh0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzQmluZGluZyBwdXRDbWlzQmluZGluZ0ludG9DYWNoZShDbWlzQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIHJldHVybiBjYWNoZS5wdXRDbWlzQmluZGluZyhnZXRDYWxsQ29udGV4dCgpLCBiaW5kaW5nKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL0xJQ0VOU0UgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGU3YjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tLQotCi1QbGVhc2Ugc2VlIGFsc28gVEhSSUQtUEFSVFktTElDRU5TRVMuCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL05PVElDRSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZiYmUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi1PcGVuQ01JUyBCcmlkZ2UKLUNvcHlyaWdodCAyMDA5LTIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQotT3BlbkNNSVMgY29udGFpbnMgY29kZSBmcm9tIHRoZSBmb2xsb3dpbmcgT3BlbiBTb3VyY2UgcHJvamVjdHM6Ci0KLS0gQmFzZTY0IAotICBDb3B5cmlnaHQgKGMpIDIwMTAgUm9iZXJ0IEhhcmRlcgotICBQdWJsaWMgRG9tYWluLCA8aHR0cDovL2loYXJkZXIubmV0L2Jhc2U2ND4KLQotLSBKU09OLnNpbXBsZQotICBDb3B5cmlnaHQgKGMpIDIwMTIgWWlkb25nIEZhbmcKLSAgQXBhY2hlIExpY2Vuc2UgMi4wLCA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2ltcGxlLz4KLSAgCi0gIAotT3BlbkNNSVMgY29udGFpbnMgT0FTSVMgQ01JUyAxLjAgYW5kIENNSVMgMS4xIHNjaGVtYSBhbmQgV1NETCBmaWxlcy4KLUNvcHlyaWdodCAoYykgMjAxMCBhbmQgMjAxMyBPQVNJUyBPcGVuCi08aHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9jbWlzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWM1ZDdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3JlcG9zaXRvcnkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBCcmlkZ2UgY29uZmlndXJhdGlvbgotIwotIyBOb3RlOiBjbGFzcyBNVVNUIGJlIHNldAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotY2xhc3M9b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJpZGdlLmh0dHBzZXNzaW9uLkh0dHBTZXNzaW9uQnJpZGdlU2VydmljZUZhY3RvcnkKLSMgYnJpZGdlLnRlbXBEaXJlY3Rvcnk9L3RtcAotIyBicmlkZ2UubWVtb3J5VGhyZXNob2xkPTQxOTQzMDQKLSMgYnJpZGdlLm1heENvbnRlbnRTaXplPTQyOTQ5NjcyOTYKLQotIyBjYWNoZS5zaXplPTEwMDAKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24KLSMKLSMgTm90ZTogc2VydmljZS5jbGFzcyBNVVNUIGJlIHNldAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotc2VydmljZS5jbGFzcz1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icmlkZ2UuaHR0cHNlc3Npb24uc2FtcGxlLlNpbXBsZUZvcndhcmRpbmdDbWlzU2VydmljZQotIyBzZXJ2aWNlLmRlZmF1bHRNYXhJdGVtcz0xMDAwMDAKLSMgc2VydmljZS5kZWZhdWx0RGVwdGg9LTEKLSMgc2VydmljZS5kZWZhdWx0VHlwZXNNYXhJdGVtcz0xMDAwCi0jIHNlcnZpY2UuZGVmYXVsdFR5cGVzRGVwdGg9MTAKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBTYW1wbGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIFNpbXBsZUZvcndhcmRpbmdDbWlzU2VydmljZQotIwotIyBOb3RlOiB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGFyZSBhZGRlZCBvbi10aGUtZmx5Ci0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1mb3J3YXJkaW5nLmJpbmRpbmcub3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1icm93c2VyCi1mb3J3YXJkaW5nLmJpbmRpbmcub3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5icm93c2VyLnVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvaW5tZW1vcnkvYnJvd3NlcgotZm9yd2FyZGluZy5iaW5kaW5nLm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuY29tcHJlc3Npb249dHJ1ZQotZm9yd2FyZGluZy5iaW5kaW5nLm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuY29va2llcz10cnVlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2Uvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlkNzNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuICAKLS0tPgotPHdlYi1hcHAgdmVyc2lvbj0iMi40IgotCXhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCI+Ci0KLQk8ZGlzcGxheS1uYW1lPk9wZW5DTUlTIEJyaWRnZTwvZGlzcGxheS1uYW1lPgotCi0JPGxpc3RlbmVyPgotCQk8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuQ21pc1JlcG9zaXRvcnlDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotCTwvbGlzdGVuZXI+Ci0JCi0JPGxpc3RlbmVyPgotCQk8bGlzdGVuZXItY2xhc3M+Y29tLnN1bi54bWwud3MudHJhbnNwb3J0Lmh0dHAuc2VydmxldC5XU1NlcnZsZXRDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgotCTwvbGlzdGVuZXI+Ci0JCi0JPHNlcnZsZXQ+Ci0JCTxzZXJ2bGV0LW5hbWU+Y21pc3dzPC9zZXJ2bGV0LW5hbWU+Ci0JCTxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkNtaXNXZWJTZXJ2aWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0JCTxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotCTwvc2VydmxldD4KLQotCTxzZXJ2bGV0PgotCQk8c2VydmxldC1uYW1lPmNtaXNhdG9tPC9zZXJ2bGV0LW5hbWU+Ci0JCTxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQ21pc0F0b21QdWJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxwYXJhbS1uYW1lPmNhbGxDb250ZXh0SGFuZGxlcjwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkJhc2ljQXV0aENhbGxDb250ZXh0SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQkJPGxvYWQtb24tc3RhcnR1cD4yPC9sb2FkLW9uLXN0YXJ0dXA+Ci0JPC9zZXJ2bGV0PgotCQotCTxzZXJ2bGV0PgotCQk8c2VydmxldC1uYW1lPmNtaXNicm93c2VyPC9zZXJ2bGV0LW5hbWU+Ci0JCTxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXIuQ21pc0Jyb3dzZXJCaW5kaW5nU2VydmxldDwvc2VydmxldC1jbGFzcz4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8cGFyYW0tbmFtZT5jYWxsQ29udGV4dEhhbmRsZXI8L3BhcmFtLW5hbWU+Ci0JCQk8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5CYXNpY0F1dGhDYWxsQ29udGV4dEhhbmRsZXI8L3BhcmFtLXZhbHVlPgotCQk8L2luaXQtcGFyYW0+Ci0JCTxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgotCTwvc2VydmxldD4KLQotCTxzZXJ2bGV0LW1hcHBpbmc+Ci0JCTxzZXJ2bGV0LW5hbWU+Y21pc3dzPC9zZXJ2bGV0LW5hbWU+Ci0JCTx1cmwtcGF0dGVybj4vc2VydmljZXMvKjwvdXJsLXBhdHRlcm4+Ci0JPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLQk8c2VydmxldC1tYXBwaW5nPgotCQk8c2VydmxldC1uYW1lPmNtaXNhdG9tPC9zZXJ2bGV0LW5hbWU+Ci0JCTx1cmwtcGF0dGVybj4vYXRvbS8qPC91cmwtcGF0dGVybj4KLQk8L3NlcnZsZXQtbWFwcGluZz4KLQotCTxzZXJ2bGV0LW1hcHBpbmc+Ci0JCTxzZXJ2bGV0LW5hbWU+Y21pc2Jyb3dzZXI8L3NlcnZsZXQtbmFtZT4KLQkJPHVybC1wYXR0ZXJuPi9icm93c2VyLyo8L3VybC1wYXR0ZXJuPgotCTwvc2VydmxldC1tYXBwaW5nPgotCi0JPHNlc3Npb24tY29uZmlnPgotCQk8c2Vzc2lvbi10aW1lb3V0PjYwPC9zZXNzaW9uLXRpbWVvdXQ+Ci0JPC9zZXNzaW9uLWNvbmZpZz4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhODAwNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+T3BlbkNNSVMgQ2xpZW50IEFQSTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8cGFyZW50QmFzZWRpcj4uLi8uLi88L3BhcmVudEJhc2VkaXI+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+ICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEZpbGU+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vTUVUQS1JTkYvTUFOSUZFU1QuTUY8L21hbmlmZXN0RmlsZT4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPiAKLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtmZWxpeC5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idW5kbGUtbWFuaWZlc3Q8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1hbmlmZXN0PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4gICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQ7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuKjt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufQotICAgICAgICAgICAgICAgICAgICAgICAgPC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtRG9jVVJMPiR7cHJvamVjdC51cmx9PC9CdW5kbGUtRG9jVVJMPgotICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L1Nlc3Npb25GYWN0b3J5RmluZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L1Nlc3Npb25GYWN0b3J5RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjRjMjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9TZXNzaW9uRmFjdG9yeUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnk7Ci0KLS8qKgotICogRmluZHMgYSB7QGxpbmsgU2Vzc2lvbkZhY3Rvcnl9IGltcGxlbWVudGF0aW9uIGFuZCBjcmVhdGVzIGEgZmFjdG9yeSBvYmplY3QuCi0gKiA8cD4KLSAqIFNhbXBsZSBjb2RlOgotICogPHA+Ci0gKiAKLSAqIDxwcmU+Ci0gKiBTZXNzaW9uRmFjdG9yeSBmYWN0b3J5ID0gU2Vzc2lvbkZhY3RvcnlGaW5kZXIuZmluZCgpOwotICogCi0gKiBNYXAmbHQ7U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlciA9IG5ldyBIYXNoTWFwJmx0O1N0cmluZywgU3RyaW5nPigpOwotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLlVTRVIsICJPdHRvIik7Ci0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuUEFTU1dPUkQsICIqKioqIik7Ci0gKiAKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCwgImh0dHA6Ly9sb2NhbGhvc3QvY21pcy9hdG9tIik7Ci0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFLCBCaW5kaW5nVHlwZS5BVE9NUFVCLnZhbHVlKCkpOwotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQsICJteVJlcG9zaXRvcnkiKTsKLSAqIC4uLgotICogU2Vzc2lvbiBzZXNzaW9uID0gZmFjdG9yeS5jcmVhdGVTZXNzaW9uKHBhcmFtZXRlcik7Ci0gKiA8L3ByZT4KLSAqIAotICogQHNlZSBTZXNzaW9uRmFjdG9yeQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2Vzc2lvbkZhY3RvcnlGaW5kZXIgewotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlc3Npb25GYWN0b3J5RmluZGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IHtAbGluayBTZXNzaW9uRmFjdG9yeX0gb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQge0BsaW5rIFNlc3Npb25GYWN0b3J5fSBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2Vzc2lvbiBmYWN0b3J5IGNsYXNzIGNhbm5vdCBiZSBmb3VuZAotICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzZXNzaW9uIGZhY3Rvcnkgb2JqZWN0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlc3Npb25GYWN0b3J5IGZpbmQoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBmaW5kKCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuU2Vzc2lvbkZhY3RvcnkiLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFNlc3Npb25GYWN0b3J5fSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGZhY3RvcnkgSUQgb2YgdGhlIHtAbGluayBTZXNzaW9uRmFjdG9yeX0KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHtAbGluayBTZXNzaW9uRmFjdG9yeX0gb2JqZWN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNlc3Npb24gZmFjdG9yeSBjbGFzcyBjYW5ub3QgYmUgZm91bmQKLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2Vzc2lvbiBmYWN0b3J5IG9iamVjdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXNzaW9uRmFjdG9yeSBmaW5kKFN0cmluZyBmYWN0b3J5SWQpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZpbmQoZmFjdG9yeUlkLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFNlc3Npb25GYWN0b3J5fSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGZhY3RvcnkgSUQgb2YgdGhlIHtAbGluayBTZXNzaW9uRmFjdG9yeX0KLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB7QGxpbmsgU2Vzc2lvbkZhY3Rvcnl9IG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBzZXNzaW9uIGZhY3RvcnkgY2xhc3MgY2Fubm90IGJlIGZvdW5kCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNlc3Npb24gZmFjdG9yeSBvYmplY3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvbkZhY3RvcnkgZmluZChTdHJpbmcgZmFjdG9yeUlkLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZpbmQoZmFjdG9yeUlkLCBjbGFzc0xvYWRlciwgIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLlNlc3Npb25GYWN0b3J5SW1wbCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgU2Vzc2lvbkZhY3Rvcnl9IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgZmFjdG9yeSBJRCBvZiB0aGUge0BsaW5rIFNlc3Npb25GYWN0b3J5fQotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlcgotICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGxvYWRlciB0byB1c2UKLSAgICAgKiBAcGFyYW0gZmFsbGJhY2tDbGFzc05hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byB1c2UgaWYgbm8gb3RoZXIgY2xhc3MgbmFtZSBoYXMgYmVlbgotICAgICAqICAgICAgICAgICAgcHJvdmlkZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHtAbGluayBTZXNzaW9uRmFjdG9yeX0gb2JqZWN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIHNlc3Npb24gZmFjdG9yeSBjbGFzcyBjYW5ub3QgYmUgZm91bmQKLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc2Vzc2lvbiBmYWN0b3J5IG9iamVjdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2Vzc2lvbkZhY3RvcnkgZmluZChTdHJpbmcgZmFjdG9yeUlkLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgU3RyaW5nIGZhbGxiYWNrQ2xhc3NOYW1lKQotICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IGNsYXNzTG9hZGVyOwotICAgICAgICBpZiAoY2wgPT0gbnVsbCkgewotICAgICAgICAgICAgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgaWYgKGNsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbCA9IFNlc3Npb25GYWN0b3J5RmluZGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZmFjdG9yeUNsYXNzTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYWN0b3J5Q2xhc3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KGZhY3RvcnlJZCk7Ci0KLSAgICAgICAgICAgIGlmIChmYWN0b3J5Q2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUlkID0gIk1FVEEtSU5GL3NlcnZpY2VzLyIgKyBmYWN0b3J5SWQ7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShzZXJ2aWNlSWQpOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sICJVVEYtOCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzc05hbWUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmFjdG9yeUNsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWN0b3J5Q2xhc3NOYW1lID0gZmFsbGJhY2tDbGFzc05hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzczw/PiBjbGF6eiA9IGNsLmxvYWRDbGFzcyhmYWN0b3J5Q2xhc3NOYW1lKTsKLQotICAgICAgICBTZXNzaW9uRmFjdG9yeSByZXN1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kIG5ld0luc3RhbmNlTWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJuZXdJbnN0YW5jZSIsIG5ldyBDbGFzc1swXSk7Ci0KLSAgICAgICAgICAgIGlmICghU2Vzc2lvbkZhY3RvcnkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShuZXdJbnN0YW5jZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oIm5ld0luc3RhbmNlKCkgbWV0aG9kIGRvZXMgbm90IHJldHVybiBhIFNlc3Npb25GYWN0b3J5IG9iamVjdCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAoU2Vzc2lvbkZhY3RvcnkpIG5ld0luc3RhbmNlTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2Vzc2lvbkZhY3Rvcnkgb2JqZWN0ISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotICAgICAgICAgICAgaWYgKCFTZXNzaW9uRmFjdG9yeS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJUaGUgY2xhc3MgZG9lcyBub3QgaW1wbGVtbnQgdGhlIFNlc3Npb25GYWN0b3J5IGludGVyZmFjZSEiLCBuc21lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAoU2Vzc2lvbkZhY3RvcnkpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlc3Npb25GYWN0b3J5IG9iamVjdCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9TZXNzaW9uUGFyYW1ldGVyTWFwLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L1Nlc3Npb25QYXJhbWV0ZXJNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwMzFkMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L1Nlc3Npb25QYXJhbWV0ZXJNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmluZGluZ1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogQSBtYXAgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHNldCBzZXNzaW9uIHBhcmFtZXRlcnMuCi0gKiA8cD4KLSAqIFNhbXBsZSBjb2RlOgotICogPHA+Ci0gKiAKLSAqIDxwcmU+Ci0gKiBTZXNzaW9uRmFjdG9yeSBmYWN0b3J5ID0gLi4uCi0gKiAKLSAqIFNlc3Npb25QYXJhbWV0ZXJNYXAgcGFyYW1ldGVyID0gbmV3IFNlc3Npb25QYXJhbWV0ZXJNYXAoKTsKLSAqIAotICogcGFyYW1ldGVyLnNldEJhc2ljQXV0aGVudGljYXRpb24oIk90dG8iLCAiKioqKiIpOwotICogcGFyYW1ldGVyLnNldEF0b21QdWJCaW5kaW5nVXJsKCJodHRwOi8vbG9jYWxob3N0L2NtaXMvYXRvbSIpOwotICogcGFyYW1ldGVyLnNldFJlcG9zaXRvcnlJZCgibXlSZXBvc2l0b3J5Iik7Ci0gKiAuLi4KLSAqIFNlc3Npb24gc2Vzc2lvbiA9IGZhY3RvcnkuY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXIpOwotICogPC9wcmU+Ci0gKiAKLSAqIEBzZWUgU2Vzc2lvblBhcmFtZXRlcgotICogQHNlZSBTZXNzaW9uRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvblBhcmFtZXRlck1hcCBleHRlbmRzIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtYXAuCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25QYXJhbWV0ZXJNYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1hcCB3aXRoIHRoZSBzYW1lIG1hcHBpbmdzIGFzIHRoZSBzcGVjaWZpZWQgbWFwLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgd2hvc2UgbWFwcGluZ3MgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGlzIG1hcAotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uUGFyYW1ldGVyTWFwKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgU3RyaW5nPiBtYXApIHsKLSAgICAgICAgc3VwZXIobWFwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgbG9uZyB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhpcyBrZXkgb3Ige0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gcHV0KGtleSwgTG9uZy50b1N0cmluZyh2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBib29sZWFuIHZhbHVlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGlzIGtleSBvciB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBwdXQoa2V5LCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEF0b21QdWIgVVJMIGFuZCBzZXRzIHRoZSBiaW5kaW5nIHRvIEF0b21QdWIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgdGhlIEF0b21QdWIgYmluZGluZyBVUkwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBdG9tUHViQmluZGluZ1VybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFKTsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLkFUT01QVUJfVVJMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQVRPTVBVQi52YWx1ZSgpKTsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFUT01QVUJfVVJMLCB1cmwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgV2ViIFNlcnZpY2VzIFdTREwgVVJMIGFuZCBzZXRzIHRoZSBiaW5kaW5nIHRvIFdlYiBTZXJ2aWNlcy4KLSAgICAgKiBBc3N1bWVzIHRoYXQgYWxsIENNSVMgc2VydmljZXMgaGF2ZSB0aGUgc2FtZSBXU0RMIFVSTC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICB0aGUgV2ViIFNlcnZpY2VzIFdTREwgVVJMCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNCaW5kaW5nVXJsKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUpOwotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFKTsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX05BVklHQVRJT05fU0VSVklDRSk7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRSk7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0UpOwotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0UpOwotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRSk7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRSk7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19BQ0xfU0VSVklDRSk7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUsIEJpbmRpbmdUeXBlLldFQlNFUlZJQ0VTLnZhbHVlKCkpOwotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFLCB1cmwpOwotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTkFWSUdBVElPTl9TRVJWSUNFLCB1cmwpOwotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfT0JKRUNUX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19ESVNDT1ZFUllfU0VSVklDRSwgdXJsKTsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX01VTFRJRklMSU5HX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRSwgdXJsKTsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFLCB1cmwpOwotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUE9MSUNZX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBXZWIgU2VydmljZSBtZW1vcnkgdGhyZXNob2xkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aHJlc2hvbGQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0aHJlc2hvbGQgaW4gYnl0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc01lbW9yeVRocmVzaG9sZChsb25nIHRocmVzaG9sZCkgewotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NRU1PUllfVEhSRVNIT0xELCB0aHJlc2hvbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIEJyb3dzZXIgVVJMIGFuZCBzZXRzIHRoZSBiaW5kaW5nIHRvIEJyb3dzZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgdGhlIEJyb3dzZXIgYmluZGluZyBVUkwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCcm93c2VyQmluZGluZ1VybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFKTsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLkJST1dTRVJfVVJMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQlJPV1NFUi52YWx1ZSgpKTsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkJST1dTRVJfVVJMLCB1cmwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHByb3BlcnRpZXMgc2hvdWxkIGJlIHNlbnQgaW4gdGhlIHN1Y2NpbmN0IGZvcm1hdCBvciBub3QuCi0gICAgICogT25seSByZWxldmFudCBmb3IgdGhlIGJyb3dzZXIgYmluZGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3VjY2luY3QKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZW50IGluIHRoZSBzdWNjaW5jdAotICAgICAqICAgICAgICAgICAgZm9ybWF0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJyb3dzZXJCaW5kaW5nU3VjY2luY3QoYm9vbGVhbiBzdWNjaW5jdCkgewotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX1NVQ0NJTkNULCBzdWNjaW5jdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbG9jYWwgc2VydmljZSBmYWN0b3J5IGFuZCBzZXRzIHRoZSBiaW5kaW5nIHRvIExvY2FsLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXJ2aWNlRmFjdG9yeUNsYXNzCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYWwgc2VydmljZSBmYWN0b3J5IGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxCaW5kaW5nQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIENtaXNTZXJ2aWNlRmFjdG9yeT4gc2VydmljZUZhY3RvcnlDbGFzcykgewotICAgICAgICBpZiAoc2VydmljZUZhY3RvcnlDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUpOwotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxfRkFDVE9SWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUsIEJpbmRpbmdUeXBlLkxPQ0FMLnZhbHVlKCkpOwotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxfRkFDVE9SWSwgc2VydmljZUZhY3RvcnlDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVwb3NpdG9yeSBJRC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBJRAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnlJZChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9JRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5SRVBPU0lUT1JZX0lELCByZXBvc2l0b3J5SWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB1c2VyIGFuZCBwYXNzd29yZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXNzd29yZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZXJBbmRQYXNzd29yZChTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLlVTRVIpOwotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuUEFTU1dPUkQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgdXNlcik7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5QQVNTV09SRCwgcGFzc3dvcmQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBiZWFyZXIgdG9rZW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHRva2VuCi0gICAgICogICAgICAgICAgICB0aGUgYmVhcmVyIHRva2VuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmVhcmVyVG9rZW4oU3RyaW5nIHRva2VuKSB7Ci0gICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9BQ0NFU1NfVE9LRU4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQUNDRVNTX1RPS0VOLCB0b2tlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyBhbGwgYXV0aGVudGljYXRpb24gb2ZmIGlmIHRoZSBzdGFuZGFyZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBpcwotICAgICAqIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm9BdXRoZW50aWNhdGlvbigpIHsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9IVFRQX0JBU0lDLCBmYWxzZSk7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfU09BUF9VU0VSTkFNRVRPS0VOLCBmYWxzZSk7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfT0FVVEhfQkVBUkVSLCBmYWxzZSk7Ci0KLSAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuQVVUSEVOVElDQVRJT05fUFJPVklERVJfQ0xBU1MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm5zIGJhc2ljIGF1dGhlbnRpY2F0aW9uIG9uIGFuZCBVc2VybmFtZVRva2VuIGF1dGhlbnRpY2F0aW9uIG9mZiBpZiB0aGUKLSAgICAgKiBzdGFuZGFyZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBpcyB1c2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB0aGUgdXNlcgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXNzd29yZAotICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzaWNBdXRoZW50aWNhdGlvbihTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZXIgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRVc2VyQW5kUGFzc3dvcmQodXNlciwgcGFzc3dvcmQpOwotCi0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfSFRUUF9CQVNJQywgdHJ1ZSk7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfU09BUF9VU0VSTkFNRVRPS0VOLCBmYWxzZSk7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfT0FVVEhfQkVBUkVSLCBmYWxzZSk7Ci0KLSAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuQVVUSEVOVElDQVRJT05fUFJPVklERVJfQ0xBU1MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm5zIFVzZXJuYW1lVG9rZW4gYXV0aGVudGljYXRpb24gb24gZm9yIHRoZSBXZWIgU2VydmljZXMgYmluZGluZyBpZiB0aGUKLSAgICAgKiBzdGFuZGFyZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBpcyB1c2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB0aGUgdXNlcgotICAgICAqIEBwYXJhbSBwYXNzd29yZAotICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkCi0gICAgICogQHBhcmFtIGJhc2ljQXV0aAotICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHNob3VsZCBiZSB1c2VkIGluCi0gICAgICogICAgICAgICAgICBhZGRpdGlvbiB0byB0aGUgVXNlcm5hbWVUb2tlbiBhdXRoZW50aWNhdGlvbiAocmVxdWlyZWQgYnkgc29tZQotICAgICAqICAgICAgICAgICAgc2VydmVycyksIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWVUb2tlbkF1dGhlbnRpY2F0aW9uKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQsIGJvb2xlYW4gYmFzaWNBdXRoKSB7Ci0gICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZXIgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRVc2VyQW5kUGFzc3dvcmQodXNlciwgcGFzc3dvcmQpOwotCi0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfU09BUF9VU0VSTkFNRVRPS0VOLCB0cnVlKTsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9IVFRQX0JBU0lDLCBiYXNpY0F1dGgpOwotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX09BVVRIX0JFQVJFUiwgZmFsc2UpOwotCi0gICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyBOVExNIGF1dGhlbnRpY2F0aW9uIG9uIGFuZCBiYXNpYyBhdXRoZW50aWNhdGlvbiBhbmQgVXNlcm5hbWVUb2tlbgotICAgICAqIGF1dGhlbnRpY2F0aW9uIG9mZi4KLSAgICAgKiA8cD4KLSAgICAgKiA8ZW0+V29ya3Mgb25seSBpbiBzaW5nbGUgdXNlciBlbnZpcm9ubWVudHMgYW5kIG9ubHkgd2l0aCBOVExNdjEhPC9lbT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXNzd29yZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE50bG1BdXRoZW50aWNhdGlvbihTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZXIgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRVc2VyQW5kUGFzc3dvcmQodXNlciwgcGFzc3dvcmQpOwotCi0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfSFRUUF9CQVNJQywgZmFsc2UpOwotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX1NPQVBfVVNFUk5BTUVUT0tFTiwgZmFsc2UpOwotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX09BVVRIX0JFQVJFUiwgZmFsc2UpOwotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIRU5USUNBVElPTl9QUk9WSURFUl9DTEFTUywKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5OVExNQXV0aGVudGljYXRpb25Qcm92aWRlciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm5zIHNpbXBsZSBPQXV0aCAyLjAgYmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uIG9uIGFuZCBiYXNpYwotICAgICAqIGF1dGhlbnRpY2F0aW9uIGFuZCBVc2VybmFtZVRva2VuIGF1dGhlbnRpY2F0aW9uIG9mZi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBkb2VzIG5vdCByZWZyZXNoIHRoZSB0b2tlbiB3aGVuIGl0IGV4cGlyZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRva2VuCi0gICAgICogICAgICAgICAgICB0aGUgYmVhcmVyIHRva2VuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T0F1dGhCZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uKFN0cmluZyB0b2tlbikgewotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVG9rZW4gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRCZWFyZXJUb2tlbih0b2tlbik7Ci0KLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9IVFRQX0JBU0lDLCBmYWxzZSk7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfU09BUF9VU0VSTkFNRVRPS0VOLCBmYWxzZSk7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfT0FVVEhfQkVBUkVSLCB0cnVlKTsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQUNDRVNTX1RPS0VOLCB0b2tlbik7Ci0KLSAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuQVVUSEVOVElDQVRJT05fUFJPVklERVJfQ0xBU1MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm5zIE9BdXRoIDIuMCBhdXRoZW50aWNhdGlvbiBvbiBhbmQgYmFzaWMgYXV0aGVudGljYXRpb24gYW5kCi0gICAgICogVXNlcm5hbWVUb2tlbiBhdXRoZW50aWNhdGlvbiBvZmYuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhdXRoZW50aWNhdGlvbiBtZXRob2QgcmVxdWVzdHMgYSBuZXcgdG9rZW4gYW5kIHJlZnJlc2hlcyB0aGUgdG9rZW4KLSAgICAgKiB3aGVuIGl0IGV4cGlyZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRva2VuRW50cG9pbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0b2tlbiBlbmRwb2ludCBVUkwKLSAgICAgKiBAcGFyYW0gY2xpZW50SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjbGllbnQgSUQKLSAgICAgKiBAcGFyYW0gY2xpZW50U2VjcmV0Ci0gICAgICogICAgICAgICAgICB0aGUgY2xpZW50IHNlY3JldCBpZiByZXF1aXJlZCwge0Bjb2RlIG51bGx9IG90aGVyd2lzZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICB0aGUgYXV0aG9yaXphdGlvbiBjb2RlCi0gICAgICogQHBhcmFtIHJlZGlyZWN0VXJpCi0gICAgICogICAgICAgICAgICB0aGUgcmVkaXJlY3QgVVJJIGlmIHJlcXVpcmVkLCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T0F1dGhBdXRoZW50aWNhdGlvbihTdHJpbmcgdG9rZW5FbnRwb2ludCwgU3RyaW5nIGNsaWVudElkLCBTdHJpbmcgY2xpZW50U2VjcmV0LCBTdHJpbmcgY29kZSwKLSAgICAgICAgICAgIFN0cmluZyByZWRpcmVjdFVyaSkgewotICAgICAgICBpZiAodG9rZW5FbnRwb2ludCA9PSBudWxsIHx8IHRva2VuRW50cG9pbnQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVG9rZW4gZW5kcG9pbnQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2xpZW50SWQgPT0gbnVsbCB8fCBjbGllbnRJZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGllbnQgSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX0hUVFBfQkFTSUMsIGZhbHNlKTsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9TT0FQX1VTRVJOQU1FVE9LRU4sIGZhbHNlKTsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9PQVVUSF9CRUFSRVIsIGZhbHNlKTsKLQotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9UT0tFTl9FTkRQT0lOVCwgdG9rZW5FbnRwb2ludCk7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0NMSUVOVF9JRCwgY2xpZW50SWQpOwotCi0gICAgICAgIGlmIChjbGllbnRTZWNyZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQ0xJRU5UX1NFQ1JFVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9DTElFTlRfU0VDUkVULCBjbGllbnRTZWNyZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQ09ERSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9DT0RFLCBjb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWRpcmVjdFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9SRURJUkVDVF9VUkkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfUkVESVJFQ1RfVVJJLCByZWRpcmVjdFVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIRU5USUNBVElPTl9QUk9WSURFUl9DTEFTUywKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5PQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyBPQXV0aCAyLjAgYXV0aGVudGljYXRpb24gb24gYW5kIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGFuZAotICAgICAqIFVzZXJuYW1lVG9rZW4gYXV0aGVudGljYXRpb24gb2ZmLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIHVzZXMgdGhlIHByb3ZpZGVkIHRva2VuIGFuZCByZWZyZXNoZXMgdGhlCi0gICAgICogdG9rZW4gd2hlbiBpdCBleHBpcmVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0b2tlbkVudHBvaW50Ci0gICAgICogICAgICAgICAgICB0aGUgdG9rZW4gZW5kcG9pbnQgVVJMCi0gICAgICogQHBhcmFtIGNsaWVudElkCi0gICAgICogICAgICAgICAgICB0aGUgY2xpZW50IElECi0gICAgICogQHBhcmFtIGNsaWVudFNlY3JldAotICAgICAqICAgICAgICAgICAgdGhlIGNsaWVudCBzZWNyZXQgaWYgcmVxdWlyZWQsIHtAY29kZSBudWxsfSBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gYWNjZXNzVG9rZW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBiZWFyZXIgYWNjZXNzIHRva2VuCi0gICAgICogQHBhcmFtIHJlZnJlc2hUb2tlbgotICAgICAqICAgICAgICAgICAgdGhlIHJlZnJlc2ggdG9rZW4KLSAgICAgKiBAcGFyYW0gZXhwaXJhdGlvblRpbWVzdGFtcAotICAgICAqICAgICAgICAgICAgdGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBhY2Nlc3MgdG9rZW4gZXhwaXJlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9BdXRoQXV0aGVudGljYXRpb24oU3RyaW5nIHRva2VuRW50cG9pbnQsIFN0cmluZyBjbGllbnRJZCwgU3RyaW5nIGNsaWVudFNlY3JldCwgU3RyaW5nIGFjY2Vzc1Rva2VuLAotICAgICAgICAgICAgU3RyaW5nIHJlZnJlc2hUb2tlbiwgbG9uZyBleHBpcmF0aW9uVGltZXN0YW1wKSB7Ci0gICAgICAgIGlmICh0b2tlbkVudHBvaW50ID09IG51bGwgfHwgdG9rZW5FbnRwb2ludC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUb2tlbiBlbmRwb2ludCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGllbnRJZCA9PSBudWxsIHx8IGNsaWVudElkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsaWVudCBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfSFRUUF9CQVNJQywgZmFsc2UpOwotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX1NPQVBfVVNFUk5BTUVUT0tFTiwgZmFsc2UpOwotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX09BVVRIX0JFQVJFUiwgZmFsc2UpOwotCi0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX1RPS0VOX0VORFBPSU5ULCB0b2tlbkVudHBvaW50KTsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQ0xJRU5UX0lELCBjbGllbnRJZCk7Ci0KLSAgICAgICAgaWYgKGNsaWVudFNlY3JldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9DTElFTlRfU0VDUkVUKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0NMSUVOVF9TRUNSRVQsIGNsaWVudFNlY3JldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWNjZXNzVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQUNDRVNTX1RPS0VOKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0FDQ0VTU19UT0tFTiwgYWNjZXNzVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZnJlc2hUb2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9SRUZSRVNIX1RPS0VOKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX1JFRlJFU0hfVE9LRU4sIHJlZnJlc2hUb2tlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwaXJhdGlvblRpbWVzdGFtcCA8IDApIHsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0VYUElSQVRJT05fVElNRVNUQU1QKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0VYUElSQVRJT05fVElNRVNUQU1QLCBleHBpcmF0aW9uVGltZXN0YW1wKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLk9BdXRoQXV0aGVudGljYXRpb25Qcm92aWRlciIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2FsZSBvZiB0aGUgc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYWxlCi0gICAgICogICAgICAgICAgICB0aGUgbG9jYWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKLSAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5MT0NBTEVfSVNPNjM5X0xBTkdVQUdFKTsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLkxPQ0FMRV9JU08zMTY2X0NPVU5UUlkpOwotICAgICAgICAgICAgcmVtb3ZlKFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxFX1ZBUklBTlQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvY2FsZS5nZXRMYW5ndWFnZSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5MT0NBTEVfSVNPNjM5X0xBTkdVQUdFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxFX0lTTzYzOV9MQU5HVUFHRSwgbG9jYWxlLmdldExhbmd1YWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxvY2FsZS5nZXRDb3VudHJ5KCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLkxPQ0FMRV9JU08zMTY2X0NPVU5UUlkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5MT0NBTEVfSVNPMzE2Nl9DT1VOVFJZLCBsb2NhbGUuZ2V0Q291bnRyeSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2NhbGUuZ2V0VmFyaWFudCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5MT0NBTEVfVkFSSUFOVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkxPQ0FMRV9WQVJJQU5ULCBsb2NhbGUuZ2V0VmFyaWFudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2FsZSBvZiB0aGUgc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UKLSAgICAgKiAgICAgICAgICAgIElTTyA2MzkgbGFuZ3VhZ2UgY29kZQotICAgICAqIEBwYXJhbSBjb3VudHJ5Ci0gICAgICogICAgICAgICAgICBJU08gMzE2NiBjb3VudHJ5IGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgY291bnRyeSkgewotICAgICAgICBzZXRMb2NhbGUobmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2FsZSBvZiB0aGUgc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UKLSAgICAgKiAgICAgICAgICAgIElTTyA2MzkgbGFuZ3VhZ2UgY29kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgc2V0TG9jYWxlKG5ldyBMb2NhbGUobGFuZ3VhZ2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgY29va2llcyBzaG91bGQgYmUgbWFuYWdlZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvb2tpZXMKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBjb29raWVzIHNob3VsZCBiZSBtYW5hZ2VkLCB7QGNvZGUgZmFsc2V9Ci0gICAgICogICAgICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb29raWVzKGJvb2xlYW4gY29va2llcykgewotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5DT09LSUVTLCBjb29raWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIGFza2VkIHRvIHVzZSBjb21wcmVzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcHJlc3Npb24KLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgc2VydmVyIHNob3VsZCBiZSBhc2tlZCB0byB1c2UgY29tcHJlc3Npb24sCi0gICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzaW9uKGJvb2xlYW4gY29tcHJlc3Npb24pIHsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuQ09NUFJFU1NJT04sIGNvbXByZXNzaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgcmVxdWVzdHMgdG8gdGhlIHNlcnZlciBzaG91bGQgYmUgY29tcHJlc3NlZCBvciBub3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbXByZXNzaW9uCi0gICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgcmVxdWVzdHMgc2hvdWxkIGJlIGNvbXByZXNzZWQsIHtAY29kZSBmYWxzZX0KLSAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudENvbXByZXNzaW9uKGJvb2xlYW4gY29tcHJlc3Npb24pIHsKLSAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuQ0xJRU5UX0NPTVBSRVNTSU9OLCBjb21wcmVzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSFRUUCBjb25uZWN0aW9uIHRpbWVvdXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRpbWVvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvblRpbWVvdXQobG9uZyB0aW1lb3V0KSB7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkNPTk5FQ1RfVElNRU9VVCwgdGltZW91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSFRUUCByZWFkIHRpbWVvdXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRpbWVvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZWFkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVhZFRpbWVvdXQobG9uZyB0aW1lb3V0KSB7Ci0gICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLlJFQURfVElNRU9VVCwgdGltZW91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgSFRUUCBpbnZva2VyIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBodHRwSW52b2tlckNsYXNzCi0gICAgICogICAgICAgICAgICB0aGUgSFRUUCBpbnZva2VyIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SHR0cEludm9rZXIoQ2xhc3M8Pz4gaHR0cEludm9rZXJDbGFzcykgewotICAgICAgICBpZiAoaHR0cEludm9rZXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5IVFRQX0lOVk9LRVJfQ0xBU1MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuSFRUUF9JTlZPS0VSX0NMQVNTLCBodHRwSW52b2tlckNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgSFRUUCBoZWFkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhlYWRlcgotICAgICAqICAgICAgICAgICAgdGhlIGhlYWRlciBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBoZWFkZXIsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoaGVhZGVyID09IG51bGwgfHwgaGVhZGVyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgeCA9IDA7Ci0gICAgICAgIHdoaWxlIChjb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkhFQURFUiArICIuIiArIHgpKSB7Ci0gICAgICAgICAgICB4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBwdXQoU2Vzc2lvblBhcmFtZXRlci5IRUFERVIgKyAiLiIgKyB4LCBoZWFkZXIgKyAiOiIgKyB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBIVFRQIHByb3h5IHVzZXIgYW5kIHBhc3N3b3JkLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB0aGUgdXNlcgotICAgICAqIEBwYXJhbSBwYXNzd29yZAotICAgICAqICAgICAgICAgICAgdGhlIHBhc3N3b3JkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJveHlVc2VyQW5kUGFzc3dvcmQoU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmUoU2Vzc2lvblBhcmFtZXRlci5QUk9YWV9VU0VSKTsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLlBST1hZX1BBU1NXT1JEKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLlBST1hZX1VTRVIsIHVzZXIpOwotICAgICAgICAgICAgcHV0KFNlc3Npb25QYXJhbWV0ZXIuUFJPWFlfUEFTU1dPUkQsIHBhc3N3b3JkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdGlvblByb3ZpZGVyQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoQ2xhc3M8PyBleHRlbmRzIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXI+IGF1dGhlbnRpY2F0aW9uUHJvdmlkZXJDbGFzcykgewotICAgICAgICBpZiAoYXV0aGVudGljYXRpb25Qcm92aWRlckNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9iamVjdCBmYWN0b3J5IGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RGYWN0b3J5Q2xhc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgZmFjdG9yeSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdEZhY3RvcnkoQ2xhc3M8PyBleHRlbmRzIE9iamVjdEZhY3Rvcnk+IG9iamVjdEZhY3RvcnlDbGFzcykgewotICAgICAgICBpZiAob2JqZWN0RmFjdG9yeUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlbW92ZShTZXNzaW9uUGFyYW1ldGVyLk9CSkVDVF9GQUNUT1JZX0NMQVNTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHB1dChTZXNzaW9uUGFyYW1ldGVyLk9CSkVDVF9GQUNUT1JZX0NMQVNTLCBvYmplY3RGYWN0b3J5Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBsb2FkIGFuZCBzYXZlIC0tLQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgZW50cmllcyBmcm9tIHRoZSBnaXZlbiBVVEYtOCBlbmNvZGVkIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbnRyaWVzIGNhbm5vdCBiZSByZWFkCi0gICAgICogCi0gICAgICogQHNlZSAjbG9hZChJbnB1dFN0cmVhbSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9hZChzdHJlYW0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyBlbnRyaWVzIGZyb20gdGhlIGdpdmVuLCBVVEYtOCBlbmNvZGVkIHN0cmVhbSBhbmQgbGVhdmVzIHRoZSBzdHJlYW0KLSAgICAgKiBvcGVuLiBFbXB0eSBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuIEVudHJpZXMgYXJlCi0gICAgICogYWRkZWQgYW5kIHJlcGxhY2VkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGVudHJpZXMgY2Fubm90IGJlIHJlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJlYW0gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSwgIlVURjgiKSk7Ci0KLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwdXRMaW5lKGxpbmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgc3RyaW5nIHRoYXQgY29udGFpbnMga2V5LXZhbHVlIHBhaXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgcGFyYW1ldGVycykgewotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXJzIHN0cmluZyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBwYXJhbWV0ZXJzLnNwbGl0KCJcbiIpKSB7Ci0gICAgICAgICAgICBwdXRMaW5lKGxpbmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHV0TGluZShTdHJpbmcgbGluZSkgewotICAgICAgICBhc3NlcnQgbGluZSAhPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBsaW5lVHJpbSA9IGxpbmUudHJpbSgpOwotICAgICAgICBpZiAobGluZVRyaW0ubGVuZ3RoKCkgPT0gMCB8fCBsaW5lVHJpbS5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2VwID0gbGluZVRyaW0uaW5kZXhPZignPScpOwotICAgICAgICBpZiAoc2VwID09IC0xKSB7Ci0gICAgICAgICAgICBzZXAgPSBsaW5lVHJpbS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VwID09IC0xKSB7Ci0gICAgICAgICAgICBwdXQobGluZVRyaW0sIG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHV0KGxpbmVUcmltLnN1YnN0cmluZygwLCBzZXApLnRyaW0oKSwgbGluZVRyaW0uc3Vic3RyaW5nKHNlcCArIDEpLnRyaW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYWxsIGVudHJpZXMgdG8gdGhlIGdpdmVuIGZpbGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBlbnRyaWVzIGNhbm5vdCBiZSB3cml0dGVuCi0gICAgICogCi0gICAgICogQHNlZSAjc3RvcmUoT3V0cHV0U3RyZWFtKQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHN0b3JlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdG9yZShzdHJlYW0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYWxsIGVudHJpZXMgVVRGLTggZW5jb2RlZCB0byB0aGUgZ2l2ZW4gc3RyZWFtIGFuZCBsZWF2ZXMgdGhlCi0gICAgICogc3RyZWFtIG9wZW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgZW50cmllcyBjYW5ub3QgYmUgd3JpdHRlbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3JlKGZpbmFsIE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCAiVVRGLTgiKSk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oa2V5U2V0KCkpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGtleXMpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldChrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGUoa2V5KTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgnPScpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKHZhbHVlKTsKLSAgICAgICAgICAgIHdyaXRlci5uZXdMaW5lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBlbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0NoYW5nZUV2ZW50LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmFiOGYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0NoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DaGFuZ2VFdmVudEluZm87Ci0KLS8qKgotICogQ2hhbmdlIGV2ZW50IGluIHRoZSBjaGFuZ2UgbG9nLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50SW5mbyB7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJRCBvZiB0aGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBJRCwgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyBnZXRPYmplY3RJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgTGlzdDw/Pj4gZ2V0UHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcG9saWN5IElEcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwb2xpY3kgSURzCi0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldFBvbGljeUlkcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQUNMLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEFDTAotICAgICAqLwotICAgIEFjbCBnZXRBY2woKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9DaGFuZ2VFdmVudHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0NoYW5nZUV2ZW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIxMmNkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0NoYW5nZUV2ZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBDaGFuZ2UgZXZlbnQgbGlzdC4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlRXZlbnRzIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYW5nZSBsb2cgdG9rZW4gaWYgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhdGVzdCBjaGFuZ2UgbG9nIHRva2VuIG9yIHtAY29kZSBudWxsfSBpZiBpdCBpcyBub3QKLSAgICAgKiAgICAgICAgIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYW5nZSBldmVudCBsaXN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2hhbmdlIGV2ZW50cywgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIExpc3Q8Q2hhbmdlRXZlbnQ+IGdldENoYW5nZUV2ZW50cygpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXJlIG1vcmUgY2hhbmdlIGV2ZW50cyBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaXMgdGhlcmUgYXJlIG1vcmUgY2hhbmdlIGV2ZW50cywge0Bjb2RlIGZhbHNlfQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgYm9vbGVhbiBnZXRIYXNNb3JlSXRlbXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFuZ2UgZXZlbnRzIGlmIGF2YWlsYWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbmdlIGV2ZW50cyBvciAtMSBpZiB0aGUgdG90YWwgbnVtYmVyIGlzCi0gICAgICogICAgICAgICBub3QgYXZhaWxhYmxlCi0gICAgICovCi0gICAgbG9uZyBnZXRUb3RhbE51bUl0ZW1zKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9DbWlzT2JqZWN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9DbWlzT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YmFhNzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvQ21pc09iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DbWlzRXh0ZW5zaW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRXh0ZW5zaW9uTGV2ZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgYWxsIENNSVMgb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDbWlzT2JqZWN0IGV4dGVuZHMgT2JqZWN0SWQsIENtaXNPYmplY3RQcm9wZXJ0aWVzIHsKLQotICAgIC8vIG9iamVjdAotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWxsb3dhYmxlIGFjdGlvbnMgaWYgdGhleSBoYXZlIGJlZW4gZmV0Y2hlZCBmb3IgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGEgZ2l2ZW4gYWN0aW9uIGluIHRoZSBBbGxvd2FibGUgQWN0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIHRlc3QsIG11c3Qgbm90IGJlIHtAY29kZSBudWxsfQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhY3Rpb24gd2FzIGZvdW5kIGluIHRoZSBBbGxvd2FibGUgQWN0aW9ucywKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgdGhlIGFjdGlvbiB3YXMgbm90IGZvdW5kIGluIHRoZSBBbGxvd2FibGUKLSAgICAgKiAgICAgICAgIEFjdGlvbnMKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBBbGxvd2FibGUgQWN0aW9ucyBoYXZlbid0IGJlZW4gZmV0Y2hlZCBvciBwcm92aWRlZCBieQotICAgICAqICAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uIGFjdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWxhdGlvbnNoaXBzIGlmIHRoZXkgaGF2ZSBiZWVuIGZldGNoZWQgZm9yIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIExpc3Q8UmVsYXRpb25zaGlwPiBnZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBBQ0wgaWYgaXQgaGFzIGJlZW4gZmV0Y2hlZCBmb3IgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQWNsIGdldEFjbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgcGVybWlzc2lvbnMgZm9yIHRoZSBnaXZlbiBwcmluY2lwYWwgZnJvbSB0aGUgQUNMLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmluY2lwYWxJZAotICAgICAqICAgICAgICAgICAgdGhlIHByaW5jaXBhbCBJRCwgbXVzdCBub3QgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIHBlcm1pc3Npb25zIGZvciB0aGlzIHVzZXIsIG9yIGFuIGVtcHR5IHNldCBpZgotICAgICAqICAgICAgICAgcHJpbmNpcGFsIGlzIG5vdCBpbiB0aGUgQUNMCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgQUNMIGhhc24ndCBiZWVuIGZldGNoZWQgb3IgcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTZXQ8U3RyaW5nPiBnZXRQZXJtaXNzaW9uc0ZvclByaW5jaXBhbChTdHJpbmcgcHJpbmNpcGFsSWQpOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0UGVybWlzc2lvbnNGb3JQcmluY2lwYWwoU3RyaW5nKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIFNldDxTdHJpbmc+IGdldFBlcm1pc3NvbnNGb3JQcmluY2lwYWwoU3RyaW5nIHByaW5jaXBhbElkKTsKLQotICAgIC8vIG9iamVjdCBzZXJ2aWNlCi0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoaXMgb2JqZWN0LiBJZiB0aGlzIG9iamVjdCBpcyBhIGRvY3VtZW50LCB0aGUgd2hvbGUgdmVyc2lvbgotICAgICAqIHNlcmllcyBpcyBkZWxldGVkLgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHZvaWQgZGVsZXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBhbGxWZXJzaW9ucwotICAgICAqICAgICAgICAgICAgaWYgdGhpcyBvYmplY3QgaXMgYSBkb2N1bWVudCB0aGlzIHBhcmFtZXRlciBkZWZpbmVzIHdoZXRoZXIKLSAgICAgKiAgICAgICAgICAgIG9ubHkgdGhpcyB2ZXJzaW9uICh7QGNvZGUgZmFsc2V9KSBvciBhbGwgdmVyc2lvbnMgKHtAY29kZSB0cnVlfQotICAgICAqICAgICAgICAgICAgKSBzaG91bGQgYmUgZGVsZXRlZCwgdGhlIHBhcmFtZXRlciBpcyBpZ25vcmVkIGZvciBhbGwgb3RoZXIKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCB0eXBlcwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHZvaWQgZGVsZXRlKGJvb2xlYW4gYWxsVmVyc2lvbnMpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgcHJvdmlkZWQgcHJvcGVydGllcyBhbmQgcmVmcmVzaGVzIHRoaXMgb2JqZWN0IGFmdGVyd2FyZHMuIElmCi0gICAgICogdGhlIHJlcG9zaXRvcnkgY3JlYXRlZCBhIG5ldyBvYmplY3QsIGZvciBleGFtcGxlIGEgbmV3IHZlcnNpb24sIHRoaXMgbmV3Ci0gICAgICogb2JqZWN0IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydGllcyB0byB1cGRhdGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIENtaXNPYmplY3QgdXBkYXRlUHJvcGVydGllcyhNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMuIElmIHRoZSByZXBvc2l0b3J5IGNyZWF0ZWQgYSBuZXcgb2JqZWN0LAotICAgICAqIGZvciBleGFtcGxlIGEgbmV3IHZlcnNpb24sIHRoZSBvYmplY3QgSUQgb2YgdGhlIG5ldyBvYmplY3QgaXMgcmV0dXJuZWQuCi0gICAgICogT3RoZXJ3aXNlIHRoZSBvYmplY3QgSUQgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydGllcyB0byB1cGRhdGUKLSAgICAgKiBAcGFyYW0gcmVmcmVzaAotICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoaXMgb2JqZWN0IHNob3VsZCBiZSByZWZyZXNoZWQgYWZ0ZXIgdGhlCi0gICAgICogICAgICAgICAgICB1cGRhdGUsIHtAY29kZSBmYWxzZX0gaWYgbm90Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IElEIG9mIHRoZSB1cGRhdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIHVwZGF0ZVByb3BlcnRpZXMoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgYm9vbGVhbiByZWZyZXNoKTsKLQotICAgIC8qKgotICAgICAqIFJlbmFtZXMgdGhpcyBvYmplY3QgKGNoYW5nZXMgdGhlIHZhbHVlIG9mIHtAY29kZSBjbWlzOm5hbWV9KS4gSWYgdGhlCi0gICAgICogcmVwb3NpdG9yeSBjcmVhdGVkIGEgbmV3IG9iamVjdCwgZm9yIGV4YW1wbGUgYSBuZXcgdmVyc2lvbiwgdGhpcyBuZXcKLSAgICAgKiBvYmplY3QgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgY3VycmVudCBvYmplY3QgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld05hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgbmFtZSwgbm90IHtAY29kZSBudWxsfSBvciBlbXB0eQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQ21pc09iamVjdCByZW5hbWUoU3RyaW5nIG5ld05hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmVuYW1lcyB0aGlzIG9iamVjdCAoY2hhbmdlcyB0aGUgdmFsdWUgb2Yge0Bjb2RlIGNtaXM6bmFtZX0pLiBJZiB0aGUKLSAgICAgKiByZXBvc2l0b3J5IGNyZWF0ZWQgYSBuZXcgb2JqZWN0LCBmb3IgZXhhbXBsZSBhIG5ldyB2ZXJzaW9uLCB0aGUgb2JqZWN0IGlkCi0gICAgICogb2YgdGhlIG5ldyBvYmplY3QgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgb2JqZWN0IGlkIG9mIHRoZSBjdXJyZW50Ci0gICAgICogb2JqZWN0IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IG5hbWUsIG5vdCB7QGNvZGUgbnVsbH0gb3IgZW1wdHkKLSAgICAgKiBAcGFyYW0gcmVmcmVzaAotICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoaXMgb2JqZWN0IHNob3VsZCBiZSByZWZyZXNoZWQgYWZ0ZXIgdGhlCi0gICAgICogICAgICAgICAgICB1cGRhdGUsIHtAY29kZSBmYWxzZX0gaWYgbm90Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IElEIG9mIHRoZSB1cGRhdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIHJlbmFtZShTdHJpbmcgbmV3TmFtZSwgYm9vbGVhbiByZWZyZXNoKTsKLQotICAgIC8vIHJlbmRpdGlvbnMKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbmRpdGlvbnMgaWYgdGhleSBoYXZlIGJlZW4gZmV0Y2hlZCBmb3IgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxSZW5kaXRpb24+IGdldFJlbmRpdGlvbnMoKTsKLQotICAgIC8vIHBvbGljeSBzZXJ2aWNlCi0KLSAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBwcm92aWRlZCBwb2xpY2llcyBhbmQgcmVmcmVzaGVzIHRoaXMgb2JqZWN0IGFmdGVyd2FyZHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvbGljeUlkcwotICAgICAqICAgICAgICAgICAgdGhlIElEcyBvZiB0aGUgcG9saWNpZXMgdG8gYmUgYXBwbGllZAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHZvaWQgYXBwbHlQb2xpY3koT2JqZWN0SWQuLi4gcG9saWN5SWRzKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHByb3ZpZGVkIHBvbGljaWVzIGFuZCByZWZyZXNoZXMgdGhpcyBvYmplY3QgYWZ0ZXJ3YXJkcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9saWN5SWRzCi0gICAgICogICAgICAgICAgICB0aGUgSURzIG9mIHRoZSBwb2xpY2llcyB0byBiZSByZW1vdmVkCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVQb2xpY3koT2JqZWN0SWQuLi4gcG9saWN5SWRzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFwcGxpZWQgcG9saWNpZXMgaWYgdGhleSBoYXZlIGJlZW4gZmV0Y2hlZCBmb3IgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxQb2xpY3k+IGdldFBvbGljaWVzKCk7Ci0KLSAgICAvLyBBQ0wgc2VydmljZQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbmQgcmVtb3ZlcyBBQ0VzIHRvIHRoZSBvYmplY3QgYW5kIHJlZnJlc2hlcyB0aGlzIG9iamVjdCBhZnRlcndhcmRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBBQ0wgb2YgdGhpcyBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBBY2wgYXBwbHlBY2woTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIEFDRXMgdG8gdGhlIG9iamVjdCBhbmQgcmVmcmVzaGVzIHRoaXMgb2JqZWN0IGFmdGVyd2FyZHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IEFDTCBvZiB0aGlzIG9iamVjdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEFjbCBhZGRBY2woTGlzdDxBY2U+IGFkZEFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgQUNFcyB0byB0aGUgb2JqZWN0IGFuZCByZWZyZXNoZXMgdGhpcyBvYmplY3QgYWZ0ZXJ3YXJkcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQUNMIG9mIHRoaXMgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQWNsIHJlbW92ZUFjbChMaXN0PEFjZT4gcmVtb3ZlQWNlcywgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24pOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZGlyZWN0IEFDRSBvZiB0aGlzIG9iamVjdCwgc2V0cyB0aGUgcHJvdmlkZWQgQUNFcyB0byB0aGUKLSAgICAgKiBvYmplY3QgYW5kIHJlZnJlc2hlcyB0aGlzIG9iamVjdCBhZnRlcndhcmRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBBQ0wgb2YgdGhpcyBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBBY2wgc2V0QWNsKExpc3Q8QWNlPiBhY2VzKTsKLQotICAgIC8vIGV4dGVuc2lvbnMKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbnMgZm9yIHRoZSBnaXZlbiBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbnMgYXQgdGhhdCBsZXZlbCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgbm8KLSAgICAgKiAgICAgICAgIGV4dGVuc2lvbnMKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBnZXRFeHRlbnNpb25zKEV4dGVuc2lvbkxldmVsIGxldmVsKTsKLQotICAgIC8vIGFkYXB0ZXJzCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFkYXB0ZXIgYmFzZWQgb24gdGhlIGdpdmVuIGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgb2JqZWN0IG9yIHtAY29kZSBudWxsfSBpZiBubyBhZGFwdGVyIG9iamVjdCBjb3VsZCBiZQotICAgICAqICAgICAgICAgY3JlYXRlZAotICAgICAqLwotICAgIDxUPiBUIGdldEFkYXB0ZXIoQ2xhc3M8VD4gYWRhcHRlckludGVyZmFjZSk7Ci0KLSAgICAvLyBzZXNzaW9uIGhhbmRsaW5nCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgcmVmcmVzaC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaWZmZXJlbmNlLCBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMsIGJldHdlZW4gdGhlIGxhc3QKLSAgICAgKiAgICAgICAgIHJlZnJlc2ggdGltZSBhbmQgbWlkbmlnaHQsIEphbnVhcnkgMSwgMTk3MCBVVEMuCi0gICAgICovCi0gICAgbG9uZyBnZXRSZWZyZXNoVGltZXN0YW1wKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxvYWRzIHRoaXMgb2JqZWN0IGZyb20gdGhlIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBpbiB0aGUgcmVwb3NpdG9yeQotICAgICAqLwotICAgIHZvaWQgcmVmcmVzaCgpOwotCi0gICAgLyoqCi0gICAgICogUmVsb2FkcyB0aGUgZGF0YSBmcm9tIHRoZSByZXBvc2l0b3J5IGlmIHRoZSBsYXN0IHJlZnJlc2ggZGlkIG5vdCBvY2N1cgotICAgICAqIHdpdGhpbiB7QGNvZGUgZHVyYXRpb25Jbk1pbGxpc30uCi0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBpbiB0aGUgcmVwb3NpdG9yeQotICAgICAqLwotICAgIHZvaWQgcmVmcmVzaElmT2xkKGxvbmcgZHVyYXRpb25Jbk1pbGxpcyk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9DbWlzT2JqZWN0UHJvcGVydGllcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvQ21pc09iamVjdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhMzk4MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9DbWlzT2JqZWN0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotCi0vKioKLSAqIEFjY2Vzc29ycyB0byBDTUlTIG9iamVjdCBwcm9wZXJ0aWVzLgotICogPHA+Ci0gKiBBIHByb3BlcnR5IG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgYmVjYXVzZSBlaXRoZXIgdGhlIHJlcG9zaXRvcnkgZGlkbid0Ci0gKiBwcm92aWRlIGl0IG9yIGEgcHJvcGVydHkgZmlsdGVyIHdhcyB1c2VkIHRvIHJldHJpZXZlIHRoaXMgb2JqZWN0LgotICogPHA+Ci0gKiBUaGUgcHJvcGVydHkgdmFsdWVzIHJlcHJlc2VudCBhIHNuYXBzaG90IG9mIHRoZSBvYmplY3Qgd2hlbiBpdCB3YXMgbG9hZGVkLgotICogVGhlIG9iamVjdCBhbmQgaXRzIHByb3BlcnRpZXMgbWF5IGJlIG91dC1vZi1kYXRlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4KLSAqIG1vZGlmaWVkIGluIHRoZSByZXBvc2l0b3J5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENtaXNPYmplY3RQcm9wZXJ0aWVzIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgQ01JUyBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYWxsIGF2YWlsYWJsZSBDTUlTIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBMaXN0PFByb3BlcnR5PD8+PiBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eSBoYXNuJ3QgYmVlbgotICAgICAqICAgICAgICAgcmVxdWVzdGVkIG9yIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICovCi0gICAgPFQ+IFByb3BlcnR5PFQ+IGdldFByb3BlcnR5KFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZAotICAgICAqICAgICAgICAgICAgdGhlIElEIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgaGFzbid0IGJlZW4KLSAgICAgKiAgICAgICAgIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnksIG9yIHRoZQotICAgICAqICAgICAgICAgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICovCi0gICAgPFQ+IFQgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgaWQpOwotCi0gICAgLy8gY29udmVuaWVuY2UgYWNjZXNzb3JzCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgQ01JUyBvYmplY3QgKENNSVMgcHJvcGVydHkge0Bjb2RlIGNtaXM6bmFtZX0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IGhhc24ndAotICAgICAqICAgICAgICAgYmVlbiByZXF1ZXN0ZWQgb3IgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBDTUlTIG9iamVjdCAoQ01JUyBwcm9wZXJ0eQotICAgICAqIHtAY29kZSBjbWlzOmRlc2NyaXB0aW9ufSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5Ci0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSByZXBvc2l0b3J5LCBvcgotICAgICAqICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXNlciB3aG8gY3JlYXRlZCB0aGlzIENNSVMgb2JqZWN0IChDTUlTIHByb3BlcnR5Ci0gICAgICoge0Bjb2RlIGNtaXM6Y3JlYXRlZEJ5fSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRvciBvZiB0aGUgb2JqZWN0IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgaGFzbid0Ci0gICAgICogICAgICAgICBiZWVuIHJlcXVlc3RlZCBvciBoYXNuJ3QgYmVlbiBwcm92aWRlZCBieSB0aGUgcmVwb3NpdG9yeQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRDcmVhdGVkQnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoaXMgQ01JUyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCAoQ01JUwotICAgICAqIHByb3BlcnR5IHtAY29kZSBjbWlzOmNyZWF0aW9uRGF0ZX0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5Ci0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgb3IgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBHcmVnb3JpYW5DYWxlbmRhciBnZXRDcmVhdGlvbkRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXIgd2hvIG1vZGlmaWVkIHRoaXMgQ01JUyBvYmplY3QgKENNSVMgcHJvcGVydHkKLSAgICAgKiB7QGNvZGUgY21pczpsYXN0TW9kaWZpZWRCeX0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhc3QgbW9kaWZpZXIgb2YgdGhlIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5Ci0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgb3IgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TGFzdE1vZGlmaWVkQnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCB3aGVuIHRoaXMgQ01JUyBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWQgKENNSVMKLSAgICAgKiBwcm9wZXJ0eSB7QGNvZGUgY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZX0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCi0gICAgICogICAgICAgICBwcm9wZXJ0eSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgb3IgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlCi0gICAgICogICAgICAgICByZXBvc2l0b3J5Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSBiYXNlIHR5cGUgb2YgdGhpcyBDTUlTIG9iamVjdCAoQ01JUyBwcm9wZXJ0eQotICAgICAqIHtAY29kZSBjbWlzOmJhc2VUeXBlSWR9KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYXNlIHR5cGUgaWQgb2YgdGhlIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5Ci0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgb3IgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCYXNlVHlwZUlkIGdldEJhc2VUeXBlSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJhc2UgdHlwZSBvZiB0aGlzIENNSVMgb2JqZWN0IChvYmplY3QgdHlwZSBpZGVudGlmaWVkIGJ5Ci0gICAgICoge0Bjb2RlIGNtaXM6YmFzZVR5cGVJZH0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhc2UgdHlwZSBvZiB0aGUgb2JqZWN0IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkKLSAgICAgKiAgICAgICAgIHtAY29kZSBjbWlzOmJhc2VUeXBlSWR9IGhhc24ndCBiZWVuIHJlcXVlc3RlZCBvciBoYXNuJ3QgYmVlbgotICAgICAqICAgICAgICAgcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBPYmplY3RUeXBlIGdldEJhc2VUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgQ01JUyBvYmplY3QgKG9iamVjdCB0eXBlIGlkZW50aWZpZWQgYnkKLSAgICAgKiB7QGNvZGUgY21pczpvYmplY3RUeXBlSWR9KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eQotICAgICAqICAgICAgICAge0Bjb2RlIGNtaXM6b2JqZWN0VHlwZUlkfSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgb3IgaGFzbid0IGJlZW4KLSAgICAgKiAgICAgICAgIHByb3ZpZGVkIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgT2JqZWN0VHlwZSBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWNvbmRhcnkgdHlwZXMgb2YgdGhpcyBDTUlTIG9iamVjdCAob2JqZWN0IHR5cGVzIGlkZW50aWZpZWQKLSAgICAgKiBieSB7QGNvZGUgY21pczpzZWNvbmRhcnlPYmplY3RUeXBlSWRzfSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2Vjb25kYXJ5IHR5cGVzIG9mIHRoZSBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eQotICAgICAqICAgICAgICAge0Bjb2RlIGNtaXM6c2Vjb25kYXJ5T2JqZWN0VHlwZUlkc30gaGFzbid0IGJlZW4gcmVxdWVzdGVkIG9yCi0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiBwcm92aWRlZCBieSB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIExpc3Q8U2Vjb25kYXJ5VHlwZT4gZ2V0U2Vjb25kYXJ5VHlwZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByaW1hcnkgYW5kIHNlY29uZGFyeSBvYmplY3QgdHlwZXMgdGhhdCBkZWZpbmUgdGhlCi0gICAgICogZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdGhlIHByb3BlcnR5Ci0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2Ygb2JqZWN0IHR5cGVzIHRoYXQgZGVmaW5lIHRoZSBnaXZlbiBwcm9wZXJ0eSBvcgotICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eSBjb3VsZG4ndCBiZSBmb3VuZCBpbiB0aGUgb2JqZWN0Ci0gICAgICogICAgICAgICB0eXBlcyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGlzIG9iamVjdAotICAgICAqIAotICAgICAqLwotICAgIExpc3Q8T2JqZWN0VHlwZT4gZmluZE9iamVjdFR5cGUoU3RyaW5nIGlkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYW5nZSB0b2tlbiAoQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpjaGFuZ2VUb2tlbn0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYW5nZSB0b2tlbiBvZiB0aGUgb2JqZWN0IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkKLSAgICAgKiAgICAgICAgIGhhc24ndCBiZWVuIHJlcXVlc3RlZCBvciBoYXNuJ3QgYmVlbiBwcm92aWRlZCBvciBpc24ndCBzdXBwb3J0ZWQKLSAgICAgKiAgICAgICAgIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldENoYW5nZVRva2VuKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9Eb2N1bWVudC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0NmI3Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDTUlTIGRvY3VtZW50IGludGVyZmFjZS4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnQgZXh0ZW5kcyBGaWxlYWJsZUNtaXNPYmplY3QsIERvY3VtZW50UHJvcGVydGllcyB7Ci0KLSAgICAvLyBvYmplY3Qgc2VydmljZQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGlzIGRvY3VtZW50IGFuZCBhbGwgaXRzIHZlcnNpb25zLgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHZvaWQgZGVsZXRlQWxsVmVyc2lvbnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgY29udGVudCBzdHJlYW0gb2YgdGhpcyBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IHN0cmVhbSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBkb2N1bWVudCBoYXMgbm8KLSAgICAgKiAgICAgICAgIGNvbnRlbnQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgY29udGVudCBzdHJlYW0gb2YgdGhpcyBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBzdHJlYW0gb3Ige0Bjb2RlIG51bGx9IHRvIHJlYWQgdGhlIHN0cmVhbQotICAgICAqICAgICAgICAgICAgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdHJlYW0gb3Ige0Bjb2RlIG51bGx9IHRvIHJlYWQgdG8KLSAgICAgKiAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgc3RyZWFtLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGRvY3VtZW50IGhhcyBubwotICAgICAqICAgICAgICAgY29udGVudAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShCaWdJbnRlZ2VyIG9mZnNldCwgQmlnSW50ZWdlciBsZW5ndGgpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHN0cmVhbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc3RyZWFtIElELgotICAgICAqIFRoaXMgaXMgdXN1YWxseSBhIHJlbmRpdGlvbiBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbUlkCi0gICAgICogICAgICAgICAgICB0aGUgc3RyZWFtIElECi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBzdHJlYW0sIG9yIHtAY29kZSBudWxsfSBpZiBubyBjb250ZW50IGlzIGFzc29jaWF0ZWQKLSAgICAgKiAgICAgICAgIHdpdGggdGhpcyBzdHJlYW0gSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHN0cmVhbUlkKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgY29udGVudCBzdHJlYW0gdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN0cmVhbSBJRC4KLSAgICAgKiBUaGlzIGlzIHVzdWFsbHkgYSByZW5kaXRpb24gb2YgdGhlIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW1JZAotICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBJRAotICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHN0cmVhbSBvciB7QGNvZGUgbnVsbH0gdG8gcmVhZCB0aGUgc3RyZWFtCi0gICAgICogICAgICAgICAgICBmcm9tIHRoZSBiZWdpbm5pbmcKLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmVhbSBvciB7QGNvZGUgbnVsbH0gdG8gcmVhZCB0bwotICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBzdHJlYW0sIG9yIHtAY29kZSBudWxsfSBpZiBubyBjb250ZW50IGlzIGFzc29jaWF0ZWQKLSAgICAgKiAgICAgICAgIHdpdGggdGhpcyBzdHJlYW0gSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHN0cmVhbUlkLCBCaWdJbnRlZ2VyIG9mZnNldCwgQmlnSW50ZWdlciBsZW5ndGgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBVUkwgb2YgdGhlIGRvY3VtZW50IGlmIHRoZSBiaW5kaW5nIHN1cHBvcnRzIGNvbnRlbnQKLSAgICAgKiBVUkxzLgotICAgICAqIAotICAgICAqIERlcGVuZGluZyBvbiB0aGUgcmVwb3NpdG9yeSBhbmQgdGhlIGJpbmRpbmcsIHRoZSBzZXJ2ZXIgbWlnaHQgbm90IHJldHVybgotICAgICAqIHRoZSBjb250ZW50IGJ1dCBhbiBlcnJvciBtZXNzYWdlLiBBdXRoZW50aWNhdGlvbiBkYXRhIGlzIG5vdCBhdHRhY2hlZC4KLSAgICAgKiBUaGF0IGlzLCBhIHVzZXIgbWF5IGhhdmUgdG8gcmUtYXV0aGVudGljYXRlIHRvIGdldCB0aGUgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IFVSTCBvZiB0aGUgZG9jdW1lbnQgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBiaW5kaW5nCi0gICAgICogICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IGNvbnRlbnQgVVJMcwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFVybCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBVUkwgb2YgdGhlIGRvY3VtZW50IG9yIGEgcmVuZGl0aW9uIGlmIHRoZSBiaW5kaW5nCi0gICAgICogc3VwcG9ydHMgY29udGVudCBVUkxzLgotICAgICAqIAotICAgICAqIERlcGVuZGluZyBvbiB0aGUgcmVwb3NpdG9yeSBhbmQgdGhlIGJpbmRpbmcsIHRoZSBzZXJ2ZXIgbWlnaHQgbm90IHJldHVybgotICAgICAqIHRoZSBjb250ZW50IGJ1dCBhbiBlcnJvciBtZXNzYWdlLiBBdXRoZW50aWNhdGlvbiBkYXRhIGlzIG5vdCBhdHRhY2hlZC4KLSAgICAgKiBUaGF0IGlzLCBhIHVzZXIgbWF5IGhhdmUgdG8gcmUtYXV0aGVudGljYXRlIHRvIGdldCB0aGUgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgcmVuZGl0aW9uIG9yIHtAY29kZSBudWxsfSBmb3IgdGhlIGRvY3VtZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBVUkwgb2YgdGhlIGRvY3VtZW50IG9yIHJlbmRpdGlvbiBvciB7QGNvZGUgbnVsbH0gaWYKLSAgICAgKiAgICAgICAgIHRoZSBiaW5kaW5nIGRvZXMgbm90IHN1cHBvcnQgY29udGVudCBVUkxzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VXJsKFN0cmluZyBzdHJlYW1JZCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgbmV3IGNvbnRlbnQgc3RyZWFtIGZvciB0aGUgZG9jdW1lbnQgYW5kIHJlZnJlc2hlcyB0aGlzIG9iamVjdAotICAgICAqIGFmdGVyd2FyZHMuIElmIHRoZSByZXBvc2l0b3J5IGNyZWF0ZWQgYSBuZXcgdmVyc2lvbiwgdGhpcyBuZXcgZG9jdW1lbnQgaXMKLSAgICAgKiByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBjdXJyZW50IGRvY3VtZW50IGlzIHJldHVybmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJlYW0gaW4ge0Bjb2RlIGNvbnRlbnRTdHJlYW19IGlzIGNvbnN1bWVkIGJ1dCBub3QgY2xvc2VkIGJ5IHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRlbnRTdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHN0cmVhbQotICAgICAqIEBwYXJhbSBvdmVyd3JpdGUKLSAgICAgKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB7QGNvZGUgZmFsc2V9IGFuZCB0aGUgZG9jdW1lbnQKLSAgICAgKiAgICAgICAgICAgIGFscmVhZHkgaGFzIGNvbnRlbnQsIHRoZSByZXBvc2l0b3J5IHRocm93cyBhCi0gICAgICogICAgICAgICAgICB7QGxpbmsgQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9ufQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgZG9jdW1lbnQsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcmVwb3NpdG9yeSBkaWQgbm90Ci0gICAgICogICAgICAgICByZXR1cm4gYW4gb2JqZWN0IElECi0gICAgICogCi0gICAgICogQHNlZSBPYmplY3RGYWN0b3J5I2NyZWF0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nLCBsb25nLCBTdHJpbmcsCi0gICAgICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtKQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIERvY3VtZW50IHNldENvbnRlbnRTdHJlYW0oQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIG92ZXJ3cml0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgbmV3IGNvbnRlbnQgc3RyZWFtIGZvciB0aGUgZG9jdW1lbnQuIElmIHRoZSByZXBvc2l0b3J5IGNyZWF0ZWQgYQotICAgICAqIG5ldyB2ZXJzaW9uLCB0aGUgb2JqZWN0IElEIG9mIHRoaXMgbmV3IHZlcnNpb24gaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUKLSAgICAgKiBvYmplY3QgSUQgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN0cmVhbSBpbiB7QGNvZGUgY29udGVudFN0cmVhbX0gaXMgY29uc3VtZWQgYnV0IG5vdCBjbG9zZWQgYnkgdGhpcwotICAgICAqIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGVudFN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgc3RyZWFtCi0gICAgICogQHBhcmFtIG92ZXJ3cml0ZQotICAgICAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIHtAY29kZSBmYWxzZX0gYW5kIHRoZSBkb2N1bWVudAotICAgICAqICAgICAgICAgICAgYWxyZWFkeSBoYXMgY29udGVudCwgdGhlIHJlcG9zaXRvcnkgdGhyb3dzIGEKLSAgICAgKiAgICAgICAgICAgIHtAbGluayBDbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb259Ci0gICAgICogQHBhcmFtIHJlZnJlc2gKLSAgICAgKiAgICAgICAgICAgIGlmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHRoaXMgb2JqZWN0IHdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgIHJlZnJlc2hlZCBhZnRlciB0aGUgbmV3IGNvbnRlbnQgaGFzIGJlZW4gc2V0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBvYmplY3QgSUQsIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcmVwb3NpdG9yeSBkaWQgbm90Ci0gICAgICogICAgICAgICByZXR1cm4gYW4gb2JqZWN0IElECi0gICAgICogCi0gICAgICogQHNlZSBPYmplY3RGYWN0b3J5I2NyZWF0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nLCBsb25nLCBTdHJpbmcsCi0gICAgICogICAgICBqYXZhLmlvLklucHV0U3RyZWFtKQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIHNldENvbnRlbnRTdHJlYW0oQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiByZWZyZXNoKTsKLQotICAgIC8qKgotICAgICAqIEFwcGVuZHMgYSBjb250ZW50IHN0cmVhbSB0byB0aGUgY29udGVudCBzdHJlYW0gb2YgdGhlIGRvY3VtZW50IGFuZAotICAgICAqIHJlZnJlc2hlcyB0aGlzIG9iamVjdCBhZnRlcndhcmRzLiBJZiB0aGUgcmVwb3NpdG9yeSBjcmVhdGVkIGEgbmV3Ci0gICAgICogdmVyc2lvbiwgdGhpcyBuZXcgZG9jdW1lbnQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgY3VycmVudCBkb2N1bWVudCBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJlYW0gaW4ge0Bjb2RlIGNvbnRlbnRTdHJlYW19IGlzIGNvbnN1bWVkIGJ1dCBub3QgY2xvc2VkIGJ5IHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRlbnRTdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHN0cmVhbQotICAgICAqIEBwYXJhbSBpc0xhc3RDaHVuawotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRoaXMgc3RyZWFtIGlzIHRoZSBsYXN0IGNodW5rIG9mIHRoZSBjb250ZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBkb2N1bWVudCwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXBvc2l0b3J5IGRpZCBub3QKLSAgICAgKiAgICAgICAgIHJldHVybiBhbiBvYmplY3QgSUQKLSAgICAgKiAKLSAgICAgKiBAc2VlIE9iamVjdEZhY3RvcnkjY3JlYXRlQ29udGVudFN0cmVhbShTdHJpbmcsIGxvbmcsIFN0cmluZywKLSAgICAgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0pCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgRG9jdW1lbnQgYXBwZW5kQ29udGVudFN0cmVhbShDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmspOwotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhIGNvbnRlbnQgc3RyZWFtIHRvIHRoZSBjb250ZW50IHN0cmVhbSBvZiB0aGUgZG9jdW1lbnQuIElmIHRoZQotICAgICAqIHJlcG9zaXRvcnkgY3JlYXRlZCBhIG5ldyB2ZXJzaW9uLCB0aGUgb2JqZWN0IElEIG9mIHRoaXMgbmV3IHZlcnNpb24gaXMKLSAgICAgKiByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBvYmplY3QgSUQgb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgcmV0dXJuZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN0cmVhbSBpbiB7QGNvZGUgY29udGVudFN0cmVhbX0gaXMgY29uc3VtZWQgYnV0IG5vdCBjbG9zZWQgYnkgdGhpcwotICAgICAqIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGVudFN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgc3RyZWFtCi0gICAgICogQHBhcmFtIGlzTGFzdENodW5rCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgaWYgdGhpcyBzdHJlYW0gaXMgdGhlIGxhc3QgY2h1bmsgb2YgdGhlIGNvbnRlbnQKLSAgICAgKiBAcGFyYW0gcmVmcmVzaAotICAgICAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIHtAY29kZSB0cnVlfSwgdGhpcyBvYmplY3Qgd2lsbCBiZQotICAgICAqICAgICAgICAgICAgcmVmcmVzaGVkIGFmdGVyIHRoZSBjb250ZW50IHN0cmVhbSBoYXMgYmVlbiBhcHBlbmRlZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgb2JqZWN0IElELCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJlcG9zaXRvcnkgZGlkIG5vdAotICAgICAqICAgICAgICAgcmV0dXJuIGFuIG9iamVjdCBJRAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIE9iamVjdElkIGFwcGVuZENvbnRlbnRTdHJlYW0oQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIGlzTGFzdENodW5rLCBib29sZWFuIHJlZnJlc2gpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgY3VycmVudCBjb250ZW50IHN0cmVhbSBmcm9tIHRoZSBkb2N1bWVudCBhbmQgcmVmcmVzaGVzIHRoaXMKLSAgICAgKiBvYmplY3QgYWZ0ZXJ3YXJkcy4gSWYgdGhlIHJlcG9zaXRvcnkgY3JlYXRlZCBhIG5ldyB2ZXJzaW9uLCB0aGlzIG5ldwotICAgICAqIGRvY3VtZW50IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgcmV0dXJuZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBkb2N1bWVudCwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXBvc2l0b3J5IGRpZCBub3QKLSAgICAgKiAgICAgICAgIHJldHVybiBhbiBvYmplY3QgSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBEb2N1bWVudCBkZWxldGVDb250ZW50U3RyZWFtKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGNvbnRlbnQgc3RyZWFtIGZyb20gdGhlIGRvY3VtZW50LiBJZiB0aGUgcmVwb3NpdG9yeQotICAgICAqIGNyZWF0ZWQgYSBuZXcgdmVyc2lvbiwgdGhlIG9iamVjdCBJRCBvZiB0aGlzIG5ldyB2ZXJzaW9uIGlzIHJldHVybmVkLgotICAgICAqIE90aGVyd2lzZSB0aGUgb2JqZWN0IElEIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50IGlzIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWZyZXNoCi0gICAgICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LCB0aGlzIG9iamVjdCB3aWxsIGJlCi0gICAgICogICAgICAgICAgICByZWZyZXNoZWQgYWZ0ZXIgdGhlIGNvbnRlbnQgc3RyZWFtIGhhcyBiZWVuIGRlbGV0ZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGRvY3VtZW50LCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJlcG9zaXRvcnkgZGlkIG5vdAotICAgICAqICAgICAgICAgcmV0dXJuIGFuIG9iamVjdCBJRAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIGRlbGV0ZUNvbnRlbnRTdHJlYW0oYm9vbGVhbiByZWZyZXNoKTsKLQotICAgIC8vIHZlcnNpb25pbmcgc2VydmljZQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIG91dCB0aGUgZG9jdW1lbnQgYW5kIHJldHVybnMgdGhlIG9iamVjdCBJRCBvZiB0aGUgUFdDIChwcml2YXRlCi0gICAgICogd29ya2luZyBjb3B5KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFBXQyBvYmplY3QgSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBPYmplY3RJZCBjaGVja091dCgpOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBpcyBhIFBXQyAocHJpdmF0ZSB3b3JraW5nIGNvcHkpIHRoZSBjaGVjayBvdXQgd2lsbCBiZSByZXZlcnNlZC4KLSAgICAgKiBJZiB0aGlzIGlzIG5vdCBhIFBXQyBpdCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgdm9pZCBjYW5jZWxDaGVja091dCgpOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBpcyBhIFBXQyAocHJpdmF0ZSB3b3JraW5nIGNvcHkpIGl0IHBlcmZvcm1zIGEgY2hlY2sgaW4uIElmIHRoaXMKLSAgICAgKiBpcyBub3QgYSBQV0MgaXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAotICAgICAqIFRoZSBzdHJlYW0gaW4ge0Bjb2RlIGNvbnRlbnRTdHJlYW19IGlzIGNvbnN1bWVkIGJ1dCBub3QgY2xvc2VkIGJ5IHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiBuZXcgZG9jdW1lbnQgSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBPYmplY3RJZCBjaGVja0luKGJvb2xlYW4gbWFqb3IsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoZWNraW5Db21tZW50LAotICAgICAgICAgICAgTGlzdDxQb2xpY3k+IHBvbGljaWVzLCBMaXN0PEFjZT4gYWRkQWNlcywgTGlzdDxBY2U+IHJlbW92ZUFjZXMpOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBpcyBhIFBXQyAocHJpdmF0ZSB3b3JraW5nIGNvcHkpIGl0IHBlcmZvcm1zIGEgY2hlY2sgaW4uIElmIHRoaXMKLSAgICAgKiBpcyBub3QgYSBQV0MgaXQgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAqIAotICAgICAqIFRoZSBzdHJlYW0gaW4ge0Bjb2RlIGNvbnRlbnRTdHJlYW19IGlzIGNvbnN1bWVkIGJ1dCBub3QgY2xvc2VkIGJ5IHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiBuZXcgZG9jdW1lbnQgSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBPYmplY3RJZCBjaGVja0luKGJvb2xlYW4gbWFqb3IsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoZWNraW5Db21tZW50KTsKLQotICAgIC8qKgotICAgICAqIEZldGNoZXMgdGhlIGxhdGVzdCBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ham9yCi0gICAgICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0gdGhlIGxhdGVzdCBtYWpvciB2ZXJzaW9uIHdpbGwgYmUgcmV0dXJuZWQsCi0gICAgICogICAgICAgICAgICBvdGhlcndpc2UgdGhlIHZlcnkgbGFzdCB2ZXJzaW9uIHdpbGwgYmUgcmV0dXJuZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXRlc3QgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKGJvb2xlYW4gbWFqb3IpOwotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyB0aGUgbGF0ZXN0IG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCB1c2luZyB0aGUKLSAgICAgKiBnaXZlbiB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1ham9yCi0gICAgICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0gdGhlIGxhdGVzdCBtYWpvciB2ZXJzaW9uIHdpbGwgYmUgcmV0dXJuZWQsCi0gICAgICogICAgICAgICAgICBvdGhlcndpc2UgdGhlIHZlcnkgbGFzdCB2ZXJzaW9uIHdpbGwgYmUgcmV0dXJuZWQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXRlc3QgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKGJvb2xlYW4gbWFqb3IsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaGVzIGFsbCB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50LgotICAgICAqIDxwPgotICAgICAqIFRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQgaWYgdGhlIGRvY3VtZW50IGlzIG5vdAotICAgICAqIHZlcnNpb25hYmxlIGFuZCBjYW4gYmUgZGlmZmVyZW50IGZvciBlYWNoIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbGwgdmVyc2lvbnMgb2YgdGhlIHZlcnNpb24gc2VyaWVzLCBzb3J0ZWQgYnkKLSAgICAgKiAgICAgICAgIHtAY29kZSBjbWlzOmNyZWF0aW9uRGF0ZX0gZGVzY2VuZGluZyBhbmQgcHJlY2VkZWQgYnkgdGhlIFBXQywgaWYKLSAgICAgKiAgICAgICAgIG9uZSBleGlzdHMsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PERvY3VtZW50PiBnZXRBbGxWZXJzaW9ucygpOwotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyBhbGwgdmVyc2lvbnMgb2YgdGhpcyBkb2N1bWVudCB1c2luZyB0aGUgZ2l2ZW4KLSAgICAgKiB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIGlzIHVuZGVmaW5lZCBpZiB0aGUgZG9jdW1lbnQgaXMgbm90Ci0gICAgICogdmVyc2lvbmFibGUgYW5kIGNhbiBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggcmVwb3NpdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFsbCB2ZXJzaW9ucyBvZiB0aGUgdmVyc2lvbiBzZXJpZXMsIHNvcnRlZCBieQotICAgICAqICAgICAgICAge0Bjb2RlIGNtaXM6Y3JlYXRpb25EYXRlfSBkZXNjZW5kaW5nIGFuZCBwcmVjZWRlZCBieSB0aGUgUFdDLCBpZgotICAgICAqICAgICAgICAgb25lIGV4aXN0cywgbm90IHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIExpc3Q8RG9jdW1lbnQ+IGdldEFsbFZlcnNpb25zKE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIGRvY3VtZW50LCBpbmNsdWRpbmcgY29udGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGFyZ2V0Rm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgdGFyZ2V0IGZvbGRlciwge0Bjb2RlIG51bGx9IHRvIGNyZWF0ZSBhbiB1bmZpbGVkCi0gICAgICogICAgICAgICAgICBkb2N1bWVudAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBkb2N1bWVudCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBEb2N1bWVudCBjb3B5KE9iamVjdElkIHRhcmdldEZvbGRlcklkKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgZG9jdW1lbnQsIGluY2x1ZGluZyBjb250ZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0YXJnZXRGb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIElEIG9mIHRoZSB0YXJnZXQgZm9sZGVyLCB7QGNvZGUgbnVsbH0gdG8gY3JlYXRlIGFuIHVuZmlsZWQKLSAgICAgKiAgICAgICAgICAgIGRvY3VtZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGRvY3VtZW50IG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAge0Bjb2RlIGNvbnRleHR9IHdhcyBzZXQgdG8ge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRG9jdW1lbnQgY29weShPYmplY3RJZCB0YXJnZXRGb2xkZXJJZCwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwKLSAgICAgICAgICAgIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFDRXMsIExpc3Q8QWNlPiByZW1vdmVBQ0VzLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9Eb2N1bWVudFByb3BlcnRpZXMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0RvY3VtZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGJjMGY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0RvY3VtZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbUhhc2g7Ci0KLS8qKgotICogQWNjZXNzb3JzIHRvIENNSVMgZG9jdW1lbnQgcHJvcGVydGllcy4KLSAqIAotICogQHNlZSBDbWlzT2JqZWN0UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50UHJvcGVydGllcyB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGRvY3VtZW50IGlzIGltbXV0YWJsZSAoQ01JUyBwcm9wZXJ0eQotICAgICAqIHtAY29kZSBjbWlzOmlzSW1tdXRhYmxlfSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaW1tdXRhYmxlIGZsYWcgb2YgdGhlIGRvY3VtZW50IG9yIHtAY29kZSBudWxsfSBpZiB0aGUKLSAgICAgKiAgICAgICAgIHByb3BlcnR5IGhhc24ndCBiZWVuIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlCi0gICAgICogICAgICAgICByZXBvc2l0b3J5LCBvciB0aGUgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc0ltbXV0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBkb2N1bWVudCBpcyB0aGUgbGF0ZXN0IHZlcnNpb24gKENNSVMKLSAgICAgKiBwcm9wZXJ0eSB7QGNvZGUgY21pczppc0xhdGVzdFZlcnNpb259KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBmbGFnIG9mIHRoZSBkb2N1bWVudCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCi0gICAgICogICAgICAgICBwcm9wZXJ0eSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSwgb3IgdGhlIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGRvY3VtZW50IGlzIGEgbWFqb3IgdmVyc2lvbiAoQ01JUyBwcm9wZXJ0eQotICAgICAqIHtAY29kZSBjbWlzOmlzTWFqb3JWZXJzaW9ufSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBmbGFnIG9mIHRoZSBkb2N1bWVudCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCi0gICAgICogICAgICAgICBwcm9wZXJ0eSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSwgb3IgdGhlIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNNYWpvclZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgZG9jdW1lbnQgaXMgdGhlIGxhdGVzdCBtYWpvciB2ZXJzaW9uIChDTUlTCi0gICAgICogcHJvcGVydHkge0Bjb2RlIGNtaXM6aXNMYXRlc3RNYWpvclZlcnNpb259KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXRlc3QgbWFqb3IgdmVyc2lvbiBmbGFnIG9mIHRoZSBkb2N1bWVudCBvciB7QGNvZGUgbnVsbH0gaWYKLSAgICAgKiAgICAgICAgIHRoZSBwcm9wZXJ0eSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSwgb3IgdGhlIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNMYXRlc3RNYWpvclZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgZG9jdW1lbnQgaXMgdGhlIFBXQyAoQ01JUyBwcm9wZXJ0eQotICAgICAqIHtAY29kZSBjbWlzOmlzUHJpdmF0ZVdvcmtpbmdDb3B5fSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgUFdDIGZsYWcgb2YgdGhlIGRvY3VtZW50IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkKLSAgICAgKiAgICAgICAgIGhhc24ndCBiZWVuIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnksIG9yCi0gICAgICogICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgQm9vbGVhbiBpc1ByaXZhdGVXb3JraW5nQ29weSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmVyc2lvbiBsYWJlbCAoQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczp2ZXJzaW9uTGFiZWx9KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGxhYmVsIG9mIHRoZSBkb2N1bWVudCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5Ci0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSByZXBvc2l0b3J5LCBvcgotICAgICAqICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRWZXJzaW9uTGFiZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZlcnNpb24gc2VyaWVzIElEIChDTUlTIHByb3BlcnR5IHtAY29kZSBjbWlzOnZlcnNpb25TZXJpZXNJZH0KLSAgICAgKiApLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gc2VyaWVzIElEIG9mIHRoZSBkb2N1bWVudCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCi0gICAgICogICAgICAgICBwcm9wZXJ0eSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSwgb3IgdGhlIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRWZXJzaW9uU2VyaWVzSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgdmVyc2lvbiBzZXJpZXMgaXMgY2hlY2tlZCBvdXQgKENNSVMgcHJvcGVydHkKLSAgICAgKiB7QGNvZGUgY21pczppc1ZlcnNpb25TZXJpZXNDaGVja2VkT3V0fSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBzZXJpZXMgY2hlY2tlZCBvdXQgZmxhZyBvZiB0aGUgZG9jdW1lbnQgb3IKLSAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgaGFzbid0IGJlZW4gcmVxdWVzdGVkLCBoYXNuJ3QgYmVlbgotICAgICAqICAgICAgICAgcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnksIG9yIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpc24ndCBzZXQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGlzVmVyc2lvblNlcmllc0NoZWNrZWRPdXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXIgd2hvIGNoZWNrZWQgb3V0IHRoaXMgdmVyc2lvbiBzZXJpZXMgKENNSVMgcHJvcGVydHkKLSAgICAgKiB7QGNvZGUgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5fSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXNlciB3aG8gY2hlY2tlZCBvdXQgdGhpcyB2ZXJzaW9uIHNlcmllcyBvciB7QGNvZGUgbnVsbH0gaWYKLSAgICAgKiAgICAgICAgIHRoZSBwcm9wZXJ0eSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSwgb3IgdGhlIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBQV0MgSUQgb2YgdGhpcyB2ZXJzaW9uIHNlcmllcyAoQ01JUyBwcm9wZXJ0eQotICAgICAqIHtAY29kZSBjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWR9KS4KLSAgICAgKiA8cD4KLSAgICAgKiBTb21lIHJlcG9zaXRvcmllcyBwcm92aWRlZCB0aGlzIHZhbHVlIG9ubHkgdG8gdGhlIHVzZXIgd2hvIGNoZWNrZWQgb3V0Ci0gICAgICogdGhlIHZlcnNpb24gc2VyaWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFBXQyBJRCBvZiB0aGlzIHZlcnNpb24gc2VyaWVzIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkKLSAgICAgKiAgICAgICAgIGhhc24ndCBiZWVuIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnksIG9yCi0gICAgICogICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoZWNraW4gY29tbWVudCAoQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpjaGVja2luQ29tbWVudH0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoZWNraW4gY29tbWVudCBvZiB0aGlzIHZlcnNpb24gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQotICAgICAqICAgICAgICAgcHJvcGVydHkgaGFzbid0IGJlZW4gcmVxdWVzdGVkLCBoYXNuJ3QgYmVlbiBwcm92aWRlZCBieSB0aGUKLSAgICAgKiAgICAgICAgIHJlcG9zaXRvcnksIG9yIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpc24ndCBzZXQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2hlY2tpbkNvbW1lbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgc3RyZWFtIGxlbmd0aCBvciAtMSBpZiB0aGUgZG9jdW1lbnQgaGFzIG5vIGNvbnRlbnQKLSAgICAgKiAoQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpjb250ZW50U3RyZWFtTGVuZ3RofSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBzdHJlYW0gbGVuZ3RoIG9mIHRoaXMgZG9jdW1lbnQgb3IgLTEgaWYgdGhlIHByb3BlcnR5Ci0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSByZXBvc2l0b3J5LCBvcgotICAgICAqICAgICAgICAgdGhlIGRvY3VtZW50IGhhcyBubyBjb250ZW50Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgbG9uZyBnZXRDb250ZW50U3RyZWFtTGVuZ3RoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHN0cmVhbSBNSU1FIHR5cGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBkb2N1bWVudCBoYXMKLSAgICAgKiBubyBjb250ZW50IChDTUlTIHByb3BlcnR5IHtAY29kZSBjbWlzOmNvbnRlbnRTdHJlYW1NaW1lVHlwZX0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgc3RyZWFtIE1JTUUgdHlwZSBvZiB0aGlzIGRvY3VtZW50IG9yIHtAY29kZSBudWxsfSBpZgotICAgICAqICAgICAgICAgdGhlIHByb3BlcnR5IGhhc24ndCBiZWVuIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlCi0gICAgICogICAgICAgICByZXBvc2l0b3J5LCBvciB0aGUgZG9jdW1lbnQgaGFzIG5vIGNvbnRlbnQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29udGVudFN0cmVhbU1pbWVUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHN0cmVhbSBmaWxlbmFtZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGRvY3VtZW50IGhhcwotICAgICAqIG5vIGNvbnRlbnQgKENNSVMgcHJvcGVydHkge0Bjb2RlIGNtaXM6Y29udGVudFN0cmVhbUZpbGVOYW1lfSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBzdHJlYW0gZmlsZW5hbWUgb2YgdGhpcyBkb2N1bWVudCBvciB7QGNvZGUgbnVsbH0gaWYKLSAgICAgKiAgICAgICAgIHRoZSBwcm9wZXJ0eSBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSwgb3IgdGhlIGRvY3VtZW50IGhhcyBubyBjb250ZW50Ci0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldENvbnRlbnRTdHJlYW1GaWxlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBzdHJlYW0gSUQgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBkb2N1bWVudCBoYXMgbm8KLSAgICAgKiBjb250ZW50IChDTUlTIHByb3BlcnR5IHtAY29kZSBjbWlzOmNvbnRlbnRTdHJlYW1JZH0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgc3RyZWFtIElEIG9mIHRoaXMgZG9jdW1lbnQgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQotICAgICAqICAgICAgICAgcHJvcGVydHkgaGFzbid0IGJlZW4gcmVxdWVzdGVkLCBoYXNuJ3QgYmVlbiBwcm92aWRlZCBieSB0aGUKLSAgICAgKiAgICAgICAgIHJlcG9zaXRvcnksIG9yIHRoZSBkb2N1bWVudCBoYXMgbm8gY29udGVudAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRDb250ZW50U3RyZWFtSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgaGFzaGVzIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZG9jdW1lbnQgaGFzIG5vIGNvbnRlbnQKLSAgICAgKiAoQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpjb250ZW50U3RyZWFtSGFzaH0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29udGVudCBoYXNoZXMgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eSBoYXNuJ3QKLSAgICAgKiAgICAgICAgIGJlZW4gcmVxdWVzdGVkLCBoYXNuJ3QgYmVlbiBwcm92aWRlZCBieSB0aGUgcmVwb3NpdG9yeSwgb3IgdGhlCi0gICAgICogICAgICAgICBkb2N1bWVudCBoYXMgbm8gY29udGVudAotICAgICAqIAotICAgICAqIEBjbWlzIEV4dGVuc2lvbgotICAgICAqLwotICAgIExpc3Q8Q29udGVudFN0cmVhbUhhc2g+IGdldENvbnRlbnRTdHJlYW1IYXNoZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0RvY3VtZW50VHlwZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRG9jdW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzAxZDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRG9jdW1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ29udGVudFN0cmVhbUFsbG93ZWQ7Ci0KLS8qKgotICogRG9jdW1lbnQgT2JqZWN0IFR5cGUuCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VHlwZSBleHRlbmRzIE9iamVjdFR5cGUgewotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUge0Bjb2RlIGlzVmVyc2lvbmFibGV9IGZsYWcuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBkb2N1bWVudCB0eXBlIGlzIHZlcnNpb25hYmxlLCB7QGNvZGUgZmFsc2V9Ci0gICAgICogICAgICAgICBpZiBkb2N1bWVudHMgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSB2ZXJzaW9uZWQuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc1ZlcnNpb25hYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBlbnVtIHRoYXQgZGVzY3JpYmVzLCBob3cgY29udGVudCBzdHJlYW1zIGhhdmUgdG8gYmUgaGFuZGxlZCB3aXRoCi0gICAgICogdGhpcyBkb2N1bWVudCB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1vZGUgb2YgY29udGVudCBzdHJlYW0gc3VwcG9ydCAoe0Bjb2RlIG5vdGFsbG93ZWR9LAotICAgICAqICAgICAgICAge0Bjb2RlIGFsbG93ZWR9LCBvciB7QGNvZGUgcmVxdWlyZWR9KQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIENvbnRlbnRTdHJlYW1BbGxvd2VkIGdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0ZpbGVhYmxlQ21pc09iamVjdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRmlsZWFibGVDbWlzT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlN2U2NWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRmlsZWFibGVDbWlzT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBGaWxlYWJsZSBDTUlTIG9iamVjdC4KLSAqIAotICogQSBmaWxlYWJsZSBvYmplY3QgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIHJlc2lkZSBpbiBhIGZvbGRlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWxlYWJsZUNtaXNPYmplY3QgZXh0ZW5kcyBDbWlzT2JqZWN0IHsKLQotICAgIC8vIG9iamVjdCBzZXJ2aWNlCi0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGlzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlRm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgSUQgb2YgdGhlIHNvdXJjZSBmb2xkZXIKLSAgICAgKiBAcGFyYW0gdGFyZ2V0Rm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgSUQgb2YgdGhlIHRhcmdldCBmb2xkZXIKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtb3ZlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBGaWxlYWJsZUNtaXNPYmplY3QgbW92ZShPYmplY3RJZCBzb3VyY2VGb2xkZXJJZCwgT2JqZWN0SWQgdGFyZ2V0Rm9sZGVySWQpOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZUZvbGRlcklkCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IElEIG9mIHRoZSBzb3VyY2UgZm9sZGVyCi0gICAgICogQHBhcmFtIHRhcmdldEZvbGRlcklkCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IElEIG9mIHRoZSB0YXJnZXQgZm9sZGVyCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gdG8gdXNlIHRvIGZldGNoIHRoZSBtb3ZlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBtb3ZlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBGaWxlYWJsZUNtaXNPYmplY3QgbW92ZShPYmplY3RJZCBzb3VyY2VGb2xkZXJJZCwgT2JqZWN0SWQgdGFyZ2V0Rm9sZGVySWQsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvLyBuYXZpZ2F0aW9uIHNlcnZpY2UKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmVudHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBwYXJlbnQgZm9sZGVycyBvZiB0aGlzIG9iamVjdCBvciBhbiBlbXB0eSBsaXN0IGlmCi0gICAgICogICAgICAgICB0aGlzIG9iamVjdCBpcyB1bmZpbGVkIG9yIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSByb290IGZvbGRlcgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIExpc3Q8Rm9sZGVyPiBnZXRQYXJlbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnRzIG9mIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICB0aGUge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9IHRvIHVzZSB0byBmZXRjaCB0aGUgcGFyZW50IGZvbGRlcgotICAgICAqICAgICAgICAgICAgb2JqZWN0cwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGFyZW50IGZvbGRlcnMgb2YgdGhpcyBvYmplY3Qgb3IgYW4gZW1wdHkgbGlzdCBpZgotICAgICAqICAgICAgICAgdGhpcyBvYmplY3QgaXMgdW5maWxlZCBvciBpZiB0aGlzIG9iamVjdCBpcyB0aGUgcm9vdCBmb2xkZXIKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PEZvbGRlcj4gZ2V0UGFyZW50cyhPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBwYXRocyBvZiB0aGlzIG9iamVjdCBvciBhbiBlbXB0eSBsaXN0IGlmIHRoaXMgb2JqZWN0Ci0gICAgICogICAgICAgICBpcyB1bmZpbGVkIG9yIGlmIHRoaXMgb2JqZWN0IGlzIHRoZSByb290IGZvbGRlcgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIExpc3Q8U3RyaW5nPiBnZXRQYXRocygpOwotCi0gICAgLy8gbXVsdGlmaWxpbmcgc2VydmljZQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGlzIG9iamVjdCB0byBhIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgSUQgb2YgdGhlIGZvbGRlciB0byB3aGljaCB0aGlzIG9iamVjdCBzaG91bGQgYmUKLSAgICAgKiAgICAgICAgICAgIGFkZGVkCi0gICAgICogQHBhcmFtIGFsbFZlcnNpb25zCi0gICAgICogICAgICAgICAgICBpZiB0aGlzIHBhcmFtZXRlciBpcyB7QGNvZGUgdHJ1ZX0gYW5kIHRoaXMgb2JqZWN0IGlzIGEKLSAgICAgKiAgICAgICAgICAgIGRvY3VtZW50LCBhbGwgdmVyc2lvbnMgb2YgdGhlIHZlcnNpb24gc2VyaWVzIGFyZSBhZGRlZCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIGZvbGRlcgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHZvaWQgYWRkVG9Gb2xkZXIoT2JqZWN0SWQgZm9sZGVySWQsIGJvb2xlYW4gYWxsVmVyc2lvbnMpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGlzIG9iamVjdCBmcm9tIGEgZm9sZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCBJRCBvZiB0aGUgZm9sZGVyIGZyb20gd2hpY2ggdGhpcyBvYmplY3Qgc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgICByZW1vdmVkCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVGcm9tRm9sZGVyKE9iamVjdElkIGZvbGRlcklkKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0ZvbGRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWJjOWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLQotLyoqCi0gKiBDTUlTIGZvbGRlciBpbnRlcmZhY2UuCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZvbGRlciBleHRlbmRzIEZpbGVhYmxlQ21pc09iamVjdCwgRm9sZGVyUHJvcGVydGllcyB7Ci0KLSAgICAvLyBvYmplY3Qgc2VydmljZQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBpbiB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBUaGUgc3RyZWFtIGluIHtAY29kZSBjb250ZW50U3RyZWFtfSBpcyBjb25zdW1lZCBidXQgbm90IGNsb3NlZCBieSB0aGlzCi0gICAgICogbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBkb2N1bWVudCBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgIHtAY29kZSBjb250ZXh0fSB3YXMgc2V0IHRvIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwKLSAgICAgICAgICAgIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBpbiB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBUaGUgc3RyZWFtIGluIHtAY29kZSBjb250ZW50U3RyZWFtfSBpcyBjb25zdW1lZCBidXQgbm90IGNsb3NlZCBieSB0aGlzCi0gICAgICogbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBkb2N1bWVudCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBmcm9tIGEgc291cmNlIGRvY3VtZW50IGluIHRoaXMgZm9sZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBkb2N1bWVudCBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiAgICAgICAgIHtAY29kZSBjb250ZXh0fSB3YXMgc2V0IHRvIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIERvY3VtZW50IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShPYmplY3RJZCBzb3VyY2UsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsCi0gICAgICAgICAgICBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgZnJvbSBhIHNvdXJjZSBkb2N1bWVudCBpbiB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKE9iamVjdElkIHNvdXJjZSwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHN1YmZvbGRlciBpbiB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZm9sZGVyIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAge0Bjb2RlIGNvbnRleHR9IHdhcyBzZXQgdG8ge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRm9sZGVyIGNyZWF0ZUZvbGRlcihNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHN1YmZvbGRlciBpbiB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZm9sZGVyIG9iamVjdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEZvbGRlciBjcmVhdGVGb2xkZXIoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHBvbGljeSBpbiB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcG9saWN5IG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAge0Bjb2RlIGNvbnRleHR9IHdhcyBzZXQgdG8ge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgUG9saWN5IGNyZWF0ZVBvbGljeShNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGl0ZW0gaW4gdGhpcyBmb2xkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IGl0ZW0gb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgSXRlbSBjcmVhdGVJdGVtKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpdGVtIGluIHRoaXMgZm9sZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBpdGVtIG9iamVjdCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhcmFtZXRlcgotICAgICAqICAgICAgICAge0Bjb2RlIGNvbnRleHR9IHdhcyBzZXQgdG8ge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgSXRlbSBjcmVhdGVJdGVtKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzLAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcG9saWN5IGluIHRoaXMgZm9sZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ldyBwb2xpY3kgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgUG9saWN5IGNyZWF0ZVBvbGljeShNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgdGhpcyBmb2xkZXIgYW5kIGFsbCBzdWJmb2xkZXJzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIG9iamVjdCBJRHMgd2hpY2ggZmFpbGVkIHRvIGJlIGRlbGV0ZWQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZGVsZXRlVHJlZShib29sZWFuIGFsbHZlcnNpb25zLCBVbmZpbGVPYmplY3QgdW5maWxlLCBib29sZWFuIGNvbnRpbnVlT25GYWlsdXJlKTsKLQotICAgIC8vIG5hdmlnYXRpb24gc2VydmljZQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZm9sZGVyIHRyZWUgc3RhcnRpbmcgd2l0aCB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0Pj4gZ2V0Rm9sZGVyVHJlZShpbnQgZGVwdGgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZm9sZGVyIHRyZWUgc3RhcnRpbmcgd2l0aCB0aGlzIGZvbGRlciB1c2luZyB0aGUgZ2l2ZW4KLSAgICAgKiB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0uCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4+IGdldEZvbGRlclRyZWUoaW50IGRlcHRoLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZm9sZGVyIGRlc2NlbmRhbnRzIHN0YXJ0aW5nIHdpdGggdGhpcyBmb2xkZXIuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4+IGdldERlc2NlbmRhbnRzKGludCBkZXB0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmb2xkZXIgZGVzY2VuZGFudHMgc3RhcnRpbmcgd2l0aCB0aGlzIGZvbGRlciB1c2luZyB0aGUgZ2l2ZW4KLSAgICAgKiB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0uCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4+IGdldERlc2NlbmRhbnRzKGludCBkZXB0aCwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZm9sZGVyLgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBnZXRDaGlsZHJlbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hpbGRyZW4gb2YgdGhpcyBmb2xkZXIgdXNpbmcgdGhlIGdpdmVuCi0gICAgICoge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9LgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBnZXRDaGlsZHJlbihPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgZm9sZGVyIGlzIHRoZSByb290IGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZm9sZGVyIGlzIHRoZSByb290IGZvbGRlciwge0Bjb2RlIGZhbHNlfQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Jvb3RGb2xkZXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhcmVudCBmb2xkZXIgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBmb2xkZXIgb2JqZWN0IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZm9sZGVyIGlzIHRoZQotICAgICAqICAgICAgICAgcm9vdCBmb2xkZXIuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRm9sZGVyIGdldEZvbGRlclBhcmVudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZm9sZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIGZvbGRlciBwYXRoCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBhdGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNoZWNrZWQgb3V0IGRvY3VtZW50cyBpbiB0aGlzIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBJdGVtSXRlcmFibGU8RG9jdW1lbnQ+IGdldENoZWNrZWRPdXREb2NzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBjaGVja2VkIG91dCBkb2N1bWVudHMgaW4gdGhpcyBmb2xkZXIgdXNpbmcgdGhlIGdpdmVuCi0gICAgICoge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9LgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxEb2N1bWVudD4gZ2V0Q2hlY2tlZE91dERvY3MoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0ZvbGRlclByb3BlcnRpZXMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0ZvbGRlclByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmYzBlYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9Gb2xkZXJQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEFjY2Vzc29ycyB0byBDTUlTIGZvbGRlciBwcm9wZXJ0aWVzLgotICogCi0gKiBAc2VlIENtaXNPYmplY3RQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9sZGVyUHJvcGVydGllcyB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgaWQgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBmb2xkZXIgaXMgdGhlIHJvb3QgZm9sZGVyCi0gICAgICogKENNSVMgcHJvcGVydHkge0Bjb2RlIGNtaXM6cGFyZW50SWR9KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IGhhc24ndCBiZWVuCi0gICAgICogICAgICAgICByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSByZXBvc2l0b3J5LCBvciB0aGUgZm9sZGVyCi0gICAgICogICAgICAgICBpcyB0aGUgcm9vdCBmb2xkZXIKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UGFyZW50SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGFsbG93ZWQgb2JqZWN0IHR5cGVzIGluIHRoaXMgZm9sZGVyIChDTUlTCi0gICAgICogcHJvcGVydHkge0Bjb2RlIGNtaXM6YWxsb3dlZENoaWxkT2JqZWN0VHlwZUlkc30pLiBJZiB0aGUgbGlzdCBpcyBlbXB0eSBvcgotICAgICAqIHtAY29kZSBudWxsfSBhbGwgb2JqZWN0IHR5cGVzIGFyZSBhbGxvd2VkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgaGFzbid0IGJlZW4KLSAgICAgKiAgICAgICAgIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnksIG9yIHRoZQotICAgICAqICAgICAgICAgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxPYmplY3RUeXBlPiBnZXRBbGxvd2VkQ2hpbGRPYmplY3RUeXBlcygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRm9sZGVyVHlwZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvRm9sZGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGZkMjMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0ZvbGRlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi0vKioKLSAqIEZvbGRlciBPYmplY3QgVHlwZS4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9sZGVyVHlwZSBleHRlbmRzIE9iamVjdFR5cGUgewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9JdGVtLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZTFjZjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLS8qKgotICogQ01JUyBpdGVtIGludGVyZmFjZS4KLSAqIAotICogQGNtaXMgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbSBleHRlbmRzIEZpbGVhYmxlQ21pc09iamVjdCB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0l0ZW1JdGVyYWJsZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvSXRlbUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZWM5NWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvSXRlbUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBJdGVyYWJsZSBmb3IgQ01JUyBjb2xsZWN0aW9ucyB0aGF0IGFsbG93cyBhYmlsaXR5IHRvIHNraXAgdG8gc3BlY2lmaWMKLSAqIHBvc2l0aW9uIG9yIHJldHVybiBhIHN1YmNvbGxlY3Rpb24uCi0gKiAKLSAqIEBwYXJhbSA8VD4KLSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGl0ZW1zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUl0ZXJhYmxlPFQ+IGV4dGVuZHMgSXRlcmFibGU8VD4gewotCi0gICAgLyoqCi0gICAgICogU2tpcHMgdG8gcG9zaXRpb24gd2l0aGluIENNSVMgY29sbGVjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGl0ZXJhYmxlIHdob3NlIHN0YXJ0aW5nIHBvaW50IGlzIHRoZSBzcGVjaWZpZWQgc2tpcCB0byBwb3NpdGlvbi4KLSAgICAgKiAgICAgICAgIFRoaXMgaXRlcmFibGUgPGVtPm1heTwvZW0+IGJlIHRoZSBzYW1lIGFzIHtAY29kZSB0aGlzfQotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxUPiBza2lwVG8obG9uZyBwb3NpdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGl0ZXJhYmxlIGZvciB0aGUgY3VycmVudCBzdWIgY29sbGVjdGlvbiB3aXRoaW4gdGhlIENNSVMKLSAgICAgKiBjb2xsZWN0aW9uIHVzaW5nIGRlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBpdGVyYWJsZSBmb3IgY3VycmVudCBwYWdlCi0gICAgICovCi0gICAgSXRlbUl0ZXJhYmxlPFQ+IGdldFBhZ2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaXRlcmFibGUgZm9yIHRoZSBjdXJyZW50IHN1YiBjb2xsZWN0aW9uIHdpdGhpbiB0aGUgQ01JUwotICAgICAqIGNvbGxlY3Rpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1heE51bUl0ZW1zCi0gICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGUgc3ViIGNvbGxlY3Rpb24gd2lsbCBjb250YWluCi0gICAgICogCi0gICAgICogQHJldHVybiBpdGVyYWJsZSBmb3IgY3VycmVudCBwYWdlCi0gICAgICovCi0gICAgSXRlbUl0ZXJhYmxlPFQ+IGdldFBhZ2UoaW50IG1heE51bUl0ZW1zKTsKLQotICAgIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgZmV0Y2hlZCBmb3IgdGhlIGN1cnJlbnQgcGFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBpdGVtcyBmb3IgY3VycmVudGx5IGZldGNoZWQgY29sbGVjdGlvbgotICAgICAqLwotICAgIGxvbmcgZ2V0UGFnZU51bUl0ZW1zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHJlcG9zaXRvcnkgY29udGFpbnMgYWRkaXRpb25hbCBpdGVtcyBiZXlvbmQgdGhlIHBhZ2UKLSAgICAgKiBvZiBpdGVtcyBhbHJlYWR5IGZldGNoZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlID0+IGZ1cnRoZXIgcGFnZSByZXF1ZXN0cyB3aWxsIGJlIG1hZGUgdG8gdGhlIHJlcG9zaXRvcnkKLSAgICAgKi8KLSAgICBib29sZWFuIGdldEhhc01vcmVJdGVtcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zLiBJZiB0aGUgcmVwb3NpdG9yeSBrbm93cyB0aGUgdG90YWwKLSAgICAgKiBudW1iZXIgb2YgaXRlbXMgaW4gYSByZXN1bHQgc2V0LCB0aGUgcmVwb3NpdG9yeSBTSE9VTEQgaW5jbHVkZSB0aGUgbnVtYmVyCi0gICAgICogaGVyZS4gSWYgdGhlIHJlcG9zaXRvcnkgZG9lcyBub3Qga25vdyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgcmVzdWx0Ci0gICAgICogc2V0LCB0aGlzIHBhcmFtZXRlciBTSE9VTEQgbm90IGJlIHNldC4gVGhlIHZhbHVlIGluIHRoZSBwYXJhbWV0ZXIgTUFZIE5PVAotICAgICAqIGJlIGFjY3VyYXRlIHRoZSBuZXh0IHRpbWUgdGhlIGNsaWVudCByZXRyaWV2ZXMgdGhlIHJlc3VsdCBzZXQgb3IgdGhlIG5leHQKLSAgICAgKiBwYWdlIGluIHRoZSByZXN1bHQgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGl0ZW1zIG9yICgtMSkKLSAgICAgKi8KLSAgICBsb25nIGdldFRvdGFsTnVtSXRlbXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvSXRlbVR5cGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL0l0ZW1UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmVkNGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvSXRlbVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi0vKioKLSAqIEl0ZW0gT2JqZWN0IFR5cGUuCi0gKiAKLSAqIEBjbWlzIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1UeXBlIGV4dGVuZHMgT2JqZWN0VHlwZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL09iamVjdEZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3ODliMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotCi0vKioKLSAqIEEgZmFjdG9yeSB0byBjcmVhdGUgYW5kIGNvbnZlcnQgQ01JUyBvYmplY3RzLgotICogCi0gKiBDdXN0b20ge0BsaW5rIE9iamVjdEZhY3Rvcnl9IGltcGxlbWVudGF0aW9ucyBtYXkgdXNlIHRoZSBjb252ZXJ0IG1ldGhvZHMgdG8KLSAqIGluamVjdCBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGludGVyZmFjZXMgd2hlbiB0aGUgZGF0YSBpcyB0cmFuc2ZlcmVkCi0gKiBmcm9tIHRoZSBsb3cgbGV2ZWwgQVBJIHRvIHRoZSBoaWdoIGxldmVsIEFQSS4KLSAqIAotICogQHNlZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb24jZ2V0T2JqZWN0RmFjdG9yeSgpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0RmFjdG9yeSB7Ci0KLSAgICB2b2lkIGluaXRpYWxpemUoU2Vzc2lvbiBzZXNzaW9uLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpOwotCi0gICAgLy8gcmVwb3NpdG9yeSBpbmZvCi0KLSAgICBSZXBvc2l0b3J5SW5mbyBjb252ZXJ0UmVwb3NpdG9yeUluZm8oUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeUluZm8pOwotCi0gICAgLy8gQUNMIGFuZCBBQ0UKLQotICAgIEFjbCBjb252ZXJ0QWNlcyhMaXN0PEFjZT4gYWNlcyk7Ci0KLSAgICBBY2wgY3JlYXRlQWNsKExpc3Q8QWNlPiBhY2VzKTsKLQotICAgIEFjZSBjcmVhdGVBY2UoU3RyaW5nIHByaW5jaXBhbCwgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zKTsKLQotICAgIC8vIHBvbGljaWVzCi0KLSAgICBMaXN0PFN0cmluZz4gY29udmVydFBvbGljaWVzKExpc3Q8UG9saWN5PiBwb2xpY2llcyk7Ci0KLSAgICAvLyByZW5kaXRpb25zCi0KLSAgICBSZW5kaXRpb24gY29udmVydFJlbmRpdGlvbihTdHJpbmcgb2JqZWN0SWQsIFJlbmRpdGlvbkRhdGEgcmVuZGl0aW9uKTsKLQotICAgIC8vIGNvbnRlbnQgc3RyZWFtCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIHtAbGluayBDb250ZW50U3RyZWFtfSBpbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZW5hbWUsIHNob3VsZCBiZSBzZXQKLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0gb3IgLTEgaWYgdGhlIGxlbmd0aCBpcyB1bmtub3duCi0gICAgICogQHBhcmFtIG1pbWV0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgTUlNRSB0eXBlLCBpZiB1bmtub3duICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIHNob3VsZCBiZQotICAgICAqICAgICAgICAgICAgdXNlZAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0sIHNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQ29udGVudFN0cmVhbX0gb2JqZWN0Ci0gICAgICovCi0gICAgQ29udGVudFN0cmVhbSBjcmVhdGVDb250ZW50U3RyZWFtKFN0cmluZyBmaWxlbmFtZSwgbG9uZyBsZW5ndGgsIFN0cmluZyBtaW1ldHlwZSwgSW5wdXRTdHJlYW0gc3RyZWFtKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUge0BsaW5rIENvbnRlbnRTdHJlYW19IGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmaWxlbmFtZSwgc2hvdWxkIGJlIHNldAotICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbSBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24KLSAgICAgKiBAcGFyYW0gbWltZXR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUsIGlmIHVua25vd24gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgICB1c2VkCi0gICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSwgc2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEBwYXJhbSBwYXJ0aWFsCi0gICAgICogICAgICAgICAgICBpZiA8Y29kZT5mYWxzZTwvY29kZT4gdGhlIHN0cmVhbSByZXByZXNlbnRzIHRoZSBmdWxsIGNvbnRlbnQsCi0gICAgICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgc3RyZWFtIGlzIG9ubHkgYSBwYXJ0IG9mIHRoZSBjb250ZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIENvbnRlbnRTdHJlYW19IG9iamVjdAotICAgICAqLwotICAgIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudFN0cmVhbShTdHJpbmcgZmlsZW5hbWUsIGxvbmcgbGVuZ3RoLCBTdHJpbmcgbWltZXR5cGUsIElucHV0U3RyZWFtIHN0cmVhbSwgYm9vbGVhbiBwYXJ0aWFsKTsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgaGlnaCBsZXZlbCB7QGxpbmsgQ29udGVudFN0cmVhbX0gb2JqZWN0IGludG8gYSBsb3cgbGV2ZWwKLSAgICAgKiB7QGxpbmsgQ29udGVudFN0cmVhbX0gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50U3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgb3JpZ2luYWwge0BsaW5rIENvbnRlbnRTdHJlYW19IG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBDb250ZW50U3RyZWFtfSBvYmplY3QKLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGNvbnZlcnRDb250ZW50U3RyZWFtKENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSk7Ci0KLSAgICAvLyB0eXBlcwotCi0gICAgT2JqZWN0VHlwZSBjb252ZXJ0VHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pOwotCi0gICAgT2JqZWN0VHlwZSBnZXRUeXBlRnJvbU9iamVjdERhdGEoT2JqZWN0RGF0YSBvYmplY3REYXRhKTsKLQotICAgIC8vIHByb3BlcnRpZXMKLQotICAgIDxUPiBQcm9wZXJ0eTxUPiBjcmVhdGVQcm9wZXJ0eShQcm9wZXJ0eURlZmluaXRpb248VD4gdHlwZSwgTGlzdDxUPiB2YWx1ZXMpOwotCi0gICAgTWFwPFN0cmluZywgUHJvcGVydHk8Pz4+IGNvbnZlcnRQcm9wZXJ0aWVzKE9iamVjdFR5cGUgb2JqZWN0VHlwZSwgQ29sbGVjdGlvbjxTZWNvbmRhcnlUeXBlPiBzZWNvbmRhcnlUeXBlcywKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLSAgICBQcm9wZXJ0aWVzIGNvbnZlcnRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdFR5cGUgdHlwZSwgQ29sbGVjdGlvbjxTZWNvbmRhcnlUeXBlPiBzZWNvbmRhcnlUeXBlcywKLSAgICAgICAgICAgIFNldDxVcGRhdGFiaWxpdHk+IHVwZGF0YWJpbGl0eUZpbHRlcik7Ci0KLSAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gY29udmVydFF1ZXJ5UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpOwotCi0gICAgLy8gb2JqZWN0cwotCi0gICAgQ21pc09iamVjdCBjb252ZXJ0T2JqZWN0KE9iamVjdERhdGEgb2JqZWN0RGF0YSwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotICAgIFF1ZXJ5UmVzdWx0IGNvbnZlcnRRdWVyeVJlc3VsdChPYmplY3REYXRhIG9iamVjdERhdGEpOwotCi0gICAgQ2hhbmdlRXZlbnQgY29udmVydENoYW5nZUV2ZW50KE9iamVjdERhdGEgb2JqZWN0RGF0YSk7Ci0KLSAgICBDaGFuZ2VFdmVudHMgY29udmVydENoYW5nZUV2ZW50cyhTdHJpbmcgY2hhbmdlTG9nVG9rZW4sIE9iamVjdExpc3Qgb2JqZWN0TGlzdCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9PYmplY3RJZC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvT2JqZWN0SWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4N2U2OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9PYmplY3RJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLS8qKgotICogSG9sZHMgYW4gb2JqZWN0IElELgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9iamVjdElkIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBJRC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgSUQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL09iamVjdFR5cGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL09iamVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjNDAwNS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9PYmplY3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBPYmplY3QgVHlwZS4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0VHlwZSBleHRlbmRzIFR5cGVEZWZpbml0aW9uIHsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYmFzZSBvYmplY3QgdHlwZSBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB0eXBlIGlzIGEgYmFzZSB0eXBlLCB7QGNvZGUgZmFsc2V9IGlmIHRoaXMKLSAgICAgKiAgICAgICAgIHR5cGUgaXMgYSBkZXJpdmVkIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQmFzZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGVzIGJhc2UgdHlwZSwgaWYgdGhlIHR5cGUgaXMgYSBkZXJpdmVkIChub24tYmFzZSkgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiYXNlIHR5cGUgdGhpcyB0eXBlIGlzIGRlcml2ZWQgZnJvbSwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGlzCi0gICAgICogICAgICAgICBhIGJhc2UgdHlwZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGVzIHBhcmVudCB0eXBlLCBpZiB0aGUgdHlwZSBpcyBhIGRlcml2ZWQgKG5vbi1iYXNlKSB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCB0eXBlIGZyb20gd2hpY2ggdGhpcyB0eXBlIGlzIGRlcml2ZWQsIG9yIHtAY29kZSBudWxsfQotICAgICAqICAgICAgICAgaWYgaXQgaXMgYSBiYXNlIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBPYmplY3RUeXBlIGdldFBhcmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgdHlwZXMgZGlyZWN0bHkgZGVyaXZlZCBmcm9tIHRoaXMgdHlwZSAod2hpY2ggd2lsbCByZXR1cm4KLSAgICAgKiB0aGlzIHR5cGUgb24ge0Bjb2RlIGdldFBhcmVudCgpfSkuCi0gICAgICogCi0gICAgICogQHJldHVybiBsaXN0IG9mIHR5cGVzIHdoaWNoIGFyZSBkaXJlY3RseSBkZXJpdmVkIGZyb20gdGhpcyB0eXBlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgSXRlbUl0ZXJhYmxlPE9iamVjdFR5cGU+IGdldENoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCB0eXBlcyBzb21laG93IGRlcml2ZWQgZnJvbSB0aGlzIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRlcHRoCi0gICAgICogICAgICAgICAgICB0aGUgdHJlZSBkZXB0aCwgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBvciAtMSBmb3IgaW5maW5pdGUKLSAgICAgKiAgICAgICAgICAgIGRlcHRoCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHJlZXMgb2YgdHlwZXMgd2hpY2ggYXJlIGRlcml2ZWQgZnJvbSB0aGlzIHR5cGUgKGRpcmVjdAotICAgICAqICAgICAgICAgYW5kIHZpYSB0aGVpciBwYXJlbnRzKQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvT3BlcmF0aW9uQ29udGV4dC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvT3BlcmF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWIyNjQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL09wZXJhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotCi0vKioKLSAqIEFuIDxjb2RlPk9wZXJhdGlvbkNvbnRleHQ8L2NvZGU+IG9iamVjdCBkZWZpbmVzIHRoZSBmaWx0ZXJpbmcsIHBhZ2luZyBhbmQKLSAqIGNhY2hpbmcgb2YgYW4gb3BlcmF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wZXJhdGlvbkNvbnRleHQgZXh0ZW5kcyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBmaWx0ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHNldCBvZiA8ZW0+cXVlcnkgbmFtZXM8L2VtPgotICAgICAqLwotICAgIFNldDxTdHJpbmc+IGdldEZpbHRlcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBmaWx0ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5RmlsdGVyCi0gICAgICogICAgICAgICAgICBhIHNldCBvZiA8ZW0+cXVlcnkgbmFtZXM8L2VtPgotICAgICAqLwotICAgIHZvaWQgc2V0RmlsdGVyKFNldDxTdHJpbmc+IHByb3BlcnR5RmlsdGVyKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgZmlsdGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUZpbHRlcgotICAgICAqICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nIG9mIDxlbT5xdWVyeSBuYW1lczwvZW0+IG9yICIqIiBmb3IKLSAgICAgKiAgICAgICAgICAgIGFsbCBwcm9wZXJ0aWVzIG9yIHtAY29kZSBudWxsfSB0byBsZXQgdGhlIHJlcG9zaXRvcnkgZGV0ZXJtaW5lCi0gICAgICogICAgICAgICAgICBhIHNldCBvZiBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgdm9pZCBzZXRGaWx0ZXJTdHJpbmcoU3RyaW5nIHByb3BlcnR5RmlsdGVyKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbHRlciBleHRlbmRlZCBieSBjbWlzOm9iamVjdElkLCBjbWlzOm9iamVjdFR5cGVJZCBhbmQKLSAgICAgKiBjbWlzOmJhc2VUeXBlSWQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZpbHRlclN0cmluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBpZiBzZWNvbmRhcnkgdHlwZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBsb2FkZWQuCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgdm9pZCBzZXRMb2FkU2Vjb25kYXJ5VHlwZVByb3BlcnRpZXMoYm9vbGVhbiBsb2FkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaXMgc2Vjb25kYXJ5IHR5cGUgcHJvcGVydGllcyBzaG91bGQgYmUgbG9hZGVkLgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIGJvb2xlYW4gbG9hZFNlY29uZGFyeVR5cGVQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGFsbG93YWJsZSBhY3Rpb25zIHNob3VsZCByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgaWYgYWxsb3dhYmxlIGFjdGlvbnMgc2hvdWxkIHJldHVybmVkLgotICAgICAqLwotICAgIHZvaWQgc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoYm9vbGVhbiBpbmNsdWRlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgQUNMcyBzaG91bGQgcmV0dXJuZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0luY2x1ZGVBY2xzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGlmIEFDTHMgc2hvdWxkIHJldHVybmVkLgotICAgICAqLwotICAgIHZvaWQgc2V0SW5jbHVkZUFjbHMoYm9vbGVhbiBpbmNsdWRlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hpY2ggcmVsYXRpb25zaGlwcyBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgZ2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgd2hpY2ggcmVsYXRpb25zaGlwcyBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgdm9pZCBzZXRJbmNsdWRlUmVsYXRpb25zaGlwcyhJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgcG9saWNpZXMgc2hvdWxkIHJldHVybmVkLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNJbmNsdWRlUG9saWNpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgaWYgcG9saWNpZXMgc2hvdWxkIHJldHVybmVkLgotICAgICAqLwotICAgIHZvaWQgc2V0SW5jbHVkZVBvbGljaWVzKGJvb2xlYW4gaW5jbHVkZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlbmRpdGlvbiBmaWx0ZXIuIChTZWUgQ01JUyBzcGVjCi0gICAgICogIjIuMi4xLjIuNC4xIFJlbmRpdGlvbiBGaWx0ZXIgR3JhbW1hciIpCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHNldCBvZiByZW5kaXRpb24gZmlsdGVyIHRlcm1zCi0gICAgICovCi0gICAgU2V0PFN0cmluZz4gZ2V0UmVuZGl0aW9uRmlsdGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHJlbmRpdGlvbiBmaWx0ZXIuIChTZWUgQ01JUyBzcGVjCi0gICAgICogIjIuMi4xLjIuNC4xIFJlbmRpdGlvbiBGaWx0ZXIgR3JhbW1hciIpCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlbmRpdGlvbkZpbHRlcgotICAgICAqICAgICAgICAgICAgYSBzZXQgb2YgcmVuZGl0aW9uIGZpbHRlciB0ZXJtcwotICAgICAqLwotICAgIHZvaWQgc2V0UmVuZGl0aW9uRmlsdGVyKFNldDxTdHJpbmc+IHJlbmRpdGlvbkZpbHRlcik7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHJlbmRpdGlvbiBmaWx0ZXIuIChTZWUgQ01JUyBzcGVjCi0gICAgICogIjIuMi4xLjIuNC4xIFJlbmRpdGlvbiBGaWx0ZXIgR3JhbW1hciIpCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlbmRpdGlvbkZpbHRlcgotICAgICAqICAgICAgICAgICAgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiByZW5kaXRpb24gZmlsdGVyIHRlcm1zCi0gICAgICovCi0gICAgdm9pZCBzZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoU3RyaW5nIHJlbmRpdGlvbkZpbHRlcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlbmRpdGlvbiBmaWx0ZXIuIChTZWUgQ01JUyBzcGVjCi0gICAgICogIjIuMi4xLjIuNC4xIFJlbmRpdGlvbiBGaWx0ZXIgR3JhbW1hciIpCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJlbmRpdGlvbiBmaWx0ZXIgdGVybXMKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHBhdGggc2VnbWVudHMgc2hvdWxkIHJldHVybmVkLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNJbmNsdWRlUGF0aFNlZ21lbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGlmIHBhdGggc2VnbWVudHMgc2hvdWxkIHJldHVybmVkLgotICAgICAqLwotICAgIHZvaWQgc2V0SW5jbHVkZVBhdGhTZWdtZW50cyhib29sZWFuIGluY2x1ZGUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3JkZXIgYnkgcnVsZSBmb3Igb3BlcmF0aW9ucyB0aGF0IHJldHVybiBsaXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgPGVtPnF1ZXJ5IG5hbWVzPC9lbT4gYW5kIHRoZSBhc2NlbmRpbmcKLSAgICAgKiAgICAgICAgIG1vZGlmaWVyICJBU0MiIG9yIHRoZSBkZXNjZW5kaW5nIG1vZGlmaWVyICJERVNDIiBmb3IgZWFjaCBxdWVyeQotICAgICAqICAgICAgICAgbmFtZQotICAgICAqLwotICAgIFN0cmluZyBnZXRPcmRlckJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvcmRlciBieSBydWxlIGZvciBvcGVyYXRpb25zIHRoYXQgcmV0dXJuIGxpc3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvcmRlckJ5Ci0gICAgICogICAgICAgICAgICBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIDxlbT5xdWVyeSBuYW1lczwvZW0+IGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgIGFzY2VuZGluZyBtb2RpZmllciAiQVNDIiBvciB0aGUgZGVzY2VuZGluZyBtb2RpZmllciAiREVTQyIgZm9yCi0gICAgICogICAgICAgICAgICBlYWNoIHF1ZXJ5IG5hbWUKLSAgICAgKi8KLSAgICB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIG9yZGVyQnkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGlmIGNhY2hpbmcgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2FjaGVFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICB2b2lkIHNldENhY2hlRW5hYmxlZChib29sZWFuIGNhY2hlRW5hYmxlZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEga2V5IGZvciB0aGlzIE9wZXJhdGlvbkNvbnRleHQgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgY2FjaGluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2FjaGVLZXkoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbWF4IG51bWJlciBvZiBpdGVtcyBwZXIgYmF0Y2ggZm9yIG9wZXJhdGlvbnMgdGhhdCByZXR1cm4gbGlzdHMuCi0gICAgICogCi0gICAgICogVGhpcyBvcHRpb24gZG9lcyBub3QgcmVzdHJpY3QgdGhlIG51bWJlciBvZiByZXR1cm5lZCBpdGVtcy4gVG8gcmV0cmlldmUKLSAgICAgKiBhbiBleGNlcnB0IChwYWdlKSBvZiBhIGxpc3QsIHNlZSB7QGxpbmsgSXRlbUl0ZXJhYmxlI2dldFBhZ2UoaW50KX0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1heEl0ZW1zUGVyUGFnZQotICAgICAqICAgICAgICAgICAgbWF4IG51bWJlciBvZiBpdGVtcyAobXVzdCBiZSA+MCkKLSAgICAgKi8KLSAgICB2b2lkIHNldE1heEl0ZW1zUGVyUGFnZShpbnQgbWF4SXRlbXNQZXJQYWdlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbWF4IG51bWJlciBvZiBpdGVtcyBwZXIgYmF0Y2guCi0gICAgICovCi0gICAgaW50IGdldE1heEl0ZW1zUGVyUGFnZSgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUG9saWN5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9Qb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliYWEwYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9Qb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi0vKioKLSAqIENNSVMgcG9saWN5IGludGVyZmFjZS4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9saWN5IGV4dGVuZHMgRmlsZWFibGVDbWlzT2JqZWN0LCBQb2xpY3lQcm9wZXJ0aWVzIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUG9saWN5UHJvcGVydGllcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUG9saWN5UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzMxYTNmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1BvbGljeVByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi0vKioKLSAqIEFjY2Vzc29ycyB0byBDTUlTIHBvbGljeSBwcm9wZXJ0aWVzLgotICogCi0gKiBAc2VlIENtaXNPYmplY3RQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUG9saWN5UHJvcGVydGllcyB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwb2xpY3kgdGV4dCBvZiB0aGlzIENNSVMgcG9saWN5IChDTUlTIHByb3BlcnR5Ci0gICAgICoge0Bjb2RlIGNtaXM6cG9saWN5VGV4dH0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBvbGljeSB0ZXh0IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgaGFzbid0IGJlZW4KLSAgICAgKiAgICAgICAgIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnksIG9yIHRoZQotICAgICAqICAgICAgICAgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldFBvbGljeVRleHQoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1BvbGljeVR5cGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1BvbGljeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5YTYxYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9Qb2xpY3lUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotLyoqCi0gKiBQb2xpY3kgT2JqZWN0IFR5cGUuCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvbGljeVR5cGUgZXh0ZW5kcyBPYmplY3RUeXBlIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUHJvcGVydHkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZWJhOWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLQotLyoqCi0gKiBDTUlTIFByb3BlcnR5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5PFQ+IGV4dGVuZHMgUHJvcGVydHlEYXRhPFQ+IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHByb3BlcnR5IGlzIGEgbXVsdGktdmFsdWUgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHByb3BlcnR5IGlzIG11bHRpLXZhbHVlIHByb3BlcnR5LAotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiB0aGUgcHJvcGVydHkgaXMgc2luZ2xlLXZhbHVlIHByb3BlcnR5LAotICAgICAqLwotICAgIGJvb2xlYW4gaXNNdWx0aVZhbHVlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZGF0YSB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRhdGEgdHlwZSBvZiB0aGUgcHJvcGVydHksIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBQcm9wZXJ0eVR5cGUgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgUHJvcGVydHlEZWZpbml0aW9uPFQ+IGdldERlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIChzaW5nbGUgb3IgbXVsdGlwbGUpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXNuJ3QKLSAgICAgKiAgICAgICAgIHNldAotICAgICAqLwotICAgIDxVPiBVIGdldFZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5IHZhbHVlLiBJZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBtdWx0aS12YWx1ZSBwcm9wZXJ0eSwgb25seSB0aGUgZmlyc3QgdmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSAoZmlyc3QpIHByb3BlcnR5IHZhbHVlIGFzIGEgc3RyaW5nIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKLSAgICAgKiAgICAgICAgIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqLwotICAgIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5IHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhIHN0cmluZyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5Ci0gICAgICogICAgICAgICB2YWx1ZSBpc24ndCBzZXQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VmFsdWVzQXNTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1F1ZXJ5UmVzdWx0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9RdWVyeVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWRkM2RkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1F1ZXJ5UmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci0KLS8qKgotICogUXVlcnkgcmVzdWx0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5UmVzdWx0IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMgaW4gdGhpcyBxdWVyeSByZXN1bHQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbGwgcHJvcGVydGllcywgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJvcGVydHkgYnkgSUQuCi0gICAgICogPHA+Ci0gICAgICogQmVjYXVzZSByZXBvc2l0b3JpZXMgYXJlIG5vdCBvYmxpZ2F0ZWQgdG8gYWRkIHByb3BlcnR5IElEcyB0byB0aGVpciBxdWVyeQotICAgICAqIHJlc3VsdCBwcm9wZXJ0aWVzLCB0aGlzIG1ldGhvZCBtaWdodCBub3QgYWx3YXlzIHdvcmsgYXMgZXhwZWN0ZWQgd2l0aAotICAgICAqIHNvbWUgcmVwb3NpdG9yaWVzLiBVc2Uge0BsaW5rICNnZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKFN0cmluZyl9IGluc3RlYWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgSUQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3Qgb3IKLSAgICAgKiAgICAgICAgIGhhc24ndCBiZWVuIHJlcXVlc3RlZAotICAgICAqLwotICAgIDxUPiBQcm9wZXJ0eURhdGE8VD4gZ2V0UHJvcGVydHlCeUlkKFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJvcGVydHkgYnkgcXVlcnkgbmFtZSBvciBhbGlhcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcXVlcnlOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgcXVlcnkgbmFtZSBvciBhbGlhcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgZG9lc24ndCBleGlzdCBvcgotICAgICAqICAgICAgICAgaGFzbid0IGJlZW4gcmVxdWVzdGVkCi0gICAgICogCi0gICAgICovCi0gICAgPFQ+IFByb3BlcnR5RGF0YTxUPiBnZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKFN0cmluZyBxdWVyeU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByb3BlcnR5IChzaW5nbGUpIHZhbHVlIGJ5IElELgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZAotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IElECi0gICAgICogCi0gICAgICogQHNlZSAjZ2V0UHJvcGVydHlCeUlkKFN0cmluZykKLSAgICAgKi8KLSAgICA8VD4gVCBnZXRQcm9wZXJ0eVZhbHVlQnlJZChTdHJpbmcgaWQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHByb3BlcnR5IChzaW5nbGUpIHZhbHVlIGJ5IHF1ZXJ5IG5hbWUgb3IgYWxpYXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHF1ZXJ5TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHF1ZXJ5IG5hbWUgb3IgYWxpYXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QsCi0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIG9yIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpc24ndCBzZXQKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKFN0cmluZykKLSAgICAgKi8KLSAgICA8VD4gVCBnZXRQcm9wZXJ0eVZhbHVlQnlRdWVyeU5hbWUoU3RyaW5nIHF1ZXJ5TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgcHJvcGVydHkgbXVsdGktdmFsdWUgYnkgSUQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgSUQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QsCi0gICAgICogICAgICAgICBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQsIG9yIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpc24ndCBzZXQKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRQcm9wZXJ0eUJ5SWQoU3RyaW5nKQotICAgICAqLwotICAgIDxUPiBMaXN0PFQ+IGdldFByb3BlcnR5TXVsdGl2YWx1ZUJ5SWQoU3RyaW5nIGlkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcm9wZXJ0eSBtdWx0aS12YWx1ZSBieSBxdWVyeSBuYW1lIG9yIGFsaWFzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBxdWVyeU5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBxdWVyeSBuYW1lIG9yIGFsaWFzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0LAotICAgICAqICAgICAgICAgaGFzbid0IGJlZW4gcmVxdWVzdGVkLCBvciB0aGUgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZShTdHJpbmcpCi0gICAgICovCi0gICAgPFQ+IExpc3Q8VD4gZ2V0UHJvcGVydHlNdWx0aXZhbHVlQnlRdWVyeU5hbWUoU3RyaW5nIHF1ZXJ5TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbGxvd2FibGUgYWN0aW9ucyBpZiB0aGV5IGhhdmUgYmVlbiByZXF1ZXN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWxsb3dhYmxlIGFjdGlvbnMgaWYgdGhleSBoYXZlIGJlZW4gcmVxdWVzdGVkLCB7QGNvZGUgbnVsbH0KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIEFsbG93YWJsZUFjdGlvbnMgZ2V0QWxsb3dhYmxlQWN0aW9ucygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVsYXRpb25zaGlwcyBpZiB0aGV5IGhhdmUgYmVlbiByZXF1ZXN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybnMgdGhlIHJlbGF0aW9uc2hpcHMgaWYgdGhleSBoYXZlIGJlZW4gcmVxdWVzdGVkLCB7QGNvZGUgbnVsbH0KLSAgICAgKiAgICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBMaXN0PFJlbGF0aW9uc2hpcD4gZ2V0UmVsYXRpb25zaGlwcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVuZGl0aW9ucyBpZiB0aGV5IGhhdmUgYmVlbiByZXF1ZXN0ZWQuCi0gICAgICogCi0gICAgICogQGV0dXJucyB0aGUgcmVuZGl0aW9uIGlmIHRoZXkgaGF2ZSBiZWVuIHJlcXVlc3RlZCwge0Bjb2RlIG51bGx9IG90aGVyd2lzZQotICAgICAqLwotICAgIExpc3Q8UmVuZGl0aW9uPiBnZXRSZW5kaXRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9RdWVyeVN0YXRlbWVudC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUXVlcnlTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhZTE5My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9RdWVyeVN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLQotLyoqCi0gKiBRdWVyeSBTdGF0ZW1lbnQuCi0gKiA8cD4KLSAqIFNhbXBsZSBjb2RlOgotICogCi0gKiA8cHJlPgotICogQ2FsZW5kYXIgY2FsID0gLi4uCi0gKiBGb2xkZXIgZm9sZGVyID0gLi4uCi0gKiAKLSAqIFF1ZXJ5U3RhdGVtZW50IHFzID0gCi0gKiAgIHNlc3Npb24uY3JlYXRlUXVlcnlTdGF0ZW1lbnQoIlNFTEVDVCA/LCA/IEZST00gPyBXSEVSRSA/ID4gVElNRVNUQU1QID8gQU5EIElOX0ZPTERFUig/KSBPUiA/IElOICg/KSIpOwotICogCi0gKiBxcy5zZXRQcm9wZXJ0eSgxLCAiY21pczpkb2N1bWVudCIsICJjbWlzOm5hbWUiKTsKLSAqIHFzLnNldFByb3BlcnR5KDIsICJjbWlzOmRvY3VtZW50IiwgImNtaXM6b2JqZWN0SWQiKTsKLSAqIHFzLnNldFR5cGUoMywgImNtaXM6ZG9jdW1lbnQiKTsKLSAqIAotICogcXMuc2V0UHJvcGVydHkoNCwgImNtaXM6ZG9jdW1lbnQiLCAiY21pczpjcmVhdGlvbkRhdGUiKTsKLSAqIHFzLnNldERhdGVUaW1lKDUsIGNhbCk7Ci0gKiAKLSAqIHFzLnNldElkKDYsIGZvbGRlcik7Ci0gKiAKLSAqIHFzLnNldFByb3BlcnR5KDcsICJjbWlzOmRvY3VtZW50IiwgImNtaXM6Y3JlYXRlZEJ5Iik7Ci0gKiBxcy5zZXRTdHJpbmcoOCwgImJvYiIsICJ0b20iLCAibGlzYSIpOyAKLSAqIAotICogU3RyaW5nIHN0YXRlbWVudCA9IHFzLnRvUXVlcnlTdHJpbmcoKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5U3RhdGVtZW50IGV4dGVuZHMgQ2xvbmVhYmxlIHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBxdWVyeSBuYW1lIG9mIHRoZSBnaXZlbiB0eXBlIElELgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCAob25lLWJhc2VkKQotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIElECi0gICAgICovCi0gICAgdm9pZCBzZXRUeXBlKGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nIHR5cGVJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgcXVlcnkgbmFtZSBvZiB0aGUgZ2l2ZW4gdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgaW5kZXggKG9uZS1iYXNlZCkKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0eXBlCi0gICAgICovCi0gICAgdm9pZCBzZXRUeXBlKGludCBwYXJhbWV0ZXJJbmRleCwgT2JqZWN0VHlwZSB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBxdWVyeSBuYW1lIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgaW5kZXggKG9uZS1iYXNlZCkKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlJZAotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IElECi0gICAgICovCi0gICAgdm9pZCBzZXRQcm9wZXJ0eShpbnQgcGFyYW1ldGVySW5kZXgsIFN0cmluZyB0eXBlSWQsIFN0cmluZyBwcm9wZXJ0eUlkKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBxdWVyeSBuYW1lIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgaW5kZXggKG9uZS1iYXNlZCkKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEZWZpbml0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAqLwotICAgIHZvaWQgc2V0UHJvcGVydHkoaW50IHBhcmFtZXRlckluZGV4LCBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcGVydHlEZWZpbml0aW9uKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiBudW1iZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIG51bQotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlcgotICAgICAqLwotICAgIHZvaWQgc2V0TnVtYmVyKGludCBwYXJhbWV0ZXJJbmRleCwgTnVtYmVyLi4uIG51bSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCAob25lLWJhc2VkKQotICAgICAqIEBwYXJhbSBzdHIKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICB2b2lkIHNldFN0cmluZyhpbnQgcGFyYW1ldGVySW5kZXgsIFN0cmluZy4uLiBzdHIpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVzaWduYXRlZCBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIHN0cmluZy4gSXQgZG9lcyBub3QgZXNjYXBlCi0gICAgICogYmFja3NsYXNoZXMgKCdcJykgaW4gZnJvbnQgb2YgJyUnIGFuZCAnXycuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIExJS0Ugc3RyaW5nCi0gICAgICovCi0gICAgdm9pZCBzZXRTdHJpbmdMaWtlKGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nIHN0cik7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gc3RyaW5nIGluIGEgQ01JUyBjb250YWlucwotICAgICAqIHN0YXRlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIENNSVMgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0d28gbGV2ZWxzIG9mIGVzY2FwaW5nLiBUaGUKLSAgICAgKiBmaXJzdCBsZXZlbCBlc2NhcGVzICcsICIsIFwgY2hhcmFjdGVycyB0byBcJywgXCIgYW5kIFxcLiBUaGUgY2hhcmFjdGVycwotICAgICAqICosID8gYW5kIC0gYXJlIGludGVycHJldGVkIGFzIHRleHQgc2VhcmNoIG9wZXJhdG9ycyBhbmQgYXJlIG5vdCBlc2NhcGVkCi0gICAgICogb24gZmlyc3QgbGV2ZWwuIElmICosID8sIC0gc2hhbGwgYmUgdXNlZCBhcyBsaXRlcmFscywgdGhleSBtdXN0IGJlIHBhc3NlZAotICAgICAqIGVzY2FwZWQgd2l0aCBcKiwgXD8gYW5kIFwtIHRvIHRoaXMgbWV0aG9kLgotICAgICAqIDxwPgotICAgICAqIEZvciBhbGwgc3RhdGVtZW50cyBpbiBhIENPTlRBSU5TKCkgY2xhdXNlIGl0IGlzIHJlcXVpcmVkIHRvIGlzb2xhdGUgdGhvc2UKLSAgICAgKiBmcm9tIGEgcXVlcnkgc3RhdGVtZW50LiBUaGVyZWZvcmUgYSBzZWNvbmQgbGV2ZWwgZXNjYXBpbmcgaXMgcGVyZm9ybWVkLgotICAgICAqIE9uIHRoZSBzZWNvbmQgbGV2ZWwgZ3JhbW1hciAiLCAnLCAtIGFuZCBcIGFyZSBlc2NhcGVkIHdpdGggYSBcLiBTZWUgdGhlCi0gICAgICogc3BlYyBmb3IgZnVydGhlciBkZXRhaWxzLgotICAgICAqIDxwPgotICAgICAqIFN1bW1hcnkgKGlucHV0IC0tPiBmaXJzdCBsZXZlbCBlc2NhcGluZyAtLT4gc2Vjb25kIGxldmVsIGVzY2FwaW5nIGFuZAotICAgICAqIG91dHB1dCk6ICogLS0+ICogLS0+ICogPyAtLT4gPyAtLT4gPyAtIC0tPiAtIC0tPiAtIFwgLS0+IFxcIC0tPiBcXFxcIChmb3IKLSAgICAgKiBhbnkgb3RoZXIgY2hhcmFjdGVyIGZvbGxvd2luZyBvdGhlciB0aGFuICogPyAtKSBcKiAtLT4gXCogLS0+IFxcKiBcPyAtLT4KLSAgICAgKiBcPyAtLT4gXFw/IFwtIC0tPiBcLSAtLT4gXFwtICcgLS0+IFwnIC0tPiBcXFwnICIgLS0+IFwiIC0tPiBcXFwiCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIHN0cgotICAgICAqICAgICAgICAgICAgdGhlIENPTlRBSU5TIHN0cmluZwotICAgICAqLwotICAgIHZvaWQgc2V0U3RyaW5nQ29udGFpbnMoaW50IHBhcmFtZXRlckluZGV4LCBTdHJpbmcgc3RyKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiBvYmplY3QgSUQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IElECi0gICAgICovCi0gICAgdm9pZCBzZXRJZChpbnQgcGFyYW1ldGVySW5kZXgsIE9iamVjdElkLi4uIGlkKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiBVUkkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgdGhlIFVSSQotICAgICAqLwotICAgIHZvaWQgc2V0VXJpKGludCBwYXJhbWV0ZXJJbmRleCwgVVJJLi4uIHVyaSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gVVJMLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCAob25lLWJhc2VkKQotICAgICAqIEBwYXJhbSB1cmwKLSAgICAgKiAgICAgICAgICAgIHRoZSBVUkwKLSAgICAgKi8KLSAgICB2b2lkIHNldFVybChpbnQgcGFyYW1ldGVySW5kZXgsIFVSTC4uLiB1cmwpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVzaWduYXRlZCBwYXJhbWV0ZXIgdG8gdGhlIGdpdmVuIGJvb2xlYW4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIGJvb2wKLSAgICAgKiAgICAgICAgICAgIHRoZSBib29sZWFuCi0gICAgICovCi0gICAgdm9pZCBzZXRCb29sZWFuKGludCBwYXJhbWV0ZXJJbmRleCwgYm9vbGVhbi4uLiBib29sKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiBEYXRlVGltZSB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVySW5kZXgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgaW5kZXggKG9uZS1iYXNlZCkKLSAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICB0aGUgRGF0ZVRpbWUgdmFsdWUgYXMgQ2FsZW5kYXIgb2JqZWN0Ci0gICAgICovCi0gICAgdm9pZCBzZXREYXRlVGltZShpbnQgcGFyYW1ldGVySW5kZXgsIENhbGVuZGFyLi4uIGNhbCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gRGF0ZVRpbWUgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIGNhbAotICAgICAqICAgICAgICAgICAgdGhlIERhdGVUaW1lIHZhbHVlIGFzIERhdGUgb2JqZWN0Ci0gICAgICovCi0gICAgdm9pZCBzZXREYXRlVGltZShpbnQgcGFyYW1ldGVySW5kZXgsIERhdGUuLi4gZGF0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gRGF0ZVRpbWUgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIGNhbAotICAgICAqICAgICAgICAgICAgdGhlIERhdGVUaW1lIHZhbHVlIGluIG1pbGxpc2Vjb25kcyBmcm9tIG1pZG5pZ2h0LCBKYW51YXJ5IDEsCi0gICAgICogICAgICAgICAgICAxOTcwIFVUQy4KLSAgICAgKi8KLSAgICB2b2lkIHNldERhdGVUaW1lKGludCBwYXJhbWV0ZXJJbmRleCwgbG9uZy4uLiBtcyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gRGF0ZVRpbWUgdmFsdWUgd2l0aCB0aGUgcHJlZml4Ci0gICAgICogJ1RJTUVTVEFNUCAnLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCAob25lLWJhc2VkKQotICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRlVGltZSB2YWx1ZSBhcyBDYWxlbmRhciBvYmplY3QKLSAgICAgKi8KLSAgICB2b2lkIHNldERhdGVUaW1lVGltZXN0YW1wKGludCBwYXJhbWV0ZXJJbmRleCwgQ2FsZW5kYXIuLi4gY2FsKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlc2lnbmF0ZWQgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiBEYXRlVGltZSB2YWx1ZSB3aXRoIHRoZSBwcmVmaXgKLSAgICAgKiAnVElNRVNUQU1QICcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlckluZGV4Ci0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4IChvbmUtYmFzZWQpCi0gICAgICogQHBhcmFtIGNhbAotICAgICAqICAgICAgICAgICAgdGhlIERhdGVUaW1lIHZhbHVlIGFzIERhdGUgb2JqZWN0Ci0gICAgICovCi0gICAgdm9pZCBzZXREYXRlVGltZVRpbWVzdGFtcChpbnQgcGFyYW1ldGVySW5kZXgsIERhdGUuLi4gZGF0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNpZ25hdGVkIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gRGF0ZVRpbWUgdmFsdWUgd2l0aCB0aGUgcHJlZml4Ci0gICAgICogJ1RJTUVTVEFNUCAnLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJJbmRleAotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBpbmRleCAob25lLWJhc2VkKQotICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIHRoZSBEYXRlVGltZSB2YWx1ZSBpbiBtaWxsaXNlY29uZHMgZnJvbSBtaWRuaWdodCwgSmFudWFyeSAxLAotICAgICAqICAgICAgICAgICAgMTk3MCBVVEMuCi0gICAgICovCi0gICAgdm9pZCBzZXREYXRlVGltZVRpbWVzdGFtcChpbnQgcGFyYW1ldGVySW5kZXgsIGxvbmcuLi4gbXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcXVlcnkgc3RhdGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHF1ZXJ5IHN0YXRlbWVudCwgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyB0b1F1ZXJ5U3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlYXJjaEFsbFZlcnNpb25zCi0gICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgYWxsIGRvY3VtZW50IHZlcnNpb25zIHNob3VsZCBiZSBpbmNsdWRlZCBpbgotICAgICAqICAgICAgICAgICAgdGhlIHNlYXJjaCByZXN1bHRzLCB7QGNvZGUgZmFsc2V9IGlmIG9ubHkgdGhlIGxhdGVzdCBkb2N1bWVudAotICAgICAqICAgICAgICAgICAgdmVyc2lvbnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggcmVzdWx0cwotICAgICAqIAotICAgICAqIAotICAgICAqIEBzZWUgU2Vzc2lvbiNxdWVyeShTdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgSXRlbUl0ZXJhYmxlPFF1ZXJ5UmVzdWx0PiBxdWVyeShib29sZWFuIHNlYXJjaEFsbFZlcnNpb25zKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoQWxsVmVyc2lvbnMKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiBhbGwgZG9jdW1lbnQgdmVyc2lvbnMgc2hvdWxkIGJlIGluY2x1ZGVkIGluCi0gICAgICogICAgICAgICAgICB0aGUgc2VhcmNoIHJlc3VsdHMsIHtAY29kZSBmYWxzZX0gaWYgb25seSB0aGUgbGF0ZXN0IGRvY3VtZW50Ci0gICAgICogICAgICAgICAgICB2ZXJzaW9ucyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaCByZXN1bHRzCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYXRpb24gY29udGV4dCB0byB1c2UKLSAgICAgKiAKLSAgICAgKiBAc2VlIFNlc3Npb24jcXVlcnkoU3RyaW5nLCBib29sZWFuLCBPcGVyYXRpb25Db250ZXh0KQotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcXVlcnkoYm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1JlbGF0aW9uc2hpcC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTE3ZTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotLyoqCi0gKiBDTUlTIHJlbGF0aW9uc2hpcCBpbnRlcmZhY2UuCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcCBleHRlbmRzIENtaXNPYmplY3QsIFJlbGF0aW9uc2hpcFByb3BlcnRpZXMgewotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc291cmNlIG9iamVjdC4gSWYgdGhlIHNvdXJjZSBvYmplY3QgSUQgaXMgaW52YWxpZCwKLSAgICAgKiB7QGNvZGUgbnVsbH0gd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBDbWlzT2JqZWN0IGdldFNvdXJjZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc291cmNlIG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4ge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9LiBJZiB0aGUKLSAgICAgKiBzb3VyY2Ugb2JqZWN0IElEIGlzIGludmFsaWQsIHtAY29kZSBudWxsfSB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIENtaXNPYmplY3QgZ2V0U291cmNlKE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0YXJnZXQgb2JqZWN0LiBJZiB0aGUgdGFyZ2V0IG9iamVjdCBJRCBpcyBpbnZhbGlkLAotICAgICAqIHtAY29kZSBudWxsfSB3aWxsIGJlIHJldHVybmVkLgotICAgICAqLwotICAgIENtaXNPYmplY3QgZ2V0VGFyZ2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0YXJnZXQgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0uIElmIHRoZQotICAgICAqIHRhcmdldCBvYmplY3QgSUQgaXMgaW52YWxpZCwge0Bjb2RlIG51bGx9IHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICovCi0gICAgQ21pc09iamVjdCBnZXRUYXJnZXQoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1JlbGF0aW9uc2hpcFByb3BlcnRpZXMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1JlbGF0aW9uc2hpcFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4ZTAxNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9SZWxhdGlvbnNoaXBQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaTsKLQotLyoqCi0gKiBBY2Nlc3NvcnMgdG8gQ01JUyByZWxhdGlvbnNoaXAgcHJvcGVydGllcy4KLSAqIAotICogQHNlZSBDbWlzT2JqZWN0UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcFByb3BlcnRpZXMgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc291cmNlIElEIG9mIHRoaXMgQ01JUyByZWxhdGlvbnNoaXAgKENNSVMgcHJvcGVydHkKLSAgICAgKiB7QGNvZGUgY21pczpzb3VyY2VJZH0pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBJRCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IGhhc24ndCBiZWVuCi0gICAgICogICAgICAgICByZXF1ZXN0ZWQsIGhhc24ndCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSByZXBvc2l0b3J5LCBvciB0aGUKLSAgICAgKiAgICAgICAgIHByb3BlcnR5IHZhbHVlIGlzbid0IHNldAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIGdldFNvdXJjZUlkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0YXJnZXQgSUQgb2YgdGhpcyBDTUlTIHJlbGF0aW9uc2hpcCAoQ01JUyBwcm9wZXJ0eQotICAgICAqIHtAY29kZSBjbWlzOnRhcmdldElkfSkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGFyZ2V0IElEIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcHJvcGVydHkgaGFzbid0IGJlZW4KLSAgICAgKiAgICAgICAgIHJlcXVlc3RlZCwgaGFzbid0IGJlZW4gcHJvdmlkZWQgYnkgdGhlIHJlcG9zaXRvcnksIG9yIHRoZQotICAgICAqICAgICAgICAgcHJvcGVydHkgdmFsdWUgaXNuJ3Qgc2V0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgT2JqZWN0SWQgZ2V0VGFyZ2V0SWQoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1JlbGF0aW9uc2hpcFR5cGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1JlbGF0aW9uc2hpcFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5NWY5My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9SZWxhdGlvbnNoaXBUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi9wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBSZWxhdGlvbnNoaXAgT2JqZWN0IFR5cGUuCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcFR5cGUgZXh0ZW5kcyBPYmplY3RUeXBlIHsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBvYmplY3QgdHlwZXMsIGFsbG93ZWQgYXMgc291cmNlIGZvciByZWxhdGlvbnNoaXBzIG9mIHRoaXMKLSAgICAgKiB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFsbG93ZWQgc291cmNlIHR5cGVzIGZvciB0aGlzIHJlbGF0aW9uc2hpcCB0eXBlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxPYmplY3RUeXBlPiBnZXRBbGxvd2VkU291cmNlVHlwZXMoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBvYmplY3QgdHlwZXMsIGFsbG93ZWQgYXMgdGFyZ2V0IGZvciByZWxhdGlvbnNoaXBzIG9mIHRoaXMKLSAgICAgKiB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGFsbG93ZWQgdGFyZ2V0IHR5cGVzIGZvciB0aGlzIHJlbGF0aW9uc2hpcCB0eXBlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxPYmplY3RUeXBlPiBnZXRBbGxvd2VkVGFyZ2V0VHlwZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUmVuZGl0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9SZW5kaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5OGU4NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9SZW5kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci0KLS8qKgotICogUmVuZGl0aW9uLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZW5kaXRpb24gZXh0ZW5kcyBSZW5kaXRpb25EYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlbmRpdGlvbiBpbiBieXRlcyBpZiBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcmVuZGl0aW9uIGluIGJ5dGVzIG9yIC0xIGlmIHRoZSBzaXplIGlzIG5vdAotICAgICAqICAgICAgICAgYXZhaWxhYmxlCi0gICAgICovCi0gICAgbG9uZyBnZXRMZW5ndGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBpbiBwaXhlbHMgaWYgdGhlIHJlbmRpdGlvbiBpcyBhbiBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWlnaHQgaW4gcGl4ZWxzIG9yIC0xIGlmIHRoZSBoZWlnaHQgaXMgbm90IGF2YWlsYWJsZSBvciB0aGUKLSAgICAgKiAgICAgICAgIHJlbmRpdGlvbiBpcyBub3QgYW4gaW1hZ2UKLSAgICAgKi8KLSAgICBsb25nIGdldEhlaWdodCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd2lkdGggaW4gcGl4ZWxzIGlmIHRoZSByZW5kaXRpb24gaXMgYW4gaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgd2lkdGggaW4gcGl4ZWxzIG9yIC0xIGlmIHRoZSB3aWR0aCBpcyBub3QgYXZhaWxhYmxlIG9yIHRoZQotICAgICAqICAgICAgICAgcmVuZGl0aW9uIGlzIG5vdCBhbiBpbWFnZQotICAgICAqLwotICAgIGxvbmcgZ2V0V2lkdGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbmRpdGlvbiBkb2N1bWVudCBpZiB0aGUgcmVuZGl0aW9uIGlzIGEgc3RhbmQtYWxvbmUKLSAgICAgKiBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZW5kaXRpb24gZG9jdW1lbnQgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vIHJlbmRpdGlvbgotICAgICAqICAgICAgICAgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBEb2N1bWVudCBnZXRSZW5kaXRpb25Eb2N1bWVudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVuZGl0aW9uIGRvY3VtZW50IHVzaW5nIHRoZSBwcm92aWRlcwotICAgICAqIHtAbGluayBPcGVyYXRpb25Db250ZXh0fSBpZiB0aGUgcmVuZGl0aW9uIGlzIGEgc3RhbmQtYWxvbmUgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGl0aW9uIGRvY3VtZW50IG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBubyByZW5kaXRpb24KLSAgICAgKiAgICAgICAgIGRvY3VtZW50Ci0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0UmVuZGl0aW9uRG9jdW1lbnQoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgc3RyZWFtIG9mIHRoZSByZW5kaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBzdHJlYW0gb2YgdGhlIHJlbmRpdGlvbiBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCi0gICAgICogICAgICAgICByZW5kaXRpb24gaGFzIG5vIGNvbnRlbnQKLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgVVJMIG9mIHRoZSByZW5kaXRpb24gaWYgdGhlIGJpbmRpbmcgc3VwcG9ydHMgY29udGVudAotICAgICAqIFVSTHMuCi0gICAgICogCi0gICAgICogRGVwZW5kaW5nIG9uIHRoZSByZXBvc2l0b3J5IGFuZCB0aGUgYmluZGluZywgdGhlIHNlcnZlciBtaWdodCBub3QgcmV0dXJuCi0gICAgICogdGhlIGNvbnRlbnQgYnV0IGFuIGVycm9yIG1lc3NhZ2UuIEF1dGhlbnRpY2F0aW9uIGRhdGEgaXMgbm90IGF0dGFjaGVkLgotICAgICAqIFRoYXQgaXMsIGEgdXNlciBtYXkgaGF2ZSB0byByZS1hdXRoZW50aWNhdGUgdG8gZ2V0IHRoZSBjb250ZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgVVJMIG9mIHRoZSByZW5kaXRpb24gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBiaW5kaW5nCi0gICAgICogICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IGNvbnRlbnQgVVJMcwotICAgICAqLwotICAgIFN0cmluZyBnZXRDb250ZW50VXJsKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9SZXBvc2l0b3J5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9SZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTAzN2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJlcG9zaXRvcnkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3NpdG9yeSBleHRlbmRzIFJlcG9zaXRvcnlJbmZvIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZXNzaW9uIGZvciB0aGlzIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBzZXNzaW9uIG9iamVjdAotICAgICAqLwotICAgIDxUIGV4dGVuZHMgU2Vzc2lvbj4gVCBjcmVhdGVTZXNzaW9uKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9TZWNvbmRhcnlUeXBlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9TZWNvbmRhcnlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZGMzNjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvU2Vjb25kYXJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLS8qKgotICogU2Vjb25kYXJ5IHR5cGUuCi0gKiAKLSAqIEBjbWlzIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY29uZGFyeVR5cGUgZXh0ZW5kcyBPYmplY3RUeXBlIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvU2Vzc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjk5ZWQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1Nlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQmFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkNtaXNCaW5kaW5nOwotCi0vKioKLSAqIEEgc2Vzc2lvbiBpcyBhIGNvbm5lY3Rpb24gdG8gYSBDTUlTIHJlcG9zaXRvcnkgd2l0aCBhIHNwZWNpZmljIHVzZXIuCi0gKiA8cD4KLSAqIENNSVMgaXRzZWxmIGlzIHN0YXRlbGVzcy4gT3BlbkNNSVMgdXNlcyB0aGUgY29uY2VwdCBvZiBhIHNlc3Npb24gdG8gY2FjaGUKLSAqIGRhdGEgYWNyb3NzIGNhbGxzIGFuZCB0byBkZWFsIHdpdGggdXNlciBhdXRoZW50aWNhdGlvbi4gVGhlIHNlc3Npb24gb2JqZWN0IGlzCi0gKiBhbHNvIHVzZWQgYXMgZW50cnkgcG9pbnQgdG8gYWxsIENNSVMgb3BlcmF0aW9ucyBhbmQgb2JqZWN0cy4gQmVjYXVzZSBhCi0gKiBzZXNzaW9uIGlzIG9ubHkgYSBjbGllbnQgc2lkZSBjb25jZXB0LCB0aGUgc2Vzc2lvbiBvYmplY3QgbmVlZHMgbm90IHRvIGJlCi0gKiBjbG9zZWQgb3IgcmVsZWFzZWQgd2hlbiBpdCdzIG5vdCBuZWVkZWQgYW55bW9yZS4KLSAqIDxwPgotICogTm90IGFsbCBvcGVyYXRpb25zIHByb3ZpZGVkIGJ5IHRoaXMgQVBJIG1pZ2h0IGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCi0gKiByZXBvc2l0b3J5LiBFaXRoZXIgT3BlbkNNSVMgb3IgdGhlIHJlcG9zaXRvcnkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4KLSAqIHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBpcyBjYWxsZWQuIFRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHJlcG9zaXRvcnkgY2FuIGJlCi0gKiBkaXNjb3ZlcmVkIGJ5IGV2YWx1YXRpbmcgdGhlIHJlcG9zaXRvcnkgaW5mbyAoc2VlCi0gKiB7QGxpbmsgI2dldFJlcG9zaXRvcnlJbmZvKCl9KS4KLSAqIDxwPgotICogQWxtb3N0IGFsbCBtZXRob2RzIG1pZ2h0IHRocm93IGV4Y2VwdGlvbnMgZGVyaXZlZCBmcm9tCi0gKiB7QGxpbmsgQ21pc0Jhc2VFeGNlcHRpb259IHdoaWNoIGlzIGEgcnVudGltZSBleGNlcHRpb24uIFNlZSB0aGUgQ01JUwotICogc3BlY2lmaWNhdGlvbiBmb3IgYSBsaXN0IG9mIGFsbCBvcGVyYXRpb25zIGFuZCB0aGVpciBleGNlcHRpb25zLiBOb3RlIHRoYXQKLSAqIHNvbWUgaW5jb21wbGlhbnQgcmVwb3NpdG9yaWVzIG1pZ2h0IHRocm93IG90aGVyIGV4Y2VwdGlvbiB0aGFuIHlvdSBleHBlY3QuCi0gKiA8cD4KLSAqIFJlZmVyIHRvIHRoZSA8YSBocmVmPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9jbWlzL0NNSVMvdjEuMC9vcy8iPkNNSVMgMS4wCi0gKiBzcGVjaWZpY2F0aW9uPC9hPiBvciB0aGUgPGEKLSAqIGhyZWY9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL2NtaXMvQ01JUy92MS4wL29zLyI+Q01JUyAxLjEKLSAqIHNwZWNpZmljYXRpb248L2E+IGZvciBkZXRhaWxzIGFib3V0IHRoZSBkb21haW4gbW9kZWwsIHRlcm1zLCBjb25jZXB0cywgYmFzZQotICogdHlwZXMsIHByb3BlcnRpZXMsIElEcyBhbmQgcXVlcnkgbmFtZXMsIHF1ZXJ5IGxhbmd1YWdlLCBldGMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbiBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIGNhY2hlZCBkYXRhLgotICAgICAqLwotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIC8vIHNlc3Npb24gY29udGV4dAotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBiaW5kaW5nIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBiaW5kaW5nIG9iamVjdCwgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIENtaXNCaW5kaW5nIGdldEJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nLCBwYWdpbmcKLSAgICAgKiBhbmQgY2FjaGluZy4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8ZW0+UGxlYXNlIG5vdGU6PC9lbT4gVGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgdGhyZWFkLXNhZmUgYW5kIHNob3VsZAotICAgICAqIG9ubHkgYmUgbW9kaWZpZWQgcmlnaHQgYWZ0ZXIgdGhlIHNlc3Npb24gaGFzIGJlZW4gY3JlYXRlZCBhbmQgYmVmb3JlIHRoZQotICAgICAqIHNlc3Npb24gb2JqZWN0IGhhcyBiZWVuIHVzZWQuIEluIG9yZGVyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBjb250ZXh0IGluCi0gICAgICogdGhyZWFkLXNhZmUgbWFubmVyLCBjcmVhdGUgYSBuZXcge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9IG9iamVjdCBhbmQgdXNlCi0gICAgICoge0BsaW5rICNzZXREZWZhdWx0Q29udGV4dChPcGVyYXRpb25Db250ZXh0KX0gdG8gYXBwbHkgaXQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgb3BlcmF0aW9uIGNvbnRleHQsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBPcGVyYXRpb25Db250ZXh0IGdldERlZmF1bHRDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHNlc3Npb24gcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nLCBwYWdpbmcgYW5kIGNhY2hpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGNvZGUgT3BlcmF0aW9uQ29udGV4dH0gdG8gYmUgdXNlZCBmb3IgdGhlIHNlc3Npb247IGlmCi0gICAgICogICAgICAgICAgICB7QGNvZGUgbnVsbH0sIGEgZGVmYXVsdCBjb250ZXh0IGlzIHVzZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldERlZmF1bHRDb250ZXh0KE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG9wZXJhdGlvbiBjb250ZXh0IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG9wZXJhdGlvbiBjb250ZXh0IG9iamVjdAotICAgICAqLwotICAgIE9wZXJhdGlvbkNvbnRleHQgY3JlYXRlT3BlcmF0aW9uQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBvcGVyYXRpb24gY29udGV4dCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsdGVyCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgZmlsdGVyLCBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YKLSAgICAgKiAgICAgICAgICAgIDxlbT5xdWVyeSBuYW1lczwvZW0+IG9yICIqIiBmb3IgYWxsIHByb3BlcnRpZXMgb3Ige0Bjb2RlIG51bGx9Ci0gICAgICogICAgICAgICAgICB0byBsZXQgdGhlIHJlcG9zaXRvcnkgZGV0ZXJtaW5lIGEgc2V0IG9mIHByb3BlcnRpZXMKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFjbHMKLSAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIEFDTHMgc2hvdWxkIGJlIGluY2x1ZGVkIG9yIG5vdAotICAgICAqIEBwYXJhbSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucwotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgQWxsb3dhYmxlIEFjdGlvbnMgc2hvdWxkIGJlIGluY2x1ZGVkIG9yIG5vdAotICAgICAqIEBwYXJhbSBpbmNsdWRlUG9saWNpZXMKLSAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHBvbGljaWVzIHNob3VsZCBiZSBpbmNsdWRlZCBvciBub3QKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgICAgICAgICAgIGVudW0gdGhhdCBpbmRpY2F0ZXMgaWYgYW5kIHdoaWNoIHJlbGF0aW9uc2hpcHMgc2hvdWxkIGJlCi0gICAgICogICAgICAgICAgICBpbmNsdWRlcwotICAgICAqIEBwYXJhbSByZW5kaXRpb25GaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZW5kaXRpb24gZmlsdGVyIG9yIHtAY29kZSBudWxsfSBmb3Igbm8gcmVuZGl0aW9ucwotICAgICAqIEBwYXJhbSBpbmNsdWRlUGF0aFNlZ21lbnRzCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciBwYXRoIHNlZ21lbnQgb3IgdGhlIHJlbGF0aXZlIHBhdGggc2VnbWVudAotICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIGluY2x1ZGVkIG9yIG5vdAotICAgICAqIEBwYXJhbSBvcmRlckJ5Ci0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IG9yZGVyLCBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCi0gICAgICogICAgICAgICAgICA8ZW0+cXVlcnkgbmFtZXM8L2VtPiBhbmQgdGhlIGFzY2VuZGluZyBtb2RpZmllciAiQVNDIiBvciB0aGUKLSAgICAgKiAgICAgICAgICAgIGRlc2NlbmRpbmcgbW9kaWZpZXIgIkRFU0MiIGZvciBlYWNoIHF1ZXJ5IG5hbWUKLSAgICAgKiBAcGFyYW0gY2FjaGVFbmFibGVkCi0gICAgICogICAgICAgICAgICBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBvYmplY3QgY2FjaGUgc2hvdWxkIGJlIHVzZWQKLSAgICAgKiBAcGFyYW0gbWF4SXRlbXNQZXJQYWdlCi0gICAgICogICAgICAgICAgICB0aGUgbWF4IGl0ZW1zIHBlciBiYXRjaAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgb3BlcmF0aW9uIGNvbnRleHQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQHNlZSBPcGVyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgT3BlcmF0aW9uQ29udGV4dCBjcmVhdGVPcGVyYXRpb25Db250ZXh0KFNldDxTdHJpbmc+IGZpbHRlciwgYm9vbGVhbiBpbmNsdWRlQWNscywgYm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZVBvbGljaWVzLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU2V0PFN0cmluZz4gcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnRzLCBTdHJpbmcgb3JkZXJCeSwgYm9vbGVhbiBjYWNoZUVuYWJsZWQsIGludCBtYXhJdGVtc1BlclBhZ2UpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgSUQgZnJvbSBhIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgSUQgb2JqZWN0Ci0gICAgICovCi0gICAgT2JqZWN0SWQgY3JlYXRlT2JqZWN0SWQoU3RyaW5nIGlkKTsKLQotICAgIC8vIGxvY2FsaXphdGlvbgotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IGxvY2FsZSB0byBiZSB1c2VkIGZvciB0aGlzIHNlc3Npb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCBsb2NhbGUsIG1heSBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBMb2NhbGUgZ2V0TG9jYWxlKCk7Ci0KLSAgICAvLyBzZXJ2aWNlcwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBpbmZvIG9mIHRoZSByZXBvc2l0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICogc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IGluZm8sIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGZhY3Rvcnkgb2JqZWN0IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyB0byBjcmVhdGUgdGhlIG9iamVjdHMgdXNlZCBieQotICAgICAqIHRoaXMgQVBJLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlcG9zaXRvcnkgaW5mbywgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIE9iamVjdEZhY3RvcnkgZ2V0T2JqZWN0RmFjdG9yeSgpOwotCi0gICAgLy8gdHlwZXMKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmluaXRpb24gb2YgYSB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgZGVmaW5pdGlvbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYSB0eXBlIHdpdGggdGhlIGdpdmVuIHR5cGUgSUQgZG9lc24ndCBleGlzdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdFR5cGUgZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZpbml0aW9uIG9mIGEgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZUlkCi0gICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdGhlIHR5cGUKLSAgICAgKiBAcGFyYW0gdXNlQ2FjaGUKLSAgICAgKiAgICAgICAgICAgIHNwZWNpZmllcyBpZiB0aGUgdHlwZSBkZWZpbml0aW9uIHNob3VsZCBiZSBmaXJzdCBsb29rZWQgdXAgaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIGRlZmluaXRpb24gY2FjaGUsIGlmIGl0IGlzIHNldCB0byB7QGNvZGUgZmFsc2V9IG9yCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBkZWZpbml0aW9uIGlzIG5vdCBpbiB0aGUgY2FjaGUsIHRoZSB0eXBlIGRlZmluaXRpb24KLSAgICAgKiAgICAgICAgICAgIGlzIGxvYWRlZCBmcm9tIHRoZSByZXBvc2l0b3J5Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBkZWZpbml0aW9uCi0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBJRCBkb2Vzbid0IGV4aXN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgT2JqZWN0VHlwZSBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZUlkLCBib29sZWFuIHVzZUNhY2hlKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgY2hpbGRyZW4gb2YgYSB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIElEIG9yIHtAY29kZSBudWxsfSB0byByZXF1ZXN0IHRoZSBiYXNlIHR5cGVzCi0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgc2hvdWxkIGJlIGluY2x1ZGVkCi0gICAgICogICAgICAgICAgICBvciBub3QKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIGl0ZXJhdG9yLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBJRCBkb2Vzbid0IGV4aXN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgSXRlbUl0ZXJhYmxlPE9iamVjdFR5cGU+IGdldFR5cGVDaGlsZHJlbihTdHJpbmcgdHlwZUlkLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgZGVzY2VuZGFudHMgb2YgYSB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIElEIG9yIHtAY29kZSBudWxsfSB0byByZXF1ZXN0IHRoZSBiYXNlIHR5cGVzCi0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgc2hvdWxkIGJlIGluY2x1ZGVkCi0gICAgICogICAgICAgICAgICBvciBub3QKLSAgICAgKiBAcGFyYW0gZGVwdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSB0cmVlIGRlcHRoLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIG9yIC0xIGZvciBpbmZpbml0ZQotICAgICAqICAgICAgICAgICAgZGVwdGgKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgdHlwZSB3aXRoIHRoZSBnaXZlbiB0eXBlIElEIGRvZXNuJ3QgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PFRyZWU8T2JqZWN0VHlwZT4+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgdHlwZUlkLCBpbnQgZGVwdGgsIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBkZWZpbml0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmV3IHR5cGUgZGVmaW5pdGlvbgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIE9iamVjdFR5cGUgY3JlYXRlVHlwZShUeXBlRGVmaW5pdGlvbiB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgZGVmaW5pdGlvbiB1cGRhdGVzCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdXBkYXRlZCB0eXBlIGRlZmluaXRpb24KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBPYmplY3RUeXBlIHVwZGF0ZVR5cGUoVHlwZURlZmluaXRpb24gdHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGEgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZUlkCi0gICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdGhlIHR5cGUgdG8gZGVsZXRlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgdm9pZCBkZWxldGVUeXBlKFN0cmluZyB0eXBlSWQpOwotCi0gICAgLy8gbmF2aWdhdGlvbgotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcm9vdCBmb2xkZXIgb2JqZWN0LCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRm9sZGVyIGdldFJvb3RGb2xkZXIoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSByZXBvc2l0b3J5IHdpdGggdGhlIGdpdmVuCi0gICAgICoge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJvb3QgZm9sZGVyIG9iamVjdCwgbm90IHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEZvbGRlciBnZXRSb290Rm9sZGVyKE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBjaGVja2VkIG91dCBkb2N1bWVudHMuCi0gICAgICogCi0gICAgICogQHNlZSBGb2xkZXIjZ2V0Q2hlY2tlZE91dERvY3MoKQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxEb2N1bWVudD4gZ2V0Q2hlY2tlZE91dERvY3MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGNoZWNrZWQgb3V0IGRvY3VtZW50cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0KLSAgICAgKiAuCi0gICAgICogCi0gICAgICogQHNlZSBGb2xkZXIjZ2V0Q2hlY2tlZE91dERvY3MoT3BlcmF0aW9uQ29udGV4dCkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBJdGVtSXRlcmFibGU8RG9jdW1lbnQ+IGdldENoZWNrZWRPdXREb2NzKE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ01JUyBvYmplY3QgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS4gSWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlCi0gICAgICogY2FjaGUgb3IgdGhlIGNhY2hlIGlzIHR1cm5lZCBvZmYgcGVyIGRlZmF1bHQge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9LCBpdAotICAgICAqIHdpbGwgbG9hZCB0aGUgb2JqZWN0IGZyb20gdGhlIHJlcG9zaXRvcnkgYW5kIHB1dHMgaXQgaW50byB0aGUgY2FjaGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgbWlnaHQgcmV0dXJuIGEgc3RhbGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gZm91bmQgaW4KLSAgICAgKiB0aGUgY2FjaGUgYW5kIGhhcyBiZWVuIGNoYW5nZWQgaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSByZXBvc2l0b3J5LiBVc2UKLSAgICAgKiB7QGxpbmsgQ21pc09iamVjdCNyZWZyZXNoKCl9IGFuZCB7QGxpbmsgQ21pc09iamVjdCNyZWZyZXNoSWZPbGQobG9uZyl9IHRvCi0gICAgICogdXBkYXRlIHRoZSBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCBJRAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBJRCBkb2Vzbid0IGV4aXN0Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0T2JqZWN0KFN0cmluZykKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDbWlzT2JqZWN0IGdldE9iamVjdChPYmplY3RJZCBvYmplY3RJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ01JUyBvYmplY3QgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS4gSWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlCi0gICAgICogY2FjaGUgb3IgdGhlIGdpdmVuIHtAbGluayBPcGVyYXRpb25Db250ZXh0fSBoYXMgY2FjaGluZyB0dXJuZWQgb2ZmLCBpdAotICAgICAqIHdpbGwgbG9hZCB0aGUgb2JqZWN0IGZyb20gdGhlIHJlcG9zaXRvcnkgYW5kIHB1dHMgaXQgaW50byB0aGUgY2FjaGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgbWlnaHQgcmV0dXJuIGEgc3RhbGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gZm91bmQgaW4KLSAgICAgKiB0aGUgY2FjaGUgYW5kIGhhcyBiZWVuIGNoYW5nZWQgaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSByZXBvc2l0b3J5LiBVc2UKLSAgICAgKiB7QGxpbmsgQ21pc09iamVjdCNyZWZyZXNoKCl9IGFuZCB7QGxpbmsgQ21pc09iamVjdCNyZWZyZXNoSWZPbGQobG9uZyl9IHRvCi0gICAgICogdXBkYXRlIHRoZSBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCBJRAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICB0aGUge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9IHRvIHVzZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBJRCBkb2Vzbid0IGV4aXN0Ci0gICAgICogCi0gICAgICogQHNlZSAjZ2V0T2JqZWN0KFN0cmluZywgT3BlcmF0aW9uQ29udGV4dCkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDbWlzT2JqZWN0IGdldE9iamVjdChPYmplY3RJZCBvYmplY3RJZCwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDTUlTIG9iamVjdCBmcm9tIHRoZSBzZXNzaW9uIGNhY2hlLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUKLSAgICAgKiBjYWNoZSBvciB0aGUgY2FjaGUgaXMgdHVybmVkIG9mZiBwZXIgZGVmYXVsdCB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0sIGl0Ci0gICAgICogd2lsbCBsb2FkIHRoZSBvYmplY3QgZnJvbSB0aGUgcmVwb3NpdG9yeSBhbmQgcHV0cyBpdCBpbnRvIHRoZSBjYWNoZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBtaWdodCByZXR1cm4gYSBzdGFsZSBvYmplY3QgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBmb3VuZCBpbgotICAgICAqIHRoZSBjYWNoZSBhbmQgaGFzIGJlZW4gY2hhbmdlZCBpbiBvciByZW1vdmVkIGZyb20gdGhlIHJlcG9zaXRvcnkuIFVzZQotICAgICAqIHtAbGluayBDbWlzT2JqZWN0I3JlZnJlc2goKX0gYW5kIHtAbGluayBDbWlzT2JqZWN0I3JlZnJlc2hJZk9sZChsb25nKX0gdG8KLSAgICAgKiB1cGRhdGUgdGhlIG9iamVjdCBpZiBuZWNlc3NhcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IElECi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIElEIGRvZXNuJ3QgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRPYmplY3QoT2JqZWN0SWQpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQ21pc09iamVjdCBnZXRPYmplY3QoU3RyaW5nIG9iamVjdElkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBDTUlTIG9iamVjdCBmcm9tIHRoZSBzZXNzaW9uIGNhY2hlLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUKLSAgICAgKiBjYWNoZSBvciB0aGUgZ2l2ZW4ge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9IGhhcyBjYWNoaW5nIHR1cm5lZCBvZmYsIGl0Ci0gICAgICogd2lsbCBsb2FkIHRoZSBvYmplY3QgZnJvbSB0aGUgcmVwb3NpdG9yeSBhbmQgcHV0cyBpdCBpbnRvIHRoZSBjYWNoZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBtaWdodCByZXR1cm4gYSBzdGFsZSBvYmplY3QgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBmb3VuZCBpbgotICAgICAqIHRoZSBjYWNoZSBhbmQgaGFzIGJlZW4gY2hhbmdlZCBpbiBvciByZW1vdmVkIGZyb20gdGhlIHJlcG9zaXRvcnkuIFVzZQotICAgICAqIHtAbGluayBDbWlzT2JqZWN0I3JlZnJlc2goKX0gYW5kIHtAbGluayBDbWlzT2JqZWN0I3JlZnJlc2hJZk9sZChsb25nKX0gdG8KLSAgICAgKiB1cGRhdGUgdGhlIG9iamVjdCBpZiBuZWNlc3NhcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IElECi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gdG8gdXNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIElEIGRvZXNuJ3QgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAc2VlICNnZXRPYmplY3QoT2JqZWN0SWQsIE9wZXJhdGlvbkNvbnRleHQpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQ21pc09iamVjdCBnZXRPYmplY3QoU3RyaW5nIG9iamVjdElkLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIENNSVMgb2JqZWN0IGZyb20gdGhlIHNlc3Npb24gY2FjaGUuIElmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZQotICAgICAqIGNhY2hlIG9yIHRoZSBjYWNoZSBpcyB0dXJuZWQgb2ZmIHBlciBkZWZhdWx0IHtAbGluayBPcGVyYXRpb25Db250ZXh0fSwgaXQKLSAgICAgKiB3aWxsIGxvYWQgdGhlIG9iamVjdCBmcm9tIHRoZSByZXBvc2l0b3J5IGFuZCBwdXRzIGl0IGludG8gdGhlIGNhY2hlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG1pZ2h0IHJldHVybiBhIHN0YWxlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGZvdW5kIGluCi0gICAgICogdGhlIGNhY2hlIGFuZCBoYXMgYmVlbiBjaGFuZ2VkIGluIG9yIHJlbW92ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeS4gVXNlCi0gICAgICoge0BsaW5rIENtaXNPYmplY3QjcmVmcmVzaCgpfSBhbmQge0BsaW5rIENtaXNPYmplY3QjcmVmcmVzaElmT2xkKGxvbmcpfSB0bwotICAgICAqIHVwZGF0ZSB0aGUgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCBwYXRoCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIElEIGRvZXNuJ3QgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDbWlzT2JqZWN0IGdldE9iamVjdEJ5UGF0aChTdHJpbmcgcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ01JUyBvYmplY3QgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS4gSWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlCi0gICAgICogY2FjaGUgb3IgdGhlIGdpdmVuIHtAbGluayBPcGVyYXRpb25Db250ZXh0fSBoYXMgY2FjaGluZyB0dXJuZWQgb2ZmLCBpdAotICAgICAqIHdpbGwgbG9hZCB0aGUgb2JqZWN0IGZyb20gdGhlIHJlcG9zaXRvcnkgYW5kIHB1dHMgaXQgaW50byB0aGUgY2FjaGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgbWlnaHQgcmV0dXJuIGEgc3RhbGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gZm91bmQgaW4KLSAgICAgKiB0aGUgY2FjaGUgYW5kIGhhcyBiZWVuIGNoYW5nZWQgaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSByZXBvc2l0b3J5LiBVc2UKLSAgICAgKiB7QGxpbmsgQ21pc09iamVjdCNyZWZyZXNoKCl9IGFuZCB7QGxpbmsgQ21pc09iamVjdCNyZWZyZXNoSWZPbGQobG9uZyl9IHRvCi0gICAgICogdXBkYXRlIHRoZSBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IHBhdGgKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBPcGVyYXRpb25Db250ZXh0fSB0byB1c2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gSUQgZG9lc24ndCBleGlzdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIENtaXNPYmplY3QgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyBwYXRoLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIENNSVMgb2JqZWN0IGZyb20gdGhlIHNlc3Npb24gY2FjaGUuIElmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZQotICAgICAqIGNhY2hlIG9yIHRoZSBjYWNoZSBpcyB0dXJuZWQgb2ZmIHBlciBkZWZhdWx0IHtAbGluayBPcGVyYXRpb25Db250ZXh0fSwgaXQKLSAgICAgKiB3aWxsIGxvYWQgdGhlIG9iamVjdCBmcm9tIHRoZSByZXBvc2l0b3J5IGFuZCBwdXRzIGl0IGludG8gdGhlIGNhY2hlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG1pZ2h0IHJldHVybiBhIHN0YWxlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGZvdW5kIGluCi0gICAgICogdGhlIGNhY2hlIGFuZCBoYXMgYmVlbiBjaGFuZ2VkIGluIG9yIHJlbW92ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeS4gVXNlCi0gICAgICoge0BsaW5rIENtaXNPYmplY3QjcmVmcmVzaCgpfSBhbmQge0BsaW5rIENtaXNPYmplY3QjcmVmcmVzaElmT2xkKGxvbmcpfSB0bwotICAgICAqIHVwZGF0ZSB0aGUgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50UGF0aAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGggb2YgdGhlIHBhcmVudCBmb2xkZXIKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIChwYXRoIHNlZ21lbnQpIG5hbWUgb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9sZGVyCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIElEIGRvZXNuJ3QgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDbWlzT2JqZWN0IGdldE9iamVjdEJ5UGF0aChTdHJpbmcgcGFyZW50UGF0aCwgU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIENNSVMgb2JqZWN0IGZyb20gdGhlIHNlc3Npb24gY2FjaGUuIElmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZQotICAgICAqIGNhY2hlIG9yIHRoZSBnaXZlbiB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gaGFzIGNhY2hpbmcgdHVybmVkIG9mZiwgaXQKLSAgICAgKiB3aWxsIGxvYWQgdGhlIG9iamVjdCBmcm9tIHRoZSByZXBvc2l0b3J5IGFuZCBwdXRzIGl0IGludG8gdGhlIGNhY2hlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG1pZ2h0IHJldHVybiBhIHN0YWxlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIGZvdW5kIGluCi0gICAgICogdGhlIGNhY2hlIGFuZCBoYXMgYmVlbiBjaGFuZ2VkIGluIG9yIHJlbW92ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeS4gVXNlCi0gICAgICoge0BsaW5rIENtaXNPYmplY3QjcmVmcmVzaCgpfSBhbmQge0BsaW5rIENtaXNPYmplY3QjcmVmcmVzaElmT2xkKGxvbmcpfSB0bwotICAgICAqIHVwZGF0ZSB0aGUgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50UGF0aAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGggb2YgdGhlIHBhcmVudCBmb2xkZXIKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIChwYXRoIHNlZ21lbnQpIG5hbWUgb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9sZGVyCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gdG8gdXNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIG9iamVjdAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIElEIGRvZXNuJ3QgZXhpc3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDbWlzT2JqZWN0IGdldE9iamVjdEJ5UGF0aChTdHJpbmcgcGFyZW50UGF0aCwgU3RyaW5nIG5hbWUsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiBhIHZlcnNpb24gc2VyaWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IElEIG9mIGFuIGFyYml0cmFyeSB2ZXJzaW9uIGluIHRoZSB2ZXJzaW9uIHNlcmllcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhdGVzdCBkb2N1bWVudCB2ZXJzaW9uCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgRG9jdW1lbnQgZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKE9iamVjdElkIG9iamVjdElkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhdGVzdCB2ZXJzaW9uIGluIGEgdmVyc2lvbiBzZXJpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgSUQgb2YgYW4gYXJiaXRyYXJ5IHZlcnNpb24gaW4gdGhlIHZlcnNpb24gc2VyaWVzCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gdG8gdXNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGF0ZXN0IGRvY3VtZW50IHZlcnNpb24KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBEb2N1bWVudCBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24oT2JqZWN0SWQgb2JqZWN0SWQsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiBhIHZlcnNpb24gc2VyaWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IElEIG9mIGFuIGFyYml0cmFyeSB2ZXJzaW9uIGluIHRoZSB2ZXJzaW9uIHNlcmllcwotICAgICAqIEBwYXJhbSBtYWpvcgotICAgICAqICAgICAgICAgICAgaWYge0Bjb2RlIHRydWV9IHRoZSBsYXRlc3QgbWFqb3IgdmVyc2lvbiB3aWxsIGJlIHJldHVybmVkLAotICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSB2ZXJ5IGxhc3QgdmVyc2lvbiB3aWxsIGJlIHJldHVybmVkCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gdG8gdXNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGF0ZXN0IGRvY3VtZW50IHZlcnNpb24KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBEb2N1bWVudCBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24oT2JqZWN0SWQgb2JqZWN0SWQsIGJvb2xlYW4gbWFqb3IsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiAvKiogUmV0dXJucyB0aGUgbGF0ZXN0IHZlcnNpb24gaW4gYSB2ZXJzaW9uIHNlcmllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBJRCBvZiBhbiBhcmJpdHJhcnkgdmVyc2lvbiBpbiB0aGUgdmVyc2lvbiBzZXJpZXMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXRlc3QgZG9jdW1lbnQgdmVyc2lvbgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIERvY3VtZW50IGdldExhdGVzdERvY3VtZW50VmVyc2lvbihTdHJpbmcgb2JqZWN0SWQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGF0ZXN0IHZlcnNpb24gaW4gYSB2ZXJzaW9uIHNlcmllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBJRCBvZiBhbiBhcmJpdHJhcnkgdmVyc2lvbiBpbiB0aGUgdmVyc2lvbiBzZXJpZXMKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBPcGVyYXRpb25Db250ZXh0fSB0byB1c2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXRlc3QgZG9jdW1lbnQgdmVyc2lvbgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIERvY3VtZW50IGdldExhdGVzdERvY3VtZW50VmVyc2lvbihTdHJpbmcgb2JqZWN0SWQsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgdmVyc2lvbiBpbiBhIHZlcnNpb24gc2VyaWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IElEIG9mIGFuIGFyYml0cmFyeSB2ZXJzaW9uIGluIHRoZSB2ZXJzaW9uIHNlcmllcwotICAgICAqIEBwYXJhbSBtYWpvcgotICAgICAqICAgICAgICAgICAgaWYge0Bjb2RlIHRydWV9IHRoZSBsYXRlc3QgbWFqb3IgdmVyc2lvbiB3aWxsIGJlIHJldHVybmVkLAotICAgICAqICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSB2ZXJ5IGxhc3QgdmVyc2lvbiB3aWxsIGJlIHJldHVybmVkCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gdG8gdXNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGF0ZXN0IGRvY3VtZW50IHZlcnNpb24KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBEb2N1bWVudCBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24oU3RyaW5nIG9iamVjdElkLCBib29sZWFuIG1ham9yLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gb2JqZWN0IGZyb20gdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgb2JqZWN0IElECi0gICAgICogCi0gICAgICogQHNlZSAjcmVtb3ZlT2JqZWN0RnJvbUNhY2hlKFN0cmluZykKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZU9iamVjdEZyb21DYWNoZShPYmplY3RJZCBvYmplY3RJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBvYmplY3QgZnJvbSB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICBvYmplY3QgSUQKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZU9iamVjdEZyb21DYWNoZShTdHJpbmcgb2JqZWN0SWQpOwotCi0gICAgLy8gZGlzY292ZXJ5Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHF1ZXJ5IHRvIHRoZSByZXBvc2l0b3J5LiBSZWZlciB0byB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uIGZvciB0aGUKLSAgICAgKiBDTUlTIHF1ZXJ5IGxhbmd1YWdlIHN5bnRheC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdGVtZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcXVlcnkgc3RhdGVtZW50IChDTUlTIHF1ZXJ5IGxhbmd1YWdlKQotICAgICAqIEBwYXJhbSBzZWFyY2hBbGxWZXJzaW9ucwotICAgICAqICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgbm9uLWxhdGVzdCBkb2N1bWVudCB2ZXJzaW9ucyBzaG91bGQgYmUKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGVkIG9yIG5vdCwge0Bjb2RlIHRydWV9IHNlYXJjaGVzIGFsbCBkb2N1bWVudCB2ZXJzaW9ucywKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gb25seSBzZWFyY2hlcyBsYXRlc3QgZG9jdW1lbnQgdmVyc2lvbnMKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBJdGVtSXRlcmFibGU8UXVlcnlSZXN1bHQ+IHF1ZXJ5KFN0cmluZyBzdGF0ZW1lbnQsIGJvb2xlYW4gc2VhcmNoQWxsVmVyc2lvbnMpOwotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBxdWVyeSB0byB0aGUgcmVwb3NpdG9yeSB1c2luZyB0aGUgZ2l2ZW4ge0BsaW5rIE9wZXJhdGlvbkNvbnRleHR9LgotICAgICAqIChTZWUgQ01JUyBzcGVjICIyLjEuMTAgUXVlcnkiLikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdGVtZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcXVlcnkgc3RhdGVtZW50IChDTUlTIHF1ZXJ5IGxhbmd1YWdlKQotICAgICAqIEBwYXJhbSBzZWFyY2hBbGxWZXJzaW9ucwotICAgICAqICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgbm9uLWxhdGVzdCBkb2N1bWVudCB2ZXJzaW9ucyBzaG91bGQgYmUKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGVkIG9yIG5vdCwge0Bjb2RlIHRydWV9IHNlYXJjaGVzIGFsbCBkb2N1bWVudCB2ZXJzaW9ucywKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gb25seSBzZWFyY2hlcyBsYXRlc3QgZG9jdW1lbnQgdmVyc2lvbnMKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiBjb250ZXh0IHRvIHVzZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcXVlcnkoU3RyaW5nIHN0YXRlbWVudCwgYm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIENNSVMgcXVlcnkgYW5kIHJldHVybnMgdGhlIHF1ZXJ5IHJlc3VsdHMgYXMgYW4gaXRlcmF0b3Igb2YKLSAgICAgKiB7QGxpbmsgQ21pc09iamVjdH0gb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIElEIG9mIHRoZSBvYmplY3QgdHlwZQotICAgICAqIEBwYXJhbSB3aGVyZQotICAgICAqICAgICAgICAgICAgdGhlIFdIRVJFIHBhcnQgb2YgdGhlIHF1ZXJ5Ci0gICAgICogQHBhcmFtIHNlYXJjaEFsbFZlcnNpb25zCi0gICAgICogICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBub24tbGF0ZXN0IGRvY3VtZW50IHZlcnNpb25zIHNob3VsZCBiZQotICAgICAqICAgICAgICAgICAgaW5jbHVkZWQgb3Igbm90LCB7QGNvZGUgdHJ1ZX0gc2VhcmNoZXMgYWxsIGRvY3VtZW50IHZlcnNpb25zLAotICAgICAqICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBvbmx5IHNlYXJjaGVzIGxhdGVzdCBkb2N1bWVudCB2ZXJzaW9ucwotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbnRleHQgdG8gdXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgSXRlbUl0ZXJhYmxlPENtaXNPYmplY3Q+IHF1ZXJ5T2JqZWN0cyhTdHJpbmcgdHlwZUlkLCBTdHJpbmcgd2hlcmUsIGJvb2xlYW4gc2VhcmNoQWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IHN0YXRlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTYW1wbGUgY29kZToKLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIFF1ZXJ5U3RhdGVtZW50IHN0bXQgPSBzZXNzaW9uCi0gICAgICogICAgICAgICAuY3JlYXRlUXVlcnlTdGF0ZW1lbnQoJnF1b3Q7U0VMRUNUID8sID8gRlJPTSA/IFdIRVJFID8gJmd0OyBUSU1FU1RBTVAgPyBBTkQgSU5fRk9MREVSKD8pIE9SID8gSU4gKD8pJnF1b3Q7KTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdGVtZW50Ci0gICAgICogICAgICAgICAgICB0aGUgcXVlcnkgc3RhdGVtZW50IHdpdGggcGxhY2Vob2xkZXJzICgnPycpLCBzZWUKLSAgICAgKiAgICAgICAgICAgIHtAbGluayBRdWVyeVN0YXRlbWVudH0gZm9yIGRldGFpbHMKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHF1ZXJ5IHN0YXRlbWVudCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAc2VlIFF1ZXJ5U3RhdGVtZW50Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgUXVlcnlTdGF0ZW1lbnQgY3JlYXRlUXVlcnlTdGF0ZW1lbnQoU3RyaW5nIHN0YXRlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcXVlcnkgc3RhdGVtZW50IGZvciBhIHF1ZXJ5IG9mIG9uZSBwcmltYXJ5IHR5cGUgam9pbmVkIGJ5IHplcm8KLSAgICAgKiBvciBtb3JlIHNlY29uZGFyeSB0eXBlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBTYW1wbGUgY29kZToKLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIExpc3QmbHQ7U3RyaW5nJmd0OyBzZWxlY3QgPSBuZXcgQXJyYXlMaXN0Jmx0O1N0cmluZyZndDsoKTsKLSAgICAgKiBzZWxlY3QuYWRkKCZxdW90O2NtaXM6bmFtZSZxdW90Oyk7Ci0gICAgICogc2VsZWN0LmFkZCgmcXVvdDtTZWNvbmRhcnlTdHJpbmdQcm9wJnF1b3Q7KTsKLSAgICAgKiAKLSAgICAgKiBNYXAmbHQ7U3RyaW5nLCBTdHJpbmcmZ3Q7IGZyb20gPSBuZXcgSGFzaE1hcCZsdDtTdHJpbmcsIFN0cmluZyZndDsoKTsKLSAgICAgKiBmcm9tLnB1dCgmcXVvdDtkJnF1b3Q7LCAmcXVvdDtjbWlzOmRvY3VtZW50JnF1b3Q7KTsKLSAgICAgKiBmcm9tLnB1dCgmcXVvdDtzJnF1b3Q7LCAmcXVvdDtNeVNlY29uZGFyeVR5cGUmcXVvdDspOwotICAgICAqIAotICAgICAqIFN0cmluZyB3aGVyZSA9ICZxdW90O2QuY21pczpuYW1lIExJS0UgPyZxdW90OzsKLSAgICAgKiAKLSAgICAgKiBMaXN0Jmx0O1N0cmluZyZndDsgb3JkZXJCeSA9IG5ldyBBcnJheUxpc3QmbHQ7U3RyaW5nJmd0OygpOwotICAgICAqIG9yZGVyQnkuYWRkKCZxdW90O2NtaXM6bmFtZSZxdW90Oyk7Ci0gICAgICogb3JkZXJCeS5hZGQoJnF1b3Q7U2Vjb25kYXJ5SW50ZWdlclByb3AmcXVvdDspOwotICAgICAqIAotICAgICAqIFF1ZXJ5U3RhdGVtZW50IHN0bXQgPSBzZXNzaW9uLmNyZWF0ZVF1ZXJ5U3RhdGVtZW50KHNlbGVjdCwgZnJvbSwgd2hlcmUsIG9yZGVyQnkpOwotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIEdlbmVyYXRlcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAgICAqIAotICAgICAqIDxwcmU+Ci0gICAgICogU0VMRUNUIGQuY21pczpuYW1lLHMuU2Vjb25kYXJ5U3RyaW5nUHJvcCBGUk9NIGNtaXM6ZG9jdW1lbnQgQVMgZCBKT0lOIE15U2Vjb25kYXJ5VHlwZSBBUyBzIE9OIGQuY21pczpvYmplY3RJZD1zLmNtaXM6b2JqZWN0SWQgV0hFUkUgZC5jbWlzOm5hbWUgTElLRSA/IE9SREVSIEJZIGQuY21pczpuYW1lLHMuU2Vjb25kYXJ5SW50ZWdlclByb3AKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VsZWN0UHJvcGVydHlJZHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBJRHMgaW4gdGhlIFNFTEVDVCBzdGF0ZW1lbnQsIGlmIHtAY29kZSBudWxsfSBhbGwKLSAgICAgKiAgICAgICAgICAgIHByb3BlcnRpZXMgYXJlIHNlbGVjdGVkCi0gICAgICogQHBhcmFtIGZyb21UeXBlcwotICAgICAqICAgICAgICAgICAgYSBNYXAgb2YgdHlwZSBhbGlhc2VzIChrZXlzKSBhbmQgdHlwZSBJRHMgKHZhbHVlcyksIHRoZSBNYXAKLSAgICAgKiAgICAgICAgICAgIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBwcmltYXJ5IHR5cGUgYW5kIHplcm8gb3IgbW9yZQotICAgICAqICAgICAgICAgICAgc2Vjb25kYXJ5IHR5cGVzCi0gICAgICogQHBhcmFtIHdoZXJlQ2xhdXNlCi0gICAgICogICAgICAgICAgICBhbiBvcHRpb25hbCBXSEVSRSBjbGF1c2Ugd2l0aCBwbGFjZWhvbGRlcnMgKCc/JyksIHNlZQotICAgICAqICAgICAgICAgICAge0BsaW5rIFF1ZXJ5U3RhdGVtZW50fSBmb3IgZGV0YWlscwotICAgICAqIEBwYXJhbSBvcmRlckJ5UHJvcGVydHlJZHMKLSAgICAgKiAgICAgICAgICAgIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJvcGVydGllcyBJRHMgZm9yIHRoZSBPUkRFUiBCWSBjbGF1c2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IHF1ZXJ5IHN0YXRlbWVudCBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAc2VlIFF1ZXJ5U3RhdGVtZW50Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgUXVlcnlTdGF0ZW1lbnQgY3JlYXRlUXVlcnlTdGF0ZW1lbnQoQ29sbGVjdGlvbjxTdHJpbmc+IHNlbGVjdFByb3BlcnR5SWRzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZyb21UeXBlcywKLSAgICAgICAgICAgIFN0cmluZyB3aGVyZUNsYXVzZSwgTGlzdDxTdHJpbmc+IG9yZGVyQnlQcm9wZXJ0eUlkcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IGNoYW5nZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNoYW5nZUxvZ1Rva2VuCi0gICAgICogICAgICAgICAgICB0aGUgY2hhbmdlIGxvZyB0b2tlbiB0byBzdGFydCBmcm9tIG9yIHtAY29kZSBudWxsfSB0byBzdGFydAotICAgICAqICAgICAgICAgICAgZnJvbSB0aGUgZmlyc3QgYXZhaWxhYmxlIGV2ZW50IGluIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciBjaGFuZ2VkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZQotICAgICAqICAgICAgICAgICAgcmVzdWx0IG9yIG5vdAotICAgICAqIEBwYXJhbSBtYXhOdW1JdGVtcwotICAgICAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXJzIG9mIGV2ZW50cwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYW5nZSBldmVudHMKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDaGFuZ2VFdmVudHMgZ2V0Q29udGVudENoYW5nZXMoU3RyaW5nIGNoYW5nZUxvZ1Rva2VuLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLCBsb25nIG1heE51bUl0ZW1zKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgY2hhbmdlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhbmdlTG9nVG9rZW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBjaGFuZ2UgbG9nIHRva2VuIHRvIHN0YXJ0IGZyb20gb3Ige0Bjb2RlIG51bGx9IHRvIHN0YXJ0Ci0gICAgICogICAgICAgICAgICBmcm9tIHRoZSBmaXJzdCBhdmFpbGFibGUgZXZlbnQgaW4gdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVByb3BlcnRpZXMKLSAgICAgKiAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIGNoYW5nZWQgcHJvcGVydGllcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlCi0gICAgICogICAgICAgICAgICByZXN1bHQgb3Igbm90Ci0gICAgICogQHBhcmFtIG1heE51bUl0ZW1zCi0gICAgICogICAgICAgICAgICBtYXhpbXVtIG51bWJlcnMgb2YgZXZlbnRzCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBPcGVyYXRpb25Db250ZXh0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhbmdlIGV2ZW50cwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIENoYW5nZUV2ZW50cyBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgY2hhbmdlTG9nVG9rZW4sIGJvb2xlYW4gaW5jbHVkZVByb3BlcnRpZXMsIGxvbmcgbWF4TnVtSXRlbXMsCi0gICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvZiBjb250ZW50IGNoYW5nZXMsIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIGNoYW5nZQotICAgICAqIGxvZyB0b2tlbiB0byB0aGUgbGF0ZXN0IGVudHJ5IGluIHRoZSBjaGFuZ2UgbG9nLgotICAgICAqIDxwPgotICAgICAqIE5vdGU6IFBhZ2luZyBhbmQgc2tpcHBpbmcgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNoYW5nZUxvZ1Rva2VuCi0gICAgICogICAgICAgICAgICB0aGUgY2hhbmdlIGxvZyB0b2tlbiB0byBzdGFydCBmcm9tIG9yIHtAY29kZSBudWxsfSB0byBzdGFydAotICAgICAqICAgICAgICAgICAgZnJvbSB0aGUgZmlyc3QgYXZhaWxhYmxlIGV2ZW50IGluIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciBjaGFuZ2VkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZQotICAgICAqICAgICAgICAgICAgcmVzdWx0IG9yIG5vdAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxDaGFuZ2VFdmVudD4gZ2V0Q29udGVudENoYW5nZXMoU3RyaW5nIGNoYW5nZUxvZ1Rva2VuLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3Igb2YgY29udGVudCBjaGFuZ2VzLCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBjaGFuZ2UKLSAgICAgKiBsb2cgdG9rZW4gdG8gdGhlIGxhdGVzdCBlbnRyeSBpbiB0aGUgY2hhbmdlIGxvZy4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlOiBQYWdpbmcgYW5kIHNraXBwaW5nIGFyZSBub3Qgc3VwcG9ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjaGFuZ2VMb2dUb2tlbgotICAgICAqICAgICAgICAgICAgdGhlIGNoYW5nZSBsb2cgdG9rZW4gdG8gc3RhcnQgZnJvbSBvciB7QGNvZGUgbnVsbH0gdG8gc3RhcnQKLSAgICAgKiAgICAgICAgICAgIGZyb20gdGhlIGZpcnN0IGF2YWlsYWJsZSBldmVudCBpbiB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBpbmNsdWRlUHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgY2hhbmdlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlc3VsdCBvciBub3QKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgdGhlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBJdGVtSXRlcmFibGU8Q2hhbmdlRXZlbnQ+IGdldENvbnRlbnRDaGFuZ2VzKGZpbmFsIFN0cmluZyBjaGFuZ2VMb2dUb2tlbiwgZmluYWwgYm9vbGVhbiBpbmNsdWRlUHJvcGVydGllcywKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgY2hhbmdlIGxvZyB0b2tlbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiBjb250cmFzdCB0byB0aGUgcmVwb3NpdG9yeSBpbmZvLCB0aGlzIGNoYW5nZSBsb2cgdG9rZW4gaXMgbm90IGNhY2hlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXF1ZXN0cyB0aGUgdG9rZW4gZnJvbSB0aGUgcmVwb3NpdG9yeSBldmVyeSBzaW5nbGUgdGltZSBpdAotICAgICAqIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXRlc3QgY2hhbmdlIGxvZyB0b2tlbiBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAgICAgICAgIGRvZXNuJ3QgcHJvdmlkZSBvbmUKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oKTsKLQotICAgIC8vIGNyZWF0ZQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBUaGUgc3RyZWFtIGluIHtAY29kZSBjb250ZW50U3RyZWFtfSBpcyBjb25zdW1lZCBidXQgbm90IGNsb3NlZCBieSB0aGlzCi0gICAgICogbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBJRCBvZiB0aGUgbmV3IGRvY3VtZW50Ci0gICAgICogCi0gICAgICogQHNlZSBGb2xkZXIjY3JlYXRlRG9jdW1lbnQoTWFwLCBDb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUsIExpc3QsCi0gICAgICogICAgICBMaXN0LCBMaXN0LCBPcGVyYXRpb25Db250ZXh0KQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIGNyZWF0ZURvY3VtZW50KE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdElkIGZvbGRlcklkLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LgotICAgICAqIAotICAgICAqIFRoZSBzdHJlYW0gaW4ge0Bjb2RlIGNvbnRlbnRTdHJlYW19IGlzIGNvbnN1bWVkIGJ1dCBub3QgY2xvc2VkIGJ5IHRoaXMKLSAgICAgKiBtZXRob2QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IElEIG9mIHRoZSBuZXcgZG9jdW1lbnQKLSAgICAgKiAKLSAgICAgKiBAc2VlIEZvbGRlciNjcmVhdGVEb2N1bWVudChNYXAsIENvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSwgTGlzdCwKLSAgICAgKiAgICAgIExpc3QsIExpc3QsIE9wZXJhdGlvbkNvbnRleHQpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgT2JqZWN0SWQgY3JlYXRlRG9jdW1lbnQoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgT2JqZWN0SWQgZm9sZGVySWQsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBmcm9tIGEgc291cmNlIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBJRCBvZiB0aGUgbmV3IGRvY3VtZW50Ci0gICAgICogCi0gICAgICogQHNlZSBGb2xkZXIjY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKE9iamVjdElkLCBNYXAsIFZlcnNpb25pbmdTdGF0ZSwKLSAgICAgKiAgICAgIExpc3QsIExpc3QsIExpc3QsIE9wZXJhdGlvbkNvbnRleHQpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgT2JqZWN0SWQgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKE9iamVjdElkIHNvdXJjZSwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgT2JqZWN0SWQgZm9sZGVySWQsCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGZyb20gYSBzb3VyY2UgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IElEIG9mIHRoZSBuZXcgZG9jdW1lbnQKLSAgICAgKiAKLSAgICAgKiBAc2VlIEZvbGRlciNjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoT2JqZWN0SWQsIE1hcCwgVmVyc2lvbmluZ1N0YXRlLAotICAgICAqICAgICAgTGlzdCwgTGlzdCwgTGlzdCwgT3BlcmF0aW9uQ29udGV4dCkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBPYmplY3RJZCBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoT2JqZWN0SWQgc291cmNlLCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBPYmplY3RJZCBmb2xkZXJJZCwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmb2xkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IElEIG9mIHRoZSBuZXcgZm9sZGVyCi0gICAgICogCi0gICAgICogQHNlZSBGb2xkZXIjY3JlYXRlRm9sZGVyKE1hcCwgTGlzdCwgTGlzdCwgTGlzdCwgT3BlcmF0aW9uQ29udGV4dCkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBPYmplY3RJZCBjcmVhdGVGb2xkZXIoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgT2JqZWN0SWQgZm9sZGVySWQsIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsCi0gICAgICAgICAgICBMaXN0PEFjZT4gcmVtb3ZlQWNlcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgSUQgb2YgdGhlIG5ldyBmb2xkZXIKLSAgICAgKiAKLSAgICAgKiBAc2VlIEZvbGRlciNjcmVhdGVGb2xkZXIoTWFwLCBMaXN0LCBMaXN0LCBMaXN0LCBPcGVyYXRpb25Db250ZXh0KQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIGNyZWF0ZUZvbGRlcihNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBPYmplY3RJZCBmb2xkZXJJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHBvbGljeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgSUQgb2YgdGhlIG5ldyBwb2xpY3kKLSAgICAgKiAKLSAgICAgKiBAc2VlIEZvbGRlciNjcmVhdGVQb2xpY3koTWFwLCBMaXN0LCBMaXN0LCBMaXN0LCBPcGVyYXRpb25Db250ZXh0KQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIGNyZWF0ZVBvbGljeShNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBPYmplY3RJZCBmb2xkZXJJZCwgTGlzdDxQb2xpY3k+IHBvbGljaWVzLCBMaXN0PEFjZT4gYWRkQWNlcywKLSAgICAgICAgICAgIExpc3Q8QWNlPiByZW1vdmVBY2VzKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcG9saWN5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBJRCBvZiB0aGUgbmV3IHBvbGljeQotICAgICAqIAotICAgICAqIEBzZWUgRm9sZGVyI2NyZWF0ZVBvbGljeShNYXAsIExpc3QsIExpc3QsIExpc3QsIE9wZXJhdGlvbkNvbnRleHQpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgT2JqZWN0SWQgY3JlYXRlUG9saWN5KE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdElkIGZvbGRlcklkKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaXRlbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgSUQgb2YgdGhlIG5ldyBwb2xpY3kKLSAgICAgKiAKLSAgICAgKiBAc2VlIEZvbGRlciNjcmVhdGVJdGVtKE1hcCwgTGlzdCwgTGlzdCwgTGlzdCwgT3BlcmF0aW9uQ29udGV4dCkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBPYmplY3RJZCBjcmVhdGVJdGVtKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdElkIGZvbGRlcklkLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLAotICAgICAgICAgICAgTGlzdDxBY2U+IHJlbW92ZUFjZXMpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBpdGVtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBJRCBvZiB0aGUgbmV3IGl0ZW0KLSAgICAgKiAKLSAgICAgKiBAc2VlIEZvbGRlciNjcmVhdGVJdGVtKE1hcCwgTGlzdCwgTGlzdCwgTGlzdCwgT3BlcmF0aW9uQ29udGV4dCkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBPYmplY3RJZCBjcmVhdGVJdGVtKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdElkIGZvbGRlcklkKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgcmVsYXRpb25zaGlwLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBJRCBvZiB0aGUgbmV3IHJlbGF0aW9uc2hpcAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIE9iamVjdElkIGNyZWF0ZVJlbGF0aW9uc2hpcChNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLAotICAgICAgICAgICAgTGlzdDxBY2U+IHJlbW92ZUFjZXMpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyByZWxhdGlvbnNoaXAuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IElEIG9mIHRoZSBuZXcgcmVsYXRpb25zaGlwCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgT2JqZWN0SWQgY3JlYXRlUmVsYXRpb25zaGlwKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgICogRmV0Y2hlcyB0aGUgcmVsYXRpb25zaGlwcyBmcm9tIG9yIHRvIGFuIG9iamVjdCBmcm9tIHRoZSByZXBvc2l0b3J5LgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEl0ZW1JdGVyYWJsZTxSZWxhdGlvbnNoaXA+IGdldFJlbGF0aW9uc2hpcHMoT2JqZWN0SWQgb2JqZWN0SWQsIGJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgT2JqZWN0VHlwZSB0eXBlLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyBtdWx0aXBsZSBvYmplY3RzIGluIG9uZSByZXF1ZXN0LgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IGJ1bGtVcGRhdGVQcm9wZXJ0aWVzKExpc3Q8Q21pc09iamVjdD4gb2JqZWN0cywgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlSWRzLCBMaXN0PFN0cmluZz4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcyk7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGFuIG9iamVjdCBhbmQsIGlmIGl0IGlzIGEgZG9jdW1lbnQsIGFsbCB2ZXJzaW9ucyBpbiB0aGUgdmVyc2lvbgotICAgICAqIHNlcmllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgb2JqZWN0Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgdm9pZCBkZWxldGUoT2JqZWN0SWQgb2JqZWN0SWQpOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgSUQgb2YgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBhbGxWZXJzaW9ucwotICAgICAqICAgICAgICAgICAgaWYgdGhpcyBvYmplY3QgaXMgYSBkb2N1bWVudCB0aGlzIHBhcmFtZXRlciBkZWZpbmVzIGlmIG9ubHkKLSAgICAgKiAgICAgICAgICAgIHRoaXMgdmVyc2lvbiBvciBhbGwgdmVyc2lvbnMgc2hvdWxkIGJlIGRlbGV0ZWQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZShPYmplY3RJZCBvYmplY3RJZCwgYm9vbGVhbiBhbGxWZXJzaW9ucyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIG1haW4gY29udGVudCBzdHJlYW0gb2YgYSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG9jSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgZG9jdW1lbnQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IHN0cmVhbSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGRvY3VtZW50IGhhcyBubyBjb250ZW50Ci0gICAgICogICAgICAgICBzdHJlYW0KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oT2JqZWN0SWQgZG9jSWQpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBjb250ZW50IHN0cmVhbSBvZiBhIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2NJZAotICAgICAqICAgICAgICAgICAgdGhlIElEIG9mIHRoZSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBzdHJlYW1JZAotICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSBJRAotICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHN0cmVhbSBvciB7QGNvZGUgbnVsbH0gdG8gcmVhZCB0aGUgc3RyZWFtCi0gICAgICogICAgICAgICAgICBmcm9tIHRoZSBiZWdpbm5pbmcKLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmVhbSBvciB7QGNvZGUgbnVsbH0gdG8gcmVhZCB0bwotICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBzdHJlYW0gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBkb2N1bWVudCBoYXMgbm8gY29udGVudAotICAgICAqICAgICAgICAgc3RyZWFtCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKE9iamVjdElkIGRvY0lkLCBTdHJpbmcgc3RyZWFtSWQsIEJpZ0ludGVnZXIgb2Zmc2V0LCBCaWdJbnRlZ2VyIGxlbmd0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBGZXRjaGVzIHRoZSBBQ0wgb2YgYW4gb2JqZWN0IGZyb20gdGhlIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgSUQgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBvbmx5QmFzaWNQZXJtaXNzaW9ucwotICAgICAqICAgICAgICAgICAgaWYge0Bjb2RlIHRydWV9IHRoZSByZXBvc2l0b3J5IHNob3VsZCBleHByZXNzIHRoZSBBQ0wgb25seQotICAgICAqICAgICAgICAgICAgd2l0aCB0aGUgYmFzaWMgcGVybWlzc2lvbnMgZGVmaW5lZCBpbiB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uOwotICAgICAqICAgICAgICAgICAgaWYge0Bjb2RlIGZhbHNlfSB0aGUgcmVwb3NpdG9yeSBjYW4gZXhwcmVzcyB0aGUgQUNMIHdpdGggYmFzaWMKLSAgICAgKiAgICAgICAgICAgIGFuZCByZXBvc2l0b3J5IHNwZWNpZmljIHBlcm1pc3Npb25zCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgQUNMIG9mIHRoZSBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBBY2wgZ2V0QWNsKE9iamVjdElkIG9iamVjdElkLCBib29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zKTsKLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgQUNMIGNoYW5nZXMgdG8gYW4gb2JqZWN0IGFuZCBkZXBlbmRlbnQgb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBPbmx5IGRpcmVjdCBBQ0VzIGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFkZEFjZXMKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgb2YgQUNFcyB0byBiZSBhZGRlZCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gQUNFcyBzaG91bGQgYmUKLSAgICAgKiAgICAgICAgICAgIGFkZGVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgb2YgQUNFcyB0byBiZSByZW1vdmVkIG9yIHtAY29kZSBudWxsfSBpZiBubyBBQ0VzIHNob3VsZAotICAgICAqICAgICAgICAgICAgYmUgcmVtb3ZlZAotICAgICAqIEBwYXJhbSBhY2xQcm9wYWdhdGlvbgotICAgICAqICAgICAgICAgICAgdmFsdWUgdGhhdCBkZWZpbmVzIHRoZSBwcm9wYWdhdGlvbiBvZiB0aGUgQUNFIGNoYW5nZXM7Ci0gICAgICogICAgICAgICAgICB7QGNvZGUgbnVsbH0gaXMgZXF1YWwgdG8KLSAgICAgKiAgICAgICAgICAgIHtAbGluayBBY2xQcm9wYWdhdGlvbiNSRVBPU0lUT1JZREVURVJNSU5FRH0KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQUNMIG9mIHRoZSBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBBY2wgYXBwbHlBY2woT2JqZWN0SWQgb2JqZWN0SWQsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24pOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZGlyZWN0IEFDRXMgb2YgYW4gb2JqZWN0IGFuZCBzZXRzIHRoZSBwcm92aWRlZCBBQ0VzLgotICAgICAqIAotICAgICAqIFRoZSBjaGFuZ2VzIGFyZSBsb2NhbCB0byB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBhcmUgbm90IHByb3BhZ2F0ZWQgdG8KLSAgICAgKiBkZXBlbmRlbnQgb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFjZXMKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgb2YgQUNFcyB0byBiZSBzZXQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgQUNMIG9mIHRoZSBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBBY2wgc2V0QWNsKE9iamVjdElkIG9iamVjdElkLCBMaXN0PEFjZT4gYWNlcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBsaWVzIGEgc2V0IG9mIHBvbGljaWVzIHRvIGFuIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgYXRvbWljLiBJZiBpdCBmYWlscyBzb21lIHBvbGljaWVzIG1pZ2h0IGFscmVhZHkgYmUKLSAgICAgKiBhcHBsaWVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIElEIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gcG9saWN5SWRzCi0gICAgICogICAgICAgICAgICB0aGUgSURzIG9mIHRoZSBwb2xpY2llcyB0byBiZSBhcHBsaWVkCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgdm9pZCBhcHBseVBvbGljeShPYmplY3RJZCBvYmplY3RJZCwgT2JqZWN0SWQuLi4gcG9saWN5SWRzKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBzZXQgb2YgcG9saWNpZXMgZnJvbSBhbiBvYmplY3QuCi0gICAgICogCi0gICAgICogVGhpcyBvcGVyYXRpb24gaXMgbm90IGF0b21pYy4gSWYgaXQgZmFpbHMgc29tZSBwb2xpY2llcyBtaWdodCBhbHJlYWR5IGJlCi0gICAgICogcmVtb3ZlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBJRCB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIHBvbGljeUlkcwotICAgICAqICAgICAgICAgICAgdGhlIElEcyBvZiB0aGUgcG9saWNpZXMgdG8gYmUgcmVtb3ZlZAotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlUG9saWN5KE9iamVjdElkIG9iamVjdElkLCBPYmplY3RJZC4uLiBwb2xpY3lJZHMpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvU2Vzc2lvbkZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1Nlc3Npb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OGJmYjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvU2Vzc2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBFbnRyeSBwb2ludCBpbnRvIHRoZSBPcGVuQ01JUyBDbGllbnQgQVBJLgotICogPHA+Ci0gKiBUaGVyZSBtaWdodCBiZSBkaWZmZXJlbnQgd2F5cyB0byBnZXQgYSB7QGNvZGUgU2Vzc2lvbkZhY3Rvcnl9IGluc3RhbmNlLiBGb3IKLSAqIGV4YW1wbGUgaXQgY291bGQgYmUgcmV0cmlldmVkIHZpYSBhIEoyRUUgSk5ESSBsb29rdXAgb3IgYW4gT1NHaSBzZXJ2aWNlCi0gKiBsb29rdXAuIENsaWVudHMgb3V0c2lkZSBhIGNvbnRhaW5lciBtaWdodCB1c2UgdGhlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LlNlc3Npb25GYWN0b3J5RmluZGVyfSBjbGFzcy4KLSAqIDxwPgotICogVGhlIGVudHJpZXMgb2YgdGhlIHBhcmFtZXRlciBtYXAgYXJlIGRlZmluZWQgYnkKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXJ9IGNsYXNzIHdoaWNoIGlzCi0gKiBwYXJ0IG9mIHRoZSBjb21tb25zIHBhY2thZ2UuIFBhcmFtZXRlcnMgc3BlY2lmeSBjb25uZWN0aW9uIHNldHRpbmdzICh1c2VyCi0gKiBuYW1lLCBhdXRoZW50aWNhdGlvbiwgY29ubmVjdGlvbiBVUkwsIGJpbmRpbmcgdHlwZSwgZXRjLikuCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgU2Vzc2lvbn0gY2xhc3Mgd2hpY2ggaXMgY29uc3RydWN0ZWQgaXMgZWl0aGVyIHRoZSB7QGNvZGUgc2Vzc2lvbn0KLSAqIGJhc2UgY2xhc3Mgd2hpY2ggaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb3IgaXQgY2FuIGJlIGRlcml2ZWQgZnJvbSB0aGF0Ci0gKiBpbXBsZW1lbnRpbmcgc3BlY2lhbCBiZWhhdmlvciBmb3IgdGhlIHNlc3Npb24uCi0gKiA8cD4KLSAqIFNhbXBsZSBjb2RlOgotICogPHA+Ci0gKiAKLSAqIDxwcmU+Ci0gKiBTZXNzaW9uRmFjdG9yeSBmYWN0b3J5ID0gLi4uCi0gKiAKLSAqIE1hcCZsdDtTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyID0gbmV3IEhhc2hNYXAmbHQ7U3RyaW5nLCBTdHJpbmc+KCk7Ci0gKiAKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSLCAiT3R0byIpOwotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCAiKioqKiIpOwotICogCi0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkwsICJodHRwOi8vbG9jYWxob3N0L2NtaXMvYXRvbSIpOwotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQVRPTVBVQi52YWx1ZSgpKTsKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5SRVBPU0lUT1JZX0lELCAibXlSZXBvc2l0b3J5Iik7Ci0gKiAuLi4KLSAqIFNlc3Npb24gc2Vzc2lvbiA9IGZhY3RvcnkuY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXIpOwotICogPC9wcmU+Ci0gKiAKLSAqIEBzZWUgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LlNlc3Npb25GYWN0b3J5RmluZGVyCi0gKiBAc2VlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcgotICogQHNlZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuU2Vzc2lvblBhcmFtZXRlck1hcAotICogQHNlZSBTZXNzaW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2Vzc2lvbkZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBzZXNzaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICBhIG1hcCBvZiBuYW1lL3ZhbHVlIHBhaXJzIHdpdGggcGFyYW1ldGVycyBmb3IgdGhlIHNlc3Npb24sIHNlZQotICAgICAqICAgICAgICAgICAge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcn0KLSAgICAgKiAgICAgICAgICAgIGZvciBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSBPcGVuQ01JUwotICAgICAqIAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU2Vzc2lvbn0gY29ubmVjdGVkIHRvIHRoZSBDTUlTIHJlcG9zaXRvcnkKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcgotICAgICAqLwotICAgIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgcmVwb3NpdG9yaWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBhdCB0aGUgZW5kcG9pbnQuCi0gICAgICogCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgIGEgbWFwIG9mIG5hbWUvdmFsdWUgcGFpcnMgd2l0aCBwYXJhbWV0ZXJzIGZvciB0aGUgc2Vzc2lvbiwgc2VlCi0gICAgICogICAgICAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyfQotICAgICAqICAgICAgICAgICAgZm9yIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5IE9wZW5DTUlTLCB0aGUgcGFyYW1ldGVyCi0gICAgICogICAgICAgICAgICB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUR9Ci0gICAgICogICAgICAgICAgICBzaG91bGQgbm90IGJlIHNldAotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgcmVwb3NpdG9yaWVzCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBMaXN0PFJlcG9zaXRvcnk+IGdldFJlcG9zaXRvcmllcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvVHJlZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvVHJlZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQzYzZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYXBpL1RyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQmFzaWMgdHJlZSBzdHJ1Y3R1cmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJlZTxUPiB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIG9uIHRoaXMgbGV2ZWwuCi0gICAgICovCi0gICAgVCBnZXRJdGVtKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBMaXN0PFRyZWU8VD4+IGdldENoaWxkcmVuKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9wYWNrYWdlLmh0bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDU1ODIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9hcGkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCEtLSAKLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gLS0+Ci08aHRtbD4KLTxoZWFkPgotPCEtLQotIEphdmFEb2MgcGFja2FnZS5odG1sCi0tLT4KLTwvaGVhZD4KLTxib2R5PgotVGhlIE9wZW5DTUlTIENsaWVudCBBUEkuCi08cD4KLVRoaXMgcGFja2FnZSBwcm92aWRlcyBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIGZvciBhY2Nlc3NpbmcgQ01JUyByZXBvc2l0b3JpZXMKLXZpYSBhbiBvYmplY3Qgb3JpZW50ZWQgQVBJLgotPGJyLz4KLUludGVyZmFjZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBpbXBsZW1lbnRlZCBieSB0aGUgT3BlbkNNSVMgcnVudGltZSBhbmQgbXVzdCBub3QgYmUKLWltcGxlbWVudGVkIGJ5IGFwcGxpY2F0aW9ucy4KLVRoZSBPcGVuQ01JUyBjbGllbnQgQVBJIGRlcGVuZHMgb24gdGhlIE9wZW5DTUlTIGNvbW1vbnMgQVBJLiAKLTwvcD4KLTxwPgotVG8gdXNlIHRoZSBPcGVuQ01JUyBjbGllbnQgQVBJLCBhIGNsaWVudCBuZWVkcyB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGVudHJ5IGludGVyZmFjZQote0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnl9IGFuZCB0aGVuIGNvbm5lY3QgdG8gdGhlIAotQ01JUyByZXBvc2l0b3J5IGJ5IG9idGFpbmluZyBhIHNlc3Npb24gdG8gdGhlIHJlcG9zaXRvcnkgZnJvbSAgdGhlIHtAY29kZSBTZXNzaW9uRmFjdG9yeX0uCi1UaGUgd2F5IHRvIGdldCBhIHtAY29kZSBTZXNzaW9uRmFjdG9yeX0gaW5zdGFuY2UgZGVwZW5kcyBvbiB0aGUgY2xpZW50cyBydW50aW1lOgotVXN1YWxseSB0aGlzIHdpbGwgYmUgZG9uZSB2aWEgSk5ESSBsb29rdXAgaW4gYSBKMkVFIHJ1bnRpbWUgb3IgYSBzZXJ2aWNlIGxvb2t1cCBpbiBhIE9TR2kgUnVudGltZS4KLTwvcD4KLTxwPgotQWxsIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGEgcm91bmQtdHJpcCB0byB0aGUgYmFjay1lbmQgd2lsbCBkbyB0aGF0IHN5bmNocm9ub3VzbHksCi1jYXVzaW5nIHRoZSBjbGllbnQgdG8gYmUgYmxvY2tlZCBkdXJpbmcgdGhhdCBjYWxsLjwvcD4KLQotPGgyPlVzYWdlIG9mIHRoZSBBUEk8L2gyPgotPHA+Ci1TZWUgPGEgaHJlZj0iaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnL2phdmEvZGV2ZWxvcGluZy9ndWlkZS5odG1sIj5PcGVuQ01JUyBDbGllbnQgQVBJIERldmVsb3BlcidzIEd1aWRlPC9hPi4KLTwvcD4KLTxwPgotQHNlZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb25GYWN0b3J5Ci1Ac2VlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvU2Vzc2lvbkZhY3RvcnlGaW5kZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L1Nlc3Npb25GYWN0b3J5RmluZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZmY2YyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvU2Vzc2lvbkZhY3RvcnlGaW5kZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50OwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uRmFjdG9yeUZpbmRlclRlc3QgewotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uRmFjdG9yeUZpbmRlci5maW5kKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9TZXNzaW9uUGFyYW1ldGVyTWFwVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9TZXNzaW9uUGFyYW1ldGVyTWFwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTFmYWQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvU2Vzc2lvblBhcmFtZXRlck1hcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmluZGluZ1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlRlbXBTdG9yZU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BdXRoZW50aWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGFyYW1ldGVyTWFwVGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTZXNzaW9uUGFyYW1ldGVyTWFwIG1hcCA9IG5ldyBTZXNzaW9uUGFyYW1ldGVyTWFwKCk7Ci0KLSAgICAgICAgLy8gYmluZGluZ3MKLSAgICAgICAgbWFwLnNldEF0b21QdWJCaW5kaW5nVXJsKCJodHRwOi8vYXRvbW91Yi91cmwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJpbmRpbmdUeXBlLkFUT01QVUIudmFsdWUoKSwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hdG9tb3ViL3VybCIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCkpOwotCi0gICAgICAgIG1hcC5zZXRXZWJTZXJ2aWNlc0JpbmRpbmdVcmwoImh0dHA6Ly93ZWJzZXJ2aWNlcy91cmwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJpbmRpbmdUeXBlLldFQlNFUlZJQ0VTLnZhbHVlKCksIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd2Vic2VydmljZXMvdXJsIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1JFUE9TSVRPUllfU0VSVklDRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93ZWJzZXJ2aWNlcy91cmwiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTkFWSUdBVElPTl9TRVJWSUNFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3dlYnNlcnZpY2VzL3VybCIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93ZWJzZXJ2aWNlcy91cmwiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfVkVSU0lPTklOR19TRVJWSUNFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3dlYnNlcnZpY2VzL3VybCIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19ESVNDT1ZFUllfU0VSVklDRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93ZWJzZXJ2aWNlcy91cmwiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93ZWJzZXJ2aWNlcy91cmwiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVMQVRJT05TSElQX1NFUlZJQ0UpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd2Vic2VydmljZXMvdXJsIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3dlYnNlcnZpY2VzL3VybCIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRSkpOwotCi0gICAgICAgIG1hcC5zZXRCcm93c2VyQmluZGluZ1VybCgiaHR0cDovL2Jyb3dzZXIvdXJsIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCaW5kaW5nVHlwZS5CUk9XU0VSLnZhbHVlKCksIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vYnJvd3Nlci91cmwiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQlJPV1NFUl9VUkwpKTsKLQotICAgICAgICBtYXAuc2V0TG9jYWxCaW5kaW5nQ2xhc3MoVGVzdExvY2FsU2Vzc2lvbkZhY3RvcnkuY2xhc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQmluZGluZ1R5cGUuTE9DQUwudmFsdWUoKSwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdExvY2FsU2Vzc2lvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxfRkFDVE9SWSkpOwotCi0gICAgICAgIG1hcC5zZXRBdG9tUHViQmluZGluZ1VybChudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFKSk7Ci0gICAgICAgIGFzc2VydE51bGwobWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkFUT01QVUJfVVJMKSk7Ci0KLSAgICAgICAgLy8gdXNlciBhbmQgcGFzc3dvcmQKLSAgICAgICAgbWFwLnNldFVzZXJBbmRQYXNzd29yZCgidXNlciIsICJwYXNzd29yZCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXIiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhc3N3b3JkIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JEKSk7Ci0KLSAgICAgICAgbWFwLnNldFVzZXJBbmRQYXNzd29yZChudWxsLCAicGFzc3dvcmQiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobWFwLmNvbnRhaW5zS2V5KFNlc3Npb25QYXJhbWV0ZXIuVVNFUikpOwotICAgICAgICBhc3NlcnRGYWxzZShtYXAuY29udGFpbnNLZXkoU2Vzc2lvblBhcmFtZXRlci5QQVNTV09SRCkpOwotCi0gICAgICAgIG1hcC5zZXRQcm94eVVzZXJBbmRQYXNzd29yZCgidXNlciIsICJwYXNzd29yZCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXIiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUFJPWFlfVVNFUikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhc3N3b3JkIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLlBST1hZX1BBU1NXT1JEKSk7Ci0KLSAgICAgICAgLy8gcmVwb3NpdG9yeSBpZAotICAgICAgICBtYXAuc2V0UmVwb3NpdG9yeUlkKCJyZXBpZCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlcGlkIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQpKTsKLSAgICAgICAgbWFwLnNldFJlcG9zaXRvcnlJZChudWxsKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobWFwLmNvbnRhaW5zS2V5KFNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9JRCkpOwotCi0gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIG1hcC5zZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKFRlc3RBdXRoZW50aWNhdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RBdXRoZW50aWNhdGlvblByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSEVOVElDQVRJT05fUFJPVklERVJfQ0xBU1MpKTsKLQotICAgICAgICBtYXAuc2V0QXV0aGVudGljYXRpb25Qcm92aWRlcihudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSEVOVElDQVRJT05fUFJPVklERVJfQ0xBU1MpKTsKLQotICAgICAgICBtYXAuc2V0TnRsbUF1dGhlbnRpY2F0aW9uKCJ1c2VyIiwgInBhc3N3b3JkIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidXNlciIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFzc3dvcmQiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUEFTU1dPUkQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX0hUVFBfQkFTSUMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX1NPQVBfVVNFUk5BTUVUT0tFTikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIRU5USUNBVElPTl9QUk9WSURFUl9DTEFTUykpOwotCi0gICAgICAgIG1hcC5zZXRCYXNpY0F1dGhlbnRpY2F0aW9uKCJ1c2VyMSIsICJwYXNzd29yZDEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1c2VyMSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFzc3dvcmQxIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JEKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX0hUVFBfQkFTSUMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX1NPQVBfVVNFUk5BTUVUT0tFTikpOwotCi0gICAgICAgIG1hcC5zZXRVc2VybmFtZVRva2VuQXV0aGVudGljYXRpb24oInVzZXIyIiwgInBhc3N3b3JkMiIsIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInVzZXIyIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLlVTRVIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXNzd29yZDIiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUEFTU1dPUkQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfSFRUUF9CQVNJQykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9TT0FQX1VTRVJOQU1FVE9LRU4pKTsKLQotICAgICAgICBtYXAuc2V0Tm9BdXRoZW50aWNhdGlvbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfSFRUUF9CQVNJQykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfU09BUF9VU0VSTkFNRVRPS0VOKSk7Ci0KLSAgICAgICAgLy8gbG9jYWxlCi0gICAgICAgIG1hcC5zZXRMb2NhbGUobmV3IExvY2FsZSgiZGUiLCAiREUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGUiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxFX0lTTzYzOV9MQU5HVUFHRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRFIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkxPQ0FMRV9JU08zMTY2X0NPVU5UUlkpKTsKLQotICAgICAgICAvLyBIVFRQIHJlbGF0ZWQKLSAgICAgICAgbWFwLnNldENvb2tpZXModHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5DT09LSUVTKSk7Ci0gICAgICAgIG1hcC5zZXRDb29raWVzKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5DT09LSUVTKSk7Ci0KLSAgICAgICAgbWFwLnNldENvbXByZXNzaW9uKHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ09NUFJFU1NJT04pKTsKLQotICAgICAgICBtYXAuc2V0Q2xpZW50Q29tcHJlc3Npb24oZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkNMSUVOVF9DT01QUkVTU0lPTikpOwotCi0gICAgICAgIG1hcC5zZXRDb25uZWN0aW9uVGltZW91dCgxMjM0NSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTIzNDUiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ09OTkVDVF9USU1FT1VUKSk7Ci0KLSAgICAgICAgbWFwLnNldFJlYWRUaW1lb3V0KDk4NzY1KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI5ODc2NSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5SRUFEX1RJTUVPVVQpKTsKLQotICAgICAgICAvLyBoZWFkZXIKLSAgICAgICAgbWFwLmFkZEhlYWRlcihudWxsLCAidmFsdWUiKTsKLSAgICAgICAgbWFwLmFkZEhlYWRlcigiaGVhZGVyMCIsICJ2YWx1ZTAiKTsKLSAgICAgICAgbWFwLmFkZEhlYWRlcigiaGVhZGVyMSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgbWFwLmFkZEhlYWRlcigiaGVhZGVyMiIsICJ2YWx1ZTIiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImhlYWRlcjA6dmFsdWUwIiwgbWFwLmdldChTZXNzaW9uUGFyYW1ldGVyLkhFQURFUiArICIuMCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWFkZXIxOnZhbHVlMSIsIG1hcC5nZXQoU2Vzc2lvblBhcmFtZXRlci5IRUFERVIgKyAiLjEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaGVhZGVyMjp2YWx1ZTIiLCBtYXAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuSEVBREVSICsgIi4yIikpOwotCi0gICAgICAgIC8vIHN0b3JlIGFuZCBsb2FkCi0gICAgICAgIEZpbGUgdG1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgic2Vzc2lvbiIsICJwYXJhbWV0ZXJzIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAuc3RvcmUodG1wKTsKLQotICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlck1hcCBtYXAyID0gbmV3IFNlc3Npb25QYXJhbWV0ZXJNYXAoKTsKLSAgICAgICAgICAgIG1hcDIubG9hZCh0bXApOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWFwLnNpemUoKSwgbWFwMi5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1hcC5nZXQoa2V5KSwgbWFwMi5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0bXAuZGVsZXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZQotICAgICAgICBTdHJpbmcgcGFyYW1ldGVycyA9IG1hcC50b1N0cmluZygpOwotICAgICAgICBTZXNzaW9uUGFyYW1ldGVyTWFwIG1hcDIgPSBuZXcgU2Vzc2lvblBhcmFtZXRlck1hcCgpOwotICAgICAgICBtYXAyLnBhcnNlKHBhcmFtZXRlcnMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhtYXAuc2l6ZSgpLCBtYXAyLnNpemUoKSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1hcC5nZXQoa2V5KSwgbWFwMi5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRlc3RBdXRoZW50aWNhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgQXV0aGVudGljYXRpb25Qcm92aWRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SFRUUEhlYWRlcnMoU3RyaW5nIHVybCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRWxlbWVudCBnZXRTT0FQSGVhZGVycyhPYmplY3QgcG9ydE9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVyIGdldEhhbmRsZXJSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNTTFNvY2tldEZhY3RvcnkgZ2V0U1NMU29ja2V0RmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEhvc3RuYW1lVmVyaWZpZXIgZ2V0SG9zdG5hbWVWZXJpZmllcigpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHV0UmVzcG9uc2VIZWFkZXJzKFN0cmluZyB1cmwsIGludCBzdGF0dXNDb2RlLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVGVzdExvY2FsU2Vzc2lvbkZhY3RvcnkgaW1wbGVtZW50cyBDbWlzU2VydmljZUZhY3RvcnkgewotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENtaXNTZXJ2aWNlIGdldFNlcnZpY2UoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVuY3J5cHRUZW1wRmlsZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRNZW1vcnlUaHJlc2hvbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRNYXhDb250ZW50U2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gZ2V0VGVtcEZpbGVPdXRwdXRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3MvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzcyODkxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIENsaWVudCBCaW5kaW5ncyBJbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8cGFyZW50QmFzZWRpcj4uLi8uLi88L3BhcmVudEJhc2VkaXI+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDwhLS0gQWRkZWQgdG8gYXZvaWQgbG9nZ2luZyBpbiB0aGUgYmFzZSBwcm9qZWN0IGZvbGRlciBhbmQgZmlsdGVyIGxvZzRqLnByb3BlcnRpZXMgIC0tPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy90ZXN0L3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GPC9tYW5pZmVzdEZpbGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4gCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7ZmVsaXgucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPiAgICAKLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmJ1bmRsZS1tYW5pZmVzdDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFuaWZlc3Q8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPiAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5nczt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L0V4cG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC53cy4qO3ZlcnNpb249IlsyLjEuNywzLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jeGYuKjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuKjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgICAgPC9JbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtRG9jVVJMPiR7cHJvamVjdC51cmx9PC9CdW5kbGUtRG9jVVJMPgotICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2xmNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+ICAgICAgICAgICAgCi0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YXBhY2hlY2xpZW50LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5qdm5ldC5taW1lcHVsbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1pbWVwdWxsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHttaW1lcHVsbC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4gCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwud3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXh3cy1ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4d3MtcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBpbmNsdWRlZCBpbiBKYXZhIDYgYW5kIGFib3ZlIC0tPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuc3RyZWFtPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIGluY2x1ZGVkIGluIEphdmEgNiBhbmQgYWJvdmUgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPnN0YXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CSAKLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLndvb2RzdG94PC9ncm91cElkPgkgCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndzdHgtYXNsPC9hcnRpZmFjdElkPgkgCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CSAKLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgkgCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgkgCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CSAKLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qdm5ldDwvZ3JvdXBJZD4JIAotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5taW1lcHVsbDwvYXJ0aWZhY3RJZD4JIAotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmN4ZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmN4Zi1ydC1mcm9udGVuZC1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y3hmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3hmPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3hmLXJ0LXRyYW5zcG9ydHMtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y3hmLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YXhpczIudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvQ21pc0JpbmRpbmdGYWN0b3J5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvQ21pc0JpbmRpbmdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzE1MzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL0NtaXNCaW5kaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuVHlwZURlZmluaXRpb25DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5DbWlzQmluZGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci0KLS8qKgotICogRGVmYXVsdCBmYWN0b3J5IGZvciBhIENNSVMgYmluZGluZyBpbnN0YW5jZS4KLSAqLwotcHVibGljIGNsYXNzIENtaXNCaW5kaW5nRmFjdG9yeSB7Ci0KLSAgICAvKiogRGVmYXVsdCBDTUlTIEF0b21QdWIgYmluZGluZyBTUEkgaW1wbGVtZW50YXRpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19TUElfQVRPTVBVQiA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJTcGkiOwotICAgIC8qKiBEZWZhdWx0IENNSVMgV2ViIFNlcnZpY2VzIGJpbmRpbmcgU1BJIGltcGxlbWVudGF0aW9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfU1BJX1dFQlNFUlZJQ0VTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXMuQ21pc1dlYlNlcnZpY2VzU3BpIjsKLSAgICAvKiogRGVmYXVsdCBDTUlTIEJyb3dzZXIgYmluZGluZyBTUEkgaW1wbGVtZW50YXRpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19TUElfQlJPV1NFUiA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmJyb3dzZXIuQ21pc0Jyb3dzZXJCaW5kaW5nU3BpIjsKLSAgICAvKiogRGVmYXVsdCBDTUlTIGxvY2FsIGJpbmRpbmcgU1BJIGltcGxlbWVudGF0aW9uLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfU1BJX0xPQ0FMID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkubG9jYWwuQ21pc0xvY2FsU3BpIjsKLQotICAgIC8qKiBEZWZhdWx0IHR5cGUgZGVmaW5pdGlvbiBjYWNoZSBjbGFzcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVFlQRV9ERUZJTklUSU9OX0NBQ0hFX0NMQVNTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLlR5cGVEZWZpbml0aW9uQ2FjaGVJbXBsIjsKLSAgICAvKiogRGVmYXVsdCBIVFRQIGludm9rZXIgY2xhc3MgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0hUVFBfSU5WT0tFUiA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuRGVmYXVsdEh0dHBJbnZva2VyIjsKLSAgICAvKiogU3RhbmRhcmQgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgY2xhc3MuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkRfQVVUSEVOVElDQVRJT05fUFJPVklERVIgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5TdGFuZGFyZEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIiOwotICAgIC8qKiBOVExNIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGNsYXNzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5UTE1fQVVUSEVOVElDQVRJT05fUFJPVklERVIgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5OVExNQXV0aGVudGljYXRpb25Qcm92aWRlciI7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZGVmYXVsdHM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0JpbmRpbmdGYWN0b3J5KCkgewotICAgICAgICBkZWZhdWx0cyA9IGNyZWF0ZU5ld0RlZmF1bHRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmYWN0b3J5IGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc0JpbmRpbmdGYWN0b3J5IG5ld0luc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IENtaXNCaW5kaW5nRmFjdG9yeSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgc2Vzc2lvbiBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldERlZmF1bHRTZXNzaW9uUGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgc2Vzc2lvbiBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRTZXNzaW9uUGFyYW1ldGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uUGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZhdWx0cyA9IGNyZWF0ZU5ld0RlZmF1bHRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWZhdWx0cyA9IHNlc3Npb25QYXJhbWV0ZXJzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENNSVMgYmluZGluZyBpbnN0YW5jZS4gQSBiaW5kaW5nIGNsYXNzIGhhcyB0byBiZSBwcm92aWRlZCBpbgotICAgICAqIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHVibGljIENtaXNCaW5kaW5nIGNyZWF0ZUNtaXNCaW5kaW5nKE1hcDxTdHJpbmcsIFN0cmluZz4gc2Vzc2lvblBhcmFtZXRlcnMpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNtaXNCaW5kaW5nKHNlc3Npb25QYXJhbWV0ZXJzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQ01JUyBiaW5kaW5nIGluc3RhbmNlLiBBIGJpbmRpbmcgY2xhc3MgaGFzIHRvIGJlIHByb3ZpZGVkIGluCi0gICAgICogdGhlIHNlc3Npb24gcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0JpbmRpbmcgY3JlYXRlQ21pc0JpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBzZXNzaW9uUGFyYW1ldGVycywKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aGVudGljYXRpb25Qcm92aWRlciwgVHlwZURlZmluaXRpb25DYWNoZSB0eXBlRGVmQ2FjaGUpIHsKLSAgICAgICAgY2hlY2tTZXNzaW9uUGFyYW1ldGVycyhzZXNzaW9uUGFyYW1ldGVycywgdHJ1ZSk7Ci0KLSAgICAgICAgYWRkRGVmYXVsdFBhcmFtZXRlcnMoc2Vzc2lvblBhcmFtZXRlcnMpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ21pc0JpbmRpbmdJbXBsKHNlc3Npb25QYXJhbWV0ZXJzLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCB0eXBlRGVmQ2FjaGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IENNSVMgQXRvbVB1YiBiaW5kaW5nIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQmluZGluZyBjcmVhdGVDbWlzQXRvbVB1YkJpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBzZXNzaW9uUGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gY3JlYXRlQ21pc0F0b21QdWJCaW5kaW5nKHNlc3Npb25QYXJhbWV0ZXJzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBDTUlTIEF0b21QdWIgYmluZGluZyBpbnN0YW5jZSB3aXRoIGEgY3VzdG9tCi0gICAgICogYXV0aGVudGljYXRpb24gcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIENtaXNCaW5kaW5nIGNyZWF0ZUNtaXNBdG9tUHViQmluZGluZyhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzLAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBjaGVja1Nlc3Npb25QYXJhbWV0ZXJzKHNlc3Npb25QYXJhbWV0ZXJzLCBmYWxzZSk7Ci0KLSAgICAgICAgc2Vzc2lvblBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19TUElfQ0xBU1MsIEJJTkRJTkdfU1BJX0FUT01QVUIpOwotICAgICAgICBpZiAoIXNlc3Npb25QYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KFNlc3Npb25QYXJhbWV0ZXIuSFRUUF9JTlZPS0VSX0NMQVNTKSkgewotICAgICAgICAgICAgc2Vzc2lvblBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuSFRUUF9JTlZPS0VSX0NMQVNTLCBERUZBVUxUX0hUVFBfSU5WT0tFUik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTKSkgewotICAgICAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTLCBTVEFOREFSRF9BVVRIRU5USUNBVElPTl9QUk9WSURFUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVEZWZDYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXNlc3Npb25QYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KFNlc3Npb25QYXJhbWV0ZXIuVFlQRV9ERUZJTklUSU9OX0NBQ0hFX0NMQVNTKSkgewotICAgICAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFNlc3Npb25QYXJhbWV0ZXIuVFlQRV9ERUZJTklUSU9OX0NBQ0hFX0NMQVNTLCBERUZBVUxUX1RZUEVfREVGSU5JVElPTl9DQUNIRV9DTEFTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkFVVEhfSFRUUF9CQVNJQykpIHsKLSAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfSFRUUF9CQVNJQywgInRydWUiKTsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uUGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX1NPQVBfVVNFUk5BTUVUT0tFTiwgImZhbHNlIik7Ci0gICAgICAgIGFkZERlZmF1bHRQYXJhbWV0ZXJzKHNlc3Npb25QYXJhbWV0ZXJzKTsKLQotICAgICAgICBjaGVjayhzZXNzaW9uUGFyYW1ldGVycywgU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDbWlzQmluZGluZ0ltcGwoc2Vzc2lvblBhcmFtZXRlcnMsIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIHR5cGVEZWZDYWNoZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgQ01JUyBXZWIgU2VydmljZXMgYmluZGluZyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0JpbmRpbmcgY3JlYXRlQ21pc1dlYlNlcnZpY2VzQmluZGluZyhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDbWlzV2ViU2VydmljZXNCaW5kaW5nKHNlc3Npb25QYXJhbWV0ZXJzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBDTUlTIFdlYiBTZXJ2aWNlcyBiaW5kaW5nIGluc3RhbmNlIHdpdGggYSBjdXN0b20KLSAgICAgKiBhdXRoZW50aWNhdGlvbiBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0JpbmRpbmcgY3JlYXRlQ21pc1dlYlNlcnZpY2VzQmluZGluZyhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzLAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBjaGVja1Nlc3Npb25QYXJhbWV0ZXJzKHNlc3Npb25QYXJhbWV0ZXJzLCBmYWxzZSk7Ci0KLSAgICAgICAgc2Vzc2lvblBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19TUElfQ0xBU1MsIEJJTkRJTkdfU1BJX1dFQlNFUlZJQ0VTKTsKLSAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkhUVFBfSU5WT0tFUl9DTEFTUykpIHsKLSAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkhUVFBfSU5WT0tFUl9DTEFTUywgREVGQVVMVF9IVFRQX0lOVk9LRVIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhdXRoZW50aWNhdGlvblByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghc2Vzc2lvblBhcmFtZXRlcnMuY29udGFpbnNLZXkoU2Vzc2lvblBhcmFtZXRlci5BVVRIRU5USUNBVElPTl9QUk9WSURFUl9DTEFTUykpIHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIRU5USUNBVElPTl9QUk9WSURFUl9DTEFTUywgU1RBTkRBUkRfQVVUSEVOVElDQVRJT05fUFJPVklERVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlRGVmQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLlRZUEVfREVGSU5JVElPTl9DQUNIRV9DTEFTUykpIHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTZXNzaW9uUGFyYW1ldGVyLlRZUEVfREVGSU5JVElPTl9DQUNIRV9DTEFTUywgREVGQVVMVF9UWVBFX0RFRklOSVRJT05fQ0FDSEVfQ0xBU1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghc2Vzc2lvblBhcmFtZXRlcnMuY29udGFpbnNLZXkoU2Vzc2lvblBhcmFtZXRlci5BVVRIX1NPQVBfVVNFUk5BTUVUT0tFTikpIHsKLSAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfU09BUF9VU0VSTkFNRVRPS0VOLCAidHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc2Vzc2lvblBhcmFtZXRlcnMuY29udGFpbnNLZXkoU2Vzc2lvblBhcmFtZXRlci5BVVRIX0hUVFBfQkFTSUMpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX0hUVFBfQkFTSUMsICJ0cnVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkRGVmYXVsdFBhcmFtZXRlcnMoc2Vzc2lvblBhcmFtZXRlcnMpOwotCi0gICAgICAgIGNoZWNrKHNlc3Npb25QYXJhbWV0ZXJzLCBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFLAotICAgICAgICAgICAgICAgIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfQUNMX1NFUlZJQ0VfRU5EUE9JTlQpOwotICAgICAgICBjaGVjayhzZXNzaW9uUGFyYW1ldGVycywgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19ESVNDT1ZFUllfU0VSVklDRSwKLSAgICAgICAgICAgICAgICBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0RJU0NPVkVSWV9TRVJWSUNFX0VORFBPSU5UKTsKLSAgICAgICAgY2hlY2soc2Vzc2lvblBhcmFtZXRlcnMsIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRSwKLSAgICAgICAgICAgICAgICBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX01VTFRJRklMSU5HX1NFUlZJQ0VfRU5EUE9JTlQpOwotICAgICAgICBjaGVjayhzZXNzaW9uUGFyYW1ldGVycywgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0VfRU5EUE9JTlQpOwotICAgICAgICBjaGVjayhzZXNzaW9uUGFyYW1ldGVycywgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRSwKLSAgICAgICAgICAgICAgICBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX09CSkVDVF9TRVJWSUNFX0VORFBPSU5UKTsKLSAgICAgICAgY2hlY2soc2Vzc2lvblBhcmFtZXRlcnMsIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUE9MSUNZX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRV9FTkRQT0lOVCk7Ci0gICAgICAgIGNoZWNrKHNlc3Npb25QYXJhbWV0ZXJzLCBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1JFTEFUSU9OU0hJUF9TRVJWSUNFLAotICAgICAgICAgICAgICAgIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVMQVRJT05TSElQX1NFUlZJQ0VfRU5EUE9JTlQpOwotICAgICAgICBjaGVjayhzZXNzaW9uUGFyYW1ldGVycywgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0VfRU5EUE9JTlQpOwotICAgICAgICBjaGVjayhzZXNzaW9uUGFyYW1ldGVycywgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0VfRU5EUE9JTlQpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ21pc0JpbmRpbmdJbXBsKHNlc3Npb25QYXJhbWV0ZXJzLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCB0eXBlRGVmQ2FjaGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IENNSVMgQnJvd3NlciBiaW5kaW5nIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQmluZGluZyBjcmVhdGVDbWlzQnJvd3NlckJpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBzZXNzaW9uUGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gY3JlYXRlQ21pc0Jyb3dzZXJCaW5kaW5nKHNlc3Npb25QYXJhbWV0ZXJzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBDTUlTIEJyb3dzZXIgYmluZGluZyBpbnN0YW5jZSB3aXRoIGEgY3VzdG9tCi0gICAgICogYXV0aGVudGljYXRpb24gcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIENtaXNCaW5kaW5nIGNyZWF0ZUNtaXNCcm93c2VyQmluZGluZyhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzLAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBjaGVja1Nlc3Npb25QYXJhbWV0ZXJzKHNlc3Npb25QYXJhbWV0ZXJzLCBmYWxzZSk7Ci0KLSAgICAgICAgc2Vzc2lvblBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19TUElfQ0xBU1MsIEJJTkRJTkdfU1BJX0JST1dTRVIpOwotICAgICAgICBpZiAoIXNlc3Npb25QYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KFNlc3Npb25QYXJhbWV0ZXIuSFRUUF9JTlZPS0VSX0NMQVNTKSkgewotICAgICAgICAgICAgc2Vzc2lvblBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuSFRUUF9JTlZPS0VSX0NMQVNTLCBERUZBVUxUX0hUVFBfSU5WT0tFUik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTKSkgewotICAgICAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTLCBTVEFOREFSRF9BVVRIRU5USUNBVElPTl9QUk9WSURFUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVEZWZDYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXNlc3Npb25QYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KFNlc3Npb25QYXJhbWV0ZXIuVFlQRV9ERUZJTklUSU9OX0NBQ0hFX0NMQVNTKSkgewotICAgICAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAucHV0KFNlc3Npb25QYXJhbWV0ZXIuVFlQRV9ERUZJTklUSU9OX0NBQ0hFX0NMQVNTLCBERUZBVUxUX1RZUEVfREVGSU5JVElPTl9DQUNIRV9DTEFTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkJST1dTRVJfU1VDQ0lOQ1QpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX1NVQ0NJTkNULCAidHJ1ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc2Vzc2lvblBhcmFtZXRlcnMuY29udGFpbnNLZXkoU2Vzc2lvblBhcmFtZXRlci5BVVRIX0hUVFBfQkFTSUMpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVVRIX0hUVFBfQkFTSUMsICJ0cnVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvblBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9TT0FQX1VTRVJOQU1FVE9LRU4sICJmYWxzZSIpOwotICAgICAgICBhZGREZWZhdWx0UGFyYW1ldGVycyhzZXNzaW9uUGFyYW1ldGVycyk7Ci0KLSAgICAgICAgY2hlY2soc2Vzc2lvblBhcmFtZXRlcnMsIFNlc3Npb25QYXJhbWV0ZXIuQlJPV1NFUl9VUkwpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ21pc0JpbmRpbmdJbXBsKHNlc3Npb25QYXJhbWV0ZXJzLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCB0eXBlRGVmQ2FjaGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IENNSVMgbG9jYWwgYmluZGluZyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0JpbmRpbmcgY3JlYXRlQ21pc0xvY2FsQmluZGluZyhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDbWlzTG9jYWxCaW5kaW5nKHNlc3Npb25QYXJhbWV0ZXJzLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBDTUlTIGxvY2FsIGJpbmRpbmcgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIENtaXNCaW5kaW5nIGNyZWF0ZUNtaXNMb2NhbEJpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBzZXNzaW9uUGFyYW1ldGVycywgVHlwZURlZmluaXRpb25DYWNoZSB0eXBlRGVmQ2FjaGUpIHsKLSAgICAgICAgY2hlY2tTZXNzaW9uUGFyYW1ldGVycyhzZXNzaW9uUGFyYW1ldGVycywgZmFsc2UpOwotCi0gICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfU1BJX0NMQVNTLCBCSU5ESU5HX1NQSV9MT0NBTCk7Ci0gICAgICAgIGlmICh0eXBlRGVmQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLlRZUEVfREVGSU5JVElPTl9DQUNIRV9DTEFTUykpIHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChTZXNzaW9uUGFyYW1ldGVyLlRZUEVfREVGSU5JVElPTl9DQUNIRV9DTEFTUywgREVGQVVMVF9UWVBFX0RFRklOSVRJT05fQ0FDSEVfQ0xBU1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFkZERlZmF1bHRQYXJhbWV0ZXJzKHNlc3Npb25QYXJhbWV0ZXJzKTsKLQotICAgICAgICBjaGVjayhzZXNzaW9uUGFyYW1ldGVycywgU2Vzc2lvblBhcmFtZXRlci5MT0NBTF9GQUNUT1JZKTsKLQotICAgICAgICByZXR1cm4gbmV3IENtaXNCaW5kaW5nSW1wbChzZXNzaW9uUGFyYW1ldGVycyk7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBpbnRlcm5hbCAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhlIHBhc3NlZCBzZXNzaW9uIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1Nlc3Npb25QYXJhbWV0ZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gc2Vzc2lvblBhcmFtZXRlcnMsIGJvb2xlYW4gbXVzdENvbnRhaW5TUEkpIHsKLSAgICAgICAgLy8gZG9uJ3QgYWNjZXB0IG51bGwKLSAgICAgICAgaWYgKHNlc3Npb25QYXJhbWV0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlc3Npb24gcGFyYW1ldGVyIG1hcCBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgYmluZGluZyBlbnRyeQotICAgICAgICBmaW5hbCBTdHJpbmcgc3BpQ2xhc3MgPSBzZXNzaW9uUGFyYW1ldGVycy5nZXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1NQSV9DTEFTUyk7Ci0gICAgICAgIGlmIChtdXN0Q29udGFpblNQSSkgewotICAgICAgICAgICAgaWYgKChzcGlDbGFzcyA9PSBudWxsKSB8fCAoc3BpQ2xhc3MudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU1BJIGNsYXNzIGVudHJ5ICgiICsgU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1NQSV9DTEFTUwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJhbWV0ZXIgaXMgcHJlc2VudC4gSWYgbm90LCB0aHJvdyBhbgotICAgICAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVjayhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzLCBTdHJpbmcuLi4gcGFyYW1ldGVycykgewotICAgICAgICBmb3IgKFN0cmluZyBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvblBhcmFtZXRlcnMuY29udGFpbnNLZXkocGFyYW1ldGVyKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXIgJyIgKyBwYXJhbWV0ZXJzWzBdICsgIicgaXMgbWlzc2luZyEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9uZSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgbXVzdCBiZSBzZXQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMuYXNMaXN0KHBhcmFtZXRlcnMpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHRoZSBkZWZhdWx0IHNlc3Npb24gcGFyYW1ldGVycyB0byB0aGUgZ2l2ZW4gbWFwIHdpdGhvdXQgb3ZlcnJpZGUKLSAgICAgKiBleGlzdGluZyBlbnRyaWVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGREZWZhdWx0UGFyYW1ldGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHNlc3Npb25QYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGRlZmF1bHRzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoIXNlc3Npb25QYXJhbWV0ZXJzLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycy5wdXQoa2V5LCBkZWZhdWx0cy5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBzZXNzaW9uIHBhcmFtZXRlcnMgbWFwIHdpdGggc29tZSByZWFzb25hYmxlIGRlZmF1bHRzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY3JlYXRlTmV3RGVmYXVsdFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgcmVzdWx0LnB1dChTZXNzaW9uUGFyYW1ldGVyLkNBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9TSVpFX1JFUE9TSVRPUklFUykpOwotICAgICAgICByZXN1bHQucHV0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9UWVBFUywgU3RyaW5nLnZhbHVlT2YoU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfVFlQRVMpKTsKLSAgICAgICAgcmVzdWx0LnB1dChTZXNzaW9uUGFyYW1ldGVyLkNBQ0hFX1NJWkVfTElOS1MsIFN0cmluZy52YWx1ZU9mKFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9TSVpFX0xJTktTKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvQ2FjaGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9jYWNoZS9DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNmZWM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9jYWNoZS9DYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGFuIGhpZXJhcmNoaWNhbCBjYWNoZS4KLSAqIAotICogPHA+Ci0gKiBFYWNoIGxldmVsIG9mIHRoZSBoaWVyYXJjaHkgY291bGQgdXNlIGEgZGlmZmVyZW50IGNhY2hpbmcgc3RyYXRlZ3kuIFRoZSBjYWNoZQotICogaXMgaW5pdGlhbGl6ZSBieSBkZWZpbmluZyB0aGUgY2xhc3NlcyB0aGF0IGhhbmRsZSB0aGUgY2FjaGluZyBmb3Igb25lIGxldmVsLgotICogVGhlc2UgY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUge0BsaW5rIENhY2hlTGV2ZWx9IGludGVyZmFjZS48YnIvPgotICogPGJyLz4KLSAqIExldmVsIGNvbmZpZ3VyYXRpb24gc3RyaW5nIGZvcm1hdDogIgotICogPGNvZGU+Jmx0O2NsYXNzIG5hbWUmZ3Q7IFtwYXJhbTE9dmFsdWUxLHBhcmFtMj12YWx1ZTIsLi4uXTwvY29kZT4iLjxici8+Ci0gKiBGb3IgZXhhbXBsZToKLSAqIDxjb2RlPm9yZy5hcGFjaGUub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuTWFwQ2FjaGVMZXZlbEltcGwgY2FwYWNpdHk9MTA8L2NvZGU+Ci0gKiA8YnIvPgotICogPC9wPgotICogCi0gKiBAc2VlIENhY2hlTGV2ZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoZSBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhY2hlTGV2ZWxDb25maWcKLSAgICAgKiAgICAgICAgICAgIHRoZSBsZXZlbCBjb25maWd1cmF0aW9uIHN0cmluZ3MgZnJvbSB0aGUgcm9vdCB0byB0aGUgbGVhZnMKLSAgICAgKi8KLSAgICB2b2lkIGluaXRpYWxpemUoU3RyaW5nW10gY2FjaGVMZXZlbENvbmZpZyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIG9iamVjdCB0byB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGtleXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXlzIGZvciB0aGlzIG9iamVjdAotICAgICAqLwotICAgIHZvaWQgcHV0KE9iamVjdCB2YWx1ZSwgU3RyaW5nLi4uIGtleXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuIG9iamVjdCBmcm9tIHRoZSBjYWNoZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5cwotICAgICAqICAgICAgICAgICAgdGhlIGtleXMKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgb3IKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBicmFuY2ggb3IgbGVhZiBkb2Vzbid0IGV4aXN0Ci0gICAgICovCi0gICAgT2JqZWN0IGdldChTdHJpbmcuLi4ga2V5cyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgYnJhbmNoIG9yIGxlYWYgZnJvbSB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBrZXlzIG9mIHRoZSBicmFuY2ggb3IgbGVhZgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlKFN0cmluZy4uLiBrZXlzKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVBbGwoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiBrZXkgaXMgaW4gdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXlzCi0gICAgICogICAgICAgICAgICB0aGUga2V5cyBvZiB0aGUgYnJhbmNoIG9yIGxlYWYKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qga2V5IHBhcnQgdGhhdCBpcyBub3QgaW4gdGhlIGNhY2hlIG9yCi0gICAgICogICAgICAgICA8Y29kZT5rZXlzLmxlbmd0aDwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBpbiB0aGUgY2FjaGUKLSAgICAgKi8KLSAgICBpbnQgY2hlY2soU3RyaW5nLi4uIGtleXMpOwotCi0gICAgLyoqCi0gICAgICogQXBwbGllcyBhIHdyaXRlIGxvY2suCi0gICAgICovCi0gICAgdm9pZCB3cml0ZUxvY2soKTsKLQotICAgIC8qKgotICAgICAqIFJlbGVhc2VzIGEgd3JpdGUgbG9jay4KLSAgICAgKi8KLSAgICB2b2lkIHdyaXRlVW5sb2NrKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvQ2FjaGVMZXZlbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlL0NhY2hlTGV2ZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjMjZmMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvQ2FjaGVMZXZlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIGxldmVsIG9mIGFuIGhpZXJhcmNoaWNhbCBjYWNoZS4KLSAqIAotICogQHNlZSBDYWNoZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhY2hlTGV2ZWwgZXh0ZW5kcyBTZXJpYWxpemFibGUgewotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgY2FjaGUgbGV2ZWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgIGxldmVsIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICB2b2lkIGluaXRpYWxpemUoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBjYWNoZSBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IGF0IHRoaXMgbGV2ZWwKLSAgICAgKi8KLSAgICB2b2lkIHB1dChPYmplY3QgdmFsdWUsIFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuIG9iamVjdCBmcm9tIHRoZSBjYWNoZSBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IGF0IHRoaXMgY2FjaGUgbGV2ZWwKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG9iamVjdCBkb2Vzbid0IGV4aXN0Ci0gICAgICovCi0gICAgT2JqZWN0IGdldChTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYW4gb2JqZWN0IGZyb20gdGhpcyBjYWNoZSBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5IGF0IHRoaXMgY2FjaGUgbGV2ZWwKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZShTdHJpbmcga2V5KTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9jYWNoZS9UeXBlRGVmaW5pdGlvbkNhY2hlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvVHlwZURlZmluaXRpb25DYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxYTVjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9jYWNoZS9UeXBlRGVmaW5pdGlvbkNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogQSBjYWNoZSBmb3IgdHlwZSBkZWZpbml0aW9uIG9iamVjdHMuCi0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBoYXZlIHRvIGJlIHRyZWFkLXNhZmUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZURlZmluaXRpb25DYWNoZSBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgdm9pZCBpbml0aWFsaXplKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHR5cGUgZGVmaW5pdGlvbiBvYmplY3QgdG8gdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IGlkCi0gICAgICogQHBhcmFtIHR5cGVEZWZpbml0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBkZWZpbml0aW9uIG9iamVjdAotICAgICAqLwotICAgIHZvaWQgcHV0KFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhIHR5cGUgZGVmaW5pdGlvbiBvYmplY3QgZnJvbSB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgaWQKLSAgICAgKiBAcGFyYW0gdHlwZUlkCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBpZAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgZGVmaW5pdGlvbiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG9iamVjdCBpcwotICAgICAqICAgICAgICAgbm90IGluIHRoZSBjYWNoZQotICAgICAqLwotICAgIFR5cGVEZWZpbml0aW9uIGdldChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSB0eXBlIGRlZmluaXRpb24gb2JqZWN0IGZyb20gdGhlIGNhY2hlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IGlkCi0gICAgICogQHBhcmFtIHR5cGVJZAotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgaWQKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIHR5cGUgZGVmaW5pdGlvbiBvYmplY3RzIG9mIGEgcmVwb3NpdG9yeSBmcm9tIHRoZSBjYWNoZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBpZAotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlKFN0cmluZyByZXBvc2l0b3J5SWQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgY2FjaGUgZW50cmllcy4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUFsbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9jYWNoZS9pbXBsL0Fic3RyYWN0TWFwQ2FjaGVMZXZlbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlL2ltcGwvQWJzdHJhY3RNYXBDYWNoZUxldmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOWYzZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlL2ltcGwvQWJzdHJhY3RNYXBDYWNoZUxldmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5DYWNoZUxldmVsOwotCi0vKioKLSAqIEFic3RyYWN0IE1hcCBjYWNoZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwQ2FjaGVMZXZlbCBpbXBsZW1lbnRzIENhY2hlTGV2ZWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZk1hcDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZkZhbGxiYWNrRW5hYmxlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIGZGYWxsYmFja0tleTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZlNpbmdsZVZhbHVlRW5hYmxlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZShNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpOwotCi0gICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBmTWFwLmdldChrZXkpOwotCi0gICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCkgJiYgZkZhbGxiYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgdmFsdWUgPSBmTWFwLmdldChmRmFsbGJhY2tLZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCh2YWx1ZSA9PSBudWxsKSAmJiBmU2luZ2xlVmFsdWVFbmFibGVkKSB7Ci0gICAgICAgICAgICBpZiAoZk1hcC5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZk1hcC52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXQoT2JqZWN0IHZhbHVlLCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGZNYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGZNYXAucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgbWFwLgotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGZNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgaW50ZXJuYWwgbWFwLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1hcChNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewotICAgICAgICBmTWFwID0gbWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuYWJsZXMgYSBmYWxsYmFjayBrZXkgaWYgbm8gdmFsdWUgd2FzIGZvdW5kIGZvciBhIHJlcXVlc3RlZCBrZXkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlS2V5RmFsbGJhY2soU3RyaW5nIGtleSkgewotICAgICAgICBmRmFsbGJhY2tLZXkgPSBrZXk7Ci0gICAgICAgIGZGYWxsYmFja0VuYWJsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGVzIHRoZSBmYWxsYmFjayBrZXkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUtleUZhbGxiYWNrKCkgewotICAgICAgICBmRmFsbGJhY2tFbmFibGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcyB0aGUgc2luZ2xlIHZhbHVlIGZhbGxiYWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGVuYWJsZVNpbmdlVmFsdWVGYWxsYmFjaygpIHsKLSAgICAgICAgZlNpbmdsZVZhbHVlRW5hYmxlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzYWJsZXMgdGhlIHNpbmdsZSB2YWx1ZSBmYWxsYmFjay4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkaXNhYmxlU2luZ2VWYWx1ZUZhbGxiYWNrKCkgewotICAgICAgICBmU2luZ2xlVmFsdWVFbmFibGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgYW4gaW50ZWdlciBwYXJhbWV0ZXIgZnJvbSB0aGUgcGFyYW1ldGVycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBtYXAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlciBuYW1lCi0gICAgICogQHBhcmFtIGRlZlZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgcGFyYW1ldGVyIGNhbid0IGJlIGZvdW5kCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBnZXRJbnRQYXJhbWV0ZXIoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBTdHJpbmcgbmFtZSwgaW50IGRlZlZhbHVlKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAoKHZhbHVlID09IG51bGwpIHx8ICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIGEgZmxvYXQgcGFyYW1ldGVyIGZyb20gdGhlIHBhcmFtZXRlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbWFwCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgbmFtZQotICAgICAqIEBwYXJhbSBkZWZWYWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHBhcmFtZXRlciBjYW4ndCBiZSBmb3VuZAotICAgICAqLwotICAgIHByb3RlY3RlZCBmbG9hdCBnZXRGbG9hdFBhcmFtZXRlcihNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIFN0cmluZyBuYW1lLCBmbG9hdCBkZWZWYWx1ZSkgewotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKCh2YWx1ZSA9PSBudWxsKSB8fCAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnZhbHVlT2YodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGRlZlZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgYSBib29sZWFuIHBhcmFtZXRlciBmcm9tIHRoZSBwYXJhbWV0ZXJzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG1hcAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIG5hbWUKLSAgICAgKiBAcGFyYW0gZGVmVmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBwYXJhbWV0ZXIgY2FuJ3QgYmUgZm91bmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRCb29sZWFuUGFyYW1ldGVyKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGVmVmFsdWUpIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZlZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIGRlZlZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoZk1hcCA9PSBudWxsID8gIltubyBtYXBdIiA6IGZNYXAudG9TdHJpbmcoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlL2ltcGwvQ2FjaGVJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9DYWNoZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4ZTI0OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9DYWNoZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuQ2FjaGVMZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ2xhc3NMb2FkZXJVdGlsOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogRGVmYXVsdCBjYWNoZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlSW1wbCBpbXBsZW1lbnRzIENhY2hlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYWNoZUltcGwuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M8Pz4+IGxldmVsczsKLSAgICBwcml2YXRlIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gbGV2ZWxQYXJhbWV0ZXJzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotICAgIHByaXZhdGUgQ2FjaGVMZXZlbCByb290OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENhY2hlSW1wbCgpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gIkNhY2hlIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FjaGVJbXBsKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmdbXSBjYWNoZUxldmVsQ29uZmlnKSB7Ci0gICAgICAgIGlmIChsZXZlbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FjaGUgYWxyZWFkeSBpbml0aWFsaXplISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChjYWNoZUxldmVsQ29uZmlnID09IG51bGwpIHx8IChjYWNoZUxldmVsQ29uZmlnLmxlbmd0aCA9PSAwKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FjaGUgY29uZmlnIG11c3Qgbm90IGJlIGVtcHR5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsZXZlbHMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8+PigpOwotICAgICAgICAgICAgbGV2ZWxQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PigpOwotCi0gICAgICAgICAgICAvLyBidWlsZCBsZXZlbCBsaXN0cwotICAgICAgICAgICAgZm9yIChTdHJpbmcgY29uZmlnIDogY2FjaGVMZXZlbENvbmZpZykgewotICAgICAgICAgICAgICAgIGludCB4ID0gY29uZmlnLmluZGV4T2YoJyAnKTsKLSAgICAgICAgICAgICAgICBpZiAoeCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBhZGRMZXZlbChjb25maWcsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZExldmVsKGNvbmZpZy5zdWJzdHJpbmcoMCwgeCksIGNvbmZpZy5zdWJzdHJpbmcoeCArIDEpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSByb290Ci0gICAgICAgICAgICByb290ID0gY3JlYXRlQ2FjaGVMZXZlbCgwKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTGV2ZWwoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBjbGFzcwotICAgICAgICBDbGFzczw/PiBjbGF6ejsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3NMb2FkZXJVdGlsLmxvYWRDbGFzcyhjbGFzc05hbWUsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDbGFzcyAnIiArIGNsYXNzTmFtZSArICInIG5vdCBmb3VuZCEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBjbGFzcwotICAgICAgICBpZiAoIUNhY2hlTGV2ZWwuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXNzICciICsgY2xhc3NOYW1lICsgIicgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBDYWNoZUxldmVsIGludGVyZmFjZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxldmVscy5hZGQoY2xhenopOwotCi0gICAgICAgIC8vIHByb2Nlc3MgcGFyYW1ldGVycwotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsZXZlbFBhcmFtZXRlcnMuYWRkKG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgICAgIGxldmVsUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyTWFwKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgcGFpciA6IHBhcmFtZXRlcnMuc3BsaXQoIiwiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleVZhbHVlID0gcGFpci5zcGxpdCgiPSIpOwotICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZS5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJNYXAucHV0KGtleVZhbHVlWzBdLCAiIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTWFwLnB1dChrZXlWYWx1ZVswXSwga2V5VmFsdWVbMV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZy4uLiBrZXlzKSB7Ci0gICAgICAgIC8vIGNoZWNrIGtleXMKLSAgICAgICAgaWYgKGtleXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBsZXZlbCBkZXB0aAotICAgICAgICBpZiAobGV2ZWxzLnNpemUoKSAhPSBrZXlzLmxlbmd0aCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgbnVtYmVyIG9mIGtleXMhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2FjaGVMZXZlbCBjYWNoZUxldmVsID0gcm9vdDsKLQotICAgICAgICAgICAgLy8gZm9sbG93IHRoZSBicmFuY2gKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbGV2ZWwgPSBjYWNoZUxldmVsLmdldChrZXlzW2ldKTsKLQotICAgICAgICAgICAgICAgIC8vIGRvZXMgdGhlIGJyYW5jaCBleGlzdD8KLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBuZXh0IGxldmVsCi0gICAgICAgICAgICAgICAgY2FjaGVMZXZlbCA9IChDYWNoZUxldmVsKSBsZXZlbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZQotICAgICAgICAgICAgcmVzdWx0ID0gY2FjaGVMZXZlbC5nZXQoa2V5c1trZXlzLmxlbmd0aCAtIDFdKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sucmVhZExvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0KE9iamVjdCB2YWx1ZSwgU3RyaW5nLi4uIGtleXMpIHsKLSAgICAgICAgLy8gY2hlY2sga2V5cwotICAgICAgICBpZiAoa2V5cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBsZXZlbCBkZXB0aAotICAgICAgICBpZiAobGV2ZWxzLnNpemUoKSAhPSBrZXlzLmxlbmd0aCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV3JvbmcgbnVtYmVyIG9mIGtleXMhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENhY2hlTGV2ZWwgY2FjaGVMZXZlbCA9IHJvb3Q7Ci0KLSAgICAgICAgICAgIC8vIGZvbGxvdyB0aGUgYnJhbmNoCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGxldmVsID0gY2FjaGVMZXZlbC5nZXQoa2V5c1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkb2VzIHRoZSBicmFuY2ggZXhpc3Q/Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBjcmVhdGVDYWNoZUxldmVsKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVMZXZlbC5wdXQobGV2ZWwsIGtleXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5leHQgbGV2ZWwKLSAgICAgICAgICAgICAgICBjYWNoZUxldmVsID0gKENhY2hlTGV2ZWwpIGxldmVsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYWNoZUxldmVsLnB1dCh2YWx1ZSwga2V5c1trZXlzLmxlbmd0aCAtIDFdKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJ7fTogcHV0IFt7fV0gPSB7fSIsIG5hbWUsIGdldEZvcm1hdHRlZEtleXMoa2V5cyksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nLi4uIGtleXMpIHsKLSAgICAgICAgaWYgKGtleXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDYWNoZUxldmVsIGNhY2hlTGV2ZWwgPSByb290OwotCi0gICAgICAgICAgICAvLyBmb2xsb3cgdGhlIGJyYW5jaAotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBsZXZlbCA9IGNhY2hlTGV2ZWwuZ2V0KGtleXNbaV0pOwotCi0gICAgICAgICAgICAgICAgLy8gZG9lcyB0aGUgYnJhbmNoIGV4aXN0PwotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBuZXh0IGxldmVsCi0gICAgICAgICAgICAgICAgY2FjaGVMZXZlbCA9IChDYWNoZUxldmVsKSBsZXZlbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FjaGVMZXZlbC5yZW1vdmUoa2V5c1trZXlzLmxlbmd0aCAtIDFdKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJ7fTogcmVtb3ZlZCBbe31dIiwgbmFtZSwgZ2V0Rm9ybWF0dGVkS2V5cyhrZXlzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJvb3QgPSBjcmVhdGVDYWNoZUxldmVsKDApOwotCi0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoInt9OiByZW1vdmVkIGFsbCIsIG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY2hlY2soU3RyaW5nLi4uIGtleXMpIHsKLSAgICAgICAgaWYgKGtleXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENhY2hlTGV2ZWwgY2FjaGVMZXZlbCA9IHJvb3Q7Ci0KLSAgICAgICAgICAgIC8vIGZvbGxvdyB0aGUgYnJhbmNoCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGxldmVsID0gY2FjaGVMZXZlbC5nZXQoa2V5c1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkb2VzIHRoZSBicmFuY2ggZXhpc3Q/Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gbmV4dCBsZXZlbAotICAgICAgICAgICAgICAgIGNhY2hlTGV2ZWwgPSAoQ2FjaGVMZXZlbCkgbGV2ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVMb2NrKCkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVVubG9jaygpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIGludGVybmFsIC0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjYWNoZSBsZXZlbCBvYmplY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDYWNoZUxldmVsIGNyZWF0ZUNhY2hlTGV2ZWwoaW50IGxldmVsKSB7Ci0gICAgICAgIGlmICgobGV2ZWwgPCAwKSB8fCAobGV2ZWwgPj0gbGV2ZWxzLnNpemUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhY2hlIGxldmVsIGRvZXNuJ3QgZml0IHRoZSBjb25maWd1cmF0aW9uISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjbGFzcyBhbmQgY3JlYXRlIGFuIGluc3RhbmNlCi0gICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbGV2ZWxzLmdldChsZXZlbCk7Ci0gICAgICAgIENhY2hlTGV2ZWwgY2FjaGVMZXZlbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYWNoZUxldmVsID0gKENhY2hlTGV2ZWwpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWNoZSBsZXZlbCBwcm9ibGVtPyEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluaXRpYWxpemUgaXQKLSAgICAgICAgY2FjaGVMZXZlbC5pbml0aWFsaXplKGxldmVsUGFyYW1ldGVycy5nZXQobGV2ZWwpKTsKLQotICAgICAgICByZXR1cm4gY2FjaGVMZXZlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gKHJvb3QgPT0gbnVsbCA/ICIobm8gY2FjaGUgcm9vdCkiIDogcm9vdC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIGludGVybmFsIC0tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRLZXlzKFN0cmluZ1tdIGtleXMpIHsKLSAgICAgICAgYXNzZXJ0IGtleXMgIT0gbnVsbDsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgayA6IGtleXMpIHsKLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoayk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9Db250ZW50VHlwZUNhY2hlTGV2ZWxJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9Db250ZW50VHlwZUNhY2hlTGV2ZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2M4MDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlL2ltcGwvQ29udGVudFR5cGVDYWNoZUxldmVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBDb250ZW50IHR5cGUgY2FjaGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50VHlwZUNhY2hlTGV2ZWxJbXBsIGV4dGVuZHMgTWFwQ2FjaGVMZXZlbEltcGwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFR5cGVDYWNoZUxldmVsSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZW5hYmxlS2V5RmFsbGJhY2sobnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KG5vcm1hbGl6ZShrZXkpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwdXQoT2JqZWN0IHZhbHVlLCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHN1cGVyLnB1dCh2YWx1ZSwgbm9ybWFsaXplKGtleSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHN1cGVyLnJlbW92ZShub3JtYWxpemUoa2V5KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm9ybWFsaXplcyB0aGUga2V5IHdoaWNoIHNob3VsZCBiZSBhIGNvbnRlbnQgdHlwZS4gSXQncyBxdWl0ZSBzaW1wbGUgYXQKLSAgICAgKiB0aGUgbW9tZW50IGJ1dCBzaG91bGQgY292ZXIgbW9zdCBjYXNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgcGFyYW1ldGVyU3RhcnQgPSAwOwotCi0gICAgICAgIC8vIGZpcnN0LCBnZXQgdGhlIE1JTUUgdHlwZQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBrZXkuY2hhckF0KGkpOwotCi0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc7JykgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0YXJ0ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBmb3VuZCwgZ2F0aGVyIHRoZW0KLSAgICAgICAgaWYgKHBhcmFtZXRlclN0YXJ0ID4gMCkgewotICAgICAgICAgICAgU29ydGVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXIgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIga3NiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdnNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNLZXkgPSB0cnVlOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gcGFyYW1ldGVyU3RhcnQgKyAxOyBpIDwga2V5Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMgPSBrZXkuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc0tleSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0tleSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBrc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGtleQotICAgICAgICAgICAgICAgICAgICAgICAgaXNLZXkgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIucHV0KGtzYi50b1N0cmluZygpLCB2c2IudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGtzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2c2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyIHF1b3RlcwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB2c2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgbGFzdCBwYXJhbWV0ZXIKLSAgICAgICAgICAgIGlmIChrc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnB1dChrc2IudG9TdHJpbmcoKSwgdnNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBwYXJhbWV0ZXJzIHNvcnRlZCBieSBrZXkKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHBhcmFtZXRlci5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc7Jyk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9McnVDYWNoZUxldmVsSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlL2ltcGwvTHJ1Q2FjaGVMZXZlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4ZTYzYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9McnVDYWNoZUxldmVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBMUlUgY2FjaGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBMcnVDYWNoZUxldmVsSW1wbCBleHRlbmRzIEFic3RyYWN0TWFwQ2FjaGVMZXZlbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9FTlRSSUVTID0gIm1heEVudHJpZXMiOwotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgZmluYWwgaW50IG1heEVudHJpZXMgPSBnZXRJbnRQYXJhbWV0ZXIocGFyYW1ldGVycywgTUFYX0VOVFJJRVMsIDEwMCk7Ci0KLSAgICAgICAgc2V0TWFwKG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgT2JqZWN0PihtYXhFbnRyaWVzICsgMSwgMC43MGYsIHRydWUpIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZWxkZXN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNpemUoKSA+IG1heEVudHJpZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9NYXBDYWNoZUxldmVsSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlL2ltcGwvTWFwQ2FjaGVMZXZlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmMDI4NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvaW1wbC9NYXBDYWNoZUxldmVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBNYXAgY2FjaGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBDYWNoZUxldmVsSW1wbCBleHRlbmRzIEFic3RyYWN0TWFwQ2FjaGVMZXZlbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFDSVRZID0gImNhcGFjaXR5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0ZBQ1RPUiA9ICJsb2FkRmFjdG9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfVkFMVUUgPSAic2luZ2xlVmFsdWUiOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1hcENhY2hlTGV2ZWxJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBpbml0aWFsQ2FwYWNpdHkgPSBnZXRJbnRQYXJhbWV0ZXIocGFyYW1ldGVycywgQ0FQQUNJVFksIDMyKTsKLSAgICAgICAgZmxvYXQgbG9hZEZhY3RvciA9IGdldEZsb2F0UGFyYW1ldGVyKHBhcmFtZXRlcnMsIExPQURfRkFDVE9SLCAwLjc1Zik7Ci0gICAgICAgIGJvb2xlYW4gc2luZ2xlVmFsdWUgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHBhcmFtZXRlcnMsIFNJTkdMRV9WQUxVRSwgZmFsc2UpOwotCi0gICAgICAgIHNldE1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKSk7Ci0gICAgICAgIGRpc2FibGVLZXlGYWxsYmFjaygpOwotICAgICAgICBpZiAoc2luZ2xlVmFsdWUpIHsKLSAgICAgICAgICAgIGVuYWJsZVNpbmdlVmFsdWVGYWxsYmFjaygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvQ2xpZW50VmVyc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvQ2xpZW50VmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWI4YjVhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL0NsaWVudFZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbDsKLQotcHVibGljIGZpbmFsIGNsYXNzIENsaWVudFZlcnNpb24gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkNNSVNfVkVSU0lPTjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOQ01JU19DTElFTlQ7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBQYWNrYWdlIHAgPSBQYWNrYWdlLmdldFBhY2thZ2UoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsIik7Ci0gICAgICAgIGlmIChwID09IG51bGwpIHsKLSAgICAgICAgICAgIE9QRU5DTUlTX1ZFUlNJT04gPSAiPyI7Ci0gICAgICAgICAgICBPUEVOQ01JU19DTElFTlQgPSAiQXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPUEVOQ01JU19WRVJTSU9OID0gcC5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKTsKLSAgICAgICAgICAgIE9QRU5DTUlTX0NMSUVOVCA9ICJBcGFjaGUgQ2hlbWlzdHJ5IE9wZW5DTUlTLyIgKyAoT1BFTkNNSVNfVkVSU0lPTiA9PSBudWxsID8gIj8iIDogT1BFTkNNSVNfVkVSU0lPTik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIENsaWVudFZlcnNpb24oKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvQ21pc0JpbmRpbmdJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvaW1wbC9DbWlzQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxY2E5MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvaW1wbC9DbWlzQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLlR5cGVEZWZpbml0aW9uQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkNtaXNTcGk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5TZXNzaW9uQXdhcmVBdXRoZW50aWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNsYXNzTG9hZGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQmluZGluZ3NPYmplY3RGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BY2xTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQmluZGluZ3NPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkNtaXNCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkRpc2NvdmVyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTXVsdGlGaWxpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk5hdmlnYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk9iamVjdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUG9saWN5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZWxhdGlvbnNoaXBTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlcG9zaXRvcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlZlcnNpb25pbmdTZXJ2aWNlOwotCi0vKioKLSAqIENNSVMgYmluZGluZyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENtaXNCaW5kaW5nSW1wbCBpbXBsZW1lbnRzIENtaXNCaW5kaW5nLCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIEJpbmRpbmdTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nc09iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeTsKLSAgICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnlTZXJ2aWNlIHJlcG9zaXRvcnlTZXJ2aWNlV3JhcHBlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXNzaW9uUGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgdGhlIHNlc3Npb24gcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQmluZGluZ0ltcGwoTWFwPFN0cmluZywgU3RyaW5nPiBzZXNzaW9uUGFyYW1ldGVycykgewotICAgICAgICB0aGlzKHNlc3Npb25QYXJhbWV0ZXJzLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2Vzc2lvblBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZXNzaW9uIHBhcmFtZXRlcnMKLSAgICAgKiBAcGFyYW0gYXV0aGVudGljYXRpb25Qcm92aWRlcgotICAgICAqICAgICAgICAgICAgYW4gYXV0aGVudGljYXRpb24gcHJvdmlkZXIgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0JpbmRpbmdJbXBsKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gc2Vzc2lvblBhcmFtZXRlcnMsIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aGVudGljYXRpb25Qcm92aWRlciwKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlKSB7Ci0gICAgICAgIC8vIHNvbWUgY2hlY2tzIGZpcnN0Ci0gICAgICAgIGlmIChzZXNzaW9uUGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHBhcmFtZXRlcnMgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfU1BJX0NMQVNTKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiBwYXJhbWV0ZXJzIGRvIG5vdCBjb250YWluIGEgU1BJIGNsYXNzIG5hbWUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbml0aWFsaXplIHNlc3Npb24KLSAgICAgICAgc2Vzc2lvbiA9IG5ldyBTZXNzaW9uSW1wbCgpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBzZXNzaW9uUGFyYW1ldGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXV0aGVudGljYXRpb25Qcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgYW5kIGFkZCBpdCBzZXNzaW9uCi0gICAgICAgICAgICBTdHJpbmcgYXV0aFByb3ZpZGVyQ2xhc3NOYW1lID0gc2Vzc2lvblBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSEVOVElDQVRJT05fUFJPVklERVJfQ0xBU1MpOwotICAgICAgICAgICAgaWYgKGF1dGhQcm92aWRlckNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGF1dGhQcm92aWRlck9iaiA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBhdXRoUHJvdmlkZXJPYmogPSBDbGFzc0xvYWRlclV0aWwubG9hZENsYXNzKGF1dGhQcm92aWRlckNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlcjogIiArIGUsIGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghKGF1dGhQcm92aWRlck9iaiBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGRvZXMgbm90IGltcGxlbWVudCBBdXRoZW50aWNhdGlvblByb3ZpZGVyISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvblByb3ZpZGVyID0gKEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIpIGF1dGhQcm92aWRlck9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvY2FsZQotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBzZXNzaW9uUGFyYW1ldGVycy5nZXQoU2Vzc2lvblBhcmFtZXRlci5MT0NBTEVfSVNPNjM5X0xBTkdVQUdFKTsKLSAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2UudHJpbSgpOwotICAgICAgICAgICAgaWYgKGxhbmd1YWdlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gc2Vzc2lvblBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxFX0lTTzMxNjZfQ09VTlRSWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gY291bnRyeS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9ICItIiArIGNvdW50cnk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGFjY2VwdExhbmd1YWdlID0gbGFuZ3VhZ2UgKyBjb3VudHJ5OwotICAgICAgICAgICAgICAgIGlmICgoYWNjZXB0TGFuZ3VhZ2UuaW5kZXhPZignXG4nKSA9PSAtMSkgJiYgKGFjY2VwdExhbmd1YWdlLmluZGV4T2YoJ1xyJykgPT0gLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24ucHV0KENtaXNCaW5kaW5nc0hlbHBlci5BQ0NFUFRfTEFOR1VBR0UsIGFjY2VwdExhbmd1YWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSBDTUlTIHZlcnNpb24KLSAgICAgICAgU3RyaW5nIGZvcmNlQ21pc1ZlcnNpb24gPSBzZXNzaW9uUGFyYW1ldGVycy5nZXQoU2Vzc2lvblBhcmFtZXRlci5GT1JDRV9DTUlTX1ZFUlNJT04pOwotICAgICAgICBpZiAoZm9yY2VDbWlzVmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlc3Npb24ucHV0KENtaXNCaW5kaW5nc0hlbHBlci5GT1JDRV9DTUlTX1ZFUlNJT04sIENtaXNWZXJzaW9uLmZyb21WYWx1ZShmb3JjZUNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgQ01JUyB2ZXJzaW9uIHZhbHVlOiAiICsgZm9yY2VDbWlzVmVyc2lvbiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgdHlwZSBkZWZpbml0aW9uIGNhY2hlIHRvIHNlc3Npb24KLSAgICAgICAgaWYgKHR5cGVEZWZDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXNzaW9uLnB1dChDbWlzQmluZGluZ3NIZWxwZXIuVFlQRV9ERUZJTlRJT05fQ0FDSEUsIHR5cGVEZWZDYWNoZSk7Ci0gICAgICAgICAgICB0eXBlRGVmQ2FjaGUuaW5pdGlhbGl6ZShzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB1cCBjYWNoZXMKLSAgICAgICAgY2xlYXJBbGxDYWNoZXMoKTsKLQotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBTUEkKLSAgICAgICAgQ21pc0JpbmRpbmdzSGVscGVyLmdldFNQSShzZXNzaW9uKTsKLQotICAgICAgICAvLyBzZXQgdXAgb2JqZWN0IGZhY3RvcnkKLSAgICAgICAgb2JqZWN0RmFjdG9yeSA9IG5ldyBCaW5kaW5nc09iamVjdEZhY3RvcnlJbXBsKCk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIHJlcG9zaXRvcnkgc2VydmljZQotICAgICAgICByZXBvc2l0b3J5U2VydmljZVdyYXBwZXIgPSBuZXcgUmVwb3NpdG9yeVNlcnZpY2VJbXBsKHNlc3Npb24pOwotCi0gICAgICAgIC8vIGFkZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlciB0byBzZXNzaW9uCi0gICAgICAgIGlmIChhdXRoZW50aWNhdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlc3Npb24ucHV0KENtaXNCaW5kaW5nc0hlbHBlci5BVVRIRU5USUNBVElPTl9QUk9WSURFUl9PQkpFQ1QsIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIpOwotICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgaW5zdGFuY2VvZiBTZXNzaW9uQXdhcmVBdXRoZW50aWNhdGlvblByb3ZpZGVyKSB7Ci0gICAgICAgICAgICAgICAgKChTZXNzaW9uQXdhcmVBdXRoZW50aWNhdGlvblByb3ZpZGVyKSBhdXRoZW50aWNhdGlvblByb3ZpZGVyKS5zZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uLmdldFNlc3Npb25JZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nVHlwZSBnZXRCaW5kaW5nVHlwZSgpIHsKLSAgICAgICAgT2JqZWN0IGJpbmRpbmdUeXBlID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUpOwotICAgICAgICBpZiAoIShiaW5kaW5nVHlwZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBCaW5kaW5nVHlwZS5DVVNUT007Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEJpbmRpbmdUeXBlLmZyb21WYWx1ZSgoU3RyaW5nKSBiaW5kaW5nVHlwZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQmluZGluZ1R5cGUuQ1VTVE9NOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCkgewotICAgICAgICBjaGVja1Nlc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlTZXJ2aWNlV3JhcHBlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmF2aWdhdGlvblNlcnZpY2UgZ2V0TmF2aWdhdGlvblNlcnZpY2UoKSB7Ci0gICAgICAgIGNoZWNrU2Vzc2lvbigpOwotICAgICAgICBDbWlzU3BpIHNwaSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRTUEkoc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBzcGkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0U2VydmljZSBnZXRPYmplY3RTZXJ2aWNlKCkgewotICAgICAgICBjaGVja1Nlc3Npb24oKTsKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXR1cm4gc3BpLmdldE9iamVjdFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGlzY292ZXJ5U2VydmljZSBnZXREaXNjb3ZlcnlTZXJ2aWNlKCkgewotICAgICAgICBjaGVja1Nlc3Npb24oKTsKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXR1cm4gc3BpLmdldERpc2NvdmVyeVNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVsYXRpb25zaGlwU2VydmljZSBnZXRSZWxhdGlvbnNoaXBTZXJ2aWNlKCkgewotICAgICAgICBjaGVja1Nlc3Npb24oKTsKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXR1cm4gc3BpLmdldFJlbGF0aW9uc2hpcFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVyc2lvbmluZ1NlcnZpY2UgZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKSB7Ci0gICAgICAgIGNoZWNrU2Vzc2lvbigpOwotICAgICAgICBDbWlzU3BpIHNwaSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRTUEkoc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBzcGkuZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsU2VydmljZSBnZXRBY2xTZXJ2aWNlKCkgewotICAgICAgICBjaGVja1Nlc3Npb24oKTsKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXR1cm4gc3BpLmdldEFjbFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXVsdGlGaWxpbmdTZXJ2aWNlIGdldE11bHRpRmlsaW5nU2VydmljZSgpIHsKLSAgICAgICAgY2hlY2tTZXNzaW9uKCk7Ci0gICAgICAgIENtaXNTcGkgc3BpID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFNQSShzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIHNwaS5nZXRNdWx0aUZpbGluZ1NlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9saWN5U2VydmljZSBnZXRQb2xpY3lTZXJ2aWNlKCkgewotICAgICAgICBjaGVja1Nlc3Npb24oKTsKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXR1cm4gc3BpLmdldFBvbGljeVNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZ3NPYmplY3RGYWN0b3J5IGdldE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBvYmplY3RGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0QXV0aGVudGljYXRpb25Qcm92aWRlcihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhckFsbENhY2hlcygpIHsKLSAgICAgICAgY2hlY2tTZXNzaW9uKCk7Ci0KLSAgICAgICAgc2Vzc2lvbi53cml0ZUxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlc3Npb24ucHV0KENtaXNCaW5kaW5nc0hlbHBlci5SRVBPU0lUT1JZX0lORk9fQ0FDSEUsIG5ldyBSZXBvc2l0b3J5SW5mb0NhY2hlKHNlc3Npb24pKTsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFR5cGVEZWZpbml0aW9uQ2FjaGUoc2Vzc2lvbik7Ci0gICAgICAgICAgICB0eXBlRGVmQ2FjaGUucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgICAgIENtaXNTcGkgc3BpID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFNQSShzZXNzaW9uKTsKLSAgICAgICAgICAgIHNwaS5jbGVhckFsbENhY2hlcygpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2Vzc2lvbi53cml0ZVVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJSZXBvc2l0b3J5Q2FjaGUoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBjaGVja1Nlc3Npb24oKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHNlc3Npb24ud3JpdGVMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZXBvc2l0b3J5SW5mb0NhY2hlIHJlcEluZm9DYWNoZSA9IChSZXBvc2l0b3J5SW5mb0NhY2hlKSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ21pc0JpbmRpbmdzSGVscGVyLlJFUE9TSVRPUllfSU5GT19DQUNIRSk7Ci0gICAgICAgICAgICByZXBJbmZvQ2FjaGUucmVtb3ZlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFR5cGVEZWZpbml0aW9uQ2FjaGUoc2Vzc2lvbik7Ci0gICAgICAgICAgICB0eXBlRGVmQ2FjaGUucmVtb3ZlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIENtaXNTcGkgc3BpID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFNQSShzZXNzaW9uKTsKLSAgICAgICAgICAgIHNwaS5jbGVhclJlcG9zaXRvcnlDYWNoZShyZXBvc2l0b3J5SWQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2Vzc2lvbi53cml0ZVVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIGNoZWNrU2Vzc2lvbigpOwotCi0gICAgICAgIHNlc3Npb24ud3JpdGVMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbWlzU3BpIHNwaSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRTUEkoc2Vzc2lvbik7Ci0gICAgICAgICAgICBzcGkuY2xvc2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlc3Npb24ud3JpdGVVbmxvY2soKTsKLSAgICAgICAgICAgIHNlc3Npb24gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTZXNzaW9uKCkgewotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBbHJlYWR5IGNsb3NlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL0NtaXNCaW5kaW5nc0hlbHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvQ21pc0JpbmRpbmdzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzFhZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvQ21pc0JpbmRpbmdzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5UeXBlRGVmaW5pdGlvbkNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5DbWlzU3BpOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5IdHRwSW52b2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5DbGFzc0xvYWRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gb2Ygc3RhdGljIG1ldGhvZHMgdGhhdCBhcmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMgd2l0aGluIHRoZQotICogYmluZGluZ3MgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbWlzQmluZGluZ3NIZWxwZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9JTkZPX0NBQ0hFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcucmVwb3NpdG9yeUluZm9DYWNoZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERUZJTlRJT05fQ0FDSEUgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy50eXBlRGVmaW50aW9uQ2FjaGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQSV9PQkpFQ1QgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkub2JqZWN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0lOVk9LRVJfT0JKRUNUID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuaHR0cGludm9rZXIub2JqZWN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIRU5USUNBVElPTl9QUk9WSURFUl9PQkpFQ1QgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdXRoLm9iamVjdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVBUX0xBTkdVQUdFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYWNjZXB0TGFuZ3VhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkNFX0NNSVNfVkVSU0lPTiA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbWlzdmVyc2lvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgQ21pc0JpbmRpbmdzSGVscGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFNQSSBvYmplY3QgZm9yIHRoZSBnaXZlbiBzZXNzaW9uLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgU1BJCi0gICAgICogb2JqZWN0IGluIHRoZSBzZXNzaW9uIGl0IHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoZXJlIGlzIG5vIFNQSSBvYmplY3QgaXQKLSAgICAgKiB3aWxsIGJlIGNyZWF0ZWQgYW5kIHB1dCBpbnRvIHRoZSBzZXNzaW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXNzaW9uCi0gICAgICogICAgICAgICAgICB0aGUgc2Vzc2lvbiBvYmplY3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBTUEkgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzU3BpIGdldFNQSShCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGFzc2VydCBzZXNzaW9uICE9IG51bGw7Ci0KLSAgICAgICAgLy8gZmV0Y2ggZnJvbSBzZXNzaW9uCi0gICAgICAgIENtaXNTcGkgc3BpID0gKENtaXNTcGkpIHNlc3Npb24uZ2V0KFNQSV9PQkpFQ1QpOwotICAgICAgICBpZiAoc3BpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzcGk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXNzaW9uLndyaXRlTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gdHJ5IGFnYWluCi0gICAgICAgICAgICBzcGkgPSAoQ21pc1NwaSkgc2Vzc2lvbi5nZXQoU1BJX09CSkVDVCk7Ci0gICAgICAgICAgICBpZiAoc3BpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3BpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBvaywgd2UgaGF2ZSB0byBjcmVhdGUgaXQuLi4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNwaU5hbWUgPSAoU3RyaW5nKSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfU1BJX0NMQVNTKTsKLSAgICAgICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjID0gQ2xhc3NMb2FkZXJVdGlsLmxvYWRDbGFzcyhzcGlOYW1lKS5nZXRDb25zdHJ1Y3RvcihCaW5kaW5nU2Vzc2lvbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgc3BpID0gKENtaXNTcGkpIGMubmV3SW5zdGFuY2Uoc2Vzc2lvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJTUEkgY2Fubm90IGJlIGluaXRpYWxpemVkOiAiICsgaXRlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpLCBpdGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlNQSSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBTUEkgb2JqZWN0IC0+IHB1dCBpdCBpbnRvIHRoZSBzZXNzaW9uCi0gICAgICAgICAgICBzZXNzaW9uLnB1dChTUElfT0JKRUNULCBzcGksIHRydWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2Vzc2lvbi53cml0ZVVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHNwaSAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiBzcGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgSFRUUCBJbnZva2VyIG9iamVjdCBmcm9tIHRoZSBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSHR0cEludm9rZXIgZ2V0SHR0cEludm9rZXIoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotCi0gICAgICAgIEh0dHBJbnZva2VyIGludm9rZXIgPSAoSHR0cEludm9rZXIpIHNlc3Npb24uZ2V0KEhUVFBfSU5WT0tFUl9PQkpFQ1QpOwotCi0gICAgICAgIGlmIChpbnZva2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgc2Vzc2lvbi53cml0ZUxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHRyeSBhZ2FpbgotICAgICAgICAgICAgaW52b2tlciA9IChIdHRwSW52b2tlcikgc2Vzc2lvbi5nZXQoSFRUUF9JTlZPS0VSX09CSkVDVCk7Ci0gICAgICAgICAgICBpZiAoaW52b2tlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGludm9rZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9rLCB3ZSBoYXZlIHRvIGNyZWF0ZSBpdC4uLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW52b2tlck5hbWUgPSAoU3RyaW5nKSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkhUVFBfSU5WT0tFUl9DTEFTUyk7Ci0gICAgICAgICAgICAgICAgaW52b2tlciA9IChIdHRwSW52b2tlcikgQ2xhc3NMb2FkZXJVdGlsLmxvYWRDbGFzcyhpbnZva2VyTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkhUVFAgaW52b2tlciBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGhhdmUgYW4gSW52b2tlciBvYmplY3QgLT4gcHV0IGl0IGludG8gdGhlIHNlc3Npb24KLSAgICAgICAgICAgIHNlc3Npb24ucHV0KEhUVFBfSU5WT0tFUl9PQkpFQ1QsIGludm9rZXIsIHRydWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2Vzc2lvbi53cml0ZVVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGludm9rZXIgIT0gbnVsbDsKLQotICAgICAgICByZXR1cm4gaW52b2tlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgQ01JUyB2ZXJzaW9uIGlmIHRoZSB1c2VyIHNldCBvbmUsIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENtaXNWZXJzaW9uIGdldEZvcmNlZENtaXNWZXJzaW9uKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgYXNzZXJ0IHNlc3Npb24gIT0gbnVsbDsKLQotICAgICAgICByZXR1cm4gKENtaXNWZXJzaW9uKSBzZXNzaW9uLmdldChGT1JDRV9DTUlTX1ZFUlNJT04pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGZyb20gdGhlIHNlc3Npb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiBubyBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBpcyBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiAoQXV0aGVudGljYXRpb25Qcm92aWRlcikgc2Vzc2lvbi5nZXQoQVVUSEVOVElDQVRJT05fUFJPVklERVJfT0JKRUNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IGluZm8gY2FjaGUgZnJvbSB0aGUgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnlJbmZvQ2FjaGUgZ2V0UmVwb3NpdG9yeUluZm9DYWNoZShCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGFzc2VydCBzZXNzaW9uICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIChSZXBvc2l0b3J5SW5mb0NhY2hlKSBzZXNzaW9uLmdldChSRVBPU0lUT1JZX0lORk9fQ0FDSEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgZGVmaW5pdGlvbiBjYWNoZSBmcm9tIHRoZSBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb25DYWNoZSBnZXRUeXBlRGVmaW5pdGlvbkNhY2hlKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgYXNzZXJ0IHNlc3Npb24gIT0gbnVsbDsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkNhY2hlIGNhY2hlID0gKFR5cGVEZWZpbml0aW9uQ2FjaGUpIHNlc3Npb24uZ2V0KFRZUEVfREVGSU5USU9OX0NBQ0hFKTsKLQotICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlOwotICAgICAgICB9Ci0KLSAgICAgICAgc2Vzc2lvbi53cml0ZUxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHRyeSBhZ2FpbgotICAgICAgICAgICAgY2FjaGUgPSAoVHlwZURlZmluaXRpb25DYWNoZSkgc2Vzc2lvbi5nZXQoVFlQRV9ERUZJTlRJT05fQ0FDSEUpOwotICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9rLCB3ZSBoYXZlIHRvIGNyZWF0ZSBpdC4uLgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2FjaGVOYW1lID0gKFN0cmluZykgc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5UWVBFX0RFRklOSVRJT05fQ0FDSEVfQ0xBU1MpOwotICAgICAgICAgICAgICAgIGNhY2hlID0gKFR5cGVEZWZpbml0aW9uQ2FjaGUpIENsYXNzTG9hZGVyVXRpbC5sb2FkQ2xhc3MoY2FjaGVOYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIGNhY2hlLmluaXRpYWxpemUoc2Vzc2lvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJUeXBlIGRlZmluaXRpb24gY2FjaGUgY2Fubm90IGJlIGluaXRpYWxpemVkOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgY2FjaGUgb2JqZWN0IC0+IHB1dCBpdCBpbnRvIHRoZSBzZXNzaW9uCi0gICAgICAgICAgICBzZXNzaW9uLnB1dChUWVBFX0RFRklOVElPTl9DQUNIRSwgY2FjaGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2Vzc2lvbi53cml0ZVVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IGNhY2hlICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGNhY2hlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL1JlcG9zaXRvcnlJbmZvQ2FjaGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL1JlcG9zaXRvcnlJbmZvQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwOGFkNS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvaW1wbC9SZXBvc2l0b3J5SW5mb0NhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuaW1wbC5DYWNoZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuTWFwQ2FjaGVMZXZlbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotCi0vKioKLSAqIEEgY2FjaGUgZm9yIHJlcG9zaXRvcnkgaW5mbyBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUluZm9DYWNoZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgQ2FjaGUgY2FjaGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlc3Npb24gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvQ2FjaGUoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotCi0gICAgICAgIGludCByZXBDb3VudCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9SRVBPU0lUT1JJRVMsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTKTsKLSAgICAgICAgaWYgKHJlcENvdW50IDwgMSkgewotICAgICAgICAgICAgcmVwQ291bnQgPSBTZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHMuQ0FDSEVfU0laRV9SRVBPU0lUT1JJRVM7Ci0gICAgICAgIH0KLQotICAgICAgICBjYWNoZSA9IG5ldyBDYWNoZUltcGwoIlJlcG9zaXRvcnkgSW5mbyBDYWNoZSIpOwotICAgICAgICBjYWNoZS5pbml0aWFsaXplKG5ldyBTdHJpbmdbXSB7IE1hcENhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIE1hcENhY2hlTGV2ZWxJbXBsLkNBUEFDSVRZICsgIj0iCi0gICAgICAgICAgICAgICAgKyByZXBDb3VudCB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVwb3NpdG9yeSBpbmZvIG9iamVjdCB0byB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJbmZvCi0gICAgICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBpbmZvIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dChSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5SW5mbykgewotICAgICAgICBpZiAoKHJlcG9zaXRvcnlJbmZvID09IG51bGwpIHx8IChyZXBvc2l0b3J5SW5mby5nZXRJZCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYWNoZS5wdXQocmVwb3NpdG9yeUluZm8sIHJlcG9zaXRvcnlJbmZvLmdldElkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhIHJlcG9zaXRvcnkgaW5mbyBvYmplY3QgZnJvbSB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgaWQKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IGluZm8gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIG5vdCBpbiB0aGUgY2FjaGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gZ2V0KFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgcmV0dXJuIChSZXBvc2l0b3J5SW5mbykgY2FjaGUuZ2V0KHJlcG9zaXRvcnlJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHJlcG9zaXRvcnkgaW5mbyBvYmplY3QgZnJvbSB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBjYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gY2FjaGUudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvaW1wbC9SZXBvc2l0b3J5U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDAzMTNmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLlR5cGVEZWZpbml0aW9uQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkNtaXNTcGk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRXh0ZW5kZWRSZXBvc2l0b3J5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLQotLyoqCi0gKiBSZXBvc2l0b3J5IFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIFBhc3NlcyByZXF1ZXN0cyB0byB0aGUgU1BJIGFuZCBoYW5kbGVzIGNhY2hpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U2VydmljZUltcGwgaW1wbGVtZW50cyBSZXBvc2l0b3J5U2VydmljZSwgRXh0ZW5kZWRSZXBvc2l0b3J5U2VydmljZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGFzc2VydCBzZXNzaW9uICE9IG51bGw7Ci0KLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaGFzRXh0ZW5zaW9uID0gKGV4dGVuc2lvbiAhPSBudWxsKSAmJiBpc05vdEVtcHR5KGV4dGVuc2lvbi5nZXRFeHRlbnNpb25zKCkpOwotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvQ2FjaGUgY2FjaGUgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0UmVwb3NpdG9yeUluZm9DYWNoZShzZXNzaW9uKTsKLQotICAgICAgICAvLyBpZiBleHRlbnNpb24gaXMgbm90IHNldCwgY2hlY2sgdGhlIGNhY2hlIGZpcnN0Ci0gICAgICAgIGlmICghaGFzRXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBjYWNoZS5nZXQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpdCB3YXMgbm90IGluIHRoZSBjYWNoZSAtPiBnZXQgdGhlIFNQSSBhbmQgZmV0Y2ggdGhlIHJlcG9zaXRvcnkgaW5mbwotICAgICAgICBDbWlzU3BpIHNwaSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRTUEkoc2Vzc2lvbik7Ci0gICAgICAgIHJlc3VsdCA9IHNwaS5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmdldFJlcG9zaXRvcnlJbmZvKHJlcG9zaXRvcnlJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAvLyBwdXQgaXQgaW50byB0aGUgY2FjaGUKLSAgICAgICAgaWYgKCFoYXNFeHRlbnNpb24pIHsKLSAgICAgICAgICAgIGNhY2hlLnB1dChyZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBMaXN0PFJlcG9zaXRvcnlJbmZvPiByZXN1bHQgPSBudWxsOwotICAgICAgICBib29sZWFuIGhhc0V4dGVuc2lvbiA9IChleHRlbnNpb24gIT0gbnVsbCkgJiYgaXNOb3RFbXB0eShleHRlbnNpb24uZ2V0RXh0ZW5zaW9ucygpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIFNQSSBhbmQgZmV0Y2ggdGhlIHJlcG9zaXRvcnkgaW5mb3MKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXN1bHQgPSBzcGkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRSZXBvc2l0b3J5SW5mb3MoZXh0ZW5zaW9uKTsKLQotICAgICAgICAvLyBwdXQgaXQgaW50byB0aGUgY2FjaGUKLSAgICAgICAgaWYgKCFoYXNFeHRlbnNpb24gJiYgKHJlc3VsdCAhPSBudWxsKSkgewotICAgICAgICAgICAgUmVwb3NpdG9yeUluZm9DYWNoZSBjYWNoZSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRSZXBvc2l0b3J5SW5mb0NhY2hlKHNlc3Npb24pOwotICAgICAgICAgICAgZm9yIChSZXBvc2l0b3J5SW5mbyByaWQgOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBjYWNoZS5wdXQocmlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaGFzRXh0ZW5zaW9uID0gKGV4dGVuc2lvbiAhPSBudWxsKSAmJiBpc05vdEVtcHR5KGV4dGVuc2lvbi5nZXRFeHRlbnNpb25zKCkpOwotICAgICAgICBib29sZWFuIHByb3BEZWZzID0gKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID09IG51bGwgPyBmYWxzZSA6IGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLmJvb2xlYW5WYWx1ZSgpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIFNQSSBhbmQgZmV0Y2ggdGhlIHR5cGUgZGVmaW5pdGlvbnMKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXN1bHQgPSBzcGkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRUeXBlQ2hpbGRyZW4ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBtYXhJdGVtcywKLSAgICAgICAgICAgICAgICBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgLy8gcHV0IGl0IGludG8gdGhlIGNhY2hlCi0gICAgICAgIGlmICghaGFzRXh0ZW5zaW9uICYmIHByb3BEZWZzICYmIChyZXN1bHQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgY2FjaGUgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0VHlwZURlZmluaXRpb25DYWNoZShzZXNzaW9uKTsKLQotICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0ZGQgOiByZXN1bHQuZ2V0TGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGUucHV0KHJlcG9zaXRvcnlJZCwgdGRkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIGJvb2xlYW4gdXNlQ2FjaGUpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBoYXNFeHRlbnNpb24gPSAoZXh0ZW5zaW9uICE9IG51bGwpICYmIGlzTm90RW1wdHkoZXh0ZW5zaW9uLmdldEV4dGVuc2lvbnMoKSk7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25DYWNoZSBjYWNoZSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRUeXBlRGVmaW5pdGlvbkNhY2hlKHNlc3Npb24pOwotCi0gICAgICAgIC8vIGlmIHRoZSBjYWNoZSBzaG91bGQgYmUgdXNlZCBhbmQgdGhlIGV4dGVuc2lvbiBpcyBub3Qgc2V0LAotICAgICAgICAvLyBjaGVjayB0aGUgY2FjaGUgZmlyc3QKLSAgICAgICAgaWYgKHVzZUNhY2hlICYmICFoYXNFeHRlbnNpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhY2hlLmdldChyZXBvc2l0b3J5SWQsIHR5cGVJZCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaXQgd2FzIG5vdCBpbiB0aGUgY2FjaGUgLT4gZ2V0IHRoZSBTUEkgYW5kIGZldGNoIHRoZSB0eXBlIGRlZmluaXRpb24KLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXN1bHQgPSBzcGkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAvLyBwdXQgaXQgaW50byB0aGUgY2FjaGUKLSAgICAgICAgaWYgKCFoYXNFeHRlbnNpb24gJiYgKHJlc3VsdCAhPSBudWxsKSkgewotICAgICAgICAgICAgY2FjaGUucHV0KHJlcG9zaXRvcnlJZCwgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaGFzRXh0ZW5zaW9uID0gKGV4dGVuc2lvbiAhPSBudWxsKSAmJiBpc05vdEVtcHR5KGV4dGVuc2lvbi5nZXRFeHRlbnNpb25zKCkpOwotICAgICAgICBib29sZWFuIHByb3BEZWZzID0gKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID09IG51bGwgPyBmYWxzZSA6IGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLmJvb2xlYW5WYWx1ZSgpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIFNQSSBhbmQgZmV0Y2ggdGhlIHR5cGUgZGVmaW5pdGlvbnMKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICByZXN1bHQgPSBzcGkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRUeXBlRGVzY2VuZGFudHMocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGRlcHRoLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotCi0gICAgICAgIC8vIHB1dCBpdCBpbnRvIHRoZSBjYWNoZQotICAgICAgICBpZiAoIWhhc0V4dGVuc2lvbiAmJiBwcm9wRGVmcyAmJiAocmVzdWx0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNhY2hlIGNhY2hlID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFR5cGVEZWZpbml0aW9uQ2FjaGUoc2Vzc2lvbik7Ci0gICAgICAgICAgICBhZGRUb1R5cGVDYWNoZShjYWNoZSwgcmVwb3NpdG9yeUlkLCByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9UeXBlQ2FjaGUoVHlwZURlZmluaXRpb25DYWNoZSBjYWNoZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gY29udGFpbmVycykgewotICAgICAgICBpZiAoY29udGFpbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA6IGNvbnRhaW5lcnMpIHsKLSAgICAgICAgICAgIGNhY2hlLnB1dChyZXBvc2l0b3J5SWQsIGNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIGFkZFRvVHlwZUNhY2hlKGNhY2hlLCByZXBvc2l0b3J5SWQsIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBnZXQgdGhlIFNQSSBhbmQgY3JlYXRlIHRoZSB0eXBlIGRlZmluaXRpb25zCi0gICAgICAgIENtaXNTcGkgc3BpID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFNQSShzZXNzaW9uKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gc3BpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuY3JlYXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGUsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSB0eXBlIHRvIGNhY2hlCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgY2FjaGUgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0VHlwZURlZmluaXRpb25DYWNoZShzZXNzaW9uKTsKLSAgICAgICAgY2FjaGUucHV0KHJlcG9zaXRvcnlJZCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiB1cGRhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBnZXQgdGhlIFNQSSBhbmQgdXBkYXRlIHRoZSB0eXBlIGRlZmluaXRpb25zCi0gICAgICAgIENtaXNTcGkgc3BpID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFNQSShzZXNzaW9uKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gc3BpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkudXBkYXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGUsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSB0eXBlIGluIGNhY2hlCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgY2FjaGUgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0VHlwZURlZmluaXRpb25DYWNoZShzZXNzaW9uKTsKLSAgICAgICAgY2FjaGUucHV0KHJlcG9zaXRvcnlJZCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgU1BJIGFuZCBkZWxldGUgdGhlIHR5cGUgZGVmaW5pdGlvbnMKLSAgICAgICAgQ21pc1NwaSBzcGkgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pOwotICAgICAgICBzcGkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHRlbnNpb24pOwotCi0gICAgICAgIC8vIHJlbW92ZSB0aGUgdHlwZSBmcm9tIGNhY2hlCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgY2FjaGUgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0VHlwZURlZmluaXRpb25DYWNoZShzZXNzaW9uKTsKLSAgICAgICAgY2FjaGUucmVtb3ZlKHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL1Nlc3Npb25JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvaW1wbC9TZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE0ZWRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL1Nlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLQotLyoqCi0gKiBDTUlTIGJpbmRpbmcgc2Vzc2lvbiBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25JbXBsIGltcGxlbWVudHMgQmluZGluZ1Nlc3Npb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YTsKLQotICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uSW1wbCgpIHsKLSAgICAgICAgaWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwotICAgICAgICBkYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEtleXMoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhLmtleVNldCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBrZXkpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLQotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBkYXRhLmdldChrZXkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVHJhbnNpZW50V3JhcHBlcikgewotICAgICAgICAgICAgcmV0dXJuICgoVHJhbnNpZW50V3JhcHBlcikgdmFsdWUpLmdldE9iamVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBrZXksIE9iamVjdCBkZWZWYWx1ZSkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXQoa2V5KTsKLSAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsID8gZGVmVmFsdWUgOiB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXQoU3RyaW5nIGtleSwgaW50IGRlZlZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotICAgICAgICBpbnQgaW50VmFsdWUgPSBkZWZWYWx1ZTsKLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBpbnRWYWx1ZSA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50VmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIG51bWJlciAtPiByZXR1cm4gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGludFZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGdldChTdHJpbmcga2V5LCBib29sZWFuIGRlZlZhbHVlKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldChrZXkpOwotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZWZWYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgU2VyaWFsaXphYmxlIG9iaikgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGEucHV0KGtleSwgb2JqKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IG9iaiwgYm9vbGVhbiBpc1RyYW5zaWVudCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSAoaXNUcmFuc2llbnQgPyBuZXcgVHJhbnNpZW50V3JhcHBlcihvYmopIDogb2JqKTsKLSAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgbXVzdCBiZSBzZXJpYWxpemFibGUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGEucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGF0YS5yZW1vdmUoa2V5KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWFkTG9jaygpIHsKLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWFkVW5sb2NrKCkgewotICAgICAgICBsb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVMb2NrKCkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVVubG9jaygpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlc3Npb24gIiArIGlkICsgIjogIiArIGRhdGEudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvaW1wbC9UcmFuc2llbnRXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvaW1wbC9UcmFuc2llbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzY3NTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvVHJhbnNpZW50V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFdyYXBwZXIgZm9yIHRyYW5zaWVudCBvYmplY3RzIGluIGEgY2FjaGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRXcmFwcGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIHByaXZhdGUgdHJhbnNpZW50IE9iamVjdCBvYmplY3Q7Ci0KLSAgICBwdWJsaWMgVHJhbnNpZW50V3JhcHBlcihPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAob2JqZWN0ID09IG51bGwgPyAiKG5vIG9iamVjdCkiIDogIih0cmFuc2llbnQpICIgKyBvYmplY3QudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9iamVjdCA9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvVHlwZURlZmluaXRpb25DYWNoZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9pbXBsL1R5cGVEZWZpbml0aW9uQ2FjaGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2FjZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvVHlwZURlZmluaXRpb25DYWNoZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuVHlwZURlZmluaXRpb25DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuaW1wbC5DYWNoZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuTHJ1Q2FjaGVMZXZlbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuTWFwQ2FjaGVMZXZlbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBBIGNhY2hlIGZvciB0eXBlIGRlZmluaXRpb24gb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFR5cGVEZWZpbml0aW9uQ2FjaGVJbXBsIGltcGxlbWVudHMgVHlwZURlZmluaXRpb25DYWNoZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgQ2FjaGUgY2FjaGU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25DYWNoZUltcGwoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgYXNzZXJ0IHNlc3Npb24gIT0gbnVsbDsKLQotICAgICAgICBpbnQgcmVwQ291bnQgPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkNBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTLAotICAgICAgICAgICAgICAgIFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9TSVpFX1JFUE9TSVRPUklFUyk7Ci0gICAgICAgIGlmIChyZXBDb3VudCA8IDEpIHsKLSAgICAgICAgICAgIHJlcENvdW50ID0gU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHR5cGVDb3VudCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9UWVBFUywgU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfVFlQRVMpOwotICAgICAgICBpZiAodHlwZUNvdW50IDwgMSkgewotICAgICAgICAgICAgdHlwZUNvdW50ID0gU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfVFlQRVM7Ci0gICAgICAgIH0KLQotICAgICAgICBjYWNoZSA9IG5ldyBDYWNoZUltcGwoIlR5cGUgRGVmaW5pdGlvbiBDYWNoZSIpOwotICAgICAgICBjYWNoZS5pbml0aWFsaXplKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPSIgKyByZXBDb3VudCwgLy8gcmVwb3NpdG9yeQotICAgICAgICAgICAgICAgIExydUNhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIExydUNhY2hlTGV2ZWxJbXBsLk1BWF9FTlRSSUVTICsgIj0iICsgdHlwZUNvdW50IC8vIHR5cGUKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0KFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgIGlmICgodHlwZURlZmluaXRpb24gPT0gbnVsbCkgfHwgKHR5cGVEZWZpbml0aW9uLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhY2hlLnB1dCh0eXBlRGVmaW5pdGlvbiwgcmVwb3NpdG9yeUlkLCB0eXBlRGVmaW5pdGlvbi5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgcmV0dXJuIChUeXBlRGVmaW5pdGlvbikgY2FjaGUuZ2V0KHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBjYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkLCB0eXBlSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIGNhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLSAgICAgICAgY2FjaGUucmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGNhY2hlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL0Fic3RyYWN0QXV0aGVudGljYXRpb25Qcm92aWRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9BYnN0cmFjdEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxNjBhZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL0Fic3RyYWN0QXV0aGVudGljYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQXV0aGVudGljYXRpb24gcHJvdmlkZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBTZXNzaW9uQXdhcmVBdXRoZW50aWNhdGlvblByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUge0BsaW5rIEJpbmRpbmdTZXNzaW9ufSB0aGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgbGl2ZXMgaW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbihCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGxpbmsgQmluZGluZ1Nlc3Npb259LgotICAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRIVFRQSGVhZGVycyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldFNPQVBIZWFkZXJzKE9iamVjdCBwb3J0T2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBIYW5kbGVyUmVzb2x2ZXIgZ2V0SGFuZGxlclJlc29sdmVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRSZXNwb25zZUhlYWRlcnMoU3RyaW5nIHVybCwgaW50IHN0YXR1c0NvZGUsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycykgewotICAgIH0KLQotICAgIHB1YmxpYyBTU0xTb2NrZXRGYWN0b3J5IGdldFNTTFNvY2tldEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBIb3N0bmFtZVZlcmlmaWVyIGdldEhvc3RuYW1lVmVyaWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVzZXIgbmFtZSBmcm9tIHRoZSBzZXNzaW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVzZXIgbmFtZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHVzZXIgbmFtZSBpcyBub3Qgc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VyKCkgewotICAgICAgICBPYmplY3QgdXNlck9iamVjdCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSKTsKLSAgICAgICAgaWYgKHVzZXJPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSB1c2VyT2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXNzd29yZCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhc3N3b3JkIGlzIG5vdCBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICBPYmplY3QgcGFzc3dvcmRPYmplY3QgPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUEFTU1dPUkQpOwotICAgICAgICBpZiAocGFzc3dvcmRPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBwYXNzd29yZE9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJlYXJlciB0b2tlbiBmcm9tIHRoZSBzZXNzaW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJlYXJlciB0b2tlbiBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHRva2VuIGlzIG5vdCBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJlYXJlclRva2VuKCkgewotICAgICAgICBPYmplY3QgdG9rZW5PYmplY3QgPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQUNDRVNTX1RPS0VOKTsKLSAgICAgICAgaWYgKHRva2VuT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgdG9rZW5PYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm94eSB1c2VyIG5hbWUgZnJvbSB0aGUgc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm94eSB1c2VyIG5hbWUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB1c2VyIG5hbWUgaXMgbm90IHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJveHlVc2VyKCkgewotICAgICAgICBPYmplY3QgdXNlck9iamVjdCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5QUk9YWV9VU0VSKTsKLSAgICAgICAgaWYgKHVzZXJPYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSB1c2VyT2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJveHkgcGFzc3dvcmQgZnJvbSB0aGUgc2Vzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm94eSBwYXNzd29yZCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhc3N3b3JkIGlzIG5vdCBzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3h5UGFzc3dvcmQoKSB7Ci0gICAgICAgIE9iamVjdCBwYXNzd29yZE9iamVjdCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5QUk9YWV9QQVNTV09SRCk7Ci0gICAgICAgIGlmIChwYXNzd29yZE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHBhc3N3b3JkT2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9CaW5kaW5nU2Vzc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9CaW5kaW5nU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDY2MTVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvQmluZGluZ1Nlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogQ01JUyBwcm92aWRlciBzZXNzaW9uIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nU2Vzc2lvbiBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGlzIHNlc3Npb24uCi0gICAgICovCi0gICAgU3RyaW5nIGdldFNlc3Npb25JZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwga2V5cy4KLSAgICAgKi8KLSAgICBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0S2V5cygpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHNlc3Npb24gdmFsdWUuCi0gICAgICovCi0gICAgT2JqZWN0IGdldChTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXNzaW9uIHZhbHVlIG9yIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBrZXkgZG9lc24ndCBleGlzdC4KLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0KFN0cmluZyBrZXksIE9iamVjdCBkZWZWYWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2Vzc2lvbiB2YWx1ZSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QuCi0gICAgICovCi0gICAgaW50IGdldChTdHJpbmcga2V5LCBpbnQgZGVmVmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHNlc3Npb24gdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0LgotICAgICAqLwotICAgIGJvb2xlYW4gZ2V0KFN0cmluZyBrZXksIGJvb2xlYW4gZGVmVmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5vbi10cmFuc2llbnQgc2Vzc2lvbiB2YWx1ZS4KLSAgICAgKi8KLSAgICB2b2lkIHB1dChTdHJpbmcga2V5LCBTZXJpYWxpemFibGUgb2JqZWN0KTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzZXNzaW9uIHZhbHVlLgotICAgICAqLwotICAgIHZvaWQgcHV0KFN0cmluZyBrZXksIE9iamVjdCBvYmplY3QsIGJvb2xlYW4gaXNUcmFuc2llbnQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHNlc3Npb24gdmFsdWUuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmUoU3RyaW5nIGtleSk7Ci0KLSAgICAvKioKLSAgICAgKiBBY3F1aXJlcyBhIHJlYWQgbG9jay4KLSAgICAgKi8KLSAgICB2b2lkIHJlYWRMb2NrKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyBhIHJlYWQgbG9jay4KLSAgICAgKi8KLSAgICB2b2lkIHJlYWRVbmxvY2soKTsKLQotICAgIC8qKgotICAgICAqIEFjcXVpcmVzIGEgd3JpdGUgbG9jay4KLSAgICAgKi8KLSAgICB2b2lkIHdyaXRlTG9jaygpOwotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgYSB3cml0ZSBsb2NrLgotICAgICAqLwotICAgIHZvaWQgd3JpdGVVbmxvY2soKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvQ21pc1NwaS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9DbWlzU3BpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOTAxYWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9DbWlzU3BpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkFjbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRGlzY292ZXJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Qb2xpY3lTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuVmVyc2lvbmluZ1NlcnZpY2U7Ci0KLS8qKgotICogQ01JUyBTUEkgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENtaXNTcGkgewotICAgIC8qKgotICAgICAqIEdldHMgYSBSZXBvc2l0b3J5IFNlcnZpY2UgaW50ZXJmYWNlIG9iamVjdC4KLSAgICAgKi8KLSAgICBSZXBvc2l0b3J5U2VydmljZSBnZXRSZXBvc2l0b3J5U2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIE5hdmlnYXRpb24gU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIE5hdmlnYXRpb25TZXJ2aWNlIGdldE5hdmlnYXRpb25TZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIE9iamVjdCBTZXJ2aWNlIGludGVyZmFjZSBvYmplY3QuCi0gICAgICovCi0gICAgT2JqZWN0U2VydmljZSBnZXRPYmplY3RTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgVmVyc2lvbmluZyBTZXJ2aWNlIGludGVyZmFjZSBvYmplY3QuCi0gICAgICovCi0gICAgVmVyc2lvbmluZ1NlcnZpY2UgZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBSZWxhdGlvbnNoaXAgU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIFJlbGF0aW9uc2hpcFNlcnZpY2UgZ2V0UmVsYXRpb25zaGlwU2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIERpc2NvdmVyeSBTZXJ2aWNlIGludGVyZmFjZSBvYmplY3QuCi0gICAgICovCi0gICAgRGlzY292ZXJ5U2VydmljZSBnZXREaXNjb3ZlcnlTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgTXVsdGlmaWxpbmcgU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIE11bHRpRmlsaW5nU2VydmljZSBnZXRNdWx0aUZpbGluZ1NlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gQUNMIFNlcnZpY2UgaW50ZXJmYWNlIG9iamVjdC4KLSAgICAgKi8KLSAgICBBY2xTZXJ2aWNlIGdldEFjbFNlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBQb2xpY3kgU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIFBvbGljeVNlcnZpY2UgZ2V0UG9saWN5U2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIGFsbCBjYWNoZXMgb2YgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyQWxsQ2FjaGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgYWxsIGNhY2hlcyBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIGdpdmVuCi0gICAgICogcmVwb3NpdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBpZAotICAgICAqLwotICAgIHZvaWQgY2xlYXJSZXBvc2l0b3J5Q2FjaGUoU3RyaW5nIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGFzc2lnbmVkIHRvIHRoaXMgU1BJIGluc3RhbmNlLgotICAgICAqLwotICAgIHZvaWQgY2xvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvTFRQQVdTU2VjdXJpdHlBdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL0xUUEFXU1NlY3VyaXR5QXV0aGVudGljYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTA4ODE0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvTFRQQVdTU2VjdXJpdHlBdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNsYXNzTG9hZGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTFRQQVdTU2VjdXJpdHlBdXRoZW50aWNhdGlvblByb3ZpZGVyIGV4dGVuZHMgU3RhbmRhcmRBdXRoZW50aWNhdGlvblByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExUUEFXU1NlY3VyaXR5QXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcyk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRWxlbWVudCBnZXRTT0FQSGVhZGVycyhPYmplY3QgcG9ydE9iamVjdCkgewotCi0gICAgICAgIFN0cmluZyBzZWN1cml0eVRva2VuID0gZ2V0U2VjdXJpdHlUb2tlbigpOwotCi0gICAgICAgIC8vIEV4aXQgaWYgbm8gc2VjdXJpdHkgdG9rZW4gZm91bmQKLSAgICAgICAgaWYgKHNlY3VyaXR5VG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJzZWN1cml0eVRva2VuIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRpbWUKLSAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzJ1onIik7Ci0gICAgICAgIHNkZi5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOwotICAgICAgICBsb25nIGNyZWF0ZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbG9uZyBleHBpcmVzID0gY3JlYXRlZCArIDI0ICogNjAgKiA2MCAqIDEwMDA7IC8vIDI0IGhvdXJzCi0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBTT0FQIFdTU2VjdXJpdHkgaGVhZGVyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWxzLm5ld0RvbURvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgd3NzZVNlY3VyaXR5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhXU1NFX05BTUVTUEFDRSwgIlNlY3VyaXR5Iik7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgd3N1VGltZXN0YW1wRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhXU1VfTkFNRVNQQUNFLCAiVGltZXN0YW1wIik7Ci0gICAgICAgICAgICB3c3NlU2VjdXJpdHlFbGVtZW50LmFwcGVuZENoaWxkKHdzdVRpbWVzdGFtcEVsZW1lbnQpOwotCi0gICAgICAgICAgICBFbGVtZW50IHRzQ3JlYXRlZEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoV1NVX05BTUVTUEFDRSwgIkNyZWF0ZWQiKTsKLSAgICAgICAgICAgIHRzQ3JlYXRlZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc2RmLmZvcm1hdChjcmVhdGVkKSkpOwotICAgICAgICAgICAgd3N1VGltZXN0YW1wRWxlbWVudC5hcHBlbmRDaGlsZCh0c0NyZWF0ZWRFbGVtZW50KTsKLQotICAgICAgICAgICAgRWxlbWVudCB0c0V4cGlyZXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTVV9OQU1FU1BBQ0UsICJFeHBpcmVzIik7Ci0gICAgICAgICAgICB0c0V4cGlyZXNFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNkZi5mb3JtYXQoZXhwaXJlcykpKTsKLSAgICAgICAgICAgIHdzdVRpbWVzdGFtcEVsZW1lbnQuYXBwZW5kQ2hpbGQodHNFeHBpcmVzRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgQmluYXJ5U2VjdXJpdHlUb2tlbiAoY29udGFpbnMgdGhlIExUUEF2MiB0b2tlbikKLSAgICAgICAgICAgIEVsZW1lbnQgd3NzZUJpbmFyeVNlY3VyaXR5VG9rZW5FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTU0VfTkFNRVNQQUNFLCAiQmluYXJ5U2VjdXJpdHlUb2tlbiIpOwotICAgICAgICAgICAgd3NzZUJpbmFyeVNlY3VyaXR5VG9rZW5FbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6d3N1IiwgV1NVX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICB3c3NlQmluYXJ5U2VjdXJpdHlUb2tlbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczp3c3N0IiwKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3Rva2VudHlwZSIpOwotICAgICAgICAgICAgd3NzZUJpbmFyeVNlY3VyaXR5VG9rZW5FbGVtZW50LnNldEF0dHJpYnV0ZSgid3N1OklkIiwgImx0cGFfMjAiKTsKLSAgICAgICAgICAgIHdzc2VCaW5hcnlTZWN1cml0eVRva2VuRWxlbWVudC5zZXRBdHRyaWJ1dGUoIlZhbHVlVHlwZSIsICJ3c3N0OkxUUEF2MiIpOwotICAgICAgICAgICAgd3NzZUJpbmFyeVNlY3VyaXR5VG9rZW5FbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHNlY3VyaXR5VG9rZW4pKTsKLQotICAgICAgICAgICAgLy8gQXBwZW5kIEJpbmFyeVNlY3VyaXR5VG9rZW4gdG8gU2VjdXJpdHkgc2VjdGlvbgotICAgICAgICAgICAgd3NzZVNlY3VyaXR5RWxlbWVudC5hcHBlbmRDaGlsZCh3c3NlQmluYXJ5U2VjdXJpdHlUb2tlbkVsZW1lbnQpOwotCi0gICAgICAgICAgICByZXR1cm4gd3NzZVNlY3VyaXR5RWxlbWVudDsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzaG91bGRuJ3QgaGFwcGVuLi4uCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBidWlsZCBTT0FQIGhlYWRlcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlY3VyaXR5VG9rZW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzczw/PiB3c1N1YmplY3RDbGFzcyA9IENsYXNzTG9hZGVyVXRpbC5sb2FkQ2xhc3MoImNvbS5pYm0ud2Vic3BoZXJlLnNlY3VyaXR5LmF1dGguV1NTdWJqZWN0Iik7Ci0gICAgICAgICAgICBDbGFzczw/PiB3c0NyZWRlbnRpYWxDbGFzcyA9IENsYXNzTG9hZGVyVXRpbC5sb2FkQ2xhc3MoImNvbS5pYm0ud2Vic3BoZXJlLnNlY3VyaXR5LmNyZWQuV1NDcmVkZW50aWFsIik7Ci0KLSAgICAgICAgICAgIC8vIEdldCBjdXJyZW50IHNlY3VyaXR5IHN1YmplY3QKLSAgICAgICAgICAgIE1ldGhvZCBtID0gd3NTdWJqZWN0Q2xhc3MuZ2V0TWV0aG9kKCJnZXRSdW5Bc1N1YmplY3QiLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICAgICAgU3ViamVjdCBzZWN1cml0eVN1YmplY3QgPSAoU3ViamVjdCkgbS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgICAgICBpZiAoc2VjdXJpdHlTdWJqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHNlY3VyaXR5IGNyZWRlbnRpYWxzIGZyb20gdGhlIHNlY3VyaXR5IHN1YmplY3QKLSAgICAgICAgICAgICAgICBTZXQ8Pz4gc2VjdXJpdHlDcmVkZW50aWFscyA9IHNlY3VyaXR5U3ViamVjdC5nZXRQdWJsaWNDcmVkZW50aWFscyh3c0NyZWRlbnRpYWxDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IGNyZWRlbnRpYWwKLSAgICAgICAgICAgICAgICBPYmplY3Qgc2VjdXJpdHlDcmVkZW50aWFsID0gc2VjdXJpdHlDcmVkZW50aWFscy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXNlciA9IGludm9rZVNlY3VyaXR5Q3JlZGVudGlhbE1ldGhvZCh3c0NyZWRlbnRpYWxDbGFzcywgc2VjdXJpdHlDcmVkZW50aWFsLCAiZ2V0U2VjdXJpdHlOYW1lIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAodXNlci5lcXVhbHNJZ25vcmVDYXNlKCJVTkFVVEhFTlRJQ0FURUQiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiVXNlciA9IFVOQVVUSEVOVElDQVRFRCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJ5dGVbXSB0b2tlbiA9IGludm9rZVNlY3VyaXR5Q3JlZGVudGlhbE1ldGhvZCh3c0NyZWRlbnRpYWxDbGFzcywgc2VjdXJpdHlDcmVkZW50aWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgImdldENyZWRlbnRpYWxUb2tlbiIpOwotICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjQuZW5jb2RlQnl0ZXModG9rZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgYnVpbGQgU09BUCBoZWFkZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIDxUPiBUIGludm9rZVNlY3VyaXR5Q3JlZGVudGlhbE1ldGhvZChDbGFzczw/PiBjcmVkZW50aWFsQ2xhc3MsIE9iamVjdCBzZWN1cml0eUNyZWRlbnRpYWwsIFN0cmluZyBtZXRob2ROYW1lKQotICAgICAgICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZCBtID0gY3JlZGVudGlhbENsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICByZXR1cm4gKFQpIG0uaW52b2tlKHNlY3VyaXR5Q3JlZGVudGlhbCwgbmV3IE9iamVjdFswXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2VuZEJhc2ljQXV0aCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFNlbmRVc2VybmFtZVRva2VuKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9MaW5rQWNjZXNzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL0xpbmtBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNGRjNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL0xpbmtBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpOwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byBpbnRlcm5hbCBsaW5rcy4gSXQgYnlwYXNzZXMgdGhlIENNSVMgZG9tYWluIG1vZGVsLiBVc2UKLSAqIHdpdGggY2FyZSEKLSAqLwotcHVibGljIGludGVyZmFjZSBMaW5rQWNjZXNzIHsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBsaW5rIGZyb20gdGhlIGNhY2hlIGlmIGl0IGlzIHRoZXJlIG9yIGxvYWRzIGl0IGludG8gdGhlIGNhY2hlIGlmCi0gICAgICogaXQgaXMgbm90IHRoZXJlLgotICAgICAqLwotICAgIFN0cmluZyBsb2FkTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgbGluayBmcm9tIHRoZSBjYWNoZSBpZiBpdCBpcyB0aGVyZSBvciBsb2FkcyBpdCBpbnRvIHRoZQotICAgICAqIGNhY2hlIGlmIGl0IGlzIG5vdCB0aGVyZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgbG9hZENvbnRlbnRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBkb2N1bWVudElkKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSByZW5kaXRpb24gY29udGVudCBsaW5rIGZyb20gdGhlIGNhY2hlIGlmIGl0IGlzIHRoZXJlIG9yIGxvYWRzIGl0Ci0gICAgICogaW50byB0aGUgY2FjaGUgaWYgaXQgaXMgbm90IHRoZXJlLgotICAgICAqLwotICAgIFN0cmluZyBsb2FkUmVuZGl0aW9uQ29udGVudExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGRvY3VtZW50SWQsIFN0cmluZyBzdHJlYW1JZCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL05UTE1BdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL05UTE1BdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZGU0NDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9OVExNQXV0aGVudGljYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpOwotCi1pbXBvcnQgamF2YS5uZXQuQXV0aGVudGljYXRvcjsKLWltcG9ydCBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIE5UTE0gYXV0aGVudGljYXRpb24gcHJvdmlkZXIgY2xhc3MuIFVTRSBXSVRIIENBUkUhCi0gKiAKLSAqIFRoaXMgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgc2V0cyBhIHtAbGluayBqYXZhLm5ldC5BdXRoZW50aWNhdG9yfSB3aGljaCB3aWxsCi0gKiByZXBsYWNlIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0b3IsIGlmIGFueS4gSXQgd2lsbCBmYWlsIGlmIHRoaXMgYXV0aGVudGljYXRvcgotICogd2lsbCBiZSByZXBsYWNlZCBieSBhbm90aGVyIHBhcnQgb2YgdGhlIGNvZGUuCi0gKiAKLSAqIFNpbmNlIHtAbGluayBqYXZhLm5ldC5BdXRoZW50aWNhdG9yfSBpcyBhIHN5c3RlbS13aWRlIGF1dGhlbnRpY2F0b3IsIGl0IHdpbGwKLSAqIG5vdCByZWxpYWJseSB3b3JrIGluIG11bHRpLXVzZXIgZW52aXJvbm1lbnRzISBUbyBhY2hpZXZlIHRoYXQgeW91IGhhdmUgdG8KLSAqIHdyYXAgT3BlbkNNSVMgaW50byBpdHMgb3duIGNsYXNzIGxvYWRlci4KLSAqLwotcHVibGljIGNsYXNzIE5UTE1BdXRoZW50aWNhdGlvblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBdXRoZW50aWNhdGlvblByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLy8gamF2YS5uZXQuQXV0aGVudGljYXRvciBpcyBzdGF0aWMsIHNvIHRoaXMgY2FuIGJlIHN0YXRpYyB0b28KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPcGVuQ01JU0F1dGhlbnRpY2F0b3IgQVVUSEVOVElDQVRPUiA9IG5ldyBPcGVuQ01JU0F1dGhlbnRpY2F0b3IoKTsKLSAgICBzdGF0aWMgewotICAgICAgICBBdXRoZW50aWNhdG9yLnNldERlZmF1bHQoQVVUSEVOVElDQVRPUik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SFRUUEhlYWRlcnMoU3RyaW5nIHVybCkgewotICAgICAgICAvLyBnZXQgdXNlciBhbmQgcGFzc3dvcmQKLSAgICAgICAgU3RyaW5nIHVzZXIgPSBnZXRVc2VyKCk7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGdldFBhc3N3b3JkKCk7Ci0KLSAgICAgICAgLy8gaWYgbm8gdXNlciBpcyBzZXQsIHJlc2V0IHRoZSBhdXRoZW50aWNhdG9yCi0gICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIEFVVEhFTlRJQ0FUT1IucmVzZXQoKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhc3N3b3JkID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdXNlciBhbmQgcGFzc3dvcmQKLSAgICAgICAgQVVUSEVOVElDQVRPUi5zZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKHVzZXIsIHBhc3N3b3JkKTsKLQotICAgICAgICAvLyBPcGVuQ01JUyBpcyBub3QgaW4gY2hhcmdlIG9mIHRoZSBhdXRoZW50aWNhdGlvbgotICAgICAgICAvLyAtPiBubyBIVFRQIGhlYWRlciB0byBzZXQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0U09BUEhlYWRlcnMoT2JqZWN0IHBvcnRPYmplY3QpIHsKLSAgICAgICAgLy8gbm8gU09BUCBoZWFkZXJzIHRvIHNldAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVuQ01JUyBBdXRoZW50aWNhdG9yIGNsYXNzLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBPcGVuQ01JU0F1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBdXRoZW50aWNhdG9yIHsKLQotICAgICAgICBwcml2YXRlIFBhc3N3b3JkQXV0aGVudGljYXRpb24gcGFzc3dvcmRBdXRoZW50aWNhdGlvbjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVzZXRzIHRoZSB1c2VyIGFuZCBwYXNzd29yZC4gVGhlIG5leHQgcmVxdWVzdCB3aWxsIG5vdCBiZQotICAgICAgICAgKiBhdXRoZW50aWNhdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewotICAgICAgICAgICAgcGFzc3dvcmRBdXRoZW50aWNhdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIG5ldyB1c2VyIGFuZCBwYXNzd29yZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgICAgIHBhc3N3b3JkQXV0aGVudGljYXRpb24gPSBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvbih1c2VyLCBwYXNzd29yZC50b0NoYXJBcnJheSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIFBhc3N3b3JkQXV0aGVudGljYXRpb24gZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9PQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvT0F1dGhBdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOGQ5ZDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9PQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNsaWVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLnBhcnNlci5KU09OUGFyc2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogT0F1dGggMi4wIEF1dGhlbnRpY2F0aW9uIFByb3ZpZGVyLgotICogPHA+Ci0gKiBUaGlzIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGltcGxlbWVudHMgT0F1dGggMi4wIChSRkMgNjc0OSkgQmVhcmVyIFRva2VucwotICogKFJGQyA2NzUwKS4KLSAqIDxwPgotICogVGhlIHByb3ZpZGVyIGNhbiBiZSBlaXRoZXIgY29uZmlndXJlZCB3aXRoIGFuIGF1dGhvcml6YXRpb24gY29kZSBvciB3aXRoIGFuCi0gKiBleGlzdGluZyBiZWFyZXIgdG9rZW4uIFRva2VuIGVuZHBvaW50IGFuZCBjbGllbnQgSUQgYXJlIGFsd2F5cyByZXF1aXJlZC4gSWYgYQotICogY2xpZW50IHNlY3JldCBpcyByZXF1aXJlZCBkZXBlbmRzIG9uIHRoZSBhdXRob3JpemF0aW9uIHNlcnZlci4KLSAqIDxwPgotICogQ29uZmlndXJhdGlvbiB3aXRoIGF1dGhvcml6YXRpb24gY29kZToKLSAqIAotICogPHByZT4KLSAqIFNlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSAuLi4KLSAqIAotICogTWFwJmx0O1N0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXIgPSBuZXcgSGFzaE1hcCZsdDtTdHJpbmcsIFN0cmluZz4oKTsKLSAqIAotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFUT01QVUJfVVJMLCAiaHR0cDovL2xvY2FsaG9zdC9jbWlzL2F0b20iKTsKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUsIEJpbmRpbmdUeXBlLkFUT01QVUIudmFsdWUoKSk7Ci0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9JRCwgIm15UmVwb3NpdG9yeSIpOwotICogCi0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSEVOVElDQVRJT05fUFJPVklERVJfQ0xBU1MsICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLk9BdXRoQXV0aGVudGljYXRpb25Qcm92aWRlciIpOwotICogCi0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfVE9LRU5fRU5EUE9JTlQsICJodHRwczovL2V4YW1wbGUuY29tL2F1dGgvb2F1dGgvdG9rZW4iKTsKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9DTElFTlRfSUQsICJzNkJoZFJrcXQzIik7Ci0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQ0xJRU5UX1NFQ1JFVCwgIjdGamZwMFpCcjFLdERSYm5mVmRtSXciKTsKLSAqIAotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0NPREUsICJhYmMiKTsKLSAqIAotICogLi4uCi0gKiBTZXNzaW9uIHNlc3Npb24gPSBmYWN0b3J5LmNyZWF0ZVNlc3Npb24ocGFyYW1ldGVyKTsKLSAqIDwvcHJlPgotICogCi0gKiA8cD4KLSAqIENvbmZpZ3VyYXRpb24gd2l0aCBleGlzdGluZyBiZWFyZXIgdG9rZW46Ci0gKiAKLSAqIDxwcmU+Ci0gKiBTZXNzaW9uRmFjdG9yeSBmYWN0b3J5ID0gLi4uCi0gKiAKLSAqIE1hcCZsdDtTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyID0gbmV3IEhhc2hNYXAmbHQ7U3RyaW5nLCBTdHJpbmc+KCk7Ci0gKiAKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCwgImh0dHA6Ly9sb2NhbGhvc3QvY21pcy9hdG9tIik7Ci0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFLCBCaW5kaW5nVHlwZS5BVE9NUFVCLnZhbHVlKCkpOwotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQsICJteVJlcG9zaXRvcnkiKTsKLSAqIAotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTLCAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5PQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIiKTsKLSAqICAKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9UT0tFTl9FTkRQT0lOVCwgImh0dHBzOi8vZXhhbXBsZS5jb20vYXV0aC9vYXV0aC90b2tlbiIpOwotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0NMSUVOVF9JRCwgInM2QmhkUmtxdDMiKTsKLSAqIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9DTElFTlRfU0VDUkVULCAiN0ZqZnAwWkJyMUt0RFJibmZWZG1JdyIpOwotICogCi0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQUNDRVNTX1RPS0VOLCAiMllvdG5GWkZFanIxekNzaWNNV3BBQSIpOwotICogcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX1JFRlJFU0hfVE9LRU4sICJ0R3p2M0pPa0YwWEc1UXgyVGxLV0lBIik7Ci0gKiBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfRVhQSVJBVElPTl9USU1FU1RBTVAsICIxMzg4MjM3MDc1MTI3Iik7Ci0gKiAKLSAqIC4uLgotICogU2Vzc2lvbiBzZXNzaW9uID0gZmFjdG9yeS5jcmVhdGVTZXNzaW9uKHBhcmFtZXRlcik7Ci0gKiA8L3ByZT4KLSAqIAotICogPHA+Ci0gKiBHZXR0aW5nIHRva2VucyBhdCBydW50aW1lOgotICogCi0gKiA8cHJlPgotICogT0F1dGhBdXRoZW50aWNhdGlvblByb3ZpZGVyIGF1dGhQcm92aWRlciA9IChPQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIpIHNlc3Npb24uZ2V0QmluZGluZygpCi0gKiAgICAgICAgIC5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCk7Ci0gKiAKLSAqIC8vIGdldCB0aGUgY3VycmVudCB0b2tlbgotICogVG9rZW4gdG9rZW4gPSBhdXRoUHJvdmlkZXIuZ2V0VG9rZW4oKTsKLSAqIAotICogLy8gbGlzdGVuIGZvciB0b2tlbiByZWZyZXNoZXMKLSAqIGF1dGhQcm92aWRlci5hZGRUb2tlbkxpc3RlbmVyKG5ldyBPQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuVG9rZW5MaXN0ZW5lcigpIHsKLSAqICAgICBwdWJsaWMgdm9pZCB0b2tlblJlZnJlc2hlZChUb2tlbiB0b2tlbikgewotICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgbmV3IHRva2VuCi0gKiAgICAgfQotICogfSk7Ci0gKiA8L3ByZT4KLSAqIAotICogPHA+Ci0gKiBPQXV0aCBlcnJvcnMgY2FuIGJlIGhhbmRsZWQgbGlrZSB0aGlzOgotICogCi0gKiA8cHJlPgotICogIHRyeSB7Ci0gKiAgICAgIC4uLgotICogICAgICAvLyBDTUlTIGNhbGxzCi0gKiAgICAgIC4uLgotICogIH0gY2F0Y2ggKENtaXNDb25uZWN0aW9uRXhjZXB0aW9uIGNvbm5FeCkgewotICogICAgICBpZiAoY29ubkV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBDbWlzT0F1dGhFeGNlcHRpb24pIHsKLSAqICAgICAgICAgIENtaXNPQXV0aEV4Y2VwdGlvbiBvYXV0aEV4ID0gKENtaXNPQXV0aEV4Y2VwdGlvbikgY29ubkV4LmdldENhdXNlKCk7Ci0gKiAKLSAqICAgICAgICAgIGlmIChDbWlzT0F1dGhFeGNlcHRpb24uRVJST1JfSU5WQUxJRF9HUkFOVC5lcXVhbHMob2F1dGhFeC5nZXRFcnJvcigpKSB8fAotICogICAgICAgICAgICAgIENtaXNPQXV0aEV4Y2VwdGlvbi5FUlJPUl9JTlZBTElEX1RPS0VOLmVxdWFscyhvYXV0aEV4LmdldEVycm9yKCkpKSB7Ci0gKiAgICAgICAgICAgICAgLy8gYXNrIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbgotICogICAgICAgICAgfSBlbHNlIHsKLSAqICAgICAgICAgICAgIC8vIGEgY29uZmlndXJhdGlvbiBvciBzZXJ2ZXIgcHJvYmxlbQotICogICAgICAgICAgfQotICogICAgfQotICogfQotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBPQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgZXh0ZW5kcyBTdGFuZGFyZEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9BdXRoQXV0aGVudGljYXRpb25Qcm92aWRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKLQotICAgIHByaXZhdGUgVG9rZW4gdG9rZW4gPSBudWxsOwotICAgIHByaXZhdGUgbG9uZyBkZWZhdWx0VG9rZW5MaWZldGltZSA9IDM2MDA7Ci0gICAgcHJpdmF0ZSBMaXN0PFRva2VuTGlzdGVuZXI+IHRva2VuTGlzdGVuZXJzOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbihCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHN1cGVyLnNldFNlc3Npb24oc2Vzc2lvbik7Ci0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGdldCBwcmVkZWZpbmVkIGFjY2VzcyB0b2tlbgotICAgICAgICAgICAgU3RyaW5nIGFjY2Vzc1Rva2VuID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0FDQ0VTU19UT0tFTikgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbiA9IChTdHJpbmcpIHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfQUNDRVNTX1RPS0VOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHByZWRlZmluZWQgcmVmcmVzaCB0b2tlbgotICAgICAgICAgICAgU3RyaW5nIHJlZnJlc2hUb2tlbiA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9SRUZSRVNIX1RPS0VOKSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIHJlZnJlc2hUb2tlbiA9IChTdHJpbmcpIHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfUkVGUkVTSF9UT0tFTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCBwcmVkZWZpbmVkIGV4cGlyYXRpb24gdGltZXN0YW1wCi0gICAgICAgICAgICBsb25nIGV4cGlyYXRpb25UaW1lc3RhbXAgPSAwOwotICAgICAgICAgICAgaWYgKHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfRVhQSVJBVElPTl9USU1FU1RBTVApIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvblRpbWVzdGFtcCA9IExvbmcucGFyc2VMb25nKChTdHJpbmcpIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfRVhQSVJBVElPTl9USU1FU1RBTVApKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9FWFBJUkFUSU9OX1RJTUVTVEFNUCkgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICBleHBpcmF0aW9uVGltZXN0YW1wID0gKChOdW1iZXIpIHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfRVhQSVJBVElPTl9USU1FU1RBTVApKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IGRlZmF1bHQgdG9rZW4gbGlmZXRpbWUKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0RFRkFVTFRfVE9LRU5fTElGRVRJTUUpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRva2VuTGlmZXRpbWUgPSBMb25nLnBhcnNlTG9uZygoU3RyaW5nKSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0RFRkFVTFRfVE9LRU5fTElGRVRJTUUpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9ERUZBVUxUX1RPS0VOX0xJRkVUSU1FKSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgICAgIGRlZmF1bHRUb2tlbkxpZmV0aW1lID0gKChOdW1iZXIpIHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0FVVEhfREVGQVVMVF9UT0tFTl9MSUZFVElNRSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRva2VuID0gbmV3IFRva2VuKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIGV4cGlyYXRpb25UaW1lc3RhbXApOwotICAgICAgICAgICAgZmlyZVRva2VuTGlzdG5lcih0b2tlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRIVFRQSGVhZGVycyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycyA9IHN1cGVyLmdldEhUVFBIZWFkZXJzKHVybCk7Ci0gICAgICAgIGlmIChoZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGhlYWRlcnMucHV0KCJBdXRob3JpemF0aW9uIiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiQmVhcmVyICIgKyBnZXRBY2Nlc3NUb2tlbigpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGhlYWRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB0b2tlbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRva2VuCi0gICAgICovCi0gICAgcHVibGljIFRva2VuIGdldFRva2VuKCkgewotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHRva2VuIGxpc3RlbmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0bmVyCi0gICAgICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkVG9rZW5MaXN0ZW5lcihUb2tlbkxpc3RlbmVyIGxpc3RuZXIpIHsKLSAgICAgICAgaWYgKGxpc3RuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAodG9rZW5MaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRva2VuTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxPQXV0aEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuVG9rZW5MaXN0ZW5lcj4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG9rZW5MaXN0ZW5lcnMuYWRkKGxpc3RuZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSB0b2tlbiBsaXN0ZW5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdG5lcgotICAgICAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVRva2VuTGlzdGVuZXIoVG9rZW5MaXN0ZW5lciBsaXN0bmVyKSB7Ci0gICAgICAgIGlmIChsaXN0bmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRva2VuTGlzdGVuZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0b2tlbkxpc3RlbmVycy5yZW1vdmUobGlzdG5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGV0cyBhbGwgdG9rZW4gbGlzdGVuZXJzIGtub3cgdGhhdCB0aGVyZSBpcyBhIG5ldyB0b2tlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlVG9rZW5MaXN0bmVyKFRva2VuIHRva2VuKSB7Ci0gICAgICAgIGlmICh0b2tlbkxpc3RlbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFRva2VuTGlzdGVuZXIgbGlzdG5lciA6IHRva2VuTGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICBsaXN0bmVyLnRva2VuUmVmcmVzaGVkKHRva2VuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFNlbmRCZWFyZXJUb2tlbigpIHsKLSAgICAgICAgLy8gdGhlIHN1cGVyIGNsYXNzIHNob3VsZCBub3QgaGFuZGxlIGJlYXJlciB0b2tlbnMKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGFjY2VzcyB0b2tlbi4gSWYgbm8gYWNjZXNzIHRva2VuIGlzIHByZXNlbnQgb3IgdGhlIGFjY2VzcyB0b2tlbgotICAgICAqIGlzIGV4cGlyZWQsIGEgbmV3IHRva2VuIGlzIHJlcXVlc3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgdG9rZW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjY2Vzc1Rva2VuKCkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh0b2tlbi5nZXRBY2Nlc3NUb2tlbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4uZ2V0UmVmcmVzaFRva2VuKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLmlzRXhwaXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVmcmVzaFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0b2tlbi5nZXRBY2Nlc3NUb2tlbigpOwotICAgICAgICB9IGNhdGNoIChDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgdGhyb3cgY2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIkNhbm5vdCBnZXQgT0F1dGggYWNjZXNzIHRva2VuOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVxdWVzdGluZyBuZXcgT0F1dGggYWNjZXNzIHRva2VuLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFrZVJlcXVlc3QoZmFsc2UpOwotCi0gICAgICAgIGlmIChMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLnRyYWNlKHRva2VuLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJSZWZyZXNoaW5nIE9BdXRoIGFjY2VzcyB0b2tlbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1ha2VSZXF1ZXN0KHRydWUpOwotCi0gICAgICAgIGlmIChMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLnRyYWNlKHRva2VuLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1ha2VSZXF1ZXN0KGJvb2xlYW4gaXNSZWZyZXNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBPYmplY3QgdG9rZW5FbmRwb2ludCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9UT0tFTl9FTkRQT0lOVCk7Ci0gICAgICAgIGlmICghKHRva2VuRW5kcG9pbnQgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIlRva2VuIGVuZHBvaW50IG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNSZWZyZXNoICYmIHRva2VuLmdldFJlZnJlc2hUb2tlbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiTm8gcmVmcmVzaCB0b2tlbiEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlcXVlc3QgdG9rZW4KLSAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbikgKG5ldyBVUkwodG9rZW5FbmRwb2ludC50b1N0cmluZygpKSkub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7Ci0gICAgICAgIGNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKLSAgICAgICAgY29ubi5zZXREb091dHB1dCh0cnVlKTsKLSAgICAgICAgY29ubi5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihmYWxzZSk7Ci0gICAgICAgIGNvbm4uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLSAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCBDbGllbnRWZXJzaW9uLk9QRU5DTUlTX0NMSUVOVCk7Ci0gICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iik7Ci0KLSAgICAgICAgLy8gY29tcGlsZSByZXF1ZXN0Ci0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCksIElPVXRpbHMuVVRGOCk7Ci0KLSAgICAgICAgaWYgKGlzUmVmcmVzaCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJncmFudF90eXBlPXJlZnJlc2hfdG9rZW4iKTsKLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCImcmVmcmVzaF90b2tlbj0iKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZShJT1V0aWxzLmVuY29kZVVSTCh0b2tlbi5nZXRSZWZyZXNoVG9rZW4oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJncmFudF90eXBlPWF1dGhvcml6YXRpb25fY29kZSIpOwotCi0gICAgICAgICAgICBPYmplY3QgY29kZSA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9DT0RFKTsKLSAgICAgICAgICAgIGlmIChjb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiZjb2RlPSIpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShJT1V0aWxzLmVuY29kZVVSTChjb2RlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IHJlZGlyZWN0VXJpID0gZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX1JFRElSRUNUX1VSSSk7Ci0gICAgICAgICAgICBpZiAocmVkaXJlY3RVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiJnJlZGlyZWN0X3VyaT0iKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoSU9VdGlscy5lbmNvZGVVUkwocmVkaXJlY3RVcmkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGNsaWVudElkID0gZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLk9BVVRIX0NMSUVOVF9JRCk7Ci0gICAgICAgIGlmIChjbGllbnRJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIiZjbGllbnRfaWQ9Iik7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoSU9VdGlscy5lbmNvZGVVUkwoY2xpZW50SWQudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGNsaWVudFNlY3JldCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5PQVVUSF9DTElFTlRfU0VDUkVUKTsKLSAgICAgICAgaWYgKGNsaWVudFNlY3JldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIiZjbGllbnRfc2VjcmV0PSIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKElPVXRpbHMuZW5jb2RlVVJMKGNsaWVudFNlY3JldC50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICAvLyBjb25uZWN0Ci0gICAgICAgIGNvbm4uY29ubmVjdCgpOwotCi0gICAgICAgIC8vIGNoZWNrIHN1Y2Nlc3MKLSAgICAgICAgaWYgKGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCkgIT0gMjAwKSB7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25SZXNwb25zZSA9IHBhcnNlUmVzcG9uc2UoY29ubik7Ci0KLSAgICAgICAgICAgIE9iamVjdCBlcnJvciA9IGpzb25SZXNwb25zZS5nZXQoImVycm9yIik7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3JTdHIgPSAoZXJyb3IgPT0gbnVsbCA/IG51bGwgOiBlcnJvci50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgT2JqZWN0IGRlc2NyaXB0aW9uID0ganNvblJlc3BvbnNlLmdldCgiZXJyb3JfZGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvblN0ciA9IChkZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBPYmplY3QgdXJpID0ganNvblJlc3BvbnNlLmdldCgiZXJyb3JfdXJpIik7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpU3RyID0gKHVyaSA9PSBudWxsID8gbnVsbCA6IHVyaS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJPQXV0aCB0b2tlbiByZXF1ZXN0IGZhaWxlZDoge30iLCBqc29uUmVzcG9uc2UudG9KU09OU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09BdXRoRXhjZXB0aW9uKCJPQXV0aCB0b2tlbiByZXF1ZXN0IGZhaWxlZCIgKyAoZXJyb3JTdHIgPT0gbnVsbCA/ICIiIDogIjogIiArIGVycm9yU3RyKQotICAgICAgICAgICAgICAgICAgICArIChkZXNjcmlwdGlvblN0ciA9PSBudWxsID8gIiIgOiAiOiAiICsgZGVzY3JpcHRpb25TdHIpLCBlcnJvclN0ciwgZGVzY3JpcHRpb25TdHIsIHVyaVN0cik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSByZXNwb25zZQotICAgICAgICBKU09OT2JqZWN0IGpzb25SZXNwb25zZSA9IHBhcnNlUmVzcG9uc2UoY29ubik7Ci0KLSAgICAgICAgT2JqZWN0IHRva2VuVHlwZSA9IGpzb25SZXNwb25zZS5nZXQoInRva2VuX3R5cGUiKTsKLSAgICAgICAgaWYgKCEodG9rZW5UeXBlIGluc3RhbmNlb2YgU3RyaW5nKSB8fCAhImJlYXJlciIuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSB0b2tlblR5cGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09BdXRoRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBPQXV0aCB0b2tlbiB0eXBlOiAiICsgdG9rZW5UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBqc29uQWNjZXNzVG9rZW4gPSBqc29uUmVzcG9uc2UuZ2V0KCJhY2Nlc3NfdG9rZW4iKTsKLSAgICAgICAgaWYgKCEoanNvbkFjY2Vzc1Rva2VuIGluc3RhbmNlb2YgU3RyaW5nKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPQXV0aEV4Y2VwdGlvbigiSW52YWxpZCBPQXV0aCBhY2Nlc3NfdG9rZW4hIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QganNvblJlZnJlc2hUb2tlbiA9IGpzb25SZXNwb25zZS5nZXQoInJlZnJlc2hfdG9rZW4iKTsKLSAgICAgICAgaWYgKGpzb25SZWZyZXNoVG9rZW4gIT0gbnVsbCAmJiAhKGpzb25SZWZyZXNoVG9rZW4gaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09BdXRoRXhjZXB0aW9uKCJJbnZhbGlkIE9BdXRoIHJlZnJlc2hfdG9rZW4hIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGV4cGlyZXNJbiA9IGRlZmF1bHRUb2tlbkxpZmV0aW1lOwotICAgICAgICBPYmplY3QganNvbkV4cGlyZXNJbiA9IGpzb25SZXNwb25zZS5nZXQoImV4cGlyZXNfaW4iKTsKLSAgICAgICAgaWYgKGpzb25FeHBpcmVzSW4gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGpzb25FeHBpcmVzSW4gaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICBleHBpcmVzSW4gPSAoKE51bWJlcikganNvbkV4cGlyZXNJbikubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25FeHBpcmVzSW4gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBleHBpcmVzSW4gPSBMb25nLnBhcnNlTG9uZygoU3RyaW5nKSBqc29uRXhwaXJlc0luKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT0F1dGhFeGNlcHRpb24oIkludmFsaWQgT0F1dGggZXhwaXJlc19pbiB2YWx1ZSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT0F1dGhFeGNlcHRpb24oIkludmFsaWQgT0F1dGggZXhwaXJlc19pbiB2YWx1ZSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4cGlyZXNJbiA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXhwaXJlc0luID0gZGVmYXVsdFRva2VuTGlmZXRpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0b2tlbiA9IG5ldyBUb2tlbihqc29uQWNjZXNzVG9rZW4udG9TdHJpbmcoKSwgKGpzb25SZWZyZXNoVG9rZW4gPT0gbnVsbCA/IG51bGwgOiBqc29uUmVmcmVzaFRva2VuLnRvU3RyaW5nKCkpLAotICAgICAgICAgICAgICAgIGV4cGlyZXNJbiAqIDEwMDAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIGZpcmVUb2tlbkxpc3RuZXIodG9rZW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgSlNPTk9iamVjdCBwYXJzZVJlc3BvbnNlKEh0dHBVUkxDb25uZWN0aW9uIGNvbm4pIHsKLSAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCi0gICAgICAgICAgICBpbnQgcmVzcENvZGUgPSBjb25uLmdldFJlc3BvbnNlQ29kZSgpOwotICAgICAgICAgICAgaWYgKHJlc3BDb2RlID09IDQwMSkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGNoYWxsZW5nZXMgPSBNaW1lSGVscGVyLmdldENoYWxsZW5nZXNGcm9tQXV0aGVudGljYXRlSGVhZGVyKGNvbm4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRIZWFkZXJGaWVsZCgiV1dXLUF1dGhlbnRpY2F0ZSIpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjaGFsbGVuZ2VzICE9IG51bGwgJiYgY2hhbGxlbmdlcy5jb250YWluc0tleSgiYmVhcmVyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBjaGFsbGVuZ2VzLmdldCgiYmVhcmVyIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yU3RyID0gcGFyYW1zLmdldCgiZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uU3RyID0gcGFyYW1zLmdldCgiZXJyb3JfZGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaVN0ciA9IHBhcmFtcy5nZXQoImVycm9yX3VyaSIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJJbnZhbGlkIE9BdXRoIHRva2VuOiB7fSIsIHBhcmFtcy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT0F1dGhFeGNlcHRpb24oIlVuYXV0aG9yaXplZCIgKyAoZXJyb3JTdHIgPT0gbnVsbCA/ICIiIDogIjogIiArIGVycm9yU3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRlc2NyaXB0aW9uU3RyID09IG51bGwgPyAiIiA6ICI6ICIgKyBkZXNjcmlwdGlvblN0ciksIGVycm9yU3RyLCBkZXNjcmlwdGlvblN0ciwgdXJpU3RyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09BdXRoRXhjZXB0aW9uKCJVbmF1dGhvcml6ZWQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXNwQ29kZSA+PSAyMDAgJiYgcmVzcENvZGUgPCAzMDApIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0RXJyb3JTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT0F1dGhFeGNlcHRpb24oIkludmFsaWQgT0F1dGggdG9rZW4gcmVzcG9uc2UhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sIGV4dHJhY3RDaGFyc2V0KGNvbm4pKTsKLSAgICAgICAgICAgIEpTT05QYXJzZXIgcGFyc2VyID0gbmV3IEpTT05QYXJzZXIoKTsKLSAgICAgICAgICAgIE9iamVjdCByZXNwb25zZSA9IHBhcnNlci5wYXJzZShyZWFkZXIpOwotCi0gICAgICAgICAgICBpZiAoIShyZXNwb25zZSBpbnN0YW5jZW9mIEpTT05PYmplY3QpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPQXV0aEV4Y2VwdGlvbigiSW52YWxpZCBPQXV0aCB0b2tlbiByZXNwb25zZSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIChKU09OT2JqZWN0KSByZXNwb25zZTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHRocm93IGNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT0F1dGhFeGNlcHRpb24oIlBhcnNpbmcgdGhlIE9BdXRoIHRva2VuIHJlc3BvbnNlIGZhaWxlZDogIiArIHBlLmdldE1lc3NhZ2UoKSwgcGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jb25zdW1lQW5kQ2xvc2UocmVhZGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RDaGFyc2V0KEh0dHBVUkxDb25uZWN0aW9uIGNvbm4pIHsKLSAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBJT1V0aWxzLlVURjg7Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29ubi5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBjb250ZW50VHlwZS5zcGxpdCgiOyIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0ID0gcGFydHNbaV0udHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKCJjaGFyc2V0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHggPSBwYXJ0LmluZGV4T2YoJz0nKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IHBhcnQuc3Vic3RyaW5nKHggKyAxKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaGFyc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRva2VuIGhvbGRlciBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYWNjZXNzVG9rZW47Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHJlZnJlc2hUb2tlbjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIGV4cGlyYXRpb25UaW1lc3RhbXA7Ci0KLSAgICAgICAgcHVibGljIFRva2VuKFN0cmluZyBhY2Nlc3NUb2tlbiwgU3RyaW5nIHJlZnJlc2hUb2tlbiwgbG9uZyBleHBpcmF0aW9uVGltZXN0YW1wKSB7Ci0gICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47Ci0gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbjsKLSAgICAgICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWVzdGFtcCA9IGV4cGlyYXRpb25UaW1lc3RhbXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgYWNjZXNzIHRva2VuLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgYWNjZXNzIHRva2VuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc1Rva2VuKCkgewotICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHJlZnJlc2ggdG9rZW4uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSByZWZyZXNoIHRva2VuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlZnJlc2hUb2tlbigpIHsKLSAgICAgICAgICAgIHJldHVybiByZWZyZXNoVG9rZW47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgdGltZXN0YW1wIHdoZW4gdGhlIGFjY2VzcyBleHBpcmVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwCi0gICAgICAgICAqICAgICAgICAgVVRDLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWVzdGFtcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBleHBpcmF0aW9uVGltZXN0YW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzIHRva2VuIGlzIGV4cGlyZWQgb3Igbm90LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGFjY2VzcyB0b2tlbiBpcyBleHBpcmVkLCB7QGNvZGUgZmFsc2V9Ci0gICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4cGlyZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPj0gZXhwaXJhdGlvblRpbWVzdGFtcDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJBY2Nlc3MgdG9rZW46ICIgKyBhY2Nlc3NUb2tlbiArICIgLyBSZWZyZXNoIHRva2VuOiAiICsgcmVmcmVzaFRva2VuICsgIiAvIEV4cGlyZXMgOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZXhwaXJhdGlvblRpbWVzdGFtcDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3RlbmVyIGZvciBPQXV0aCB0b2tlbiBldmVudHMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBUb2tlbkxpc3RlbmVyIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSB0b2tlbiBpcyByZXF1ZXN0ZWQgb2YgcmVmcmVzaGVkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHRva2VuCi0gICAgICAgICAqICAgICAgICAgICAgdGhlIG5ldyB0b2tlbgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCB0b2tlblJlZnJlc2hlZChUb2tlbiB0b2tlbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhjZXB0aW9uIGZvciBPQXV0aCBlcnJvcnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbWlzT0F1dGhFeGNlcHRpb24gZXh0ZW5kcyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgLy8gZ2VuZXJhbCBPQXV0aCBlcnJvcnMKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9SRVFVRVNUID0gImludmFsaWRfcmVxdWVzdCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOVkFMSURfQ0xJRU5UID0gImludmFsaWRfY2xpZW50IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9HUkFOVCA9ICJpbnZhbGlkX2dyYW50IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfVU5BVVRIT1JJWkVEX0NMSUVOVCA9ICJ1bmF1dGhvcml6ZWRfY2xpZW50IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfVU5TVVBQT1JURURfR1JBTlRfVFlQRSA9ICJ1bnN1cHBvcnRlZF9ncmFudF90eXBlIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9TQ09QRSA9ICJpbnZhbGlkX3Njb3BlIjsKLQotICAgICAgICAvLyBiZWFyZXIgc3BlY2lmaWMKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSU5WQUxJRF9UT0tFTiA9ICJpbnZhbGlkX3Rva2VuIjsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBlcnJvcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JEZXNjcmlwdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JVcmk7Ci0KLSAgICAgICAgcHVibGljIENtaXNPQXV0aEV4Y2VwdGlvbigpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ21pc09BdXRoRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbWlzT0F1dGhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENtaXNPQXV0aEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yLCBTdHJpbmcgZXJyb3JEZXNjcmlwdGlvbiwgU3RyaW5nIGVycm9yVXJpKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKLSAgICAgICAgICAgIHRoaXMuZXJyb3JEZXNjcmlwdGlvbiA9IGVycm9yRGVzY3JpcHRpb247Ci0gICAgICAgICAgICB0aGlzLmVycm9yVXJpID0gZXJyb3JVcmk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgewotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFcnJvckRlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGVycm9yRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIGVycm9yVXJpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9TZXNzaW9uQXdhcmVBdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL1Nlc3Npb25Bd2FyZUF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwOTgxZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL1Nlc3Npb25Bd2FyZUF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBBdXRoZW50aWNhdGlvbiBwcm92aWRlciBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgZ2V0IHRoZSBiaW5kaW5nIHNlc3Npb24KLSAqIGluamVjdGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlc3Npb25Bd2FyZUF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBdXRoZW50aWNhdGlvblByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGJpbmRpbmcgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICB2b2lkIHNldFNlc3Npb24oQmluZGluZ1Nlc3Npb24gc2Vzc2lvbik7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL1N0YW5kYXJkQXV0aGVudGljYXRpb25Qcm92aWRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9TdGFuZGFyZEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlZDE2Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL1N0YW5kYXJkQXV0aGVudGljYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmNvb2tpZXMuQ21pc0Nvb2tpZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBTdGFuZGFyZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlciBjbGFzcy4KLSAqIAotICogQWRkcyBhIGJhc2ljIGF1dGhlbnRpY2F0aW9uIEhUVFAgaGVhZGVyIGFuZCBhIFdTLVNlY3VyaXR5IFVzZXJuYW1lVG9rZW4gU09BUAotICogaGVhZGVyLgotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRBdXRoZW50aWNhdGlvblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBdXRoZW50aWNhdGlvblByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NTRV9OQU1FU1BBQ0UgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU1VfTkFNRVNQQUNFID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiOwotCi0gICAgcHJpdmF0ZSBDbWlzQ29va2llTWFuYWdlciBjb29raWVNYW5hZ2VyOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBmaXhlZEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb24oQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBzdXBlci5zZXRTZXNzaW9uKHNlc3Npb24pOwotCi0gICAgICAgIGJvb2xlYW4gc2VuZEJhc2ljQXV0aCA9IGdldFNlbmRCYXNpY0F1dGgoKTsKLQotICAgICAgICBpZiAoZ2V0SGFuZGxlQ29va2llcygpICYmIGNvb2tpZU1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgY29va2llTWFuYWdlciA9IG5ldyBDbWlzQ29va2llTWFuYWdlcihzZXNzaW9uLmdldFNlc3Npb25JZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJhc2ljIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIGlmIChzZW5kQmFzaWNBdXRoKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdXNlciBhbmQgcGFzc3dvcmQKLSAgICAgICAgICAgIFN0cmluZyB1c2VyID0gZ2V0VXNlcigpOwotICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gZ2V0UGFzc3dvcmQoKTsKLQotICAgICAgICAgICAgLy8gaWYgbm8gdXNlciBpcyBzZXQsIGRvbid0IHNldCBiYXNpYyBhdXRoIGhlYWRlcgotICAgICAgICAgICAgaWYgKHVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpeGVkSGVhZGVycy5wdXQoIkF1dGhvcml6YXRpb24iLCBjcmVhdGVCYXNpY0F1dGhIZWFkZXJWYWx1ZSh1c2VyLCBwYXNzd29yZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBzZW5kQmVhcmVyVG9rZW4gPSBnZXRTZW5kQmVhcmVyVG9rZW4oKTsKLQotICAgICAgICAvLyBzZW5kIGJlYXJlciB0b2tlbgotICAgICAgICBpZiAoc2VuZEJlYXJlclRva2VuKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBnZXRCZWFyZXJUb2tlbigpOwotCi0gICAgICAgICAgICAvLyBpZiBubyB0b2tlbiBpcyBzZXQsIGRvbid0IHNldCBiZWFyZXIgaGVhZGVyCi0gICAgICAgICAgICBpZiAodG9rZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpeGVkSGVhZGVycy5wdXQoIkF1dGhvcml6YXRpb24iLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJCZWFyZXIgIiArIHRva2VuKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm94eSBhdXRoZW50aWNhdGlvbgotICAgICAgICBpZiAoZ2V0UHJveHlVc2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHByb3h5IHVzZXIgYW5kIHBhc3N3b3JkCi0gICAgICAgICAgICBTdHJpbmcgcHJveHlVc2VyID0gZ2V0UHJveHlVc2VyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJveHlQYXNzd29yZCA9IGdldFByb3h5UGFzc3dvcmQoKTsKLQotICAgICAgICAgICAgZml4ZWRIZWFkZXJzLnB1dCgiUHJveHktQXV0aG9yaXphdGlvbiIsIGNyZWF0ZUJhc2ljQXV0aEhlYWRlclZhbHVlKHByb3h5VXNlciwgcHJveHlQYXNzd29yZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3RoZXIgaGVhZGVycwotICAgICAgICBhZGRTZXNzaW9uUGFyYW1ldGVySGVhZGVyc1RvRml4ZWRIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SFRUUEhlYWRlcnMoU3RyaW5nIHVybCkgewotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PihmaXhlZEhlYWRlcnMpOwotCi0gICAgICAgIC8vIGNvb2tpZXMKLSAgICAgICAgaWYgKGNvb2tpZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBjb29raWVzID0gY29va2llTWFuYWdlci5nZXQodXJsLCByZXN1bHQpOwotICAgICAgICAgICAgaWYgKCFjb29raWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRBbGwoY29va2llcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0LmlzRW1wdHkoKSA/IG51bGwgOiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHV0UmVzcG9uc2VIZWFkZXJzKFN0cmluZyB1cmwsIGludCBzdGF0dXNDb2RlLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMpIHsKLSAgICAgICAgaWYgKGNvb2tpZU1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29va2llTWFuYWdlci5wdXQodXJsLCBoZWFkZXJzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbGVtZW50IGdldFNPQVBIZWFkZXJzKE9iamVjdCBwb3J0T2JqZWN0KSB7Ci0gICAgICAgIC8vIG9ubHkgc2VuZCBTT0FQIGhlYWRlciBpZiBjb25maWd1cmVkCi0gICAgICAgIGlmICghZ2V0U2VuZFVzZXJuYW1lVG9rZW4oKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdXNlciBhbmQgcGFzc3dvcmQKLSAgICAgICAgU3RyaW5nIHVzZXIgPSBnZXRVc2VyKCk7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGdldFBhc3N3b3JkKCk7Ci0KLSAgICAgICAgLy8gaWYgbm8gdXNlciBpcyBzZXQsIGRvbid0IGNyZWF0ZSBTT0FQIGhlYWRlcgotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwYXNzd29yZCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHRpbWUKLSAgICAgICAgbG9uZyBjcmVhdGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGxvbmcgZXhwaXJlcyA9IGNyZWF0ZWQgKyAyNCAqIDYwICogNjAgKiAxMDAwOyAvLyAyNCBob3VycwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgU09BUCBoZWFkZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbHMubmV3RG9tRG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgRWxlbWVudCB3c3NlU2VjdXJpdHlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTU0VfTkFNRVNQQUNFLCAiU2VjdXJpdHkiKTsKLQotICAgICAgICAgICAgRWxlbWVudCB3c3VUaW1lc3RhbXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTVV9OQU1FU1BBQ0UsICJUaW1lc3RhbXAiKTsKLSAgICAgICAgICAgIHdzc2VTZWN1cml0eUVsZW1lbnQuYXBwZW5kQ2hpbGQod3N1VGltZXN0YW1wRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgdHNDcmVhdGVkRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhXU1VfTkFNRVNQQUNFLCAiQ3JlYXRlZCIpOwotICAgICAgICAgICAgdHNDcmVhdGVkRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShEYXRlVGltZUhlbHBlci5mb3JtYXRYbWxEYXRlVGltZShjcmVhdGVkKSkpOwotICAgICAgICAgICAgd3N1VGltZXN0YW1wRWxlbWVudC5hcHBlbmRDaGlsZCh0c0NyZWF0ZWRFbGVtZW50KTsKLQotICAgICAgICAgICAgRWxlbWVudCB0c0V4cGlyZXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTVV9OQU1FU1BBQ0UsICJFeHBpcmVzIik7Ci0gICAgICAgICAgICB0c0V4cGlyZXNFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKGV4cGlyZXMpKSk7Ci0gICAgICAgICAgICB3c3VUaW1lc3RhbXBFbGVtZW50LmFwcGVuZENoaWxkKHRzRXhwaXJlc0VsZW1lbnQpOwotCi0gICAgICAgICAgICBFbGVtZW50IHVzZXJuYW1lVG9rZW5FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTU0VfTkFNRVNQQUNFLCAiVXNlcm5hbWVUb2tlbiIpOwotICAgICAgICAgICAgd3NzZVNlY3VyaXR5RWxlbWVudC5hcHBlbmRDaGlsZCh1c2VybmFtZVRva2VuRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgdXNlcm5hbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTU0VfTkFNRVNQQUNFLCAiVXNlcm5hbWUiKTsKLSAgICAgICAgICAgIHVzZXJuYW1lRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh1c2VyKSk7Ci0gICAgICAgICAgICB1c2VybmFtZVRva2VuRWxlbWVudC5hcHBlbmRDaGlsZCh1c2VybmFtZUVsZW1lbnQpOwotCi0gICAgICAgICAgICBFbGVtZW50IHBhc3N3b3JkRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhXU1NFX05BTUVTUEFDRSwgIlBhc3N3b3JkIik7Ci0gICAgICAgICAgICBwYXNzd29yZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFzc3dvcmQpKTsKLSAgICAgICAgICAgIHBhc3N3b3JkRWxlbWVudC5zZXRBdHRyaWJ1dGUoIlR5cGUiLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy11c2VybmFtZS10b2tlbi1wcm9maWxlLTEuMCNQYXNzd29yZFRleHQiKTsKLSAgICAgICAgICAgIHVzZXJuYW1lVG9rZW5FbGVtZW50LmFwcGVuZENoaWxkKHBhc3N3b3JkRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgY3JlYXRlZEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoV1NVX05BTUVTUEFDRSwgIkNyZWF0ZWQiKTsKLSAgICAgICAgICAgIGNyZWF0ZWRFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKGNyZWF0ZWQpKSk7Ci0gICAgICAgICAgICB1c2VybmFtZVRva2VuRWxlbWVudC5hcHBlbmRDaGlsZChjcmVhdGVkRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB3c3NlU2VjdXJpdHlFbGVtZW50OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgYnVpbGQgU09BUCBoZWFkZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBIVFRQIGhlYWRlcnMgdGhhdCBhcmUgc2VudCB3aXRoIGFsbCByZXF1ZXN0cy4gVGhlIHJldHVybmVkCi0gICAgICogbWFwIGlzIG11dGFibGUgYnV0IG5vdCBzeW5jaHJvbml6ZWQhCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0Rml4ZWRIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gZml4ZWRIZWFkZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIHtAbGluayBTZXNzaW9uUGFyYW1ldGVyLkhFQURFUn0gdG8gdGhlIGZpeGVkIGhlYWRlcnMuIFRoaXMKLSAgICAgKiBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIHtAbGluayAjc2V0U2Vzc2lvbihCaW5kaW5nU2Vzc2lvbil9Ci0gICAgICogbWV0aG9kIHRvIGF2b2lkIHRocmVhZGluZyBpc3N1ZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU2Vzc2lvblBhcmFtZXRlckhlYWRlcnNUb0ZpeGVkSGVhZGVycygpIHsKLSAgICAgICAgaW50IHggPSAwOwotICAgICAgICBPYmplY3QgaGVhZGVyUGFyYW07Ci0gICAgICAgIHdoaWxlICgoaGVhZGVyUGFyYW0gPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuSEVBREVSICsgIi4iICsgeCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSBoZWFkZXJQYXJhbS50b1N0cmluZygpOwotICAgICAgICAgICAgaW50IGNvbG9uID0gaGVhZGVyLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChjb2xvbiA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGhlYWRlci5zdWJzdHJpbmcoMCwgY29sb24pLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKGNvbG9uICsgMSkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gZml4ZWRIZWFkZXJzLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkSGVhZGVycy5wdXQoa2V5LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gbmV3VmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZXMuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkSGVhZGVycy5wdXQoa2V5LCBuZXdWYWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGhlYWRlciB2YWx1ZSBmcm9tIGEgdXNlcm5hbWUgYW5kIGEKLSAgICAgKiBwYXNzd29yZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGNyZWF0ZUJhc2ljQXV0aEhlYWRlclZhbHVlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwYXNzd29yZCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGNoYXJzZXQgPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9IVFRQX0JBU0lDX0NIQVJTRVQpOwotICAgICAgICBpZiAoY2hhcnNldCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgY2hhcnNldCA9ICgoU3RyaW5nKSBjaGFyc2V0KS50cmltKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyc2V0ID0gSU9VdGlscy5VVEY4OwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIHVzZXJuYW1lUGFzc3dvcmQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1c2VybmFtZVBhc3N3b3JkID0gKHVzZXJuYW1lICsgIjoiICsgcGFzc3dvcmQpLmdldEJ5dGVzKChTdHJpbmcpIGNoYXJzZXQpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2RpbmcgJyIgKyBjaGFyc2V0ICsgIichIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiQmFzaWMgIiArIEJhc2U2NC5lbmNvZGVCeXRlcyh1c2VybmFtZVBhc3N3b3JkKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiBhIEhUVFAgQmFzaWMgQXV0aGVudGljYXRpb24gaGVhZGVyIHNob3VsZCBiZSBzZW50LiAoQWxsCi0gICAgICogYmluZGluZ3MuKQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFNlbmRCYXNpY0F1dGgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9IVFRQX0JBU0lDLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiBhbiBPQXV0aCBCZWFyZXIgdG9rZW4gaGVhZGVyIHNob3VsZCBiZSBzZW50LiAoQWxsIGJpbmRpbmdzLikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTZW5kQmVhcmVyVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQVVUSF9PQVVUSF9CRUFSRVIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGEgVXNlcm5hbWVUb2tlbiBzaG91bGQgYmUgc2VudC4gKFdlYiBTZXJ2aWNlcyBiaW5kaW5nIG9ubHkuKQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFNlbmRVc2VybmFtZVRva2VuKCkgewotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLkFVVEhfU09BUF9VU0VSTkFNRVRPS0VOLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgc2hvdWxkIGhhbmRsZSBjb29raWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdldEhhbmRsZUNvb2tpZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ09PS0lFUywgZmFsc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BYnN0cmFjdEF0b21QdWJTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQWJzdHJhY3RBdG9tUHViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmY2OTI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BYnN0cmFjdEF0b21QdWJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNtaXNCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5SZXBvc2l0b3J5SW5mb0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5MaW5rQWNjZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLlJlcG9zaXRvcnlXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuU2VydmljZURvYzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuSHR0cEludm9rZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLk91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RvcmFnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5SZXR1cm5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0RGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBvbGljeUlkTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUlkSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdJbXBsOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCBBdG9tUHViIGNsaWVudCBzZXJ2aWNlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2UgaW1wbGVtZW50cyBMaW5rQWNjZXNzIHsKLQotICAgIHByb3RlY3RlZCBlbnVtIElkZW50aWZpZXJUeXBlIHsKLSAgICAgICAgSUQsIFBBVEgKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0NPTExFQ1RJT04gPSAiY29sbGVjdGlvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9VUklfVEVNUExBVEUgPSAidXJpdGVtcGxhdGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFUSF9TRUdNRU5UID0gInBhdGhTZWdtZW50IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCA9ICJyZWxhdGl2ZVBhdGhTZWdtZW50IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX05VTV9JVEVNUyA9ICJudW1JdGVtcyI7Ci0KLSAgICBwcml2YXRlIEJpbmRpbmdTZXNzaW9uIHNlc3Npb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U2Vzc2lvbihCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCaW5kaW5nU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBIVFRQIEludm9rZXIgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBIdHRwSW52b2tlciBnZXRIdHRwSW52b2tlcigpIHsKLSAgICAgICAgcmV0dXJuIENtaXNCaW5kaW5nc0hlbHBlci5nZXRIdHRwSW52b2tlcihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIGRvY3VtZW50IFVSTCBvZiB0aGlzIHNlc3Npb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2aWNlRG9jVVJMKCkgewotICAgICAgICBPYmplY3QgdXJsID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCk7Ci0gICAgICAgIGlmICh1cmwgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSB1cmw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIENNSVMgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBpZiAoQ21pc0JpbmRpbmdzSGVscGVyLmdldEZvcmNlZENtaXNWZXJzaW9uKHNlc3Npb24pICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0Rm9yY2VkQ21pc1ZlcnNpb24oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBvc2l0b3J5SW5mb0NhY2hlIGNhY2hlID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFJlcG9zaXRvcnlJbmZvQ2FjaGUoc2Vzc2lvbik7Ci0gICAgICAgIFJlcG9zaXRvcnlJbmZvIGluZm8gPSBjYWNoZS5nZXQocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFJlcG9zaXRvcnlJbmZvPiBpbmZvTGlzdCA9IGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBpZiAoaXNOb3RFbXB0eShpbmZvTGlzdCkpIHsKLSAgICAgICAgICAgICAgICBpbmZvID0gaW5mb0xpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIGNhY2hlLnB1dChpbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoaW5mbyA9PSBudWxsID8gQ21pc1ZlcnNpb24uQ01JU18xXzAgOiBpbmZvLmdldENtaXNWZXJzaW9uKCkpOwotICAgIH0KLQotICAgIC8vIC0tLS0gbGluayBjYWNoZSAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaW5rIGNhY2hlIG9yIGNyZWF0ZXMgYSBuZXcgY2FjaGUgaWYgaXQgZG9lc24ndCBleGlzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlua0NhY2hlIGdldExpbmtDYWNoZSgpIHsKLSAgICAgICAgTGlua0NhY2hlIGxpbmtDYWNoZSA9IChMaW5rQ2FjaGUpIGdldFNlc3Npb24oKS5nZXQoU3BpU2Vzc2lvblBhcmFtZXRlci5MSU5LX0NBQ0hFKTsKLSAgICAgICAgaWYgKGxpbmtDYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rQ2FjaGUgPSBuZXcgTGlua0NhY2hlKGdldFNlc3Npb24oKSk7Ci0gICAgICAgICAgICBnZXRTZXNzaW9uKCkucHV0KFNwaVNlc3Npb25QYXJhbWV0ZXIuTElOS19DQUNIRSwgbGlua0NhY2hlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaW5rQ2FjaGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGxpbmsgZnJvbSB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUmVwb3NpdG9yeSBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldExpbmtDYWNoZSgpLmdldExpbmsocmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGluayBmcm9tIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkLCBTdHJpbmcgcmVsKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5rKHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGxpbmsgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQgaW50byB0aGUgY2FjaGUgaWYKLSAgICAgKiBpdCBpcyBub3QgdGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBsb2FkTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyBsaW5rID0gZ2V0TGluayhyZXBvc2l0b3J5SWQsIGlkLCByZWwsIHR5cGUpOwotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBpZCwgUmV0dXJuVmVyc2lvbi5USElTLCAiY21pczpvYmplY3RJZCIsIEJvb2xlYW4uRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsICJjbWlzOm5vbmUiLCBCb29sZWFuLkZBTFNFLCBCb29sZWFuLkZBTFNFLCBudWxsKTsKLSAgICAgICAgICAgIGxpbmsgPSBnZXRMaW5rKHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgdHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGluazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IGxpbmsgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQgaW50byB0aGUKLSAgICAgKiBjYWNoZSBpZiBpdCBpcyBub3QgdGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBsb2FkQ29udGVudExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGlkLCBBdG9tUHViUGFyc2VyLkxJTktfUkVMX0NPTlRFTlQsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSByZW5kaXRpb24gY29udGVudCBsaW5rIGZyb20gdGhlIGNhY2hlIGlmIGl0IGlzIHRoZXJlIG9yIGxvYWRzIGl0Ci0gICAgICogaW50byB0aGUgY2FjaGUgaWYgaXQgaXMgbm90IHRoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbG9hZFJlbmRpdGlvbkNvbnRlbnRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHN0cmVhbUlkKSB7Ci0gICAgICAgIHJldHVybiBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGlkLCBDb25zdGFudHMuUkVMX0FMVEVSTkFURSwgc3RyZWFtSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsaW5rIHRvIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUsIFN0cmluZyBsaW5rKSB7Ci0gICAgICAgIGdldExpbmtDYWNoZSgpLmFkZExpbmsocmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlLCBsaW5rKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGluayB0byB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQsIEF0b21MaW5rIGxpbmspIHsKLSAgICAgICAgZ2V0TGlua0NhY2hlKCkuYWRkTGluayhyZXBvc2l0b3J5SWQsIGlkLCBsaW5rLmdldFJlbCgpLCBsaW5rLmdldFR5cGUoKSwgbGluay5nZXRIcmVmKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGxpbmtzIG9mIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgZ2V0TGlua0NhY2hlKCkucmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ja3MgdGhlIGxpbmsgY2FjaGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9ja0xpbmtzKCkgewotICAgICAgICBnZXRMaW5rQ2FjaGUoKS5sb2NrTGlua3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvY2tzIHRoZSBsaW5rIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVubG9ja0xpbmtzKCkgewotICAgICAgICBnZXRMaW5rQ2FjaGUoKS51bmxvY2tMaW5rcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBhIGxpbmsgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRocm93TGlua0V4Y2VwdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGdldExpbmtDYWNoZSgpLmNoZWNrTGluayhyZXBvc2l0b3J5SWQsIGlkLCByZWwsIHR5cGUpOwotCi0gICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5ISIpOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIG9iamVjdCEiKTsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByZXBvc2l0b3J5IGZvciB0aGlzIG9iamVjdCEiKTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vIGxpbmsgd2l0aCBtYXRjaGluZyBtZWRpYSB0eXBlISIpOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5vdGhpbmcgd3JvbmchIEVpdGhlciB0aGlzIGlzIGEgYnVnIG9yIGEgdGhyZWFkaW5nIGlzc3VlLiIpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGVycm9yISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHR5cGUgbGluayBmcm9tIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlJlcG9zaXRvcnkgSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldExpbmtDYWNoZSgpLmdldFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCByZWwsIHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSB0eXBlIGxpbmsgZnJvbSB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcmVsKSB7Ci0gICAgICAgIHJldHVybiBnZXRUeXBlTGluayhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgcmVsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGluayBmcm9tIHRoZSBjYWNoZSBpZiBpdCBpcyB0aGVyZSBvciBsb2FkcyBpdCBpbnRvIHRoZSBjYWNoZSBpZgotICAgICAqIGl0IGlzIG5vdCB0aGVyZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvYWRUeXBlTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcmVsLCBTdHJpbmcgdHlwZSkgewotICAgICAgICBTdHJpbmcgbGluayA9IGdldFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCByZWwsIHR5cGUpOwotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRUeXBlRGVmaW5pdGlvbkludGVybmFsKHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICAgICAgICAgIGxpbmsgPSBnZXRUeXBlTGluayhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgcmVsLCB0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaW5rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0eXBlIGxpbmsgdG8gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlLCBTdHJpbmcgbGluaykgewotICAgICAgICBnZXRMaW5rQ2FjaGUoKS5hZGRUeXBlTGluayhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgcmVsLCB0eXBlLCBsaW5rKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgdHlwZSBsaW5rIHRvIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBBdG9tTGluayBsaW5rKSB7Ci0gICAgICAgIGdldExpbmtDYWNoZSgpLmFkZFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBsaW5rLmdldFJlbCgpLCBsaW5rLmdldFR5cGUoKSwgbGluay5nZXRIcmVmKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIGxpbmtzIG9mIGEgdHlwZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVUeXBlTGlua3MoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGdldExpbmtDYWNoZSgpLnJlbW92ZVR5cGVMaW5rcyhyZXBvc2l0b3J5SWQsIGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2NrcyB0aGUgdHlwZSBsaW5rIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvY2tUeXBlTGlua3MoKSB7Ci0gICAgICAgIGdldExpbmtDYWNoZSgpLmxvY2tUeXBlTGlua3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvY2tzIHRoZSB0eXBlIGxpbmsgY2FjaGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdW5sb2NrVHlwZUxpbmtzKCkgewotICAgICAgICBnZXRMaW5rQ2FjaGUoKS51bmxvY2tUeXBlTGlua3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgY29sbGVjdGlvbiBmcm9tIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbGxlY3Rpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGNvbGxlY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldExpbmtDYWNoZSgpLmdldENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBjb2xsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgY29sbGVjdGlvbiBmcm9tIHRoZSBjYWNoZSBpZiBpdCBpcyB0aGVyZSBvciBsb2FkcyBpdCBpbnRvIHRoZQotICAgICAqIGNhY2hlIGlmIGl0IGlzIG5vdCB0aGVyZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvYWRDb2xsZWN0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBsaW5rID0gZ2V0Q29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIGNvbGxlY3Rpb24pOwotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjYWNoZSByZXBvc2l0b3J5IGluZm8KLSAgICAgICAgICAgIGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBsaW5rID0gZ2V0Q29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIGNvbGxlY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxpbms7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGNvbGxlY3Rpb24gdG8gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZENvbGxlY3Rpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGNvbGxlY3Rpb24sIFN0cmluZyBsaW5rKSB7Ci0gICAgICAgIGdldExpbmtDYWNoZSgpLmFkZENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBjb2xsZWN0aW9uLCBsaW5rKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgcmVwb3NpdG9yeSBsaW5rIGZyb20gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVwb3NpdG9yeUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHJlbCkgewotICAgICAgICByZXR1cm4gZ2V0TGlua0NhY2hlKCkuZ2V0UmVwb3NpdG9yeUxpbmsocmVwb3NpdG9yeUlkLCByZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSByZXBvc2l0b3J5IGxpbmsgZnJvbSB0aGUgY2FjaGUgaWYgaXQgaXMgdGhlcmUgb3IgbG9hZHMgaXQgaW50byB0aGUKLSAgICAgKiBjYWNoZSBpZiBpdCBpcyBub3QgdGhlcmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2FkUmVwb3NpdG9yeUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHJlbCkgewotICAgICAgICBTdHJpbmcgbGluayA9IGdldFJlcG9zaXRvcnlMaW5rKHJlcG9zaXRvcnlJZCwgcmVsKTsKLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY2FjaGUgcmVwb3NpdG9yeSBpbmZvCi0gICAgICAgICAgICBnZXRSZXBvc2l0b3JpZXNJbnRlcm5hbChyZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgbGluayA9IGdldFJlcG9zaXRvcnlMaW5rKHJlcG9zaXRvcnlJZCwgcmVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaW5rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZXBvc2l0b3J5IGxpbmsgdG8gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFJlcG9zaXRvcnlMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyByZWwsIFN0cmluZyBsaW5rKSB7Ci0gICAgICAgIGdldExpbmtDYWNoZSgpLmFkZFJlcG9zaXRvcnlMaW5rKHJlcG9zaXRvcnlJZCwgcmVsLCBsaW5rKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVwb3NpdG9yeSBsaW5rIHRvIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSZXBvc2l0b3J5TGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBBdG9tTGluayBsaW5rKSB7Ci0gICAgICAgIGFkZFJlcG9zaXRvcnlMaW5rKHJlcG9zaXRvcnlJZCwgbGluay5nZXRSZWwoKSwgbGluay5nZXRIcmVmKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gVVJJIHRlbXBsYXRlIGZyb20gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGVtcGxhdGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgcmV0dXJuIGdldExpbmtDYWNoZSgpLmdldFRlbXBsYXRlTGluayhyZXBvc2l0b3J5SWQsIHR5cGUsIHBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSB0ZW1wbGF0ZSBsaW5rIGZyb20gdGhlIGNhY2hlIGlmIGl0IGlzIHRoZXJlIG9yIGxvYWRzIGl0IGludG8gdGhlCi0gICAgICogY2FjaGUgaWYgaXQgaXMgbm90IHRoZXJlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbG9hZFRlbXBsYXRlTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZSwgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIFN0cmluZyBsaW5rID0gZ2V0VGVtcGxhdGVMaW5rKHJlcG9zaXRvcnlJZCwgdHlwZSwgcGFyYW1ldGVycyk7Ci0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNhY2hlIHJlcG9zaXRvcnkgaW5mbwotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yaWVzSW50ZXJuYWwocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGxpbmsgPSBnZXRUZW1wbGF0ZUxpbmsocmVwb3NpdG9yeUlkLCB0eXBlLCBwYXJhbWV0ZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaW5rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gVVJJIHRlbXBsYXRlIHRvIHRoZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wbGF0ZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGxpbmspIHsKLSAgICAgICAgZ2V0TGlua0NhY2hlKCkuYWRkVGVtcGxhdGUocmVwb3NpdG9yeUlkLCB0eXBlLCBsaW5rKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIGV4Y2VwdGlvbnMgLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBIVFRQIHN0YXR1cyBjb2RlIGludG8gYW4gRXhjZXB0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbWlzQmFzZUV4Y2VwdGlvbiBjb252ZXJ0U3RhdHVzQ29kZShpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIFN0cmluZyBleGNlcHRpb24gPSBleHRyYWN0RXhjZXB0aW9uKGVycm9yQ29udGVudCk7Ci0gICAgICAgIG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlKG1lc3NhZ2UsIGVycm9yQ29udGVudCk7Ci0KLSAgICAgICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgMzAxOgotICAgICAgICBjYXNlIDMwMjoKLSAgICAgICAgY2FzZSAzMDM6Ci0gICAgICAgIGNhc2UgMzA3OgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiUmVkaXJlY3RzIGFyZSBub3Qgc3VwcG9ydGVkIChIVFRQIHN0YXR1cyBjb2RlICIgKyBjb2RlICsgIik6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICBjYXNlIDQwMDoKLSAgICAgICAgICAgIGlmIChDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzKGV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNGaWx0ZXJOb3RWYWxpZEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgIGNhc2UgNDAxOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzVW5hdXRob3JpemVkRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgIGNhc2UgNDAzOgotICAgICAgICAgICAgaWYgKENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzKGV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgY2FzZSA0MDQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICBjYXNlIDQwNToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICBjYXNlIDQwNzoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgY2FzZSA0MDk6Ci0gICAgICAgICAgICBpZiAoQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFscyhleGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ21pc1ZlcnNpb25pbmdFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzKGV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHMoZXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHMoZXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgIGNhc2UgNTAzOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoQ21pc1N0b3JhZ2VFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzKGV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNTdG9yYWdlRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RFeGNlcHRpb24oU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBpZiAoZXJyb3JDb250ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJlZ2luID0gZXJyb3JDb250ZW50LmluZGV4T2YoIjwhLS1leGNlcHRpb24tLT4iKTsKLSAgICAgICAgaW50IGVuZCA9IGVycm9yQ29udGVudC5pbmRleE9mKCI8IS0tL2V4Y2VwdGlvbi0tPiIpOwotCi0gICAgICAgIGlmIChiZWdpbiA9PSAtMSB8fCBlbmQgPT0gLTEgfHwgYmVnaW4gPiBlbmQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycm9yQ29udGVudC5zdWJzdHJpbmcoYmVnaW4gKyAiPCEtLWV4Y2VwdGlvbi0tPiIubGVuZ3RoKCksIGVuZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIGlmIChlcnJvckNvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYmVnaW4gPSBlcnJvckNvbnRlbnQuaW5kZXhPZigiPCEtLW1lc3NhZ2UtLT4iKTsKLSAgICAgICAgaW50IGVuZCA9IGVycm9yQ29udGVudC5pbmRleE9mKCI8IS0tL21lc3NhZ2UtLT4iKTsKLQotICAgICAgICBpZiAoYmVnaW4gPT0gLTEgfHwgZW5kID09IC0xIHx8IGJlZ2luID4gZW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnJvckNvbnRlbnQuc3Vic3RyaW5nKGJlZ2luICsgIjwhLS1tZXNzYWdlLS0+Ii5sZW5ndGgoKSwgZW5kKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIGhlbHBlcnMgLS0tLQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXMoU3RyaW5nIG5hbWUsIEF0b21FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0cihTdHJpbmcgbmFtZSwgQXRvbUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gaXMobmFtZSwgZWxlbWVudCkgJiYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBTdHJpbmcpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW50KFN0cmluZyBuYW1lLCBBdG9tRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBpcyhuYW1lLCBlbGVtZW50KSAmJiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTmV4dExpbmsoQXRvbUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gQ29uc3RhbnRzLlJFTF9ORVhULmVxdWFscygoKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKS5nZXRSZWwoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENNSVMgb2JqZWN0IHdpdGggcHJvcGVydGllcyBhbmQgcG9saWN5IElEcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YUltcGwgY3JlYXRlT2JqZWN0KFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGNoYW5nZVRva2VuLCBMaXN0PFN0cmluZz4gcG9saWNpZXMpIHsKLSAgICAgICAgT2JqZWN0RGF0YUltcGwgb2JqZWN0ID0gbmV3IE9iamVjdERhdGFJbXBsKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBvbWl0Q2hhbmdlVG9rZW4gPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT01JVF9DSEFOR0VfVE9LRU5TLCBmYWxzZSk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzSW1wbCgpOwotICAgICAgICAgICAgaWYgKGNoYW5nZVRva2VuICE9IG51bGwgJiYgIW9taXRDaGFuZ2VUb2tlbikgewotICAgICAgICAgICAgICAgICgoUHJvcGVydGllc0ltcGwpIHByb3BlcnRpZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5U3RyaW5nSW1wbChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4sIGNoYW5nZVRva2VuKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAob21pdENoYW5nZVRva2VuKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTikpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzSW1wbChwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0aWVzSW1wbCkgcHJvcGVydGllcykucmVtb3ZlUHJvcGVydHkoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwocHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgICgoUHJvcGVydGllc0ltcGwpIHByb3BlcnRpZXMpLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRva2VuKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb2JqZWN0LnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYgKGlzTm90RW1wdHkocG9saWNpZXMpKSB7Ci0gICAgICAgICAgICBQb2xpY3lJZExpc3RJbXBsIHBvbGljeUlkTGlzdCA9IG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7Ci0gICAgICAgICAgICBwb2xpY3lJZExpc3Quc2V0UG9saWN5SWRzKHBvbGljaWVzKTsKLSAgICAgICAgICAgIG9iamVjdC5zZXRQb2xpY3lJZHMocG9saWN5SWRMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENNSVMgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBhbiBJRCBpbiB0aGUgcHJvcGVydHkgbGlzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YSBjcmVhdGVJZE9iamVjdChTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgT2JqZWN0RGF0YUltcGwgb2JqZWN0ID0gbmV3IE9iamVjdERhdGFJbXBsKCk7Ci0KLSAgICAgICAgUHJvcGVydGllc0ltcGwgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzSW1wbCgpOwotICAgICAgICBvYmplY3Quc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eUlkSW1wbChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIG9iamVjdElkKSk7Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYW4gaW5wdXQgc3RyZWFtLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIEF0b21CYXNlPiBUIHBhcnNlKElucHV0U3RyZWFtIHN0cmVhbSwgQ2xhc3M8VD4gY2xhenopIHsKLSAgICAgICAgQXRvbVB1YlBhcnNlciBwYXJzZXIgPSBuZXcgQXRvbVB1YlBhcnNlcihzdHJlYW0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiUGFyc2luZyBleGNlcHRpb24hIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBBdG9tQmFzZSBwYXJzZVJlc3VsdCA9IHBhcnNlci5nZXRSZXN1bHRzKCk7Ci0KLSAgICAgICAgaWYgKCFjbGF6ei5pc0luc3RhbmNlKHBhcnNlUmVzdWx0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGRvY3VtZW50ISBSZWNlaXZlZDogIgotICAgICAgICAgICAgICAgICAgICArIChwYXJzZVJlc3VsdCA9PSBudWxsID8gInNvbWV0aGluZyB1bmtub3duIiA6IHBhcnNlUmVzdWx0LmdldFR5cGUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChUKSBwYXJzZVJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIEdFVCBvbiBhbiBVUkwsIGNoZWNrcyB0aGUgcmVzcG9uc2UgY29kZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlc3BvbnNlIHJlYWQoVXJsQnVpbGRlciB1cmwpIHsKLSAgICAgICAgLy8gbWFrZSB0aGUgY2FsbAotICAgICAgICBSZXNwb25zZSByZXNwID0gZ2V0SHR0cEludm9rZXIoKS5pbnZva2VHRVQodXJsLCBzZXNzaW9uKTsKLQotICAgICAgICAvLyBjaGVjayByZXNwb25zZSBjb2RlCi0gICAgICAgIGlmIChyZXNwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMCkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIFBPU1Qgb24gYW4gVVJMLCBjaGVja3MgdGhlIHJlc3BvbnNlIGNvZGUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXNwb25zZSBwb3N0KFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgY29udGVudFR5cGUsIE91dHB1dCB3cml0ZXIpIHsKLSAgICAgICAgLy8gbWFrZSB0aGUgY2FsbAotICAgICAgICBSZXNwb25zZSByZXNwID0gZ2V0SHR0cEludm9rZXIoKS5pbnZva2VQT1NUKHVybCwgY29udGVudFR5cGUsIHdyaXRlciwgc2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDEpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRTdGF0dXNDb2RlKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCksIHJlc3AuZ2V0UmVzcG9uc2VNZXNzYWdlKCksIHJlc3AuZ2V0RXJyb3JDb250ZW50KCksIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBQVVQgb24gYW4gVVJMLCBjaGVja3MgdGhlIHJlc3BvbnNlIGNvZGUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXNwb25zZSBwdXQoVXJsQnVpbGRlciB1cmwsIFN0cmluZyBjb250ZW50VHlwZSwgT3V0cHV0IHdyaXRlcikgewotICAgICAgICByZXR1cm4gcHV0KHVybCwgY29udGVudFR5cGUsIG51bGwsIHdyaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBQVVQgb24gYW4gVVJMLCBjaGVja3MgdGhlIHJlc3BvbnNlIGNvZGUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXNwb25zZSBwdXQoVXJsQnVpbGRlciB1cmwsIFN0cmluZyBjb250ZW50VHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLCBPdXRwdXQgd3JpdGVyKSB7Ci0gICAgICAgIC8vIG1ha2UgdGhlIGNhbGwKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IGdldEh0dHBJbnZva2VyKCkuaW52b2tlUFVUKHVybCwgY29udGVudFR5cGUsIGhlYWRlcnMsIHdyaXRlciwgc2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZQotICAgICAgICBpZiAoKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPCAyMDApIHx8IChyZXNwLmdldFJlc3BvbnNlQ29kZSgpID4gMjk5KSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIERFTEVURSBvbiBhbiBVUkwsIGNoZWNrcyB0aGUgcmVzcG9uc2UgY29kZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlKFVybEJ1aWxkZXIgdXJsKSB7Ci0gICAgICAgIC8vIG1ha2UgdGhlIGNhbGwKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IGdldEh0dHBJbnZva2VyKCkuaW52b2tlREVMRVRFKHVybCwgc2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDQpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRTdGF0dXNDb2RlKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCksIHJlc3AuZ2V0UmVzcG9uc2VNZXNzYWdlKCksIHJlc3AuZ2V0RXJyb3JDb250ZW50KCksIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLSBjb21tb24gb3BlcmF0aW9ucyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYXQgbGVhc3Qgb25lIEFDRSBsaXN0IGlzIG5vdCBlbXB0eS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjbE1lcmdlUmVxdWlyZWQoQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzKSB7Ci0gICAgICAgIHJldHVybiAoYWRkQWNlcyAhPSBudWxsICYmIGlzTm90RW1wdHkoYWRkQWNlcy5nZXRBY2VzKCkpKQotICAgICAgICAgICAgICAgIHx8IChyZW1vdmVBY2VzICE9IG51bGwgJiYgaXNOb3RFbXB0eShyZW1vdmVBY2VzLmdldEFjZXMoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1lcmdlcyB0aGUgbmV3IEFDTCBmcm9tIG9yaWdpbmFsLCBhZGQgYW5kIHJlbW92ZSBBQ0VzIGxpc3RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBBY2wgbWVyZ2VBY2xzKEFjbCBvcmlnaW5hbEFjZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcykgewotICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gb3JpZ2luYWxzID0gY29udmVydEFjbFRvTWFwKG9yaWdpbmFsQWNlcyk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBhZGRzID0gY29udmVydEFjbFRvTWFwKGFkZEFjZXMpOwotICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gcmVtb3ZlcyA9IGNvbnZlcnRBY2xUb01hcChyZW1vdmVBY2VzKTsKLSAgICAgICAgTGlzdDxBY2U+IG5ld0FjZXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oKTsKLQotICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIG9yaWdpbmFsIEFDRXMKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gYWNlIDogb3JpZ2luYWxzLmVudHJ5U2V0KCkpIHsKLQotICAgICAgICAgICAgLy8gYWRkIHBlcm1pc3Npb25zCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBhZGRQZXJtaXNzaW9ucyA9IGFkZHMuZ2V0KGFjZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBpZiAoYWRkUGVybWlzc2lvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjZS5nZXRWYWx1ZSgpLmFkZEFsbChhZGRQZXJtaXNzaW9ucyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlbW92ZSBwZXJtaXNzaW9ucwotICAgICAgICAgICAgU2V0PFN0cmluZz4gcmVtb3ZlUGVybWlzc2lvbnMgPSByZW1vdmVzLmdldChhY2UuZ2V0S2V5KCkpOwotICAgICAgICAgICAgaWYgKHJlbW92ZVBlcm1pc3Npb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY2UuZ2V0VmFsdWUoKS5yZW1vdmVBbGwocmVtb3ZlUGVybWlzc2lvbnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IEFDRQotICAgICAgICAgICAgaWYgKCFhY2UuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBuZXdBY2VzLmFkZChuZXcgQWNjZXNzQ29udHJvbEVudHJ5SW1wbChuZXcgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsKGFjZS5nZXRLZXkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4oYWNlLmdldFZhbHVlKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIGFsbCBBQ0VzIHRoYXQgc2hvdWxkIGJlIGFkZGVkIGJ1dCBhcmUgbm90IGluIHRoZSBvcmlnaW5hbCBBQ0UKLSAgICAgICAgLy8gbGlzdAotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNldDxTdHJpbmc+PiBhY2UgOiBhZGRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmICghb3JpZ2luYWxzLmNvbnRhaW5zS2V5KGFjZS5nZXRLZXkoKSkgJiYgIWFjZS5nZXRWYWx1ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG5ld0FjZXMuYWRkKG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwoYWNlLmdldEtleSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhY2UuZ2V0VmFsdWUoKSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKG5ld0FjZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgbGlzdCBvZiBBQ0VzIGludG8gTWFwIGZvciBiZXR0ZXIgaGFuZGxpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGNvbnZlcnRBY2xUb01hcChBY2wgYWNsKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOwotCi0gICAgICAgIGlmIChhY2wgPT0gbnVsbCB8fCBhY2wuZ2V0QWNlcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEFjZSBhY2UgOiBhY2wuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICAvLyBkb24ndCBjb25zaWRlciBpbmRpcmVjdCBBQ0VzIC0gd2UgY2FuJ3QgY2hhbmdlIHRoZW0KLSAgICAgICAgICAgIGlmICghYWNlLmlzRGlyZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWx0aG91Z2ggYSBwcmluY2lwYWwgbXVzdCBub3QgYmUgbnVsbCwgY2hlY2sgaXQKLSAgICAgICAgICAgIGlmIChhY2UuZ2V0UHJpbmNpcGFsKCkgPT0gbnVsbCB8fCBhY2UuZ2V0UHJpbmNpcGFsKCkuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHBlcm1pc3Npb25zID0gcmVzdWx0LmdldChhY2UuZ2V0UHJpbmNpcGFsKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoYWNlLmdldFByaW5jaXBhbCgpLmdldElkKCksIHBlcm1pc3Npb25zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFjZS5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5hZGRBbGwoYWNlLmdldFBlcm1pc3Npb25zKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIFNlcnZpY2UgRG9jdW1lbnQgZnJvbSB0aGUgc2VydmVyIGFuZCBjYWNoZXMgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBpbmZvIG9iamVjdHMsIGNvbGxlY3Rpb25zLCBsaW5rcywgVVJJIHRlbXBsYXRlcywgZXRjLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCBMaXN0PFJlcG9zaXRvcnlJbmZvPiBnZXRSZXBvc2l0b3JpZXNJbnRlcm5hbChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHJlcEluZm9zID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5SW5mbz4oKTsKLQotICAgICAgICAvLyByZXRyaWV2ZSBzZXJ2aWNlIGRvYwotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGdldFNlcnZpY2VEb2NVUkwoKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFUE9TSVRPUllfSUQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgU2VydmljZURvYyBzZXJ2aWNlRG9jID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgU2VydmljZURvYy5jbGFzcyk7Ci0KLSAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSB3b3Jrc3BhY2VzCi0gICAgICAgIGZvciAoUmVwb3NpdG9yeVdvcmtzcGFjZSB3cyA6IHNlcnZpY2VEb2MuZ2V0V29ya3NwYWNlcygpKSB7Ci0gICAgICAgICAgICBpZiAod3MuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm91bmQgYSBub24tQ01JUyB3b3Jrc3BhY2UKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogd3MuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChpcyhOQU1FX0NPTExFQ1RJT04sIGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY29sTWFwID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbGxlY3Rpb24od3MuZ2V0SWQoKSwgY29sTWFwLmdldCgiY29sbGVjdGlvblR5cGUiKSwgY29sTWFwLmdldCgiaHJlZiIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXBvc2l0b3J5TGluayh3cy5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXMoTkFNRV9VUklfVEVNUExBVEUsIGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdGVtcE1hcCA9IChNYXA8U3RyaW5nLCBTdHJpbmc+KSBlbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBhZGRUZW1wbGF0ZSh3cy5nZXRJZCgpLCB0ZW1wTWFwLmdldCgidHlwZSIpLCB0ZW1wTWFwLmdldCgidGVtcGxhdGUiKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgUmVwb3NpdG9yeUluZm8pIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwSW5mb3MuYWRkKChSZXBvc2l0b3J5SW5mbykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlcEluZm9zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbiBvYmplY3QgZnJvbSB0aGUgc2VydmVyIGFuZCBjYWNoZXMgdGhlIGxpbmtzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3REYXRhIGdldE9iamVjdEludGVybmFsKFN0cmluZyByZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlIGlkT3JQYXRoLCBTdHJpbmcgb2JqZWN0SWRPclBhdGgsCi0gICAgICAgICAgICBSZXR1cm5WZXJzaW9uIHJldHVyblZlcnNpb24sIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uc3RhbnRzLlBBUkFNX0lELCBvYmplY3RJZE9yUGF0aCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9QQVRILCBvYmplY3RJZE9yUGF0aCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9SRVRVUk5fVkVSU0lPTiwgcmV0dXJuVmVyc2lvbik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb25zdGFudHMuUEFSQU1fQUNMLCBpbmNsdWRlQWNsKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMsIGluY2x1ZGVQb2xpY3lJZHMpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsKLQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRUZW1wbGF0ZUxpbmsocmVwb3NpdG9yeUlkLCAoaWRPclBhdGggPT0gSWRlbnRpZmllclR5cGUuSUQgPyBDb25zdGFudHMuVEVNUExBVEVfT0JKRUNUX0JZX0lECi0gICAgICAgICAgICAgICAgOiBDb25zdGFudHMuVEVNUExBVEVfT0JKRUNUX0JZX1BBVEgpLCBwYXJhbWV0ZXJzKTsKLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgbWlzc2luZyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIENNSVMgc3BlYwotICAgICAgICBpZiAocmV0dXJuVmVyc2lvbiAhPSBudWxsICYmIHJldHVyblZlcnNpb24gIT0gUmV0dXJuVmVyc2lvbi5USElTKSB7Ci0gICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRVRVUk5fVkVSU0lPTiwgcmV0dXJuVmVyc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOwotCi0gICAgICAgIC8vIHdlIGV4cGVjdCBhIENNSVMgZW50cnkKLSAgICAgICAgaWYgKGVudHJ5LmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJSZWNlaXZlZCBBdG9tIGVudHJ5IGlzIG5vdCBhIENNSVMgZW50cnkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2NrTGlua3MoKTsKLSAgICAgICAgT2JqZWN0RGF0YSByZXN1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2FjaGUKLSAgICAgICAgICAgIHJlbW92ZUxpbmtzKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGVudHJ5LmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZExpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrTGlua3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbkludGVybmFsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQpIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uc3RhbnRzLlBBUkFNX0lELCB0eXBlSWQpOwotCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZFRlbXBsYXRlTGluayhyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5URU1QTEFURV9UWVBFX0JZX0lELCBwYXJhbWV0ZXJzKTsKLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQobmV3IFVybEJ1aWxkZXIobGluaykpOwotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOwotCi0gICAgICAgIC8vIHdlIGV4cGVjdCBhIENNSVMgZW50cnkKLSAgICAgICAgaWYgKGVudHJ5LmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJSZWNlaXZlZCBBdG9tIGVudHJ5IGlzIG5vdCBhIENNSVMgZW50cnkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2NrVHlwZUxpbmtzKCk7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQotICAgICAgICAgICAgcmVtb3ZlVHlwZUxpbmtzKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGVudHJ5LmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoVHlwZURlZmluaXRpb24pIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrVHlwZUxpbmtzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgQUNMIG9mIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNsIGdldEFjbEludGVybmFsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX0FDTCwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX0FDTCwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fT05MWV9CQVNJQ19QRVJNSVNTSU9OUywgb25seUJhc2ljUGVybWlzc2lvbnMpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21BY2wgYWNsID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUFjbC5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIGFjbC5nZXRBQ0woKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBBQ0wgb2YgYW4gb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBBdG9tQWNsIHVwZGF0ZUFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIGZpbmFsIEFjbCBhY2wsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKSB7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfQUNMLCBDb25zdGFudHMuTUVESUFUWVBFX0FDTCk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfQUNMLCBDb25zdGFudHMuTUVESUFUWVBFX0FDTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIGFjbFVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotICAgICAgICBhY2xVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BQ0xfUFJPUEFHQVRJT04sIGFjbFByb3BhZ2F0aW9uKTsKLQotICAgICAgICBmaW5hbCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwdXQoYWNsVXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0FDTCwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxVdGlscy5jcmVhdGVXcml0ZXIob3V0KTsKLSAgICAgICAgICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgWE1MQ29udmVydGVyLndyaXRlQWNsKHdyaXRlciwgY21pc1ZlcnNpb24sIHRydWUsIGFjbCk7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMuZW5kWG1sRG9jdW1lbnQod3JpdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgbmV3IGVudHJ5Ci0gICAgICAgIHJldHVybiBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tQWNsLmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BY2xTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0FjbFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODQ5NDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0FjbFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQWNsU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5FeHRlbmRlZEFjbFNlcnZpY2U7Ci0KLS8qKgotICogQUNMIFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2xTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2UgaW1wbGVtZW50cyBBY2xTZXJ2aWNlLCBFeHRlbmRlZEFjbFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFjbFNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIC8vIGZldGNoIHRoZSBjdXJyZW50IEFDTAotICAgICAgICBBY2wgb3JpZ2luYWxBY2VzID0gZ2V0QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZhbHNlLCBudWxsKTsKLQotICAgICAgICAvLyBpZiBubyBjaGFuZ2VzIHJlcXVpcmVkLCBqdXN0IHJldHVybiB0aGUgQUNMCi0gICAgICAgIGlmICghaXNBY2xNZXJnZVJlcXVpcmVkKGFkZEFjZXMsIHJlbW92ZUFjZXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxBY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWVyZ2UgQUNMcwotICAgICAgICBBY2wgbmV3QUNMID0gbWVyZ2VBY2xzKG9yaWdpbmFsQWNlcywgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIEFDTAotICAgICAgICBBdG9tQWNsIGFjbCA9IHVwZGF0ZUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBuZXdBQ0wsIGFjbFByb3BhZ2F0aW9uKTsKLSAgICAgICAgQWNsIHJlc3VsdCA9IGFjbC5nZXRBQ0woKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRBY2xJbnRlcm5hbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIHNldEFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEFjbCBhY2VzKSB7Ci0gICAgICAgIEF0b21BY2wgYWNsID0gdXBkYXRlQWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFjZXMsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFkpOwotICAgICAgICBBY2wgcmVzdWx0ID0gYWNsLmdldEFDTCgpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0F0b21FbnRyeVdyaXRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0F0b21FbnRyeVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWMwYWQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BdG9tRW50cnlXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQVRPTV9JRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19BVE9NX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0FUT01fVVBEQVRFRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19DT05URU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0NPTlRFTlRfQkFTRTY0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0NPTlRFTlRfRklMRU5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQ09OVEVOVF9NRURJQVRZUEU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlSW1wbDsKLQotLyoqCi0gKiBXcml0ZXMgYSBDTUlTIEF0b20gZW50cnkgdG8gYW4gb3V0cHV0IHN0cmVhbS4KLSAqLwotcHVibGljIGNsYXNzIEF0b21FbnRyeVdyaXRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA2NCAqIDEwMjQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0RGF0YSBvYmplY3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW07Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW07Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmOwotICAgIHByaXZhdGUgZmluYWwgQnVsa1VwZGF0ZUltcGwgYnVsa1VwZGF0ZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBvYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBBdG9tRW50cnlXcml0ZXIoT2JqZWN0RGF0YSBvYmplY3QsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMob2JqZWN0LCBjbWlzVmVyc2lvbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIEF0b21FbnRyeVdyaXRlcihPYmplY3REYXRhIG9iamVjdCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSkgewotICAgICAgICBpZiAoKG9iamVjdCA9PSBudWxsKSB8fCAob2JqZWN0LmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBhbmQgcHJvcGVydGllcyBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChjb250ZW50U3RyZWFtICE9IG51bGwpICYmIChjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJNZWRpYSB0eXBlIG11c3QgYmUgc2V0IGlmIGEgc3RyZWFtIGlzIHByZXNlbnQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICAgICAgdGhpcy5jbWlzVmVyc2lvbiA9IGNtaXNWZXJzaW9uOwotICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0gPSBjb250ZW50U3RyZWFtOwotICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsICYmIGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpOwotCi0gICAgICAgICAgICAvLyBhdm9pZCBkb3VibGUgYnVmZmVyaW5nCi0gICAgICAgICAgICBpZiAoIShpbiBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW5wdXRTdHJlYW0pICYmICEoaW4gaW5zdGFuY2VvZiBCeXRlQXJyYXlJbnB1dFN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbiwgQlVGRkVSX1NJWkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy50eXBlRGVmID0gbnVsbDsKLSAgICAgICAgdGhpcy5idWxrVXBkYXRlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdHlwZXMuCi0gICAgICovCi0gICAgcHVibGljIEF0b21FbnRyeVdyaXRlcihUeXBlRGVmaW5pdGlvbiB0eXBlLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy50eXBlRGVmID0gdHlwZTsKLSAgICAgICAgdGhpcy5jbWlzVmVyc2lvbiA9IGNtaXNWZXJzaW9uOwotICAgICAgICB0aGlzLm9iamVjdCA9IG51bGw7Ci0gICAgICAgIHRoaXMuY29udGVudFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRoaXMuc3RyZWFtID0gbnVsbDsKLSAgICAgICAgdGhpcy5idWxrVXBkYXRlID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYnVsayB1cGRhdGVzLgotICAgICAqLwotICAgIHB1YmxpYyBBdG9tRW50cnlXcml0ZXIoQnVsa1VwZGF0ZUltcGwgYnVsa1VwZGF0ZSkgewotICAgICAgICBpZiAoYnVsa1VwZGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQnVsayB1cGRhdGUgZGF0YSBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5idWxrVXBkYXRlID0gYnVsa1VwZGF0ZTsKLSAgICAgICAgdGhpcy50eXBlRGVmID0gbnVsbDsKLSAgICAgICAgdGhpcy5jbWlzVmVyc2lvbiA9IENtaXNWZXJzaW9uLkNNSVNfMV8xOwotICAgICAgICB0aGlzLm9iamVjdCA9IG51bGw7Ci0gICAgICAgIHRoaXMuY29udGVudFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRoaXMuc3RyZWFtID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGVudHJ5IHRvIGFuIG91dHB1dCBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxVdGlscy5jcmVhdGVXcml0ZXIob3V0KTsKLQotICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgImVudHJ5IiwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NKTsKLQotICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00pOwotICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoWE1MQ29uc3RhbnRzLlBSRUZJWF9DTUlTLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSk7Ci0gICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwgJiYgY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShYTUxDb25zdGFudHMuUFJFRklYX0FQQUNIRV9DSEVNSVNUWSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BUEFDSEVfQ0hFTUlTVFJZKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF0b206aWQKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBYTUxDb25zdGFudHMuUFJFRklYX0FUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSwgVEFHX0FUT01fSUQsCi0gICAgICAgICAgICAgICAgInVybjp1dWlkOjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwIik7Ci0KLSAgICAgICAgLy8gYXRvbTp0aXRsZQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLCBUQUdfQVRPTV9USVRMRSwgZ2V0VGl0bGUoKSk7Ci0KLSAgICAgICAgLy8gYXRvbTp1cGRhdGVkCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sIFRBR19BVE9NX1VQREFURUQsCi0gICAgICAgICAgICAgICAgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSkpOwotCi0gICAgICAgIC8vIGNvbnRlbnQKLSAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgVEFHX0NPTlRFTlQsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00pOwotCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sCi0gICAgICAgICAgICAgICAgICAgIFRBR19DT05URU5UX01FRElBVFlQRSwgY29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpKTsKLQotICAgICAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBYTUxDb25zdGFudHMuUFJFRklYX0FQQUNIRV9DSEVNSVNUWSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BUEFDSEVfQ0hFTUlTVFJZLAotICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0NPTlRFTlRfRklMRU5BTUUsIGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChYTUxDb25zdGFudHMuUFJFRklYX1JFU1RBVE9NLCBUQUdfQ09OVEVOVF9CQVNFNjQsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00pOwotICAgICAgICAgICAgd3JpdGVDb250ZW50KHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG9iamVjdAotICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhNTENvbnZlcnRlci53cml0ZU9iamVjdCh3cml0ZXIsIGNtaXNWZXJzaW9uLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCBvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdHlwZQotICAgICAgICBpZiAodHlwZURlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBYTUxDb252ZXJ0ZXIud3JpdGVUeXBlRGVmaW5pdGlvbih3cml0ZXIsIGNtaXNWZXJzaW9uLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCB0eXBlRGVmKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1bGsgdXBkYXRlCi0gICAgICAgIGlmIChidWxrVXBkYXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhNTENvbnZlcnRlci53cml0ZUJ1bGtVcGRhdGUod3JpdGVyLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCBidWxrVXBkYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVuZCBlbnRyeQotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgLy8gZW5kIGRvY3VtZW50Ci0gICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBpbnRlcm5hbCAtLS0tCi0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUaXRsZSgpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IG5hbWVQcm9wZXJ0eSA9IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgICAgIGlmIChuYW1lUHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgoUHJvcGVydHlTdHJpbmcpIG5hbWVQcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGVEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHR5cGVEZWYuZ2V0RGlzcGxheU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHlwZURlZi5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJ1bGtVcGRhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gIkJ1bGsgVXBkYXRlIFByb3BlcnRpZXMiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVDb250ZW50KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICAgICAgQmFzZTY0LklucHV0U3RyZWFtIGI2NHN0cmVhbSA9IG5ldyBCYXNlNjQuSW5wdXRTdHJlYW0oc3RyZWFtLCBCYXNlNjQuRU5DT0RFKTsKLQotICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbQlVGRkVSX1NJWkVdOwotICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgaW50IGI7Ci0gICAgICAgIHdoaWxlICgoYiA9IGI2NHN0cmVhbS5yZWFkKCkpID4gLTEpIHsKLSAgICAgICAgICAgIGJ1ZmZlcltwb3MrK10gPSAoY2hhcikgKGIgJiAweEZGKTsKLSAgICAgICAgICAgIGlmIChwb3MgPT0gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3MgPiAwKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGJ1ZmZlciwgMCwgcG9zKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BdG9tUHViUGFyc2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQXRvbVB1YlBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk1MzU0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9BdG9tUHViUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuQ09OVEVOVF9TUkM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5MSU5LX0hSRUY7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5MSU5LX1JFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLkxJTktfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19BQ0w7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfQUxMT1dBQkxFQUNUSU9OUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19DSElMRFJFTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19DT0xMRUNUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0NPTExFQ1RJT05fVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19DT05URU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0VOVFJZOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX0ZFRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfSFRNTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19MSU5LOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX05VTV9JVEVNUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19PQkpFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfUEFUSF9TRUdNRU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX1JFTEFUSVZFX1BBVEhfU0VHTUVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19SRVBPU0lUT1JZX0lORk87Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfU0VSVklDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19URU1QTEFURV9URU1QTEFURTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkNtaXNBdG9tUHViQ29uc3RhbnRzLlRBR19URU1QTEFURV9UWVBFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5DbWlzQXRvbVB1YkNvbnN0YW50cy5UQUdfVVJJX1RFTVBMQVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQ21pc0F0b21QdWJDb25zdGFudHMuVEFHX1dPUktTUEFDRTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21CYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRmVlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5IdG1sRG9jOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLlJlcG9zaXRvcnlXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuU2VydmljZURvYzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb25zdHJhaW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLQotLyoqCi0gKiBBdG9tUHViIFBhcnNlci4KLSAqLwotcHVibGljIGNsYXNzIEF0b21QdWJQYXJzZXIgewotCi0gICAgLy8gcHVibGljIGNvbnN0YW50cwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfUkVMX0NPTlRFTlQgPSAiQEBjb250ZW50QEAiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW07Ci0gICAgcHJpdmF0ZSBBdG9tQmFzZSBwYXJzZVJlc3VsdDsKLQotICAgIHB1YmxpYyBBdG9tUHViUGFyc2VyKElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHN0cmVhbS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBYTUxVdGlscy5jcmVhdGVQYXJzZXIoc3RyZWFtKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00uZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX0ZFRUQuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VSZXN1bHQgPSBwYXJzZUZlZWQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0VOVFJZLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzdWx0ID0gcGFyc2VFbnRyeShwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQ01JUy5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfQUxMT1dBQkxFQUNUSU9OUy5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdCA9IHBhcnNlQWxsb3dhYmxlQWN0aW9ucyhwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfQUNMLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzdWx0ID0gcGFyc2VBQ0wocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQUC5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUQUdfU0VSVklDRS5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVJlc3VsdCA9IHBhcnNlU2VydmljZURvYyhwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19IVE1MLmVxdWFsc0lnbm9yZUNhc2UobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUmVzdWx0ID0gbmV3IEh0bWxEb2MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlci5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIHhzZSkgewotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc3RyZWFtIGlzIHJlYWQgYW5kIGNsb3NlZCBpbiBhbGwgY2FzZXMKLSAgICAgICAgICAgIElPVXRpbHMuY29uc3VtZUFuZENsb3NlKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHBhcnNlIHJlc3VsdHMuCi0gICAgICovCi0gICAgcHVibGljIEF0b21CYXNlIGdldFJlc3VsdHMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJzZVJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBzZXJ2aWNlIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFNlcnZpY2VEb2MgcGFyc2VTZXJ2aWNlRG9jKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlRG9jIHJlc3VsdCA9IG5ldyBTZXJ2aWNlRG9jKCk7Ci0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQUC5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19XT1JLU1BBQ0UuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkV29ya3NwYWNlKHBhcnNlV29ya3NwYWNlKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghWE1MVXRpbHMubmV4dChwYXJzZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgd29ya3NwYWNlIGVsZW1lbnQgaW4gYSBzZXJ2aWNlIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFJlcG9zaXRvcnlXb3Jrc3BhY2UgcGFyc2VXb3Jrc3BhY2UoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlcG9zaXRvcnlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gbmV3IFJlcG9zaXRvcnlXb3Jrc3BhY2UoKTsKLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIEF0b21FbGVtZW50IGVsZW1lbnQgPSBwYXJzZVdvcmtzcGFjZUVsZW1lbnQocGFyc2VyKTsKLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiBleHRyYWN0IHRoZSB3b3Jrc3BhY2UgaWQKLSAgICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQgIT0gbnVsbCkgJiYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5SW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlLnNldElkKCgoUmVwb3NpdG9yeUluZm8pIGVsZW1lbnQuZ2V0T2JqZWN0KCkpLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0byB3b3Jrc3BhY2UKLSAgICAgICAgICAgICAgICB3b3Jrc3BhY2UuYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghWE1MVXRpbHMubmV4dChwYXJzZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gd29ya3NwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhbiBBdG9tIGZlZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBdG9tRmVlZCBwYXJzZUZlZWQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIEF0b21GZWVkIHJlc3VsdCA9IG5ldyBBdG9tRmVlZCgpOwotCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX0xJTksuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRWxlbWVudChwYXJzZUxpbmsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0VOVFJZLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVudHJ5KHBhcnNlRW50cnkocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00uZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTlVNX0lURU1TLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQocGFyc2VCaWdJbnRlZ2VyKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQQUNIRV9DSEVNSVNUUlkuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbGVtZW50KHBhcnNlVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIEF0b20gZW50cnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBdG9tRW50cnkgcGFyc2VFbnRyeShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgQXRvbUVudHJ5IHJlc3VsdCA9IG5ldyBBdG9tRW50cnkoKTsKLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCB0YWdzIGluIGVudHJ5Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBBdG9tRWxlbWVudCBlbGVtZW50ID0gcGFyc2VFbGVtZW50KHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdG8gZW50cnkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBhbmQgc2V0IG9iamVjdCBpZAotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRJZCgoKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldElkKCgoVHlwZURlZmluaXRpb24pIGVsZW1lbnQuZ2V0T2JqZWN0KCkpLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIEFsbG93YWJsZSBBY3Rpb25zIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEF0b21BbGxvd2FibGVBY3Rpb25zIHBhcnNlQWxsb3dhYmxlQWN0aW9ucyhYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBdG9tQWxsb3dhYmxlQWN0aW9ucyhYTUxDb252ZXJ0ZXIuY29udmVydEFsbG93YWJsZUFjdGlvbnMocGFyc2VyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIEFDTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tQWNsIHBhcnNlQUNMKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEF0b21BY2woWE1MQ29udmVydGVyLmNvbnZlcnRBY2wocGFyc2VyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBdG9tRWxlbWVudCBwYXJzZUVsZW1lbnQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgaWYgKFRBR19PQkpFQ1QuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCBYTUxDb252ZXJ0ZXIuY29udmVydE9iamVjdChwYXJzZXIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1BBVEhfU0VHTUVOVC5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgVEFHX1JFTEFUSVZFX1BBVEhfU0VHTUVOVC5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUZXh0KHBhcnNlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19UWVBFLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXRvbUVsZW1lbnQobmFtZSwgWE1MQ29udmVydGVyLmNvbnZlcnRUeXBlRGVmaW5pdGlvbihwYXJzZXIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0NISUxEUkVOLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUNoaWxkcmVuKHBhcnNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgaWYgKFRBR19MSU5LLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUxpbmsocGFyc2VyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0NPTlRFTlQuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlQXRvbUNvbnRlbnRTcmMocGFyc2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIGRvbid0IGtub3cgaXQgLSBza2lwIGl0Ci0gICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBjaGlsZHJlbiBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgQXRvbUVsZW1lbnQgcGFyc2VDaGlsZHJlbihYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgQXRvbUVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgUU5hbWUgY2hpbGROYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBjaGlsZHJlbiB0YWcKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19GRUVELmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEF0b21FbGVtZW50KGNoaWxkTmFtZSwgcGFyc2VGZWVkKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghWE1MVXRpbHMubmV4dChwYXJzZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHdvcmtzcGFjZSBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEF0b21FbGVtZW50IHBhcnNlV29ya3NwYWNlRWxlbWVudChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00uZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICBpZiAoVEFHX1JFUE9TSVRPUllfSU5GTy5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF0b21FbGVtZW50KG5hbWUsIFhNTENvbnZlcnRlci5jb252ZXJ0UmVwb3NpdG9yeUluZm8ocGFyc2VyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19VUklfVEVNUExBVEUuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVGVtcGxhdGUocGFyc2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00uZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICBpZiAoVEFHX0xJTksuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlTGluayhwYXJzZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBQLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgaWYgKFRBR19DT0xMRUNUSU9OLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUNvbGxlY3Rpb24ocGFyc2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIGRvbid0IGtub3cgaXQgLSBza2lwIGl0Ci0gICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBjb2xsZWN0aW9uIHRhZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tRWxlbWVudCBwYXJzZUNvbGxlY3Rpb24oWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIHJlc3VsdC5wdXQoImhyZWYiLCBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImhyZWYiKSk7Ci0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSB0YWdOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTS5lcXVhbHModGFnTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIFRBR19DT0xMRUNUSU9OX1RZUEUuZXF1YWxzKHRhZ05hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoImNvbGxlY3Rpb25UeXBlIiwgWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIVhNTFV0aWxzLm5leHQocGFyc2VyKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHRlbXBsYXRlIHRhZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tRWxlbWVudCBwYXJzZVRlbXBsYXRlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBRTmFtZSBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLmVxdWFscyh0YWdOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX1RFTVBMQVRFX1RFTVBMQVRFLmVxdWFscyh0YWdOYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dCgidGVtcGxhdGUiLCBYTUxVdGlscy5yZWFkVGV4dChwYXJzZXIsIFhNTENvbnN0cmFpbnRzLk1BWF9TVFJJTkdfTEVOR1RIKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1RFTVBMQVRFX1RZUEUuZXF1YWxzKHRhZ05hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KCJ0eXBlIiwgWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghWE1MVXRpbHMubmV4dChwYXJzZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gbmV3IEF0b21FbGVtZW50KG5hbWUsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgbGluayB0YWcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXRvbUVsZW1lbnQgcGFyc2VMaW5rKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBRTmFtZSBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgQXRvbUxpbmsgcmVzdWx0ID0gbmV3IEF0b21MaW5rKCk7Ci0KLSAgICAgICAgLy8gc2F2ZSBhdHRyaWJ1dGVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgaWYgKExJTktfUkVMLmVxdWFscyhwYXJzZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRSZWwocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTElOS19IUkVGLmVxdWFscyhwYXJzZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIcmVmKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKExJTktfVFlQRS5lcXVhbHMocGFyc2VyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKSkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0VHlwZShwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2tpcCBlbmNsb3NlZCB0YWdzLCBpZiBhbnkKLSAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotCi0gICAgICAgIHJldHVybiBuZXcgQXRvbUVsZW1lbnQobmFtZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBsaW5rIHRhZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tRWxlbWVudCBwYXJzZUF0b21Db250ZW50U3JjKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBRTmFtZSBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLSAgICAgICAgQXRvbUxpbmsgcmVzdWx0ID0gbmV3IEF0b21MaW5rKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRSZWwoTElOS19SRUxfQ09OVEVOVCk7Ci0KLSAgICAgICAgLy8gc2F2ZSBhdHRyaWJ1dGVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgaWYgKENPTlRFTlRfU1JDLmVxdWFscyhwYXJzZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIcmVmKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBza2lwIGVuY2xvc2VkIHRhZ3MsIGlmIGFueQotICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBBdG9tRWxlbWVudChuYW1lLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHRleHQgdGFnLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEF0b21FbGVtZW50IHBhcnNlVGV4dChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgbmFtZSA9IHBhcnNlci5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBuZXcgQXRvbUVsZW1lbnQobmFtZSwgWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHRleHQgdGFnIGFuZCBjb252ZXJ0IGl0IGludG8gYW4gaW50ZWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBdG9tRWxlbWVudCBwYXJzZUJpZ0ludGVnZXIoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gbmV3IEF0b21FbGVtZW50KG5hbWUsIG5ldyBCaWdJbnRlZ2VyKFhNTFV0aWxzLnJlYWRUZXh0KHBhcnNlciwgWE1MQ29uc3RyYWludHMuTUFYX1NUUklOR19MRU5HVEgpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0NtaXNBdG9tUHViQ29uc3RhbnRzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQ21pc0F0b21QdWJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMmI0OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQ21pc0F0b21QdWJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7Ci0KLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIEF0b21QdWIuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbWlzQXRvbVB1YkNvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIENtaXNBdG9tUHViQ29uc3RhbnRzKCkgewotICAgIH0KLQotICAgIC8vIHNlcnZpY2UgZG9jCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NFUlZJQ0UgPSAic2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1dPUktTUEFDRSA9ICJ3b3Jrc3BhY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBPU0lUT1JZX0lORk8gPSAicmVwb3NpdG9yeUluZm8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT0xMRUNUSU9OID0gImNvbGxlY3Rpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT0xMRUNUSU9OX1RZUEUgPSAiY29sbGVjdGlvblR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19VUklfVEVNUExBVEUgPSAidXJpdGVtcGxhdGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19URU1QTEFURV9URU1QTEFURSA9ICJ0ZW1wbGF0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RFTVBMQVRFX1RZUEUgPSAidHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0xJTksgPSAibGluayI7Ci0KLSAgICAvLyBhdG9tCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUT01fSUQgPSAiaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVE9NX1RJVExFID0gInRpdGxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRPTV9VUERBVEVEID0gInVwZGF0ZWQiOwotCi0gICAgLy8gZmVlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GRUVEID0gImZlZWQiOwotCi0gICAgLy8gZW50cnkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRU5UUlkgPSAiZW50cnkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1QgPSAib2JqZWN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTlVNX0lURU1TID0gIm51bUl0ZW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFUSF9TRUdNRU5UID0gInBhdGhTZWdtZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVMQVRJVkVfUEFUSF9TRUdNRU5UID0gInJlbGF0aXZlUGF0aFNlZ21lbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFID0gInR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DSElMRFJFTiA9ICJjaGlsZHJlbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRFTlQgPSAiY29udGVudCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRFTlRfTUVESUFUWVBFID0gIm1lZGlhdHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRFTlRfQkFTRTY0ID0gImJhc2U2NCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRFTlRfRklMRU5BTUUgPSAiZmlsZW5hbWUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ET0NVTUVOVF9UWVBFID0gImNtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9GT0xERVJfVFlQRSA9ICJjbWlzVHlwZUZvbGRlckRlZmluaXRpb25UeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFTEFUSU9OU0hJUF9UWVBFID0gImNtaXNUeXBlUmVsYXRpb25zaGlwRGVmaW5pdGlvblR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUE9MSUNZX1RZUEUgPSAiY21pc1R5cGVQb2xpY3lEZWZpbml0aW9uVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JVEVNX1RZUEUgPSAiY21pc1R5cGVJdGVtRGVmaW5pdGlvblR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU0VDT05EQVJZX1RZUEUgPSAiY21pc1R5cGVTZWNvbmRhcnlEZWZpbml0aW9uVHlwZSI7Ci0KLSAgICAvLyBhbGxvd2FibGUgYWN0aW9ucwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BTExPV0FCTEVBQ1RJT05TID0gImFsbG93YWJsZUFjdGlvbnMiOwotCi0gICAgLy8gQUNMCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDTCA9ICJhY2wiOwotCi0gICAgLy8gSFRNTAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19IVE1MID0gImh0bWwiOwotCi0gICAgLy8gbGlua3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1JFTCA9ICJyZWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfSFJFRiA9ICJocmVmIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1RZUEUgPSAidHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9TUkMgPSAic3JjIjsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0NtaXNBdG9tUHViU3BpLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQ21pc0F0b21QdWJTcGkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllNGUyNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvQ21pc0F0b21QdWJTcGkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkNtaXNTcGk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQWNsU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk11bHRpRmlsaW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5PYmplY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlBvbGljeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVsYXRpb25zaGlwU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIENNSVMgQXRvbVB1YiBTUEkgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzQXRvbVB1YlNwaSBpbXBsZW1lbnRzIENtaXNTcGkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENtaXNBdG9tUHViU3BpLmNsYXNzKTsKLQotICAgIHByaXZhdGUgZmluYWwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbjsKLQotICAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeVNlcnZpY2UgcmVwb3NpdG9yeVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBOYXZpZ2F0aW9uU2VydmljZSBuYXZpZ2F0aW9uU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFNlcnZpY2Ugb2JqZWN0U2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25pbmdTZXJ2aWNlIHZlcnNpb25pbmdTZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgRGlzY292ZXJ5U2VydmljZSBkaXNjb3ZlcnlTZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgTXVsdGlGaWxpbmdTZXJ2aWNlIG11bHRpRmlsaW5nU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIFJlbGF0aW9uc2hpcFNlcnZpY2UgcmVsYXRpb25zaGlwU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIFBvbGljeVNlcnZpY2UgcG9saWN5U2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjbFNlcnZpY2UgYWNsU2VydmljZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQXRvbVB1YlNwaShCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXNzaW9uIHt9OiBJbml0aWFsaXppbmcgQXRvbVB1YiBTUEkuLi4iLCBzZXNzaW9uLmdldFNlc3Npb25JZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0KLSAgICAgICAgcmVwb3NpdG9yeVNlcnZpY2UgPSBuZXcgUmVwb3NpdG9yeVNlcnZpY2VJbXBsKHNlc3Npb24pOwotICAgICAgICBuYXZpZ2F0aW9uU2VydmljZSA9IG5ldyBOYXZpZ2F0aW9uU2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgICAgIG9iamVjdFNlcnZpY2UgPSBuZXcgT2JqZWN0U2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgICAgIHZlcnNpb25pbmdTZXJ2aWNlID0gbmV3IFZlcnNpb25pbmdTZXJ2aWNlSW1wbChzZXNzaW9uKTsKLSAgICAgICAgZGlzY292ZXJ5U2VydmljZSA9IG5ldyBEaXNjb3ZlcnlTZXJ2aWNlSW1wbChzZXNzaW9uKTsKLSAgICAgICAgbXVsdGlGaWxpbmdTZXJ2aWNlID0gbmV3IE11bHRpRmlsaW5nU2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgICAgIHJlbGF0aW9uc2hpcFNlcnZpY2UgPSBuZXcgUmVsYXRpb25zaGlwU2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgICAgIHBvbGljeVNlcnZpY2UgPSBuZXcgUG9saWN5U2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgICAgIGFjbFNlcnZpY2UgPSBuZXcgQWNsU2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlIGdldE5hdmlnYXRpb25TZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gbmF2aWdhdGlvblNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFNlcnZpY2UgZ2V0T2JqZWN0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIERpc2NvdmVyeVNlcnZpY2UgZ2V0RGlzY292ZXJ5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGRpc2NvdmVyeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlIGdldFZlcnNpb25pbmdTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gdmVyc2lvbmluZ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE11bHRpRmlsaW5nU2VydmljZSBnZXRNdWx0aUZpbGluZ1NlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtdWx0aUZpbGluZ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbGF0aW9uc2hpcFNlcnZpY2UgZ2V0UmVsYXRpb25zaGlwU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeVNlcnZpY2UgZ2V0UG9saWN5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvbGljeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbFNlcnZpY2UgZ2V0QWNsU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGFjbFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZXMoKSB7Ci0gICAgICAgIHNlc3Npb24ucmVtb3ZlKFNwaVNlc3Npb25QYXJhbWV0ZXIuTElOS19DQUNIRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJSZXBvc2l0b3J5Q2FjaGUoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBMaW5rQ2FjaGUgbGlua0NhY2hlID0gKExpbmtDYWNoZSkgc2Vzc2lvbi5nZXQoU3BpU2Vzc2lvblBhcmFtZXRlci5MSU5LX0NBQ0hFKTsKLSAgICAgICAgaWYgKGxpbmtDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rQ2FjaGUuY2xlYXJSZXBvc2l0b3J5KHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgLy8gbm8tb3AgZm9yIEF0b21QdWIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvRGlzY292ZXJ5U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTdjMzZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRmVlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0TGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlF1ZXJ5VHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRGlzY292ZXJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5FeHRlbmRlZEhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci0KLS8qKgotICogRGlzY292ZXJ5IFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjb3ZlcnlTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2UgaW1wbGVtZW50cyBEaXNjb3ZlcnlTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEaXNjb3ZlcnlTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0Q29udGVudENoYW5nZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlTG9nVG9rZW4sIEJvb2xlYW4gaW5jbHVkZVByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFDTCwgQmlnSW50ZWdlciBtYXhJdGVtcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdExpc3RJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3RMaXN0SW1wbCgpOwotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBudWxsOwotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG51bGw7Ci0KLSAgICAgICAgLy8gaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXNuJ3Qga25vdyB0aGUgY2hhbmdlIGxvZyB0b2tlbiBidXQgdGhlIGxpbmsgdG8KLSAgICAgICAgLy8gdGhlIG5leHQgQXRvbSBmZWVkCi0gICAgICAgIGlmIChjaGFuZ2VMb2dUb2tlbiBpbnN0YW5jZW9mIEV4dGVuZGVkSG9sZGVyICYmIGNoYW5nZUxvZ1Rva2VuLmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgbGluayA9IChTdHJpbmcpICgoRXh0ZW5kZWRIb2xkZXI8U3RyaW5nPikgY2hhbmdlTG9nVG9rZW4pLmdldEV4dHJhVmFsdWUoQ29uc3RhbnRzLlJFUF9SRUxfQ0hBTkdFUyk7Ci0gICAgICAgICAgICBpZiAobGluayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgYXBwbGljYXRpb24gZGlkbid0IHByb3ZpZGUgYSBsaW5rIHRvIG5leHQgQXRvbSBmZWVkCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmsgPSBsb2FkUmVwb3NpdG9yeUxpbmsocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuUkVQX1JFTF9DSEFOR0VTKTsKLSAgICAgICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfTE9HX1RPS0VOLAotICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUxvZ1Rva2VuID09IG51bGwgPyBudWxsIDogY2hhbmdlTG9nVG9rZW4uZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BST1BFUlRJRVMsIGluY2x1ZGVQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUE9MSUNZX0lEUywgaW5jbHVkZVBvbGljeUlkcyk7Ci0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUNMLCBpbmNsdWRlQUNMKTsKLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMsIG1heEl0ZW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciBjb250ZW50IGNoYW5nZXMgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7Ci0gICAgICAgIFN0cmluZyBsYXN0Q2hhbmdlTG9nVG9rZW4gPSBudWxsOwotCi0gICAgICAgIC8vIGhhbmRsZSB0b3AgbGV2ZWwKLSAgICAgICAgU3RyaW5nIG5leHRMaW5rID0gbnVsbDsKLSAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZmVlZC5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTmV4dExpbmsoZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgICAgICBuZXh0TGluayA9ICgoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpLmdldEhyZWYoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW50KE5BTUVfTlVNX0lURU1TLCBlbGVtZW50KSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcygoQmlnSW50ZWdlcikgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyKCJjaGFuZ2VMb2dUb2tlbiIsIGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgbGFzdENoYW5nZUxvZ1Rva2VuID0gKFN0cmluZykgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgY2hhbmdlcwotICAgICAgICBpZiAoIWZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldE9iamVjdHMobmV3IEFycmF5TGlzdDxPYmplY3REYXRhPihmZWVkLmdldEVudHJpZXMoKS5zaXplKCkpKTsKLQotICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgaGl0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGl0ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGl0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQoaGl0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hhbmdlTG9nVG9rZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdGhlIEF0b21QdWIgYmluZGluZyBjYW5ub3QgcmV0dXJuIGEgbmV3IGNoYW5nZSBsb2cgdG9rZW4sCi0gICAgICAgICAgICAvLyBidXQgYW4gT3BlbkNNSVMgc2VydmVyIHVzZXMgYSBwcm9wcmlldGFyeSB0YWcKLSAgICAgICAgICAgIGNoYW5nZUxvZ1Rva2VuLnNldFZhbHVlKGxhc3RDaGFuZ2VMb2dUb2tlbik7Ci0KLSAgICAgICAgICAgIC8vIGJ1dCB3ZSBjYW4gcHJvdmlkZSB0aGUgbGluayB0byB0aGUgbmV4dCBBdG9tIGZlZWQKLSAgICAgICAgICAgIGlmIChjaGFuZ2VMb2dUb2tlbiBpbnN0YW5jZW9mIEV4dGVuZGVkSG9sZGVyICYmIG5leHRMaW5rICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAoKEV4dGVuZGVkSG9sZGVyPFN0cmluZz4pIGNoYW5nZUxvZ1Rva2VuKS5zZXRFeHRyYVZhbHVlKENvbnN0YW50cy5SRVBfUkVMX0NIQU5HRVMsIG5leHRMaW5rKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsKLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuQ09MTEVDVElPTl9RVUVSWSk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHF1ZXJ5IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotCi0gICAgICAgIC8vIGNvbXBpbGUgcXVlcnkgcmVxdWVzdAotICAgICAgICBmaW5hbCBRdWVyeVR5cGVJbXBsIHF1ZXJ5ID0gbmV3IFF1ZXJ5VHlwZUltcGwoKTsKLSAgICAgICAgcXVlcnkuc2V0U3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgIHF1ZXJ5LnNldFNlYXJjaEFsbFZlcnNpb25zKHNlYXJjaEFsbFZlcnNpb25zKTsKLSAgICAgICAgcXVlcnkuc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICBxdWVyeS5zZXRJbmNsdWRlUmVsYXRpb25zaGlwcyhpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHF1ZXJ5LnNldFJlbmRpdGlvbkZpbHRlcihyZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICBxdWVyeS5zZXRNYXhJdGVtcyhtYXhJdGVtcyk7Ci0gICAgICAgIHF1ZXJ5LnNldFNraXBDb3VudChza2lwQ291bnQpOwotCi0gICAgICAgIGZpbmFsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAvLyBwb3N0IHRoZSBxdWVyeSBhbmQgcGFyc2UgcmVzdWx0cwotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfUVVFUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MVXRpbHMuY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMuc3RhcnRYbWxEb2N1bWVudCh3cml0ZXIpOwotICAgICAgICAgICAgICAgIFhNTENvbnZlcnRlci53cml0ZVF1ZXJ5KHdyaXRlciwgY21pc1ZlcnNpb24sIHF1ZXJ5KTsKLSAgICAgICAgICAgICAgICBYTUxVdGlscy5lbmRYbWxEb2N1bWVudCh3cml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsKLQotICAgICAgICAvLyBoYW5kbGUgdG9wIGxldmVsCi0gICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGZlZWQuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgIGlmIChpc05leHRMaW5rKGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW50KE5BTUVfTlVNX0lURU1TLCBlbGVtZW50KSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcygoQmlnSW50ZWdlcikgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHJlc3VsdCBzZXQKLSAgICAgICAgaWYgKCFmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oZmVlZC5nZXRFbnRyaWVzKCkuc2l6ZSgpKSk7Ci0KLSAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIGhpdCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5Ci0gICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhpdCA9IChPYmplY3REYXRhKSBlbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhpdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRPYmplY3RzKCkuYWRkKGhpdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvTGlua0NhY2hlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvTGlua0NhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYzVhMDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL0xpbmtDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuQ2FjaGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsLkNvbnRlbnRUeXBlQ2FjaGVMZXZlbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuTHJ1Q2FjaGVMZXZlbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLmltcGwuTWFwQ2FjaGVMZXZlbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLQotLyoqCi0gKiBMaW5rIGNhY2hlLgotICovCi1wdWJsaWMgY2xhc3MgTGlua0NhY2hlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gS05PV05fTElOS1MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9BQ0wpOwotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9ET1dOKTsKLSAgICAgICAgS05PV05fTElOS1MuYWRkKENvbnN0YW50cy5SRUxfVVApOwotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFKTsKLSAgICAgICAgS05PV05fTElOS1MuYWRkKENvbnN0YW50cy5SRUxfUkVMQVRJT05TSElQUyk7Ci0gICAgICAgIEtOT1dOX0xJTktTLmFkZChDb25zdGFudHMuUkVMX1NFTEYpOwotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9BTExPV0FCTEVBQ1RJT05TKTsKLSAgICAgICAgS05PV05fTElOS1MuYWRkKENvbnN0YW50cy5SRUxfRURJVE1FRElBKTsKLSAgICAgICAgS05PV05fTElOS1MuYWRkKENvbnN0YW50cy5SRUxfUE9MSUNJRVMpOwotICAgICAgICBLTk9XTl9MSU5LUy5hZGQoQ29uc3RhbnRzLlJFTF9WRVJTSU9OSElTVE9SWSk7Ci0gICAgICAgIEtOT1dOX0xJTktTLmFkZChDb25zdGFudHMuUkVMX1dPUktJTkdDT1BZKTsKLSAgICAgICAgS05PV05fTElOS1MuYWRkKEF0b21QdWJQYXJzZXIuTElOS19SRUxfQ09OVEVOVCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBDYWNoZSBsaW5rQ2FjaGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDYWNoZSB0eXBlTGlua0NhY2hlOwotICAgIHByaXZhdGUgZmluYWwgQ2FjaGUgY29sbGVjdGlvbkxpbmtDYWNoZTsKLSAgICBwcml2YXRlIGZpbmFsIENhY2hlIHRlbXBsYXRlQ2FjaGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDYWNoZSByZXBvc2l0b3J5TGlua0NhY2hlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIExpbmtDYWNoZShCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGludCByZXBDb3VudCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9SRVBPU0lUT1JJRVMsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTKTsKLSAgICAgICAgaWYgKHJlcENvdW50IDwgMSkgewotICAgICAgICAgICAgcmVwQ291bnQgPSBTZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHMuQ0FDSEVfU0laRV9SRVBPU0lUT1JJRVM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdHlwZUNvdW50ID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DQUNIRV9TSVpFX1RZUEVTLCBTZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHMuQ0FDSEVfU0laRV9UWVBFUyk7Ci0gICAgICAgIGlmICh0eXBlQ291bnQgPCAxKSB7Ci0gICAgICAgICAgICB0eXBlQ291bnQgPSBTZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHMuQ0FDSEVfU0laRV9UWVBFUzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBvYmpDb3VudCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9MSU5LUywgU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfTElOS1MpOwotICAgICAgICBpZiAob2JqQ291bnQgPCAxKSB7Ci0gICAgICAgICAgICBvYmpDb3VudCA9IFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9TSVpFX0xJTktTOwotICAgICAgICB9Ci0KLSAgICAgICAgbGlua0NhY2hlID0gbmV3IENhY2hlSW1wbCgiTGluayBDYWNoZSIpOwotICAgICAgICBsaW5rQ2FjaGUuaW5pdGlhbGl6ZShuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgIE1hcENhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIE1hcENhY2hlTGV2ZWxJbXBsLkNBUEFDSVRZICsgIj0iICsgcmVwQ291bnQsIC8vIHJlcG9zaXRvcnkKLSAgICAgICAgICAgICAgICBMcnVDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBMcnVDYWNoZUxldmVsSW1wbC5NQVhfRU5UUklFUyArICI9IiArIG9iakNvdW50LCAvLyBpZAotICAgICAgICAgICAgICAgIE1hcENhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIE1hcENhY2hlTGV2ZWxJbXBsLkNBUEFDSVRZICsgIj0xMiIsIC8vIHJlbAotICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPTMsIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXBDYWNoZUxldmVsSW1wbC5TSU5HTEVfVkFMVUUgKyAiPXRydWUiIC8vIHR5cGUKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdHlwZUxpbmtDYWNoZSA9IG5ldyBDYWNoZUltcGwoIlR5cGUgTGluayBDYWNoZSIpOwotICAgICAgICB0eXBlTGlua0NhY2hlLmluaXRpYWxpemUobmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICBNYXBDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9IiArIHJlcENvdW50LCAvLyByZXBvc2l0b3J5Ci0gICAgICAgICAgICAgICAgTHJ1Q2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTHJ1Q2FjaGVMZXZlbEltcGwuTUFYX0VOVFJJRVMgKyAiPSIgKyB0eXBlQ291bnQsIC8vIGlkCi0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPTEyIiwgLy8gcmVsCi0gICAgICAgICAgICAgICAgQ29udGVudFR5cGVDYWNoZUxldmVsSW1wbC5jbGFzcy5nZXROYW1lKCkgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9MywiCi0gICAgICAgICAgICAgICAgICAgICAgICArIE1hcENhY2hlTGV2ZWxJbXBsLlNJTkdMRV9WQUxVRSArICI9dHJ1ZSIvLyB0eXBlCi0gICAgICAgIH0pOwotCi0gICAgICAgIGNvbGxlY3Rpb25MaW5rQ2FjaGUgPSBuZXcgQ2FjaGVJbXBsKCJDb2xsZWN0aW9uIExpbmsgQ2FjaGUiKTsKLSAgICAgICAgY29sbGVjdGlvbkxpbmtDYWNoZS5pbml0aWFsaXplKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPSIgKyByZXBDb3VudCwgLy8gcmVwb3NpdG9yeQotICAgICAgICAgICAgICAgIE1hcENhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIE1hcENhY2hlTGV2ZWxJbXBsLkNBUEFDSVRZICsgIj04IiAvLyBjb2xsZWN0aW9uCi0gICAgICAgIH0pOwotCi0gICAgICAgIHRlbXBsYXRlQ2FjaGUgPSBuZXcgQ2FjaGVJbXBsKCJVUkkgVGVtcGxhdGUgQ2FjaGUiKTsKLSAgICAgICAgdGVtcGxhdGVDYWNoZS5pbml0aWFsaXplKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPSIgKyByZXBDb3VudCwgLy8gcmVwb3NpdG9yeQotICAgICAgICAgICAgICAgIE1hcENhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIE1hcENhY2hlTGV2ZWxJbXBsLkNBUEFDSVRZICsgIj02IiAvLyB0eXBlCi0gICAgICAgIH0pOwotCi0gICAgICAgIHJlcG9zaXRvcnlMaW5rQ2FjaGUgPSBuZXcgQ2FjaGVJbXBsKCJSZXBvc2l0b3J5IExpbmsgQ2FjaGUiKTsKLSAgICAgICAgcmVwb3NpdG9yeUxpbmtDYWNoZS5pbml0aWFsaXplKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgTWFwQ2FjaGVMZXZlbEltcGwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgTWFwQ2FjaGVMZXZlbEltcGwuQ0FQQUNJVFkgKyAiPSIgKyByZXBDb3VudCwgLy8gcmVwb3NpdG9yeQotICAgICAgICAgICAgICAgIE1hcENhY2hlTGV2ZWxJbXBsLmNsYXNzLmdldE5hbWUoKSArICIgIiArIE1hcENhY2hlTGV2ZWxJbXBsLkNBUEFDSVRZICsgIj02IiAvLyByZWwKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpbmsuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlLCBTdHJpbmcgbGluaykgewotICAgICAgICBpZiAoS05PV05fTElOS1MuY29udGFpbnMocmVsKSkgewotICAgICAgICAgICAgbGlua0NhY2hlLnB1dChsaW5rLCByZXBvc2l0b3J5SWQsIGlkLCByZWwsIHR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5SRUxfQUxURVJOQVRFLmVxdWFscyhyZWwpKSB7Ci0gICAgICAgICAgICAvLyB1c2Ugc3RyZWFtSWQgaW5zdGVhZCBvZiB0eXBlIGFzIGRpc2NyaW1pbmF0aW5nIHBhcmFtZXRlcgotICAgICAgICAgICAgU3RyaW5nIHN0cmVhbUlkID0gZXh0cmFjdFN0cmVhbUlkKGxpbmspOwotICAgICAgICAgICAgaWYgKHN0cmVhbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaW5rQ2FjaGUucHV0KGxpbmssIHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgc3RyZWFtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gZXh0cmFjdCBhIHN0cmVhbUlkIGZyb20gYW4gYWx0ZXJuYXRlIGxpbmsuCi0gICAgICovCi0gICAgLy8gdGhpcyBpcyBub3Qgc3RyaWN0bHkgaW4gdGhlIHNwZWMKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RTdHJlYW1JZChTdHJpbmcgbGluaykgewotICAgICAgICBpbnQgaSA9IGxpbmsubGFzdEluZGV4T2YoJz8nKTsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBsaW5rLnN1YnN0cmluZyhpICsgMSkuc3BsaXQoIiYiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhcmFtIDogcGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBwYXJhbS5zcGxpdCgiPSIsIDIpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0c1swXS5lcXVhbHMoQ29uc3RhbnRzLlBBUkFNX1NUUkVBTV9JRCkgJiYgcGFydHMubGVuZ3RoID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzWzFdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBsaW5rcyBvZiBhbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlua3MoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGxpbmtDYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkLCBpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGxpbmsuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGxpbmtDYWNoZS5nZXQocmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbGluay4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGlkLCBTdHJpbmcgcmVsKSB7Ci0gICAgICAgIHJldHVybiBnZXRMaW5rKHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGEgbGluay4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNoZWNrTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBsaW5rQ2FjaGUuY2hlY2socmVwb3NpdG9yeUlkLCBpZCwgcmVsLCB0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2NrcyB0aGUgbGluayBjYWNoZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2NrTGlua3MoKSB7Ci0gICAgICAgIGxpbmtDYWNoZS53cml0ZUxvY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbmxvY2tzIHRoZSBsaW5rIGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVubG9ja0xpbmtzKCkgewotICAgICAgICBsaW5rQ2FjaGUud3JpdGVVbmxvY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgdHlwZSBsaW5rLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUsIFN0cmluZyBsaW5rKSB7Ci0gICAgICAgIGlmIChLTk9XTl9MSU5LUy5jb250YWlucyhyZWwpKSB7Ci0gICAgICAgICAgICB0eXBlTGlua0NhY2hlLnB1dChsaW5rLCByZXBvc2l0b3J5SWQsIGlkLCByZWwsIHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbGlua3Mgb2YgYSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVR5cGVMaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgdHlwZUxpbmtDYWNoZS5yZW1vdmUocmVwb3NpdG9yeUlkLCBpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHR5cGUgbGluay4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVMaW5rKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBpZCwgU3RyaW5nIHJlbCwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHR5cGVMaW5rQ2FjaGUuZ2V0KHJlcG9zaXRvcnlJZCwgaWQsIHJlbCwgdHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9ja3MgdGhlIHR5cGUgbGluayBjYWNoZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2NrVHlwZUxpbmtzKCkgewotICAgICAgICB0eXBlTGlua0NhY2hlLndyaXRlTG9jaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVubG9ja3MgdGhlIHR5cGUgbGluayBjYWNoZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bmxvY2tUeXBlTGlua3MoKSB7Ci0gICAgICAgIHR5cGVMaW5rQ2FjaGUud3JpdGVVbmxvY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29sbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBjb2xsZWN0aW9uLCBTdHJpbmcgbGluaykgewotICAgICAgICBjb2xsZWN0aW9uTGlua0NhY2hlLnB1dChsaW5rLCByZXBvc2l0b3J5SWQsIGNvbGxlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBjb2xsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgY29sbGVjdGlvbikgewotICAgICAgICByZXR1cm4gKFN0cmluZykgY29sbGVjdGlvbkxpbmtDYWNoZS5nZXQocmVwb3NpdG9yeUlkLCBjb2xsZWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIFVSSSB0ZW1wbGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUZW1wbGF0ZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGxpbmspIHsKLSAgICAgICAgdGVtcGxhdGVDYWNoZS5wdXQobGluaywgcmVwb3NpdG9yeUlkLCB0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIFVSSSB0ZW1wbGF0ZSBhbmQgcmVwbGFjZXMgcGxhY2UgaG9sZGVycyB3aXRoIHRoZSBnaXZlbgotICAgICAqIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZUxpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycykgewotICAgICAgICBTdHJpbmcgdGVtcGxhdGUgPSAoU3RyaW5nKSB0ZW1wbGF0ZUNhY2hlLmdldChyZXBvc2l0b3J5SWQsIHR5cGUpOwotICAgICAgICBpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcGFyYW0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGJvb2xlYW4gcGFyYW1Nb2RlID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGUubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gdGVtcGxhdGUuY2hhckF0KGkpOwotCi0gICAgICAgICAgICBpZiAocGFyYW1Nb2RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ30nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtTW9kZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbVZhbHVlID0gVXJsQnVpbGRlci5ub3JtYWxpemVQYXJhbWV0ZXIocGFyYW1ldGVycy5nZXQocGFyYW0udG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKElPVXRpbHMuZW5jb2RlVVJMKHBhcmFtVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbS5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAneycpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1Nb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29sbGVjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5TGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcmVsLCBTdHJpbmcgbGluaykgewotICAgICAgICByZXBvc2l0b3J5TGlua0NhY2hlLnB1dChsaW5rLCByZXBvc2l0b3J5SWQsIHJlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5TGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcmVsKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSByZXBvc2l0b3J5TGlua0NhY2hlLmdldChyZXBvc2l0b3J5SWQsIHJlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgZW50cmllcyBvZiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBmcm9tIHRoZSBjYWNoZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJSZXBvc2l0b3J5KFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgbGlua0NhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOwotICAgICAgICB0eXBlTGlua0NhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBjb2xsZWN0aW9uTGlua0NhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOwotICAgICAgICB0ZW1wbGF0ZUNhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOwotICAgICAgICByZXBvc2l0b3J5TGlua0NhY2hlLnJlbW92ZShyZXBvc2l0b3J5SWQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJMaW5rIENhY2hlIFtsaW5rIGNhY2hlPSIgKyBsaW5rQ2FjaGUgKyAiLCB0eXBlIGxpbmsgY2FjaGU9IiArIHR5cGVMaW5rQ2FjaGUKLSAgICAgICAgICAgICAgICArICIsIGNvbGxlY3Rpb24gbGluayBjYWNoZT0iICsgY29sbGVjdGlvbkxpbmtDYWNoZSArICIsIHJlcG9zaXRvcnkgbGluayBjYWNoZT0iICsgcmVwb3NpdG9yeUxpbmtDYWNoZQotICAgICAgICAgICAgICAgICsgIiwgIHRlbXBsYXRlIGNhY2hlPSIgKyB0ZW1wbGF0ZUNhY2hlICsgIl0iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY1ODg0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTXVsdGlGaWxpbmdTZXJ2aWNlOwotCi0vKioKLSAqIE11bHRpRmlsaW5nIFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGluZ1NlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIE11bHRpRmlsaW5nU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkT2JqZWN0VG9Gb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaWQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTF9WRVJTSU9OUywgYWxsVmVyc2lvbnMpOwotCi0gICAgICAgIC8vIHNldCB1cCBvYmplY3QgYW5kIHdyaXRlcgotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZUlkT2JqZWN0KG9iamVjdElkKSwgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7Ci0KLSAgICAgICAgLy8gcG9zdCBhZGRPYmplY3RUb0ZvbGRlciByZXF1ZXN0Ci0gICAgICAgIHBvc3QodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdEZyb21Gb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBpZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkQ29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5DT0xMRUNUSU9OX1VORklMRUQpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciB1bmZpbGluZyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVNT1ZFX0ZST00sIGZvbGRlcklkKTsKLQotICAgICAgICAvLyBzZXQgdXAgb2JqZWN0IGFuZCB3cml0ZXIKLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVJZE9iamVjdChvYmplY3RJZCksIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOwotCi0gICAgICAgIC8vIHBvc3QgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlciByZXF1ZXN0Ci0gICAgICAgIHBvc3QodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9OYXZpZ2F0aW9uU2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9OYXZpZ2F0aW9uU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5NDEyMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvTmF2aWdhdGlvblNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21CYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRmVlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RQYXJlbnREYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLQotLyoqCi0gKiBOYXZpZ2F0aW9uIFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlIGltcGxlbWVudHMgTmF2aWdhdGlvblNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3RJbkZvbGRlckxpc3RJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3RJbkZvbGRlckxpc3RJbXBsKCk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09SREVSX0JZLCBvcmRlckJ5KTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQsIGluY2x1ZGVQYXRoU2VnbWVudCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCBza2lwQ291bnQpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHRvcCBsZXZlbAotICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBmZWVkLmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNOZXh0TGluayhlbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0ludChOQU1FX05VTV9JVEVNUywgZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMoKEJpZ0ludGVnZXIpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjaGlsZHJlbgotICAgICAgICBpZiAoIWZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldE9iamVjdHMobmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckRhdGE+KGZlZWQuZ2V0RW50cmllcygpLnNpemUoKSkpOwotCi0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCBjaGlsZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhTZWdtZW50ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGxvY2tMaW5rcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpbmtzKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzU3RyKE5BTUVfUEFUSF9TRUdNRU5ULCBlbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTZWdtZW50ID0gKFN0cmluZykgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IG5ldyBPYmplY3RJbkZvbGRlckRhdGFJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0T2JqZWN0KChPYmplY3REYXRhKSBlbGVtZW50LmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0UGF0aFNlZ21lbnQocGF0aFNlZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0T2JqZWN0cygpLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+KCk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9ERVBUSCwgZGVwdGgpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUEFUSF9TRUdNRU5ULCBpbmNsdWRlUGF0aFNlZ21lbnQpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gcHJvY2VzcyB0cmVlCi0gICAgICAgIGFkZERlc2NlbmRhbnRzTGV2ZWwocmVwb3NpdG9yeUlkLCBmZWVkLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdERhdGEgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9VUCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfVVAsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotCi0gICAgICAgIC8vIHJlYWQKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLQotICAgICAgICBBdG9tQmFzZSBiYXNlID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUJhc2UuY2xhc3MpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZW50cnkKLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgaWYgKGJhc2UgaW5zdGFuY2VvZiBBdG9tRmVlZCkgewotICAgICAgICAgICAgQXRvbUZlZWQgZmVlZCA9IChBdG9tRmVlZCkgYmFzZTsKLSAgICAgICAgICAgIGlmIChmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlBhcmVudCBmZWVkIGlzIGVtcHR5ISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkgPSBmZWVkLmdldEVudHJpZXMoKS5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZSBpbnN0YW5jZW9mIEF0b21FbnRyeSkgewotICAgICAgICAgICAgZW50cnkgPSAoQXRvbUVudHJ5KSBiYXNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGRvY3VtZW50ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9ja0xpbmtzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2tMaW5rcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0Rm9sZGVyVHJlZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFLCBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFLCBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQsIGluY2x1ZGVQYXRoU2VnbWVudCk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsKLQotICAgICAgICAvLyBwcm9jZXNzIHRyZWUKLSAgICAgICAgYWRkRGVzY2VuZGFudHNMZXZlbChyZXBvc2l0b3J5SWQsIGZlZWQsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBnZXRPYmplY3RQYXJlbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RQYXJlbnREYXRhPigpOwotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1VQLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHJvb3QgYW5kIHVuZmlsZWQgb2JqZWN0cyBoYXZlIG5vIFVQIGxpbmsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJVkVfUEFUSF9TRUdNRU5ULCBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLQotICAgICAgICBBdG9tQmFzZSBiYXNlID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUJhc2UuY2xhc3MpOwotCi0gICAgICAgIGlmIChiYXNlIGluc3RhbmNlb2YgQXRvbUZlZWQpIHsKLSAgICAgICAgICAgIC8vIGl0J3MgYSBmZWVkCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gKEF0b21GZWVkKSBiYXNlOwotCi0gICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGZlZWQKLSAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RQYXJlbnREYXRhSW1wbCBvYmplY3RQYXJlbnQgPSBwcm9jZXNzUGFyZW50RW50cnkoZW50cnksIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0UGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChvYmplY3RQYXJlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChiYXNlIGluc3RhbmNlb2YgQXRvbUVudHJ5KSB7Ci0gICAgICAgICAgICAvLyBpdCdzIGFuIGVudHJ5Ci0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSAoQXRvbUVudHJ5KSBiYXNlOwotCi0gICAgICAgICAgICBPYmplY3RQYXJlbnREYXRhSW1wbCBvYmplY3RQYXJlbnQgPSBwcm9jZXNzUGFyZW50RW50cnkoZW50cnksIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQob2JqZWN0UGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RQYXJlbnREYXRhSW1wbCBwcm9jZXNzUGFyZW50RW50cnkoQXRvbUVudHJ5IGVudHJ5LCBTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIE9iamVjdFBhcmVudERhdGFJbXBsIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGhTZWdtZW50ID0gbnVsbDsKLQotICAgICAgICBsb2NrTGlua3MoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlCi0gICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOwotCi0gICAgICAgICAgICAvLyB3YWxrIHRocm91Z2ggdGhlIGVudHJ5Ci0gICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgICAgICBhZGRMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBPYmplY3REYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBPYmplY3RQYXJlbnREYXRhSW1wbCgoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpcyhOQU1FX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCwgZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoU2VnbWVudCA9IChTdHJpbmcpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrTGlua3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LnNldFJlbGF0aXZlUGF0aFNlZ21lbnQocmVsYXRpdmVQYXRoU2VnbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENoZWNrZWRPdXREb2NzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0TGlzdEltcGwgcmVzdWx0ID0gbmV3IE9iamVjdExpc3RJbXBsKCk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRDb2xsZWN0aW9uKHJlcG9zaXRvcnlJZCwgQ29uc3RhbnRzLkNPTExFQ1RJT05fQ0hFQ0tFRE9VVCk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIGNoZWNrZWRvdXQgY29sbGVjdGlvbiBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRk9MREVSX0lELCBmb2xkZXJJZCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fT1JERVJfQlksIG9yZGVyQnkpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCBza2lwQ291bnQpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHRvcCBsZXZlbAotICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBmZWVkLmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNOZXh0TGluayhlbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0ludChOQU1FX05VTV9JVEVNUywgZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMoKEJpZ0ludGVnZXIpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBkb2N1bWVudHMKLSAgICAgICAgaWYgKCFmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oZmVlZC5nZXRFbnRyaWVzKCkuc2l6ZSgpKSk7Ci0KLSAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIGNoaWxkID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGxvY2tMaW5rcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpbmtzKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBPYmplY3REYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBpbnRlcm5hbCAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBBZGRzIGRlc2NlbmRhbnRzIGxldmVsIHJlY3Vyc2l2ZWx5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGREZXNjZW5kYW50c0xldmVsKFN0cmluZyByZXBvc2l0b3J5SWQsIEF0b21GZWVkIGZlZWQsIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGNvbnRhaW5lckxpc3QpIHsKLSAgICAgICAgaWYgKGZlZWQgPT0gbnVsbCB8fCBmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZmVlZAotICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7Ci0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckRhdGFJbXBsIG9iamVjdEluRm9sZGVyID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoU2VnbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBjaGlsZENvbnRhaW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPigpOwotCi0gICAgICAgICAgICBsb2NrTGlua3MoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2FjaGUKLSAgICAgICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGVudHJ5LmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdEluRm9sZGVyID0gbmV3IE9iamVjdEluRm9sZGVyRGF0YUltcGwoKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzKE5BTUVfUEFUSF9TRUdNRU5ULCBlbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFNlZ21lbnQgPSAoU3RyaW5nKSBlbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tRmVlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRGVzY2VuZGFudHNMZXZlbChyZXBvc2l0b3J5SWQsIChBdG9tRmVlZCkgZWxlbWVudC5nZXRPYmplY3QoKSwgY2hpbGRDb250YWluZXJMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdW5sb2NrTGlua3MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9iamVjdEluRm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvYmplY3RJbkZvbGRlci5zZXRQYXRoU2VnbWVudChwYXRoU2VnbWVudCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsIGNoaWxkQ29udGFpbmVyID0gbmV3IE9iamVjdEluRm9sZGVyQ29udGFpbmVySW1wbChvYmplY3RJbkZvbGRlcik7Ci0gICAgICAgICAgICAgICAgY2hpbGRDb250YWluZXIuc2V0Q2hpbGRyZW4oY2hpbGRDb250YWluZXJMaXN0KTsKLSAgICAgICAgICAgICAgICBjb250YWluZXJMaXN0LmFkZChjaGlsZENvbnRhaW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvT2JqZWN0U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9PYmplY3RTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWZkYWJmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9PYmplY3RTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUZlZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLk91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5GYWlsZWRUb0RlbGV0ZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuUmV0dXJuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQnVsa1VwZGF0ZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkZhaWxlZFRvRGVsZXRlRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBhcnRpYWxDb250ZW50U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLQotLyoqCi0gKiBPYmplY3QgU2VydmljZSBBdG9tUHViIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIE9iamVjdFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja0NyZWF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGZvbGRlcklkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENyZWF0aW9uIG9mIHVuZmlsZWQgb2JqZWN0cyB2aWEgQXRvbVB1YiBpcyBub3QgZGVmaW5lZCBpbiB0aGUKLSAgICAgICAgICAgIC8vIENNSVMgMS4wIHNwZWNpZmljYXRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93IHRoZSBDTUlTIDEuMQotICAgICAgICAgICAgLy8gZHJhZnQgYW5kIFBPU1RzIHRoZSBkb2N1bWVudCB0byB0aGUgVW5maWxlZCBjb2xsZWN0aW9uLgotCi0gICAgICAgICAgICBsaW5rID0gbG9hZENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuQ09MTEVDVElPTl9VTkZJTEVEKTsKLQotICAgICAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciB1bmZpbGluZyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7Ci0KLSAgICAgICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1ZFUlNJT05JR19TVEFURSwgdmVyc2lvbmluZ1N0YXRlKTsKLQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoY3JlYXRlT2JqZWN0KHByb3BlcnRpZXMsIG51bGwsIHBvbGljaWVzKSwKLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCBjb250ZW50U3RyZWFtKTsKLQotICAgICAgICAvLyBwb3N0IHRoZSBuZXcgZm9sZGVyIG9iamVjdAotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIEFDTCBtb2RpZmljYXRpb25zCi0gICAgICAgIGhhbmRsZUFjbE1vZGlmaWNhdGlvbnMocmVwb3NpdG9yeUlkLCBlbnRyeSwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldElkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHNvdXJjZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQXRvbVB1YiBiaW5kaW5nISIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja0NyZWF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotCi0gICAgICAgIC8vIHNldCB1cCB3cml0ZXIKLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVPYmplY3QocHJvcGVydGllcywgbnVsbCwgcG9saWNpZXMpLAotICAgICAgICAgICAgICAgIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOwotCi0gICAgICAgIC8vIHBvc3QgdGhlIG5ldyBmb2xkZXIgb2JqZWN0Ci0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBwYXJzZSB0aGUgcmVzcG9uc2UKLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUVudHJ5LmNsYXNzKTsKLQotICAgICAgICAvLyBoYW5kbGUgQUNMIG1vZGlmaWNhdGlvbnMKLSAgICAgICAgaGFuZGxlQWNsTW9kaWZpY2F0aW9ucyhyZXBvc2l0b3J5SWQsIGVudHJ5LCBhZGRBY2VzLCByZW1vdmVBY2VzKTsKLQotICAgICAgICByZXR1cm4gZW50cnkuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tDcmVhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBudWxsOwotCi0gICAgICAgIGlmIChmb2xkZXJJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGlvbiBvZiB1bmZpbGVkIG9iamVjdHMgdmlhIEF0b21QdWIgaXMgbm90IGRlZmluZWQgaW4gdGhlCi0gICAgICAgICAgICAvLyBDTUlTIDEuMCBzcGVjaWZpY2F0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvdyB0aGUgQ01JUyAxLjEKLSAgICAgICAgICAgIC8vIGRyYWZ0IGFuZCBQT1NUcyB0aGUgcG9saWN5IHRvIHRoZSBVbmZpbGVkIGNvbGxlY3Rpb24uCi0KLSAgICAgICAgICAgIGxpbmsgPSBsb2FkQ29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5DT0xMRUNUSU9OX1VORklMRUQpOwotCi0gICAgICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHVuZmlsaW5nIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLQotICAgICAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoY3JlYXRlT2JqZWN0KHByb3BlcnRpZXMsIG51bGwsIHBvbGljaWVzKSwKLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpKTsKLQotICAgICAgICAvLyBwb3N0IHRoZSBuZXcgZm9sZGVyIG9iamVjdAotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIEFDTCBtb2RpZmljYXRpb25zCi0gICAgICAgIGhhbmRsZUFjbE1vZGlmaWNhdGlvbnMocmVwb3NpdG9yeUlkLCBlbnRyeSwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldElkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVJdGVtKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja0NyZWF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGZvbGRlcklkID09IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmsgPSBsb2FkQ29sbGVjdGlvbihyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5DT0xMRUNUSU9OX1VORklMRUQpOwotCi0gICAgICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHVuZmlsaW5nIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLQotICAgICAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0RPV04sIENvbnN0YW50cy5NRURJQVRZUEVfQ0hJTERSRU4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoY3JlYXRlT2JqZWN0KHByb3BlcnRpZXMsIG51bGwsIHBvbGljaWVzKSwKLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpKTsKLQotICAgICAgICAvLyBwb3N0IHRoZSBuZXcgZm9sZGVyIG9iamVjdAotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIEFDTCBtb2RpZmljYXRpb25zCi0gICAgICAgIGhhbmRsZUFjbE1vZGlmaWNhdGlvbnMocmVwb3NpdG9yeUlkLCBlbnRyeSwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgcmV0dXJuIGVudHJ5LmdldElkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja0NyZWF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gZmluZCBzb3VyY2UgaWQKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHNvdXJjZUlkUHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuU09VUkNFX0lEKTsKLSAgICAgICAgaWYgKCEoc291cmNlSWRQcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIElkIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc291cmNlSWQgPSAoKFByb3BlcnR5SWQpIHNvdXJjZUlkUHJvcGVydHkpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgaWYgKHNvdXJjZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgSWQgaXMgbm90IHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIHNvdXJjZUlkLCBDb25zdGFudHMuUkVMX1JFTEFUSU9OU0hJUFMsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgc291cmNlSWQsIENvbnN0YW50cy5SRUxfUkVMQVRJT05TSElQUywgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIHdyaXRlcgotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZU9iamVjdChwcm9wZXJ0aWVzLCBudWxsLCBwb2xpY2llcyksCi0gICAgICAgICAgICAgICAgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7Ci0KLSAgICAgICAgLy8gcG9zdCB0aGUgbmV3IGZvbGRlciBvYmplY3QKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHBhcnNlIHRoZSByZXNwb25zZQotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRW50cnkuY2xhc3MpOwotCi0gICAgICAgIC8vIGhhbmRsZSBBQ0wgbW9kaWZpY2F0aW9ucwotICAgICAgICBoYW5kbGVBY2xNb2RpZmljYXRpb25zKHJlcG9zaXRvcnlJZCwgZW50cnksIGFkZEFjZXMsIHJlbW92ZUFjZXMpOwotCi0gICAgICAgIHJldHVybiBlbnRyeS5nZXRJZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gd2UgbmVlZCBhbiBvYmplY3QgaWQKLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfU0VMRiwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLk9NSVRfQ0hBTkdFX1RPS0VOUywgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlVG9rZW4uc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG5vdCByZXF1aXJlZCBieSB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgLy8gLT4ga2VlcCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBPcGVuQ01JUwotICAgICAgICAgICAgICAgIC8vIHNlcnZlcnMKLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfVE9LRU4sIGNoYW5nZVRva2VuLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHVwIHdyaXRlcgotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKGNyZWF0ZU9iamVjdChwcm9wZXJ0aWVzLCBjaGFuZ2VUb2tlbiA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgICAgIDogY2hhbmdlVG9rZW4uZ2V0VmFsdWUoKSwgbnVsbCksIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOwotCi0gICAgICAgIC8vIHVwZGF0ZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcHV0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBwYXJzZSBuZXcgZW50cnkKLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUVudHJ5LmNsYXNzKTsKLQotICAgICAgICAvLyB3ZSBleHBlY3QgYSBDTUlTIGVudHJ5Ci0gICAgICAgIGlmIChlbnRyeS5nZXRJZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiUmVjZWl2ZWQgQXRvbSBlbnRyeSBpcyBub3QgYSBDTUlTIGVudHJ5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IG9iamVjdCBpZAotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShlbnRyeS5nZXRJZCgpKTsKLQotICAgICAgICBpZiAoY2hhbmdlVG9rZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgY2hhbmdlVG9rZW4uc2V0VmFsdWUobnVsbCk7IC8vIGp1c3QgaW4gY2FzZQotICAgICAgICB9Ci0KLSAgICAgICAgbG9ja0xpbmtzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IG5ldyBjaGFuZ2UgdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVRva2VuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0UHJvcGVydGllcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY2hhbmdlVG9rZW5TdHIgPSBvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VUb2tlblN0ciBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRva2VuLnNldFZhbHVlKCgoUHJvcGVydHlTdHJpbmcpIGNoYW5nZVRva2VuU3RyKS5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlSWRzLCBMaXN0PFN0cmluZz4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGZpbmQgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRDb2xsZWN0aW9uKHJlcG9zaXRvcnlJZCwgQ29uc3RhbnRzLkNPTExFQ1RJT05fQlVMS19VUERBVEUpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciBidWxrIHVwZGF0ZSBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyCi0gICAgICAgIGZpbmFsIEJ1bGtVcGRhdGVJbXBsIGJ1bGtVcGRhdGUgPSBuZXcgQnVsa1VwZGF0ZUltcGwoKTsKLSAgICAgICAgYnVsa1VwZGF0ZS5zZXRPYmplY3RJZEFuZENoYW5nZVRva2VuKG9iamVjdElkQW5kQ2hhbmdlVG9rZW4pOwotICAgICAgICBidWxrVXBkYXRlLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgIGJ1bGtVcGRhdGUuc2V0QWRkU2Vjb25kYXJ5VHlwZUlkcyhhZGRTZWNvbmRhcnlUeXBlSWRzKTsKLSAgICAgICAgYnVsa1VwZGF0ZS5zZXRSZW1vdmVTZWNvbmRhcnlUeXBlSWRzKHJlbW92ZVNlY29uZGFyeVR5cGVJZHMpOwotCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoYnVsa1VwZGF0ZSk7Ci0KLSAgICAgICAgLy8gcG9zdCB0aGUgbmV3IGZvbGRlciBvYmplY3QKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QobmV3IFVybEJ1aWxkZXIobGluayksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsKLSAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4oZmVlZAotICAgICAgICAgICAgICAgIC5nZXRFbnRyaWVzKCkuc2l6ZSgpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHJlc3VsdHMKLSAgICAgICAgaWYgKCFmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKLQotICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlIGxpbmtzIHRoaXMgdGltZSBiZWNhdXNlIHRoZXkKLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZWxvbmcgdG8gYSBuZXcgZG9jdW1lbnQgdmVyc2lvbgotICAgICAgICAgICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGVudHJ5LmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBPYmplY3REYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IChPYmplY3REYXRhKSBlbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gb2JqZWN0LmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IGNoYW5nZVRva2VuUHJvcCA9IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVRva2VuUHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRva2VuID0gKChQcm9wZXJ0eVN0cmluZykgY2hhbmdlVG9rZW5Qcm9wKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsKGlkLCBjaGFuZ2VUb2tlbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGFsbFZlcnNpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTF9WRVJTSU9OUywgYWxsVmVyc2lvbnMpOwotCi0gICAgICAgIGRlbGV0ZSh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyBGYWlsZWRUb0RlbGV0ZURhdGEgZGVsZXRlVHJlZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBVbmZpbGVPYmplY3QgdW5maWxlT2JqZWN0cywgQm9vbGVhbiBjb250aW51ZU9uRmFpbHVyZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgZG93biBsaW5rcwotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBjaGlsZHJlbkxpbmsgPSBudWxsOwotCi0gICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZvdW5kIG9ubHkgYSBjaGlsZHJlbiBsaW5rLCBidXQgbm8gZGVzY2VuZGFudHMgbGluawotICAgICAgICAgICAgLy8gLT4gdHJ5IGZvbGRlciB0cmVlIGxpbmsKLSAgICAgICAgICAgIGNoaWxkcmVuTGluayA9IGxpbms7Ci0gICAgICAgICAgICBsaW5rID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGZvdW5kIG5vIG9yIHR3byBkb3duIGxpbmtzCi0gICAgICAgICAgICAvLyAtPiBnZXQgb25seSB0aGUgZGVzY2VuZGFudHMgbGluawotICAgICAgICAgICAgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFLCBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuUkVMX0ZPTERFUlRSRUUsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rID0gY2hpbGRyZW5MaW5rOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExfVkVSU0lPTlMsIGFsbFZlcnNpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVU5GSUxFX09CSkVDVFMsIHVuZmlsZU9iamVjdHMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DT05USU5VRV9PTl9GQUlMVVJFLCBjb250aW51ZU9uRmFpbHVyZSk7Ci0KLSAgICAgICAgLy8gbWFrZSB0aGUgY2FsbAotICAgICAgICBSZXNwb25zZSByZXNwID0gZ2V0SHR0cEludm9rZXIoKS5pbnZva2VERUxFVEUodXJsLCBnZXRTZXNzaW9uKCkpOwotCi0gICAgICAgIC8vIGNoZWNrIHJlc3BvbnNlIGNvZGUKLSAgICAgICAgaWYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gMjAwIHx8IHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gMjAyIHx8IHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gMjA0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZhaWxlZFRvRGVsZXRlRGF0YUltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgcmV0dXJuZWQgYW4gaW50ZXJuYWwgc2VydmVyIGVycm9yLCBnZXQgdGhlIHJlbWFpbmluZwotICAgICAgICAvLyBjaGlsZHJlbiBvZiB0aGUgZm9sZGVyLiBXZSBvbmx5IHJldHJpZXZlIHRoZSBmaXJzdCBsZXZlbCwgc2luY2UKLSAgICAgICAgLy8gZ2V0RGVzY2VuZGFudHMoKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCByZXBvc2l0b3JpZXMuCi0gICAgICAgIGlmIChyZXNwLmdldFJlc3BvbnNlQ29kZSgpID09IDUwMCkgewotICAgICAgICAgICAgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7Ci0KLSAgICAgICAgICAgIGlmIChsaW5rICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHdhbnQgdGhlIG9iamVjdCBpZHMKLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsICJjbWlzOm9iamVjdElkIik7Ci0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FKTsKLSAgICAgICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCAiY21pczpub25lIik7Ci0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUEFUSF9TRUdNRU5ULCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgLy8gMTAwMCBjaGlsZHJlbiBzaG91bGQgYmUgZW5vdWdoIHRvIGluZGljYXRlIGEgcHJvYmxlbQotICAgICAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgMTAwMCk7Ci0gICAgICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICAgICAgICAgIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgICAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgcmVzdWx0Ci0gICAgICAgICAgICAgICAgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCByZXN1bHQgPSBuZXcgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCgpOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0SWRzKGlkcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuIGlkcwotICAgICAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWRzLmFkZChlbnRyeS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG93YWJsZUFjdGlvbnMgZ2V0QWxsb3dhYmxlQWN0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9BTExPV0FCTEVBQ1RJT05TLAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5NRURJQVRZUEVfQUxMT1dBQkxFQUNUSU9OKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9BTExPV0FCTEVBQ1RJT05TLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0FMTE9XQUJMRUFDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21BbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tQWxsb3dhYmxlQWN0aW9ucy5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIGFsbG93YWJsZUFjdGlvbnMuZ2V0QWxsb3dhYmxlQWN0aW9ucygpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc3RyZWFtSWQsIEJpZ0ludGVnZXIgb2Zmc2V0LAotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbnVsbDsKLSAgICAgICAgaWYgKHN0cmVhbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHVzZSB0aGUgYWx0ZXJuYXRlIGxpbmsgcGVyIHNwZWMKLSAgICAgICAgICAgIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX0FMVEVSTkFURSwgc3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gbnVsbDsgLy8gd2UgaGF2ZSBhIGZ1bGwgVVJMIG5vdwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBBdG9tUHViUGFyc2VyLkxJTktfUkVMX0NPTlRFTlQsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJObyBjb250ZW50IHN0cmVhbSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgLy8gdXNpbmcgdGhlIGNvbnRlbnQgVVJMIGFuZCBhZGRpbmcgYSBzdHJlYW1JZCBwYXJhbQotICAgICAgICAvLyBpcyBub3Qgc3BlYy1jb21wbGlhbnQKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1RSRUFNX0lELCBzdHJlYW1JZCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjb250ZW50Ci0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBnZXRIdHRwSW52b2tlcigpLmludm9rZUdFVCh1cmwsIGdldFNlc3Npb24oKSwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgICAgIC8vIGNoZWNrIHJlc3BvbnNlIGNvZGUKLSAgICAgICAgaWYgKChyZXNwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMCkgJiYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA2KSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250ZW50U3RyZWFtSW1wbCByZXN1bHQ7Ci0gICAgICAgIGlmIChyZXNwLmdldFJlc3BvbnNlQ29kZSgpID09IDIwNikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnRpYWxDb250ZW50U3RyZWFtSW1wbCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcC5nZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iKTsKLSAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IE1pbWVIZWxwZXIuZGVjb2RlQ29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUoY29udGVudERpc3Bvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRGaWxlTmFtZShmaWxlbmFtZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMZW5ndGgocmVzcC5nZXRDb250ZW50TGVuZ3RoKCkpOwotICAgICAgICByZXN1bHQuc2V0TWltZVR5cGUocmVzcC5nZXRDb250ZW50VHlwZUhlYWRlcigpKTsKLSAgICAgICAgcmVzdWx0LnNldFN0cmVhbShyZXNwLmdldFN0cmVhbSgpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQUNMLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SW50ZXJuYWwocmVwb3NpdG9yeUlkLCBJZGVudGlmaWVyVHlwZS5JRCwgb2JqZWN0SWQsIFJldHVyblZlcnNpb24uVEhJUywgZmlsdGVyLAotICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQUNMLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdEJ5UGF0aChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBQ0wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLlBBVEgsIHBhdGgsIFJldHVyblZlcnNpb24uVEhJUywgZmlsdGVyLAotICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQUNMLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBvYmplY3RJZCwgUmV0dXJuVmVyc2lvbi5USElTLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgImNtaXM6bm9uZSIsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uRkFMU0UsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0T2JqZWN0SW50ZXJuYWwocmVwb3NpdG9yeUlkLCBJZGVudGlmaWVyVHlwZS5JRCwgb2JqZWN0SWQsIFJldHVyblZlcnNpb24uVEhJUywKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIEJvb2xlYW4uRkFMU0UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbi5GQUxTRSwKLSAgICAgICAgICAgICAgICBCb29sZWFuLkZBTFNFLCBleHRlbnNpb24pOwotCi0gICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVzdWx0ID0gb2JqZWN0LmdldFJlbmRpdGlvbnMoKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgU3RyaW5nIHRhcmdldEZvbGRlcklkLCBTdHJpbmcgc291cmNlRm9sZGVySWQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwgfHwgb2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsIHx8IG9iamVjdElkLmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXJnZXRGb2xkZXJJZCA9PSBudWxsIHx8IHRhcmdldEZvbGRlcklkLmxlbmd0aCgpID09IDAgfHwgc291cmNlRm9sZGVySWQgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IHNvdXJjZUZvbGRlcklkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgYW5kIHRhcmdldCBmb2xkZXIgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCB0YXJnZXRGb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCB0YXJnZXRGb2xkZXJJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NPVVJDRV9GT0xERVJfSUQsIHNvdXJjZUZvbGRlcklkKTsKLQotICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBTaGFyZVBvaW50IDIwMTAgLSBzZWUgQ01JUy04MzkKLSAgICAgICAgYm9vbGVhbiBvYmplY3RJZE9uTW92ZSA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5JTkNMVURFX09CSkVDVElEX1VSTF9QQVJBTV9PTl9NT1ZFLCBmYWxzZSk7Ci0gICAgICAgIGlmIChvYmplY3RJZE9uTW92ZSkgewotICAgICAgICAgICAgdXJsLmFkZFBhcmFtZXRlcigib2JqZWN0SWQiLCBvYmplY3RJZC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoInRhcmdldEZvbGRlcklkIiwgdGFyZ2V0Rm9sZGVySWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHVwIG9iamVjdCBhbmQgd3JpdGVyCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoY3JlYXRlSWRPYmplY3Qob2JqZWN0SWQuZ2V0VmFsdWUoKSksCi0gICAgICAgICAgICAgICAgZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSk7Ci0KLSAgICAgICAgLy8gcG9zdCBtb3ZlIHJlcXVlc3QKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QodXJsLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGVudHJ5V3JpdGVyLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIHdvcmthcm91bmQgZm9yIFNoYXJlUG9pbnQgMjAxMCAtIHNlZSBDTUlTLTgzOQotICAgICAgICBpZiAob2JqZWN0SWRPbk1vdmUpIHsKLSAgICAgICAgICAgIC8vIFNoYXJlUG9pbnQgZG9lc24ndCByZXR1cm4gYSBuZXcgb2JqZWN0IElECi0gICAgICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCB0aGUgb2JqZWN0IElEIGhhc24ndCBjaGFuZ2VkCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSB0aGUgcmVzcG9uc2UKLSAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUVudHJ5LmNsYXNzKTsKLQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShlbnRyeS5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgc2V0T3JBcHBlbmRDb250ZW50KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGNoYW5nZVRva2VuLCBjb250ZW50U3RyZWFtLCB0cnVlLCBmYWxzZSwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyB3ZSBuZWVkIGFuIG9iamVjdCBpZAotICAgICAgICBpZiAoKG9iamVjdElkID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlJFTF9FRElUTUVESUEsIG51bGwpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfRURJVE1FRElBLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsICYmICFnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT01JVF9DSEFOR0VfVE9LRU5TLCBmYWxzZSkpIHsKLSAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0NIQU5HRV9UT0tFTiwgY2hhbmdlVG9rZW4uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWxldGUodXJsKTsKLQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShudWxsKTsKLSAgICAgICAgaWYgKGNoYW5nZVRva2VuICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoYW5nZVRva2VuLnNldFZhbHVlKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmssIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBzZXRPckFwcGVuZENvbnRlbnQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgbnVsbCwgY2hhbmdlVG9rZW4sIGNvbnRlbnRTdHJlYW0sIGlzTGFzdENodW5rLCB0cnVlLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIC8vIC0tLS0gaW50ZXJuYWwgLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NyZWF0ZVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIGlmICgocHJvcGVydGllcyA9PSBudWxsKSB8fCAocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQgKyAiIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLk9CSkVDVF9JRCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuT0JKRUNUX0lEICsgIiBtdXN0IG5vdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIEFDTCBtb2RpZmljYXRpb25zIG9mIG5ld2x5IGNyZWF0ZWQgb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWNsTW9kaWZpY2F0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBBdG9tRW50cnkgZW50cnksIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcykgewotICAgICAgICBpZiAoIWlzQWNsTWVyZ2VSZXF1aXJlZChhZGRBY2VzLCByZW1vdmVBY2VzKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQWNsIG9yaWdpbmFsQWNlcyA9IGdldEFjbEludGVybmFsKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0KLSAgICAgICAgaWYgKG9yaWdpbmFsQWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBtZXJnZSBhbmQgdXBkYXRlIEFDTAotICAgICAgICAgICAgQWNsIG5ld0FDTCA9IG1lcmdlQWNscyhvcmlnaW5hbEFjZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMpOwotICAgICAgICAgICAgaWYgKG5ld0FDTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQWNsKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgbmV3QUNMLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgb3IgYXBwZW5kcyBjb250ZW50LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRPckFwcGVuZENvbnRlbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmssIGJvb2xlYW4gYXBwZW5kLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIHdlIG5lZWQgYW4gb2JqZWN0IGlkCi0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSBuZWVkIGNvbnRlbnQKLSAgICAgICAgaWYgKChjb250ZW50U3RyZWFtID09IG51bGwpIHx8IChjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpID09IG51bGwpIHx8IChjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZW50IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlJFTF9FRElUTUVESUEsIG51bGwpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfRURJVE1FRElBLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIobGluayk7Ci0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsICYmICFnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT01JVF9DSEFOR0VfVE9LRU5TLCBmYWxzZSkpIHsKLSAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0NIQU5HRV9UT0tFTiwgY2hhbmdlVG9rZW4uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXBwZW5kKSB7Ci0gICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BUFBFTkQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9JU19MQVNUX0NIVU5LLCBpc0xhc3RDaHVuayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9PVkVSV1JJVEVfRkxBRywgb3ZlcndyaXRlRmxhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpOwotCi0gICAgICAgIC8vIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyIGZvciB0aGUgZmlsZW5hbWUKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXJzID0gQ29sbGVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgLnNpbmdsZXRvbk1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW1lSGVscGVyLkNPTlRFTlRfRElTUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWltZUhlbHBlci5lbmNvZGVDb250ZW50RGlzcG9zaXRpb24oTWltZUhlbHBlci5ESVNQT1NJVElPTl9BVFRBQ0hNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZW5kIGNvbnRlbnQKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHB1dCh1cmwsIGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKSwgaGVhZGVycywgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHN0cmVhbSwgb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZSBmdXJ0aGVyCi0gICAgICAgIGlmICgocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDApICYmIChyZXNwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMSkgJiYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA0KSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSA9PSAyMDEpIHsKLSAgICAgICAgICAgIC8vIHVuc2V0IHRoZSBvYmplY3QgSUQgaWYgYSBuZXcgcmVzb3VyY2UgaGFzIGJlZW4gY3JlYXRlZAotICAgICAgICAgICAgLy8gKGlmIHRoZSByZXNvdXJjZSBoYXMgYmVlbiB1cGRhdGVkICgyMDAgYW5kIDIwNCksIHRoZSBvYmplY3QgSUQKLSAgICAgICAgICAgIC8vIGhhc24ndCBjaGFuZ2VkKQotICAgICAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hhbmdlVG9rZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgY2hhbmdlVG9rZW4uc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvUG9saWN5U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9Qb2xpY3lTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRkYmNkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9Qb2xpY3lTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21GZWVkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUG9saWN5U2VydmljZTsKLQotLyoqCi0gKiBQb2xpY3kgU2VydmljZSBBdG9tUHViIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFBvbGljeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSBpbXBsZW1lbnRzIFBvbGljeVNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFBvbGljeVNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLQotICAgICAgICAvLyBzZXQgdXAgb2JqZWN0IGFuZCB3cml0ZXIKLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVJZE9iamVjdChvYmplY3RJZCksIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOwotCi0gICAgICAgIC8vIHBvc3QgYXBwbHlQb2xpY3kgcmVxdWVzdAotICAgICAgICBwb3N0KHVybCwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBlbnRyeVdyaXRlci53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBcHBsaWVkUG9saWNpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3REYXRhPigpOwotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwb2xpY2llcwotICAgICAgICBpZiAoIWZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgcG9saWN5ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChwb2xpY3kpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gd2UgbmVlZCBhIHBvbGljeSBpZAotICAgICAgICBpZiAocG9saWN5SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlBvbGljeSBpZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1BPTElDSUVTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgcG9saWN5Ci0gICAgICAgIFN0cmluZyBwb2xpY3lMaW5rID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0gICAgICAgIGlmICghZmVlZC5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGVudHJ5LmdldEVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgICAgICAgICAgQXRvbUxpbmsgYXRvbUxpbmsgPSAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlJFTF9TRUxGLmVxdWFscyhhdG9tTGluay5nZXRSZWwoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lMaW5rID0gYXRvbUxpbmsuZ2V0SHJlZigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBPYmplY3REYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSAoKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCkpLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5SWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBmb3VuZCwgZGVsZXRlIGl0Ci0gICAgICAgIGlmIChmb3VuZCAmJiAocG9saWN5TGluayAhPSBudWxsKSkgewotICAgICAgICAgICAgZGVsZXRlKG5ldyBVcmxCdWlsZGVyKHBvbGljeUxpbmspKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9SZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlbGF0aW9uc2hpcFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWY1MjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlbGF0aW9uc2hpcFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21FbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRmVlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tTGluazsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0KLS8qKgotICogUmVsYXRpb25zaGlwIFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2UgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXBTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0TGlzdEltcGwgcmVzdWx0ID0gbmV3IE9iamVjdExpc3RJbXBsKCk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRMaW5rKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5SRUxfUkVMQVRJT05TSElQUywgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9SRUxBVElPTlNISVBTLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1VCX1JFTEFUSU9OU0hJUF9UWVBFUywgaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQX0RJUkVDVElPTiwgcmVsYXRpb25zaGlwRGlyZWN0aW9uKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZUlkKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMsIG1heEl0ZW1zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgc2tpcENvdW50KTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOwotCi0gICAgICAgIC8vIGhhbmRsZSB0b3AgbGV2ZWwKLSAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZmVlZC5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEF0b21MaW5rKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTmV4dExpbmsoZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbnQoTkFNRV9OVU1fSVRFTVMsIGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKChCaWdJbnRlZ2VyKSBlbGVtZW50LmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgY2hpbGRyZW4KLSAgICAgICAgaWYgKCFmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oZmVlZC5nZXRFbnRyaWVzKCkuc2l6ZSgpKSk7Ci0KLSAgICAgICAgICAgIGZvciAoQXRvbUVudHJ5IGVudHJ5IDogZmVlZC5nZXRFbnRyaWVzKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIHJlbGF0aW9uc2hpcCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBsb2NrTGlua3MoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQotICAgICAgICAgICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcCA9IChPYmplY3REYXRhKSBlbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgdW5sb2NrTGlua3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQocmVsYXRpb25zaGlwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDIwN2E5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9SZXBvc2l0b3J5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21GZWVkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzLkF0b21MaW5rOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZURlZmluaXRpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLQotLyoqCi0gKiBSZXBvc2l0b3J5IFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlIGltcGxlbWVudHMgUmVwb3NpdG9yeVNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcmllc0ludGVybmFsKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gcmVwb3NpdG9yeUluZm9zID0gZ2V0UmVwb3NpdG9yaWVzSW50ZXJuYWwocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeUluZm9zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiUmVwb3NpdG9yeSAnIiArIHJlcG9zaXRvcnlJZCArICInbm90IGZvdW5kISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmZvcy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlJbmZvcy5nZXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSByZXBvc2l0b3J5Ci0gICAgICAgIGZvciAoUmVwb3NpdG9yeUluZm8gaW5mbyA6IHJlcG9zaXRvcnlJbmZvcykgewotICAgICAgICAgICAgaWYgKGluZm8uZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbmZvLmdldElkKCkuZXF1YWxzKHJlcG9zaXRvcnlJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlJlcG9zaXRvcnkgJyIgKyByZXBvc2l0b3J5SWQgKyAiJ25vdCBmb3VuZCEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRUeXBlRGVmaW5pdGlvbkludGVybmFsKHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGdldFR5cGVDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsIHJlc3VsdCA9IG5ldyBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsKCk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgbGluawotICAgICAgICBTdHJpbmcgbGluayA9IG51bGw7Ci0gICAgICAgIGlmICh0eXBlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgbGluayA9IGxvYWRDb2xsZWN0aW9uKHJlcG9zaXRvcnlJZCwgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRVMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluayA9IGxvYWRUeXBlTGluayhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciB0eXBlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUFJPUEVSVFlfREVGSU5JVElPTlMsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21GZWVkLmNsYXNzKTsKLQotICAgICAgICAvLyBoYW5kbGUgdG9wIGxldmVsCi0gICAgICAgIGZvciAoQXRvbUVsZW1lbnQgZWxlbWVudCA6IGZlZWQuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgIGlmIChpc05leHRMaW5rKGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW50KE5BTUVfTlVNX0lURU1TLCBlbGVtZW50KSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcygoQmlnSW50ZWdlcikgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0TGlzdChuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uPihmZWVkLmdldEVudHJpZXMoKS5zaXplKCkpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuCi0gICAgICAgIGlmICghZmVlZC5nZXRFbnRyaWVzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7Ci0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gY2hpbGQgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgbG9ja1R5cGVMaW5rcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSAoVHlwZURlZmluaXRpb24pIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICB1bmxvY2tUeXBlTGlua3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0TGlzdCgpLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0VHlwZURlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4oKTsKLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbnVsbDsKLSAgICAgICAgaWYgKHR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rID0gbG9hZFJlcG9zaXRvcnlMaW5rKHJlcG9zaXRvcnlJZCwgQ29uc3RhbnRzLlJFUF9SRUxfVFlQRURFU0MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluayA9IGxvYWRUeXBlTGluayhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgQ29uc3RhbnRzLlJFTF9ET1dOLCBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSBvciB0eXBlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREVQVEgsIGRlcHRoKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUFJPUEVSVFlfREVGSU5JVElPTlMsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBBdG9tRmVlZCBmZWVkID0gcGFyc2UocmVzcC5nZXRTdHJlYW0oKSwgQXRvbUZlZWQuY2xhc3MpOwotCi0gICAgICAgIC8vIHByb2Nlc3MgdHJlZQotICAgICAgICBhZGRUeXBlRGVzY2VuZGFudHNMZXZlbChyZXBvc2l0b3J5SWQsIGZlZWQsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHR5cGUgZGVzY2VuZGFudHMgbGV2ZWwgcmVjdXJzaXZlbHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFR5cGVEZXNjZW5kYW50c0xldmVsKFN0cmluZyByZXBvc2l0b3J5SWQsIEF0b21GZWVkIGZlZWQsIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGNvbnRhaW5lckxpc3QpIHsKLSAgICAgICAgaWYgKGZlZWQgPT0gbnVsbCB8fCBmZWVkLmdldEVudHJpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZmVlZAotICAgICAgICBmb3IgKEF0b21FbnRyeSBlbnRyeSA6IGZlZWQuZ2V0RW50cmllcygpKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgY2hpbGRDb250YWluZXIgPSBudWxsOwotICAgICAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gY2hpbGRDb250YWluZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4oKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgbG9ja1R5cGVMaW5rcygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgZW50cnkuZ2V0SWQoKSwgKEF0b21MaW5rKSBlbGVtZW50LmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQ29udGFpbmVyID0gbmV3IFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCgoVHlwZURlZmluaXRpb24pIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tRmVlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZURlc2NlbmRhbnRzTGV2ZWwocmVwb3NpdG9yeUlkLCAoQXRvbUZlZWQpIGVsZW1lbnQuZ2V0T2JqZWN0KCksIGNoaWxkQ29udGFpbmVyTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHVubG9ja1R5cGVMaW5rcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hpbGRDb250YWluZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoaWxkQ29udGFpbmVyLnNldENoaWxkcmVuKGNoaWxkQ29udGFpbmVyTGlzdCk7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVyTGlzdC5hZGQoY2hpbGRDb250YWluZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGNyZWF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGRlZmluaXRpb24gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcGFyZW50SWQgPSB0eXBlLmdldFBhcmVudFR5cGVJZCgpOwotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgZGVmaW5pdGlvbiBoYXMgbm8gcGFyZW50IHR5cGUgaWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZFR5cGVMaW5rKHJlcG9zaXRvcnlJZCwgcGFyZW50SWQsIENvbnN0YW50cy5SRUxfRE9XTiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DSElMRFJFTik7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IG9yIHBhcmVudCB0eXBlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHVwIHdyaXRlcgotICAgICAgICBmaW5hbCBBdG9tRW50cnlXcml0ZXIgZW50cnlXcml0ZXIgPSBuZXcgQXRvbUVudHJ5V3JpdGVyKHR5cGUsIGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkpOwotCi0gICAgICAgIC8vIHBvc3QgdGhlIG5ldyB0eXBlIGRlZmluaXRpb24KLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QobmV3IFVybEJ1aWxkZXIobGluayksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gd2UgZXhwZWN0IGEgQ01JUyBlbnRyeQotICAgICAgICBpZiAoZW50cnkuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIlJlY2VpdmVkIEF0b20gZW50cnkgaXMgbm90IGEgQ01JUyBlbnRyeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvY2tUeXBlTGlua3MoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlCi0gICAgICAgICAgICByZW1vdmVUeXBlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChUeXBlRGVmaW5pdGlvbikgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2tUeXBlTGlua3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIHVwZGF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGRlZmluaXRpb24gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gdHlwZS5nZXRJZCgpOwotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGRlZmluaXRpb24gaGFzIG5vIHR5cGUgaWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb25zdGFudHMuUEFSQU1fSUQsIHR5cGVJZCk7Ci0KLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkVGVtcGxhdGVMaW5rKHJlcG9zaXRvcnlJZCwgQ29uc3RhbnRzLlRFTVBMQVRFX1RZUEVfQllfSUQsIHBhcmFtZXRlcnMpOwotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkgb3IgdHlwZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB1cCB3cml0ZXIKLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcih0eXBlLCBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpKTsKLQotICAgICAgICAvLyBwb3N0IHRoZSBuZXcgdHlwZSBkZWZpbml0aW9uCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwdXQobmV3IFVybEJ1aWxkZXIobGluayksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gd2UgZXhwZWN0IGEgQ01JUyBlbnRyeQotICAgICAgICBpZiAoZW50cnkuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIlJlY2VpdmVkIEF0b20gZW50cnkgaXMgbm90IGEgQ01JUyBlbnRyeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvY2tUeXBlTGlua3MoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNhY2hlCi0gICAgICAgICAgICByZW1vdmVUeXBlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVHlwZUxpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChUeXBlRGVmaW5pdGlvbikgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2tUeXBlTGlua3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnN0YW50cy5QQVJBTV9JRCwgdHlwZUlkKTsKLQotICAgICAgICBTdHJpbmcgbGluayA9IGxvYWRUZW1wbGF0ZUxpbmsocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuVEVNUExBVEVfVFlQRV9CWV9JRCwgcGFyYW1ldGVycyk7Ci0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRlbGV0ZShuZXcgVXJsQnVpbGRlcihsaW5rKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1NwaVNlc3Npb25QYXJhbWV0ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9TcGlTZXNzaW9uUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDBhNjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL1NwaVNlc3Npb25QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWI7Ci0KLS8qKgotICogSW50ZXJuYWwgc2Vzc2lvbiBwYXJhbWV0ZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3BpU2Vzc2lvblBhcmFtZXRlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0NBQ0hFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXRvbXB1Yi5saW5rY2FjaGUiOwotCi0gICAgcHJpdmF0ZSBTcGlTZXNzaW9uUGFyYW1ldGVyKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9WZXJzaW9uaW5nU2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9WZXJzaW9uaW5nU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxYTU2Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUZlZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHMuQXRvbUxpbms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLk91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQmFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuUmV0dXJuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLQotLyoqCi0gKiBWZXJzaW9uaW5nIFNlcnZpY2UgQXRvbVB1YiBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uaW5nU2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlIGltcGxlbWVudHMgVmVyc2lvbmluZ1NlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKSB7Ci0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaWQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZENvbGxlY3Rpb24ocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuQ09MTEVDVElPTl9DSEVDS0VET1VUKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkgb3IgY2hlY2tlZG91dCBjb2xsZWN0aW9uIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotCi0gICAgICAgIC8vIHdvcmthcm91bmQgZm9yIFNoYXJlUG9pbnQgMjAxMCAtIHNlZSBDTUlTLTM2MgotICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLklOQ0xVREVfT0JKRUNUSURfVVJMX1BBUkFNX09OX0NIRUNLT1VULCBmYWxzZSkpIHsKLSAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoIm9iamVjdElkIiwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdXAgb2JqZWN0IGFuZCB3cml0ZXIKLSAgICAgICAgZmluYWwgQXRvbUVudHJ5V3JpdGVyIGVudHJ5V3JpdGVyID0gbmV3IEF0b21FbnRyeVdyaXRlcihjcmVhdGVJZE9iamVjdChvYmplY3RJZC5nZXRWYWx1ZSgpKSwKLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpKTsKLQotICAgICAgICAvLyBwb3N0IG1vdmUgcmVxdWVzdAotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgdGhlIHJlc3BvbnNlCi0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7Ci0KLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUoZW50cnkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgbG9ja0xpbmtzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrTGlua3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZW50Q29waWVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnRDb3BpZWQuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBmaW5kIHRoZSBsaW5rCi0gICAgICAgIFN0cmluZyBsaW5rID0gbG9hZExpbmsocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLQotICAgICAgICBpZiAobGluayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvd0xpbmtFeGNlcHRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByZWZlciB3b3JraW5nIGNvcHkgbGluayBpZiBhdmFpbGFibGUKLSAgICAgICAgLy8gKHdvcmthcm91bmQgZm9yIG5vbi1jb21wbGlhbnQgcmVwb3NpdG9yaWVzKQotICAgICAgICBTdHJpbmcgd2NMaW5rID0gZ2V0TGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1dPUktJTkdDT1BZLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLSAgICAgICAgaWYgKHdjTGluayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5rID0gd2NMaW5rOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVsZXRlKG5ldyBVcmxCdWlsZGVyKGxpbmspKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gd2UgbmVlZCBhbiBvYmplY3QgaWQKLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBpZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfU0VMRiwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0KLSAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3dMaW5rRXhjZXB0aW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwgQ29uc3RhbnRzLlJFTF9TRUxGLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByZWZlciB3b3JraW5nIGNvcHkgbGluayBpZiBhdmFpbGFibGUKLSAgICAgICAgLy8gKHdvcmthcm91bmQgZm9yIG5vbi1jb21wbGlhbnQgcmVwb3NpdG9yaWVzKQotICAgICAgICBTdHJpbmcgd2NMaW5rID0gZ2V0TGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCksIENvbnN0YW50cy5SRUxfV09SS0lOR0NPUFksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICBpZiAod2NMaW5rICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpbmsgPSB3Y0xpbms7Ci0gICAgICAgIH0KLQotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IG5ldyBVcmxCdWlsZGVyKGxpbmspOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEVDS0lOX0NPTU1FTlQsIGNoZWNraW5Db21tZW50KTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFKT1IsIG1ham9yKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQ0hFQ0tfSU4sICJ0cnVlIik7Ci0KLSAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgU2hhcmVQb2ludCAtIGNoZWNrIGluIHdpdGhvdXQgcHJvcGVydHkgY2hhbmdlCi0gICAgICAgIGlmIChnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQUREX05BTUVfT05fQ0hFQ0tfSU4sIGZhbHNlKSkgewotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnR5TGlzdCgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaCB0aGUgY3VycmVudCBuYW1lCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqID0gZ2V0T2JqZWN0SW50ZXJuYWwocmVwb3NpdG9yeUlkLCBJZGVudGlmaWVyVHlwZS5JRCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5WZXJzaW9uLlRISVMsICJjbWlzOm9iamVjdElkLGNtaXM6bmFtZSIsIEJvb2xlYW4uRkFMU0UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNtaXM6bm9uZSIsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uRkFMU0UsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBvYmouZ2V0UHJvcGVydGllcygpICE9IG51bGwgJiYgb2JqLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG9iai5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5OQU1FKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gbmFtZVByb3AgPSBvYmouZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVByb3AuZ2V0Rmlyc3RWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IChTdHJpbmcpIG5hbWVQcm9wLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgUFdDISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBkb2N1bWVudCBuYW1lIHRvIHRoZSBzYW1lIHZhbHVlIC0gc2lsbHksIGJ1dAotICAgICAgICAgICAgICAgICAgICAvLyBTaGFyZVBvaW50IHJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIHByb3BlcnR5IHZhbHVlIGhhcwotICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBjaGFuZ2VkIGFuZCB0aGUgbmFtZSBpcyB0aGUgb25seSByZWxpYWJsZSBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnRpZXNJbXBsKSBwcm9wZXJ0aWVzKS5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlTdHJpbmdJbXBsKFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgUFdDOiAiICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdXAgd3JpdGVyCi0gICAgICAgIGZpbmFsIEF0b21FbnRyeVdyaXRlciBlbnRyeVdyaXRlciA9IG5ldyBBdG9tRW50cnlXcml0ZXIoY3JlYXRlT2JqZWN0KHByb3BlcnRpZXMsIG51bGwsIHBvbGljaWVzKSwKLSAgICAgICAgICAgICAgICBnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCBjb250ZW50U3RyZWFtKTsKLQotICAgICAgICAvLyB1cGRhdGUKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHB1dCh1cmwsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZW50cnlXcml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gcGFyc2UgbmV3IGVudHJ5Ci0gICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IHBhcnNlKHJlc3AuZ2V0U3RyZWFtKCksIEF0b21FbnRyeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gd2UgZXhwZWN0IGEgQ01JUyBlbnRyeQotICAgICAgICBpZiAoZW50cnkuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIlJlY2VpdmVkIEF0b20gZW50cnkgaXMgbm90IGEgQ01JUyBlbnRyeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBvYmplY3QgaWQKLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUoZW50cnkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgQWNjZXNzQ29udHJvbExpc3RJbXBsIG9yaWdpbmFsQWNlcyA9IG51bGw7Ci0KLSAgICAgICAgbG9ja0xpbmtzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQotICAgICAgICAgICAgcmVtb3ZlTGlua3MocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHRoZSBlbnRyeQotICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgQXRvbUxpbmspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkTGluayhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCksIChBdG9tTGluaykgZWxlbWVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0IGN1cnJlbnQgQUNMCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gKE9iamVjdERhdGEpIGVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0QWNsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBY2VzID0gbmV3IEFjY2Vzc0NvbnRyb2xMaXN0SW1wbChvYmplY3QuZ2V0QWNsKCkuZ2V0QWNlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQWNlcy5zZXRFeGFjdChvYmplY3QuaXNFeGFjdEFjbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgQUNMIG1vZGlmaWNhdGlvbnMKLSAgICAgICAgaWYgKChvcmlnaW5hbEFjZXMgIT0gbnVsbCkgJiYgKGlzQWNsTWVyZ2VSZXF1aXJlZChhZGRBY2VzLCByZW1vdmVBY2VzKSkpIHsKLSAgICAgICAgICAgIC8vIG1lcmdlIGFuZCB1cGRhdGUgQUNMCi0gICAgICAgICAgICBBY2wgbmV3QUNMID0gbWVyZ2VBY2xzKG9yaWdpbmFsQWNlcywgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgICAgICBpZiAobmV3QUNMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVBY2wocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCBuZXdBQ0wsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QWxsVmVyc2lvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3REYXRhPigpOwotCi0gICAgICAgIC8vIGZpbmQgdGhlIGxpbmsKLSAgICAgICAgU3RyaW5nIGxpbmsgPSBsb2FkTGluayhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1ZFUlNJT05ISVNUT1JZLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgIGlmIChsaW5rID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93TGlua0V4Y2VwdGlvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuUkVMX1ZFUlNJT05ISVNUT1JZLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBuZXcgVXJsQnVpbGRlcihsaW5rKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIEF0b21GZWVkIGZlZWQgPSBwYXJzZShyZXNwLmdldFN0cmVhbSgpLCBBdG9tRmVlZC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSB2ZXJzaW9ucwotICAgICAgICBpZiAoIWZlZWQuZ2V0RW50cmllcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChBdG9tRW50cnkgZW50cnkgOiBmZWVkLmdldEVudHJpZXMoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgdmVyc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBsb2NrTGlua3MoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBjYWNoZQotICAgICAgICAgICAgICAgICAgICByZW1vdmVMaW5rcyhyZXBvc2l0b3J5SWQsIGVudHJ5LmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdhbGsgdGhyb3VnaCB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBdG9tRWxlbWVudCBlbGVtZW50IDogZW50cnkuZ2V0RWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBBdG9tTGluaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpbmsocmVwb3NpdG9yeUlkLCBlbnRyeS5nZXRJZCgpLCAoQXRvbUxpbmspIGVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldE9iamVjdCgpIGluc3RhbmNlb2YgT2JqZWN0RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHVubG9ja0xpbmtzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHZlcnNpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBQ0wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIFJldHVyblZlcnNpb24gcmV0dXJuVmVyc2lvbiA9IFJldHVyblZlcnNpb24uTEFURVNUOwotICAgICAgICBpZiAoKG1ham9yICE9IG51bGwpICYmIChtYWpvci5ib29sZWFuVmFsdWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVyblZlcnNpb24gPSBSZXR1cm5WZXJzaW9uLkxBU1RFU1RNQUpPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBvYmplY3RJZCwgcmV0dXJuVmVyc2lvbiwgZmlsdGVyLAotICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQUNMLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgUmV0dXJuVmVyc2lvbiByZXR1cm5WZXJzaW9uID0gUmV0dXJuVmVyc2lvbi5MQVRFU1Q7Ci0gICAgICAgIGlmICgobWFqb3IgIT0gbnVsbCkgJiYgKG1ham9yLmJvb2xlYW5WYWx1ZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuVmVyc2lvbiA9IFJldHVyblZlcnNpb24uTEFTVEVTVE1BSk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRPYmplY3RJbnRlcm5hbChyZXBvc2l0b3J5SWQsIElkZW50aWZpZXJUeXBlLklELCBvYmplY3RJZCwgcmV0dXJuVmVyc2lvbiwgZmlsdGVyLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsICJjbWlzOm5vbmUiLCBCb29sZWFuLkZBTFNFLCBCb29sZWFuLkZBTFNFLCBleHRlbnNpb24pOwotCi0gICAgICAgIHJldHVybiBvYmplY3QuZ2V0UHJvcGVydGllcygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21BY2wuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21BY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MmZkZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tQWNsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotCi0vKioKLSAqIEF0b21BY2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdG9tQWNsIGV4dGVuZHMgQXRvbUJhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIEFjbCBhY2w7Ci0KLSAgICBwdWJsaWMgQXRvbUFjbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXRvbUFjbChBY2wgYWNsKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5hY2wgPSBhY2w7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gIkFDTCI7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBnZXRBQ0woKSB7Ci0gICAgICAgIHJldHVybiBhY2w7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QUNMKEFjbCBhY2wpIHsKLSAgICAgICAgdGhpcy5hY2wgPSBhY2w7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21BbGxvd2FibGVBY3Rpb25zLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tQWxsb3dhYmxlQWN0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmRjYzk5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21BbGxvd2FibGVBY3Rpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLQotLyoqCi0gKiBBdG9tQWxsb3dhYmxlQWN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEF0b21BbGxvd2FibGVBY3Rpb25zIGV4dGVuZHMgQXRvbUJhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9uczsKLQotICAgIHB1YmxpYyBBdG9tQWxsb3dhYmxlQWN0aW9ucygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXRvbUFsbG93YWJsZUFjdGlvbnMoQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5hbGxvd2FibGVBY3Rpb25zID0gYWxsb3dhYmxlQWN0aW9uczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAiQWxsb3dhYmxlIEFjdGlvbnMiOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBhbGxvd2FibGVBY3Rpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93YWJsZUFjdGlvbnMoQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zKSB7Ci0gICAgICAgIHRoaXMuYWxsb3dhYmxlQWN0aW9ucyA9IGFsbG93YWJsZUFjdGlvbnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUJhc2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21CYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ODNmNzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQmFzZSB0eXBlIGZvciBBdG9tIHJlc3BvbnNlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEF0b21CYXNlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEF0b21FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QXRvbUVsZW1lbnQ+KCk7Ci0KLSAgICBwcm90ZWN0ZWQgQXRvbUJhc2UoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgICBwdWJsaWMgTGlzdDxBdG9tRWxlbWVudD4gZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KEF0b21FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUVsZW1lbnQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjE3N2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBBdG9tIEVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdG9tRWxlbWVudCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgUU5hbWUgbmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBvYmplY3Q7Ci0KLSAgICBwdWJsaWMgQXRvbUVsZW1lbnQoUU5hbWUgbmFtZSwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUgKyAiOiAiICsgb2JqZWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21FbnRyeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjkyMGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLm9iamVjdHM7Ci0KLS8qKgotICogQXRvbSBFbnRyeS4KLSAqLwotcHVibGljIGNsYXNzIEF0b21FbnRyeSBleHRlbmRzIEF0b21CYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICBwdWJsaWMgQXRvbUVudHJ5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJBdG9tIEVudHJ5IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkVudHJ5IFwiIiArIGlkICsgIlwiOiAiICsgZ2V0RWxlbWVudHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tRmVlZC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUZlZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MGY0Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9BdG9tRmVlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBdG9tIEZlZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdG9tRmVlZCBleHRlbmRzIEF0b21CYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEF0b21FbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8QXRvbUVudHJ5PigpOwotCi0gICAgcHVibGljIEF0b21GZWVkKCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJBdG9tIEZlZWQiOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEF0b21FbnRyeT4gZ2V0RW50cmllcygpIHsKLSAgICAgICAgcmV0dXJuIGVudHJpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRW50cnkoQXRvbUVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkZlZWQgOiAiICsgZ2V0RWxlbWVudHMoKSArICIgIiArIGVudHJpZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUxpbmsuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0F0b21MaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmMxNjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvQXRvbUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIEF0b20gTGluay4KLSAqLwotcHVibGljIGNsYXNzIEF0b21MaW5rIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVsOwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaHJlZjsKLQotICAgIHB1YmxpYyBBdG9tTGluaygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbCgpIHsKLSAgICAgICAgcmV0dXJuIHJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWwoU3RyaW5nIHJlbCkgewotICAgICAgICB0aGlzLnJlbCA9IHJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBocmVmOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpIHsKLSAgICAgICAgdGhpcy5ocmVmID0gaHJlZjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkxpbms6IHJlbD1cIiIgKyByZWwgKyAiXCIgdHlwZT1cIiIgKyB0eXBlICsgIlwiIGhyZWY9XCIiICsgaHJlZiArICJcIiI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvSHRtbERvYy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvSHRtbERvYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjQ2YmEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYXRvbXB1Yi9vYmplY3RzL0h0bWxEb2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0czsKLQotcHVibGljIGNsYXNzIEh0bWxEb2MgZXh0ZW5kcyBBdG9tQmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICJIVE1MIGRvY3VtZW50IjsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9SZXBvc2l0b3J5V29ya3NwYWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9SZXBvc2l0b3J5V29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDYxYWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvUmVwb3NpdG9yeVdvcmtzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzOwotCi0vKioKLSAqIFJlcG9zaXRvcnkgd29ya3NwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVdvcmtzcGFjZSBleHRlbmRzIEF0b21CYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeVdvcmtzcGFjZSgpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAiUmVwb3NpdG9yeSBXb3Jrc3BhY2UiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiV29ya3NwYWNlIFwiIiArIGlkICsgIlwiOiAiICsgZ2V0RWxlbWVudHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9TZXJ2aWNlRG9jLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2F0b21wdWIvb2JqZWN0cy9TZXJ2aWNlRG9jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMzI2NWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9hdG9tcHViL29iamVjdHMvU2VydmljZURvYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYXRvbXB1Yi5vYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBTZXJ2aWNlIERvYy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VEb2MgZXh0ZW5kcyBBdG9tQmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXBvc2l0b3J5V29ya3NwYWNlPiB3b3Jrc3BhY2VzID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5V29ya3NwYWNlPigpOwotCi0gICAgcHVibGljIFNlcnZpY2VEb2MoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gIlNlcnZpY2UgRG9jdW1lbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlcG9zaXRvcnlXb3Jrc3BhY2U+IGdldFdvcmtzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiB3b3Jrc3BhY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFdvcmtzcGFjZShSZXBvc2l0b3J5V29ya3NwYWNlIHdzKSB7Ci0gICAgICAgIGlmICh3cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3b3Jrc3BhY2VzLmFkZCh3cyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlcnZpY2UgRG9jOiAiICsgd29ya3NwYWNlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvQWJzdHJhY3RCcm93c2VyQmluZGluZ1NlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9BYnN0cmFjdEJyb3dzZXJCaW5kaW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThmNjllLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9BYnN0cmFjdEJyb3dzZXJCaW5kaW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5DbWlzQmluZGluZ3NIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkxpbmtBY2Nlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLkh0dHBJbnZva2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5U3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGF0ZVRpbWVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnN0cmFpbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1NlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1ZlcnNpb25pbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSlNPTkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSlNPTkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUluZm9Ccm93c2VyQmluZGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5wYXJzZXIuQ29udGFpbmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5wYXJzZXIuSlNPTlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLnBhcnNlci5KU09OUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgQnJvd3NlciBCaW5kaW5nIGNsaWVudCBzZXJ2aWNlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QnJvd3NlckJpbmRpbmdTZXJ2aWNlIGltcGxlbWVudHMgTGlua0FjY2VzcyB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbnRhaW5lckZhY3RvcnkgU0lNUExFX0NPTlRBSU5FUl9GQUNUT1JZID0gbmV3IENvbnRhaW5lckZhY3RvcnkoKSB7Ci0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGNyZWF0ZU9iamVjdENvbnRhaW5lcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gY3JlYXRBcnJheUNvbnRhaW5lcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIEJpbmRpbmdTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN1Y2NpbnQ7Ci0gICAgcHJpdmF0ZSBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdDsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXNzaW9uKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgICAgICBPYmplY3Qgc3VjY2ludE9iaiA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQlJPV1NFUl9TVUNDSU5DVCk7Ci0gICAgICAgIHRoaXMuc3VjY2ludCA9IChzdWNjaW50T2JqID09IG51bGwgPyB0cnVlIDogQm9vbGVhbi5wYXJzZUJvb2xlYW4oc3VjY2ludE9iai50b1N0cmluZygpKSk7Ci0KLSAgICAgICAgT2JqZWN0IGRhdGVUaW1lRm9ybWF0T2JqID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX0RBVEVUSU1FX0ZPUk1BVCk7Ci0gICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXQgPSAoZGF0ZVRpbWVGb3JtYXRPYmogPT0gbnVsbCA/IERhdGVUaW1lRm9ybWF0LlNJTVBMRSA6IERhdGVUaW1lRm9ybWF0Ci0gICAgICAgICAgICAgICAgLmZyb21WYWx1ZShkYXRlVGltZUZvcm1hdE9iai50b1N0cmluZygpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmluZGluZ1Nlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgSFRUUCBJbnZva2VyIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSHR0cEludm9rZXIgZ2V0SHR0cEludm9rZXIoKSB7Ci0gICAgICAgIHJldHVybiBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0SHR0cEludm9rZXIoc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VydmljZSBVUkwgb2YgdGhpcyBzZXNzaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmljZVVybCgpIHsKLSAgICAgICAgT2JqZWN0IHVybCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQlJPV1NFUl9VUkwpOwotICAgICAgICBpZiAodXJsIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgdXJsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFVybEJ1aWxkZXIgZ2V0UmVwb3NpdG9yeVVybChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc2VsZWN0b3IpIHsKLSAgICAgICAgVXJsQnVpbGRlciByZXN1bHQgPSBnZXRSZXBvc2l0b3J5VXJsQ2FjaGUoKS5nZXRSZXBvc2l0b3J5VXJsKHJlcG9zaXRvcnlJZCwgc2VsZWN0b3IpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yaWVzSW50ZXJuYWwocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFJlcG9zaXRvcnlVcmxDYWNoZSgpLmdldFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeUlkLCBzZWxlY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFVybEJ1aWxkZXIgZ2V0UmVwb3NpdG9yeVVybChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIFVybEJ1aWxkZXIgcmVzdWx0ID0gZ2V0UmVwb3NpdG9yeVVybENhY2hlKCkuZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yaWVzSW50ZXJuYWwocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFJlcG9zaXRvcnlVcmxDYWNoZSgpLmdldFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVXJsQnVpbGRlciBnZXRPYmplY3RVcmwoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc2VsZWN0b3IpIHsKLSAgICAgICAgVXJsQnVpbGRlciByZXN1bHQgPSBnZXRSZXBvc2l0b3J5VXJsQ2FjaGUoKS5nZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgc2VsZWN0b3IpOwotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yaWVzSW50ZXJuYWwocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFJlcG9zaXRvcnlVcmxDYWNoZSgpLmdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBzZWxlY3Rvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFVybEJ1aWxkZXIgZ2V0T2JqZWN0VXJsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBVcmxCdWlsZGVyIHJlc3VsdCA9IGdldFJlcG9zaXRvcnlVcmxDYWNoZSgpLmdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRSZXBvc2l0b3J5VXJsQ2FjaGUoKS5nZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFVybEJ1aWxkZXIgZ2V0UGF0aFVybChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHNlbGVjdG9yKSB7Ci0gICAgICAgIFVybEJ1aWxkZXIgcmVzdWx0ID0gZ2V0UmVwb3NpdG9yeVVybENhY2hlKCkuZ2V0UGF0aFVybChyZXBvc2l0b3J5SWQsIHBhdGgsIHNlbGVjdG9yKTsKLQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRSZXBvc2l0b3J5VXJsQ2FjaGUoKS5nZXRQYXRoVXJsKHJlcG9zaXRvcnlJZCwgcGF0aCwgc2VsZWN0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFN1Y2NpbmN0KCkgewotICAgICAgICByZXR1cm4gc3VjY2ludDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN1Y2NpbmN0UGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gc3VjY2ludCA/ICJ0cnVlIiA6IG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGVUaW1lRm9ybWF0IGdldERhdGVUaW1lRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gZGF0ZVRpbWVGb3JtYXQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpIHsKLSAgICAgICAgcmV0dXJuIGRhdGVUaW1lRm9ybWF0ID09IG51bGwgfHwgZGF0ZVRpbWVGb3JtYXQgPT0gRGF0ZVRpbWVGb3JtYXQuU0lNUExFID8gbnVsbCA6IGRhdGVUaW1lRm9ybWF0LnZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0Q2hhbmdlVG9rZW4oSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sIE9iamVjdERhdGEgb2JqKSB7Ci0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFuZ2VUb2tlbi5zZXRWYWx1ZShudWxsKTsKLQotICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqLmdldFByb3BlcnRpZXMoKSA9PSBudWxsIHx8IG9iai5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBjdCA9IG9iai5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pOwotICAgICAgICBpZiAoY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykgewotICAgICAgICAgICAgY2hhbmdlVG9rZW4uc2V0VmFsdWUoKChQcm9wZXJ0eVN0cmluZykgY3QpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tIGV4Y2VwdGlvbnMgLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gZXJyb3IgbWVzc2FnZSBvciBhIEhUVFAgc3RhdHVzIGNvZGUgaW50byBhbiBFeGNlcHRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENtaXNCYXNlRXhjZXB0aW9uIGNvbnZlcnRTdGF0dXNDb2RlKGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZXJyb3JDb250ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7Ci0gICAgICAgICAgICAgICAgb2JqID0gcGFyc2VyLnBhcnNlKGVycm9yQ29udGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEpTT05QYXJzZUV4Y2VwdGlvbiBwZSkgewotICAgICAgICAgICAgLy8gZXJyb3IgY29udGVudCBpcyBub3QgdmFsaWQgSlNPTiAtPiBpZ25vcmUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBKU09OT2JqZWN0KSB7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb24gPSAoSlNPTk9iamVjdCkgb2JqOwotICAgICAgICAgICAgT2JqZWN0IGpzb25FcnJvciA9IGpzb24uZ2V0KEpTT05Db25zdGFudHMuRVJST1JfRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIGlmIChqc29uRXJyb3IgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QganNvbk1lc3NhZ2UgPSBqc29uLmdldChKU09OQ29uc3RhbnRzLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIGlmIChqc29uTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBqc29uTWVzc2FnZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChDbWlzQ29uc3RyYWludEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGpzb25FcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykganNvbkVycm9yKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykganNvbkVycm9yKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNGaWx0ZXJOb3RWYWxpZEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGpzb25FcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBqc29uRXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykganNvbkVycm9yKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGpzb25FcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uLkVYQ0VQVElPTl9OQU1FLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZykganNvbkVycm9yKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDbWlzU3RvcmFnZUV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGpzb25FcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGpzb25FcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBqc29uRXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbi5FWENFUFRJT05fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGpzb25FcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSA1MDMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHN0YXR1cyBjb2RlCi0gICAgICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIDMwMToKLSAgICAgICAgY2FzZSAzMDI6Ci0gICAgICAgIGNhc2UgMzAzOgotICAgICAgICBjYXNlIDMwNzoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIlJlZGlyZWN0cyBhcmUgbm90IHN1cHBvcnRlZCAoSFRUUCBzdGF0dXMgY29kZSAiICsgY29kZSArICIpOiAiCi0gICAgICAgICAgICAgICAgICAgICsgbWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgY2FzZSA0MDA6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgY2FzZSA0MDE6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgY2FzZSA0MDM6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgIGNhc2UgNDA0OgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgY2FzZSA0MDU6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24obWVzc2FnZSwgZXJyb3JDb250ZW50LCB0KTsKLSAgICAgICAgY2FzZSA0MDc6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgdCk7Ci0gICAgICAgIGNhc2UgNDA5OgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICBjYXNlIDUwMzoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1NlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLSBoZWxwZXJzIC0tLS0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhbiBvYmplY3QgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyc2VPYmplY3QoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgY2hhcnNldCkgewotICAgICAgICBPYmplY3Qgb2JqID0gcGFyc2Uoc3RyZWFtLCBjaGFyc2V0LCBTSU1QTEVfQ09OVEFJTkVSX0ZBQ1RPUlkpOwotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0Pikgb2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJVbmV4cGVjdGVkIG9iamVjdCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYW4gYXJyYXkgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBwYXJzZUFycmF5KElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlKHN0cmVhbSwgY2hhcnNldCwgU0lNUExFX0NPTlRBSU5FUl9GQUNUT1JZKTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgcmV0dXJuIChMaXN0PE9iamVjdD4pIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiVW5leHBlY3RlZCBvYmplY3QhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIGlucHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHBhcnNlKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGNoYXJzZXQsIENvbnRhaW5lckZhY3RvcnkgY29udGFpbmVyRmFjdG9yeSkgewotCi0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0KLSAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtLCBjaGFyc2V0KTsKLSAgICAgICAgICAgIEpTT05QYXJzZXIgcGFyc2VyID0gbmV3IEpTT05QYXJzZXIoKTsKLSAgICAgICAgICAgIG9iaiA9IHBhcnNlci5wYXJzZShyZWFkZXIsIGNvbnRhaW5lckZhY3RvcnkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJQYXJzaW5nIGV4Y2VwdGlvbiEiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY29uc3VtZUFuZENsb3NlKHJlYWRlcik7Ci0gICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShzdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIEdFVCBvbiBhbiBVUkwsIGNoZWNrcyB0aGUgcmVzcG9uc2UgY29kZSBhbmQgcmV0dXJucyB0aGUKLSAgICAgKiByZXN1bHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlc3BvbnNlIHJlYWQoVXJsQnVpbGRlciB1cmwpIHsKLSAgICAgICAgLy8gbWFrZSB0aGUgY2FsbAotICAgICAgICBSZXNwb25zZSByZXNwID0gZ2V0SHR0cEludm9rZXIoKS5pbnZva2VHRVQodXJsLCBzZXNzaW9uKTsKLQotICAgICAgICAvLyBjaGVjayByZXNwb25zZSBjb2RlCi0gICAgICAgIGlmIChyZXNwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMCkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIFBPU1Qgb24gYW4gVVJMLCBjaGVja3MgdGhlIHJlc3BvbnNlIGNvZGUgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVzdWx0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXNwb25zZSBwb3N0KFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgY29udGVudFR5cGUsIE91dHB1dCB3cml0ZXIpIHsKLSAgICAgICAgLy8gbWFrZSB0aGUgY2FsbAotICAgICAgICBSZXNwb25zZSByZXNwID0gZ2V0SHR0cEludm9rZXIoKS5pbnZva2VQT1NUKHVybCwgY29udGVudFR5cGUsIHdyaXRlciwgc2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcmVzcG9uc2UgY29kZQotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDAgJiYgcmVzcC5nZXRSZXNwb25zZUNvZGUoKSAhPSAyMDEpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRTdGF0dXNDb2RlKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCksIHJlc3AuZ2V0UmVzcG9uc2VNZXNzYWdlKCksIHJlc3AuZ2V0RXJyb3JDb250ZW50KCksIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBQT1NUIG9uIGFuIFVSTCwgY2hlY2tzIHRoZSByZXNwb25zZSBjb2RlIGFuZCByZXR1cm5zIHRoZQotICAgICAqIHJlc3VsdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0QW5kQ29uc3VtZShVcmxCdWlsZGVyIHVybCwgU3RyaW5nIGNvbnRlbnRUeXBlLCBPdXRwdXQgd3JpdGVyKSB7Ci0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgY29udGVudFR5cGUsIHdyaXRlcik7Ci0gICAgICAgIElPVXRpbHMuY29uc3VtZUFuZENsb3NlKHJlc3AuZ2V0U3RyZWFtKCkpOwotICAgIH0KLQotICAgIC8vIC0tLS0gVVJMIC0tLS0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlcG9zaXRvcnkgVVJMIGNhY2hlIG9yIGNyZWF0ZXMgYSBuZXcgY2FjaGUgaWYgaXQgZG9lc24ndAotICAgICAqIGV4aXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZXBvc2l0b3J5VXJsQ2FjaGUgZ2V0UmVwb3NpdG9yeVVybENhY2hlKCkgewotICAgICAgICBSZXBvc2l0b3J5VXJsQ2FjaGUgcmVwb3NpdG9yeVVybENhY2hlID0gKFJlcG9zaXRvcnlVcmxDYWNoZSkgZ2V0U2Vzc2lvbigpLmdldCgKLSAgICAgICAgICAgICAgICBTcGlTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfVVJMX0NBQ0hFKTsKLSAgICAgICAgaWYgKHJlcG9zaXRvcnlVcmxDYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXBvc2l0b3J5VXJsQ2FjaGUgPSBuZXcgUmVwb3NpdG9yeVVybENhY2hlKCk7Ci0gICAgICAgICAgICBnZXRTZXNzaW9uKCkucHV0KFNwaVNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9VUkxfQ0FDSEUsIHJlcG9zaXRvcnlVcmxDYWNoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeVVybENhY2hlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgdGhlIHJlcG9zaXRvcnkgaW5mbyBvYmplY3RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0PFJlcG9zaXRvcnlJbmZvPiBnZXRSZXBvc2l0b3JpZXNJbnRlcm5hbChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0KLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBudWxsOwotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbm8gcmVwb3NpdG9yeSBpZCBwcm92aWRlZCAtPiBnZXQgYWxsCi0gICAgICAgICAgICB1cmwgPSBuZXcgVXJsQnVpbGRlcihnZXRTZXJ2aWNlVXJsKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdXNlIFVSTCBvZiB0aGUgc3BlY2lmaWVkIHJlcG9zaXRvcnkKLSAgICAgICAgICAgIHVybCA9IGdldFJlcG9zaXRvcnlVcmxDYWNoZSgpLmdldFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuU0VMRUNUT1JfUkVQT1NJVE9SWV9JTkZPKTsKLSAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHJlcG9zaXRvcnkgaW5mb3MgaGF2ZW4ndCBiZWVuIGZldGNoZWQgeWV0IC0+IGdldCB0aGVtIGFsbAotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVcmxCdWlsZGVyKGdldFNlcnZpY2VVcmwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gcmVwSW5mb3MgPSBuZXcgQXJyYXlMaXN0PFJlcG9zaXRvcnlJbmZvPigpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IGpyaSA6IGpzb24udmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChqcmkgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBSZXBvc2l0b3J5SW5mbyByaSA9IEpTT05Db252ZXJ0ZXIuY29udmVydFJlcG9zaXRvcnlJbmZvKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqcmkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IHJpLmdldElkKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5SW5mb0Jyb3dzZXJCaW5kaW5nSW1wbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeVVybCA9ICgoUmVwb3NpdG9yeUluZm9Ccm93c2VyQmluZGluZ0ltcGwpIHJpKS5nZXRSZXBvc2l0b3J5VXJsKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByb290VXJsID0gKChSZXBvc2l0b3J5SW5mb0Jyb3dzZXJCaW5kaW5nSW1wbCkgcmkpLmdldFJvb3RVcmwoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCB8fCByZXBvc2l0b3J5VXJsID09IG51bGwgfHwgcm9vdFVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIkZvdW5kIGludmFsaWQgUmVwb3NpdG9yeSBJbmZvISAoaWQ6ICIgKyBpZCArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBnZXRSZXBvc2l0b3J5VXJsQ2FjaGUoKS5hZGRSZXBvc2l0b3J5KGlkLCByZXBvc2l0b3J5VXJsLCByb290VXJsKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXBJbmZvcy5hZGQocmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIkZvdW5kIGludmFsaWQgUmVwb3NpdG9yeSBJbmZvISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlcEluZm9zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb25JbnRlcm5hbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuU0VMRUNUT1JfVFlQRV9ERUZJTklUSU9OKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZUlkKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydFR5cGVEZWZpbml0aW9uKGpzb24pOwotICAgIH0KLQotICAgIC8vIC0tLS0gTGlua0FjY2VzcyBpbnRlcmZhY2UgLS0tLQotCi0gICAgcHVibGljIFN0cmluZyBsb2FkTGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZWwsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIC8vIEF0b21QdWIgc3BlY2lmaWMgLT4gcmV0dXJuIG51bGwKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb2FkQ29udGVudExpbmsoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGRvY3VtZW50SWQpIHsKLSAgICAgICAgVXJsQnVpbGRlciByZXN1bHQgPSBnZXRSZXBvc2l0b3J5VXJsQ2FjaGUoKS5nZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBkb2N1bWVudElkLCBDb25zdGFudHMuU0VMRUNUT1JfQ09OVEVOVCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IG51bGwgOiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGxvYWRSZW5kaXRpb25Db250ZW50TGluayhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZG9jdW1lbnRJZCwgU3RyaW5nIHN0cmVhbUlkKSB7Ci0gICAgICAgIFVybEJ1aWxkZXIgcmVzdWx0ID0gZ2V0UmVwb3NpdG9yeVVybENhY2hlKCkuZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgZG9jdW1lbnRJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX0NPTlRFTlQpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NUUkVBTV9JRCwgc3RyZWFtSWQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9icm93c2VyL0FjbFNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvQWNsU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmMTM1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvQWNsU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5icm93c2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQWNsU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5FeHRlbmRlZEFjbFNlcnZpY2U7Ci0KLS8qKgotICogQUNMIFNlcnZpY2UgQnJvd3NlciBCaW5kaW5nIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIEFjbFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyQmluZGluZ1NlcnZpY2UgaW1wbGVtZW50cyBBY2xTZXJ2aWNlLCBFeHRlbmRlZEFjbFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFjbFNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGdldEFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gb25seUJhc2ljUGVybWlzc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX0FDTCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09OTFlfQkFTSUNfUEVSTUlTU0lPTlMsIG9ubHlCYXNpY1Blcm1pc3Npb25zKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydEFjbChqc29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fQVBQTFlfQUNMKTsKLSAgICAgICAgZm9ybURhdGEuYWRkQWRkQWNlc1BhcmFtZXRlcnMoYWRkQWNlcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFJlbW92ZUFjZXNQYXJhbWV0ZXJzKHJlbW92ZUFjZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FDTF9QUk9QQUdBVElPTiwgYWNsUHJvcGFnYXRpb24pOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0QWNsKGpzb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgc2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMpIHsKLSAgICAgICAgQWNsIGN1cnJlbnRBY2wgPSBnZXRBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmFsc2UsIG51bGwpOwotCi0gICAgICAgIExpc3Q8QWNlPiByZW1vdmVBY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0gICAgICAgIGlmIChjdXJyZW50QWNsLmdldEFjZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiBjdXJyZW50QWNsLmdldEFjZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChhY2UuaXNEaXJlY3QoKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVBY2VzLmFkZChhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2VzLCBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKHJlbW92ZUFjZXMpLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9DbGllbnRUeXBlQ2FjaGVJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvQ2xpZW50VHlwZUNhY2hlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGRiYTUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9DbGllbnRUeXBlQ2FjaGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5icm93c2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLlR5cGVEZWZpbml0aW9uQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuQ21pc0JpbmRpbmdzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlR5cGVDYWNoZTsKLQotcHVibGljIGNsYXNzIENsaWVudFR5cGVDYWNoZUltcGwgaW1wbGVtZW50cyBUeXBlQ2FjaGUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVwb3NpdG9yeUlkOwotICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RCcm93c2VyQmluZGluZ1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHB1YmxpYyBDbGllbnRUeXBlQ2FjaGVJbXBsKFN0cmluZyByZXBvc2l0b3J5SWQsIEFic3RyYWN0QnJvd3NlckJpbmRpbmdTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5yZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5SWQ7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyB0eXBlSWQpIHsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkNhY2hlIGNhY2hlID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldFR5cGVEZWZpbml0aW9uQ2FjaGUoc2VydmljZS5nZXRTZXNzaW9uKCkpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSBjYWNoZS5nZXQocmVwb3NpdG9yeUlkLCB0eXBlSWQpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gc2VydmljZS5nZXRUeXBlRGVmaW5pdGlvbkludGVybmFsKHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWNoZS5wdXQocmVwb3NpdG9yeUlkLCB0eXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiByZWxvYWRUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZUlkKSB7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25DYWNoZSBjYWNoZSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRUeXBlRGVmaW5pdGlvbkNhY2hlKHNlcnZpY2UuZ2V0U2Vzc2lvbigpKTsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gc2VydmljZS5nZXRUeXBlRGVmaW5pdGlvbkludGVybmFsKHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgY2FjaGUucHV0KHJlcG9zaXRvcnlJZCwgdHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb25Gb3JPYmplY3QoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIC8vIG5vdCB1c2VkCi0gICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBnZXRQcm9wZXJ0eURlZmluaXRpb24oU3RyaW5nIHByb3BJZCkgewotICAgICAgICBhc3NlcnQgZmFsc2U7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9DbWlzQnJvd3NlckJpbmRpbmdTcGkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9DbWlzQnJvd3NlckJpbmRpbmdTcGkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1OTNlMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvQ21pc0Jyb3dzZXJCaW5kaW5nU3BpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5DbWlzU3BpOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkFjbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRGlzY292ZXJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Qb2xpY3lTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuVmVyc2lvbmluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENtaXNCcm93c2VyQmluZGluZ1NwaSBpbXBsZW1lbnRzIENtaXNTcGkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENtaXNCcm93c2VyQmluZGluZ1NwaS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJpbmRpbmdTZXNzaW9uIHNlc3Npb247Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnlTZXJ2aWNlIHJlcG9zaXRvcnlTZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgTmF2aWdhdGlvblNlcnZpY2UgbmF2aWdhdGlvblNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RTZXJ2aWNlIG9iamVjdFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uaW5nU2VydmljZSB2ZXJzaW9uaW5nU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIERpc2NvdmVyeVNlcnZpY2UgZGlzY292ZXJ5U2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIE11bHRpRmlsaW5nU2VydmljZSBtdWx0aUZpbGluZ1NlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWxhdGlvbnNoaXBTZXJ2aWNlIHJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQb2xpY3lTZXJ2aWNlIHBvbGljeVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY2xTZXJ2aWNlIGFjbFNlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0Jyb3dzZXJCaW5kaW5nU3BpKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24ge306IEluaXRpYWxpemluZyBCcm93c2VyIEJpbmRpbmcgU1BJLi4uIiwgc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotCi0gICAgICAgIHJlcG9zaXRvcnlTZXJ2aWNlID0gbmV3IFJlcG9zaXRvcnlTZXJ2aWNlSW1wbChzZXNzaW9uKTsKLSAgICAgICAgbmF2aWdhdGlvblNlcnZpY2UgPSBuZXcgTmF2aWdhdGlvblNlcnZpY2VJbXBsKHNlc3Npb24pOwotICAgICAgICBvYmplY3RTZXJ2aWNlID0gbmV3IE9iamVjdFNlcnZpY2VJbXBsKHNlc3Npb24pOwotICAgICAgICB2ZXJzaW9uaW5nU2VydmljZSA9IG5ldyBWZXJzaW9uaW5nU2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgICAgIGRpc2NvdmVyeVNlcnZpY2UgPSBuZXcgRGlzY292ZXJ5U2VydmljZUltcGwoc2Vzc2lvbik7Ci0gICAgICAgIG11bHRpRmlsaW5nU2VydmljZSA9IG5ldyBNdWx0aUZpbGluZ1NlcnZpY2VJbXBsKHNlc3Npb24pOwotICAgICAgICByZWxhdGlvbnNoaXBTZXJ2aWNlID0gbmV3IFJlbGF0aW9uc2hpcFNlcnZpY2VJbXBsKHNlc3Npb24pOwotICAgICAgICBwb2xpY3lTZXJ2aWNlID0gbmV3IFBvbGljeVNlcnZpY2VJbXBsKHNlc3Npb24pOwotICAgICAgICBhY2xTZXJ2aWNlID0gbmV3IEFjbFNlcnZpY2VJbXBsKHNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5U2VydmljZSBnZXRSZXBvc2l0b3J5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBOYXZpZ2F0aW9uU2VydmljZSBnZXROYXZpZ2F0aW9uU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hdmlnYXRpb25TZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RTZXJ2aWNlIGdldE9iamVjdFNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBvYmplY3RTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBWZXJzaW9uaW5nU2VydmljZSBnZXRWZXJzaW9uaW5nU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb25pbmdTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWxhdGlvbnNoaXBTZXJ2aWNlIGdldFJlbGF0aW9uc2hpcFNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiByZWxhdGlvbnNoaXBTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBEaXNjb3ZlcnlTZXJ2aWNlIGdldERpc2NvdmVyeVNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBkaXNjb3ZlcnlTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBNdWx0aUZpbGluZ1NlcnZpY2UgZ2V0TXVsdGlGaWxpbmdTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gbXVsdGlGaWxpbmdTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2xTZXJ2aWNlIGdldEFjbFNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBhY2xTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2xpY3lTZXJ2aWNlIGdldFBvbGljeVNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBwb2xpY3lTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyQWxsQ2FjaGVzKCkgewotICAgICAgICBzZXNzaW9uLnJlbW92ZShTcGlTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfVVJMX0NBQ0hFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhclJlcG9zaXRvcnlDYWNoZShTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIFJlcG9zaXRvcnlVcmxDYWNoZSByZXBVcmxDYWNoZSA9IChSZXBvc2l0b3J5VXJsQ2FjaGUpIHNlc3Npb24uZ2V0KFNwaVNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9VUkxfQ0FDSEUpOwotICAgICAgICBpZiAocmVwVXJsQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVwVXJsQ2FjaGUucmVtb3ZlUmVwb3NpdG9yeShyZXBvc2l0b3J5SWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIC8vIG5vLW9wIGZvciBCcm93c2VyIEJpbmRpbmcKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvRGlzY292ZXJ5U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk5ZTgxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlR5cGVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLQotLyoqCi0gKiBEaXNjb3ZlcnkgU2VydmljZSBCcm93c2VyIEJpbmRpbmcgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgRGlzY292ZXJ5U2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJCaW5kaW5nU2VydmljZSBpbXBsZW1lbnRzIERpc2NvdmVyeVNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIERpc2NvdmVyeVNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc3RhdGVtZW50LCBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAvLyBwcmVwYXJlIGZvcm0gZGF0YQotICAgICAgICBmaW5hbCBGb3JtRGF0YVdyaXRlciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YVdyaXRlcihDb25zdGFudHMuQ01JU0FDVElPTl9RVUVSWSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1RBVEVNRU5ULCBzdGF0ZW1lbnQpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NFQVJDSF9BTExfVkVSU0lPTlMsIHNlYXJjaEFsbFZlcnNpb25zKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREFURVRJTUVfRk9STUFULCBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpKTsKLSAgICAgICAgLy8gSW1wb3J0YW50OiBObyBzdWNjaW5jdCBmbGFnIGhlcmUhISEKLQotICAgICAgICAvLyBzZW5kIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdExpc3QoanNvbiwgdHlwZUNhY2hlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VMb2dUb2tlbiwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5TRUxFQ1RPUl9DT05URU5UX0NIQU5HRVMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfTE9HX1RPS0VOLCBjaGFuZ2VMb2dUb2tlbiA9PSBudWxsID8gbnVsbCA6IGNoYW5nZUxvZ1Rva2VuLmdldFZhbHVlKCkpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QUk9QRVJUSUVTLCBpbmNsdWRlUHJvcGVydGllcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUE9MSUNZX0lEUywgaW5jbHVkZVBvbGljeUlkcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FDTCwgaW5jbHVkZUFjbCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZ2V0U3VjY2luY3RQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIGlmIChjaGFuZ2VMb2dUb2tlbiAhPSBudWxsICYmIGpzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHRva2VuID0ganNvbi5nZXQoSlNPTkNvbnN0YW50cy5KU09OX09CSkVDVExJU1RfQ0hBTkdFX0xPR19UT0tFTik7Ci0gICAgICAgICAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VMb2dUb2tlbi5zZXRWYWx1ZSgoU3RyaW5nKSB0b2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLQotICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0TGlzdChqc29uLCB0eXBlQ2FjaGUsIGZhbHNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvRm9ybURhdGFXcml0ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9Gb3JtRGF0YVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDE2NGM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9Gb3JtRGF0YVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTm90RW1wdHk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db2xsZWN0aW9uc0hlbHBlci5pc051bGxPckVtcHR5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEZvcm1EYXRhV3JpdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfVVJMRU5DT0RFRCA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9GT1JNREFUQSA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkxGID0gIlxyXG4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDY0ICogMTAyNDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGJvdW5kYXJ5OwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW07Ci0KLSAgICBwdWJsaWMgRm9ybURhdGFXcml0ZXIoU3RyaW5nIGFjdGlvbikgewotICAgICAgICB0aGlzKGFjdGlvbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZvcm1EYXRhV3JpdGVyKFN0cmluZyBhY3Rpb24sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSkgewotICAgICAgICBhZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNPTlRST0xfQ01JU0FDVElPTiwgYWN0aW9uKTsKLSAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtID0gY29udGVudFN0cmVhbTsKLSAgICAgICAgYm91bmRhcnkgPSAiYVBhY0hlQ2hlTUlTdHJ5b1BFbmNtaVMiICsgTG9uZy50b0hleFN0cmluZyhhY3Rpb24uaGFzaENvZGUoKSkgKyBhY3Rpb24KLSAgICAgICAgICAgICAgICArIExvbmcudG9IZXhTdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpICsgTG9uZy50b0hleFN0cmluZyh0aGlzLmhhc2hDb2RlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQobmFtZSwgVXJsQnVpbGRlci5ub3JtYWxpemVQYXJhbWV0ZXIodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0aWVzUGFyYW1ldGVycyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpZHggPSAwOwotICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wIDogcHJvcGVydGllcy5nZXRQcm9wZXJ0eUxpc3QoKSkgewotICAgICAgICAgICAgaWYgKHByb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgaWR4U3RyID0gIlsiICsgaWR4ICsgIl0iOwotICAgICAgICAgICAgYWRkUGFyYW1ldGVyKENvbnN0YW50cy5DT05UUk9MX1BST1BfSUQgKyBpZHhTdHIsIHByb3AuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KHByb3AuZ2V0VmFsdWVzKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AuZ2V0VmFsdWVzKCkuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKENvbnN0YW50cy5DT05UUk9MX1BST1BfVkFMVUUgKyBpZHhTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFByb3BlcnR5VmFsdWUocHJvcC5nZXRGaXJzdFZhbHVlKCksIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZpZHggPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBwcm9wLmdldFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmlkeFN0ciA9ICJbIiArIHZpZHggKyAiXSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNPTlRST0xfUFJPUF9WQUxVRSArIGlkeFN0ciArIHZpZHhTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQcm9wZXJ0eVZhbHVlKG9iaiwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZHgrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTdWNjaW5jdEZsYWcoYm9vbGVhbiBzdWNjaW5jdCkgewotICAgICAgICBpZiAoc3VjY2luY3QpIHsKLSAgICAgICAgICAgIGFkZFBhcmFtZXRlcihDb25zdGFudHMuQ09OVFJPTF9TVUNDSU5DVCwgInRydWUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBvbGljaWVzUGFyYW1ldGVycyhMaXN0PFN0cmluZz4gcG9saWNpZXMpIHsKLSAgICAgICAgaWYgKHBvbGljaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpZHggPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBwb2xpY3kgOiBwb2xpY2llcykgewotICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkeFN0ciA9ICJbIiArIGlkeCArICJdIjsKLSAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNPTlRST0xfUE9MSUNZICsgaWR4U3RyLCBwb2xpY3kpOwotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQWRkQWNlc1BhcmFtZXRlcnMoQWNsIGFjbCkgewotICAgICAgICBhZGRBY2VzUGFyYW1ldGVycyhhY2wsIENvbnN0YW50cy5DT05UUk9MX0FERF9BQ0VfUFJJTkNJUEFMLCBDb25zdGFudHMuQ09OVFJPTF9BRERfQUNFX1BFUk1JU1NJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbW92ZUFjZXNQYXJhbWV0ZXJzKEFjbCBhY2wpIHsKLSAgICAgICAgYWRkQWNlc1BhcmFtZXRlcnMoYWNsLCBDb25zdGFudHMuQ09OVFJPTF9SRU1PVkVfQUNFX1BSSU5DSVBBTCwgQ29uc3RhbnRzLkNPTlRST0xfUkVNT1ZFX0FDRV9QRVJNSVNTSU9OKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQWNlc1BhcmFtZXRlcnMoQWNsIGFjbCwgU3RyaW5nIHByaW5jaXBhbENvbnRyb2wsIFN0cmluZyBwZXJtaXNzaW9uQ29udHJvbCkgewotICAgICAgICBpZiAoYWNsID09IG51bGwgfHwgYWNsLmdldEFjZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaWR4ID0gMDsKLSAgICAgICAgZm9yIChBY2UgYWNlIDogYWNsLmdldEFjZXMoKSkgewotICAgICAgICAgICAgaWYgKGFjZS5nZXRQcmluY2lwYWxJZCgpICE9IG51bGwgJiYgaXNOb3RFbXB0eShhY2UuZ2V0UGVybWlzc2lvbnMoKSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWR4U3RyID0gIlsiICsgaWR4ICsgIl0iOwotICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcihwcmluY2lwYWxDb250cm9sICsgaWR4U3RyLCBhY2UuZ2V0UHJpbmNpcGFsSWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcGVybUlkeCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGVybSA6IGFjZS5nZXRQZXJtaXNzaW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwZXJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwZXJtSWR4U3RyID0gIlsiICsgcGVybUlkeCArICJdIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcihwZXJtaXNzaW9uQ29udHJvbCArIGlkeFN0ciArIHBlcm1JZHhTdHIsIHBlcm0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcGVybUlkeCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlkeCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkT2JqZWN0SWRzQW5kQ2hhbmdlVG9rZW5zKExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkc0FuZENoYW5nZVRva2VucykgewotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShvYmplY3RJZHNBbmRDaGFuZ2VUb2tlbnMpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaWR4ID0gMDsKLSAgICAgICAgZm9yIChCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiBvYyA6IG9iamVjdElkc0FuZENoYW5nZVRva2VucykgewotICAgICAgICAgICAgaWYgKG9jID09IG51bGwgfHwgb2MuZ2V0SWQoKSA9PSBudWxsIHx8IG9jLmdldElkKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgaWR4U3RyID0gIlsiICsgaWR4ICsgIl0iOwotICAgICAgICAgICAgYWRkUGFyYW1ldGVyKENvbnN0YW50cy5DT05UUk9MX09CSkVDVF9JRCArIGlkeFN0ciwgb2MuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNPTlRST0xfQ0hBTkdFX1RPS0VOICsgaWR4U3RyLAotICAgICAgICAgICAgICAgICAgICAob2MuZ2V0Q2hhbmdlVG9rZW4oKSA9PSBudWxsID8gIiIgOiBvYy5nZXRDaGFuZ2VUb2tlbigpKSk7Ci0KLSAgICAgICAgICAgIGlkeCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkU2Vjb25kYXJ5VHlwZUlkcyhMaXN0PFN0cmluZz4gc2Vjb25kYXJ5VHlwZUlkcykgewotICAgICAgICBhZGRTZWNvbmRhcnlUeXBlSWRQYXJhbWV0ZXJzKHNlY29uZGFyeVR5cGVJZHMsIENvbnN0YW50cy5DT05UUk9MX0FERF9TRUNPTkRBUllfVFlQRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcyhMaXN0PFN0cmluZz4gc2Vjb25kYXJ5VHlwZUlkcykgewotICAgICAgICBhZGRTZWNvbmRhcnlUeXBlSWRQYXJhbWV0ZXJzKHNlY29uZGFyeVR5cGVJZHMsIENvbnN0YW50cy5DT05UUk9MX1JFTU9WRV9TRUNPTkRBUllfVFlQRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNlY29uZGFyeVR5cGVJZFBhcmFtZXRlcnMoTGlzdDxTdHJpbmc+IHNlY29uZGFyeVR5cGVJZHMsIFN0cmluZyBzZWNvbmRhcnlUeXBlSWRDb250cm9sKSB7Ci0gICAgICAgIGlmIChpc051bGxPckVtcHR5KHNlY29uZGFyeVR5cGVJZHMpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaWR4ID0gMDsKLSAgICAgICAgZm9yIChTdHJpbmcgdHlwZUlkIDogc2Vjb25kYXJ5VHlwZUlkcykgewotICAgICAgICAgICAgaWYgKHR5cGVJZCA9PSBudWxsIHx8IHR5cGVJZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBpZHhTdHIgPSAiWyIgKyBpZHggKyAiXSI7Ci0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIoc2Vjb25kYXJ5VHlwZUlkQ29udHJvbCArIGlkeFN0ciwgdHlwZUlkKTsKLQotICAgICAgICAgICAgaWR4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0UHJvcGVydHlWYWx1ZShPYmplY3QgdmFsdWUsIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0KSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEdyZWdvcmlhbkNhbGVuZGFyKSB7Ci0gICAgICAgICAgICBpZiAoZGF0ZVRpbWVGb3JtYXQgPT0gRGF0ZVRpbWVGb3JtYXQuRVhURU5ERUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZVRpbWVIZWxwZXIuZm9ybWF0WG1sRGF0ZVRpbWUoKEdyZWdvcmlhbkNhbGVuZGFyKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigoKEdyZWdvcmlhbkNhbGVuZGFyKSB2YWx1ZSkuZ2V0VGltZUluTWlsbGlzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChjb250ZW50U3RyZWFtID09IG51bGwgPyBDT05URU5UX1RZUEVfVVJMRU5DT0RFRCA6IENPTlRFTlRfVFlQRV9GT1JNREFUQSArIGJvdW5kYXJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSAoY29udGVudFN0cmVhbSA9PSBudWxsID8gbnVsbCA6IGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpOwotCi0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBieXRlW10gYW1wID0gSU9VdGlscy50b1VURjhCeXRlcygiJiIpOwotCi0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcGFyYW0gOiBwYXJhbWV0ZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYW1wKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoSU9VdGlscy50b1VURjhCeXRlcyhwYXJhbS5nZXRLZXkoKSArICI9IiArIFVSTEVuY29kZXIuZW5jb2RlKHBhcmFtLmdldFZhbHVlKCksIElPVXRpbHMuVVRGOCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlTGluZShvdXQpOwotCi0gICAgICAgICAgICAvLyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcGFyYW0gOiBwYXJhbWV0ZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZUxpbmUob3V0LCAiLS0iICsgYm91bmRhcnkpOwotICAgICAgICAgICAgICAgIHdyaXRlTGluZShvdXQsICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiICsgcGFyYW0uZ2V0S2V5KCkgKyAiXCIiKTsKLSAgICAgICAgICAgICAgICB3cml0ZUxpbmUob3V0LCAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Iik7Ci0gICAgICAgICAgICAgICAgd3JpdGVMaW5lKG91dCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVMaW5lKG91dCwgcGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbnRlbnQKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PSBudWxsIHx8IGZpbGVuYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICJjb250ZW50IjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG1lZGlhVHlwZSA9IGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gbnVsbCB8fCBtZWRpYVR5cGUuaW5kZXhPZignLycpIDwgMSB8fCBtZWRpYVR5cGUuaW5kZXhPZignXG4nKSA+IC0xCi0gICAgICAgICAgICAgICAgICAgIHx8IG1lZGlhVHlwZS5pbmRleE9mKCdccicpID4gLTEpIHsKLSAgICAgICAgICAgICAgICBtZWRpYVR5cGUgPSBDb25zdGFudHMuTUVESUFUWVBFX09DVEVUU1RSRUFNOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZUxpbmUob3V0LCAiLS0iICsgYm91bmRhcnkpOwotICAgICAgICAgICAgd3JpdGVMaW5lKAotICAgICAgICAgICAgICAgICAgICBvdXQsCi0gICAgICAgICAgICAgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNaW1lSGVscGVyLmVuY29kZUNvbnRlbnREaXNwb3NpdGlvbihNaW1lSGVscGVyLkRJU1BPU0lUSU9OX0ZPUk1fREFUQV9DT05URU5ULCBmaWxlbmFtZSkpOwotICAgICAgICAgICAgd3JpdGVMaW5lKG91dCwgIkNvbnRlbnQtVHlwZTogIiArIG1lZGlhVHlwZSk7Ci0gICAgICAgICAgICB3cml0ZUxpbmUob3V0LCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5Iik7Ci0gICAgICAgICAgICB3cml0ZUxpbmUob3V0KTsKLQotICAgICAgICAgICAgSU9VdGlscy5jb3B5KHN0cmVhbSwgb3V0LCBCVUZGRVJfU0laRSk7Ci0KLSAgICAgICAgICAgIHdyaXRlTGluZShvdXQpOwotICAgICAgICAgICAgd3JpdGVMaW5lKG91dCwgIi0tIiArIGJvdW5kYXJ5ICsgIi0tIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVMaW5lKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlTGluZShvdXQsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZUxpbmUoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHMgPSAocyA9PSBudWxsID8gQ1JMRiA6IHMgKyBDUkxGKTsKLSAgICAgICAgb3V0LndyaXRlKElPVXRpbHMudG9VVEY4Qnl0ZXMocykpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWE5MTc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5icm93c2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLk91dHB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci0KLS8qKgotICogTXVsdGlGaWxpbmcgU2VydmljZSBCcm93c2VyIEJpbmRpbmcgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QnJvd3NlckJpbmRpbmdTZXJ2aWNlIGltcGxlbWVudHMgTXVsdGlGaWxpbmdTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aUZpbGluZ1NlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPYmplY3RUb0ZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fQUREX09CSkVDVF9UT19GT0xERVIpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZPTERFUl9JRCwgZm9sZGVySWQpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTF9WRVJTSU9OUywgYWxsVmVyc2lvbnMpOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIHBvc3RBbmRDb25zdW1lKHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsKLQotICAgICAgICAvLyBwcmVwYXJlIGZvcm0gZGF0YQotICAgICAgICBmaW5hbCBGb3JtRGF0YVdyaXRlciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YVdyaXRlcihDb25zdGFudHMuQ01JU0FDVElPTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GT0xERVJfSUQsIGZvbGRlcklkKTsKLQotICAgICAgICAvLyBzZW5kIGFuZCBwYXJzZQotICAgICAgICBwb3N0QW5kQ29uc3VtZSh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9OYXZpZ2F0aW9uU2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9OYXZpZ2F0aW9uU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliZTJhOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvTmF2aWdhdGlvblNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5UeXBlQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci0KLS8qKgotICogTmF2aWdhdGlvbiBTZXJ2aWNlIEJyb3dzZXIgQmluZGluZyBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJCaW5kaW5nU2VydmljZSBpbXBsZW1lbnRzIE5hdmlnYXRpb25TZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBOYXZpZ2F0aW9uU2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckxpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5TRUxFQ1RPUl9DSElMRFJFTik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fT1JERVJfQlksIG9yZGVyQnkpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BBVEhfU0VHTUVOVCwgaW5jbHVkZVBhdGhTZWdtZW50KTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBnZXRTdWNjaW5jdFBhcmFtZXRlcigpKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREFURVRJTUVfRk9STUFULCBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdEluRm9sZGVyTGlzdChqc29uLCB0eXBlQ2FjaGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXREZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5TRUxFQ1RPUl9ERVNDRU5EQU5UUyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQsIGluY2x1ZGVQYXRoU2VnbWVudCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBnZXRTdWNjaW5jdFBhcmFtZXRlcigpKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREFURVRJTUVfRk9STUFULCBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBMaXN0PE9iamVjdD4ganNvbiA9IHBhcnNlQXJyYXkocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnREZXNjZW5kYW50cyhqc29uLCB0eXBlQ2FjaGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXRGb2xkZXJUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX0ZPTERFUl9UUkVFKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREVQVEgsIGRlcHRoKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BBVEhfU0VHTUVOVCwgaW5jbHVkZVBhdGhTZWdtZW50KTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1VDQ0lOQ1QsIGdldFN1Y2NpbmN0UGFyYW1ldGVyKCkpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9EQVRFVElNRV9GT1JNQVQsIGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKCkpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiBqc29uID0gcGFyc2VBcnJheShyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydERlc2NlbmRhbnRzKGpzb24sIHR5cGVDYWNoZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gZ2V0T2JqZWN0UGFyZW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX1BBUkVOVFMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJVkVfUEFUSF9TRUdNRU5ULCBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBnZXRTdWNjaW5jdFBhcmFtZXRlcigpKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREFURVRJTUVfRk9STUFULCBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBMaXN0PE9iamVjdD4ganNvbiA9IHBhcnNlQXJyYXkocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3RQYXJlbnRzKGpzb24sIHR5cGVDYWNoZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBDb25zdGFudHMuU0VMRUNUT1JfUEFSRU5UKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZ2V0U3VjY2luY3RQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3QoanNvbiwgdHlwZUNhY2hlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDaGVja2VkT3V0RG9jcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IChmb2xkZXJJZCAhPSBudWxsID8gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIENvbnN0YW50cy5TRUxFQ1RPUl9DSEVDS0VET1VUKQotICAgICAgICAgICAgICAgIDogZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5TRUxFQ1RPUl9DSEVDS0VET1VUKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fT1JERVJfQlksIG9yZGVyQnkpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCBza2lwQ291bnQpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZ2V0U3VjY2luY3RQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3RMaXN0KGpzb24sIHR5cGVDYWNoZSwgZmFsc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9PYmplY3RTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9icm93c2VyL09iamVjdFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDg4ODAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9icm93c2VyL09iamVjdFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYnJvd3NlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5GYWlsZWRUb0RlbGV0ZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSlNPTkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVHlwZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRmFpbGVkVG9EZWxldGVEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGFydGlhbENvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5PYmplY3RTZXJ2aWNlOwotCi0vKioKLSAqIE9iamVjdCBTZXJ2aWNlIEJyb3dzZXIgQmluZGluZyBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QnJvd3NlckJpbmRpbmdTZXJ2aWNlIGltcGxlbWVudHMgT2JqZWN0U2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0U2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IChmb2xkZXJJZCAhPSBudWxsID8gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpIDogZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQpKTsKLQotICAgICAgICAvLyBwcmVwYXJlIGZvcm0gZGF0YQotICAgICAgICBmaW5hbCBGb3JtRGF0YVdyaXRlciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YVdyaXRlcihDb25zdGFudHMuQ01JU0FDVElPTl9DUkVBVEVfRE9DVU1FTlQsIGNvbnRlbnRTdHJlYW0pOwotICAgICAgICBmb3JtRGF0YS5hZGRQcm9wZXJ0aWVzUGFyYW1ldGVycyhwcm9wZXJ0aWVzLCBnZXREYXRlVGltZUZvcm1hdCgpKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9WRVJTSU9OSUdfU1RBVEUsIHZlcnNpb25pbmdTdGF0ZSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBvbGljaWVzUGFyYW1ldGVycyhwb2xpY2llcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZEFkZEFjZXNQYXJhbWV0ZXJzKGFkZEFjZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRSZW1vdmVBY2VzUGFyYW1ldGVycyhyZW1vdmVBY2VzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkU3VjY2luY3RGbGFnKGdldFN1Y2NpbmN0KCkpOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIE9iamVjdERhdGEgbmV3T2JqID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KGpzb24sIHR5cGVDYWNoZSk7Ci0KLSAgICAgICAgcmV0dXJuIChuZXdPYmogPT0gbnVsbCA/IG51bGwgOiBuZXdPYmouZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHNvdXJjZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IChmb2xkZXJJZCAhPSBudWxsID8gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpIDogZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQpKTsKLQotICAgICAgICAvLyBwcmVwYXJlIGZvcm0gZGF0YQotICAgICAgICBmaW5hbCBGb3JtRGF0YVdyaXRlciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YVdyaXRlcihDb25zdGFudHMuQ01JU0FDVElPTl9DUkVBVEVfRE9DVU1FTlRfRlJPTV9TT1VSQ0UpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NPVVJDRV9JRCwgc291cmNlSWQpOwotICAgICAgICBmb3JtRGF0YS5hZGRQcm9wZXJ0aWVzUGFyYW1ldGVycyhwcm9wZXJ0aWVzLCBnZXREYXRlVGltZUZvcm1hdCgpKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9WRVJTSU9OSUdfU1RBVEUsIHZlcnNpb25pbmdTdGF0ZSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBvbGljaWVzUGFyYW1ldGVycyhwb2xpY2llcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZEFkZEFjZXNQYXJhbWV0ZXJzKGFkZEFjZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRSZW1vdmVBY2VzUGFyYW1ldGVycyhyZW1vdmVBY2VzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkU3VjY2luY3RGbGFnKGdldFN1Y2NpbmN0KCkpOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIE9iamVjdERhdGEgbmV3T2JqID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KGpzb24sIHR5cGVDYWNoZSk7Ci0KLSAgICAgICAgcmV0dXJuIChuZXdPYmogPT0gbnVsbCA/IG51bGwgOiBuZXdPYmouZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVGb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIGZvbGRlcklkKTsKLQotICAgICAgICAvLyBwcmVwYXJlIGZvcm0gZGF0YQotICAgICAgICBmaW5hbCBGb3JtRGF0YVdyaXRlciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YVdyaXRlcihDb25zdGFudHMuQ01JU0FDVElPTl9DUkVBVEVfRk9MREVSKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUHJvcGVydGllc1BhcmFtZXRlcnMocHJvcGVydGllcywgZ2V0RGF0ZVRpbWVGb3JtYXQoKSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBvbGljaWVzUGFyYW1ldGVycyhwb2xpY2llcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZEFkZEFjZXNQYXJhbWV0ZXJzKGFkZEFjZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRSZW1vdmVBY2VzUGFyYW1ldGVycyhyZW1vdmVBY2VzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkU3VjY2luY3RGbGFnKGdldFN1Y2NpbmN0KCkpOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIE9iamVjdERhdGEgbmV3T2JqID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KGpzb24sIHR5cGVDYWNoZSk7Ci0KLSAgICAgICAgcmV0dXJuIChuZXdPYmogPT0gbnVsbCA/IG51bGwgOiBuZXdPYmouZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRSZXBvc2l0b3J5VXJsKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fQ1JFQVRFX1JFTEFUSU9OU0hJUCk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFByb3BlcnRpZXNQYXJhbWV0ZXJzKHByb3BlcnRpZXMsIGdldERhdGVUaW1lRm9ybWF0KCkpOwotICAgICAgICBmb3JtRGF0YS5hZGRQb2xpY2llc1BhcmFtZXRlcnMocG9saWNpZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRBZGRBY2VzUGFyYW1ldGVycyhhZGRBY2VzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUmVtb3ZlQWNlc1BhcmFtZXRlcnMocmVtb3ZlQWNlcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFN1Y2NpbmN0RmxhZyhnZXRTdWNjaW5jdCgpKTsKLQotICAgICAgICAvLyBzZW5kIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLQotICAgICAgICBPYmplY3REYXRhIG5ld09iaiA9IEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdChqc29uLCB0eXBlQ2FjaGUpOwotCi0gICAgICAgIHJldHVybiAobmV3T2JqID09IG51bGwgPyBudWxsIDogbmV3T2JqLmdldElkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSAoZm9sZGVySWQgIT0gbnVsbCA/IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIGZvbGRlcklkKSA6IGdldFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeUlkKSk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fQ1JFQVRFX1BPTElDWSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFByb3BlcnRpZXNQYXJhbWV0ZXJzKHByb3BlcnRpZXMsIGdldERhdGVUaW1lRm9ybWF0KCkpOwotICAgICAgICBmb3JtRGF0YS5hZGRQb2xpY2llc1BhcmFtZXRlcnMocG9saWNpZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRBZGRBY2VzUGFyYW1ldGVycyhhZGRBY2VzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUmVtb3ZlQWNlc1BhcmFtZXRlcnMocmVtb3ZlQWNlcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFN1Y2NpbmN0RmxhZyhnZXRTdWNjaW5jdCgpKTsKLQotICAgICAgICAvLyBzZW5kIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLQotICAgICAgICBPYmplY3REYXRhIG5ld09iaiA9IEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdChqc29uLCB0eXBlQ2FjaGUpOwotCi0gICAgICAgIHJldHVybiAobmV3T2JqID09IG51bGwgPyBudWxsIDogbmV3T2JqLmdldElkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSXRlbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gKGZvbGRlcklkICE9IG51bGwgPyBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCkgOiBnZXRSZXBvc2l0b3J5VXJsKHJlcG9zaXRvcnlJZCkpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX0NSRUFURV9JVEVNKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUHJvcGVydGllc1BhcmFtZXRlcnMocHJvcGVydGllcywgZ2V0RGF0ZVRpbWVGb3JtYXQoKSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBvbGljaWVzUGFyYW1ldGVycyhwb2xpY2llcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZEFkZEFjZXNQYXJhbWV0ZXJzKGFkZEFjZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRSZW1vdmVBY2VzUGFyYW1ldGVycyhyZW1vdmVBY2VzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkU3VjY2luY3RGbGFnKGdldFN1Y2NpbmN0KCkpOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIE9iamVjdERhdGEgbmV3T2JqID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KGpzb24sIHR5cGVDYWNoZSk7Ci0KLSAgICAgICAgcmV0dXJuIChuZXdPYmogPT0gbnVsbCA/IG51bGwgOiBuZXdPYmouZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG93YWJsZUFjdGlvbnMgZ2V0QWxsb3dhYmxlQWN0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX0FMTE9XQUJMRUFDVElPTlMpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0QWxsb3dhYmxlQWN0aW9ucyhqc29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuU0VMRUNUT1JfT0JKRUNUKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMsIGluY2x1ZGVQb2xpY3lJZHMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BQ0wsIGluY2x1ZGVBY2wpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZ2V0U3VjY2luY3RQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3QoanNvbiwgdHlwZUNhY2hlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0UGF0aFVybChyZXBvc2l0b3J5SWQsIHBhdGgsIENvbnN0YW50cy5TRUxFQ1RPUl9PQkpFQ1QpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUE9MSUNZX0lEUywgaW5jbHVkZVBvbGljeUlkcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FDTCwgaW5jbHVkZUFjbCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBnZXRTdWNjaW5jdFBhcmFtZXRlcigpKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREFURVRJTUVfRk9STUFULCBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdChqc29uLCB0eXBlQ2FjaGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5TRUxFQ1RPUl9QUk9QRVJUSUVTKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZ2V0U3VjY2luY3RQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIGlmIChnZXRTdWNjaW5jdCgpKSB7Ci0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLSAgICAgICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRTdWNjaW5jdFByb3BlcnRpZXMoanNvbiwgbnVsbCwgdHlwZUNhY2hlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRQcm9wZXJ0aWVzKGpzb24sIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuU0VMRUNUT1JfUkVORElUSU9OUyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCBza2lwQ291bnQpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiBqc29uID0gcGFyc2VBcnJheShyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydFJlbmRpdGlvbnMoanNvbik7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwgQmlnSW50ZWdlciBvZmZzZXQsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIGxlbmd0aCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIENvbnN0YW50cy5TRUxFQ1RPUl9DT05URU5UKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1RSRUFNX0lELCBzdHJlYW1JZCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjb250ZW50Ci0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBnZXRIdHRwSW52b2tlcigpLmludm9rZUdFVCh1cmwsIGdldFNlc3Npb24oKSwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgICAgIC8vIGNoZWNrIHJlc3BvbnNlIGNvZGUKLSAgICAgICAgaWYgKChyZXNwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMCkgJiYgKHJlc3AuZ2V0UmVzcG9uc2VDb2RlKCkgIT0gMjA2KSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydFN0YXR1c0NvZGUocmVzcC5nZXRSZXNwb25zZUNvZGUoKSwgcmVzcC5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgcmVzcC5nZXRFcnJvckNvbnRlbnQoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgZmlsZW5hbWUgZnJvbSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlcgotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uID0gcmVzcC5nZXRDb250ZW50RGlzcG9zaXRpb24oKTsKLSAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IE1pbWVIZWxwZXIuZGVjb2RlQ29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUoY29udGVudERpc3Bvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIHJlc3VsdCBvYmplY3QKLSAgICAgICAgQ29udGVudFN0cmVhbUltcGwgcmVzdWx0OwotICAgICAgICBpZiAocmVzcC5nZXRSZXNwb25zZUNvZGUoKSA9PSAyMDYpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQYXJ0aWFsQ29udGVudFN0cmVhbUltcGwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb250ZW50U3RyZWFtSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldEZpbGVOYW1lKGZpbGVuYW1lKTsKLSAgICAgICAgcmVzdWx0LnNldExlbmd0aChyZXNwLmdldENvbnRlbnRMZW5ndGgoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRNaW1lVHlwZShyZXNwLmdldENvbnRlbnRUeXBlSGVhZGVyKCkpOwotICAgICAgICByZXN1bHQuc2V0U3RyZWFtKHJlc3AuZ2V0U3RyZWFtKCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyB3ZSBuZWVkIGFuIG9iamVjdCBJRAotICAgICAgICBpZiAoKG9iamVjdElkID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fVVBEQVRFX1BST1BFUlRJRVMpOwotICAgICAgICBmb3JtRGF0YS5hZGRQcm9wZXJ0aWVzUGFyYW1ldGVycyhwcm9wZXJ0aWVzLCBnZXREYXRlVGltZUZvcm1hdCgpKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfVE9LRU4sCi0gICAgICAgICAgICAgICAgKGNoYW5nZVRva2VuID09IG51bGwgfHwgZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLk9NSVRfQ0hBTkdFX1RPS0VOUywgZmFsc2UpID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgOiBjaGFuZ2VUb2tlbi5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFN1Y2NpbmN0RmxhZyhnZXRTdWNjaW5jdCgpKTsKLQotICAgICAgICAvLyBzZW5kIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLQotICAgICAgICBPYmplY3REYXRhIG5ld09iaiA9IEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdChqc29uLCB0eXBlQ2FjaGUpOwotCi0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKG5ld09iaiA9PSBudWxsID8gbnVsbCA6IG5ld09iai5nZXRJZCgpKTsKLQotICAgICAgICBzZXRDaGFuZ2VUb2tlbihjaGFuZ2VUb2tlbiwgbmV3T2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlSWRzLCBMaXN0PFN0cmluZz4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIHdlIG5lZWQgb2JqZWN0IGlkcwotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShvYmplY3RJZEFuZENoYW5nZVRva2VuKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBpZHMgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRSZXBvc2l0b3J5VXJsKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fQlVMS19VUERBVEUpOwotICAgICAgICBmb3JtRGF0YS5hZGRPYmplY3RJZHNBbmRDaGFuZ2VUb2tlbnMob2JqZWN0SWRBbmRDaGFuZ2VUb2tlbik7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFByb3BlcnRpZXNQYXJhbWV0ZXJzKHByb3BlcnRpZXMsIGdldERhdGVUaW1lRm9ybWF0KCkpOwotICAgICAgICBmb3JtRGF0YS5hZGRTZWNvbmRhcnlUeXBlSWRzKGFkZFNlY29uZGFyeVR5cGVJZHMpOwotICAgICAgICBmb3JtRGF0YS5yZW1vdmVTZWNvbmRhcnlUeXBlSWRzKHJlbW92ZVNlY29uZGFyeVR5cGVJZHMpOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTGlzdDxPYmplY3Q+IGpzb24gPSBwYXJzZUFycmF5KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0QnVsa1VwZGF0ZShqc29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBTdHJpbmcgdGFyZ2V0Rm9sZGVySWQsIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyB3ZSBuZWVkIGFuIG9iamVjdCBpZAotICAgICAgICBpZiAoKG9iamVjdElkID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fTU9WRSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVEFSR0VUX0ZPTERFUl9JRCwgdGFyZ2V0Rm9sZGVySWQpOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NPVVJDRV9GT0xERVJfSUQsIHNvdXJjZUZvbGRlcklkKTsKLSAgICAgICAgZm9ybURhdGEuYWRkU3VjY2luY3RGbGFnKGdldFN1Y2NpbmN0KCkpOwotCi0gICAgICAgIC8vIHNlbmQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIE9iamVjdERhdGEgbmV3T2JqID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KGpzb24sIHR5cGVDYWNoZSk7Ci0KLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUobmV3T2JqID09IG51bGwgPyBudWxsIDogbmV3T2JqLmdldElkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fREVMRVRFKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExfVkVSU0lPTlMsIGFsbFZlcnNpb25zKTsKLQotICAgICAgICAvLyBzZW5kCi0gICAgICAgIHBvc3RBbmRDb25zdW1lKHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIEZhaWxlZFRvRGVsZXRlRGF0YSBkZWxldGVUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIFVuZmlsZU9iamVjdCB1bmZpbGVPYmplY3RzLCBCb29sZWFuIGNvbnRpbnVlT25GYWlsdXJlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX0RFTEVURV9UUkVFKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExfVkVSU0lPTlMsIGFsbFZlcnNpb25zKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9VTkZJTEVfT0JKRUNUUywgdW5maWxlT2JqZWN0cyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQ09OVElOVUVfT05fRkFJTFVSRSwgY29udGludWVPbkZhaWx1cmUpOwotCi0gICAgICAgIC8vIHNlbmQKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QodXJsLCBmb3JtRGF0YS5nZXRDb250ZW50VHlwZSgpLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAocmVzcC5oYXNSZXNwb25zZVN0cmVhbSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHJlc3BvbnNlU3RyZWFtID0gSU9VdGlscy5jaGVja0ZvckJ5dGVzKHJlc3AuZ2V0U3RyZWFtKCksIDgxOTIpOwotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3BvbnNlU3RyZWFtLCByZXNwLmdldENoYXJzZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRGYWlsZWRUb0RlbGV0ZShqc29uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJDYW5ub3QgcmVhZCByZXNwb25zZSEiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyB3ZSBuZWVkIGFuIG9iamVjdCBpZAotICAgICAgICBpZiAoKG9iamVjdElkID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRWYWx1ZSgpLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fU0VUX0NPTlRFTlQsIGNvbnRlbnRTdHJlYW0pOwotICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09WRVJXUklURV9GTEFHLCBvdmVyd3JpdGVGbGFnKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfVE9LRU4sCi0gICAgICAgICAgICAgICAgKGNoYW5nZVRva2VuID09IG51bGwgfHwgZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLk9NSVRfQ0hBTkdFX1RPS0VOUywgZmFsc2UpID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgOiBjaGFuZ2VUb2tlbi5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFN1Y2NpbmN0RmxhZyhnZXRTdWNjaW5jdCgpKTsKLQotICAgICAgICAvLyBzZW5kIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLQotICAgICAgICBPYmplY3REYXRhIG5ld09iaiA9IEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdChqc29uLCB0eXBlQ2FjaGUpOwotCi0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKG5ld09iaiA9PSBudWxsID8gbnVsbCA6IG5ld09iai5nZXRJZCgpKTsKLQotICAgICAgICBzZXRDaGFuZ2VUb2tlbihjaGFuZ2VUb2tlbiwgbmV3T2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgYm9vbGVhbiBpc0xhc3RDaHVuaywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIHdlIG5lZWQgYW4gb2JqZWN0IGlkCi0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZC5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAvLyBwcmVwYXJlIGZvcm0gZGF0YQotICAgICAgICBmaW5hbCBGb3JtRGF0YVdyaXRlciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YVdyaXRlcihDb25zdGFudHMuQ01JU0FDVElPTl9BUFBFTkRfQ09OVEVOVCwgY29udGVudFN0cmVhbSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBhcmFtZXRlcihDb25zdGFudHMuQ09OVFJPTF9JU19MQVNUX0NIVU5LLCBpc0xhc3RDaHVuayk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQ0hBTkdFX1RPS0VOLAotICAgICAgICAgICAgICAgIChjaGFuZ2VUb2tlbiA9PSBudWxsIHx8IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5PTUlUX0NIQU5HRV9UT0tFTlMsIGZhbHNlKSA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIDogY2hhbmdlVG9rZW4uZ2V0VmFsdWUoKSkpOwotICAgICAgICBmb3JtRGF0YS5hZGRTdWNjaW5jdEZsYWcoZ2V0U3VjY2luY3QoKSk7Ci0KLSAgICAgICAgLy8gc2VuZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QodXJsLCBmb3JtRGF0YS5nZXRDb250ZW50VHlwZSgpLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSBuZXdPYmogPSBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3QoanNvbiwgdHlwZUNhY2hlKTsKLQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShuZXdPYmogPT0gbnVsbCA/IG51bGwgOiBuZXdPYmouZ2V0SWQoKSk7Ci0KLSAgICAgICAgc2V0Q2hhbmdlVG9rZW4oY2hhbmdlVG9rZW4sIG5ld09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gd2UgbmVlZCBhbiBvYmplY3QgaWQKLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCkpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX0RFTEVURV9DT05URU5UKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfVE9LRU4sCi0gICAgICAgICAgICAgICAgKGNoYW5nZVRva2VuID09IG51bGwgfHwgZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLk9NSVRfQ0hBTkdFX1RPS0VOUywgZmFsc2UpID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgOiBjaGFuZ2VUb2tlbi5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFN1Y2NpbmN0RmxhZyhnZXRTdWNjaW5jdCgpKTsKLQotICAgICAgICAvLyBzZW5kIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLQotICAgICAgICBPYmplY3REYXRhIG5ld09iaiA9IEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdChqc29uLCB0eXBlQ2FjaGUpOwotCi0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKG5ld09iaiA9PSBudWxsID8gbnVsbCA6IG5ld09iai5nZXRJZCgpKTsKLQotICAgICAgICBzZXRDaGFuZ2VUb2tlbihjaGFuZ2VUb2tlbiwgbmV3T2JqKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvUG9saWN5U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9Qb2xpY3lTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGEyNzhkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9Qb2xpY3lTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSlNPTkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVHlwZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlBvbGljeVNlcnZpY2U7Ci0KLS8qKgotICogUG9saWN5IFNlcnZpY2UgQnJvd3NlciBCaW5kaW5nIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFBvbGljeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyQmluZGluZ1NlcnZpY2UgaW1wbGVtZW50cyBQb2xpY3lTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBQb2xpY3lTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fQVBQTFlfUE9MSUNZKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUG9saWNpZXNQYXJhbWV0ZXJzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocG9saWN5SWQpKTsKLQotICAgICAgICAvLyBzZW5kCi0gICAgICAgIHBvc3RBbmRDb25zdW1lKHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX1JFTU9WRV9QT0xJQ1kpOwotICAgICAgICBmb3JtRGF0YS5hZGRQb2xpY2llc1BhcmFtZXRlcnMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwb2xpY3lJZCkpOwotCi0gICAgICAgIC8vIHNlbmQKLSAgICAgICAgcG9zdEFuZENvbnN1bWUodXJsLCBmb3JtRGF0YS5nZXRDb250ZW50VHlwZSgpLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBcHBsaWVkUG9saWNpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuU0VMRUNUT1JfUE9MSUNJRVMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBnZXRTdWNjaW5jdFBhcmFtZXRlcigpKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREFURVRJTUVfRk9STUFULCBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBMaXN0PE9iamVjdD4ganNvbiA9IHBhcnNlQXJyYXkocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3RzKGpzb24sIHR5cGVDYWNoZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9icm93c2VyL1JlbGF0aW9uc2hpcFNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvUmVsYXRpb25zaGlwU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2MjA2ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvUmVsYXRpb25zaGlwU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlR5cGVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZWxhdGlvbnNoaXBTZXJ2aWNlOwotCi0vKioKLSAqIFJlbGF0aW9uc2hpcCBTZXJ2aWNlIEJyb3dzZXIgQmluZGluZyBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QnJvd3NlckJpbmRpbmdTZXJ2aWNlIGltcGxlbWVudHMgUmVsYXRpb25zaGlwU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRpb25zaGlwU2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldE9iamVjdFJlbGF0aW9uc2hpcHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcywKLSAgICAgICAgICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbiByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIFN0cmluZyB0eXBlSWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBDb25zdGFudHMuU0VMRUNUT1JfUkVMQVRJT05TSElQUyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NVQl9SRUxBVElPTlNISVBfVFlQRVMsIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUF9ESVJFQ1RJT04sIHJlbGF0aW9uc2hpcERpcmVjdGlvbik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBnZXRTdWNjaW5jdFBhcmFtZXRlcigpKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fREFURVRJTUVfRk9STUFULCBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcigpKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBwYXJzZQotICAgICAgICBSZXNwb25zZSByZXNwID0gcmVhZCh1cmwpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydE9iamVjdExpc3QoanNvbiwgdHlwZUNhY2hlLCBmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9icm93c2VyL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9icm93c2VyL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRmMzlmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9SZXBvc2l0b3J5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5icm93c2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuT3V0cHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBTZXJ2aWNlIEJyb3dzZXIgQmluZGluZyBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJCaW5kaW5nU2VydmljZSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5U2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlcG9zaXRvcnlJbmZvPiBnZXRSZXBvc2l0b3J5SW5mb3MoRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3JpZXNJbnRlcm5hbChudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHJlcG9zaXRvcnlJbmZvcyA9IGdldFJlcG9zaXRvcmllc0ludGVybmFsKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmZvcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlJlcG9zaXRvcnkgJyIgKyByZXBvc2l0b3J5SWQgKyAiJ25vdCBmb3VuZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5SW5mb3Muc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5SW5mb3MuZ2V0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgcmVwb3NpdG9yeQotICAgICAgICBmb3IgKFJlcG9zaXRvcnlJbmZvIGluZm8gOiByZXBvc2l0b3J5SW5mb3MpIHsKLSAgICAgICAgICAgIGlmIChpbmZvLmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaW5mby5nZXRJZCgpLmVxdWFscyhyZXBvc2l0b3J5SWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJSZXBvc2l0b3J5ICciICsgcmVwb3NpdG9yeUlkICsgIidub3QgZm91bmQhIik7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0VHlwZURlZmluaXRpb25JbnRlcm5hbChyZXBvc2l0b3J5SWQsIHR5cGVJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQsIENvbnN0YW50cy5TRUxFQ1RPUl9UWVBFX0NISUxEUkVOKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZUlkKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUFJPUEVSVFlfREVGSU5JVElPTlMsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRUeXBlQ2hpbGRyZW4oanNvbik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldFJlcG9zaXRvcnlVcmwocmVwb3NpdG9yeUlkLCBDb25zdGFudHMuU0VMRUNUT1JfVFlQRV9ERVNDRU5EQU5UUyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BST1BFUlRZX0RFRklOSVRJT05TLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTGlzdDxPYmplY3Q+IGpzb24gPSBwYXJzZUFycmF5KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0VHlwZURlc2NlbmRhbnRzKGpzb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRSZXBvc2l0b3J5VXJsKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgLy8gcHJlcGFyZSBmb3JtIGRhdGEKLSAgICAgICAgZmluYWwgRm9ybURhdGFXcml0ZXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGFXcml0ZXIoQ29uc3RhbnRzLkNNSVNBQ1RJT05fQ1JFQVRFX1RZUEUpOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3JtRGF0YS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNPTlRST0xfVFlQRSwgSlNPTkNvbnZlcnRlci5jb252ZXJ0KHR5cGUsIGdldERhdGVUaW1lRm9ybWF0KCkpCi0gICAgICAgICAgICAgICAgICAgIC50b0pTT05TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZW5kCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBwb3N0KHVybCwgZm9ybURhdGEuZ2V0Q29udGVudFR5cGUoKSwgbmV3IE91dHB1dCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgZm9ybURhdGEud3JpdGUob3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRUeXBlRGVmaW5pdGlvbihqc29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX1VQREFURV9UWVBFKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5DT05UUk9MX1RZUEUsIEpTT05Db252ZXJ0ZXIuY29udmVydCh0eXBlLCBnZXREYXRlVGltZUZvcm1hdCgpKQotICAgICAgICAgICAgICAgICAgICAudG9KU09OU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VuZAotICAgICAgICBSZXNwb25zZSByZXNwID0gcG9zdCh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0VHlwZURlZmluaXRpb24oanNvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0UmVwb3NpdG9yeVVybChyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX0RFTEVURV9UWVBFKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5DT05UUk9MX1RZUEVfSUQsIHR5cGVJZCk7Ci0KLSAgICAgICAgLy8gc2VuZAotICAgICAgICBwb3N0QW5kQ29uc3VtZSh1cmwsIGZvcm1EYXRhLmdldENvbnRlbnRUeXBlKCksIG5ldyBPdXRwdXQoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGZvcm1EYXRhLndyaXRlKG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9SZXBvc2l0b3J5VXJsQ2FjaGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9SZXBvc2l0b3J5VXJsQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3NTRiMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvUmVwb3NpdG9yeVVybENhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci0KLS8qKgotICogVVJMIGNhY2hlIGZvciByZXBvc2l0b3J5IGFuZCByb290IFVSTHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5VXJsQ2FjaGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0lEID0gIm9iamVjdElkIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcG9zaXRvcnlVcmxzOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByb290VXJsczsKLQotICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5VXJsQ2FjaGUoKSB7Ci0gICAgICAgIHJlcG9zaXRvcnlVcmxzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHJvb3RVcmxzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgVVJMcyBvZiBhIHJlcG9zaXRvcnkgdG8gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHJlcG9zaXRvcnlVcmwsIFN0cmluZyByb290VXJsKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SWQgPT0gbnVsbCB8fCByZXBvc2l0b3J5VXJsID09IG51bGwgfHwgcm9vdFVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXBvc2l0b3J5IElkIG9yIFJlcG9zaXRvcnkgVVJMIG9yIFJvb3QgVVJMIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlcG9zaXRvcnlVcmxzLnB1dChyZXBvc2l0b3J5SWQsIHJlcG9zaXRvcnlVcmwpOwotICAgICAgICAgICAgcm9vdFVybHMucHV0KHJlcG9zaXRvcnlJZCwgcm9vdFVybCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgVVJMcyBvZiBhIHJlcG9zaXRvcnkgZnJvbSB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVwb3NpdG9yeVVybHMucmVtb3ZlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICByb290VXJscy5yZW1vdmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIHJlcG9zaXRvcnkgVVJMIG9mIGEgcmVwb3NpdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlCYXNlVXJsKFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5VXJscy5nZXQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sucmVhZExvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvb3QgVVJMIG9mIGEgcmVwb3NpdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RVcmwoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHJvb3RVcmxzLmdldChyZXBvc2l0b3J5SWQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBVUkwuCi0gICAgICovCi0gICAgcHVibGljIFVybEJ1aWxkZXIgZ2V0UmVwb3NpdG9yeVVybChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIFN0cmluZyBiYXNlID0gZ2V0UmVwb3NpdG9yeUJhc2VVcmwocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFVybEJ1aWxkZXIoYmFzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBVUkwgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFVybEJ1aWxkZXIgZ2V0UmVwb3NpdG9yeVVybChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc2VsZWN0b3IpIHsKLSAgICAgICAgVXJsQnVpbGRlciByZXN1bHQgPSBnZXRSZXBvc2l0b3J5VXJsKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TRUxFQ1RPUiwgc2VsZWN0b3IpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3QgVVJMIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBVcmxCdWlsZGVyIGdldE9iamVjdFVybChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgU3RyaW5nIHJvb3QgPSBnZXRSb290VXJsKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciByZXN1bHQgPSBuZXcgVXJsQnVpbGRlcihyb290KTsKLSAgICAgICAgcmVzdWx0LmFkZFBhcmFtZXRlcihPQkpFQ1RfSUQsIG9iamVjdElkKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gb2JqZWN0IFVSTCB3aXRoIHRoZSBnaXZlbiBzZWxlY3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsQnVpbGRlciBnZXRPYmplY3RVcmwoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc2VsZWN0b3IpIHsKLSAgICAgICAgVXJsQnVpbGRlciByZXN1bHQgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TRUxFQ1RPUiwgc2VsZWN0b3IpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBvYmplY3QgVVJMIHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBVcmxCdWlsZGVyIGdldFBhdGhVcmwoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgU3RyaW5nIHJvb3QgPSBnZXRSb290VXJsKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgVXJsQnVpbGRlciByZXN1bHQgPSBuZXcgVXJsQnVpbGRlcihyb290KTsKLSAgICAgICAgcmVzdWx0LmFkZFBhdGgocGF0aCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBVUkwgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFVybEJ1aWxkZXIgZ2V0UGF0aFVybChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHNlbGVjdG9yKSB7Ci0gICAgICAgIFVybEJ1aWxkZXIgcmVzdWx0ID0gZ2V0UGF0aFVybChyZXBvc2l0b3J5SWQsIHBhdGgpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0VMRUNUT1IsIHNlbGVjdG9yKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9TcGlTZXNzaW9uUGFyYW1ldGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvU3BpU2Vzc2lvblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQ1MWM5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvYnJvd3Nlci9TcGlTZXNzaW9uUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5icm93c2VyOwotCi0vKioKLSAqIEludGVybmFsIHNlc3Npb24gcGFyYW1ldGVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNwaVNlc3Npb25QYXJhbWV0ZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9VUkxfQ0FDSEUgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5icm93c2VyLnJlcG9zaXRvcnl1cmxzIjsKLQotICAgIHByaXZhdGUgU3BpU2Vzc2lvblBhcmFtZXRlcigpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Jyb3dzZXIvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzk4Y2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9icm93c2VyL1ZlcnNpb25pbmdTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSlNPTkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuUmV0dXJuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVHlwZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLQotLyoqCi0gKiBWZXJzaW9uaW5nIFNlcnZpY2UgQnJvd3NlciBCaW5kaW5nIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25pbmdTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0QnJvd3NlckJpbmRpbmdTZXJ2aWNlIGltcGxlbWVudHMgVmVyc2lvbmluZ1NlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKSB7Ci0gICAgICAgIC8vIHdlIG5lZWQgYW4gb2JqZWN0IGlkCi0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldFZhbHVlKCkubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaWQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZC5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAvLyBwcmVwYXJlIGZvcm0gZGF0YQotICAgICAgICBmaW5hbCBGb3JtRGF0YVdyaXRlciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YVdyaXRlcihDb25zdGFudHMuQ01JU0FDVElPTl9DSEVDS19PVVQpOwotICAgICAgICBmb3JtRGF0YS5hZGRTdWNjaW5jdEZsYWcoZ2V0U3VjY2luY3QoKSk7Ci0KLSAgICAgICAgLy8gc2VuZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QodXJsLCBmb3JtRGF0YS5nZXRDb250ZW50VHlwZSgpLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSBuZXdPYmogPSBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3QoanNvbiwgdHlwZUNhY2hlKTsKLQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShuZXdPYmogPT0gbnVsbCA/IG51bGwgOiBuZXdPYmouZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gYnVpbGQgVVJMCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gZ2V0T2JqZWN0VXJsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX0NBTkNFTF9DSEVDS19PVVQpOwotCi0gICAgICAgIC8vIHNlbmQKLSAgICAgICAgcG9zdEFuZENvbnN1bWUodXJsLCBmb3JtRGF0YS5nZXRDb250ZW50VHlwZSgpLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gd2UgbmVlZCBhbiBvYmplY3QgaWQKLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0VmFsdWUoKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBpZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIFVSTAotICAgICAgICBVcmxCdWlsZGVyIHVybCA9IGdldE9iamVjdFVybChyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCkpOwotCi0gICAgICAgIC8vIHByZXBhcmUgZm9ybSBkYXRhCi0gICAgICAgIGZpbmFsIEZvcm1EYXRhV3JpdGVyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhV3JpdGVyKENvbnN0YW50cy5DTUlTQUNUSU9OX0NIRUNLX0lOLCBjb250ZW50U3RyZWFtKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9NQUpPUiwgbWFqb3IpOwotICAgICAgICBmb3JtRGF0YS5hZGRQcm9wZXJ0aWVzUGFyYW1ldGVycyhwcm9wZXJ0aWVzLCBnZXREYXRlVGltZUZvcm1hdCgpKTsKLSAgICAgICAgZm9ybURhdGEuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEVDS0lOX0NPTU1FTlQsIGNoZWNraW5Db21tZW50KTsKLSAgICAgICAgZm9ybURhdGEuYWRkUG9saWNpZXNQYXJhbWV0ZXJzKHBvbGljaWVzKTsKLSAgICAgICAgZm9ybURhdGEuYWRkQWRkQWNlc1BhcmFtZXRlcnMoYWRkQWNlcyk7Ci0gICAgICAgIGZvcm1EYXRhLmFkZFJlbW92ZUFjZXNQYXJhbWV0ZXJzKHJlbW92ZUFjZXMpOwotICAgICAgICBmb3JtRGF0YS5hZGRTdWNjaW5jdEZsYWcoZ2V0U3VjY2luY3QoKSk7Ci0KLSAgICAgICAgLy8gc2VuZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHBvc3QodXJsLCBmb3JtRGF0YS5nZXRDb250ZW50VHlwZSgpLCBuZXcgT3V0cHV0KCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBmb3JtRGF0YS53cml0ZShvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24gPSBwYXJzZU9iamVjdChyZXNwLmdldFN0cmVhbSgpLCByZXNwLmdldENoYXJzZXQoKSk7Ci0KLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSBuZXdPYmogPSBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3QoanNvbiwgdHlwZUNhY2hlKTsKLQotICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShuZXdPYmogPT0gbnVsbCA/IG51bGwgOiBuZXdPYmouZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX09CSkVDVCk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QT0xJQ1lfSURTLCBpbmNsdWRlUG9saWN5SWRzKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUNMLCBpbmNsdWRlQWNsKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVUVVJOX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgKG1ham9yID09IG51bGwgfHwgQm9vbGVhbi5GQUxTRS5lcXVhbHMobWFqb3IpID8gUmV0dXJuVmVyc2lvbi5MQVRFU1QgOiBSZXR1cm5WZXJzaW9uLkxBU1RFU1RNQUpPUikpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZ2V0U3VjY2luY3RQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gcGFyc2VPYmplY3QocmVzcC5nZXRTdHJlYW0oKSwgcmVzcC5nZXRDaGFyc2V0KCkpOwotCi0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgQ2xpZW50VHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3QoanNvbiwgdHlwZUNhY2hlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX1BST1BFUlRJRVMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFVFVSTl9WRVJTSU9OLAotICAgICAgICAgICAgICAgIChtYWpvciA9PSBudWxsIHx8IEJvb2xlYW4uRkFMU0UuZXF1YWxzKG1ham9yKSA/IFJldHVyblZlcnNpb24uTEFURVNUIDogUmV0dXJuVmVyc2lvbi5MQVNURVNUTUFKT1IpKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1VDQ0lOQ1QsIGdldFN1Y2NpbmN0UGFyYW1ldGVyKCkpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9EQVRFVElNRV9GT1JNQVQsIGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKCkpOwotCi0gICAgICAgIC8vIHJlYWQgYW5kIHBhcnNlCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSByZWFkKHVybCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiA9IHBhcnNlT2JqZWN0KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICBpZiAoZ2V0U3VjY2luY3QoKSkgewotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBDbGllbnRUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0U3VjY2luY3RQcm9wZXJ0aWVzKGpzb24sIG51bGwsIHR5cGVDYWNoZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0UHJvcGVydGllcyhqc29uLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdERhdGE+IGdldEFsbFZlcnNpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBidWlsZCBVUkwKLSAgICAgICAgVXJsQnVpbGRlciB1cmwgPSBnZXRPYmplY3RVcmwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgQ29uc3RhbnRzLlNFTEVDVE9SX1ZFUlNJT05TKTsKLSAgICAgICAgdXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICB1cmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZ2V0U3VjY2luY3RQYXJhbWV0ZXIoKSk7Ci0gICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVCwgZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgcGFyc2UKLSAgICAgICAgUmVzcG9uc2UgcmVzcCA9IHJlYWQodXJsKTsKLSAgICAgICAgTGlzdDxPYmplY3Q+IGpzb24gPSBwYXJzZUFycmF5KHJlc3AuZ2V0U3RyZWFtKCksIHJlc3AuZ2V0Q2hhcnNldCgpKTsKLQotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IENsaWVudFR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCB0aGlzKTsKLQotICAgICAgICByZXR1cm4gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0cyhqc29uLCB0eXBlQ2FjaGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvY29va2llcy9DbWlzQ29va2llTWFuYWdlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9jb29raWVzL0NtaXNDb29raWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNmJlYTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9jb29raWVzL0NtaXNDb29raWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKgotICogVGhpcyBjbGFzcyBoYXMgYmVlbiB0YWtlbiBmcm9tIEFwYWNoZSBIYXJtb255IChodHRwOi8vaGFybW9ueS5hcGFjaGUub3JnLykgCi0gKiBhbmQgaGFzIGJlZW4gbW9kaWZpZWQgdG8gd29yayB3aXRoIE9wZW5DTUlTLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuY29va2llczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBDb29raWUgTWFuYWdlci4KLSAqIAotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBjb25mb3JtcyB0byBSRkMgMjk2NSwgc2VjdGlvbiAzLjMgd2l0aCBzb21lIFJGQyA2MjY1Ci0gKiBleHRlbnNpb25zLgotICovCi1wdWJsaWMgY2xhc3MgQ21pc0Nvb2tpZU1hbmFnZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENtaXNDb29raWVNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9aRVJPX0hFQURFUiA9ICJTZXQtY29va2llIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9PTkVfSEVBREVSID0gIlNldC1jb29raWUyIjsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlc3Npb25JZDsKLSAgICBwcml2YXRlIGZpbmFsIENtaXNDb29raWVTdG9yZUltcGwgc3RvcmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBjb29raWUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0Nvb2tpZU1hbmFnZXIoKSB7Ci0gICAgICAgIHRoaXMoIjx1bmtub3duPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgY29va2llIG1hbmFnZXIuCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb29raWVNYW5hZ2VyKFN0cmluZyBzZXNzaW9uSWQpIHsKLSAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgICAgIHN0b3JlID0gbmV3IENtaXNDb29raWVTdG9yZUltcGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hzIGFuZCBnZXRzIGFsbCBjb29raWVzIGluIHRoZSBjYWNoZSBieSB0aGUgc3BlY2lmaWVkIHVyaSBpbiB0aGUKLSAgICAgKiByZXF1ZXN0IGhlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogICAgICAgICAgICB0aGUgc3BlY2lmaWVkIHVyaSB0byBzZWFyY2ggZm9yCi0gICAgICogQHBhcmFtIHJlcXVlc3RIZWFkZXJzCi0gICAgICogICAgICAgICAgICBhIGxpc3Qgb2YgcmVxdWVzdCBoZWFkZXJzCi0gICAgICogQHJldHVybiBhIG1hcCB0aGF0IHJlY29yZCBhbGwgc3VjaCBjb29raWVzLCB0aGUgbWFwIGlzIHVuY2hhbmdlYWJsZQotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldChTdHJpbmcgdXJsLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlcXVlc3RIZWFkZXJzKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCByZXF1ZXN0SGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVUkwgb3IgaGVhZGVycyBhcmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSSSB1cmk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmkgPSBuZXcgVVJJKHVybCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PENtaXNIdHRwQ29va2llPiBjb29raWVzID0gc3RvcmUuZ2V0KHVyaSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJpUGF0aCA9IHVyaS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBDbWlzSHR0cENvb2tpZSBjb29raWUgPSBjb29raWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29va2llUGF0aCA9IGNvb2tpZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVyaSdzIHBhdGggZG9lcyBub3QgcGF0aC1tYXRjaCBjb29raWUncyBwYXRoLCByZW1vdmUKLSAgICAgICAgICAgICAgICAvLyBjb29raWVzIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBpZiAoY29va2llUGF0aCA9PSBudWxsIHx8IHVyaVBhdGgubGVuZ3RoKCkgPT0gMCB8fCAhdXJpUGF0aC5zdGFydHNXaXRoKGNvb2tpZVBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvb2tpZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtYXAgPSBnZXRDb29raWVNYXAoY29va2llcywgcmVxdWVzdEhlYWRlcnMpOwotCi0gICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWFwICE9IG51bGwgJiYgIW1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXNzaW9uIHt9OiBTZXR0aW5nIGNvb2tpZXMgZm9yIFVSTCB7fToge30iLCBzZXNzaW9uSWQsIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuZ2V0KCJDb29raWUiKSA9PSBudWxsID8gIiIgOiBtYXAuZ2V0KCJDb29raWUiKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtYXA7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRDb29raWVNYXAoTGlzdDxDbWlzSHR0cENvb2tpZT4gY29va2llcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVxdWVzdEhlYWRlcnMpIHsKLSAgICAgICAgaWYgKGNvb2tpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgY29va2llSGVhZGVyU3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKENtaXNIdHRwQ29va2llIGNvb2tpZSA6IGNvb2tpZXMpIHsKLSAgICAgICAgICAgIGlmIChjb29raWVIZWFkZXJTdHIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY29va2llSGVhZGVyU3RyLmFwcGVuZCgiOyAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvb2tpZUhlYWRlclN0ci5hcHBlbmQoY29va2llLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb29raWVIZWFkZXJTdHIuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICBjb29raWVIZWFkZXJTdHIuYXBwZW5kKGNvb2tpZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoIkNvb2tpZSIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29va2llSGVhZGVyU3RyLnRvU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGNvb2tpZXMgYWNjb3JkaW5nIHRvIHVyaSBhbmQgcmVzcG9uc2VIZWFkZXJzCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqICAgICAgICAgICAgdGhlIHNwZWNpZmllZCB1cmkKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2VIZWFkZXJzCi0gICAgICogICAgICAgICAgICBhIGxpc3Qgb2YgcmVxdWVzdCBoZWFkZXJzCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNvbWUgZXJyb3Igb2YgSS9PIG9wZXJhdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIHVybCwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXNwb25zZUhlYWRlcnMpIHsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IHJlc3BvbnNlSGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVUkwgb3IgaGVhZGVycyBhcmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSSSB1cmk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmkgPSBuZXcgVVJJKHVybCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBwYXJzZSBhbmQgY29uc3RydWN0IGNvb2tpZXMgYWNjb3JkaW5nIHRvIHRoZSBtYXAKLSAgICAgICAgICAgIExpc3Q8Q21pc0h0dHBDb29raWU+IGNvb2tpZXMgPSBwYXJzZUNvb2tpZShyZXNwb25zZUhlYWRlcnMpOwotICAgICAgICAgICAgZm9yIChDbWlzSHR0cENvb2tpZSBjb29raWUgOiBjb29raWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5nZXREb21haW4oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvb2tpZS5zZXREb21haW4odXJpLmdldEhvc3QoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb29raWUuZ2V0UGF0aCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29va2llLnNldFBhdGgoIi8iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RvcmUuYWRkKHVyaSwgY29va2llKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb29raWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24ge306IFJldHJpZXZlZCBjb29raWVzIGZvciBVUkwge306IHt9Iiwgc2Vzc2lvbklkLCB1cmwsIGNvb2tpZXMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q21pc0h0dHBDb29raWU+IHBhcnNlQ29va2llKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVzcG9uc2VIZWFkZXJzKSB7Ci0gICAgICAgIExpc3Q8Q21pc0h0dHBDb29raWU+IGNvb2tpZXMgPSBuZXcgQXJyYXlMaXN0PENtaXNIdHRwQ29va2llPigpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiByZXNwb25zZUhlYWRlcnMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgLy8gT25seSAiU2V0LWNvb2tpZSIgYW5kICJTZXQtY29va2llMiIgcGFpciB3aWxsIGJlIHBhcnNlZAotICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsICYmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OX1pFUk9fSEVBREVSKSB8fCBrZXkuZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OX09ORV9IRUFERVIpKSkgewotICAgICAgICAgICAgICAgIC8vIHBhcnNlIGxpc3QgZWxlbWVudHMgb25lIGJ5IG9uZQotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvb2tpZVN0ciA6IGVudHJ5LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ21pc0h0dHBDb29raWUgY29va2llIDogQ21pc0h0dHBDb29raWUucGFyc2UoY29va2llU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZXMuYWRkKGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHN0cmluZyBpcyBpbnZhbGlkLCBqdW1wIHRvIHRoZSBuZXh0IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb29raWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgY3VycmVudCBjb29raWUgc3RvcmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29va2llIHN0b3JlIGN1cnJlbnRseSB1c2VkIGJ5IGNvb2tpZSBtYW5hZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29va2llU3RvcmVJbXBsIGdldENvb2tpZVN0b3JlKCkgewotICAgICAgICByZXR1cm4gc3RvcmU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9jb29raWVzL0NtaXNDb29raWVTdG9yZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvY29va2llcy9DbWlzQ29va2llU3RvcmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZGNiOWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9jb29raWVzL0NtaXNDb29raWVTdG9yZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qCi0gKiBUaGlzIGNsYXNzIGhhcyBiZWVuIHRha2VuIGZyb20gQXBhY2hlIEhhcm1vbnkgKGh0dHA6Ly9oYXJtb255LmFwYWNoZS5vcmcvKSAKLSAqIGFuZCBoYXMgYmVlbiBtb2RpZmllZCB0byB3b3JrIHdpdGggT3BlbkNNSVMuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5jb29raWVzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogUHJvdmlkZXMgYW4gaW4tbWVtb3J5IGNvb2tpZSBzdG9yZS4KLSAqLwotcHVibGljIGNsYXNzIENtaXNDb29raWVTdG9yZUltcGwgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElQX0FERFJFU1NfUEFUVEVSTl9TVFIgPSAiXihbMDFdP1xcZFxcZD98MlswLTRdXFxkfDI1WzAtNV0pXFwuKFswMV0/XFxkXFxkP3wyWzAtNF1cXGR8MjVbMC01XSlcXC4oWzAxXT9cXGRcXGQ/fDJbMC00XVxcZHwyNVswLTVdKVxcLihbMDFdP1xcZFxcZD98MlswLTRdXFxkfDI1WzAtNV0pJCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBJUF9BRERSRVNTX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoSVBfQUREUkVTU19QQVRURVJOX1NUUik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtYXhVcmxzOwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlEZXF1ZTxDbWlzSHR0cENvb2tpZT4gc3RvcmVMaXN0OwotCi0gICAgcHVibGljIENtaXNDb29raWVTdG9yZUltcGwoKSB7Ci0gICAgICAgIHRoaXMoMzAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc0Nvb2tpZVN0b3JlSW1wbChmaW5hbCBpbnQgbWF4VXJscykgewotICAgICAgICB0aGlzLm1heFVybHMgPSBtYXhVcmxzOwotICAgICAgICBzdG9yZUxpc3QgPSBuZXcgQXJyYXlEZXF1ZTxDbWlzSHR0cENvb2tpZT4obWF4VXJscyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkKGZpbmFsIFVSSSB1cmksIGZpbmFsIENtaXNIdHRwQ29va2llIGNvb2tpZSkgewotICAgICAgICBpZiAodXJpID09IG51bGwgfHwgY29va2llID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVSSSBhbmQgY29va2llIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvb2tpZS5oYXNFeHBpcmVkKCkpIHsKLSAgICAgICAgICAgIHN0b3JlTGlzdC5yZW1vdmUoY29va2llKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yPENtaXNIdHRwQ29va2llPiBpdGVyID0gc3RvcmVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ21pc0h0dHBDb29raWUgc3RvcmVDb29raWUgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKHN0b3JlQ29va2llLmVxdWFscyhjb29raWUpIHx8IHN0b3JlQ29va2llLmhhc0V4cGlyZWQoKSkgewotICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdG9yZUxpc3QuYWRkRmlyc3QoY29va2llKTsKLQotICAgICAgICBpZiAoc3RvcmVMaXN0LnNpemUoKSA+IG1heFVybHMpIHsKLSAgICAgICAgICAgIHN0b3JlTGlzdC5yZW1vdmVMYXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDbWlzSHR0cENvb2tpZT4gZ2V0KFVSSSB1cmkpIHsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVUkkgaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyB1cmlIb3N0ID0gdXJpLmdldEhvc3QoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc1NlY3VyZSA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICBpZiAoc2NoZW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzU2VjdXJlID0gc2NoZW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5zdGFydHNXaXRoKCJodHRwcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxDbWlzSHR0cENvb2tpZT4gY29va2llcyA9IG5ldyBBcnJheUxpc3Q8Q21pc0h0dHBDb29raWU+KCk7Ci0KLSAgICAgICAgSXRlcmF0b3I8Q21pc0h0dHBDb29raWU+IGl0ZXIgPSBzdG9yZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDbWlzSHR0cENvb2tpZSBjb29raWUgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGNvb2tpZS5oYXNFeHBpcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoIWNvb2tpZS5nZXRTZWN1cmUoKSB8fCBpc1NlY3VyZSkgJiYgY29va2llLmdldERvbWFpbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29va2llRG9tYWluID0gY29va2llLmdldERvbWFpbigpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNJUEFkZHJlc3ModXJpSG9zdCkgJiYgdXJpSG9zdC5lcXVhbHMoY29va2llRG9tYWluKSkgewotICAgICAgICAgICAgICAgICAgICBjb29raWVzLmFkZChjb29raWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb29raWUuZ2V0VmVyc2lvbigpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldHNjYXBlLCBSRkMgMjEwOSwgUkZDIDYyNjUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmlIb3N0LmVuZHNXaXRoKGNvb2tpZURvbWFpbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHVyaUhvc3QubGVuZ3RoKCkgPT0gY29va2llRG9tYWluLmxlbmd0aCgpIHx8IGNvb2tpZURvbWFpbi5jaGFyQXQoMCkgPT0gJy4nKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZXMuYWRkKGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29va2llLmdldFZlcnNpb24oKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSRkMgMjk2NQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENtaXNIdHRwQ29va2llLmRvbWFpbk1hdGNoZXMoY29va2llRG9tYWluLCB1cmlIb3N0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZXMuYWRkKGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29va2llczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJUEFkZHJlc3MoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMuY2hhckF0KDApID09ICdbJykgewotICAgICAgICAgICAgLy8gSVB2NgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoSVBfQUREUkVTU19QQVRURVJOLm1hdGNoZXIocykubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAvLyBJUHY0Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2Nvb2tpZXMvQ21pc0h0dHBDb29raWUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvY29va2llcy9DbWlzSHR0cENvb2tpZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGIxYWI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvY29va2llcy9DbWlzSHR0cENvb2tpZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoKLSAqIFRoaXMgY2xhc3MgaGFzIGJlZW4gdGFrZW4gZnJvbSBBcGFjaGUgSGFybW9ueSAoaHR0cDovL2hhcm1vbnkuYXBhY2hlLm9yZy8pIAotICogYW5kIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHdvcmsgd2l0aCBPcGVuQ01JUy4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmNvb2tpZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBodHRwIGNvb2tpZSwgd2hpY2ggaW5kaWNhdGVzIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24KLSAqIGJldHdlZW4gdGhlIGNsaWVudCBhZ2VudCBzaWRlIGFuZCB0aGUgc2VydmVyIHNpZGUuIEFjY29yZGluZyB0byBSRkMsIHRoZXJlCi0gKiBhcmUgNCBodHRwIGNvb2tpZSBzcGVjaWZpY2F0aW9ucy4gVGhpcyBjbGFzcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsCi0gKiBOZXRzY2FwZSBzcGVjaWZpY2F0aW9uLCBSRkMgMjEwOSwgUkZDIDI5NjUgYW5kIHBhcnR5IGNvbXBhdGlibGUgd2l0aCBSRkMKLSAqIDYyNjUuIEh0dHBDb29raWUgY2xhc3MgY2FuIGFjY2VwdCBhbGwgc3ludGF4IGZvcm1zLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ21pc0h0dHBDb29raWUgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1RfU1RSID0gIi4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9TVFIgPSAiLmxvY2FsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVEVfU1RSID0gIlwiIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFfU1RSID0gIiwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSEVBRF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJTZXQtQ29va2llMj86IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE5BTUVfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICAgICAgICIoW14kPSxcdTAwODVcdTIwMjhcdTIwMjldW14sXG5cdFxyXHJcblx1MDA4NVx1MjAyOFx1MjAyOV0qPyk9KFteO10qKSg7KT8iLCBQYXR0ZXJuLkRPVEFMTAotICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBBVFRSX1BBVFRFUk4wID0gUGF0dGVybi5jb21waWxlKCIoW147PV0qKSg/Oj0oW147XSopKT8iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEFUVFJfUEFUVEVSTjEgPSBQYXR0ZXJuLmNvbXBpbGUoIigsP1teOz1dKikoPzo9KFteOyxdKikpPygoPz0uKSk/Iik7Ci0KLSAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBTZXR0ZXIgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2V0OwotCi0gICAgICAgIFNldHRlcigpIHsKLSAgICAgICAgICAgIHNldCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1NldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldChib29sZWFuIGlzU2V0KSB7Ci0gICAgICAgICAgICBzZXQgPSBpc1NldDsKLSAgICAgICAgfQotCi0gICAgICAgIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBDbWlzSHR0cENvb2tpZSBjb29raWUpOwotCi0gICAgICAgIHZvaWQgdmFsaWRhdGUoU3RyaW5nIHZhbHVlLCBDbWlzSHR0cENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgIGlmIChjb29raWUuZ2V0VmVyc2lvbigpID09IDEgJiYgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5jb250YWlucyhDT01NQV9TVFIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXR0ZXI+IGF0dHJpYnV0ZVNldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0dGVyPigpOwotCi0gICAgLyoqCi0gICAgICogQSB1dGlsaXR5IG1ldGhvZCB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGhvc3QgbmFtZSBpcyBpbiBhIGRvbWFpbiBvcgotICAgICAqIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG9tYWluCi0gICAgICogICAgICAgICAgICB0aGUgZG9tYWluIHRvIGJlIGNoZWNrZWQgYWdhaW5zdAotICAgICAqIEBwYXJhbSBob3N0Ci0gICAgICogICAgICAgICAgICB0aGUgaG9zdCB0byBiZSBjaGVja2VkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBob3N0IGlzIGluIHRoZSBkb21haW4sIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb21haW5NYXRjaGVzKFN0cmluZyBkb21haW4sIFN0cmluZyBob3N0KSB7Ci0gICAgICAgIGlmIChkb21haW4gPT0gbnVsbCB8fCBob3N0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmV3RG9tYWluID0gZG9tYWluLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdIb3N0ID0gaG9zdC50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAgIHJldHVybiBuZXdEb21haW4uZXF1YWxzKG5ld0hvc3QpCi0gICAgICAgICAgICAgICAgfHwgKGlzVmFsaWREb21haW4obmV3RG9tYWluKSAmJiBlZmZEb21haW5NYXRjaGVzKG5ld0RvbWFpbiwgbmV3SG9zdCkgJiYgaXNWYWxpZEhvc3QobmV3RG9tYWluLCBuZXdIb3N0KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlZmZEb21haW5NYXRjaGVzKFN0cmluZyBkb21haW4sIFN0cmluZyBob3N0KSB7Ci0gICAgICAgIC8vIGNhbGN1bGF0ZSBlZmZlY3RpdmUgaG9zdCBuYW1lCi0gICAgICAgIFN0cmluZyBlZmZIb3N0ID0gaG9zdC5pbmRleE9mKERPVF9TVFIpICE9IC0xID8gaG9zdCA6IChob3N0ICsgTE9DQUxfU1RSKTsKLQotICAgICAgICAvLyBSdWxlIDI6IGRvbWFpbiBhbmQgaG9zdCBhcmUgc3RyaW5nLWNvbXBhcmUgZXF1YWwsIG9yIEEgPSBOQiwgQiA9IC5CJwotICAgICAgICAvLyBhbmQgTiBpcyBhIG5vbi1lbXB0eSBuYW1lIHN0cmluZwotICAgICAgICBib29sZWFuIGluRG9tYWluID0gZG9tYWluLmVxdWFscyhlZmZIb3N0KTsKLSAgICAgICAgaW5Eb21haW4gPSBpbkRvbWFpbgotICAgICAgICAgICAgICAgIHx8IChlZmZIb3N0LmVuZHNXaXRoKGRvbWFpbikgJiYgZWZmSG9zdC5sZW5ndGgoKSA+IGRvbWFpbi5sZW5ndGgoKSAmJiBkb21haW4uc3RhcnRzV2l0aChET1RfU1RSKSk7Ci0KLSAgICAgICAgcmV0dXJuIGluRG9tYWluOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb21tYURlbGltKENtaXNIdHRwQ29va2llIGNvb2tpZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb29raWUuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoUVVPVEVfU1RSKSAmJiB2YWx1ZS5lbmRzV2l0aChRVU9URV9TVFIpKSB7Ci0gICAgICAgICAgICBjb29raWUuc2V0VmFsdWUodmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCgpIC0gMSkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvb2tpZS5nZXRWZXJzaW9uKCkgPT0gMSAmJiB2YWx1ZS5jb250YWlucyhDT01NQV9TVFIpKSB7Ci0gICAgICAgICAgICBjb29raWUuc2V0VmFsdWUodmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmluZGV4T2YoQ09NTUFfU1RSKSkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRG9tYWluKFN0cmluZyBkb21haW4pIHsKLSAgICAgICAgLy8gUnVsZSAxOiBUaGUgdmFsdWUgZm9yIERvbWFpbiBjb250YWlucyBlbWJlZGRlZCBkb3RzLCBvciBpcyAubG9jYWwKLSAgICAgICAgaWYgKGRvbWFpbi5sZW5ndGgoKSA8PSAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZG9tYWluLnN1YnN0cmluZygxLCBkb21haW4ubGVuZ3RoKCkgLSAxKS5pbmRleE9mKERPVF9TVFIpICE9IC0xIHx8IGRvbWFpbi5lcXVhbHMoTE9DQUxfU1RSKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRIb3N0KFN0cmluZyBkb21haW4sIFN0cmluZyBob3N0KSB7Ci0gICAgICAgIC8vIFJ1bGUgMzogaG9zdCBkb2VzIG5vdCBlbmQgd2l0aCBkb21haW4sIG9yIHRoZSByZW1haW5kZXIgZG9lcyBub3QKLSAgICAgICAgLy8gY29udGFpbiAiLiIKLSAgICAgICAgYm9vbGVhbiBtYXRjaGVzID0gIWhvc3QuZW5kc1dpdGgoZG9tYWluKTsKLSAgICAgICAgaWYgKCFtYXRjaGVzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaG9zdFN1YiA9IGhvc3Quc3Vic3RyaW5nKDAsIGhvc3QubGVuZ3RoKCkgLSBkb21haW4ubGVuZ3RoKCkpOwotICAgICAgICAgICAgbWF0Y2hlcyA9IGhvc3RTdWIuaW5kZXhPZihET1RfU1RSKSA9PSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtYXRjaGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBjb29raWUgZnJvbSBhIHN0cmluZy4gVGhlIHN0cmluZyBzaG91bGQgY29tcGx5IHdpdGgKLSAgICAgKiBzZXQtY29va2llIG9yIHNldC1jb29raWUyIGhlYWRlciBmb3JtYXQgYXMgc3BlY2lmaWVkIGluIFJGQyAyOTY1LiBTaW5jZQotICAgICAqIHNldC1jb29raWVzMiBzeW50YXggYWxsb3dzIG1vcmUgdGhhbiBvbmUgY29va2llIGRlZmluaXRpb25zIGluIG9uZQotICAgICAqIGhlYWRlciwgdGhlIHJldHVybmVkIG9iamVjdCBpcyBhIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGhlYWRlcgotICAgICAqICAgICAgICAgICAgYSBzZXQtY29va2llIG9yIHNldC1jb29raWUyIGhlYWRlci4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBjb25zdHJ1Y3RlZCBjb29raWVzCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3RyaW5nIGRvZXMgbm90IGNvbXBseSB3aXRoIGNvb2tpZSBzcGVjaWZpY2F0aW9uLCBvcgotICAgICAqICAgICAgICAgICAgIHRoZSBjb29raWUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMsIG9yIHJlc2VydmVkCi0gICAgICogICAgICAgICAgICAgdG9rZW5zIG9mIGNvb2tpZSBzcGVjaWZpY2F0aW9uIGFwcGVhcnMKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgaGVhZGVyIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q21pc0h0dHBDb29raWU+IHBhcnNlKFN0cmluZyBoZWFkZXIpIHsKLSAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gSEVBRF9QQVRURVJOLm1hdGNoZXIoaGVhZGVyKTsKLSAgICAgICAgLy8gUGFyc2UgY29va2llIG5hbWUgJiB2YWx1ZQotICAgICAgICBMaXN0PENtaXNIdHRwQ29va2llPiBsaXN0ID0gbnVsbDsKLSAgICAgICAgQ21pc0h0dHBDb29raWUgY29va2llID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGhlYWRlclN0cmluZyA9IGhlYWRlcjsKLSAgICAgICAgaW50IHZlcnNpb24gPSAwOwotICAgICAgICAvLyBwcm9jZXNzIHNldC1jb29raWUgfCBzZXQtY29va2llMiBoZWFkCi0gICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGNvb2tpZUhlYWQgPSBtYXRjaGVyLmdyb3VwKCk7Ci0gICAgICAgICAgICBpZiAoInNldC1jb29raWUyOiIuZXF1YWxzSWdub3JlQ2FzZShjb29raWVIZWFkKSkgewotICAgICAgICAgICAgICAgIHZlcnNpb24gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGVhZGVyU3RyaW5nID0gaGVhZGVyLnN1YnN0cmluZyhjb29raWVIZWFkLmxlbmd0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnNlIGNvb2tpZSBuYW1lL3ZhbHVlIHBhaXIKLSAgICAgICAgbWF0Y2hlciA9IE5BTUVfUEFUVEVSTi5tYXRjaGVyKGhlYWRlclN0cmluZyk7Ci0gICAgICAgIGlmIChtYXRjaGVyLmxvb2tpbmdBdCgpKSB7Ci0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxDbWlzSHR0cENvb2tpZT4oKTsKLSAgICAgICAgICAgIGNvb2tpZSA9IG5ldyBDbWlzSHR0cENvb2tpZShtYXRjaGVyLmdyb3VwKDEpLCBtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIGNvb2tpZS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ29tbWEgaXMgYSBkZWxpbWl0ZXIgaW4gY29va2llIHNwZWMgMS4xLiBJZiBmaW5kIGNvbW1hIGluIHZlcnNpb24KLSAgICAgICAgICAgICAqIDEgY29va2llIGhlYWRlciwgcGFydCBvZiBtYXRjaGVkIHN0cmluZyBuZWVkIHRvIGJlIHNwaXR0ZWQgb3V0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbmFtZUdyb3VwID0gbWF0Y2hlci5ncm91cCgpOwotICAgICAgICAgICAgaWYgKGlzQ29tbWFEZWxpbShjb29raWUpKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyU3RyaW5nID0gaGVhZGVyU3RyaW5nLnN1YnN0cmluZyhuYW1lR3JvdXAuaW5kZXhPZihDT01NQV9TVFIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyU3RyaW5nID0gaGVhZGVyU3RyaW5nLnN1YnN0cmluZyhuYW1lR3JvdXAubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGlzdC5hZGQoY29va2llKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnNlIGNvb2tpZSBoZWFkZXJTdHJpbmcKLSAgICAgICAgd2hpbGUgKCEoaGVhZGVyU3RyaW5nLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICBtYXRjaGVyID0gY29va2llLmdldFZlcnNpb24oKSA9PSAxID8gQVRUUl9QQVRURVJOMS5tYXRjaGVyKGhlYWRlclN0cmluZykgOiBBVFRSX1BBVFRFUk4wCi0gICAgICAgICAgICAgICAgICAgIC5tYXRjaGVyKGhlYWRlclN0cmluZyk7Ci0KLSAgICAgICAgICAgIGlmIChtYXRjaGVyLmxvb2tpbmdBdCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gbWF0Y2hlci5ncm91cCgxKS50cmltKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBzaXR1YXRpb24gbGlrZTogPC4uPjs7PC4uPgotICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclN0cmluZyA9IGhlYWRlclN0cmluZy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIElmIHBvcnQgaXMgdGhlIGF0dHJpYnV0ZSwgdGhlbiBjb21tYSB3aWxsIG5vdCBiZSB1c2VkIGFzIGEKLSAgICAgICAgICAgICAgICAvLyBkZWxpbWl0ZXIKLSAgICAgICAgICAgICAgICBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicG9ydCIpIHx8IGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImV4cGlyZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBtYXRjaGVyLnJlZ2lvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBBVFRSX1BBVFRFUk4wLm1hdGNoZXIoaGVhZGVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlci5yZWdpb24oc3RhcnQsIGhlYWRlclN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZXIubG9va2luZ0F0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb29raWUuZ2V0VmVyc2lvbigpID09IDEgJiYgYXR0ck5hbWUuc3RhcnRzV2l0aChDT01NQV9TVFIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IGVuY291bnRlcmVkIHRva2VuIGlzIGNvbW1hLCBhbmQgdGhlIHBhcnNlZAotICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgaXMgbm90IHBvcnQsIHRoZW4gdGhpcyBhdHRyaWJ1dGUvdmFsdWUgcGFpcgotICAgICAgICAgICAgICAgICAgICAvLyBlbmRzLgotICAgICAgICAgICAgICAgICAgICBoZWFkZXJTdHJpbmcgPSBoZWFkZXJTdHJpbmcuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVyID0gTkFNRV9QQVRURVJOLm1hdGNoZXIoaGVhZGVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubG9va2luZ0F0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZSA9IG5ldyBDbWlzSHR0cENvb2tpZShtYXRjaGVyLmdyb3VwKDEpLCBtYXRjaGVyLmdyb3VwKDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJTdHJpbmcgPSBoZWFkZXJTdHJpbmcuc3Vic3RyaW5nKG1hdGNoZXIuZ3JvdXAoKS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFNldHRlciBzZXR0ZXIgPSBjb29raWUuYXR0cmlidXRlU2V0LmdldChhdHRyTmFtZS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2V0dGVyICE9IG51bGwgJiYgIXNldHRlci5pc1NldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBtYXRjaGVyLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgICAgICBzZXR0ZXIudmFsaWRhdGUoYXR0clZhbHVlLCBjb29raWUpOwotICAgICAgICAgICAgICAgICAgICBzZXR0ZXIuc2V0VmFsdWUobWF0Y2hlci5ncm91cCgyKSwgY29va2llKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGVhZGVyU3RyaW5nID0gaGVhZGVyU3RyaW5nLnN1YnN0cmluZyhtYXRjaGVyLmVuZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudFVSTDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzY2FyZDsKLSAgICBwcml2YXRlIFN0cmluZyBkb21haW47Ci0gICAgcHJpdmF0ZSBsb25nIG1heEFnZSA9IC0xTDsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydExpc3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNlY3VyZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICBwcml2YXRlIGludCB2ZXJzaW9uID0gMTsKLQotICAgIHsKLSAgICAgICAgYXR0cmlidXRlU2V0LnB1dCgiY29tbWVudCIsIG5ldyBTZXR0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBDbWlzSHR0cENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgICAgICBjb29raWUuc2V0Q29tbWVudCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5nZXRDb21tZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYXR0cmlidXRlU2V0LnB1dCgiY29tbWVudHVybCIsIG5ldyBTZXR0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBDbWlzSHR0cENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgICAgICBjb29raWUuc2V0Q29tbWVudFVSTCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5nZXRDb21tZW50VVJMKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYXR0cmlidXRlU2V0LnB1dCgiZGlzY2FyZCIsIG5ldyBTZXR0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBDbWlzSHR0cENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgICAgICBjb29raWUuc2V0RGlzY2FyZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhdHRyaWJ1dGVTZXQucHV0KCJkb21haW4iLCBuZXcgU2V0dGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSwgQ21pc0h0dHBDb29raWUgY29va2llKSB7Ci0gICAgICAgICAgICAgICAgY29va2llLnNldERvbWFpbih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5nZXREb21haW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhdHRyaWJ1dGVTZXQucHV0KCJtYXgtYWdlIiwgbmV3IFNldHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIENtaXNIdHRwQ29va2llIGNvb2tpZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvb2tpZS5zZXRNYXhBZ2UoTG9uZy5wYXJzZUxvbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG1heC1hZ2UhIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldCh0cnVlKTsKLQotICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlU2V0LmdldCgidmVyc2lvbiIpLmlzU2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29va2llLnNldFZlcnNpb24oMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhdHRyaWJ1dGVTZXQucHV0KCJwYXRoIiwgbmV3IFNldHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIENtaXNIdHRwQ29va2llIGNvb2tpZSkgewotICAgICAgICAgICAgICAgIGNvb2tpZS5zZXRQYXRoKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoY29va2llLmdldFBhdGgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhdHRyaWJ1dGVTZXQucHV0KCJwb3J0IiwgbmV3IFNldHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIENtaXNIdHRwQ29va2llIGNvb2tpZSkgewotICAgICAgICAgICAgICAgIGNvb2tpZS5zZXRQb3J0bGlzdCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5nZXRQb3J0bGlzdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0KHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICB2b2lkIHZhbGlkYXRlKFN0cmluZyB2LCBDbWlzSHR0cENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGF0dHJpYnV0ZVNldC5wdXQoInNlY3VyZSIsIG5ldyBTZXR0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlLCBDbWlzSHR0cENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgICAgICBjb29raWUuc2V0U2VjdXJlKHRydWUpOwotICAgICAgICAgICAgICAgIHNldCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGF0dHJpYnV0ZVNldC5wdXQoInZlcnNpb24iLCBuZXcgU2V0dGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSwgQ21pc0h0dHBDb29raWUgY29va2llKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHYgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYgPiBjb29raWUuZ2V0VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuc2V0VmVyc2lvbih2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdmVyc2lvbiEiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5nZXRWZXJzaW9uKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhdHRyaWJ1dGVTZXQucHV0KCJleHBpcmVzIiwgbmV3IFNldHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIENtaXNIdHRwQ29va2llIGNvb2tpZSkgewotICAgICAgICAgICAgICAgIGNvb2tpZS5zZXRWZXJzaW9uKDApOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVNldC5nZXQoInZlcnNpb24iKS5zZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVTZXQuZ2V0KCJtYXgtYWdlIikuaXNTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVTZXQuZ2V0KCJtYXgtYWdlIikuc2V0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoISJlbiIuZXF1YWxzSWdub3JlQ2FzZShMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuc2V0TWF4QWdlKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gRGF0ZVRpbWVIZWxwZXIucGFyc2VIdHRwRGF0ZVRpbWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb29raWUuc2V0TWF4QWdlKChkYXRlLmdldFRpbWUoKSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSAvIDEwMDApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLnNldE1heEFnZSgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICB2b2lkIHZhbGlkYXRlKFN0cmluZyB2LCBDbWlzSHR0cENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgYSBjb29raWUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLgotICAgICAqIAotICAgICAqIFRoZSBuYW1lIGF0dHJpYnV0ZSBjYW4ganVzdCBjb250YWluIEFTQ0lJIGNoYXJhY3RlcnMsIHdoaWNoIGlzIGltbXV0YWJsZQotICAgICAqIGFmdGVyIGNyZWF0aW9uLiBDb21tYXMsIHdoaXRlIHNwYWNlIGFuZCBzZW1pY29sb25zIGFyZSBub3QgYWxsb3dlZC4gVGhlICQKLSAgICAgKiBjaGFyYWN0ZXIgaXMgYWxzbyBub3QgYWxsb3dlZCB0byBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuYW1lLgotICAgICAqIAotICAgICAqIFRoZSB2YWx1ZSBhdHRyaWJ1dGUgZGVwZW5kcyBvbiB3aGF0IHRoZSBzZXJ2ZXIgc2lkZSBpcyBpbnRlcmVzdGVkLiBUaGUKLSAgICAgKiBzZXRWYWx1ZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIGl0LgotICAgICAqIAotICAgICAqIFJGQyAyOTY1IGlzIHRoZSBkZWZhdWx0IGNvb2tpZSBzcGVjaWZpY2F0aW9uIG9mIHRoaXMgY2xhc3MuIElmIG9uZSB3YW50cwotICAgICAqIHRvIGNoYW5nZSB0aGUgdmVyc2lvbiBvZiB0aGUgY29va2llLCB0aGUgc2V0VmVyc2lvbiBtZXRob2QgaXMgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICAtIHRoZSBzcGVjaWZpYyBuYW1lIG9mIHRoZSBjb29raWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIC0gdGhlIHNwZWNpZmljIHZhbHVlIG9mIHRoZSBjb29raWUKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIC0gaWYgdGhlIG5hbWUgY29udGFpbnMgbm90LWFsbG93ZWQgb3IgcmVzZXJ2ZWQgY2hhcmFjdGVycwotICAgICAqIAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGUgdmFsdWUgb2YgbmFtZSBpcyBudWxsCi0gICAgICovCi0gICAgcHVibGljIENtaXNIdHRwQ29va2llKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIG50cmltID0gbmFtZS50cmltKCk7IC8vIGVyYXNlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2VzCi0gICAgICAgIGlmICghaXNWYWxpZE5hbWUobnRyaW0pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG5hbWUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm5hbWUgPSBudHJpbTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhdHRyVG9TdHJpbmcoU3RyaW5nQnVpbGRlciBidWlsZGVyLCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVmFsdWUpIHsKLSAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmIGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCckJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhdHRyTmFtZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPVwiIik7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhdHRyVmFsdWUpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoUVVPVEVfU1RSKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgY29va2llCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOwotICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgd2hldGhlciB0d28gY29va2llcyBhcmUgZXF1YWwuIFR3byBjb29raWVzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUKLSAgICAgKiB0aGUgc2FtZSBkb21haW4gYW5kIG5hbWUgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIG1vZGUgYW5kIHBhdGggaW4gYQotICAgICAqIGNhc2Utc2Vuc2l0aXZlIG1vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iagotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZC4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdHdvIGNvb2tpZXMgZXF1YWxzLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDbWlzSHR0cENvb2tpZSkgewotICAgICAgICAgICAgQ21pc0h0dHBDb29raWUgYW5vdGhlckNvb2tpZSA9IChDbWlzSHR0cENvb2tpZSkgb2JqOwotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShhbm90aGVyQ29va2llLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5vdGhlckRvbWFpbiA9IGFub3RoZXJDb29raWUuZ2V0RG9tYWluKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBlcXVhbHMgPSBkb21haW4gPT0gbnVsbCA/IGFub3RoZXJEb21haW4gPT0gbnVsbCA6IGRvbWFpbi5lcXVhbHNJZ25vcmVDYXNlKGFub3RoZXJEb21haW4pOwotICAgICAgICAgICAgICAgIGlmIChlcXVhbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFub3RoZXJQYXRoID0gYW5vdGhlckNvb2tpZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoID09IG51bGwgPyBhbm90aGVyUGF0aCA9PSBudWxsIDogcGF0aC5lcXVhbHMoYW5vdGhlclBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB0aGUgdmFsdWUgb2YgY29tbWVudCBhdHRyaWJ1dGUoc3BlY2lmaWVkIGluIFJGQyAyOTY1KSBvZiB0aGlzCi0gICAgICogY29va2llLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIGNvbW1lbnQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotICAgICAgICByZXR1cm4gY29tbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIHRoZSB2YWx1ZSBvZiBjb21tZW50VVJMIGF0dHJpYnV0ZShzcGVjaWZpZWQgaW4gUkZDIDI5NjUpIG9mIHRoaXMKLSAgICAgKiBjb29raWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgY29tbWVudFVSTCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRVUkwoKSB7Ci0gICAgICAgIHJldHVybiBjb21tZW50VVJMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgdGhlIHZhbHVlIG9mIGRpc2NhcmQgYXR0cmlidXRlKHNwZWNpZmllZCBpbiBSRkMgMjk2NSkgb2YgdGhpcwotICAgICAqIGNvb2tpZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGRpc2NhcmQgdmFsdWUgb2YgdGhpcyBjb29raWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREaXNjYXJkKCkgewotICAgICAgICByZXR1cm4gZGlzY2FyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXJzIHRoZSBkb21haW4gbmFtZSBmb3IgdGhpcyBjb29raWUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gUkZDCi0gICAgICogMjk2NQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRvbWFpbiB2YWx1ZSBvZiB0aGlzIGNvb2tpZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgewotICAgICAgICByZXR1cm4gZG9tYWluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1heC1BZ2UgdmFsdWUgYXMgc3BlY2lmaWVkIGluIFJGQyAyOTY1IG9mIHRoaXMgY29va2llLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIE1heC1BZ2UgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhBZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtYXhBZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB0aGUgbmFtZSBmb3IgdGhpcyBjb29raWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhpcyBjb29raWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgdGhlIHBhdGggcGFydCBvZiBhIHJlcXVlc3QgVVJMIHRvIHdoaWNoIHRoaXMgY29va2llIGlzIHJldHVybmVkLgotICAgICAqIFRoaXMgY29va2llIGlzIHZpc2libGUgdG8gYWxsIHN1YnBhdGhzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhdGggdXNlZCB0byByZXR1cm4gdGhlIGNvb2tpZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB0aGUgdmFsdWUgb2YgcG9ydCBhdHRyaWJ1dGUoc3BlY2lmaWVkIGluIFJGQyAyOTY1KSBvZiB0aGlzCi0gICAgICogY29va2llLgotICAgICAqIAotICAgICAqIEByZXR1cm4gcG9ydCBsaXN0IG9mIHRoaXMgY29va2llCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3J0bGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnRMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgdHJ1ZSBpZiB0aGUgYnJvd3NlciBvbmx5IHNlbmRzIGNvb2tpZXMgb3ZlciBhIHNlY3VyZSBwcm90b2NvbC4KLSAgICAgKiBGYWxzZSBpZiBjYW4gc2VuZCBjb29raWVzIHRocm91Z2ggYW55IHByb3RvY29scy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2VuZHMgY29va2llcyBvbmx5IHRocm91Z2ggc2VjdXJlIHByb3RvY29sLCBmYWxzZQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0U2VjdXJlKCkgewotICAgICAgICByZXR1cm4gc2VjdXJlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgdGhlIHZhbHVlIG9mIHRoaXMgY29va2llLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgY29va2llCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGlzIGNvb2tpZQotICAgICAqIAotICAgICAqIEByZXR1cm4gMCBpbmRpY2F0ZXMgdGhlIG9yaWdpbmFsIE5ldHNjYXBlIGNvb2tpZSBzcGVjaWZpY2F0aW9uLCB3aGlsZSAxCi0gICAgICogICAgICAgICBpbmRpY2F0ZXMgUkZDIDI5NjUvMjEwOSBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB3aGV0aGVyIHRoZSBjb29raWUgaGFzIGV4cGlyZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlzIHRoZSBjb29raWUgaGFzIGV4cGlyZWQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0V4cGlyZWQoKSB7Ci0gICAgICAgIC8vIC0xIGluZGljYXRlcyB0aGUgY29va2llIHdpbGwgcGVyc2lzdCB1bnRpbCBicm93c2VyIHNodXRkb3duCi0gICAgICAgIC8vIHNvIHRoZSBjb29raWUgaXMgbm90IGV4cGlyZWQuCi0gICAgICAgIGlmIChtYXhBZ2UgPT0gLTFMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGV4cGlyZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1heEFnZSA8PSAwTCkgewotICAgICAgICAgICAgZXhwaXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4cGlyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyBoYXNoIGNvZGUgb2YgdGhpcyBodHRwIGNvb2tpZS4gVGhlIHJlc3VsdCBpcyBjYWxjdWxhdGVkIGFzIGJlbG93OgotICAgICAqIAotICAgICAqIGdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmhhc2hDb2RlKCkgKyBnZXREb21haW4oKS50b0xvd2VyQ2FzZSgpLmhhc2hDb2RlKCkKLSAgICAgKiArIGdldFBhdGgoKS5oYXNoQ29kZSgpCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBjb2RlIG9mIHRoaXMgY29va2llCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gbmFtZS50b0xvd2VyQ2FzZSgpLmhhc2hDb2RlKCk7Ci0gICAgICAgIGhhc2hDb2RlICs9IGRvbWFpbiA9PSBudWxsID8gMCA6IGRvbWFpbi50b0xvd2VyQ2FzZSgpLmhhc2hDb2RlKCk7Ci0gICAgICAgIGhhc2hDb2RlICs9IHBhdGggPT0gbnVsbCA/IDAgOiBwYXRoLmhhc2hDb2RlKCk7Ci0gICAgICAgIHJldHVybiBoYXNoQ29kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE5hbWUoU3RyaW5nIG4pIHsKLSAgICAgICAgLy8gbmFtZSBjYW5ub3QgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCAnJCcgb3IgZXF1YWxzIHRoZSByZXNlcnZlZAotICAgICAgICAvLyBhdHRyaWJ1dGVzIChjYXNlLWluc2Vuc2l0aXZlKQotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSAhKG4ubGVuZ3RoKCkgPT0gMCB8fCBuLmNoYXJBdCgwKSA9PSAnJCcgfHwgYXR0cmlidXRlU2V0LmNvbnRhaW5zS2V5KG4udG9Mb3dlckNhc2UoKSkpOwotICAgICAgICBpZiAoaXNWYWxpZCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIG5hbWVDaGFyID0gbi5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgLy8gbmFtZSBtdXN0IGJlIEFTQ0lJIGNoYXJhY3RlcnMgYW5kIGNhbm5vdCBjb250YWluICc7JywgJywnIGFuZAotICAgICAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICBpZiAobmFtZUNoYXIgPCAwIHx8IG5hbWVDaGFyID49IDEyNyB8fCBuYW1lQ2hhciA9PSAnOycgfHwgbmFtZUNoYXIgPT0gJywnCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShuYW1lQ2hhcikgJiYgbmFtZUNoYXIgIT0gJyAnKSkgewotICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc1ZhbGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgY29tbWVudCBhdHRyaWJ1dGUoc3BlY2lmaWVkIGluIFJGQyAyOTY1KSBvZiB0aGlzIGNvb2tpZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHVycG9zZQotICAgICAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgdmFsdWUgdG8gYmUgc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgcHVycG9zZSkgewotICAgICAgICBjb21tZW50ID0gcHVycG9zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGNvbW1lbnRVUkwgYXR0cmlidXRlKHNwZWNpZmllZCBpbiBSRkMgMjk2NSkgb2YgdGhpcwotICAgICAqIGNvb2tpZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHVycG9zZQotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIG9mIGNvbW1lbnRVUkwgYXR0cmlidXRlIHRvIGJlIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRVUkwoU3RyaW5nIHB1cnBvc2UpIHsKLSAgICAgICAgY29tbWVudFVSTCA9IHB1cnBvc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBkaXNjYXJkIGF0dHJpYnV0ZShzcGVjaWZpZWQgaW4gUkZDIDI5NjUpIG9mIHRoaXMgY29va2llLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkaXNjYXJkCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgZm9yIGRpc2NhcmQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGlzY2FyZChib29sZWFuIGRpc2NhcmQpIHsKLSAgICAgICAgdGhpcy5kaXNjYXJkID0gZGlzY2FyZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRvbWFpbiB2YWx1ZSBmb3IgdGhpcyBjb29raWUuIEJyb3dzZXJzIHNlbmQgdGhlIGNvb2tpZSB0byB0aGUKLSAgICAgKiBkb21haW4gc3BlY2lmaWVkIGJ5IHRoaXMgdmFsdWUuIFRoZSBmb3JtIG9mIHRoZSBkb21haW4gaXMgc3BlY2lmaWVkIGluCi0gICAgICogUkZDIDI5NjUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdHRlcm4KLSAgICAgKiAgICAgICAgICAgIHRoZSBkb21haW4gcGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgcGF0dGVybikgewotICAgICAgICBkb21haW4gPSBwYXR0ZXJuID09IG51bGwgPyBudWxsIDogcGF0dGVybi50b0xvd2VyQ2FzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIE1heC1BZ2UgdmFsdWUgYXMgc3BlY2lmaWVkIGluIFJGQyAyOTY1IG9mIHRoaXMgY29va2llIHRvIGV4cGlyZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXhwaXJ5Ci0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIE1heC1BZ2UgdmFsdWUgb2YgdGhpcyBjb29raWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhBZ2UobG9uZyBleHBpcnkpIHsKLSAgICAgICAgbWF4QWdlID0gZXhwaXJ5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCB0byB3aGljaCB0aGlzIGNvb2tpZSBpcyByZXR1cm5lZC4gVGhpcyBjb29raWUgaXMgdmlzaWJsZSB0bwotICAgICAqIGFsbCB0aGUgcGFnZXMgdW5kZXIgdGhlIHBhdGggYW5kIGFsbCBzdWJwYXRocy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGggdG8gd2hpY2ggdGhpcyBjb29raWUgaXMgcmV0dXJuZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBwb3J0IGF0dHJpYnV0ZShzcGVjaWZpZWQgaW4gUkZDIDI5NjUpIG9mIHRoaXMgY29va2llLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwb3J0cwotICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIGZvciBwb3J0IGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnRsaXN0KFN0cmluZyBwb3J0cykgewotICAgICAgICBwb3J0TGlzdCA9IHBvcnRzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSGFuZGxlIDIgc3BlY2lhbCBjYXNlczogMS4gdmFsdWUgaXMgd3JhcHBlZCBieSBhIHF1b3RhdGlvbiAyLiB2YWx1ZQotICAgICAqIGNvbnRhaW5zIGNvbW1hCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBUZWxscyB0aGUgYnJvd3NlciB3aGV0aGVyIHRoZSBjb29raWVzIHNob3VsZCBiZSBzZW50IHRvIHNlcnZlciB0aHJvdWdoCi0gICAgICogc2VjdXJlIHByb3RvY29scy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmxhZwotICAgICAqICAgICAgICAgICAgdGVsbHMgYnJvd3NlciB0byBzZW5kIGNvb2tpZSB0byBzZXJ2ZXIgb25seSB0aHJvdWdoIHNlY3VyZQotICAgICAqICAgICAgICAgICAgcHJvdG9jb2wgaWYgZmxhZyBpcyB0cnVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VjdXJlKGJvb2xlYW4gZmxhZykgewotICAgICAgICBzZWN1cmUgPSBmbGFnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGlzIGNvb2tpZSBhZnRlciBpdCBoYXMgYmVlbiBpbnN0YW50aWF0ZWQuIFN0cmluZwotICAgICAqIG5ld1ZhbHVlIGNhbiBiZSBpbiBCQVNFNjQgZm9ybS4gSWYgdGhlIHZlcnNpb24gb2YgdGhlIGNvb2tpZSBpcyAwLAotICAgICAqIHNwZWNpYWwgdmFsdWUgYXM6IHdoaXRlIHNwYWNlLCBicmFja2V0cywgcGFyZW50aGVzZXMsIGVxdWFscyBzaWducywKLSAgICAgKiBjb21tYXMsIGRvdWJsZSBxdW90ZXMsIHNsYXNoZXMsIHF1ZXN0aW9uIG1hcmtzLCBhdCBzaWducywgY29sb25zLCBhbmQKLSAgICAgKiBzZW1pY29sb25zIGFyZSBub3QgcmVjb21tZW5kZWQuIEVtcHR5IHZhbHVlcyBtYXkgbGVhZCB0byBkaWZmZXJlbnQKLSAgICAgKiBiZWhhdmlvciBvbiBkaWZmZXJlbnQgYnJvd3NlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5ld1ZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUgZm9yIHRoaXMgY29va2llCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBBY2NvcmRpbmcgdG8gc3BlYywgdmVyc2lvbiAwIGNvb2tpZSB2YWx1ZSBkb2VzIG5vdCBhbGxvdyBtYW55Ci0gICAgICAgIC8vIHN5bWJvbHMuIEJ1dCBSSSBkb2VzIG5vdCBpbXBsZW1lbnQgaXQuIEZvbGxvdyBSSSB0ZW1wb3JhcmlseS4KLSAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjb29raWUuIDAgaW5kaWNhdGVzIHRoZSBvcmlnaW5hbCBOZXRzY2FwZSBjb29raWUKLSAgICAgKiBzcGVjaWZpY2F0aW9uLCB3aGlsZSAxIGluZGljYXRlcyBSRkMgMjk2NS8yMTA5IHNwZWNpZmljYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHYKLSAgICAgKiAgICAgICAgICAgIDAgb3IgMSBhcyBzdGF0ZWQgYWJvdmUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHYgaXMgbmVpdGhlciAwIG5vciAxCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdikgewotICAgICAgICBpZiAodiAhPSAwICYmIHYgIT0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB2ZXJzaW9uISIpOwotICAgICAgICB9Ci0gICAgICAgIHZlcnNpb24gPSB2OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgdG8gcmVwcmVzZW50IHRoZSBjb29raWUuIFRoZSBmb3JtYXQgb2Ygc3RyaW5nIGZvbGxvd3MKLSAgICAgKiB0aGUgY29va2llIHNwZWNpZmljYXRpb24uIFRoZSBsZWFkaW5nIHRva2VuICJDb29raWUiIGlzIG5vdCBpbmNsdWRlZAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyBmb3JtYXQgb2YgdGhlIGNvb2tpZSBvYmplY3QKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNvb2tpZVN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGNvb2tpZVN0ci5hcHBlbmQobmFtZSk7Ci0gICAgICAgIGNvb2tpZVN0ci5hcHBlbmQoJz0nKTsKLSAgICAgICAgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICAgICAgY29va2llU3RyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgICAgICBjb29raWVTdHIuYXBwZW5kKFFVT1RFX1NUUik7Ci0gICAgICAgICAgICBjb29raWVTdHIuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgIGNvb2tpZVN0ci5hcHBlbmQoUVVPVEVfU1RSKTsKLQotICAgICAgICAgICAgYXR0clRvU3RyaW5nKGNvb2tpZVN0ciwgIlBhdGgiLCBwYXRoKTsKLSAgICAgICAgICAgIGF0dHJUb1N0cmluZyhjb29raWVTdHIsICJEb21haW4iLCBkb21haW4pOwotICAgICAgICAgICAgYXR0clRvU3RyaW5nKGNvb2tpZVN0ciwgIlBvcnQiLCBwb3J0TGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29va2llU3RyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0Fic3RyYWN0QXBhY2hlQ2xpZW50SHR0cEludm9rZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9BYnN0cmFjdEFwYWNoZUNsaWVudEh0dHBJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2VmNjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0Fic3RyYWN0QXBhY2hlQ2xpZW50SHR0cEludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db2xsZWN0aW9uc0hlbHBlci5pc05vdEVtcHR5OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNsaWVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuQ21pc0JpbmRpbmdzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cERlbGV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFJlcXVlc3RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5YNTA5SG9zdG5hbWVWZXJpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkFic3RyYWN0SHR0cEVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuRGVmYXVsdEh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5CYXNpY0h0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwQ29ubmVjdGlvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUHJvdG9jb2xQYXJhbXM7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBBIHtAbGluayBIdHRwSW52b2tlcn0gdGhhdCB1c2VzIFRoZSBBcGFjaGUgSFRUUCBjbGllbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFwYWNoZUNsaWVudEh0dHBJbnZva2VyIGltcGxlbWVudHMgSHR0cEludm9rZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RBcGFjaGVDbGllbnRIdHRwSW52b2tlci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0NMSUVOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHAuQXBhY2hlQ2xpZW50SHR0cEludm9rZXIuaHR0cENsaWVudCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAyICogMTAyNCAqIDEwMjQ7Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlR0VUKFVybEJ1aWxkZXIgdXJsLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UodXJsLCAiR0VUIiwgbnVsbCwgbnVsbCwgbnVsbCwgc2Vzc2lvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZUdFVChVcmxCdWlsZGVyIHVybCwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQmlnSW50ZWdlciBvZmZzZXQsIEJpZ0ludGVnZXIgbGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UodXJsLCAiR0VUIiwgbnVsbCwgbnVsbCwgbnVsbCwgc2Vzc2lvbiwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZSBpbnZva2VQT1NUKFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgY29udGVudFR5cGUsIE91dHB1dCB3cml0ZXIsIEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgcmV0dXJuIGludm9rZSh1cmwsICJQT1NUIiwgY29udGVudFR5cGUsIG51bGwsIHdyaXRlciwgc2Vzc2lvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZVBVVChVcmxCdWlsZGVyIHVybCwgU3RyaW5nIGNvbnRlbnRUeXBlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIE91dHB1dCB3cml0ZXIsCi0gICAgICAgICAgICBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UodXJsLCAiUFVUIiwgY29udGVudFR5cGUsIGhlYWRlcnMsIHdyaXRlciwgc2Vzc2lvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZURFTEVURShVcmxCdWlsZGVyIHVybCwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICByZXR1cm4gaW52b2tlKHVybCwgIkRFTEVURSIsIG51bGwsIG51bGwsIG51bGwsIHNlc3Npb24sIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSZXNwb25zZSBpbnZva2UoVXJsQnVpbGRlciB1cmwsIFN0cmluZyBtZXRob2QsIFN0cmluZyBjb250ZW50VHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAotICAgICAgICAgICAgZmluYWwgT3V0cHV0IHdyaXRlciwgZmluYWwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQmlnSW50ZWdlciBvZmZzZXQsIEJpZ0ludGVnZXIgbGVuZ3RoKSB7Ci0gICAgICAgIGludCByZXNwQ29kZSA9IC0xOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBsb2cgYmVmb3JlIGNvbm5lY3QKLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiU2Vzc2lvbiB7fToge30ge30iLCBzZXNzaW9uLmdldFNlc3Npb25JZCgpLCBtZXRob2QsIHVybCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCBIVFRQIGNsaWVudCBvYmplY3QgZnJvbSBzZXNzaW9uCi0gICAgICAgICAgICBEZWZhdWx0SHR0cENsaWVudCBodHRwY2xpZW50ID0gKERlZmF1bHRIdHRwQ2xpZW50KSBzZXNzaW9uLmdldChIVFRQX0NMSUVOVCk7Ci0gICAgICAgICAgICBpZiAoaHR0cGNsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi53cml0ZUxvY2soKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBodHRwY2xpZW50ID0gKERlZmF1bHRIdHRwQ2xpZW50KSBzZXNzaW9uLmdldChIVFRQX0NMSUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChodHRwY2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBjbGllbnQgPSBjcmVhdGVIdHRwQ2xpZW50KHVybCwgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnB1dChIVFRQX0NMSUVOVCwgaHR0cGNsaWVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLndyaXRlVW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBIdHRwUmVxdWVzdEJhc2UgcmVxdWVzdCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICgiR0VUIi5lcXVhbHMobWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgSHR0cEdldCh1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJQT1NUIi5lcXVhbHMobWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgSHR0cFBvc3QodXJsLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgiUFVUIi5lcXVhbHMobWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgSHR0cFB1dCh1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJERUxFVEUiLmVxdWFscyhtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBIdHRwRGVsZXRlKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIEhUVFAgbWV0aG9kISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgY29udGVudCB0eXBlCi0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZXQgb3RoZXIgaGVhZGVycwotICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRIZWFkZXIoaGVhZGVyLmdldEtleSgpLCBoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGUKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aFByb3ZpZGVyID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoc2Vzc2lvbik7Ci0gICAgICAgICAgICBpZiAoYXV0aFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGh0dHBIZWFkZXJzID0gYXV0aFByb3ZpZGVyLmdldEhUVFBIZWFkZXJzKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoaHR0cEhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVyIDogaHR0cEhlYWRlcnMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlci5nZXRLZXkoKSAhPSBudWxsICYmIGlzTm90RW1wdHkoaGVhZGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGhlYWRlci5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoInVzZXItYWdlbnQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEhlYWRlcigiVXNlci1BZ2VudCIsIGhlYWRlci5nZXRWYWx1ZSgpLmdldCgwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBoZWFkZXIuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZEhlYWRlcihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmFuZ2UKLSAgICAgICAgICAgIGlmICgob2Zmc2V0ICE9IG51bGwpIHx8IChsZW5ndGggIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImJ5dGVzPSIpOwotCi0gICAgICAgICAgICAgICAgaWYgKChvZmZzZXQgPT0gbnVsbCkgfHwgKG9mZnNldC5zaWdudW0oKSA9PSAtMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvZmZzZXQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCctJyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGxlbmd0aCAhPSBudWxsKSAmJiAobGVuZ3RoLnNpZ251bSgpID09IDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvZmZzZXQuYWRkKGxlbmd0aC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCJSYW5nZSIsIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb21wcmVzc2lvbgotICAgICAgICAgICAgT2JqZWN0IGNvbXByZXNzaW9uID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DT01QUkVTU0lPTik7Ci0gICAgICAgICAgICBpZiAoKGNvbXByZXNzaW9uICE9IG51bGwpICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKGNvbXByZXNzaW9uLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRIZWFkZXIoIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLGRlZmxhdGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9jYWxlCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXQoQ21pc0JpbmRpbmdzSGVscGVyLkFDQ0VQVF9MQU5HVUFHRSkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnNldEhlYWRlcigiQWNjZXB0LUxhbmd1YWdlIiwgc2Vzc2lvbi5nZXQoQ21pc0JpbmRpbmdzSGVscGVyLkFDQ0VQVF9MQU5HVUFHRSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNlbmQgZGF0YQotICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGNsaWVudENvbXByZXNzaW9uID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DTElFTlRfQ09NUFJFU1NJT04pOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2xpZW50Q29tcHJlc3Npb25GbGFnID0gKGNsaWVudENvbXByZXNzaW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBCb29sZWFuLnBhcnNlQm9vbGVhbihjbGllbnRDb21wcmVzc2lvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50Q29tcHJlc3Npb25GbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0SGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdEh0dHBFbnRpdHkgc3RyZWFtRW50aXR5ID0gbmV3IEFic3RyYWN0SHR0cEVudGl0eSgpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2h1bmtlZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RyZWFtaW5nKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gY29ubk91dCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRDb21wcmVzc2lvbkZsYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uT3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0ob3V0c3RyZWFtLCA0MDk2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubk91dCA9IG91dHN0cmVhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShjb25uT3V0LCBCVUZGRVJfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5PdXQgaW5zdGFuY2VvZiBHWklQT3V0cHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChHWklQT3V0cHV0U3RyZWFtKSBjb25uT3V0KS5maW5pc2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgKChIdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdEJhc2UpIHJlcXVlc3QpLnNldEVudGl0eShzdHJlYW1FbnRpdHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb25uZWN0Ci0gICAgICAgICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwY2xpZW50LmV4ZWN1dGUocmVxdWVzdCk7Ci0gICAgICAgICAgICBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOwotCi0gICAgICAgICAgICAvLyBnZXQgc3RyZWFtLCBpZiBwcmVzZW50Ci0gICAgICAgICAgICByZXNwQ29kZSA9IHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmICgocmVzcENvZGUgPT0gMjAwKSB8fCAocmVzcENvZGUgPT0gMjAxKSB8fCAocmVzcENvZGUgPT0gMjAzKSB8fCAocmVzcENvZGUgPT0gMjA2KSkgewotICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGVudGl0eS5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yU3RyZWFtID0gZW50aXR5LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb2xsZWN0IGhlYWRlcnMKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcmVzcG9uc2VIZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgICAgICBmb3IgKEhlYWRlciBoZWFkZXIgOiByZXNwb25zZS5nZXRBbGxIZWFkZXJzKCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gcmVzcG9uc2VIZWFkZXJzLmdldChoZWFkZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVycy5wdXQoaGVhZGVyLmdldE5hbWUoKSwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWVzLmFkZChoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvZyBhZnRlciBjb25uZWN0Ci0gICAgICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cudHJhY2UoIlNlc3Npb24ge306IHt9IHt9ID4gSGVhZGVyczoge30iLCBzZXNzaW9uLmdldFNlc3Npb25JZCgpLCBtZXRob2QsIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVycy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZm9yd2FyZCByZXNwb25zZSBIVFRQIGhlYWRlcnMKLSAgICAgICAgICAgIGlmIChhdXRoUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF1dGhQcm92aWRlci5wdXRSZXNwb25zZUhlYWRlcnModXJsLnRvU3RyaW5nKCksIHJlc3BDb2RlLCByZXNwb25zZUhlYWRlcnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHJlc3BvbnNlCi0gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BDb2RlLCByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0UmVhc29uUGhyYXNlKCksIHJlc3BvbnNlSGVhZGVycywgaW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIGVycm9yU3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIHN0YXR1cyA9IChyZXNwQ29kZSA+IDAgPyAiIChIVFRQIHN0YXR1cyBjb2RlICIgKyByZXNwQ29kZSArICIpIiA6ICIiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGFjY2VzcyBcIiIgKyB1cmwgKyAiXCIiICsgc3RhdHVzICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgZGVmYXVsdCBwYXJhbXMgZm9yIHRoZSBBcGFjaGUgSFRUUCBDbGllbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEh0dHBQYXJhbXMgY3JlYXRlRGVmYXVsdEh0dHBQYXJhbXMoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBIdHRwUGFyYW1zIHBhcmFtcyA9IG5ldyBCYXNpY0h0dHBQYXJhbXMoKTsKLQotICAgICAgICBIdHRwUHJvdG9jb2xQYXJhbXMuc2V0VmVyc2lvbihwYXJhbXMsIEh0dHBWZXJzaW9uLkhUVFBfMV8xKTsKLSAgICAgICAgSHR0cFByb3RvY29sUGFyYW1zLnNldFVzZXJBZ2VudChwYXJhbXMsIENsaWVudFZlcnNpb24uT1BFTkNNSVNfQ0xJRU5UKTsKLSAgICAgICAgSHR0cFByb3RvY29sUGFyYW1zLnNldENvbnRlbnRDaGFyc2V0KHBhcmFtcywgSU9VdGlscy5VVEY4KTsKLSAgICAgICAgSHR0cFByb3RvY29sUGFyYW1zLnNldFVzZUV4cGVjdENvbnRpbnVlKHBhcmFtcywgdHJ1ZSk7Ci0KLSAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0U3RhbGVDaGVja2luZ0VuYWJsZWQocGFyYW1zLCB0cnVlKTsKLQotICAgICAgICBpbnQgY29ubmVjdFRpbWVvdXQgPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkNPTk5FQ1RfVElNRU9VVCwgLTEpOwotICAgICAgICBpZiAoY29ubmVjdFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQocGFyYW1zLCBjb25uZWN0VGltZW91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgcmVhZFRpbWVvdXQgPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLlJFQURfVElNRU9VVCwgLTEpOwotICAgICAgICBpZiAocmVhZFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0U29UaW1lb3V0KHBhcmFtcywgcmVhZFRpbWVvdXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyBhIGhvc3RuYW1lIHdpdGggdGhlIGdpdmVuIHZlcmlmaWVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeShIb3N0bmFtZVZlcmlmaWVyIHZlcmlmaWVyLCBTdHJpbmcgaG9zdCwgU1NMU29ja2V0IHNzbFNvY2tldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh2ZXJpZmllciBpbnN0YW5jZW9mIFg1MDlIb3N0bmFtZVZlcmlmaWVyKSB7Ci0gICAgICAgICAgICAgICAgKChYNTA5SG9zdG5hbWVWZXJpZmllcikgdmVyaWZpZXIpLnZlcmlmeShob3N0LCBzc2xTb2NrZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIXZlcmlmaWVyLnZlcmlmeShob3N0LCBzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NMRXhjZXB0aW9uKCJIb3N0bmFtZSBpbiBjZXJ0aWZpY2F0ZSBkaWRuJ3QgbWF0Y2g6IDwiICsgaG9zdCArICI+Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGNsb3NlU29ja2V0KHNzbFNvY2tldCk7Ci0gICAgICAgICAgICB0aHJvdyBpb2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIGdpdmVuIHNvY2tldCBhbmQgaWdub3JlcyBleGNlcHRpb25zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlU29ja2V0KFNvY2tldCBzb2NrZXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUge0BsaW5rIEh0dHBDbGllbnR9IGluc3RhbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBEZWZhdWx0SHR0cENsaWVudCBjcmVhdGVIdHRwQ2xpZW50KFVybEJ1aWxkZXIgdXJsLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9BcGFjaGVDbGllbnRIdHRwSW52b2tlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0FwYWNoZUNsaWVudEh0dHBJbnZva2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTJjOWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0FwYWNoZUNsaWVudEh0dHBJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXI7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXQ7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuQ21pc0JpbmRpbmdzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnBhcmFtcy5DbGllbnRQTmFtZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5wYXJhbXMuQ29va2llUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3RUaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLkh0dHBJbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zY2hlbWUuUGxhaW5Tb2NrZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZUxheWVyZWRTb2NrZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNjaGVtZS5TY2hlbWVSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQnJvd3NlckNvbXBhdEhvc3RuYW1lVmVyaWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlg1MDlIb3N0bmFtZVZlcmlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdDbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlByb3h5U2VsZWN0b3JSb3V0ZVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwQ29ubmVjdGlvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7Ci0KLS8qKgotICogQSB7QGxpbmsgSHR0cEludm9rZXJ9IHRoYXQgdXNlcyBUaGUgQXBhY2hlIEhUVFAgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgQXBhY2hlQ2xpZW50SHR0cEludm9rZXIgZXh0ZW5kcyBBYnN0cmFjdEFwYWNoZUNsaWVudEh0dHBJbnZva2VyIHsKLQotICAgIHByb3RlY3RlZCBEZWZhdWx0SHR0cENsaWVudCBjcmVhdGVIdHRwQ2xpZW50KFVybEJ1aWxkZXIgdXJsLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIC8vIHNldCBwYXJhbXMKLSAgICAgICAgSHR0cFBhcmFtcyBwYXJhbXMgPSBjcmVhdGVEZWZhdWx0SHR0cFBhcmFtcyhzZXNzaW9uKTsKLSAgICAgICAgcGFyYW1zLnNldFBhcmFtZXRlcihDbGllbnRQTmFtZXMuQ09PS0lFX1BPTElDWSwgQ29va2llUG9saWN5LklHTk9SRV9DT09LSUVTKTsKLQotICAgICAgICAvLyBzZXQgdXAgc2NoZW1lIHJlZ2lzdHJ5IGFuZCBjb25uZWN0aW9uIG1hbmFnZXIKLSAgICAgICAgU2NoZW1lUmVnaXN0cnkgcmVnaXN0cnkgPSBuZXcgU2NoZW1lUmVnaXN0cnkoKTsKLSAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIobmV3IFNjaGVtZSgiaHR0cCIsIDgwLCBQbGFpblNvY2tldEZhY3RvcnkuZ2V0U29ja2V0RmFjdG9yeSgpKSk7Ci0gICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKG5ldyBTY2hlbWUoImh0dHBzIiwgNDQzLCBnZXRTU0xTb2NrZXRGYWN0b3J5KHVybCwgc2Vzc2lvbikpKTsKLQotICAgICAgICAvLyBzZXQgdXAgY29ubmVjdGlvbiBtYW5hZ2VyCi0gICAgICAgIFBvb2xpbmdDbGllbnRDb25uZWN0aW9uTWFuYWdlciBjb25uTWFuYWdlciA9IG5ldyBQb29saW5nQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIocmVnaXN0cnkpOwotCi0gICAgICAgIC8vIHNldCBtYXggY29ubmVjdGlvbiBhCi0gICAgICAgIFN0cmluZyBrZWVwQWxpdmVTdHIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAua2VlcEFsaXZlIiwgInRydWUiKTsKLSAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGtlZXBBbGl2ZVN0cikpIHsKLSAgICAgICAgICAgIFN0cmluZyBtYXhDb25uU3RyID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLm1heENvbm5lY3Rpb25zIiwgIjUiKTsKLSAgICAgICAgICAgIGludCBtYXhDb25uID0gNTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWF4Q29ubiA9IEludGVnZXIucGFyc2VJbnQobWF4Q29ublN0cik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25uTWFuYWdlci5zZXREZWZhdWx0TWF4UGVyUm91dGUobWF4Q29ubik7Ci0gICAgICAgICAgICBjb25uTWFuYWdlci5zZXRNYXhUb3RhbCg0ICogbWF4Q29ubik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdXAgcHJveHkKLSAgICAgICAgUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lciByb3V0ZVBsYW5uZXIgPSBuZXcgUHJveHlTZWxlY3RvclJvdXRlUGxhbm5lcihyZWdpc3RyeSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIGNsaWVudAotICAgICAgICBEZWZhdWx0SHR0cENsaWVudCBodHRwY2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KGNvbm5NYW5hZ2VyLCBwYXJhbXMpOwotICAgICAgICBodHRwY2xpZW50LnNldFJvdXRlUGxhbm5lcihyb3V0ZVBsYW5uZXIpOwotCi0gICAgICAgIHJldHVybiBodHRwY2xpZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkcyBhIFNTTCBTb2NrZXQgRmFjdG9yeSBmb3IgdGhlIEFwYWNoZSBIVFRQIENsaWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNjaGVtZUxheWVyZWRTb2NrZXRGYWN0b3J5IGdldFNTTFNvY2tldEZhY3RvcnkoZmluYWwgVXJsQnVpbGRlciB1cmwsIGZpbmFsIEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgLy8gZ2V0IGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyCi0gICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aFByb3ZpZGVyID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoc2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gY2hlY2sgU1NMIFNvY2tldCBGYWN0b3J5Ci0gICAgICAgIGZpbmFsIFNTTFNvY2tldEZhY3Rvcnkgc2YgPSBhdXRoUHJvdmlkZXIuZ2V0U1NMU29ja2V0RmFjdG9yeSgpOwotICAgICAgICBpZiAoc2YgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbm8gY3VzdG9tIGZhY3RvcnkgLT4gcmV0dXJuIGRlZmF1bHQgZmFjdG9yeQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xTb2NrZXRGYWN0b3J5LmdldFNvY2tldEZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGhvc3RhbWUgdmVyaWZpZXIgYW5kIHVzZSBkZWZhdWx0IGlmIG5vdCBzZXQKLSAgICAgICAgZmluYWwgSG9zdG5hbWVWZXJpZmllciBodiA9IChhdXRoUHJvdmlkZXIuZ2V0SG9zdG5hbWVWZXJpZmllcigpID09IG51bGwgPyBuZXcgQnJvd3NlckNvbXBhdEhvc3RuYW1lVmVyaWZpZXIoKQotICAgICAgICAgICAgICAgIDogYXV0aFByb3ZpZGVyLmdldEhvc3RuYW1lVmVyaWZpZXIoKSk7Ci0KLSAgICAgICAgaWYgKGh2IGluc3RhbmNlb2YgWDUwOUhvc3RuYW1lVmVyaWZpZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlNTTFNvY2tldEZhY3Rvcnkoc2YsIChYNTA5SG9zdG5hbWVWZXJpZmllcikgaHYpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgbmV3IHNvY2tldCBmYWN0b3J5Ci0gICAgICAgIHJldHVybiBuZXcgU2NoZW1lTGF5ZXJlZFNvY2tldEZhY3RvcnkoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKFNvY2tldCBzb2NrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTb2NrZXQgY3JlYXRlU29ja2V0KEh0dHBQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHJldHVybiBzZi5jcmVhdGVTb2NrZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFNvY2tldCBjb25uZWN0U29ja2V0KGZpbmFsIFNvY2tldCBzb2NrZXQsIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGxvY2FsQWRkcmVzcywgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBTb2NrZXQgc29jayA9IChzb2NrZXQgIT0gbnVsbCA/IHNvY2tldCA6IGNyZWF0ZVNvY2tldChwYXJhbXMpKTsKLSAgICAgICAgICAgICAgICBpZiAobG9jYWxBZGRyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc29jay5zZXRSZXVzZUFkZHJlc3MoSHR0cENvbm5lY3Rpb25QYXJhbXMuZ2V0U29SZXVzZWFkZHIocGFyYW1zKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2suYmluZChsb2NhbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBjb25uVGltZW91dCA9IEh0dHBDb25uZWN0aW9uUGFyYW1zLmdldENvbm5lY3Rpb25UaW1lb3V0KHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgaW50IHNvVGltZW91dCA9IEh0dHBDb25uZWN0aW9uUGFyYW1zLmdldFNvVGltZW91dChwYXJhbXMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc29jay5zZXRTb1RpbWVvdXQoc29UaW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgc29jay5jb25uZWN0KHJlbW90ZUFkZHJlc3MsIGNvbm5UaW1lb3V0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlU29ja2V0KHNvY2spOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ubmVjdFRpbWVvdXRFeGNlcHRpb24oIkNvbm5lY3QgdG8gIiArIHJlbW90ZUFkZHJlc3MgKyAiIHRpbWVkIG91dCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdDsKLSAgICAgICAgICAgICAgICBpZiAocmVtb3RlQWRkcmVzcyBpbnN0YW5jZW9mIEh0dHBJbmV0U29ja2V0QWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICBob3N0ID0gKChIdHRwSW5ldFNvY2tldEFkZHJlc3MpIHJlbW90ZUFkZHJlc3MpLmdldEh0dHBIb3N0KCkuZ2V0SG9zdE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBob3N0ID0gcmVtb3RlQWRkcmVzcy5nZXRIb3N0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHNvY2sgaW5zdGFuY2VvZiBTU0xTb2NrZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NsU29ja2V0ID0gKFNTTFNvY2tldCkgc29jazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IHJlbW90ZUFkZHJlc3MuZ2V0UG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KSBzZi5jcmVhdGVTb2NrZXQoc29jaywgaG9zdCwgcG9ydCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZlcmlmeShodiwgaG9zdCwgc3NsU29ja2V0KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBzc2xTb2NrZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTb2NrZXQgY3JlYXRlTGF5ZXJlZFNvY2tldChmaW5hbCBTb2NrZXQgc29ja2V0LCBmaW5hbCBTdHJpbmcgaG9zdCwgZmluYWwgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KSBzZi5jcmVhdGVTb2NrZXQoc29ja2V0LCBob3N0LCBwb3J0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB2ZXJpZnkoaHYsIGhvc3QsIHNzbFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3NsU29ja2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9EZWZhdWx0SHR0cEludm9rZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9EZWZhdWx0SHR0cEludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZDliMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2h0dHAvRGVmYXVsdEh0dHBJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXI7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuQ2xpZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5DbWlzQmluZGluZ3NIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRIdHRwSW52b2tlciBpbXBsZW1lbnRzIEh0dHBJbnZva2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEZWZhdWx0SHR0cEludm9rZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMiAqIDEwMjQgKiAxMDI0OwotCi0gICAgcHVibGljIERlZmF1bHRIdHRwSW52b2tlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlR0VUKFVybEJ1aWxkZXIgdXJsLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UodXJsLCAiR0VUIiwgbnVsbCwgbnVsbCwgbnVsbCwgc2Vzc2lvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZUdFVChVcmxCdWlsZGVyIHVybCwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQmlnSW50ZWdlciBvZmZzZXQsIEJpZ0ludGVnZXIgbGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UodXJsLCAiR0VUIiwgbnVsbCwgbnVsbCwgbnVsbCwgc2Vzc2lvbiwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZSBpbnZva2VQT1NUKFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgY29udGVudFR5cGUsIE91dHB1dCB3cml0ZXIsIEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgcmV0dXJuIGludm9rZSh1cmwsICJQT1NUIiwgY29udGVudFR5cGUsIG51bGwsIHdyaXRlciwgc2Vzc2lvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZVBVVChVcmxCdWlsZGVyIHVybCwgU3RyaW5nIGNvbnRlbnRUeXBlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIE91dHB1dCB3cml0ZXIsCi0gICAgICAgICAgICBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2UodXJsLCAiUFVUIiwgY29udGVudFR5cGUsIGhlYWRlcnMsIHdyaXRlciwgc2Vzc2lvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZURFTEVURShVcmxCdWlsZGVyIHVybCwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICByZXR1cm4gaW52b2tlKHVybCwgIkRFTEVURSIsIG51bGwsIG51bGwsIG51bGwsIHNlc3Npb24sIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVzcG9uc2UgaW52b2tlKFVybEJ1aWxkZXIgdXJsLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgY29udGVudFR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywKLSAgICAgICAgICAgIE91dHB1dCB3cml0ZXIsIEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIEJpZ0ludGVnZXIgb2Zmc2V0LCBCaWdJbnRlZ2VyIGxlbmd0aCkgewotICAgICAgICBpbnQgcmVzcENvZGUgPSAtMTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gbG9nIGJlZm9yZSBjb25uZWN0Ci0gICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24ge306IHt9IHt9Iiwgc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSwgbWV0aG9kLCB1cmwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb25uZWN0Ci0gICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSAobmV3IFVSTCh1cmwudG9TdHJpbmcoKSkpLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uLnNldFJlcXVlc3RNZXRob2QobWV0aG9kKTsKLSAgICAgICAgICAgIGNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKLSAgICAgICAgICAgIGNvbm4uc2V0RG9PdXRwdXQod3JpdGVyICE9IG51bGwpOwotICAgICAgICAgICAgY29ubi5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBjb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0gICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsIENsaWVudFZlcnNpb24uT1BFTkNNSVNfQ0xJRU5UKTsKLQotICAgICAgICAgICAgLy8gdGltZW91dHMKLSAgICAgICAgICAgIGludCBjb25uZWN0VGltZW91dCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ09OTkVDVF9USU1FT1VULCAtMSk7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgICAgIGNvbm4uc2V0Q29ubmVjdFRpbWVvdXQoY29ubmVjdFRpbWVvdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcmVhZFRpbWVvdXQgPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLlJFQURfVElNRU9VVCwgLTEpOwotICAgICAgICAgICAgaWYgKHJlYWRUaW1lb3V0ID49IDApIHsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlYWRUaW1lb3V0KHJlYWRUaW1lb3V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGNvbnRlbnQgdHlwZQotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2V0IG90aGVyIGhlYWRlcnMKLSAgICAgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gaGVhZGVyIDogaGVhZGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm4uYWRkUmVxdWVzdFByb3BlcnR5KGhlYWRlci5nZXRLZXkoKSwgaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0aGVudGljYXRlCi0gICAgICAgICAgICBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGF1dGhQcm92aWRlciA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKHNlc3Npb24pOwotICAgICAgICAgICAgaWYgKGF1dGhQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBodHRwSGVhZGVycyA9IGF1dGhQcm92aWRlci5nZXRIVFRQSGVhZGVycyh1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGh0dHBIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlciA6IGh0dHBIZWFkZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0S2V5KCkgIT0gbnVsbCAmJiBpc05vdEVtcHR5KGhlYWRlci5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBoZWFkZXIuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJ1c2VyLWFnZW50IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCBoZWFkZXIuZ2V0VmFsdWUoKS5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogaGVhZGVyLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5hZGRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29ubiBpbnN0YW5jZW9mIEh0dHBzVVJMQ29ubmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNmID0gYXV0aFByb3ZpZGVyLmdldFNTTFNvY2tldEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoSHR0cHNVUkxDb25uZWN0aW9uKSBjb25uKS5zZXRTU0xTb2NrZXRGYWN0b3J5KHNmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEhvc3RuYW1lVmVyaWZpZXIgaHYgPSBhdXRoUHJvdmlkZXIuZ2V0SG9zdG5hbWVWZXJpZmllcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChIdHRwc1VSTENvbm5lY3Rpb24pIGNvbm4pLnNldEhvc3RuYW1lVmVyaWZpZXIoaHYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByYW5nZQotICAgICAgICAgICAgaWYgKChvZmZzZXQgIT0gbnVsbCkgfHwgKGxlbmd0aCAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiYnl0ZXM9Iik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG9mZnNldCA9PSBudWxsKSB8fCAob2Zmc2V0LnNpZ251bSgpID09IC0xKSkgewotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9mZnNldC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKTsKLQotICAgICAgICAgICAgICAgIGlmICgobGVuZ3RoICE9IG51bGwpICYmIChsZW5ndGguc2lnbnVtKCkgPT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG9mZnNldC5hZGQobGVuZ3RoLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIlJhbmdlIiwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uCi0gICAgICAgICAgICBPYmplY3QgY29tcHJlc3Npb24gPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkNPTVBSRVNTSU9OKTsKLSAgICAgICAgICAgIGlmICgoY29tcHJlc3Npb24gIT0gbnVsbCkgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4oY29tcHJlc3Npb24udG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAsZGVmbGF0ZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsb2NhbGUKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLmdldChDbWlzQmluZGluZ3NIZWxwZXIuQUNDRVBUX0xBTkdVQUdFKSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQtTGFuZ3VhZ2UiLCBzZXNzaW9uLmdldChDbWlzQmluZGluZ3NIZWxwZXIuQUNDRVBUX0xBTkdVQUdFKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2VuZCBkYXRhCi0gICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25uLnNldENodW5rZWRTdHJlYW1pbmdNb2RlKCg2NCAqIDEwMjQpIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gY29ubk91dCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgY2xpZW50Q29tcHJlc3Npb24gPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkNMSUVOVF9DT01QUkVTU0lPTik7Ci0gICAgICAgICAgICAgICAgaWYgKChjbGllbnRDb21wcmVzc2lvbiAhPSBudWxsKSAmJiBCb29sZWFuLnBhcnNlQm9vbGVhbihjbGllbnRDb21wcmVzc2lvbi50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5PdXQgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShjb25uLmdldE91dHB1dFN0cmVhbSgpLCA0MDk2KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25uT3V0ID0gY29ubi5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGNvbm5PdXQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUob3V0KTsKLSAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb25uT3V0IGluc3RhbmNlb2YgR1pJUE91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAoKEdaSVBPdXRwdXRTdHJlYW0pIGNvbm5PdXQpLmZpbmlzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29ubmVjdAotICAgICAgICAgICAgY29ubi5jb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCBzdHJlYW0sIGlmIHByZXNlbnQKLSAgICAgICAgICAgIHJlc3BDb2RlID0gY29ubi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmICgocmVzcENvZGUgPT0gMjAwKSB8fCAocmVzcENvZGUgPT0gMjAxKSB8fCAocmVzcENvZGUgPT0gMjAzKSB8fCAocmVzcENvZGUgPT0gMjA2KSkgewotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gY29ubi5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsb2cgYWZ0ZXIgY29ubmVjdAotICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJTZXNzaW9uIHt9OiB7fSB7fSA+IEhlYWRlcnM6IHt9Iiwgc2Vzc2lvbi5nZXRTZXNzaW9uSWQoKSwgbWV0aG9kLCB1cmwsIGNvbm4KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRIZWFkZXJGaWVsZHMoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZm9yd2FyZCByZXNwb25zZSBIVFRQIGhlYWRlcnMKLSAgICAgICAgICAgIGlmIChhdXRoUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF1dGhQcm92aWRlci5wdXRSZXNwb25zZUhlYWRlcnModXJsLnRvU3RyaW5nKCksIHJlc3BDb2RlLCBjb25uLmdldEhlYWRlckZpZWxkcygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXNwb25zZQotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwQ29kZSwgY29ubi5nZXRSZXNwb25zZU1lc3NhZ2UoKSwgY29ubi5nZXRIZWFkZXJGaWVsZHMoKSwgaW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbm4uZ2V0RXJyb3JTdHJlYW0oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RhdHVzID0gKHJlc3BDb2RlID4gMCA/ICIgKEhUVFAgc3RhdHVzIGNvZGUgIiArIHJlc3BDb2RlICsgIikiIDogIiIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJDYW5ub3QgYWNjZXNzIFwiIiArIHVybCArICJcIiIgKyBzdGF0dXMgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL0h0dHBJbnZva2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2h0dHAvSHR0cEludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiYTY4MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2h0dHAvSHR0cEludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmh0dHA7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLQotLyoqCi0gKiBIVFRQIEludm9rZXIgSW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEh0dHBJbnZva2VyIHsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgSFRUUCBHRVQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBSZXNwb25zZSBpbnZva2VHRVQoVXJsQnVpbGRlciB1cmwsIEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgYSBIVFRQIEdFVCByZXF1ZXN0LgotICAgICAqLwotICAgIFJlc3BvbnNlIGludm9rZUdFVChVcmxCdWlsZGVyIHVybCwgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQmlnSW50ZWdlciBvZmZzZXQsIEJpZ0ludGVnZXIgbGVuZ3RoKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgSFRUUCBQT1NUIHJlcXVlc3QuCi0gICAgICovCi0gICAgUmVzcG9uc2UgaW52b2tlUE9TVChVcmxCdWlsZGVyIHVybCwgU3RyaW5nIGNvbnRlbnRUeXBlLCBPdXRwdXQgd3JpdGVyLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKTsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgSFRUUCBQVVQgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBSZXNwb25zZSBpbnZva2VQVVQoVXJsQnVpbGRlciB1cmwsIFN0cmluZyBjb250ZW50VHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLCBPdXRwdXQgd3JpdGVyLAotICAgICAgICAgICAgQmluZGluZ1Nlc3Npb24gc2Vzc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyBhIEhUVFAgREVMRVRFIHJlcXVlc3QuCi0gICAgICovCi0gICAgUmVzcG9uc2UgaW52b2tlREVMRVRFKFVybEJ1aWxkZXIgdXJsLCBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9PdXRwdXQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9PdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiMzY3OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2h0dHAvT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogT3V0cHV0IGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRwdXQgewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuU2lnbmF0dXJlRGVjbGFyZVRocm93c0V4Y2VwdGlvbiIpCi0gICAgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvaHR0cC9SZXNwb25zZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZGU0OGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9odHRwL1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLQotLyoqCi0gKiBIVFRQIFJlc3BvbnNlLgotICovCi1wdWJsaWMgY2xhc3MgUmVzcG9uc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRVJST1JfTEVOR1RIID0gMTI4ICogMTAyNDsKLQotICAgIHByaXZhdGUgZmluYWwgaW50IHJlc3BvbnNlQ29kZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNwb25zZU1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnM7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdHJlYW07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JDb250ZW50OwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBsZW5ndGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2hhcnNldDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUmVzcG9uc2VTdHJlYW07Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2UoaW50IHJlc3BvbnNlQ29kZSwgU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzLAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gcmVzcG9uc2VTdHJlYW0sIElucHV0U3RyZWFtIGVycm9yU3RyZWFtKSB7Ci0gICAgICAgIHRoaXMucmVzcG9uc2VDb2RlID0gcmVzcG9uc2VDb2RlOwotICAgICAgICB0aGlzLnJlc3BvbnNlTWVzc2FnZSA9IHJlc3BvbnNlTWVzc2FnZTsKLSAgICAgICAgdGhpcy5zdHJlYW0gPSByZXNwb25zZVN0cmVhbTsKLSAgICAgICAgdGhpcy5oYXNSZXNwb25zZVN0cmVhbSA9IChzdHJlYW0gIT0gbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gaXNHWklQID0gKHJlc3BvbnNlU3RyZWFtIGluc3RhbmNlb2YgR1pJUElucHV0U3RyZWFtKTsKLQotICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMucHV0KGUuZ2V0S2V5KCkgPT0gbnVsbCA/IG51bGwgOiBlLmdldEtleSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSwgZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRldGVybWluZSBjaGFyc2V0Ci0gICAgICAgIGNoYXJzZXQgPSBJT1V0aWxzLlVURjg7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlSGVhZGVyKCk7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGNvbnRlbnRUeXBlLnNwbGl0KCI7Iik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSBwYXJ0c1tpXS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoImNoYXJzZXQiKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IHBhcnQuaW5kZXhPZignPScpOwotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gcGFydC5zdWJzdHJpbmcoeCArIDEpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IgcGFnZSwgZ2V0IGl0Ci0gICAgICAgIGlmIChlcnJvclN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZUxvd2VyID0gY29udGVudFR5cGUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLnNwbGl0KCI7IilbMF07Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlTG93ZXIuc3RhcnRzV2l0aCgidGV4dC8iKSB8fCBjb250ZW50VHlwZUxvd2VyLmVuZHNXaXRoKCIreG1sIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbnRlbnRUeXBlTG93ZXIuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24veG1sIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbnRlbnRUeXBlTG93ZXIuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vanNvbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZXJyb3JTdHJlYW0sIDY0ICogMTAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBnZXRDb250ZW50RW5jb2RpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY0xvd2VyID0gZW5jb2RpbmcudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jTG93ZXIuZXF1YWxzKCJnemlwIikgJiYgIWlzR1pJUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmVhbSA9IG5ldyBHWklQSW5wdXRTdHJlYW0oZXJyb3JTdHJlYW0sIDY0ICogMTAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNMb3dlci5lcXVhbHMoImRlZmxhdGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmVhbSA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKGVycm9yU3RyZWFtLCBuZXcgSW5mbGF0ZXIodHJ1ZSksIDY0ICogMTAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZXJyb3JTdHJlYW0sIGNoYXJzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzQwOTZdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGIgPSByZWFkZXIucmVhZChidWZmZXIpKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJ1ZmZlciwgMCwgYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID49IE1BWF9FUlJPUl9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29udGVudCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29udGVudCA9ICJVbmFibGUgdG8gcmV0cmlldmUgY29udGVudDogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShlcnJvclN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHJlc3BvbnNlU3RyZWFtKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBzdHJlYW0gbGVuZ3RoCi0gICAgICAgIGxlbmd0aCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBsZW5ndGhTdHIgPSBnZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIik7Ci0gICAgICAgIGlmIChsZW5ndGhTdHIgIT0gbnVsbCAmJiAhaXNHWklQKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxlbmd0aCA9IG5ldyBCaWdJbnRlZ2VyKGxlbmd0aFN0cik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQtbGVuZ3RoIGlzIG5vdCBhIG51bWJlciAtPiBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCB8fCBCaWdJbnRlZ2VyLlpFUk8uZXF1YWxzKGxlbmd0aCkgfHwgcmVzcG9uc2VDb2RlID09IDIwNCkgewotICAgICAgICAgICAgaGFzUmVzcG9uc2VTdHJlYW0gPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSwgNjQgKiAxMDI0KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaGFzUmVzcG9uc2VTdHJlYW0gPSBJT1V0aWxzLmNoZWNrRm9yQnl0ZXMoc3RyZWFtKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiSU8gZXhjZXB0aW9uISIsIGlvZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYXNSZXNwb25zZVN0cmVhbSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGdldENvbnRlbnRFbmNvZGluZygpOwotICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbmNMb3dlciA9IGVuY29kaW5nLnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmNMb3dlci5lcXVhbHMoImd6aXAiKSAmJiAhaXNHWklQKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc3RyZWFtIGlzIGd6aXAgZW5jb2RlZCwgZGVjb2RlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgR1pJUElucHV0U3RyZWFtKHN0cmVhbSwgNjQgKiAxMDI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvbnRlbnQgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHJlc3BvbnNlU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNMb3dlci5lcXVhbHMoImRlZmxhdGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmVhbSBpcyBkZWZsYXRlIGVuY29kZWQsIGRlY29kZSBpdAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKHN0cmVhbSwgbmV3IEluZmxhdGVyKHRydWUpLCA2NCAqIDEwMjQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zZmVyRW5jb2RpbmcgPSBnZXRDb250ZW50VHJhbnNmZXJFbmNvZGluZygpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlckVuY29kaW5nICE9IG51bGwgJiYgdHJhbnNmZXJFbmNvZGluZy50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLmVxdWFscygiYmFzZTY0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmVhbSBpcyBiYXNlNjQgZW5jb2RlZCwgZGVjb2RlIGl0Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCYXNlNjQuSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJlc3BvbnNlQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlTWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gaGVhZGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IGhlYWRlcnMuZ2V0KG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7Ci0gICAgICAgIGlmIChpc051bGxPckVtcHR5KGxpc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlSGVhZGVyKCkgewotICAgICAgICByZXR1cm4gZ2V0SGVhZGVyKCJDb250ZW50LVR5cGUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRDb250ZW50TGVuZ3RoSGVhZGVyKCkgewotICAgICAgICBTdHJpbmcgbGVuZ3RoU3RyID0gZ2V0SGVhZGVyKCJDb250ZW50LUxlbmd0aCIpOwotICAgICAgICBpZiAobGVuZ3RoU3RyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlcihsZW5ndGhTdHIpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FjdGlvbkhlYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIGdldEhlYWRlcigiTG9jYXRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRMb2NhY3Rpb25IZWFkZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRIZWFkZXIoIkNvbnRlbnQtTG9jYXRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUcmFuc2ZlckVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0SGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRIZWFkZXIoIkNvbnRlbnQtRW5jb2RpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREaXNwb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldEhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpIHsKLSAgICAgICAgcmV0dXJuIGNoYXJzZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNwb25zZVN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIGhhc1Jlc3BvbnNlU3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBzdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvckNvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBlcnJvckNvbnRlbnQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvQWJzdHJhY3RMb2NhbFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvQWJzdHJhY3RMb2NhbFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0YjM2OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL0Fic3RyYWN0TG9jYWxTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmxvY2FsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlLlByb2dyZXNzOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCBsb2NhbCBjbGllbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMb2NhbFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByaXZhdGUgQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB1c2VyOwotICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNlc3Npb24oQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotCi0gICAgICAgIE9iamVjdCB1c2VyT2JqID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSKTsKLSAgICAgICAgdXNlciA9IHVzZXJPYmogaW5zdGFuY2VvZiBTdHJpbmcgPyB1c2VyT2JqLnRvU3RyaW5nKCkgOiBudWxsOwotCi0gICAgICAgIE9iamVjdCBwYXNzd29yZE9iaiA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUEFTU1dPUkQpOwotICAgICAgICBwYXNzd29yZCA9IHBhc3N3b3JkT2JqIGluc3RhbmNlb2YgU3RyaW5nID8gcGFzc3dvcmRPYmoudG9TdHJpbmcoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCaW5kaW5nU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzZXJ2aWNlIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U2VydmljZUZhY3RvcnkoQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXJ2aWNlIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENtaXNTZXJ2aWNlRmFjdG9yeSBnZXRTZXJ2aWNlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc2luZyBzaG91bGQgYmUgc3RvcHBlZCBiZWZvcmUgdGhlIHNlcnZpY2UgbWV0aG9kCi0gICAgICogaXMgY2FsbGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwcm9jZXNzaW5nIHNob3VsZCBiZSBzdG9wcGVkLCB7QGNvZGUgZmFsc2V9Ci0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wQmVmb3JlU2VydmljZShDbWlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBQcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoKFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlKSBzZXJ2aWNlKS5iZWZvcmVTZXJ2aWNlQ2FsbCgpID09IFByb2dyZXNzLlNUT1A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcHJvY2Vzc2luZyBzaG91bGQgYmUgc3RvcHBlZCBhZnRlciB0aGUgc2VydmljZSBtZXRob2QKLSAgICAgKiBpcyBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHByb2Nlc3Npbmcgc2hvdWxkIGJlIHN0b3BwZWQsIHtAY29kZSBmYWxzZX0KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3BBZnRlclNlcnZpY2UoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBpZiAoIShzZXJ2aWNlIGluc3RhbmNlb2YgUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKChQcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZSkgc2VydmljZSkuYWZ0ZXJTZXJ2aWNlQ2FsbCgpID09IFByb2dyZXNzLlNUT1A7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlcyBhIGxvY2FsIGNhbGwgY29udGV4dC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2FsbENvbnRleHQgY3JlYXRlQ2FsbENvbnRleHQoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICByZXR1cm4gbmV3IExvY2FsQ2FsbENvbnRleHQocmVwb3NpdG9yeUlkLCB1c2VyLCBwYXNzd29yZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNTZXJ2aWNlIGdldFNlcnZpY2UoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRTZXJ2aWNlKGNyZWF0ZUNhbGxDb250ZXh0KHJlcG9zaXRvcnlJZCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvQWNsU2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvQWNsU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1YTU1Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL0FjbFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmxvY2FsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BY2xTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkV4dGVuZGVkQWNsU2VydmljZTsKLQotcHVibGljIGNsYXNzIEFjbFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2NhbFNlcnZpY2UgaW1wbGVtZW50cyBBY2xTZXJ2aWNlLCBFeHRlbmRlZEFjbFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFjbFNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIHNldFNlcnZpY2VGYWN0b3J5KGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBY2wgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgLmFwcGx5QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGFjbFByb3BhZ2F0aW9uLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBY2wgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG9ubHlCYXNpY1Blcm1pc3Npb25zLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgc2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMpIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjbCBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5hcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2VzLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL0NtaXNMb2NhbFNwaS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9DbWlzTG9jYWxTcGkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwNzdkNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL0NtaXNMb2NhbFNwaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5sb2NhbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQ21pc1NwaTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5DbGFzc0xvYWRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkFjbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRGlzY292ZXJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Qb2xpY3lTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuVmVyc2lvbmluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiAqIENNSVMgbG9jYWwgU1BJIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ21pc0xvY2FsU3BpIGltcGxlbWVudHMgQ21pc1NwaSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ21pc0xvY2FsU3BpLmNsYXNzKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnlTZXJ2aWNlIHJlcG9zaXRvcnlTZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgTmF2aWdhdGlvblNlcnZpY2UgbmF2aWdhdGlvblNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RTZXJ2aWNlIG9iamVjdFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uaW5nU2VydmljZSB2ZXJzaW9uaW5nU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIERpc2NvdmVyeVNlcnZpY2UgZGlzY292ZXJ5U2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIE11bHRpRmlsaW5nU2VydmljZSBtdWx0aUZpbGluZ1NlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWxhdGlvbnNoaXBTZXJ2aWNlIHJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQb2xpY3lTZXJ2aWNlIHBvbGljeVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY2xTZXJ2aWNlIGFjbFNlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0xvY2FsU3BpKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24ge306IEluaXRpYWxpemluZyBsb2NhbCBTUEkuLi4iLCBzZXNzaW9uLmdldFNlc3Npb25JZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgc2VydmljZSBmYWN0b3J5IGNsYXNzIG5hbWUKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VGYWN0b3J5Q2xhc3NuYW1lID0gKFN0cmluZykgc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5MT0NBTF9GQUNUT1JZKTsKLSAgICAgICAgaWYgKHNlcnZpY2VGYWN0b3J5Q2xhc3NuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiRmFjdG9yeSBjbGFzcyBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdhdGhlciBwYXJhbWV0ZXJzIGZyb20gc2Vzc2lvbgotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBzZXNzaW9uLmdldEtleXMoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHNlc3Npb24uZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KGtleSwgKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGFuZCBpbml0aWFsaXplIGZhY3RvcnkKLSAgICAgICAgICAgIGZhY3RvcnkgPSAoQ21pc1NlcnZpY2VGYWN0b3J5KSBDbGFzc0xvYWRlclV0aWwubG9hZENsYXNzKHNlcnZpY2VGYWN0b3J5Q2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZmFjdG9yeS5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJGYWN0b3J5IGNhbm5vdCBiZSBjcmVhdGVkOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVwb3NpdG9yeVNlcnZpY2UgPSBuZXcgUmVwb3NpdG9yeVNlcnZpY2VJbXBsKHNlc3Npb24sIGZhY3RvcnkpOwotICAgICAgICBuYXZpZ2F0aW9uU2VydmljZSA9IG5ldyBOYXZpZ2F0aW9uU2VydmljZUltcGwoc2Vzc2lvbiwgZmFjdG9yeSk7Ci0gICAgICAgIG9iamVjdFNlcnZpY2UgPSBuZXcgT2JqZWN0U2VydmljZUltcGwoc2Vzc2lvbiwgZmFjdG9yeSk7Ci0gICAgICAgIHZlcnNpb25pbmdTZXJ2aWNlID0gbmV3IFZlcnNpb25pbmdTZXJ2aWNlSW1wbChzZXNzaW9uLCBmYWN0b3J5KTsKLSAgICAgICAgZGlzY292ZXJ5U2VydmljZSA9IG5ldyBEaXNjb3ZlcnlTZXJ2aWNlSW1wbChzZXNzaW9uLCBmYWN0b3J5KTsKLSAgICAgICAgbXVsdGlGaWxpbmdTZXJ2aWNlID0gbmV3IE11bHRpRmlsaW5nU2VydmljZUltcGwoc2Vzc2lvbiwgZmFjdG9yeSk7Ci0gICAgICAgIHJlbGF0aW9uc2hpcFNlcnZpY2UgPSBuZXcgUmVsYXRpb25zaGlwU2VydmljZUltcGwoc2Vzc2lvbiwgZmFjdG9yeSk7Ci0gICAgICAgIHBvbGljeVNlcnZpY2UgPSBuZXcgUG9saWN5U2VydmljZUltcGwoc2Vzc2lvbiwgZmFjdG9yeSk7Ci0gICAgICAgIGFjbFNlcnZpY2UgPSBuZXcgQWNsU2VydmljZUltcGwoc2Vzc2lvbiwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlIGdldE5hdmlnYXRpb25TZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gbmF2aWdhdGlvblNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFNlcnZpY2UgZ2V0T2JqZWN0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIERpc2NvdmVyeVNlcnZpY2UgZ2V0RGlzY292ZXJ5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGRpc2NvdmVyeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlIGdldFZlcnNpb25pbmdTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gdmVyc2lvbmluZ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE11bHRpRmlsaW5nU2VydmljZSBnZXRNdWx0aUZpbGluZ1NlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtdWx0aUZpbGluZ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbGF0aW9uc2hpcFNlcnZpY2UgZ2V0UmVsYXRpb25zaGlwU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeVNlcnZpY2UgZ2V0UG9saWN5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvbGljeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbFNlcnZpY2UgZ2V0QWNsU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGFjbFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJSZXBvc2l0b3J5Q2FjaGUoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBmYWN0b3J5LmRlc3Ryb3koKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL0Rpc2NvdmVyeVNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL0Rpc2NvdmVyeVNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYmFkNGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmxvY2FsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLQotcHVibGljIGNsYXNzIERpc2NvdmVyeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2NhbFNlcnZpY2UgaW1wbGVtZW50cyBEaXNjb3ZlcnlTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEaXNjb3ZlcnlTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uLCBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBzZXRTZXJ2aWNlRmFjdG9yeShmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VMb2dUb2tlbiwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdExpc3Qgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0Q29udGVudENoYW5nZXMocmVwb3NpdG9yeUlkLCBjaGFuZ2VMb2dUb2tlbiwgaW5jbHVkZVByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgbWF4SXRlbXMsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0TGlzdCBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5xdWVyeShyZXBvc2l0b3J5SWQsIHN0YXRlbWVudCwgc2VhcmNoQWxsVmVyc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvTG9jYWxDYWxsQ29udGV4dC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9Mb2NhbENhbGxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NWNiMjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9Mb2NhbENhbGxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmxvY2FsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk11dGFibGVDYWxsQ29udGV4dDsKLQotLyoqCi0gKiBTaW1wbGUge0BsaW5rIENhbGxDb250ZXh0fSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsQ2FsbENvbnRleHQgaW1wbGVtZW50cyBNdXRhYmxlQ2FsbENvbnRleHQgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHB1YmxpYyBMb2NhbENhbGxDb250ZXh0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgY29udGV4dE1hcC5wdXQoUkVQT1NJVE9SWV9JRCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY29udGV4dE1hcC5wdXQoVVNFUk5BTUUsIHVzZXIpOwotICAgICAgICBjb250ZXh0TWFwLnB1dChQQVNTV09SRCwgcGFzc3dvcmQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIEJJTkRJTkdfTE9DQUw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gY29udGV4dE1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBDbWlzVmVyc2lvbi5DTUlTXzFfMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChSRVBPU0lUT1JZX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0KFVTRVJOQU1FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0KFBBU1NXT1JEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0T2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gKEJpZ0ludGVnZXIpIGdldChPRkZTRVQpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIChCaWdJbnRlZ2VyKSBnZXQoTEVOR1RIKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdEluZm9SZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVuY3J5cHRUZW1wRmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1lbW9yeVRocmVzaG9sZCgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TWF4Q29udGVudFNpemUoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGNvbnRleHRNYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHRNYXAucmVtb3ZlKGtleSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDMyYjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkubG9jYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTXVsdGlGaWxpbmdTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0TG9jYWxTZXJ2aWNlIGltcGxlbWVudHMgTXVsdGlGaWxpbmdTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aUZpbGluZ1NlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIHNldFNlcnZpY2VGYWN0b3J5KGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9iamVjdFRvRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5hZGRPYmplY3RUb0ZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgYWxsVmVyc2lvbnMsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvTmF2aWdhdGlvblNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL05hdmlnYXRpb25TZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGRmM2M3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvTmF2aWdhdGlvblNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmxvY2FsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLQotcHVibGljIGNsYXNzIE5hdmlnYXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0TG9jYWxTZXJ2aWNlIGltcGxlbWVudHMgTmF2aWdhdGlvblNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uLCBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBzZXRTZXJ2aWNlRmFjdG9yeShmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDaGVja2VkT3V0RG9jcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0TGlzdCBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRDaGVja2VkT3V0RG9jcyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIG9yZGVyQnksCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckxpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRDaGlsZHJlbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIG9yZGVyQnksCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIG1heEl0ZW1zLAotICAgICAgICAgICAgICAgICAgICBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldERlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldERlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldEZvbGRlclBhcmVudChyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldEZvbGRlclRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRGb2xkZXJUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0T2JqZWN0UGFyZW50cyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL09iamVjdFNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL09iamVjdFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYzJhYjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9PYmplY3RTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5sb2NhbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLQotcHVibGljIGNsYXNzIE9iamVjdFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2NhbFNlcnZpY2UgaW1wbGVtZW50cyBPYmplY3RTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uLCBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBzZXRTZXJ2aWNlRmFjdG9yeShmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmNyZWF0ZURvY3VtZW50KHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHNvdXJjZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKHJlcG9zaXRvcnlJZCwgc291cmNlSWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLAotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmNyZWF0ZUZvbGRlcihyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5jcmVhdGVQb2xpY3kocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFjZXMsCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVJdGVtKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5jcmVhdGVJdGVtKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIHBvbGljaWVzLCBhZGRBY2VzLAotICAgICAgICAgICAgICAgICAgICByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUmVsYXRpb25zaGlwKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywKLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5jcmVhdGVSZWxhdGlvbnNoaXAocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlQ29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjaGFuZ2VUb2tlbiwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEZhaWxlZFRvRGVsZXRlRGF0YSBkZWxldGVUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIFVuZmlsZU9iamVjdCB1bmZpbGVPYmplY3RzLCBCb29sZWFuIGNvbnRpbnVlT25GYWlsdXJlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZhaWxlZFRvRGVsZXRlRGF0YSBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5kZWxldGVUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLCB1bmZpbGVPYmplY3RzLAotICAgICAgICAgICAgICAgICAgICBjb250aW51ZU9uRmFpbHVyZSwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbGxvd2FibGVBY3Rpb25zIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldEFsbG93YWJsZUFjdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHN0cmVhbUlkLCBCaWdJbnRlZ2VyIG9mZnNldCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbGVuZ3RoLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0Q29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBzdHJlYW1JZCwgb2Zmc2V0LCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0T2JqZWN0QnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlbmRpdGlvbkRhdGE+IGdldFJlbmRpdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxSZW5kaXRpb25EYXRhPiBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRSZW5kaXRpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBTdHJpbmcgdGFyZ2V0Rm9sZGVySWQsIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UubW92ZU9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCB0YXJnZXRGb2xkZXJJZCwgc291cmNlRm9sZGVySWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBvdmVyd3JpdGVGbGFnLAotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5zZXRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGNoYW5nZVRva2VuLCBjb250ZW50U3RyZWFtLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIGlzTGFzdENodW5rLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmFwcGVuZENvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY2hhbmdlVG9rZW4sIGNvbnRlbnRTdHJlYW0sIGlzTGFzdENodW5rLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLnVwZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY2hhbmdlVG9rZW4sIHByb3BlcnRpZXMsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IGJ1bGtVcGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBvYmplY3RJZEFuZENoYW5nZVRva2VuLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYWRkU2Vjb25kYXJ5VHlwZUlkcywgTGlzdDxTdHJpbmc+IHJlbW92ZVNlY29uZGFyeVR5cGVJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuYnVsa1VwZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgICAgICBvYmplY3RJZEFuZENoYW5nZVRva2VuLCBwcm9wZXJ0aWVzLCBhZGRTZWNvbmRhcnlUeXBlSWRzLCByZW1vdmVTZWNvbmRhcnlUeXBlSWRzLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvUG9saWN5U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvUG9saWN5U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkZDUzYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL1BvbGljeVNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkubG9jYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Qb2xpY3lTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgUG9saWN5U2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdExvY2FsU2VydmljZSBpbXBsZW1lbnRzIFBvbGljeVNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFBvbGljeVNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIHNldFNlcnZpY2VGYWN0b3J5KGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmFwcGx5UG9saWN5KHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdERhdGE+IGdldEFwcGxpZWRQb2xpY2llcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE9iamVjdERhdGE+IHNlcnZpY2VSZXN1dCA9IHNlcnZpY2UuZ2V0QXBwbGllZFBvbGljaWVzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1dDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5yZW1vdmVQb2xpY3kocmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9SZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS9sb2NhbC9SZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA2ZmM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvUmVsYXRpb25zaGlwU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5sb2NhbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5SZWxhdGlvbnNoaXBEaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0TG9jYWxTZXJ2aWNlIGltcGxlbWVudHMgUmVsYXRpb25zaGlwU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRpb25zaGlwU2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgc2V0U2VydmljZUZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdExpc3Qgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgdHlwZUlkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvUmVwb3NpdG9yeVNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYwMjMxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvUmVwb3NpdG9yeVNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmxvY2FsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLQotLyoqCi0gKiBSZXBvc2l0b3J5IFNlcnZpY2UgbG9jYWwgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RMb2NhbFNlcnZpY2UgaW1wbGVtZW50cyBSZXBvc2l0b3J5U2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVwb3NpdG9yeVNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIHNldFNlcnZpY2VGYWN0b3J5KGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlcG9zaXRvcnlJbmZvIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFJlcG9zaXRvcnlJbmZvKHJlcG9zaXRvcnlJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShudWxsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFJlcG9zaXRvcnlJbmZvcyhleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkxpc3QgZ2V0VHlwZUNoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3Qgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgdHlwZUlkLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0VHlwZURlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFR5cGVEZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuY3JlYXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGUsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIHVwZGF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS51cGRhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZSwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VSZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL2xvY2FsL1ZlcnNpb25pbmdTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjVjMDA2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvbG9jYWwvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmxvY2FsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLQotcHVibGljIGNsYXNzIFZlcnNpb25pbmdTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0TG9jYWxTZXJ2aWNlIGltcGxlbWVudHMgVmVyc2lvbmluZ1NlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uLCBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICBzZXRTZXJ2aWNlRmFjdG9yeShmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuY2FuY2VsQ2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoZWNrSW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gbWFqb3IsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoZWNraW5Db21tZW50LCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuY2hlY2tJbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBtYWpvciwgcHJvcGVydGllcywgY29udGVudFN0cmVhbSwgY2hlY2tpbkNvbW1lbnQsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgICAgICBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sCi0gICAgICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCkgewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uLCBjb250ZW50Q29waWVkKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBbGxWZXJzaW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0QWxsVmVyc2lvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZVJlc3VsdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBY2wsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICAgICAgICAgIG1ham9yLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlUmVzdWx0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9BYnN0cmFjdFBvcnRQcm92aWRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9BYnN0cmFjdFBvcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTVmNWI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvQWJzdHJhY3RQb3J0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNsaWVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuQ21pc0JpbmRpbmdzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5odHRwLkh0dHBJbnZva2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQUNMU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5BQ0xTZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkRpc2NvdmVyeVNlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk11bHRpRmlsaW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5NdWx0aUZpbGluZ1NlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk5hdmlnYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk5hdmlnYXRpb25TZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5PYmplY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk9iamVjdFNlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLlBvbGljeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuUG9saWN5U2VydmljZVBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuUmVsYXRpb25zaGlwU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5SZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5SZXBvc2l0b3J5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5SZXBvc2l0b3J5U2VydmljZVBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuVmVyc2lvbmluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuVmVyc2lvbmluZ1NlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UG9ydFByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYnN0cmFjdFBvcnRQcm92aWRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9SVF9DQUNIRV9TSVpFID0gNTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENIVU5LX1NJWkUgPSAoNjQgKiAxMDI0KSAtIDE7Ci0KLSAgICBwcm90ZWN0ZWQgZW51bSBDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlIHsKLSAgICAgICAgUkVQT1NJVE9SWV9TRVJWSUNFKCJSZXBvc2l0b3J5U2VydmljZSIsIGZhbHNlLCBSZXBvc2l0b3J5U2VydmljZS5jbGFzcywgUmVwb3NpdG9yeVNlcnZpY2VQb3J0LmNsYXNzLAotICAgICAgICAgICAgICAgIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFLAotICAgICAgICAgICAgICAgIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFX0VORFBPSU5UKSwKLQotICAgICAgICBOQVZJR0FUSU9OX1NFUlZJQ0UoIk5hdmlnYXRpb25TZXJ2aWNlIiwgZmFsc2UsIE5hdmlnYXRpb25TZXJ2aWNlLmNsYXNzLCBOYXZpZ2F0aW9uU2VydmljZVBvcnQuY2xhc3MsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0VfRU5EUE9JTlQpLAotCi0gICAgICAgIE9CSkVDVF9TRVJWSUNFKCJPYmplY3RTZXJ2aWNlIiwgdHJ1ZSwgT2JqZWN0U2VydmljZS5jbGFzcywgT2JqZWN0U2VydmljZVBvcnQuY2xhc3MsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRSwgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRV9FTkRQT0lOVCksCi0KLSAgICAgICAgVkVSU0lPTklOR19TRVJWSUNFKCJWZXJzaW9uaW5nU2VydmljZSIsIHRydWUsIFZlcnNpb25pbmdTZXJ2aWNlLmNsYXNzLCBWZXJzaW9uaW5nU2VydmljZVBvcnQuY2xhc3MsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0VfRU5EUE9JTlQpLAotCi0gICAgICAgIERJU0NPVkVSWV9TRVJWSUNFKCJEaXNjb3ZlcnlTZXJ2aWNlIiwgZmFsc2UsIERpc2NvdmVyeVNlcnZpY2UuY2xhc3MsIERpc2NvdmVyeVNlcnZpY2VQb3J0LmNsYXNzLAotICAgICAgICAgICAgICAgIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0UsIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0VfRU5EUE9JTlQpLAotCi0gICAgICAgIE1VTFRJRklMSU5HX1NFUlZJQ0UoIk11bHRpRmlsaW5nU2VydmljZSIsIGZhbHNlLCBNdWx0aUZpbGluZ1NlcnZpY2UuY2xhc3MsIE11bHRpRmlsaW5nU2VydmljZVBvcnQuY2xhc3MsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFLAotICAgICAgICAgICAgICAgIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRV9FTkRQT0lOVCksCi0KLSAgICAgICAgUkVMQVRJT05TSElQX1NFUlZJQ0UoIlJlbGF0aW9uc2hpcFNlcnZpY2UiLCBmYWxzZSwgUmVsYXRpb25zaGlwU2VydmljZS5jbGFzcywgUmVsYXRpb25zaGlwU2VydmljZVBvcnQuY2xhc3MsCi0gICAgICAgICAgICAgICAgU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRSwKLSAgICAgICAgICAgICAgICBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1JFTEFUSU9OU0hJUF9TRVJWSUNFX0VORFBPSU5UKSwKLQotICAgICAgICBQT0xJQ1lfU0VSVklDRSgiUG9saWN5U2VydmljZSIsIGZhbHNlLCBQb2xpY3lTZXJ2aWNlLmNsYXNzLCBQb2xpY3lTZXJ2aWNlUG9ydC5jbGFzcywKLSAgICAgICAgICAgICAgICBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1BPTElDWV9TRVJWSUNFLCBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1BPTElDWV9TRVJWSUNFX0VORFBPSU5UKSwKLQotICAgICAgICBBQ0xfU0VSVklDRSgiQUNMU2VydmljZSIsIGZhbHNlLCBBQ0xTZXJ2aWNlLmNsYXNzLCBBQ0xTZXJ2aWNlUG9ydC5jbGFzcywKLSAgICAgICAgICAgICAgICBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFLCBTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFX0VORFBPSU5UKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIFFOYW1lIHFuYW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFuZGxlc0NvbnRlbnQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFNlcnZpY2U+IHNlcnZpY2VDbGFzczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBwb3J0Q2xhc3M7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHdzZGxLZXk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVuZHBvaW50S2V5OwotCi0gICAgICAgIENtaXNXZWJTZXJpdmNlc1NlcnZpY2UoU3RyaW5nIGxvY2FsbmFtZSwgYm9vbGVhbiBoYW5kbGVzQ29udGVudCwgQ2xhc3M8PyBleHRlbmRzIFNlcnZpY2U+IHNlcnZpY2VDbGFzcywKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBwb3J0MTFDbGFzcywgU3RyaW5nIHdzZGxLZXksIFN0cmluZyBlbmRwb2ludEtleSkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbG9jYWxuYW1lOwotICAgICAgICAgICAgdGhpcy5xbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvIiwgbG9jYWxuYW1lKTsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlc0NvbnRlbnQgPSBoYW5kbGVzQ29udGVudDsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotICAgICAgICAgICAgdGhpcy5wb3J0Q2xhc3MgPSBwb3J0MTFDbGFzczsKLSAgICAgICAgICAgIHRoaXMud3NkbEtleSA9IHdzZGxLZXk7Ci0gICAgICAgICAgICB0aGlzLmVuZHBvaW50S2V5ID0gZW5kcG9pbnRLZXk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcW5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVzQ29udGVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVzQ29udGVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgU2VydmljZT4gZ2V0U2VydmljZUNsYXNzKCkgewotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VDbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRQb3J0Q2xhc3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcG9ydENsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRXc2RsS2V5KCkgewotICAgICAgICAgICAgcmV0dXJuIHdzZGxLZXk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50S2V5KCkgewotICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50S2V5OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgQ21pc1NlcnZpY2VIb2xkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIENtaXNXZWJTZXJpdmNlc1NlcnZpY2Ugc2VydmljZTsKLSAgICAgICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPFNlcnZpY2U+IHNlcnZpY2VPYmplY3Q7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVVJMIGVuZHBvaW50VXJsOwotCi0gICAgICAgIHB1YmxpYyBDbWlzU2VydmljZUhvbGRlcihmaW5hbCBDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlIHNlcnZpY2UsIGZpbmFsIFVSTCBlbmRwb2ludFVybCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgICAgICB0aGlzLmVuZHBvaW50VXJsID0gZW5kcG9pbnRVcmw7Ci0gICAgICAgICAgICB0aGlzLnNlcnZpY2VPYmplY3QgPSBuZXcgU29mdFJlZmVyZW5jZTxTZXJ2aWNlPihjcmVhdGVTZXJ2aWNlT2JqZWN0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2VPYmplY3QoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8PyBleHRlbmRzIFNlcnZpY2U+IHNlcnZpY2VDb25zdHJ1Y3RvciA9IHNlcnZpY2UuZ2V0U2VydmljZUNsYXNzKCkuZ2V0Q29uc3RydWN0b3IoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzczw/PltdIHsgVVJMLmNsYXNzLCBRTmFtZS5jbGFzcyB9KTsKLQotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSBzZXJ2aWNlLmdldFBvcnRDbGFzcygpLmdldFJlc291cmNlKCIvd3NkbC9jbWlzMTEvQ01JU1dTLVNlcnZpY2Uud3NkbCIpOwotICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXNzaW9uIHt9OiBXU0RMIFVSTDoge30iLCBnZXRTZXNzaW9uKCkuZ2V0U2Vzc2lvbklkKCksIHdzZGxVcmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNlcnZpY2UgbmV3U2VydmljZSA9IHNlcnZpY2VDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyB3c2RsVXJsLCBzZXJ2aWNlLmdldFFOYW1lKCkgfSk7Ci0KLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aFByb3ZpZGVyID0gQ21pc0JpbmRpbmdzSGVscGVyLmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoZ2V0U2Vzc2lvbigpKTsKLSAgICAgICAgICAgIGlmIChhdXRoUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEhhbmRsZXJSZXNvbHZlciBoYW5kbGVyUmVzb2x2ZXIgPSBhdXRoUHJvdmlkZXIuZ2V0SGFuZGxlclJlc29sdmVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1NlcnZpY2Uuc2V0SGFuZGxlclJlc29sdmVyKGhhbmRsZXJSZXNvbHZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3U2VydmljZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlIGdldFNlcnZpY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2VPYmplY3QoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICAgICAgU2VydmljZSByZXN1bHQgPSBzZXJ2aWNlT2JqZWN0LmdldCgpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlU2VydmljZU9iamVjdCgpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VPYmplY3QgPSBuZXcgU29mdFJlZmVyZW5jZTxTZXJ2aWNlPihyZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVSTCBnZXRFbmRwb2ludFVybCgpIHsKLSAgICAgICAgICAgIHJldHVybiBlbmRwb2ludFVybDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRTZXJ2aWNlTmFtZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VDb21wcmVzc2lvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlQ2xpZW50Q29tcHJlc3Npb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWNjZXB0TGFuZ3VhZ2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgcG9ydE9iamVjdExvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotICAgIHByaXZhdGUgZmluYWwgRW51bU1hcDxDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLCBBcnJheURlcXVlPFNvZnRSZWZlcmVuY2U8QmluZGluZ1Byb3ZpZGVyPj4+IHBvcnRPYmplY3RDYWNoZSA9IG5ldyBFbnVtTWFwPENtaXNXZWJTZXJpdmNlc1NlcnZpY2UsIEFycmF5RGVxdWU8U29mdFJlZmVyZW5jZTxCaW5kaW5nUHJvdmlkZXI+Pj4oCi0gICAgICAgICAgICBDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLmNsYXNzKTsKLQotICAgIHB1YmxpYyBCaW5kaW5nU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgICAgICBmaW5hbCBPYmplY3QgY29tcHJlc3Npb24gPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLkNPTVBSRVNTSU9OKTsKLSAgICAgICAgdXNlQ29tcHJlc3Npb24gPSAoY29tcHJlc3Npb24gIT0gbnVsbCkgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4oY29tcHJlc3Npb24udG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgZmluYWwgT2JqZWN0IGNsaWVudENvbXByZXNzaW9uID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5DTElFTlRfQ09NUFJFU1NJT04pOwotICAgICAgICB1c2VDbGllbnRDb21wcmVzc2lvbiA9IChjbGllbnRDb21wcmVzc2lvbiAhPSBudWxsKSAmJiBCb29sZWFuLnBhcnNlQm9vbGVhbihjbGllbnRDb21wcmVzc2lvbi50b1N0cmluZygpKTsKLQotICAgICAgICBpZiAoc2Vzc2lvbi5nZXQoQ21pc0JpbmRpbmdzSGVscGVyLkFDQ0VQVF9MQU5HVUFHRSkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIGFjY2VwdExhbmd1YWdlID0gc2Vzc2lvbi5nZXQoQ21pc0JpbmRpbmdzSGVscGVyLkFDQ0VQVF9MQU5HVUFHRSkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHVzZUNvbXByZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gdXNlQ29tcHJlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdXNlQ2xpZW50Q29tcHJlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiB1c2VDbGllbnRDb21wcmVzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdExhbmd1YWdlKCkgewotICAgICAgICByZXR1cm4gYWNjZXB0TGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBSZXBvc2l0b3J5IFNlcnZpY2UgcG9ydCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlUG9ydCBnZXRSZXBvc2l0b3J5U2VydmljZVBvcnQoQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwb3J0T2JqZWN0ID0gZ2V0UG9ydE9iamVjdChDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLlJFUE9TSVRPUllfU0VSVklDRSk7Ci0gICAgICAgIHNldFNvYXBBY3Rpb24ocG9ydE9iamVjdCwgc29hcEFjdGlvbiwgY21pc1ZlcnNpb24pOwotCi0gICAgICAgIHJldHVybiAoUmVwb3NpdG9yeVNlcnZpY2VQb3J0KSBwb3J0T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgTmF2aWdhdGlvbiBTZXJ2aWNlIHBvcnQgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBOYXZpZ2F0aW9uU2VydmljZVBvcnQgZ2V0TmF2aWdhdGlvblNlcnZpY2VQb3J0KENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcG9ydE9iamVjdCA9IGdldFBvcnRPYmplY3QoQ21pc1dlYlNlcml2Y2VzU2VydmljZS5OQVZJR0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICBzZXRTb2FwQWN0aW9uKHBvcnRPYmplY3QsIHNvYXBBY3Rpb24sIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICByZXR1cm4gKE5hdmlnYXRpb25TZXJ2aWNlUG9ydCkgcG9ydE9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIE9iamVjdCBTZXJ2aWNlIHBvcnQgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RTZXJ2aWNlUG9ydCBnZXRPYmplY3RTZXJ2aWNlUG9ydChDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHBvcnRPYmplY3QgPSBnZXRQb3J0T2JqZWN0KENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuT0JKRUNUX1NFUlZJQ0UpOwotICAgICAgICBzZXRTb2FwQWN0aW9uKHBvcnRPYmplY3QsIHNvYXBBY3Rpb24sIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICByZXR1cm4gKE9iamVjdFNlcnZpY2VQb3J0KSBwb3J0T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgVmVyc2lvbmluZyBTZXJ2aWNlIHBvcnQgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBWZXJzaW9uaW5nU2VydmljZVBvcnQgZ2V0VmVyc2lvbmluZ1NlcnZpY2VQb3J0KENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcG9ydE9iamVjdCA9IGdldFBvcnRPYmplY3QoQ21pc1dlYlNlcml2Y2VzU2VydmljZS5WRVJTSU9OSU5HX1NFUlZJQ0UpOwotICAgICAgICBzZXRTb2FwQWN0aW9uKHBvcnRPYmplY3QsIHNvYXBBY3Rpb24sIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICByZXR1cm4gKFZlcnNpb25pbmdTZXJ2aWNlUG9ydCkgcG9ydE9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIERpc2NvdmVyeSBTZXJ2aWNlIHBvcnQgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBEaXNjb3ZlcnlTZXJ2aWNlUG9ydCBnZXREaXNjb3ZlcnlTZXJ2aWNlUG9ydChDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHBvcnRPYmplY3QgPSBnZXRQb3J0T2JqZWN0KENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuRElTQ09WRVJZX1NFUlZJQ0UpOwotICAgICAgICBzZXRTb2FwQWN0aW9uKHBvcnRPYmplY3QsIHNvYXBBY3Rpb24sIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICByZXR1cm4gKERpc2NvdmVyeVNlcnZpY2VQb3J0KSBwb3J0T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgTXVsdGlGaWxpbmcgU2VydmljZSBwb3J0IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCBnZXRNdWx0aUZpbGluZ1NlcnZpY2VQb3J0KENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcG9ydE9iamVjdCA9IGdldFBvcnRPYmplY3QoQ21pc1dlYlNlcml2Y2VzU2VydmljZS5NVUxUSUZJTElOR19TRVJWSUNFKTsKLSAgICAgICAgc2V0U29hcEFjdGlvbihwb3J0T2JqZWN0LCBzb2FwQWN0aW9uLCBjbWlzVmVyc2lvbik7Ci0KLSAgICAgICAgcmV0dXJuIChNdWx0aUZpbGluZ1NlcnZpY2VQb3J0KSBwb3J0T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgUmVsYXRpb25zaGlwIFNlcnZpY2UgcG9ydCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IGdldFJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0KENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcG9ydE9iamVjdCA9IGdldFBvcnRPYmplY3QoQ21pc1dlYlNlcml2Y2VzU2VydmljZS5SRUxBVElPTlNISVBfU0VSVklDRSk7Ci0gICAgICAgIHNldFNvYXBBY3Rpb24ocG9ydE9iamVjdCwgc29hcEFjdGlvbiwgY21pc1ZlcnNpb24pOwotCi0gICAgICAgIHJldHVybiAoUmVsYXRpb25zaGlwU2VydmljZVBvcnQpIHBvcnRPYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBQb2xpY3kgU2VydmljZSBwb3J0IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUG9saWN5U2VydmljZVBvcnQgZ2V0UG9saWN5U2VydmljZVBvcnQoQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwb3J0T2JqZWN0ID0gZ2V0UG9ydE9iamVjdChDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLlBPTElDWV9TRVJWSUNFKTsKLSAgICAgICAgc2V0U29hcEFjdGlvbihwb3J0T2JqZWN0LCBzb2FwQWN0aW9uLCBjbWlzVmVyc2lvbik7Ci0KLSAgICAgICAgcmV0dXJuIChQb2xpY3lTZXJ2aWNlUG9ydCkgcG9ydE9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEFDTCBTZXJ2aWNlIHBvcnQgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBBQ0xTZXJ2aWNlUG9ydCBnZXRBQ0xTZXJ2aWNlUG9ydChDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHBvcnRPYmplY3QgPSBnZXRQb3J0T2JqZWN0KENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuQUNMX1NFUlZJQ0UpOwotICAgICAgICBzZXRTb2FwQWN0aW9uKHBvcnRPYmplY3QsIHNvYXBBY3Rpb24sIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICByZXR1cm4gKEFDTFNlcnZpY2VQb3J0KSBwb3J0T2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZENhbGwoT2JqZWN0IHBvcnRPYmplY3QpIHsKLSAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoUHJvdmlkZXIgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0QXV0aGVudGljYXRpb25Qcm92aWRlcihzZXNzaW9uKTsKLSAgICAgICAgaWYgKGF1dGhQcm92aWRlciAhPSBudWxsICYmIHBvcnRPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnRPYmplY3Q7Ci0gICAgICAgICAgICBTdHJpbmcgdXJsID0gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICAgICAgaWYgKGJwLmdldFJlc3BvbnNlQ29udGV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSAoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PikgYnAuZ2V0UmVzcG9uc2VDb250ZXh0KCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTKTsKLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHN0YXR1c0NvZGUgPSAoSW50ZWdlcikgYnAuZ2V0UmVzcG9uc2VDb250ZXh0KCkuZ2V0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSk7Ci0gICAgICAgICAgICAgICAgYXV0aFByb3ZpZGVyLnB1dFJlc3BvbnNlSGVhZGVycyh1cmwsIHN0YXR1c0NvZGUgPT0gbnVsbCA/IC0xIDogc3RhdHVzQ29kZSwgaGVhZGVycyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENtaXNXZWJTZXJpdmNlc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChwb3J0T2JqZWN0IGluc3RhbmNlb2YgUmVwb3NpdG9yeVNlcnZpY2VQb3J0KSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZSA9IENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuUkVQT1NJVE9SWV9TRVJWSUNFOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0T2JqZWN0IGluc3RhbmNlb2YgTmF2aWdhdGlvblNlcnZpY2VQb3J0KSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZSA9IENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuTkFWSUdBVElPTl9TRVJWSUNFOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0T2JqZWN0IGluc3RhbmNlb2YgT2JqZWN0U2VydmljZVBvcnQpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlID0gQ21pc1dlYlNlcml2Y2VzU2VydmljZS5PQkpFQ1RfU0VSVklDRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocG9ydE9iamVjdCBpbnN0YW5jZW9mIFZlcnNpb25pbmdTZXJ2aWNlUG9ydCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLlZFUlNJT05JTkdfU0VSVklDRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocG9ydE9iamVjdCBpbnN0YW5jZW9mIERpc2NvdmVyeVNlcnZpY2VQb3J0KSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZSA9IENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuRElTQ09WRVJZX1NFUlZJQ0U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBvcnRPYmplY3QgaW5zdGFuY2VvZiBNdWx0aUZpbGluZ1NlcnZpY2VQb3J0KSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZSA9IENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuTVVMVElGSUxJTkdfU0VSVklDRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocG9ydE9iamVjdCBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0KSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZSA9IENtaXNXZWJTZXJpdmNlc1NlcnZpY2UuUkVMQVRJT05TSElQX1NFUlZJQ0U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBvcnRPYmplY3QgaW5zdGFuY2VvZiBQb2xpY3lTZXJ2aWNlUG9ydCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLlBPTElDWV9TRVJWSUNFOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0T2JqZWN0IGluc3RhbmNlb2YgQUNMU2VydmljZVBvcnQpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlID0gQ21pc1dlYlNlcml2Y2VzU2VydmljZS5BQ0xfU0VSVklDRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9ydE9iamVjdExvY2subG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBcnJheURlcXVlPFNvZnRSZWZlcmVuY2U8QmluZGluZ1Byb3ZpZGVyPj4gcXVldWUgPSBwb3J0T2JqZWN0Q2FjaGUuZ2V0KHNlcnZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChxdWV1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVGhpcyBpcyBhIGJ1ZyEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocXVldWUuc2l6ZSgpIDwgUE9SVF9DQUNIRV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2gobmV3IFNvZnRSZWZlcmVuY2U8QmluZGluZ1Byb3ZpZGVyPihicCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFNvZnRSZWZlcmVuY2U8QmluZGluZ1Byb3ZpZGVyPj4gaXRlciA9IHF1ZXVlLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU29mdFJlZmVyZW5jZTxCaW5kaW5nUHJvdmlkZXI+IHJlZiA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi5nZXQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKG5ldyBTb2Z0UmVmZXJlbmNlPEJpbmRpbmdQcm92aWRlcj4oYnApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgcG9ydE9iamVjdExvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tIGludGVybmFsIC0tLS0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCBCaW5kaW5nUHJvdmlkZXIgZ2V0UG9ydE9iamVjdChmaW5hbCBDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgTWFwPENtaXNXZWJTZXJpdmNlc1NlcnZpY2UsIENtaXNTZXJ2aWNlSG9sZGVyPiBzZXJ2aWNlTWFwID0gKE1hcDxDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLCBDbWlzU2VydmljZUhvbGRlcj4pIHNlc3Npb24KLSAgICAgICAgICAgICAgICAuZ2V0KFNwaVNlc3Npb25QYXJhbWV0ZXIuU0VSVklDRVMpOwotCi0gICAgICAgIC8vIGRvZXMgdGhlIHNlcnZpY2UgbWFwIGV4aXN0PwotICAgICAgICBpZiAoc2VydmljZU1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXNzaW9uLndyaXRlTG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4KLSAgICAgICAgICAgICAgICBzZXJ2aWNlTWFwID0gKE1hcDxDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLCBDbWlzU2VydmljZUhvbGRlcj4pIHNlc3Npb24uZ2V0KFNwaVNlc3Npb25QYXJhbWV0ZXIuU0VSVklDRVMpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU1hcCA9IG5ldyBFbnVtTWFwPENtaXNXZWJTZXJpdmNlc1NlcnZpY2UsIENtaXNTZXJ2aWNlSG9sZGVyPihDbWlzV2ViU2VyaXZjZXNTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5wdXQoU3BpU2Vzc2lvblBhcmFtZXRlci5TRVJWSUNFUywgc2VydmljZU1hcCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VNYXAuY29udGFpbnNLZXkoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRPYmplY3Qoc2VydmljZU1hcC5nZXQoc2VydmljZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBzZXJ2aWNlIG9iamVjdAotICAgICAgICAgICAgICAgIENtaXNTZXJ2aWNlSG9sZGVyIHNlcnZpY2Vob2xkZXIgPSBpbml0U2VydmljZU9iamVjdChzZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlTWFwLnB1dChzZXJ2aWNlLCBzZXJ2aWNlaG9sZGVyKTsKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBwb3J0IG9iamVjdAotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVQb3J0T2JqZWN0KHNlcnZpY2Vob2xkZXIpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLndyaXRlVW5sb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpcyB0aGUgc2VydmljZSBpbiB0aGUgc2VydmljZSBtYXA/Ci0gICAgICAgIGlmICghc2VydmljZU1hcC5jb250YWluc0tleShzZXJ2aWNlKSkgewotICAgICAgICAgICAgc2Vzc2lvbi53cml0ZUxvY2soKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VNYXAuY29udGFpbnNLZXkoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRPYmplY3Qoc2VydmljZU1hcC5nZXQoc2VydmljZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBvYmplY3QKLSAgICAgICAgICAgICAgICBDbWlzU2VydmljZUhvbGRlciBzZXJ2aWNlaG9sZGVyID0gaW5pdFNlcnZpY2VPYmplY3Qoc2VydmljZSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZU1hcC5wdXQoc2VydmljZSwgc2VydmljZWhvbGRlcik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUG9ydE9iamVjdChzZXJ2aWNlaG9sZGVyKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi53cml0ZVVubG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRPYmplY3Qoc2VydmljZU1hcC5nZXQoc2VydmljZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZXJ2aWNlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc1NlcnZpY2VIb2xkZXIgaW5pdFNlcnZpY2VPYmplY3QoZmluYWwgQ21pc1dlYlNlcml2Y2VzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXNzaW9uIHt9OiBJbml0aWFsaXppbmcgV2ViIFNlcnZpY2Uge30gLi4uIiwgZ2V0U2Vzc2lvbigpLmdldFNlc3Npb25JZCgpLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNlcnZpY2VOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCBVUkxzCi0gICAgICAgICAgICBVUkwgZW5kcG9pbnRVcmwgPSBudWxsOwotCi0gICAgICAgICAgICBTdHJpbmcgd3NkbFVybFN0ciA9IChTdHJpbmcpIHNlc3Npb24uZ2V0KHNlcnZpY2UuZ2V0V3NkbEtleSgpKTsKLSAgICAgICAgICAgIGlmICh3c2RsVXJsU3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludFVybCA9IGdldEVuZHBvaW50VXJsRnJvbVdzZGwod3NkbFVybFN0ciwgc2VydmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludFVybFN0ciA9IChTdHJpbmcpIHNlc3Npb24uZ2V0KHNlcnZpY2UuZ2V0RW5kcG9pbnRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50VXJsU3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVcmwgPSBuZXcgVVJMKGVuZHBvaW50VXJsU3RyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbmRwb2ludFVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJOZWl0aGVyIGEgV1NETCBVUkwgbm9yIGFuIGVuZHBvaW50IFVSTCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBzZXJ2aWNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZS5nZXRTZXJ2aWNlTmFtZSgpICsgIiEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYnVpbGQgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlIG9iamVjdAotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzU2VydmljZUhvbGRlcihzZXJ2aWNlLCBlbmRwb2ludFVybCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjZTsKLSAgICAgICAgfSBjYXRjaCAoSFRUUEV4Y2VwdGlvbiBoZSkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ2Fubm90IGNvbm5lY3QgdG8gV2ViIFNlcnZpY2VzIFsiICsgc2VydmljZS5nZXRTZXJ2aWNlTmFtZSgpICsgIl06ICIgKyBoZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAoaGUuZ2V0U3RhdHVzQ29kZSgpID09IDQwMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzVW5hdXRob3JpemVkRXhjZXB0aW9uKG1lc3NhZ2UsIGhlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGUuZ2V0U3RhdHVzQ29kZSgpID09IDQwNCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24obWVzc2FnZSwgaGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChoZS5nZXRTdGF0dXNDb2RlKCkgPT0gNDA3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKG1lc3NhZ2UsIGhlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGUuZ2V0U3RhdHVzQ29kZSgpID09IDMwMSB8fCBoZS5nZXRTdGF0dXNDb2RlKCkgPT0gMzAyIHx8IGhlLmdldFN0YXR1c0NvZGUoKSA9PSAzMDMKLSAgICAgICAgICAgICAgICAgICAgfHwgaGUuZ2V0U3RhdHVzQ29kZSgpID09IDMwNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiUmVkaXJlY3RzIGFyZSBub3Qgc3VwcG9ydGVkIChIVFRQIHN0YXR1cyBjb2RlICIgKyBoZS5nZXRTdGF0dXNDb2RlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIik6ICIgKyBtZXNzYWdlLCBoZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbihtZXNzYWdlLCBoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgaW5pdGFsaXplIFdlYiBTZXJ2aWNlcyBzZXJ2aWNlIG9iamVjdCBbIiArIHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSArICJdOiAiCi0gICAgICAgICAgICAgICAgICAgICsgaXRlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKG1lc3NhZ2UsIGl0ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgaW5pdGFsaXplIFdlYiBTZXJ2aWNlcyBzZXJ2aWNlIG9iamVjdCBbIiArIHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSArICJdOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgVVJMIGFuZCBleHRyYWN0cyB0aGUgZW5kcG9pbnQgVVJMIG9mIHRoZSBnaXZlbiBzZXJ2aWNlLgotICAgICAqLwotICAgIHByaXZhdGUgVVJMIGdldEVuZHBvaW50VXJsRnJvbVdzZGwoZmluYWwgU3RyaW5nIHdzZGxVcmwsIGZpbmFsIENtaXNXZWJTZXJpdmNlc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBJbnB1dFN0cmVhbSB3c2RsU3RyZWFtOwotICAgICAgICBVUkwgdXJsOwotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBXU0RMIFVSTAotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh3c2RsVXJsKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBXU0RMIFVSTDogIiArIHdzZGxVcmwsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgcHJvdG9jb2wKLSAgICAgICAgaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFsc0lnbm9yZUNhc2UoImh0dHAiKSB8fCB1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwcyIpKSB7Ci0gICAgICAgICAgICAvLyBIVFRQIFVSTCAtPiB1c2UgSHR0cEludm9rZXIgdG8gZW5hYmxlIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICBIdHRwSW52b2tlciBoaSA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRIdHRwSW52b2tlcihzZXNzaW9uKTsKLSAgICAgICAgICAgIFJlc3BvbnNlIHdzZGxSZXNwb25zZSA9IGhpLmludm9rZUdFVChuZXcgVXJsQnVpbGRlcih3c2RsVXJsKSwgc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIGlmICh3c2RsUmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkgIT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJDYW5ub3QgYWNjZXNzIFdTREw6ICIgKyB3c2RsVXJsLCBCaWdJbnRlZ2VyLlpFUk8sCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsUmVzcG9uc2UuZ2V0RXJyb3JDb250ZW50KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3c2RsU3RyZWFtID0gd3NkbFJlc3BvbnNlLmdldFN0cmVhbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm9uLUhUVFAgVVJMIC0+IGp1c3Qgb3BlbiB0aGUgc3RyZWFtCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdzZGxTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGFjY2VzcyBXU0RMOiAiICsgd3NkbFVybCwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSB0aGUgV1NETAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMucGFyc2VEb21Eb2N1bWVudChuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh3c2RsU3RyZWFtLCA2NCAqIDEwMjQpKTsKLQotICAgICAgICAgICAgTm9kZUxpc3Qgc2VyaXZjZUxpc3QgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLCAic2VydmljZSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJpdmNlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBzZXJ2aWNlTm9kZSA9IChFbGVtZW50KSBzZXJpdmNlTGlzdC5pdGVtKGkpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzZXJ2aWNlTm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBOb2RlTGlzdCBwb3J0TGlzdCA9IHNlcnZpY2VOb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiwgInBvcnQiKTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydExpc3QuZ2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzZXJ2aWNlIGhhcyBubyBwb3J0czogIiArIHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBwb3J0ID0gKEVsZW1lbnQpIHBvcnRMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgICAgICAgICAgICBOb2RlTGlzdCBhZGRyZXNzTGlzdCA9IHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIsICJhZGRyZXNzIik7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3NMaXN0LmdldExlbmd0aCgpIDwgMSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2VydmljZSBoYXMgbm8gZW5kcG9pbnQgYWRkcmVzczogIiArIHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBhZGRyZXNzID0gKEVsZW1lbnQpIGFkZHJlc3NMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBhZGRyZXNzLmdldEF0dHJpYnV0ZSgibG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlRoaXMgc2VydmljZSBoYXMgbm8gZW5kcG9pbnQgYWRkcmVzczogIiArIHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIGFuIGludmFsaWQgZW5kcG9pbnQgYWRkcmVzczogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZS5nZXRTZXJ2aWNlTmFtZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVGhpcyBzZXJ2aWNlIGRvZXMgbm90IHByb3ZpZGUgYW4gZW5kcG9pbnQgYWRkcmVzczogIgotICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHBhcnNlIHRoaXMgV1NETDogIiArIHdzZGxVcmwsIHBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBwYXJzZSB0aGlzIFdTREw6ICIgKyB3c2RsVXJsLCBzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgcmVhZCB0aGlzIFdTREw6ICIgKyB3c2RsVXJsLCBpb2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkod3NkbFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IEhUVFAgaGVhZGVycyBvbiBhIHtAbGluayBCaW5kaW5nUHJvdmlkZXJ9IG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRIVFRQSGVhZGVycyhCaW5kaW5nUHJvdmlkZXIgcG9ydE9iamVjdCwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBodHRwSGVhZGVycykgewotICAgICAgICBpZiAoaHR0cEhlYWRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgaHR0cEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENNSVMgY2xpZW50IGhlYWRlcgotICAgICAgICBodHRwSGVhZGVycy5wdXQoIlgtQ01JUy1DbGllbnQiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KENsaWVudFZlcnNpb24uT1BFTkNNSVNfQ0xJRU5UKSk7Ci0KLSAgICAgICAgLy8gY29tcHJlc3Npb24KLSAgICAgICAgaWYgKHVzZUNvbXByZXNzaW9uKSB7Ci0gICAgICAgICAgICBodHRwSGVhZGVycy5wdXQoIkFjY2VwdC1FbmNvZGluZyIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImd6aXAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjbGllbnQgY29tcHJlc3Npb24KLSAgICAgICAgaWYgKHVzZUNsaWVudENvbXByZXNzaW9uKSB7Ci0gICAgICAgICAgICBodHRwSGVhZGVycy5wdXQoIkNvbnRlbnQtRW5jb2RpbmciLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJnemlwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9jYWxlCi0gICAgICAgIGlmIChhY2NlcHRMYW5ndWFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBodHRwSGVhZGVycy5wdXQoIkFjY2VwdC1MYW5ndWFnZSIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYWNjZXB0TGFuZ3VhZ2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMsIGh0dHBIZWFkZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmRwb2ludCBVUkwgaWYgdGhlIFVSTCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RW5kcG9pbnRVcmwoQmluZGluZ1Byb3ZpZGVyIHBvcnRPYmplY3QsIFVSTCBlbmRwb2ludFVybCkgewotICAgICAgICBpZiAoZW5kcG9pbnRVcmwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9ydE9iamVjdC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgU09BUCBBY3Rpb24gaGVhZGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFNvYXBBY3Rpb24oQmluZGluZ1Byb3ZpZGVyIHBvcnRPYmplY3QsIFN0cmluZyBzb2FwQWN0aW9uLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgewotICAgICAgICBwb3J0T2JqZWN0LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb3J0T2JqZWN0LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgc29hcEFjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc2ltcGxlIHBvcnQgb2JqZWN0IGZyb20gYSBDbWlzU2VydmljZUhvbGRlciBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdQcm92aWRlciBjcmVhdGVQb3J0T2JqZWN0RnJvbVNlcnZpY2VIb2xkZXIoZmluYWwgQ21pc1NlcnZpY2VIb2xkZXIgc2VydmljZUhvbGRlciwKLSAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcG9ydE9iamVjdExvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlEZXF1ZTxTb2Z0UmVmZXJlbmNlPEJpbmRpbmdQcm92aWRlcj4+IHF1ZXVlID0gcG9ydE9iamVjdENhY2hlLmdldChzZXJ2aWNlSG9sZGVyLmdldFNlcnZpY2UoKSk7Ci0gICAgICAgICAgICBpZiAocXVldWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHF1ZXVlID0gbmV3IEFycmF5RGVxdWU8U29mdFJlZmVyZW5jZTxCaW5kaW5nUHJvdmlkZXI+PigpOwotICAgICAgICAgICAgICAgIHBvcnRPYmplY3RDYWNoZS5wdXQoc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlKCksIHF1ZXVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKCFxdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSBxdWV1ZS5wb3AoKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydE9iamVjdExvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEJpbmRpbmdQcm92aWRlcikgc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlT2JqZWN0KCkuZ2V0UG9ydChzZXJ2aWNlSG9sZGVyLmdldFNlcnZpY2UoKS5nZXRQb3J0Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHBvcnQgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBCaW5kaW5nUHJvdmlkZXIgY3JlYXRlUG9ydE9iamVjdChDbWlzU2VydmljZUhvbGRlciBzZXJ2aWNlSG9sZGVyKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvQWJzdHJhY3RXZWJTZXJ2aWNlc1NlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvQWJzdHJhY3RXZWJTZXJ2aWNlc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwNzljYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL0Fic3RyYWN0V2ViU2VydmljZXNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNtaXNCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5SZXBvc2l0b3J5SW5mb0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNTdG9yYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNWZXJzaW9uaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgV2ViIFNlcnZpY2VzIGNsaWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2VzU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIEJpbmRpbmdTZXNzaW9uIHNlc3Npb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U2Vzc2lvbihCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCaW5kaW5nU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIFdlYiBTZXJ2aWNlcyBFeGNlcHRpb24gaW50byBhIENNSVMgQ2xpZW50IGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0Jhc2VFeGNlcHRpb24gY29udmVydEV4Y2VwdGlvbihDbWlzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIGlmICgoZXggPT0gbnVsbCkgfHwgKGV4LmdldEZhdWx0SW5mbygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDbWlzRXhjZXB0aW9uIGhhcyBubyBmYXVsdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtc2cgPSBleC5nZXRGYXVsdEluZm8oKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIEJpZ0ludGVnZXIgY29kZSA9IGV4LmdldEZhdWx0SW5mbygpLmdldENvZGUoKTsKLQotICAgICAgICBTdHJpbmcgZXJyb3JDb250ZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKCFleC5nZXRGYXVsdEluZm8oKS5nZXRBbnkoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGV4LmdldEZhdWx0SW5mbygpLmdldEFueSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChnZXROb2RlQXNTdHJpbmcoKE5vZGUpIG8pKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChvLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnJvckNvbnRlbnQgPSBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChleC5nZXRGYXVsdEluZm8oKS5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBDT05TVFJBSU5UOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbihtc2csIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgICAgIGNhc2UgQ09OVEVOVF9BTFJFQURZX0VYSVNUUzoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKG1zZywgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICAgICAgY2FzZSBGSUxURVJfTk9UX1ZBTElEOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24obXNnLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgICAgICBjYXNlIElOVkFMSURfQVJHVU1FTlQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obXNnLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgICAgICBjYXNlIE5BTUVfQ09OU1RSQUlOVF9WSU9MQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihtc2csIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgICAgIGNhc2UgTk9UX1NVUFBPUlRFRDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihtc2csIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgICAgIGNhc2UgT0JKRUNUX05PVF9GT1VORDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKG1zZywgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICAgICAgY2FzZSBQRVJNSVNTSU9OX0RFTklFRDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24obXNnLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgICAgICBjYXNlIFJVTlRJTUU6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKG1zZywgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICAgICAgY2FzZSBTVE9SQUdFOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihtc2csIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgICAgIGNhc2UgU1RSRUFNX05PVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24obXNnLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgICAgICBjYXNlIFVQREFURV9DT05GTElDVDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKG1zZywgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICAgICAgY2FzZSBWRVJTSU9OSU5HOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbihtc2csIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGV4Y2VwdGlvblsiICsgZXguZ2V0RmF1bHRJbmZvKCkuZ2V0VHlwZSgpLnZhbHVlKCkgKyAiXTogIiArIG1zZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5vZGVBc1N0cmluZyhOb2RlIG5vZGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1ydCA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybXJ0LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKLSAgICAgICAgICAgIC8vIHRyYW5zZm9ybXJ0LnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0KLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybXJ0LnRyYW5zZm9ybShuZXcgRE9NU291cmNlKG5vZGUpLCBuZXcgU3RyZWFtUmVzdWx0KHN3KSk7Ci0gICAgICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgQ01JUyB2ZXJzaW9uIG9mIHRoZSBnaXZlbiByZXBvc2l0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIGlmIChDbWlzQmluZGluZ3NIZWxwZXIuZ2V0Rm9yY2VkQ21pc1ZlcnNpb24oc2Vzc2lvbikgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIENtaXNCaW5kaW5nc0hlbHBlci5nZXRGb3JjZWRDbWlzVmVyc2lvbihzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvQ2FjaGUgY2FjaGUgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0UmVwb3NpdG9yeUluZm9DYWNoZShzZXNzaW9uKTsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gaW5mbyA9IGNhY2hlLmdldChyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIGluZm8gPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0U1BJKHNlc3Npb24pLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWNoZS5wdXQoaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgdmVyc2lvbiBpcyB1bmtub3duIHRyeSBDTUlTIDEuMAotICAgICAgICByZXR1cm4gKGluZm8gPT0gbnVsbCA/IENtaXNWZXJzaW9uLkNNSVNfMV8wIDogaW5mby5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL0FjbFNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL0FjbFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGFkMGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9BY2xTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQUNMU2VydmljZVBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQUNMUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQWNsU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5FeHRlbmRlZEFjbFNlcnZpY2U7Ci0KLS8qKgotICogQUNMIFNlcnZpY2UgV2ViIFNlcnZpY2VzIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIEFjbFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlc1NlcnZpY2UgaW1wbGVtZW50cyBBY2xTZXJ2aWNlLCBFeHRlbmRlZEFjbFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBvcnRQcm92aWRlciBwb3J0UHJvdmlkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNsU2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQWJzdHJhY3RQb3J0UHJvdmlkZXIgcG9ydFByb3ZpZGVyKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIHRoaXMucG9ydFByb3ZpZGVyID0gcG9ydFByb3ZpZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMsCi0gICAgICAgICAgICBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIEFDTFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0QUNMU2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImFwcGx5QUNMIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnQuYXBwbHlBQ0wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY29udmVydChhZGRBQ0VzKSwgY29udmVydChyZW1vdmVBQ0VzKSwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChFbnVtQUNMUHJvcGFnYXRpb24uY2xhc3MsIGFjbFByb3BhZ2F0aW9uKSwgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIEFDTFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0QUNMU2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImdldEFDTCIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydChwb3J0LmdldEFDTChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgc2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMpIHsKLSAgICAgICAgQWNsIGN1cnJlbnRBY2wgPSBnZXRBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmFsc2UsIG51bGwpOwotCi0gICAgICAgIExpc3Q8QWNlPiByZW1vdmVBY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0gICAgICAgIGlmIChjdXJyZW50QWNsLmdldEFjZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiBjdXJyZW50QWNsLmdldEFjZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChhY2UuaXNEaXJlY3QoKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVBY2VzLmFkZChhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2VzLCBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKHJlbW92ZUFjZXMpLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvQXhpczJQb3J0UHJvdmlkZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvQXhpczJQb3J0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlYWRmMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL0F4aXMyUG9ydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNtaXNCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BdXRoZW50aWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBeGlzMiBKQVgtV1MgaW1wbGVtZW50YXRpb24KLSAqIAotICogISEhIEVYUEVSSU1FTlRBTCAhISEKLSAqLwotcHVibGljIGNsYXNzIEF4aXMyUG9ydFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQb3J0UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBeGlzMlBvcnRQcm92aWRlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcG9ydCBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdQcm92aWRlciBjcmVhdGVQb3J0T2JqZWN0KENtaXNTZXJ2aWNlSG9sZGVyIHNlcnZpY2VIb2xkZXIpIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24ge306IENyZWF0aW5nIFdlYiBTZXJ2aWNlIHBvcnQgb2JqZWN0IG9mIHt9IC4uLiIsIGdldFNlc3Npb24oKS5nZXRTZXNzaW9uSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgcG9ydCBvYmplY3QKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwb3J0T2JqZWN0ID0gY3JlYXRlUG9ydE9iamVjdEZyb21TZXJ2aWNlSG9sZGVyKHNlcnZpY2VIb2xkZXIsIG5ldyBNVE9NRmVhdHVyZSgpKTsKLQotICAgICAgICAgICAgLy8gYWRkIFNPQVAgYW5kIEhUVFAgYXV0aGVudGljYXRpb24gaGVhZGVycwotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoUHJvdmlkZXIgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0QXV0aGVudGljYXRpb25Qcm92aWRlcihnZXRTZXNzaW9uKCkpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBodHRwSGVhZGVycyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYXV0aFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBTT0FQIGhlYWRlcgotICAgICAgICAgICAgICAgIEVsZW1lbnQgc29hcEhlYWRlciA9IGF1dGhQcm92aWRlci5nZXRTT0FQSGVhZGVycyhwb3J0T2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIGhlYWRlclhtbCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShzb2FwSGVhZGVyKSwgbmV3IFN0cmVhbVJlc3VsdChoZWFkZXJYbWwpKTsKLQotICAgICAgICAgICAgICAgICAgICBNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4gaGVhZGVyID0gbmV3IEhhc2hNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnB1dChuZXcgUU5hbWUoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwgc29hcEhlYWRlci5nZXRMb2NhbE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChoZWFkZXJYbWwudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICBwb3J0T2JqZWN0LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KENvbnN0YW50cy5KQVhXU19PVVRCT1VORF9TT0FQX0hFQURFUlMsIGhlYWRlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSFRUUCBoZWFkZXIKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gKHNlcnZpY2VIb2xkZXIuZ2V0RW5kcG9pbnRVcmwoKSAhPSBudWxsID8gc2VydmljZUhvbGRlci5nZXRFbmRwb2ludFVybCgpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlT2JqZWN0KCkuZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBodHRwSGVhZGVycyA9IGF1dGhQcm92aWRlci5nZXRIVFRQSGVhZGVycyh1cmwpOwotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2V0IFNTTCBGYWN0b3J5Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZXQgSG9zdG5hbWUgVmVyaWZpZXIKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IEhUVFAgaGVhZGVycwotICAgICAgICAgICAgc2V0SFRUUEhlYWRlcnMocG9ydE9iamVjdCwgaHR0cEhlYWRlcnMpOwotCi0gICAgICAgICAgICAvLyBzZXQgZW5kcG9pbnQgVVJMCi0gICAgICAgICAgICBzZXRFbmRwb2ludFVybChwb3J0T2JqZWN0LCBzZXJ2aWNlSG9sZGVyLmdldEVuZHBvaW50VXJsKCkpOwotCi0gICAgICAgICAgICAvLyBIVFRQIHNldHRpbmdzCi0gICAgICAgICAgICBwb3J0T2JqZWN0LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEhUVFBDb25zdGFudHMuUkVVU0VfSFRUUF9DTElFTlQsICJ0cnVlIik7Ci0KLSAgICAgICAgICAgIC8vIHRpbWVvdXRzCi0gICAgICAgICAgICBpbnQgY29ubmVjdFRpbWVvdXQgPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ09OTkVDVF9USU1FT1VULCAtMSk7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoSFRUUENvbnN0YW50cy5DT05ORUNUSU9OX1RJTUVPVVQsIEludGVnZXIudmFsdWVPZihjb25uZWN0VGltZW91dCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcmVhZFRpbWVvdXQgPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUkVBRF9USU1FT1VULCAtMSk7Ci0gICAgICAgICAgICBpZiAocmVhZFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoSFRUUENvbnN0YW50cy5TT19USU1FT1VULCBJbnRlZ2VyLnZhbHVlT2YocmVhZFRpbWVvdXQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHBvcnRPYmplY3Q7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiQ2Fubm90IGluaXRhbGl6ZSBXZWIgU2VydmljZXMgcG9ydCBvYmplY3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL0NYRlBvcnRQcm92aWRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9DWEZQb3J0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1M2ExOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL0NYRlBvcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5DbWlzQmluZGluZ3NIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQmFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmN4Zi5lbmRwb2ludC5DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jeGYuZnJvbnRlbmQuQ2xpZW50UHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jeGYuaGVhZGVycy5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jeGYudHJhbnNwb3J0Lmh0dHAuSFRUUENvbmR1aXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jeGYudHJhbnNwb3J0cy5odHRwLmNvbmZpZ3VyYXRpb24uSFRUUENsaWVudFBvbGljeTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQXBhY2hlIENYRiBKQVgtV1MgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZQb3J0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFBvcnRQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENYRlBvcnRQcm92aWRlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcG9ydCBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdQcm92aWRlciBjcmVhdGVQb3J0T2JqZWN0KENtaXNTZXJ2aWNlSG9sZGVyIHNlcnZpY2VIb2xkZXIpIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24ge306IENyZWF0aW5nIFdlYiBTZXJ2aWNlIHBvcnQgb2JqZWN0IG9mIHt9IC4uLiIsIGdldFNlc3Npb24oKS5nZXRTZXNzaW9uSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgcG9ydCBvYmplY3QKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwb3J0T2JqZWN0ID0gY3JlYXRlUG9ydE9iamVjdEZyb21TZXJ2aWNlSG9sZGVyKHNlcnZpY2VIb2xkZXIsIG5ldyBNVE9NRmVhdHVyZSgpKTsKLQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydE9iamVjdC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAoKFNPQVBCaW5kaW5nKSBiaW5kaW5nKS5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gYWRkIFNPQVAgYW5kIEhUVFAgYXV0aGVudGljYXRpb24gaGVhZGVycwotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoUHJvdmlkZXIgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0QXV0aGVudGljYXRpb25Qcm92aWRlcihnZXRTZXNzaW9uKCkpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBodHRwSGVhZGVycyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYXV0aFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBTT0FQIGhlYWRlcgotICAgICAgICAgICAgICAgIEVsZW1lbnQgc29hcEhlYWRlciA9IGF1dGhQcm92aWRlci5nZXRTT0FQSGVhZGVycyhwb3J0T2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyLkhFQURFUl9MSVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IEhlYWRlcihuZXcgUU5hbWUoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwgc29hcEhlYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2FsTmFtZSgpKSwgc29hcEhlYWRlcikpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBIVFRQIGhlYWRlcgotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSAoc2VydmljZUhvbGRlci5nZXRFbmRwb2ludFVybCgpICE9IG51bGwgPyBzZXJ2aWNlSG9sZGVyLmdldEVuZHBvaW50VXJsKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXJ2aWNlSG9sZGVyLmdldFNlcnZpY2VPYmplY3QoKS5nZXRXU0RMRG9jdW1lbnRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGh0dHBIZWFkZXJzID0gYXV0aFByb3ZpZGVyLmdldEhUVFBIZWFkZXJzKHVybCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBIVFRQIGhlYWRlcnMKLSAgICAgICAgICAgIHNldEhUVFBIZWFkZXJzKHBvcnRPYmplY3QsIGh0dHBIZWFkZXJzKTsKLQotICAgICAgICAgICAgLy8gc2V0IGVuZHBvaW50IFVSTAotICAgICAgICAgICAgc2V0RW5kcG9pbnRVcmwocG9ydE9iamVjdCwgc2VydmljZUhvbGRlci5nZXRFbmRwb2ludFVybCgpKTsKLQotICAgICAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudFByb3h5LmdldENsaWVudChwb3J0T2JqZWN0KTsKLSAgICAgICAgICAgIEhUVFBDb25kdWl0IGh0dHAgPSAoSFRUUENvbmR1aXQpIGNsaWVudC5nZXRDb25kdWl0KCk7Ci0gICAgICAgICAgICBIVFRQQ2xpZW50UG9saWN5IGh0dHBDbGllbnRQb2xpY3kgPSBuZXcgSFRUUENsaWVudFBvbGljeSgpOwotICAgICAgICAgICAgaHR0cENsaWVudFBvbGljeS5zZXRBbGxvd0NodW5raW5nKHRydWUpOwotCi0gICAgICAgICAgICAvLyB0aW1lb3V0cwotICAgICAgICAgICAgaW50IGNvbm5lY3RUaW1lb3V0ID0gZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLkNPTk5FQ1RfVElNRU9VVCwgLTEpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0ID49IDApIHsKLSAgICAgICAgICAgICAgICBodHRwQ2xpZW50UG9saWN5LnNldENvbm5lY3Rpb25UaW1lb3V0KGNvbm5lY3RUaW1lb3V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHJlYWRUaW1lb3V0ID0gZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLlJFQURfVElNRU9VVCwgLTEpOwotICAgICAgICAgICAgaWYgKHJlYWRUaW1lb3V0ID49IDApIHsKLSAgICAgICAgICAgICAgICBodHRwQ2xpZW50UG9saWN5LnNldFJlY2VpdmVUaW1lb3V0KHJlYWRUaW1lb3V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaHR0cC5zZXRDbGllbnQoaHR0cENsaWVudFBvbGljeSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBwb3J0T2JqZWN0OwotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgdGhyb3cgY2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oIkNhbm5vdCBpbml0YWxpemUgV2ViIFNlcnZpY2VzIHBvcnQgb2JqZWN0OiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9DbWlzV2ViU2VydmljZXNTcGkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvQ21pc1dlYlNlcnZpY2VzU3BpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MzdmYTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9DbWlzV2ViU2VydmljZXNTcGkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQ21pc1NwaTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5DbGFzc0xvYWRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQWNsU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk11bHRpRmlsaW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5PYmplY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlBvbGljeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVsYXRpb25zaGlwU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIENNSVMgV2ViIFNlcnZpY2VzIFNQSSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIENtaXNXZWJTZXJ2aWNlc1NwaSBpbXBsZW1lbnRzIENtaXNTcGkgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSU1QTF9SSSA9ICJzdW5yaSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSU1QTF9KUkUgPSAic3VuanJlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19JTVBMX0NYRiA9ICJjeGYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX0lNUExfV0VCU1BIRVJFID0gIndlYnNwaGVyZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSU1QTF9BWElTMiA9ICJheGlzMiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ21pc1dlYlNlcnZpY2VzU3BpLmNsYXNzKTsKLQotICAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeVNlcnZpY2UgcmVwb3NpdG9yeVNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBOYXZpZ2F0aW9uU2VydmljZSBuYXZpZ2F0aW9uU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFNlcnZpY2Ugb2JqZWN0U2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25pbmdTZXJ2aWNlIHZlcnNpb25pbmdTZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgRGlzY292ZXJ5U2VydmljZSBkaXNjb3ZlcnlTZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgTXVsdGlGaWxpbmdTZXJ2aWNlIG11bHRpRmlsaW5nU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIFJlbGF0aW9uc2hpcFNlcnZpY2UgcmVsYXRpb25zaGlwU2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIFBvbGljeVNlcnZpY2UgcG9saWN5U2VydmljZTsKLSAgICBwcml2YXRlIGZpbmFsIEFjbFNlcnZpY2UgYWNsU2VydmljZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzV2ViU2VydmljZXNTcGkoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiU2Vzc2lvbiB7fTogSW5pdGlhbGl6aW5nIFdlYiBTZXJ2aWNlcyBTUEkuLi4iLCBzZXNzaW9uLmdldFNlc3Npb25JZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFic3RyYWN0UG9ydFByb3ZpZGVyIHBvcnRQcm92aWRlciA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHBvcnRQcm92aWRlckNsYXNzID0gKFN0cmluZykgc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT1JUX1BST1ZJREVSX0NMQVNTKTsKLSAgICAgICAgaWYgKHBvcnRQcm92aWRlckNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBqYXh3c0ltcGwgPSAoU3RyaW5nKSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0pBWFdTX0lNUEwpOwotCi0gICAgICAgICAgICBpZiAoamF4d3NJbXBsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXh3c0ltcGwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuamF4d3MuaW1wbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoamF4d3NJbXBsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQcm92aWRlciBwcm92aWRlciA9IFByb3ZpZGVyLnByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJObyBKQVgtV1MgaW1wbGVtZW50YXRpb24gZm91bmQhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyUGFja2FnZSA9IHByb3ZpZGVyLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlclBhY2thZ2Uuc3RhcnRzV2l0aCgiY29tLnN1bi54bWwuaW50ZXJuYWwud3Muc3BpIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9ydFByb3ZpZGVyID0gbmV3IFN1bkpSRVBvcnRQcm92aWRlcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdmlkZXJQYWNrYWdlLnN0YXJ0c1dpdGgoImNvbS5zdW4ueG1sLndzLnNwaSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnRQcm92aWRlciA9IG5ldyBTdW5SSVBvcnRQcm92aWRlcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdmlkZXJQYWNrYWdlLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY3hmLmpheHdzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9ydFByb3ZpZGVyID0gbmV3IENYRlBvcnRQcm92aWRlcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdmlkZXJQYWNrYWdlLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9ydFByb3ZpZGVyID0gbmV3IEF4aXMyUG9ydFByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZGV0ZWN0IEpBWC1XUyBpbXBsZW1lbnRhdGlvbiEgVXNlIHNlc3Npb24gcGFyYW1ldGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfSkFYV1NfSU1QTCArICIgdG8gc3BlY2lmeSBvbmUuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChKQVhXU19JTVBMX0pSRS5lcXVhbHMoamF4d3NJbXBsKSkgewotICAgICAgICAgICAgICAgIHBvcnRQcm92aWRlciA9IG5ldyBTdW5KUkVQb3J0UHJvdmlkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSkFYV1NfSU1QTF9SSS5lcXVhbHMoamF4d3NJbXBsKSkgewotICAgICAgICAgICAgICAgIHBvcnRQcm92aWRlciA9IG5ldyBTdW5SSVBvcnRQcm92aWRlcigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChKQVhXU19JTVBMX0NYRi5lcXVhbHMoamF4d3NJbXBsKSkgewotICAgICAgICAgICAgICAgIHBvcnRQcm92aWRlciA9IG5ldyBDWEZQb3J0UHJvdmlkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSkFYV1NfSU1QTF9XRUJTUEhFUkUuZXF1YWxzKGpheHdzSW1wbCkpIHsKLSAgICAgICAgICAgICAgICBwb3J0UHJvdmlkZXIgPSBuZXcgV2ViU3BoZXJlUG9ydFByb3ZpZGVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEpBWFdTX0lNUExfQVhJUzIuZXF1YWxzKGpheHdzSW1wbCkpIHsKLSAgICAgICAgICAgICAgICBwb3J0UHJvdmlkZXIgPSBuZXcgQXhpczJQb3J0UHJvdmlkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIEpBWC1XUyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZWQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPYmplY3QgcG9ydFByb3ZpZGVyT2JqID0gbnVsbDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwb3J0UHJvdmlkZXJPYmogPSBDbGFzc0xvYWRlclV0aWwubG9hZENsYXNzKHBvcnRQcm92aWRlckNsYXNzKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb3VsZCBub3QgbG9hZCBwb3J0IHByb3ZpZGVyOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghKHBvcnRQcm92aWRlck9iaiBpbnN0YW5jZW9mIEFic3RyYWN0UG9ydFByb3ZpZGVyKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBvcnQgcHJvdmlkZXIgZG9lcyBub3QgaW1wbGVtZW50IEFic3RyYWN0UG9ydFByb3ZpZGVyISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9ydFByb3ZpZGVyID0gKEFic3RyYWN0UG9ydFByb3ZpZGVyKSBwb3J0UHJvdmlkZXJPYmo7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiU2Vzc2lvbiB7fTogUG9ydCBwcm92aWRlciBjbGFzczoge30iLCBzZXNzaW9uLmdldFNlc3Npb25JZCgpLCBwb3J0UHJvdmlkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9ydFByb3ZpZGVyLnNldFNlc3Npb24oc2Vzc2lvbik7Ci0KLSAgICAgICAgcmVwb3NpdG9yeVNlcnZpY2UgPSBuZXcgUmVwb3NpdG9yeVNlcnZpY2VJbXBsKHNlc3Npb24sIHBvcnRQcm92aWRlcik7Ci0gICAgICAgIG5hdmlnYXRpb25TZXJ2aWNlID0gbmV3IE5hdmlnYXRpb25TZXJ2aWNlSW1wbChzZXNzaW9uLCBwb3J0UHJvdmlkZXIpOwotICAgICAgICBvYmplY3RTZXJ2aWNlID0gbmV3IE9iamVjdFNlcnZpY2VJbXBsKHNlc3Npb24sIHBvcnRQcm92aWRlcik7Ci0gICAgICAgIHZlcnNpb25pbmdTZXJ2aWNlID0gbmV3IFZlcnNpb25pbmdTZXJ2aWNlSW1wbChzZXNzaW9uLCBwb3J0UHJvdmlkZXIpOwotICAgICAgICBkaXNjb3ZlcnlTZXJ2aWNlID0gbmV3IERpc2NvdmVyeVNlcnZpY2VJbXBsKHNlc3Npb24sIHBvcnRQcm92aWRlcik7Ci0gICAgICAgIG11bHRpRmlsaW5nU2VydmljZSA9IG5ldyBNdWx0aUZpbGluZ1NlcnZpY2VJbXBsKHNlc3Npb24sIHBvcnRQcm92aWRlcik7Ci0gICAgICAgIHJlbGF0aW9uc2hpcFNlcnZpY2UgPSBuZXcgUmVsYXRpb25zaGlwU2VydmljZUltcGwoc2Vzc2lvbiwgcG9ydFByb3ZpZGVyKTsKLSAgICAgICAgcG9saWN5U2VydmljZSA9IG5ldyBQb2xpY3lTZXJ2aWNlSW1wbChzZXNzaW9uLCBwb3J0UHJvdmlkZXIpOwotICAgICAgICBhY2xTZXJ2aWNlID0gbmV3IEFjbFNlcnZpY2VJbXBsKHNlc3Npb24sIHBvcnRQcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlIGdldFJlcG9zaXRvcnlTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE5hdmlnYXRpb25TZXJ2aWNlIGdldE5hdmlnYXRpb25TZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gbmF2aWdhdGlvblNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFNlcnZpY2UgZ2V0T2JqZWN0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIERpc2NvdmVyeVNlcnZpY2UgZ2V0RGlzY292ZXJ5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGRpc2NvdmVyeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFZlcnNpb25pbmdTZXJ2aWNlIGdldFZlcnNpb25pbmdTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gdmVyc2lvbmluZ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE11bHRpRmlsaW5nU2VydmljZSBnZXRNdWx0aUZpbGluZ1NlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBtdWx0aUZpbGluZ1NlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFJlbGF0aW9uc2hpcFNlcnZpY2UgZ2V0UmVsYXRpb25zaGlwU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeVNlcnZpY2UgZ2V0UG9saWN5U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHBvbGljeVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbFNlcnZpY2UgZ2V0QWNsU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGFjbFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJBbGxDYWNoZXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJSZXBvc2l0b3J5Q2FjaGUoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICAvLyBuby1vcCBmb3IgV2ViIFNlcnZpY2VzCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9EaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGMzMjUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvRGlzY292ZXJ5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEhvbGRlclZhbHVlOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RMaXN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5EaXNjb3ZlcnlTZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRGlzY292ZXJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci0KLS8qKgotICogRGlzY292ZXJ5IFNlcnZpY2UgV2ViIFNlcnZpY2VzIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIERpc2NvdmVyeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlc1NlcnZpY2UgaW1wbGVtZW50cyBEaXNjb3ZlcnlTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RQb3J0UHJvdmlkZXIgcG9ydFByb3ZpZGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIERpc2NvdmVyeVNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIEFic3RyYWN0UG9ydFByb3ZpZGVyIHBvcnRQcm92aWRlcikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICB0aGlzLnBvcnRQcm92aWRlciA9IHBvcnRQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VMb2dUb2tlbiwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQUNMLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgRGlzY292ZXJ5U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXREaXNjb3ZlcnlTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLAotICAgICAgICAgICAgICAgICJnZXRDb250ZW50Q2hhbmdlcyIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcG9ydENoYW5nZUxva1Rva2VuID0gY29udmVydEhvbGRlcihjaGFuZ2VMb2dUb2tlbik7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNPYmplY3RMaXN0VHlwZT4gcG9ydE9iamVjdHMgPSBuZXcgamF2YXgueG1sLndzLkhvbGRlcjxDbWlzT2JqZWN0TGlzdFR5cGU+KCk7Ci0KLSAgICAgICAgICAgIHBvcnQuZ2V0Q29udGVudENoYW5nZXMocmVwb3NpdG9yeUlkLCBwb3J0Q2hhbmdlTG9rVG9rZW4sIGluY2x1ZGVQcm9wZXJ0aWVzLCBmaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBQ0wsIG1heEl0ZW1zLCBjb252ZXJ0KGV4dGVuc2lvbiksIHBvcnRPYmplY3RzKTsKLQotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUocG9ydENoYW5nZUxva1Rva2VuLCBjaGFuZ2VMb2dUb2tlbik7Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnRPYmplY3RzLnZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBEaXNjb3ZlcnlTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldERpc2NvdmVyeVNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJxdWVyeSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydChwb3J0LnF1ZXJ5KHJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgICAgIHNraXBDb3VudCwgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjU5YWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9NdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEV4dGVuc2lvbkhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEV4dGVuc2lvblZhbHVlczsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXh0ZW5zaW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5NdWx0aUZpbGluZ1NlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk11bHRpRmlsaW5nU2VydmljZTsKLQotLyoqCi0gKiBNdWx0aUZpbGluZyBTZXJ2aWNlIFdlYiBTZXJ2aWNlcyBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGluZ1NlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlc1NlcnZpY2UgaW1wbGVtZW50cyBNdWx0aUZpbGluZ1NlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBvcnRQcm92aWRlciBwb3J0UHJvdmlkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlGaWxpbmdTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uLCBBYnN0cmFjdFBvcnRQcm92aWRlciBwb3J0UHJvdmlkZXIpIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgdGhpcy5wb3J0UHJvdmlkZXIgPSBwb3J0UHJvdmlkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkT2JqZWN0VG9Gb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE11bHRpRmlsaW5nU2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwKLSAgICAgICAgICAgICAgICAiYWRkT2JqZWN0VG9Gb2xkZXIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LmFkZE9iamVjdFRvRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBhbGxWZXJzaW9ucywgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RGcm9tRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE11bHRpRmlsaW5nU2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwKLSAgICAgICAgICAgICAgICAicmVtb3ZlT2JqZWN0RnJvbUZvbGRlciIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIb2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHBvcnQucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9OYXZpZ2F0aW9uU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyYWUzZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0UGFyZW50c1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk5hdmlnYXRpb25TZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLQotLyoqCi0gKiBOYXZpZ2F0aW9uIFNlcnZpY2UgV2ViIFNlcnZpY2VzIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZXNTZXJ2aWNlIGltcGxlbWVudHMgTmF2aWdhdGlvblNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBvcnRQcm92aWRlciBwb3J0UHJvdmlkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTmF2aWdhdGlvblNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIEFic3RyYWN0UG9ydFByb3ZpZGVyIHBvcnRQcm92aWRlcikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICB0aGlzLnBvcnRQcm92aWRlciA9IHBvcnRQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0SW5Gb2xkZXJMaXN0IGdldENoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE5hdmlnYXRpb25TZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCAiZ2V0Q2hpbGRyZW4iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQocG9ydC5nZXRDaGlsZHJlbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIG9yZGVyQnksIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KEVudW1JbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCwgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXREZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTmF2aWdhdGlvblNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0TmF2aWdhdGlvblNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksCi0gICAgICAgICAgICAgICAgImdldERlc2NlbmRhbnRzIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZT4gY29udGFpbmVyTGlzdCA9IHBvcnQuZ2V0RGVzY2VuZGFudHMocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGNvbnZlcnQoRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksCi0gICAgICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICAvLyBubyBsaXN0PwotICAgICAgICAgICAgaWYgKGNvbnRhaW5lckxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb252ZXJ0IGxpc3QKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+KCk7Ci0gICAgICAgICAgICBmb3IgKENtaXNPYmplY3RJbkZvbGRlckNvbnRhaW5lclR5cGUgY29udGFpbmVyIDogY29udGFpbmVyTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udmVydChjb250YWluZXIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE5hdmlnYXRpb25TZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLAotICAgICAgICAgICAgICAgICJnZXRGb2xkZXJQYXJlbnQiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQocG9ydC5nZXRGb2xkZXJQYXJlbnQocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBjb252ZXJ0KGV4dGVuc2lvbikpKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldEZvbGRlclRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE5hdmlnYXRpb25TZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLAotICAgICAgICAgICAgICAgICJnZXRGb2xkZXJUcmVlIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZT4gY29udGFpbmVyTGlzdCA9IHBvcnQuZ2V0Rm9sZGVyVHJlZShyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgY29udmVydChFbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKSwKLSAgICAgICAgICAgICAgICAgICAgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIG5vIGxpc3Q/Ci0gICAgICAgICAgICBpZiAoY29udGFpbmVyTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbnZlcnQgbGlzdAotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLSAgICAgICAgICAgIGZvciAoQ21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSBjb250YWluZXIgOiBjb250YWluZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjb252ZXJ0KGNvbnRhaW5lcikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBnZXRPYmplY3RQYXJlbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE5hdmlnYXRpb25TZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLAotICAgICAgICAgICAgICAgICJnZXRPYmplY3RQYXJlbnRzIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdFBhcmVudHNUeXBlPiBwYXJlbnRzTGlzdCA9IHBvcnQuZ2V0T2JqZWN0UGFyZW50cyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBjb252ZXJ0KEVudW1JbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpLAotICAgICAgICAgICAgICAgICAgICByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICAvLyBubyBsaXN0PwotICAgICAgICAgICAgaWYgKHBhcmVudHNMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29udmVydCBsaXN0Ci0gICAgICAgICAgICBMaXN0PE9iamVjdFBhcmVudERhdGE+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0UGFyZW50RGF0YT4oKTsKLSAgICAgICAgICAgIGZvciAoQ21pc09iamVjdFBhcmVudHNUeXBlIHBhcmVudCA6IHBhcmVudHNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjb252ZXJ0KHBhcmVudCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDaGVja2VkT3V0RG9jcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE5hdmlnYXRpb25TZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE5hdmlnYXRpb25TZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLAotICAgICAgICAgICAgICAgICJnZXRDaGVja2VkT3V0RG9jcyIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydChwb3J0LmdldENoZWNrZWRPdXREb2NzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgICAgIHNraXBDb3VudCwgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvT2JqZWN0U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvT2JqZWN0U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI3YmIwMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL09iamVjdFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0RXh0ZW5zaW9uSG9sZGVyOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEV4dGVuc2lvblZhbHVlczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEhvbGRlclZhbHVlOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXh0ZW5zaW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0SWRBbmRDaGFuZ2VUb2tlblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1JlbmRpdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bVZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5PYmplY3RTZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLQotLyoqCi0gKiBPYmplY3QgU2VydmljZSBXZWIgU2VydmljZXMgY2xpZW50LgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VzU2VydmljZSBpbXBsZW1lbnRzIE9iamVjdFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBvcnRQcm92aWRlciBwb3J0UHJvdmlkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0U2VydmljZUltcGwoQmluZGluZ1Nlc3Npb24gc2Vzc2lvbiwgQWJzdHJhY3RQb3J0UHJvdmlkZXIgcG9ydFByb3ZpZGVyKSB7Ci0gICAgICAgIHNldFNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIHRoaXMucG9ydFByb3ZpZGVyID0gcG9ydFByb3ZpZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQUNFcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0T2JqZWN0U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImNyZWF0ZURvY3VtZW50Iik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPiBvYmplY3RJZCA9IG5ldyBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHBvcnQuY3JlYXRlRG9jdW1lbnQocmVwb3NpdG9yeUlkLCBjb252ZXJ0KHByb3BlcnRpZXMpLCBmb2xkZXJJZCwgY29udmVydChjb250ZW50U3RyZWFtLCBmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoRW51bVZlcnNpb25pbmdTdGF0ZS5jbGFzcywgdmVyc2lvbmluZ1N0YXRlKSwgcG9saWNpZXMsIGNvbnZlcnQoYWRkQUNFcyksCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQocmVtb3ZlQUNFcyksIHBvcnRFeHRlbnNpb24sIG9iamVjdElkKTsKLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKHBvcnRFeHRlbnNpb24sIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3RJZC52YWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHNvdXJjZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0T2JqZWN0U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwKLSAgICAgICAgICAgICAgICAiY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPiBvYmplY3RJZCA9IG5ldyBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHBvcnQuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKHJlcG9zaXRvcnlJZCwgc291cmNlSWQsIGNvbnZlcnQocHJvcGVydGllcyksIGZvbGRlcklkLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KEVudW1WZXJzaW9uaW5nU3RhdGUuY2xhc3MsIHZlcnNpb25pbmdTdGF0ZSksIHBvbGljaWVzLCBjb252ZXJ0KGFkZEFDRXMpLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KHJlbW92ZUFDRXMpLCBwb3J0RXh0ZW5zaW9uLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0SWQudmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3RTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE9iamVjdFNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJjcmVhdGVGb2xkZXIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmc+IG9iamVjdElkID0gbmV3IGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPigpOwotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gcG9ydEV4dGVuc2lvbiA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgcG9ydC5jcmVhdGVGb2xkZXIocmVwb3NpdG9yeUlkLCBjb252ZXJ0KHByb3BlcnRpZXMpLCBmb2xkZXJJZCwgcG9saWNpZXMsIGNvbnZlcnQoYWRkQUNFcyksCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQocmVtb3ZlQUNFcyksIHBvcnRFeHRlbnNpb24sIG9iamVjdElkKTsKLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKHBvcnRFeHRlbnNpb24sIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3RJZC52YWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBQ0VzLCBBY2wgcmVtb3ZlQUNFcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0T2JqZWN0U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImNyZWF0ZVBvbGljeSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQgPSBuZXcgamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LmNyZWF0ZVBvbGljeShyZXBvc2l0b3J5SWQsIGNvbnZlcnQocHJvcGVydGllcyksIGZvbGRlcklkLCBwb2xpY2llcywgY29udmVydChhZGRBQ0VzKSwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChyZW1vdmVBQ0VzKSwgcG9ydEV4dGVuc2lvbiwgb2JqZWN0SWQpOwotCi0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMocG9ydEV4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdElkLnZhbHVlOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUl0ZW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBQ0VzLCBBY2wgcmVtb3ZlQUNFcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGlmIChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiUmVwb3NpdG9yeSBpcyBhIENNSVMgMS4wIHJlcG9zaXRvcnkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE9iamVjdFNlcnZpY2VQb3J0KENtaXNWZXJzaW9uLkNNSVNfMV8xLCAiY3JlYXRlSXRlbSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQgPSBuZXcgamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LmNyZWF0ZUl0ZW0ocmVwb3NpdG9yeUlkLCBjb252ZXJ0KHByb3BlcnRpZXMpLCBmb2xkZXJJZCwgY29udmVydChhZGRBQ0VzKSwgY29udmVydChyZW1vdmVBQ0VzKSwKLSAgICAgICAgICAgICAgICAgICAgcG9ydEV4dGVuc2lvbiwgb2JqZWN0SWQpOwotCi0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMocG9ydEV4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdElkLnZhbHVlOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbGF0aW9uc2hpcChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQUNFcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0T2JqZWN0U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImNyZWF0ZVJlbGF0aW9uc2hpcCIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQgPSBuZXcgamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LmNyZWF0ZVJlbGF0aW9uc2hpcChyZXBvc2l0b3J5SWQsIGNvbnZlcnQocHJvcGVydGllcyksIHBvbGljaWVzLCBjb252ZXJ0KGFkZEFDRXMpLCBjb252ZXJ0KHJlbW92ZUFDRXMpLAotICAgICAgICAgICAgICAgICAgICBwb3J0RXh0ZW5zaW9uLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0SWQudmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCAidXBkYXRlUHJvcGVydGllcyIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcG9ydE9iamVjdElkID0gY29udmVydEhvbGRlcihvYmplY3RJZCk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcG9ydENoYW5nZVRva2VuID0gKGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5PTUlUX0NIQU5HRV9UT0tFTlMsIGZhbHNlKSA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBjb252ZXJ0SG9sZGVyKGNoYW5nZVRva2VuKSk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LnVwZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBwb3J0T2JqZWN0SWQsIHBvcnRDaGFuZ2VUb2tlbiwgY29udmVydChwcm9wZXJ0aWVzKSwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKHBvcnRPYmplY3RJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUocG9ydENoYW5nZVRva2VuLCBjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMocG9ydEV4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IGJ1bGtVcGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBvYmplY3RJZEFuZENoYW5nZVRva2VuLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYWRkU2Vjb25kYXJ5VHlwZUlkcywgTGlzdDxTdHJpbmc+IHJlbW92ZVNlY29uZGFyeVR5cGVJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlJlcG9zaXRvcnkgaXMgYSBDTUlTIDEuMCByZXBvc2l0b3J5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChDbWlzVmVyc2lvbi5DTUlTXzFfMSwgImJ1bGtVcGRhdGVQcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZT4gYnVsa1VwZGF0ZVJlc3BvbnNlID0gbmV3IGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlPigpOwotCi0gICAgICAgICAgICBwb3J0LmJ1bGtVcGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChvYmplY3RJZEFuZENoYW5nZVRva2VuLCBwcm9wZXJ0aWVzLCBhZGRTZWNvbmRhcnlUeXBlSWRzLCByZW1vdmVTZWNvbmRhcnlUeXBlSWRzKSwKLSAgICAgICAgICAgICAgICAgICAgcG9ydEV4dGVuc2lvbiwgYnVsa1VwZGF0ZVJlc3BvbnNlKTsKLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKHBvcnRFeHRlbnNpb24sIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYnVsa1VwZGF0ZVJlc3BvbnNlLnZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaXgKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0T2JqZWN0U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImRlbGV0ZU9iamVjdCIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LmRlbGV0ZU9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFpbGVkVG9EZWxldGVEYXRhIGRlbGV0ZVRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3RTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE9iamVjdFNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJkZWxldGVUcmVlIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnQuZGVsZXRlVHJlZShyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChFbnVtVW5maWxlT2JqZWN0LmNsYXNzLCB1bmZpbGVPYmplY3RzKSwgY29udGludWVPbkZhaWx1cmUsIGNvbnZlcnQoZXh0ZW5zaW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0T2JqZWN0U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImdldEFsbG93YWJsZUFjdGlvbnMiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQocG9ydC5nZXRBbGxvd2FibGVBY3Rpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGNvbnZlcnQoZXh0ZW5zaW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHN0cmVhbUlkLCBCaWdJbnRlZ2VyIG9mZnNldCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbGVuZ3RoLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCAiZ2V0Q29udGVudFN0cmVhbSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzUGFydGlhbCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKChvZmZzZXQgIT0gbnVsbCAmJiBvZmZzZXQuc2lnbnVtKCkgPT0gMSkgfHwgbGVuZ3RoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpc1BhcnRpYWwgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChwb3J0LmdldENvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgc3RyZWFtSWQsIG9mZnNldCwgbGVuZ3RoLCBjb252ZXJ0KGV4dGVuc2lvbikpLAotICAgICAgICAgICAgICAgICAgICBpc1BhcnRpYWwpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFDTCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdFNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0T2JqZWN0U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImdldE9iamVjdCIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydChwb3J0LmdldE9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KEVudW1JbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBQ0wsIGNvbnZlcnQoZXh0ZW5zaW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQUNMLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCAiZ2V0T2JqZWN0QnlQYXRoIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnQuZ2V0T2JqZWN0QnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChFbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKSwgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQUNMLCBjb252ZXJ0KGV4dGVuc2lvbikpKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3RTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE9iamVjdFNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJnZXRQcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnQuZ2V0UHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGNvbnZlcnQoZXh0ZW5zaW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZW5kaXRpb25EYXRhPiBnZXRSZW5kaXRpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCAiZ2V0UmVuZGl0aW9ucyIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PENtaXNSZW5kaXRpb25UeXBlPiByZW5kaXRpb25MaXN0ID0gcG9ydC5nZXRSZW5kaXRpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCwgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgLy8gbm8gbGlzdD8KLSAgICAgICAgICAgIGlmIChyZW5kaXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29udmVydCBsaXN0Ci0gICAgICAgICAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UmVuZGl0aW9uRGF0YT4oKTsKLSAgICAgICAgICAgIGZvciAoQ21pc1JlbmRpdGlvblR5cGUgcmVuZGl0aW9uIDogcmVuZGl0aW9uTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udmVydChyZW5kaXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgU3RyaW5nIHRhcmdldEZvbGRlcklkLCBTdHJpbmcgc291cmNlRm9sZGVySWQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCAibW92ZU9iamVjdCIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcG9ydE9iamVjdElkID0gY29udmVydEhvbGRlcihvYmplY3RJZCk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0Lm1vdmVPYmplY3QocmVwb3NpdG9yeUlkLCBwb3J0T2JqZWN0SWQsIHRhcmdldEZvbGRlcklkLCBzb3VyY2VGb2xkZXJJZCwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKHBvcnRPYmplY3RJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKHBvcnRFeHRlbnNpb24sIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3RTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldE9iamVjdFNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJzZXRDb250ZW50U3RyZWFtIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPiBwb3J0T2JqZWN0SWQgPSBjb252ZXJ0SG9sZGVyKG9iamVjdElkKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPiBwb3J0Q2hhbmdlVG9rZW4gPSAoZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLk9NSVRfQ0hBTkdFX1RPS0VOUywgZmFsc2UpID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IGNvbnZlcnRIb2xkZXIoY2hhbmdlVG9rZW4pKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHBvcnQuc2V0Q29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIHBvcnRPYmplY3RJZCwgb3ZlcndyaXRlRmxhZywgcG9ydENoYW5nZVRva2VuLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KGNvbnRlbnRTdHJlYW0sIGZhbHNlKSwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKHBvcnRPYmplY3RJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUocG9ydENoYW5nZVRva2VuLCBjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMocG9ydEV4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLCAiZGVsZXRlQ29udGVudFN0cmVhbSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcG9ydE9iamVjdElkID0gY29udmVydEhvbGRlcihvYmplY3RJZCk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcG9ydENoYW5nZVRva2VuID0gKGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5PTUlUX0NIQU5HRV9UT0tFTlMsIGZhbHNlKSA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBjb252ZXJ0SG9sZGVyKGNoYW5nZVRva2VuKSk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LmRlbGV0ZUNvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBwb3J0T2JqZWN0SWQsIHBvcnRDaGFuZ2VUb2tlbiwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKHBvcnRPYmplY3RJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUocG9ydENoYW5nZVRva2VuLCBjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMocG9ydEV4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmssIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlJlcG9zaXRvcnkgaXMgYSBDTUlTIDEuMCByZXBvc2l0b3J5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRPYmplY3RTZXJ2aWNlUG9ydChDbWlzVmVyc2lvbi5DTUlTXzFfMSwgImFwcGVuZENvbnRlbnRTdHJlYW0iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmc+IHBvcnRPYmplY3RJZCA9IGNvbnZlcnRIb2xkZXIob2JqZWN0SWQpOwotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmc+IHBvcnRDaGFuZ2VUb2tlbiA9IChnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT01JVF9DSEFOR0VfVE9LRU5TLCBmYWxzZSkgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogY29udmVydEhvbGRlcihjaGFuZ2VUb2tlbikpOwotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gcG9ydEV4dGVuc2lvbiA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgcG9ydC5hcHBlbmRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgcG9ydE9iamVjdElkLCBpc0xhc3RDaHVuaywgcG9ydENoYW5nZVRva2VuLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KGNvbnRlbnRTdHJlYW0sIGZhbHNlKSwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKHBvcnRPYmplY3RJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUocG9ydENoYW5nZVRva2VuLCBjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMocG9ydEV4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9Qb2xpY3lTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9Qb2xpY3lTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjNmYWU3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvUG9saWN5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnRFeHRlbnNpb25Ib2xkZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5zZXRFeHRlbnNpb25WYWx1ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeHRlbnNpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLlBvbGljeVNlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlBvbGljeVNlcnZpY2U7Ci0KLS8qKgotICogUG9saWN5IFNlcnZpY2UgV2ViIFNlcnZpY2VzIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFBvbGljeVNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlc1NlcnZpY2UgaW1wbGVtZW50cyBQb2xpY3lTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RQb3J0UHJvdmlkZXIgcG9ydFByb3ZpZGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFBvbGljeVNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIEFic3RyYWN0UG9ydFByb3ZpZGVyIHBvcnRQcm92aWRlcikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICB0aGlzLnBvcnRQcm92aWRlciA9IHBvcnRQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIFBvbGljeVNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0UG9saWN5U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImFwcGx5UG9saWN5Iik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gcG9ydEV4dGVuc2lvbiA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgcG9ydC5hcHBseVBvbGljeShyZXBvc2l0b3J5SWQsIHBvbGljeUlkLCBvYmplY3RJZCwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBQb2xpY3lTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldFBvbGljeVNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJyZW1vdmVQb2xpY3kiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBwb3J0RXh0ZW5zaW9uID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBwb3J0LnJlbW92ZVBvbGljeShyZXBvc2l0b3J5SWQsIHBvbGljeUlkLCBvYmplY3RJZCwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBcHBsaWVkUG9saWNpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIFBvbGljeVNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0UG9saWN5U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwgImdldEFwcGxpZWRQb2xpY2llcyIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PENtaXNPYmplY3RUeXBlPiBwb2xpY3lMaXN0ID0gcG9ydC5nZXRBcHBsaWVkUG9saWNpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBMaXN0PE9iamVjdERhdGE+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLQotICAgICAgICAgICAgLy8gbm8gbGlzdD8KLSAgICAgICAgICAgIGlmIChwb2xpY3lMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb252ZXJ0IGxpc3QKLSAgICAgICAgICAgIGZvciAoQ21pc09iamVjdFR5cGUgcG9saWN5IDogcG9saWN5TGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udmVydChwb2xpY3kpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9SZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9SZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmExNTE4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvUmVsYXRpb25zaGlwU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci0KLS8qKgotICogUmVsYXRpb25zaGlwIFNlcnZpY2UgV2ViIFNlcnZpY2VzIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcFNlcnZpY2VJbXBsIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlc1NlcnZpY2UgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXBTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RQb3J0UHJvdmlkZXIgcG9ydFByb3ZpZGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFJlbGF0aW9uc2hpcFNlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIEFic3RyYWN0UG9ydFByb3ZpZGVyIHBvcnRQcm92aWRlcikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICB0aGlzLnBvcnRQcm92aWRlciA9IHBvcnRQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRPYmplY3RSZWxhdGlvbnNoaXBzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsCi0gICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldFJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksCi0gICAgICAgICAgICAgICAgImdldE9iamVjdFJlbGF0aW9uc2hpcHMiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQocG9ydC5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChFbnVtUmVsYXRpb25zaGlwRGlyZWN0aW9uLmNsYXNzLCByZWxhdGlvbnNoaXBEaXJlY3Rpb24pLCB0eXBlSWQsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIG1heEl0ZW1zLCBza2lwQ291bnQsIGNvbnZlcnQoZXh0ZW5zaW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9SZXBvc2l0b3J5U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5YTQwZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEV4dGVuc2lvbkhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnRUeXBlQ29udGFpbmVyTGlzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEV4dGVuc2lvblZhbHVlczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbC5DbWlzQmluZGluZ3NIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5CaW5kaW5nU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQmFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeHRlbnNpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNSZXBvc2l0b3J5RW50cnlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNSZXBvc2l0b3J5SW5mb1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5SZXBvc2l0b3J5U2VydmljZVBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBTZXJ2aWNlIFdlYiBTZXJ2aWNlcyBjbGllbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U2VydmljZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VzU2VydmljZSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RQb3J0UHJvdmlkZXIgcG9ydFByb3ZpZGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlTZXJ2aWNlSW1wbChCaW5kaW5nU2Vzc2lvbiBzZXNzaW9uLCBBYnN0cmFjdFBvcnRQcm92aWRlciBwb3J0UHJvdmlkZXIpIHsKLSAgICAgICAgc2V0U2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgdGhpcy5wb3J0UHJvdmlkZXIgPSBwb3J0UHJvdmlkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24gPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0Rm9yY2VkQ21pc1ZlcnNpb24oZ2V0U2Vzc2lvbigpKTsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gQ21pc1ZlcnNpb24uQ01JU18xXzE7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBvc2l0b3J5U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRSZXBvc2l0b3J5U2VydmljZVBvcnQoY21pc1ZlcnNpb24sICJnZXRSZXBvc2l0b3JpZXMiKTsKLQotICAgICAgICBMaXN0PENtaXNSZXBvc2l0b3J5RW50cnlUeXBlPiBlbnRyaWVzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMKLSAgICAgICAgICAgIGVudHJpZXMgPSBwb3J0LmdldFJlcG9zaXRvcmllcyhjb252ZXJ0KGV4dGVuc2lvbikpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFJlcG9zaXRvcnlJbmZvPiBpbmZvcyA9IG51bGw7Ci0gICAgICAgIGlmIChlbnRyaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0UmVwb3NpdG9yeVNlcnZpY2VQb3J0KGNtaXNWZXJzaW9uLCAiZ2V0UmVwb3NpdG9yeUluZm8iKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbmZvcyA9IG5ldyBBcnJheUxpc3Q8UmVwb3NpdG9yeUluZm8+KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QgYW5kIGZldGNoIHJlcG9zaXRvcnkgaW5mb3MKLSAgICAgICAgICAgICAgICBmb3IgKENtaXNSZXBvc2l0b3J5RW50cnlUeXBlIGVudHJ5IDogZW50cmllcykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ21pc1JlcG9zaXRvcnlJbmZvVHlwZSBpbmZvID0gcG9ydC5nZXRSZXBvc2l0b3J5SW5mbyhlbnRyeS5nZXRSZXBvc2l0b3J5SWQoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvcy5hZGQoY29udmVydChpbmZvKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldFJlcG9zaXRvcnlJbmZvKCkgZmFpbGVkIGZvciB3aGF0ZXZlciByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0+IHByb3ZpZGUgYXQgbGVhc3QgYSByZXBvc2l0b3J5IGluZm8gc3R1YgotICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeUluZm9JbXBsIGluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNldElkKGVudHJ5LmdldFJlcG9zaXRvcnlJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0TmFtZShlbnRyeS5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm9zLmFkZChpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGluZm9zOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24gPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0Rm9yY2VkQ21pc1ZlcnNpb24oZ2V0U2Vzc2lvbigpKTsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gQ21pc1ZlcnNpb24uQ01JU18xXzE7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBvc2l0b3J5U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRSZXBvc2l0b3J5U2VydmljZVBvcnQoY21pc1ZlcnNpb24sICJnZXRSZXBvc2l0b3J5SW5mbyIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydChwb3J0LmdldFJlcG9zaXRvcnlJbmZvKHJlcG9zaXRvcnlJZCwgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgUmVwb3NpdG9yeVNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0UmVwb3NpdG9yeVNlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksCi0gICAgICAgICAgICAgICAgImdldFR5cGVEZWZpbml0aW9uIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnQuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGNvbnZlcnQoZXh0ZW5zaW9uKSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGdldFR5cGVDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRSZXBvc2l0b3J5U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwKLSAgICAgICAgICAgICAgICAiZ2V0VHlwZUNoaWxkcmVuIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnQuZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsIHNraXBDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5U2VydmljZVBvcnQgcG9ydCA9IHBvcnRQcm92aWRlci5nZXRSZXBvc2l0b3J5U2VydmljZVBvcnQoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSwKLSAgICAgICAgICAgICAgICAiZ2V0VHlwZURlc2NlbmRhbnRzIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VHlwZUNvbnRhaW5lckxpc3QocG9ydC5nZXRUeXBlRGVzY2VuZGFudHMocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGRlcHRoLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZ2V0Q21pc1ZlcnNpb24ocmVwb3NpdG9yeUlkKSA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlJlcG9zaXRvcnkgaXMgYSBDTUlTIDEuMCByZXBvc2l0b3J5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVwb3NpdG9yeVNlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0UmVwb3NpdG9yeVNlcnZpY2VQb3J0KENtaXNWZXJzaW9uLkNNSVNfMV8xLCAiY3JlYXRlVHlwZSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPENtaXNUeXBlRGVmaW5pdGlvblR5cGU+IHR5cGVEZWYgPSBuZXcgamF2YXgueG1sLndzLkhvbGRlcjxDbWlzVHlwZURlZmluaXRpb25UeXBlPigKLSAgICAgICAgICAgICAgICAgICAgY29udmVydCh0eXBlKSk7Ci0KLSAgICAgICAgICAgIHBvcnQuY3JlYXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVEZWYsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHR5cGVEZWYudmFsdWUpOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJSZXBvc2l0b3J5IGlzIGEgQ01JUyAxLjAgcmVwb3NpdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnlTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldFJlcG9zaXRvcnlTZXJ2aWNlUG9ydChDbWlzVmVyc2lvbi5DTUlTXzFfMSwgInVwZGF0ZVR5cGUiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxDbWlzVHlwZURlZmluaXRpb25UeXBlPiB0eXBlRGVmID0gbmV3IGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc1R5cGVEZWZpbml0aW9uVHlwZT4oCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQodHlwZSkpOwotCi0gICAgICAgICAgICBwb3J0LnVwZGF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmLCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICByZXR1cm4gY29udmVydCh0eXBlRGVmLnZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJSZXBvc2l0b3J5IGlzIGEgQ01JUyAxLjAgcmVwb3NpdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnlTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldFJlcG9zaXRvcnlTZXJ2aWNlUG9ydChDbWlzVmVyc2lvbi5DTUlTXzFfMSwgImRlbGV0ZVR5cGUiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gcG9ydEV4dGVuc2lvbiA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgcG9ydC5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBwb3J0RXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKHBvcnRFeHRlbnNpb24sIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvU3BpU2Vzc2lvblBhcmFtZXRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9TcGlTZXNzaW9uUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzA5ODIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3NwaS93ZWJzZXJ2aWNlcy9TcGlTZXNzaW9uUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS53ZWJzZXJ2aWNlczsKLQotLyoqCi0gKiBXZWIgU2VydmljZXMgc2Vzc2lvbiBwYXJhbWV0ZXIuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTcGlTZXNzaW9uUGFyYW1ldGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuc2VydmljZXMiOwotCi0gICAgcHJpdmF0ZSBTcGlTZXNzaW9uUGFyYW1ldGVyKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvU3VuSlJFUG9ydFByb3ZpZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL1N1bkpSRVBvcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmMyNTQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvU3VuSlJFUG9ydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNtaXNCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyczsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuSkFYV1NQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmRldmVsb3Blci5TdHJlYW1pbmdBdHRhY2htZW50RmVhdHVyZTsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5kZXZlbG9wZXIuV1NCaW5kaW5nUHJvdmlkZXI7Ci0KLS8qKgotICogU3VuIEpSRSBKQVgtV1MgaW1wbGVtZW50YXRpb24uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgU3VuSlJFUG9ydFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQb3J0UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTdW5KUkVQb3J0UHJvdmlkZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBpbnQgY29udGVudFRocmVzaG9sZDsKLSAgICBwcml2YXRlIGludCByZXNwb25zZVRocmVzaG9sZDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb24oQmluZGluZ1Nlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBzdXBlci5zZXRTZXNzaW9uKHNlc3Npb24pOwotCi0gICAgICAgIGNvbnRlbnRUaHJlc2hvbGQgPSBzZXNzaW9uLmdldChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX01FTU9SWV9USFJFU0hPTEQsIDQgKiAxMDI0ICogMTAyNCk7Ci0gICAgICAgIHJlc3BvbnNlVGhyZXNob2xkID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRVBTT05TRV9NRU1PUllfVEhSRVNIT0xELCAtMSk7Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlVGhyZXNob2xkID4gY29udGVudFRocmVzaG9sZCkgewotICAgICAgICAgICAgY29udGVudFRocmVzaG9sZCA9IHJlc3BvbnNlVGhyZXNob2xkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHBvcnQgb2JqZWN0LgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdQcm92aWRlciBjcmVhdGVQb3J0T2JqZWN0KENtaXNTZXJ2aWNlSG9sZGVyIHNlcnZpY2VIb2xkZXIpIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlNlc3Npb24ge306IENyZWF0aW5nIFdlYiBTZXJ2aWNlIHBvcnQgb2JqZWN0IG9mIHt9IC4uLiIsIGdldFNlc3Npb24oKS5nZXRTZXNzaW9uSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBwcmVwYXJlIGZlYXR1cmVzCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZVtdIGZlYXR1cmVzOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VIb2xkZXIuZ2V0U2VydmljZSgpLmhhbmRsZXNDb250ZW50KCkpIHsKLSAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IG5ldyBXZWJTZXJ2aWNlRmVhdHVyZVtdIHsgbmV3IE1UT01GZWF0dXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtaW5nQXR0YWNobWVudEZlYXR1cmUobnVsbCwgdHJ1ZSwgY29udGVudFRocmVzaG9sZCkgfTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVGhyZXNob2xkID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBuZXcgV2ViU2VydmljZUZlYXR1cmVbXSB7IG5ldyBNVE9NRmVhdHVyZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1pbmdBdHRhY2htZW50RmVhdHVyZShudWxsLCB0cnVlLCByZXNwb25zZVRocmVzaG9sZCkgfTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IG5ldyBXZWJTZXJ2aWNlRmVhdHVyZVtdIHsgbmV3IE1UT01GZWF0dXJlKCkgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBwb3J0IG9iamVjdAotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHBvcnRPYmplY3QgPSBjcmVhdGVQb3J0T2JqZWN0RnJvbVNlcnZpY2VIb2xkZXIoc2VydmljZUhvbGRlciwgZmVhdHVyZXMpOwotCi0gICAgICAgICAgICAvLyBzZXQgc3RyZWFtaW5nIGZvciBzZXJ2aWNlcyB0aGF0IHRyYW5zcG9ydCBjb250ZW50Ci0gICAgICAgICAgICBpZiAoc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlKCkuaGFuZGxlc0NvbnRlbnQoKSkgewotICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoSkFYV1NQcm9wZXJ0aWVzLkhUVFBfQ0xJRU5UX1NUUkVBTUlOR19DSFVOS19TSVpFLCBDSFVOS19TSVpFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIFNPQVAgYW5kIEhUVFAgYXV0aGVudGljYXRpb24gaGVhZGVycwotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoUHJvdmlkZXIgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0QXV0aGVudGljYXRpb25Qcm92aWRlcihnZXRTZXNzaW9uKCkpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBodHRwSGVhZGVycyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYXV0aFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBTT0FQIGhlYWRlcgotICAgICAgICAgICAgICAgIEVsZW1lbnQgc29hcEhlYWRlciA9IGF1dGhQcm92aWRlci5nZXRTT0FQSGVhZGVycyhwb3J0T2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoV1NCaW5kaW5nUHJvdmlkZXIpIHBvcnRPYmplY3QpLnNldE91dGJvdW5kSGVhZGVycyhIZWFkZXJzLmNyZWF0ZShzb2FwSGVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSFRUUCBoZWFkZXIKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gKHNlcnZpY2VIb2xkZXIuZ2V0RW5kcG9pbnRVcmwoKSAhPSBudWxsID8gc2VydmljZUhvbGRlci5nZXRFbmRwb2ludFVybCgpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlT2JqZWN0KCkuZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBodHRwSGVhZGVycyA9IGF1dGhQcm92aWRlci5nZXRIVFRQSGVhZGVycyh1cmwpOwotCi0gICAgICAgICAgICAgICAgLy8gU1NMIEZhY3RvcnkKLSAgICAgICAgICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNmID0gYXV0aFByb3ZpZGVyLmdldFNTTFNvY2tldEZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2YgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwb3J0T2JqZWN0LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEpBWFdTUHJvcGVydGllcy5TU0xfU09DS0VUX0ZBQ1RPUlksIHNmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBIb3N0bmFtZSBWZXJpZmllcgotICAgICAgICAgICAgICAgIEhvc3RuYW1lVmVyaWZpZXIgaHYgPSBhdXRoUHJvdmlkZXIuZ2V0SG9zdG5hbWVWZXJpZmllcigpOwotICAgICAgICAgICAgICAgIGlmIChodiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoSkFYV1NQcm9wZXJ0aWVzLkhPU1ROQU1FX1ZFUklGSUVSLCBodik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgSFRUUCBoZWFkZXJzCi0gICAgICAgICAgICBzZXRIVFRQSGVhZGVycyhwb3J0T2JqZWN0LCBodHRwSGVhZGVycyk7Ci0KLSAgICAgICAgICAgIC8vIHNldCBlbmRwb2ludCBVUkwKLSAgICAgICAgICAgIHNldEVuZHBvaW50VXJsKHBvcnRPYmplY3QsIHNlcnZpY2VIb2xkZXIuZ2V0RW5kcG9pbnRVcmwoKSk7Ci0KLSAgICAgICAgICAgIC8vIHRpbWVvdXRzCi0gICAgICAgICAgICBpbnQgY29ubmVjdFRpbWVvdXQgPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ09OTkVDVF9USU1FT1VULCAtMSk7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoSkFYV1NQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgY29ubmVjdFRpbWVvdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcmVhZFRpbWVvdXQgPSBnZXRTZXNzaW9uKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuUkVBRF9USU1FT1VULCAtMSk7Ci0gICAgICAgICAgICBpZiAocmVhZFRpbWVvdXQgPj0gMCkgewotICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoSkFYV1NQcm9wZXJ0aWVzLlJFUVVFU1RfVElNRU9VVCwgcmVhZFRpbWVvdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcG9ydE9iamVjdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHRocm93IGNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJDYW5ub3QgaW5pdGFsaXplIFdlYiBTZXJ2aWNlcyBwb3J0IG9iamVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvU3VuUklQb3J0UHJvdmlkZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvU3VuUklQb3J0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkZTJmNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL1N1blJJUG9ydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5pbXBsLkNtaXNCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkJpbmRpbmdTZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyczsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5kZXZlbG9wZXIuSkFYV1NQcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmRldmVsb3Blci5TdHJlYW1pbmdBdHRhY2htZW50RmVhdHVyZTsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5kZXZlbG9wZXIuV1NCaW5kaW5nUHJvdmlkZXI7Ci0KLS8qKgotICogSkFYLVdTIFJJIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgU3VuUklQb3J0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFBvcnRQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFN1blJJUG9ydFByb3ZpZGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgaW50IGNvbnRlbnRUaHJlc2hvbGQ7Ci0gICAgcHJpdmF0ZSBpbnQgcmVzcG9uc2VUaHJlc2hvbGQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgc3VwZXIuc2V0U2Vzc2lvbihzZXNzaW9uKTsKLQotICAgICAgICBjb250ZW50VGhyZXNob2xkID0gc2Vzc2lvbi5nZXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NRU1PUllfVEhSRVNIT0xELCA0ICogMTAyNCAqIDEwMjQpOwotICAgICAgICByZXNwb25zZVRocmVzaG9sZCA9IHNlc3Npb24uZ2V0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVQU09OU0VfTUVNT1JZX1RIUkVTSE9MRCwgLTEpOwotCi0gICAgICAgIGlmIChyZXNwb25zZVRocmVzaG9sZCA+IGNvbnRlbnRUaHJlc2hvbGQpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUaHJlc2hvbGQgPSByZXNwb25zZVRocmVzaG9sZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwb3J0IG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmluZGluZ1Byb3ZpZGVyIGNyZWF0ZVBvcnRPYmplY3QoQ21pc1NlcnZpY2VIb2xkZXIgc2VydmljZUhvbGRlcikgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiU2Vzc2lvbiB7fTogQ3JlYXRpbmcgV2ViIFNlcnZpY2UgcG9ydCBvYmplY3Qgb2Yge30gLi4uIiwgZ2V0U2Vzc2lvbigpLmdldFNlc3Npb25JZCgpLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSG9sZGVyLmdldFNlcnZpY2VOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHByZXBhcmUgZmVhdHVyZXMKLSAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlW10gZmVhdHVyZXM7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlKCkuaGFuZGxlc0NvbnRlbnQoKSkgewotICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gbmV3IFdlYlNlcnZpY2VGZWF0dXJlW10geyBuZXcgTVRPTUZlYXR1cmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1pbmdBdHRhY2htZW50RmVhdHVyZShudWxsLCB0cnVlLCBjb250ZW50VGhyZXNob2xkKSB9OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VUaHJlc2hvbGQgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IG5ldyBXZWJTZXJ2aWNlRmVhdHVyZVtdIHsgbmV3IE1UT01GZWF0dXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbWluZ0F0dGFjaG1lbnRGZWF0dXJlKG51bGwsIHRydWUsIHJlc3BvbnNlVGhyZXNob2xkKSB9OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gbmV3IFdlYlNlcnZpY2VGZWF0dXJlW10geyBuZXcgTVRPTUZlYXR1cmUoKSB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIHBvcnQgb2JqZWN0Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcG9ydE9iamVjdCA9IGNyZWF0ZVBvcnRPYmplY3RGcm9tU2VydmljZUhvbGRlcihzZXJ2aWNlSG9sZGVyLCBmZWF0dXJlcyk7Ci0KLSAgICAgICAgICAgIC8vIHNldCBzdHJlYW1pbmcgZm9yIHNlcnZpY2VzIHRoYXQgdHJhbnNwb3J0IGNvbnRlbnQKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlSG9sZGVyLmdldFNlcnZpY2UoKS5oYW5kbGVzQ29udGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgcG9ydE9iamVjdC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChKQVhXU1Byb3BlcnRpZXMuSFRUUF9DTElFTlRfU1RSRUFNSU5HX0NIVU5LX1NJWkUsIENIVU5LX1NJWkUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgU09BUCBhbmQgSFRUUCBhdXRoZW50aWNhdGlvbiBoZWFkZXJzCi0gICAgICAgICAgICBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGF1dGhQcm92aWRlciA9IENtaXNCaW5kaW5nc0hlbHBlci5nZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKGdldFNlc3Npb24oKSk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGh0dHBIZWFkZXJzID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChhdXRoUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFNPQVAgaGVhZGVyCi0gICAgICAgICAgICAgICAgRWxlbWVudCBzb2FwSGVhZGVyID0gYXV0aFByb3ZpZGVyLmdldFNPQVBIZWFkZXJzKHBvcnRPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwSGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgKChXU0JpbmRpbmdQcm92aWRlcikgcG9ydE9iamVjdCkuc2V0T3V0Ym91bmRIZWFkZXJzKEhlYWRlcnMuY3JlYXRlKHNvYXBIZWFkZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBIVFRQIGhlYWRlcgotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSAoc2VydmljZUhvbGRlci5nZXRFbmRwb2ludFVybCgpICE9IG51bGwgPyBzZXJ2aWNlSG9sZGVyLmdldEVuZHBvaW50VXJsKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBzZXJ2aWNlSG9sZGVyLmdldFNlcnZpY2VPYmplY3QoKS5nZXRXU0RMRG9jdW1lbnRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGh0dHBIZWFkZXJzID0gYXV0aFByb3ZpZGVyLmdldEhUVFBIZWFkZXJzKHVybCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTU0wgRmFjdG9yeQotICAgICAgICAgICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc2YgPSBhdXRoUHJvdmlkZXIuZ2V0U1NMU29ja2V0RmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIGlmIChzZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnRPYmplY3QuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoSkFYV1NQcm9wZXJ0aWVzLlNTTF9TT0NLRVRfRkFDVE9SWSwgc2YpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEhvc3RuYW1lIFZlcmlmaWVyCi0gICAgICAgICAgICAgICAgSG9zdG5hbWVWZXJpZmllciBodiA9IGF1dGhQcm92aWRlci5nZXRIb3N0bmFtZVZlcmlmaWVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGh2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9ydE9iamVjdC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChKQVhXU1Byb3BlcnRpZXMuSE9TVE5BTUVfVkVSSUZJRVIsIGh2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBIVFRQIGhlYWRlcnMKLSAgICAgICAgICAgIHNldEhUVFBIZWFkZXJzKHBvcnRPYmplY3QsIGh0dHBIZWFkZXJzKTsKLQotICAgICAgICAgICAgLy8gc2V0IGVuZHBvaW50IFVSTAotICAgICAgICAgICAgc2V0RW5kcG9pbnRVcmwocG9ydE9iamVjdCwgc2VydmljZUhvbGRlci5nZXRFbmRwb2ludFVybCgpKTsKLQotICAgICAgICAgICAgLy8gdGltZW91dHMKLSAgICAgICAgICAgIGludCBjb25uZWN0VGltZW91dCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5DT05ORUNUX1RJTUVPVVQsIC0xKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0VGltZW91dCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcG9ydE9iamVjdC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChKQVhXU1Byb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VULCBjb25uZWN0VGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCByZWFkVGltZW91dCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5SRUFEX1RJTUVPVVQsIC0xKTsKLSAgICAgICAgICAgIGlmIChyZWFkVGltZW91dCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcG9ydE9iamVjdC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgiY29tLnN1bi54bWwud3MucmVxdWVzdC50aW1lb3V0IiwgcmVhZFRpbWVvdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcG9ydE9iamVjdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHRocm93IGNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJDYW5ub3QgaW5pdGFsaXplIFdlYiBTZXJ2aWNlcyBwb3J0IG9iamVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL1ZlcnNpb25pbmdTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzAzNDIxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvVmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0RXh0ZW5zaW9uSG9sZGVyOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEV4dGVuc2lvblZhbHVlczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEhvbGRlclZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuQmluZGluZ1Nlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXh0ZW5zaW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuVmVyc2lvbmluZ1NlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLQotLyoqCi0gKiBWZXJzaW9uaW5nIFNlcnZpY2UgV2ViIFNlcnZpY2VzIGNsaWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25pbmdTZXJ2aWNlSW1wbCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZXNTZXJ2aWNlIGltcGxlbWVudHMgVmVyc2lvbmluZ1NlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFBvcnRQcm92aWRlciBwb3J0UHJvdmlkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmVyc2lvbmluZ1NlcnZpY2VJbXBsKEJpbmRpbmdTZXNzaW9uIHNlc3Npb24sIEFic3RyYWN0UG9ydFByb3ZpZGVyIHBvcnRQcm92aWRlcikgewotICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICB0aGlzLnBvcnRQcm92aWRlciA9IHBvcnRQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLAotICAgICAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQpIHsKLSAgICAgICAgVmVyc2lvbmluZ1NlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0VmVyc2lvbmluZ1NlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJjaGVja091dCIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcG9ydE9iamVjdElkID0gY29udmVydEhvbGRlcihvYmplY3RJZCk7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPEJvb2xlYW4+IHBvcnRDb250ZW50Q29waWVkID0gbmV3IGphdmF4LnhtbC53cy5Ib2xkZXI8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHBvcnQuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBwb3J0T2JqZWN0SWQsIHBvcnRFeHRlbnNpb24sIHBvcnRDb250ZW50Q29waWVkKTsKLQotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUocG9ydE9iamVjdElkLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICBzZXRIb2xkZXJWYWx1ZShwb3J0Q29udGVudENvcGllZCwgY29udGVudENvcGllZCk7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMocG9ydEV4dGVuc2lvbiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcnRQcm92aWRlci5lbmRDYWxsKHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgVmVyc2lvbmluZ1NlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0VmVyc2lvbmluZ1NlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksCi0gICAgICAgICAgICAgICAgImNhbmNlbENoZWNrT3V0Iik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHBvcnQuY2FuY2VsQ2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgcG9ydEV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgVmVyc2lvbmluZ1NlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0VmVyc2lvbmluZ1NlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksICJjaGVja0luIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nPiBwb3J0T2JqZWN0SWQgPSBjb252ZXJ0SG9sZGVyKG9iamVjdElkKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHBvcnRFeHRlbnNpb24gPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIHBvcnQuY2hlY2tJbihyZXBvc2l0b3J5SWQsIHBvcnRPYmplY3RJZCwgbWFqb3IsIGNvbnZlcnQocHJvcGVydGllcyksIGNvbnZlcnQoY29udGVudFN0cmVhbSwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICBjaGVja2luQ29tbWVudCwgcG9saWNpZXMsIGNvbnZlcnQoYWRkQUNFcyksIGNvbnZlcnQocmVtb3ZlQUNFcyksIHBvcnRFeHRlbnNpb24pOwotCi0gICAgICAgICAgICBzZXRIb2xkZXJWYWx1ZShwb3J0T2JqZWN0SWQsIG9iamVjdElkKTsKLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhwb3J0RXh0ZW5zaW9uLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9ydFByb3ZpZGVyLmVuZENhbGwocG9ydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBbGxWZXJzaW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgVmVyc2lvbmluZ1NlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0VmVyc2lvbmluZ1NlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksCi0gICAgICAgICAgICAgICAgImdldEFsbFZlcnNpb25zIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdFR5cGU+IHZlcnNpb25MaXN0ID0gcG9ydC5nZXRBbGxWZXJzaW9ucyhyZXBvc2l0b3J5SWQsIHZlcnNpb25TZXJpZXNJZCwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgLy8gbm8gbGlzdD8KLSAgICAgICAgICAgIGlmICh2ZXJzaW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbnZlcnQgbGlzdAotICAgICAgICAgICAgTGlzdDxPYmplY3REYXRhPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KCk7Ci0gICAgICAgICAgICBmb3IgKENtaXNPYmplY3RUeXBlIHZlcnNpb24gOiB2ZXJzaW9uTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udmVydCh2ZXJzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQUNMLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgVmVyc2lvbmluZ1NlcnZpY2VQb3J0IHBvcnQgPSBwb3J0UHJvdmlkZXIuZ2V0VmVyc2lvbmluZ1NlcnZpY2VQb3J0KGdldENtaXNWZXJzaW9uKHJlcG9zaXRvcnlJZCksCi0gICAgICAgICAgICAgICAgImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydChwb3J0LmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihyZXBvc2l0b3J5SWQsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGNvbnZlcnQoRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksCi0gICAgICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFDTCwgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIFZlcnNpb25pbmdTZXJ2aWNlUG9ydCBwb3J0ID0gcG9ydFByb3ZpZGVyLmdldFZlcnNpb25pbmdTZXJ2aWNlUG9ydChnZXRDbWlzVmVyc2lvbihyZXBvc2l0b3J5SWQpLAotICAgICAgICAgICAgICAgICJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHBvcnQuZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihyZXBvc2l0b3J5SWQsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChleHRlbnNpb24pKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3J0UHJvdmlkZXIuZW5kQ2FsbChwb3J0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvV2ViU3BoZXJlUG9ydFByb3ZpZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvc3BpL3dlYnNlcnZpY2VzL1dlYlNwaGVyZVBvcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg4ODI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvd2Vic2VydmljZXMvV2ViU3BoZXJlUG9ydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuQ21pc0JpbmRpbmdzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFdlYlNwaGVyZSBKQVgtV1MgaW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGNsYXNzIFdlYlNwaGVyZVBvcnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UG9ydFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoV2ViU3BoZXJlUG9ydFByb3ZpZGVyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwb3J0IG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmluZGluZ1Byb3ZpZGVyIGNyZWF0ZVBvcnRPYmplY3QoQ21pc1NlcnZpY2VIb2xkZXIgc2VydmljZUhvbGRlcikgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRpbmcgV2ViIFNlcnZpY2UgcG9ydCBvYmplY3Qgb2YgIiArIHNlcnZpY2VIb2xkZXIuZ2V0U2VydmljZU5hbWUoKSArICIuLi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgcG9ydCBvYmplY3QKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwb3J0T2JqZWN0ID0gY3JlYXRlUG9ydE9iamVjdEZyb21TZXJ2aWNlSG9sZGVyKHNlcnZpY2VIb2xkZXIsIG5ldyBNVE9NRmVhdHVyZSgpKTsKLQotICAgICAgICAgICAgLy8gYWRkIFNPQVAgYW5kIEhUVFAgYXV0aGVudGljYXRpb24gaGVhZGVycwotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoUHJvdmlkZXIgPSBDbWlzQmluZGluZ3NIZWxwZXIuZ2V0QXV0aGVudGljYXRpb25Qcm92aWRlcihnZXRTZXNzaW9uKCkpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBodHRwSGVhZGVycyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYXV0aFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBTT0FQIGhlYWRlcgotICAgICAgICAgICAgICAgIEVsZW1lbnQgc29hcEhlYWRlciA9IGF1dGhQcm92aWRlci5nZXRTT0FQSGVhZGVycyhwb3J0T2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIGhlYWRlclhtbCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOwotICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShzb2FwSGVhZGVyKSwgbmV3IFN0cmVhbVJlc3VsdChoZWFkZXJYbWwpKTsKLQotICAgICAgICAgICAgICAgICAgICBNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4gaGVhZGVyID0gbmV3IEhhc2hNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnB1dChuZXcgUU5hbWUoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwgc29hcEhlYWRlci5nZXRMb2NhbE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChoZWFkZXJYbWwudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICBwb3J0T2JqZWN0LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KCJqYXh3cy5iaW5kaW5nLnNvYXAuaGVhZGVycy5vdXRib3VuZCIsIGhlYWRlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSFRUUCBoZWFkZXIKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gKHNlcnZpY2VIb2xkZXIuZ2V0RW5kcG9pbnRVcmwoKSAhPSBudWxsID8gc2VydmljZUhvbGRlci5nZXRFbmRwb2ludFVybCgpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogc2VydmljZUhvbGRlci5nZXRTZXJ2aWNlT2JqZWN0KCkuZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBodHRwSGVhZGVycyA9IGF1dGhQcm92aWRlci5nZXRIVFRQSGVhZGVycyh1cmwpOwotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2V0IFNTTCBGYWN0b3J5Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZXQgSG9zdG5hbWUgVmVyaWZpZXIKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IEhUVFAgaGVhZGVycwotICAgICAgICAgICAgc2V0SFRUUEhlYWRlcnMocG9ydE9iamVjdCwgaHR0cEhlYWRlcnMpOwotCi0gICAgICAgICAgICAvLyBzZXQgZW5kcG9pbnQgVVJMCi0gICAgICAgICAgICBzZXRFbmRwb2ludFVybChwb3J0T2JqZWN0LCBzZXJ2aWNlSG9sZGVyLmdldEVuZHBvaW50VXJsKCkpOwotCi0gICAgICAgICAgICAvLyB0aW1lb3V0cwotICAgICAgICAgICAgaW50IGNvbm5lY3RUaW1lb3V0ID0gZ2V0U2Vzc2lvbigpLmdldChTZXNzaW9uUGFyYW1ldGVyLkNPTk5FQ1RfVElNRU9VVCwgLTEpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0ID49IDApIHsKLSAgICAgICAgICAgICAgICBwb3J0T2JqZWN0LmdldFJlcXVlc3RDb250ZXh0KCkucHV0KCJjb25uZWN0aW9uX3RpbWVvdXQiLCBjb25uZWN0VGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCByZWFkVGltZW91dCA9IGdldFNlc3Npb24oKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5SRUFEX1RJTUVPVVQsIC0xKTsKLSAgICAgICAgICAgIGlmIChyZWFkVGltZW91dCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcG9ydE9iamVjdC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgicmVxdWVzdF90aW1lb3V0IiwgcmVhZFRpbWVvdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcG9ydE9iamVjdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHRocm93IGNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJDYW5ub3QgaW5pdGFsaXplIFdlYiBTZXJ2aWNlcyBwb3J0IG9iamVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTE2MTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1+fgotfn4KLX5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLX5+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotfn4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLX5+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLX5+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLX5+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLX5+IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLX5+Ci1+fiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotfn4KLX5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLX5+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1+fiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLX5+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotfn4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotfn4gdW5kZXIgdGhlIExpY2Vuc2UuCi1+fgotfn4KLQotICAtLS0tLQotICBPcGVuQ01JUyBDbGllbnQgQmluZGluZyBMYXllcgotICAtLS0tLQotCi1KVW5pdCBUZXN0IFBhcmFtZXRlcnMKLQotICBUaGUgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdGVzdHMgdGhhdCByZXF1aXJlIGEgcmVhbCBDTUlTIHJlcG9zaXRvcnkgY2FuIGJlIAotICBjb25maWd1cmVkIHZpYSBzeXN0ZW0gcHJvcGVydGllcy4gVGhlc2UgYXJlIHRoZSBwcm9wZXJ0aWVzOgotIAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfHwgUHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0ICAgICAgICAgICAgICAgICAgICAgICB8IE11c3QgYmUgc2V0IHRvIHRydWUgdG8gcnVuIHRlc3RzICAgICAgICAgIHwgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LnVzZXJuYW1lICAgICAgICAgICAgICB8IFVzZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LnBhc3N3b3JkICAgICAgICAgICAgICB8IFBhc3N3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LnJlcG9zaXRvcnkgICAgICAgICAgICB8IFJlcG9zaXRvcnkgaWQgb2YgdGhlIHRlc3QgcmVwb3NpdG9yeSAgICAgIHwgW0lmIG5vdCBzZXQgdGhlIGZpcnN0IHJlcG9zaXRvcnkgcmV0dXJuZWQgYnkgZ2V0UmVwb3NpdG9yeUluZm8gd2lsbCBiZSB1c2VkLl0gfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LnRlc3Rmb2xkZXIgICAgICAgICAgICB8IFJvb3QgZm9sZGVyIGZvciBhbGwgdGVzdHMgICAgICAgICAgICAgICAgIHwgW0lmIG5vdCBzZXQgdGhlIHRoZSByb290IGZvbGRlciBvZiB0aGUgdGVzdCByZXBvc2l0b3J5IHdpbGwgYmUgdXNlZC5dICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LmRvY3VtZW50dHlwZSAgICAgICAgICB8IERlZmF1bHQgdGVzdCBkb2N1bWVudCB0eXBlICAgICAgICAgICAgICAgIHwgY21pczpkb2N1bWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LmZvbGRlcnR5cGUgICAgICAgICAgICB8IERlZmF1bHQgdGVzdCBmb2xkZXIgdHlwZSAgICAgICAgICAgICAgICAgIHwgY21pczpmb2xkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LmF0b21wdWIudXJsICAgICAgICAgICB8IFVSTCBvZiB0aGUgQ01JUyBBdG9tUHViIHNlcnZpY2UgZG9jdW1lbnQgIHwgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2NtaXMvYXRvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LndlYnNlcnZpY2VzLnVybCAgICAgICB8IFVSTCBwcmVmaXggb2YgdGhlIENNSVMgV2ViIFNlcnZpY2VzIFdTRExzIHwgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2NtaXMvc2VydmljZXMvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvcGVuY21pcy50ZXN0LmNvbmZpZyAgICAgICAgICAgICAgICB8IEFic29sdXRlIHBhdGggdG8gYSBwcm9wZXJ0aWVzIGZpbGUgdGhhdCBjYW4gY29udGFpbiBhbGwgdGhlIHBhcmFtZXRlcnMgYWJvdmUgfCA8bm9uZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2F0b21wdWIvQWNsTWVyZ2VUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvYXRvbXB1Yi9BY2xNZXJnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzZDcwNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvYXRvbXB1Yi9BY2xNZXJnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xFbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsOwotCi0vKioKLSAqIFRlc3QgZm9yIHRoZSBBQ0wgbWVyZ2luZyB0aGF0IGlzIG5lY2Vzc2FyeSBpbiB0aGUgQXRvbVB1YiBiaW5kaW5nCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEFjbE1lcmdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0FDTE1lcmdlUmVxdWlyZWQoKSB7Ci0gICAgICAgIEF0b21QdWJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXRvbVB1YlNlcnZpY2UoKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlLnB1YmxpY0lzQUNMTWVyZ2VSZXF1aXJlZChudWxsLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNlcnZpY2UucHVibGljSXNBQ0xNZXJnZVJlcXVpcmVkKG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoKSwgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzZXJ2aWNlLnB1YmxpY0lzQUNMTWVyZ2VSZXF1aXJlZChudWxsLCBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2VydmljZS5wdWJsaWNJc0FDTE1lcmdlUmVxdWlyZWQobmV3IEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCgpLCBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWNsTWVyZ2UoKSB7Ci0gICAgICAgIEF0b21QdWJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXRvbVB1YlNlcnZpY2UoKTsKLQotICAgICAgICAvLyBvcmlnaW5hbAotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gb3JpZ2luYWxBY2VEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4oKTsKLQotICAgICAgICBvcmlnaW5hbEFjZURhdGEucHV0KCJwMSIsIG5ldyBTdHJpbmdbXSB7ICJwZXJtOnJlYWQiLCAicGVybTp3cml0ZSIsICJwZXJtOmRlbGV0ZSIgfSk7Ci0gICAgICAgIG9yaWdpbmFsQWNlRGF0YS5wdXQoInAyIiwgbmV3IFN0cmluZ1tdIHsgInBlcm06cmVhZCIgfSk7Ci0gICAgICAgIG9yaWdpbmFsQWNlRGF0YS5wdXQoInAzIiwgbmV3IFN0cmluZ1tdIHsgInBlcm06YWxsIiB9KTsKLQotICAgICAgICBBY2wgb3JpZ2luYWxBQ0VzID0gY3JlYXRlQUNMKG9yaWdpbmFsQWNlRGF0YSk7Ci0KLSAgICAgICAgLy8gYWRkCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBhZGRBY2VEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4oKTsKLQotICAgICAgICBhZGRBY2VEYXRhLnB1dCgicDIiLCBuZXcgU3RyaW5nW10geyAicGVybTp3cml0ZSIgfSk7Ci0gICAgICAgIGFkZEFjZURhdGEucHV0KCJwNCIsIG5ldyBTdHJpbmdbXSB7ICJwZXJtOmFsbCIgfSk7Ci0KLSAgICAgICAgQWNsIGFkZEFDRXMgPSBjcmVhdGVBQ0woYWRkQWNlRGF0YSk7Ci0KLSAgICAgICAgLy8gcmVtb3ZlCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiByZW1vdmVBY2VEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmdbXT4oKTsKLQotICAgICAgICByZW1vdmVBY2VEYXRhLnB1dCgicDEiLCBuZXcgU3RyaW5nW10geyAicGVybTp3cml0ZSIgfSk7Ci0gICAgICAgIHJlbW92ZUFjZURhdGEucHV0KCJwMyIsIG5ldyBTdHJpbmdbXSB7ICJwZXJtOmFsbCIgfSk7Ci0KLSAgICAgICAgQWNsIHJlbW92ZUFDRXMgPSBjcmVhdGVBQ0wocmVtb3ZlQWNlRGF0YSk7Ci0KLSAgICAgICAgQWNsIG5ld0FDTCA9IHNlcnZpY2UucHVibGljTWVyZ2VBQ0xzKG9yaWdpbmFsQUNFcywgYWRkQUNFcywgcmVtb3ZlQUNFcyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5ld0FDTC5nZXRBY2VzKCkuc2l6ZSgpKTsKLQotICAgICAgICBmb3IgKEFjZSBhY2UgOiBuZXdBQ0wuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJpbmNpcGFsID0gYWNlLmdldFByaW5jaXBhbCgpLmdldElkKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHByaW5jaXBhbCk7Ci0KLSAgICAgICAgICAgIGlmIChwcmluY2lwYWwuZXF1YWxzKCJwMSIpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFjZS5nZXRQZXJtaXNzaW9ucygpLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY2UuZ2V0UGVybWlzc2lvbnMoKS5jb250YWlucygicGVybTpyZWFkIikpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWNlLmdldFBlcm1pc3Npb25zKCkuY29udGFpbnMoInBlcm06ZGVsZXRlIikpOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFjZS5nZXRQZXJtaXNzaW9ucygpLmNvbnRhaW5zKCJwZXJtOndyaXRlIikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcmluY2lwYWwuZXF1YWxzKCJwMiIpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFjZS5nZXRQZXJtaXNzaW9ucygpLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY2UuZ2V0UGVybWlzc2lvbnMoKS5jb250YWlucygicGVybTpyZWFkIikpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWNlLmdldFBlcm1pc3Npb25zKCkuY29udGFpbnMoInBlcm06d3JpdGUiKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByaW5jaXBhbC5lcXVhbHMoInAzIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJQcmluY2lwYWwgc2hvdWxkIGJlIGRlbGV0ZWQhIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByaW5jaXBhbC5lcXVhbHMoInA0IikpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWNlLmdldFBlcm1pc3Npb25zKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFjZS5nZXRQZXJtaXNzaW9ucygpLmNvbnRhaW5zKCJwZXJtOmFsbCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gQUNMIHN0cnVjdHVyZSBmcm9tIGEgTWFwLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFjbCBjcmVhdGVBQ0woTWFwPFN0cmluZywgU3RyaW5nW10+IGFjZURhdGEpIHsKLSAgICAgICAgQWNjZXNzQ29udHJvbExpc3RJbXBsIHJlc3VsdCA9IG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoKTsKLQotICAgICAgICBMaXN0PEFjZT4gYWNlcyA9IG5ldyBBcnJheUxpc3Q8QWNlPigpOwotCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGUgOiBhY2VEYXRhLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBlLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5hZGQocyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwgYWNlID0gbmV3IEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwobmV3IEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbChlLmdldEtleSgpKSwKLSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMpOwotCi0gICAgICAgICAgICBhY2VzLmFkZChhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldEFjZXMoYWNlcyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsYXNzIHRvIG1ha2UgYSBmZXcgcHJvdGVjdGVkIG1ldGhvZHMgcHVibGljbHkgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF0b21QdWJTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBBY2wgcHVibGljTWVyZ2VBQ0xzKEFjbCBvcmlnaW5hbEFDRXMsIEFjbCBhZGRBQ0VzLCBBY2wgcmVtb3ZlQUNFcykgewotICAgICAgICAgICAgcmV0dXJuIG1lcmdlQWNscyhvcmlnaW5hbEFDRXMsIGFkZEFDRXMsIHJlbW92ZUFDRXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcHVibGljSXNBQ0xNZXJnZVJlcXVpcmVkKEFjbCBhZGRBQ0VzLCBBY2wgcmVtb3ZlQUNFcykgewotICAgICAgICAgICAgcmV0dXJuIGlzQWNsTWVyZ2VSZXF1aXJlZChhZGRBQ0VzLCByZW1vdmVBQ0VzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9hdG9tcHViL0F0b21QYXJzZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvYXRvbXB1Yi9BdG9tUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGJlN2M2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9hdG9tcHViL0F0b21QYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5hdG9tcHViOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5hdG9tcHViLkF0b21FbnRyeVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIuQXRvbVB1YlBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tQmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmF0b21wdWIub2JqZWN0cy5BdG9tRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3REYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLQotLyoqCi0gKiBNaW5pbWFsIHRlc3QgZm9yIEF0b21FbnRyeVdyaXRlciBhbmQgQXRvbVB1YlBhcnNlci4KLSAqLwotcHVibGljIGNsYXNzIEF0b21QYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTlRFTlQgPSAiVGhpcyBpcyBteSB0ZXN0IGNvbnRlbnQhIi5nZXRCeXRlcygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidGV4dC9wbGFpbiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIGFuIG9iamVjdAotICAgICAgICBQcm9wZXJ0aWVzSW1wbCBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0KLSAgICAgICAgUHJvcGVydHlTdHJpbmdJbXBsIHByb3BOYW1lID0gbmV3IFByb3BlcnR5U3RyaW5nSW1wbChQcm9wZXJ0eUlkcy5OQU1FLCAiVGVzdE5hbWUiKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShwcm9wTmFtZSk7Ci0KLSAgICAgICAgUHJvcGVydHlJbnRlZ2VySW1wbCBwcm9wSW50ID0gbmV3IFByb3BlcnR5SW50ZWdlckltcGwoIkludFByb3AiLCBBcnJheXMuYXNMaXN0KG5ldyBCaWdJbnRlZ2VyW10gewotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxKSwgQmlnSW50ZWdlci52YWx1ZU9mKDIpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMykgfSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KHByb3BJbnQpOwotCi0gICAgICAgIFByb3BlcnR5RGVjaW1hbEltcGwgcHJvcERlYyA9IG5ldyBQcm9wZXJ0eURlY2ltYWxJbXBsKCJEZWNQcm9wIiwgbmV3IEJpZ0RlY2ltYWwoCi0gICAgICAgICAgICAgICAgIjMuMTQxNTkyNTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODQxOTciCi0gICAgICAgICAgICAgICAgICAgICAgICArICIxNjkzOTkzNzUxMDU4MjA5NzQ5NDQ1OTIzMDc4MTY0MDYyODYyMDg5OTg2MjgwMzQ4MjUzNDIxMTcwNjc5ODIxNDgwODY1MTMiKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkocHJvcERlYyk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YUltcGwgb2JqZWN0MSA9IG5ldyBPYmplY3REYXRhSW1wbCgpOwotICAgICAgICBvYmplY3QxLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gd3JpdGUgdGhlIGVudHJ5Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IG5ldyBDb250ZW50U3RyZWFtSW1wbChudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoQ09OVEVOVC5sZW5ndGgpLCBDT05URU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKENPTlRFTlQpKTsKLSAgICAgICAgQXRvbUVudHJ5V3JpdGVyIGFldyA9IG5ldyBBdG9tRW50cnlXcml0ZXIob2JqZWN0MSwgQ21pc1ZlcnNpb24uQ01JU18xXzEsIGNvbnRlbnRTdHJlYW0pOwotICAgICAgICBhZXcud3JpdGUoYmFvKTsKLQotICAgICAgICBieXRlW10gZW50cnlDb250ZW50ID0gYmFvLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW50cnlDb250ZW50Lmxlbmd0aCA+IDApOwotCi0gICAgICAgIC8vIHBhcnNlIGl0Ci0gICAgICAgIEF0b21QdWJQYXJzZXIgcGFyc2VyID0gbmV3IEF0b21QdWJQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudHJ5Q29udGVudCkpOwotICAgICAgICBwYXJzZXIucGFyc2UoKTsKLSAgICAgICAgQXRvbUJhc2UgcGFyc2VSZXN1bHQgPSBwYXJzZXIuZ2V0UmVzdWx0cygpOwotCi0gICAgICAgIGFzc2VydFRydWUocGFyc2VSZXN1bHQgaW5zdGFuY2VvZiBBdG9tRW50cnkpOwotICAgICAgICBBdG9tRW50cnkgZW50cnkgPSAoQXRvbUVudHJ5KSBwYXJzZVJlc3VsdDsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGVudHJ5KTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZW50cnkuZ2V0RWxlbWVudHMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIGZpbmQgdGhlIG9iamVjdAotICAgICAgICBPYmplY3REYXRhIG9iamVjdDIgPSBudWxsOwotICAgICAgICBmb3IgKEF0b21FbGVtZW50IGVsZW1lbnQgOiBlbnRyeS5nZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE9iamVjdERhdGEpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROdWxsKG9iamVjdDIpOwotICAgICAgICAgICAgICAgIG9iamVjdDIgPSAoT2JqZWN0RGF0YSkgZWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0Mi5nZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgcHJvcGVydGllcwotICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eTEgOiBvYmplY3QxLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eUxpc3QoKSkgewotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5MiA9IG9iamVjdDIuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQocHJvcGVydHkxLmdldElkKCkpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BlcnR5Mik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvcGVydHkxLCBwcm9wZXJ0eTIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RXF1YWxzKFByb3BlcnR5RGF0YTw/PiBleHBlY3RlZCwgUHJvcGVydHlEYXRhPD8+IGFjdHVhbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiUHJvcGVydHkgaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRJZCgpLCBhY3R1YWwuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoZXhwZWN0ZWQuZ2V0Q2xhc3MoKSwgYWN0dWFsLmdldENsYXNzKCkpOwotCi0gICAgICAgIExpc3Q8Pz4gdmFsdWVzMSA9IGV4cGVjdGVkLmdldFZhbHVlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZhbHVlczEpOwotICAgICAgICBhc3NlcnRGYWxzZSh2YWx1ZXMxLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgTGlzdDw/PiB2YWx1ZXMyID0gYWN0dWFsLmdldFZhbHVlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZhbHVlczIpOwotICAgICAgICBhc3NlcnRGYWxzZSh2YWx1ZXMyLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlczEuc2l6ZSgpLCB2YWx1ZXMyLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMxLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVzMS5nZXQoaSksIHZhbHVlczIuZ2V0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9hdG9tcHViL0F0b21QdWJUZXN0QmluZGluZ0ZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9hdG9tcHViL0F0b21QdWJUZXN0QmluZGluZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwZmJkMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvYXRvbXB1Yi9BdG9tUHViVGVzdEJpbmRpbmdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLkNtaXNCaW5kaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci0KLXB1YmxpYyBjbGFzcyBBdG9tUHViVGVzdEJpbmRpbmdGYWN0b3J5IHsKLSAgICAKLSAgICBwcml2YXRlIEF0b21QdWJUZXN0QmluZGluZ0ZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbWlzQmluZGluZyBjcmVhdGVCaW5kaW5nKFN0cmluZyBhdG9tUHViVXJsLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIC8vIGdhdGhlciBwYXJhbWV0ZXJzCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlVTRVIsIHVzZXIpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCBwYXNzd29yZCk7Ci0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCwgYXRvbVB1YlVybCk7Ci0KLSAgICAgICAgLy8gZ2V0IGZhY3RvcnkgYW5kIGNyZWF0ZSBwcm92aWRlcgotICAgICAgICBDbWlzQmluZGluZ0ZhY3RvcnkgZmFjdG9yeSA9IENtaXNCaW5kaW5nRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBDbWlzQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzQXRvbVB1YkJpbmRpbmcocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2F0b21wdWIvU2ltcGxlUmVhZE9ubHlUZXN0cy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2F0b21wdWIvU2ltcGxlUmVhZE9ubHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNkODI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9hdG9tcHViL1NpbXBsZVJlYWRPbmx5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuZnJhbWV3b3JrLkFic3RyYWN0U2ltcGxlUmVhZE9ubHlUZXN0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpmbXVlbGxlckBvcGVudGV4dC5jb20iPkZsb3JpYW4gTSZ1dW1sO2xsZXI8L2E+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVJlYWRPbmx5VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVJlYWRPbmx5VGVzdHMgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBmVGVzdHM7Ci0KLSAgICBwdWJsaWMgU2ltcGxlUmVhZE9ubHlUZXN0cygpIHsKLSAgICAgICAgZlRlc3RzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfUkVQT1NJVE9SWV9JTkZPKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX1RZUEVTKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX05BVklHQVRJT04pOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfQ09OVEVOVF9TVFJFQU0pOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfUVVFUlkpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfQ0hFQ0tFRE9VVCk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9DT05URU5UX0NIQU5HRVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDbWlzQmluZGluZyBjcmVhdGVCaW5kaW5nKCkgewotICAgICAgICAvLyBBZGQgdGhlIGRlZmF1bHQgSmF2YSBjb29raWUgbWFuYWdlciBmcm9tIEphdmEgMS42IHRvIG9wdGltaXplCi0gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIC8vIGJ5IHJldXNpbmcgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGEgdG9rZW4gaXMgc3RvcmVkIGluIGEgY29va2llLgotICAgICAgICAvLyBOb3RlOiBFbmFibGUgY29va2llIG1hbmFnZW1lbnQgcmVxdWlyZXMgSmF2YSAxLjYsIHVuY29tbWVudCB0aGUKLSAgICAgICAgLy8gZm9sbG93aW5nIHR3byBsaW5lcyB0bwotICAgICAgICAvLyBlbmFibGUgY29va2llIG1hbmFnZW1lbnQgZm9yIHRoZSB0ZXN0cy4KLSAgICAgICAgLy8gamF2YS5uZXQuQ29va2llTWFuYWdlciBjbSA9IG5ldyBqYXZhLm5ldC5Db29raWVNYW5hZ2VyKG51bGwsCi0gICAgICAgIC8vIENvb2tpZVBvbGljeS5BQ0NFUFRfQUxMKTsKLSAgICAgICAgLy8gamF2YS5uZXQuQ29va2llSGFuZGxlci5zZXREZWZhdWx0KGNtKTsKLQotICAgICAgICByZXR1cm4gQXRvbVB1YlRlc3RCaW5kaW5nRmFjdG9yeS5jcmVhdGVCaW5kaW5nKGdldEF0b21QdWJVUkwoKSwgZ2V0VXNlcm5hbWUoKSwgZ2V0UGFzc3dvcmQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEVuYWJsZWRUZXN0cygpIHsKLSAgICAgICAgcmV0dXJuIGZUZXN0czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvYXRvbXB1Yi9TaW1wbGVSZWFkV3JpdGVUZXN0cy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2F0b21wdWIvU2ltcGxlUmVhZFdyaXRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3MmIzZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvYXRvbXB1Yi9TaW1wbGVSZWFkV3JpdGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5hdG9tcHViOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5mcmFtZXdvcmsuQWJzdHJhY3RTaW1wbGVSZWFkV3JpdGVUZXN0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpmbXVlbGxlckBvcGVudGV4dC5jb20iPkZsb3JpYW4gTSZ1dW1sO2xsZXI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZWFkV3JpdGVUZXN0cyBleHRlbmRzIEFic3RyYWN0U2ltcGxlUmVhZFdyaXRlVGVzdHMgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBmVGVzdHM7Ci0KLSAgICBwdWJsaWMgU2ltcGxlUmVhZFdyaXRlVGVzdHMoKSB7Ci0gICAgICAgIGZUZXN0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX0NSRUFURV9GT0xERVIpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfQ1JFQVRFX0RPQ1VNRU5UKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX1NFVF9BTkRfREVMRVRFX0NPTlRFTlQpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfVVBEQVRFX1BST1BFUlRJRVMpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfREVMRVRFX1RSRUUpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfTU9WRV9PQkpFQ1QpOwotICAgICAgICAvLyBmVGVzdHMuYWRkKFRFU1RfQ09QWV9PQkpFQ1QpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfVkVSU0lPTklORyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIENtaXNCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKSB7Ci0gICAgICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBKYXZhIGNvb2tpZSBtYW5hZ2VyIGZyb20gSmF2YSAxLjYgdG8gb3B0aW1pemUKLSAgICAgICAgLy8gYXV0aGVudGljYXRpb24KLSAgICAgICAgLy8gYnkgcmV1c2luZyB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSB0b2tlbiBpcyBzdG9yZWQgaW4gYSBjb29raWUuCi0gICAgICAgIC8vIE5vdGU6IEVuYWJsZSBjb29raWUgbWFuYWdlbWVudCByZXF1aXJlcyBKYXZhIDEuNiwgdW5jb21tZW50IHRoZQotICAgICAgICAvLyBmb2xsb3dpbmcgdHdvIGxpbmVzIHRvCi0gICAgICAgIC8vIGVuYWJsZSBjb29raWUgbWFuYWdlbWVudCBmb3IgdGhlIHRlc3RzLgotICAgICAgICAvLyBqYXZhLm5ldC5Db29raWVNYW5hZ2VyIGNtID0gbmV3IGphdmEubmV0LkNvb2tpZU1hbmFnZXIobnVsbCwKLSAgICAgICAgLy8gQ29va2llUG9saWN5LkFDQ0VQVF9BTEwpOwotICAgICAgICAvLyBqYXZhLm5ldC5Db29raWVIYW5kbGVyLnNldERlZmF1bHQoY20pOwotCi0gICAgICAgIHJldHVybiBBdG9tUHViVGVzdEJpbmRpbmdGYWN0b3J5LmNyZWF0ZUJpbmRpbmcoZ2V0QXRvbVB1YlVSTCgpLCBnZXRVc2VybmFtZSgpLCBnZXRQYXNzd29yZCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZ2V0RW5hYmxlZFRlc3RzKCkgewotICAgICAgICByZXR1cm4gZlRlc3RzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9jYWNoZS9DYWNoZVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9jYWNoZS9DYWNoZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5NzAzZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvY2FjaGUvQ2FjaGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsLkNhY2hlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuaW1wbC5Db250ZW50VHlwZUNhY2hlTGV2ZWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsLkxydUNhY2hlTGV2ZWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsLk1hcENhY2hlTGV2ZWxJbXBsOwotCi0vKioKLSAqIFRlc3RzIHRoZSBjYWNoZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9DQUNIRV9MRVZFTCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuaW1wbC5NYXBDYWNoZUxldmVsSW1wbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFJVX0NBQ0hFX0xFVkVMID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5pbXBsLkxydUNhY2hlTGV2ZWxJbXBsIjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDYWNoZSgpIHsKLSAgICAgICAgQ2FjaGUgY2FjaGU7Ci0KLSAgICAgICAgY2FjaGUgPSBuZXcgQ2FjaGVJbXBsKCk7Ci0gICAgICAgIGNhY2hlLmluaXRpYWxpemUobmV3IFN0cmluZ1tdIHsgTUFQX0NBQ0hFX0xFVkVMLCBMUlVfQ0FDSEVfTEVWRUwsIE1BUF9DQUNIRV9MRVZFTCwgTUFQX0NBQ0hFX0xFVkVMIH0pOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZTEgPSAidmFsdWUxIjsKLSAgICAgICAgU3RyaW5nIHZhbHVlMiA9ICJ2YWx1ZTIiOwotICAgICAgICBTdHJpbmcgdmFsdWUzID0gInZhbHVlMyI7Ci0gICAgICAgIE9iamVjdCB2YWx1ZU9iajsKLQotICAgICAgICAvLyBwdXQgYW5kIGdldAotICAgICAgICBjYWNoZS5wdXQodmFsdWUxLCAibDEiLCAibDJhIiwgImwzIiwgImw0Iik7Ci0gICAgICAgIGNhY2hlLnB1dCh2YWx1ZTIsICJsMSIsICJsMmIiLCAibDMiLCAibDQiKTsKLSAgICAgICAgY2FjaGUucHV0KHZhbHVlMywgImwxIiwgImwyYyIsICJsMyIsICJsNCIpOwotCi0gICAgICAgIHZhbHVlT2JqID0gY2FjaGUuZ2V0KCJsMSIsICJsMmEiLCAibDMiLCAibDQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZU9iaiBpbnN0YW5jZW9mIFN0cmluZyk7Ci0gICAgICAgIGFzc2VydFNhbWUodmFsdWUxLCB2YWx1ZU9iaik7Ci0KLSAgICAgICAgdmFsdWVPYmogPSBjYWNoZS5nZXQoImwxIiwgImwyYiIsICJsMyIsICJsNCIpOwotICAgICAgICBhc3NlcnRUcnVlKHZhbHVlT2JqIGluc3RhbmNlb2YgU3RyaW5nKTsKLSAgICAgICAgYXNzZXJ0U2FtZSh2YWx1ZTIsIHZhbHVlT2JqKTsKLQotICAgICAgICB2YWx1ZU9iaiA9IGNhY2hlLmdldCgibDEiLCAibDJjIiwgImwzIiwgImw0Iik7Ci0gICAgICAgIGFzc2VydFRydWUodmFsdWVPYmogaW5zdGFuY2VvZiBTdHJpbmcpOwotICAgICAgICBhc3NlcnRTYW1lKHZhbHVlMywgdmFsdWVPYmopOwotCi0gICAgICAgIC8vIHJlbW92ZSBsZWFmCi0gICAgICAgIGNhY2hlLnJlbW92ZSgibDEiLCAibDIiLCAibDMiLCAibDQiKTsKLSAgICAgICAgdmFsdWVPYmogPSBjYWNoZS5nZXQoImwxIiwgImwyIiwgImwzIiwgImw0Iik7Ci0gICAgICAgIGFzc2VydE51bGwodmFsdWVPYmopOwotCi0gICAgICAgIC8vIHB1dCBhbmQgZ2V0Ci0gICAgICAgIGNhY2hlLnB1dCh2YWx1ZTEsICJsMSIsICJsMiIsICJsMyIsICJsNCIpOwotICAgICAgICB2YWx1ZU9iaiA9IGNhY2hlLmdldCgibDEiLCAibDIiLCAibDMiLCAibDQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZU9iaiBpbnN0YW5jZW9mIFN0cmluZyk7Ci0gICAgICAgIGFzc2VydFNhbWUodmFsdWUxLCB2YWx1ZU9iaik7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIGJyYW5jaAotICAgICAgICBjYWNoZS5yZW1vdmUoImwxIiwgImwyIik7Ci0gICAgICAgIHZhbHVlT2JqID0gY2FjaGUuZ2V0KCJsMSIsICJsMiIsICJsMyIsICJsNCIpOwotICAgICAgICBhc3NlcnROdWxsKHZhbHVlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVCYWRVc2FnZSgpIHsKLSAgICAgICAgQ2FjaGUgY2FjaGU7Ci0KLSAgICAgICAgY2FjaGUgPSBuZXcgQ2FjaGVJbXBsKCk7Ci0gICAgICAgIGNhY2hlLmluaXRpYWxpemUobmV3IFN0cmluZ1tdIHsgTUFQX0NBQ0hFX0xFVkVMLCBMUlVfQ0FDSEVfTEVWRUwsIE1BUF9DQUNIRV9MRVZFTCwgTUFQX0NBQ0hFX0xFVkVMIH0pOwotCi0gICAgICAgIC8vIGluc3VmZmljaWVudCBudW1iZXIgb2Yga2V5cwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2FjaGUucHV0KCJ2YWx1ZSIsICJsMSIsICJsMiIsICJsMyIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdG9vIG1hbnkgbnVtYmVyIG9mIGtleXMKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNhY2hlLnB1dCgidmFsdWUiLCAibDEiLCAibDIiLCAibDMiLCAibDQiLCAibDUiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vIGtleXMKLSAgICAgICAgYXNzZXJ0TnVsbChjYWNoZS5nZXQoKFN0cmluZ1tdKSBudWxsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhY2hlQ29uZmlnKCkgewotICAgICAgICBDYWNoZSBjYWNoZTsKLQotICAgICAgICAvLyBlbXB0eSBjb25maWcKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNhY2hlID0gbmV3IENhY2hlSW1wbCgpOwotICAgICAgICAgICAgY2FjaGUuaW5pdGlhbGl6ZShuZXcgU3RyaW5nW10ge30pOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbnVsbCBjb25maWcKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNhY2hlID0gbmV3IENhY2hlSW1wbCgpOwotICAgICAgICAgICAgY2FjaGUuaW5pdGlhbGl6ZShudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVua25vd24gY2xhc3MKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNhY2hlID0gbmV3IENhY2hlSW1wbCgpOwotICAgICAgICAgICAgY2FjaGUuaW5pdGlhbGl6ZShuZXcgU3RyaW5nW10geyAidGhpcy5pcy5ub3QuYS52YWxpZC5jbGFzcyIgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3QgYSBDYWNoZUxldmVsIGNsYXNzCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYWNoZSA9IG5ldyBDYWNoZUltcGwoKTsKLSAgICAgICAgICAgIGNhY2hlLmluaXRpYWxpemUobmV3IFN0cmluZ1tdIHsgIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5wcm92aWRlci5jYWNoZS5DYWNoZVRlc3QiIH0pOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hcENhY2hlKCkgewotICAgICAgICBDYWNoZSBjYWNoZTsKLQotICAgICAgICBjYWNoZSA9IG5ldyBDYWNoZUltcGwoKTsKLSAgICAgICAgY2FjaGUuaW5pdGlhbGl6ZShuZXcgU3RyaW5nW10geyBNQVBfQ0FDSEVfTEVWRUwgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9MTAsIgotICAgICAgICAgICAgICAgICsgTWFwQ2FjaGVMZXZlbEltcGwuTE9BRF9GQUNUT1IgKyAiPTAuNSIgfSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgICAgICAgICAgY2FjaGUucHV0KCJ2YWx1ZSIgKyBpLCAia2V5IiArIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlT2JqID0gY2FjaGUuZ2V0KCJrZXkiICsgaSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHZhbHVlT2JqIGluc3RhbmNlb2YgU3RyaW5nKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiICsgaSwgdmFsdWVPYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVSTENhY2hlKCkgewotICAgICAgICBDYWNoZSBjYWNoZTsKLQotICAgICAgICBjYWNoZSA9IG5ldyBDYWNoZUltcGwoKTsKLSAgICAgICAgY2FjaGUuaW5pdGlhbGl6ZShuZXcgU3RyaW5nW10geyBMUlVfQ0FDSEVfTEVWRUwgKyAiICIgKyBMcnVDYWNoZUxldmVsSW1wbC5NQVhfRU5UUklFUyArICI9MTAiIH0pOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgICAgIGNhY2hlLnB1dCgidmFsdWUiICsgaSwgImtleSIgKyBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTA7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlT2JqID0gY2FjaGUuZ2V0KCJrZXkiICsgaSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKHZhbHVlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSA5MDsgaSA8IDEwMDsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWVPYmogPSBjYWNoZS5nZXQoImtleSIgKyBpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUodmFsdWVPYmogaW5zdGFuY2VvZiBTdHJpbmcpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIgKyBpLCB2YWx1ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBYdGVzdEZhbGxiYWNrKCkgewotICAgICAgICBDYWNoZSBjYWNoZTsKLQotICAgICAgICBjYWNoZSA9IG5ldyBDYWNoZUltcGwoKTsKLSAgICAgICAgY2FjaGUuaW5pdGlhbGl6ZShuZXcgU3RyaW5nW10geyBNQVBfQ0FDSEVfTEVWRUwgKyAiICIgKyBNYXBDYWNoZUxldmVsSW1wbC5DQVBBQ0lUWSArICI9MTAsIgotICAgICAgICAgICAgICAgICsgTWFwQ2FjaGVMZXZlbEltcGwuTE9BRF9GQUNUT1IgKyAiPTAuNSIgfSk7Ci0KLSAgICAgICAgY2FjaGUucHV0KCJ2YWx1ZTEiLCBuZXcgU3RyaW5nW10geyBudWxsIH0pOwotICAgICAgICBjYWNoZS5wdXQoInZhbHVlMiIsICJrZXkyIik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBjYWNoZS5nZXQobmV3IFN0cmluZ1tdIHsgbnVsbCB9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgY2FjaGUuZ2V0KCJrZXkyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGNhY2hlLmdldCgia2V5MyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudFR5cGVDYWNoZSgpIHsKLSAgICAgICAgQ29udGVudFR5cGVDYWNoZUxldmVsSW1wbCBjbCA9IG5ldyBDb250ZW50VHlwZUNhY2hlTGV2ZWxJbXBsKCk7Ci0gICAgICAgIGNsLmluaXRpYWxpemUobnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHR5cGUxID0gInR5cGUxIjsKLQotICAgICAgICBjbC5wdXQodHlwZTEsICJ0ZXh0L3BsYWluOyBwYXJhbTE9dGVzdDsgY2hhcnNldD1VVEYtOCIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlMSwgY2wuZ2V0KCJ0ZXh0L3BsYWluOyBwYXJhbTE9dGVzdDsgY2hhcnNldD1VVEYtOCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGUxLCBjbC5nZXQoInRleHQvcGxhaW47IHBhcmFtMT10ZXN0OyBjaGFyc2V0PXV0Zi04IikpOwotICAgICAgICBhc3NlcnRFcXVhbHModHlwZTEsIGNsLmdldCgidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtODsgcGFyYW0xPXRlc3QiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlMSwgY2wuZ2V0KCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04OyBwYXJhbTE9dGVzdDsiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlMSwgY2wuZ2V0KCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTg7cGFyYW0xPXRlc3QiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlMSwgY2wuZ2V0KCJ0ZXh0L3BsYWluO1x0Y2hhcnNldD11dGYtODsgICAgIHBhcmFtMT10ZXN0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHModHlwZTEsIGNsLmdldCgidGV4dC9wbGFpbjsgY2hhcnNldD1cInV0Zi04XCI7IHBhcmFtMT10ZXN0OyIpKTsKLQotICAgICAgICBhc3NlcnROdWxsKGNsLmdldCgidGV4dC9wbGFpbjsgcGFyYW0xPWJsYWg7IGNoYXJzZXQ9VVRGLTgiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoY2wuZ2V0KCJ0ZXh0L3BsYWluOyBwYXJhbTE9dGVzdDsgY2hhcnNldD11cy1hc2NpaSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvZnJhbWV3b3JrL0Fic3RyYWN0Q21pc1Rlc3RDYXNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvZnJhbWV3b3JrL0Fic3RyYWN0Q21pc1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Yjk1ZTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ZyYW1ld29yay9BYnN0cmFjdENtaXNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmZyYW1ld29yazsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGVUaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q2hhbmdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlSZW5kaXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5CaW5kaW5nc09iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBCYXNlIHRlc3QgY2FzZSBmb3IgQ01JUyB0ZXN0cy4KLSAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENtaXNUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEVTVFNfRU5BQkxFRCA9ICJ0cnVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1VTRVJOQU1FID0gImFkbWluIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBU1NXT1JEID0gImFkbWluIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FUT01QVUJfVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9hdG9tIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dFQlNFUlZJQ0VTX1VSTFBSRUZJWCA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvY21pcy9zZXJ2aWNlcy8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRE9DVFlQRSA9ICJjbWlzOmRvY3VtZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTERFUlRZUEUgPSAiY21pczpmb2xkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9URVNUU19FTkFCTEVEID0gIm9wZW5jbWlzLnRlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUk5BTUUgPSAib3BlbmNtaXMudGVzdC51c2VybmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QQVNTV09SRCA9ICJvcGVuY21pcy50ZXN0LnBhc3N3b3JkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JFUE9TSVRPUlkgPSAib3BlbmNtaXMudGVzdC5yZXBvc2l0b3J5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RFU1RGT0xERVIgPSAib3BlbmNtaXMudGVzdC50ZXN0Zm9sZGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RPQ1RZUEUgPSAib3BlbmNtaXMudGVzdC5kb2N1bWVudHR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRk9MREVSVFlQRSA9ICJvcGVuY21pcy50ZXN0LmZvbGRlcnR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09ORklHX0ZJTEUgPSAib3BlbmNtaXMudGVzdC5jb25maWciOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVE9NUFVCX1VSTCA9ICJvcGVuY21pcy50ZXN0LmF0b21wdWIudXJsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dFQlNFUlZJQ0VTX1VSTFBSRUZJWCA9ICJvcGVuY21pcy50ZXN0LndlYnNlcnZpY2VzLnVybCI7Ci0KLSAgICBwcml2YXRlIENtaXNCaW5kaW5nIGJpbmRpbmc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZlRlc3RSZXBvc2l0b3J5SWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZlRlc3RGb2xkZXJJZDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYnN0cmFjdENtaXNUZXN0Q2FzZS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICBzdGF0aWMgewotICAgICAgICBTdHJpbmcgY29uZmlnRmlsZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9DT05GSUdfRklMRSk7Ci0gICAgICAgIGlmIChjb25maWdGaWxlTmFtZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamF2YS51dGlsLlByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBqYXZhLnV0aWwuUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGNvbmZpZ0ZpbGVOYW1lKSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uPD8+IGUgPSBwcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBsb2FkIHRlc3QgcHJvcGVydGllczogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIG9iamVjdCBvciBjcmVhdGVzIG9uZSBpZiBkb2VzIG5vdCBleGlzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0JpbmRpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nIGJpbmRpbmcuLi4iKTsKLSAgICAgICAgICAgIGJpbmRpbmcgPSBjcmVhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgYmluZGluZyBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENtaXNCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzZXQgb2YgdGVzdCBuYW1lcyB0aGF0IGVuYWJsZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFNldDxTdHJpbmc+IGdldEVuYWJsZWRUZXN0cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGVzdCByZXBvc2l0b3J5IGlkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdFJlcG9zaXRvcnlJZCgpIHsKLSAgICAgICAgaWYgKGZUZXN0UmVwb3NpdG9yeUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmVGVzdFJlcG9zaXRvcnlJZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZUZXN0UmVwb3NpdG9yeUlkID0gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfUkVQT1NJVE9SWSk7Ci0gICAgICAgIGlmIChmVGVzdFJlcG9zaXRvcnlJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVGVzdCByZXBvc2l0b3J5OiAiICsgZlRlc3RSZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgcmV0dXJuIGZUZXN0UmVwb3NpdG9yeUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgZlRlc3RSZXBvc2l0b3J5SWQgPSBnZXRGaXJzdFJlcG9zaXRvcnlJZCgpOwotICAgICAgICBsb2cuaW5mbygiVGVzdCByZXBvc2l0b3J5OiAiICsgZlRlc3RSZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHJldHVybiBmVGVzdFJlcG9zaXRvcnlJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXN0IHJvb3QgZm9sZGVyIGlkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGVzdFJvb3RGb2xkZXIoKSB7Ci0gICAgICAgIGlmIChmVGVzdEZvbGRlcklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmVGVzdEZvbGRlcklkOwotICAgICAgICB9Ci0KLSAgICAgICAgZlRlc3RGb2xkZXJJZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1RFU1RGT0xERVIpOwotICAgICAgICBpZiAoZlRlc3RGb2xkZXJJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVGVzdCByb290IGZvbGRlcjogIiArIGZUZXN0Rm9sZGVySWQpOwotICAgICAgICAgICAgcmV0dXJuIGZUZXN0Rm9sZGVySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmVGVzdEZvbGRlcklkID0gZ2V0Um9vdEZvbGRlcklkKCk7Ci0gICAgICAgIGxvZy5pbmZvKCJUZXN0IHJvb3QgZm9sZGVyOiAiICsgZlRlc3RGb2xkZXJJZCk7Ci0KLSAgICAgICAgcmV0dXJuIGZUZXN0Rm9sZGVySWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgdGVzdCBpcyBlbmFibGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgbmFtZSkgewotICAgICAgICBib29sZWFuIHRlc3RzRW5hYmxlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1RFU1RTX0VOQUJMRUQsIERFRkFVTFRfVEVTVFNfRU5BQkxFRCkpOwotCi0gICAgICAgIGlmICh0ZXN0c0VuYWJsZWQgJiYgZ2V0RW5hYmxlZFRlc3RzKCkuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8oIlNraXBwaW5nIHRlc3QgJyIgKyBuYW1lICsgIichIik7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRlc3QgdXNlcm5hbWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1VTRVJOQU1FLCBERUZBVUxUX1VTRVJOQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXN0IHBhc3N3b3JkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9QQVNTV09SRCwgREVGQVVMVF9QQVNTV09SRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBkb2N1bWVudCB0eXBlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdERvY3VtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0RPQ1RZUEUsIERFRkFVTFRfRE9DVFlQRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBmb2xkZXIgdHlwZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGb2xkZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfRk9MREVSVFlQRSwgREVGQVVMVF9GT0xERVJUWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBBdG9tUHViIFVSTC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0b21QdWJVUkwoKSB7Ci0gICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9BVE9NUFVCX1VSTCwgREVGQVVMVF9BVE9NUFVCX1VSTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgV2ViIFNlcnZpY2VzIFVSTCBwcmVmaXguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXZWJTZXJ2aWNlc1VSTCgpIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1dFQlNFUlZJQ0VTX1VSTFBSRUZJWCwgREVGQVVMVF9XRUJTRVJWSUNFU19VUkxQUkVGSVgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBmYWN0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBCaW5kaW5nc09iamVjdEZhY3RvcnkgZ2V0T2JqZWN0RmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEJpbmRpbmcoKS5nZXRPYmplY3RGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGZpcnN0IHJlcG9zaXRvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdFJlcG9zaXRvcnlJZCgpIHsKLSAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gcmVwb3NpdG9yaWVzID0gZ2V0QmluZGluZygpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0UmVwb3NpdG9yeUluZm9zKG51bGwpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yaWVzKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocmVwb3NpdG9yaWVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yaWVzLmdldCgwKS5nZXRJZCgpKTsKLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yaWVzLmdldCgwKS5nZXRJZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGluZm8gb2JqZWN0IG9mIHRoZSB0ZXN0IHJlcG9zaXRvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKCkgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5SW5mbyA9IGdldEJpbmRpbmcoKS5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmdldFJlcG9zaXRvcnlJbmZvKGdldFRlc3RSZXBvc2l0b3J5SWQoKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcG9zaXRvcnlJbmZvKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBvc2l0b3J5SW5mby5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFRlc3RSZXBvc2l0b3J5SWQoKSwgcmVwb3NpdG9yeUluZm8uZ2V0SWQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVyIG9mIHRoZSB0ZXN0IHJlcG9zaXRvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb290Rm9sZGVySWQoKSB7Ci0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnkgPSBnZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yeS5nZXRSb290Rm9sZGVySWQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnkuZ2V0Um9vdEZvbGRlcklkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgdGVzdCByZXBvc2l0b3J5IHN1cHBvcnRzIHJlYWRpbmcgQUNMcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Rpc2NvdmVyQUNMcygpIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeSA9IGdldFJlcG9zaXRvcnlJbmZvKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpKTsKLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRBY2xDYXBhYmlsaXR5KCkgIT0gQ2FwYWJpbGl0eUFjbC5OT05FOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHRlc3QgcmVwb3NpdG9yeSBzdXBwb3J0cyBzZXR0aW5nIEFDTHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNNYW5hZ2VBQ0xzKCkgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5ID0gZ2V0UmVwb3NpdG9yeUluZm8oKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcG9zaXRvcnkuZ2V0Q2FwYWJpbGl0aWVzKCkpOwotCi0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmdldEFjbENhcGFiaWxpdHkoKSA9PSBDYXBhYmlsaXR5QWNsLk1BTkFHRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSB0ZXN0IHJlcG9zaXRvcnkgc3VwcG9ydHMgcmVuZGl0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c1JlbmRpdGlvbnMoKSB7Ci0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnkgPSBnZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKSk7Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnkuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0UmVuZGl0aW9uc0NhcGFiaWxpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRSZW5kaXRpb25zQ2FwYWJpbGl0eSgpICE9IENhcGFiaWxpdHlSZW5kaXRpb25zLk5PTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgdGVzdCByZXBvc2l0b3J5IHN1cHBvcnRzIGRlc2NlbmRhbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzRGVzY2VuZGFudHMoKSB7Ci0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnkgPSBnZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKSk7Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnkuZ2V0Q2FwYWJpbGl0aWVzKCkuaXNHZXREZXNjZW5kYW50c1N1cHBvcnRlZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSB0ZXN0IHJlcG9zaXRvcnkgc3VwcG9ydHMgZGVzY2VuZGFudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNGb2xkZXJUcmVlKCkgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5ID0gZ2V0UmVwb3NpdG9yeUluZm8oKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcG9zaXRvcnkuZ2V0Q2FwYWJpbGl0aWVzKCkpOwotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHRlc3QgcmVwb3NpdG9yeSBzdXBwb3J0cyBjb250ZW50IGNoYW5nZXMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDb250ZW50Q2hhbmdlcygpIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeSA9IGdldFJlcG9zaXRvcnlJbmZvKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmdldENoYW5nZXNDYXBhYmlsaXR5KCkgIT0gQ2FwYWJpbGl0eUNoYW5nZXMuTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSB0ZXN0IHJlcG9zaXRvcnkgc3VwcG9ydHMgcXVlcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNRdWVyeSgpIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeSA9IGdldFJlcG9zaXRvcnlJbmZvKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRRdWVyeUNhcGFiaWxpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRRdWVyeUNhcGFiaWxpdHkoKSAhPSBDYXBhYmlsaXR5UXVlcnkuTk9ORTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSB0ZXN0IHJlcG9zaXRvcnkgc3VwcG9ydHMgcmVsYXRpb25zaGlwcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c1JlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHJlbFR5cGUgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWxUeXBlID0gZ2V0QmluZGluZygpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0VHlwZURlZmluaXRpb24oZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCAiY21pczpyZWxhdGlvbnNoaXAiLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZWxUeXBlICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgdGVzdCByZXBvc2l0b3J5IHN1cHBvcnRzIHBvbGljaWVzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzUG9saWNpZXMoKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHJlbFR5cGUgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWxUeXBlID0gZ2V0QmluZGluZygpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0VHlwZURlZmluaXRpb24oZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCAiY21pczpwb2xpY3kiLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZWxUeXBlICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQWNsUHJvcGFnYXRpb24gZnJvbSB0aGUgQUNMIGNhcGFiaWxpdGllcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWNsUHJvcGFnYXRpb24gZ2V0QWNsUHJvcGFnYXRpb24oKSB7Ci0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnkgPSBnZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKSk7Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnkuZ2V0QWNsQ2FwYWJpbGl0aWVzKCkuZ2V0QWNsUHJvcGFnYXRpb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWNsUHJvcGFnYXRpb24uUkVQT1NJVE9SWURFVEVSTUlORUQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRBY2xDYXBhYmlsaXRpZXMoKS5nZXRBY2xQcm9wYWdhdGlvbigpOwotICAgIH0KLQotICAgIC8vIC0tLS0gaGVscGVycyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSB3YXJuaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKioqICIgKyBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQ29udGVudFN0cmVhbURhdGEgb2JqZWN0IGZyb20gYSBieXRlIGFycmF5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDb250ZW50U3RyZWFtIGNyZWF0ZUNvbnRlbnRTdHJlYW1EYXRhKFN0cmluZyBtaW1lVHlwZSwgYnl0ZVtdIGNvbnRlbnQpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50KTsKLQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUNvbnRlbnRTdHJlYW0oInRlc3QiLCBCaWdJbnRlZ2VyLnZhbHVlT2YoY29udGVudC5sZW5ndGgpLCBtaW1lVHlwZSwKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIHRoZSBwYXRoIGZyb20gYSBmb2xkZXIgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aChPYmplY3REYXRhIGZvbGRlck9iamVjdCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKGZvbGRlck9iamVjdCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZm9sZGVyT2JqZWN0LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZm9sZGVyT2JqZWN0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGZvbGRlck9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5QQVRIKSBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nKTsKLQotICAgICAgICBQcm9wZXJ0eVN0cmluZyBwYXRoUHJvcGVydHkgPSAoUHJvcGVydHlTdHJpbmcpIGZvbGRlck9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5QQVRIKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHBhdGhQcm9wZXJ0eS5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwYXRoUHJvcGVydHkuZ2V0VmFsdWVzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXRoUHJvcGVydHkuZ2V0VmFsdWVzKCkuZ2V0KDApKTsKLQotICAgICAgICByZXR1cm4gcGF0aFByb3BlcnR5LmdldFZhbHVlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIHNob3J0IGN1dHMgLS0tLQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YSBnZXRPYmplY3QoU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFDTCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3QoZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBQ0wsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCi0gICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGEgZnVsbCBibG93biBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdERhdGEgZ2V0T2JqZWN0KFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldE9iamVjdChvYmplY3RJZCwgIioiLCBCb29sZWFuLlRSVUUsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgsIG51bGwsIEJvb2xlYW4uVFJVRSwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUsIG51bGwpOwotCi0gICAgICAgIGFzc2VydEJhc2ljUHJvcGVydGllcyhvYmplY3QuZ2V0UHJvcGVydGllcygpKTsKLQotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbiBvYmplY3QgYnkgcGF0aC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQUNMLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpCi0gICAgICAgICAgICAgICAgLmdldE9iamVjdEJ5UGF0aChnZXRUZXN0UmVwb3NpdG9yeUlkKCksIHBhdGgsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQUNMLCBleHRlbnNpb24pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0KTsKLQotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhIGZ1bGwgYmxvd24gb2JqZWN0IGJ5IHBhdGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdERhdGEgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0T2JqZWN0QnlQYXRoKHBhdGgsICIqIiwgQm9vbGVhbi5UUlVFLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5CT1RILCBudWxsLCBCb29sZWFuLlRSVUUsCi0gICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLCBudWxsKTsKLQotICAgICAgICBhc3NlcnRCYXNpY1Byb3BlcnRpZXMob2JqZWN0LmdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQgZXhpc3RzLAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhpc3RzT2JqZWN0KFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0SWQsIFByb3BlcnR5SWRzLk9CSkVDVF9JRCwgQm9vbGVhbi5GQUxTRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0LmdldElkKCkpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hpbGQgb2YgYSBmb2xkZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdEluRm9sZGVyRGF0YSBnZXRDaGlsZChTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCi0gICAgICAgIHdoaWxlIChoYXNNb3JlKSB7Ci0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgY2hpbGRyZW4gPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRDaGlsZHJlbihnZXRUZXN0UmVwb3NpdG9yeUlkKCksCi0gICAgICAgICAgICAgICAgICAgIGZvbGRlcklkLCAiKiIsIG51bGwsIEJvb2xlYW4uVFJVRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCwgbnVsbCwgQm9vbGVhbi5UUlVFLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzTm90RW1wdHkoY2hpbGRyZW4uZ2V0T2JqZWN0cygpKSk7Ci0KLSAgICAgICAgICAgIGhhc01vcmUgPSAoY2hpbGRyZW4uaGFzTW9yZUl0ZW1zKCkgPT0gbnVsbCA/IGZhbHNlIDogY2hpbGRyZW4uaGFzTW9yZUl0ZW1zKCkuYm9vbGVhblZhbHVlKCkpOwotCi0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBvYmplY3QgOiBjaGlsZHJlbi5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0LmdldE9iamVjdCgpLmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0QmFzaWNQcm9wZXJ0aWVzKG9iamVjdC5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRPYmplY3QoKS5nZXRJZCgpLmVxdWFscyhvYmplY3RJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmYWlsKCJDaGlsZCBub3QgZm91bmQhIik7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmVyc2lvbiBzZXJpZXMgaWQgb2YgYW4gb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblNlcmllc0lkKE9iamVjdERhdGEgb2JqZWN0KSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiB2ZXJzaW9uU2VyaWVzSWQgPSBvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZlcnNpb25TZXJpZXNJZCk7Ci0gICAgICAgIGFzc2VydFRydWUodmVyc2lvblNlcmllc0lkIGluc3RhbmNlb2YgUHJvcGVydHlJZCk7Ci0KLSAgICAgICAgcmV0dXJuICgoUHJvcGVydHlJZCkgdmVyc2lvblNlcmllc0lkKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmVyc2lvbiBzZXJpZXMgaWQgb2YgYW4gb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblNlcmllc0lkKFN0cmluZyBkb2NJZCkgewotICAgICAgICByZXR1cm4gZ2V0VmVyc2lvblNlcmllc0lkKGdldE9iamVjdChkb2NJZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmb2xkZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVGb2xkZXIoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQUNFcykgewotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLmNyZWF0ZUZvbGRlcihnZXRUZXN0UmVwb3NpdG9yeUlkKCksIHByb3BlcnRpZXMsIGZvbGRlcklkLAotICAgICAgICAgICAgICAgIHBvbGljaWVzLCBhZGRBQ0VzLCByZW1vdmVBQ0VzLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3RJZCk7Ci0gICAgICAgIGFzc2VydFRydWUoZXhpc3RzT2JqZWN0KG9iamVjdElkKSk7Ci0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhIGZvbGRlckNoaWxkID0gZ2V0Q2hpbGQoZm9sZGVySWQsIG9iamVjdElkKTsKLQotICAgICAgICAvLyBjaGVjayBjYW5HZXRQcm9wZXJ0aWVzCi0gICAgICAgIGFzc2VydEFsbG93YWJsZUFjdGlvbihmb2xkZXJDaGlsZC5nZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCksIEFjdGlvbi5DQU5fR0VUX1BST1BFUlRJRVMsIHRydWUpOwotCi0gICAgICAgIC8vIGNoZWNrIG5hbWUKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IG5hbWVQcm9wID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICBpZiAobmFtZVByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgYXNzZXJ0UHJvcGVydHlWYWx1ZShmb2xkZXJDaGlsZC5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCksIFByb3BlcnR5SWRzLk5BTUUsIFByb3BlcnR5U3RyaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBuYW1lUHJvcC5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgb2JqZWN0IHR5cGUKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHR5cGVQcm9wID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlUHJvcCk7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5VmFsdWUoZm9sZGVyQ2hpbGQuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgUHJvcGVydHlJZC5jbGFzcywKLSAgICAgICAgICAgICAgICB0eXBlUHJvcC5nZXRGaXJzdFZhbHVlKCkpOwotCi0gICAgICAgIC8vIGNoZWNrIHBhcmVudAotICAgICAgICBPYmplY3REYXRhIHBhcmVudCA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldEZvbGRlclBhcmVudChnZXRUZXN0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbGRlcklkLCBwYXJlbnQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKS5nZXRGaXJzdFZhbHVlKCkpOwotCi0gICAgICAgIHJldHVybiBvYmplY3RJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZm9sZGVyIHdpdGggdGhlIGRlZmF1bHQgdHlwZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURlZmF1bHRGb2xkZXIoU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcExpc3QuYWRkKGdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wTGlzdC5hZGQoZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBnZXREZWZhdWx0Rm9sZGVyVHlwZSgpKSk7Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BMaXN0KTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlRm9sZGVyKHByb3BlcnRpZXMsIGZvbGRlcklkLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVEb2N1bWVudChQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpIHsKLSAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKS5jcmVhdGVEb2N1bWVudChnZXRUZXN0UmVwb3NpdG9yeUlkKCksIHByb3BlcnRpZXMsIGZvbGRlcklkLAotICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsIGFkZEFDRXMsIHJlbW92ZUFDRXMsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdElkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShleGlzdHNPYmplY3Qob2JqZWN0SWQpKTsKLQotICAgICAgICBpZiAoZm9sZGVySWQgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhIGZvbGRlckNoaWxkID0gZ2V0Q2hpbGQoZm9sZGVySWQsIG9iamVjdElkKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgY2FuR2V0UHJvcGVydGllcwotICAgICAgICAgICAgYXNzZXJ0QWxsb3dhYmxlQWN0aW9uKGZvbGRlckNoaWxkLmdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKSwgQWN0aW9uLkNBTl9HRVRfUFJPUEVSVElFUywgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGNhbkdldENvbnRlbnRTdHJlYW0KLSAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRBbGxvd2FibGVBY3Rpb24oZm9sZGVyQ2hpbGQuZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLCBBY3Rpb24uQ0FOX0dFVF9DT05URU5UX1NUUkVBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBuYW1lCi0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gbmFtZVByb3AgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgICAgICBpZiAobmFtZVByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFzc2VydFByb3BlcnR5VmFsdWUoZm9sZGVyQ2hpbGQuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLCBQcm9wZXJ0eUlkcy5OQU1FLCBQcm9wZXJ0eVN0cmluZy5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVQcm9wLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCB0eXBlCi0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gdHlwZVByb3AgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlUHJvcCk7Ci0gICAgICAgICAgICBhc3NlcnRQcm9wZXJ0eVZhbHVlKGZvbGRlckNoaWxkLmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKSwgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIFByb3BlcnR5SWQuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVQcm9wLmdldEZpcnN0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHBhcmVudAotICAgICAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBwYXJlbnRzID0gZ2V0QmluZGluZygpLmdldE5hdmlnYXRpb25TZXJ2aWNlKCkuZ2V0T2JqZWN0UGFyZW50cygKLSAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwgIioiLCBCb29sZWFuLlRSVUUsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgsIG51bGwsIEJvb2xlYW4uVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudHMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmVudHMuc2l6ZSgpKTsKLQotICAgICAgICAgICAgT2JqZWN0UGFyZW50RGF0YSBwYXJlbnQgPSBwYXJlbnRzLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldFJlbGF0aXZlUGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudC5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbGRlcklkLCBwYXJlbnQuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RWYWx1ZSgpKTsKLQotICAgICAgICAgICAgLy8gZ2V0IGRvY3VtZW50IGJ5IHBhdGggKGNoZWNrIHJlbGF0aXZlIHBhdGggc2VnbWVudCkKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLlBBVEgpKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXJlbnRQYXRoID0gcGFyZW50LmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLlBBVEgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdFZhbHVlKCkudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBkb2NCeVBhdGggPSBnZXRPYmplY3RCeVBhdGgoKHBhcmVudFBhdGguZXF1YWxzKCIvIikgPyAiIiA6IHBhcmVudFBhdGgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICsgZm9sZGVyQ2hpbGQuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBpZFByb3AgPSBkb2NCeVBhdGguZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaWRQcm9wKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhvYmplY3RJZCwgaWRQcm9wLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdFBhcmVudERhdGE+IHBhcmVudHMgPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRPYmplY3RQYXJlbnRzKAotICAgICAgICAgICAgICAgICAgICBnZXRUZXN0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCBudWxsLCBCb29sZWFuLlRSVUUsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgsIG51bGwsIEJvb2xlYW4uVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmVudHMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBhcmVudHMuc2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmplY3RJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQgd2l0aCB0aGUgZGVmYXVsdCB0eXBlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlRGVmYXVsdERvY3VtZW50KFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBjb250ZW50VHlwZSwgYnl0ZVtdIGNvbnRlbnQpIHsKLSAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZzID0gKGlzVmVyc2lvbmFibGUoZ2V0RGVmYXVsdERvY3VtZW50VHlwZSgpKSA/IFZlcnNpb25pbmdTdGF0ZS5NQUpPUiA6IFZlcnNpb25pbmdTdGF0ZS5OT05FKTsKLQotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcExpc3QuYWRkKGdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wTGlzdC5hZGQoZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBnZXREZWZhdWx0RG9jdW1lbnRUeXBlKCkpKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBnZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcExpc3QpOwotCi0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGNyZWF0ZUNvbnRlbnRTdHJlYW1EYXRhKGNvbnRlbnRUeXBlLCBjb250ZW50KTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlRG9jdW1lbnQocHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZzLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQgZnJvbSBzb3VyY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoU3RyaW5nIHNvdXJjZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKGdldFRlc3RSZXBvc2l0b3J5SWQoKSwgc291cmNlSWQsCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcywgZm9sZGVySWQsIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsIGFkZEFDRXMsIHJlbW92ZUFDRXMsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdElkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShleGlzdHNPYmplY3Qob2JqZWN0SWQpKTsKLQotICAgICAgICBpZiAoZm9sZGVySWQgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhIGZvbGRlckNoaWxkID0gZ2V0Q2hpbGQoZm9sZGVySWQsIG9iamVjdElkKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgbmFtZQotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IG5hbWVQcm9wID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICAgICAgaWYgKG5hbWVQcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRQcm9wZXJ0eVZhbHVlKGZvbGRlckNoaWxkLmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKSwgUHJvcGVydHlJZHMuTkFNRSwgUHJvcGVydHlTdHJpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lUHJvcC5nZXRWYWx1ZXMoKS5nZXQoMCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBwYXJlbnQKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcGFyZW50cyA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldE9iamVjdFBhcmVudHMoCi0gICAgICAgICAgICAgICAgICAgIGdldFRlc3RSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWQsIG51bGwsIEJvb2xlYW4uVFJVRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCwgbnVsbCwgQm9vbGVhbi5UUlVFLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50cyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFyZW50cy5zaXplKCkpOwotCi0gICAgICAgICAgICBPYmplY3RQYXJlbnREYXRhIHBhcmVudCA9IHBhcmVudHMuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQuZ2V0UmVsYXRpdmVQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyZW50LmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnQuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZm9sZGVySWQsIHBhcmVudC5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdElkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYW4gb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZShTdHJpbmcgb2JqZWN0SWQsIGJvb2xlYW4gYWxsVmVyc2lvbnMpIHsKLSAgICAgICAgZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKS5kZWxldGVPYmplY3QoZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwgYWxsVmVyc2lvbnMsIG51bGwpOwotICAgICAgICBhc3NlcnRGYWxzZShleGlzdHNPYmplY3Qob2JqZWN0SWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGEgdHJlZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVUcmVlKFN0cmluZyBmb2xkZXJJZCkgewotICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLmRlbGV0ZVRyZWUoZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBmb2xkZXJJZCwgQm9vbGVhbi5UUlVFLCBVbmZpbGVPYmplY3QuREVMRVRFLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGV4aXN0c09iamVjdChmb2xkZXJJZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBjb250ZW50IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udGVudFN0cmVhbSBnZXRDb250ZW50KFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHN0cmVhbUlkKSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuZ2V0Q29udGVudFN0cmVhbShnZXRUZXN0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLAotICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50U3RyZWFtKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpOwotCi0gICAgICAgIHJldHVybiBjb250ZW50U3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBjb250ZW50IGZyb20gYSBjb250ZW50IHN0cmVhbSBpbnRvIGEgYnl0ZSBhcnJheS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIHJlYWRDb250ZW50KENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudFN0cmVhbSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgSU9VdGlscy5jb3B5KHN0cmVhbSwgYmFvcyk7Ci0KLSAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGdldEJpbmRpbmcoKS5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmdldFR5cGVEZWZpbml0aW9uKGdldFRlc3RSZXBvc2l0b3J5SWQoKSwgdHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmLmdldElkKCkpOwotCi0gICAgICAgIHJldHVybiB0eXBlRGVmOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHR5cGUgaXMgdmVyc2lvbmFibGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWZXJzaW9uYWJsZShTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IGdldFR5cGVEZWZpbml0aW9uKHR5cGVOYW1lKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHR5cGUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGVEZWZpbml0aW9uKTsKLQotICAgICAgICBCb29sZWFuIGlzVmVyc2lvbmFibGUgPSAoKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGUpLmlzVmVyc2lvbmFibGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpc1ZlcnNpb25hYmxlKTsKLQotICAgICAgICByZXR1cm4gaXNWZXJzaW9uYWJsZTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIGFzc2VydHMgLS0tLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RXF1YWxzKFR5cGVEZWZpbml0aW9uIGV4cGVjdGVkLCBUeXBlRGVmaW5pdGlvbiBhY3R1YWwsIGJvb2xlYW4gY2hlY2tQcm9wZXJ0eURlZmludGlvbnMpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCB0eXBlIGRlZmluaXRpb24gaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiQWN0dWFsIHR5cGUgZGVmaW5pdGlvbiBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUeXBlRGVmaW5pdGlvbiBpZDoiLCBleHBlY3RlZC5nZXRJZCgpLCBhY3R1YWwuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHlwZURlZmluaXRpb24gbG9jYWwgbmFtZToiLCBleHBlY3RlZC5nZXRMb2NhbE5hbWUoKSwgYWN0dWFsLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUeXBlRGVmaW5pdGlvbiBsb2NhbCBuYW1lc3BhY2U6IiwgZXhwZWN0ZWQuZ2V0TG9jYWxOYW1lc3BhY2UoKSwgYWN0dWFsLmdldExvY2FsTmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGVEZWZpbml0aW9uIGRpc3BsYXkgbmFtZToiLCBleHBlY3RlZC5nZXREaXNwbGF5TmFtZSgpLCBhY3R1YWwuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHlwZURlZmluaXRpb24gZGVzY3JpcHRpb246IiwgZXhwZWN0ZWQuZ2V0RGVzY3JpcHRpb24oKSwgYWN0dWFsLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGVEZWZpbml0aW9uIHF1ZXJ5IG5hbWU6IiwgZXhwZWN0ZWQuZ2V0UXVlcnlOYW1lKCksIGFjdHVhbC5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVHlwZURlZmluaXRpb24gcGFyZW50IGlkOiIsIGV4cGVjdGVkLmdldFBhcmVudFR5cGVJZCgpLCBhY3R1YWwuZ2V0UGFyZW50VHlwZUlkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGVEZWZpbml0aW9uIGJhc2UgaWQ6IiwgZXhwZWN0ZWQuZ2V0QmFzZVR5cGVJZCgpLCBhY3R1YWwuZ2V0QmFzZVR5cGVJZCgpKTsKLQotICAgICAgICBpZiAoIWNoZWNrUHJvcGVydHlEZWZpbnRpb25zKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpID09IG51bGwgJiYgYWN0dWFsLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHByb3BlcnR5IGRlZmluaXRpb24gbGlzdCBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiQWN0dWFsIHByb3BlcnR5IGRlZmluaXRpb24gbGlzdCBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCksIGFjdHVhbC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuc2l6ZSgpKTsKLQotICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBleHBlY3RlZFByb3BEZWYgOiBleHBlY3RlZC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBhY3R1YWxQcm9wRGVmID0gYWN0dWFsLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoZXhwZWN0ZWRQcm9wRGVmLmdldElkKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRQcm9wRGVmLCBhY3R1YWxQcm9wRGVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFscyhQcm9wZXJ0eURlZmluaXRpb248Pz4gZXhwZWN0ZWQsIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkFjdHVhbCBwcm9wZXJ0eSBkZWZpbml0aW9uIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4cGVjdGVkLmdldElkKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFjdHVhbC5nZXRJZCgpKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBleHBlY3RlZC5nZXRJZCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiUHJvcGVydHlEZWZpbml0aW9uICIgKyBpZCArICIgaWQ6IiwgZXhwZWN0ZWQuZ2V0SWQoKSwgYWN0dWFsLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3BlcnR5RGVmaW5pdGlvbiAiICsgaWQgKyAiIGxvY2FsIG5hbWU6IiwgZXhwZWN0ZWQuZ2V0TG9jYWxOYW1lKCksIGFjdHVhbC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvcGVydHlEZWZpbml0aW9uICIgKyBpZCArICIgbG9jYWwgbmFtZXNwYWNlOiIsIGV4cGVjdGVkLmdldExvY2FsTmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgYWN0dWFsLmdldExvY2FsTmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3BlcnR5RGVmaW5pdGlvbiAiICsgaWQgKyAiIHF1ZXJ5IG5hbWU6IiwgZXhwZWN0ZWQuZ2V0UXVlcnlOYW1lKCksIGFjdHVhbC5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvcGVydHlEZWZpbml0aW9uICIgKyBpZCArICIgZGlzcGxheSBuYW1lOiIsIGV4cGVjdGVkLmdldERpc3BsYXlOYW1lKCksIGFjdHVhbC5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9wZXJ0eURlZmluaXRpb24gIiArIGlkICsgIiBkZXNjcmlwdGlvbjoiLCBleHBlY3RlZC5nZXREZXNjcmlwdGlvbigpLCBhY3R1YWwuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvcGVydHlEZWZpbml0aW9uICIgKyBpZCArICIgcHJvcGVydHkgdHlwZToiLCBleHBlY3RlZC5nZXRQcm9wZXJ0eVR5cGUoKSwKLSAgICAgICAgICAgICAgICBhY3R1YWwuZ2V0UHJvcGVydHlUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3BlcnR5RGVmaW5pdGlvbiAiICsgaWQgKyAiIGNhcmRpbmFsaXR5OiIsIGV4cGVjdGVkLmdldENhcmRpbmFsaXR5KCksIGFjdHVhbC5nZXRDYXJkaW5hbGl0eSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9wZXJ0eURlZmluaXRpb24gIiArIGlkICsgIiB1cGRhdGFiaWxpdHk6IiwgZXhwZWN0ZWQuZ2V0VXBkYXRhYmlsaXR5KCksCi0gICAgICAgICAgICAgICAgYWN0dWFsLmdldFVwZGF0YWJpbGl0eSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoUHJvcGVydGllcyBleHBlY3RlZCwgUHJvcGVydGllcyBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBwcm9wZXJ0aWVzIGRhdGEgaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiQWN0dWFsIHByb3BlcnRpZXMgZGF0YSBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkLmdldFByb3BlcnRpZXMoKSA9PSBudWxsICYmIGFjdHVhbC5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkLmdldFByb3BlcnRpZXMoKSA9PSBudWxsIHx8IGFjdHVhbC5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiUHJvcGVydGllcyBhcmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZC5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgcHJvcGVydGllcyBhcmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwuZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkFjdHVhbCBwcm9wZXJ0aWVzIGFyZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFByb3BlcnRpZXMoKS5zaXplKCksIGFjdHVhbC5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGV4cGVjdGVkLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKSkgewotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IGV4cGVjdGVkUHJvcGVydHkgPSBleHBlY3RlZC5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGlkKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXhwZWN0ZWRQcm9wZXJ0eSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIGV4cGVjdGVkUHJvcGVydHkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBhY3R1YWxQcm9wZXJ0eSA9IGFjdHVhbC5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGlkKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWN0dWFsUHJvcGVydHkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkLCBhY3R1YWxQcm9wZXJ0eS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvcGVydHksIGFjdHVhbFByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFscyhQcm9wZXJ0eURhdGE8Pz4gZXhwZWN0ZWQsIFByb3BlcnR5RGF0YTw/PiBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJQcm9wZXJ0aWVzIGRhdGEgaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBpZCA9IGV4cGVjdGVkLmdldElkKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9wZXJ0eURhdGEgIiArIGlkICsgIiBpZDoiLCBleHBlY3RlZC5nZXRJZCgpLCBhY3R1YWwuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvcGVydHlEYXRhICIgKyBpZCArICIgZGlzcGxheSBuYW1lOiIsIGV4cGVjdGVkLmdldERpc3BsYXlOYW1lKCksIGFjdHVhbC5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9wZXJ0eURhdGEgIiArIGlkICsgIiBsb2NhbCBuYW1lOiIsIGV4cGVjdGVkLmdldExvY2FsTmFtZSgpLCBhY3R1YWwuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3BlcnR5RGF0YSAiICsgaWQgKyAiIHF1ZXJ5IG5hbWU6IiwgZXhwZWN0ZWQuZ2V0UXVlcnlOYW1lKCksIGFjdHVhbC5nZXRRdWVyeU5hbWUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9wZXJ0eURhdGEgIiArIGlkICsgIiB2YWx1ZXM6IiwgZXhwZWN0ZWQuZ2V0VmFsdWVzKCkuc2l6ZSgpLCBhY3R1YWwuZ2V0VmFsdWVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmdldFZhbHVlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3BlcnR5RGF0YSAiICsgaWQgKyAiIHZhbHVlWyIgKyBpICsgIl06IiwgZXhwZWN0ZWQuZ2V0VmFsdWVzKCkuZ2V0KGkpLCBhY3R1YWwuZ2V0VmFsdWVzKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRCYXNpY1Byb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJvcGVydGllcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgIGFzc2VydFByb3BlcnR5KHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIFByb3BlcnR5SWQuY2xhc3MpOwotICAgICAgICBhc3NlcnRQcm9wZXJ0eShwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHkocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRCksIFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRCwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHkocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpLCBQcm9wZXJ0eUlkcy5OQU1FLCBQcm9wZXJ0eVN0cmluZy5jbGFzcyk7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5KHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZKSwgUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVN0cmluZy5jbGFzcyk7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5KHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFKSwgUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURhdGVUaW1lLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHkocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlkpLCBQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUVEX0JZLAotICAgICAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHkocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUpLAotICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUsIFByb3BlcnR5RGF0ZVRpbWUuY2xhc3MpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFByb3BlcnR5KFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSwgU3RyaW5nIGlkLCBDbGFzczw/PiBjbGF6eikgewotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BlcnR5KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm9wZXJ0eURhdGEgIiArIGlkICsgIiBpZDoiLCBpZCwgcHJvcGVydHkuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2xhenouaXNBc3NpZ25hYmxlRnJvbShwcm9wZXJ0eS5nZXRDbGFzcygpKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJvcGVydHkuZ2V0VmFsdWVzKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwcm9wZXJ0eS5nZXRWYWx1ZXMoKS5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFByb3BlcnR5VmFsdWUoUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5LCBTdHJpbmcgaWQsIENsYXNzPD8+IGNsYXp6LCBPYmplY3QuLi4gdmFsdWVzKSB7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5KHByb3BlcnR5LCBpZCwgY2xhenopOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiUHJvcGVydHkgIiArIGlkICsgIiB2YWx1ZXM6IiwgdmFsdWVzLmxlbmd0aCwgcHJvcGVydHkuZ2V0VmFsdWVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcHJvcGVydHkuZ2V0VmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiUHJvcGVydHkgIiArIGlkICsgIiB2YWx1ZVsiICsgaSArICJdOiIsIHZhbHVlc1tpXSwgdmFsdWUpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJvcGVydHlWYWx1ZShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBpZCwgQ2xhc3M8Pz4gY2xhenosIE9iamVjdC4uLiB2YWx1ZXMpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wZXJ0aWVzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGlkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eSk7Ci0KLSAgICAgICAgYXNzZXJ0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgaWQsIGNsYXp6LCB2YWx1ZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFscyhBbGxvd2FibGVBY3Rpb25zIGV4cGVjdGVkLCBBbGxvd2FibGVBY3Rpb25zIGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGFsbG93YWJsZSBhY3Rpb24gZGF0YSBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJBY3R1YWwgYWxsb3dhYmxlIGFjdGlvbiBkYXRhIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4cGVjdGVkLmdldEFsbG93YWJsZUFjdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWN0dWFsLmdldEFsbG93YWJsZUFjdGlvbnMoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGxvd2FibGUgYWN0aW9uIHNpemU6IiwgZXhwZWN0ZWQuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLnNpemUoKSwgYWN0dWFsLmdldEFsbG93YWJsZUFjdGlvbnMoKQotICAgICAgICAgICAgICAgIC5zaXplKCkpOwotCi0gICAgICAgIGZvciAoQWN0aW9uIGFjdGlvbiA6IGV4cGVjdGVkLmdldEFsbG93YWJsZUFjdGlvbnMoKSkgewotICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZEJvb2xlYW4gPSBleHBlY3RlZC5nZXRBbGxvd2FibGVBY3Rpb25zKCkuY29udGFpbnMoYWN0aW9uKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0dWFsQm9vbGVhbiA9IGFjdHVhbC5nZXRBbGxvd2FibGVBY3Rpb25zKCkuY29udGFpbnMoYWN0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbGxvd2FibGVBY3Rpb24gIiArIGFjdGlvbiArICI6IiwgZXhwZWN0ZWRCb29sZWFuLCBhY3R1YWxCb29sZWFuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFsbG93YWJsZUFjdGlvbihBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMsIEFjdGlvbiBhY3Rpb24sIGJvb2xlYW4gZXhwZWN0ZWQpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhbGxvd2FibGVBY3Rpb25zLmdldEFsbG93YWJsZUFjdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWN0aW9uKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkFsbG93YWJsZSBhY3Rpb24gXCIiICsgYWN0aW9uICsgIlwiOiIsIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgIGFsbG93YWJsZUFjdGlvbnMuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmNvbnRhaW5zKGFjdGlvbikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFscyhBY2wgZXhwZWN0ZWQsIEFjbCBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBBQ0wgZGF0YSBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJBY3R1YWwgQUNMIGRhdGEgaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZC5nZXRBY2VzKCkgPT0gbnVsbCAmJiBhY3R1YWwuZ2V0QWNlcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZC5nZXRBY2VzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgQUNFIGRhdGEgaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwuZ2V0QWNlcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkFjdHVhbCBBQ0UgZGF0YSBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmlzRXhhY3QoKSwgYWN0dWFsLmlzRXhhY3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRBY2VzKCkuc2l6ZSgpLCBhY3R1YWwuZ2V0QWNlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5nZXRBY2VzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRBY2VzKCkuZ2V0KGkpLCBhY3R1YWwuZ2V0QWNlcygpLmdldChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoQWNlIGV4cGVjdGVkLCBBY2UgYWN0dWFsKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgQUNFIGRhdGEgaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiQWN0dWFsIEFDRSBkYXRhIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4cGVjdGVkLmdldFByaW5jaXBhbCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHBlY3RlZC5nZXRQcmluY2lwYWwoKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhY3R1YWwuZ2V0UHJpbmNpcGFsKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFjdHVhbC5nZXRQcmluY2lwYWwoKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQ0UgUHJpbmNpcGFsOiIsIGV4cGVjdGVkLmdldFByaW5jaXBhbCgpLmdldElkKCksIGFjdHVhbC5nZXRQcmluY2lwYWwoKS5nZXRJZCgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbExpc3RzKGV4cGVjdGVkLmdldFBlcm1pc3Npb25zKCksIGFjdHVhbC5nZXRQZXJtaXNzaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoUmVuZGl0aW9uRGF0YSBleHBlY3RlZCwgUmVuZGl0aW9uRGF0YSBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCByZW5kaXRpb24gaXMgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiQWN0dWFsIHJlbmRpdGlvbiBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZW5kaXRpb24ga2luZDoiLCBleHBlY3RlZC5nZXRLaW5kKCksIGFjdHVhbC5nZXRLaW5kKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJlbmRpdGlvbiBNSU1FIHR5cGU6IiwgZXhwZWN0ZWQuZ2V0TWltZVR5cGUoKSwgYWN0dWFsLmdldE1pbWVUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJlbmRpdGlvbiBsZW5ndGg6IiwgZXhwZWN0ZWQuZ2V0QmlnTGVuZ3RoKCksIGFjdHVhbC5nZXRCaWdMZW5ndGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmVuZGl0aW9uIHN0cmVhbSBpZDoiLCBleHBlY3RlZC5nZXRTdHJlYW1JZCgpLCBhY3R1YWwuZ2V0U3RyZWFtSWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmVuZGl0aW9uIHRpdGxlOiIsIGV4cGVjdGVkLmdldFRpdGxlKCksIGFjdHVhbC5nZXRUaXRsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZW5kaXRpb24gaGVpZ2h0OiIsIGV4cGVjdGVkLmdldEJpZ0hlaWdodCgpLCBhY3R1YWwuZ2V0QmlnSGVpZ2h0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJlbmRpdGlvbiB3aWR0aDoiLCBleHBlY3RlZC5nZXRCaWdXaWR0aCgpLCBhY3R1YWwuZ2V0QmlnV2lkdGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmVuZGl0aW9uIGRvY3VtZW50IGlkOiIsIGV4cGVjdGVkLmdldFJlbmRpdGlvbkRvY3VtZW50SWQoKSwgYWN0dWFsLmdldFJlbmRpdGlvbkRvY3VtZW50SWQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29udGVudChieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHBlY3RlZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWN0dWFsKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnRlbnQgc2l6ZToiLCBleHBlY3RlZC5sZW5ndGgsIGFjdHVhbC5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29udGVudCBub3QgZXF1YWwuIiwgZXhwZWN0ZWRbaV0sIGFjdHVhbFtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRNaW1lVHlwZShTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBhY3R1YWwpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleHBlY3RlZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWN0dWFsKTsKLQotICAgICAgICBpbnQgcGFyYW1JZHggPSBhY3R1YWwuaW5kZXhPZignOycpOwotICAgICAgICBpZiAocGFyYW1JZHggIT0gLTEpIHsKLSAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5zdWJzdHJpbmcoMCwgcGFyYW1JZHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFsTGlzdHMoTGlzdDw/PiBleHBlY3RlZCwgTGlzdDw/PiBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBsaXN0IGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwoIkFjdHVhbCBsaXN0IGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkxpc3Qgc2l6ZToiLCBleHBlY3RlZC5zaXplKCksIGFjdHVhbC5zaXplKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiTGlzdCBlbGVtZW50ICIgKyBpICsgIjoiLCBleHBlY3RlZC5nZXQoaSksIGFjdHVhbC5nZXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ZyYW1ld29yay9BYnN0cmFjdFNpbXBsZVJlYWRPbmx5VGVzdHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9mcmFtZXdvcmsvQWJzdHJhY3RTaW1wbGVSZWFkT25seVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzYxOTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ZyYW1ld29yay9BYnN0cmFjdFNpbXBsZVJlYWRPbmx5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmZyYW1ld29yazsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRm9sZGVyVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qb2xpY3lUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLQotLyoqCi0gKiBTaW1wbGUgcmVhZC1vbmx5IHRlc3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTaW1wbGVSZWFkT25seVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RDbWlzVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVBPU0lUT1JZX0lORk8gPSAicmVwb3NpdG9yeUluZm8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVFlQRVMgPSAidHlwZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ09OVEVOVF9TVFJFQU0gPSAiY29udGVudFN0cmVhbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OQVZJR0FUSU9OID0gIm5hdmlnYXRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUVVFUlkgPSAicXVlcnkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0hFQ0tFRE9VVCA9ICJjaGVja2Vkb3V0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NPTlRFTlRfQ0hBTkdFUyA9ICJjb250ZW50Q2hhbmdlcyI7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyByZXBvc2l0b3J5IGluZm8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlJbmZvKCkgewotICAgICAgICBpZiAoIWlzRW5hYmxlZChURVNUX1JFUE9TSVRPUllfSU5GTykpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcEluZm8gPSBnZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIFRvb2xzLnByaW50KHJlcEluZm8pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVwSW5mby5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBJbmZvLmdldENtaXNWZXJzaW9uU3VwcG9ydGVkKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcEluZm8uZ2V0Um9vdEZvbGRlcklkKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcEluZm8uZ2V0Q2FwYWJpbGl0aWVzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNvbWUgdHlwZSByZWxhdGVkIHRlc3RzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlcygpIHsKLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoVEVTVF9UWVBFUykpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXBJZCA9IGdldFRlc3RSZXBvc2l0b3J5SWQoKTsKLQotICAgICAgICAvLyBnZXQgc3RhbmRhcmQgdHlwZQotICAgICAgICBUeXBlRGVmaW5pdGlvbiBkb2NUeXBlID0gZ2V0VHlwZURlZmluaXRpb24oImNtaXM6ZG9jdW1lbnQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkb2NUeXBlIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY21pczpkb2N1bWVudCIsIGRvY1R5cGUuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQsIGRvY1R5cGUuZ2V0QmFzZVR5cGVJZCgpKTsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbiBmb2xkZXJUeXBlID0gZ2V0VHlwZURlZmluaXRpb24oImNtaXM6Zm9sZGVyIik7Ci0gICAgICAgIGFzc2VydFRydWUoZm9sZGVyVHlwZSBpbnN0YW5jZW9mIEZvbGRlclR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbWlzOmZvbGRlciIsIGZvbGRlclR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCYXNlVHlwZUlkLkNNSVNfRk9MREVSLCBmb2xkZXJUeXBlLmdldEJhc2VUeXBlSWQoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHJlbGF0aW9uc2hpcFR5cGUgPSBnZXRUeXBlRGVmaW5pdGlvbigiY21pczpyZWxhdGlvbnNoaXAiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocmVsYXRpb25zaGlwVHlwZSBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiY21pczpyZWxhdGlvbnNoaXAiLCByZWxhdGlvbnNoaXBUeXBlLmdldElkKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVAsIHJlbGF0aW9uc2hpcFR5cGUuZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIlJlbGF0aW9uc2hpcHMgdHlwZTogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHBvbGljeVR5cGUgPSBnZXRUeXBlRGVmaW5pdGlvbigiY21pczpwb2xpY3kiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocG9saWN5VHlwZSBpbnN0YW5jZW9mIFBvbGljeVR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiY21pczpwb2xpY3kiLCBwb2xpY3lUeXBlLmdldElkKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJhc2VUeXBlSWQuQ01JU19QT0xJQ1ksIHBvbGljeVR5cGUuZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIlBvbGljeSB0eXBlOiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXRUeXBlQ2hpbGRyZW4KLSAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IHR5cGVzID0gZ2V0QmluZGluZygpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0VHlwZUNoaWxkcmVuKHJlcElkLCBudWxsLCBCb29sZWFuLlRSVUUsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodHlwZXMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVzLmhhc01vcmVJdGVtcygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlcy5nZXRMaXN0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZSh0eXBlcy5nZXRMaXN0KCkuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0eXBlcy5nZXRMaXN0KCkuc2l6ZSgpID49IDIpOwotICAgICAgICBhc3NlcnRUcnVlKHR5cGVzLmdldExpc3QoKS5zaXplKCkgPD0gNCk7Ci0KLSAgICAgICAgZ2V0QmluZGluZygpLmNsZWFyQWxsQ2FjaGVzKCk7Ci0KLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0eXBlIDogdHlwZXMuZ2V0TGlzdCgpKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlMiA9IGdldFR5cGVEZWZpbml0aW9uKHR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModHlwZSwgdHlwZTIsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0VHlwZURlc2NlbmRhbnRzCi0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHR5cGVzQ29udGFpbmVycyA9IGdldEJpbmRpbmcoKS5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmdldFR5cGVEZXNjZW5kYW50cyhyZXBJZCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBCb29sZWFuLlRSVUUsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVzQ29udGFpbmVycyk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHR5cGVzQ29udGFpbmVycy5pc0VtcHR5KCkpOwotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZUNvbnRhaW5lciA6IHR5cGVzQ29udGFpbmVycykgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlQ29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlQ29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlMiA9IGdldFR5cGVEZWZpbml0aW9uKHR5cGVDb250YWluZXIuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0eXBlQ29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCksIHR5cGUyLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRvb2xzLnByaW50VHlwZXMoIlR5cGUgRGVzY2VuZGFudHMiLCB0eXBlc0NvbnRhaW5lcnMpOwotCi0gICAgICAgIGdldEJpbmRpbmcoKS5jbGVhckFsbENhY2hlcygpOwotCi0gICAgICAgIGFzc2VydFR5cGVDb250YWluZXJzKHJlcElkLCB0eXBlc0NvbnRhaW5lcnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUeXBlQ29udGFpbmVycyhTdHJpbmcgcmVwSWQsIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHR5cGVzQ29udGFpbmVycykgewotICAgICAgICBpZiAodHlwZXNDb250YWluZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgY29udGFpbmVyIDogdHlwZXNDb250YWluZXJzKSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IGNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZTIgPSBnZXRUeXBlRGVmaW5pdGlvbih0eXBlLmdldElkKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHModHlwZSwgdHlwZTIsIHRydWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUeXBlQ29udGFpbmVycyhyZXBJZCwgY29udGFpbmVyLmdldENoaWxkcmVuKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTmF2aWdhdGlvbiBzbW9rZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROYXZpZ2F0aW9uKCkgewotICAgICAgICBpZiAoIWlzRW5hYmxlZChURVNUX05BVklHQVRJT04pKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVwSWQgPSBnZXRUZXN0UmVwb3NpdG9yeUlkKCk7Ci0gICAgICAgIFN0cmluZyByb290Rm9sZGVyID0gZ2V0Um9vdEZvbGRlcklkKCk7Ci0gICAgICAgIFN0cmluZyB0ZXN0Um9vdEZvbGRlciA9IGdldFRlc3RSb290Rm9sZGVyKCk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSByb290Rm9sZGVyT2JqZWN0ID0gZ2V0T2JqZWN0KHJvb3RGb2xkZXIpOwotICAgICAgICBTdHJpbmcgcm9vdFBhdGggPSBnZXRQYXRoKHJvb3RGb2xkZXJPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlJvb3QgcGF0aCBpcyBub3QgXCIvXCIhIiwgIi8iLCByb290UGF0aCk7Ci0gICAgICAgIGFzc2VydEFsbG93YWJsZUFjdGlvbihyb290Rm9sZGVyT2JqZWN0LmdldEFsbG93YWJsZUFjdGlvbnMoKSwgQWN0aW9uLkNBTl9HRVRfT0JKRUNUX1BBUkVOVFMsIGZhbHNlKTsKLQotICAgICAgICBPYmplY3REYXRhIGZvbGRlck9iamVjdCA9IGdldE9iamVjdCh0ZXN0Um9vdEZvbGRlcik7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UGF0aChmb2xkZXJPYmplY3QpOwotCi0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCBjaGlsZHJlbiA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldENoaWxkcmVuKHJlcElkLCB0ZXN0Um9vdEZvbGRlciwgIioiLCBudWxsLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCwgbnVsbCwgQm9vbGVhbi5UUlVFLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2hpbGRyZW4uaGFzTW9yZUl0ZW1zKCkpOwotCi0gICAgICAgIGlmIChzdXBwb3J0c0Rlc2NlbmRhbnRzKCkpIHsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGRlc2MgPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXREZXNjZW5kYW50cyhyZXBJZCwKLSAgICAgICAgICAgICAgICAgICAgdGVzdFJvb3RGb2xkZXIsIEJpZ0ludGVnZXIudmFsdWVPZigyKSwgIioiLCBCb29sZWFuLlRSVUUsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGRlc2MpOwotICAgICAgICAgICAgVG9vbHMucHJpbnQoIkRlc2NlbmRhbnRzIiwgZGVzYyk7Ci0KLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5lcihkZXNjLCA1KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkRlc2NlbmRhbnRzIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VwcG9ydHNGb2xkZXJUcmVlKCkpIHsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IHRyZWUgPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRGb2xkZXJUcmVlKHJlcElkLAotICAgICAgICAgICAgICAgICAgICB0ZXN0Um9vdEZvbGRlciwgQmlnSW50ZWdlci52YWx1ZU9mKDIpLCAiKiIsIEJvb2xlYW4uVFJVRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodHJlZSk7Ci0gICAgICAgICAgICBUb29scy5wcmludCgiVHJlZSIsIHRyZWUpOwotCi0gICAgICAgICAgICBhc3NlcnRDb250YWluZXIodHJlZSwgNSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJGb2xkZXIgVHJlZSBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgb2JqZWN0IDogY2hpbGRyZW4uZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRPYmplY3QoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRPYmplY3QoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0LmdldE9iamVjdCgpLmdldEJhc2VUeXBlSWQoKSk7Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0MiA9IGdldE9iamVjdChvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdDIuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob2JqZWN0LmdldE9iamVjdCgpLmdldElkKCksIG9iamVjdDIuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob2JqZWN0LmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKSwgb2JqZWN0Mi5nZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdDMgPSBnZXRPYmplY3RCeVBhdGgoKHBhdGguZXF1YWxzKCIvIikgPyAiLyIgOiBwYXRoICsgIi8iKSArIG9iamVjdC5nZXRQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0Myk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdDMuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob2JqZWN0LmdldE9iamVjdCgpLmdldElkKCksIG9iamVjdDMuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob2JqZWN0LmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKSwgb2JqZWN0My5nZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgICAgICBjaGVja09iamVjdChvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19GT0xERVIpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgY2hpbGRyZW4yID0gZ2V0QmluZGluZygpLmdldE5hdmlnYXRpb25TZXJ2aWNlKCkuZ2V0Q2hpbGRyZW4ocmVwSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0SWQoKSwgbnVsbCwgbnVsbCwgQm9vbGVhbi5UUlVFLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5CT1RILCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNoaWxkcmVuMik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5nZXRPYmplY3QoKS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tPYmplY3RWZXJzaW9ucyhvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q29udGFpbmVyKExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGNvbnRhaW5lcnMsIGludCBtYXhEZXB0aCkgewotICAgICAgICBpZiAoY29udGFpbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWF4RGVwdGggPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIGNvbnRhaW5lciA6IGNvbnRhaW5lcnMpIHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29udGFpbmVyKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29udGFpbmVyLmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29udGFpbmVyLmdldE9iamVjdCgpLmdldE9iamVjdCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29udGFpbmVyLmdldE9iamVjdCgpLmdldE9iamVjdCgpLmdldElkKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250YWluZXIuZ2V0T2JqZWN0KCkuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0T2JqZWN0KGNvbnRhaW5lci5nZXRPYmplY3QoKS5nZXRPYmplY3QoKS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhaW5lci5nZXRPYmplY3QoKS5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCksIG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhaW5lci5nZXRPYmplY3QoKS5nZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCksIG9iamVjdC5nZXRBbGxvd2FibGVBY3Rpb25zKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRDb250YWluZXIoY29udGFpbmVyLmdldENoaWxkcmVuKCksIG1heERlcHRoIC0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb250ZW50IHN0cmVhbSBzbW9rZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNFbmFibGVkKFRFU1RfQ09OVEVOVF9TVFJFQU0pKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmVwSWQgPSBnZXRUZXN0UmVwb3NpdG9yeUlkKCk7Ci0gICAgICAgIFN0cmluZyByb290Rm9sZGVyID0gZ2V0VGVzdFJvb3RGb2xkZXIoKTsKLQotICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgY2hpbGRyZW4gPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRDaGlsZHJlbihyZXBJZCwgcm9vdEZvbGRlciwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBCb29sZWFuLkZBTFNFLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5CT1RILCBudWxsLCBCb29sZWFuLkZBTFNFLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGlsZHJlbik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2hpbGRyZW4uZ2V0T2JqZWN0cygpKTsKLQotICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBvYmplY3QgOiBjaGlsZHJlbi5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0LmdldE9iamVjdCgpLmdldElkKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0QmFzZVR5cGVJZCgpKTsKLQotICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRPYmplY3QoKS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gZ2V0Q29udGVudChvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0SWQoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgcmVhZENvbnRlbnQoY29udGVudFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmYWlsKCJObyBkb2N1bWVudCBpbiB0ZXN0IGZvbGRlciEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyeSBzbW9rZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeSgpIHsKLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoVEVTVF9RVUVSWSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdXBwb3J0c1F1ZXJ5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXBJZCA9IGdldFRlc3RSZXBvc2l0b3J5SWQoKTsKLQotICAgICAgICAgICAgT2JqZWN0TGlzdCBycyA9IGdldEJpbmRpbmcoKS5nZXREaXNjb3ZlcnlTZXJ2aWNlKCkucXVlcnkocmVwSWQsICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQiLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocnMpOwotCi0gICAgICAgICAgICBpZiAocnMuZ2V0T2JqZWN0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0IDogcnMuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJRdWVyeSBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tlZCBvdXQgc21va2UgdGVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tlZG91dCgpIHsKLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoVEVTVF9DSEVDS0VET1VUKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlcElkID0gZ2V0VGVzdFJlcG9zaXRvcnlJZCgpOwotCi0gICAgICAgIE9iamVjdExpc3QgY28gPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRDaGVja2VkT3V0RG9jcyhyZXBJZCwgZ2V0VGVzdFJvb3RGb2xkZXIoKSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgsIG51bGwsIEJpZ0ludGVnZXIudmFsdWVPZigxMDApLCBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjbyk7Ci0KLSAgICAgICAgaWYgKGNvLmdldE9iamVjdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvLmdldE9iamVjdHMoKS5zaXplKCkgPD0gMTAwKTsKLQotICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IGNvLmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0KTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULCBvYmplY3QuZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRlbnQgY2hhbmdlcyBzbW9rZSB0ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50Q2hhbmdlcygpIHsKLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoVEVTVF9DT05URU5UX0NIQU5HRVMpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VwcG9ydHNDb250ZW50Q2hhbmdlcygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVwSWQgPSBnZXRUZXN0UmVwb3NpdG9yeUlkKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdExpc3QgY2MgPSBnZXRCaW5kaW5nKCkuZ2V0RGlzY292ZXJ5U2VydmljZSgpLmdldENvbnRlbnRDaGFuZ2VzKHJlcElkLCBudWxsLCBCb29sZWFuLlRSVUUsICIqIiwKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFLCBCb29sZWFuLlRSVUUsIEJpZ0ludGVnZXIudmFsdWVPZigxMDApLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY2MpOwotCi0gICAgICAgICAgICBpZiAoY2MuZ2V0T2JqZWN0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNjLmdldE9iamVjdHMoKS5zaXplKCkgPD0gMTAwKTsKLQotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3QgOiBjYy5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmplY3QuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRDaGFuZ2VFdmVudEluZm8oKS5nZXRDaGFuZ2VUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRDaGFuZ2VFdmVudEluZm8oKS5nZXRDaGFuZ2VUaW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIkNvbnRlbnQgY2hhbmdlcyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgc29tZSBvZiB0aGUgcmVhZC1vbmx5IG1ldGhvZHMgb2YgdGhlIE9iamVjdCBTZXJ2aWNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja09iamVjdChTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGVja2luZyBvYmplY3QgIiArIG9iamVjdElkICsgIi4uLiIpOwotCi0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0T2JqZWN0KG9iamVjdElkKTsKLQotICAgICAgICAvLyBjaGVjayBwcm9wZXJ0aWVzCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuZ2V0UHJvcGVydGllcyhnZXRUZXN0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCAiKiIsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9iamVjdC5nZXRQcm9wZXJ0aWVzKCksIHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIGNoZWNrIGFsbG93YWJsZSBhY3Rpb25zCi0gICAgICAgIEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9ucyA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucyhnZXRUZXN0UmVwb3NpdG9yeUlkKCksCi0gICAgICAgICAgICAgICAgb2JqZWN0SWQsIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvYmplY3QuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLCBhbGxvd2FibGVBY3Rpb25zKTsKLQotICAgICAgICAvLyBjaGVjayBBQ0xTCi0gICAgICAgIGlmIChzdXBwb3J0c0Rpc2NvdmVyQUNMcygpKSB7Ci0gICAgICAgICAgICBBY2wgYWNsID0gZ2V0QmluZGluZygpLmdldEFjbFNlcnZpY2UoKS5nZXRBY2woZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhvYmplY3QuZ2V0QWNsKCksIGFjbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJBQ0xzIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBwb2xpY2llcwotICAgICAgICBpZiAoc3VwcG9ydHNQb2xpY2llcygpKSB7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdERhdGE+IHBvbGljaWVzID0gZ2V0QmluZGluZygpLmdldFBvbGljeVNlcnZpY2UoKS5nZXRBcHBsaWVkUG9saWNpZXMoZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgICAgICBvYmplY3RJZCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY2llcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChvYmplY3QuZ2V0UG9saWN5SWRzKCkuZ2V0UG9saWN5SWRzKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKSk7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcG9saWN5SWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgcG9saWN5IDogcG9saWNpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwb2xpY3kpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBvbGljeS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBwb2xpY3lJZHMuYWRkKHBvbGljeS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbExpc3RzKG9iamVjdC5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKSwgcG9saWN5SWRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIlBvbGljaWVzIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayByZW5kaXRpb25zCi0gICAgICAgIGlmIChzdXBwb3J0c1JlbmRpdGlvbnMoKSkgewotICAgICAgICAgICAgTGlzdDxSZW5kaXRpb25EYXRhPiByZW5kaXRpb25zID0gZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKS5nZXRSZW5kaXRpb25zKGdldFRlc3RSZXBvc2l0b3J5SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbExpc3RzKG9iamVjdC5nZXRSZW5kaXRpb25zKCksIHJlbmRpdGlvbnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2FybmluZygiUmVuZGl0aW9ucyBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgcmVsYXRpb25zaGlwcwotICAgICAgICBpZiAoc3VwcG9ydHNSZWxhdGlvbnNoaXBzKCkpIHsKLSAgICAgICAgICAgIE9iamVjdExpc3QgcmVsYXRpb25zaGlwcyA9IGdldEJpbmRpbmcoKS5nZXRSZWxhdGlvbnNoaXBTZXJ2aWNlKCkuZ2V0T2JqZWN0UmVsYXRpb25zaGlwcygKLSAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwgQm9vbGVhbi5UUlVFLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uRUlUSEVSLCBudWxsLCAiKiIsCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlbGF0aW9uc2hpcHMpOwotCi0gICAgICAgICAgICBpZiAoKG9iamVjdC5nZXRSZWxhdGlvbnNoaXBzKCkgIT0gbnVsbCkgJiYgKHJlbGF0aW9uc2hpcHMuZ2V0T2JqZWN0cygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9iamVjdC5nZXRSZWxhdGlvbnNoaXBzKCkuc2l6ZSgpLCByZWxhdGlvbnNoaXBzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSByZWwxIDogcmVsYXRpb25zaGlwcy5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0QmFzaWNQcm9wZXJ0aWVzKHJlbDEuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSByZWwyIDogb2JqZWN0LmdldFJlbGF0aW9uc2hpcHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbDIuZ2V0SWQoKS5lcXVhbHMocmVsMS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVsMi5nZXRQcm9wZXJ0aWVzKCksIHJlbDEuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZm91bmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdhcm5pbmcoIlJlbGF0aW9uc2hpcHMgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHNvbWUgb2YgdGhlIHJlYWQtb25seSBtZXRob2RzIG9mIHRoZSBWZXJzaW9uaW5nIFNlcnZpY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrT2JqZWN0VmVyc2lvbnMoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hlY2tpbmcgdmVyc2lvbnMgb2Ygb2JqZWN0ICIgKyBvYmplY3RJZCArICIuLi4iKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKG9iamVjdElkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2ZXJzaW9uU2VyaWVzSWQpOwotCi0gICAgICAgIC8vIGNoZWNrIGxhdGVzdCB2ZXJzaW9uCi0gICAgICAgIE9iamVjdERhdGEgbGF0ZXN0VmVyc2lvbk9iamVjdCA9IGdldEJpbmRpbmcoKS5nZXRWZXJzaW9uaW5nU2VydmljZSgpLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbigKLSAgICAgICAgICAgICAgICBnZXRUZXN0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsIEJvb2xlYW4uRkFMU0UsICIqIiwgQm9vbGVhbi5UUlVFLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgsIG51bGwsIEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5UUlVFLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChsYXRlc3RWZXJzaW9uT2JqZWN0KTsKLQotICAgICAgICBQcm9wZXJ0aWVzIGxhdGVzdFZlcnNpb25Qcm9wZXJ0aWVzID0gZ2V0QmluZGluZygpLmdldFZlcnNpb25pbmdTZXJ2aWNlKCkuZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbigKLSAgICAgICAgICAgICAgICBnZXRUZXN0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsIEJvb2xlYW4uRkFMU0UsICIqIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobGF0ZXN0VmVyc2lvblByb3BlcnRpZXMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhsYXRlc3RWZXJzaW9uT2JqZWN0LmdldFByb3BlcnRpZXMoKSwgbGF0ZXN0VmVyc2lvblByb3BlcnRpZXMpOwotCi0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIGxhdGVzdFZlcnNpb25PYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lEKQotICAgICAgICAgICAgICAgIC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGlmIChpc1ZlcnNpb25hYmxlKHR5cGVOYW1lKSkgewotICAgICAgICAgICAgTGlzdDxPYmplY3REYXRhPiBhbGxWZXJzaW9ucyA9IGdldEJpbmRpbmcoKS5nZXRWZXJzaW9uaW5nU2VydmljZSgpLmdldEFsbFZlcnNpb25zKGdldFRlc3RSZXBvc2l0b3J5SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgIioiLCBCb29sZWFuLkZBTFNFLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWxsVmVyc2lvbnMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc05vdEVtcHR5KGFsbFZlcnNpb25zKSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRPYmplY3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRMYXRlc3RPYmplY3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3QgOiBhbGxWZXJzaW9ucykgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqZWN0KTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9iamVjdC5nZXRJZCgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChvYmplY3RJZC5lcXVhbHMob2JqZWN0LmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobGF0ZXN0VmVyc2lvbk9iamVjdC5nZXRJZCgpLmVxdWFscyhvYmplY3QuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRMYXRlc3RPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobGF0ZXN0VmVyc2lvbk9iamVjdC5nZXRQcm9wZXJ0aWVzKCksIG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmb3VuZE9iamVjdCkgewotICAgICAgICAgICAgICAgIGZhaWwoIk9iamVjdCAiICsgb2JqZWN0SWQgKyAiIG5vdCBmb3VuZCBpbiBpdCdzIHZlcnNpb24gaGlzdG9yeSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmb3VuZExhdGVzdE9iamVjdCkgewotICAgICAgICAgICAgICAgIGZhaWwoIk9iamVjdCAiICsgbGF0ZXN0VmVyc2lvbk9iamVjdC5nZXRJZCgpICsgIiBub3QgZm91bmQgaW4gaXQncyB2ZXJzaW9uIGhpc3RvcnkhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvZnJhbWV3b3JrL0Fic3RyYWN0U2ltcGxlUmVhZFdyaXRlVGVzdHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9mcmFtZXdvcmsvQWJzdHJhY3RTaW1wbGVSZWFkV3JpdGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWFkM2Q1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9mcmFtZXdvcmsvQWJzdHJhY3RTaW1wbGVSZWFkV3JpdGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuZnJhbWV3b3JrOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOwotCi0vKioKLSAqIFNpbXBsZSByZWFkLXdyaXRlIHRlc3QuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNpbXBsZVJlYWRXcml0ZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RDbWlzVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DUkVBVEVfRk9MREVSID0gImNyZWF0ZUZvbGRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DUkVBVEVfRE9DVU1FTlQgPSAiY3JlYXRlRG9jdW1lbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ1JFQVRFX0ZST01fU09VUkNFID0gImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TRVRfQU5EX0RFTEVURV9DT05URU5UID0gInNldEFuZERlbGV0ZUNvbnRlbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVVBEQVRFX1BST1BFUlRJRVMgPSAidXBkYXRlUHJvcGVydGllcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9ERUxFVEVfVFJFRSA9ICJkZWxldGVUcmVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX01PVkVfT0JKRUNUID0gIm1vdmVPYmplY3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ09QWV9PQkpFQ1QgPSAiY29weU9iamVjdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9WRVJTSU9OSU5HID0gInZlcnNpb25pbmciOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTlRFTlQgPSAiTXkgZG9jdW1lbnQgdGVzdCBjb250ZW50ISIuZ2V0Qnl0ZXMoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ09OVEVOVDIgPSAiQW5vdGhlciB0ZXN0IGNvbnRlbnQhIi5nZXRCeXRlcygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAidGV4dC9wbGFpbiI7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBmb2xkZXIgY3JlYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZvbGRlcigpIHsKLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoVEVTVF9DUkVBVEVfRk9MREVSKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGZvbGRlcgotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcExpc3QuYWRkKGdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuTkFNRSwgInRlc3Rmb2xkZXIiKSk7Ci0gICAgICAgIHByb3BMaXN0LmFkZChnZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIGdldERlZmF1bHRGb2xkZXJUeXBlKCkpKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBnZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcExpc3QpOwotCi0gICAgICAgIFN0cmluZyBmb2xkZXJJZCA9IGNyZWF0ZUZvbGRlcihwcm9wZXJ0aWVzLCBnZXRUZXN0Um9vdEZvbGRlcigpLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBkZWxldGUgZm9sZGVyCi0gICAgICAgIGRlbGV0ZShmb2xkZXJJZCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgZG9jdW1lbnQgY3JlYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvY3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNFbmFibGVkKFRFU1RfQ1JFQVRFX0RPQ1VNRU5UKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZzID0gKGlzVmVyc2lvbmFibGUoZ2V0RGVmYXVsdERvY3VtZW50VHlwZSgpKSA/IFZlcnNpb25pbmdTdGF0ZS5NQUpPUiA6IFZlcnNpb25pbmdTdGF0ZS5OT05FKTsKLQotICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnQKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BMaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BMaXN0LmFkZChnZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLk5BTUUsICJ0ZXN0ZG9jLnR4dCIpKTsKLSAgICAgICAgcHJvcExpc3QuYWRkKGdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgZ2V0RGVmYXVsdERvY3VtZW50VHlwZSgpKSk7Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BMaXN0KTsKLQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjcmVhdGVDb250ZW50U3RyZWFtRGF0YShDT05URU5UX1RZUEUsIENPTlRFTlQpOwotCi0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZURvY3VtZW50KHByb3BlcnRpZXMsIGdldFRlc3RSb290Rm9sZGVyKCksIGNvbnRlbnRTdHJlYW0sIHZzLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBhc3NlcnQgY29udGVudAotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0yID0gZ2V0Q29udGVudChkb2NJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE1pbWVUeXBlKENPTlRFTlRfVFlQRSwgY29udGVudFN0cmVhbTIuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgIGlmIChjb250ZW50U3RyZWFtMi5nZXRCaWdMZW5ndGgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEVOVC5sZW5ndGgsIGNvbnRlbnRTdHJlYW0yLmdldEJpZ0xlbmd0aCgpLmludFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSByZWFkQ29udGVudChjb250ZW50U3RyZWFtMik7Ci0gICAgICAgIGFzc2VydENvbnRlbnQoQ09OVEVOVCwgY29udGVudCk7Ci0KLSAgICAgICAgLy8gYXBwbHkgYW4gQUNMCi0gICAgICAgIGlmIChzdXBwb3J0c01hbmFnZUFDTHMoKSkgewotICAgICAgICAgICAgQWNlIGFjZSA9IGdldE9iamVjdEZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQWNjZXNzQ29udHJvbEVudHJ5KGdldFVzZXJuYW1lKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImNtaXM6cmVhZCIpKTsKLSAgICAgICAgICAgIEFjbCBhY2wgPSBnZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlQWNjZXNzQ29udHJvbExpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhY2UpKTsKLQotICAgICAgICAgICAgQWNsIG5ld0FjbCA9IGdldEJpbmRpbmcoKS5nZXRBY2xTZXJ2aWNlKCkuYXBwbHlBY2woZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBkb2NJZCwgYWNsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBnZXRBY2xQcm9wYWdhdGlvbigpLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmV3QWNsKTsKLQotICAgICAgICAgICAgQWNsIHJlYWRBY2wgPSBnZXRCaW5kaW5nKCkuZ2V0QWNsU2VydmljZSgpLmdldEFjbChnZXRUZXN0UmVwb3NpdG9yeUlkKCksIGRvY0lkLCBCb29sZWFuLkZBTFNFLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVhZEFjbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdBY2wsIHJlYWRBY2wpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2FybmluZygiQUNMcyBtYW5hZ2VtZW50IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWxldGUgZG9jdW1lbnQKLSAgICAgICAgZGVsZXRlKGRvY0lkLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBkb2N1bWVudCBjcmVhdGlvbiBmcm9tIHNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaXNFbmFibGVkKFRFU1RfQ1JFQVRFX0ZST01fU09VUkNFKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZzID0gKGlzVmVyc2lvbmFibGUoZ2V0RGVmYXVsdERvY3VtZW50VHlwZSgpKSA/IFZlcnNpb25pbmdTdGF0ZS5NQUpPUiA6IFZlcnNpb25pbmdTdGF0ZS5OT05FKTsKLQotICAgICAgICBTdHJpbmcgZG9jSWQgPSBjcmVhdGVEZWZhdWx0RG9jdW1lbnQoZ2V0VGVzdFJvb3RGb2xkZXIoKSwgInRlc3Rkb2Mub3JnLnR4dCIsIENPTlRFTlRfVFlQRSwgQ09OVEVOVCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgY29weQotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcExpc3QyID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BMaXN0Mi5hZGQoZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCAidGVzdGRvYy5jb3B5LnR4dCIpKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMyID0gZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BMaXN0Mik7Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lkMiA9IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShkb2NJZCwgcHJvcGVydGllczIsIGdldFRlc3RSb290Rm9sZGVyKCksIHZzLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBnZXQgb2JqZWN0cwotICAgICAgICBnZXRPYmplY3QoZG9jSWQpOwotICAgICAgICBnZXRPYmplY3QoZG9jSWQyKTsKLQotICAgICAgICAvLyByZWFkIGFuZCBhc3NlcnQgY29udGVudAotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0yID0gZ2V0Q29udGVudChkb2NJZCwgbnVsbCk7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbTMgPSBnZXRDb250ZW50KGRvY0lkMiwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRlbnRTdHJlYW0yLmdldE1pbWVUeXBlKCksIGNvbnRlbnRTdHJlYW0zLmdldE1pbWVUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudFN0cmVhbTIuZ2V0QmlnTGVuZ3RoKCksIGNvbnRlbnRTdHJlYW0zLmdldEJpZ0xlbmd0aCgpKTsKLQotICAgICAgICBieXRlW10gY29udGVudDIgPSByZWFkQ29udGVudChjb250ZW50U3RyZWFtMik7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50MyA9IHJlYWRDb250ZW50KGNvbnRlbnRTdHJlYW0zKTsKLSAgICAgICAgYXNzZXJ0Q29udGVudChjb250ZW50MiwgY29udGVudDMpOwotCi0gICAgICAgIC8vIGRlbGV0ZSBkb2N1bWVudHMKLSAgICAgICAgZGVsZXRlKGRvY0lkLCB0cnVlKTsKLSAgICAgICAgZGVsZXRlKGRvY0lkMiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgc2V0dGluZyBhbmQgZGVsZXRpbmcgY29udGVudCBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEFuZERlbGV0ZUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoVEVTVF9TRVRfQU5EX0RFTEVURV9DT05URU5UKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiByZXF1aXJlc0NoZWNrT3V0ID0gZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRDb250ZW50U3RyZWFtVXBkYXRlc0NhcGFiaWxpdHkoKSA9PSBDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMuUFdDT05MWTsKLQotICAgICAgICBib29sZWFuIGlzVmVyc2lvbmFibGUgPSBpc1ZlcnNpb25hYmxlKGdldERlZmF1bHREb2N1bWVudFR5cGUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRGVmYXVsdERvY3VtZW50KGdldFRlc3RSb290Rm9sZGVyKCksICJ0ZXN0Y29udGVudC50eHQiLCBDT05URU5UX1RZUEUsIENPTlRFTlQpOwotCi0gICAgICAgIC8vIGlmIGEgY2hlY2sgb3V0IGlzIHJlcXVpcmVkLCBkbyBpdAotICAgICAgICBIb2xkZXI8U3RyaW5nPiBkb2NJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihkb2NJZCk7Ci0gICAgICAgIGlmIChyZXF1aXJlc0NoZWNrT3V0KSB7Ci0gICAgICAgICAgICBpZiAoaXNWZXJzaW9uYWJsZSkgewotICAgICAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXRWZXJzaW9uaW5nU2VydmljZSgpLmNoZWNrT3V0KGdldFRlc3RSZXBvc2l0b3J5SWQoKSwgZG9jSWRIb2xkZXIsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3YXJuaW5nKCJEZWZhdWx0IGRvY3VtZW50IHR5cGUgaXMgbm90IHZlcnNpb25hYmxlISIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZShkb2NJZCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lkV29ya2luZ0NvcHkgPSBkb2NJZEhvbGRlci5nZXRWYWx1ZSgpOwotCi0gICAgICAgIC8vIGRlbGV0ZSBjb250ZW50Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLmRlbGV0ZUNvbnRlbnRTdHJlYW0oZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBkb2NJZEhvbGRlciwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgd2FybmluZygiZGVsZXRlQ29udGVudFN0cmVhbSBub3Qgc3VwcG9ydGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IGNvbnRlbnQKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtMiA9IGNyZWF0ZUNvbnRlbnRTdHJlYW1EYXRhKENPTlRFTlRfVFlQRSwgQ09OVEVOVDIpOwotCi0gICAgICAgIGRvY0lkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkV29ya2luZ0NvcHkpOwotICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLnNldENvbnRlbnRTdHJlYW0oZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBkb2NJZEhvbGRlciwgdHJ1ZSwgbnVsbCwKLSAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtMiwgbnVsbCk7Ci0KLSAgICAgICAgLy8gcmVhZCBhbmQgYXNzZXJ0IGNvbnRlbnQKLSAgICAgICAgU3RyaW5nIG5ld1ZlcnNpb25Eb2NJZCA9IChkb2NJZEhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBkb2NJZFdvcmtpbmdDb3B5IDogZG9jSWRIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbTMgPSBnZXRDb250ZW50KG5ld1ZlcnNpb25Eb2NJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE1pbWVUeXBlKENPTlRFTlRfVFlQRSwgY29udGVudFN0cmVhbTMuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgIGlmIChjb250ZW50U3RyZWFtMy5nZXRCaWdMZW5ndGgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEVOVDIubGVuZ3RoLCBjb250ZW50U3RyZWFtMy5nZXRCaWdMZW5ndGgoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBjb250ZW50ID0gcmVhZENvbnRlbnQoY29udGVudFN0cmVhbTMpOwotICAgICAgICBhc3NlcnRDb250ZW50KENPTlRFTlQyLCBjb250ZW50KTsKLQotICAgICAgICAvLyBpZiBpdCBoYXMgYmVlbiBjaGVja2VkIG91dCwgY2FuY2VsIHRoYXQKLSAgICAgICAgaWYgKHJlcXVpcmVzQ2hlY2tPdXQpIHsKLSAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXRWZXJzaW9uaW5nU2VydmljZSgpLmNhbmNlbENoZWNrT3V0KGdldFRlc3RSZXBvc2l0b3J5SWQoKSwgZG9jSWRXb3JraW5nQ29weSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWxldGUgZG9jdW1lbnQKLSAgICAgICAgZGVsZXRlKGRvY0lkLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBwcm9wZXJ0eSB1cGRhdGVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0aWVzKCkgewotICAgICAgICBpZiAoIWlzRW5hYmxlZChURVNUX1VQREFURV9QUk9QRVJUSUVTKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUxID0gInVwZGF0ZVRlc3QxLnR4dCI7Ci0gICAgICAgIFN0cmluZyBuYW1lMiA9ICJ1cGRhdGVUZXN0Mi50eHQiOwotCi0gICAgICAgIC8vIGNyZWF0ZSBkb2N1bWVudAotICAgICAgICBTdHJpbmcgZG9jSWQgPSBjcmVhdGVEZWZhdWx0RG9jdW1lbnQoZ2V0VGVzdFJvb3RGb2xkZXIoKSwgbmFtZTEsIENPTlRFTlRfVFlQRSwgQ09OVEVOVCk7Ci0KLSAgICAgICAgLy8gdXBkYXRlCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiB1cGRhdGVQcm9wTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICB1cGRhdGVQcm9wTGlzdC5hZGQoZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lMikpOwotCi0gICAgICAgIFByb3BlcnRpZXMgdXBkYXRlUHJvcGVydGllcyA9IGdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVQcm9wZXJ0aWVzRGF0YSh1cGRhdGVQcm9wTGlzdCk7Ci0KLSAgICAgICAgSG9sZGVyPFN0cmluZz4gZG9jSWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpOwotICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLnVwZGF0ZVByb3BlcnRpZXMoZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCBkb2NJZEhvbGRlciwgbnVsbCwgdXBkYXRlUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAvLyBnZXQgbmV3IGlkIGFuZCBjaGVjayBuYW1lIHByb3BlcnR5Ci0gICAgICAgIGRvY0lkID0gZG9jSWRIb2xkZXIuZ2V0VmFsdWUoKTsKLQotICAgICAgICBPYmplY3REYXRhIHVwZGF0ZWRPYmplY3QgPSBnZXRPYmplY3QoZG9jSWQpOwotICAgICAgICBTdHJpbmcgdXBkYXRlZE5hbWUgPSAoU3RyaW5nKSB1cGRhdGVkT2JqZWN0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1cGRhdGVkTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lMiwgdXBkYXRlZE5hbWUpOwotCi0gICAgICAgIC8vIGRlbGV0ZSBkb2N1bWVudAotICAgICAgICBkZWxldGUoZG9jSWQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGRlbGV0ZSB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVUcmVlKCkgewotICAgICAgICBpZiAoIWlzRW5hYmxlZChURVNUX0RFTEVURV9UUkVFKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZm9sZGVyIHRyZWUKLSAgICAgICAgU3RyaW5nIGZvbGRlcjEgPSBjcmVhdGVEZWZhdWx0Rm9sZGVyKGdldFRlc3RSb290Rm9sZGVyKCksICJmb2xkZXIxIik7Ci0gICAgICAgIFN0cmluZyBmb2xkZXIxMSA9IGNyZWF0ZURlZmF1bHRGb2xkZXIoZm9sZGVyMSwgImZvbGRlcjExIik7Ci0gICAgICAgIFN0cmluZyBmb2xkZXIxMiA9IGNyZWF0ZURlZmF1bHRGb2xkZXIoZm9sZGVyMSwgImZvbGRlcjEyIik7Ci0gICAgICAgIFN0cmluZyBmb2xkZXIxMjEgPSBjcmVhdGVEZWZhdWx0Rm9sZGVyKGZvbGRlcjEyLCAiZm9sZGVyMTIxIik7Ci0gICAgICAgIFN0cmluZyBmb2xkZXIxMjIgPSBjcmVhdGVEZWZhdWx0Rm9sZGVyKGZvbGRlcjEyLCAiZm9sZGVyMTIyIik7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZmV3IGRvY3VtZW50cwotICAgICAgICBTdHJpbmcgZG9jMTExID0gY3JlYXRlRGVmYXVsdERvY3VtZW50KGZvbGRlcjExLCAiZG9jMTExLnR4dCIsIENPTlRFTlRfVFlQRSwgQ09OVEVOVCk7Ci0gICAgICAgIFN0cmluZyBkb2MxMjIxID0gY3JlYXRlRGVmYXVsdERvY3VtZW50KGZvbGRlcjEyMiwgImRvYzEyMjEudHh0IiwgQ09OVEVOVF9UWVBFLCBDT05URU5UMik7Ci0KLSAgICAgICAgLy8gZGVsZXRlIHRoZSB0cmVlCi0gICAgICAgIGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuZGVsZXRlVHJlZShnZXRUZXN0UmVwb3NpdG9yeUlkKCksIGZvbGRlcjEsIEJvb2xlYW4uVFJVRSwgVW5maWxlT2JqZWN0LkRFTEVURSwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUsIG51bGwpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGV4aXN0c09iamVjdChmb2xkZXIxKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGV4aXN0c09iamVjdChmb2xkZXIxMSkpOwotICAgICAgICBhc3NlcnRGYWxzZShleGlzdHNPYmplY3QoZm9sZGVyMTIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZXhpc3RzT2JqZWN0KGZvbGRlcjEyMSkpOwotICAgICAgICBhc3NlcnRGYWxzZShleGlzdHNPYmplY3QoZm9sZGVyMTIyKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGV4aXN0c09iamVjdChkb2MxMTEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZXhpc3RzT2JqZWN0KGRvYzEyMjEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBtb3ZlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdCgpIHsKLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoVEVTVF9NT1ZFX09CSkVDVCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBmb2xkZXJzCi0gICAgICAgIFN0cmluZyBmb2xkZXIxID0gY3JlYXRlRGVmYXVsdEZvbGRlcihnZXRUZXN0Um9vdEZvbGRlcigpLCAiZm9sZGVyMSIpOwotICAgICAgICBTdHJpbmcgZm9sZGVyMiA9IGNyZWF0ZURlZmF1bHRGb2xkZXIoZ2V0VGVzdFJvb3RGb2xkZXIoKSwgImZvbGRlcjIiKTsKLQotICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnQKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRGVmYXVsdERvY3VtZW50KGZvbGRlcjEsICJ0ZXN0ZG9jLnR4dCIsIENPTlRFTlRfVFlQRSwgQ09OVEVOVCk7Ci0KLSAgICAgICAgLy8gbW92ZSBpdAotICAgICAgICBIb2xkZXI8U3RyaW5nPiBkb2NJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihkb2NJZCk7Ci0gICAgICAgIGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkubW92ZU9iamVjdChnZXRUZXN0UmVwb3NpdG9yeUlkKCksIGRvY0lkSG9sZGVyLCBmb2xkZXIyLCBmb2xkZXIxLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2NJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGV4aXN0c09iamVjdChkb2NJZEhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIGdldENoaWxkKGZvbGRlcjIsIGRvY0lkSG9sZGVyLmdldFZhbHVlKCkpOwotCi0gICAgICAgIGRlbGV0ZVRyZWUoZm9sZGVyMSk7Ci0gICAgICAgIGRlbGV0ZVRyZWUoZm9sZGVyMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgY29weSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvcHlPYmplY3QoKSB7Ci0gICAgICAgIGlmICghaXNFbmFibGVkKFRFU1RfQ09QWV9PQkpFQ1QpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgZm9sZGVycwotICAgICAgICBTdHJpbmcgZm9sZGVyMSA9IGNyZWF0ZURlZmF1bHRGb2xkZXIoZ2V0VGVzdFJvb3RGb2xkZXIoKSwgImZvbGRlcjEiKTsKLSAgICAgICAgU3RyaW5nIGZvbGRlcjIgPSBjcmVhdGVEZWZhdWx0Rm9sZGVyKGdldFRlc3RSb290Rm9sZGVyKCksICJmb2xkZXIyIik7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGRvY3VtZW50Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZURlZmF1bHREb2N1bWVudChmb2xkZXIxLCAidGVzdGRvYy50eHQiLCBDT05URU5UX1RZUEUsIENPTlRFTlQpOwotCi0gICAgICAgIC8vIGNvcHkgaXQgd2l0aCBuZXcgcHJvcGVydGllcwotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gdXBkYXRlUHJvcExpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgdXBkYXRlUHJvcExpc3QuYWRkKGdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuTkFNRSwgIm5ld2RvY25hbWUiKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgdXBkYXRlUHJvcGVydGllcyA9IGdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVQcm9wZXJ0aWVzRGF0YSh1cGRhdGVQcm9wTGlzdCk7Ci0KLSAgICAgICAgU3RyaW5nIGNvcHlJZCA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKGdldFRlc3RSZXBvc2l0b3J5SWQoKSwgZG9jSWQsCi0gICAgICAgICAgICAgICAgdXBkYXRlUHJvcGVydGllcywgZm9sZGVyMiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY29weUlkKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGV4aXN0c09iamVjdChjb3B5SWQpKTsKLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhIGNvcHkgPSBnZXRDaGlsZChmb2xkZXIyLCBjb3B5SWQpOwotICAgICAgICBTdHJpbmcgdXBkYXRlZE5hbWUgPSAoU3RyaW5nKSBjb3B5LmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuZXdkb2NuYW1lIiwgdXBkYXRlZE5hbWUpOwotCi0gICAgICAgIGRlbGV0ZVRyZWUoZm9sZGVyMSk7Ci0gICAgICAgIGRlbGV0ZVRyZWUoZm9sZGVyMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBjaGVjay1pbi9jaGVjay1vdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25pbmcoKSB7Ci0gICAgICAgIGlmICghaXNFbmFibGVkKFRFU1RfVkVSU0lPTklORykpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNWZXJzaW9uYWJsZShnZXREZWZhdWx0RG9jdW1lbnRUeXBlKCkpKSB7Ci0gICAgICAgICAgICB3YXJuaW5nKCJEZWZhdWx0IGRvY3VtZW50IHR5cGUgaXMgbm90IHZlcnNpb25hYmxlISIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGRvY3VtZW50Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZURlZmF1bHREb2N1bWVudChnZXRUZXN0Um9vdEZvbGRlcigpLCAidmVyc2lvblRlc3QudHh0IiwgQ09OVEVOVF9UWVBFLCBDT05URU5UKTsKLQotICAgICAgICAvLyB0aGVyZSBtdXN0IGJlIG9ubHkgb25lIHZlcnNpb24gaW4gdGhlIHZlcnNpb24gc2VyaWVzCi0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gYWxsVmVyc2lvbnMgPSBnZXRCaW5kaW5nKCkuZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKS5nZXRBbGxWZXJzaW9ucyhnZXRUZXN0UmVwb3NpdG9yeUlkKCksIGRvY0lkLAotICAgICAgICAgICAgICAgIGdldFZlcnNpb25TZXJpZXNJZChkb2NJZCksICIqIiwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWxsVmVyc2lvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsVmVyc2lvbnMuc2l6ZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZG9jSWQsIGFsbFZlcnNpb25zLmdldCgwKS5nZXRJZCgpKTsKLQotICAgICAgICAvLyBjaGVjayBvdXQKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gdmVyc2lvbklkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkKTsKLSAgICAgICAgZ2V0QmluZGluZygpLmdldFZlcnNpb25pbmdTZXJ2aWNlKCkuY2hlY2tPdXQoZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCB2ZXJzaW9uSWRIb2xkZXIsIG51bGwsIG51bGwpOwotICAgICAgICBTdHJpbmcgdmVyc2lvbklkID0gdmVyc2lvbklkSG9sZGVyLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgLy8gb2JqZWN0IG11c3QgYmUgbWFya2VkIGFzIGNoZWNrZWQgb3V0Ci0gICAgICAgIGFzc2VydFRydWUoaXNDaGVja2VkT3V0KGRvY0lkKSk7Ci0KLSAgICAgICAgLy8gY2FuY2VsIGNoZWNrIG91dAotICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKS5jYW5jZWxDaGVja091dChnZXRUZXN0UmVwb3NpdG9yeUlkKCksIHZlcnNpb25JZCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gb2JqZWN0IG11c3QgTk9UIGJlIG1hcmtlZCBhcyBjaGVja2VkIG91dAotICAgICAgICBhc3NlcnRGYWxzZShpc0NoZWNrZWRPdXQoZG9jSWQpKTsKLQotICAgICAgICAvLyBjaGVjayBvdXQgYWdhaW4KLSAgICAgICAgdmVyc2lvbklkSG9sZGVyLnNldFZhbHVlKGRvY0lkKTsKLSAgICAgICAgZ2V0QmluZGluZygpLmdldFZlcnNpb25pbmdTZXJ2aWNlKCkuY2hlY2tPdXQoZ2V0VGVzdFJlcG9zaXRvcnlJZCgpLCB2ZXJzaW9uSWRIb2xkZXIsIG51bGwsIG51bGwpOwotICAgICAgICB2ZXJzaW9uSWQgPSB2ZXJzaW9uSWRIb2xkZXIuZ2V0VmFsdWUoKTsKLQotICAgICAgICAvLyBvYmplY3QgbXVzdCBiZSBtYXJrZWQgYXMgY2hlY2tlZCBvdXQKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc0NoZWNrZWRPdXQoZG9jSWQpKTsKLQotICAgICAgICB2ZXJzaW9uSWRIb2xkZXIuc2V0VmFsdWUodmVyc2lvbklkKTsKLSAgICAgICAgZ2V0QmluZGluZygpLmdldFZlcnNpb25pbmdTZXJ2aWNlKCkuY2hlY2tJbihnZXRUZXN0UmVwb3NpdG9yeUlkKCksIHZlcnNpb25JZEhvbGRlciwgQm9vbGVhbi5UUlVFLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICJUZXN0IFZlcnNpb24gMiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBkb2NJZCA9IHZlcnNpb25JZEhvbGRlci5nZXRWYWx1ZSgpOwotCi0gICAgICAgIC8vIG9iamVjdCBtdXN0IE5PVCBiZSBtYXJrZWQgYXMgY2hlY2tlZCBvdXQKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXNDaGVja2VkT3V0KGRvY0lkKSk7Ci0KLSAgICAgICAgLy8gdGhlcmUgbXVzdCBiZSBleGFjdGx5IHR3byB2ZXJzaW9ucyBpbiB0aGUgdmVyc2lvbiBzZXJpZXMKLSAgICAgICAgYWxsVmVyc2lvbnMgPSBnZXRCaW5kaW5nKCkuZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKS5nZXRBbGxWZXJzaW9ucyhnZXRUZXN0UmVwb3NpdG9yeUlkKCksIGRvY0lkLAotICAgICAgICAgICAgICAgIGdldFZlcnNpb25TZXJpZXNJZChkb2NJZCksICIqIiwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWxsVmVyc2lvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWxsVmVyc2lvbnMuc2l6ZSgpKTsKLQotICAgICAgICAvLyBkZWxldGUgZG9jdW1lbnQKLSAgICAgICAgZGVsZXRlKGRvY0lkLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDaGVja2VkT3V0KFN0cmluZyBkb2NJZCkgewotICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldE9iamVjdChkb2NJZCk7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBpc0NoZWNrZWRPdXQgPSBvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKQotICAgICAgICAgICAgICAgIC5nZXQoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlzQ2hlY2tlZE91dCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNDaGVja2VkT3V0LmdldEZpcnN0VmFsdWUoKSBpbnN0YW5jZW9mIEJvb2xlYW4pOwotCi0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGlzQ2hlY2tlZE91dC5nZXRGaXJzdFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9mcmFtZXdvcmsvVG9vbHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9mcmFtZXdvcmsvVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxYjgxMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvZnJhbWV3b3JrL1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5mcmFtZXdvcms7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmZtdWVsbGVyQG9wZW50ZXh0LmNvbSI+RmxvcmlhbiBNJnV1bWw7bGxlcjwvYT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVG9vbHMgewotICAgIAotICAgIHByaXZhdGUgVG9vbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnlJbmZvKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZDogICAgICAgICAgICAgICAiICsgcmVwb3NpdG9yeUluZm8uZ2V0SWQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmFtZTogICAgICAgICAgICAgIiArIHJlcG9zaXRvcnlJbmZvLmdldE5hbWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ01JUyBWZXJzaW9uOiAgICAgIiArIHJlcG9zaXRvcnlJbmZvLmdldENtaXNWZXJzaW9uU3VwcG9ydGVkKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2R1Y3Q6ICAgICAgICAgICIgKyByZXBvc2l0b3J5SW5mby5nZXRWZW5kb3JOYW1lKCkgKyAiIC8gIgotICAgICAgICAgICAgICAgICsgcmVwb3NpdG9yeUluZm8uZ2V0UHJvZHVjdE5hbWUoKSArICIgIiArIHJlcG9zaXRvcnlJbmZvLmdldFByb2R1Y3RWZXJzaW9uKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJvb3QgRm9sZGVyOiAgICAgICIgKyByZXBvc2l0b3J5SW5mby5nZXRSb290Rm9sZGVySWQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FwYWJpbGl0aWVzOiAgICAgIiArIHJlcG9zaXRvcnlJbmZvLmdldENhcGFiaWxpdGllcygpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBQ0wgQ2FwYWJpbGl0aWVzOiAiICsgcmVwb3NpdG9yeUluZm8uZ2V0QWNsQ2FwYWJpbGl0aWVzKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUeXBlcyhTdHJpbmcgdGl0bGUsIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHR5cGVDb250YWluZXJMaXN0KSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICBwcmludFR5cGVzKHR5cGVDb250YWluZXJMaXN0LCAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VHlwZXMoTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gdHlwZUNvbnRhaW5lckxpc3QsIGludCBsZXZlbCkgewotICAgICAgICBpZiAodHlwZUNvbnRhaW5lckxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBjb250YWluZXIgOiB0eXBlQ29udGFpbmVyTGlzdCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0SWQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihjb250YWluZXIuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgcHJpbnRUeXBlcyhjb250YWluZXIuZ2V0Q2hpbGRyZW4oKSwgbGV2ZWwgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChTdHJpbmcgdGl0bGUsIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGNvbnRhaW5lckxpc3QpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIHByaW50KGNvbnRhaW5lckxpc3QsIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnQoTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gY29udGFpbmVyTGlzdCwgaW50IGxldmVsKSB7Ci0gICAgICAgIGlmIChjb250YWluZXJMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgY29udGFpbmVyIDogY29udGFpbmVyTGlzdCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gY29udGFpbmVyLmdldE9iamVjdCgpLmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSkuZ2V0Rmlyc3RWYWx1ZSgpICsgIiAoIgotICAgICAgICAgICAgICAgICAgICArIHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkuZ2V0Rmlyc3RWYWx1ZSgpICsgIikiKTsKLQotICAgICAgICAgICAgcHJpbnQoY29udGFpbmVyLmdldENoaWxkcmVuKCksIGxldmVsICsgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvbWlzYy9Db29raWVzVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL21pc2MvQ29va2llc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwYzgzOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3MvbWlzYy9Db29raWVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5taXNjOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLmNvb2tpZXMuQ21pc0Nvb2tpZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb29raWVzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVzKCkgewotICAgICAgICBDbWlzQ29va2llTWFuYWdlciBtYW5hZ2VyID0gbmV3IENtaXNDb29raWVNYW5hZ2VyKCk7Ci0gICAgICAgIFN0cmluZyB1cmw7Ci0KLSAgICAgICAgdXJsID0gImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL3MvdGVzdC9hYmM/eHl6IjsKLSAgICAgICAgYWRkQ29va2llKG1hbmFnZXIsIHVybCwgImNvb2tpZTEiLCAiYzEtMTExMSIsICIvcy8iKTsKLQotICAgICAgICB1cmwgPSAiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcy90ZXN0L2FiYz94eXoiOwotICAgICAgICBhZGRDb29raWUobWFuYWdlciwgdXJsLCAiY29va2llMiIsICJjMi0xMTExIiwgIi9zLyIpOwotICAgICAgICBkZWxldGVDb29raWUobWFuYWdlciwgdXJsLCAiY29va2llMiIsICIvcy8iKTsKLQotICAgICAgICB1cmwgPSAiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcy90ZXN0L2FiYyI7Ci0gICAgICAgIGFkZENvb2tpZShtYW5hZ2VyLCB1cmwsICJjb29raWUxIiwgImMxLTIyMjIiLCAiL3MvIik7Ci0KLSAgICAgICAgdXJsID0gImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL3MvdGVzdC9hYmMiOwotICAgICAgICBhZGRDb29raWUobWFuYWdlciwgdXJsLCAiY29va2llMSIsICJjMS0zMzMzIiwgIi9zL3QiKTsKLQotICAgICAgICB1cmwgPSAiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcy90ZXN0L2FiYz9hYmMiOwotICAgICAgICBhZGRDb29raWUobWFuYWdlciwgdXJsLCAiY29va2llMSIsICJjMS00NDQ0IiwgIi9zL3giKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gY29va2llcyA9IG1hbmFnZXIuZ2V0KCJodHRwczovL3d3dy5leGFtcGxlLmNvbS9zL3Rlc3QvYWJjL3MiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKSkKLSAgICAgICAgICAgICAgICAuZ2V0KCJDb29raWUiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29va2llcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY29va2llcy5nZXQoMCksICJjb29raWUxPWMxLTMzMzM7IGNvb2tpZTE9YzEtMjIyMiIpOwotICAgICAgICAvL2Fzc2VydEVxdWFscyhjb29raWVzLmdldCgxKSwgImNvb2tpZTE9YzEtMjIyMiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb29raWUoQ21pc0Nvb2tpZU1hbmFnZXIgbWFuYWdlciwgU3RyaW5nIHVybCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXNwb25zZUhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLQotICAgICAgICByZXNwb25zZUhlYWRlcnMucHV0KG51bGwsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIkhUVFAvMS4xIDIwMCBPSyIpKTsKLSAgICAgICAgcmVzcG9uc2VIZWFkZXJzCi0gICAgICAgICAgICAgICAgLnB1dCgiU2V0LUNvb2tpZSIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmFtZSArICI9IiArIHZhbHVlICsgIjsgUGF0aD0iICsgcGF0aCArICI7IFNlY3VyZSIpKTsKLQotICAgICAgICBtYW5hZ2VyLnB1dCh1cmwsIHJlc3BvbnNlSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvb2tpZShDbWlzQ29va2llTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgdXJsLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXNwb25zZUhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLQotICAgICAgICByZXNwb25zZUhlYWRlcnMucHV0KG51bGwsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIkhUVFAvMS4xIDIwMCBPSyIpKTsKLSAgICAgICAgcmVzcG9uc2VIZWFkZXJzLnB1dCgiU2V0LUNvb2tpZSIsCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuYW1lICsgIj1kZWxldGU7IFBhdGg9IiArIHBhdGggKyAiOyBTZWN1cmU7IE1heC1BZ2U9MCIpKTsKLQotICAgICAgICBtYW5hZ2VyLnB1dCh1cmwsIHJlc3BvbnNlSGVhZGVycyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3dlYnNlcnZpY2VzL1NpbXBsZVJlYWRPbmx5VGVzdHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy93ZWJzZXJ2aWNlcy9TaW1wbGVSZWFkT25seVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNThmNjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL3dlYnNlcnZpY2VzL1NpbXBsZVJlYWRPbmx5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Mud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmZyYW1ld29yay5BYnN0cmFjdFNpbXBsZVJlYWRPbmx5VGVzdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Zm11ZWxsZXJAb3BlbnRleHQuY29tIj5GbG9yaWFuIE0mdXVtbDtsbGVyPC9hPgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZWFkT25seVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVSZWFkT25seVRlc3RzIHsKLQotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gZlRlc3RzOwotCi0gICAgcHVibGljIFNpbXBsZVJlYWRPbmx5VGVzdHMoKSB7Ci0gICAgICAgIGZUZXN0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX1JFUE9TSVRPUllfSU5GTyk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9UWVBFUyk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9OQVZJR0FUSU9OKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX0NPTlRFTlRfU1RSRUFNKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX1FVRVJZKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX0NIRUNLRURPVVQpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfQ09OVEVOVF9DSEFOR0VTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ21pc0JpbmRpbmcgY3JlYXRlQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VzVGVzdEJpbmRpbmdGYWN0b3J5LmNyZWF0ZUJpbmRpbmcoZ2V0V2ViU2VydmljZXNVUkwoKSwgZ2V0VXNlcm5hbWUoKSwgZ2V0UGFzc3dvcmQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEVuYWJsZWRUZXN0cygpIHsKLSAgICAgICAgcmV0dXJuIGZUZXN0czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvd2Vic2VydmljZXMvU2ltcGxlUmVhZFdyaXRlVGVzdHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy93ZWJzZXJ2aWNlcy9TaW1wbGVSZWFkV3JpdGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2ZkM2JhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy93ZWJzZXJ2aWNlcy9TaW1wbGVSZWFkV3JpdGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuZnJhbWV3b3JrLkFic3RyYWN0U2ltcGxlUmVhZFdyaXRlVGVzdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Zm11ZWxsZXJAb3BlbnRleHQuY29tIj5GbG9yaWFuIE0mdXVtbDtsbGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUmVhZFdyaXRlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVJlYWRXcml0ZVRlc3RzIHsKLQotICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gZlRlc3RzOwotCi0gICAgcHVibGljIFNpbXBsZVJlYWRXcml0ZVRlc3RzKCkgewotICAgICAgICBmVGVzdHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9DUkVBVEVfRk9MREVSKTsKLSAgICAgICAgZlRlc3RzLmFkZChURVNUX0NSRUFURV9ET0NVTUVOVCk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9DUkVBVEVfRlJPTV9TT1VSQ0UpOwotICAgICAgICBmVGVzdHMuYWRkKFRFU1RfU0VUX0FORF9ERUxFVEVfQ09OVEVOVCk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9VUERBVEVfUFJPUEVSVElFUyk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9ERUxFVEVfVFJFRSk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9NT1ZFX09CSkVDVCk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9DT1BZX09CSkVDVCk7Ci0gICAgICAgIGZUZXN0cy5hZGQoVEVTVF9WRVJTSU9OSU5HKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ21pc0JpbmRpbmcgY3JlYXRlQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VzVGVzdEJpbmRpbmdGYWN0b3J5LmNyZWF0ZUJpbmRpbmcoZ2V0V2ViU2VydmljZXNVUkwoKSwgZ2V0VXNlcm5hbWUoKSwgZ2V0UGFzc3dvcmQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEVuYWJsZWRUZXN0cygpIHsKLSAgICAgICAgcmV0dXJuIGZUZXN0czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvYmluZGluZ3Mvd2Vic2VydmljZXMvV2ViU2VydmljZXNUZXN0QmluZGluZ0ZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlc1Rlc3RCaW5kaW5nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQzMDhkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlc1Rlc3RCaW5kaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5DbWlzQmluZGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkNtaXNCaW5kaW5nOwotCi0vKioKLSAqIFdlYiBTZXJ2aWNlcyBCaW5kaW5nIEZhY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc1Rlc3RCaW5kaW5nRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VzVGVzdEJpbmRpbmdGYWN0b3J5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ21pc0JpbmRpbmcgY3JlYXRlQmluZGluZyhTdHJpbmcgdXJsLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewotICAgICAgICBib29sZWFuIGlzUHJlZml4ID0gdHJ1ZTsKLQotICAgICAgICB1cmwgPSB1cmwudHJpbSgpOwotICAgICAgICBTdHJpbmcgdXJsTG93ZXIgPSB1cmwudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCi0gICAgICAgIGlmICh1cmxMb3dlci5lbmRzV2l0aCgiP3dzZGwiKSkgewotICAgICAgICAgICAgaXNQcmVmaXggPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICh1cmxMb3dlci5lbmRzV2l0aCgiLndzZGwiKSkgewotICAgICAgICAgICAgaXNQcmVmaXggPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmICh1cmxMb3dlci5lbmRzV2l0aCgiLnhtbCIpKSB7Ci0gICAgICAgICAgICBpc1ByZWZpeCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHVybExvd2VyLmVuZHNXaXRoKCIuYXNweCIpKSB7Ci0gICAgICAgICAgICBpc1ByZWZpeCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHVybExvd2VyLmVuZHNXaXRoKCIvd3NkbCIpKSB7Ci0gICAgICAgICAgICBpc1ByZWZpeCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmcodXJsLCBpc1ByZWZpeCwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENtaXNCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoU3RyaW5nIHVybCwgYm9vbGVhbiBpc1ByZWZpeCwgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgLy8gZ2F0aGVyIHBhcmFtZXRlcnMKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgdXNlcm5hbWUpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCBwYXNzd29yZCk7Ci0KLSAgICAgICAgaWYgKCFpc1ByZWZpeCkgewotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX05BVklHQVRJT05fU0VSVklDRSwgdXJsKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfT0JKRUNUX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1ZFUlNJT05JTkdfU0VSVklDRSwgdXJsKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1JFTEFUSU9OU0hJUF9TRVJWSUNFLCB1cmwpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFLCB1cmwpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRSwgdXJsKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfQUNMX1NFUlZJQ0UsIHVybCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1JFUE9TSVRPUllfU0VSVklDRSwgdXJsICsgIlJlcG9zaXRvcnlTZXJ2aWNlP3dzZGwiKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTkFWSUdBVElPTl9TRVJWSUNFLCB1cmwgKyAiTmF2aWdhdGlvblNlcnZpY2U/d3NkbCIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRSwgdXJsICsgIk9iamVjdFNlcnZpY2U/d3NkbCIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0UsIHVybCArICJWZXJzaW9uaW5nU2VydmljZT93c2RsIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0RJU0NPVkVSWV9TRVJWSUNFLCB1cmwgKyAiRGlzY292ZXJ5U2VydmljZT93c2RsIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1JFTEFUSU9OU0hJUF9TRVJWSUNFLCB1cmwgKyAiUmVsYXRpb25zaGlwU2VydmljZT93c2RsIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX01VTFRJRklMSU5HX1NFUlZJQ0UsIHVybCArICJNdWx0aUZpbGluZ1NlcnZpY2U/d3NkbCIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRSwgdXJsICsgIlBvbGljeVNlcnZpY2U/d3NkbCIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19BQ0xfU0VSVklDRSwgdXJsICsgIkFDTFNlcnZpY2U/d3NkbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IGZhY3RvcnkgYW5kIGNyZWF0ZSBwcm92aWRlcgotICAgICAgICBDbWlzQmluZGluZ0ZhY3RvcnkgZmFjdG9yeSA9IENtaXNCaW5kaW5nRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBDbWlzQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzV2ViU2VydmljZXNCaW5kaW5nKHBhcmFtZXRlcnMpOwotCi0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyYzUxNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3Mvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jc2FtcGxlIGxvZzRqLnByb3BlcnRpZXMKLQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8KLQotIyBTdGRvdXQKLWxvZzRqLmFwcGVuZGVyLk89b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBGaWxlCi1sb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuUi5GaWxlPSR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2xvZzRqLmxvZwotCi0jIENvbnRyb2wgdGhlIG1heGltdW0gbG9nIGZpbGUgc2l6ZQotbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT0xMDBLQgotCi0jIEFyY2hpdmUgbG9nIGZpbGVzIChvbmUgYmFja3VwIGZpbGUgaGVyZSkKLWxvZzRqLmFwcGVuZGVyLlIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5PLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgWyV0XSAlYzogJW0lbgotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuCi0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGk9TwpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZDFjM2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIENsaWVudCBJbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4gIAotICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RmlsZT4ke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fS9NRVRBLUlORi9NQU5JRkVTVC5NRjwvbWFuaWZlc3RGaWxlPgotICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+IAotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2ZlbGl4LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmJ1bmRsZS1tYW5pZmVzdDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFuaWZlc3Q8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPiAgIAotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2UgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtRG9jVVJMPiR7cHJvamVjdC51cmx9PC9CdW5kbGUtRG9jVVJMPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1BY3RpdmF0b3I+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50Lm9zZ2kuQWN0aXZhdG9yPC9CdW5kbGUtQWN0aXZhdG9yPgotICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cGFjay1jbGllbnQtd2l0aC1kZXBzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF0dGFjaD50cnVlPC9hdHRhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvY2xpZW50LXdpdGgtZGVwZW5kZW5jaWVzLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1yaS1kZXBlbmRlbmNpZXMtYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLWN4Zi1kZXBlbmRlbmNpZXMtYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtvc2dpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIFN1biBSSSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQubWltZXB1bGw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5taW1lcHVsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWltZXB1bGwudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+IAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLndzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4d3MtcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pheHdzLXJ0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+IDwhLS0gaW5jbHVkZWQgaW4gSmF2YSA2IGFuZCBhYm92ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLnN0cmVhbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBpbmNsdWRlZCBpbiBKYXZhIDYgYW5kIGFib3ZlIC0tPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4JIAotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53c3R4LWFzbDwvYXJ0aWZhY3RJZD4JIAotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4JIAotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4JIAotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQ8L2dyb3VwSWQ+CSAKLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWltZXB1bGw8L2FydGlmYWN0SWQ+CSAKLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4JIAotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gQ1hGIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3hmPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3hmLXJ0LWZyb250ZW5kLWpheHdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjeGYudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jeGY8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jeGYtcnQtdHJhbnNwb3J0cy1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjeGYudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jeGY8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jeGYtcnQtd3MtcG9saWN5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjeGYudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gVGVzdCAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtsb2c0ai52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3NsZjRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgIGNhbGwgbXZuIHRlc3QgLURvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5zdWl0ZS5jb25maWcucGF0aD1teVNlcnZlci5wcm9wZXJ0aWVzIHRvCi0gICAgICAgICAgICAgICAgcnVuIHRlc3QgdXNpbmcgcHJvZmlsZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudGVzdC5jb25maWcucGF0aDwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LURvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS50ZXN0LmNvbmZpZy5wYXRoPSR7b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudGVzdC5jb25maWcucGF0aH08L2FyZ0xpbmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgRXh0ZW5kaW5nIHRoZSBkZWZhdWx0IC1QYXBhY2hlLXJlbGVhc2UgcHJvZmlsZSB1c2VkICpvbmx5KgotICAgICAgICAgICAgZHVyaW5nIHJlbGVhc2VzCi0gICAgICAgIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cGFjay1jbGllbnQtd2l0aC1kZXBzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF0dGFjaD50cnVlPC9hdHRhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLWRlcGVuZGVuY2llcy1hc3NlbWJseS54bWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1jeGYtZGVwZW5kZW5jaWVzLWFzc2VtYmx5LnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLWN4Zi1kZXBlbmRlbmNpZXMtYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGVhZmU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLWN4Zi1kZXBlbmRlbmNpZXMtYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLSAgICBUaGlzIGFzc2VtYmx5IGlzIGZvciBkZXZlbG9wbWVudCBvbmx5IGFuZCBzaG91bGQgbm90IGJlIHJlbGVhc2VkIQotLS0+Ci08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgICA8aWQ+d2l0aC1jeGYtZGVwZW5kZW5jaWVzPC9pZD4KLSAgICA8Zm9ybWF0cz4KLSAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgICA8L2Zvcm1hdHM+Ci0gICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD48L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgPHVzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+dHJ1ZTwvdXNlVHJhbnNpdGl2ZUZpbHRlcmluZz4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uc3VuLnhtbC53czpqYXh3cy1ydDwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgPCEtLSBsaWNlbnNlLCByZWFkbWUsIGV0Yy4gY2FsY3VsYXRlZCBhdCBidWlsZCB0aW1lIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLWRlcGVuZGVuY2llcy1hc3NlbWJseS1saWNlbnNlLnR4dCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLWRlcGVuZGVuY2llcy1hc3NlbWJseS1saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhNTk3ZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1kZXBlbmRlbmNpZXMtYXNzZW1ibHktbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBXb29kc3RveCAoaHR0cDovL3dvb2RzdG94LmNvZGVoYXVzLm9yZykKLSAgTGljZW5zZTogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQpCi0KLQotVGhpcyBjb3B5IG9mIFdvb2RzdG94IFhNTCBwcm9jZXNzb3IgaXMgbGljZW5zZWQgdW5kZXIgdGhlCi1BcGFjaGUgKFNvZnR3YXJlKSBMaWNlbnNlLCB2ZXJzaW9uIDIuMCAoInRoZSBMaWNlbnNlIikuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIGRldGFpbHMgYWJvdXQgZGlzdHJpYnV0aW9uIHJpZ2h0cywgYW5kIHRoZQotc3BlY2lmaWMgcmlnaHRzIHJlZ2FyZGluZyBkZXJpdmF0ZSB3b3Jrcy4KLQotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLUEgY29weSBpcyBhbHNvIGluY2x1ZGVkIHdpdGggYm90aCB0aGUgdGhlIGRvd25sb2FkYWJsZSBzb3VyY2UgY29kZSBwYWNrYWdlCi1hbmQgamFyIHRoYXQgY29udGFpbnMgY2xhc3MgYnl0ZWNvZGVzLCBhcyBmaWxlICJBU0wgMi4wIi4gSW4gYm90aCBjYXNlcywKLXRoYXQgZmlsZSBzaG91bGQgYmUgbG9jYXRlZCBuZXh0IHRvIHRoaXMgZmlsZTogaW4gc291cmNlIGRpc3RyaWJ1dGlvbgotdGhlIGxvY2F0aW9uIHNob3VsZCBiZSAicmVsZWFzZS1ub3Rlcy9hc2wiOyBhbmQgaW4gamFyICJNRVRBLUlORi8iCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gU3RheDIgQVBJIChodHRwOi8vd29vZHN0b3guY29kZWhhdXMub3JnL1N0QVgyKQotICBMaWNlbnNlOiBUaGUgQlNEIExpY2Vuc2UgIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKLQotCi1Db3B5cmlnaHQgKGMpIDIwMDQtMjAxMCwgV29vZHN0b3ggUHJvamVjdCAoaHR0cDovL3dvb2RzdG94LmNvZGVoYXVzLm9yZy8pCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0zLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXb29kc3RveCBYTUwgUHJvY2Vzc29yIG5vciB0aGUgbmFtZXMKLSAgIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi1MSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi1JTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBTdHJlYW1pbmcgQVBJIGZvciBYTUwgKGh0dHA6Ly9zdGF4LmNvZGVoYXVzLm9yZykKLSAgTGljZW5zZTogRHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyICAoaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sKQotCi0KLSAgICAgIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpCi0KLSAgICAgIDEuIERlZmluaXRpb25zLgotICAgICAgICAgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdAotICAgICAgICAgICAgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLSAgICAgICAgICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUKLSAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQotICAgICAgICAgICAgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICAgIHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi0gICAgICAgICAgICAxLjMuICJDb3ZlcmVkIFNvZnR3YXJlIiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvcgotICAgICAgICAgICAgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMKLSAgICAgICAgICAgIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nCi0gICAgICAgICAgICBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0gICAgICAgICAgICAxLjQuICJFeGVjdXRhYmxlIiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybQotICAgICAgICAgICAgb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4gCi0gICAgICAgICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5Ci0gICAgICAgICAgICB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzCi0gICAgICAgICAgICBMaWNlbnNlLiAKLSAgICAgICAgICAgIDEuNi4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZAotICAgICAgICAgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZQotICAgICAgICAgICAgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotICAgICAgICAgICAgMS43LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4KLSAgICAgICAgICAgIDEuOC4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZQotICAgICAgICAgICAgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwKLSAgICAgICAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cwotICAgICAgICAgICAgY29udmV5ZWQgaGVyZWluLgotICAgICAgICAgICAgMS45LiAiTW9kaWZpY2F0aW9ucyIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlCi0gICAgICAgICAgICBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgICAgICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLAotICAgICAgICAgICAgICAgICAgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEKLSAgICAgICAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cwotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uczsgCi0gICAgICAgICAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgCi0gICAgICAgICAgICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZQotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0gICAgICAgICAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQKLSAgICAgICAgICAgIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMKLSAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAKLSAgICAgICAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQKLSAgICAgICAgICAgIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwKLSAgICAgICAgICAgIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQKLSAgICAgICAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gCi0gICAgICAgICAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIKLSAgICAgICAgICAgIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpCi0gICAgICAgICAgICBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0gICAgICAgICAgICAxLjEzLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwKLSAgICAgICAgICAgIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZgotICAgICAgICAgICAgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIKLSAgICAgICAgICAgIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzCi0gICAgICAgICAgICB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMKLSAgICAgICAgICAgIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IKLSAgICAgICAgICAgIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAotICAgICAgICAgICAgZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcAotICAgICAgICAgICAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcwotICAgICAgICAgICAgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0gICAgICAyLiBMaWNlbnNlIEdyYW50cy4gCi0gICAgICAgICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4KLSAgICAgICAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kCi0gICAgICAgICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZQotICAgICAgICAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLAotICAgICAgICAgICAgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6IAotICAgICAgICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsCi0gICAgICAgICAgICAgICAgICB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLAotICAgICAgICAgICAgICAgICAgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsCi0gICAgICAgICAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgCi0gICAgICAgICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywKLSAgICAgICAgICAgICAgICAgIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUKLSAgICAgICAgICAgICAgICAgIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yCi0gICAgICAgICAgICAgICAgICBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKS4gCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikKLSAgICAgICAgICAgICAgICAgIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QKLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICBMaWNlbnNlLiAKLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudAotICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20KLSAgICAgICAgICAgICAgICAgIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvciBpbmZyaW5nZW1lbnRzCi0gICAgICAgICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgICAgICAgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgICAgICAgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLiAKLSAgICAgICAgICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAotICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoCi0gICAgICAgICAgICBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKLSAgICAgICAgICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLSAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCi0gICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvCi0gICAgICAgICAgICAgICAgICB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlCi0gICAgICAgICAgICAgICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2gKLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuCi0gICAgICAgICAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzCi0gICAgICAgICAgICAgICAgICBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsCi0gICAgICAgICAgICAgICAgICB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgICBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaAotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLAotICAgICAgICAgICAgICAgICAgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zCi0gICAgICAgICAgICAgICAgICB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24KLSAgICAgICAgICAgICAgICAgIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4gCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZAotICAgICAgICAgICAgICAgICAgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QKLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuIAotICAgICAgICAgICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50Ci0gICAgICAgICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvcgotICAgICAgICAgICAgICAgICAgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvcgotICAgICAgICAgICAgICAgICAgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSB0aGlyZCBwYXJ0eQotICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAgIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyCi0gICAgICAgICAgICAgICAgICBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZQotICAgICAgICAgICAgICAgICAgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4gCi0gICAgICAzLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0gICAgICAgICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLSAgICAgICAgICAgIEFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UKLSAgICAgICAgICAgIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZQotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbXVzdAotICAgICAgICAgICAgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUKLSAgICAgICAgICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3IKLSAgICAgICAgICAgIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55Ci0gICAgICAgICAgICBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbgotICAgICAgICAgICAgb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEKLSAgICAgICAgICAgIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZAotICAgICAgICAgICAgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotICAgICAgICAgICAgMy4yLiBNb2RpZmljYXRpb25zLgotICAgICAgICAgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdQotICAgICAgICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91Ci0gICAgICAgICAgICByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIKLSAgICAgICAgICAgIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0bwotICAgICAgICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0gICAgICAgICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuCi0gICAgICAgICAgICBZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zCi0gICAgICAgICAgICB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLgotICAgICAgICAgICAgWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvcgotICAgICAgICAgICAgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IKLSAgICAgICAgICAgIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcKLSAgICAgICAgICAgIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0gICAgICAgICAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi0gICAgICAgICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkCi0gICAgICAgICAgICBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUKLSAgICAgICAgICAgIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnCi0gICAgICAgICAgICByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhCi0gICAgICAgICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQotICAgICAgICAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLgotICAgICAgICAgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbgotICAgICAgICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQotICAgICAgICAgICAgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwKLSAgICAgICAgICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5Ci0gICAgICAgICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbAotICAgICAgICAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZAotICAgICAgICAgICAgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YKLSAgICAgICAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLSAgICAgICAgICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCi0gICAgICAgICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZAotICAgICAgICAgICAgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMKLSAgICAgICAgICAgIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMKLSAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluCi0gICAgICAgICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUKLSAgICAgICAgICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdAotICAgICAgICAgICAgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudCdzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybQotICAgICAgICAgICAgZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdQotICAgICAgICAgICAgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYQotICAgICAgICAgICAgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0Ci0gICAgICAgICAgICBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdQotICAgICAgICAgICAgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdQotICAgICAgICAgICAgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5Ci0gICAgICAgICAgICBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbAotICAgICAgICAgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMKLSAgICAgICAgICAgIFlvdSBvZmZlci4KLSAgICAgICAgICAgIDMuNi4gTGFyZ2VyIFdvcmtzLgotICAgICAgICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgICAgICAgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICAgICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaAotICAgICAgICAgICAgYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgICAgICAgIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiAKLSAgICAgIDQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLiAKLSAgICAgICAgICAgIDQuMS4gTmV3IFZlcnNpb25zLgotICAgICAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kCi0gICAgICAgICAgICBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICAgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQotICAgICAgICAgICAgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbgotICAgICAgICAgICAgU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZQotICAgICAgICAgICAgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4gCi0gICAgICAgICAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0gICAgICAgICAgICBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkCi0gICAgICAgICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEKLSAgICAgICAgICAgIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZwotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueQotICAgICAgICAgICAgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZAotICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAotICAgICAgICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0bwotICAgICAgICAgICAgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlCi0gICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlCi0gICAgICAgICAgICBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLiAKLSAgICAgICAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0gICAgICAgICAgICBXaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhCi0gICAgICAgICAgICBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kCi0gICAgICAgICAgICB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUKLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycwotICAgICAgICAgICAgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQKLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KLSAgICAgIDUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiCi0gICAgICBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELAotICAgICAgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRAotICAgICAgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSCi0gICAgICBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5ECi0gICAgICBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWQotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRQotICAgICAgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YKLSAgICAgIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GCi0gICAgICBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgotICAgICAgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMKLSAgICAgIERJU0NMQUlNRVIuIAotICAgICAgNi4gVEVSTUlOQVRJT04uIAotICAgICAgICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbAotICAgICAgICAgICAgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMKLSAgICAgICAgICAgIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mCi0gICAgICAgICAgICBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcgotICAgICAgICAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZgotICAgICAgICAgICAgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0gICAgICAgICAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcKLSAgICAgICAgICAgIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IKLSAgICAgICAgICAgIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0Ci0gICAgICAgICAgICB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKQotICAgICAgICAgICAgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlCi0gICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yCi0gICAgICAgICAgICBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZQotICAgICAgICAgICAgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueQotICAgICAgICAgICAgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yCi0gICAgICAgICAgICBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbAotICAgICAgICAgICAgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkKLSAgICAgICAgICAgIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMKLSAgICAgICAgICAgIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudAotICAgICAgICAgICAgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24KLSAgICAgICAgICAgIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkKLSAgICAgICAgICAgIHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgICAgICAgICBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyCi0gICAgICAgICAgICB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoCi0gICAgICAgICAgICBQYXJ0aWNpcGFudC4KLSAgICAgICAgICAgIDYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDYuMSBvciA2LjIKLSAgICAgICAgICAgIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkCi0gICAgICAgICAgICBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbgotICAgICAgICAgICAgKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpCi0gICAgICAgICAgICBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotICAgICAgNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0gICAgICBVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVAotICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUKLSAgICAgIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRgotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFCi0gICAgICBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUgotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUCi0gICAgICBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NUIFBST0ZJVFMsIExPU1MgT0YgR09PRFdJTEwsIFdPUksKLSAgICAgIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUgotICAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgotICAgICAgSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GCi0gICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwKLSAgICAgIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UCi0gICAgICBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8KLSAgICAgIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUgotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UCi0gICAgICBBUFBMWSBUTyBZT1UuCi0gICAgICA4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotICAgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzCi0gICAgICBkZWZpbmVkIGluIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAiY29tbWVyY2lhbAotICAgICAgY29tcHV0ZXIgc29mdHdhcmUiIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4g77+977+9Ci0gICAgICAyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZQotICAgICAgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LgotICAgICAgMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQotICAgICAgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycwotICAgICAgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KLSAgICAgIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsCi0gICAgICBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzCi0gICAgICBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0gICAgICA5LiBNSVNDRUxMQU5FT1VTLgotICAgICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QKLSAgICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUKLSAgICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlCi0gICAgICBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZQotICAgICAgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZQotICAgICAgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50Ci0gICAgICBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaAotICAgICAganVyaXNkaWN0aW9uJ3MgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uCi0gICAgICByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mCi0gICAgICB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEKLSAgICAgIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nCi0gICAgICBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydAotICAgICAgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlCi0gICAgICBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQotICAgICAgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcgotICAgICAgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsCi0gICAgICBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLgotICAgICAgWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQotICAgICAgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0Ci0gICAgICBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLAotICAgICAgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0gICAgICAxMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLSAgICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMKLSAgICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IKLSAgICAgIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZQotICAgICAgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0bwotICAgICAgZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZwotICAgICAgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24KLSAgICAgIG9mIGxpYWJpbGl0eS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBTTEY0SiBBUEkgTW9kdWxlIChodHRwOi8vd3d3LnNsZjRqLm9yZykKLSAgTGljZW5zZTogTUlUIExpY2Vuc2UgIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocCkKLQotCi1Db3B5cmlnaHQgKGMpIDIwMDQtMjAxMyBRT1MuY2gKLSBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSAgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotIGEgIGNvcHkgIG9mIHRoaXMgIHNvZnR3YXJlICBhbmQgIGFzc29jaWF0ZWQgIGRvY3VtZW50YXRpb24gZmlsZXMgICh0aGUKLSAiU29mdHdhcmUiKSwgdG8gIGRlYWwgaW4gIHRoZSBTb2Z0d2FyZSB3aXRob3V0ICByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0gd2l0aG91dCBsaW1pdGF0aW9uICB0aGUgcmlnaHRzIHRvICB1c2UsIGNvcHksIG1vZGlmeSwgIG1lcmdlLCBwdWJsaXNoLAotIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgY29waWVzIG9mICB0aGUgU29mdHdhcmUsICBhbmQgdG8KLSBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSAgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCi0gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIAotIFRoZSAgYWJvdmUgIGNvcHlyaWdodCAgbm90aWNlICBhbmQgIHRoaXMgcGVybWlzc2lvbiAgbm90aWNlICBzaGFsbCAgYmUKLSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAKLSBUSEUgIFNPRlRXQVJFIElTICBQUk9WSURFRCAgIkFTICBJUyIsIFdJVEhPVVQgIFdBUlJBTlRZICBPRiBBTlkgIEtJTkQsCi0gRVhQUkVTUyBPUiAgSU1QTElFRCwgSU5DTFVESU5HICBCVVQgTk9UIExJTUlURUQgIFRPIFRIRSAgV0FSUkFOVElFUyBPRgotIE1FUkNIQU5UQUJJTElUWSwgICAgRklUTkVTUyAgICBGT1IgICAgQSAgIFBBUlRJQ1VMQVIgICAgUFVSUE9TRSAgICBBTkQKLSBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLSBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vYXNzZW1ibHkvY2xpZW50LXdpdGgtZGVwZW5kZW5jaWVzLWFzc2VtYmx5LW5vdGljZS50eHQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1kZXBlbmRlbmNpZXMtYXNzZW1ibHktbm90aWNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMTFlNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1kZXBlbmRlbmNpZXMtYXNzZW1ibHktbm90aWNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotT3BlbkNNSVMgQ2xpZW50IEltcGxlbWVudGF0aW9uICh3aXRoIGRlcGVuZGVuY2llcykKLUNvcHlyaWdodCAyMDA5LTIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQotT3BlbkNNSVMgY29udGFpbnMgY29kZSBmcm9tIHRoZSBmb2xsb3dpbmcgT3BlbiBTb3VyY2UgcHJvamVjdHM6Ci0KLS0gQmFzZTY0IAotICBDb3B5cmlnaHQgKGMpIDIwMTAgUm9iZXJ0IEhhcmRlcgotICBQdWJsaWMgRG9tYWluLCA8aHR0cDovL2loYXJkZXIubmV0L2Jhc2U2ND4KLQotLSBKU09OLnNpbXBsZQotICBDb3B5cmlnaHQgKGMpIDIwMTIgWWlkb25nIEZhbmcKLSAgQXBhY2hlIExpY2Vuc2UgMi4wLCA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2ltcGxlLz4KLSAgCi0gIAotT3BlbkNNSVMgY29udGFpbnMgT0FTSVMgQ01JUyAxLjAgYW5kIENNSVMgMS4xIHNjaGVtYSBhbmQgV1NETCBmaWxlcy4KLUNvcHlyaWdodCAoYykgMjAxMCBhbmQgMjAxMyBPQVNJUyBPcGVuCi08aHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9jbWlzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vYXNzZW1ibHkvY2xpZW50LXdpdGgtZGVwZW5kZW5jaWVzLWFzc2VtYmx5LnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLWRlcGVuZGVuY2llcy1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOWRiNDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vYXNzZW1ibHkvY2xpZW50LXdpdGgtZGVwZW5kZW5jaWVzLWFzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgICA8aWQ+d2l0aC1kZXBlbmRlbmNpZXM8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PjwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgICA8ZmlsZXM+Ci0gICAgICAgIDxmaWxlPgotICAgICAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1kZXBlbmRlbmNpZXMtYXNzZW1ibHktbGljZW5zZS50eHQ8L3NvdXJjZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGRlc3ROYW1lPkxJQ0VOU0U8L2Rlc3ROYW1lPgotICAgICAgICA8L2ZpbGU+Ci0gICAgICAgIDxmaWxlPgotICAgICAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1kZXBlbmRlbmNpZXMtYXNzZW1ibHktbm90aWNlLnR4dDwvc291cmNlPgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8ZGVzdE5hbWU+Tk9USUNFPC9kZXN0TmFtZT4KLSAgICAgICAgPC9maWxlPgotICAgIDwvZmlsZXM+Ci0gICAgPGZpbGVTZXRzPgotICAgICAgICA8IS0tIGxpY2Vuc2UsIHJlYWRtZSwgZXRjLiBjYWxjdWxhdGVkIGF0IGJ1aWxkIHRpbWUgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMvTUVUQS1JTkY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPkxJQ0VOU0U8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Tk9USUNFPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLXJpLWRlcGVuZGVuY2llcy1hc3NlbWJseS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9hc3NlbWJseS9jbGllbnQtd2l0aC1yaS1kZXBlbmRlbmNpZXMtYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU2MzdjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2Fzc2VtYmx5L2NsaWVudC13aXRoLXJpLWRlcGVuZGVuY2llcy1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotICAgIFRoaXMgYXNzZW1ibHkgaXMgZm9yIGRldmVsb3BtZW50IG9ubHkgYW5kIHNob3VsZCBub3QgYmUgcmVsZWFzZWQhCi0tLT4KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICAgIDxpZD53aXRoLXJpLWRlcGVuZGVuY2llczwvaWQ+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gICAgPGRlcGVuZGVuY3lTZXRzPgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PjwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5jeGY8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgICA8ZmlsZVNldHM+Ci0gICAgICAgIDwhLS0gbGljZW5zZSwgcmVhZG1lLCBldGMuIGNhbGN1bGF0ZWQgYXQgYnVpbGQgdGltZSAtLT4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9vc2dpL0FjdGl2YXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvb3NnaS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxNmRjOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9vc2dpL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5vc2dpOwotCi1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuU2Vzc2lvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKLQotLyoqCi0gKiBPU0dpIEJ1bmRsZSBhY3RpdmF0b3IgZm9yIHRoZSBPcGVuQ01JUyBjbGllbnQgd2hpY2ggcmVnaXN0ZXJzIGFuIGluc3RhbmNlIG9mCi0gKiB0aGUge0BsaW5rIFNlc3Npb25GYWN0b3J5fSBpbiB0aGUgT1NHaSBzZXJ2aWNlIHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyByZWdpc3RlciB0aGUgTWV0YVR5cGVTZXJ2aWNlIG5vdywgdGhhdCB3ZSBhcmUgcmVhZHkKLSAgICAgICAgRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gcHJvcHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sICJBcGFjaGUgQ2hlbWlzdHJ5IE9wZW5DTUlTIENsaWVudCBTZXNzaW9uIEZhY3RvcnkiKTsKLSAgICAgICAgcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1ZFTkRPUiwgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIik7Ci0KLSAgICAgICAgU2Vzc2lvbkZhY3Rvcnkgc2Vzc2lvbkZhY3RvcnkgPSBTZXNzaW9uRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclNlcnZpY2UoU2Vzc2lvbkZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBzZXNzaW9uRmFjdG9yeSwgcHJvcHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIFRoZSBTZXNzaW9uRmFjdG9yeSBzZXJ2aWNlIHdpbGwgYmUgdW5yZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0Fic3RyYWN0Q21pc09iamVjdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9BYnN0cmFjdENtaXNPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2MWY3MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0Fic3RyYWN0Q21pc09iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTnVsbE9yRW1wdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVuZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vjb25kYXJ5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5FeHRlbnNpb25MZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIHBlcnNpc3RlbnQgc2Vzc2lvbiBvYmplY3QgaW1wbCBjbGFzc2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbWlzT2JqZWN0IGltcGxlbWVudHMgQ21pc09iamVjdCwgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTZXNzaW9uSW1wbCBzZXNzaW9uOwotICAgIHByaXZhdGUgT2JqZWN0VHlwZSBvYmplY3RUeXBlOwotICAgIHByaXZhdGUgTGlzdDxTZWNvbmRhcnlUeXBlPiBzZWNvbmRhcnlUeXBlczsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5PD8+PiBwcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zOwotICAgIHByaXZhdGUgTGlzdDxSZW5kaXRpb24+IHJlbmRpdGlvbnM7Ci0gICAgcHJpdmF0ZSBBY2wgYWNsOwotICAgIHByaXZhdGUgTGlzdDxQb2xpY3k+IHBvbGljaWVzOwotICAgIHByaXZhdGUgTGlzdDxSZWxhdGlvbnNoaXA+IHJlbGF0aW9uc2hpcHM7Ci0gICAgcHJpdmF0ZSBNYXA8RXh0ZW5zaW9uTGV2ZWwsIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+PiBleHRlbnNpb25zOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBsb25nIHJlZnJlc2hUaW1lc3RhbXA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoU2Vzc2lvbkltcGwgc2Vzc2lvbiwgT2JqZWN0VHlwZSBvYmplY3RUeXBlLCBPYmplY3REYXRhIG9iamVjdERhdGEsCi0gICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmplY3RUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCB0eXBlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvYmplY3RUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSA9PSBudWxsKSB8fCBvYmplY3RUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCkgPCA5KSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IHRoZSA5IHN0YW5kYXJkIHByb3BlcnRpZXMgdGhhdCBhbGwgb2JqZWN0cwotICAgICAgICAgICAgLy8gaGF2ZQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IHR5cGUgbXVzdCBoYXZlIHByb3BlcnR5IGRlZmluaXRpb25zISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgdGhpcy5vYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLSAgICAgICAgdGhpcy5zZWNvbmRhcnlUeXBlcyA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IG5ldyBFbnVtTWFwPEV4dGVuc2lvbkxldmVsLCBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50Pj4oRXh0ZW5zaW9uTGV2ZWwuY2xhc3MpOwotICAgICAgICB0aGlzLmNyZWF0aW9uQ29udGV4dCA9IG5ldyBPcGVyYXRpb25Db250ZXh0SW1wbChjb250ZXh0KTsKLSAgICAgICAgdGhpcy5yZWZyZXNoVGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBvZiA9IGdldE9iamVjdEZhY3RvcnkoKTsKLQotICAgICAgICBpZiAob2JqZWN0RGF0YSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBpZiAob2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHNlY29uZGFyeSB0eXBlcwotICAgICAgICAgICAgICAgIGlmIChvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgb2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc0tleShQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKSkgewotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHN0aWRzID0gKExpc3Q8U3RyaW5nPikgb2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoc3RpZHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U2Vjb25kYXJ5VHlwZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHN0aWQgOiBzdGlkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihzdGlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBTZWNvbmRhcnlUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlUeXBlcy5hZGQoKFNlY29uZGFyeVR5cGUpIHR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gb2YuY29udmVydFByb3BlcnRpZXMob2JqZWN0VHlwZSwgc2Vjb25kYXJ5VHlwZXMsIG9iamVjdERhdGEuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zLnB1dChFeHRlbnNpb25MZXZlbC5QUk9QRVJUSUVTLCBvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKS5nZXRFeHRlbnNpb25zKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoYW5kbGUgYWxsb3dhYmxlIGFjdGlvbnMKLSAgICAgICAgICAgIGlmIChvYmplY3REYXRhLmdldEFsbG93YWJsZUFjdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5hbGxvd2FibGVBY3Rpb25zID0gb2JqZWN0RGF0YS5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5wdXQoRXh0ZW5zaW9uTGV2ZWwuQUxMT1dBQkxFX0FDVElPTlMsIG9iamVjdERhdGEuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSByZW5kaXRpb25zCi0gICAgICAgICAgICBpZiAob2JqZWN0RGF0YS5nZXRSZW5kaXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMucmVuZGl0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UmVuZGl0aW9uPigpOwotICAgICAgICAgICAgICAgIGZvciAoUmVuZGl0aW9uRGF0YSByZCA6IG9iamVjdERhdGEuZ2V0UmVuZGl0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGl0aW9ucy5hZGQob2YuY29udmVydFJlbmRpdGlvbihnZXRJZCgpLCByZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaGFuZGxlIEFDTAotICAgICAgICAgICAgaWYgKG9iamVjdERhdGEuZ2V0QWNsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjbCA9IG9iamVjdERhdGEuZ2V0QWNsKCk7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5wdXQoRXh0ZW5zaW9uTGV2ZWwuQUNMLCBvYmplY3REYXRhLmdldEFjbCgpLmdldEV4dGVuc2lvbnMoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0RGF0YS5pc0V4YWN0QWNsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY2wgb2JqZWN0QWNsID0gb2JqZWN0RGF0YS5nZXRBY2woKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQm9vbGVhbiBpc0V4YWN0ID0gb2JqZWN0RGF0YS5pc0V4YWN0QWNsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjbCA9IG5ldyBBY2woKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9ucyhMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBleHRlbnNpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0QWNsLnNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGdldEV4dGVuc2lvbnMoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdEFjbC5nZXRFeHRlbnNpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gaXNFeGFjdCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFeGFjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTGlzdDxBY2U+IGdldEFjZXMoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdEFjbC5nZXRBY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoYW5kbGUgcG9saWNpZXMKLSAgICAgICAgICAgIGlmICgob2JqZWN0RGF0YS5nZXRQb2xpY3lJZHMoKSAhPSBudWxsKSAmJiAob2JqZWN0RGF0YS5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHBvbGljaWVzID0gbmV3IEFycmF5TGlzdDxQb2xpY3k+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGlkIDogb2JqZWN0RGF0YS5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBDbWlzT2JqZWN0IHBvbGljeSA9IHNlc3Npb24uZ2V0T2JqZWN0KHBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3kgaW5zdGFuY2VvZiBQb2xpY3kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljaWVzLmFkZCgoUG9saWN5KSBwb2xpY3kpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMucHV0KEV4dGVuc2lvbkxldmVsLlBPTElDSUVTLCBvYmplY3REYXRhLmdldFBvbGljeUlkcygpLmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSByZWxhdGlvbnNoaXBzCi0gICAgICAgICAgICBpZiAob2JqZWN0RGF0YS5nZXRSZWxhdGlvbnNoaXBzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aW9uc2hpcD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgcm9kIDogb2JqZWN0RGF0YS5nZXRSZWxhdGlvbnNoaXBzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ21pc09iamVjdCByZWxhdGlvbnNoaXAgPSBvZi5jb252ZXJ0T2JqZWN0KHJvZCwgdGhpcy5jcmVhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFkZCgoUmVsYXRpb25zaGlwKSByZWxhdGlvbnNoaXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleHRlbnNpb25zLnB1dChFeHRlbnNpb25MZXZlbC5PQkpFQ1QsIG9iamVjdERhdGEuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWNxdWlyZXMgYSB3cml0ZSBsb2NrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlTG9jaygpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgYSB3cml0ZSBsb2NrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlVW5sb2NrKCkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjcXVpcmVzIGEgcmVhZCBsb2NrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRMb2NrKCkgewotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbGVhc2VzIGEgcmVhZCBsb2NrLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHJlYWRVbmxvY2soKSB7Ci0gICAgICAgIGxvY2sucmVhZExvY2soKS51bmxvY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU2Vzc2lvbkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBpZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcG9zaXRvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKS5nZXRSZXBvc2l0b3J5SWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgdHlwZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0VHlwZSBnZXRPYmplY3RUeXBlKCkgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdFR5cGU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0JpbmRpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKS5nZXRCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGZhY3RvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdEZhY3RvcnkgZ2V0T2JqZWN0RmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKS5nZXRPYmplY3RGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBvYmplY3Qgb3IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaWQgaXMKLSAgICAgKiB1bmtub3duLgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T2JqZWN0SWQoKSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldElkKCk7Ci0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPYmplY3QgSWQgaXMgdW5rbm93biEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmplY3RJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgT3BlcmF0aW9uQ29udGV4dH0gdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9wZXJhdGlvbkNvbnRleHQgZ2V0Q3JlYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gY3JlYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHF1ZXJ5IG5hbWUgb2YgYSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5UXVlcnlOYW1lKFN0cmluZyBwcm9wZXJ0eUlkKSB7Ci0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IG9iamVjdFR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChwcm9wZXJ0eUlkKTsKLSAgICAgICAgICAgIGlmIChwcm9wRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3BEZWYuZ2V0UXVlcnlOYW1lKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gZGVsZXRlIC0tLQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKCkgewotICAgICAgICBkZWxldGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKGJvb2xlYW4gYWxsVmVyc2lvbnMpIHsKLSAgICAgICAgcmVhZExvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFNlc3Npb24oKS5kZWxldGUodGhpcywgYWxsVmVyc2lvbnMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZFVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tIHVwZGF0ZSBwcm9wZXJ0aWVzIC0tLQotCi0gICAgcHVibGljIENtaXNPYmplY3QgdXBkYXRlUHJvcGVydGllcyhNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIE9iamVjdElkIG9iamVjdElkID0gdXBkYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzLCB0cnVlKTsKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFnZXRPYmplY3RJZCgpLmVxdWFscyhvYmplY3RJZC5nZXRJZCgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKS5nZXRPYmplY3Qob2JqZWN0SWQsIGdldENyZWF0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCB1cGRhdGVQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIGJvb2xlYW4gcmVmcmVzaCkgewotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwcm9wZXJ0aWVzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydGllcyBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4ob2JqZWN0SWQpOwotCi0gICAgICAgICAgICBTdHJpbmcgY2hhbmdlVG9rZW4gPSBnZXRDaGFuZ2VUb2tlbigpOwotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW5Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pOwotCi0gICAgICAgICAgICBTZXQ8VXBkYXRhYmlsaXR5PiB1cGRhdGViaWxpdHkgPSBFbnVtU2V0Lm5vbmVPZihVcGRhdGFiaWxpdHkuY2xhc3MpOwotICAgICAgICAgICAgdXBkYXRlYmlsaXR5LmFkZChVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgY2hlY2tlZCBvdXQKLSAgICAgICAgICAgIEJvb2xlYW4gaXNDaGVja2VkT3V0ID0gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCk7Ci0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhpc0NoZWNrZWRPdXQpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlYmlsaXR5LmFkZChVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpdCdzIHRpbWUgdG8gdXBkYXRlCi0gICAgICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLnVwZGF0ZVByb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgICAgIGdldFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgICAgICBvYmplY3RJZEhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG9rZW5Ib2xkZXIsCi0gICAgICAgICAgICAgICAgICAgIGdldE9iamVjdEZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb252ZXJ0UHJvcGVydGllcyhwcm9wZXJ0aWVzLCB0aGlzLm9iamVjdFR5cGUsIHRoaXMuc2Vjb25kYXJ5VHlwZXMsIHVwZGF0ZWJpbGl0eSksIG51bGwpOwotCi0gICAgICAgICAgICBuZXdPYmplY3RJZCA9IG9iamVjdElkSG9sZGVyLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGNhY2hlLCBpdCBoYXMgYmVlbiBjaGFuZ2VkCi0gICAgICAgICAgICBnZXRTZXNzaW9uKCkucmVtb3ZlT2JqZWN0RnJvbUNhY2hlKG9iamVjdElkKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWZyZXNoKSB7Ci0gICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3T2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmNyZWF0ZU9iamVjdElkKG5ld09iamVjdElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdCByZW5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLSAgICAgICAgaWYgKG5ld05hbWUgPT0gbnVsbCB8fCBuZXdOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5ldyBuYW1lIG11c3Qgbm90IGJlIGVtcHR5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3AucHV0KFByb3BlcnR5SWRzLk5BTUUsIG5ld05hbWUpOwotCi0gICAgICAgIHJldHVybiB1cGRhdGVQcm9wZXJ0aWVzKHByb3ApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCByZW5hbWUoU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gcmVmcmVzaCkgewotICAgICAgICBpZiAobmV3TmFtZSA9PSBudWxsIHx8IG5ld05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmV3IG5hbWUgbXVzdCBub3QgYmUgZW1wdHkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3AgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcC5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmV3TmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHVwZGF0ZVByb3BlcnRpZXMocHJvcCwgcmVmcmVzaCk7Ci0gICAgfQotCi0gICAgLy8gLS0tIHByb3BlcnRpZXMgLS0tCi0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZSBnZXRCYXNlVHlwZSgpIHsKLSAgICAgICAgQmFzZVR5cGVJZCBiYXNlVHlwZUlkID0gZ2V0QmFzZVR5cGVJZCgpOwotICAgICAgICBpZiAoYmFzZVR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuZ2V0VHlwZURlZmluaXRpb24oYmFzZVR5cGVJZC52YWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmFzZVR5cGVJZCBnZXRCYXNlVHlwZUlkKCkgewotICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRCk7Ci0gICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBCYXNlVHlwZUlkLmZyb21WYWx1ZShiYXNlVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFuZ2VUb2tlbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENyZWF0ZWRCeSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSk7Ci0gICAgfQotCi0gICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyIGdldENyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE1vZGlmaWVkQnkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuREVTQ1JJUFRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5PD8+PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDxQcm9wZXJ0eTw/Pj4odGhpcy5wcm9wZXJ0aWVzLnZhbHVlcygpKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgPFQ+IFByb3BlcnR5PFQ+IGdldFByb3BlcnR5KFN0cmluZyBpZCkgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChQcm9wZXJ0eTxUPikgdGhpcy5wcm9wZXJ0aWVzLmdldChpZCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgaWQpIHsKLSAgICAgICAgUHJvcGVydHk8VD4gcHJvcGVydHkgPSBnZXRQcm9wZXJ0eShpZCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBleHBsaWNpdCBjYXN0IG5lZWRlZCBieSB0aGUgU3VuIGNvbXBpbGVyCi0gICAgICAgIHJldHVybiAoVCkgcHJvcGVydHkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFNlY29uZGFyeVR5cGU+IGdldFNlY29uZGFyeVR5cGVzKCkgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kYXJ5VHlwZXM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RUeXBlPiBmaW5kT2JqZWN0VHlwZShTdHJpbmcgaWQpIHsKLSAgICAgICAgTGlzdDxPYmplY3RUeXBlPiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuY29udGFpbnNLZXkoaWQpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RUeXBlPigpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQob2JqZWN0VHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUeXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTZWNvbmRhcnlUeXBlIHNlY29uZGFyeVR5cGUgOiBzZWNvbmRhcnlUeXBlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlY29uZGFyeVR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmNvbnRhaW5zS2V5KGlkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RUeXBlPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzZWNvbmRhcnlUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tIGFsbG93YWJsZSBhY3Rpb25zIC0tLQotCi0gICAgcHVibGljIEFsbG93YWJsZUFjdGlvbnMgZ2V0QWxsb3dhYmxlQWN0aW9ucygpIHsKLSAgICAgICAgcmVhZExvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmFsbG93YWJsZUFjdGlvbnM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uIGFjdGlvbikgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFjdGlvbiBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFsbG93YWJsZUFjdGlvbnMgY3VycmVudEFsbG93YWJsZUFjdGlvbnMgPSBnZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgICAgIGlmIChjdXJyZW50QWxsb3dhYmxlQWN0aW9ucyA9PSBudWxsIHx8IGN1cnJlbnRBbGxvd2FibGVBY3Rpb25zLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBbGxvd2FibGUgQWN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjdXJyZW50QWxsb3dhYmxlQWN0aW9ucy5nZXRBbGxvd2FibGVBY3Rpb25zKCkuY29udGFpbnMoYWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gcmVuZGl0aW9ucyAtLS0KLQotICAgIHB1YmxpYyBMaXN0PFJlbmRpdGlvbj4gZ2V0UmVuZGl0aW9ucygpIHsKLSAgICAgICAgcmVhZExvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRpdGlvbnM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gQUNMIC0tLQotCi0gICAgcHVibGljIEFjbCBnZXRBY2woYm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucykgewotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICByZXR1cm4gZ2V0QmluZGluZygpLmdldEFjbFNlcnZpY2UoKS5nZXRBY2woZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBhcHBseUFjbChMaXN0PEFjZT4gYWRkQWNlcywgTGlzdDxBY2U+IHJlbW92ZUFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKSB7Ci0gICAgICAgIEFjbCByZXN1bHQgPSBnZXRTZXNzaW9uKCkuYXBwbHlBY2wodGhpcywgYWRkQWNlcywgcmVtb3ZlQWNlcywgYWNsUHJvcGFnYXRpb24pOwotCi0gICAgICAgIHJlZnJlc2goKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgYWRkQWNsKExpc3Q8QWNlPiBhZGRBY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbikgewotICAgICAgICByZXR1cm4gYXBwbHlBY2woYWRkQWNlcywgbnVsbCwgYWNsUHJvcGFnYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgcmVtb3ZlQWNsKExpc3Q8QWNlPiByZW1vdmVBY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbikgewotICAgICAgICByZXR1cm4gYXBwbHlBY2wobnVsbCwgcmVtb3ZlQWNlcywgYWNsUHJvcGFnYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgc2V0QWNsKExpc3Q8QWNlPiBhY2VzKSB7Ci0gICAgICAgIEFjbCByZXN1bHQgPSBnZXRTZXNzaW9uKCkuc2V0QWNsKHRoaXMsIGFjZXMpOwotCi0gICAgICAgIHJlZnJlc2goKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKCkgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNsOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZFVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldFBlcm1pc3Npb25zRm9yUHJpbmNpcGFsKFN0cmluZyBwcmluY2lwYWxJZCkgewotICAgICAgICBpZiAocHJpbmNpcGFsSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJpbmNpcGFsIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQWNsIGN1cnJlbnRBY2wgPSBnZXRBY2woKTsKLQotICAgICAgICBpZiAoY3VycmVudEFjbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBQ0xzIGFyZSBub3QgYXZhaWxhYmxlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoYWNsLmdldEFjZXMoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSGFzaFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgICAgICBmb3IgKEFjZSBhY2UgOiBhY2wuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICBpZiAocHJpbmNpcGFsSWQuZXF1YWxzKGFjZS5nZXRQcmluY2lwYWxJZCgpKSAmJiBhY2UuZ2V0UGVybWlzc2lvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChhY2UuZ2V0UGVybWlzc2lvbnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQZXJtaXNzb25zRm9yUHJpbmNpcGFsKFN0cmluZyBwcmluY2lwYWxJZCkgewotICAgICAgICByZXR1cm4gZ2V0UGVybWlzc2lvbnNGb3JQcmluY2lwYWwocHJpbmNpcGFsSWQpOwotICAgIH0KLQotICAgIC8vIC0tLSBwb2xpY2llcyAtLS0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KE9iamVjdElkLi4uIHBvbGljeUlkcykgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLmFwcGx5UG9saWN5KHRoaXMsIHBvbGljeUlkcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KE9iamVjdElkLi4uIHBvbGljeUlkcykgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2Vzc2lvbigpLnJlbW92ZVBvbGljeSh0aGlzLCBwb2xpY3lJZHMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZFVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBvbGljeT4gZ2V0UG9saWNpZXMoKSB7Ci0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wb2xpY2llczsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSByZWxhdGlvbnNoaXBzIC0tLQotCi0gICAgcHVibGljIExpc3Q8UmVsYXRpb25zaGlwPiBnZXRSZWxhdGlvbnNoaXBzKCkgewotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwczsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBleHRlbnNpb25zIC0tLQotCi0gICAgcHVibGljIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGdldEV4dGVuc2lvbnMoRXh0ZW5zaW9uTGV2ZWwgbGV2ZWwpIHsKLSAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ID0gZXh0ZW5zaW9ucy5nZXQobGV2ZWwpOwotICAgICAgICBpZiAoZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZXh0KTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gYWRhcHRlcnMgLS0tCi0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0QWRhcHRlcihDbGFzczxUPiBhZGFwdGVySW50ZXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8vIC0tLSBvdGhlciAtLS0KLQotICAgIHB1YmxpYyBsb25nIGdldFJlZnJlc2hUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoVGltZXN0YW1wOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZFVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgd3JpdGVMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotCi0gICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9jID0gZ2V0Q3JlYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgbGF0ZXN0IGRhdGEgZnJvbSB0aGUgcmVwb3NpdG9yeQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3REYXRhID0gZ2V0U2Vzc2lvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRCaW5kaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldE9iamVjdFNlcnZpY2UoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0T2JqZWN0KGdldFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwgb2MuZ2V0RmlsdGVyU3RyaW5nKCksIG9jLmlzSW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYy5nZXRJbmNsdWRlUmVsYXRpb25zaGlwcygpLCBvYy5nZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoKSwgb2MuaXNJbmNsdWRlUG9saWNpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYy5pc0luY2x1ZGVBY2xzKCksIG51bGwpOwotCi0gICAgICAgICAgICAvLyByZXNldCB0aGlzIG9iamVjdAotICAgICAgICAgICAgaW5pdGlhbGl6ZShzZXNzaW9uLCBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKG9iamVjdFR5cGUuZ2V0SWQoKSksIG9iamVjdERhdGEsIGNyZWF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3cml0ZVVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaElmT2xkKGxvbmcgZHVyYXRpb25Jbk1pbGxpcykgewotICAgICAgICB3cml0ZUxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lc3RhbXAgPCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGR1cmF0aW9uSW5NaWxsaXMpIHsKLSAgICAgICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3cml0ZVVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmVhZExvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChvYmplY3RUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjx1bmtub3duPiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3RUeXBlLmdldEJhc2VUeXBlSWQoKSArICIgKCIgKyBvYmplY3RUeXBlLmdldElkKCkgKyAiKTogIiArIGdldElkKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0Fic3RyYWN0RmlsYWJsZUNtaXNPYmplY3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQWJzdHJhY3RGaWxhYmxlQ21pc09iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQxYTQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQWJzdHJhY3RGaWxhYmxlQ21pc09iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5GaWxlYWJsZUNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgZmlsYWJsZSBwZXJzaXN0ZW50IHNlc3Npb24gb2JqZWN0IGltcGwgY2xhc3Nlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RmlsYWJsZUNtaXNPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdENtaXNPYmplY3QgaW1wbGVtZW50cyBGaWxlYWJsZUNtaXNPYmplY3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgTGlzdDxGb2xkZXI+IGdldFBhcmVudHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQYXJlbnRzKGdldFNlc3Npb24oKS5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxGb2xkZXI+IGdldFBhcmVudHMoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldE9iamVjdElkKCk7Ci0KLSAgICAgICAgLy8gZ2V0IG9iamVjdCBpZHMgb2YgdGhlIHBhcmVudCBmb2xkZXJzCi0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gYmluZGluZ1BhcmVudHMgPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRPYmplY3RQYXJlbnRzKGdldFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgIG9iamVjdElkLCBnZXRQcm9wZXJ0eVF1ZXJ5TmFtZShQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgTGlzdDxGb2xkZXI+IHBhcmVudHMgPSBuZXcgQXJyYXlMaXN0PEZvbGRlcj4oKTsKLQotICAgICAgICBmb3IgKE9iamVjdFBhcmVudERhdGEgcCA6IGJpbmRpbmdQYXJlbnRzKSB7Ci0gICAgICAgICAgICBpZiAoKHAgPT0gbnVsbCkgfHwgKHAuZ2V0T2JqZWN0KCkgPT0gbnVsbCkgfHwgKHAuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4uLi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlJlcG9zaXRvcnkgc2VudCBpbnZhbGlkIGRhdGEhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCBpZCBwcm9wZXJ0eQotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IGlkUHJvcGVydHkgPSBwLmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgICAgICBpZiAoIShpZFByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlJZCkgJiYgIShpZFByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHJlcG9zaXRvcnkgc2VudCBhbiBvYmplY3Qgd2l0aG91dCBhIHZhbGlkIG9iamVjdCBpZC4uLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUmVwb3NpdG9yeSBzZW50IGludmFsaWQgZGF0YSEgTm8gb2JqZWN0IGlkISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmZXRjaCB0aGUgb2JqZWN0IGFuZCBtYWtlIHN1cmUgaXQgaXMgYSBmb2xkZXIKLSAgICAgICAgICAgIENtaXNPYmplY3QgcGFyZW50Rm9sZGVyID0gZ2V0U2Vzc2lvbigpLmdldE9iamVjdCgoU3RyaW5nKSBpZFByb3BlcnR5LmdldEZpcnN0VmFsdWUoKSwgY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoIShwYXJlbnRGb2xkZXIgaW5zdGFuY2VvZiBGb2xkZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHJlcG9zaXRvcnkgc2VudCBhbiBvYmplY3QgdGhhdCBpcyBub3QgYSBmb2xkZXIuLi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlJlcG9zaXRvcnkgc2VudCBpbnZhbGlkIGRhdGEhIE9iamVjdCBpcyBub3QgYSBmb2xkZXIhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhcmVudHMuYWRkKChGb2xkZXIpIHBhcmVudEZvbGRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhdGhzKCkgewotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotCi0gICAgICAgIE9iamVjdFR5cGUgZm9sZGVyVHlwZSA9IGdldFNlc3Npb24oKS5nZXRUeXBlRGVmaW5pdGlvbihCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpOwotICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IGZvbGRlclR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChQcm9wZXJ0eUlkcy5QQVRIKTsKLSAgICAgICAgU3RyaW5nIHBhdGhRdWVyeU5hbWUgPSAocHJvcERlZiA9PSBudWxsID8gbnVsbCA6IHByb3BEZWYuZ2V0UXVlcnlOYW1lKCkpOwotCi0gICAgICAgIC8vIGdldCBvYmplY3QgcGF0aHMgb2YgdGhlIHBhcmVudCBmb2xkZXJzCi0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gYmluZGluZ1BhcmVudHMgPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKS5nZXRPYmplY3RQYXJlbnRzKGdldFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgIG9iamVjdElkLCBwYXRoUXVlcnlOYW1lLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3RQYXJlbnREYXRhIHAgOiBiaW5kaW5nUGFyZW50cykgewotICAgICAgICAgICAgaWYgKChwID09IG51bGwpIHx8IChwLmdldE9iamVjdCgpID09IG51bGwpIHx8IChwLmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuLi4uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJSZXBvc2l0b3J5IHNlbnQgaW52YWxpZCBkYXRhISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgcGF0aCBwcm9wZXJ0eQotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBhdGhQcm9wZXJ0eSA9IHAuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuUEFUSCk7Ci0gICAgICAgICAgICBpZiAoIShwYXRoUHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgcmVwb3NpdG9yeSBzZW50IGEgZm9sZGVyIHdpdGhvdXQgYSB2YWxpZCBwYXRoLi4uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJSZXBvc2l0b3J5IHNlbnQgaW52YWxpZCBkYXRhISBObyBwYXRoIHByb3BlcnR5ISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocC5nZXRSZWxhdGl2ZVBhdGhTZWdtZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRoZSByZXBvc2l0b3J5IGRpZG4ndCBzZW5kIGEgcmVsYXRpdmUgcGF0aCBzZWdtZW50Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJSZXBvc2l0b3J5IHNlbnQgaW52YWxpZCBkYXRhISBObyByZWxhdGl2ZSBwYXRoIHNlZ2VtZW50ISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVyUGF0aCA9ICgoU3RyaW5nKSBwYXRoUHJvcGVydHkuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgIHBhdGhzLmFkZChmb2xkZXJQYXRoICsgKGZvbGRlclBhdGguZW5kc1dpdGgoIi8iKSA/ICIiIDogIi8iKSArIHAuZ2V0UmVsYXRpdmVQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXRoczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZWFibGVDbWlzT2JqZWN0IG1vdmUoT2JqZWN0SWQgc291cmNlRm9sZGVySWQsIE9iamVjdElkIHRhcmdldEZvbGRlcklkKSB7Ci0gICAgICAgIHJldHVybiBtb3ZlKHNvdXJjZUZvbGRlcklkLCB0YXJnZXRGb2xkZXJJZCwgZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlYWJsZUNtaXNPYmplY3QgbW92ZShPYmplY3RJZCBzb3VyY2VGb2xkZXJJZCwgT2JqZWN0SWQgdGFyZ2V0Rm9sZGVySWQsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCk7Ci0KLSAgICAgICAgaWYgKChzb3VyY2VGb2xkZXJJZCA9PSBudWxsKSB8fCAoc291cmNlRm9sZGVySWQuZ2V0SWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIGZvbGRlciBpZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgodGFyZ2V0Rm9sZGVySWQgPT0gbnVsbCkgfHwgKHRhcmdldEZvbGRlcklkLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRhcmdldCBmb2xkZXIgaWQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLm1vdmVPYmplY3QoZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkSG9sZGVyLCB0YXJnZXRGb2xkZXJJZC5nZXRJZCgpLAotICAgICAgICAgICAgICAgIHNvdXJjZUZvbGRlcklkLmdldElkKCksIG51bGwpOwotCi0gICAgICAgIC8vIGludmFsaWRhdGUgcGF0aCBjYWNoZQotICAgICAgICBnZXRTZXNzaW9uKCkucmVtb3ZlT2JqZWN0RnJvbUNhY2hlKG9iamVjdElkKTsKLQotICAgICAgICBpZiAob2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNPYmplY3QgbW92ZWRPYmplY3QgPSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KG9iamVjdElkSG9sZGVyLmdldFZhbHVlKCksIGNvbnRleHQpOwotICAgICAgICBpZiAoIShtb3ZlZE9iamVjdCBpbnN0YW5jZW9mIEZpbGVhYmxlQ21pc09iamVjdCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTW92ZWQgb2JqZWN0IGlzIGludmFsaWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEZpbGVhYmxlQ21pc09iamVjdCkgbW92ZWRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9Gb2xkZXIoT2JqZWN0SWQgZm9sZGVySWQsIGJvb2xlYW4gYWxsVmVyc2lvbnMpIHsKLSAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0T2JqZWN0SWQoKTsKLQotICAgICAgICBpZiAoKGZvbGRlcklkID09IG51bGwpIHx8IChmb2xkZXJJZC5nZXRJZCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGb2xkZXIgSWQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0TXVsdGlGaWxpbmdTZXJ2aWNlKCkuYWRkT2JqZWN0VG9Gb2xkZXIoZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCBmb2xkZXJJZC5nZXRJZCgpLAotICAgICAgICAgICAgICAgIGFsbFZlcnNpb25zLCBudWxsKTsKLQotICAgICAgICAvLyBpbnZhbGlkYXRlIHBhdGggY2FjaGUKLSAgICAgICAgZ2V0U2Vzc2lvbigpLnJlbW92ZU9iamVjdEZyb21DYWNoZShvYmplY3RJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRnJvbUZvbGRlcihPYmplY3RJZCBmb2xkZXJJZCkgewotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotCi0gICAgICAgIGdldEJpbmRpbmcoKS5nZXRNdWx0aUZpbGluZ1NlcnZpY2UoKS5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKGdldFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwKLSAgICAgICAgICAgICAgICAoZm9sZGVySWQgIT0gbnVsbCA/IGZvbGRlcklkLmdldElkKCkgOiBudWxsKSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gaW52YWxpZGF0ZSBwYXRoIGNhY2hlCi0gICAgICAgIGdldFNlc3Npb24oKS5yZW1vdmVPYmplY3RGcm9tQ2FjaGUob2JqZWN0SWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQ2hhbmdlRXZlbnRJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0NoYW5nZUV2ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzMwOGQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQ2hhbmdlRXZlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNoYW5nZUV2ZW50SW5mb0RhdGFJbXBsOwotCi0vKioKLSAqIENoYW5nZSBFdmVudC4KLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUV2ZW50SW1wbCBleHRlbmRzIENoYW5nZUV2ZW50SW5mb0RhdGFJbXBsIGltcGxlbWVudHMgQ2hhbmdlRXZlbnQsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdElkOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDw/Pj4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHM7Ci0gICAgcHJpdmF0ZSBBY2wgYWNsOwotCi0gICAgcHVibGljIENoYW5nZUV2ZW50SW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2hhbmdlRXZlbnRJbXBsKENoYW5nZVR5cGUgY2hhbmdlVHlwZSwgR3JlZ29yaWFuQ2FsZW5kYXIgY2hhbmdlVGltZSwgU3RyaW5nIG9iamVjdElkLAotICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDw/Pj4gcHJvcGVydGllcywgTGlzdDxTdHJpbmc+IHBvbGljeUlkcywgQWNsIGFjbCkgewotICAgICAgICBzdXBlcihjaGFuZ2VUeXBlLCBjaGFuZ2VUaW1lKTsKLSAgICAgICAgdGhpcy5vYmplY3RJZCA9IG9iamVjdElkOwotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgICAgICB0aGlzLnBvbGljeUlkcyA9IHBvbGljeUlkczsKLSAgICAgICAgdGhpcy5hY2wgPSBhY2w7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRPYmplY3RJZCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdElkKFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICB0aGlzLm9iamVjdElkID0gb2JqZWN0SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Pz4+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgTGlzdDw/Pj4gcHJvcGVydGllcykgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UG9saWN5SWRzKCkgewotICAgICAgICByZXR1cm4gcG9saWN5SWRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeUlkcyhMaXN0PFN0cmluZz4gcG9saWN5SWRzKSB7Ci0gICAgICAgIHRoaXMucG9saWN5SWRzID0gcG9saWN5SWRzOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKCkgewotICAgICAgICByZXR1cm4gYWNsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjbChBY2wgYWNsKSB7Ci0gICAgICAgIHRoaXMuYWNsID0gYWNsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQ2hhbmdlIEV2ZW50IFtjaGFuZ2UgdHlwZT0iICsgZ2V0Q2hhbmdlVHlwZSgpICsgIiwgY2hhbmdlIHRpbWU9IiArIGdldENoYW5nZVRpbWUoKSArICIsIG9iamVjdCBpZD0iCi0gICAgICAgICAgICAgICAgKyBvYmplY3RJZCArICIsIHByb3BlcnRpZXM9IiArIHByb3BlcnRpZXMgKyAiLCBwb2xpY3kgaWRzPSIgKyBwb2xpY3lJZHMgKyAiLCBBQ0w9IiArIGFjbCArICJdIgotICAgICAgICAgICAgICAgICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0NoYW5nZUV2ZW50c0ltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQ2hhbmdlRXZlbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWEyODRjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQ2hhbmdlRXZlbnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DaGFuZ2VFdmVudHM7Ci0KLXB1YmxpYyBjbGFzcyBDaGFuZ2VFdmVudHNJbXBsIGltcGxlbWVudHMgQ2hhbmdlRXZlbnRzIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxhdGVzdENoYW5nZUxvZ1Rva2VuOwotICAgIHByaXZhdGUgTGlzdDxDaGFuZ2VFdmVudD4gZXZlbnRzOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNb3JlSXRlbXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGxvbmcgdG90YWxOdW1JdGVtcyA9IC0xOwotCi0gICAgcHVibGljIENoYW5nZUV2ZW50c0ltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIENoYW5nZUV2ZW50c0ltcGwoU3RyaW5nIGxhdGVzdENoYW5nZUxvZ1Rva2VuLCBMaXN0PENoYW5nZUV2ZW50PiBldmVudHMsIGJvb2xlYW4gaGFzTW9yZUl0ZW1zLAotICAgICAgICAgICAgbG9uZyB0b3RhbE51bUl0ZW1zKSB7Ci0gICAgICAgIHRoaXMubGF0ZXN0Q2hhbmdlTG9nVG9rZW4gPSBsYXRlc3RDaGFuZ2VMb2dUb2tlbjsKLSAgICAgICAgdGhpcy5ldmVudHMgPSBldmVudHM7Ci0gICAgICAgIHRoaXMuaGFzTW9yZUl0ZW1zID0gaGFzTW9yZUl0ZW1zOwotICAgICAgICB0aGlzLnRvdGFsTnVtSXRlbXMgPSB0b3RhbE51bUl0ZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBsYXRlc3RDaGFuZ2VMb2dUb2tlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbihTdHJpbmcgbGF0ZXN0Q2hhbmdlTG9nVG9rZW4pIHsKLSAgICAgICAgdGhpcy5sYXRlc3RDaGFuZ2VMb2dUb2tlbiA9IGxhdGVzdENoYW5nZUxvZ1Rva2VuOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENoYW5nZUV2ZW50PiBnZXRDaGFuZ2VFdmVudHMoKSB7Ci0gICAgICAgIGlmIChldmVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXZlbnRzID0gbmV3IEFycmF5TGlzdDxDaGFuZ2VFdmVudD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBldmVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlRXZlbnRzKExpc3Q8Q2hhbmdlRXZlbnQ+IGV2ZW50cykgewotICAgICAgICB0aGlzLmV2ZW50cyA9IGV2ZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNNb3JlSXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiBoYXNNb3JlSXRlbXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGFzTW9yZUl0ZW1zKGJvb2xlYW4gaGFzTW9yZUl0ZW1zKSB7Ci0gICAgICAgIHRoaXMuaGFzTW9yZUl0ZW1zID0gaGFzTW9yZUl0ZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRvdGFsTnVtSXRlbXMobG9uZyB0b3RhbE51bUl0ZW1zKSB7Ci0gICAgICAgIHRoaXMudG90YWxOdW1JdGVtcyA9IHRvdGFsTnVtSXRlbXM7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VG90YWxOdW1JdGVtcygpIHsKLSAgICAgICAgcmV0dXJuIHRvdGFsTnVtSXRlbXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9DbWlzQmluZGluZ0hlbHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9DbWlzQmluZGluZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODFjMzE2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQ21pc0JpbmRpbmdIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLkNtaXNCaW5kaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuVHlwZURlZmluaXRpb25DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgYmluZGluZyBoYW5kbGluZy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENtaXNCaW5kaW5nSGVscGVyIHsKLQotICAgIHByaXZhdGUgQ21pc0JpbmRpbmdIZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBDbWlzQmluZGluZ30gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc0JpbmRpbmcgY3JlYXRlQmluZGluZyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsCi0gICAgICAgICAgICBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwgfHwgcGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiU2Vzc2lvbiBwYXJhbWV0ZXIgbm90IHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGFyYW1ldGVycy5jb250YWluc0tleShTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFLCBCaW5kaW5nVHlwZS5DVVNUT00udmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBCaW5kaW5nVHlwZSBidCA9IEJpbmRpbmdUeXBlLmZyb21WYWx1ZShwYXJhbWV0ZXJzLmdldChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSkpOwotCi0gICAgICAgIHN3aXRjaCAoYnQpIHsKLSAgICAgICAgY2FzZSBBVE9NUFVCOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF0b21QdWJCaW5kaW5nKHBhcmFtZXRlcnMsIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIHR5cGVEZWZDYWNoZSk7Ci0gICAgICAgIGNhc2UgV0VCU0VSVklDRVM6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV2ViU2VydmljZUJpbmRpbmcocGFyYW1ldGVycywgYXV0aGVudGljYXRpb25Qcm92aWRlciwgdHlwZURlZkNhY2hlKTsKLSAgICAgICAgY2FzZSBCUk9XU0VSOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNtaXNCcm93c2VyQmluZGluZyhwYXJhbWV0ZXJzLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCB0eXBlRGVmQ2FjaGUpOwotICAgICAgICBjYXNlIExPQ0FMOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsQmluZGluZyhwYXJhbWV0ZXJzLCB0eXBlRGVmQ2FjaGUpOwotICAgICAgICBjYXNlIENVU1RPTToKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVDdXN0b21CaW5kaW5nKHBhcmFtZXRlcnMsIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIHR5cGVEZWZDYWNoZSk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkFtYmlndW91cyBzZXNzaW9uIHBhcmFtZXRlcjogIiArIHBhcmFtZXRlcnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGJpbmRpbmcgd2l0aCBjdXN0b20gcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbWlzQmluZGluZyBjcmVhdGVDdXN0b21CaW5kaW5nKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aGVudGljYXRpb25Qcm92aWRlciwgVHlwZURlZmluaXRpb25DYWNoZSB0eXBlRGVmQ2FjaGUpIHsKLSAgICAgICAgQ21pc0JpbmRpbmdGYWN0b3J5IGZhY3RvcnkgPSBDbWlzQmluZGluZ0ZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgQ21pc0JpbmRpbmcgYmluZGluZyA9IGZhY3RvcnkuY3JlYXRlQ21pc0JpbmRpbmcocGFyYW1ldGVycywgYXV0aGVudGljYXRpb25Qcm92aWRlciwgdHlwZURlZkNhY2hlKTsKLQotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgV2ViIFNlcnZpY2VzIGJpbmRpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ21pc0JpbmRpbmcgY3JlYXRlV2ViU2VydmljZUJpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBDbWlzQmluZGluZ0ZhY3RvcnkgZmFjdG9yeSA9IENtaXNCaW5kaW5nRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBDbWlzQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzV2ViU2VydmljZXNCaW5kaW5nKHBhcmFtZXRlcnMsIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIHR5cGVEZWZDYWNoZSk7Ci0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBBdG9tUHViIGJpbmRpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ21pc0JpbmRpbmcgY3JlYXRlQXRvbVB1YkJpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBDbWlzQmluZGluZ0ZhY3RvcnkgZmFjdG9yeSA9IENtaXNCaW5kaW5nRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBDbWlzQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzQXRvbVB1YkJpbmRpbmcocGFyYW1ldGVycywgYXV0aGVudGljYXRpb25Qcm92aWRlciwgdHlwZURlZkNhY2hlKTsKLQotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEJyb3dzZXIgYmluZGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbWlzQmluZGluZyBjcmVhdGVDbWlzQnJvd3NlckJpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBDbWlzQmluZGluZ0ZhY3RvcnkgZmFjdG9yeSA9IENtaXNCaW5kaW5nRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBDbWlzQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzQnJvd3NlckJpbmRpbmcocGFyYW1ldGVycywgYXV0aGVudGljYXRpb25Qcm92aWRlciwgdHlwZURlZkNhY2hlKTsKLQotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbG9jYWwgYmluZGluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbWlzQmluZGluZyBjcmVhdGVMb2NhbEJpbmRpbmcoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBDbWlzQmluZGluZ0ZhY3RvcnkgZmFjdG9yeSA9IENtaXNCaW5kaW5nRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBDbWlzQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzTG9jYWxCaW5kaW5nKHBhcmFtZXRlcnMsIHR5cGVEZWZDYWNoZSk7Ci0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9Eb2N1bWVudEltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmU5OTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9Eb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTnVsbE9yRW1wdHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5MaW5rQWNjZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbUhhc2g7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBhcnRpYWxDb250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1IYXNoSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEltcGwgZXh0ZW5kcyBBYnN0cmFjdEZpbGFibGVDbWlzT2JqZWN0IGltcGxlbWVudHMgRG9jdW1lbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRJbXBsKFNlc3Npb25JbXBsIHNlc3Npb24sIE9iamVjdFR5cGUgb2JqZWN0VHlwZSwgT2JqZWN0RGF0YSBvYmplY3REYXRhLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZShzZXNzaW9uLCBvYmplY3RUeXBlLCBvYmplY3REYXRhLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBwcm9wZXJ0aWVzCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoZWNraW5Db21tZW50KCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25TZXJpZXNJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRCeSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlkpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzSW1tdXRhYmxlKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzTGF0ZXN0TWFqb3JWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTik7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5JU19MQVRFU1RfVkVSU0lPTik7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNNYWpvclZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzUHJpdmF0ZVdvcmtpbmdDb3B5KCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5JU19QUklWQVRFX1dPUktJTkdfQ09QWSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRTdHJlYW1MZW5ndGgoKSB7Ci0gICAgICAgIEJpZ0ludGVnZXIgYmlnSW50ID0gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9MRU5HVEgpOwotICAgICAgICByZXR1cm4gKGJpZ0ludCA9PSBudWxsKSA/IChsb25nKSAtMSA6IGJpZ0ludC5sb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRTdHJlYW1NaW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRTdHJlYW1GaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRTdHJlYW1JZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENvbnRlbnRTdHJlYW1IYXNoPiBnZXRDb250ZW50U3RyZWFtSGFzaGVzKCkgewotICAgICAgICBMaXN0PFN0cmluZz4gaGFzaGVzID0gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9IQVNIKTsKLSAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoaGFzaGVzKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENvbnRlbnRTdHJlYW1IYXNoPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRTdHJlYW1IYXNoPihoYXNoZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChTdHJpbmcgaGFzaCA6IGhhc2hlcykgewotICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgQ29udGVudFN0cmVhbUhhc2hJbXBsKGhhc2gpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gb3BlcmF0aW9ucwotCi0gICAgcHVibGljIERvY3VtZW50IGNvcHkoT2JqZWN0SWQgdGFyZ2V0Rm9sZGVySWQsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsCi0gICAgICAgICAgICBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0KLSAgICAgICAgT2JqZWN0SWQgbmV3SWQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3SWQgPSBnZXRTZXNzaW9uKCkuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKHRoaXMsIHByb3BlcnRpZXMsIHRhcmdldEZvbGRlcklkLCB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgICAgICBhZGRBY2VzLCByZW1vdmVBY2VzKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbiBuc2UpIHsKLSAgICAgICAgICAgIG5ld0lkID0gY29weVZpYUNsaWVudCh0YXJnZXRGb2xkZXJJZCwgcHJvcGVydGllcywgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBubyBjb250ZXh0IGlzIHByb3ZpZGVkIHRoZSBvYmplY3Qgd2lsbCBub3QgYmUgZmV0Y2hlZAotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsIHx8IG5ld0lkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB0aGUgbmV3IG9iamVjdAotICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IGdldFNlc3Npb24oKS5nZXRPYmplY3QobmV3SWQsIGNvbnRleHQpOwotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTmV3bHkgY3JlYXRlZCBvYmplY3QgaXMgbm90IGEgZG9jdW1lbnQhIE5ldyBpZDogIiArIG5ld0lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoRG9jdW1lbnQpIG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgY29weShPYmplY3RJZCB0YXJnZXRGb2xkZXJJZCkgewotICAgICAgICByZXR1cm4gY29weSh0YXJnZXRGb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgZG9jdW1lbnQgbWFudWFsbHkuIFRoZSBjb250ZW50IGlzIHN0cmVhbWVkIGZyb20gdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBhbmQgYmFjay4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0SWQgY29weVZpYUNsaWVudChPYmplY3RJZCB0YXJnZXRGb2xkZXJJZCwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbmV3UHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgYWxsUHJvcHNDb250ZXh0ID0gZ2V0U2Vzc2lvbigpLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgYWxsUHJvcHNDb250ZXh0LnNldEZpbHRlclN0cmluZygiKiIpOwotICAgICAgICBhbGxQcm9wc0NvbnRleHQuc2V0SW5jbHVkZUFjbHMoZmFsc2UpOwotICAgICAgICBhbGxQcm9wc0NvbnRleHQuc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoZmFsc2UpOwotICAgICAgICBhbGxQcm9wc0NvbnRleHQuc2V0SW5jbHVkZVBhdGhTZWdtZW50cyhmYWxzZSk7Ci0gICAgICAgIGFsbFByb3BzQ29udGV4dC5zZXRJbmNsdWRlUG9saWNpZXMoZmFsc2UpOwotICAgICAgICBhbGxQcm9wc0NvbnRleHQuc2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSk7Ci0gICAgICAgIGFsbFByb3BzQ29udGV4dC5zZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoImNtaXM6bm9uZSIpOwotCi0gICAgICAgIERvY3VtZW50IGFsbFByb3BzRG9jID0gKERvY3VtZW50KSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KHRoaXMsIGFsbFByb3BzQ29udGV4dCk7Ci0KLSAgICAgICAgZm9yIChQcm9wZXJ0eTw/PiBwcm9wIDogYWxsUHJvcHNEb2MuZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcC5nZXREZWZpbml0aW9uKCkuZ2V0VXBkYXRhYmlsaXR5KCkgPT0gVXBkYXRhYmlsaXR5LlJFQURXUklURQotICAgICAgICAgICAgICAgICAgICB8fCBwcm9wLmdldERlZmluaXRpb24oKS5nZXRVcGRhdGFiaWxpdHkoKSA9PSBVcGRhdGFiaWxpdHkuT05DUkVBVEUpIHsKLSAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLnB1dChwcm9wLmdldElkKCksIHByb3AuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLnB1dEFsbChwcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGFsbFByb3BzRG9jLmdldENvbnRlbnRTdHJlYW0oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuY3JlYXRlRG9jdW1lbnQobmV3UHJvcGVydGllcywgdGFyZ2V0Rm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgICAgIGFkZEFjZXMsIHJlbW92ZUFjZXMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBjbG9zZSBzb3VyY2Ugc3RyZWFtISIsIGlvZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVBbGxWZXJzaW9ucygpIHsKLSAgICAgICAgZGVsZXRlKHRydWUpOwotICAgIH0KLQotICAgIC8vIHZlcnNpb25pbmcKLQotICAgIHB1YmxpYyBPYmplY3RJZCBjaGVja091dCgpIHsKLSAgICAgICAgU3RyaW5nIG5ld09iamVjdElkID0gbnVsbDsKLQotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KG9iamVjdElkKTsKLQotICAgICAgICAgICAgZ2V0QmluZGluZygpLmdldFZlcnNpb25pbmdTZXJ2aWNlKCkuY2hlY2tPdXQoZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkSG9sZGVyLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG5ld09iamVjdElkID0gb2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSBvcmlnaW5hbCB2ZXJzaW9uIGZyb20gY2FjaGUsIHRoZSBwYXRoIGFuZCBhIGZldyB2ZXJzaW9uaW5nCi0gICAgICAgIC8vIHByb3BlcnRpZXMgYXJlIG5vdCB2YWxpZCBhbnltb3JlCi0gICAgICAgIGdldFNlc3Npb24oKS5yZW1vdmVPYmplY3RGcm9tQ2FjaGUodGhpcyk7Ci0KLSAgICAgICAgaWYgKG5ld09iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKS5jcmVhdGVPYmplY3RJZChuZXdPYmplY3RJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsQ2hlY2tPdXQoKSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldE9iamVjdElkKCk7Ci0KLSAgICAgICAgZ2V0QmluZGluZygpLmdldFZlcnNpb25pbmdTZXJ2aWNlKCkuY2FuY2VsQ2hlY2tPdXQoZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCBudWxsKTsKLQotICAgICAgICAvLyByZW1vdmUgUFdDIGZyb20gY2FjaGUsIGl0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZQotICAgICAgICBnZXRTZXNzaW9uKCkucmVtb3ZlT2JqZWN0RnJvbUNhY2hlKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBjaGVja0luKGJvb2xlYW4gbWFqb3IsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxQb2xpY3k+IHBvbGljaWVzLCBMaXN0PEFjZT4gYWRkQWNlcywgTGlzdDxBY2U+IHJlbW92ZUFjZXMpIHsKLSAgICAgICAgU3RyaW5nIG5ld09iamVjdElkID0gbnVsbDsKLQotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oZ2V0T2JqZWN0SWQoKSk7Ci0KLSAgICAgICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBnZXRPYmplY3RGYWN0b3J5KCk7Ci0KLSAgICAgICAgICAgIFNldDxVcGRhdGFiaWxpdHk+IHVwZGF0ZWJpbGl0eSA9IEVudW1TZXQubm9uZU9mKFVwZGF0YWJpbGl0eS5jbGFzcyk7Ci0gICAgICAgICAgICB1cGRhdGViaWxpdHkuYWRkKFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgdXBkYXRlYmlsaXR5LmFkZChVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQpOwotCi0gICAgICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKS5jaGVja0luKGdldFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZEhvbGRlciwgbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgIG9mLmNvbnZlcnRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIGdldFR5cGUoKSwgZ2V0U2Vjb25kYXJ5VHlwZXMoKSwgdXBkYXRlYmlsaXR5KSwKLSAgICAgICAgICAgICAgICAgICAgb2YuY29udmVydENvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbSksIGNoZWNraW5Db21tZW50LCBvZi5jb252ZXJ0UG9saWNpZXMocG9saWNpZXMpLAotICAgICAgICAgICAgICAgICAgICBvZi5jb252ZXJ0QWNlcyhhZGRBY2VzKSwgb2YuY29udmVydEFjZXMocmVtb3ZlQWNlcyksIG51bGwpOwotCi0gICAgICAgICAgICBuZXdPYmplY3RJZCA9IG9iamVjdElkSG9sZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgUFdDIGZyb20gY2FjaGUsIGl0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZQotICAgICAgICBnZXRTZXNzaW9uKCkucmVtb3ZlT2JqZWN0RnJvbUNhY2hlKHRoaXMpOwotCi0gICAgICAgIGlmIChuZXdPYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuY3JlYXRlT2JqZWN0SWQobmV3T2JqZWN0SWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PERvY3VtZW50PiBnZXRBbGxWZXJzaW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGdldEFsbFZlcnNpb25zKGdldFNlc3Npb24oKS5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxEb2N1bWVudD4gZ2V0QWxsVmVyc2lvbnMoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZDsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25TZXJpZXNJZDsKLQotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgdmVyc2lvblNlcmllc0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHZlcnNpb25zID0gZ2V0QmluZGluZygpLmdldFZlcnNpb25pbmdTZXJ2aWNlKCkuZ2V0QWxsVmVyc2lvbnMoZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLAotICAgICAgICAgICAgICAgIHZlcnNpb25TZXJpZXNJZCwgY29udGV4dC5nZXRGaWx0ZXJTdHJpbmcoKSwgY29udGV4dC5pc0luY2x1ZGVBbGxvd2FibGVBY3Rpb25zKCksIG51bGwpOwotCi0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSA9IGdldFNlc3Npb24oKS5nZXRPYmplY3RGYWN0b3J5KCk7Ci0KLSAgICAgICAgTGlzdDxEb2N1bWVudD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxEb2N1bWVudD4oKTsKLSAgICAgICAgaWYgKHZlcnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3REYXRhIDogdmVyc2lvbnMpIHsKLSAgICAgICAgICAgICAgICBDbWlzT2JqZWN0IGRvYyA9IG9iamVjdEZhY3RvcnkuY29udmVydE9iamVjdChvYmplY3REYXRhLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAoIShkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4uLi4KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZCgoRG9jdW1lbnQpIGRvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihib29sZWFuIG1ham9yKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24obWFqb3IsIGdldFNlc3Npb24oKS5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKGJvb2xlYW4gbWFqb3IsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmdldExhdGVzdERvY3VtZW50VmVyc2lvbih0aGlzLCBtYWpvciwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gY29udGVudCBvcGVyYXRpb25zCi0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gZ2V0Q29udGVudFN0cmVhbShudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKEJpZ0ludGVnZXIgb2Zmc2V0LCBCaWdJbnRlZ2VyIGxlbmd0aCkgewotICAgICAgICByZXR1cm4gZ2V0Q29udGVudFN0cmVhbShudWxsLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShTdHJpbmcgc3RyZWFtSWQpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRTdHJlYW0oc3RyZWFtSWQsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHN0cmVhbUlkLCBCaWdJbnRlZ2VyIG9mZnNldCwgQmlnSW50ZWdlciBsZW5ndGgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBzdHJlYW0KLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gZ2V0U2Vzc2lvbigpLmdldENvbnRlbnRTdHJlYW0odGhpcywgc3RyZWFtSWQsIG9mZnNldCwgbGVuZ3RoKTsKLQotICAgICAgICBpZiAoY29udGVudFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBBdG9tUHViIGJpbmRpbmcgZG9lc24ndCByZXR1cm4gYSBmaWxlIG5hbWUKLSAgICAgICAgLy8gLT4gZ2V0IHRoZSBmaWxlIG5hbWUgZnJvbSBwcm9wZXJ0aWVzLCBpZiBwcmVzZW50Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgaWYgKGZpbGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gZ2V0Q29udGVudFN0cmVhbUZpbGVOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIGxlbmd0aExvbmcgPSAoY29udGVudFN0cmVhbS5nZXRCaWdMZW5ndGgoKSA9PSBudWxsID8gLTEgOiBjb250ZW50U3RyZWFtLmdldEJpZ0xlbmd0aCgpLmxvbmdWYWx1ZSgpKTsKLQotICAgICAgICAvLyBjb252ZXJ0IGFuZCByZXR1cm4gc3RyZWFtIG9iamVjdAotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVDb250ZW50U3RyZWFtKGZpbGVuYW1lLCBsZW5ndGhMb25nLCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCksCi0gICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSwgY29udGVudFN0cmVhbSBpbnN0YW5jZW9mIFBhcnRpYWxDb250ZW50U3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRVcmwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZW50VXJsKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFVybChTdHJpbmcgc3RyZWFtSWQpIHsKLSAgICAgICAgaWYgKGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkgaW5zdGFuY2VvZiBMaW5rQWNjZXNzKSB7Ci0gICAgICAgICAgICBMaW5rQWNjZXNzIGxpbmtBY2Nlc3MgPSAoTGlua0FjY2VzcykgZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKTsKLQotICAgICAgICAgICAgaWYgKHN0cmVhbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGlua0FjY2Vzcy5sb2FkQ29udGVudExpbmsoZ2V0UmVwb3NpdG9yeUlkKCksIGdldElkKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGlua0FjY2Vzcy5sb2FkUmVuZGl0aW9uQ29udGVudExpbmsoZ2V0UmVwb3NpdG9yeUlkKCksIGdldElkKCksIHN0cmVhbUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBzZXRDb250ZW50U3RyZWFtKENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgYm9vbGVhbiBvdmVyd3JpdGUpIHsKLSAgICAgICAgT2JqZWN0SWQgb2JqZWN0SWQgPSBzZXRDb250ZW50U3RyZWFtKGNvbnRlbnRTdHJlYW0sIG92ZXJ3cml0ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZ2V0T2JqZWN0SWQoKS5lcXVhbHMob2JqZWN0SWQuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoRG9jdW1lbnQpIGdldFNlc3Npb24oKS5nZXRPYmplY3Qob2JqZWN0SWQsIGdldENyZWF0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBzZXRDb250ZW50U3RyZWFtKENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgYm9vbGVhbiBvdmVyd3JpdGUsIGJvb2xlYW4gcmVmcmVzaCkgewotICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSBudWxsOwotCi0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihnZXRPYmplY3RJZCgpKTsKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KChTdHJpbmcpIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKSk7Ci0KLSAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuc2V0Q29udGVudFN0cmVhbShnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWRIb2xkZXIsIG92ZXJ3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG9rZW5Ib2xkZXIsIGdldE9iamVjdEZhY3RvcnkoKS5jb252ZXJ0Q29udGVudFN0cmVhbShjb250ZW50U3RyZWFtKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIG5ld09iamVjdElkID0gb2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWZyZXNoKSB7Ci0gICAgICAgICAgICByZWZyZXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3T2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmNyZWF0ZU9iamVjdElkKG5ld09iamVjdElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgYXBwZW5kQ29udGVudFN0cmVhbShDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmspIHsKLSAgICAgICAgaWYgKGdldFNlc3Npb24oKS5nZXRSZXBvc2l0b3J5SW5mbygpLmdldENtaXNWZXJzaW9uKCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDTUlTIDEuMCByZXBvc2l0b3JpZXMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RJZCBvYmplY3RJZCA9IGFwcGVuZENvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbSwgaXNMYXN0Q2h1bmssIHRydWUpOwotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWdldE9iamVjdElkKCkuZXF1YWxzKG9iamVjdElkLmdldElkKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKERvY3VtZW50KSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KG9iamVjdElkLCBnZXRDcmVhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0SWQgYXBwZW5kQ29udGVudFN0cmVhbShDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmssIGJvb2xlYW4gcmVmcmVzaCkgewotICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSBudWxsOwotCi0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihnZXRPYmplY3RJZCgpKTsKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KChTdHJpbmcpIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKSk7Ci0KLSAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuYXBwZW5kQ29udGVudFN0cmVhbShnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3RGYWN0b3J5KCkuY29udmVydENvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbSksIGlzTGFzdENodW5rLCBudWxsKTsKLQotICAgICAgICAgICAgbmV3T2JqZWN0SWQgPSBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZFVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZnJlc2gpIHsKLSAgICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdPYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuY3JlYXRlT2JqZWN0SWQobmV3T2JqZWN0SWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBkZWxldGVDb250ZW50U3RyZWFtKCkgewotICAgICAgICBPYmplY3RJZCBvYmplY3RJZCA9IGRlbGV0ZUNvbnRlbnRTdHJlYW0odHJ1ZSk7Ci0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZ2V0T2JqZWN0SWQoKS5lcXVhbHMob2JqZWN0SWQuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoRG9jdW1lbnQpIGdldFNlc3Npb24oKS5nZXRPYmplY3Qob2JqZWN0SWQsIGdldENyZWF0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBkZWxldGVDb250ZW50U3RyZWFtKGJvb2xlYW4gcmVmcmVzaCkgewotICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSBudWxsOwotCi0gICAgICAgIHJlYWRMb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihnZXRPYmplY3RJZCgpKTsKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KChTdHJpbmcpIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKSk7Ci0KLSAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuZGVsZXRlQ29udGVudFN0cmVhbShnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgbmV3T2JqZWN0SWQgPSBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZFVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZnJlc2gpIHsKLSAgICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdPYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuY3JlYXRlT2JqZWN0SWQobmV3T2JqZWN0SWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBjaGVja0luKGJvb2xlYW4gbWFqb3IsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoZWNraW5Db21tZW50KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoZWNrSW4obWFqb3IsIHByb3BlcnRpZXMsIGNvbnRlbnRTdHJlYW0sIGNoZWNraW5Db21tZW50LCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0ZvbGRlckltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvRm9sZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmZmMWUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvRm9sZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZpbGVhYmxlQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudXRpbC5BYnN0cmFjdFBhZ2VGZXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWwuQ29sbGVjdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWwuVHJlZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5GYWlsZWRUb0RlbGV0ZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLQotcHVibGljIGNsYXNzIEZvbGRlckltcGwgZXh0ZW5kcyBBYnN0cmFjdEZpbGFibGVDbWlzT2JqZWN0IGltcGxlbWVudHMgRm9sZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEZvbGRlckltcGwoU2Vzc2lvbkltcGwgc2Vzc2lvbiwgT2JqZWN0VHlwZSBvYmplY3RUeXBlLCBPYmplY3REYXRhIG9iamVjdERhdGEsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbml0aWFsaXplKHNlc3Npb24sIG9iamVjdFR5cGUsIG9iamVjdERhdGEsIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudChNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotCi0gICAgICAgIE9iamVjdElkIG5ld0lkID0gZ2V0U2Vzc2lvbigpLmNyZWF0ZURvY3VtZW50KHByb3BlcnRpZXMsIHRoaXMsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgLy8gaWYgbm8gY29udGV4dCBpcyBwcm92aWRlZCB0aGUgb2JqZWN0IHdpbGwgbm90IGJlIGZldGNoZWQKLSAgICAgICAgaWYgKChjb250ZXh0ID09IG51bGwpIHx8IChuZXdJZCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG5ldyBvYmplY3QKLSAgICAgICAgQ21pc09iamVjdCBvYmplY3QgPSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KG5ld0lkLCBjb250ZXh0KTsKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5ld2x5IGNyZWF0ZWQgb2JqZWN0IGlzIG5vdCBhIGRvY3VtZW50ISBOZXcgaWQ6ICIgKyBuZXdJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKERvY3VtZW50KSBvYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShPYmplY3RJZCBzb3VyY2UsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFBvbGljeT4gcG9saWNpZXMsIExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotCi0gICAgICAgIE9iamVjdElkIG5ld0lkID0gZ2V0U2Vzc2lvbigpLmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShzb3VyY2UsIHByb3BlcnRpZXMsIHRoaXMsIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgLy8gaWYgbm8gY29udGV4dCBpcyBwcm92aWRlZCB0aGUgb2JqZWN0IHdpbGwgbm90IGJlIGZldGNoZWQKLSAgICAgICAgaWYgKChjb250ZXh0ID09IG51bGwpIHx8IChuZXdJZCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG5ldyBvYmplY3QKLSAgICAgICAgQ21pc09iamVjdCBvYmplY3QgPSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KG5ld0lkLCBjb250ZXh0KTsKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5ld2x5IGNyZWF0ZWQgb2JqZWN0IGlzIG5vdCBhIGRvY3VtZW50ISBOZXcgaWQ6ICIgKyBuZXdJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKERvY3VtZW50KSBvYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIEZvbGRlciBjcmVhdGVGb2xkZXIoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgTGlzdDxQb2xpY3k+IHBvbGljaWVzLCBMaXN0PEFjZT4gYWRkQWNlcywKLSAgICAgICAgICAgIExpc3Q8QWNlPiByZW1vdmVBY2VzLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICBPYmplY3RJZCBuZXdJZCA9IGdldFNlc3Npb24oKS5jcmVhdGVGb2xkZXIocHJvcGVydGllcywgdGhpcywgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMpOwotCi0gICAgICAgIC8vIGlmIG5vIGNvbnRleHQgaXMgcHJvdmlkZWQgdGhlIG9iamVjdCB3aWxsIG5vdCBiZSBmZXRjaGVkCi0gICAgICAgIGlmICgoY29udGV4dCA9PSBudWxsKSB8fCAobmV3SWQgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBuZXcgb2JqZWN0Ci0gICAgICAgIENtaXNPYmplY3Qgb2JqZWN0ID0gZ2V0U2Vzc2lvbigpLmdldE9iamVjdChuZXdJZCwgY29udGV4dCk7Ci0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTmV3bHkgY3JlYXRlZCBvYmplY3QgaXMgbm90IGEgZm9sZGVyISBOZXcgaWQ6ICIgKyBuZXdJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEZvbGRlcikgb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBQb2xpY3kgY3JlYXRlUG9saWN5KE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsCi0gICAgICAgICAgICBMaXN0PEFjZT4gcmVtb3ZlQWNlcywgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0KLSAgICAgICAgT2JqZWN0SWQgbmV3SWQgPSBnZXRTZXNzaW9uKCkuY3JlYXRlUG9saWN5KHByb3BlcnRpZXMsIHRoaXMsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzKTsKLQotICAgICAgICAvLyBpZiBubyBjb250ZXh0IGlzIHByb3ZpZGVkIHRoZSBvYmplY3Qgd2lsbCBub3QgYmUgZmV0Y2hlZAotICAgICAgICBpZiAoKGNvbnRleHQgPT0gbnVsbCkgfHwgKG5ld0lkID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbmV3IG9iamVjdAotICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IGdldFNlc3Npb24oKS5nZXRPYmplY3QobmV3SWQsIGNvbnRleHQpOwotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBQb2xpY3kpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5ld2x5IGNyZWF0ZWQgb2JqZWN0IGlzIG5vdCBhIHBvbGljeSEgTmV3IGlkOiAiICsgbmV3SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChQb2xpY3kpIG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbSBjcmVhdGVJdGVtKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzLAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0KLSAgICAgICAgT2JqZWN0SWQgbmV3SWQgPSBnZXRTZXNzaW9uKCkuY3JlYXRlSXRlbShwcm9wZXJ0aWVzLCB0aGlzLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgLy8gaWYgbm8gY29udGV4dCBpcyBwcm92aWRlZCB0aGUgb2JqZWN0IHdpbGwgbm90IGJlIGZldGNoZWQKLSAgICAgICAgaWYgKChjb250ZXh0ID09IG51bGwpIHx8IChuZXdJZCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG5ldyBvYmplY3QKLSAgICAgICAgQ21pc09iamVjdCBvYmplY3QgPSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KG5ld0lkLCBjb250ZXh0KTsKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSXRlbSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTmV3bHkgY3JlYXRlZCBvYmplY3QgaXMgbm90IGFuIGl0ZW0hIE5ldyBpZDogIiArIG5ld0lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoSXRlbSkgb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZGVsZXRlVHJlZShib29sZWFuIGFsbFZlcnNpb25zLCBVbmZpbGVPYmplY3QgdW5maWxlLCBib29sZWFuIGNvbnRpbnVlT25GYWlsdXJlKSB7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBnZXRSZXBvc2l0b3J5SWQoKTsKLSAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0T2JqZWN0SWQoKTsKLQotICAgICAgICBGYWlsZWRUb0RlbGV0ZURhdGEgZmFpbGVkID0gZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKS5kZWxldGVUcmVlKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgICAgIHVuZmlsZSwgY29udGludWVPbkZhaWx1cmUsIG51bGwpOwotCi0gICAgICAgIGlmIChmYWlsZWQgPT0gbnVsbCB8fCBpc051bGxPckVtcHR5KGZhaWxlZC5nZXRJZHMoKSkpIHsKLSAgICAgICAgICAgIGdldFNlc3Npb24oKS5yZW1vdmVPYmplY3RGcm9tQ2FjaGUodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKGZhaWxlZCAhPSBudWxsID8gZmFpbGVkLmdldElkcygpIDogbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuUEFSRU5UX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RUeXBlPiBnZXRBbGxvd2VkQ2hpbGRPYmplY3RUeXBlcygpIHsKLSAgICAgICAgTGlzdDxPYmplY3RUeXBlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFR5cGU+KCk7Ci0KLSAgICAgICAgcmVhZExvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBvdGlkcyA9IGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFMpOwotICAgICAgICAgICAgaWYgKG90aWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBvdGlkIDogb3RpZHMpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGdldFNlc3Npb24oKS5nZXRUeXBlRGVmaW5pdGlvbihvdGlkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkVW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8RG9jdW1lbnQ+IGdldENoZWNrZWRPdXREb2NzKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZE91dERvY3MoZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8RG9jdW1lbnQ+IGdldENoZWNrZWRPdXREb2NzKE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICBmaW5hbCBOYXZpZ2F0aW9uU2VydmljZSBuYXZpZ2F0aW9uU2VydmljZSA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpOwotICAgICAgICBmaW5hbCBPYmplY3RGYWN0b3J5IG9iamVjdEZhY3RvcnkgPSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBmaW5hbCBPcGVyYXRpb25Db250ZXh0IGN0eHQgPSBuZXcgT3BlcmF0aW9uQ29udGV4dEltcGwoY29udGV4dCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uSXRlcmFibGU8RG9jdW1lbnQ+KG5ldyBBYnN0cmFjdFBhZ2VGZXRjaGVyPERvY3VtZW50PihjdHh0LmdldE1heEl0ZW1zUGVyUGFnZSgpKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIEFic3RyYWN0UGFnZUZldGNoZXIuUGFnZTxEb2N1bWVudD4gZmV0Y2hQYWdlKGxvbmcgc2tpcENvdW50KSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgY2hlY2tlZCBvdXQgZG9jdW1lbnRzIGZvciB0aGlzIGZvbGRlcgotICAgICAgICAgICAgICAgIE9iamVjdExpc3QgY2hlY2tlZE91dERvY3MgPSBuYXZpZ2F0aW9uU2VydmljZS5nZXRDaGVja2VkT3V0RG9jcyhnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldEZpbHRlclN0cmluZygpLCBjdHh0LmdldE9yZGVyQnkoKSwgY3R4dC5pc0luY2x1ZGVBbGxvd2FibGVBY3Rpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldEluY2x1ZGVSZWxhdGlvbnNoaXBzKCksIGN0eHQuZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YodGhpcy5tYXhOdW1JdGVtcyksIEJpZ0ludGVnZXIudmFsdWVPZihza2lwQ291bnQpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgb2JqZWN0cwotICAgICAgICAgICAgICAgIExpc3Q8RG9jdW1lbnQ+IHBhZ2UgPSBuZXcgQXJyYXlMaXN0PERvY3VtZW50PigpOwotICAgICAgICAgICAgICAgIGlmIChjaGVja2VkT3V0RG9jcy5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0RGF0YSA6IGNoZWNrZWRPdXREb2NzLmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ21pc09iamVjdCBkb2MgPSBvYmplY3RGYWN0b3J5LmNvbnZlcnRPYmplY3Qob2JqZWN0RGF0YSwgY3R4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbi4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLmFkZCgoRG9jdW1lbnQpIGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0UGFnZUZldGNoZXIuUGFnZTxEb2N1bWVudD4ocGFnZSwgY2hlY2tlZE91dERvY3MuZ2V0TnVtSXRlbXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRPdXREb2NzLmhhc01vcmVJdGVtcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGdldFNlc3Npb24oKS5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPENtaXNPYmplY3Q+IGdldENoaWxkcmVuKE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICBmaW5hbCBOYXZpZ2F0aW9uU2VydmljZSBuYXZpZ2F0aW9uU2VydmljZSA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpOwotICAgICAgICBmaW5hbCBPYmplY3RGYWN0b3J5IG9iamVjdEZhY3RvcnkgPSBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBmaW5hbCBPcGVyYXRpb25Db250ZXh0IGN0eHQgPSBuZXcgT3BlcmF0aW9uQ29udGV4dEltcGwoY29udGV4dCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uSXRlcmFibGU8Q21pc09iamVjdD4obmV3IEFic3RyYWN0UGFnZUZldGNoZXI8Q21pc09iamVjdD4oY3R4dC5nZXRNYXhJdGVtc1BlclBhZ2UoKSkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFBhZ2VGZXRjaGVyLlBhZ2U8Q21pc09iamVjdD4gZmV0Y2hQYWdlKGxvbmcgc2tpcENvdW50KSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IGNoaWxkcmVuID0gbmF2aWdhdGlvblNlcnZpY2UuZ2V0Q2hpbGRyZW4oZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRGaWx0ZXJTdHJpbmcoKSwgY3R4dC5nZXRPcmRlckJ5KCksIGN0eHQuaXNJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucygpLAotICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5nZXRJbmNsdWRlUmVsYXRpb25zaGlwcygpLCBjdHh0LmdldFJlbmRpdGlvbkZpbHRlclN0cmluZygpLCBjdHh0LmlzSW5jbHVkZVBhdGhTZWdtZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKHRoaXMubWF4TnVtSXRlbXMpLCBCaWdJbnRlZ2VyLnZhbHVlT2Yoc2tpcENvdW50KSwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IG9iamVjdHMKLSAgICAgICAgICAgICAgICBMaXN0PENtaXNPYmplY3Q+IHBhZ2UgPSBuZXcgQXJyYXlMaXN0PENtaXNPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckRhdGE+IGNoaWxkT2JqZWN0cyA9IGNoaWxkcmVuLmdldE9iamVjdHMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRPYmplY3RzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgb2JqZWN0RGF0YSA6IGNoaWxkT2JqZWN0cykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdERhdGEuZ2V0T2JqZWN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuYWRkKG9iamVjdEZhY3RvcnkuY29udmVydE9iamVjdChvYmplY3REYXRhLmdldE9iamVjdCgpLCBjdHh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0UGFnZUZldGNoZXIuUGFnZTxDbWlzT2JqZWN0PihwYWdlLCBjaGlsZHJlbi5nZXROdW1JdGVtcygpLCBjaGlsZHJlbi5oYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0Pj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBnZXREZXNjZW5kYW50cyhkZXB0aCwgZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0Pj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0T2JqZWN0SWQoKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGRlc2NlbmRhbnRzCi0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IHByb3ZpZGVyQ29udGFpbmVyTGlzdCA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldERlc2NlbmRhbnRzKAotICAgICAgICAgICAgICAgIGdldFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwgQmlnSW50ZWdlci52YWx1ZU9mKGRlcHRoKSwgY29udGV4dC5nZXRGaWx0ZXJTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmlzSW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKSwgY29udGV4dC5nZXRJbmNsdWRlUmVsYXRpb25zaGlwcygpLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCksIGNvbnRleHQuaXNJbmNsdWRlUGF0aFNlZ21lbnRzKCksIG51bGwpOwotCi0gICAgICAgIHJldHVybiBjb252ZXJ0QmluZGluZ0NvbnRhaW5lcihwcm92aWRlckNvbnRhaW5lckxpc3QsIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0Pj4gZ2V0Rm9sZGVyVHJlZShpbnQgZGVwdGgpIHsKLSAgICAgICAgcmV0dXJuIGdldEZvbGRlclRyZWUoZGVwdGgsIGdldFNlc3Npb24oKS5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4+IGdldEZvbGRlclRyZWUoaW50IGRlcHRoLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0T2JqZWN0SWQoKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGZvbGRlciB0cmVlCi0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IHByb3ZpZGVyQ29udGFpbmVyTGlzdCA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldEZvbGRlclRyZWUoCi0gICAgICAgICAgICAgICAgZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLCBCaWdJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpLCBjb250ZXh0LmdldEZpbHRlclN0cmluZygpLAotICAgICAgICAgICAgICAgIGNvbnRleHQuaXNJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucygpLCBjb250ZXh0LmdldEluY2x1ZGVSZWxhdGlvbnNoaXBzKCksCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoKSwgY29udGV4dC5pc0luY2x1ZGVQYXRoU2VnbWVudHMoKSwgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRCaW5kaW5nQ29udGFpbmVyKHByb3ZpZGVyQ29udGFpbmVyTGlzdCwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBiaW5kaW5nIGNvbnRhaW5lciBpbnRvIGFuIEFQSSBjb250YWluZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0Pj4gY29udmVydEJpbmRpbmdDb250YWluZXIoTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gYmluZGluZ0NvbnRhaW5lckxpc3QsCi0gICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGJpbmRpbmdDb250YWluZXJMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBvZiA9IGdldFNlc3Npb24oKS5nZXRPYmplY3RGYWN0b3J5KCk7Ci0KLSAgICAgICAgTGlzdDxUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VHJlZTxGaWxlYWJsZUNtaXNPYmplY3Q+PigpOwotICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIG9pZmMgOiBiaW5kaW5nQ29udGFpbmVyTGlzdCkgewotICAgICAgICAgICAgaWYgKChvaWZjLmdldE9iamVjdCgpID09IG51bGwpIHx8IChvaWZjLmdldE9iamVjdCgpLmdldE9iamVjdCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiAuLi4KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY29udmVydCB0aGUgb2JqZWN0Ci0gICAgICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IG9mLmNvbnZlcnRPYmplY3Qob2lmYy5nZXRPYmplY3QoKS5nZXRPYmplY3QoKSwgY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBGaWxlYWJsZUNtaXNPYmplY3QpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHJlcG9zaXRvcnkgbXVzdCBub3QgcmV0dXJuIG9iamVjdHMgdGhhdCBhcmUgbm90IGZpbGVhYmxlLAotICAgICAgICAgICAgICAgIC8vIGJ1dCB5b3UgbmV2ZXIga25vdy4uLgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb252ZXJ0IHRoZSBjaGlsZHJlbgotICAgICAgICAgICAgTGlzdDxUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4+IGNoaWxkcmVuID0gY29udmVydEJpbmRpbmdDb250YWluZXIob2lmYy5nZXRDaGlsZHJlbigpLCBjb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gYWRkIGJvdGggdG8gY3VycmVudCBjb250YWluZXIKLSAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IFRyZWVJbXBsPEZpbGVhYmxlQ21pc09iamVjdD4oKEZpbGVhYmxlQ21pc09iamVjdCkgb2JqZWN0LCBjaGlsZHJlbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3RGb2xkZXIoKSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldE9iamVjdElkKCk7Ci0gICAgICAgIFN0cmluZyByb290Rm9sZGVySWQgPSBnZXRTZXNzaW9uKCkuZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRSb290Rm9sZGVySWQoKTsKLQotICAgICAgICByZXR1cm4gb2JqZWN0SWQuZXF1YWxzKHJvb3RGb2xkZXJJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZvbGRlciBnZXRGb2xkZXJQYXJlbnQoKSB7Ci0gICAgICAgIGlmIChpc1Jvb3RGb2xkZXIoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PEZvbGRlcj4gcGFyZW50cyA9IGdldFBhcmVudHMoZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwYXJlbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyZW50cy5nZXQoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICBTdHJpbmcgcGF0aDsKLQotICAgICAgICByZWFkTG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXRoIHByb3BlcnR5Ci0gICAgICAgICAgICBwYXRoID0gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5QQVRIKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIHBhdGggcHJvcGVydHkgaXNuJ3Qgc2V0LCBnZXQgaXQKLSAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0RGF0YSA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuZ2V0T2JqZWN0KGdldFJlcG9zaXRvcnlJZCgpLCBvYmplY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5UXVlcnlOYW1lKFByb3BlcnR5SWRzLlBBVEgpLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgImNtaXM6bm9uZSIsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKChvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSAmJiAob2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwYXRoUHJvcGVydHkgPSBvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLlBBVEgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoUHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICgoUHJvcGVydHlTdHJpbmcpIHBhdGhQcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZFVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2Ugc3RpbGwgZG9uJ3Qga25vdyB0aGUgcGF0aCAuLi4gaXQncyBub3QgYSBDTUlTIGNvbXBsaWFudCByZXBvc2l0b3J5Ci0gICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUmVwb3NpdG9yeSBkaWRuJ3QgcmV0dXJuICIgKyBQcm9wZXJ0eUlkcy5QQVRIICsgIiEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PEZvbGRlcj4gZ2V0UGFyZW50cyhPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGlzUm9vdEZvbGRlcigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotCi0gICAgICAgIE9iamVjdERhdGEgYmluZGluZ1BhcmVudCA9IGdldEJpbmRpbmcoKS5nZXROYXZpZ2F0aW9uU2VydmljZSgpLmdldEZvbGRlclBhcmVudChnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWQsCi0gICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlRdWVyeU5hbWUoUHJvcGVydHlJZHMuT0JKRUNUX0lEKSwgbnVsbCk7Ci0KLSAgICAgICAgaWYgKGJpbmRpbmdQYXJlbnQuZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuLi4uCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlJlcG9zaXRvcnkgc2VudCBpbnZhbGlkIGRhdGEhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgaWQgcHJvcGVydHkKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IGlkUHJvcGVydHkgPSBiaW5kaW5nUGFyZW50LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgIGlmICghKGlkUHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkKSAmJiAhKGlkUHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykpIHsKLSAgICAgICAgICAgIC8vIHRoZSByZXBvc2l0b3J5IHNlbnQgYW4gb2JqZWN0IHdpdGhvdXQgYSB2YWxpZCBvYmplY3QgaWQuLi4KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUmVwb3NpdG9yeSBzZW50IGludmFsaWQgZGF0YSEgTm8gb2JqZWN0IGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmV0Y2ggdGhlIG9iamVjdCBhbmQgbWFrZSBzdXJlIGl0IGlzIGEgZm9sZGVyCi0gICAgICAgIENtaXNPYmplY3QgcGFyZW50Rm9sZGVyID0gZ2V0U2Vzc2lvbigpLmdldE9iamVjdCgoU3RyaW5nKSBpZFByb3BlcnR5LmdldEZpcnN0VmFsdWUoKSwgY29udGV4dCk7Ci0gICAgICAgIGlmICghKHBhcmVudEZvbGRlciBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgIC8vIHRoZSByZXBvc2l0b3J5IHNlbnQgYW4gb2JqZWN0IHRoYXQgaXMgbm90IGEgZm9sZGVyLi4uCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlJlcG9zaXRvcnkgc2VudCBpbnZhbGlkIGRhdGEhIE9iamVjdCBpcyBub3QgYSBmb2xkZXIhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgoRm9sZGVyKSBwYXJlbnRGb2xkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGF0aHMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGdldFBhdGgoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRG9jdW1lbnQocHJvcGVydGllcywgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLCBudWxsLCBudWxsLCBudWxsLCBnZXRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShPYmplY3RJZCBzb3VyY2UsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKHNvdXJjZSwgcHJvcGVydGllcywgdmVyc2lvbmluZ1N0YXRlLCBudWxsLCBudWxsLCBudWxsLCBnZXRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEZvbGRlciBjcmVhdGVGb2xkZXIoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcykgewotICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVGb2xkZXIocHJvcGVydGllcywgbnVsbCwgbnVsbCwgbnVsbCwgZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2xpY3kgY3JlYXRlUG9saWN5KE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9saWN5KHByb3BlcnRpZXMsIG51bGwsIG51bGwsIG51bGwsIGdldFNlc3Npb24oKS5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbSBjcmVhdGVJdGVtKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlSXRlbShwcm9wZXJ0aWVzLCBudWxsLCBudWxsLCBudWxsLCBnZXRTZXNzaW9uKCkuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9JdGVtSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9JdGVtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTEyNjI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvSXRlbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotCi1wdWJsaWMgY2xhc3MgSXRlbUltcGwgZXh0ZW5kcyBBYnN0cmFjdEZpbGFibGVDbWlzT2JqZWN0IGltcGxlbWVudHMgSXRlbSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBJdGVtSW1wbChTZXNzaW9uSW1wbCBzZXNzaW9uLCBPYmplY3RUeXBlIG9iamVjdFR5cGUsIE9iamVjdERhdGEgb2JqZWN0RGF0YSwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGluaXRpYWxpemUoc2Vzc2lvbiwgb2JqZWN0VHlwZSwgb2JqZWN0RGF0YSwgY29udGV4dCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL09iamVjdElkSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9PYmplY3RJZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwYzFlYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL09iamVjdElkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPk9iamVjdElkPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdElkSW1wbCBpbXBsZW1lbnRzIE9iamVjdElkLCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RJZEltcGwoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJPYmplY3QgSWQ6ICIgKyBpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gaWQuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZC5lcXVhbHMoKChPYmplY3RJZEltcGwpIG9iaikuaWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvT3BlcmF0aW9uQ29udGV4dEltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvT3BlcmF0aW9uQ29udGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0YzY1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL09wZXJhdGlvbkNvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotCi0vKioKLSAqIHtAbGluayBPcGVyYXRpb25Db250ZXh0fSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbkNvbnRleHRJbXBsIGltcGxlbWVudHMgT3BlcmF0aW9uQ29udGV4dCwgU2VyaWFsaXphYmxlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfU1RBUiA9ICIqIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5ESVRJT05fTk9ORSA9ICJjbWlzOm5vbmUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFRyZWVTZXQ8U3RyaW5nPiBmaWx0ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGxvYWRTZWNvbmRhcnlUeXBlUHJvcGVydGllczsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUFjbHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlUG9saWNpZXM7Ci0gICAgcHJpdmF0ZSBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwczsKLSAgICBwcml2YXRlIFRyZWVTZXQ8U3RyaW5nPiByZW5kaXRpb25GaWx0ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudHM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3JkZXJCeTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGVFbmFibGVkOwotICAgIHByaXZhdGUgU3RyaW5nIGNhY2hlS2V5OwotICAgIHByaXZhdGUgaW50IG1heEl0ZW1zUGVyUGFnZTsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHRJbXBsKCkgewotICAgICAgICBzZXRGaWx0ZXIobnVsbCk7Ci0gICAgICAgIHNldExvYWRTZWNvbmRhcnlUeXBlUHJvcGVydGllcyhmYWxzZSk7Ci0gICAgICAgIHNldEluY2x1ZGVBY2xzKGZhbHNlKTsKLSAgICAgICAgc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnModHJ1ZSk7Ci0gICAgICAgIHNldEluY2x1ZGVQb2xpY2llcyhmYWxzZSk7Ci0gICAgICAgIHNldEluY2x1ZGVSZWxhdGlvbnNoaXBzKEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUpOwotICAgICAgICBzZXRSZW5kaXRpb25GaWx0ZXIobnVsbCk7Ci0gICAgICAgIHNldEluY2x1ZGVQYXRoU2VnbWVudHModHJ1ZSk7Ci0gICAgICAgIHNldE9yZGVyQnkobnVsbCk7Ci0gICAgICAgIHNldENhY2hlRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGdlbmVyYXRlQ2FjaGVLZXkoKTsKLQotICAgICAgICAvLyBkZWZhdWx0IHBhZ2Ugc2l6ZSBpcyAxMDAKLSAgICAgICAgc2V0TWF4SXRlbXNQZXJQYWdlKDEwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dEltcGwoT3BlcmF0aW9uQ29udGV4dCBzb3VyY2UpIHsKLSAgICAgICAgc2V0RmlsdGVyKHNvdXJjZS5nZXRGaWx0ZXIoKSk7Ci0gICAgICAgIHNldExvYWRTZWNvbmRhcnlUeXBlUHJvcGVydGllcyhzb3VyY2UubG9hZFNlY29uZGFyeVR5cGVQcm9wZXJ0aWVzKCkpOwotICAgICAgICBzZXRJbmNsdWRlQWNscyhzb3VyY2UuaXNJbmNsdWRlQWNscygpKTsKLSAgICAgICAgc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoc291cmNlLmlzSW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKSk7Ci0gICAgICAgIHNldEluY2x1ZGVQb2xpY2llcyhzb3VyY2UuaXNJbmNsdWRlUG9saWNpZXMoKSk7Ci0gICAgICAgIHNldEluY2x1ZGVSZWxhdGlvbnNoaXBzKHNvdXJjZS5nZXRJbmNsdWRlUmVsYXRpb25zaGlwcygpKTsKLSAgICAgICAgc2V0UmVuZGl0aW9uRmlsdGVyKHNvdXJjZS5nZXRSZW5kaXRpb25GaWx0ZXIoKSk7Ci0gICAgICAgIHNldEluY2x1ZGVQYXRoU2VnbWVudHMoc291cmNlLmlzSW5jbHVkZVBhdGhTZWdtZW50cygpKTsKLSAgICAgICAgc2V0T3JkZXJCeShzb3VyY2UuZ2V0T3JkZXJCeSgpKTsKLSAgICAgICAgc2V0Q2FjaGVFbmFibGVkKHNvdXJjZS5pc0NhY2hlRW5hYmxlZCgpKTsKLSAgICAgICAgZ2VuZXJhdGVDYWNoZUtleSgpOwotCi0gICAgICAgIHNldE1heEl0ZW1zUGVyUGFnZShzb3VyY2UuZ2V0TWF4SXRlbXNQZXJQYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dEltcGwoU2V0PFN0cmluZz4gcHJvcGVydHlGaWx0ZXIsIGJvb2xlYW4gaW5jbHVkZUFjbHMsIGJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBib29sZWFuIGluY2x1ZGVQb2xpY2llcywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFNldDxTdHJpbmc+IHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50cywgU3RyaW5nIG9yZGVyQnksIGJvb2xlYW4gY2FjaGVFbmFibGVkLCBpbnQgbWF4SXRlbXNQZXJQYWdlKSB7Ci0gICAgICAgIHNldEZpbHRlcihwcm9wZXJ0eUZpbHRlcik7Ci0gICAgICAgIHNldEluY2x1ZGVBY2xzKGluY2x1ZGVBY2xzKTsKLSAgICAgICAgc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICBzZXRJbmNsdWRlUG9saWNpZXMoaW5jbHVkZVBvbGljaWVzKTsKLSAgICAgICAgc2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICBzZXRSZW5kaXRpb25GaWx0ZXIocmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgc2V0SW5jbHVkZVBhdGhTZWdtZW50cyhpbmNsdWRlUGF0aFNlZ21lbnRzKTsKLSAgICAgICAgc2V0T3JkZXJCeShvcmRlckJ5KTsKLSAgICAgICAgc2V0Q2FjaGVFbmFibGVkKGNhY2hlRW5hYmxlZCk7Ci0gICAgICAgIGdlbmVyYXRlQ2FjaGVLZXkoKTsKLQotICAgICAgICBzZXRNYXhJdGVtc1BlclBhZ2UobWF4SXRlbXNQZXJQYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU2V0PFN0cmluZz4gZ2V0RmlsdGVyKCkgewotICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChmaWx0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEZpbHRlcihTZXQ8U3RyaW5nPiBwcm9wZXJ0eUZpbHRlcikgewotICAgICAgICBpZiAocHJvcGVydHlGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHRlbXBTZXQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG9pZCA6IHByb3BlcnR5RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9pZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyB0b2lkID0gb2lkLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAodG9pZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodG9pZC5lcXVhbHMoUFJPUEVSVElFU19TVEFSKSkgewotICAgICAgICAgICAgICAgICAgICB0ZW1wU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU2V0LmFkZChQUk9QRVJUSUVTX1NUQVIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRvaWQuaW5kZXhPZignLCcpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUXVlcnkgaWQgbXVzdCBub3QgY29udGFpbiBhIGNvbW1hISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRlbXBTZXQuYWRkKHRvaWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGVtcFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXIgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXIgPSB0ZW1wU2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsdGVyID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGdlbmVyYXRlQ2FjaGVLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRGaWx0ZXJTdHJpbmcoU3RyaW5nIHByb3BlcnR5RmlsdGVyKSB7Ci0gICAgICAgIGlmICgocHJvcGVydHlGaWx0ZXIgPT0gbnVsbCkgfHwgKHByb3BlcnR5RmlsdGVyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgc2V0RmlsdGVyKG51bGwpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gcHJvcGVydHlJZHMgPSBwcm9wZXJ0eUZpbHRlci5zcGxpdCgiLCIpOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4gdGVtcFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcGlkIDogcHJvcGVydHlJZHMpIHsKLSAgICAgICAgICAgIHRlbXBTZXQuYWRkKHBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRGaWx0ZXIodGVtcFNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsdGVyLmNvbnRhaW5zKFBST1BFUlRJRVNfU1RBUikpIHsKLSAgICAgICAgICAgIHJldHVybiBQUk9QRVJUSUVTX1NUQVI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaWx0ZXIuYWRkKFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgIGZpbHRlci5hZGQoUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lEKTsKLSAgICAgICAgZmlsdGVyLmFkZChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgIGlmIChsb2FkU2Vjb25kYXJ5VHlwZVByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIGZpbHRlci5hZGQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBvaWQgOiBmaWx0ZXIpIHsKLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2IuYXBwZW5kKG9pZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRMb2FkU2Vjb25kYXJ5VHlwZVByb3BlcnRpZXMoYm9vbGVhbiBsb2FkKSB7Ci0gICAgICAgIGxvYWRTZWNvbmRhcnlUeXBlUHJvcGVydGllcyA9IGxvYWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbG9hZFNlY29uZGFyeVR5cGVQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gbG9hZFNlY29uZGFyeVR5cGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5jbHVkZUFjbHMoKSB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlQWNsczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbmNsdWRlQWNscyhib29sZWFuIGluY2x1ZGUpIHsKLSAgICAgICAgaW5jbHVkZUFjbHMgPSBpbmNsdWRlOwotICAgICAgICBnZW5lcmF0ZUNhY2hlS2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldEluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKGJvb2xlYW4gaW5jbHVkZSkgewotICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGluY2x1ZGU7Ci0gICAgICAgIGdlbmVyYXRlQ2FjaGVLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0luY2x1ZGVQb2xpY2llcygpIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGVQb2xpY2llczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbmNsdWRlUG9saWNpZXMoYm9vbGVhbiBpbmNsdWRlKSB7Ci0gICAgICAgIGluY2x1ZGVQb2xpY2llcyA9IGluY2x1ZGU7Ci0gICAgICAgIGdlbmVyYXRlQ2FjaGVLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgSW5jbHVkZVJlbGF0aW9uc2hpcHMgZ2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlUmVsYXRpb25zaGlwczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbmNsdWRlUmVsYXRpb25zaGlwcyhJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlKSB7Ci0gICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gaW5jbHVkZTsKLSAgICAgICAgZ2VuZXJhdGVDYWNoZUtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTZXQ8U3RyaW5nPiBnZXRSZW5kaXRpb25GaWx0ZXIoKSB7Ci0gICAgICAgIGlmIChyZW5kaXRpb25GaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UmVuZGl0aW9uRmlsdGVyKFNldDxTdHJpbmc+IHJlbmRpdGlvbkZpbHRlcikgewotICAgICAgICBUcmVlU2V0PFN0cmluZz4gdGVtcFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQotICAgICAgICBpZiAocmVuZGl0aW9uRmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHJmIDogcmVuZGl0aW9uRmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRyZiA9IHJmLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAodHJmLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0cmYuaW5kZXhPZignLCcpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVuZGl0aW9uIG11c3Qgbm90IGNvbnRhaW4gYSBjb21tYSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0ZW1wU2V0LmFkZCh0cmYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGVtcFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0ZW1wU2V0LmFkZChSRU5ESVRJT05fTk9ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZW1wU2V0LmFkZChSRU5ESVRJT05fTk9ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnJlbmRpdGlvbkZpbHRlciA9IHRlbXBTZXQ7Ci0gICAgICAgIGdlbmVyYXRlQ2FjaGVLZXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoU3RyaW5nIHJlbmRpdGlvbkZpbHRlcikgewotICAgICAgICBpZiAocmVuZGl0aW9uRmlsdGVyID09IG51bGwgfHwgcmVuZGl0aW9uRmlsdGVyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRSZW5kaXRpb25GaWx0ZXIobnVsbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSByZW5kaXRpb25zID0gcmVuZGl0aW9uRmlsdGVyLnNwbGl0KCIsIik7Ci0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiB0ZW1wU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyByZW5kIDogcmVuZGl0aW9ucykgewotICAgICAgICAgICAgdGVtcFNldC5hZGQocmVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRSZW5kaXRpb25GaWx0ZXIodGVtcFNldCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChyZW5kaXRpb25GaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKFN0cmluZyByZiA6IHJlbmRpdGlvbkZpbHRlcikgewotICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQocmYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbmNsdWRlUGF0aFNlZ21lbnRzKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZVBhdGhTZWdtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRJbmNsdWRlUGF0aFNlZ21lbnRzKGJvb2xlYW4gaW5jbHVkZSkgewotICAgICAgICBpbmNsdWRlUGF0aFNlZ21lbnRzID0gaW5jbHVkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE9yZGVyQnkoKSB7Ci0gICAgICAgIHJldHVybiBvcmRlckJ5OwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIG9yZGVyQnkpIHsKLSAgICAgICAgdGhpcy5vcmRlckJ5ID0gb3JkZXJCeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NhY2hlRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNhY2hlRW5hYmxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYWNoZUVuYWJsZWQoYm9vbGVhbiBjYWNoZUVuYWJsZWQpIHsKLSAgICAgICAgdGhpcy5jYWNoZUVuYWJsZWQgPSBjYWNoZUVuYWJsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDYWNoZUtleSgpIHsKLSAgICAgICAgcmV0dXJuIGNhY2hlS2V5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIG5ldyBjYWNoZSBrZXkgZnJvbSBhbGwgcGFyYW1ldGVycyB0aGF0IGFyZSByZWxldmFudCBmb3IKLSAgICAgKiBjYWNoaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGdlbmVyYXRlQ2FjaGVLZXkoKSB7Ci0gICAgICAgIGlmICghY2FjaGVFbmFibGVkKSB7Ci0gICAgICAgICAgICBjYWNoZUtleSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBzYi5hcHBlbmQoaW5jbHVkZUFjbHMgPyAnMScgOiAnMCcpOwotICAgICAgICBzYi5hcHBlbmQoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPyAnMScgOiAnMCcpOwotICAgICAgICBzYi5hcHBlbmQoaW5jbHVkZVBvbGljaWVzID8gJzEnIDogJzAnKTsKLSAgICAgICAgc2IuYXBwZW5kKCd8Jyk7Ci0gICAgICAgIHNiLmFwcGVuZChmaWx0ZXIgPT0gbnVsbCA/ICIiIDogZ2V0RmlsdGVyU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQoJ3wnKTsKLSAgICAgICAgc2IuYXBwZW5kKGluY2x1ZGVSZWxhdGlvbnNoaXBzID09IG51bGwgPyAiIiA6IGluY2x1ZGVSZWxhdGlvbnNoaXBzLnZhbHVlKCkpOwotCi0gICAgICAgIHNiLmFwcGVuZCgnfCcpOwotICAgICAgICBzYi5hcHBlbmQocmVuZGl0aW9uRmlsdGVyID09IG51bGwgPyAiIiA6IGdldFJlbmRpdGlvbkZpbHRlclN0cmluZygpKTsKLQotICAgICAgICBjYWNoZUtleSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRNYXhJdGVtc1BlclBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtYXhJdGVtc1BlclBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0TWF4SXRlbXNQZXJQYWdlKGludCBtYXhJdGVtc1BlclBhZ2UpIHsKLSAgICAgICAgaWYgKG1heEl0ZW1zUGVyUGFnZSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1zUGVyUGFnZSBtdXN0IGJlID4gMCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWF4SXRlbXNQZXJQYWdlID0gbWF4SXRlbXNQZXJQYWdlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUG9saWN5SW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9Qb2xpY3lJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTg5NWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9Qb2xpY3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3lJbXBsIGV4dGVuZHMgQWJzdHJhY3RGaWxhYmxlQ21pc09iamVjdCBpbXBsZW1lbnRzIFBvbGljeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBQb2xpY3lJbXBsKFNlc3Npb25JbXBsIHNlc3Npb24sIE9iamVjdFR5cGUgb2JqZWN0VHlwZSwgT2JqZWN0RGF0YSBvYmplY3REYXRhLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZShzZXNzaW9uLCBvYmplY3RUeXBlLCBvYmplY3REYXRhLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvbGljeVRleHQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5SWRzLlBPTElDWV9URVhUKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUHJvcGVydHlJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1Byb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTZhNjFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0UHJvcGVydHlEYXRhOwotCi0vKioKLSAqIFByb3BlcnR5IEltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbXBsPFQ+IGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eURhdGE8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxUPiwgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIHByaXZhdGUgZmluYWwgUHJvcGVydHlEZWZpbml0aW9uPFQ+IHByb3BlcnR5RGVmaW5pdGlvbjsKLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkKSB7Ci0gICAgICAgIHNldElkKHBkLmdldElkKCkpOwotICAgICAgICBzZXREaXNwbGF5TmFtZShwZC5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgc2V0TG9jYWxOYW1lKHBkLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgc2V0UXVlcnlOYW1lKHBkLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgcHJvcGVydHkgZnJvbSBhIGxpc3Qgb2YgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eUltcGwoUHJvcGVydHlEZWZpbml0aW9uPFQ+IHBkLCBMaXN0PFQ+IHZhbHVlcykgewotICAgICAgICBpZiAocGQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbiA9IHBkOwotICAgICAgICBpbml0aWFsaXplKHBkKTsKLSAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydHlJbXBsKFByb3BlcnR5PFQ+IHByb3BlcnR5KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb24gPSBwcm9wZXJ0eS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIGluaXRpYWxpemUocHJvcGVydHkuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgc2V0VmFsdWVzKG5ldyBBcnJheUxpc3Q8VD4ocHJvcGVydHkuZ2V0VmFsdWVzKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZWZpbml0aW9uPFQ+IGdldERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eURlZmluaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5VHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlEZWZpbml0aW9uLmdldFByb3BlcnR5VHlwZSgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyA8VT4gVSBnZXRWYWx1ZSgpIHsKLSAgICAgICAgTGlzdDxUPiB2YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKLSAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5LlNJTkdMRSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5pc0VtcHR5KCkgPyBudWxsIDogKFUpIHZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKFUpIHZhbHVlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZygpIHsKLSAgICAgICAgTGlzdDxUPiB2YWx1ZXMgPSBnZXRWYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHVlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHZhbHVlcy5nZXQoMCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVzQXNTdHJpbmcoKSB7Ci0gICAgICAgIExpc3Q8VD4gdmFsdWVzID0gZ2V0VmFsdWVzKCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKFQgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmb3JtYXRWYWx1ZSh2YWx1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJbIiArIHJlc3VsdC50b1N0cmluZygpICsgIl0iOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdFZhbHVlKFQgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgcmVzdWx0ID0gKChHcmVnb3JpYW5DYWxlbmRhcikgdmFsdWUpLmdldFRpbWUoKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNdWx0aVZhbHVlZCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5Lk1VTFRJOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUXVlcnlSZXN1bHRJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1F1ZXJ5UmVzdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTE0NzgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUXVlcnlSZXN1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVuZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlF1ZXJ5UmVzdWx0PC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5UmVzdWx0SW1wbCBpbXBsZW1lbnRzIFF1ZXJ5UmVzdWx0LCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllc0J5SWQ7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXNCeVF1ZXJ5TmFtZTsKLSAgICBwcml2YXRlIEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9uczsKLSAgICBwcml2YXRlIExpc3Q8UmVsYXRpb25zaGlwPiByZWxhdGlvbnNoaXBzOwotICAgIHByaXZhdGUgTGlzdDxSZW5kaXRpb24+IHJlbmRpdGlvbnM7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUXVlcnlSZXN1bHRJbXBsKFNlc3Npb24gc2Vzc2lvbiwgT2JqZWN0RGF0YSBvYmplY3REYXRhKSB7Ci0gICAgICAgIHByb3BlcnRpZXNCeUlkID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXNCeVF1ZXJ5TmFtZSA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PigpOwotCi0gICAgICAgIGlmIChvYmplY3REYXRhICE9IG51bGwpIHsKLQotICAgICAgICAgICAgT2JqZWN0RmFjdG9yeSBvZiA9IHNlc3Npb24uZ2V0T2JqZWN0RmFjdG9yeSgpOwotCi0gICAgICAgICAgICAvLyBoYW5kbGUgcHJvcGVydGllcwotICAgICAgICAgICAgaWYgKG9iamVjdERhdGEuZ2V0UHJvcGVydGllcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcXVlcnlQcm9wZXJ0aWVzID0gb2YuY29udmVydFF1ZXJ5UHJvcGVydGllcyhvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA6IHF1ZXJ5UHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzQnlJZC5wdXQocHJvcGVydHkuZ2V0SWQoKSwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzQnlRdWVyeU5hbWUucHV0KHByb3BlcnR5LmdldFF1ZXJ5TmFtZSgpLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBoYW5kbGUgYWxsb3dhYmxlIGFjdGlvbnMKLSAgICAgICAgICAgIGlmIChvYmplY3REYXRhLmdldEFsbG93YWJsZUFjdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5hbGxvd2FibGVBY3Rpb25zID0gb2JqZWN0RGF0YS5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGhhbmRsZSByZWxhdGlvbnNoaXBzCi0gICAgICAgICAgICBpZiAob2JqZWN0RGF0YS5nZXRSZWxhdGlvbnNoaXBzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aW9uc2hpcD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgcm9kIDogb2JqZWN0RGF0YS5nZXRSZWxhdGlvbnNoaXBzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ21pc09iamVjdCByZWxhdGlvbnNoaXAgPSBvZi5jb252ZXJ0T2JqZWN0KHJvZCwgc2Vzc2lvbi5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwcy5hZGQoKFJlbGF0aW9uc2hpcCkgcmVsYXRpb25zaGlwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaGFuZGxlIHJlbmRpdGlvbnMKLSAgICAgICAgICAgIGlmIChvYmplY3REYXRhLmdldFJlbmRpdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5yZW5kaXRpb25zID0gbmV3IEFycmF5TGlzdDxSZW5kaXRpb24+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChSZW5kaXRpb25EYXRhIHJkIDogb2JqZWN0RGF0YS5nZXRSZW5kaXRpb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kaXRpb25zLmFkZChvZi5jb252ZXJ0UmVuZGl0aW9uKG51bGwsIHJkKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KHByb3BlcnRpZXNCeVF1ZXJ5TmFtZS52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIDxUPiBQcm9wZXJ0eURhdGE8VD4gZ2V0UHJvcGVydHlCeUlkKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gKFByb3BlcnR5RGF0YTxUPikgcHJvcGVydGllc0J5SWQuZ2V0KGlkKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgPFQ+IFByb3BlcnR5RGF0YTxUPiBnZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKFN0cmluZyBxdWVyeU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChQcm9wZXJ0eURhdGE8VD4pIHByb3BlcnRpZXNCeVF1ZXJ5TmFtZS5nZXQocXVlcnlOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0UHJvcGVydHlWYWx1ZUJ5SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTxUPiBwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlJZChpZCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBUIGdldFByb3BlcnR5VmFsdWVCeVF1ZXJ5TmFtZShTdHJpbmcgcXVlcnlOYW1lKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTxUPiBwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlRdWVyeU5hbWUocXVlcnlOYW1lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldEZpcnN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IExpc3Q8VD4gZ2V0UHJvcGVydHlNdWx0aXZhbHVlQnlJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgUHJvcGVydHlEYXRhPFQ+IHByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUlkKGlkKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldFZhbHVlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBnZXRQcm9wZXJ0eU11bHRpdmFsdWVCeVF1ZXJ5TmFtZShTdHJpbmcgcXVlcnlOYW1lKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTxUPiBwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlRdWVyeU5hbWUocXVlcnlOYW1lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldFZhbHVlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBhbGxvd2FibGVBY3Rpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlbGF0aW9uc2hpcD4gZ2V0UmVsYXRpb25zaGlwcygpIHsKLSAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uPiBnZXRSZW5kaXRpb25zKCkgewotICAgICAgICByZXR1cm4gcmVuZGl0aW9uczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1F1ZXJ5U3RhdGVtZW50SW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9RdWVyeVN0YXRlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjZTg1ZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1F1ZXJ5U3RhdGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuKjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5RdWVyeVJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5U3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlN0cmluZ0xpc3RCdWlsZGVyOwotCi0vKioKLSAqIFF1ZXJ5U3RhdGVtZW50IGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlTdGF0ZW1lbnRJbXBsIGltcGxlbWVudHMgUXVlcnlTdGF0ZW1lbnQsIENsb25lYWJsZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb24gc2Vzc2lvbjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdGF0ZW1lbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBwYXJhbWV0ZXJzTWFwID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFF1ZXJ5U3RhdGVtZW50IG9iamVjdCB3aXRoIGEgZ2l2ZW4gc3RhdGVtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXNzaW9uCi0gICAgICogICAgICAgICAgICB0aGUgU2Vzc2lvbiBvYmplY3QsIG11c3Qgbm90IGJlIHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSBzdGF0ZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBxdWVyeSBzdGF0ZW1lbnQgd2l0aCBwbGFjZWhvbGRlcnMgKCc/JyksIHNlZQotICAgICAqICAgICAgICAgICAge0BsaW5rIFF1ZXJ5U3RhdGVtZW50fSBmb3IgZGV0YWlscwotICAgICAqLwotICAgIHB1YmxpYyBRdWVyeVN0YXRlbWVudEltcGwoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlc3Npb24gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0YXRlbWVudCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgIHRoaXMuc3RhdGVtZW50ID0gc3RhdGVtZW50LnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUXVlcnlTdGF0ZW1lbnQgb2JqZWN0IGZvciBhIHF1ZXJ5IG9mIG9uZSBwcmltYXJ5IHR5cGUgam9pbmVkIGJ5Ci0gICAgICogemVybyBvciBtb3JlIHNlY29uZGFyeSB0eXBlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIFNlc3Npb24gb2JqZWN0LCBtdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKiBAcGFyYW0gc2VsZWN0UHJvcGVydHlJZHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBJRHMgaW4gdGhlIFNFTEVDVCBzdGF0ZW1lbnQsIGlmIHtAY29kZSBudWxsfSBhbGwKLSAgICAgKiAgICAgICAgICAgIHByb3BlcnRpZXMgYXJlIHNlbGVjdGVkCi0gICAgICogQHBhcmFtIGZyb21UeXBlcwotICAgICAqICAgICAgICAgICAgYSBNYXAgb2YgdHlwZSBhbGlhc2VzIChrZXlzKSBhbmQgdHlwZSBJRHMgKHZhbHVlcyksIHRoZSBNYXAKLSAgICAgKiAgICAgICAgICAgIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBwcmltYXJ5IHR5cGUgYW5kIHplcm8gb3IgbW9yZQotICAgICAqICAgICAgICAgICAgc2Vjb25kYXJ5IHR5cGVzCi0gICAgICogQHBhcmFtIHdoZXJlQ2xhdXNlCi0gICAgICogICAgICAgICAgICBhbiBvcHRpb25hbCBXSEVSRSBjbGF1c2Ugd2l0aCBwbGFjZWhvbGRlcnMgKCc/JyksIHNlZQotICAgICAqICAgICAgICAgICAge0BsaW5rIFF1ZXJ5U3RhdGVtZW50fSBmb3IgZGV0YWlscwotICAgICAqIEBwYXJhbSBvcmRlckJ5UHJvcGVydHlJZHMKLSAgICAgKiAgICAgICAgICAgIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcHJvcGVydGllcyBJRHMgZm9yIHRoZSBPUkRFUiBCWSBjbGF1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUXVlcnlTdGF0ZW1lbnRJbXBsKFNlc3Npb24gc2Vzc2lvbiwgQ29sbGVjdGlvbjxTdHJpbmc+IHNlbGVjdFByb3BlcnR5SWRzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZyb21UeXBlcywKLSAgICAgICAgICAgIFN0cmluZyB3aGVyZUNsYXVzZSwgTGlzdDxTdHJpbmc+IG9yZGVyQnlQcm9wZXJ0eUlkcykgewotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoZnJvbVR5cGVzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZXMgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc3RtdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgcHJpbWFyeSB0eXBlIGFuZCBjaGVjayBpZiBhbGwgdHlwZXMgYXJlIHF1ZXJ5YWJsZQotICAgICAgICBPYmplY3RUeXBlIHByaW1hcnlUeXBlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHByaW1hcnlBbGlhcyA9IG51bGw7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0VHlwZT4gdHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdFR5cGU+KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBmdGUgOiBmcm9tVHlwZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgT2JqZWN0VHlwZSB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihmdGUuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChCb29sZWFuLkZBTFNFLmVxdWFscyh0eXBlLmlzUXVlcnlhYmxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSAnIiArIGZ0ZS5nZXRWYWx1ZSgpICsgIicgaXMgbm90IHF1ZXJ5YWJsZSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFsaWFzID0gZnRlLmdldEtleSgpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChhbGlhcy5sZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGFsaWFzIGZvciB0eXBlICciICsgZnRlLmdldFZhbHVlKCkgKyAiJyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpICE9IEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJpbWFyeVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmltYXJ5VHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHByaW1hcnlBbGlhcyA9IGFsaWFzOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR3byBwcmltYXJ5IHR5cGVzIGZvdW5kOiAiICsgcHJpbWFyeVR5cGUuZ2V0SWQoKSArICIgYW5kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBleGNsdWRlIHNlY29uZGFyeSB0eXBlcyB3aXRob3V0IHByb3BlcnRpZXMKLSAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpKSkgewotICAgICAgICAgICAgICAgIHR5cGVzLnB1dChhbGlhcywgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJpbWFyeVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gcHJpbWFyeSB0eXBlIGZvdW5kISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU0VMRUNUCi0gICAgICAgIHN0bXQuYXBwZW5kKCJTRUxFQ1QgIik7Ci0KLSAgICAgICAgU3RyaW5nTGlzdEJ1aWxkZXIgc2VsZWN0TGlzdCA9IG5ldyBTdHJpbmdMaXN0QnVpbGRlcigiLCIsIHN0bXQpOwotCi0gICAgICAgIGlmIChpc051bGxPckVtcHR5KHNlbGVjdFByb3BlcnR5SWRzKSkgewotICAgICAgICAgICAgLy8gc2VsZWN0IGFsbCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBhbGlhcyA6IHR5cGVzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0TGlzdC5hZGQoYWxpYXMgKyAiLioiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNlbGVjdCBwcm92aWRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eUlkIDogc2VsZWN0UHJvcGVydHlJZHMpIHsKLQotICAgICAgICAgICAgICAgIHByb3BlcnR5SWQgPSBwcm9wZXJ0eUlkLnRyaW0oKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHByb3BlcnR5ICIqIiAtPiBzZWxlY3QgYWxsIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiB0eXBlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdC5hZGQoYWxpYXMgKyAiLioiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lbmRzV2l0aCgiLioiKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBwcm9wZXJ0eSAieC4qIgotICAgICAgICAgICAgICAgICAgICAvLyAtPiBzZWxlY3QgYWxsIHByb3BlcnRpZXMgb2YgdGhlIHR5cGUgd2l0aCBhbGlhcyAieCIKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXJBbGlhcyA9IHByb3BlcnR5SWQuc3Vic3RyaW5nKDAsIHByb3BlcnR5SWQubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmNvbnRhaW5zS2V5KHN0YXJBbGlhcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdExpc3QuYWRkKHN0YXJBbGlhcyArICIuKiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbGlhcyAnIiArIHN0YXJBbGlhcyArICInIGlzIG5vdCBkZWZpbmVkISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BlcnR5RGVmID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWxpYXMgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RUeXBlPiB0ZSA6IHR5cGVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEZWYgPSB0ZS5nZXRWYWx1ZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcGVydHlJZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eURlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGlhcyA9IHRlLmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlEZWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIHByb3BlcnR5SWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBwcm92aWRlZCBvYmplY3QgdHlwZXMhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RGVmLmdldFF1ZXJ5TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wZXJ0eUlkICsgIicgaGFzIG5vIHF1ZXJ5IG5hbWUhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2VsZWN0TGlzdC5hZGQoYWxpYXMgKyAiLiIgKyBwcm9wZXJ0eURlZi5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGUk9NCi0gICAgICAgIHN0bXQuYXBwZW5kKCIgRlJPTSAiKTsKLQotICAgICAgICBzdG10LmFwcGVuZChwcmltYXJ5VHlwZS5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgIHN0bXQuYXBwZW5kKCIgQVMgIik7Ci0gICAgICAgIHN0bXQuYXBwZW5kKHByaW1hcnlBbGlhcyk7Ci0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RUeXBlPiB0ZSA6IHR5cGVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmICh0ZS5nZXRLZXkoKS5lcXVhbHMocHJpbWFyeUFsaWFzKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdG10LmFwcGVuZCgiIEpPSU4gIik7Ci0gICAgICAgICAgICBzdG10LmFwcGVuZCh0ZS5nZXRWYWx1ZSgpLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgICAgIHN0bXQuYXBwZW5kKCIgQVMgIik7Ci0gICAgICAgICAgICBzdG10LmFwcGVuZCh0ZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBzdG10LmFwcGVuZCgiIE9OICIpOwotICAgICAgICAgICAgc3RtdC5hcHBlbmQocHJpbWFyeUFsaWFzKTsKLSAgICAgICAgICAgIHN0bXQuYXBwZW5kKCIuY21pczpvYmplY3RJZD0iKTsKLSAgICAgICAgICAgIHN0bXQuYXBwZW5kKHRlLmdldEtleSgpKTsKLSAgICAgICAgICAgIHN0bXQuYXBwZW5kKCIuY21pczpvYmplY3RJZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV0hFUkUKLSAgICAgICAgaWYgKHdoZXJlQ2xhdXNlICE9IG51bGwgJiYgd2hlcmVDbGF1c2UudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgc3RtdC5hcHBlbmQoIiBXSEVSRSAiKTsKLSAgICAgICAgICAgIHN0bXQuYXBwZW5kKHdoZXJlQ2xhdXNlLnRyaW0oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPUkRFUiBCWQotICAgICAgICBpZiAoaXNOb3RFbXB0eShvcmRlckJ5UHJvcGVydHlJZHMpKSB7Ci0gICAgICAgICAgICBzdG10LmFwcGVuZCgiIE9SREVSIEJZICIpOwotCi0gICAgICAgICAgICBTdHJpbmdMaXN0QnVpbGRlciBvcmRlckJ5TGlzdCA9IG5ldyBTdHJpbmdMaXN0QnVpbGRlcigiLCIsIHN0bXQpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eUlkIDogb3JkZXJCeVByb3BlcnR5SWRzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlYWxQcm9wZXJ0eUlkID0gcHJvcGVydHlJZC50cmltKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlYWxQcm9wZXJ0eUlkTG93ZXIgPSByZWFsUHJvcGVydHlJZC50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkZXNjID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVhbFByb3BlcnR5SWRMb3dlci5lbmRzV2l0aCgiIGFzYyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGVuZHMgd2l0aCAiIGFzYyIgLT4gcmVtb3ZlIGl0Ci0gICAgICAgICAgICAgICAgICAgIHJlYWxQcm9wZXJ0eUlkID0gcmVhbFByb3BlcnR5SWQuc3Vic3RyaW5nKDAsIHJlYWxQcm9wZXJ0eUlkLmxlbmd0aCgpIC0gNCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlYWxQcm9wZXJ0eUlkTG93ZXIuZW5kc1dpdGgoIiBkZXNjIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgZW5kcyB3aXRoICIgZGVzYyIgLT4gcmVtb3ZlIGl0IGFuZCBtYXJrIGl0IGFzCi0gICAgICAgICAgICAgICAgICAgIC8vIGRlc2NlbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgcmVhbFByb3BlcnR5SWQgPSByZWFsUHJvcGVydHlJZC5zdWJzdHJpbmcoMCwgcmVhbFByb3BlcnR5SWQubGVuZ3RoKCkgLSA1KTsKLSAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BlcnR5RGVmID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWxpYXMgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RUeXBlPiB0ZSA6IHR5cGVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEZWYgPSB0ZS5nZXRWYWx1ZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocmVhbFByb3BlcnR5SWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMgPSB0ZS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5RGVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyByZWFsUHJvcGVydHlJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgaXMgbm90IGRlZmluZWQgaW4gdGhlIHByb3ZpZGVkIG9iamVjdCB0eXBlcyEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlEZWYuZ2V0UXVlcnlOYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIHJlYWxQcm9wZXJ0eUlkICsgIicgaGFzIG5vIHF1ZXJ5IG5hbWUhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uRkFMU0UuZXF1YWxzKHByb3BlcnR5RGVmLmlzT3JkZXJhYmxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgcmVhbFByb3BlcnR5SWQgKyAiJyBpcyBub3Qgb3JkZXJhYmxlISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9yZGVyQnlMaXN0LmFkZChhbGlhcyArICIuIiArIHByb3BlcnR5RGVmLmdldFF1ZXJ5TmFtZSgpICsgKGRlc2MgPyAiIERFU0MiIDogIiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuc3RhdGVtZW50ID0gc3RtdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHBhcmFtZXRlckluZGV4LCBTdHJpbmcgdHlwZUlkKSB7Ci0gICAgICAgIHNldFR5cGUocGFyYW1ldGVySW5kZXgsIHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24odHlwZUlkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShpbnQgcGFyYW1ldGVySW5kZXgsIE9iamVjdFR5cGUgdHlwZSkgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IHR5cGUuZ2V0UXVlcnlOYW1lKCk7Ci0gICAgICAgIGlmIChxdWVyeU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBoYXMgbm8gcXVlcnkgbmFtZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmFtZXRlcnNNYXAucHV0KHBhcmFtZXRlckluZGV4LCBxdWVyeU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHByb3BlcnR5SWQpIHsKLSAgICAgICAgT2JqZWN0VHlwZSB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotCi0gICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wZXJ0eURlZmluaXRpb24gPSB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcGVydHlJZCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eURlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRQcm9wZXJ0eShwYXJhbWV0ZXJJbmRleCwgcHJvcGVydHlEZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShpbnQgcGFyYW1ldGVySW5kZXgsIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSBwcm9wZXJ0eURlZmluaXRpb24uZ2V0UXVlcnlOYW1lKCk7Ci0gICAgICAgIGlmIChxdWVyeU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgaGFzIG5vIHF1ZXJ5IG5hbWUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJhbWV0ZXJzTWFwLnB1dChwYXJhbWV0ZXJJbmRleCwgcXVlcnlOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXIoaW50IHBhcmFtZXRlckluZGV4LCBOdW1iZXIuLi4gbnVtKSB7Ci0gICAgICAgIGlmIChudW0gPT0gbnVsbCB8fCBudW0ubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bWJlciBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0xpc3RCdWlsZGVyIHNsYiA9IG5ldyBTdHJpbmdMaXN0QnVpbGRlcigiLCIpOwotICAgICAgICBmb3IgKE51bWJlciBuIDogbnVtKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNsYi5hZGQobi50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmFtZXRlcnNNYXAucHV0KHBhcmFtZXRlckluZGV4LCBzbGIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nLi4uIHN0cikgewotICAgICAgICBpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdMaXN0QnVpbGRlciBzbGIgPSBuZXcgU3RyaW5nTGlzdEJ1aWxkZXIoIiwiKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IHN0cikgewotICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzbGIuYWRkKGVzY2FwZShzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJhbWV0ZXJzTWFwLnB1dChwYXJhbWV0ZXJJbmRleCwgc2xiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZ0NvbnRhaW5zKGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nIHN0cikgewotICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmFtZXRlcnNNYXAucHV0KHBhcmFtZXRlckluZGV4LCBlc2NhcGVDb250YWlucyhzdHIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdMaWtlKGludCBwYXJhbWV0ZXJJbmRleCwgU3RyaW5nIHN0cikgewotICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmFtZXRlcnNNYXAucHV0KHBhcmFtZXRlckluZGV4LCBlc2NhcGVMaWtlKHN0cikpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKGludCBwYXJhbWV0ZXJJbmRleCwgT2JqZWN0SWQuLi4gaWQpIHsKLSAgICAgICAgaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nTGlzdEJ1aWxkZXIgc2xiID0gbmV3IFN0cmluZ0xpc3RCdWlsZGVyKCIsIik7Ci0gICAgICAgIGZvciAoT2JqZWN0SWQgb2lkIDogaWQpIHsKLSAgICAgICAgICAgIGlmIChvaWQgPT0gbnVsbCB8fCBvaWQuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWQgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2xiLmFkZChlc2NhcGUob2lkLmdldElkKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmFtZXRlcnNNYXAucHV0KHBhcmFtZXRlckluZGV4LCBzbGIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKGludCBwYXJhbWV0ZXJJbmRleCwgVVJJLi4uIHVyaSkgewotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVSSSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0xpc3RCdWlsZGVyIHNsYiA9IG5ldyBTdHJpbmdMaXN0QnVpbGRlcigiLCIpOwotICAgICAgICBmb3IgKFVSSSB1IDogdXJpKSB7Ci0gICAgICAgICAgICBpZiAodSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVVJJIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNsYi5hZGQoZXNjYXBlKHUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW1ldGVyc01hcC5wdXQocGFyYW1ldGVySW5kZXgsIHNsYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmwoaW50IHBhcmFtZXRlckluZGV4LCBVUkwuLi4gdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVVJMIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nTGlzdEJ1aWxkZXIgc2xiID0gbmV3IFN0cmluZ0xpc3RCdWlsZGVyKCIsIik7Ci0gICAgICAgIGZvciAoVVJMIHUgOiB1cmwpIHsKLSAgICAgICAgICAgIGlmICh1ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVUkkgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2xiLmFkZChlc2NhcGUodS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJhbWV0ZXJzTWFwLnB1dChwYXJhbWV0ZXJJbmRleCwgc2xiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW4oaW50IHBhcmFtZXRlckluZGV4LCBib29sZWFuLi4uIGJvb2wpIHsKLSAgICAgICAgaWYgKGJvb2wgPT0gbnVsbCB8fCBib29sLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCb29sZWFuIG11c3Qgbm90IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0xpc3RCdWlsZGVyIHNsYiA9IG5ldyBTdHJpbmdMaXN0QnVpbGRlcigiLCIpOwotICAgICAgICBmb3IgKGJvb2xlYW4gYiA6IGJvb2wpIHsKLSAgICAgICAgICAgIHNsYi5hZGQoYiA/ICJUUlVFIiA6ICJGQUxTRSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW1ldGVyc01hcC5wdXQocGFyYW1ldGVySW5kZXgsIHNsYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlVGltZShpbnQgcGFyYW1ldGVySW5kZXgsIENhbGVuZGFyLi4uIGNhbCkgewotICAgICAgICBzZXREYXRlVGltZShwYXJhbWV0ZXJJbmRleCwgZmFsc2UsIGNhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZVRpbWVUaW1lc3RhbXAoaW50IHBhcmFtZXRlckluZGV4LCBDYWxlbmRhci4uLiBjYWwpIHsKLSAgICAgICAgc2V0RGF0ZVRpbWUocGFyYW1ldGVySW5kZXgsIHRydWUsIGNhbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGF0ZVRpbWUoaW50IHBhcmFtZXRlckluZGV4LCBib29sZWFuIHByZWZpeCwgQ2FsZW5kYXIuLi4gY2FsKSB7Ci0gICAgICAgIGlmIChjYWwgPT0gbnVsbCB8fCBjYWwubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbGVuZGFyIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoQ2FsZW5kYXIgYyA6IGNhbCkgewotICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGVUaW1lIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZWZpeCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiVElNRVNUQU1QICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoY29udmVydChjLmdldFRpbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW1ldGVyc01hcC5wdXQocGFyYW1ldGVySW5kZXgsIHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGVUaW1lKGludCBwYXJhbWV0ZXJJbmRleCwgRGF0ZS4uLiBkYXRlKSB7Ci0gICAgICAgIHNldERhdGVUaW1lKHBhcmFtZXRlckluZGV4LCBmYWxzZSwgZGF0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZVRpbWVUaW1lc3RhbXAoaW50IHBhcmFtZXRlckluZGV4LCBEYXRlLi4uIGRhdGUpIHsKLSAgICAgICAgc2V0RGF0ZVRpbWUocGFyYW1ldGVySW5kZXgsIHRydWUsIGRhdGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldERhdGVUaW1lKGludCBwYXJhbWV0ZXJJbmRleCwgYm9vbGVhbiBwcmVmaXgsIERhdGUuLi4gZGF0ZSkgewotICAgICAgICBpZiAoZGF0ZSA9PSBudWxsIHx8IGRhdGUubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdMaXN0QnVpbGRlciBzbGIgPSBuZXcgU3RyaW5nTGlzdEJ1aWxkZXIoIiwiKTsKLSAgICAgICAgZm9yIChEYXRlIGQgOiBkYXRlKSB7Ci0gICAgICAgICAgICBpZiAoZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGF0ZVRpbWUgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2xiLmFkZCgocHJlZml4ID8gIlRJTUVTVEFNUCAiIDogIiIpICsgY29udmVydChkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJhbWV0ZXJzTWFwLnB1dChwYXJhbWV0ZXJJbmRleCwgc2xiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGVUaW1lKGludCBwYXJhbWV0ZXJJbmRleCwgbG9uZy4uLiBtcykgewotICAgICAgICBzZXREYXRlVGltZShwYXJhbWV0ZXJJbmRleCwgZmFsc2UsIG1zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlVGltZVRpbWVzdGFtcChpbnQgcGFyYW1ldGVySW5kZXgsIGxvbmcuLi4gbXMpIHsKLSAgICAgICAgc2V0RGF0ZVRpbWUocGFyYW1ldGVySW5kZXgsIHRydWUsIG1zKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREYXRlVGltZShpbnQgcGFyYW1ldGVySW5kZXgsIGJvb2xlYW4gcHJlZml4LCBsb25nLi4uIG1zKSB7Ci0gICAgICAgIGlmIChtcyA9PSBudWxsIHx8IG1zLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaW1lc3RhbXAgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdMaXN0QnVpbGRlciBzbGIgPSBuZXcgU3RyaW5nTGlzdEJ1aWxkZXIoIiwiKTsKLSAgICAgICAgZm9yIChsb25nIGwgOiBtcykgewotICAgICAgICAgICAgc2xiLmFkZCgocHJlZml4ID8gIlRJTUVTVEFNUCAiIDogIiIpICsgY29udmVydChuZXcgRGF0ZShsKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW1ldGVyc01hcC5wdXQocGFyYW1ldGVySW5kZXgsIHNsYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvUXVlcnlTdHJpbmcoKSB7Ci0gICAgICAgIGJvb2xlYW4gaW5TdHIgPSBmYWxzZTsKLSAgICAgICAgaW50IHBhcmFtZXRlckluZGV4ID0gMDsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZW1lbnQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gc3RhdGVtZW50LmNoYXJBdChpKTsKLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1wnJykgewotICAgICAgICAgICAgICAgIGlmIChpblN0ciAmJiBzdGF0ZW1lbnQuY2hhckF0KGkgLSAxKSA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluU3RyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpblN0ciA9ICFpblN0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc/JyAmJiAhaW5TdHIpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJJbmRleCsrOwotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gcGFyYW1ldGVyc01hcC5nZXQocGFyYW1ldGVySW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8UXVlcnlSZXN1bHQ+IHF1ZXJ5KGJvb2xlYW4gc2VhcmNoQWxsVmVyc2lvbnMpIHsKLSAgICAgICAgcmV0dXJuIHNlc3Npb24ucXVlcnkodG9RdWVyeVN0cmluZygpLCBzZWFyY2hBbGxWZXJzaW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcXVlcnkoYm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uLnF1ZXJ5KHRvUXVlcnlTdHJpbmcoKSwgc2VhcmNoQWxsVmVyc2lvbnMsIGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBRdWVyeVN0YXRlbWVudEltcGwgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgICAgICBRdWVyeVN0YXRlbWVudEltcGwgcXMgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHN0YXRlbWVudCk7Ci0gICAgICAgIHFzLnBhcmFtZXRlcnNNYXAucHV0QWxsKHBhcmFtZXRlcnNNYXApOwotCi0gICAgICAgIHJldHVybiBxczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdG9RdWVyeVN0cmluZygpOwotICAgIH0KLQotICAgIC8vIC0tLSBpbnRlcm5hbCAtLS0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0cikgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIiciKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gc3RyLmNoYXJBdChpKTsKLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCgnXCcnKTsKLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlTGlrZShTdHJpbmcgc3RyKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiJyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBzdHIuY2hhckF0KGkpOwotCi0gICAgICAgICAgICBpZiAoYyA9PSAnXCcnKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBzdHIubGVuZ3RoKCkgJiYgKHN0ci5jaGFyQXQoaSArIDEpID09ICclJyB8fCBzdHIuY2hhckF0KGkgKyAxKSA9PSAnXycpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vIGFkZGl0aW9uYWwgYmFjayBzbGFzaAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCgnXCcnKTsKLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlQ29udGFpbnMoU3RyaW5nIHN0cikgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIiciKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2hhciBjID0gc3RyLmNoYXJBdChpKTsKLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXCcnIHx8IGMgPT0gJ1wiJykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFxcXFxcIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCgnXCcnKTsKLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydChEYXRlIGRhdGUpIHsKLSAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotICAgICAgICBzZGYuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLQotICAgICAgICByZXR1cm4gIiciICsgc2RmLmZvcm1hdChkYXRlKSArICInIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1JlbGF0aW9uc2hpcEltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUmVsYXRpb25zaGlwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTE1YTM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUmVsYXRpb25zaGlwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwSW1wbCBleHRlbmRzIEFic3RyYWN0Q21pc09iamVjdCBpbXBsZW1lbnRzIFJlbGF0aW9uc2hpcCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZWxhdGlvbnNoaXBJbXBsKFNlc3Npb25JbXBsIHNlc3Npb24sIE9iamVjdFR5cGUgb2JqZWN0VHlwZSwgT2JqZWN0RGF0YSBvYmplY3REYXRhLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZShzZXNzaW9uLCBvYmplY3RUeXBlLCBvYmplY3REYXRhLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdCBnZXRTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTb3VyY2UoZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IGdldFNvdXJjZShPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmVhZExvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdElkIHNvdXJjZUlkID0gZ2V0U291cmNlSWQoKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2VJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KHNvdXJjZUlkLCBjb250ZXh0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBnZXRTb3VyY2VJZCgpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUlkID0gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQpOwotICAgICAgICBpZiAoKHNvdXJjZUlkID09IG51bGwpIHx8IChzb3VyY2VJZC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmNyZWF0ZU9iamVjdElkKHNvdXJjZUlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUYXJnZXQoZ2V0U2Vzc2lvbigpLmdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IGdldFRhcmdldChPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmVhZExvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdElkIHRhcmdldElkID0gZ2V0VGFyZ2V0SWQoKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCkuZ2V0T2JqZWN0KHRhcmdldElkLCBjb250ZXh0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlYWRVbmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBnZXRUYXJnZXRJZCgpIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldElkID0gZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUlkcy5UQVJHRVRfSUQpOwotICAgICAgICBpZiAoKHRhcmdldElkID09IG51bGwpIHx8ICh0YXJnZXRJZC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpLmNyZWF0ZU9iamVjdElkKHRhcmdldElkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1JlbmRpdGlvbkltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUmVuZGl0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjkzZmQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUmVuZGl0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVuZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLkxpbmtBY2Nlc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZW5kaXRpb25EYXRhSW1wbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5SZW5kaXRpb248L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgUmVuZGl0aW9uSW1wbCBleHRlbmRzIFJlbmRpdGlvbkRhdGFJbXBsIGltcGxlbWVudHMgUmVuZGl0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb2JqZWN0SWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVuZGl0aW9uSW1wbChTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHN0cmVhbUlkLCBTdHJpbmcgcmVuZGl0aW9uRG9jdW1lbnRJZCwgU3RyaW5nIGtpbmQsCi0gICAgICAgICAgICBsb25nIGxlbmd0aCwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgdGl0bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCkgewotICAgICAgICBzdXBlcihzdHJlYW1JZCwgbWltZVR5cGUsIEJpZ0ludGVnZXIudmFsdWVPZihsZW5ndGgpLCBraW5kLCB0aXRsZSwgQmlnSW50ZWdlci52YWx1ZU9mKHdpZHRoKSwgQmlnSW50ZWdlcgotICAgICAgICAgICAgICAgIC52YWx1ZU9mKGhlaWdodCksIHJlbmRpdGlvbkRvY3VtZW50SWQpOwotICAgICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICB0aGlzLm9iamVjdElkID0gb2JqZWN0SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZ2V0QmlnTGVuZ3RoKCkgPT0gbnVsbCA/IC0xIDogZ2V0QmlnTGVuZ3RoKCkubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0SGVpZ2h0KCkgewotICAgICAgICByZXR1cm4gZ2V0QmlnSGVpZ2h0KCkgPT0gbnVsbCA/IC0xIDogZ2V0QmlnSGVpZ2h0KCkubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0V2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCaWdXaWR0aCgpID09IG51bGwgPyAtMSA6IGdldEJpZ1dpZHRoKCkubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGdldFJlbmRpdGlvbkRvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gZ2V0UmVuZGl0aW9uRG9jdW1lbnQoc2Vzc2lvbi5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0UmVuZGl0aW9uRG9jdW1lbnQoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChnZXRSZW5kaXRpb25Eb2N1bWVudElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgQ21pc09iamVjdCByZW5kRG9jID0gc2Vzc2lvbi5nZXRPYmplY3QoZ2V0UmVuZGl0aW9uRG9jdW1lbnRJZCgpLCBjb250ZXh0KTsKLSAgICAgICAgaWYgKCEocmVuZERvYyBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKERvY3VtZW50KSByZW5kRG9jOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKSB7Ci0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsIHx8IGdldFN0cmVhbUlkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50U3RyZWFtID0gc2Vzc2lvbi5nZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZW50U3RyZWFtKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRJZCgpLCBvYmplY3RJZCwgZ2V0U3RyZWFtSWQoKSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNDb25zdHJhaW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG5vIGNvbnRlbnQgc3RyZWFtCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZW50U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpOwotICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZmlsZW5hbWUgPSBnZXRUaXRsZSgpOwotICAgICAgICB9Ci0gICAgICAgIEJpZ0ludGVnZXIgYmlnTGVuZ3RoID0gY29udGVudFN0cmVhbS5nZXRCaWdMZW5ndGgoKTsKLSAgICAgICAgaWYgKGJpZ0xlbmd0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiaWdMZW5ndGggPSBnZXRCaWdMZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBsb25nIGxlbmd0aCA9IGJpZ0xlbmd0aCA9PSBudWxsID8gLTEgOiBiaWdMZW5ndGgubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUNvbnRlbnRTdHJlYW0oZmlsZW5hbWUsIGxlbmd0aCwgY29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpLAotICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFVybCgpIHsKLSAgICAgICAgaWYgKHNlc3Npb24uZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKSBpbnN0YW5jZW9mIExpbmtBY2Nlc3MpIHsKLSAgICAgICAgICAgIExpbmtBY2Nlc3MgbGlua0FjY2VzcyA9IChMaW5rQWNjZXNzKSBzZXNzaW9uLmdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gbGlua0FjY2Vzcy5sb2FkUmVuZGl0aW9uQ29udGVudExpbmsoc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldElkKCksIG9iamVjdElkLCBnZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvU2Vzc2lvbkZhY3RvcnlJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1Nlc3Npb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgyZDZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvU2Vzc2lvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGUuVHlwZURlZmluaXRpb25DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5jYWNoZS5DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQ21pc0JpbmRpbmc7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlc3Npb24gZmFjdG9yeS4gVXNlZCBieSB1bml0IHRlc3RzIG9yCi0gKiBhcHBsaWNhdGlvbnMgdGhhdCBkZXBlbmQgZGlyZWN0bHkgb24gcnVudGltZSBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogPGNvZGU+Ci0gKiBTZXNzaW9uRmFjdG9yeSBzZiA9IG5ldyBTZXNzaW9uRmFjdG9yeUltcGwoKTs8YnI+Ci0gKiBTZXNzaW9uIHMgPSBzZi5jcmVhdGVTZXNzaW9uKC4uLik7Ci0gKiA8L2NvZGU+Ci0gKiA8cD4KLSAqIEFsdGVybmF0aXZlIGZhY3RvcnkgbG9va3VwIG1ldGhvZHM6Ci0gKiA8cD4KLSAqIDxwPgotICogPGNvZGU+Ci0gKiBDb250ZXh0IGN0eCA9IG5ldyBEZWZhdWx0Q29udGV4dCgpOzxicj4KLSAqIFNlc3Npb25GYWN0b3J5ID0gY3R4Lmxvb2t1cChqbmRpX2tleSk7Ci0gKiA8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uRmFjdG9yeUltcGwgaW1wbGVtZW50cyBTZXNzaW9uRmFjdG9yeSwgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJvdGVjdGVkIFNlc3Npb25GYWN0b3J5SW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlc3Npb25GYWN0b3J5SW1wbCBuZXdJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRmFjdG9yeUltcGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXJzLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2UKLSAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI2NyZWF0ZVNlc3Npb24oTWFwLCBPYmplY3RGYWN0b3J5LCBBdXRoZW50aWNhdGlvblByb3ZpZGVyLCBDYWNoZSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgT2JqZWN0RmFjdG9yeSBvYmplY3RGYWN0b3J5LAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBDYWNoZSBjYWNoZSkgewotICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXJzLCBvYmplY3RGYWN0b3J5LCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBjYWNoZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBzZXNzaW9uLiBUaGUgcHJvdmlkZWQgb2JqZWN0IGZhY3RvcnksIGF1dGhlbnRpY2F0aW9uCi0gICAgICogcHJvdmlkZXIgYW5kIGNhY2hlIGluc3RhbmNlIG92ZXJyaWRlIHRoZSB2YWx1ZXMgaW4gdGhlIHNlc3Npb24gcGFyYW1ldGVycwotICAgICAqIGlmIHRoZXkgYXJlIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgYSB7QGNvZGUgTWFwfSBvZiBuYW1lL3ZhbHVlIHBhaXJzIHdpdGggcGFyYW1ldGVycyBmb3IgdGhlCi0gICAgICogICAgICAgICAgICBzZXNzaW9uCi0gICAgICogQHBhcmFtIG9iamVjdEZhY3RvcnkKLSAgICAgKiAgICAgICAgICAgIGFuIG9iamVjdCBmYWN0b3J5IGluc3RhbmNlCi0gICAgICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIKLSAgICAgKiAgICAgICAgICAgIGFuIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGluc3RhbmNlCi0gICAgICogQHBhcmFtIGNhY2hlCi0gICAgICogICAgICAgICAgICBhIGNhY2hlIGluc3RhbmNlCi0gICAgICogQHBhcmFtIHR5cGVEZWZDYWNoZQotICAgICAqICAgICAgICAgICAgYSB0eXBlIGRlZmluaXRpb24gY2FjaGUgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFNlc3Npb259IGNvbm5lY3RlZCB0byB0aGUgQ01JUyByZXBvc2l0b3J5Ci0gICAgICogQHRocm93cyBDbWlzQmFzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZSBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZAotICAgICAqIAotICAgICAqIEBzZWUgU2Vzc2lvblBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBPYmplY3RGYWN0b3J5IG9iamVjdEZhY3RvcnksCi0gICAgICAgICAgICBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIENhY2hlIGNhY2hlLCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZSkgewotICAgICAgICBTZXNzaW9uSW1wbCBzZXNzaW9uID0gbmV3IFNlc3Npb25JbXBsKHBhcmFtZXRlcnMsIG9iamVjdEZhY3RvcnksIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIGNhY2hlLCB0eXBlRGVmQ2FjaGUpOwotICAgICAgICBzZXNzaW9uLmNvbm5lY3QoKTsKLQotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5PiBnZXRSZXBvc2l0b3JpZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3JpZXMocGFyYW1ldGVycywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlCi0gICAgICogICAgICAgICAgICAge0BsaW5rICNnZXRSZXBvc2l0b3JpZXMoTWFwLCBPYmplY3RGYWN0b3J5LCBBdXRoZW50aWNhdGlvblByb3ZpZGVyLCBDYWNoZSwgVHlwZURlZmluaXRpb25DYWNoZSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5PiBnZXRSZXBvc2l0b3JpZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBPYmplY3RGYWN0b3J5IG9iamVjdEZhY3RvcnksCi0gICAgICAgICAgICBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGF1dGhlbnRpY2F0aW9uUHJvdmlkZXIsIENhY2hlIGNhY2hlKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3JpZXMocGFyYW1ldGVycywgb2JqZWN0RmFjdG9yeSwgYXV0aGVudGljYXRpb25Qcm92aWRlciwgY2FjaGUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHJlcG9zaXRvcmllcyB0aGF0IGFyZSBhdmFpbGFibGUgYXQgdGhlIGVuZHBvaW50LiBTZWUKLSAgICAgKiB7QGxpbmsgI2NyZWF0ZVNlc3Npb24oTWFwLCBPYmplY3RGYWN0b3J5LCBBdXRoZW50aWNhdGlvblByb3ZpZGVyLCBDYWNoZSl9Ci0gICAgICogZm9yIHBhcmFtZXRlciBkZXRhaWxzLiBUaGUgcGFyYW1ldGVyCi0gICAgICoge0Bjb2RlIFNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9JRH0gc2hvdWxkIG5vdCBiZSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeT4gZ2V0UmVwb3NpdG9yaWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgT2JqZWN0RmFjdG9yeSBvYmplY3RGYWN0b3J5LAotICAgICAgICAgICAgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBDYWNoZSBjYWNoZSwgVHlwZURlZmluaXRpb25DYWNoZSB0eXBlRGVmQ2FjaGUpIHsKLSAgICAgICAgQ21pc0JpbmRpbmcgYmluZGluZyA9IENtaXNCaW5kaW5nSGVscGVyLmNyZWF0ZUJpbmRpbmcocGFyYW1ldGVycywgYXV0aGVudGljYXRpb25Qcm92aWRlciwgdHlwZURlZkNhY2hlKTsKLQotICAgICAgICBMaXN0PFJlcG9zaXRvcnlJbmZvPiByZXBvc2l0b3J5SW5mb3MgPSBiaW5kaW5nLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0UmVwb3NpdG9yeUluZm9zKG51bGwpOwotCi0gICAgICAgIExpc3Q8UmVwb3NpdG9yeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5PigpOwotICAgICAgICBmb3IgKFJlcG9zaXRvcnlJbmZvIGRhdGEgOiByZXBvc2l0b3J5SW5mb3MpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IFJlcG9zaXRvcnlJbXBsKGRhdGEsIHBhcmFtZXRlcnMsIHRoaXMsIG9iamVjdEZhY3RvcnksIGJpbmRpbmcuZ2V0QXV0aGVudGljYXRpb25Qcm92aWRlcigpLAotICAgICAgICAgICAgICAgICAgICBjYWNoZSwgdHlwZURlZkNhY2hlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvU2Vzc2lvbkltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvU2Vzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ4MGYzZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1Nlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ2hhbmdlRXZlbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5RdWVyeVJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5U3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vjb25kYXJ5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5UeXBlRGVmaW5pdGlvbkNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLmNhY2hlLkNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLmNhY2hlLkNhY2hlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5yZXBvc2l0b3J5Lk9iamVjdEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWwuQWJzdHJhY3RQYWdlRmV0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS51dGlsLkNvbGxlY3Rpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS51dGlsLlRyZWVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC51dGlsLk9wZXJhdGlvbkNvbnRleHRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnN0cmFpbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5DbGFzc0xvYWRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkFjbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkV4dGVuZGVkQWNsU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5FeHRlbmRlZEhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5FeHRlbmRlZFJlcG9zaXRvcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZWxhdGlvbnNoaXBTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlcG9zaXRvcnlTZXJ2aWNlOwotCi0vKioKLSAqIFBlcnNpc3RlbnQgbW9kZWwgc2Vzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25JbXBsIGltcGxlbWVudHMgU2Vzc2lvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPcGVyYXRpb25Db250ZXh0IERFRkFVTFRfQ09OVEVYVCA9IG5ldyBPcGVyYXRpb25Db250ZXh0SW1wbChudWxsLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBudWxsLCB0cnVlLCAxMDApOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFVwZGF0YWJpbGl0eT4gQ1JFQVRFX1VQREFUQUJJTElUWSA9IEVudW1TZXQubm9uZU9mKFVwZGF0YWJpbGl0eS5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFVwZGF0YWJpbGl0eT4gQ1JFQVRFX0FORF9DSEVDS09VVF9VUERBVEFCSUxJVFkgPSBFbnVtU2V0Lm5vbmVPZihVcGRhdGFiaWxpdHkuY2xhc3MpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgQ1JFQVRFX1VQREFUQUJJTElUWS5hZGQoVXBkYXRhYmlsaXR5Lk9OQ1JFQVRFKTsKLSAgICAgICAgQ1JFQVRFX1VQREFUQUJJTElUWS5hZGQoVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIENSRUFURV9BTkRfQ0hFQ0tPVVRfVVBEQVRBQklMSVRZLmFkZChVcGRhdGFiaWxpdHkuT05DUkVBVEUpOwotICAgICAgICBDUkVBVEVfQU5EX0NIRUNLT1VUX1VQREFUQUJJTElUWS5hZGQoVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIENSRUFURV9BTkRfQ0hFQ0tPVVRfVVBEQVRBQklMSVRZLmFkZChVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQpOwotICAgIH0KLQotICAgIC8vIHByaXZhdGUgc3RhdGljIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTZXNzaW9uSW1wbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTGlua2VkSGFzaE1hcDxTdHJpbmcsIE9iamVjdFR5cGU+IG9iamVjdFR5cGVDYWNoZTsKLQotICAgIC8qCi0gICAgICogZGVmYXVsdCBzZXNzaW9uIGNvbnRleHQgKHNlcmlhbGl6YWJsZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgZGVmYXVsdENvbnRleHQgPSBERUZBVUxUX0NPTlRFWFQ7Ci0KLSAgICAvKgotICAgICAqIHNlc3Npb24gcGFyYW1ldGVyIChzZXJpYWxpemFibGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7Ci0KLSAgICAvKgotICAgICAqIENNSVMgYmluZGluZyAoc2VyaWFsaXphYmxlKQotICAgICAqLwotICAgIHByaXZhdGUgQ21pc0JpbmRpbmcgYmluZGluZzsKLQotICAgIC8qCi0gICAgICogU2Vzc2lvbiBMb2NhbGUsIGRldGVybWluZWQgZnJvbSBzZXNzaW9uIHBhcmFtZXRlciAoc2VyaWFsaXphYmxlKQotICAgICAqLwotICAgIHByaXZhdGUgTG9jYWxlIGxvY2FsZTsKLQotICAgIC8qCi0gICAgICogT2JqZWN0IGZhY3RvcnkgKHNlcmlhbGl6YWJsZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeTsKLQotICAgIC8qCi0gICAgICogQXV0aGVudGljYXRpb24gcHJvdmlkZXIgKHNlcmlhbGl6YWJsZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aGVudGljYXRpb25Qcm92aWRlcjsKLQotICAgIC8qCi0gICAgICogT2JqZWN0IGNhY2hlIChzZXJpYWxpemFibGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBDYWNoZSBjYWNoZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2FjaGVQYXRoT21pdDsKLQotICAgIC8qCi0gICAgICogVHlwZSBjYWNoZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlOwotCi0gICAgLyoKLSAgICAgKiBSZXBvc2l0b3J5IGluZm8gKHNlcmlhbGl6YWJsZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnlJbmZvOwotCi0gICAgLyoqCi0gICAgICogcmVxdWlyZWQgZm9yIHNlcmlhbGl6YXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uSW1wbChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSwKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aGVudGljYXRpb25Qcm92aWRlciwgQ2FjaGUgY2FjaGUsIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHBhcmFtZXRlcnMgcHJvdmlkZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgICAgICB0aGlzLmxvY2FsZSA9IGRldGVybWluZUxvY2FsZShwYXJhbWV0ZXJzKTsKLQotICAgICAgICB0aGlzLm9iamVjdEZhY3RvcnkgPSAob2JqZWN0RmFjdG9yeSA9PSBudWxsID8gY3JlYXRlT2JqZWN0RmFjdG9yeSgpIDogb2JqZWN0RmFjdG9yeSk7Ci0gICAgICAgIHRoaXMuYXV0aGVudGljYXRpb25Qcm92aWRlciA9IGF1dGhlbnRpY2F0aW9uUHJvdmlkZXI7Ci0gICAgICAgIHRoaXMuY2FjaGUgPSAoY2FjaGUgPT0gbnVsbCA/IGNyZWF0ZUNhY2hlKCkgOiBjYWNoZSk7Ci0gICAgICAgIHRoaXMudHlwZURlZkNhY2hlID0gdHlwZURlZkNhY2hlOwotCi0gICAgICAgIGNhY2hlUGF0aE9taXQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwYXJhbWV0ZXJzLmdldChTZXNzaW9uUGFyYW1ldGVyLkNBQ0hFX1BBVEhfT01JVCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgTG9jYWxlIGRldGVybWluZUxvY2FsZShNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgTG9jYWxlIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gcGFyYW1ldGVycy5nZXQoU2Vzc2lvblBhcmFtZXRlci5MT0NBTEVfSVNPNjM5X0xBTkdVQUdFKTsKLSAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBwYXJhbWV0ZXJzLmdldChTZXNzaW9uUGFyYW1ldGVyLkxPQ0FMRV9JU08zMTY2X0NPVU5UUlkpOwotICAgICAgICBTdHJpbmcgdmFyaWFudCA9IHBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxFX1ZBUklBTlQpOwotCi0gICAgICAgIGlmICh2YXJpYW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGFsbCAzIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBudWxsIGFuZCB2YWxpZAotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gMiBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbCBhbmQgdmFsaWQKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbCBhbmQgdmFsaWQKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IExvY2FsZShsYW5ndWFnZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0RmFjdG9yeSBjcmVhdGVPYmplY3RGYWN0b3J5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IHBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuT0JKRUNUX0ZBQ1RPUllfQ0xBU1MpOwotCi0gICAgICAgICAgICBDbGFzczw/PiBvYmplY3RGYWN0b3J5Q2xhc3M7Ci0gICAgICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvYmplY3RGYWN0b3J5Q2xhc3MgPSBPYmplY3RGYWN0b3J5SW1wbC5jbGFzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0RmFjdG9yeUNsYXNzID0gQ2xhc3NMb2FkZXJVdGlsLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3Qgb2YgPSBvYmplY3RGYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmICghKG9mIGluc3RhbmNlb2YgT2JqZWN0RmFjdG9yeSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiQ2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IE9iamVjdEZhY3RvcnkhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICgoT2JqZWN0RmFjdG9yeSkgb2YpLmluaXRpYWxpemUodGhpcywgcGFyYW1ldGVycyk7Ci0KLSAgICAgICAgICAgIHJldHVybiAoT2JqZWN0RmFjdG9yeSkgb2Y7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIG9iamVjdCBmYWN0b3J5OiAiICsgZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIENhY2hlIGNyZWF0ZUNhY2hlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IHBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfQ0xBU1MpOwotCi0gICAgICAgICAgICBDbGFzczw/PiBjYWNoZUNsYXNzOwotICAgICAgICAgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVDbGFzcyA9IENhY2hlSW1wbC5jbGFzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVDbGFzcyA9IENsYXNzTG9hZGVyVXRpbC5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IG9mID0gY2FjaGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgaWYgKCEob2YgaW5zdGFuY2VvZiBDYWNoZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiQ2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IENhY2hlISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAoKENhY2hlKSBvZikuaW5pdGlhbGl6ZSh0aGlzLCBwYXJhbWV0ZXJzKTsKLQotICAgICAgICAgICAgcmV0dXJuIChDYWNoZSkgb2Y7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIGNhY2hlOiAiICsgZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgbmV3IG9iamVjdCBjYWNoZQotICAgICAgICAgICAgY2FjaGUgPSBjcmVhdGVDYWNoZSgpOwotCi0gICAgICAgICAgICAvLyBjbGVhciBvYmplY3QgdHlwZSBjYWNoZQotICAgICAgICAgICAgb2JqZWN0VHlwZUNhY2hlID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gY2xlYXIgcHJvdmlkZXIgY2FjaGUKLSAgICAgICAgICAgIGdldEJpbmRpbmcoKS5jbGVhckFsbENhY2hlcygpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5IGdldE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgICAgIGFzc2VydCBvYmplY3RGYWN0b3J5ICE9IG51bGw7Ci0gICAgICAgIHJldHVybiBvYmplY3RGYWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8RG9jdW1lbnQ+IGdldENoZWNrZWRPdXREb2NzKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZE91dERvY3MoZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxEb2N1bWVudD4gZ2V0Q2hlY2tlZE91dERvY3MoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9wZXJhdGlvbiBjb250ZXh0IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTmF2aWdhdGlvblNlcnZpY2UgbmF2aWdhdGlvblNlcnZpY2UgPSBnZXRCaW5kaW5nKCkuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTsKLSAgICAgICAgZmluYWwgT2JqZWN0RmFjdG9yeSBvZiA9IGdldE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgZmluYWwgT3BlcmF0aW9uQ29udGV4dCBjdHh0ID0gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKGNvbnRleHQpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkl0ZXJhYmxlPERvY3VtZW50PihuZXcgQWJzdHJhY3RQYWdlRmV0Y2hlcjxEb2N1bWVudD4oY3R4dC5nZXRNYXhJdGVtc1BlclBhZ2UoKSkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFBhZ2VGZXRjaGVyLlBhZ2U8RG9jdW1lbnQ+IGZldGNoUGFnZShsb25nIHNraXBDb3VudCkgewotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IGFsbCBjaGVja2VkIG91dCBkb2N1bWVudHMKLSAgICAgICAgICAgICAgICBPYmplY3RMaXN0IGNoZWNrZWRPdXREb2NzID0gbmF2aWdhdGlvblNlcnZpY2UuZ2V0Q2hlY2tlZE91dERvY3MoZ2V0UmVwb3NpdG9yeUlkKCksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldEZpbHRlclN0cmluZygpLCBjdHh0LmdldE9yZGVyQnkoKSwgY3R4dC5pc0luY2x1ZGVBbGxvd2FibGVBY3Rpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjdHh0LmdldEluY2x1ZGVSZWxhdGlvbnNoaXBzKCksIGN0eHQuZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YodGhpcy5tYXhOdW1JdGVtcyksIEJpZ0ludGVnZXIudmFsdWVPZihza2lwQ291bnQpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgb2JqZWN0cwotICAgICAgICAgICAgICAgIExpc3Q8RG9jdW1lbnQ+IHBhZ2UgPSBuZXcgQXJyYXlMaXN0PERvY3VtZW50PigpOwotICAgICAgICAgICAgICAgIGlmIChjaGVja2VkT3V0RG9jcy5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0RGF0YSA6IGNoZWNrZWRPdXREb2NzLmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ21pc09iamVjdCBkb2MgPSBvZi5jb252ZXJ0T2JqZWN0KG9iamVjdERhdGEsIGN0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZG9jIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4uLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5hZGQoKERvY3VtZW50KSBkb2MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFBhZ2VGZXRjaGVyLlBhZ2U8RG9jdW1lbnQ+KHBhZ2UsIGNoZWNrZWRPdXREb2NzLmdldE51bUl0ZW1zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkT3V0RG9jcy5oYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBDaGFuZ2VFdmVudHMgZ2V0Q29udGVudENoYW5nZXMoU3RyaW5nIGNoYW5nZUxvZ1Rva2VuLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLCBsb25nIG1heE51bUl0ZW1zKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZW50Q2hhbmdlcyhjaGFuZ2VMb2dUb2tlbiwgaW5jbHVkZVByb3BlcnRpZXMsIG1heE51bUl0ZW1zLCBnZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2hhbmdlRXZlbnRzIGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyBjaGFuZ2VMb2dUb2tlbiwgYm9vbGVhbiBpbmNsdWRlUHJvcGVydGllcywgbG9uZyBtYXhOdW1JdGVtcywKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcGVyYXRpb24gY29udGV4dCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGNoYW5nZUxvZ1Rva2VuKTsKLSAgICAgICAgT2JqZWN0TGlzdCBvYmplY3RMaXN0ID0gbnVsbDsKLQotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqZWN0TGlzdCA9IGdldEJpbmRpbmcoKS5nZXREaXNjb3ZlcnlTZXJ2aWNlKCkuZ2V0Q29udGVudENoYW5nZXMoZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VMb2dUb2tlbkhvbGRlciwgaW5jbHVkZVByb3BlcnRpZXMsIGNvbnRleHQuZ2V0RmlsdGVyU3RyaW5nKCksIGNvbnRleHQuaXNJbmNsdWRlUG9saWNpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pc0luY2x1ZGVBY2xzKCksIEJpZ0ludGVnZXIudmFsdWVPZihtYXhOdW1JdGVtcyksIG51bGwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdEZhY3RvcnkuY29udmVydENoYW5nZUV2ZW50cyhjaGFuZ2VMb2dUb2tlbkhvbGRlci5nZXRWYWx1ZSgpLCBvYmplY3RMaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPENoYW5nZUV2ZW50PiBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgY2hhbmdlTG9nVG9rZW4sIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVByb3BlcnRpZXMpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRDaGFuZ2VzKGNoYW5nZUxvZ1Rva2VuLCBpbmNsdWRlUHJvcGVydGllcywgZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxDaGFuZ2VFdmVudD4gZ2V0Q29udGVudENoYW5nZXMoZmluYWwgU3RyaW5nIGNoYW5nZUxvZ1Rva2VuLCBmaW5hbCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9wZXJhdGlvbiBjb250ZXh0IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRGlzY292ZXJ5U2VydmljZSBkaXNjb3ZlcnlTZXJ2aWNlID0gZ2V0QmluZGluZygpLmdldERpc2NvdmVyeVNlcnZpY2UoKTsKLSAgICAgICAgZmluYWwgT2JqZWN0RmFjdG9yeSBvZiA9IGdldE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgZmluYWwgT3BlcmF0aW9uQ29udGV4dCBjdHh0ID0gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKGNvbnRleHQpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkl0ZXJhYmxlPENoYW5nZUV2ZW50PihuZXcgQWJzdHJhY3RQYWdlRmV0Y2hlcjxDaGFuZ2VFdmVudD4oSW50ZWdlci5NQVhfVkFMVUUpIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW4gPSBjaGFuZ2VMb2dUb2tlbjsKLSAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIG5leHRMaW5rID0gbnVsbDsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaXJzdFBhZ2UgPSB0cnVlOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFBhZ2VGZXRjaGVyLlBhZ2U8Q2hhbmdlRXZlbnQ+IGZldGNoUGFnZShsb25nIHNraXBDb3VudCkgewotICAgICAgICAgICAgICAgIGFzc2VydCBmaXJzdFBhZ2UgfHwgdG9rZW4gIT0gbnVsbCA/IChuZXh0TGluayA9PSBudWxsKSA6IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBmZXRjaCB0aGUgZGF0YQotICAgICAgICAgICAgICAgIEV4dGVuZGVkSG9sZGVyPFN0cmluZz4gY2hhbmdlTG9nVG9rZW5Ib2xkZXIgPSBuZXcgRXh0ZW5kZWRIb2xkZXI8U3RyaW5nPih0b2tlbik7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRMaW5rICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlTG9nVG9rZW5Ib2xkZXIuc2V0RXh0cmFWYWx1ZShDb25zdGFudHMuUkVQX1JFTF9DSEFOR0VTLCBuZXh0TGluayk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgT2JqZWN0TGlzdCBvYmplY3RMaXN0ID0gZGlzY292ZXJ5U2VydmljZS5nZXRDb250ZW50Q2hhbmdlcyhnZXRSZXBvc2l0b3J5SW5mbygpLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VMb2dUb2tlbkhvbGRlciwgaW5jbHVkZVByb3BlcnRpZXMsIGN0eHQuZ2V0RmlsdGVyU3RyaW5nKCksIGN0eHQuaXNJbmNsdWRlUG9saWNpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuaXNJbmNsdWRlQWNscygpLCBCaWdJbnRlZ2VyLnZhbHVlT2YodGhpcy5tYXhOdW1JdGVtcyksIG51bGwpOwotCi0gICAgICAgICAgICAgICAgLy8gY29udmVydCB0eXBlIGRlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgTGlzdDxDaGFuZ2VFdmVudD4gcGFnZSA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlRXZlbnQ+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdERhdGEgOiBvYmplY3RMaXN0LmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBwYWdlLmFkZChvZi5jb252ZXJ0Q2hhbmdlRXZlbnQob2JqZWN0RGF0YSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZmlyc3RQYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBwcmV2aW91cyBwYWdlIGlzIHJlcGVhdGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIC0+IHJlbW92ZSB0aGUgZmlyc3QgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5yZW1vdmUoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcnN0UGFnZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoYW5nZUxvZ1Rva2VuSG9sZGVyLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2ViIHNlcnZpY2VzIGFuZCB0aGUgYnJvd3NlciBiaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBhIG5ldyB0b2tlbgotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGNoYW5nZUxvZ1Rva2VuSG9sZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGF0b21wdWIgYmluZGluZyBkb2VzIG5vdCByZXR1cm4gYSBuZXcgdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBtaWdodCByZXR1cm4gYSBsaW5rIHRvIHRoZSBuZXh0IEF0b20gZmVlZAotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRMaW5rID0gKFN0cmluZykgY2hhbmdlTG9nVG9rZW5Ib2xkZXIuZ2V0RXh0cmFWYWx1ZShDb25zdGFudHMuUkVQX1JFTF9DSEFOR0VTKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0UGFnZUZldGNoZXIuUGFnZTxDaGFuZ2VFdmVudD4ocGFnZSwgb2JqZWN0TGlzdC5nZXROdW1JdGVtcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TGlzdC5oYXNNb3JlSXRlbXMoKSkgewotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEl0ZW1JdGVyYWJsZTxDaGFuZ2VFdmVudD4gc2tpcFRvKGxvbmcgcG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiU2tpcHBpbmcgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPENoYW5nZUV2ZW50PiBnZXRQYWdlKCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJQYWdpbmcgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPENoYW5nZUV2ZW50PiBnZXRQYWdlKGludCBtYXhOdW1JdGVtcykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJQYWdpbmcgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCkgewotICAgICAgICByZXR1cm4gZ2V0QmluZGluZygpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuZ2V0UmVwb3NpdG9yeUluZm8oZ2V0UmVwb3NpdG9yeUlkKCksIG51bGwpLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgZ2V0RGVmYXVsdENvbnRleHQoKSB7Ci0gICAgICAgIGxvY2sucmVhZExvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdENvbnRleHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGV4dChPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmRlZmF1bHRDb250ZXh0ID0gKGNvbnRleHQgPT0gbnVsbCA/IERFRkFVTFRfQ09OVEVYVCA6IGNvbnRleHQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoU2V0PFN0cmluZz4gZmlsdGVyLCBib29sZWFuIGluY2x1ZGVBY2xzLAotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgYm9vbGVhbiBpbmNsdWRlUG9saWNpZXMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU2V0PFN0cmluZz4gcmVuZGl0aW9uRmlsdGVyLCBib29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudHMsIFN0cmluZyBvcmRlckJ5LCBib29sZWFuIGNhY2hlRW5hYmxlZCwKLSAgICAgICAgICAgIGludCBtYXhJdGVtc1BlclBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIE9wZXJhdGlvbkNvbnRleHRVdGlscy5jcmVhdGVPcGVyYXRpb25Db250ZXh0KGZpbHRlciwgaW5jbHVkZUFjbHMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVQb2xpY2llcywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50cywgb3JkZXJCeSwgY2FjaGVFbmFibGVkLAotICAgICAgICAgICAgICAgIG1heEl0ZW1zUGVyUGFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgY3JlYXRlT3BlcmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIE9wZXJhdGlvbkNvbnRleHRVdGlscy5jcmVhdGVPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZU9iamVjdElkKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gbmV3IE9iamVjdElkSW1wbChpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbGU7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3QgZ2V0T2JqZWN0KE9iamVjdElkIG9iamVjdElkKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3Qob2JqZWN0SWQsIGdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IGdldE9iamVjdChPYmplY3RJZCBvYmplY3RJZCwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsIHx8IG9iamVjdElkLmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdChvYmplY3RJZC5nZXRJZCgpLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdCBnZXRPYmplY3QoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3Qob2JqZWN0SWQsIGdldERlZmF1bHRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IGdldE9iamVjdChTdHJpbmcgb2JqZWN0SWQsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElEIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9wZXJhdGlvbiBjb250ZXh0IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc09iamVjdCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIC8vIGFzayB0aGUgY2FjaGUgZmlyc3QKLSAgICAgICAgaWYgKGNvbnRleHQuaXNDYWNoZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gY2FjaGUuZ2V0QnlJZChvYmplY3RJZCwgY29udGV4dC5nZXRDYWNoZUtleSgpKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG9iamVjdAotICAgICAgICBPYmplY3REYXRhIG9iamVjdERhdGEgPSBiaW5kaW5nLmdldE9iamVjdFNlcnZpY2UoKS5nZXRPYmplY3QoZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RmlsdGVyU3RyaW5nKCksIGNvbnRleHQuaXNJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucygpLCBjb250ZXh0LmdldEluY2x1ZGVSZWxhdGlvbnNoaXBzKCksCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoKSwgY29udGV4dC5pc0luY2x1ZGVQb2xpY2llcygpLCBjb250ZXh0LmlzSW5jbHVkZUFjbHMoKSwgbnVsbCk7Ci0KLSAgICAgICAgcmVzdWx0ID0gZ2V0T2JqZWN0RmFjdG9yeSgpLmNvbnZlcnRPYmplY3Qob2JqZWN0RGF0YSwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gcHV0IGludG8gY2FjaGUKLSAgICAgICAgaWYgKGNvbnRleHQuaXNDYWNoZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgY2FjaGUucHV0KHJlc3VsdCwgY29udGV4dC5nZXRDYWNoZUtleSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3QgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RCeVBhdGgocGF0aCwgZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3QgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyBwYXRoLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGF0aCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcGVyYXRpb24gY29udGV4dCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAvLyBhc2sgdGhlIGNhY2hlIGZpcnN0Ci0gICAgICAgIGlmIChjb250ZXh0LmlzQ2FjaGVFbmFibGVkKCkgJiYgIWNhY2hlUGF0aE9taXQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhY2hlLmdldEJ5UGF0aChwYXRoLCBjb250ZXh0LmdldENhY2hlS2V5KCkpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgb2JqZWN0Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0RGF0YSA9IGJpbmRpbmcuZ2V0T2JqZWN0U2VydmljZSgpLmdldE9iamVjdEJ5UGF0aChnZXRSZXBvc2l0b3J5SWQoKSwgcGF0aCwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldEZpbHRlclN0cmluZygpLCBjb250ZXh0LmlzSW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKSwgY29udGV4dC5nZXRJbmNsdWRlUmVsYXRpb25zaGlwcygpLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCksIGNvbnRleHQuaXNJbmNsdWRlUG9saWNpZXMoKSwgY29udGV4dC5pc0luY2x1ZGVBY2xzKCksIG51bGwpOwotCi0gICAgICAgIHJlc3VsdCA9IGdldE9iamVjdEZhY3RvcnkoKS5jb252ZXJ0T2JqZWN0KG9iamVjdERhdGEsIGNvbnRleHQpOwotCi0gICAgICAgIC8vIHB1dCBpbnRvIGNhY2hlCi0gICAgICAgIGlmIChjb250ZXh0LmlzQ2FjaGVFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGNhY2hlLnB1dFBhdGgocGF0aCwgcmVzdWx0LCBjb250ZXh0LmdldENhY2hlS2V5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdCBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RCeVBhdGgocGFyZW50UGF0aCwgbmFtZSwgZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3QgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyBwYXJlbnRQYXRoLCBTdHJpbmcgbmFtZSwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChwYXJlbnRQYXRoID09IG51bGwgfHwgcGFyZW50UGF0aC5sZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmVudCBwYXRoIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJlbnRQYXRoLmNoYXJBdCgwKSAhPSAnLycpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmVudCBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhICcvJyEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBwYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcGF0aC5hcHBlbmQocGFyZW50UGF0aCk7Ci0gICAgICAgIGlmICghcGFyZW50UGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICBwYXRoLmFwcGVuZCgnLycpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGguYXBwZW5kKG5hbWUpOwotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3RCeVBhdGgocGF0aC50b1N0cmluZygpLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKE9iamVjdElkIG9iamVjdElkKSB7Ci0gICAgICAgIHJldHVybiBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24ob2JqZWN0SWQsIGZhbHNlLCBnZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKFN0cmluZyBvYmplY3RJZCwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKGNyZWF0ZU9iamVjdElkKG9iamVjdElkKSwgZmFsc2UsIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBEb2N1bWVudCBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24oU3RyaW5nIG9iamVjdElkLCBib29sZWFuIG1ham9yLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24oY3JlYXRlT2JqZWN0SWQob2JqZWN0SWQpLCBtYWpvciwgY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGdldExhdGVzdERvY3VtZW50VmVyc2lvbihTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24oY3JlYXRlT2JqZWN0SWQob2JqZWN0SWQpLCBmYWxzZSwgZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IGdldExhdGVzdERvY3VtZW50VmVyc2lvbihPYmplY3RJZCBvYmplY3RJZCwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24ob2JqZWN0SWQsIGZhbHNlLCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKE9iamVjdElkIG9iamVjdElkLCBib29sZWFuIG1ham9yLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwgfHwgb2JqZWN0SWQuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcGVyYXRpb24gY29udGV4dCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkID0gbnVsbDsKLQotICAgICAgICAvLyBmaXJzdCBhdHRlbXB0OiBpZiB3ZSBnb3QgYSBEb2N1bWVudCBvYmplY3QsIHRyeSBnZXR0aW5nIHRoZSB2ZXJzaW9uCi0gICAgICAgIC8vIHNlcmllcyBJRCBmcm9tIGl0Ci0gICAgICAgIGlmIChvYmplY3RJZCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICB2ZXJzaW9uU2VyaWVzSWQgPSAoKERvY3VtZW50KSBvYmplY3RJZCkuZ2V0VmVyc2lvblNlcmllc0lkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZWNvbmQgYXR0ZW1wdDogaWYgd2UgaGF2ZSBhIERvY3VtZW50IG9iamVjdCBpbiB0aGUgY2FjaGUsIHJldHJpZXZlCi0gICAgICAgIC8vIHRoZSB2ZXJzaW9uIHNlcmllcyBJRCBmb3JtIHRoZXJlCi0gICAgICAgIGlmICh2ZXJzaW9uU2VyaWVzSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNDYWNoZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIENtaXNPYmplY3Qgc291cmNlRG9jID0gY2FjaGUuZ2V0QnlJZChvYmplY3RJZC5nZXRJZCgpLCBjb250ZXh0LmdldENhY2hlS2V5KCkpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEb2MgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uU2VyaWVzSWQgPSAoKERvY3VtZW50KSBzb3VyY2VEb2MpLmdldFZlcnNpb25TZXJpZXNJZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXJkIGF0dGVtcHQgKFdlYiBTZXJ2aWNlcyBvbmx5KTogZ2V0IHRoZSB2ZXJzaW9uIHNlcmllcyBJRCBmcm9tIHRoZQotICAgICAgICAvLyByZXBvc2l0b3J5Ci0gICAgICAgIC8vICh0aGUgQXRvbVB1YiBhbmQgQnJvd3NlciBiaW5kaW5nIGRvbid0IG5lZWQgdGhlIHZlcnNpb24gc2VyaWVzIElEIC0+Ci0gICAgICAgIC8vIGF2b2lkIHJvdW5kdHJpcCkKLSAgICAgICAgaWYgKHZlcnNpb25TZXJpZXNJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCaW5kaW5nVHlwZSBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmcoKS5nZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICAgICAgaWYgKGJpbmRpbmdUeXBlID09IEJpbmRpbmdUeXBlLldFQlNFUlZJQ0VTIHx8IGJpbmRpbmdUeXBlID09IEJpbmRpbmdUeXBlLkNVU1RPTSkgewotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBkb2N1bWVudCB0byBmaW5kIHRoZSB2ZXJzaW9uIHNlcmllcyBJRAotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgc291cmNlT2JqZWN0RGF0YSA9IGJpbmRpbmcuZ2V0T2JqZWN0U2VydmljZSgpLmdldE9iamVjdChnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWQuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLk9CSkVDVF9JRCArICIsIiArIFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0lELCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbWlzOm5vbmUiLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZU9iamVjdERhdGEuZ2V0UHJvcGVydGllcygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHNvdXJjZU9iamVjdERhdGEuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiB2ZXJpb25zU2VyaWVzSWRQcm9wID0gc291cmNlT2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZXJpb25zU2VyaWVzSWRQcm9wICE9IG51bGwgJiYgdmVyaW9uc1Nlcmllc0lkUHJvcC5nZXRGaXJzdFZhbHVlKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TZXJpZXNJZCA9IChTdHJpbmcpIHZlcmlvbnNTZXJpZXNJZFByb3AuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdGhlIFdlYiBTZXJ2aWNlcyBiaW5kaW5nIG5lZWRzIHRoZSB2ZXJzaW9uIHNlcmllcyBJRCAtPiBmYWlsCi0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb25TZXJpZXNJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBpcyBub3QgYSBkb2N1bWVudCBvciBub3QgdmVyc2lvbmFibGUhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBvYmplY3QKLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3REYXRhID0gYmluZGluZy5nZXRWZXJzaW9uaW5nU2VydmljZSgpLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihnZXRSZXBvc2l0b3J5SWQoKSwKLSAgICAgICAgICAgICAgICBvYmplY3RJZC5nZXRJZCgpLCB2ZXJzaW9uU2VyaWVzSWQsIG1ham9yLCBjb250ZXh0LmdldEZpbHRlclN0cmluZygpLAotICAgICAgICAgICAgICAgIGNvbnRleHQuaXNJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucygpLCBjb250ZXh0LmdldEluY2x1ZGVSZWxhdGlvbnNoaXBzKCksCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoKSwgY29udGV4dC5pc0luY2x1ZGVQb2xpY2llcygpLCBjb250ZXh0LmlzSW5jbHVkZUFjbHMoKSwgbnVsbCk7Ci0KLSAgICAgICAgcmVzdWx0ID0gZ2V0T2JqZWN0RmFjdG9yeSgpLmNvbnZlcnRPYmplY3Qob2JqZWN0RGF0YSwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gcHV0IGludG8gY2FjaGUKLSAgICAgICAgaWYgKGNvbnRleHQuaXNDYWNoZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgY2FjaGUucHV0KHJlc3VsdCwgY29udGV4dC5nZXRDYWNoZUtleSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHJlc3VsdAotICAgICAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxhdGVzdCB2ZXJzaW9uIGlzIG5vdCBhIGRvY3VtZW50ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChEb2N1bWVudCkgcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdEZyb21DYWNoZShPYmplY3RJZCBvYmplY3RJZCkgewotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCB8fCBvYmplY3RJZC5nZXRJZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbW92ZU9iamVjdEZyb21DYWNoZShvYmplY3RJZC5nZXRJZCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RGcm9tQ2FjaGUoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIGNhY2hlLnJlbW92ZShvYmplY3RJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKCkgewotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlJbmZvOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEZvbGRlciBnZXRSb290Rm9sZGVyKCkgewotICAgICAgICByZXR1cm4gZ2V0Um9vdEZvbGRlcihnZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9sZGVyIGdldFJvb3RGb2xkZXIoT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyByb290Rm9sZGVySWQgPSBnZXRSZXBvc2l0b3J5SW5mbygpLmdldFJvb3RGb2xkZXJJZCgpOwotCi0gICAgICAgIENtaXNPYmplY3Qgcm9vdEZvbGRlciA9IGdldE9iamVjdChyb290Rm9sZGVySWQsIGNvbnRleHQpOwotICAgICAgICBpZiAoIShyb290Rm9sZGVyIGluc3RhbmNlb2YgRm9sZGVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJSb290IGZvbGRlciBvYmplY3QgaXMgbm90IGEgZm9sZGVyISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChGb2xkZXIpIHJvb3RGb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxPYmplY3RUeXBlPiBnZXRUeXBlQ2hpbGRyZW4oZmluYWwgU3RyaW5nIHR5cGVJZCwgZmluYWwgYm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucykgewotICAgICAgICBmaW5hbCBSZXBvc2l0b3J5U2VydmljZSByZXBvc2l0b3J5U2VydmljZSA9IGdldEJpbmRpbmcoKS5nZXRSZXBvc2l0b3J5U2VydmljZSgpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkl0ZXJhYmxlPE9iamVjdFR5cGU+KG5ldyBBYnN0cmFjdFBhZ2VGZXRjaGVyPE9iamVjdFR5cGU+KGdldERlZmF1bHRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0TWF4SXRlbXNQZXJQYWdlKCkpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQYWdlRmV0Y2hlci5QYWdlPE9iamVjdFR5cGU+IGZldGNoUGFnZShsb25nIHNraXBDb3VudCkgewotCi0gICAgICAgICAgICAgICAgLy8gZmV0Y2ggdGhlIGRhdGEKLSAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3QgdGRsID0gcmVwb3NpdG9yeVNlcnZpY2UuZ2V0VHlwZUNoaWxkcmVuKFNlc3Npb25JbXBsLnRoaXMuZ2V0UmVwb3NpdG9yeUlkKCksIHR5cGVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBCaWdJbnRlZ2VyLnZhbHVlT2YodGhpcy5tYXhOdW1JdGVtcyksCi0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2Yoc2tpcENvdW50KSwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHR5cGUgZGVmaW5pdGlvbnMKLSAgICAgICAgICAgICAgICBMaXN0PE9iamVjdFR5cGU+IHBhZ2UgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFR5cGU+KHRkbC5nZXRMaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uIDogdGRsLmdldExpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICBwYWdlLmFkZChjb252ZXJ0VHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0UGFnZUZldGNoZXIuUGFnZTxPYmplY3RUeXBlPihwYWdlLCB0ZGwuZ2V0TnVtSXRlbXMoKSwgdGRsLmhhc01vcmVJdGVtcygpKSB7Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IGdldEJpbmRpbmcoKS5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmdldFR5cGVEZWZpbml0aW9uKGdldFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgIHR5cGVJZCwgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRBbmRDYWNoZVR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZSBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZUlkLCBib29sZWFuIHVzZUNhY2hlKSB7Ci0gICAgICAgIFJlcG9zaXRvcnlTZXJ2aWNlIHNlcnZpY2UgPSBnZXRCaW5kaW5nKCkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKTsKLSAgICAgICAgaWYgKCEoc2VydmljZSBpbnN0YW5jZW9mIEV4dGVuZGVkUmVwb3NpdG9yeVNlcnZpY2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvcjogUmVwb3NpdG9yeSBTZXJ2aWNlIGRvZXMgbm90IGltcGxlbWVudCBFeHRlbmRlZFJlcG9zaXRvcnlTZXJ2aWNlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRXh0ZW5kZWRSZXBvc2l0b3J5U2VydmljZSBleHRSZXBTcnYgPSAoRXh0ZW5kZWRSZXBvc2l0b3J5U2VydmljZSkgc2VydmljZTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24gPSBleHRSZXBTcnYuZ2V0VHlwZURlZmluaXRpb24oZ2V0UmVwb3NpdG9yeUlkKCksIHR5cGVJZCwgbnVsbCwgdXNlQ2FjaGUpOwotCi0gICAgICAgIHJldHVybiBjb252ZXJ0QW5kQ2FjaGVUeXBlRGVmaW5pdGlvbih0eXBlRGVmaW5pdGlvbiwgdXNlQ2FjaGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFRyZWU8T2JqZWN0VHlwZT4+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgdHlwZUlkLCBpbnQgZGVwdGgsIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZGVzY2VuZGFudHMgPSBnZXRCaW5kaW5nKCkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS5nZXRUeXBlRGVzY2VuZGFudHMoCi0gICAgICAgICAgICAgICAgZ2V0UmVwb3NpdG9yeUlkKCksIHR5cGVJZCwgQmlnSW50ZWdlci52YWx1ZU9mKGRlcHRoKSwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIG51bGwpOwotCi0gICAgICAgIHJldHVybiBjb252ZXJ0VHlwZURlc2NlbmRhbnRzKGRlc2NlbmRhbnRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBiaW5kaW5nIDxjb2RlPlR5cGVEZWZpbml0aW9uQ29udGFpbmVyPC9jb2RlPiB0byBBUEkKLSAgICAgKiA8Y29kZT5Db250YWluZXI8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxUcmVlPE9iamVjdFR5cGU+PiBjb252ZXJ0VHlwZURlc2NlbmRhbnRzKExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGRlc2NlbmRhbnRzTGlzdCkgewotICAgICAgICBMaXN0PFRyZWU8T2JqZWN0VHlwZT4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VHJlZTxPYmplY3RUeXBlPj4oKTsKLQotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA6IGRlc2NlbmRhbnRzTGlzdCkgewotICAgICAgICAgICAgT2JqZWN0VHlwZSBvYmplY3RUeXBlID0gY29udmVydFR5cGVEZWZpbml0aW9uKGNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gY2hpbGRyZW4gPSBjb252ZXJ0VHlwZURlc2NlbmRhbnRzKGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKTsKLQotICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgVHJlZUltcGw8T2JqZWN0VHlwZT4ob2JqZWN0VHlwZSwgY2hpbGRyZW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RUeXBlIGNvbnZlcnRUeXBlRGVmaW5pdGlvbihUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbikgewotICAgICAgICByZXR1cm4gb2JqZWN0RmFjdG9yeS5jb252ZXJ0VHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgdHlwZSBkZWZpbml0aW9uIGludG8gYW4gb2JqZWN0IHR5cGUgYW5kIGNhY2hlcyB0aGUgcmVzdWx0LgotICAgICAqIAotICAgICAqIFRoZSBjYWNoZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0eXBlIGRlZmluaXRpb25zIHRoYXQgaGF2ZSBiZWVuIGZldGNoZWQKLSAgICAgKiB3aXRoIGdldFR5cGVEZWZpbml0aW9uKCkgYmVjYXVzZSB0aGUgaGlnaCBsZXZlbCBjYWNoZSBzaG91bGQgcm91Z2hseQotICAgICAqIGNvcnJlc3BvbmQgdG8gdGhlIGxvdyBsZXZlbCB0eXBlIGNhY2hlLiBUaGUgdHlwZSBkZWZpbml0aW9ucyByZXR1cm5lZCBieQotICAgICAqIGdldFR5cGVDaGlsZHJlbigpIGFuZCBnZXRUeXBlRGVzY2VuZGFudHMoKSBhcmUgbm90IGNhY2hlZCBpbiB0aGUgbG93Ci0gICAgICogbGV2ZWwgY2FjaGUgYW5kIHRoZXJlZm9yZSBzaG91bGRuJ3QgYmUgY2FjaGVkIGhlcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3RUeXBlIGNvbnZlcnRBbmRDYWNoZVR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uLCBib29sZWFuIHVzZUNhY2hlKSB7Ci0gICAgICAgIE9iamVjdFR5cGUgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChvYmplY3RUeXBlQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBjYWNoZVNpemU7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplID0gSW50ZWdlci52YWx1ZU9mKHBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9UWVBFUykpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVTaXplIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplID0gU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfVFlQRVM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlU2l6ZSA9IFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9TSVpFX1RZUEVTOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXhFbnRyaWVzID0gY2FjaGVTaXplOwotCi0gICAgICAgICAgICAgICAgb2JqZWN0VHlwZUNhY2hlID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3RUeXBlPihtYXhFbnRyaWVzICsgMSwgMC43MGYsIHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdFR5cGU+IGVsZGVzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemUoKSA+IG1heEVudHJpZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXVzZUNhY2hlKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqZWN0RmFjdG9yeS5jb252ZXJ0VHlwZURlZmluaXRpb24odHlwZURlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIG9iamVjdFR5cGVDYWNoZS5wdXQocmVzdWx0LmdldElkKCksIHJlc3VsdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iamVjdFR5cGVDYWNoZS5nZXQodHlwZURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iamVjdEZhY3RvcnkuY29udmVydFR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0VHlwZUNhY2hlLnB1dChyZXN1bHQuZ2V0SWQoKSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgb2JqZWN0IHR5cGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHR5cGUgSUQgZnJvbSB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21PYmplY3RUeXBlQ2FjaGUoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChvYmplY3RUeXBlQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9iamVjdFR5cGVDYWNoZS5yZW1vdmUodHlwZUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZSBjcmVhdGVUeXBlKFR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmZvLmdldENtaXNWZXJzaW9uKCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDTUlTIDEuMCByZXBvc2l0b3JpZXMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlRGVmaW5pdGlvbiBuZXdUeXBlID0gZ2V0QmluZGluZygpLmdldFJlcG9zaXRvcnlTZXJ2aWNlKCkuY3JlYXRlVHlwZShnZXRSZXBvc2l0b3J5SWQoKSwgdHlwZSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0VHlwZURlZmluaXRpb24obmV3VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgdXBkYXRlVHlwZShUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SW5mby5nZXRDbWlzVmVyc2lvbigpID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ01JUyAxLjAgcmVwb3NpdG9yaWVzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdXBkYXRlZFR5cGUgPSBnZXRCaW5kaW5nKCkuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKS51cGRhdGVUeXBlKGdldFJlcG9zaXRvcnlJZCgpLCB0eXBlLCBudWxsKTsKLQotICAgICAgICByZW1vdmVGcm9tT2JqZWN0VHlwZUNhY2hlKHVwZGF0ZWRUeXBlLmdldElkKCkpOwotCi0gICAgICAgIHJldHVybiBjb252ZXJ0VHlwZURlZmluaXRpb24odXBkYXRlZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVR5cGUoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBpZiAocmVwb3NpdG9yeUluZm8uZ2V0Q21pc1ZlcnNpb24oKSA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENNSVMgMS4wIHJlcG9zaXRvcmllcy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldEJpbmRpbmcoKS5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmRlbGV0ZVR5cGUoZ2V0UmVwb3NpdG9yeUlkKCksIHR5cGVJZCwgbnVsbCk7Ci0gICAgICAgIHJlbW92ZUZyb21PYmplY3RUeXBlQ2FjaGUodHlwZUlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPFF1ZXJ5UmVzdWx0PiBxdWVyeShmaW5hbCBTdHJpbmcgc3RhdGVtZW50LCBmaW5hbCBib29sZWFuIHNlYXJjaEFsbFZlcnNpb25zKSB7Ci0gICAgICAgIHJldHVybiBxdWVyeShzdGF0ZW1lbnQsIHNlYXJjaEFsbFZlcnNpb25zLCBnZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPFF1ZXJ5UmVzdWx0PiBxdWVyeShmaW5hbCBTdHJpbmcgc3RhdGVtZW50LCBmaW5hbCBib29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9wZXJhdGlvbiBjb250ZXh0IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRGlzY292ZXJ5U2VydmljZSBkaXNjb3ZlcnlTZXJ2aWNlID0gZ2V0QmluZGluZygpLmdldERpc2NvdmVyeVNlcnZpY2UoKTsKLSAgICAgICAgZmluYWwgT2JqZWN0RmFjdG9yeSBvZiA9IGdldE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgZmluYWwgT3BlcmF0aW9uQ29udGV4dCBjdHh0ID0gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKGNvbnRleHQpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkl0ZXJhYmxlPFF1ZXJ5UmVzdWx0PihuZXcgQWJzdHJhY3RQYWdlRmV0Y2hlcjxRdWVyeVJlc3VsdD4oY3R4dC5nZXRNYXhJdGVtc1BlclBhZ2UoKSkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFBhZ2VGZXRjaGVyLlBhZ2U8UXVlcnlSZXN1bHQ+IGZldGNoUGFnZShsb25nIHNraXBDb3VudCkgewotCi0gICAgICAgICAgICAgICAgLy8gZmV0Y2ggdGhlIGRhdGEKLSAgICAgICAgICAgICAgICBPYmplY3RMaXN0IHJlc3VsdExpc3QgPSBkaXNjb3ZlcnlTZXJ2aWNlLnF1ZXJ5KGdldFJlcG9zaXRvcnlJZCgpLCBzdGF0ZW1lbnQsIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5pc0luY2x1ZGVBbGxvd2FibGVBY3Rpb25zKCksIGN0eHQuZ2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCksIEJpZ0ludGVnZXIudmFsdWVPZih0aGlzLm1heE51bUl0ZW1zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihza2lwQ291bnQpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgcXVlcnkgcmVzdWx0cwotICAgICAgICAgICAgICAgIExpc3Q8UXVlcnlSZXN1bHQ+IHBhZ2UgPSBuZXcgQXJyYXlMaXN0PFF1ZXJ5UmVzdWx0PigpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHRMaXN0LmdldE9iamVjdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3REYXRhIDogcmVzdWx0TGlzdC5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3REYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5hZGQob2YuY29udmVydFF1ZXJ5UmVzdWx0KG9iamVjdERhdGEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RQYWdlRmV0Y2hlci5QYWdlPFF1ZXJ5UmVzdWx0PihwYWdlLCByZXN1bHRMaXN0LmdldE51bUl0ZW1zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaXN0Lmhhc01vcmVJdGVtcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBxdWVyeU9iamVjdHMoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHdoZXJlLCBmaW5hbCBib29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmICh0eXBlSWQgPT0gbnVsbCB8fCB0eXBlSWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcGVyYXRpb24gY29udGV4dCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIERpc2NvdmVyeVNlcnZpY2UgZGlzY292ZXJ5U2VydmljZSA9IGdldEJpbmRpbmcoKS5nZXREaXNjb3ZlcnlTZXJ2aWNlKCk7Ci0gICAgICAgIGZpbmFsIE9iamVjdEZhY3Rvcnkgb2YgPSBnZXRPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgIGZpbmFsIE9wZXJhdGlvbkNvbnRleHQgY3R4dCA9IG5ldyBPcGVyYXRpb25Db250ZXh0SW1wbChjb250ZXh0KTsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzdGF0ZW1lbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigiU0VMRUNUICIpOwotCi0gICAgICAgIFN0cmluZyBzZWxlY3QgPSBjdHh0LmdldEZpbHRlclN0cmluZygpOwotICAgICAgICBpZiAoc2VsZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hcHBlbmQoJyonKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hcHBlbmQoc2VsZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIE9iamVjdFR5cGUgdHlwZSA9IGdldFR5cGVEZWZpbml0aW9uKHR5cGVJZCk7Ci0gICAgICAgIHN0YXRlbWVudC5hcHBlbmQoIiBGUk9NICIpOwotICAgICAgICBzdGF0ZW1lbnQuYXBwZW5kKHR5cGUuZ2V0UXVlcnlOYW1lKCkpOwotCi0gICAgICAgIGlmICh3aGVyZSAhPSBudWxsICYmIHdoZXJlLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hcHBlbmQoIiBXSEVSRSAiKTsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hcHBlbmQod2hlcmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG9yZGVyQnkgPSBjdHh0LmdldE9yZGVyQnkoKTsKLSAgICAgICAgaWYgKG9yZGVyQnkgIT0gbnVsbCAmJiBvcmRlckJ5LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hcHBlbmQoIiBPUkRFUiBCWSAiKTsKLSAgICAgICAgICAgIHN0YXRlbWVudC5hcHBlbmQob3JkZXJCeSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25JdGVyYWJsZTxDbWlzT2JqZWN0PihuZXcgQWJzdHJhY3RQYWdlRmV0Y2hlcjxDbWlzT2JqZWN0PihjdHh0LmdldE1heEl0ZW1zUGVyUGFnZSgpKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIEFic3RyYWN0UGFnZUZldGNoZXIuUGFnZTxDbWlzT2JqZWN0PiBmZXRjaFBhZ2UobG9uZyBza2lwQ291bnQpIHsKLQotICAgICAgICAgICAgICAgIC8vIGZldGNoIHRoZSBkYXRhCi0gICAgICAgICAgICAgICAgT2JqZWN0TGlzdCByZXN1bHRMaXN0ID0gZGlzY292ZXJ5U2VydmljZS5xdWVyeShnZXRSZXBvc2l0b3J5SWQoKSwgc3RhdGVtZW50LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hBbGxWZXJzaW9ucywgY3R4dC5pc0luY2x1ZGVBbGxvd2FibGVBY3Rpb25zKCksIGN0eHQuZ2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN0eHQuZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCksIEJpZ0ludGVnZXIudmFsdWVPZih0aGlzLm1heE51bUl0ZW1zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihza2lwQ291bnQpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgcXVlcnkgcmVzdWx0cwotICAgICAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdD4gcGFnZSA9IG5ldyBBcnJheUxpc3Q8Q21pc09iamVjdD4oKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0TGlzdC5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0RGF0YSA6IHJlc3VsdExpc3QuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0RGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuYWRkKG9mLmNvbnZlcnRPYmplY3Qob2JqZWN0RGF0YSwgY3R4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFBhZ2VGZXRjaGVyLlBhZ2U8Q21pc09iamVjdD4ocGFnZSwgcmVzdWx0TGlzdC5nZXROdW1JdGVtcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGlzdC5oYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBRdWVyeVN0YXRlbWVudCBjcmVhdGVRdWVyeVN0YXRlbWVudChmaW5hbCBTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHRoaXMsIHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIFF1ZXJ5U3RhdGVtZW50IGNyZWF0ZVF1ZXJ5U3RhdGVtZW50KGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBzZWxlY3RQcm9wZXJ0eUlkcywKLSAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZnJvbVR5cGVzLCBmaW5hbCBTdHJpbmcgd2hlcmVDbGF1c2UsIGZpbmFsIExpc3Q8U3RyaW5nPiBvcmRlckJ5UHJvcGVydHlJZHMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRdWVyeVN0YXRlbWVudEltcGwodGhpcywgc2VsZWN0UHJvcGVydHlJZHMsIGZyb21UeXBlcywgd2hlcmVDbGF1c2UsIG9yZGVyQnlQcm9wZXJ0eUlkcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdCBzZXNzaW9uIG9iamVjdCB0byB0aGUgcHJvdmlkZXIuIFRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgY2FsbCBhZnRlcgotICAgICAqIGEgc2Vzc2lvbiBpcyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluIGRlcGVuZGVuY3kgb2YgdGhlIHBhcmFtZXRlciBzZXQgYW4ge0Bjb2RlIEF0b21QdWJ9LCBhCi0gICAgICoge0Bjb2RlIFdlYlNlcnZpY2V9IG9yIGFuIHtAY29kZSBJbk1lbW9yeX0gcHJvdmlkZXIgaXMgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiaW5kaW5nID0gQ21pc0JpbmRpbmdIZWxwZXIuY3JlYXRlQmluZGluZyhwYXJhbWV0ZXJzLCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCB0eXBlRGVmQ2FjaGUpOwotCi0gICAgICAgICAgICAvKiBnZXQgaW5pdGlhbCByZXBvc2l0b3J5IElEIGZyb20gc2Vzc2lvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBwYXJhbWV0ZXJzLmdldChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQpOwotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnlJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVwb3NpdG9yeSBJRCBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBvc2l0b3J5SW5mbyA9IG9iamVjdEZhY3RvcnkuY29udmVydFJlcG9zaXRvcnlJbmZvKGdldEJpbmRpbmcoKS5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmdldFJlcG9zaXRvcnlJbmZvKAotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5SWQsIG51bGwpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc0JpbmRpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENhY2hlIGdldENhY2hlKCkgewotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gY3JlYXRlcyAtLS0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBjcmVhdGVEb2N1bWVudChNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBPYmplY3RJZCBmb2xkZXJJZCwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxQb2xpY3k+IHBvbGljaWVzLCBMaXN0PEFjZT4gYWRkQWNlcywgTGlzdDxBY2U+IHJlbW92ZUFjZXMpIHsKLSAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkocHJvcGVydGllcykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnRpZXMgbXVzdCBub3QgYmUgZW1wdHkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmV3SWQgPSBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLmNyZWF0ZURvY3VtZW50KGdldFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydFByb3BlcnRpZXMocHJvcGVydGllcywgbnVsbCwgbnVsbCwgQ1JFQVRFX0FORF9DSEVDS09VVF9VUERBVEFCSUxJVFkpLAotICAgICAgICAgICAgICAgIChmb2xkZXJJZCA9PSBudWxsID8gbnVsbCA6IGZvbGRlcklkLmdldElkKCkpLCBvYmplY3RGYWN0b3J5LmNvbnZlcnRDb250ZW50U3RyZWFtKGNvbnRlbnRTdHJlYW0pLAotICAgICAgICAgICAgICAgIHZlcnNpb25pbmdTdGF0ZSwgb2JqZWN0RmFjdG9yeS5jb252ZXJ0UG9saWNpZXMocG9saWNpZXMpLCBvYmplY3RGYWN0b3J5LmNvbnZlcnRBY2VzKGFkZEFjZXMpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydEFjZXMocmVtb3ZlQWNlcyksIG51bGwpOwotCi0gICAgICAgIGlmIChuZXdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJZChuZXdJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShPYmplY3RJZCBzb3VyY2UsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdElkIGZvbGRlcklkLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxQb2xpY3k+IHBvbGljaWVzLCBMaXN0PEFjZT4gYWRkQWNlcywgTGlzdDxBY2U+IHJlbW92ZUFjZXMpIHsKLSAgICAgICAgaWYgKChzb3VyY2UgPT0gbnVsbCkgfHwgKHNvdXJjZS5nZXRJZCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHR5cGUgb2YgdGhlIHNvdXJjZSBkb2N1bWVudAotICAgICAgICBPYmplY3RUeXBlIHR5cGUgPSBudWxsOwotICAgICAgICBMaXN0PFNlY29uZGFyeVR5cGU+IHNlY29uZGFyeVR5cGVzID0gbnVsbDsKLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENtaXNPYmplY3QpIHsKLSAgICAgICAgICAgIHR5cGUgPSAoKENtaXNPYmplY3QpIHNvdXJjZSkuZ2V0VHlwZSgpOwotICAgICAgICAgICAgc2Vjb25kYXJ5VHlwZXMgPSAoKENtaXNPYmplY3QpIHNvdXJjZSkuZ2V0U2Vjb25kYXJ5VHlwZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENtaXNPYmplY3Qgc291cmNlT2JqID0gZ2V0T2JqZWN0KHNvdXJjZSk7Ci0gICAgICAgICAgICB0eXBlID0gc291cmNlT2JqLmdldFR5cGUoKTsKLSAgICAgICAgICAgIHNlY29uZGFyeVR5cGVzID0gc291cmNlT2JqLmdldFNlY29uZGFyeVR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZS5nZXRCYXNlVHlwZUlkKCkgIT0gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2Ugb2JqZWN0IG11c3QgYmUgYSBkb2N1bWVudCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuZXdJZCA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKGdldFJlcG9zaXRvcnlJZCgpLCBzb3VyY2UuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICBvYmplY3RGYWN0b3J5LmNvbnZlcnRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIHR5cGUsIHNlY29uZGFyeVR5cGVzLCBDUkVBVEVfQU5EX0NIRUNLT1VUX1VQREFUQUJJTElUWSksCi0gICAgICAgICAgICAgICAgKGZvbGRlcklkID09IG51bGwgPyBudWxsIDogZm9sZGVySWQuZ2V0SWQoKSksIHZlcnNpb25pbmdTdGF0ZSwgb2JqZWN0RmFjdG9yeS5jb252ZXJ0UG9saWNpZXMocG9saWNpZXMpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydEFjZXMoYWRkQWNlcyksIG9iamVjdEZhY3RvcnkuY29udmVydEFjZXMocmVtb3ZlQWNlcyksIG51bGwpOwotCi0gICAgICAgIGlmIChuZXdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJZChuZXdJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZUZvbGRlcihNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBPYmplY3RJZCBmb2xkZXJJZCwgTGlzdDxQb2xpY3k+IHBvbGljaWVzLAotICAgICAgICAgICAgTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzKSB7Ci0gICAgICAgIGlmICgoZm9sZGVySWQgPT0gbnVsbCkgfHwgKGZvbGRlcklkLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZvbGRlciBJRCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwcm9wZXJ0aWVzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydGllcyBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuZXdJZCA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuY3JlYXRlRm9sZGVyKGdldFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydFByb3BlcnRpZXMocHJvcGVydGllcywgbnVsbCwgbnVsbCwgQ1JFQVRFX1VQREFUQUJJTElUWSksIGZvbGRlcklkLmdldElkKCksCi0gICAgICAgICAgICAgICAgb2JqZWN0RmFjdG9yeS5jb252ZXJ0UG9saWNpZXMocG9saWNpZXMpLCBvYmplY3RGYWN0b3J5LmNvbnZlcnRBY2VzKGFkZEFjZXMpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydEFjZXMocmVtb3ZlQWNlcyksIG51bGwpOwotCi0gICAgICAgIGlmIChuZXdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJZChuZXdJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZVBvbGljeShNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBPYmplY3RJZCBmb2xkZXJJZCwgTGlzdDxQb2xpY3k+IHBvbGljaWVzLAotICAgICAgICAgICAgTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzKSB7Ci0gICAgICAgIGlmIChpc051bGxPckVtcHR5KHByb3BlcnRpZXMpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG11c3Qgbm90IGJlIGVtcHR5ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5ld0lkID0gZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKS5jcmVhdGVQb2xpY3koZ2V0UmVwb3NpdG9yeUlkKCksCi0gICAgICAgICAgICAgICAgb2JqZWN0RmFjdG9yeS5jb252ZXJ0UHJvcGVydGllcyhwcm9wZXJ0aWVzLCBudWxsLCBudWxsLCBDUkVBVEVfVVBEQVRBQklMSVRZKSwKLSAgICAgICAgICAgICAgICAoZm9sZGVySWQgPT0gbnVsbCA/IG51bGwgOiBmb2xkZXJJZC5nZXRJZCgpKSwgb2JqZWN0RmFjdG9yeS5jb252ZXJ0UG9saWNpZXMocG9saWNpZXMpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydEFjZXMoYWRkQWNlcyksIG9iamVjdEZhY3RvcnkuY29udmVydEFjZXMocmVtb3ZlQWNlcyksIG51bGwpOwotCi0gICAgICAgIGlmIChuZXdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJZChuZXdJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZUl0ZW0oTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgT2JqZWN0SWQgZm9sZGVySWQsIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsCi0gICAgICAgICAgICBMaXN0PEFjZT4gcmVtb3ZlQWNlcykgewotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwcm9wZXJ0aWVzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydGllcyBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuZXdJZCA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuY3JlYXRlSXRlbShnZXRSZXBvc2l0b3J5SWQoKSwKLSAgICAgICAgICAgICAgICBvYmplY3RGYWN0b3J5LmNvbnZlcnRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIG51bGwsIG51bGwsIENSRUFURV9VUERBVEFCSUxJVFkpLAotICAgICAgICAgICAgICAgIChmb2xkZXJJZCA9PSBudWxsID8gbnVsbCA6IGZvbGRlcklkLmdldElkKCkpLCBvYmplY3RGYWN0b3J5LmNvbnZlcnRQb2xpY2llcyhwb2xpY2llcyksCi0gICAgICAgICAgICAgICAgb2JqZWN0RmFjdG9yeS5jb252ZXJ0QWNlcyhhZGRBY2VzKSwgb2JqZWN0RmFjdG9yeS5jb252ZXJ0QWNlcyhyZW1vdmVBY2VzKSwgbnVsbCk7Ci0KLSAgICAgICAgaWYgKG5ld0lkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9iamVjdElkKG5ld0lkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0SWQgY3JlYXRlUmVsYXRpb25zaGlwKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIExpc3Q8UG9saWN5PiBwb2xpY2llcywgTGlzdDxBY2U+IGFkZEFjZXMsCi0gICAgICAgICAgICBMaXN0PEFjZT4gcmVtb3ZlQWNlcykgewotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwcm9wZXJ0aWVzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydGllcyBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBuZXdJZCA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuY3JlYXRlUmVsYXRpb25zaGlwKGdldFJlcG9zaXRvcnlJZCgpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydFByb3BlcnRpZXMocHJvcGVydGllcywgbnVsbCwgbnVsbCwgQ1JFQVRFX1VQREFUQUJJTElUWSksCi0gICAgICAgICAgICAgICAgb2JqZWN0RmFjdG9yeS5jb252ZXJ0UG9saWNpZXMocG9saWNpZXMpLCBvYmplY3RGYWN0b3J5LmNvbnZlcnRBY2VzKGFkZEFjZXMpLAotICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY29udmVydEFjZXMocmVtb3ZlQWNlcyksIG51bGwpOwotCi0gICAgICAgIGlmIChuZXdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVPYmplY3RJZChuZXdJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZURvY3VtZW50KE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdElkIGZvbGRlcklkLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudChwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0SWQgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKE9iamVjdElkIHNvdXJjZSwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgT2JqZWN0SWQgZm9sZGVySWQsCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2Uoc291cmNlLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgdmVyc2lvbmluZ1N0YXRlLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0SWQgY3JlYXRlRm9sZGVyKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIE9iamVjdElkIGZvbGRlcklkKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGb2xkZXIocHJvcGVydGllcywgZm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCBjcmVhdGVQb2xpY3koTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgT2JqZWN0SWQgZm9sZGVySWQpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVBvbGljeShwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZUl0ZW0oTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgT2JqZWN0SWQgZm9sZGVySWQpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUl0ZW0ocHJvcGVydGllcywgZm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8vIC0tLSByZWxhdGlvbnNoaXBzIC0tLQotCi0gICAgcHVibGljIE9iamVjdElkIGNyZWF0ZVJlbGF0aW9uc2hpcChNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVSZWxhdGlvbnNoaXAocHJvcGVydGllcywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxSZWxhdGlvbnNoaXA+IGdldFJlbGF0aW9uc2hpcHMoT2JqZWN0SWQgb2JqZWN0SWQsIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgZmluYWwgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgT2JqZWN0VHlwZSB0eXBlLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0SWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgSUQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3BlcmF0aW9uIGNvbnRleHQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBvYmplY3RJZC5nZXRJZCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZUlkID0gKHR5cGUgPT0gbnVsbCA/IG51bGwgOiB0eXBlLmdldElkKCkpOwotICAgICAgICBmaW5hbCBSZWxhdGlvbnNoaXBTZXJ2aWNlIHJlbGF0aW9uc2hpcFNlcnZpY2UgPSBnZXRCaW5kaW5nKCkuZ2V0UmVsYXRpb25zaGlwU2VydmljZSgpOwotICAgICAgICBmaW5hbCBPcGVyYXRpb25Db250ZXh0IGN0eHQgPSBuZXcgT3BlcmF0aW9uQ29udGV4dEltcGwoY29udGV4dCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uSXRlcmFibGU8UmVsYXRpb25zaGlwPihuZXcgQWJzdHJhY3RQYWdlRmV0Y2hlcjxSZWxhdGlvbnNoaXA+KGN0eHQuZ2V0TWF4SXRlbXNQZXJQYWdlKCkpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQYWdlRmV0Y2hlci5QYWdlPFJlbGF0aW9uc2hpcD4gZmV0Y2hQYWdlKGxvbmcgc2tpcENvdW50KSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBmZXRjaCB0aGUgcmVsYXRpb25zaGlwcwotICAgICAgICAgICAgICAgIE9iamVjdExpc3QgcmVsTGlzdCA9IHJlbGF0aW9uc2hpcFNlcnZpY2UuZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhnZXRSZXBvc2l0b3J5SWQoKSwgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgdHlwZUlkLCBjdHh0LmdldEZpbHRlclN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgY3R4dC5pc0luY2x1ZGVBbGxvd2FibGVBY3Rpb25zKCksIEJpZ0ludGVnZXIudmFsdWVPZih0aGlzLm1heE51bUl0ZW1zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihza2lwQ291bnQpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgcmVsYXRpb25zaGlwIG9iamVjdHMKLSAgICAgICAgICAgICAgICBMaXN0PFJlbGF0aW9uc2hpcD4gcGFnZSA9IG5ldyBBcnJheUxpc3Q8UmVsYXRpb25zaGlwPigpOwotICAgICAgICAgICAgICAgIGlmIChyZWxMaXN0LmdldE9iamVjdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSByb2QgOiByZWxMaXN0LmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ21pc09iamVjdCByZWxhdGlvbnNoaXAgPSBnZXRPYmplY3Qocm9kLmdldElkKCksIGN0eHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUmVwb3NpdG9yeSByZXR1cm5lZCBhbiBvYmplY3QgdGhhdCBpcyBub3QgYSByZWxhdGlvbnNoaXAhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UuYWRkKChSZWxhdGlvbnNoaXApIHJlbGF0aW9uc2hpcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0UGFnZUZldGNoZXIuUGFnZTxSZWxhdGlvbnNoaXA+KHBhZ2UsIHJlbExpc3QuZ2V0TnVtSXRlbXMoKSwgcmVsTGlzdC5oYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIC0tLSBidWxrIHVwZGF0ZSAtLS0KLQotICAgIHB1YmxpYyBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBidWxrVXBkYXRlUHJvcGVydGllcyhMaXN0PENtaXNPYmplY3Q+IG9iamVjdHMsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBMaXN0PFN0cmluZz4gYWRkU2Vjb25kYXJ5VHlwZUlkcywgTGlzdDxTdHJpbmc+IHJlbW92ZVNlY29uZGFyeVR5cGVJZHMpIHsKLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmZvLmdldENtaXNWZXJzaW9uKCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDTUlTIDEuMCByZXBvc2l0b3JpZXMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwcm9wZXJ0aWVzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0cyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdFR5cGUgb2JqZWN0VHlwZSA9IG51bGw7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFNlY29uZGFyeVR5cGU+IHNlY29uZGFyeVR5cGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZWNvbmRhcnlUeXBlPigpOwotCi0gICAgICAgIC8vIGdhdGhlciBzZWNvbmRhcnkgdHlwZXMKLSAgICAgICAgaWYgKGFkZFNlY29uZGFyeVR5cGVJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgc3RpZCA6IGFkZFNlY29uZGFyeVR5cGVJZHMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RUeXBlIHNlY29uZGFyeVR5cGUgPSBnZXRUeXBlRGVmaW5pdGlvbihzdGlkKTsKLQotICAgICAgICAgICAgICAgIGlmICghKHNlY29uZGFyeVR5cGUgaW5zdGFuY2VvZiBTZWNvbmRhcnlUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZWNvbmRhcnkgdHlwZXMgY29udGFpbnMgYSB0eXBlIHRoYXQgaXMgbm90IGEgc2Vjb25kYXJ5IHR5cGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlY29uZGFyeVR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2Vjb25kYXJ5VHlwZXMucHV0KHNlY29uZGFyeVR5cGUuZ2V0SWQoKSwgKFNlY29uZGFyeVR5cGUpIHNlY29uZGFyeVR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2F0aGVyIGlkcyBhbmQgY2hhbmdlIHRva2VucwotICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBvYmplY3RJZHNBbmRDaGFuZ2VUb2tlbnMgPSBuZXcgQXJyYXlMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPigpOwotICAgICAgICBmb3IgKENtaXNPYmplY3Qgb2JqZWN0IDogb2JqZWN0cykgewotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9iamVjdElkc0FuZENoYW5nZVRva2Vucy5hZGQobmV3IEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbChvYmplY3QuZ2V0SWQoKSwgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDaGFuZ2VUb2tlbigpKSk7Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvYmplY3RUeXBlID0gb2JqZWN0LmdldFR5cGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRTZWNvbmRhcnlUeXBlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFNlY29uZGFyeVR5cGUgc2Vjb25kYXJ5VHlwZSA6IG9iamVjdC5nZXRTZWNvbmRhcnlUeXBlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVR5cGVzLnB1dChzZWNvbmRhcnlUeXBlLmdldElkKCksIHNlY29uZGFyeVR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNldDxVcGRhdGFiaWxpdHk+IHVwZGF0ZWJpbGl0eSA9IEVudW1TZXQubm9uZU9mKFVwZGF0YWJpbGl0eS5jbGFzcyk7Ci0gICAgICAgIHVwZGF0ZWJpbGl0eS5hZGQoVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0KLSAgICAgICAgcmV0dXJuIGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuYnVsa1VwZGF0ZVByb3BlcnRpZXMoZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkc0FuZENoYW5nZVRva2VucywKLSAgICAgICAgICAgICAgICBvYmplY3RGYWN0b3J5LmNvbnZlcnRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIG9iamVjdFR5cGUsIHNlY29uZGFyeVR5cGVzLnZhbHVlcygpLCB1cGRhdGViaWxpdHkpLAotICAgICAgICAgICAgICAgIGFkZFNlY29uZGFyeVR5cGVJZHMsIHJlbW92ZVNlY29uZGFyeVR5cGVJZHMsIG51bGwpOwotICAgIH0KLQotICAgIC8vIC0tLSBkZWxldGUgLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0SWQgb2JqZWN0SWQpIHsKLSAgICAgICAgZGVsZXRlKG9iamVjdElkLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoT2JqZWN0SWQgb2JqZWN0SWQsIGJvb2xlYW4gYWxsVmVyc2lvbnMpIHsKLSAgICAgICAgaWYgKChvYmplY3RJZCA9PSBudWxsKSB8fCAob2JqZWN0SWQuZ2V0SWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgSUQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRCaW5kaW5nKCkuZ2V0T2JqZWN0U2VydmljZSgpLmRlbGV0ZU9iamVjdChnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWQuZ2V0SWQoKSwgYWxsVmVyc2lvbnMsIG51bGwpOwotICAgICAgICByZW1vdmVPYmplY3RGcm9tQ2FjaGUob2JqZWN0SWQpOwotICAgIH0KLQotICAgIC8vIC0tLSBjb250ZW50IHN0cmVhbSAtLS0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oT2JqZWN0SWQgZG9jSWQpIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRTdHJlYW0oZG9jSWQsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oT2JqZWN0SWQgZG9jSWQsIFN0cmluZyBzdHJlYW1JZCwgQmlnSW50ZWdlciBvZmZzZXQsIEJpZ0ludGVnZXIgbGVuZ3RoKSB7Ci0gICAgICAgIGlmICgoZG9jSWQgPT0gbnVsbCkgfHwgKGRvY0lkLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZG9jdW1lbnQgSUQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHN0cmVhbQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IGdldEJpbmRpbmcoKS5nZXRPYmplY3RTZXJ2aWNlKCkuZ2V0Q29udGVudFN0cmVhbShnZXRSZXBvc2l0b3J5SWQoKSwgZG9jSWQuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQsIG9mZnNldCwgbGVuZ3RoLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbm8gY29udGVudCBzdHJlYW0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW07Ci0gICAgfQotCi0gICAgLy8gLS0tIEFDTCAtLS0KLQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKE9iamVjdElkIG9iamVjdElkLCBib29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zKSB7Ci0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IElEISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gb2JqZWN0SWQuZ2V0SWQoKTsKLQotICAgICAgICByZXR1cm4gZ2V0QmluZGluZygpLmdldEFjbFNlcnZpY2UoKS5nZXRBY2woZ2V0UmVwb3NpdG9yeUlkKCksIGlkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBhcHBseUFjbChPYmplY3RJZCBvYmplY3RJZCwgTGlzdDxBY2U+IGFkZEFjZXMsIExpc3Q8QWNlPiByZW1vdmVBY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbikgewotICAgICAgICBpZiAoKG9iamVjdElkID09IG51bGwpIHx8IChvYmplY3RJZC5nZXRJZCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG9iamVjdCBJRCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBnZXRPYmplY3RGYWN0b3J5KCk7Ci0KLSAgICAgICAgcmV0dXJuIGdldEJpbmRpbmcoKS5nZXRBY2xTZXJ2aWNlKCkuYXBwbHlBY2woZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLmdldElkKCksIG9mLmNvbnZlcnRBY2VzKGFkZEFjZXMpLAotICAgICAgICAgICAgICAgIG9mLmNvbnZlcnRBY2VzKHJlbW92ZUFjZXMpLCBhY2xQcm9wYWdhdGlvbiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBzZXRBY2woT2JqZWN0SWQgb2JqZWN0SWQsIExpc3Q8QWNlPiBhY2VzKSB7Ci0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IElEISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIGFjZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFjbFNlcnZpY2UgYWNsU2VydmljZSA9IGdldEJpbmRpbmcoKS5nZXRBY2xTZXJ2aWNlKCk7Ci0gICAgICAgIGlmICghKGFjbFNlcnZpY2UgaW5zdGFuY2VvZiBFeHRlbmRlZEFjbFNlcnZpY2UpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigic2V0QWNsKCkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYmluZGluZyBpbXBsZW1lbnRhdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBnZXRPYmplY3RGYWN0b3J5KCk7Ci0KLSAgICAgICAgcmV0dXJuICgoRXh0ZW5kZWRBY2xTZXJ2aWNlKSBhY2xTZXJ2aWNlKS5zZXRBY2woZ2V0UmVwb3NpdG9yeUlkKCksIG9iamVjdElkLmdldElkKCksIG9mLmNvbnZlcnRBY2VzKGFjZXMpKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gUG9saWNpZXMgLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShPYmplY3RJZCBvYmplY3RJZCwgT2JqZWN0SWQuLi4gcG9saWN5SWRzKSB7Ci0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IElEISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwb2xpY3lJZHMgPT0gbnVsbCkgfHwgKHBvbGljeUlkcy5sZW5ndGggPT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIFBvbGljaWVzIHByb3ZpZGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1twb2xpY3lJZHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2xpY3lJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgocG9saWN5SWRzW2ldID09IG51bGwpIHx8IChwb2xpY3lJZHNbaV0uZ2V0SWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgUG9saWN5IElEIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlkc1tpXSA9IHBvbGljeUlkc1tpXS5nZXRJZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKLSAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXRQb2xpY3lTZXJ2aWNlKCkuYXBwbHlQb2xpY3koZ2V0UmVwb3NpdG9yeUlkKCksIGlkLCBvYmplY3RJZC5nZXRJZCgpLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBvbGljeShPYmplY3RJZCBvYmplY3RJZCwgT2JqZWN0SWQuLi4gcG9saWN5SWRzKSB7Ci0gICAgICAgIGlmICgob2JqZWN0SWQgPT0gbnVsbCkgfHwgKG9iamVjdElkLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IElEISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwb2xpY3lJZHMgPT0gbnVsbCkgfHwgKHBvbGljeUlkcy5sZW5ndGggPT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIFBvbGljaWVzIHByb3ZpZGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1twb2xpY3lJZHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2xpY3lJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgocG9saWN5SWRzW2ldID09IG51bGwpIHx8IChwb2xpY3lJZHNbaV0uZ2V0SWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgUG9saWN5IElEIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlkc1tpXSA9IHBvbGljeUlkc1tpXS5nZXRJZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKLSAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXRQb2xpY3lTZXJ2aWNlKCkucmVtb3ZlUG9saWN5KGdldFJlcG9zaXRvcnlJZCgpLCBpZCwgb2JqZWN0SWQuZ2V0SWQoKSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlc3Npb24gIiArIGdldEJpbmRpbmcoKS5nZXRTZXNzaW9uSWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL2NhY2hlL0NhY2hlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL2NhY2hlL0NhY2hlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2UwYjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9jYWNoZS9DYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLmNhY2hlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIHNlc3Npb24gY2FjaGUgcHJvdmlkaW5nIGZvbGxvd2luZyBjYXBhYmlsaXRpZXM6Ci0gKiA8cD4KLSAqIDx1bD4KLSAqIDxsaT5hY2Nlc3MgQ21pc09iamVjdCBieSBvYmplY3QgaWQ8L2xpPgotICogPGxpPmFjY2VzcyBDbWlzT2JqZWN0IGJ5IG9iamVjdCBwYXRoPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FjaGUgZXh0ZW5kcyBTZXJpYWxpemFibGUgewotCi0gICAgdm9pZCBpbml0aWFsaXplKFNlc3Npb24gc2Vzc2lvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKTsKLQotICAgIGJvb2xlYW4gY29udGFpbnNJZChTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBjYWNoZUtleSk7Ci0KLSAgICBib29sZWFuIGNvbnRhaW5zUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGNhY2hlS2V5KTsKLQotICAgIHZvaWQgcHV0KENtaXNPYmplY3Qgb2JqZWN0LCBTdHJpbmcgY2FjaGVLZXkpOwotCi0gICAgdm9pZCBwdXRQYXRoKFN0cmluZyBwYXRoLCBDbWlzT2JqZWN0IG9iamVjdCwgU3RyaW5nIGNhY2hlS2V5KTsKLQotICAgIENtaXNPYmplY3QgZ2V0QnlJZChTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBjYWNoZUtleSk7Ci0KLSAgICBDbWlzT2JqZWN0IGdldEJ5UGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIGNhY2hlS2V5KTsKLQotICAgIHZvaWQgcmVtb3ZlKFN0cmluZyBvYmplY3RJZCk7Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICBpbnQgZ2V0Q2FjaGVTaXplKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL2NhY2hlL0NhY2hlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9jYWNoZS9DYWNoZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmNWMwOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL2NhY2hlL0NhY2hlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5jYWNoZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0czsKLQotLyoqCi0gKiBTeW5jaHJvbml6ZWQgY2FjaGUgaW1wbGVtZW50YXRpb24uIFRoZSBjYWNoZSBpcyBsaW1pdGVkIHRvIGEgc3BlY2lmaWMgc2l6ZSBvZgotICogZW50cmllcyBhbmQgd29ya3MgaW4gYSBMUlUgbW9kZS4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlSW1wbCBpbXBsZW1lbnRzIENhY2hlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSEFTSFRBQkxFX0xPQURfRkFDVE9SID0gMC43NWY7Ci0KLSAgICBwcml2YXRlIGludCBjYWNoZVNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgY2FjaGVUdGw7Ci0gICAgcHJpdmF0ZSBpbnQgcGF0aFRvSWRTaXplOwotICAgIHByaXZhdGUgaW50IHBhdGhUb0lkVHRsOwotCi0gICAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwPFN0cmluZywgQ2FjaGVJdGVtPE1hcDxTdHJpbmcsIENtaXNPYmplY3Q+Pj4gb2JqZWN0TWFwOwotICAgIHByaXZhdGUgTGlua2VkSGFzaE1hcDxTdHJpbmcsIENhY2hlSXRlbTxTdHJpbmc+PiBwYXRoVG9JZE1hcDsKLQotICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENhY2hlSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFNlc3Npb24gc2Vzc2lvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzICE9IG51bGw7Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjYWNoZSBzaXplCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNhY2hlU2l6ZSA9IEludGVnZXIudmFsdWVPZihwYXJhbWV0ZXJzLmdldChTZXNzaW9uUGFyYW1ldGVyLkNBQ0hFX1NJWkVfT0JKRUNUUykpOwotICAgICAgICAgICAgICAgIGlmIChjYWNoZVNpemUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBjYWNoZVNpemUgPSBTZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHMuQ0FDSEVfU0laRV9PQkpFQ1RTOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjYWNoZSB0aW1lLXRvLWxpdmUKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVUdGwgPSBJbnRlZ2VyLnZhbHVlT2YocGFyYW1ldGVycy5nZXQoU2Vzc2lvblBhcmFtZXRlci5DQUNIRV9UVExfT0JKRUNUUykpOwotICAgICAgICAgICAgICAgIGlmIChjYWNoZVR0bCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVUdGwgPSBTZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHMuQ0FDSEVfVFRMX09CSkVDVFM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBjYWNoZVR0bCA9IFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9UVExfT0JKRUNUUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcGF0aC10by1pZCBzaXplCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhdGhUb0lkU2l6ZSA9IEludGVnZXIudmFsdWVPZihwYXJhbWV0ZXJzLmdldChTZXNzaW9uUGFyYW1ldGVyLkNBQ0hFX1NJWkVfUEFUSFRPSUQpKTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aFRvSWRTaXplIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRoVG9JZFNpemUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcGF0aFRvSWRTaXplID0gU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLkNBQ0hFX1NJWkVfUEFUSFRPSUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHBhdGgtdG8taWQgdGltZS10by1saXZlCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhdGhUb0lkVHRsID0gSW50ZWdlci52YWx1ZU9mKHBhcmFtZXRlcnMuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfVFRMX1BBVEhUT0lEKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhUb0lkVHRsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRoVG9JZFR0bCA9IFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9UVExfUEFUSFRPSUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBwYXRoVG9JZFR0bCA9IFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5DQUNIRV9UVExfUEFUSFRPSUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGluaXRpYWxpemVJbnRlcm5hbHMoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHVwIHRoZSBpbnRlcm5hbCBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplSW50ZXJuYWxzKCkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIG9iamVjdCBjYWNoZQotICAgICAgICAgICAgaW50IGNhY2hlSGFzaFRhYmxlQ2FwYWNpdHkgPSAoaW50KSBNYXRoLmNlaWwoY2FjaGVTaXplIC8gSEFTSFRBQkxFX0xPQURfRkFDVE9SKSArIDE7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBjcyA9IGNhY2hlU2l6ZTsKLQotICAgICAgICAgICAgb2JqZWN0TWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDYWNoZUl0ZW08TWFwPFN0cmluZywgQ21pc09iamVjdD4+PihjYWNoZUhhc2hUYWJsZUNhcGFjaXR5LAotICAgICAgICAgICAgICAgICAgICBIQVNIVEFCTEVfTE9BRF9GQUNUT1IpIHsKLQotICAgICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PFN0cmluZywgQ2FjaGVJdGVtPE1hcDxTdHJpbmcsIENtaXNPYmplY3Q+Pj4gZWxkZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaXplKCkgPiBjczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAvLyBwYXRoLXRvLWlkIG1hcHBpbmcKLSAgICAgICAgICAgIGludCBwYXRodG9pZEhhc2hUYWJsZUNhcGFjaXR5ID0gKGludCkgTWF0aC5jZWlsKHBhdGhUb0lkU2l6ZSAvIEhBU0hUQUJMRV9MT0FEX0ZBQ1RPUikgKyAxOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgcHRpcyA9IHBhdGhUb0lkU2l6ZTsKLQotICAgICAgICAgICAgcGF0aFRvSWRNYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIENhY2hlSXRlbTxTdHJpbmc+PihwYXRodG9pZEhhc2hUYWJsZUNhcGFjaXR5LCBIQVNIVEFCTEVfTE9BRF9GQUNUT1IpIHsKLQotICAgICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PFN0cmluZywgQ2FjaGVJdGVtPFN0cmluZz4+IGVsZGVzdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZSgpID4gcHRpczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBpbml0aWFsaXplSW50ZXJuYWxzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJZChTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBjYWNoZUtleSkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghb2JqZWN0TWFwLmNvbnRhaW5zS2V5KG9iamVjdElkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2FjaGVJdGVtPE1hcDxTdHJpbmcsIENtaXNPYmplY3Q+PiBpdGVtID0gb2JqZWN0TWFwLmdldChvYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAoaXRlbS5pc0V4cGlyZWQoKSkgewotICAgICAgICAgICAgICAgIG9iamVjdE1hcC5yZW1vdmUob2JqZWN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgY2FjaGVLZXkpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIXBhdGhUb0lkTWFwLmNvbnRhaW5zS2V5KHBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDYWNoZUl0ZW08U3RyaW5nPiBpdGVtID0gcGF0aFRvSWRNYXAuZ2V0KHBhdGgpOwotICAgICAgICAgICAgaWYgKGl0ZW0uaXNFeHBpcmVkKCkgfHwgIWNvbnRhaW5zSWQoaXRlbS5nZXRJdGVtKCksIGNhY2hlS2V5KSkgewotICAgICAgICAgICAgICAgIHBhdGhUb0lkTWFwLnJlbW92ZShwYXRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IGdldEJ5SWQoU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgY2FjaGVLZXkpIHsKLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIWNvbnRhaW5zSWQob2JqZWN0SWQsIGNhY2hlS2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDbWlzT2JqZWN0PiBpdGVtID0gb2JqZWN0TWFwLmdldChvYmplY3RJZCkuZ2V0SXRlbSgpOwotICAgICAgICAgICAgcmV0dXJuIChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS5nZXQoY2FjaGVLZXkpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdCBnZXRCeVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyBjYWNoZUtleSkgewotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghY29udGFpbnNQYXRoKHBhdGgsIGNhY2hlS2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDYWNoZUl0ZW08U3RyaW5nPiBpdGVtID0gcGF0aFRvSWRNYXAuZ2V0KHBhdGgpOwotICAgICAgICAgICAgcmV0dXJuIGdldEJ5SWQoaXRlbS5nZXRJdGVtKCksIGNhY2hlS2V5KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXQoQ21pc09iamVjdCBvYmplY3QsIFN0cmluZyBjYWNoZUtleSkgewotICAgICAgICAvLyBubyBvYmplY3QsIG5vIGNhY2hlIGtleSAtIG5vIGNhY2hlCi0gICAgICAgIGlmICgob2JqZWN0ID09IG51bGwpIHx8IChjYWNoZUtleSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm8gaWQgLSBubyBjYWNoZQotICAgICAgICBpZiAob2JqZWN0LmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgY2FjaGUga2V5IG1hcAotICAgICAgICAgICAgQ2FjaGVJdGVtPE1hcDxTdHJpbmcsIENtaXNPYmplY3Q+PiBjYWNoZUtleU1hcCA9IG9iamVjdE1hcC5nZXQob2JqZWN0LmdldElkKCkpOwotICAgICAgICAgICAgaWYgKGNhY2hlS2V5TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWNoZUtleU1hcCA9IG5ldyBDYWNoZUl0ZW08TWFwPFN0cmluZywgQ21pc09iamVjdD4+KG5ldyBIYXNoTWFwPFN0cmluZywgQ21pc09iamVjdD4oKSwgY2FjaGVUdGwpOwotICAgICAgICAgICAgICAgIG9iamVjdE1hcC5wdXQob2JqZWN0LmdldElkKCksIGNhY2hlS2V5TWFwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHV0IGludG8gaWQgY2FjaGUKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENtaXNPYmplY3Q+IG0gPSBjYWNoZUtleU1hcC5nZXRJdGVtKCk7Ci0gICAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbS5wdXQoY2FjaGVLZXksIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZvbGRlcnMgbWF5IGhhdmUgYSBwYXRoLCB1c2UgaXQhCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG9iamVjdC5nZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5SWRzLlBBVEgpOwotICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhdGhUb0lkTWFwLnB1dChwYXRoLCBuZXcgQ2FjaGVJdGVtPFN0cmluZz4ob2JqZWN0LmdldElkKCksIHBhdGhUb0lkVHRsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0UGF0aChTdHJpbmcgcGF0aCwgQ21pc09iamVjdCBvYmplY3QsIFN0cmluZyBjYWNoZUtleSkgewotICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHB1dChvYmplY3QsIGNhY2hlS2V5KTsKLQotICAgICAgICAgICAgaWYgKChvYmplY3QgIT0gbnVsbCkgJiYgKG9iamVjdC5nZXRJZCgpICE9IG51bGwpICYmIChjYWNoZUtleSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHBhdGhUb0lkTWFwLnB1dChwYXRoLCBuZXcgQ2FjaGVJdGVtPFN0cmluZz4ob2JqZWN0LmdldElkKCksIHBhdGhUb0lkVHRsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmplY3RNYXAucmVtb3ZlKG9iamVjdElkKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENhY2hlU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVTaXplOwotICAgIH0KLQotICAgIC8vIC0tLSBjYWNoZSBpdGVtIC0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FjaGVJdGVtPFQ+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwcml2YXRlIFNvZnRSZWZlcmVuY2U8VD4gaXRlbTsKLSAgICAgICAgcHJpdmF0ZSBsb25nIHRpbWVzdGFtcDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgdHRsOwotCi0gICAgICAgIHB1YmxpYyBDYWNoZUl0ZW0oVCBpdGVtLCBpbnQgdHRsKSB7Ci0gICAgICAgICAgICB0aGlzLml0ZW0gPSBuZXcgU29mdFJlZmVyZW5jZTxUPihpdGVtKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgdGhpcy50dGwgPSB0dGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFeHBpcmVkKCkgewotICAgICAgICAgICAgaWYgKChpdGVtID09IG51bGwpIHx8IChpdGVtLmdldCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAodGltZXN0YW1wICsgdHRsIDwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBUIGdldEl0ZW0oKSB7Ci0gICAgICAgICAgICBpZiAoaXNFeHBpcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBpdGVtID0gbnVsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChpc0V4cGlyZWQoKSA/IG51bGwgOiBpdGVtLmdldCgpKTsKLSAgICAgICAgICAgIG91dC53cml0ZUxvbmcodGltZXN0YW1wKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludCh0dGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIFQgb2JqZWN0ID0gKFQpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcCA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgICAgICB0dGwgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIGlmICgob2JqZWN0ICE9IG51bGwpICYmICh0aW1lc3RhbXAgKyB0dGwgPj0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pdGVtID0gbmV3IFNvZnRSZWZlcmVuY2U8VD4ob2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvY2FjaGUvTm9DYWNoZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvY2FjaGUvTm9DYWNoZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5ZjYxZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL2NhY2hlL05vQ2FjaGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuY2FjaGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIE5vQ2FjaGVJbXBsIGltcGxlbWVudHMgQ2FjaGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFNlc3Npb24gc2Vzc2lvbiwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNJZChTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBjYWNoZUtleSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgY2FjaGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dChDbWlzT2JqZWN0IG9iamVjdCwgU3RyaW5nIGNhY2hlS2V5KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0UGF0aChTdHJpbmcgcGF0aCwgQ21pc09iamVjdCBvYmplY3QsIFN0cmluZyBjYWNoZUtleSkgewotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IGdldEJ5SWQoU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgY2FjaGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3QgZ2V0QnlQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgY2FjaGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBvYmplY3RJZCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVTaXplKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvRG9jdW1lbnRUeXBlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9vYmplY3R0eXBlL0RvY3VtZW50VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1ZDBkYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvRG9jdW1lbnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLm9iamVjdHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGw7Ci0KLS8qKgotICogRG9jdW1lbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VHlwZUltcGwgZXh0ZW5kcyBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCBpbXBsZW1lbnRzIERvY3VtZW50VHlwZSwgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RUeXBlSGVscGVyIGhlbHBlcjsKLQotICAgIHB1YmxpYyBEb2N1bWVudFR5cGVJbXBsKFNlc3Npb24gc2Vzc2lvbiwgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbikgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdHlwZURlZmluaXRpb24gIT0gbnVsbDsKLQotICAgICAgICBpbml0aWFsaXplKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgc2V0Q29udGVudFN0cmVhbUFsbG93ZWQodHlwZURlZmluaXRpb24uZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSk7Ci0gICAgICAgIHNldElzVmVyc2lvbmFibGUodHlwZURlZmluaXRpb24uaXNWZXJzaW9uYWJsZSgpKTsKLSAgICAgICAgaGVscGVyID0gbmV3IE9iamVjdFR5cGVIZWxwZXIoc2Vzc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0QmFzZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPE9iamVjdFR5cGU+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gaGVscGVyLmdldENoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0RGVzY2VuZGFudHMoZGVwdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0UGFyZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuaXNCYXNlVHlwZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9vYmplY3R0eXBlL0ZvbGRlclR5cGVJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvRm9sZGVyVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0OTRkOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvRm9sZGVyVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5vYmplY3R0eXBlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Gb2xkZXJUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRm9sZGVyVHlwZURlZmluaXRpb25JbXBsOwotCi0vKioKLSAqIEZvbGRlciB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgRm9sZGVyVHlwZUltcGwgZXh0ZW5kcyBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwgaW1wbGVtZW50cyBGb2xkZXJUeXBlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RUeXBlSGVscGVyIGhlbHBlcjsKLQotICAgIHB1YmxpYyBGb2xkZXJUeXBlSW1wbChTZXNzaW9uIHNlc3Npb24sIEZvbGRlclR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgIGFzc2VydCBzZXNzaW9uICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB0eXBlRGVmaW5pdGlvbiAhPSBudWxsOwotCi0gICAgICAgIGluaXRpYWxpemUodHlwZURlZmluaXRpb24pOwotICAgICAgICBoZWxwZXIgPSBuZXcgT2JqZWN0VHlwZUhlbHBlcihzZXNzaW9uLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZSBnZXRCYXNlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRCYXNlVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8T2JqZWN0VHlwZT4gZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUcmVlPE9iamVjdFR5cGU+PiBnZXREZXNjZW5kYW50cyhpbnQgZGVwdGgpIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci5nZXREZXNjZW5kYW50cyhkZXB0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRQYXJlbnRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCYXNlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlci5pc0Jhc2VUeXBlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvSXRlbVR5cGVJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvSXRlbVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDY2YjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9vYmplY3R0eXBlL0l0ZW1UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLm9iamVjdHR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5JdGVtVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkl0ZW1UeXBlRGVmaW5pdGlvbkltcGw7Ci0KLXB1YmxpYyBjbGFzcyBJdGVtVHlwZUltcGwgZXh0ZW5kcyBJdGVtVHlwZURlZmluaXRpb25JbXBsIGltcGxlbWVudHMgSXRlbVR5cGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFR5cGVIZWxwZXIgaGVscGVyOwotCi0gICAgcHVibGljIEl0ZW1UeXBlSW1wbChTZXNzaW9uIHNlc3Npb24sIEl0ZW1UeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbikgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdHlwZURlZmluaXRpb24gIT0gbnVsbDsKLQotICAgICAgICBpbml0aWFsaXplKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgaGVscGVyID0gbmV3IE9iamVjdFR5cGVIZWxwZXIoc2Vzc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0QmFzZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPE9iamVjdFR5cGU+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gaGVscGVyLmdldENoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0RGVzY2VuZGFudHMoZGVwdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0UGFyZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuaXNCYXNlVHlwZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9vYmplY3R0eXBlL09iamVjdFR5cGVIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvb2JqZWN0dHlwZS9PYmplY3RUeXBlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjAxYTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9vYmplY3R0eXBlL09iamVjdFR5cGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5vYmplY3R0eXBlOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuVHJlZTsKLQotLyoqCi0gKiBIZWxwZXIgZm9yIG9iamVjdCB0eXBlcywgY29udGFpbmluZyBzZXNzaW9uLXJlbGF0ZWQgaW5mby4KLSAqIDxwPgotICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBKYXZhIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFR5cGVIZWxwZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb24gc2Vzc2lvbjsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFR5cGUgb2JqZWN0VHlwZTsKLSAgICBwcml2YXRlIE9iamVjdFR5cGUgYmFzZVR5cGU7Ci0gICAgcHJpdmF0ZSBPYmplY3RUeXBlIHBhcmVudFR5cGU7Ci0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZUhlbHBlcihTZXNzaW9uIHNlc3Npb24sIE9iamVjdFR5cGUgb2JqZWN0VHlwZSkgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgb2JqZWN0VHlwZSAhPSBudWxsOwotCi0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgIHRoaXMub2JqZWN0VHlwZSA9IG9iamVjdFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb24gZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCYXNlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdFR5cGUuZ2V0UGFyZW50VHlwZUlkKCkgPT0gbnVsbCB8fCBvYmplY3RUeXBlLmdldFBhcmVudFR5cGVJZCgpLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgICAgIGlmIChpc0Jhc2VUeXBlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiYXNlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZVR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdFR5cGUuZ2V0QmFzZVR5cGVJZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGJhc2VUeXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihvYmplY3RUeXBlLmdldEJhc2VUeXBlSWQoKS52YWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuIGJhc2VUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIGlmIChwYXJlbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnRUeXBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3RUeXBlLmdldFBhcmVudFR5cGVJZCgpID09IG51bGwgfHwgb2JqZWN0VHlwZS5nZXRQYXJlbnRUeXBlSWQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBwYXJlbnRUeXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihvYmplY3RUeXBlLmdldFBhcmVudFR5cGVJZCgpKTsKLSAgICAgICAgcmV0dXJuIHBhcmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1JdGVyYWJsZTxPYmplY3RUeXBlPiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0VHlwZUNoaWxkcmVuKG9iamVjdFR5cGUuZ2V0SWQoKSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uLmdldFR5cGVEZXNjZW5kYW50cyhvYmplY3RUeXBlLmdldElkKCksIGRlcHRoLCB0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvUG9saWN5VHlwZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvb2JqZWN0dHlwZS9Qb2xpY3lUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjZjYmZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvb2JqZWN0dHlwZS9Qb2xpY3lUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLm9iamVjdHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlBvbGljeVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuVHJlZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBvbGljeVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lUeXBlRGVmaW5pdGlvbkltcGw7Ci0KLS8qKgotICogUG9saWN5IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2xpY3lUeXBlSW1wbCBleHRlbmRzIFBvbGljeVR5cGVEZWZpbml0aW9uSW1wbCBpbXBsZW1lbnRzIFBvbGljeVR5cGUsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0VHlwZUhlbHBlciBoZWxwZXI7Ci0KLSAgICBwdWJsaWMgUG9saWN5VHlwZUltcGwoU2Vzc2lvbiBzZXNzaW9uLCBQb2xpY3lUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbikgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdHlwZURlZmluaXRpb24gIT0gbnVsbDsKLQotICAgICAgICBpbml0aWFsaXplKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgaGVscGVyID0gbmV3IE9iamVjdFR5cGVIZWxwZXIoc2Vzc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0QmFzZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPE9iamVjdFR5cGU+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gaGVscGVyLmdldENoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0RGVzY2VuZGFudHMoZGVwdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0UGFyZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuaXNCYXNlVHlwZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9vYmplY3R0eXBlL1JlbGF0aW9uc2hpcFR5cGVJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvUmVsYXRpb25zaGlwVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2NDM1OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvUmVsYXRpb25zaGlwVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUub2JqZWN0dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5SZWxhdGlvbnNoaXBUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsOwotCi0vKioKLSAqIFJlbGF0aW9uc2hpcCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwVHlwZUltcGwgZXh0ZW5kcyBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXBUeXBlLCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdFR5cGVIZWxwZXIgaGVscGVyOwotICAgIHByaXZhdGUgTGlzdDxPYmplY3RUeXBlPiBhbGxvd2VkU291cmNlVHlwZXM7Ci0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdFR5cGU+IGFsbG93ZWRUYXJnZXRUeXBlczsKLQotICAgIHB1YmxpYyBSZWxhdGlvbnNoaXBUeXBlSW1wbChTZXNzaW9uIHNlc3Npb24sIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgIGFzc2VydCBzZXNzaW9uICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB0eXBlRGVmaW5pdGlvbiAhPSBudWxsOwotCi0gICAgICAgIGluaXRpYWxpemUodHlwZURlZmluaXRpb24pOwotICAgICAgICBzZXRBbGxvd2VkU291cmNlVHlwZXModHlwZURlZmluaXRpb24uZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSk7Ci0gICAgICAgIHNldEFsbG93ZWRUYXJnZXRUeXBlcyh0eXBlRGVmaW5pdGlvbi5nZXRBbGxvd2VkVGFyZ2V0VHlwZUlkcygpKTsKLSAgICAgICAgaGVscGVyID0gbmV3IE9iamVjdFR5cGVIZWxwZXIoc2Vzc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0QmFzZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPE9iamVjdFR5cGU+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gaGVscGVyLmdldENoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0RGVzY2VuZGFudHMoZGVwdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0UGFyZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuaXNCYXNlVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFR5cGU+IGdldEFsbG93ZWRTb3VyY2VUeXBlcygpIHsKLSAgICAgICAgaWYgKGFsbG93ZWRTb3VyY2VUeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaWRzID0gZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKTsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFR5cGU+KGlkcyA9PSBudWxsID8gMCA6IGlkcy5zaXplKCkpOwotICAgICAgICAgICAgaWYgKGlkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKGhlbHBlci5nZXRTZXNzaW9uKCkuZ2V0VHlwZURlZmluaXRpb24oaWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbGxvd2VkU291cmNlVHlwZXMgPSB0eXBlczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWxsb3dlZFNvdXJjZVR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFR5cGU+IGdldEFsbG93ZWRUYXJnZXRUeXBlcygpIHsKLSAgICAgICAgaWYgKGFsbG93ZWRUYXJnZXRUeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaWRzID0gZ2V0QWxsb3dlZFRhcmdldFR5cGVJZHMoKTsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0VHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFR5cGU+KGlkcyA9PSBudWxsID8gMCA6IGlkcy5zaXplKCkpOwotICAgICAgICAgICAgaWYgKGlkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKGhlbHBlci5nZXRTZXNzaW9uKCkuZ2V0VHlwZURlZmluaXRpb24oaWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbGxvd2VkVGFyZ2V0VHlwZXMgPSB0eXBlczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWxsb3dlZFRhcmdldFR5cGVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9vYmplY3R0eXBlL1NlY29uZGFyeVR5cGVJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvU2Vjb25kYXJ5VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1N2FiNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL29iamVjdHR5cGUvU2Vjb25kYXJ5VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUub2JqZWN0dHlwZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vjb25kYXJ5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbDsKLQotcHVibGljIGNsYXNzIFNlY29uZGFyeVR5cGVJbXBsIGV4dGVuZHMgU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsIGltcGxlbWVudHMgU2Vjb25kYXJ5VHlwZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0VHlwZUhlbHBlciBoZWxwZXI7Ci0KLSAgICBwdWJsaWMgU2Vjb25kYXJ5VHlwZUltcGwoU2Vzc2lvbiBzZXNzaW9uLCBTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbikgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdHlwZURlZmluaXRpb24gIT0gbnVsbDsKLQotICAgICAgICBpbml0aWFsaXplKHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgaGVscGVyID0gbmV3IE9iamVjdFR5cGVIZWxwZXIoc2Vzc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0QmFzZVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPE9iamVjdFR5cGU+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gaGVscGVyLmdldENoaWxkcmVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gZ2V0RGVzY2VuZGFudHMoaW50IGRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0RGVzY2VuZGFudHMoZGVwdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuZ2V0UGFyZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoZWxwZXIuaXNCYXNlVHlwZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvcmVwb3NpdG9yeS9PYmplY3RGYWN0b3J5SW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9yZXBvc2l0b3J5L09iamVjdEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjE0MjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9yZXBvc2l0b3J5L09iamVjdEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLio7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ2hhbmdlRXZlbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlByb3BlcnR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUXVlcnlSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5SZW5kaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZWNvbmRhcnlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5DaGFuZ2VFdmVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuQ2hhbmdlRXZlbnRzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuRm9sZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5JdGVtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5Qb2xpY3lJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLlByb3BlcnR5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5RdWVyeVJlc3VsdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuUmVsYXRpb25zaGlwSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5SZW5kaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLlNlc3Npb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLm9iamVjdHR5cGUuRG9jdW1lbnRUeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5vYmplY3R0eXBlLkZvbGRlclR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLm9iamVjdHR5cGUuSXRlbVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLm9iamVjdHR5cGUuUG9saWN5VHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUub2JqZWN0dHlwZS5SZWxhdGlvbnNoaXBUeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5vYmplY3R0eXBlLlNlY29uZGFyeVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkZvbGRlclR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuSXRlbVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUG9saWN5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEYXRlVGltZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SWREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5VXJpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2hhbmdlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5QYXJ0aWFsQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQmluZGluZ3NPYmplY3RGYWN0b3J5OwotCi0vKioKLSAqIFBlcnNpc3RlbnQgbW9kZWwgb2JqZWN0IGZhY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE9iamVjdEZhY3RvcnksIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RmFjdG9yeUltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTZXNzaW9uIHNlc3Npb24sIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBhc3NlcnQgc2Vzc2lvbiAhPSBudWxsOwotCi0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZ3Mgb2JqZWN0IGZhY3RvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBnZXRCaW5kaW5nc09iamVjdEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uLmdldEJpbmRpbmcoKS5nZXRPYmplY3RGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLy8gcmVwb3NpdG9yeSBpbmZvCi0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gY29udmVydFJlcG9zaXRvcnlJbmZvKFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnlJbmZvKSB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5SW5mbzsKLSAgICB9Ci0KLSAgICAvLyBBQ0wgYW5kIEFDRQotCi0gICAgcHVibGljIEFjbCBjb252ZXJ0QWNlcyhMaXN0PEFjZT4gYWNlcykgewotICAgICAgICBpZiAoYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBib2YgPSBnZXRCaW5kaW5nc09iamVjdEZhY3RvcnkoKTsKLQotICAgICAgICBMaXN0PEFjZT4gYmluZGluZ0FjZXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oKTsKLSAgICAgICAgZm9yIChBY2UgYWNlIDogYWNlcykgewotICAgICAgICAgICAgYmluZGluZ0FjZXMuYWRkKGJvZi5jcmVhdGVBY2Nlc3NDb250cm9sRW50cnkoYWNlLmdldFByaW5jaXBhbElkKCksIGFjZS5nZXRQZXJtaXNzaW9ucygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYm9mLmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGJpbmRpbmdBY2VzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNlIGNyZWF0ZUFjZShTdHJpbmcgcHJpbmNpcGFsLCBMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMpIHsKLSAgICAgICAgQmluZGluZ3NPYmplY3RGYWN0b3J5IGJvZiA9IGdldEJpbmRpbmdzT2JqZWN0RmFjdG9yeSgpOwotCi0gICAgICAgIEFjZSBhY2UgPSBib2YuY3JlYXRlQWNjZXNzQ29udHJvbEVudHJ5KHByaW5jaXBhbCwgcGVybWlzc2lvbnMpOwotCi0gICAgICAgIHJldHVybiBhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBjcmVhdGVBY2woTGlzdDxBY2U+IGFjZXMpIHsKLSAgICAgICAgQmluZGluZ3NPYmplY3RGYWN0b3J5IGJvZiA9IGdldEJpbmRpbmdzT2JqZWN0RmFjdG9yeSgpOwotCi0gICAgICAgIEFjbCBhY2wgPSBib2YuY3JlYXRlQWNjZXNzQ29udHJvbExpc3QoYWNlcyk7Ci0KLSAgICAgICAgcmV0dXJuIGFjbDsKLSAgICB9Ci0KLSAgICAvLyBwb2xpY2llcwotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBjb252ZXJ0UG9saWNpZXMoTGlzdDxQb2xpY3k+IHBvbGljaWVzKSB7Ci0gICAgICAgIGlmIChwb2xpY2llcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBmb3IgKFBvbGljeSBwb2xpY3kgOiBwb2xpY2llcykgewotICAgICAgICAgICAgaWYgKChwb2xpY3kgIT0gbnVsbCkgJiYgKHBvbGljeS5nZXRJZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChwb2xpY3kuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIHJlbmRpdGlvbnMKLQotICAgIHB1YmxpYyBSZW5kaXRpb24gY29udmVydFJlbmRpdGlvbihTdHJpbmcgb2JqZWN0SWQsIFJlbmRpdGlvbkRhdGEgcmVuZGl0aW9uKSB7Ci0gICAgICAgIGlmIChyZW5kaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVuZGl0aW9uIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBsZW5ndGggPSAocmVuZGl0aW9uLmdldEJpZ0xlbmd0aCgpID09IG51bGwgPyAtMSA6IHJlbmRpdGlvbi5nZXRCaWdMZW5ndGgoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIGludCBoZWlnaHQgPSAocmVuZGl0aW9uLmdldEJpZ0hlaWdodCgpID09IG51bGwgPyAtMSA6IHJlbmRpdGlvbi5nZXRCaWdIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgaW50IHdpZHRoID0gKHJlbmRpdGlvbi5nZXRCaWdXaWR0aCgpID09IG51bGwgPyAtMSA6IHJlbmRpdGlvbi5nZXRCaWdXaWR0aCgpLmludFZhbHVlKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgUmVuZGl0aW9uSW1wbCh0aGlzLnNlc3Npb24sIG9iamVjdElkLCByZW5kaXRpb24uZ2V0U3RyZWFtSWQoKSwgcmVuZGl0aW9uLmdldFJlbmRpdGlvbkRvY3VtZW50SWQoKSwKLSAgICAgICAgICAgICAgICByZW5kaXRpb24uZ2V0S2luZCgpLCBsZW5ndGgsIHJlbmRpdGlvbi5nZXRNaW1lVHlwZSgpLCByZW5kaXRpb24uZ2V0VGl0bGUoKSwgaGVpZ2h0LCB3aWR0aCk7Ci0gICAgfQotCi0gICAgLy8gY29udGVudCBzdHJlYW0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGNyZWF0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nIGZpbGVuYW1lLCBsb25nIGxlbmd0aCwgU3RyaW5nIG1pbWV0eXBlLCBJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRlbnRTdHJlYW0oZmlsZW5hbWUsIGxlbmd0aCwgbWltZXR5cGUsIHN0cmVhbSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGNyZWF0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nIGZpbGVuYW1lLCBsb25nIGxlbmd0aCwgU3RyaW5nIG1pbWV0eXBlLCBJbnB1dFN0cmVhbSBzdHJlYW0sCi0gICAgICAgICAgICBib29sZWFuIHBhcnRpYWwpIHsKLSAgICAgICAgaWYgKHBhcnRpYWwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGFydGlhbENvbnRlbnRTdHJlYW1JbXBsKGZpbGVuYW1lLCAobGVuZ3RoIDwgMCA/IG51bGwgOiBCaWdJbnRlZ2VyLnZhbHVlT2YobGVuZ3RoKSksIG1pbWV0eXBlLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50U3RyZWFtSW1wbChmaWxlbmFtZSwgKGxlbmd0aCA8IDAgPyBudWxsIDogQmlnSW50ZWdlci52YWx1ZU9mKGxlbmd0aCkpLCBtaW1ldHlwZSwgc3RyZWFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGNvbnZlcnRDb250ZW50U3RyZWFtKENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSkgewotICAgICAgICBpZiAoY29udGVudFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEJpZ0ludGVnZXIgbGVuZ3RoID0gKGNvbnRlbnRTdHJlYW0uZ2V0TGVuZ3RoKCkgPCAwID8gbnVsbCA6IEJpZ0ludGVnZXIudmFsdWVPZihjb250ZW50U3RyZWFtLmdldExlbmd0aCgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGdldEJpbmRpbmdzT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUNvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpLCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpLCBjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICAvLyB0eXBlcwotCi0gICAgcHVibGljIE9iamVjdFR5cGUgY29udmVydFR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnRUeXBlSW1wbCh0aGlzLnNlc3Npb24sIChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBGb2xkZXJUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGb2xkZXJUeXBlSW1wbCh0aGlzLnNlc3Npb24sIChGb2xkZXJUeXBlRGVmaW5pdGlvbikgdHlwZURlZmluaXRpb24pOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVsYXRpb25zaGlwVHlwZUltcGwodGhpcy5zZXNzaW9uLCAoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFBvbGljeVR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBvbGljeVR5cGVJbXBsKHRoaXMuc2Vzc2lvbiwgKFBvbGljeVR5cGVEZWZpbml0aW9uKSB0eXBlRGVmaW5pdGlvbik7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBJdGVtVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSXRlbVR5cGVJbXBsKHRoaXMuc2Vzc2lvbiwgKEl0ZW1UeXBlRGVmaW5pdGlvbikgdHlwZURlZmluaXRpb24pOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgU2Vjb25kYXJ5VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2Vjb25kYXJ5VHlwZUltcGwodGhpcy5zZXNzaW9uLCAoU2Vjb25kYXJ5VHlwZURlZmluaXRpb24pIHR5cGVEZWZpbml0aW9uKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5vIGJhc2UgdHlwZSBzdXBwbGllZCEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBiYXNlIHR5cGUhIFJlY2VpdmVkICIgKyB0eXBlRGVmaW5pdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZSBnZXRUeXBlRnJvbU9iamVjdERhdGEoT2JqZWN0RGF0YSBvYmplY3REYXRhKSB7Ci0gICAgICAgIGlmICgob2JqZWN0RGF0YSA9PSBudWxsKSB8fCAob2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCAob2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiB0eXBlUHJvcGVydHkgPSBvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgaWYgKCEodHlwZVByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlJZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbigoU3RyaW5nKSB0eXBlUHJvcGVydHkuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBwcm9wZXJ0aWVzCi0KLSAgICBwdWJsaWMgPFQ+IFByb3BlcnR5PFQ+IGNyZWF0ZVByb3BlcnR5KFByb3BlcnR5RGVmaW5pdGlvbjxUPiB0eXBlLCBMaXN0PFQ+IHZhbHVlcykgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SW1wbDxUPih0eXBlLCB2YWx1ZXMpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCA8VD4gUHJvcGVydHk8VD4gY29udmVydFByb3BlcnR5KE9iamVjdFR5cGUgb2JqZWN0VHlwZSwgQ29sbGVjdGlvbjxTZWNvbmRhcnlUeXBlPiBzZWNvbmRhcnlUeXBlcywKLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTxUPiBwZCkgewotICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248VD4gZGVmaW5pdGlvbiA9IChQcm9wZXJ0eURlZmluaXRpb248VD4pIG9iamVjdFR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChwZC5nZXRJZCgpKTsKLQotICAgICAgICAvLyBzZWFyY2ggc2Vjb25kYXJ5IHR5cGVzCi0gICAgICAgIGlmIChkZWZpbml0aW9uID09IG51bGwgJiYgc2Vjb25kYXJ5VHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTZWNvbmRhcnlUeXBlIHNlY29uZGFyeVR5cGUgOiBzZWNvbmRhcnlUeXBlcykgewotICAgICAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUeXBlICE9IG51bGwgJiYgc2Vjb25kYXJ5VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uID0gKFByb3BlcnR5RGVmaW5pdGlvbjxUPikgc2Vjb25kYXJ5VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KHBkLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSB0eXBlIG1pZ2h0IGhhdmUgY2hhbmdlZCAtPiByZWxvYWQgdHlwZSBkZWZpbml0aW9ucwotICAgICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiByZWxvYWRlZE9iamVjdFR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKG9iamVjdFR5cGUuZ2V0SWQoKSwgZmFsc2UpOwotICAgICAgICAgICAgZGVmaW5pdGlvbiA9IChQcm9wZXJ0eURlZmluaXRpb248VD4pIHJlbG9hZGVkT2JqZWN0VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KHBkLmdldElkKCkpOwotCi0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsICYmIHNlY29uZGFyeVR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFNlY29uZGFyeVR5cGUgc2Vjb25kYXJ5VHlwZSA6IHNlY29uZGFyeVR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHJlbG9hZGVkU2Vjb25kYXJ5VHlwZSA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24oc2Vjb25kYXJ5VHlwZS5nZXRJZCgpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsb2FkZWRTZWNvbmRhcnlUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiA9IChQcm9wZXJ0eURlZmluaXRpb248VD4pIHJlbG9hZGVkU2Vjb25kYXJ5VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBwcm9wZXJ0eSB3aXRob3V0IGRlZmluaXRpb24KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwZC5nZXRJZCgpICsgIicgZG9lc24ndCBleGlzdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVQcm9wZXJ0eShkZWZpbml0aW9uLCBwZC5nZXRWYWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFByb3BlcnR5PD8+PiBjb252ZXJ0UHJvcGVydGllcyhPYmplY3RUeXBlIG9iamVjdFR5cGUsIENvbGxlY3Rpb248U2Vjb25kYXJ5VHlwZT4gc2Vjb25kYXJ5VHlwZXMsCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgLy8gY2hlY2sgaW5wdXQKLSAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IHR5cGUgbXVzdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqZWN0VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IHR5cGUgaGFzIG5vIHByb3BlcnR5IGRlZmludGlvbnMhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHByb3BlcnRpZXMgPT0gbnVsbCkgfHwgKHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHByb3BlcnRpZXMgYW5kIGNvbnZlcnQgdGhlbQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eTw/Pj4gcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eTw/Pj4oKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IGVudHJ5IDogcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgLy8gZmluZCBwcm9wZXJ0eSBkZWZpbml0aW9uCi0gICAgICAgICAgICBQcm9wZXJ0eTw/PiBhcGlQcm9wZXJ0eSA9IGNvbnZlcnRQcm9wZXJ0eShvYmplY3RUeXBlLCBzZWNvbmRhcnlUeXBlcywgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICByZXN1bHQucHV0KGVudHJ5LmdldEtleSgpLCBhcGlQcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLSAgICBwdWJsaWMgUHJvcGVydGllcyBjb252ZXJ0UHJvcGVydGllcyhNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBPYmplY3RUeXBlIHR5cGUsCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFNlY29uZGFyeVR5cGU+IHNlY29uZGFyeVR5cGVzLCBTZXQ8VXBkYXRhYmlsaXR5PiB1cGRhdGFiaWxpdHlGaWx0ZXIpIHsKLSAgICAgICAgLy8gY2hlY2sgaW5wdXQKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHR5cGUKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHR5cGVJZCA9IHByb3BlcnRpZXMuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLQotICAgICAgICAgICAgaWYgKHR5cGVJZCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIHR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKHR5cGVJZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUlkIGluc3RhbmNlb2YgTGlzdCAmJiAhKChMaXN0KSB0eXBlSWQpLmlzRW1wdHkoKSAmJiAoKExpc3QpIHR5cGVJZCkuZ2V0KDApIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24oKChMaXN0KSB0eXBlSWQpLmdldCgwKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBvciB0eXBlIHByb3BlcnR5IG11c3QgYmUgc2V0ISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHNlY29uZGFyeSB0eXBlcwotICAgICAgICBDb2xsZWN0aW9uPFNlY29uZGFyeVR5cGU+IGFsbFNlY29uZGFyeVR5cGVzID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHNlY29uZGFyeVR5cGVJZHMgPSBwcm9wZXJ0aWVzLmdldChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKTsKLSAgICAgICAgaWYgKHNlY29uZGFyeVR5cGVJZHMgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICBhbGxTZWNvbmRhcnlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U2Vjb25kYXJ5VHlwZT4oKTsKLQotICAgICAgICAgICAgZm9yIChPYmplY3Qgc2Vjb25kYXJ5VHlwZUlkIDogKExpc3Q8Pz4pIHNlY29uZGFyeVR5cGVJZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIShzZWNvbmRhcnlUeXBlSWQgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlY29uZGFyeSB0eXBlcyBwcm9wZXJ0eSBjb250YWlucyBhbiBpbnZhbGlkIGVudHJ5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWNvbmRhcnlUeXBlSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgc2Vjb25kYXJ5VHlwZSA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24oc2Vjb25kYXJ5VHlwZUlkLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmICghKHNlY29uZGFyeVR5cGUgaW5zdGFuY2VvZiBTZWNvbmRhcnlUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWNvbmRhcnkgdHlwZXMgcHJvcGVydHkgY29udGFpbnMgYSB0eXBlIHRoYXQgaXMgbm90IGEgc2Vjb25kYXJ5IHR5cGU6ICIgKyBzZWNvbmRhcnlUeXBlSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFsbFNlY29uZGFyeVR5cGVzLmFkZCgoU2Vjb25kYXJ5VHlwZSkgc2Vjb25kYXJ5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2Vjb25kYXJ5VHlwZXMgIT0gbnVsbCAmJiBhbGxTZWNvbmRhcnlUeXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbGxTZWNvbmRhcnlUeXBlcyA9IHNlY29uZGFyeVR5cGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc29tZSBwcmVwYXJhdGlvbgotICAgICAgICBCaW5kaW5nc09iamVjdEZhY3RvcnkgYm9mID0gZ2V0QmluZGluZ3NPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLQotICAgICAgICAvLyB0aGUgYmlnIGxvb3AKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCA/PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaWYgKChwcm9wZXJ0eSA9PSBudWxsKSB8fCAocHJvcGVydHkuZ2V0S2V5KCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGlkID0gcHJvcGVydHkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9wZXJ0eTw/PikgewotICAgICAgICAgICAgICAgIFByb3BlcnR5PD8+IHAgPSAoUHJvcGVydHk8Pz4pIHZhbHVlOwotICAgICAgICAgICAgICAgIGlmICghaWQuZXF1YWxzKHAuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgaWQgbWlzbWF0Y2g6ICciICsgaWQgKyAiJyAhPSAnIiArIHAuZ2V0SWQoKSArICInISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWx1ZSA9IChwLmdldERlZmluaXRpb24oKS5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5LlNJTkdMRSA/IHAuZ2V0Rmlyc3RWYWx1ZSgpIDogcC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IGRlZmluaXRpb24gPSB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoaWQpOwotCi0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsICYmIGFsbFNlY29uZGFyeVR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFNlY29uZGFyeVR5cGUgc2Vjb25kYXJ5VHlwZSA6IGFsbFNlY29uZGFyeVR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUeXBlICE9IG51bGwgJiYgc2Vjb25kYXJ5VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiA9IChQcm9wZXJ0eURlZmluaXRpb248Pz4pIHNlY29uZGFyeVR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIGlkCi0gICAgICAgICAgICAgICAgICAgICAgICArICInIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB0eXBlIG9yIG9uZSBvZiB0aGUgc2Vjb25kYXJ5IHR5cGVzISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayB1cGRhdGFiaWxpdHkKLSAgICAgICAgICAgIGlmICh1cGRhdGFiaWxpdHlGaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghdXBkYXRhYmlsaXR5RmlsdGVyLmNvbnRhaW5zKGRlZmluaXRpb24uZ2V0VXBkYXRhYmlsaXR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2luZ2xlIGFuZCBtdWx0aSB2YWx1ZSBjaGVjawotICAgICAgICAgICAgTGlzdDw/PiB2YWx1ZXM7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdDw/PikgewotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldENhcmRpbmFsaXR5KCkgIT0gQ2FyZGluYWxpdHkuTVVMVEkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBpZCArICInIGlzIG5vdCBhIG11bHRpIHZhbHVlIHByb3BlcnR5ISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWx1ZXMgPSAoTGlzdDw/PikgdmFsdWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgbGlzdCBpcyBob21vZ2VuZW91cyBhbmQgZG9lcyBub3QgY29udGFpbiBudWxsCi0gICAgICAgICAgICAgICAgLy8gdmFsdWVzCi0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdmFsdWVDbGF6eiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIGlkICsgIicgY29udGFpbnMgbnVsbCB2YWx1ZXMhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlQ2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDbGF6eiA9IG8uZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVDbGF6ei5pc0luc3RhbmNlKG8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBpZCArICInIGlzIGluaG9tb2dlbmVvdXMhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldENhcmRpbmFsaXR5KCkgIT0gQ2FyZGluYWxpdHkuU0lOR0xFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgaWQgKyAiJyBpcyBub3QgYSBzaW5nbGUgdmFsdWUgcHJvcGVydHkhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbHVlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhc3NlbWJsZSBwcm9wZXJ0eQotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5RGF0YSA9IG51bGw7Ci0gICAgICAgICAgICBPYmplY3QgZmlyc3RWYWx1ZSA9IChpc051bGxPckVtcHR5KHZhbHVlcykgPyBudWxsIDogdmFsdWVzLmdldCgwKSk7Ci0KLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBib2YuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKGlkLCAoTGlzdDxTdHJpbmc+KSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShpZCwgKExpc3Q8U3RyaW5nPikgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvd1dyb25nVHlwZUVycm9yKGZpcnN0VmFsdWUsICJzdHJpbmciLCBTdHJpbmcuY2xhc3MsIGlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUlkRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5SWREYXRhKGlkLCAoTGlzdDxTdHJpbmc+KSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5SWREYXRhKGlkLCAoTGlzdDxTdHJpbmc+KSB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93V3JvbmdUeXBlRXJyb3IoZmlyc3RWYWx1ZSwgInN0cmluZyIsIFN0cmluZy5jbGFzcywgaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5SHRtbERlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGJvZi5jcmVhdGVQcm9wZXJ0eUh0bWxEYXRhKGlkLCAoTGlzdDxTdHJpbmc+KSB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBib2YuY3JlYXRlUHJvcGVydHlIdG1sRGF0YShpZCwgKExpc3Q8U3RyaW5nPikgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvd1dyb25nVHlwZUVycm9yKGZpcnN0VmFsdWUsICJodG1sIiwgU3RyaW5nLmNsYXNzLCBpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlVcmlEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBib2YuY3JlYXRlUHJvcGVydHlVcmlEYXRhKGlkLCAoTGlzdDxTdHJpbmc+KSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5VXJpRGF0YShpZCwgKExpc3Q8U3RyaW5nPikgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvd1dyb25nVHlwZUVycm9yKGZpcnN0VmFsdWUsICJ1cmkiLCBTdHJpbmcuY2xhc3MsIGlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBib2YuY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YShpZCwgKExpc3Q8QmlnSW50ZWdlcj4pIG51bGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoaWQsIChMaXN0PEJpZ0ludGVnZXI+KSB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB8fCAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIFNob3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB8fCAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIExvbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFjY2VwdCBhbGwga2luZHMgb2YgaW50ZWdlcnMKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxCaWdJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxCaWdJbnRlZ2VyPih2YWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdiA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQmlnSW50ZWdlci52YWx1ZU9mKCgoTnVtYmVyKSB2KS5sb25nVmFsdWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoaWQsIGxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93V3JvbmdUeXBlRXJyb3IoZmlyc3RWYWx1ZSwgImludGVnZXIiLCBCaWdJbnRlZ2VyLmNsYXNzLCBpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEoaWQsIChMaXN0PEJvb2xlYW4+KSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGJvZi5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKGlkLCAoTGlzdDxCb29sZWFuPikgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvd1dyb25nVHlwZUVycm9yKGZpcnN0VmFsdWUsICJib29sZWFuIiwgQm9vbGVhbi5jbGFzcywgaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGJvZi5jcmVhdGVQcm9wZXJ0eURlY2ltYWxEYXRhKGlkLCAoTGlzdDxCaWdEZWNpbWFsPikgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdFZhbHVlIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBib2YuY3JlYXRlUHJvcGVydHlEZWNpbWFsRGF0YShpZCwgKExpc3Q8QmlnRGVjaW1hbD4pIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB8fCAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChmaXJzdFZhbHVlIGluc3RhbmNlb2YgQnl0ZSkgfHwgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChmaXJzdFZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgfHwgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBMb25nKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhY2NlcHQgYWxsIGtpbmRzIG9mIGludGVnZXJzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFzIHdlbGwgYXMgZmxvYXRzIGFuZCBkb3VibGVzCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8QmlnRGVjaW1hbD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QmlnRGVjaW1hbD4odmFsdWVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHYgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBCaWdEZWNpbWFsKHYudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gYm9mLmNyZWF0ZVByb3BlcnR5RGVjaW1hbERhdGEoaWQsIGxpc3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93V3JvbmdUeXBlRXJyb3IoZmlyc3RWYWx1ZSwgImRlY2ltYWwiLCBCaWdEZWNpbWFsLmNsYXNzLCBpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGJvZi5jcmVhdGVQcm9wZXJ0eURhdGVUaW1lRGF0YShpZCwgKExpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+KSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBib2YuY3JlYXRlUHJvcGVydHlEYXRlVGltZURhdGEoaWQsIChMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPikgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPih2YWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZCA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWwuc2V0VGltZSgoRGF0ZSkgZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChjYWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGJvZi5jcmVhdGVQcm9wZXJ0eURhdGVUaW1lRGF0YShpZCwgbGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dXcm9uZ1R5cGVFcnJvcihmaXJzdFZhbHVlLCAiZGF0ZXRpbWUiLCBHcmVnb3JpYW5DYWxlbmRhci5jbGFzcywgaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZG8gd2UgaGF2ZSBzb21ldGhpbmc/Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIGlkICsgIicgZG9lc24ndCBtYXRjaCB0aGUgcHJvcGVydHkgZGVmaW50aW9uISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKHByb3BlcnR5RGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYm9mLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnR5TGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBjb252ZXJ0UXVlcnlQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICAvLyBjaGVjayBpbnB1dAotICAgICAgICBpZiAoKHByb3BlcnRpZXMgPT0gbnVsbCkgfHwgKHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4ocHJvcGVydGllcy5nZXRQcm9wZXJ0eUxpc3QoKSk7Ci0gICAgfQotCi0gICAgLy8gb2JqZWN0cwotCi0gICAgcHVibGljIENtaXNPYmplY3QgY29udmVydE9iamVjdChPYmplY3REYXRhIG9iamVjdERhdGEsIE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAob2JqZWN0RGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgZGF0YSBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iamVjdERhdGEuZ2V0QmFzZVR5cGVJZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhc2UgdHlwZSBJRCBwcm9wZXJ0eSBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0VHlwZSB0eXBlID0gZ2V0VHlwZUZyb21PYmplY3REYXRhKG9iamVjdERhdGEpOwotCi0gICAgICAgIC8qIGRldGVybWluZSB0eXBlICovCi0gICAgICAgIHN3aXRjaCAob2JqZWN0RGF0YS5nZXRCYXNlVHlwZUlkKCkpIHsKLSAgICAgICAgY2FzZSBDTUlTX0RPQ1VNRU5UOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudEltcGwoKFNlc3Npb25JbXBsKSB0aGlzLnNlc3Npb24sIHR5cGUsIG9iamVjdERhdGEsIGNvbnRleHQpOwotICAgICAgICBjYXNlIENNSVNfRk9MREVSOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBGb2xkZXJJbXBsKChTZXNzaW9uSW1wbCkgdGhpcy5zZXNzaW9uLCB0eXBlLCBvYmplY3REYXRhLCBjb250ZXh0KTsKLSAgICAgICAgY2FzZSBDTUlTX1BPTElDWToKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9saWN5SW1wbCgoU2Vzc2lvbkltcGwpIHRoaXMuc2Vzc2lvbiwgdHlwZSwgb2JqZWN0RGF0YSwgY29udGV4dCk7Ci0gICAgICAgIGNhc2UgQ01JU19SRUxBVElPTlNISVA6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlbGF0aW9uc2hpcEltcGwoKFNlc3Npb25JbXBsKSB0aGlzLnNlc3Npb24sIHR5cGUsIG9iamVjdERhdGEsIGNvbnRleHQpOwotICAgICAgICBjYXNlIENNSVNfSVRFTToKLSAgICAgICAgICAgIHJldHVybiBuZXcgSXRlbUltcGwoKFNlc3Npb25JbXBsKSB0aGlzLnNlc3Npb24sIHR5cGUsIG9iamVjdERhdGEsIGNvbnRleHQpOwotICAgICAgICBjYXNlIENNSVNfU0VDT05EQVJZOgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJTZWNvbmRhcnkgdHlwZSBpcyB1c2VkIGFzIG9iamVjdCB0eXBlOiAiICsgb2JqZWN0RGF0YS5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBiYXNlIHR5cGU6ICIgKyBvYmplY3REYXRhLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUXVlcnlSZXN1bHQgY29udmVydFF1ZXJ5UmVzdWx0KE9iamVjdERhdGEgb2JqZWN0RGF0YSkgewotICAgICAgICBpZiAob2JqZWN0RGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgZGF0YSBpcyBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBRdWVyeVJlc3VsdEltcGwoc2Vzc2lvbiwgb2JqZWN0RGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIENoYW5nZUV2ZW50IGNvbnZlcnRDaGFuZ2VFdmVudChPYmplY3REYXRhIG9iamVjdERhdGEpIHsKLSAgICAgICAgQ2hhbmdlVHlwZSBjaGFuZ2VUeXBlID0gbnVsbDsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2hhbmdlVGltZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IG51bGw7Ci0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Pz4+IHByb3BlcnRpZXMgPSBudWxsOwotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWN5SWRzID0gbnVsbDsKLSAgICAgICAgQWNsIGFjbCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG9iamVjdERhdGEuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hhbmdlVHlwZSA9IG9iamVjdERhdGEuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkuZ2V0Q2hhbmdlVHlwZSgpOwotICAgICAgICAgICAgY2hhbmdlVGltZSA9IG9iamVjdERhdGEuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkuZ2V0Q2hhbmdlVGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSAmJiAob2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHlMaXN0KCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Pz4+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5IDogb2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHlMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eS5nZXRJZCgpLCBwcm9wZXJ0eS5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLk9CSkVDVF9JRCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PD8+IG9iamVjdElkTGlzdCA9IHByb3BlcnRpZXMuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkob2JqZWN0SWRMaXN0KSkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RJZCA9IG9iamVjdElkTGlzdC5nZXQoMCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgob2JqZWN0RGF0YS5nZXRQb2xpY3lJZHMoKSAhPSBudWxsKSAmJiAob2JqZWN0RGF0YS5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHBvbGljeUlkcyA9IG9iamVjdERhdGEuZ2V0UG9saWN5SWRzKCkuZ2V0UG9saWN5SWRzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3REYXRhLmdldEFjbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY2wgPSBvYmplY3REYXRhLmdldEFjbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDaGFuZ2VFdmVudEltcGwoY2hhbmdlVHlwZSwgY2hhbmdlVGltZSwgb2JqZWN0SWQsIHByb3BlcnRpZXMsIHBvbGljeUlkcywgYWNsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2hhbmdlRXZlbnRzIGNvbnZlcnRDaGFuZ2VFdmVudHMoU3RyaW5nIGNoYW5nZUxvZ1Rva2VuLCBPYmplY3RMaXN0IG9iamVjdExpc3QpIHsKLSAgICAgICAgaWYgKG9iamVjdExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENoYW5nZUV2ZW50PiBldmVudHMgPSBuZXcgQXJyYXlMaXN0PENoYW5nZUV2ZW50PigpOwotICAgICAgICBpZiAob2JqZWN0TGlzdC5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdERhdGEgOiBvYmplY3RMaXN0LmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChvYmplY3REYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZXZlbnRzLmFkZChjb252ZXJ0Q2hhbmdlRXZlbnQob2JqZWN0RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBoYXNNb3JlSXRlbXMgPSAob2JqZWN0TGlzdC5oYXNNb3JlSXRlbXMoKSA9PSBudWxsID8gZmFsc2UgOiBvYmplY3RMaXN0Lmhhc01vcmVJdGVtcygpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgbG9uZyB0b3RhbE51bUl0ZW1zID0gKG9iamVjdExpc3QuZ2V0TnVtSXRlbXMoKSA9PSBudWxsID8gLTEgOiBvYmplY3RMaXN0LmdldE51bUl0ZW1zKCkubG9uZ1ZhbHVlKCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgQ2hhbmdlRXZlbnRzSW1wbChjaGFuZ2VMb2dUb2tlbiwgZXZlbnRzLCBoYXNNb3JlSXRlbXMsIHRvdGFsTnVtSXRlbXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd1dyb25nVHlwZUVycm9yKE9iamVjdCBvYmosIFN0cmluZyB0eXBlLCBDbGFzczw/PiBjbGF6eiwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFR5cGVzOwotICAgICAgICBpZiAoQmlnSW50ZWdlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotICAgICAgICAgICAgZXhwZWN0ZWRUeXBlcyA9ICI8QmlnSW50ZWdlciwgQnl0ZSwgU2hvcnQsIEludGVnZXIsIExvbmc+IjsKLSAgICAgICAgfSBlbHNlIGlmIChCaWdEZWNpbWFsLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7Ci0gICAgICAgICAgICBleHBlY3RlZFR5cGVzID0gIjxCaWdEZWNpbWFsLCBEb3VibGUsIEZsb2F0LCBCeXRlLCBTaG9ydCwgSW50ZWdlciwgTG9uZz4iOwotICAgICAgICB9IGVsc2UgaWYgKEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7Ci0gICAgICAgICAgICBleHBlY3RlZFR5cGVzID0gIjxqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIsIGphdmEudXRpbC5EYXRlPiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHBlY3RlZFR5cGVzID0gY2xhenouZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiUHJvcGVydHkgJyIgKyBpZCArICInIGlzIGEgIiArIHR5cGUgKyAiIHByb3BlcnR5LiBFeHBlY3RlZCB0eXBlICciICsgZXhwZWN0ZWRUeXBlcwotICAgICAgICAgICAgICAgICsgIicgYnV0IHJlY2VpdmVkIGEgJyIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJyBwcm9wZXJ0eS4iOwotCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9yZXBvc2l0b3J5L1JlcG9zaXRvcnlJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmOTI2Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5jYWNoZS5UeXBlRGVmaW5pdGlvbkNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLlNlc3Npb25GYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5jYWNoZS5DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZXBvc2l0b3J5SW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlJbXBsIGV4dGVuZHMgUmVwb3NpdG9yeUluZm9JbXBsIGltcGxlbWVudHMgUmVwb3NpdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkZhY3RvcnlJbXBsIHNlc3Npb25GYWN0b3J5OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0RmFjdG9yeSBvYmplY3RGYWN0b3J5OwotICAgIHByaXZhdGUgZmluYWwgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyOwotICAgIHByaXZhdGUgZmluYWwgQ2FjaGUgY2FjaGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlRGVmaW5pdGlvbkNhY2hlIHR5cGVEZWZDYWNoZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW1wbChSZXBvc2l0b3J5SW5mbyBkYXRhLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIFNlc3Npb25GYWN0b3J5SW1wbCBzZXNzaW9uRmFjdG9yeSwKLSAgICAgICAgICAgIE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSwgQXV0aGVudGljYXRpb25Qcm92aWRlciBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBDYWNoZSBjYWNoZSwKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlKSB7Ci0gICAgICAgIHN1cGVyKGRhdGEpOwotCi0gICAgICAgIGFzc2VydCBzZXNzaW9uRmFjdG9yeSAhPSBudWxsOwotCi0gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPihwYXJhbWV0ZXJzKTsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQsIGdldElkKCkpOwotCi0gICAgICAgIHRoaXMuc2Vzc2lvbkZhY3RvcnkgPSBzZXNzaW9uRmFjdG9yeTsKLSAgICAgICAgdGhpcy5vYmplY3RGYWN0b3J5ID0gb2JqZWN0RmFjdG9yeTsKLSAgICAgICAgdGhpcy5hdXRoZW50aWNhdGlvblByb3ZpZGVyID0gYXV0aGVudGljYXRpb25Qcm92aWRlcjsKLSAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlOwotICAgICAgICB0aGlzLnR5cGVEZWZDYWNoZSA9IHR5cGVEZWZDYWNoZTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBTZXNzaW9uPiBUIGNyZWF0ZVNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiAoVCkgc2Vzc2lvbkZhY3RvcnkuY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXJzLCBvYmplY3RGYWN0b3J5LCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBjYWNoZSwgdHlwZURlZkNhY2hlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQWJzdHJhY3RJdGVyYWJsZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0Fic3RyYWN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmNzMyMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQWJzdHJhY3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci0KLS8qKgotICogQWJzdHJhY3QgPGNvZGU+SXRlbUl0ZXJhYmxlPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEl0ZXJhYmxlPFQ+IGltcGxlbWVudHMgSXRlbUl0ZXJhYmxlPFQ+IHsKLQotICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RQYWdlRmV0Y2hlcjxUPiBwYWdlRmV0Y2hlcjsKLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgc2tpcENvdW50OwotICAgIHByaXZhdGUgQWJzdHJhY3RJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEl0ZXJhYmxlKEFic3RyYWN0UGFnZUZldGNoZXI8VD4gcGFnZUZldGNoZXIpIHsKLSAgICAgICAgdGhpcygwLCBwYWdlRmV0Y2hlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0SXRlcmFibGUobG9uZyBwb3NpdGlvbiwgQWJzdHJhY3RQYWdlRmV0Y2hlcjxUPiBwYWdlRmV0Y2hlcikgewotICAgICAgICB0aGlzLnBhZ2VGZXRjaGVyID0gcGFnZUZldGNoZXI7Ci0gICAgICAgIHRoaXMuc2tpcENvdW50ID0gcG9zaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2tpcCBjb3VudAotICAgICAqCi0gICAgICogQHJldHVybiAgc2tpcCBjb3VudAotICAgICAqLwotICAgIHByb3RlY3RlZCBsb25nIGdldFNraXBDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHNraXBDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYWdlIGZldGNoZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gIHBhZ2UgZmV0Y2hlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBBYnN0cmFjdFBhZ2VGZXRjaGVyPFQ+IGdldFBhZ2VGZXRjaGVyKCkgewotICAgICAgICByZXR1cm4gcGFnZUZldGNoZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IHRoZSBpdGVyYXRvcgotICAgICAqCi0gICAgICogQHJldHVybiAgaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RJdGVyYXRvcjxUPiBjcmVhdGVJdGVyYXRvcigpOwotCi0gICAgcHVibGljIEFic3RyYWN0SXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8VD4gc2tpcFRvKGxvbmcgcG9zaXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uSXRlcmFibGU8VD4ocG9zaXRpb24sIHBhZ2VGZXRjaGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPFQ+IGdldFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvblBhZ2VJdGVyYWJsZTxUPihza2lwQ291bnQsIHBhZ2VGZXRjaGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPFQ+IGdldFBhZ2UoaW50IG1heE51bUl0ZW1zKSB7Ci0gICAgICAgIHRoaXMucGFnZUZldGNoZXIuc2V0TWF4TnVtSXRlbXMobWF4TnVtSXRlbXMpOwotICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25QYWdlSXRlcmFibGU8VD4oc2tpcENvdW50LCBwYWdlRmV0Y2hlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UGFnZU51bUl0ZW1zKCkgewotICAgICAgICByZXR1cm4gZ2V0SXRlcmF0b3IoKS5nZXRQYWdlTnVtSXRlbXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRIYXNNb3JlSXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJdGVyYXRvcigpLmdldEhhc01vcmVJdGVtcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRvdGFsTnVtSXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRJdGVyYXRvcigpLmdldFRvdGFsTnVtSXRlbXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFic3RyYWN0SXRlcmF0b3I8VD4gZ2V0SXRlcmF0b3IoKSB7Ci0gICAgICAgIGlmICh0aGlzLml0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBjcmVhdGVJdGVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdG9yOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0Fic3RyYWN0SXRlcmF0b3IuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9BYnN0cmFjdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzUyMjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0Fic3RyYWN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWwuQWJzdHJhY3RQYWdlRmV0Y2hlci5QYWdlOwotCi0vKioKLSAqIEFic3RyYWN0IDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKLQotICAgIHByaXZhdGUgbG9uZyBza2lwQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgc2tpcE9mZnNldDsKLSAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0UGFnZUZldGNoZXI8VD4gcGFnZUZldGNoZXI7Ci0KLSAgICBwcml2YXRlIFBhZ2U8VD4gcGFnZTsKLSAgICBwcml2YXRlIExvbmcgdG90YWxOdW1JdGVtczsKLSAgICBwcml2YXRlIEJvb2xlYW4gaGFzTW9yZUl0ZW1zOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogQHBhcmFtIHBhZ2VGZXRjaGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0SXRlcmF0b3IobG9uZyBza2lwQ291bnQsIEFic3RyYWN0UGFnZUZldGNoZXI8VD4gcGFnZUZldGNoZXIpIHsKLSAgICAgICAgdGhpcy5za2lwQ291bnQgPSBza2lwQ291bnQ7Ci0gICAgICAgIHRoaXMucGFnZUZldGNoZXIgPSBwYWdlRmV0Y2hlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNraXBDb3VudCArIHNraXBPZmZzZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UGFnZU51bUl0ZW1zKCkgewotICAgICAgICBQYWdlPFQ+IGN1cnJlbnRQYWdlID0gZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8VD4gaXRlbXMgPSBjdXJyZW50UGFnZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMuc2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbE51bUl0ZW1zKCkgewotICAgICAgICBpZiAodG90YWxOdW1JdGVtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0b3RhbE51bUl0ZW1zID0gTG9uZy52YWx1ZU9mKC0xKTsKLSAgICAgICAgICAgIFBhZ2U8VD4gY3VycmVudFBhZ2UgPSBnZXRDdXJyZW50UGFnZSgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgbnVtYmVyIG9mIGl0ZW1zCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlLmdldFRvdGFsTnVtSXRlbXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsTnVtSXRlbXMgPSBjdXJyZW50UGFnZS5nZXRUb3RhbE51bUl0ZW1zKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b3RhbE51bUl0ZW1zLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEhhc01vcmVJdGVtcygpIHsKLSAgICAgICAgaWYgKGhhc01vcmVJdGVtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYXNNb3JlSXRlbXMgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgUGFnZTxUPiBjdXJyZW50UGFnZSA9IGdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZS5nZXRIYXNNb3JlSXRlbXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc01vcmVJdGVtcyA9IGN1cnJlbnRQYWdlLmdldEhhc01vcmVJdGVtcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzTW9yZUl0ZW1zLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBjdXJyZW50IHNraXAgY291bnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gc2tpcCBjb3VudAotICAgICAqLwotICAgIHByb3RlY3RlZCBsb25nIGdldFNraXBDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHNraXBDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGN1cnJlbnQgc2tpcCBvZmZzZXQgKGZyb20gc2tpcCBjb3VudCkKLSAgICAgKgotICAgICAqIEByZXR1cm4gc2tpcCBvZmZzZXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGdldFNraXBPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBza2lwT2Zmc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudCB0aGUgc2tpcCBvZmZzZXQgYnkgb25lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGluY3JlbWVudGVkIHNraXAgb2Zmc2V0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBpbmNyZW1lbnRTa2lwT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gc2tpcE9mZnNldCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcGFnZSBvZiBpdGVtcyB3aXRoaW4gY29sbGVjdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBjdXJyZW50IHBhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUGFnZTxUPiBnZXRDdXJyZW50UGFnZSgpIHsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFnZSA9IHBhZ2VGZXRjaGVyLmZldGNoUGFnZShza2lwQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNraXAgdG8gdGhlIG5leHQgcGFnZSBvZiBpdGVtcyB3aXRoaW4gY29sbGVjdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBuZXh0IHBhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUGFnZTxUPiBpbmNyZW1lbnRQYWdlKCkgewotICAgICAgICBza2lwQ291bnQgKz0gc2tpcE9mZnNldDsKLSAgICAgICAgc2tpcE9mZnNldCA9IDA7Ci0gICAgICAgIHRvdGFsTnVtSXRlbXMgPSBudWxsOwotICAgICAgICBoYXNNb3JlSXRlbXMgPSBudWxsOwotICAgICAgICBwYWdlID0gcGFnZUZldGNoZXIuZmV0Y2hQYWdlKHNraXBDb3VudCk7Ci0gICAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0Fic3RyYWN0UGFnZUZldGNoZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9BYnN0cmFjdFBhZ2VGZXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjA3MGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0Fic3RyYWN0UGFnZUZldGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS51dGlsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQWJzdHJhY3QgcGFnZSBmZXRjaGVyLgotICoKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgaXRlbXMgZmV0Y2hlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYWdlRmV0Y2hlcjxUPiB7Ci0KLSAgICBwcm90ZWN0ZWQgbG9uZyBtYXhOdW1JdGVtczsKLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFBhZ2VGZXRjaGVyKGxvbmcgbWF4TnVtSXRlbXMpIHsKLSAgICAgICAgdGhpcy5tYXhOdW1JdGVtcyA9IG1heE51bUl0ZW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZldGNoZXMgdGhlIGdpdmVuIHBhZ2UgZnJvbSB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHNraXBDb3VudCBpbml0aWFsIG9mZnNldCB3aGVyZSB0byBzdGFydCBmZXRjaGluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQYWdlPFQ+IGZldGNoUGFnZShsb25nIHNraXBDb3VudCk7Ci0KLSAgICAvKioKLSAgICAgKiBBIGZldGNoZWQgcGFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgaXRlbXMgZmV0Y2hlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFnZTxUPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUPiBpdGVtczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb25nIHRvdGFsTnVtSXRlbXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiBoYXNNb3JlSXRlbXM7Ci0KLSAgICAgICAgcHVibGljIFBhZ2UoTGlzdDxUPiBpdGVtcywgQmlnSW50ZWdlciB0b3RhbE51bUl0ZW1zLCBCb29sZWFuIGhhc01vcmVJdGVtcykgewotICAgICAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zOwotICAgICAgICAgICAgdGhpcy50b3RhbE51bUl0ZW1zID0gdG90YWxOdW1JdGVtcyA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IExvbmcudmFsdWVPZih0b3RhbE51bUl0ZW1zLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIHRoaXMuaGFzTW9yZUl0ZW1zID0gaGFzTW9yZUl0ZW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBhZ2UoTGlzdDxUPiBpdGVtcywgbG9uZyB0b3RhbE51bUl0ZW1zLCBib29sZWFuIGhhc01vcmVJdGVtcykgewotICAgICAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zOwotICAgICAgICAgICAgdGhpcy50b3RhbE51bUl0ZW1zID0gTG9uZy52YWx1ZU9mKHRvdGFsTnVtSXRlbXMpOwotICAgICAgICAgICAgdGhpcy5oYXNNb3JlSXRlbXMgPSBCb29sZWFuLnZhbHVlT2YoaGFzTW9yZUl0ZW1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PFQ+IGdldEl0ZW1zKCkgewotICAgICAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExvbmcgZ2V0VG90YWxOdW1JdGVtcygpIHsKLSAgICAgICAgICAgIHJldHVybiB0b3RhbE51bUl0ZW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJvb2xlYW4gZ2V0SGFzTW9yZUl0ZW1zKCkgewotICAgICAgICAgICAgcmV0dXJuIGhhc01vcmVJdGVtczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1heE51bUl0ZW1zKGludCBtYXhOdW1JdGVtcykgewotICAgICAgICB0aGlzLm1heE51bUl0ZW1zID0gbWF4TnVtSXRlbXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQ29sbGVjdGlvbkl0ZXJhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQ29sbGVjdGlvbkl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OGE3YjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0NvbGxlY3Rpb25JdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWw7Ci0KLQotLyoqCi0gKiBDTUlTIENvbGxlY3Rpb24gSXRlcmFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uSXRlcmFibGU8VD4gZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhYmxlPFQ+IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhZ2VGZXRjaGVyCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb25JdGVyYWJsZShBYnN0cmFjdFBhZ2VGZXRjaGVyPFQ+IHBhZ2VGZXRjaGVyKSB7Ci0gICAgICAgIHRoaXMoMCwgcGFnZUZldGNoZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIHBhZ2VGZXRjaGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb25JdGVyYWJsZShsb25nIHBvc2l0aW9uLCBBYnN0cmFjdFBhZ2VGZXRjaGVyPFQ+IHBhZ2VGZXRjaGVyKSB7Ci0gICAgICAgIHN1cGVyKHBvc2l0aW9uLCBwYWdlRmV0Y2hlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0SXRlcmF0b3I8VD4gY3JlYXRlSXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkl0ZXJhdG9yPFQ+KGdldFNraXBDb3VudCgpLCBnZXRQYWdlRmV0Y2hlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQ29sbGVjdGlvbkl0ZXJhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQ29sbGVjdGlvbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjI5MjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0NvbGxlY3Rpb25JdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWwuQWJzdHJhY3RQYWdlRmV0Y2hlci5QYWdlOwotCi0vKioKLSAqIEl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMgaW4gYSBDTUlTIENvbGxlY3Rpb24uCi0gKgotICogQHBhcmFtIDxUPgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkl0ZXJhdG9yPFQ+IGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxUPiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBza2lwQ291bnQKLSAgICAgKiBAcGFyYW0gcGFnZUZldGNoZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbkl0ZXJhdG9yKGxvbmcgc2tpcENvdW50LCBBYnN0cmFjdFBhZ2VGZXRjaGVyPFQ+IHBhZ2VGZXRjaGVyKSB7Ci0gICAgICAgIHN1cGVyKHNraXBDb3VudCwgcGFnZUZldGNoZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IjaGFzTmV4dCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgUGFnZTxUPiBwYWdlID0gZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxUPiBpdGVtcyA9IHBhZ2UuZ2V0SXRlbXMoKTsKLSAgICAgICAgaWYgKGl0ZW1zICE9IG51bGwgJiYgZ2V0U2tpcE9mZnNldCgpIDwgaXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZ2V0SGFzTW9yZUl0ZW1zKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgdG90YWxJdGVtcyA9IGdldFRvdGFsTnVtSXRlbXMoKTsKLSAgICAgICAgaWYgKHRvdGFsSXRlbXMgPCAwKSB7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGJldHRlcgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKGdldFNraXBDb3VudCgpICsgZ2V0U2tpcE9mZnNldCgpKSA8IHRvdGFsSXRlbXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIGphdmEudXRpbC5JdGVyYXRvciNuZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBuZXh0KCkgewotICAgICAgICBQYWdlPFQ+IHBhZ2UgPSBnZXRDdXJyZW50UGFnZSgpOwotICAgICAgICBpZiAocGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8VD4gaXRlbXMgPSBwYWdlLmdldEl0ZW1zKCk7Ci0gICAgICAgIGlmIChpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0U2tpcE9mZnNldCgpID09IGl0ZW1zLnNpemUoKSkgewotICAgICAgICAgICAgcGFnZSA9IGluY3JlbWVudFBhZ2UoKTsKLSAgICAgICAgICAgIGl0ZW1zID0gcGFnZSA9PSBudWxsID8gbnVsbCA6IHBhZ2UuZ2V0SXRlbXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmlzRW1wdHkoKSB8fCBnZXRTa2lwT2Zmc2V0KCkgPT0gaXRlbXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpdGVtcy5nZXQoaW5jcmVtZW50U2tpcE9mZnNldCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9Db2xsZWN0aW9uUGFnZUl0ZXJhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQ29sbGVjdGlvblBhZ2VJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTdjZWJjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9Db2xsZWN0aW9uUGFnZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudXRpbDsKLQotCi0vKioKLSAqIEl0ZXJhYmxlIGZvciBhIENNSVMgQ29sbGVjdGlvbiBQYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvblBhZ2VJdGVyYWJsZTxUPiBleHRlbmRzIEFic3RyYWN0SXRlcmFibGU8VD4gewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFnZUZldGNoZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvblBhZ2VJdGVyYWJsZShBYnN0cmFjdFBhZ2VGZXRjaGVyPFQ+IHBhZ2VGZXRjaGVyKSB7Ci0gICAgICAgIHRoaXMoMCwgcGFnZUZldGNoZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHBvc2l0aW9uCi0gICAgICogQHBhcmFtIHBhZ2VGZXRjaGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb25QYWdlSXRlcmFibGUobG9uZyBwb3NpdGlvbiwgQWJzdHJhY3RQYWdlRmV0Y2hlcjxUPiBwYWdlRmV0Y2hlcikgewotICAgICAgICBzdXBlcihwb3NpdGlvbiwgcGFnZUZldGNoZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBYnN0cmFjdEl0ZXJhdG9yPFQ+IGNyZWF0ZUl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25QYWdlSXRlcmF0b3I8VD4oZ2V0U2tpcENvdW50KCksIGdldFBhZ2VGZXRjaGVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9Db2xsZWN0aW9uUGFnZUl0ZXJhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvQ29sbGVjdGlvblBhZ2VJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM3NzZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9Db2xsZWN0aW9uUGFnZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudXRpbC5BYnN0cmFjdFBhZ2VGZXRjaGVyLlBhZ2U7Ci0KLS8qKgotICogSXRlcmF0b3IgZm9yIGl0ZXJhdGluZyBvdmVyIGEgcGFnZSBvZiBpdGVtcyBpbiBhIENNSVMgQ29sbGVjdGlvbi4KLSAqCi0gKiBAcGFyYW0gPFQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uUGFnZUl0ZXJhdG9yPFQ+IGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxUPiB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBza2lwQ291bnQKLSAgICAgKiBAcGFyYW0gcGFnZUZldGNoZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvblBhZ2VJdGVyYXRvcihsb25nIHNraXBDb3VudCwgQWJzdHJhY3RQYWdlRmV0Y2hlcjxUPiBwYWdlRmV0Y2hlcikgewotICAgICAgICBzdXBlcihza2lwQ291bnQsIHBhZ2VGZXRjaGVyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKgotICAgICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yI2hhc05leHQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIFBhZ2U8VD4gcGFnZSA9IGdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgIGlmIChwYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8VD4gaXRlbXMgPSBwYWdlLmdldEl0ZW1zKCk7Ci0gICAgICAgIGlmIChpdGVtcyA9PSBudWxsIHx8IGdldFNraXBPZmZzZXQoKSA+PSBpdGVtcy5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IjbmV4dCgpCi0gICAgICovCi0gICAgcHVibGljIFQgbmV4dCgpIHsKLSAgICAgICAgUGFnZTxUPiBwYWdlID0gZ2V0Q3VycmVudFBhZ2UoKTsKLSAgICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFQ+IGl0ZW1zID0gcGFnZS5nZXRJdGVtcygpOwotICAgICAgICBpZiAoaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5pc0VtcHR5KCkgfHwgZ2V0U2tpcE9mZnNldCgpID09IGl0ZW1zLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXRlbXMuZ2V0KGluY3JlbWVudFNraXBPZmZzZXQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS91dGlsL0VtcHR5SXRlbUl0ZXJhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvRW1wdHlJdGVtSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0YTU0Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvRW1wdHlJdGVtSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci0KLS8qKgotICogQW4gZW1wdHkgaXRlbSBpdGVyYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIEVtcHR5SXRlbUl0ZXJhYmxlPFQ+IGltcGxlbWVudHMgSXRlbUl0ZXJhYmxlPFQ+IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW1wdHlJdGVtSXRlcmFibGU8Pz4gSU5TVEFOQ0UgPSBuZXcgRW1wdHlJdGVtSXRlcmFibGU8T2JqZWN0PigpOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyA8VT4gRW1wdHlJdGVtSXRlcmFibGU8VT4gaW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRW1wdHlJdGVtSXRlcmFibGU8VT4pIElOU1RBTkNFOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8VD4gc2tpcFRvKGxvbmcgcG9zaXRpb24pIHsKLSAgICAgICAgaWYgKHBvc2l0aW9uICE9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YocG9zaXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlbUl0ZXJhYmxlPFQ+IGdldFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8VD4gZ2V0UGFnZShpbnQgbWF4TnVtSXRlbXMpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gKEl0ZXJhdG9yPFQ+KSBFbXB0eUl0ZXJhdG9yLklOU1RBTkNFOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFBhZ2VOdW1JdGVtcygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SGFzTW9yZUl0ZW1zKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VG90YWxOdW1JdGVtcygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gZW1wdHkgaXRlcmF0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yPFY+IGltcGxlbWVudHMgSXRlcmF0b3I8Vj4gewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEl0ZXJhdG9yPD8+IElOU1RBTkNFID0gbmV3IEVtcHR5SXRlcmF0b3I8T2JqZWN0PigpOwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgViBuZXh0KCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL3V0aWwvVHJlZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9UcmVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhjNDk1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvdXRpbC9UcmVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuVHJlZTsKLQotcHVibGljIGNsYXNzIFRyZWVJbXBsPFQ+IGltcGxlbWVudHMgVHJlZTxUPiB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFQgaXRlbTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8VHJlZTxUPj4gY2hpbGRyZW47Ci0KLSAgICBwdWJsaWMgVHJlZUltcGwoVCBpdGVtLCBMaXN0PFRyZWU8VD4+IGNoaWxkcmVuKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkl0ZW0gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5pdGVtID0gaXRlbTsKLSAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotICAgIH0KLQotICAgIHB1YmxpYyBUIGdldEl0ZW0oKSB7Ci0gICAgICAgIHJldHVybiBpdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFRyZWU8VD4+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC91dGlsL0ZpbGVVdGlscy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvdXRpbC9GaWxlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxMWYzYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC91dGlsL0ZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZVR5cGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSW1wbDsKLQotLyoqCi0gKiBBIHNldCBvZiB1dGlsaXR5IG1ldGhvZHMgdGhhdCBzaW1wbGlmeSBmaWxlIGFuZCBmb2xkZXIgb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVVdGlscyB7Ci0KLSAgICBwcml2YXRlIEZpbGVVdGlscygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIG9iamVjdCBieSBwYXRoIG9yIG9iamVjdCBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aE9ySWRPZk9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGggb3Igb2JqZWN0IGlkCi0gICAgICogQHBhcmFtIHNlc3Npb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBzZXNzaW9uCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0Ci0gICAgICogQHRocm93cyBDbWlzQmFzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc09iamVjdCBnZXRPYmplY3QoU3RyaW5nIHBhdGhPcklkT2ZPYmplY3QsIFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXNzaW9uIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXRoT3JJZE9mT2JqZWN0ID09IG51bGwgfHwgcGF0aE9ySWRPZk9iamVjdC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXRoT3JJZE9mT2JqZWN0IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc09iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAocGF0aE9ySWRPZk9iamVjdC5jaGFyQXQoMCkgPT0gJy8nKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBzZXNzaW9uLmdldE9iamVjdEJ5UGF0aChwYXRoT3JJZE9mT2JqZWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNlc3Npb24uZ2V0T2JqZWN0KHBhdGhPcklkT2ZPYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgZm9sZGVyIGJ5IHBhdGggb3Igb2JqZWN0IGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoT3JJZE9mT2JqZWN0Ci0gICAgICogICAgICAgICAgICB0aGUgcGF0aCBvciBmb2xkZXIgaWQKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlc3Npb24KLSAgICAgKiBAcmV0dXJuIHRoZSBmb2xkZXIgb2JqZWN0Ci0gICAgICogQHRocm93cyBDbWlzQmFzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9sZGVyIGdldEZvbGRlcihTdHJpbmcgcGF0aE9ySWRPZk9iamVjdCwgU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNPYmplY3QgZm9sZGVyID0gZ2V0T2JqZWN0KHBhdGhPcklkT2ZPYmplY3QsIHNlc3Npb24pOwotCi0gICAgICAgIGlmIChmb2xkZXIgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoRm9sZGVyKSBmb2xkZXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaXMgbm90IGEgZm9sZGVyISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRvY3VtZW50IGZyb20gYSBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRJZE9yUGF0aAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9yIHBhdGggb2YgdGhlIHBhcmVudCBmb2xkZXIKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0eXBlIChkZWZhdWx0cyB0byA8Y29kZT5jbWlzOmRvY3VtZW50PC9jb2RlPikKLSAgICAgKiBAcGFyYW0gdmVyc2lvbmluZ1N0YXRlCi0gICAgICogICAgICAgICAgICB0aGUgdmVyc2lvbmluZyBzdGF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQKLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ21pc0Jhc2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50RnJvbUZpbGUoU3RyaW5nIHBhcmVudElkT3JQYXRoLCBGaWxlIGZpbGUsIFN0cmluZyB0eXBlLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpOyAvLyAiY21pczpkb2N1bWVudCI7Ci0gICAgICAgIH0KLQotICAgICAgICBGb2xkZXIgcGFyZW50Rm9sZGVyID0gZ2V0Rm9sZGVyKHBhcmVudElkT3JQYXRoLCBzZXNzaW9uKTsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgbWltZXR5cGUgPSBNaW1lVHlwZXMuZ2V0TUlNRVR5cGUoZmlsZSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSk7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKG5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihmaWxlLmxlbmd0aCgpKSwgbWltZXR5cGUsIHN0cmVhbSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnRGb2xkZXIuY3JlYXRlRG9jdW1lbnQocHJvcGVydGllcywgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBjbG9zZSBzb3VyY2Ugc3RyZWFtISIsIGlvZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHRleHQgZG9jdW1lbnQgZnJvbSBhIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50SWRPclBhdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZCBvciBwYXRoIG9mIHRoZSBwYXJlbnQgZm9sZGVyCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBuYW1lCi0gICAgICogQHBhcmFtIGNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHN0cmluZwotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdHlwZSAoZGVmYXVsdHMgdG8gPGNvZGU+Y21pczpkb2N1bWVudDwvY29kZT4pCi0gICAgICogQHBhcmFtIHZlcnNpb25pbmdTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIHZlcnNpb25pbmcgc3RhdGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAcGFyYW0gc2Vzc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlc3Npb24KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVUZXh0RG9jdW1lbnQoU3RyaW5nIHBhcmVudElkT3JQYXRoLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFN0cmluZyB0eXBlLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKTsgLy8gImNtaXM6ZG9jdW1lbnQiOwotICAgICAgICB9Ci0KLSAgICAgICAgRm9sZGVyIHBhcmVudEZvbGRlciA9IGdldEZvbGRlcihwYXJlbnRJZE9yUGF0aCwgc2Vzc2lvbik7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSk7Ci0KLSAgICAgICAgYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IG5ldyBieXRlWzBdOwotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZW50Qnl0ZXMgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKGNvbnRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50Qnl0ZXMpOwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBuZXcgQ29udGVudFN0cmVhbUltcGwobmFtZSwgQmlnSW50ZWdlci52YWx1ZU9mKGNvbnRlbnRCeXRlcy5sZW5ndGgpLAotICAgICAgICAgICAgICAgICJ0ZXh0L3BsYWluIiwgYmFpcyk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmVudEZvbGRlci5jcmVhdGVEb2N1bWVudChwcm9wZXJ0aWVzLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBjaGlsZCBmb2xkZXIgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgb2YgdGhlIHR5cGUgc3BlY2lmaWVkLiBJZgotICAgICAqIHR5cGUgaXMgbnVsbCB0aGVuIHdpbGwgZGVmYXVsdCB0byBjbWlzOmZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Rm9sZGVyCi0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGZvbGRlcgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZm9sZGVyIG5hbWUKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIGZvbGRlciB0eXBlIChkZWZhdWx0cyB0byA8Y29kZT5jbWlzOmZvbGRlcjwvY29kZT4pCi0gICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBmb2xkZXIKLSAgICAgKiBAdGhyb3dzIENtaXNCYXNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGb2xkZXIgY3JlYXRlRm9sZGVyKEZvbGRlciBwYXJlbnRGb2xkZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSkgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmVudEZvbGRlci5jcmVhdGVGb2xkZXIocHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZvbGRlciB1c2luZyBhIFN0cmluZyBpZGVudGlmaWVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRJZE9yUGF0aAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9yIHBhdGggb2YgdGhlIHBhcmVudCBmb2xkZXIKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGZvbGRlciBuYW1lCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBmb2xkZXIgdHlwZSAoZGVmYXVsdHMgdG8gPGNvZGU+Y21pczpmb2xkZXI8L2NvZGU+KQotICAgICAqIEBwYXJhbSBzZXNzaW9uCi0gICAgICogICAgICAgICAgICB0aGUgc2Vzc2lvbgotICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgZm9sZGVyCi0gICAgICogQHRocm93cyBDbWlzQmFzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgcGFyZW50SWRPclBhdGgsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIEZvbGRlciBwYXJlbnRGb2xkZXIgPSBnZXRGb2xkZXIocGFyZW50SWRPclBhdGgsIHNlc3Npb24pOwotCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPSBCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHR5cGUpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lKTsKLQotICAgICAgICByZXR1cm4gcGFyZW50Rm9sZGVyLmNyZWF0ZUZvbGRlcihwcm9wZXJ0aWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEb3dubG9hZHMgdGhlIGNvbnRlbnRTdHJlYW0gZm9yIHRoZSBnaXZlbiBkb2MgdG8gdGhlIHNwZWNpZmllZCBwYXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvblBhdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBwYXRoCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ21pc0Jhc2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG93bmxvYWQoRG9jdW1lbnQgZG9jLCBTdHJpbmcgZGVzdGluYXRpb25QYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uUGF0aCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNvcHkoZG9jLmdldENvbnRlbnRTdHJlYW0oKS5nZXRTdHJlYW0oKSwgb3V0LCA2NCAqIDEwMjQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkob3V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvd25sb2FkcyBhIGRvY3VtZW50IGJ5IGl0cyBpZCBvciBwYXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkb2NJZE9yUGF0aAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9yIHBhdGggb2YgdGhlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uUGF0aAotICAgICAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIHBhdGgKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlc3Npb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbWlzQmFzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dubG9hZChTdHJpbmcgZG9jSWRPclBhdGgsIFN0cmluZyBkZXN0aW5hdGlvblBhdGgsIFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc09iamVjdCBkb2MgPSBnZXRPYmplY3QoZG9jSWRPclBhdGgsIHNlc3Npb24pOwotCi0gICAgICAgIGlmIChkb2MgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgZG93bmxvYWQoKERvY3VtZW50KSBkb2MsIGRlc3RpbmF0aW9uUGF0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaXMgbm90IGEgZG9jdW1lbnQhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGFuIG9iamVjdCBieSBwYXRoIG9yIGlkIChzdHJpbmcgaWRlbnRpZmllcikuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdGhPcklkT2ZPYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZCBvciBwYXRoIG9mIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIHNlc3Npb24KLSAgICAgKiBAdGhyb3dzIENtaXNCYXNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShTdHJpbmcgcGF0aE9ySWRPZk9iamVjdCwgU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0KHBhdGhPcklkT2ZPYmplY3QsIHNlc3Npb24pOwotCi0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICgoRm9sZGVyKSBvYmplY3QpLmRlbGV0ZVRyZWUodHJ1ZSwgVW5maWxlT2JqZWN0LkRFTEVURSwgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvYmplY3QuZGVsZXRlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIG91dCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgb2JqZWN0IHRvIFN5c3RlbS5vdXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFByb3BlcnRpZXMoQ21pc09iamVjdCBvYmplY3QpIHsKLSAgICAgICAgcHJpbnRQcm9wZXJ0aWVzKG9iamVjdCwgU3lzdGVtLm91dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIG91dCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgb2JqZWN0IHRvIHRoZSBnaXZlbgotICAgICAqIFByaW50U3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRQcm9wZXJ0aWVzKENtaXNPYmplY3Qgb2JqZWN0LCBQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eTw/PiBwcm9wIDogb2JqZWN0LmdldFByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgcHJpbnRQcm9wZXJ0eShwcm9wLCBvdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50UHJvcGVydHkoUHJvcGVydHk8Pz4gcHJvcCkgewotICAgICAgICBwcmludFByb3BlcnR5KHByb3AsIFN5c3RlbS5vdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFByb3BlcnR5KFByb3BlcnR5PD8+IHByb3AsIFByaW50U3RyZWFtIG91dCkgewotICAgICAgICBvdXQucHJpbnRsbihwcm9wLmdldElkKCkgKyAiOiAiICsgcHJvcC5nZXRWYWx1ZXNBc1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC91dGlsL09wZXJhdGlvbkNvbnRleHRVdGlscy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvdXRpbC9PcGVyYXRpb25Db250ZXh0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjMjFmMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC91dGlsL09wZXJhdGlvbkNvbnRleHRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLk9wZXJhdGlvbkNvbnRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLQotLyoqCi0gKiBDb25zdGFudHMgYW5kIG1ldGhvZHMgdG8gY3JlYXRlIGFuZCBtYW5pcHVsYXRlIHtAbGluayBPcGVyYXRpb25Db250ZXh0fQotICogb2JqZWN0cy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9wZXJhdGlvbkNvbnRleHRVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX1NUQVIgPSAiKiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVORElUSU9OX05PTkUgPSAiY21pczpub25lIjsKLQotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dFV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgT3BlcmF0aW9uQ29udGV4dCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPcGVyYXRpb25Db250ZXh0IGNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT3BlcmF0aW9uQ29udGV4dEltcGwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYW4gT3BlcmF0aW9uQ29udGV4dCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPcGVyYXRpb25Db250ZXh0IGNvcHlPcGVyYXRpb25Db250ZXh0KE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgT3BlcmF0aW9uQ29udGV4dCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9wZXJhdGlvbkNvbnRleHQgY3JlYXRlT3BlcmF0aW9uQ29udGV4dChTZXQ8U3RyaW5nPiBmaWx0ZXIsIGJvb2xlYW4gaW5jbHVkZUFjbHMsCi0gICAgICAgICAgICBib29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBib29sZWFuIGluY2x1ZGVQb2xpY2llcywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiByZW5kaXRpb25GaWx0ZXIsIGJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50cywgU3RyaW5nIG9yZGVyQnksIGJvb2xlYW4gY2FjaGVFbmFibGVkLAotICAgICAgICAgICAgaW50IG1heEl0ZW1zUGVyUGFnZSkgewotICAgICAgICByZXR1cm4gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKGZpbHRlciwgaW5jbHVkZUFjbHMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUG9saWNpZXMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50cywgb3JkZXJCeSwgY2FjaGVFbmFibGVkLCBtYXhJdGVtc1BlclBhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgT3BlcmF0aW9uQ29udGV4dCBvYmplY3QgdGhhdCBvbmx5IHNlbGVjdHMgdGhlIGJhcmUgbWluaW11bS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9wZXJhdGlvbkNvbnRleHQgY3JlYXRlTWluaW11bU9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIFNldDxTdHJpbmc+IGZpbHRlciA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZmlsdGVyLmFkZChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpOwotICAgICAgICBmaWx0ZXIuYWRkKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgZmlsdGVyLmFkZChQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQpOwotCi0gICAgICAgIHJldHVybiBuZXcgT3BlcmF0aW9uQ29udGV4dEltcGwoZmlsdGVyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLAotICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihSRU5ESVRJT05fTk9ORSksIGZhbHNlLCBudWxsLCB0cnVlLCAxMDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgT3BlcmF0aW9uQ29udGV4dCBvYmplY3QgdGhhdCBzZWxlY3RzIGV2ZXJ5dGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPcGVyYXRpb25Db250ZXh0IGNyZWF0ZU1heGltdW1PcGVyYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKENvbGxlY3Rpb25zLnNpbmdsZXRvbihQUk9QRVJUSUVTX1NUQVIpLCB0cnVlLCB0cnVlLCB0cnVlLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbigiKiIpLCBmYWxzZSwgbnVsbCwgdHJ1ZSwgMTAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgT3BlcmF0aW9uQ29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBBdHRlbXB0cyB0byBtb2RpZnkgdGhlIHJldHVybmVkIE9wZXJhdGlvbkNvbnRleHQgb2JqZWN0IHJlc3VsdCBpbiBhbgotICAgICAqIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPcGVyYXRpb25Db250ZXh0IHVubW9kaWZpYWJsZU9wZXJhdGlvbkNvbnRleHQoZmluYWwgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgT3BlcmF0aW9uQ29udGV4dCgpIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChjb250ZXh0LmdldEZpbHRlcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyKFNldDxTdHJpbmc+IHByb3BlcnR5RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlclN0cmluZyhTdHJpbmcgcHJvcGVydHlGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0RmlsdGVyU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldExvYWRTZWNvbmRhcnlUeXBlUHJvcGVydGllcyhib29sZWFuIGxvYWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbG9hZFNlY29uZGFyeVR5cGVQcm9wZXJ0aWVzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmxvYWRTZWNvbmRhcnlUeXBlUHJvcGVydGllcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVBbGxvd2FibGVBY3Rpb25zKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmlzSW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoYm9vbGVhbiBpbmNsdWRlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZUFjbHMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaXNJbmNsdWRlQWNscygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQWNscyhib29sZWFuIGluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGdldEluY2x1ZGVSZWxhdGlvbnNoaXBzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEluY2x1ZGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVSZWxhdGlvbnNoaXBzKEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlUG9saWNpZXMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuaXNJbmNsdWRlUG9saWNpZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZVBvbGljaWVzKGJvb2xlYW4gaW5jbHVkZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UmVuZGl0aW9uRmlsdGVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoY29udGV4dC5nZXRSZW5kaXRpb25GaWx0ZXIoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlbmRpdGlvbkZpbHRlcihTZXQ8U3RyaW5nPiByZW5kaXRpb25GaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKFN0cmluZyByZW5kaXRpb25GaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVBhdGhTZWdtZW50cygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5pc0luY2x1ZGVQYXRoU2VnbWVudHMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZVBhdGhTZWdtZW50cyhib29sZWFuIGluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRPcmRlckJ5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldE9yZGVyQnkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0T3JkZXJCeShTdHJpbmcgb3JkZXJCeSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhY2hlRW5hYmxlZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5pc0NhY2hlRW5hYmxlZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYWNoZUVuYWJsZWQoYm9vbGVhbiBjYWNoZUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDYWNoZUtleSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDYWNoZUtleSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRNYXhJdGVtc1BlclBhZ2UoaW50IG1heEl0ZW1zUGVyUGFnZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldE1heEl0ZW1zUGVyUGFnZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNYXhJdGVtc1BlclBhZ2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvdXRpbC9UeXBlVXRpbHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3V0aWwvVHlwZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NmUxYzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvdXRpbC9UeXBlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRm9sZGVyVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5JdGVtVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qb2xpY3lUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlJZERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlVcmlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5TZWNvbmRhcnlUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5wYXJzZXIuSlNPTlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLnBhcnNlci5KU09OUGFyc2VyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZVV0aWxzIHsKLQotICAgIHByaXZhdGUgVHlwZVV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZXMgdGhlIHR5cGUgZGVmaW5pdGlvbiB0byBYTUwsIHVzaW5nIHRoZSBmb3JtYXQgZGVmaW5lZCBpbiB0aGUKLSAgICAgKiBDTUlTIHNwZWNpZmljYXRpb24uCi0gICAgICogCi0gICAgICogVGhlIFhNTCBpcyBVVEYtOCBlbmNvZGVkIGFuZCB0aGUgc3RyZWFtIGlzIG5vdCBjbG9zZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG9YTUwoVHlwZURlZmluaXRpb24gdHlwZSwgT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPdXRwdXQgc3RyZWFtIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihzdHJlYW0pOwotICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZVR5cGVEZWZpbml0aW9uKHdyaXRlciwgQ21pc1ZlcnNpb24uQ01JU18xXzEsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQ01JUywgdHlwZSk7Ci0gICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZXMgdGhlIHR5cGUgZGVmaW5pdGlvbiB0byBKU09OLCB1c2luZyB0aGUgZm9ybWF0IGRlZmluZWQgaW4gdGhlCi0gICAgICogQ01JUyBzcGVjaWZpY2F0aW9uLgotICAgICAqIAotICAgICAqIFRoZSBKU09OIGlzIFVURi04IGVuY29kZWQgYW5kIHRoZSBzdHJlYW0gaXMgbm90IGNsb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0pTT04oVHlwZURlZmluaXRpb24gdHlwZSwgT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk91dHB1dCBzdHJlYW0gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCBJT1V0aWxzLlVURjgpKTsKLSAgICAgICAgSlNPTkNvbnZlcnRlci5jb252ZXJ0KHR5cGUsIERhdGVUaW1lRm9ybWF0LlNJTVBMRSkud3JpdGVKU09OU3RyaW5nKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGEgdHlwZSBkZWZpbml0aW9uIGZyb20gYSBYTUwgc3RyZWFtLgotICAgICAqIAotICAgICAqIFRoZSBzdHJlYW0gbXVzdCBiZSBVVEYtOCBlbmNvZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb24gcmVhZEZyb21YTUwoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnB1dCBzdHJlYW0gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gWE1MVXRpbHMuY3JlYXRlUGFyc2VyKHN0cmVhbSk7Ci0gICAgICAgIGlmICghWE1MVXRpbHMuZmluZE5leHRTdGFydEVsZW1lbmV0KHBhcnNlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IFhNTENvbnZlcnRlci5jb252ZXJ0VHlwZURlZmluaXRpb24ocGFyc2VyKTsKLQotICAgICAgICBwYXJzZXIuY2xvc2UoKTsKLQotICAgICAgICByZXR1cm4gdHlwZURlZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBhIHR5cGUgZGVmaW5pdGlvbiBmcm9tIGEgSlNPTiBzdHJlYW0uCi0gICAgICogCi0gICAgICogVGhlIHN0cmVhbSBtdXN0IGJlIFVURi04IGVuY29kZWQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiByZWFkRnJvbUpTT04oSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTT05QYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5wdXQgc3RyZWFtIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTlBhcnNlciBwYXJzZXIgPSBuZXcgSlNPTlBhcnNlcigpOwotICAgICAgICBPYmplY3QganNvbiA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtLCBJT1V0aWxzLlVURjgpKTsKLQotICAgICAgICBpZiAoIShqc29uIGluc3RhbmNlb2YgTWFwKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHN0cmVhbSEgTm90IGEgdHlwZSBkZWZpbml0aW9uISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpTT05Db252ZXJ0ZXIuY29udmVydFR5cGVEZWZpbml0aW9uKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUXVlcnlOYW1lKFN0cmluZyBxdWVyeU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5TmFtZSAhPSBudWxsICYmIHF1ZXJ5TmFtZS5sZW5ndGgoKSA+IDAgJiYgcXVlcnlOYW1lLmluZGV4T2YoJyAnKSA8IDAgJiYgcXVlcnlOYW1lLmluZGV4T2YoJ1x0JykgPCAwCi0gICAgICAgICAgICAgICAgJiYgcXVlcnlOYW1lLmluZGV4T2YoJ1xuJykgPCAwICYmIHF1ZXJ5TmFtZS5pbmRleE9mKCdccicpIDwgMCAmJiBxdWVyeU5hbWUuaW5kZXhPZignXGYnKSA8IDAKLSAgICAgICAgICAgICAgICAmJiBxdWVyeU5hbWUuaW5kZXhPZignLCcpIDwgMCAmJiBxdWVyeU5hbWUuaW5kZXhPZignIicpIDwgMCAmJiBxdWVyeU5hbWUuaW5kZXhPZignXCcnKSA8IDAKLSAgICAgICAgICAgICAgICAmJiBxdWVyeU5hbWUuaW5kZXhPZignXFwnKSA8IDAgJiYgcXVlcnlOYW1lLmluZGV4T2YoJy4nKSA8IDAgJiYgcXVlcnlOYW1lLmluZGV4T2YoJygnKSA8IDAKLSAgICAgICAgICAgICAgICAmJiBxdWVyeU5hbWUuaW5kZXhPZignKScpIDwgMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB2YWxpZGF0aW9uIGVycm9ycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxWYWxpZGF0aW9uRXJyb3I+IHZhbGlkYXRlVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFZhbGlkYXRpb25FcnJvcj4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDxUeXBlVXRpbHMuVmFsaWRhdGlvbkVycm9yPigpOwotCi0gICAgICAgIGlmICh0eXBlLmdldElkKCkgPT0gbnVsbCB8fCB0eXBlLmdldElkKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJpZCIsICJUeXBlIGlkIG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlLmdldExvY2FsTmFtZSgpID09IG51bGwgfHwgdHlwZS5nZXRMb2NhbE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoImxvY2FsTmFtZSIsICJMb2NhbCBuYW1lIG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlLmdldFF1ZXJ5TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldFF1ZXJ5TmFtZSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInF1ZXJ5TmFtZSIsICJRdWVyeSBuYW1lIG11c3Qgbm90IGJlIGVtcHR5LiIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrUXVlcnlOYW1lKHR5cGUuZ2V0UXVlcnlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJxdWVyeU5hbWUiLCAiUXVlcnkgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUuaXNDcmVhdGFibGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoImNyZWF0YWJsZSIsICJDcmVhdGFibGUgZmxhZyBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZS5pc0ZpbGVhYmxlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJmaWxlYWJsZSIsICJGaWxlYWJsZSBmbGFnIG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlLmlzUXVlcnlhYmxlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJxdWVyeWFibGUiLCAiUXVlcnlhYmxlIGZsYWcgbXVzdCBiZSBzZXQuIikpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuaXNRdWVyeWFibGUoKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0UXVlcnlOYW1lKCkgPT0gbnVsbCB8fCB0eXBlLmdldFF1ZXJ5TmFtZSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInF1ZXJ5YWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnlhYmxlIGZsYWcgaXMgc2V0IHRvIFRSVUUsIGJ1dCB0aGUgcXVlcnkgbmFtZSBpcyBub3Qgc2V0LiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlLmlzQ29udHJvbGxhYmxlUG9saWN5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJjb250cm9sbGFibGVQb2xpY3kiLCAiQ29udHJvbGxhYmxlUG9saWN5IGZsYWcgbXVzdCBiZSBzZXQuIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUuaXNDb250cm9sbGFibGVBY2woKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoImNvbnRyb2xsYWJsZUFDTCIsICJDb250cm9sbGFibGVBQ0wgZmxhZyBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZS5pc0Z1bGx0ZXh0SW5kZXhlZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiZnVsbHRleHRJbmRleGVkIiwgIkZ1bGx0ZXh0SW5kZXhlZCBmbGFnIG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkiLCAiSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5IGZsYWcgbXVzdCBiZSBzZXQuIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiYmFzZUlkIiwgIkJhc2UgdHlwZSBpZCBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXR5cGUuZ2V0QmFzZVR5cGVJZCgpLnZhbHVlKCkuZXF1YWxzKHR5cGUuZ2V0UGFyZW50VHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRQYXJlbnRUeXBlSWQoKSA9PSBudWxsIHx8IHR5cGUuZ2V0UGFyZW50VHlwZUlkKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigicGFyZW50VHlwZUlkIiwgIlBhcmVudCB0eXBlIGlkIG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpICE9IEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiYmFzZUlkIiwgIkJhc2UgdHlwZSBpZCBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZS4iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gZG9jVHlwZSA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlOwotCi0gICAgICAgICAgICBpZiAoZG9jVHlwZS5pc1ZlcnNpb25hYmxlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigidmVyc2lvbmFibGUiLCAiVmVyc2lvbmFibGUgZmxhZyBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkb2NUeXBlLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiY29udGVudFN0cmVhbUFsbG93ZWQiLCAiQ29udGVudFN0cmVhbUFsbG93ZWQgZmxhZyBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgRm9sZGVyVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmICh0eXBlLmdldEJhc2VUeXBlSWQoKSAhPSBCYXNlVHlwZUlkLkNNSVNfRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJiYXNlSWQiLCAiQmFzZSB0eXBlIGlkIGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlLiIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpICE9IEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVApIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoImJhc2VJZCIsICJCYXNlIHR5cGUgaWQgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUuIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFBvbGljeVR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRCYXNlVHlwZUlkKCkgIT0gQmFzZVR5cGVJZC5DTUlTX1BPTElDWSkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiYmFzZUlkIiwgIkJhc2UgdHlwZSBpZCBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZS4iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSXRlbVR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRCYXNlVHlwZUlkKCkgIT0gQmFzZVR5cGVJZC5DTUlTX0lURU0pIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoImJhc2VJZCIsICJCYXNlIHR5cGUgaWQgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUuIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFNlY29uZGFyeVR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRCYXNlVHlwZUlkKCkgIT0gQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWSkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiYmFzZUlkIiwgIkJhc2UgdHlwZSBpZCBkb2VzIG5vdCBtYXRjaCB0aGUgdHlwZS4iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiYmFzZUlkIiwgIlVua25vd24gYmFzZSBpbnRlcmZhY2UuIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycm9yczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYSBwcm9wZXJ0eSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdmFsaWRhdGlvbiBlcnJvcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8VmFsaWRhdGlvbkVycm9yPiB2YWxpZGF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZikgewotICAgICAgICBpZiAocHJvcERlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFZhbGlkYXRpb25FcnJvcj4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDxUeXBlVXRpbHMuVmFsaWRhdGlvbkVycm9yPigpOwotCi0gICAgICAgIGlmIChwcm9wRGVmLmdldElkKCkgPT0gbnVsbCB8fCBwcm9wRGVmLmdldElkKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJpZCIsICJUeXBlIGlkIG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wRGVmLmdldFF1ZXJ5TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldFF1ZXJ5TmFtZSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInF1ZXJ5TmFtZSIsICJRdWVyeSBuYW1lIG11c3Qgbm90IGJlIGVtcHR5LiIpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrUXVlcnlOYW1lKHByb3BEZWYuZ2V0UXVlcnlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJxdWVyeU5hbWUiLCAiUXVlcnkgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BEZWYuZ2V0Q2FyZGluYWxpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoImNhcmRpbmFsaXR5IiwgIkNhcmRpbmFsaXR5IG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wRGVmLmdldFVwZGF0YWJpbGl0eSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigidXBkYXRhYmlsaXR5IiwgIlVwZGF0YWJpbGl0eSBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcERlZi5pc0luaGVyaXRlZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigiaW5oZXJpdGVkIiwgIkluaGVyaXRlZCBmbGFnIG11c3QgYmUgc2V0LiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wRGVmLmlzUmVxdWlyZWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInJlcXVpcmVkIiwgIlJlcXVpcmVkIGZsYWcgbXVzdCBiZSBzZXQuIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BEZWYuaXNRdWVyeWFibGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInF1ZXJ5YWJsZSIsICJRdWVyeWFibGUgZmxhZyBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZi5pc1F1ZXJ5YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRRdWVyeU5hbWUoKSA9PSBudWxsIHx8IHByb3BEZWYuZ2V0UXVlcnlOYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQobmV3IFZhbGlkYXRpb25FcnJvcigicXVlcnlhYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeWFibGUgZmxhZyBpcyBzZXQgdG8gVFJVRSwgYnV0IHRoZSBxdWVyeSBuYW1lIGlzIG5vdCBzZXQuIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BEZWYuaXNPcmRlcmFibGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoIm9yZGVyYWJsZSIsICJPcmRlcmFibGUgZmxhZyBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZi5pc09yZGVyYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5Lk1VTFRJKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJvcmRlcmFibGUiLCAiT3JkZXJhYmxlIGZsYWcgaXMgc2V0IHRvIFRSVUUgZm9yIGEgbXVsdGktdmFsdWUgcHJvcGVydHkuIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJwcm9wZXJ0eVR5cGUiLCAiUHJvcGVydHkgdHlwZSBpZCBtdXN0IGJlIHNldC4iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcERlZiBpbnN0YW5jZW9mIFByb3BlcnR5SWREZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBQcm9wZXJ0eVR5cGUuSUQpIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInByb3BlcnR5VHlwZSIsICJQcm9wZXJ0eSB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uLiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wRGVmIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBQcm9wZXJ0eVR5cGUuU1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJwcm9wZXJ0eVR5cGUiLCAiUHJvcGVydHkgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZiBpbnN0YW5jZW9mIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpICE9IFByb3BlcnR5VHlwZS5JTlRFR0VSKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJwcm9wZXJ0eVR5cGUiLCAiUHJvcGVydHkgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZiBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpICE9IFByb3BlcnR5VHlwZS5ERUNJTUFMKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJwcm9wZXJ0eVR5cGUiLCAiUHJvcGVydHkgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZiBpbnN0YW5jZW9mIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpICE9IFByb3BlcnR5VHlwZS5CT09MRUFOKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJwcm9wZXJ0eVR5cGUiLCAiUHJvcGVydHkgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZiBpbnN0YW5jZW9mIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBQcm9wZXJ0eVR5cGUuREFURVRJTUUpIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInByb3BlcnR5VHlwZSIsICJQcm9wZXJ0eSB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uLiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wRGVmIGluc3RhbmNlb2YgUHJvcGVydHlIdG1sRGVmaW5pdGlvbikgewotICAgICAgICAgICAgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkgIT0gUHJvcGVydHlUeXBlLkhUTUwpIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMuYWRkKG5ldyBWYWxpZGF0aW9uRXJyb3IoInByb3BlcnR5VHlwZSIsICJQcm9wZXJ0eSB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uLiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wRGVmIGluc3RhbmNlb2YgUHJvcGVydHlVcmlEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBQcm9wZXJ0eVR5cGUuVVJJKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbkVycm9yKCJwcm9wZXJ0eVR5cGUiLCAiUHJvcGVydHkgdHlwZSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbi4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyb3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGlvbkVycm9yIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXR0cmlidXRlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlcnJvcjsKLQotICAgICAgICBwdWJsaWMgVmFsaWRhdGlvbkVycm9yKFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyBlcnJvcikgewotICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgewotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlICsgIjogIiArIGVycm9yOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9DYWNoZVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvQ2FjaGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MmE2YWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9DYWNoZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5jYWNoZS5DYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5jYWNoZS5DYWNoZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDYWNoZVRlc3QgewotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgewotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgY2FjaGVTaW5nbGVPYmplY3RUZXN0KCkgewotICAgICAgICBDYWNoZSBjYWNoZSA9IGNyZWF0ZUNhY2hlKDEwMCwgMzYwMCAqIDEwMDApOwotCi0gICAgICAgIFN0cmluZyBpZCA9ICIxIjsKLSAgICAgICAgLy8gU3RyaW5nIHBhdGggPSAiLzEiOwotICAgICAgICBTdHJpbmcgY2FjaGVLZXkgPSAia2V5IjsKLQotICAgICAgICAvLyBhZGQgb2JqZWN0Ci0gICAgICAgIENtaXNPYmplY3Qgb2JqMSA9IGNyZWF0ZUNtaXNPYmplY3QoaWQpOwotICAgICAgICBjYWNoZS5wdXQob2JqMSwgY2FjaGVLZXkpOwotCi0gICAgICAgIC8vIGFjY2VzcyBvYmplY3QKLSAgICAgICAgYXNzZXJ0VHJ1ZShjYWNoZS5jb250YWluc0lkKGlkLCBjYWNoZUtleSkpOwotCi0gICAgICAgIC8vIGFjY2VzcyBvYmplY3QKLSAgICAgICAgQ21pc09iamVjdCBvYmoyID0gY2FjaGUuZ2V0QnlJZChpZCwgY2FjaGVLZXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqMSwgb2JqMik7Ci0KLSAgICAgICAgLy8gY2xlYXIgY2FjaGUKLSAgICAgICAgY2FjaGUuY2xlYXIoKTsKLQotICAgICAgICAvLyBhY2Nlc3Mgb2JqZWN0IChub3QgZm91bmQpCi0gICAgICAgIGFzc2VydEZhbHNlKGNhY2hlLmNvbnRhaW5zSWQoaWQsIGNhY2hlS2V5KSk7Ci0KLSAgICAgICAgLy8gYWNjZXNzIG9iamVjdCAobm90IGZvdW5kKQotICAgICAgICBDbWlzT2JqZWN0IG9iajQgPSBjYWNoZS5nZXRCeUlkKGlkLCBjYWNoZUtleSk7Ci0gICAgICAgIGFzc2VydE51bGwob2JqNCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjYWNoZVNpemVUZXN0KCkgewotICAgICAgICBpbnQgY2FjaGVTaXplID0gNTAwMDA7Ci0gICAgICAgIENhY2hlIGNhY2hlID0gY3JlYXRlQ2FjaGUoY2FjaGVTaXplLCAzNjAwICogMTAwMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWNoZVNpemUsIGNhY2hlLmdldENhY2hlU2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGxydVRlc3QoKSB7Ci0gICAgICAgIGludCBjYWNoZVNpemUgPSAzOwotICAgICAgICBDYWNoZSBjYWNoZSA9IGNyZWF0ZUNhY2hlKGNhY2hlU2l6ZSwgMzYwMCAqIDEwMDApOwotCi0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9ICJrZXkiOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGVTaXplICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICBDbWlzT2JqZWN0IG9iaiA9IGNyZWF0ZUNtaXNPYmplY3QoImlkIiArIGkpOwotICAgICAgICAgICAgY2FjaGUucHV0KG9iaiwgY2FjaGVLZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChjYWNoZS5nZXRCeUlkKCJpZDAiLCBjYWNoZUtleSkpOyAvLyB0aHJvd24gb3V0Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2FjaGUuZ2V0QnlJZCgiaWQxIiwgY2FjaGVLZXkpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjYWNoZS5nZXRCeUlkKCJpZDIiLCBjYWNoZUtleSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNhY2hlLmdldEJ5SWQoImlkMyIsIGNhY2hlS2V5KSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInN0YXRpYy1hY2Nlc3MiKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdHRsVGVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENhY2hlIGNhY2hlID0gY3JlYXRlQ2FjaGUoMTAsIDUwMCk7Ci0KLSAgICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gImtleSI7Ci0gICAgICAgIFN0cmluZyBpZCA9ICJpZCI7Ci0KLSAgICAgICAgQ21pc09iamVjdCBvYmogPSB0aGlzLmNyZWF0ZUNtaXNPYmplY3QoaWQpOwotICAgICAgICBjYWNoZS5wdXQob2JqLCBjYWNoZUtleSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjYWNoZS5nZXRCeUlkKGlkLCBjYWNoZUtleSkpOwotCi0gICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoNzUwKTsKLQotICAgICAgICBhc3NlcnROdWxsKGNhY2hlLmdldEJ5SWQoaWQsIGNhY2hlS2V5KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemF0aW9uVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgY2FjaGVTaXplID0gMTA7Ci0gICAgICAgIENhY2hlIGNhY2hlID0gY3JlYXRlQ2FjaGUoY2FjaGVTaXplLCAzNjAwICogMTAwMCk7Ci0KLSAgICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gImtleSI7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZVNpemU7IGkrKykgewotICAgICAgICAgICAgQ21pc09iamVjdCBvYmogPSBjcmVhdGVDbWlzT2JqZWN0KCJpZCIgKyBpKTsKLSAgICAgICAgICAgIGNhY2hlLnB1dChvYmosIGNhY2hlS2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJ1ZmZlcik7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChjYWNoZSk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotCi0gICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICBDYWNoZSBjYWNoZTIgPSAoQ2FjaGUpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGNhY2hlU2l6ZTsgaysrKSB7Ci0gICAgICAgICAgICBDbWlzT2JqZWN0IG8xID0gY2FjaGUuZ2V0QnlJZCgiaWQiICsgaywgY2FjaGVLZXkpOwotICAgICAgICAgICAgQ21pc09iamVjdCBvMiA9IGNhY2hlMi5nZXRCeUlkKCJpZCIgKyBrLCBjYWNoZUtleSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobzEuZ2V0SWQoKSwgbzIuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNb2NrIGZvciB0ZXN0aW5nIENhY2hlIGlzIHN1ZmZpY2llbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogQHJldHVybiBhIG1vY2tlZCBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbWlzT2JqZWN0IGNyZWF0ZUNtaXNPYmplY3QoZmluYWwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ21pc09iamVjdE1vY2soaWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENhY2hlIGNyZWF0ZUNhY2hlKGludCBjYWNoZVNpemUsIGludCB0dGwpIHsKLSAgICAgICAgQ2FjaGUgY2FjaGUgPSBuZXcgQ2FjaGVJbXBsKCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfU0laRV9PQkpFQ1RTLCAiIiArIGNhY2hlU2l6ZSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQ0FDSEVfVFRMX09CSkVDVFMsICIiICsgdHRsKTsKLQotICAgICAgICBjYWNoZS5pbml0aWFsaXplKG51bGwsIHBhcmFtZXRlcnMpOwotCi0gICAgICAgIHJldHVybiBjYWNoZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0NtaXNPYmplY3RNb2NrLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL0NtaXNPYmplY3RNb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjgxOTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9DbWlzT2JqZWN0TW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5SZW5kaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZWNvbmRhcnlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5FeHRlbnNpb25MZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLQotcHVibGljIGNsYXNzIENtaXNPYmplY3RNb2NrIGltcGxlbWVudHMgQ21pc09iamVjdCwgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0TW9jayhTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgYWRkQWNsKExpc3Q8QWNlPiBhZGRBY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKExpc3Q8QWNlPiBhZGRBY2VzLCBMaXN0PEFjZT4gcmVtb3ZlQWNlcywgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBzZXRBY2woTGlzdDxBY2U+IGFjZXMpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koT2JqZWN0SWQgcG9saWN5SWQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKGJvb2xlYW4gYWxsVmVyc2lvbnMpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGdldEFjbCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldFBlcm1pc3Npb25zRm9yUHJpbmNpcGFsKFN0cmluZyBwcmluY2lwYWxJZCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGVybWlzc29uc0ZvclByaW5jaXBhbChTdHJpbmcgcHJpbmNpcGFsSWQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBnZXRBY2woYm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uIGFjdGlvbikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFR5cGUgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBCYXNlVHlwZUlkIGdldEJhc2VUeXBlSWQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlZEJ5KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0Q3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE1vZGlmaWVkQnkoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UG9saWN5PiBnZXRQb2xpY2llcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHk8Pz4+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gUHJvcGVydHk8VD4gZ2V0UHJvcGVydHkoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyA8VD4gVCBnZXRQcm9wZXJ0eVZhbHVlKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRSZWZyZXNoVGltZXN0YW1wKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZWxhdGlvbnNoaXA+IGdldFJlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtSXRlcmFibGU8UmVsYXRpb25zaGlwPiBnZXRSZWxhdGlvbnNoaXBzKGJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgT2JqZWN0VHlwZSB0eXBlLCBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uPiBnZXRSZW5kaXRpb25zKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0VHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTZWNvbmRhcnlUeXBlPiBnZXRTZWNvbmRhcnlUeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0VHlwZT4gZmluZE9iamVjdFR5cGUoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBnZXRFeHRlbnNpb25zKEV4dGVuc2lvbkxldmVsIGxldmVsKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoSWZPbGQobG9uZyBkdXJhdGlvbkluTWlsbGlzKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIHJlbW92ZUFjbChMaXN0PEFjZT4gcmVtb3ZlQWNlcywgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdElkIHVwZGF0ZVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IHVwZGF0ZVByb3BlcnRpZXMoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0SWQgdXBkYXRlUHJvcGVydGllcyhNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBib29sZWFuIHJlZnJlc2gpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3QgcmVuYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJZCByZW5hbWUoU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gcmVmcmVzaCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShPYmplY3RJZC4uLiBwb2xpY3lJZHMpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBvbGljeShPYmplY3RJZC4uLiBwb2xpY3lJZHMpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IFQgZ2V0QWRhcHRlcihDbGFzczxUPiBhZGFwdGVySW50ZXJmYWNlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvSXRlbUl0ZXJhYmxlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9JdGVtSXRlcmFibGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDI1YTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jbGllbnQvcnVudGltZS9JdGVtSXRlcmFibGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS51dGlsLkFic3RyYWN0UGFnZUZldGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUudXRpbC5Db2xsZWN0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSXRlbUl0ZXJhYmxlVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSXRlbUl0ZXJhYmxlVGVzdC5jbGFzcyk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAubG9hZChJdGVtSXRlcmFibGVUZXN0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oIi9sb2c0ai5wcm9wZXJ0aWVzIikpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0eUNvbmZpZ3VyYXRvci5jb25maWd1cmUocCk7Ci0KLSAgICB9Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBkYXRhMTAgPSB7ICJBMCIsICJBMSIsICJBMiIsICJBMyIsICJBNCIsICJBNSIsICJBNiIsICJBNyIsICJBOCIsICJBOSIgfTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGRhdGExID0geyAiQTAiIH07Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBkYXRhMCA9IHt9OwotCi0gICAgcHJpdmF0ZSBJdGVtSXRlcmFibGU8U3RyaW5nPiBnZXRJdGVyYWJsZShmaW5hbCBTdHJpbmdbXSBkYXRhLCBsb25nIHBhZ2VTaXplKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbkl0ZXJhYmxlPFN0cmluZz4obmV3IEFic3RyYWN0UGFnZUZldGNoZXI8U3RyaW5nPihwYWdlU2l6ZSkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBQYWdlPFN0cmluZz4gZmV0Y2hQYWdlKGxvbmcgc2tpcENvdW50KSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNNb3JlSXRlbXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYWdlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICBJdGVtSXRlcmFibGVUZXN0LkxPRy5pbmZvKCIoIiArIHNraXBDb3VudCArICJ8IiArIHRoaXMubWF4TnVtSXRlbXMgKyAiKSAiKTsKLQotICAgICAgICAgICAgICAgIGludCBmcm9tID0gKGludCkgc2tpcENvdW50OwotICAgICAgICAgICAgICAgIGludCB0byA9IChpbnQpIChza2lwQ291bnQgKyB0aGlzLm1heE51bUl0ZW1zKTsKLQotICAgICAgICAgICAgICAgIGlmICh0byA+PSBkYXRhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICB0byA9IGRhdGEubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBoYXNNb3JlSXRlbXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyAuIHNpbXVsYXRlIHJvbGxpbmcgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIChmb3IgcmVwb3NpdG9yaWVzCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBkb24ndCBuZWNlc3NhcmlseSBrbm93IHVwIGZyb250KQotICAgICAgICAgICAgICAgIGludCB0b3RhbEl0ZW1zID0gKHRvID09IGRhdGEubGVuZ3RoKSA/IHRvIDogdG8gKyAxOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2UuYWRkKGRhdGFbaV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFBhZ2U8U3RyaW5nPiByZXN1bHQgPSBuZXcgQWJzdHJhY3RQYWdlRmV0Y2hlci5QYWdlPFN0cmluZz4oCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLCB0b3RhbEl0ZW1zLCBoYXNNb3JlSXRlbXMpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBsb29wQWxsKCkgewotICAgICAgICB0aGlzLmxvb3BBbGwodGhpcy5kYXRhMTAsIDEwMCk7IC8vIHRvbGVyYXRlIG91dCBvZiBib3VuZAotICAgICAgICB0aGlzLmxvb3BBbGwodGhpcy5kYXRhMTAsIDEwKTsKLSAgICAgICAgdGhpcy5sb29wQWxsKHRoaXMuZGF0YTEwLCA5KTsKLSAgICAgICAgdGhpcy5sb29wQWxsKHRoaXMuZGF0YTEwLCA4KTsKLQotICAgICAgICB0aGlzLmxvb3BBbGwodGhpcy5kYXRhMTAsIDIpOwotICAgICAgICB0aGlzLmxvb3BBbGwodGhpcy5kYXRhMTAsIDEpOwotICAgICAgICAvLyB0aGlzLmxvb3BBbGwoMCk7IG1heE51bUl0ZW1zIG11c3QgYmUgPiAwCi0KLSAgICAgICAgdGhpcy5sb29wQWxsKHRoaXMuZGF0YTEsIDEpOwotICAgICAgICB0aGlzLmxvb3BBbGwodGhpcy5kYXRhMSwgNSk7Ci0KLSAgICAgICAgdGhpcy5sb29wQWxsKHRoaXMuZGF0YTAsIDEpOwotICAgICAgICB0aGlzLmxvb3BBbGwodGhpcy5kYXRhMCwgNSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBsb29wU3ViUGFnZSgpIHsKLSAgICAgICAgdGhpcy5sb29wU3ViUGFnZSh0aGlzLmRhdGExMCwgMCwgMywgNSk7Ci0gICAgICAgIHRoaXMubG9vcFN1YlBhZ2UodGhpcy5kYXRhMTAsIDIsIDMsIDUpOwotICAgICAgICB0aGlzLmxvb3BTdWJQYWdlKHRoaXMuZGF0YTEwLCA5LCAzLCA1KTsKLSAgICAgICAgdGhpcy5sb29wU3ViUGFnZSh0aGlzLmRhdGExMCwgMTAsIDMsIDUpOwotCi0gICAgICAgIHRoaXMubG9vcFN1YlBhZ2UodGhpcy5kYXRhMTAsIDIsIDMsIDMpOwotICAgICAgICB0aGlzLmxvb3BTdWJQYWdlKHRoaXMuZGF0YTEwLCAyLCAxMDAwLCAxMDAwKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGxvb3BTa2lwKCkgewotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEwLCAwLCA1KTsKLSAgICAgICAgdGhpcy5sb29wU2tpcCh0aGlzLmRhdGExMCwgMSwgNSk7Ci0gICAgICAgIHRoaXMubG9vcFNraXAodGhpcy5kYXRhMTAsIDIsIDUpOwotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEwLCAzLCA1KTsKLQotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEwLCA4LCA1KTsKLSAgICAgICAgdGhpcy5sb29wU2tpcCh0aGlzLmRhdGExMCwgOSwgNSk7Ci0gICAgICAgIHRoaXMubG9vcFNraXAodGhpcy5kYXRhMTAsIDEwLCA1KTsKLSAgICAgICAgLy8gdGhpcy5sb29wU2tpcCgxMDAsIDUpOyBza2lwIG91dCBvZiBib3VuZAotCi0gICAgICAgIC8vIHRoaXMubG9vcFNraXAoMCwgMCk7Ci0gICAgICAgIHRoaXMubG9vcFNraXAodGhpcy5kYXRhMTAsIDAsIDEpOwotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEwLCAwLCAxMCk7Ci0gICAgICAgIHRoaXMubG9vcFNraXAodGhpcy5kYXRhMTAsIDAsIDEwMCk7Ci0KLSAgICAgICAgLy8gdGhpcy5sb29wU2tpcCgwLCAwKTsKLSAgICAgICAgdGhpcy5sb29wU2tpcCh0aGlzLmRhdGExMCwgMTAsIDEpOwotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEwLCAxMCwgMTApOwotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEwLCAxMCwgMTAwKTsKLQotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEsIDAsIDUpOwotICAgICAgICB0aGlzLmxvb3BTa2lwKHRoaXMuZGF0YTEsIDEsIDUpOwotCi0gICAgICAgIHRoaXMubG9vcFNraXAodGhpcy5kYXRhMCwgMCwgNSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBsb29wUGFnZSgpIHsKLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExMCwgMCwgNSk7Ci0gICAgICAgIHRoaXMubG9vcFBhZ2UodGhpcy5kYXRhMTAsIDEsIDUpOwotICAgICAgICB0aGlzLmxvb3BQYWdlKHRoaXMuZGF0YTEwLCAyLCA1KTsKLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExMCwgMywgNSk7Ci0KLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExMCwgOCwgNSk7Ci0gICAgICAgIHRoaXMubG9vcFBhZ2UodGhpcy5kYXRhMTAsIDksIDUpOwotICAgICAgICB0aGlzLmxvb3BQYWdlKHRoaXMuZGF0YTEwLCAxMCwgNSk7Ci0gICAgICAgIC8vIHRoaXMubG9vcFBhZ2UoMTAwLCA1KTsgc2tpcCBvdXQgb2YgYm91bmQKLQotICAgICAgICAvLyB0aGlzLmxvb3BQYWdlKDAsIDApOwotICAgICAgICB0aGlzLmxvb3BQYWdlKHRoaXMuZGF0YTEwLCAwLCAxKTsKLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExMCwgMCwgMTApOwotICAgICAgICB0aGlzLmxvb3BQYWdlKHRoaXMuZGF0YTEwLCAwLCAxMDApOwotCi0gICAgICAgIC8vIHRoaXMubG9vcFBhZ2UoMCwgMCk7Ci0gICAgICAgIHRoaXMubG9vcFBhZ2UodGhpcy5kYXRhMTAsIDEwLCAxKTsKLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExMCwgMTAsIDEwKTsKLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExMCwgMTAsIDEwMCk7Ci0KLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExLCAwLCA1KTsKLSAgICAgICAgdGhpcy5sb29wUGFnZSh0aGlzLmRhdGExLCAxLCA1KTsKLQotICAgICAgICB0aGlzLmxvb3BQYWdlKHRoaXMuZGF0YTAsIDAsIDUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdG90YWxOdW1JdGVtcygpIHsKLSAgICAgICAgSXRlbUl0ZXJhYmxlVGVzdC5MT0cuaW5mbygidG90YWxOdW1JdGVtcyIpOwotCi0gICAgICAgIGludCBwYWdlU2l6ZSA9IDU7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxTdHJpbmc+IHAgPSB0aGlzLmdldEl0ZXJhYmxlKHRoaXMuZGF0YTEwLCBwYWdlU2l6ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocCk7Ci0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaSA9IHAuaXRlcmF0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VTaXplICsgMSwgcC5nZXRUb3RhbE51bUl0ZW1zKCkpOwotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpLmhhc05leHQoKSAmJiBpZHggPCAocGFnZVNpemUgKyAxKTsgaWR4KyspIHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaS5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyh0aGlzLmRhdGExMC5sZW5ndGgsIHAuZ2V0VG90YWxOdW1JdGVtcygpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGhhc01vcmVJdGVtcygpIHsKLSAgICAgICAgSXRlbUl0ZXJhYmxlVGVzdC5MT0cuaW5mbygidG90YWxIYXNNb3JlSXRlbXMiKTsKLQotICAgICAgICBpbnQgcGFnZVNpemUgPSA1OwotICAgICAgICBJdGVtSXRlcmFibGU8U3RyaW5nPiBwID0gdGhpcy5nZXRJdGVyYWJsZSh0aGlzLmRhdGExMCwgcGFnZVNpemUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHApOwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGkgPSBwLml0ZXJhdG9yKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaSk7Ci0gICAgICAgIGFzc2VydFRydWUocC5nZXRIYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGkuaGFzTmV4dCgpICYmIGlkeCA8IChwYWdlU2l6ZSArIDEpOyBpZHgrKykgewotICAgICAgICAgICAgaS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RmFsc2UocC5nZXRIYXNNb3JlSXRlbXMoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBwYWdlTnVtSXRlbXMoKSB7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZVRlc3QuTE9HLmluZm8oInRvdGFsUGFnZU51bUl0ZW1zIik7Ci0KLSAgICAgICAgaW50IHBhZ2VTaXplID0gNzsKLSAgICAgICAgSXRlbUl0ZXJhYmxlPFN0cmluZz4gcCA9IHRoaXMuZ2V0SXRlcmFibGUodGhpcy5kYXRhMTAsIHBhZ2VTaXplKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpID0gcC5pdGVyYXRvcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFnZVNpemUsIHAuZ2V0UGFnZU51bUl0ZW1zKCkpOwotICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpLmhhc05leHQoKSAmJiBpZHggPCAocGFnZVNpemUgKyAxKTsgaWR4KyspIHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaS5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyh0aGlzLmRhdGExMC5sZW5ndGggLSBwYWdlU2l6ZSwgcC5nZXRQYWdlTnVtSXRlbXMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvb3BTdWJQYWdlKFN0cmluZ1tdIGRhdGEsIGludCBza2lwQ291bnQsIGludCBtYXhJdGVtcywgaW50IHBhZ2VTaXplKSB7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZVRlc3QuTE9HLmluZm8oImxvb3BTdWJQYWdlICgiICsgc2tpcENvdW50ICsgIiwgIiArIG1heEl0ZW1zICsgIiwgIiArIHBhZ2VTaXplICsgIikiKTsKLSAgICAgICAgU3RyaW5nIG1zZyA9ICIiOwotCi0gICAgICAgIEl0ZW1JdGVyYWJsZTxTdHJpbmc+IHAgPSB0aGlzLmdldEl0ZXJhYmxlKGRhdGEsIHBhZ2VTaXplKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKLSAgICAgICAgSXRlbUl0ZXJhYmxlPFN0cmluZz4gcHAgPSBwLnNraXBUbyhza2lwQ291bnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBwKTsKLSAgICAgICAgSXRlbUl0ZXJhYmxlPFN0cmluZz4gcHBwID0gcHAuZ2V0UGFnZShtYXhJdGVtcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHBwKTsKLQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogcHBwKSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiArIChjb3VudCArIHNraXBDb3VudCksIHMpOwotICAgICAgICAgICAgbXNnICs9IChzICsgIiAiKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlbUl0ZXJhYmxlVGVzdC5MT0cuaW5mbyhtc2cpOwotICAgICAgICBhc3NlcnRUcnVlKGNvdW50IDw9IHBhZ2VTaXplKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9vcFNraXAoU3RyaW5nW10gZGF0YSwgaW50IHNraXBDb3VudCwgaW50IHBhZ2VTaXplKSB7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZVRlc3QuTE9HLmluZm8oImxvb3BTa2lwICgiICsgc2tpcENvdW50ICsgIiwgIiArIHBhZ2VTaXplICsgIikiKTsKLSAgICAgICAgU3RyaW5nIG1zZyA9ICIiOwotCi0gICAgICAgIEl0ZW1JdGVyYWJsZTxTdHJpbmc+IHAgPSB0aGlzLmdldEl0ZXJhYmxlKGRhdGEsIHBhZ2VTaXplKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKLSAgICAgICAgSXRlbUl0ZXJhYmxlPFN0cmluZz4gcHAgPSBwLnNraXBUbyhza2lwQ291bnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBwKTsKLQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogcHApIHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkEiICsgKGNvdW50ICsgc2tpcENvdW50KSwgcyk7Ci0gICAgICAgICAgICBtc2cgKz0gKHMgKyAiICIpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBJdGVtSXRlcmFibGVUZXN0LkxPRy5pbmZvKG1zZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCAtIHNraXBDb3VudCwgY291bnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb29wQWxsKFN0cmluZ1tdIGRhdGEsIGludCBwYWdlU2l6ZSkgewotICAgICAgICBJdGVtSXRlcmFibGVUZXN0LkxPRy5pbmZvKCJsb29wQWxsICgiICsgcGFnZVNpemUgKyAiKSIpOwotICAgICAgICBTdHJpbmcgbXNnID0gIiI7Ci0KLSAgICAgICAgSXRlbUl0ZXJhYmxlPFN0cmluZz4gcCA9IHRoaXMuZ2V0SXRlcmFibGUoZGF0YSwgcGFnZVNpemUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHApOwotCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoU3RyaW5nIHMgOiBwKSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIiArIGNvdW50LCBzKTsKLSAgICAgICAgICAgIG1zZyArPSAocyArICIgIik7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIEl0ZW1JdGVyYWJsZVRlc3QuTE9HLmluZm8obXNnKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBjb3VudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvb3BQYWdlKFN0cmluZ1tdIGRhdGEsIGludCBza2lwQ291bnQsIGludCBwYWdlU2l6ZSkgewotICAgICAgICBJdGVtSXRlcmFibGVUZXN0LkxPRy5pbmZvKCJsb29wUGFnZSAoIiArIHNraXBDb3VudCArICIsICIgKyBwYWdlU2l6ZSArICIpIik7Ci0gICAgICAgIFN0cmluZyBtc2cgPSAiIjsKLQotICAgICAgICBJdGVtSXRlcmFibGU8U3RyaW5nPiBwID0gdGhpcy5nZXRJdGVyYWJsZShkYXRhLCBwYWdlU2l6ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocCk7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxTdHJpbmc+IHBwID0gcC5za2lwVG8oc2tpcENvdW50KS5nZXRQYWdlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHApOwotCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoU3RyaW5nIHMgOiBwcCkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQSIgKyAoY291bnQgKyBza2lwQ291bnQpLCBzKTsKLSAgICAgICAgICAgIG1zZyArPSAocyArICIgIik7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIEl0ZW1JdGVyYWJsZVRlc3QuTE9HLmluZm8obXNnKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKGRhdGEubGVuZ3RoIC0gc2tpcENvdW50LCBwYWdlU2l6ZSksIGNvdW50KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUXVlcnlTdGF0ZW1lbnRUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1F1ZXJ5U3RhdGVtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzE0ZjQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvUXVlcnlTdGF0ZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUXVlcnlTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgUXVlcnlTdGF0ZW1lbnRUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY1F1ZXJpZXMoKSB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG5ldyBTZXNzaW9uSW1wbChuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBxdWVyeTsKLSAgICAgICAgUXVlcnlTdGF0ZW1lbnQgc3Q7Ci0KLSAgICAgICAgcXVlcnkgPSAiU0VMRUNUIGNtaXM6bmFtZSBGUk9NIGNtaXM6Zm9sZGVyIjsKLSAgICAgICAgc3QgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHF1ZXJ5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHF1ZXJ5LCBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotCi0gICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBjbWlzOmNyZWF0ZWRCeSA9IFwnYWRtaW5cJyBBTkQgYWJjOmludCA9IDQyIjsKLSAgICAgICAgc3QgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHF1ZXJ5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHF1ZXJ5LCBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotCi0gICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6dGVzdCA9ICd4P3onIjsKLSAgICAgICAgc3QgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHF1ZXJ5KTsKLSAgICAgICAgc3Quc2V0U3RyaW5nKDEsICJ5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhxdWVyeSwgc3QudG9RdWVyeVN0cmluZygpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXaGVyZVBsYWNob2xkZXIoKSB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG5ldyBTZXNzaW9uSW1wbChuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBxdWVyeTsKLSAgICAgICAgUXVlcnlTdGF0ZW1lbnQgc3Q7Ci0KLSAgICAgICAgLy8gc3RyaW5ncwotICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOnN0cmluZyA9ID8iOwotICAgICAgICBzdCA9IG5ldyBRdWVyeVN0YXRlbWVudEltcGwoc2Vzc2lvbiwgcXVlcnkpOwotICAgICAgICBzdC5zZXRTdHJpbmcoMSwgInRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOnN0cmluZyA9ICd0ZXN0JyIsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICAgICAgcXVlcnkgPSAiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIGFiYzpzdHJpbmcgPSA/IjsKLSAgICAgICAgc3QgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHF1ZXJ5KTsKLSAgICAgICAgc3Quc2V0U3RyaW5nKDEsICJ0ZSdzdCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6c3RyaW5nID0gJ3RlXFwnc3QnIiwgc3QudG9RdWVyeVN0cmluZygpKTsKLQotICAgICAgICAvLyBsaWtlcwotICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOnN0cmluZyBMSUtFID8iOwotICAgICAgICBzdCA9IG5ldyBRdWVyeVN0YXRlbWVudEltcGwoc2Vzc2lvbiwgcXVlcnkpOwotICAgICAgICBzdC5zZXRTdHJpbmdMaWtlKDEsICIldGVzdCUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOnN0cmluZyBMSUtFICcldGVzdCUnIiwgc3QudG9RdWVyeVN0cmluZygpKTsKLQotICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOnN0cmluZyBMSUtFID8iOwotICAgICAgICBzdCA9IG5ldyBRdWVyeVN0YXRlbWVudEltcGwoc2Vzc2lvbiwgcXVlcnkpOwotICAgICAgICBzdC5zZXRTdHJpbmdMaWtlKDEsICJcXF90ZXN0XFwlYmxhaFxcXFxibGFoIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIGFiYzpzdHJpbmcgTElLRSAnXFxfdGVzdFxcJWJsYWhcXFxcXFxcXGJsYWgnIiwKLSAgICAgICAgICAgICAgICBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotCi0gICAgICAgIC8vIGNvbnRhaW5zCi0KLSAgICAgICAgLy8gKiwgPyBhbmQgLSBhcmUgdHJlYXRlZCBhcyB0ZXh0IHNlYXJjaCBvcGVyYXRvcnM6IDFzdCBsZXZlbCBlc2NhcGluZzoKLSAgICAgICAgLy8gbm9uZSwgMm5kIGxldmVsIGVzY2FwaW5nOiBub25lCi0gICAgICAgIC8vIFwqLCBcPyBhbmQgXC0gYXJlIHVzZWQgYXMgbGl0ZXJhbHMsIDFzdCBsZXZlbCBlc2NhcGluZzogbm9uZSwgMm5kCi0gICAgICAgIC8vIGxldmVsIGVzY2FwaW5nOiBcXCosIFxcPywgXFwtCi0gICAgICAgIC8vICcgYW5kICIgYXJlIHVzZWQgYXMgbGl0ZXJhbHMsIDFzdCBsZXZlbCBlc2NhcGluZzogXCcsIFwiLCAybmQgbGV2ZWwKLSAgICAgICAgLy8gZXNjYXBpbmc6IFxcXCcsIFxcXCIsCi0gICAgICAgIC8vIFwgcGx1cyBhbnkgb3RoZXIgY2hhcmFjdGVyLCAxc3QgbGV2ZWwgZXNjYXBpbmcgXFwgcGx1cyBjaGFyYWN0ZXIsIDJuZAotICAgICAgICAvLyBsZXZlbDogXFxcXCBwbHVzIGNoYXJhY3RlcgotCi0gICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBDT05UQUlOUyg/KSI7Ci0gICAgICAgIHN0ID0gbmV3IFF1ZXJ5U3RhdGVtZW50SW1wbChzZXNzaW9uLCBxdWVyeSk7Ci0gICAgICAgIHN0LnNldFN0cmluZ0NvbnRhaW5zKDEsICJKb2huJ3MiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgQ09OVEFJTlMoJ0pvaG5cXFxcXFwncycpIiwgc3QudG9RdWVyeVN0cmluZygpKTsKLSAgICAgICAgc3Quc2V0U3RyaW5nQ29udGFpbnMoMSwgImZvbyAtYmFyIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIENPTlRBSU5TKCdmb28gLWJhcicpIiwgc3QudG9RdWVyeVN0cmluZygpKTsKLSAgICAgICAgc3Quc2V0U3RyaW5nQ29udGFpbnMoMSwgImZvbyoiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgQ09OVEFJTlMoJ2ZvbyonKSIsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0gICAgICAgIHN0LnNldFN0cmluZ0NvbnRhaW5zKDEsICJmb28/Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIENPTlRBSU5TKCdmb28/JykiLCBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotICAgICAgICBzdC5zZXRTdHJpbmdDb250YWlucygxLCAiZm9vXFwtYmFyIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIENPTlRBSU5TKCdmb29cXFxcLWJhcicpIiwgc3QudG9RdWVyeVN0cmluZygpKTsKLSAgICAgICAgc3Quc2V0U3RyaW5nQ29udGFpbnMoMSwgImZvb1xcKiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBDT05UQUlOUygnZm9vXFxcXConKSIsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0gICAgICAgIHN0LnNldFN0cmluZ0NvbnRhaW5zKDEsICJmb29cXD8iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgQ09OVEFJTlMoJ2Zvb1xcXFw/JykiLCBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotICAgICAgICBzdC5zZXRTdHJpbmdDb250YWlucygxLCAiXCJDb29sXCIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgQ09OVEFJTlMoJ1xcXFxcXFwiQ29vbFxcXFxcXFwiJykiLCBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotICAgICAgICBzdC5zZXRTdHJpbmdDb250YWlucygxLCAiYzpcXE15RGN1bWVudHMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgQ09OVEFJTlMoJ2M6XFxcXE15RGN1bWVudHMnKSIsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gaWRzCi0gICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6aWQgPSA/IjsKLSAgICAgICAgc3QgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHF1ZXJ5KTsKLSAgICAgICAgc3Quc2V0SWQoMSwgbmV3IE9iamVjdElkSW1wbCgiMTIzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6aWQgPSAnMTIzJyIsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gYm9vbGVhbnMKLSAgICAgICAgcXVlcnkgPSAiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIGFiYzpib29sID0gPyI7Ci0gICAgICAgIHN0ID0gbmV3IFF1ZXJ5U3RhdGVtZW50SW1wbChzZXNzaW9uLCBxdWVyeSk7Ci0gICAgICAgIHN0LnNldEJvb2xlYW4oMSwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIGFiYzpib29sID0gVFJVRSIsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gbnVtYmVycwotICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOmludCA9ID8gQU5EIGFiYzppbnQyID0gMTIzIjsKLSAgICAgICAgc3QgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHF1ZXJ5KTsKLSAgICAgICAgc3Quc2V0TnVtYmVyKDEsIDQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOmludCA9IDQyIEFORCBhYmM6aW50MiA9IDEyMyIsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gZGF0ZVRpbWUKLSAgICAgICAgcXVlcnkgPSAiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIGFiYzpkYXRlVGltZSA9IFRJTUVTVEFNUCA/IjsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgIGNhbC5jbGVhcigpOwotICAgICAgICBjYWwuc2V0KDIwMTIsIDEsIDIsIDMsIDQsIDUpOwotCi0gICAgICAgIHN0ID0gbmV3IFF1ZXJ5U3RhdGVtZW50SW1wbChzZXNzaW9uLCBxdWVyeSk7Ci0gICAgICAgIHN0LnNldERhdGVUaW1lKDEsIGNhbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIGFiYzpkYXRlVGltZSA9IFRJTUVTVEFNUCAnMjAxMi0wMi0wMlQwMzowNDowNS4wMDBaJyIsCi0gICAgICAgICAgICAgICAgc3QudG9RdWVyeVN0cmluZygpKTsKLQotICAgICAgICBzdCA9IG5ldyBRdWVyeVN0YXRlbWVudEltcGwoc2Vzc2lvbiwgcXVlcnkpOwotICAgICAgICBzdC5zZXREYXRlVGltZSgxLCBjYWwuZ2V0VGltZUluTWlsbGlzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6ZGF0ZVRpbWUgPSBUSU1FU1RBTVAgJzIwMTItMDItMDJUMDM6MDQ6MDUuMDAwWiciLAotICAgICAgICAgICAgICAgIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gZGF0ZVRpbWUgVGltZXN0YW1wCi0gICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6ZGF0ZVRpbWUgPSA/IjsKLQotICAgICAgICBzdCA9IG5ldyBRdWVyeVN0YXRlbWVudEltcGwoc2Vzc2lvbiwgcXVlcnkpOwotICAgICAgICBzdC5zZXREYXRlVGltZVRpbWVzdGFtcCgxLCBjYWwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6ZGF0ZVRpbWUgPSBUSU1FU1RBTVAgJzIwMTItMDItMDJUMDM6MDQ6MDUuMDAwWiciLAotICAgICAgICAgICAgICAgIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICAgICAgc3QgPSBuZXcgUXVlcnlTdGF0ZW1lbnRJbXBsKHNlc3Npb24sIHF1ZXJ5KTsKLSAgICAgICAgc3Quc2V0RGF0ZVRpbWVUaW1lc3RhbXAoMSwgY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOmRhdGVUaW1lID0gVElNRVNUQU1QICcyMDEyLTAyLTAyVDAzOjA0OjA1LjAwMFonIiwKLSAgICAgICAgICAgICAgICBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotCi0gICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBhYmM6ZGF0ZVRpbWUgSU4gKD8pIjsKLQotICAgICAgICBzdCA9IG5ldyBRdWVyeVN0YXRlbWVudEltcGwoc2Vzc2lvbiwgcXVlcnkpOwotICAgICAgICBzdC5zZXREYXRlVGltZVRpbWVzdGFtcCgxLCBjYWwuZ2V0VGltZSgpLCBjYWwuZ2V0VGltZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYWJjOmRhdGVUaW1lICIKLSAgICAgICAgICAgICAgICArICJJTiAoVElNRVNUQU1QICcyMDEyLTAyLTAyVDAzOjA0OjA1LjAwMFonLFRJTUVTVEFNUCAnMjAxMi0wMi0wMlQwMzowNDowNS4wMDBaJykiLCBzdC50b1F1ZXJ5U3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8vIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5QXBpRXNjYXBpbmcoKSB7Ci0gICAgICAgIC8vIGNvbnRhaW5zCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IG5ldyBTZXNzaW9uSW1wbChuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBDT05UQUlOUyg/KSI7Ci0gICAgICAgIFN0cmluZyBzcyA9ICJhXFx4YyI7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBzcy5sZW5ndGgoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzcyk7Ci0gICAgICAgIFF1ZXJ5U3RhdGVtZW50IHN0ID0gbmV3IFF1ZXJ5U3RhdGVtZW50SW1wbChzZXNzaW9uLCBxdWVyeSk7Ci0gICAgICAgIHN0LnNldFN0cmluZ0NvbnRhaW5zKDEsICJKb2huJ3MiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXRTdHJpbmdDb250YWluczogIiArIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgQ09OVEFJTlMoJ0pvaG5cXFwncycpIjsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZDogIiArIGV4cGVjdGVkKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN0LnRvUXVlcnlTdHJpbmcoKSk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvU2Vzc2lvbkZhY3RvcnlGaW5kZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9ydW50aW1lL1Nlc3Npb25GYWN0b3J5RmluZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTY4ZTMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvU2Vzc2lvbkZhY3RvcnlGaW5kZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5TZXNzaW9uRmFjdG9yeUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uRmFjdG9yeUZpbmRlclRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZCgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU2Vzc2lvbkZhY3Rvcnkgc2YgPSBTZXNzaW9uRmFjdG9yeUZpbmRlci5maW5kKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZik7Ci0gICAgICAgIGFzc2VydFRydWUoc2YgaW5zdGFuY2VvZiBTZXNzaW9uRmFjdG9yeUltcGwpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRXaXRoQ2xhc3Nsb2FkZXIoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlc3Npb25GYWN0b3J5IHNmID0gU2Vzc2lvbkZhY3RvcnlGaW5kZXIuZmluZChudWxsLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZik7Ci0gICAgICAgIGFzc2VydFRydWUoc2YgaW5zdGFuY2VvZiBTZXNzaW9uRmFjdG9yeUltcGwpOwotICAgIH0KLQotICAgIEBUZXN0KCkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFdpdGhQcm9wZXJ0eTEoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5jaGVtaXN0cnkudGVzdC5zZXNzaW9uZmFjdG9yeTEiLCBNb2NrU2Vzc2lvbkZhY3RvcnkxLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgU2Vzc2lvbkZhY3Rvcnkgc2YgPSBTZXNzaW9uRmFjdG9yeUZpbmRlci5maW5kKCJvcmcuYXBhY2hlLmNoZW1pc3RyeS50ZXN0LnNlc3Npb25mYWN0b3J5MSIpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2YpOwotICAgICAgICBhc3NlcnRUcnVlKHNmIGluc3RhbmNlb2YgTW9ja1Nlc3Npb25GYWN0b3J5MSk7Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kV2l0aFByb3BlcnR5MigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNoZW1pc3RyeS50ZXN0LnNlc3Npb25mYWN0b3J5MiIsIFNlc3Npb25GYWN0b3J5RmluZGVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIFNlc3Npb25GYWN0b3J5RmluZGVyLmZpbmQoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5LnRlc3Quc2Vzc2lvbmZhY3RvcnkyIik7Ci0gICAgfQotCi0gICAgQFRlc3QoKQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kV2l0aFByb3BlcnR5MygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNoZW1pc3RyeS50ZXN0LnNlc3Npb25mYWN0b3J5MyIsIE1vY2tTZXNzaW9uRmFjdG9yeTIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBTZXNzaW9uRmFjdG9yeSBzZiA9IFNlc3Npb25GYWN0b3J5RmluZGVyLmZpbmQoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5LnRlc3Quc2Vzc2lvbmZhY3RvcnkzIik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZik7Ci0gICAgICAgIGFzc2VydFRydWUoc2YgaW5zdGFuY2VvZiBNb2NrU2Vzc2lvbkZhY3RvcnkyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tTZXNzaW9uRmFjdG9yeTEgaW1wbGVtZW50cyBTZXNzaW9uRmFjdG9yeSB7Ci0KLSAgICAgICAgcHVibGljIE1vY2tTZXNzaW9uRmFjdG9yeTEoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5PiBnZXRSZXBvc2l0b3JpZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja1Nlc3Npb25GYWN0b3J5MiBleHRlbmRzIFNlc3Npb25GYWN0b3J5SW1wbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBNb2NrU2Vzc2lvbkZhY3RvcnkyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBNb2NrU2Vzc2lvbkZhY3RvcnkyIG5ld0luc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2NrU2Vzc2lvbkZhY3RvcnkyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Q0MmU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jc2FtcGxlIGxvZzRqLnByb3BlcnRpZXMKLQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8KLQotIyBTdGRvdXQKLWxvZzRqLmFwcGVuZGVyLk89b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBGaWxlCi1sb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuUi5GaWxlPWxvZzRqLmxvZwotCi0jIENvbnRyb2wgdGhlIG1heGltdW0gbG9nIGZpbGUgc2l6ZQotbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT0xMDBLQgotCi0jIEFyY2hpdmUgbG9nIGZpbGVzIChvbmUgYmFja3VwIGZpbGUgaGVyZSkKLWxvZzRqLmFwcGVuZGVyLlIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5PLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgWyV0XSAlYzogJW0lbgotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuCi0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucHJvdmlkZXIuc3BpPU8KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTgwMDcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIENvbW1vbnMgQVBJPC9uYW1lPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GPC9tYW5pZmVzdEZpbGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4gCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAKLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7ZmVsaXgucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YnVuZGxlLW1hbmlmZXN0PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLWNsYXNzZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1hbmlmZXN0PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvRXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLURvY1VSTD4ke3Byb2plY3QudXJsfTwvQnVuZGxlLURvY1VSTD4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL0Jhc2ljUGVybWlzc2lvbnMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvQmFzaWNQZXJtaXNzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNmOTJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvQmFzaWNQZXJtaXNzaW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnM7Ci0KLS8qKgotICogQ01JUyBiYXNpYyBwZXJtaXNzaW9ucyBjb25zdGFudHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCYXNpY1Blcm1pc3Npb25zIHsKLQotICAgIHByaXZhdGUgQmFzaWNQZXJtaXNzaW9ucygpIHsKLSAgICB9Ci0KLSAgICAvKiogQ01JUyByZWFkIHBlcm1pc3Npb24ge0Bjb2RlIGNtaXM6cmVhZH0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRCA9ICJjbWlzOnJlYWQiOwotICAgIC8qKiBDTUlTIHdyaXRlIHBlcm1pc3Npb24ge0Bjb2RlIGNtaXM6d3JpdGV9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFID0gImNtaXM6d3JpdGUiOwotICAgIC8qKiBDTUlTIGFsbCBwZXJtaXNzaW9uIHtAY29kZSBjbWlzOmFsbH0uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gImNtaXM6YWxsIjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvRXh0ZW5zaW9uRmVhdHVyZXMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvRXh0ZW5zaW9uRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjZmYwZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL0V4dGVuc2lvbkZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNtaXNFeHRlbnNpb25FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25GZWF0dXJlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uRmVhdHVyZXMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHRlbnNpb25GZWF0dXJlIEVYVEVOREVEX0RBVEVUSU1FX0ZPUk1BVCA9IG5ldyBFeHRlbnNpb25GZWF0dXJlKCkgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9leHRlbnNpb24vZGF0ZXRpbWVmb3JtYXQiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotICAgICAgICAgICAgcmV0dXJuICJodHRwczovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3RjX2hvbWUucGhwP3dnX2FiYnJldj1jbWlzIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1vbk5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkJyb3dzZXIgQmluZGluZyBEYXRlVGltZSBGb3JtYXQiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCkgewotICAgICAgICAgICAgcmV0dXJuICIxLjAiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkFkZHMgYW4gYWRkaXRpb25hbCBEYXRlVGltZSBmb3JtYXQgZm9yIHRoZSBCcm93c2VyIEJpbmRpbmcuIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRGZWF0dXJlRGF0YSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbnMoTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9ucykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBnZXRFeHRlbnNpb25zKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHRlbnNpb25GZWF0dXJlIENPTlRFTlRfU1RSRUFNX0hBU0ggPSBuZXcgRXh0ZW5zaW9uRmVhdHVyZSgpIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvZXh0ZW5zaW9uL2NvbnRlbnRzdHJlYW1oYXNoIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy90Y19ob21lLnBocD93Z19hYmJyZXY9Y21pcyI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb21tb25OYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuICJDb250ZW50IFN0cmVhbSBIYXNoIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25MYWJlbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiMS4wIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuICJBZGRzIHRoZSBwcm9wZXJ0eSBjbWlzOmNvbnRlbnRTdHJlYW1IYXNoLCB3aGljaCByZXByZXNlbnRzIHRoZSBoYXNoIG9mIHRoZSBkb2N1bWVudCBjb250ZW50LiI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RmVhdHVyZURhdGEoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25zKExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZ2V0RXh0ZW5zaW9ucygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRXh0ZW5zaW9uRmVhdHVyZSBMQVRFU1RfQUNDRVNTSUJMRV9TVEFURSA9IG5ldyBFeHRlbnNpb25GZWF0dXJlKCkgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9leHRlbnNpb24vbGF0ZXN0QWNjZXNzaWJsZVN0YXRlLzEuMSI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gImh0dHBzOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvdGNfaG9tZS5waHA/d2dfYWJicmV2PWNtaXMiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbW9uTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiTGF0ZXN0IEFjY2Vzc2libGUgU3RhdGUiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCkgewotICAgICAgICAgICAgcmV0dXJuICIxLjEiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRoaXMgZXh0ZW5zaW9uIHByb3ZpZGVzIGZvciBhbiBpZGVudGlmaWVyIG9mIGVhY2ggY21pczpkb2N1bWVudCB0aGF0IHJldHJpZXZlcyAiCi0gICAgICAgICAgICAgICAgICAgICsgInRoZSBsYXRlc3QgYWNjZXNzaWJsZSBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgdmVyc2lvbmVkIG9yIG5vdC4iOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEZlYXR1cmVEYXRhKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9ucyhMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBleHRlbnNpb25zKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGdldEV4dGVuc2lvbnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH07Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL1Byb3BlcnR5SWRzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL1Byb3BlcnR5SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTA4ZjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9Qcm9wZXJ0eUlkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zOwotCi0vKioKLSAqIENNSVMgcHJvcGVydHkgaWQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlJZHMgewotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eUlkcygpIHsKLSAgICB9Ci0KLSAgICAvLyAtLS0tIGJhc2UgLS0tLQotICAgIC8qKgotICAgICAqIENNSVMgcHJvcGVydHkge0Bjb2RlIGNtaXM6bmFtZX06IG5hbWUgb2YgdGhlIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogc3RyaW5nPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJjbWlzOm5hbWUiOwotICAgIC8qKgotICAgICAqIENNSVMgcHJvcGVydHkge0Bjb2RlIGNtaXM6b2JqZWN0SWR9OiBJRCBvZiB0aGUgb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBpZDxicj4KLSAgICAgKiBKYXZhIHR5cGU6IFN0cmluZwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9JRCA9ICJjbWlzOm9iamVjdElkIjsKLSAgICAvKioKLSAgICAgKiBDTUlTIHByb3BlcnR5IHtAY29kZSBjbWlzOm9iamVjdFR5cGVJZH06IElEIG9mIHByaW1hcnkgdHlwZSBvZiB0aGUKLSAgICAgKiBvYmplY3QuCi0gICAgICogPHA+Ci0gICAgICogQ01JUyBkYXRhIHR5cGU6IGlkPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1RZUEVfSUQgPSAiY21pczpvYmplY3RUeXBlSWQiOwotICAgIC8qKgotICAgICAqIENNSVMgcHJvcGVydHkge0Bjb2RlIGNtaXM6YmFzZVR5cGVJZH06IElEIG9mIHRoZSBiYXNlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogaWQ8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1RZUEVfSUQgPSAiY21pczpiYXNlVHlwZUlkIjsKLSAgICAvKioKLSAgICAgKiBDTUlTIHByb3BlcnR5IHtAY29kZSBjbWlzOmNyZWF0ZWRCeX06IGNyZWF0b3Igb2YgdGhlIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogc3RyaW5nPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRF9CWSA9ICJjbWlzOmNyZWF0ZWRCeSI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpjcmVhdGlvbkRhdGV9OiBjcmVhdGlvbiBkYXRlLgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBkYXRldGltZTxicj4KLSAgICAgKiBKYXZhIHR5cGU6IEdyZWdvcmlhbkNhbGVuZGFyCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fREFURSA9ICJjbWlzOmNyZWF0aW9uRGF0ZSI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpsYXN0TW9kaWZpZWRCeX06IGxhc3QgbW9kaWZpZXIgb2YgdGhlIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogc3RyaW5nPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9NT0RJRklFRF9CWSA9ICJjbWlzOmxhc3RNb2RpZmllZEJ5IjsKLSAgICAvKioKLSAgICAgKiBDTUlTIHByb3BlcnR5IHtAY29kZSBjbWlzOmxhc3RNb2RpZmljYXRpb25EYXRlfTogbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogZGF0ZXRpbWU8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfTU9ESUZJQ0FUSU9OX0RBVEUgPSAiY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZSI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpjaGFuZ2VUb2tlbn06IGNoYW5nZSB0b2tlbiBvZiB0aGUgb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBzdHJpbmc8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfVE9LRU4gPSAiY21pczpjaGFuZ2VUb2tlbiI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBwcm9wZXJ0eSB7QGNvZGUgY21pczpkZXNjcmlwdGlvbn06IGRlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QuCi0gICAgICogPHA+Ci0gICAgICogQ01JUyBkYXRhIHR5cGU6IHN0cmluZzxicj4KLSAgICAgKiBKYXZhIHR5cGU6IFN0cmluZwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImNtaXM6ZGVzY3JpcHRpb24iOwotICAgIC8qKgotICAgICAqIENNSVMgcHJvcGVydHkge0Bjb2RlIGNtaXM6c2Vjb25kYXJ5T2JqZWN0VHlwZUlkc30gKG11bHRpdmFsdWUpOiBsaXN0IG9mCi0gICAgICogSURzIG9mIHRoZSBzZWNvbmRhcnkgdHlwZXMgb2YgdGhlIG9iamVjdC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogaWQ8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTID0gImNtaXM6c2Vjb25kYXJ5T2JqZWN0VHlwZUlkcyI7Ci0KLSAgICAvLyAtLS0tIGRvY3VtZW50IC0tLS0KLSAgICAvKioKLSAgICAgKiBDTUlTIGRvY3VtZW50IHByb3BlcnR5IHtAY29kZSBjbWlzOmlzSW1tdXRhYmxlfTogZmxhZyB0aGUgaW5kaWNhdGVzIGlmCi0gICAgICogdGhlIGRvY3VtZW50IGlzIGltbXV0YWJsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogYm9vbGVhbjxicj4KLSAgICAgKiBKYXZhIHR5cGU6IEJvb2xlYW4KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19JTU1VVEFCTEUgPSAiY21pczppc0ltbXV0YWJsZSI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczppc0xhdGVzdFZlcnNpb259OiBmbGFnIHRoZSBpbmRpY2F0ZXMKLSAgICAgKiBpZiB0aGUgZG9jdW1lbnQgaXMgdGhlIGxhdGVzdCB2ZXJzaW9uLgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBib29sZWFuPGJyPgotICAgICAqIEphdmEgdHlwZTogQm9vbGVhbgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0xBVEVTVF9WRVJTSU9OID0gImNtaXM6aXNMYXRlc3RWZXJzaW9uIjsKLSAgICAvKioKLSAgICAgKiBDTUlTIGRvY3VtZW50IHByb3BlcnR5IHtAY29kZSBjbWlzOmlzTWFqb3JWZXJzaW9ufTogZmxhZyB0aGUgaW5kaWNhdGVzIGlmCi0gICAgICogdGhlIGRvY3VtZW50IGlzIGEgbWFqb3IgdmVyc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogYm9vbGVhbjxicj4KLSAgICAgKiBKYXZhIHR5cGU6IEJvb2xlYW4KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19NQUpPUl9WRVJTSU9OID0gImNtaXM6aXNNYWpvclZlcnNpb24iOwotICAgIC8qKgotICAgICAqIENNSVMgZG9jdW1lbnQgcHJvcGVydHkge0Bjb2RlIGNtaXM6aXNMYXRlc3RNYWpvclZlcnNpb259OiBmbGFnIHRoZQotICAgICAqIGluZGljYXRlcyBpZiB0aGUgZG9jdW1lbnQgaXMgdGhlIGxhdGVzdCBtYWpvciB2ZXJzaW9uLgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBib29sZWFuPGJyPgotICAgICAqIEphdmEgdHlwZTogQm9vbGVhbgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0xBVEVTVF9NQUpPUl9WRVJTSU9OID0gImNtaXM6aXNMYXRlc3RNYWpvclZlcnNpb24iOwotICAgIC8qKgotICAgICAqIENNSVMgZG9jdW1lbnQgcHJvcGVydHkge0Bjb2RlIGNtaXM6dmVyc2lvbkxhYmVsfTogdmVyc2lvbiBsYWJlbCBvZiB0aGUKLSAgICAgKiBkb2N1bWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogc3RyaW5nPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9MQUJFTCA9ICJjbWlzOnZlcnNpb25MYWJlbCI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczp2ZXJzaW9uU2VyaWVzSWR9OiBJRCBvZiB0aGUgdmVyc2lvbgotICAgICAqIHNlcmllcy4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogaWQ8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1NFUklFU19JRCA9ICJjbWlzOnZlcnNpb25TZXJpZXNJZCI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczppc1ZlcnNpb25TZXJpZXNDaGVja2VkT3V0fTogZmxhZyB0aGUKLSAgICAgKiBpbmRpY2F0ZXMgaWYgdGhlIGRvY3VtZW50IGlzIGNoZWNrZWQgb3V0LgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBib29sZWFuPGJyPgotICAgICAqIEphdmEgdHlwZTogQm9vbGVhbgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUID0gImNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5fTogdXNlciB3aG8KLSAgICAgKiBjaGVja2VkIG91dCB0aGUgZG9jdW1lbnQsIGlmIHRoZSBkb2N1bWVudCBpcyBjaGVja2VkIG91dC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogc3RyaW5nPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlkgPSAiY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5IjsKLSAgICAvKioKLSAgICAgKiBDTUlTIGRvY3VtZW50IHByb3BlcnR5IHtAY29kZSBjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWR9OiBJRCBvZiB0aGUKLSAgICAgKiBQV0MsIGlmIHRoZSBkb2N1bWVudCBpcyBjaGVja2VkIG91dC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogaWQ8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCA9ICJjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQiOwotICAgIC8qKgotICAgICAqIENNSVMgZG9jdW1lbnQgcHJvcGVydHkge0Bjb2RlIGNtaXM6Y2hlY2tpbkNvbW1lbnR9OiBjaGVjay1pbiBjb21tZW50IGZvcgotICAgICAqIHRoZSBkb2N1bWVudCB2ZXJzaW9uLgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBzdHJpbmc8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0lOX0NPTU1FTlQgPSAiY21pczpjaGVja2luQ29tbWVudCI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczpjb250ZW50U3RyZWFtTGVuZ3RofTogbGVuZ3RoIG9mIHRoZQotICAgICAqIGNvbnRlbnQgc3RyZWFtLCBpZiB0aGUgZG9jdW1lbnQgaGFzIGNvbnRlbnQuCi0gICAgICogPHA+Ci0gICAgICogQ01JUyBkYXRhIHR5cGU6IGludGVnZXI8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBCaWdJbnRlZ2VyCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9TVFJFQU1fTEVOR1RIID0gImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczpjb250ZW50U3RyZWFtTWltZVR5cGV9OiBNSU1FIHR5cGUgb2YKLSAgICAgKiB0aGUgY29udGVudCBzdHJlYW0sIGlmIHRoZSBkb2N1bWVudCBoYXMgY29udGVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogc3RyaW5nPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFID0gImNtaXM6Y29udGVudFN0cmVhbU1pbWVUeXBlIjsKLSAgICAvKioKLSAgICAgKiBDTUlTIGRvY3VtZW50IHByb3BlcnR5IHtAY29kZSBjbWlzOmNvbnRlbnRTdHJlYW1GaWxlTmFtZX06IGZpbGUgbmFtZSwgaWYKLSAgICAgKiB0aGUgZG9jdW1lbnQgaGFzIGNvbnRlbnQuCi0gICAgICogPHA+Ci0gICAgICogQ01JUyBkYXRhIHR5cGU6IHN0cmluZzxicj4KLSAgICAgKiBKYXZhIHR5cGU6IFN0cmluZwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSA9ICJjbWlzOmNvbnRlbnRTdHJlYW1GaWxlTmFtZSI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczpjb250ZW50U3RyZWFtSWR9OiBjb250ZW50IHN0cmVhbSBJRC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogaWQ8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1NUUkVBTV9JRCA9ICJjbWlzOmNvbnRlbnRTdHJlYW1JZCI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBkb2N1bWVudCBwcm9wZXJ0eSB7QGNvZGUgY21pczppc1ByaXZhdGVXb3JraW5nQ29weX06IGZsYWcgdGhlCi0gICAgICogaW5kaWNhdGVzIGlmIHRoZSBkb2N1bWVudCBpcyBhIFBXQy4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogYm9vbGVhbjxicj4KLSAgICAgKiBKYXZhIHR5cGU6IEJvb2xlYW4KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19QUklWQVRFX1dPUktJTkdfQ09QWSA9ICJjbWlzOmlzUHJpdmF0ZVdvcmtpbmdDb3B5IjsKLQotICAgIC8vIC0tLS0gZm9sZGVyIC0tLS0KLSAgICAvKioKLSAgICAgKiBDTUlTIGZvbGRlciBwcm9wZXJ0eSB7QGNvZGUgY21pczpwYXJlbnRJZH06IElEIG9mIHRoZSBwYXJlbnQgZm9sZGVyLgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBpZDxicj4KLSAgICAgKiBKYXZhIHR5cGU6IFN0cmluZwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9JRCA9ICJjbWlzOnBhcmVudElkIjsKLSAgICAvKioKLSAgICAgKiBDTUlTIGZvbGRlciBwcm9wZXJ0eSB7QGNvZGUgY21pczphbGxvd2VkQ2hpbGRPYmplY3RUeXBlSWRzfSAobXVsdGl2YWx1ZSk6Ci0gICAgICogSURzIG9mIHRoZSB0eXBlcyB0aGF0IGNhbiBiZSBmaWxlZCBpbiB0aGUgZm9sZGVyLgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBpZDxicj4KLSAgICAgKiBKYXZhIHR5cGU6IFN0cmluZwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTE9XRURfQ0hJTERfT0JKRUNUX1RZUEVfSURTID0gImNtaXM6YWxsb3dlZENoaWxkT2JqZWN0VHlwZUlkcyI7Ci0gICAgLyoqCi0gICAgICogQ01JUyBmb2xkZXIgcHJvcGVydHkge0Bjb2RlIGNtaXM6cGF0aH06IGZvbGRlciBwYXRoLgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBzdHJpbmc8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gImNtaXM6cGF0aCI7Ci0KLSAgICAvLyAtLS0tIHJlbGF0aW9uc2hpcCAtLS0tCi0gICAgLyoqCi0gICAgICogQ01JUyByZWxhdGlvbnNoaXAgcHJvcGVydHkge0Bjb2RlIGNtaXM6c291cmNlSWR9OiBJRCBvZiB0aGUgc291cmNlCi0gICAgICogb2JqZWN0LgotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBpZDxicj4KLSAgICAgKiBKYXZhIHR5cGU6IFN0cmluZwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9JRCA9ICJjbWlzOnNvdXJjZUlkIjsKLSAgICAvKioKLSAgICAgKiBDTUlTIHJlbGF0aW9uc2hpcCBwcm9wZXJ0eSB7QGNvZGUgY21pczp0YXJnZXRJZH06IElEIG9mIHRoZSB0YXJnZXQKLSAgICAgKiBvYmplY3QuCi0gICAgICogPHA+Ci0gICAgICogQ01JUyBkYXRhIHR5cGU6IGlkPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0lEID0gImNtaXM6dGFyZ2V0SWQiOwotCi0gICAgLy8gLS0tLSBwb2xpY3kgLS0tLQotICAgIC8qKgotICAgICAqIENNSVMgcG9saWN5IHByb3BlcnR5IHtAY29kZSBjbWlzOnBvbGljeVRleHR9OiBwb2xpY3kgdGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogc3RyaW5nPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MSUNZX1RFWFQgPSAiY21pczpwb2xpY3lUZXh0IjsKLQotICAgIC8vIC0tLS0gcmV0ZW50aW9uIC0tLS0KLSAgICAvKioKLSAgICAgKiBDTUlTIHJldGVudGlvbiBwcm9wZXJ0eSB7QGNvZGUgY21pczpybV9leHBpcmF0aW9uRGF0ZX06IGV4cGlyYXRpb24gZGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogZGF0ZXRpbWU8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUElSQVRJT05fREFURSA9ICJjbWlzOnJtX2V4cGlyYXRpb25EYXRlIjsKLSAgICAvKioKLSAgICAgKiBDTUlTIHJldGVudGlvbiBwcm9wZXJ0eSB7QGNvZGUgY21pczpybV9zdGFydE9mUmV0ZW50aW9ufTogc3RhcnQgZGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogZGF0ZXRpbWU8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX09GX1JFVEVOVElPTiA9ICJjbWlzOnJtX3N0YXJ0T2ZSZXRlbnRpb24iOwotICAgIC8qKgotICAgICAqIENNSVMgcmV0ZW50aW9uIHByb3BlcnR5IHtAY29kZSBjbWlzOnJtX2Rlc3RydWN0aW9uRGF0ZX06IGRlc3RydWN0aW9uCi0gICAgICogZGF0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogZGF0ZXRpbWU8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU1RSVUNUSU9OX0RBVEUgPSAiY21pczpybV9kZXN0cnVjdGlvbkRhdGUiOwotICAgIC8qKgotICAgICAqIENNSVMgcmV0ZW50aW9uIHByb3BlcnR5IHtAY29kZSBjbWlzOnJtX2hvbGRJZHN9IChtdWx0aXZhbHVlKTogSURzIG9mIHRoZQotICAgICAqIGhvbGRzIHRoYXQgYXJlIGFwcGxpZWQuCi0gICAgICogPHA+Ci0gICAgICogQ01JUyBkYXRhIHR5cGU6IGlkPGJyPgotICAgICAqIEphdmEgdHlwZTogU3RyaW5nCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MRF9JRFMgPSAiY21pczpybV9ob2xkSWRzIjsKLQotICAgIC8vIC0tLS0gZXh0ZW5zaW9ucyAtLS0tCi0gICAgLyoqCi0gICAgICogQ29udGVudCBIYXNoIHByb3BlcnR5IHtAY29kZSBjbWlzOmNvbnRlbnRTdHJlYW1IYXNofSAobXVsdGl2YWx1ZSk6IGhhc2hlcwotICAgICAqIG9mIHRoZSBjb250ZW50IHN0cmVhbQotICAgICAqIDxwPgotICAgICAqIENNSVMgZGF0YSB0eXBlOiBzdHJpbmc8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyBFeHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1NUUkVBTV9IQVNIID0gImNtaXM6Y29udGVudFN0cmVhbUhhc2giOwotCi0gICAgLyoqCi0gICAgICogTGF0ZXN0IGFjY2Vzc2libGUgc3RhdGUgcHJvcGVydHkge0Bjb2RlIGNtaXM6bGF0ZXN0QWNjZXNzaWJsZVN0YXRlSWR9OiBJRAotICAgICAqIG9mIHRoZSBsYXRlc3QgYWNjZXNzaWJsZSB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQKLSAgICAgKiA8cD4KLSAgICAgKiBDTUlTIGRhdGEgdHlwZTogaWQ8YnI+Ci0gICAgICogSmF2YSB0eXBlOiBTdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAY21pcyBFeHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVRFU1RfQUNDRVNTSUJMRV9TVEFURV9JRCA9ICJjbWlzOmxhdGVzdEFjY2Vzc2libGVTdGF0ZUlkIjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvU2Vjb25kYXJ5VHlwZUlkcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9TZWNvbmRhcnlUeXBlSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjY3YzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9TZWNvbmRhcnlUeXBlSWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9uczsKLQotLyoqCi0gKiBTZWNvbmRhcnkgdHlwZSBJRHMgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBAY21pcyAxLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlY29uZGFyeVR5cGVJZHMgewotCi0gICAgcHJpdmF0ZSBTZWNvbmRhcnlUeXBlSWRzKCkgewotICAgIH0KLQotICAgIC8qKiBSZXBvc2l0b3J5IG1hbmFnZWQgcmV0ZW50aW9uIHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9NQU5BR0VEX1JFVEVOVElPTiA9ICJjbWlzOnJtX3JlcE1ndFJldGVudGlvbiI7Ci0gICAgLyoqIENsaWVudCBtYW5hZ2VkIHJldGVudGlvbiB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9NQU5BR0VEX1JFVEVOVElPTiA9ICJjbWlzOnJtX2NsaWVudE1ndFJldGVudGlvbiI7Ci0gICAgLyoqIENsaWVudCBtYW5hZ2VkIHJldGVudGlvbiB0eXBlIHdpdGggZGVzdHJ1Y3Rpb24gZGF0ZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNUUlVDVElPTl9DTElFTlRfTUFOQUdFRF9SRVRFTlRJT04gPSAiY21pczpybV9kZXN0cnVjdGlvblJldGVudGlvbiI7Ci0gICAgLyoqIExlZ2FsIGhvbGQgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT0xEID0gImNtaXM6cm1faG9sZCI7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL1Nlc3Npb25QYXJhbWV0ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvU2Vzc2lvblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTIyNzAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvU2Vzc2lvblBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zOwotCi0vKioKLSAqIFNlc3Npb24gcGFyYW1ldGVyIGNvbnN0YW50cy4KLSAqIAotICogPHRhYmxlIGJvcmRlcj0iMiIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjQiPgotICogPHRyPgotICogPHRoPkNvbnN0YW50PC90aD4KLSAqIDx0aD5EZXNjcmlwdGlvbjwvdGg+Ci0gKiA8dGg+QmluZGluZzwvdGg+Ci0gKiA8dGg+VmFsdWU8L3RoPgotICogPHRoPlJlcXVpcmVkPC90aD4KLSAqIDx0aD5EZWZhdWx0PC90aD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQgY29sc3Bhbj0iNiI+PGI+R2VuZXJhbCBzZXR0aW5nczwvYj48L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0JJTkRJTkdfVFlQRX08L3RkPgotICogPHRkPkRlZmluZXMgdGhlIGJpbmRpbmcgdG8gdXNlIGZvciB0aGUgc2Vzc2lvbjwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD4iYXRvbXB1YiIsICJ3ZWJzZXJ2aWNlcyIsICJicm93c2VyIiwgImxvY2FsIiwgImN1c3RvbSI8L3RkPgotICogPHRkPnllczwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQklORElOR19TUElfQ0xBU1N9PC90ZD4KLSAqIDx0ZD5CaW5kaW5nIGltcGxlbWVudGF0aW9uIGNsYXNzPC90ZD4KLSAqIDx0ZD5hbGw8L3RkPgotICogPHRkPmNsYXNzIG5hbWU8L3RkPgotICogPHRkPkN1c3RvbSBiaW5kaW5nOiB5ZXM8YnI+Ci0gKiBhbGwgb3RoZXIgYmluZGluZzogbm88L3RkPgotICogPHRkPmRlcGVuZHMgb24ge0BsaW5rICNCSU5ESU5HX1RZUEV9PC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNSRVBPU0lUT1JZX0lEfTwvdGQ+Ci0gKiA8dGQ+UmVwb3NpdG9yeSBJRDwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD5yZXBvc2l0b3J5IGlkPC90ZD4KLSAqIDx0ZD5TZXNzaW9uRmFjdG9yeS5jcmVhdGVTZXNzaW9uKCk6IHllczxicj4KLSAqIFNlc3Npb25GYWN0b3J5LmdldFJlcG9zaXRvcmllcygpOiBubzwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjTE9DQUxFX0lTTzYzOV9MQU5HVUFHRX08L3RkPgotICogPHRkPkxhbmd1YWdlIGNvZGUgc2VudCB0byBzZXJ2ZXI8L3RkPgotICogPHRkPmFsbDwvdGQ+Ci0gKiA8dGQ+SVNPIDYzOSBjb2RlPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjTE9DQUxFX0lTTzMxNjZfQ09VTlRSWX08L3RkPgotICogPHRkPkNvdW50cnkgY29kZSBzZW50IHRvIHNlcnZlciBpZiBsYW5ndWFnZSBjb2RlIGlzIHNldDwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD5JU08gMzE2NiBjb2RlPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRyPgotICogPHRkPntAbGluayAjT0JKRUNUX0ZBQ1RPUllfQ0xBU1N9PC90ZD4KLSAqIDx0ZD5PYmplY3QgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBjbGFzczwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD5jbGFzcyBuYW1lPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUucmVwb3NpdG9yeS5PYmplY3RGYWN0b3J5SW1wbAotICogPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQgY29sc3Bhbj0iNiI+PGI+QXV0aGVudGljYXRpb24gc2V0dGluZ3M8L2I+PC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNVU0VSfTwvdGQ+Ci0gKiA8dGQ+VXNlciBuYW1lICh1c2VkIGJ5IHRoZSBzdGFuZGFyZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlcik8L3RkPgotICogPHRkPmFsbDwvdGQ+Ci0gKiA8dGQ+dXNlciBuYW1lPC90ZD4KLSAqIDx0ZD5kZXBlbmRzIG9uIHRoZSBzZXJ2ZXI8L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI1BBU1NXT1JEfTwvdGQ+Ci0gKiA8dGQ+UGFzc3dvcmQgKHVzZWQgYnkgdGhlIHN0YW5kYXJkIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyKTwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD5wYXNzd29yZDwvdGQ+Ci0gKiA8dGQ+ZGVwZW5kcyBvbiB0aGUgc2VydmVyPC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNBVVRIRU5USUNBVElPTl9QUk9WSURFUl9DTEFTU308L3RkPgotICogPHRkPkF1dGhlbnRpY2F0aW9uIFByb3ZpZGVyIGNsYXNzPC90ZD4KLSAqIDx0ZD5BdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXI8L3RkPgotICogPHRkPmNsYXNzIG5hbWU8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLgotICogU3RhbmRhcmRBdXRoZW50aWNhdGlvblByb3ZpZGVyPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNBVVRIX0hUVFBfQkFTSUN9PC90ZD4KLSAqIDx0ZD5Td2l0Y2ggdG8gdHVybiBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIG9uIG9yIG9mZjwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyPC90ZD4KLSAqIDx0ZD4idHJ1ZSIsICJmYWxzZSI8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5kZXBlbmRzIG9uIHtAbGluayAjQklORElOR19UWVBFfTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQVVUSF9IVFRQX0JBU0lDX0NIQVJTRVR9PC90ZD4KLSAqIDx0ZD5DaGFyc2V0IHRvIGVuY29kZSBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHVzZXJuYW1lIGFuZCBwYXNzd29yZDwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyPC90ZD4KLSAqIDx0ZD5jaGFyYWN0ZXIgc2V0IG5hbWU8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5VVEYtODwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQVVUSF9TT0FQX1VTRVJOQU1FVE9LRU59PC90ZD4KLSAqIDx0ZD5Td2l0Y2ggdG8gdHVybiBVc2VybmFtZVRva2VucyBvbiBvciBvZmY8L3RkPgotICogPHRkPldlYiBTZXJ2aWNlczwvdGQ+Ci0gKiA8dGQ+InRydWUiLCAiZmFsc2UiPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+dHJ1ZTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkIGNvbHNwYW49IjYiPjxiPkhUVFAgYW5kIG5ldHdvcmsgc2V0dGluZ3M8L2I+PC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNIVFRQX0lOVk9LRVJfQ0xBU1N9PC90ZD4KLSAqIDx0ZD5IVFRQIGludm9rZXIgY2xhc3M8L3RkPgotICogPHRkPkF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlcjwvdGQ+Ci0gKiA8dGQ+Y2xhc3MgbmFtZTwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuaHR0cC5EZWZhdWx0SHR0cEludm9rZXIKLSAqIDwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQ09NUFJFU1NJT059PC90ZD4KLSAqIDx0ZD5Td2l0Y2ggdG8gdHVybiBIVFRQIHJlc3BvbnNlIGNvbXByZXNzaW9uIG9uIG9yIG9mZjwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyPC90ZD4KLSAqIDx0ZD4idHJ1ZSIsICJmYWxzZSI8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5mYWxzZTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQ0xJRU5UX0NPTVBSRVNTSU9OfTwvdGQ+Ci0gKiA8dGQ+U3dpdGNoIHRvIHR1cm4gSFRUUCByZXF1ZXN0IGNvbXByZXNzaW9uIG9uIG9yIG9mZjwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyPC90ZD4KLSAqIDx0ZD4idHJ1ZSIsICJmYWxzZSI8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5mYWxzZTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQ09PS0lFU308L3RkPgotICogPHRkPlN3aXRjaCB0byB0dXJuIGNvb2tpZSBzdXBwb3J0IG9uIG9yIG9mZjwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyPC90ZD4KLSAqIDx0ZD4idHJ1ZSIsICJmYWxzZSI8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5mYWxzZTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjSEVBREVSfTwvdGQ+Ci0gKiA8dGQ+SFRUUCBoZWFkZXI8L3RkPgotICogPHRkPkF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlcjwvdGQ+Ci0gKiA8dGQ+aGVhZGVyIGhlYWRlcjwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI1BST1hZX1VTRVJ9PC90ZD4KLSAqIDx0ZD5Qcm94eSB1c2VyICh1c2VkIGJ5IHRoZSBzdGFuZGFyZCBhdXRoZW50aWNhdGlvbiBwcm92aWRlcik8L3RkPgotICogPHRkPkF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlcjwvdGQ+Ci0gKiA8dGQ+dXNlciBuYW1lPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjUFJPWFlfUEFTU1dPUkR9PC90ZD4KLSAqIDx0ZD5Qcm94eSBwYXNzd29yZCAodXNlZCBieSB0aGUgc3RhbmRhcmQgYXV0aGVudGljYXRpb24gcHJvdmlkZXIpPC90ZD4KLSAqIDx0ZD5BdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXI8L3RkPgotICogPHRkPnBhc3N3b3JkPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQ09OTkVDVF9USU1FT1VUfTwvdGQ+Ci0gKiA8dGQ+SFRUUCBjb25uZWN0IHRpbWVvdXQ8L3RkPgotICogPHRkPkF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlcjwvdGQ+Ci0gKiA8dGQ+dGltZSBpbiBtaWxsaXNlY29uZHM8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5KVk0gZGVmYXVsdDwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjUkVBRF9USU1FT1VUfTwvdGQ+Ci0gKiA8dGQ+SFRUUCByZWFkIHRpbWVvdXQ8L3RkPgotICogPHRkPkF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlcjwvdGQ+Ci0gKiA8dGQ+dGltZSBpbiBtaWxsaXNlY29uZHM8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD5KVk0gZGVmYXVsdDwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkIGNvbHNwYW49IjYiPjxiPkNhY2hlIHNldHRpbmdzPC9iPjwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQ0FDSEVfQ0xBU1N9PC90ZD4KLSAqIDx0ZD5DYWNoZSBpbXBsZW1lbnRhdGlvbiBjbGFzczwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD5jbGFzcyBuYW1lPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuY2FjaGUuQ2FjaGVJbXBsPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNUWVBFX0RFRklOSVRJT05fQ0FDSEVfQ0xBU1N9PC90ZD4KLSAqIDx0ZD5UeXBlIGRlZmluaXRpb24gY2FjaGUgaW1wbGVtZW50YXRpb24gY2xhc3M8L3RkPgotICogPHRkPmFsbDwvdGQ+Ci0gKiA8dGQ+Y2xhc3MgbmFtZTwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPgotICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmltcGwuVHlwZURlZmluaXRpb25DYWNoZUltcGw8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0NBQ0hFX1NJWkVfT0JKRUNUU308L3RkPgotICogPHRkPk9iamVjdCBjYWNoZSBzaXplPC90ZD4KLSAqIDx0ZD5hbGw8L3RkPgotICogPHRkPm51bWJlciBvZiBvYmplY3QgZW50cmllczwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPjEwMDA8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0NBQ0hFX1RUTF9PQkpFQ1RTfTwvdGQ+Ci0gKiA8dGQ+T2JqZWN0IGNhY2hlIHRpbWUtdG8tbGl2ZTwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD50aW1lIGluIG1pbGxpc2Vjb25kczwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPjcyMDAwMDAgKDIgaG91cnMpPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNDQUNIRV9TSVpFX1BBVEhUT0lEfTwvdGQ+Ci0gKiA8dGQ+UGF0aC10by1pZCBjYWNoZSBzaXplPC90ZD4KLSAqIDx0ZD5hbGw8L3RkPgotICogPHRkPm51bWJlciBvZiBwYXRoIHRvIG9iamVjdCBsaW5rIGVudHJpZXM8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD4xMDAwPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNDQUNIRV9UVExfUEFUSFRPSUR9PC90ZD4KLSAqIDx0ZD5QYXRoLXRvLWlkIGNhY2hlIHRpbWUtdG8tbGl2ZTwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD50aW1lIGluIG1pbGxpc2Vjb25kczwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPjE4MDAwMCAoMzAgbWludXRlcyk8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0NBQ0hFX1BBVEhfT01JVH08L3RkPgotICogPHRkPlR1cm4gb2ZmIHBhdGgtdG8taWQgY2FjaGU8L3RkPgotICogPHRkPmFsbDwvdGQ+Ci0gKiA8dGQ+InRydWUiLCAiZmFsc2UiPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+ZmFsc2U8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0NBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTfTwvdGQ+Ci0gKiA8dGQ+UmVwb3NpdG9yeSBpbmZvIGNhY2hlIHNpemU8L3RkPgotICogPHRkPmFsbDwvdGQ+Ci0gKiA8dGQ+bnVtYmVyIG9mIHJlcG9zaXRvcnkgaW5mbyBlbnRyaWVzPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+MTA8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0NBQ0hFX1NJWkVfVFlQRVN9PC90ZD4KLSAqIDx0ZD5UeXBlIGRlZmluaXRpb24gY2FjaGUgc2l6ZTwvdGQ+Ci0gKiA8dGQ+YWxsPC90ZD4KLSAqIDx0ZD5udW1iZXIgb2YgdHlwZSBkZWZpbml0aW9uIGVudHJpZXM8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD4xMDA8L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0NBQ0hFX1NJWkVfTElOS1N9PC90ZD4KLSAqIDx0ZD5BdG9tUHViIGxpbmsgY2FjaGUgc2l6ZTwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YjwvdGQ+Ci0gKiA8dGQ+bnVtYmVyIG9mIGxpbmsgZW50cmllczwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPjQwMDwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkIGNvbHNwYW49IjYiPjxiPkF0b21QdWIgQmluZGluZyBzZXR0aW5nczwvYj48L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0FUT01QVUJfVVJMfTwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YiBzZXJ2aWNlIGRvY3VtZW50IFVSTDwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YjwvdGQ+Ci0gKiA8dGQ+VVJMPC90ZD4KLSAqIDx0ZD55ZXM8L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZCBjb2xzcGFuPSI2Ij48Yj5XZWIgU2VydmljZXMgQmluZGluZyBzZXR0aW5nczwvYj48L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI1dFQlNFUlZJQ0VTX1JFUE9TSVRPUllfU0VSVklDRX08L3RkPgotICogPHRkPlJlcG9zaXRvcnkgU2VydmljZSBXU0RMIFVSTDwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5XU0RMIFVSTDwvdGQ+Ci0gKiA8dGQ+ZWl0aGVyIHtAbGluayAjV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFfSBvcgotICoge0BsaW5rICNXRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0VfRU5EUE9JTlR9IG11c3QgYmUgc2V0PC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNXRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0VfRU5EUE9JTlR9PC90ZD4KLSAqIDx0ZD5SZXBvc2l0b3J5IFNlcnZpY2UgZW5kcG9pbnQgVVJMPC90ZD4KLSAqIDx0ZD5XZWIgU2VydmljZXM8L3RkPgotICogPHRkPkVuZHBvaW50IFVSTDwvdGQ+Ci0gKiA8dGQ+ZWl0aGVyIHtAbGluayAjV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFfSBvcgotICoge0BsaW5rICNXRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0VfRU5EUE9JTlR9IG11c3QgYmUgc2V0PC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNXRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0V9PC90ZD4KLSAqIDx0ZD5OYXZpZ2F0aW9uIFNlcnZpY2UgV1NETCBVUkw8L3RkPgotICogPHRkPldlYiBTZXJ2aWNlczwvdGQ+Ci0gKiA8dGQ+V1NETCBVUkw8L3RkPgotICogPHRkPmVpdGhlciB7QGxpbmsgI1dFQlNFUlZJQ0VTX05BVklHQVRJT05fU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfTkFWSUdBVElPTl9TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfTkFWSUdBVElPTl9TRVJWSUNFX0VORFBPSU5UfTwvdGQ+Ci0gKiA8dGQ+TmF2aWdhdGlvbiBTZXJ2aWNlIGVuZHBvaW50IFVSTDwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5FbmRwb2ludCBVUkw8L3RkPgotICogPHRkPmVpdGhlciB7QGxpbmsgI1dFQlNFUlZJQ0VTX05BVklHQVRJT05fU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfTkFWSUdBVElPTl9TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfT0JKRUNUX1NFUlZJQ0V9PC90ZD4KLSAqIDx0ZD5PYmplY3QgU2VydmljZSBXU0RMIFVSTDwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5XU0RMIFVSTDwvdGQ+Ci0gKiA8dGQ+ZWl0aGVyIHtAbGluayAjV0VCU0VSVklDRVNfT0JKRUNUX1NFUlZJQ0V9IG9yCi0gKiB7QGxpbmsgI1dFQlNFUlZJQ0VTX09CSkVDVF9TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfT0JKRUNUX1NFUlZJQ0VfRU5EUE9JTlR9PC90ZD4KLSAqIDx0ZD5PYmplY3QgU2VydmljZSBlbmRwb2ludCBVUkw8L3RkPgotICogPHRkPldlYiBTZXJ2aWNlczwvdGQ+Ci0gKiA8dGQ+RW5kcG9pbnQgVVJMPC90ZD4KLSAqIDx0ZD5laXRoZXIge0BsaW5rICNXRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfT0JKRUNUX1NFUlZJQ0VfRU5EUE9JTlR9IG11c3QgYmUgc2V0PC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNXRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0V9PC90ZD4KLSAqIDx0ZD5WZXJzaW9uaW5nIFNlcnZpY2UgV1NETCBVUkw8L3RkPgotICogPHRkPldlYiBTZXJ2aWNlczwvdGQ+Ci0gKiA8dGQ+V1NETCBVUkw8L3RkPgotICogPHRkPmVpdGhlciB7QGxpbmsgI1dFQlNFUlZJQ0VTX1ZFUlNJT05JTkdfU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfVkVSU0lPTklOR19TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfVkVSU0lPTklOR19TRVJWSUNFX0VORFBPSU5UfTwvdGQ+Ci0gKiA8dGQ+VmVyc2lvbmluZyBTZXJ2aWNlIGVuZHBvaW50IFVSTDwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5FbmRwb2ludCBVUkw8L3RkPgotICogPHRkPmVpdGhlciB7QGxpbmsgI1dFQlNFUlZJQ0VTX1ZFUlNJT05JTkdfU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfVkVSU0lPTklOR19TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0V9PC90ZD4KLSAqIDx0ZD5EaXNjb3ZlcnkgU2VydmljZSBXU0RMIFVSTDwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5XU0RMIFVSTDwvdGQ+Ci0gKiA8dGQ+ZWl0aGVyIHtAbGluayAjV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0V9IG9yCi0gKiB7QGxpbmsgI1dFQlNFUlZJQ0VTX0RJU0NPVkVSWV9TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0VfRU5EUE9JTlR9PC90ZD4KLSAqIDx0ZD5EaXNjb3ZlcnkgU2VydmljZSBlbmRwb2ludCBVUkw8L3RkPgotICogPHRkPldlYiBTZXJ2aWNlczwvdGQ+Ci0gKiA8dGQ+RW5kcG9pbnQgVVJMPC90ZD4KLSAqIDx0ZD5laXRoZXIge0BsaW5rICNXRUJTRVJWSUNFU19ESVNDT1ZFUllfU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0VfRU5EUE9JTlR9IG11c3QgYmUgc2V0PC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNXRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRX08L3RkPgotICogPHRkPlJlbGF0aW9uc2hpcCBTZXJ2aWNlIFdTREwgVVJMPC90ZD4KLSAqIDx0ZD5XZWIgU2VydmljZXM8L3RkPgotICogPHRkPldTREwgVVJMPC90ZD4KLSAqIDx0ZD5laXRoZXIge0BsaW5rICNXRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfUkVMQVRJT05TSElQX1NFUlZJQ0VfRU5EUE9JTlR9IG11c3QgYmUgc2V0PC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNXRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRV9FTkRQT0lOVH08L3RkPgotICogPHRkPlJlbGF0aW9uc2hpcCBTZXJ2aWNlIGVuZHBvaW50IFVSTDwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5FbmRwb2ludCBVUkw8L3RkPgotICogPHRkPmVpdGhlciB7QGxpbmsgI1dFQlNFUlZJQ0VTX0RJU0NPVkVSWV9TRVJWSUNFfSBvcgotICoge0BsaW5rICNXRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRV9FTkRQT0lOVH0gbXVzdCBiZSBzZXQ8L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI1dFQlNFUlZJQ0VTX01VTFRJRklMSU5HX1NFUlZJQ0V9PC90ZD4KLSAqIDx0ZD5NdWx0aWZpbGluZyBTZXJ2aWNlIFdTREwgVVJMPC90ZD4KLSAqIDx0ZD5XZWIgU2VydmljZXM8L3RkPgotICogPHRkPldTREwgVVJMPC90ZD4KLSAqIDx0ZD5laXRoZXIge0BsaW5rICNXRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFfSBvcgotICoge0BsaW5rICNXRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRV9FTkRQT0lOVH08L3RkPgotICogPHRkPk11bHRpZmlsaW5nIFNlcnZpY2UgZW5kcG9pbnQgVVJMPC90ZD4KLSAqIDx0ZD5XZWIgU2VydmljZXM8L3RkPgotICogPHRkPkVuZHBvaW50IFVSTDwvdGQ+Ci0gKiA8dGQ+ZWl0aGVyIHtAbGluayAjV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRV9FTkRQT0lOVH0gbXVzdCBiZSBzZXQ8L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNXRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRX08L3RkPgotICogPHRkPlBvbGljeSBTZXJ2aWNlIFdTREwgVVJMPC90ZD4KLSAqIDx0ZD5XZWIgU2VydmljZXM8L3RkPgotICogPHRkPldTREwgVVJMPC90ZD4KLSAqIDx0ZD5laXRoZXIge0BsaW5rICNXRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRX0gb3IKLSAqIHtAbGluayAjV0VCU0VSVklDRVNfUE9MSUNZX1NFUlZJQ0VfRU5EUE9JTlR9IG11c3QgYmUgc2V0PC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNXRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRV9FTkRQT0lOVH08L3RkPgotICogPHRkPlBvbGljeSBTZXJ2aWNlIGVuZHBvaW50IFVSTDwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5FbmRwb2ludCBVUkw8L3RkPgotICogPHRkPmVpdGhlciB7QGxpbmsgI1dFQlNFUlZJQ0VTX1BPTElDWV9TRVJWSUNFfSBvcgotICoge0BsaW5rICNXRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRV9FTkRQT0lOVH0gbXVzdCBiZSBzZXQ8L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI1dFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFfTwvdGQ+Ci0gKiA8dGQ+QUNMIFNlcnZpY2UgV1NETCBVUkw8L3RkPgotICogPHRkPldlYiBTZXJ2aWNlczwvdGQ+Ci0gKiA8dGQ+V1NETCBVUkw8L3RkPgotICogPHRkPmVpdGhlciB7QGxpbmsgI1dFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFfSBvcgotICoge0BsaW5rICNXRUJTRVJWSUNFU19BQ0xfU0VSVklDRV9FTkRQT0lOVH0gbXVzdCBiZSBzZXQ8L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI1dFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFX0VORFBPSU5UfTwvdGQ+Ci0gKiA8dGQ+QUNMIFNlcnZpY2UgZW5kcG9pbnQgVVJMPC90ZD4KLSAqIDx0ZD5XZWIgU2VydmljZXM8L3RkPgotICogPHRkPkVuZHBvaW50IFVSTDwvdGQ+Ci0gKiA8dGQ+ZWl0aGVyIHtAbGluayAjV0VCU0VSVklDRVNfQUNMX1NFUlZJQ0V9IG9yCi0gKiB7QGxpbmsgI1dFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFX0VORFBPSU5UfSBtdXN0IGJlIHNldDwvdGQ+Ci0gKiA8dGQ+LTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfTUVNT1JZX1RIUkVTSE9MRH08L3RkPgotICogPHRkPkRvY3VtZW50cyBzbWFsbGVyIHRoYW4gdGhlIHRocmVzaG9sZCBhcmUga2VwdCBpbiBtYWluIG1lbW9yeSwgbGFyZ2VyCi0gKiBkb2N1bWVudHMgYXJlIHdyaXR0ZW4gdG8gYSB0ZW1wb3JhcnkgZmlsZTwvdGQ+Ci0gKiA8dGQ+V2ViIFNlcnZpY2VzPC90ZD4KLSAqIDx0ZD5zaXplIGluIGJ5dGVzPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+NDE5NDMwNCAoNE1CKTwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjV0VCU0VSVklDRVNfUkVQU09OU0VfTUVNT1JZX1RIUkVTSE9MRH08L3RkPgotICogPHRkPldlYiBTZXJ2aWNlIHJlc3BvbnNlcyAoWE1MIFNPQVAgcGFydHMpIHNtYWxsZXIgdGhhbiB0aGUgdGhyZXNob2xkIGFyZQotICoga2VwdCBpbiBtYWluIG1lbW9yeSwgbGFyZ2VyIHJlc3BvbnNlcyBhcmUgd3JpdHRlbiB0byBhIHRlbXBvcmFyeSBmaWxlPC90ZD4KLSAqIDx0ZD5XZWIgU2VydmljZXM8L3RkPgotICogPHRkPnNpemUgaW4gYnl0ZXM8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD4oSkFYLVdTIGltcGxlbWVudGF0aW9uIGRlZmF1bHQpPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQgY29sc3Bhbj0iNiI+PGI+QnJvd3NlciBCaW5kaW5nPC9iPjwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQlJPV1NFUl9VUkx9PC90ZD4KLSAqIDx0ZD5Ccm93c2VyIGJpbmRpbmcgc2VydmljZSBkb2N1bWVudCBVUkw8L3RkPgotICogPHRkPkJyb3dzZXI8L3RkPgotICogPHRkPlVSTDwvdGQ+Ci0gKiA8dGQ+eWVzPC90ZD4KLSAqIDx0ZD4tPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNCUk9XU0VSX1NVQ0NJTkNUfTwvdGQ+Ci0gKiA8dGQ+RGVmaW5lcyBpZiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZW50IGluIHRoZSBzdWNjaW5jdCBmb3JtYXQ8L3RkPgotICogPHRkPkJyb3dzZXI8L3RkPgotICogPHRkPiJ0cnVlIiwgImZhbHNlIjwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPiJ0cnVlIjwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkIGNvbHNwYW49IjYiPjxiPkxvY2FsIEJpbmRpbmc8L2I+PC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNMT0NBTF9GQUNUT1JZfTwvdGQ+Ci0gKiA8dGQ+Q2xhc3MgbmFtZSBvZiB0aGUgbG9jYWwgc2VydmljZSBmYWN0b3J5IChpZiBjbGllbnQgYW5kIHNlcnZlciByZXNpZGUgaW4KLSAqIHRoZSBzYW1lIEpWTSk8L3RkPgotICogPHRkPkxvY2FsPC90ZD4KLSAqIDx0ZD5jbGFzcyBuYW1lPC90ZD4KLSAqIDx0ZD55ZXM8L3RkPgotICogPHRkPi08L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZCBjb2xzcGFuPSI2Ij48Yj5Xb3JrYXJvdW5kczwvYj48L3RkPgotICogPC90cj4KLSAqIDx0cj4KLSAqIDx0ZD57QGxpbmsgI0lOQ0xVREVfT0JKRUNUSURfVVJMX1BBUkFNX09OX0NIRUNLT1VUfTwvdGQ+Ci0gKiA8dGQ+RGVmaW5lcyBpZiB0aGUgb2JqZWN0IElEIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgY2hlY2sgb3V0IFVSTDxicj4KLSAqIChXb3JrYXJvdW5kIGZvciBTaGFyZVBvaW50IDIwMTApPC90ZD4KLSAqIDx0ZD5BdG9tUHViPC90ZD4KLSAqIDx0ZD4idHJ1ZSIsICJmYWxzZSI8L3RkPgotICogPHRkPm5vPC90ZD4KLSAqIDx0ZD4iZmFsc2UiPC90ZD4KLSAqIDwvdHI+Ci0gKiA8dHI+Ci0gKiA8dGQ+e0BsaW5rICNJTkNMVURFX09CSkVDVElEX1VSTF9QQVJBTV9PTl9NT1ZFfTwvdGQ+Ci0gKiA8dGQ+RGVmaW5lcyBpZiB0aGUgb2JqZWN0IElEIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbW92ZSBVUkw8YnI+Ci0gKiAoV29ya2Fyb3VuZCBmb3IgU2hhcmVQb2ludCAyMDEwKTwvdGQ+Ci0gKiA8dGQ+QXRvbVB1YjwvdGQ+Ci0gKiA8dGQ+InRydWUiLCAiZmFsc2UiPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+ImZhbHNlIjwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjT01JVF9DSEFOR0VfVE9LRU5TfTwvdGQ+Ci0gKiA8dGQ+RGVmaW5lcyBpZiB0aGUgY2hhbmdlIHRva2VuIHNob3VsZCBiZSBvbWl0dGVkIGZvciB1cGRhdGluZyBjYWxsczxicj4KLSAqIChXb3JrYXJvdW5kIGZvciBTaGFyZVBvaW50IDIwMTAgYW5kIFNoYXJlUG9pbnQgMjAxMyk8L3RkPgotICogPHRkPmFsbDwvdGQ+Ci0gKiA8dGQ+InRydWUiLCAiZmFsc2UiPC90ZD4KLSAqIDx0ZD5ubzwvdGQ+Ci0gKiA8dGQ+ImZhbHNlIjwvdGQ+Ci0gKiA8L3RyPgotICogPHRyPgotICogPHRkPntAbGluayAjQUREX05BTUVfT05fQ0hFQ0tfSU59PC90ZD4KLSAqIDx0ZD5EZWZpbmVzIGlmIHRoZSBkb2N1bWVudCBuYW1lIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcHJvcGVydGllcyBvbiBjaGVjawotICogaW4gaWYgbm8gcHJvcGVydGllcyBhcmUgdXBkYXRlZDxicj4KLSAqIChXb3JrYXJvdW5kIGZvciBTaGFyZVBvaW50IDIwMTAgYW5kIFNoYXJlUG9pbnQgMjAxMyk8L3RkPgotICogPHRkPkF0b21QdWI8L3RkPgotICogPHRkPiJ0cnVlIiwgImZhbHNlIjwvdGQ+Ci0gKiA8dGQ+bm88L3RkPgotICogPHRkPiJmYWxzZSI8L3RkPgotICogPC90cj4KLSAqIDwvdGFibGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXNzaW9uUGFyYW1ldGVyIHsKLQotICAgIC8vIHV0aWxpdHkgY2xhc3MKLSAgICBwcml2YXRlIFNlc3Npb25QYXJhbWV0ZXIoKSB7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBnZW5lcmFsIHBhcmFtZXRlciAtLS0tCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZCI7Ci0KLSAgICAvLyAtLS0gYmluZGluZyBwYXJhbWV0ZXIgLS0tLQotICAgIC8qKiBQcmVkZWZpbmVkIGJpbmRpbmcgdHlwZXMgKHNlZSB7QGNvZGUgQmluZGluZ1R5cGV9KS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX1RZUEUgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZSI7Ci0KLSAgICAvKiogQ2xhc3MgbmFtZSBvZiB0aGUgYmluZGluZyBjbGFzcy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX1NQSV9DTEFTUyA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnNwaS5jbGFzc25hbWUiOwotCi0gICAgLyoqCi0gICAgICogRm9yY2VzIE9wZW5DTUlTIHRvIHVzZSB0aGUgc3BlY2lmaWVkIENNSVMgdmVyc2lvbiBhbmQgaWdub3JlIHRoZSBDTUlTCi0gICAgICogdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgcmVwb3NpdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9DTUlTX1ZFUlNJT04gPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY21pc3ZlcnNpb24iOwotCi0gICAgLyoqIFVSTCBvZiB0aGUgQXRvbVB1YiBzZXJ2aWNlIGRvY3VtZW50LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUT01QVUJfVVJMID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXRvbXB1Yi51cmwiOwotCi0gICAgLyoqIFdTREwgVVJMcyBmb3IgV2ViIFNlcnZpY2VzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX1JFUE9TSVRPUllfU0VSVklDRSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlcG9zaXRvcnlTZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfT0JKRUNUX1NFUlZJQ0UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5PYmplY3RTZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU19WRVJTSU9OSU5HX1NFUlZJQ0UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5WZXJzaW9uaW5nU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5EaXNjb3ZlcnlTZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU19SRUxBVElPTlNISVBfU0VSVklDRSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlbGF0aW9uc2hpcFNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX01VTFRJRklMSU5HX1NFUlZJQ0UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5NdWx0aUZpbGluZ1NlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX1BPTElDWV9TRVJWSUNFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUG9saWN5U2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfQUNMX1NFUlZJQ0UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5BQ0xTZXJ2aWNlIjsKLQotICAgIC8qKiBFbmRwb2ludCBVUkxzIGZvciBXZWIgU2VydmljZXMuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFX0VORFBPSU5UID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVwb3NpdG9yeVNlcnZpY2UuZW5kcG9pbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX05BVklHQVRJT05fU0VSVklDRV9FTkRQT0lOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk5hdmlnYXRpb25TZXJ2aWNlLmVuZHBvaW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRV9FTkRQT0lOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk9iamVjdFNlcnZpY2UuZW5kcG9pbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX1ZFUlNJT05JTkdfU0VSVklDRV9FTkRQT0lOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlZlcnNpb25pbmdTZXJ2aWNlLmVuZHBvaW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU19ESVNDT1ZFUllfU0VSVklDRV9FTkRQT0lOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2UuZW5kcG9pbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX1JFTEFUSU9OU0hJUF9TRVJWSUNFX0VORFBPSU5UID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVsYXRpb25zaGlwU2VydmljZS5lbmRwb2ludCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfTVVMVElGSUxJTkdfU0VSVklDRV9FTkRQT0lOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk11bHRpRmlsaW5nU2VydmljZS5lbmRwb2ludCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfUE9MSUNZX1NFUlZJQ0VfRU5EUE9JTlQgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5Qb2xpY3lTZXJ2aWNlLmVuZHBvaW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFU19BQ0xfU0VSVklDRV9FTkRQT0lOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkFDTFNlcnZpY2UuZW5kcG9pbnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfTUVNT1JZX1RIUkVTSE9MRCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLm1lbW9yeVRocmVzaG9sZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRVNfUkVQU09OU0VfTUVNT1JZX1RIUkVTSE9MRCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLnJlc3BvbnNlTWVtb3J5VGhyZXNob2xkIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX1BPUlRfUFJPVklERVJfQ0xBU1MgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5wb3J0cHJvdmlkZXIuY2xhc3NuYW1lIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VTX0pBWFdTX0lNUEwgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5qYXh3cy5pbXBsIjsKLQotICAgIC8qKiBVUkwgb2YgdGhlIEJyb3dzZXIgQmluZGluZyBlbnRyeSBwb2ludC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VSX1VSTCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmJyb3dzZXIudXJsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VSX1NVQ0NJTkNUID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYnJvd3Nlci5zdWNjaW5jdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJPV1NFUl9EQVRFVElNRV9GT1JNQVQgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5icm93c2VyLmRhdGV0aW1lZm9ybWF0IjsKLQotICAgIC8qKiBGYWN0b3J5IGNsYXNzIG5hbWUgZm9yIHRoZSBsb2NhbCBiaW5kaW5nLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0ZBQ1RPUlkgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5sb2NhbC5jbGFzc25hbWUiOwotCi0gICAgLy8gLS0tIGF1dGhlbnRpY2F0aW9uIC0tLQotCi0gICAgLyoqIENsYXNzIG5hbWUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhFTlRJQ0FUSU9OX1BST1ZJREVSX0NMQVNTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXV0aC5jbGFzc25hbWUiOwotCi0gICAgLyoqCi0gICAgICogVG9nZ2xlIGZvciBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uLiBFdmFsdWF0ZWQgYnkgdGhlIHN0YW5kYXJkCi0gICAgICogYXV0aGVudGljYXRpb24gcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSF9IVFRQX0JBU0lDID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXV0aC5odHRwLmJhc2ljIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX0hUVFBfQkFTSUNfQ0hBUlNFVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF1dGguaHR0cC5iYXNpYy5jaGFyc2V0IjsKLQotICAgIC8qKgotICAgICAqIFRvZ2dsZSBmb3IgT0F1dGggQmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uLiBFdmFsdWF0ZWQgYnkgdGhlIHN0YW5kYXJkCi0gICAgICogYXV0aGVudGljYXRpb24gcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSF9PQVVUSF9CRUFSRVIgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdXRoLmh0dHAub2F1dGguYmVhcmVyIjsKLQotICAgIC8qKgotICAgICAqIFRvZ2dsZSBmb3IgV1MtU2VjdXJpdHkgVXNlcm5hbWVUb2tlbiBhdXRoZW50aWNhdGlvbi4gRXZhbHVhdGVkIGJ5IHRoZQotICAgICAqIHN0YW5kYXJkIGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhfU09BUF9VU0VSTkFNRVRPS0VOID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXV0aC5zb2FwLnVzZXJuYW1ldG9rZW4iOwotCi0gICAgLy8gLS0tIE9BdXRoIC0tLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfQ0xJRU5UX0lEID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLm9hdXRoLmNsaWVudElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQVVUSF9DTElFTlRfU0VDUkVUID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLm9hdXRoLmNsaWVudFNlY3JldCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfQ09ERSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5vYXV0aC5jb2RlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQVVUSF9UT0tFTl9FTkRQT0lOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5vYXV0aC50b2tlbkVuZHBvaW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQVVUSF9SRURJUkVDVF9VUkkgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMub2F1dGgucmVkaXJlY3RVcmkiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfQUNDRVNTX1RPS0VOID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLm9hdXRoLmFjY2Vzc1Rva2VuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQVVUSF9SRUZSRVNIX1RPS0VOID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLm9hdXRoLnJlZnJlc2hUb2tlbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfRVhQSVJBVElPTl9USU1FU1RBTVAgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMub2F1dGguZXhwaXJhdGlvblRpbWVzdGFtcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfREVGQVVMVF9UT0tFTl9MSUZFVElNRSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5vYXV0aC5kZWZhdWx0VG9rZW5MaWZldGltZSI7Ci0KLSAgICAvLyAtLS0gY29ubmVjdGlvbiAtLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSU5WT0tFUl9DTEFTUyA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmh0dHBpbnZva2VyLmNsYXNzbmFtZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU0lPTiA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmNvbXByZXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfQ09NUFJFU1NJT04gPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5jbGllbnRjb21wcmVzc2lvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT09LSUVTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuY29va2llcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVIgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5oZWFkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVF9USU1FT1VUID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuY29ubmVjdHRpbWVvdXQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfVElNRU9VVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnJlYWR0aW1lb3V0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1VTRVIgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5wcm94eXVzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1BBU1NXT1JEID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcucHJveHlwYXNzd29yZCI7Ci0KLSAgICAvLyAtLS0gY2FjaGUgLS0tCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX09CSkVDVFMgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2FjaGUub2JqZWN0cy5zaXplIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UVExfT0JKRUNUUyA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jYWNoZS5vYmplY3RzLnR0bCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9QQVRIVE9JRCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jYWNoZS5wYXRodG9pZC5zaXplIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UVExfUEFUSFRPSUQgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2FjaGUucGF0aHRvaWQudHRsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9QQVRIX09NSVQgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2FjaGUucGF0aC5vbWl0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuY2FjaGUucmVwb3NpdG9yaWVzLnNpemUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfVFlQRVMgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5jYWNoZS50eXBlcy5zaXplIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0xJTktTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuY2FjaGUubGlua3Muc2l6ZSI7Ci0KLSAgICAvLyAtLS0gc2Vzc2lvbiBjb250cm9sIC0tLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxFX0lTTzYzOV9MQU5HVUFHRSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5sb2NhbGUuaXNvNjM5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfSVNPMzE2Nl9DT1VOVFJZID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmxvY2FsZS5pc28zMTY2IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTEVfVkFSSUFOVCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5sb2NhbGUudmFyaWFudCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfRkFDVE9SWV9DTEFTUyA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5vYmplY3RmYWN0b3J5LmNsYXNzbmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ0xBU1MgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2FjaGUuY2xhc3NuYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFRklOSVRJT05fQ0FDSEVfQ0xBU1MgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2FjaGUudHlwZXMuY2xhc3NuYW1lIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2Vzc2lvbi5yZXBvc2l0b3J5LmlkIjsKLQotICAgIC8vIC0tLSB3b3JrYXJvdW5kcyAtLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfT0JKRUNUSURfVVJMX1BBUkFNX09OX0NIRUNLT1VUID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmthcm91bmQuaW5jbHVkZU9iamVjdElkT25DaGVja291dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9PQkpFQ1RJRF9VUkxfUEFSQU1fT05fTU9WRSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYXJvdW5kLmluY2x1ZGVPYmplY3RJZE9uTW92ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9DSEFOR0VfVE9LRU5TID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmthcm91bmQub21pdENoYW5nZVRva2VucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX05BTUVfT05fQ0hFQ0tfSU4gPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2Fyb3VuZC5hZGROYW1lT25DaGVja0luIjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL1Nlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTIyN2E2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvU2Vzc2lvblBhcmFtZXRlckRlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9uczsKLQotcHVibGljIGNsYXNzIFNlc3Npb25QYXJhbWV0ZXJEZWZhdWx0cyB7Ci0KLSAgICAvLyB1dGlsaXR5IGNsYXNzCi0gICAgcHJpdmF0ZSBTZXNzaW9uUGFyYW1ldGVyRGVmYXVsdHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfU0laRV9PQkpFQ1RTID0gMTAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9UVExfT0JKRUNUUyA9IDIgKiA2MCAqIDYwICogMTAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9TSVpFX1BBVEhUT0lEID0gMTAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9UVExfUEFUSFRPSUQgPSAzMCAqIDYwICogMTAwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX1NJWkVfUkVQT1NJVE9SSUVTID0gMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfU0laRV9UWVBFUyA9IDEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9TSVpFX0xJTktTID0gNDAwOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0FjZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0FjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM3MzczLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9BY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBY2Nlc3MgQ29udHJvbCBFbnRyeSAoQUNFKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBBY2UgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBBQ0UgcHJpbmNpcGFsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByaW5jaXBhbAotICAgICAqLwotICAgIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEFDRSBwcmluY2lwYWwgSUQuCi0gICAgICogPHA+Ci0gICAgICogU2hvcnRjdXQgZm9yIDxjb2RlPmdldFByaW5jaXBhbCgpLmdldElkKCk8L2NvZGU+LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByaW5jaXBhbCBJRCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gcHJpbmNpcGFsIGlzIHNldAotICAgICAqLwotICAgIFN0cmluZyBnZXRQcmluY2lwYWxJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byB0aGUgcHJpbmNpcGFsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZ2V0UGVybWlzc2lvbnMoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgQUNFIHdhcyBkaXJlY3RseSBhcHBsaWVkIHRvIHRoZSBvYmplY3Qgb3IgaGFzIGJlZW4KLSAgICAgKiBpbmhlcml0ZWQgZnJvbSBhbm90aGVyIG9iamVjdCAoZm9yIGV4YW1wbGUgZnJvbSB0aGUgZm9sZGVyIGl0IHJlc2lkZXMKLSAgICAgKiBpbikuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgaXQgaXMgZGlyZWN0IEFDRSwge0Bjb2RlIGZhbHNlfSBpZiBpdCBpcwotICAgICAqICAgICAgICAgbm9uLWRpcmVjdCBBQ0UKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGlyZWN0KCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQWNsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQWNsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTFmMWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0FjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEFjY2VzcyBDb250cm9sIExpc3QgKEFDTCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWNsIGV4dGVuZHMgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBBY2Nlc3MgQ29udHJvbCBFbnRyaWVzIChBQ0VzKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIEFDRXMsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBMaXN0PEFjZT4gZ2V0QWNlcygpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBBQ0wgZXhwcmVzc2VzIGFsbCBwZXJtaXNzaW9ucyBvZiB0aGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBBQ0wgZXhwcmVzc2VzIHRoZSBleGFjdCBwZXJtaXNzaW9uIHNldCwKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgdGhlcmUgYXJlIG90aGVyIHBlcm1pc3Npb24gcnVsZXMgdGhhdCBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgIGV4cHJlc3NlZCB0aHJvdWdoIEFDRXMsIGFuZCB7QGNvZGUgbnVsbH0gaWYgdGhpcyBpbiB1bmtub3duICh0aGUKLSAgICAgKiAgICAgICAgIHJlcG9zaXRvcnkgZGlkIG5vdCBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24pCi0gICAgICovCi0gICAgQm9vbGVhbiBpc0V4YWN0KCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQWNsQ2FwYWJpbGl0aWVzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQWNsQ2FwYWJpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2N2RiNzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0FjbENhcGFiaWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5TdXBwb3J0ZWRQZXJtaXNzaW9uczsKLQotLyoqCi0gKiBBY2wgQ2FwYWJpbGl0aWVzLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBBY2xDYXBhYmlsaXRpZXMgZXh0ZW5kcyBTZXJpYWxpemFibGUsIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIFN1cHBvcnRlZFBlcm1pc3Npb25zIGdldFN1cHBvcnRlZFBlcm1pc3Npb25zKCk7Ci0KLSAgICBBY2xQcm9wYWdhdGlvbiBnZXRBY2xQcm9wYWdhdGlvbigpOwotCi0gICAgTGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4gZ2V0UGVybWlzc2lvbnMoKTsKLQotICAgIE1hcDxTdHJpbmcsIFBlcm1pc3Npb25NYXBwaW5nPiBnZXRQZXJtaXNzaW9uTWFwcGluZygpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQWxsb3dhYmxlQWN0aW9ucy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0FsbG93YWJsZUFjdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmNmM1NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQWxsb3dhYmxlQWN0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLQotLyoqCi0gKiBBbGxvd2FibGUgQWN0aW9ucy4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWxsb3dhYmxlQWN0aW9ucyBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEFsbG93YWJsZSBBY3Rpb25zIHRoYXQgYXJlIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBBbGxvd2FibGUgQWN0aW9ucyB0aGF0IGFyZSBzZXQsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTZXQ8QWN0aW9uPiBnZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0J1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODZjNjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0J1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi0vKioKLSAqIEhvbGRlciBmb3IgYnVsa1VwZGF0ZU9iamVjdCBkYXRhLgotICogCi0gKiBAY21pcyAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBJRC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgSUQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldyBvYmplY3QgSUQgaWYgdGhlIHJlcG9zaXRvcnkgY3JlYXRlZCBhIG5ldyBvYmplY3QgZHVyaW5nCi0gICAgICogdGhlIHVwZGF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgb2JqZWN0IElEIG9yIHtAY29kZSBudWxsfSBpZiBubyBuZXcgb2JqZWN0IGhhcyBiZWVuCi0gICAgICogICAgICAgICBjcmVhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5ld0lkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2UgdG9rZW4gb2YgdGhlIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFuZ2UgdG9rZW4gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXBvc2l0b3J5IGRvZXMgbm90Ci0gICAgICogICAgICAgICBzdXBwb3J0IGNoYW5nZSB0b2tlbnMKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2hhbmdlVG9rZW4oKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9DYWNoZUhlYWRlckNvbnRlbnRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9DYWNoZUhlYWRlckNvbnRlbnRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhOGI3MS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQ2FjaGVIZWFkZXJDb250ZW50U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi0vKioKLSAqIENvbnRlbnQgc3RyZWFtIHdpdGggSFRUUCBjYWNoZSBoZWFkZXJzLiAoQXRvbVB1YiBiaW5kaW5nIGFuZCBCcm93c2VyIGJpbmRpbmcKLSAqIHNlcnZlciBvbmx5LikKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoZUhlYWRlckNvbnRlbnRTdHJlYW0gZXh0ZW5kcyBDb250ZW50U3RyZWFtIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIENhY2hlLUNvbnRyb2wgaGVhZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBDYWNoZS1Db250cm9sIGhlYWRlciBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCi0gICAgICogICAgICAgICBoZWFkZXIgc2hvdWxkIG5vdCBiZSBzZXQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2FjaGVDb250cm9sKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBFVGFnIGhlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgRVRhZyBoZWFkZXIgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBoZWFkZXIKLSAgICAgKiAgICAgICAgIHNob3VsZCBub3QgYmUgc2V0Ci0gICAgICovCi0gICAgU3RyaW5nIGdldEVUYWcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEV4cGlyZXMgaGVhZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBFeHBpcmVzIGhlYWRlciBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGhlYWRlcgotICAgICAqICAgICAgICAgc2hvdWxkIG5vdCBiZSBzZXQKLSAgICAgKi8KLSAgICBHcmVnb3JpYW5DYWxlbmRhciBnZXRFeHBpcmVzKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQ2hhbmdlRXZlbnRJbmZvLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQ2hhbmdlRXZlbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NmI0ZTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0NoYW5nZUV2ZW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2hhbmdlVHlwZTsKLQotLyoqCi0gKiBCYXNpYyBjaGFuZ2UgZXZlbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlRXZlbnRJbmZvIGV4dGVuZHMgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hhbmdlIGV2ZW50IHR5cGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hhbmdlIGV2ZW50IHR5cGUsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBDaGFuZ2VUeXBlIGdldENoYW5nZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hlbiB0aGUgY2hhbmdlIHRvb2sgcGxhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGltZXNwYW1wIG9mIHRoZSBjaGFuZ2UsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBHcmVnb3JpYW5DYWxlbmRhciBnZXRDaGFuZ2VUaW1lKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQ21pc0V4dGVuc2lvbkVsZW1lbnQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9DbWlzRXh0ZW5zaW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzJjNDVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9DbWlzRXh0ZW5zaW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogUmVwcmVzZW50cyBvbmUgbm9kZSBpbiB0aGUgZXh0ZW5zaW9uIHRyZWUuCi0gKiA8cD4KLSAqIEFuIGV4dGVuc2lvbiBlbGVtZW50IGNhbiBoYXZlIGEgdmFsdWUgb3IgY2hpbGRyZW4sIGJ1dCBub3QgYm90aC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDbWlzRXh0ZW5zaW9uRWxlbWVudCBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSwgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGV4dGVuc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbmFtZXNwYWNlIG11c3QgZm9sbG93IHRoZSBYTUwgcnVsZXMgZm9yIG5hbWVzcGFjZXMuIERvbid0IHJlbHkgb24KLSAgICAgKiBuYW1lc3BhY2VzIGJlY2F1c2UgdGhlIEJyb3dzZXIgYmluZGluZyBkb2VzIG5vdCBzdXBwb3J0IG5hbWVzcGFjZXMhCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIG5hbWVzcGFjZSBpcyBub3QKLSAgICAgKiAgICAgICAgIHNldCBvciBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGV4dGVuc2lvbiBhcyBhIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnNpb24gdmFsdWUgYXMgYSBTdHJpbmcgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB2YWx1ZSBpcwotICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IG9yIHRoZSBleHRlbnNpb24gaGFzIGNoaWxkcmVuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBleHRlbnNpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGF0dHJpYnV0ZXMgbXVzdCBmb2xsb3cgdGhlIFhNTCBydWxlcyBmb3IgYXR0cmlidXRlcy4gRG9uJ3QgcmVseSBvbgotICAgICAqIGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGUgQnJvd3NlciBiaW5kaW5nIGRvZXMgbm90IHN1cHBvcnQgYXR0cmlidXRlcyEKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBleHRlbnNpb24gYXR0cmlidXRlcyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGF0dHJpYnV0ZXMgYXJlCi0gICAgICogICAgICAgICBub3Qgc2V0IG9yIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgKi8KLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEF0dHJpYnV0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZXh0ZW5zaW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoaWxkcmVuIG9mIHRoaXMgZXh0ZW5zaW9uIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZXh0ZW5zaW9uCi0gICAgICogICAgICAgICBoYXMgYSB2YWx1ZQotICAgICAqLwotICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGdldENoaWxkcmVuKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQ29udGVudExlbmd0aENvbnRlbnRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Db250ZW50TGVuZ3RoQ29udGVudFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzUyOGExLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Db250ZW50TGVuZ3RoQ29udGVudFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotLyoqCi0gKiBDb250ZW50IHN0cmVhbSB0aGF0IHNob3VsZCBub3QgYmUgY2h1bmtlZC4gKEF0b21QdWIgYmluZGluZyBhbmQgQnJvd3NlcgotICogYmluZGluZyBzZXJ2ZXIgb25seS4pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudExlbmd0aENvbnRlbnRTdHJlYW0gZXh0ZW5kcyBDb250ZW50U3RyZWFtIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0NvbnRlbnRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Db250ZW50U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzJiYTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0NvbnRlbnRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIENvbnRlbnQgc3RyZWFtLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRTdHJlYW0gZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbSBpbiBieXRlcyBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24KLSAgICAgKi8KLSAgICBsb25nIGdldExlbmd0aCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBsZW5ndGgKLSAgICAgKiAgICAgICAgIGlzIHVua25vd24KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldEJpZ0xlbmd0aCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgTUlNRSB0eXBlIG9mIHRoZSBzdHJlYW0gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBNSU1FIHR5cGUgaXMKLSAgICAgKiAgICAgICAgIHVua25vd24KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgc3RyZWFtIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZmlsZSBuYW1lIGlzCi0gICAgICogICAgICAgICB1bmtub3duCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZpbGVOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJlYW0uCi0gICAgICogPHA+Ci0gICAgICogSXQgaXMgaW1wb3J0YW50IHRvIGNsb3NlIHRoaXMgc3RyZWFtIHByb3Blcmx5IQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN0cmVhbQotICAgICAqLwotICAgIElucHV0U3RyZWFtIGdldFN0cmVhbSgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0NvbnRlbnRTdHJlYW1IYXNoLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQ29udGVudFN0cmVhbUhhc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3NjM5NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvQ29udGVudFN0cmVhbUhhc2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLS8qKgotICogQ29udGVudCBoYXNoLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRTdHJlYW1IYXNoIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgaGFzaCBwcm9wZXJ0eSB2YWx1ZSAoe0Bjb2RlIGNtaXM6Y29udGVudFN0cmVhbUhhc2h9KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGhhc2ggcHJvcGVydHkgdmFsdWUKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFzaCBhbGdvcml0aG0uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaCBhbGdvcml0aG0gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcwotICAgICAqICAgICAgICAgaW52YWxpZAotICAgICAqLwotICAgIFN0cmluZyBnZXRBbGdvcml0aG0oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhhc2ggdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgaGFzaCB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SGFzaCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0NyZWF0YWJsZVByb3BlcnR5VHlwZXMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9DcmVhdGFibGVQcm9wZXJ0eVR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMzIwOGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0NyZWF0YWJsZVByb3BlcnR5VHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci0KLS8qKgotICogSG9sZHMgdGhlIHNldCBvZiBwcm9wZXJ0eSBkYXRhIHR5cGVzIGZvciB0eXBlIGNyZWF0aW9uIGFuZCB1cGRhdGUuCi0gKiAKLSAqIEBjbWlzIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENyZWF0YWJsZVByb3BlcnR5VHlwZXMgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgcHJvcGVydHkgZGF0YSB0eXBlcyB0aGF0IGNhbiB1c2VkIHRvIGNyZWF0ZSBvciB1cGRhdGUKLSAgICAgKiBhIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhdmFpbGFibGUgc2V0IG9mIHByb3BlcnR5IGRhdGEgdHlwZXMKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBTZXQ8UHJvcGVydHlUeXBlPiBjYW5DcmVhdGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0V4dGVuc2lvbkZlYXR1cmUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9FeHRlbnNpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNzhmNjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0V4dGVuc2lvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogUmVwcmVzZW50YXRpb24gb2YgYW4gZXh0ZW5zaW9uIGZlYXR1cmUuCi0gKiAKLSAqIEBjbWlzIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2lvbkZlYXR1cmUgZXh0ZW5kcyBTZXJpYWxpemFibGUsIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBmZWF0dXJlIElELgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZlYXR1cmUgSUQsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBVUkwgdGhhdCBwcm92aWRlcyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmZWF0dXJlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZlYXR1cmUgVVJMLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgU3RyaW5nIGdldFVybCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBmZWF0dXJlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZlYXR1cmUgbmFtZSwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIFN0cmluZyBnZXRDb21tb25OYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgZmVhdHVyZSB2ZXJzaW9uIGxhYmVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZlYXR1cmUgdmVyc2lvbiBsYWJlbCwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIFN0cmluZyBnZXRWZXJzaW9uTGFiZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIGRlc2NyaXB0aW9uLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGV4dHJhIGZlYXR1cmUgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXktdmFsdWUgcGFpcnMgb2YgZXh0cmEgZGF0YSwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RmVhdHVyZURhdGEoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9FeHRlbnNpb25zRGF0YS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0V4dGVuc2lvbnNEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWM2MmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0V4dGVuc2lvbnNEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSG9sZHMgZXh0ZW5zaW9uIGRhdGEgZWl0aGVyIHNldCBieSB0aGUgQ01JUyByZXBvc2l0b3J5IG9yIHRoZSBjbGllbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0b3AtbGV2ZWwgZXh0ZW5zaW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9uIGVsZW1lbnRzIG9yIHtAY29kZSBudWxsfSBpZiBubyBleHRlbnNpb24KLSAgICAgKiAgICAgICAgIGFyZSBzZXQKLSAgICAgKi8KLSAgICBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBnZXRFeHRlbnNpb25zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHRvcC1sZXZlbCBleHRlbnNpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMsIG1heSBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICB2b2lkIHNldEV4dGVuc2lvbnMoTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9ucyk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvRmFpbGVkVG9EZWxldGVEYXRhLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvRmFpbGVkVG9EZWxldGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWEyM2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0ZhaWxlZFRvRGVsZXRlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLQotLyoqCi0gKiBIb2xkZXIgZm9yIG9iamVjdCBJRHMgb2Ygb2JqZWN0cyB0aGF0IGNvdWxkIG5vdCBiZSBkZWxldGVkLgotICogCi0gKiBAc2VlIE9iamVjdFNlcnZpY2UjZGVsZXRlVHJlZShTdHJpbmcsIFN0cmluZywgQm9vbGVhbiwKLSAqICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3QsIEJvb2xlYW4sCi0gKiAgICAgIEV4dGVuc2lvbnNEYXRhKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZhaWxlZFRvRGVsZXRlRGF0YSBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygb2JqZWN0IElEcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmVuJ3QgYmVlbiBkZWxldGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgSURzLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldElkcygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0xhc3RNb2RpZmllZENvbnRlbnRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9MYXN0TW9kaWZpZWRDb250ZW50U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjM0NDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL0xhc3RNb2RpZmllZENvbnRlbnRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLS8qKgotICogQ29udGVudCBzdHJlYW0gd2l0aCBsYXN0IG1vZGlmaWVkIGRhdGUuIChBdG9tUHViIGJpbmRpbmcgYW5kIEJyb3dzZXIgYmluZGluZwotICogc2VydmVyIG9ubHkuKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIExhc3RNb2RpZmllZENvbnRlbnRTdHJlYW0gZXh0ZW5kcyBDb250ZW50U3RyZWFtIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGlzIGNvbnRlbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGF0ZSBvZiB0aGUgbGFzdCBjb250ZW50IG1vZGlmaWNhdGlvbgotICAgICAqLwotICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdldExhc3RNb2RpZmllZCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVBY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlQWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTA2N2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVBY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNdXRhYmxlIEFjY2VzcyBDb250cm9sIEVudHJ5IChBQ0UpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVBY2UgZXh0ZW5kcyBBY2UgewotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQUNFIHByaW5jaXBhbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJpbmNpcGFsCi0gICAgICogICAgICAgICAgICB0aGUgcHJpbmNpcGFsCi0gICAgICovCi0gICAgdm9pZCBzZXRQcmluY2lwYWwoUHJpbmNpcGFsIHByaW5jaXBhbCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSBwcmluY2lwYWwuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBlcm1pc3Npb25zCi0gICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiBwZXJtaXNzaW9uCi0gICAgICovCi0gICAgdm9pZCBzZXRQZXJtaXNzaW9ucyhMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgQUNFIGlzIGEgZGlyZWN0IEFDRSBvciBub3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpcmVjdAotICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBBQ0UgaXMgYSBkaXJlY3QgQUNFLCB7QGNvZGUgZmFsc2V9Ci0gICAgICogICAgICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICB2b2lkIHNldERpcmVjdChib29sZWFuIGRpcmVjdCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZUFjbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVBY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5N2JmOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZUFjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE11dGFibGUgQWNjZXNzIENvbnRyb2wgTGlzdCAoQUNMKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBNdXRhYmxlQWNsIGV4dGVuZHMgQWNsIHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgQUNFcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWNlcwotICAgICAqICAgICAgICAgICAgbGlzdCBvZiBBQ0VzCi0gICAgICovCi0gICAgdm9pZCBzZXRBY2VzKExpc3Q8QWNlPiBhY2VzKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0aGlzIEFDTCBleHByZXNzZXMgYWxsIHBlcm1pc3Npb25zIG9mIHRoZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlzRXhhY3QKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgQUNMIGV4cHJlc3NlcyB0aGUgZXhhY3QgcGVybWlzc2lvbiBzZXQsCi0gICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIHRoZXJlIGFyZSBvdGhlciBwZXJtaXNzaW9uIHJ1bGVzIHRoYXQgY2Fubm90Ci0gICAgICogICAgICAgICAgICBiZSBleHByZXNzZWQgdGhyb3VnaCBBQ0VzCi0gICAgICovCi0gICAgdm9pZCBzZXRFeGFjdChCb29sZWFuIGlzRXhhY3QpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZUNvbnRlbnRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlQ29udGVudFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJjMzBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlQ29udGVudFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogTXV0YWJsZSBDb250ZW50U3RyZWFtLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVDb250ZW50U3RyZWFtIGV4dGVuZHMgQ29udGVudFN0cmVhbSB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmaWxlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lCi0gICAgICovCi0gICAgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtIGluIGJ5dGVzIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgIGxlbmd0aCBpcyB1bmtub3duCi0gICAgICovCi0gICAgdm9pZCBzZXRMZW5ndGgoQmlnSW50ZWdlciBsZW5ndGgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1pbWVUeXBlCi0gICAgICogICAgICAgICAgICB0aGUgTUlNRSB0eXBlCi0gICAgICovCi0gICAgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0KLSAgICAgKi8KLSAgICB2b2lkIHNldFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0pOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVPYmplY3REYXRhLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZU9iamVjdERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1NWZlOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZU9iamVjdERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTXV0YWJsZSBPYmplY3REYXRhLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVPYmplY3REYXRhIGV4dGVuZHMgT2JqZWN0RGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydGllcyBvZiB7QGNvZGUgbnVsbH0gdG8gcmVtb3ZlIGFsbCBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgdm9pZCBzZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjaGFuZ2UgZXZlbnQgaW5mby4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2hhbmdlRXZlbnRJbmZvCi0gICAgICogICAgICAgICAgICB0aGUgY2hhbmdlIGV2ZW50IGluZm8gb2Yge0Bjb2RlIG51bGx9IHRvIHJlbW92ZSB0aGUgY2hhbmdlCi0gICAgICogICAgICAgICAgICBldmVudCBpbmZvCi0gICAgICovCi0gICAgdm9pZCBzZXRDaGFuZ2VFdmVudEluZm8oQ2hhbmdlRXZlbnRJbmZvIGNoYW5nZUV2ZW50SW5mbyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZWxhdGlvbnNoaXBzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWxhdGlvbnNoaXBzCi0gICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiByZWxhdGlvbnNoaXBzIG9mIHtAY29kZSBudWxsfSB0byByZW1vdmUgYWxsCi0gICAgICogICAgICAgICAgICByZWxhdGlvbnNoaXBzCi0gICAgICovCi0gICAgdm9pZCBzZXRSZWxhdGlvbnNoaXBzKExpc3Q8T2JqZWN0RGF0YT4gcmVsYXRpb25zaGlwcyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZW5kaXRpb25zLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZW5kaXRpb25zCi0gICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiByZW5kaXRpb25zIG9mIHtAY29kZSBudWxsfSB0byByZW1vdmUgYWxsCi0gICAgICogICAgICAgICAgICByZW5kaXRpb25zCi0gICAgICovCi0gICAgdm9pZCBzZXRSZW5kaXRpb25zKExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwb2xpY3kgSURzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwb2xpY3lJZHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwb2xpY3kgSUQgb2Yge0Bjb2RlIG51bGx9IHRvIHJlbW92ZSBhbGwgcG9saWN5IElEcwotICAgICAqLwotICAgIHZvaWQgc2V0UG9saWN5SWRzKFBvbGljeUlkTGlzdCBwb2xpY3lJZHMpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgQWxsb3dhYmxlIEFjdGlvbnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFsbG93YWJsZUFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBBbGxvd2FibGUgQWN0aW9ucyBvZiB7QGNvZGUgbnVsbH0gdG8gcmVtb3ZlIHRoZSBBbGxvd2FibGUKLSAgICAgKiAgICAgICAgICAgIEFjdGlvbnMKLSAgICAgKi8KLSAgICB2b2lkIHNldEFsbG93YWJsZUFjdGlvbnMoQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjbAotICAgICAqICAgICAgICAgICAgdGhlIGFjY2VzcyBjb250cm9sIGxpc3Qgb2Yge0Bjb2RlIG51bGx9IHRvIHJlbW92ZSB0aGUgYWNjZXNzCi0gICAgICogICAgICAgICAgICBjb250cm9sIGxpc3QKLSAgICAgKi8KLSAgICB2b2lkIHNldEFjbChBY2wgYWNsKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgaWYgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QgcmVmbGVjdHMgdGhlIGV4YWN0IHBlcm1pc3Npb24gc2V0IGluIHRoZQotICAgICAqIHJlcG9zaXRvcnkuCi0gICAgICogPHA+Ci0gICAgICogU2hvdWxkIGJlIHNldCB0byB7QGNvZGUgdHJ1ZX0gb3Ige0Bjb2RlIGZhbHNlfSBpZiBhbiBhY2Nlc3MgY29udHJvbCBsaXN0Ci0gICAgICogZXhpc3RzLiBTaG91bGQgYmUgc2V0IHRvIHtAY29kZSBudWxsfSBpZiBubyBhY2Nlc3MgY29udHJvbCBsaXN0IGV4aXN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNFeGFjdEFDTAotICAgICAqICAgICAgICAgICAgdGhlIGV4YWN0IGZsYWcuCi0gICAgICovCi0gICAgdm9pZCBzZXRJc0V4YWN0QWNsKEJvb2xlYW4gaXNFeGFjdEFDTCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByaW5jaXBhbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcmluY2lwYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwNTAxYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByaW5jaXBhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotcHVibGljIGludGVyZmFjZSBNdXRhYmxlUHJpbmNpcGFsIGV4dGVuZHMgUHJpbmNpcGFsIHsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByaW5jaXBhbCBJRC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJpbmNpcGFsSWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcmluY2lwYWwgSUQKLSAgICAgKi8KLSAgICB2b2lkIHNldElkKFN0cmluZyBwcmluY2lwYWxJZCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnRpZXMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDQxYzFjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotLyoqCi0gKiBNdXRhYmxlIFByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZVByb3BlcnRpZXMgZXh0ZW5kcyBQcm9wZXJ0aWVzIHsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGUgZW5kIG9mIHRoZSBwcm9wZXJ0eSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5LCB7QGNvZGUgbnVsbH0gdmFsdWVzIGFyZSBpZ25vcmVkCi0gICAgICovCi0gICAgdm9pZCBhZGRQcm9wZXJ0eShQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkpOwotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZXMgYSBwcm9wZXJ0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBSZW1vdmVzIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBwcm9wZXJ0eSBsaXN0IGlmIGl0IGV4aXN0cyBhbmQgYWRkcyB0aGUgbmV3Ci0gICAgICogdmVyc2lvbiB0byB0aGUgZW5kIG9mIHRoZSBwcm9wZXJ0eSBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5LCB7QGNvZGUgbnVsbH0gdmFsdWVzIGFyZSBpZ25vcmVkCi0gICAgICovCi0gICAgdm9pZCByZXBsYWNlUHJvcGVydHkoUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5KTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBJRCwge0Bjb2RlIG51bGx9IHZhbHVlcyBhcmUgaWdub3JlZAotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGlkKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlCb29sZWFuLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5Qm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGRlYjE0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlCb29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQcm9wZXJ0eUJvb2xlYW4gZXh0ZW5kcyBQcm9wZXJ0eUJvb2xlYW4sIE11dGFibGVQcm9wZXJ0eURhdGE8Qm9vbGVhbj4gewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5RGF0YS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjYTRmNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE11dGFibGUgUHJvcGVydHlEYXRhLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQcm9wZXJ0eURhdGE8VD4gZXh0ZW5kcyBQcm9wZXJ0eURhdGE8VD4gewotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvcGVydHkgSUQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgSUQsIHNob3VsZCBub3QgYmUge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRoZQotICAgICAqICAgICAgICAgICAgZGlzcGxheSBuYW1lCi0gICAgICovCi0gICAgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsb2NhbCBuYW1lLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0aGUKLSAgICAgKiAgICAgICAgICAgIGxvY2FsIG5hbWUKLSAgICAgKi8KLSAgICB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbG9jYWxOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcXVlcnkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGhlCi0gICAgICogICAgICAgICAgICBxdWVyeSBuYW1lCi0gICAgICovCi0gICAgdm9pZCBzZXRRdWVyeU5hbWUoU3RyaW5nIHF1ZXJ5TmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGEgc2luZ2xlIHZhbHVlIHByb3BlcnR5LCB0aGlzIGxpc3QgbXVzdCBlaXRoZXIgYmUKLSAgICAgKiBlbXB0eSBvciB7QGNvZGUgbnVsbH0gKD0gdW5zZXQpIG9yIG11c3Qgb25seSBjb250YWluIG9uZSBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWVzCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUgb3Ige0Bjb2RlIG51bGx9IHRvIHVuc2V0IHRoZSBwcm9wZXJ0eQotICAgICAqLwotICAgIHZvaWQgc2V0VmFsdWVzKExpc3Q8VD4gdmFsdWVzKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgYSBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGEgbXVsdGkgdmFsdWUgcHJvcGVydHksIHRoaXMgdmFsdWUgYmVjb21lcyB0aGUgb25seQotICAgICAqIHZhbHVlIGluIHRoZSBsaXN0IG9mIHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gdG8gdW5zZXQgdGhlIHByb3BlcnR5Ci0gICAgICovCi0gICAgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eURhdGVUaW1lLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5RGF0ZVRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExMDA1YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5RGF0ZVRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZVByb3BlcnR5RGF0ZVRpbWUgZXh0ZW5kcyBQcm9wZXJ0eURhdGVUaW1lLCBNdXRhYmxlUHJvcGVydHlEYXRhPEdyZWdvcmlhbkNhbGVuZGFyPiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlEZWNpbWFsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5RGVjaW1hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjcyYTI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlEZWNpbWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZVByb3BlcnR5RGVjaW1hbCBleHRlbmRzIFByb3BlcnR5RGVjaW1hbCwgTXV0YWJsZVByb3BlcnR5RGF0YTxCaWdEZWNpbWFsPiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlIdG1sLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5SHRtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTY1ODljLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlIdG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQcm9wZXJ0eUh0bWwgZXh0ZW5kcyBQcm9wZXJ0eUh0bWwsIE11dGFibGVQcm9wZXJ0eURhdGE8U3RyaW5nPiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlJZC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eUlkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOGQwYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eUlkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQcm9wZXJ0eUlkIGV4dGVuZHMgUHJvcGVydHlJZCwgTXV0YWJsZVByb3BlcnR5RGF0YTxTdHJpbmc+IHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eUludGVnZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzkxOGEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGludGVyZmFjZSBNdXRhYmxlUHJvcGVydHlJbnRlZ2VyIGV4dGVuZHMgUHJvcGVydHlJbnRlZ2VyLCBNdXRhYmxlUHJvcGVydHlEYXRhPEJpZ0ludGVnZXI+IHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eVN0cmluZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL011dGFibGVQcm9wZXJ0eVN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMwODA4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZVByb3BlcnR5U3RyaW5nIGV4dGVuZHMgUHJvcGVydHlTdHJpbmcsIE11dGFibGVQcm9wZXJ0eURhdGE8U3RyaW5nPiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlVcmkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9NdXRhYmxlUHJvcGVydHlVcmkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0OTFhOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTXV0YWJsZVByb3BlcnR5VXJpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQcm9wZXJ0eVVyaSBleHRlbmRzIFByb3BlcnR5VXJpLCBNdXRhYmxlUHJvcGVydHlEYXRhPFN0cmluZz4gewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL05ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4OThiZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiA7TGljZW5zZTspOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqIDtBUyBJUzsgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLS8qKgotICogQSBjb2xsZWN0aW9uIG9mIGZsYWdzIHRoYXQgaW5kaWNhdGUgd2hpY2ggdHlwZSBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYXQgdHlwZQotICogY3JlYXRpb24uCi0gKiAKLSAqIEBjbWlzIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlICJpZCIgYXR0cmlidXRlIGNhbiBiZSBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlICJpZCIgYXR0cmlidXRlIGNhbiBiZSBzZXQsIHtAY29kZSBmYWxzZX0KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIEJvb2xlYW4gY2FuU2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgImxvY2FsTmFtZSIgYXR0cmlidXRlIGNhbiBiZSBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlICJsb2NhbE5hbWUiIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LAotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBCb29sZWFuIGNhblNldExvY2FsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSAibG9jYWxOYW1lc3BhY2UiIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSAibG9jYWxOYW1lc3BhY2UiIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LAotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBCb29sZWFuIGNhblNldExvY2FsTmFtZXNwYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlICJkaXNwbGF5TmFtZSIgYXR0cmlidXRlIGNhbiBiZSBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlICJkaXNwbGF5TmFtZSIgYXR0cmlidXRlIGNhbiBiZSBzZXQsCi0gICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIEJvb2xlYW4gY2FuU2V0RGlzcGxheU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgInF1ZXJ5TmFtZSIgYXR0cmlidXRlIGNhbiBiZSBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlICJxdWVyeU5hbWUiIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LAotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBCb29sZWFuIGNhblNldFF1ZXJ5TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSAiZGVzY3JpcHRpb24iIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSAiZGVzY3JpcHRpb24iIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LAotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBCb29sZWFuIGNhblNldERlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlICJjcmVhdGFibGUiIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSAiY3JlYXRhYmxlIiBhdHRyaWJ1dGUgY2FuIGJlIHNldCwKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgQm9vbGVhbiBjYW5TZXRDcmVhdGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgImZpbGVhYmxlIiBhdHRyaWJ1dGUgY2FuIGJlIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgImZpbGVhYmxlIiBhdHRyaWJ1dGUgY2FuIGJlIHNldCwKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgQm9vbGVhbiBjYW5TZXRGaWxlYWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSAicXVlcnlhYmxlIiBhdHRyaWJ1dGUgY2FuIGJlIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgInF1ZXJ5YWJsZSIgYXR0cmlidXRlIGNhbiBiZSBzZXQsCi0gICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIEJvb2xlYW4gY2FuU2V0UXVlcnlhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlICJmdWxsdGV4dEluZGV4ZWQiIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSAiZnVsbHRleHRJbmRleGVkIiBhdHRyaWJ1dGUgY2FuIGJlIHNldCwKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgQm9vbGVhbiBjYW5TZXRGdWxsdGV4dEluZGV4ZWQoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSIgYXR0cmlidXRlIGNhbiBiZSBzZXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlICJpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkiIGF0dHJpYnV0ZSBjYW4gYmUKLSAgICAgKiAgICAgICAgIHNldCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBCb29sZWFuIGNhblNldEluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZSAiY29udHJvbGxhYmxlUG9saWN5IiBhdHRyaWJ1dGUgY2FuIGJlIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgImNvbnRyb2xsYWJsZVBvbGljeSIgYXR0cmlidXRlIGNhbiBiZSBzZXQsCi0gICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIEJvb2xlYW4gY2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlICJjb250cm9sbGFibGVBQ0wiIGF0dHJpYnV0ZSBjYW4gYmUgc2V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSAiY29udHJvbGxhYmxlQUNMIiBhdHRyaWJ1dGUgY2FuIGJlIHNldCwKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgQm9vbGVhbiBjYW5TZXRDb250cm9sbGFibGVBY2woKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9PYmplY3REYXRhLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvT2JqZWN0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJiYjQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9PYmplY3REYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotCi0vKioKLSAqIEJhc2Ugb2JqZWN0IGZvciBDTUlTIGRvY3VtZW50cywgZm9sZGVycywgcmVsYXRpb25zaGlwcywgcG9saWNpZXMsIGFuZCBpdGVtcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPYmplY3REYXRhIGV4dGVuZHMgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IElELgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCBJRCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIG9iamVjdCBJRCBpcyB1bmtub3duCi0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIG9iamVjdCB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhc2Ugb2JqZWN0IHR5cGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBiYXNlIG9iamVjdCB0eXBlIGlzCi0gICAgICogICAgICAgICB1bmtub3duCi0gICAgICovCi0gICAgQmFzZVR5cGVJZCBnZXRCYXNlVHlwZUlkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydGllcy4gVGhlIHByb3BlcnRpZXMgY2FuIGJlIGluY29tcGxldGUgaWYgYQotICAgICAqIHByb3BlcnR5IGZpbHRlciB3YXMgdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9yIHtAY29kZSBudWxsfSBpZiBubyBwcm9wZXJ0aWVzIGFyZSBrbm93bgotICAgICAqLwotICAgIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWxsb3dhYmxlIGFjdGlvbnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgYWxsb3dhYmxlIGFjdGlvbnMgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBhbGxvd2FibGUgYWN0aW9ucwotICAgICAqICAgICAgICAgYXJlIHVua25vd24KLSAgICAgKi8KLSAgICBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbGF0aW9uc2hpcHMgZnJvbSBhbmQgdG8gdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiByZWxhdGlvbnNoaXAgb2JqZWN0cywgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIExpc3Q8T2JqZWN0RGF0YT4gZ2V0UmVsYXRpb25zaGlwcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hhbmdlIGV2ZW50IGluZm9zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNoYW5nZSBldmVudCBpbmZvcyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGluZm9zIGFyZSB1bmtub3duCi0gICAgICovCi0gICAgQ2hhbmdlRXZlbnRJbmZvIGdldENoYW5nZUV2ZW50SW5mbygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYWNjZXNzIGNvbnRyb2wgbGlzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgYWNjZXNzIGNvbnRyb2wKLSAgICAgKiAgICAgICAgIGxpc3QgaXMgdW5rbm93bgotICAgICAqLwotICAgIEFjbCBnZXRBY2woKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QgcmVmbGVjdHMgdGhlIGV4YWN0IHBlcm1pc3Npb24gc2V0IGluCi0gICAgICogdGhlIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gLSBleGFjdDsge0Bjb2RlIGZhbHNlfSAtIG5vdCBleGFjdCwgb3RoZXIgcGVybWlzc2lvbgotICAgICAqICAgICAgICAgY29uc3RyYWludHMgZXhpc3Q7IHtAY29kZSBudWxsfSAtIHVua25vd24KLSAgICAgKi8KLSAgICBCb29sZWFuIGlzRXhhY3RBY2woKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElEcyBvZiB0aGUgYXBwbGllZCBwb2xpY2llcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwb2xpY3kgSURzIG9yIHtAY29kZSBudWxsfSBpZiBubyBwb2xpY2llcyBhcmUgYXBwbGllZCBvciB0aGUKLSAgICAgKiAgICAgICAgIElEcyBhcmUgdW5rbm93bgotICAgICAqLwotICAgIFBvbGljeUlkTGlzdCBnZXRQb2xpY3lJZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbmRpdGlvbnMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiByZW5kaXRpb25zLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgTGlzdDxSZW5kaXRpb25EYXRhPiBnZXRSZW5kaXRpb25zKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdEluRm9sZGVyQ29udGFpbmVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvT2JqZWN0SW5Gb2xkZXJDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxYWFmNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvT2JqZWN0SW5Gb2xkZXJDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBDb250YWluZXIgdXNlZCBmb3IgdHJlZXMgdGhhdCByZXByZXNlbnQgb2JqZWN0cyBpbiBhIGZvbGRlciBoaWVyYXJjaHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgYXQgdGhpcyBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBPYmplY3RJbkZvbGRlckRhdGEgZ2V0T2JqZWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QgY29udGFpbmVycyBvZiB0aGUgbmV4dCBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGlsZCBvYmplY3QsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXRDaGlsZHJlbigpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdEluRm9sZGVyRGF0YS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdEluRm9sZGVyRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Y5ZDcxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9PYmplY3RJbkZvbGRlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBvYmplY3QgaW4gYSBmb2xkZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0SW5Gb2xkZXJEYXRhIGV4dGVuZHMgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCwgbm90IHtAY29kZSBudWxsfQotICAgICAqLwotICAgIE9iamVjdERhdGEgZ2V0T2JqZWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHNlZ21lbnQgb2YgdGhlIG9iamVjdCBpbiB0aGUgZm9sZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhdGggc2VnbWVudCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHBhdGggc2VnbWVudCBoYXMgbm90IGJlZW4KLSAgICAgKiAgICAgICAgIHJlcXVlc3RlZAotICAgICAqLwotICAgIFN0cmluZyBnZXRQYXRoU2VnbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdEluRm9sZGVyTGlzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdEluRm9sZGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjk5NzNmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9PYmplY3RJbkZvbGRlckxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBvYmplY3RzIGluIGEgZm9sZGVyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9iamVjdEluRm9sZGVyTGlzdCBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdHMgaW4gdGhlIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3RzIGluIHRoZSBmb2xkZXIsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gZ2V0T2JqZWN0cygpOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIGlmIHRoZXJlIGFyZSBtb3JlIG9iamVjdHMgaW4gdGhlIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgbW9yZSBvYmplY3RzLCB7QGNvZGUgZmFsc2V9IGlmIHRoZXJlCi0gICAgICogICAgICAgICBhcmUgbm90IG1vcmUgb2JqZWN0cywgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXBvc2l0b3J5IGRpZG4ndAotICAgICAqICAgICAgICAgcHJvdmlkZSB0aGlzIGZsYWcKLSAgICAgKi8KLSAgICBCb29sZWFuIGhhc01vcmVJdGVtcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHRoZSBvYmplY3RzIGluIHRoZSBmb2xkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHRoZSBvYmplY3RzIGluIHRoZSBmb2xkZXIgb3Ige0Bjb2RlIG51bGx9IGlmCi0gICAgICogICAgICAgICB0aGUgcmVwb3NpdG9yeSBkaWRuJ3QgcHJvdmlkZSB0aGUgbnVtYmVyCi0gICAgICovCi0gICAgQmlnSW50ZWdlciBnZXROdW1JdGVtcygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdExpc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9PYmplY3RMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDg4YTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbGlzdCBvZiBvYmplY3RzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9iamVjdExpc3QgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBvYmplY3RzLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgTGlzdDxPYmplY3REYXRhPiBnZXRPYmplY3RzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlcmUgYXJlIG1vcmUgb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgbW9yZSBvYmplY3RzLCB7QGNvZGUgZmFsc2V9IGlmIHRoZXJlCi0gICAgICogICAgICAgICBhcmUgbm90IG1vcmUgb2JqZWN0cywgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXBvc2l0b3J5IGRpZG4ndAotICAgICAqICAgICAgICAgcHJvdmlkZSB0aGlzIGZsYWcKLSAgICAgKi8KLSAgICBCb29sZWFuIGhhc01vcmVJdGVtcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHRoZSBvYmplY3RzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiB0aGUgb2JqZWN0cyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAgICAgICAgIGRpZG4ndCBwcm92aWRlIHRoZSBudW1iZXIKLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE51bUl0ZW1zKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvT2JqZWN0UGFyZW50RGF0YS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL09iamVjdFBhcmVudERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmNzM0My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvT2JqZWN0UGFyZW50RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcGFyZW50IG9mIG9iamVjdCBvZiBhIGNoaWxkIG9iamVjdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBPYmplY3RQYXJlbnREYXRhIGV4dGVuZHMgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2JqZWN0LCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgT2JqZWN0RGF0YSBnZXRPYmplY3QoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbGF0aXZlIHBhdGggc2VnbWVudCBvZiB0aGUgY2hpbGQgb2JqZWN0IHJlbGF0aXZlIHRvIHRoZQotICAgICAqIHBhcmVudCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVsYXRpdmUgcGF0aCBzZWdtZW50IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcmVsYXRpdmUgcGF0aAotICAgICAqICAgICAgICAgc2VnbWVudCBoYXMgbm90IGJlZW4gcmVxdWVzdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldFJlbGF0aXZlUGF0aFNlZ21lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9QYXJ0aWFsQ29udGVudFN0cmVhbS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1BhcnRpYWxDb250ZW50U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzk3ODcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1BhcnRpYWxDb250ZW50U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi0vKioKLSAqIENvbnRlbnQgc3RyZWFtIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBzdHJlYW0gbWF5IG5vdCByZXByZXNlbnQgdGhlIGNvbXBsZXRlCi0gKiBkb2N1bWVudCBjb250ZW50LiAoQ2xpZW50IG9ubHkuKQotICogPHA+Ci0gKiBOb3RlIHRoYXQgaWYgdGhlIGNsaWVudCBwcm92aWRlcyBhbiBvZmZzZXQgYW5kL29yIGEgbGVuZ3RoIHRoYXQgY292ZXIgdGhlCi0gKiB3aG9sZSBkb2N1bWVudCBjb250ZW50LCB0aGUgc2VydmVyIG1pZ2h0IHJlcG9ydCB0aGlzIGFzIHBhcnRpYWwgY29udGVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBQYXJ0aWFsQ29udGVudFN0cmVhbSBleHRlbmRzIENvbnRlbnRTdHJlYW0gewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUGVybWlzc2lvbk1hcHBpbmcuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9QZXJtaXNzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzA2NmY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9QZXJtaXNzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBlcm1pc3Npb25NYXBwaW5nIGV4dGVuZHMgU2VyaWFsaXphYmxlLCBFeHRlbnNpb25zRGF0YSB7Ci0gICAgU3RyaW5nIENBTl9HRVRfREVTQ0VOREVOVFNfRk9MREVSID0gImNhbkdldERlc2NlbmRlbnRzLkZvbGRlciI7Ci0gICAgU3RyaW5nIENBTl9HRVRfQ0hJTERSRU5fRk9MREVSID0gImNhbkdldENoaWxkcmVuLkZvbGRlciI7Ci0gICAgU3RyaW5nIENBTl9HRVRfUEFSRU5UU19GT0xERVIgPSAiY2FuR2V0UGFyZW50cy5Gb2xkZXIiOwotICAgIFN0cmluZyBDQU5fR0VUX0ZPTERFUl9QQVJFTlRfT0JKRUNUID0gImNhbkdldEZvbGRlclBhcmVudC5PYmplY3QiOwotICAgIFN0cmluZyBDQU5fQ1JFQVRFX0RPQ1VNRU5UX0ZPTERFUiA9ICJjYW5DcmVhdGVEb2N1bWVudC5Gb2xkZXIiOwotICAgIFN0cmluZyBDQU5fQ1JFQVRFX0ZPTERFUl9GT0xERVIgPSAiY2FuQ3JlYXRlRm9sZGVyLkZvbGRlciI7Ci0gICAgU3RyaW5nIENBTl9DUkVBVEVfUE9MSUNZX0ZPTERFUiA9ICJjYW5DcmVhdGVQb2xpY3kuRm9sZGVyIjsKLSAgICBTdHJpbmcgQ0FOX0NSRUFURV9SRUxBVElPTlNISVBfU09VUkNFID0gImNhbkNyZWF0ZVJlbGF0aW9uc2hpcC5Tb3VyY2UiOwotICAgIFN0cmluZyBDQU5fQ1JFQVRFX1JFTEFUSU9OU0hJUF9UQVJHRVQgPSAiY2FuQ3JlYXRlUmVsYXRpb25zaGlwLlRhcmdldCI7Ci0gICAgU3RyaW5nIENBTl9HRVRfUFJPUEVSVElFU19PQkpFQ1QgPSAiY2FuR2V0UHJvcGVydGllcy5PYmplY3QiOwotICAgIFN0cmluZyBDQU5fVklFV19DT05URU5UX09CSkVDVCA9ICJjYW5WaWV3Q29udGVudC5PYmplY3QiOwotICAgIFN0cmluZyBDQU5fVVBEQVRFX1BST1BFUlRJRVNfT0JKRUNUID0gImNhblVwZGF0ZVByb3BlcnRpZXMuT2JqZWN0IjsKLSAgICBTdHJpbmcgQ0FOX01PVkVfT0JKRUNUID0gImNhbk1vdmUuT2JqZWN0IjsKLSAgICBTdHJpbmcgQ0FOX01PVkVfVEFSR0VUID0gImNhbk1vdmUuVGFyZ2V0IjsKLSAgICBTdHJpbmcgQ0FOX01PVkVfU09VUkNFID0gImNhbk1vdmUuU291cmNlIjsKLSAgICBTdHJpbmcgQ0FOX0RFTEVURV9PQkpFQ1QgPSAiY2FuRGVsZXRlLk9iamVjdCI7Ci0gICAgU3RyaW5nIENBTl9ERUxFVEVfVFJFRV9GT0xERVIgPSAiY2FuRGVsZXRlVHJlZS5Gb2xkZXIiOwotICAgIFN0cmluZyBDQU5fU0VUX0NPTlRFTlRfRE9DVU1FTlQgPSAiY2FuU2V0Q29udGVudC5Eb2N1bWVudCI7Ci0gICAgU3RyaW5nIENBTl9ERUxFVEVfQ09OVEVOVF9ET0NVTUVOVCA9ICJjYW5EZWxldGVDb250ZW50LkRvY3VtZW50IjsKLSAgICBTdHJpbmcgQ0FOX0FERF9UT19GT0xERVJfT0JKRUNUID0gImNhbkFkZFRvRm9sZGVyLk9iamVjdCI7Ci0gICAgU3RyaW5nIENBTl9BRERfVE9fRk9MREVSX0ZPTERFUiA9ICJjYW5BZGRUb0ZvbGRlci5Gb2xkZXIiOwotICAgIFN0cmluZyBDQU5fUkVNT1ZFX0ZST01fRk9MREVSX09CSkVDVCA9ICJjYW5SZW1vdmVGcm9tRm9sZGVyLk9iamVjdCI7Ci0gICAgU3RyaW5nIENBTl9SRU1PVkVfRlJPTV9GT0xERVJfRk9MREVSID0gImNhblJlbW92ZUZyb21Gb2xkZXIuRm9sZGVyIjsKLSAgICBTdHJpbmcgQ0FOX0NIRUNLT1VUX0RPQ1VNRU5UID0gImNhbkNoZWNrb3V0LkRvY3VtZW50IjsKLSAgICBTdHJpbmcgQ0FOX0NBTkNFTF9DSEVDS09VVF9ET0NVTUVOVCA9ICJjYW5DYW5jZWxDaGVja291dC5Eb2N1bWVudCI7Ci0gICAgU3RyaW5nIENBTl9DSEVDS0lOX0RPQ1VNRU5UID0gImNhbkNoZWNraW4uRG9jdW1lbnQiOwotICAgIFN0cmluZyBDQU5fR0VUX0FMTF9WRVJTSU9OU19WRVJTSU9OX1NFUklFUyA9ICJjYW5HZXRBbGxWZXJzaW9ucy5WZXJzaW9uU2VyaWVzIjsKLSAgICBTdHJpbmcgQ0FOX0dFVF9PQkpFQ1RfUkVMQVRJT05TSElQU19PQkpFQ1QgPSAiY2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcy5PYmplY3QiOwotICAgIFN0cmluZyBDQU5fQUREX1BPTElDWV9PQkpFQ1QgPSAiY2FuQWRkUG9saWN5Lk9iamVjdCI7Ci0gICAgU3RyaW5nIENBTl9BRERfUE9MSUNZX1BPTElDWSA9ICJjYW5BZGRQb2xpY3kuUG9saWN5IjsKLSAgICBTdHJpbmcgQ0FOX1JFTU9WRV9QT0xJQ1lfT0JKRUNUID0gImNhblJlbW92ZVBvbGljeS5PYmplY3QiOwotICAgIFN0cmluZyBDQU5fUkVNT1ZFX1BPTElDWV9QT0xJQ1kgPSAiY2FuUmVtb3ZlUG9saWN5LlBvbGljeSI7Ci0gICAgU3RyaW5nIENBTl9HRVRfQVBQTElFRF9QT0xJQ0lFU19PQkpFQ1QgPSAiY2FuR2V0QXBwbGllZFBvbGljaWVzLk9iamVjdCI7Ci0gICAgU3RyaW5nIENBTl9HRVRfQUNMX09CSkVDVCA9ICJjYW5HZXRBQ0wuT2JqZWN0IjsKLSAgICBTdHJpbmcgQ0FOX0FQUExZX0FDTF9PQkpFQ1QgPSAiY2FuQXBwbHlBQ0wuT2JqZWN0IjsKLQotICAgIFN0cmluZyBnZXRLZXkoKTsKLQotICAgIExpc3Q8U3RyaW5nPiBnZXRQZXJtaXNzaW9ucygpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUG9saWN5SWRMaXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUG9saWN5SWRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiY2QwYTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1BvbGljeUlkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIExpc3Qgb2YgcG9saWN5IElEcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBQb2xpY3lJZExpc3QgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IHBvbGljeSBJRHMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBwb2xpY3kgSURzLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldFBvbGljeUlkcygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1ByaW5jaXBhbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1ByaW5jaXBhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFkYThjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9QcmluY2lwYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLS8qKgotICogQUNFIFByaW5jaXBhbC4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcmluY2lwYWwgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcmluY2lwYWwgSUQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJpbmNpcGFsIElECi0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydGllcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwZTA2NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHNldCBvZiBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnRpZXMgZXh0ZW5kcyBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIHByb3BlcnRpZXMgKHByb3BlcnR5IElEID0+IHByb3BlcnR5KS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBxdWVyaWVzIGJlY2F1c2Ugc29tZSByZXBvc2l0b3JpZXMKLSAgICAgKiBkb24ndCBzZXQgcHJvcGVydHkgSURzLCBhbmQgYmVjYXVzZSB3aGVuIGRlYWxpbmcgd2l0aCBxdWVyaWVzIHRoZSBwcm9wZXIKLSAgICAgKiBrZXkgaXMgdXN1YWxseSB0aGUgcXVlcnkgbmFtZSAod2hlbiB1c2luZyBKT0lOcywgc2V2ZXJhbCBwcm9wZXJ0aWVzIHdpdGgKLSAgICAgKiB0aGUgc2FtZSBJRCBtYXkgYmUgcmV0dXJuZWQpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1hcCBvZiBwcm9wZXJ0aWVzLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IGdldFByb3BlcnR5TGlzdCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5Qm9vbGVhbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5Qm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmZmNTA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eUJvb2xlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLS8qKgotICogQm9vbGVhbiBwcm9wZXJ0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUJvb2xlYW4gZXh0ZW5kcyBQcm9wZXJ0eURhdGE8Qm9vbGVhbj4gewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlEYXRhLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzRmMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEJhc2UgcHJvcGVydHkgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5RGF0YTxUPiBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnR5IElELgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm9wZXJ0eSBJRCBtYXkgbm90IGJlIHNldCBpZiB0aGUgb2JqZWN0IGlzIHVzZWQgaW4gYSBxdWVyeSByZXN1bHQuCi0gICAgICogCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgSUQsIG1heSBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2FsIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYWwgbmFtZSwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyBnZXRMb2NhbE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUsIG1heSBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHF1ZXJ5IG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3BlcnR5IHF1ZXJ5IG5hbWUgbXVzdCBiZSBzZXQgaWYgdGhlIG9iamVjdCBpcyB1c2VkIGluIGEgcXVlcnkKLSAgICAgKiByZXN1bHQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcXVlcnkgbmFtZSwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyBnZXRRdWVyeU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIG9mIHRoaXMgcHJvcGVydHkuIEZvciBhIHNpbmdsZSB2YWx1ZSBwcm9wZXJ0eQotICAgICAqIHRoaXMgaXMgYSBsaXN0IHdpdGggb25lIGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdmFsdWVzLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgTGlzdDxUPiBnZXRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBsaXN0IG9mIHZhbHVlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZpcnN0IGVudHJ5IGluIHRoZSBsaXN0IG9mIHZhbHVlcyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGxpc3Qgb2YKLSAgICAgKiAgICAgICAgIHZhbHVlcyBpcyBlbXB0eQotICAgICAqLwotICAgIFQgZ2V0Rmlyc3RWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5RGF0YVdpdGhEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlEYXRhV2l0aERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1ZDRiMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlEYXRhV2l0aERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm9wZXJ0eURhdGEgb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgYWxzbyBtYXkgcHJvdmlkZSB0aGUKLSAqIHByb3BlcnR5IGRlZmluaXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlEYXRhV2l0aERlZmluaXRpb248VD4gZXh0ZW5kcyBQcm9wZXJ0eURhdGE8VD4gewotCi0gICAgUHJvcGVydHlEZWZpbml0aW9uPFQ+IGdldFByb3BlcnR5RGVmaW5pdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5RGF0ZVRpbWUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eURhdGVUaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2ZlMDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5RGF0ZVRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLS8qKgotICogRGF0ZVRpbWUgcHJvcGVydHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlEYXRlVGltZSBleHRlbmRzIFByb3BlcnR5RGF0YTxHcmVnb3JpYW5DYWxlbmRhcj4gewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlEZWNpbWFsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlEZWNpbWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjIzZTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5RGVjaW1hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotCi0vKioKLSAqIERlY2ltYWwgcHJvcGVydHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlEZWNpbWFsIGV4dGVuZHMgUHJvcGVydHlEYXRhPEJpZ0RlY2ltYWw+IHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5SHRtbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5SHRtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJlZjM3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eUh0bWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLS8qKgotICogSFRNTCBwcm9wZXJ0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUh0bWwgZXh0ZW5kcyBQcm9wZXJ0eURhdGE8U3RyaW5nPiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eUlkLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzk4ZWI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eUlkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi0vKioKLSAqIElkIHByb3BlcnR5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SWQgZXh0ZW5kcyBQcm9wZXJ0eURhdGE8U3RyaW5nPiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eUludGVnZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjODE5Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogSW50ZWdlciBwcm9wZXJ0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUludGVnZXIgZXh0ZW5kcyBQcm9wZXJ0eURhdGE8QmlnSW50ZWdlcj4gewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUHJvcGVydHlTdHJpbmcuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eVN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTRiMDZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotLyoqCi0gKiBTdHJpbmcgcHJvcGVydHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTdHJpbmcgZXh0ZW5kcyBQcm9wZXJ0eURhdGE8U3RyaW5nPiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9Qcm9wZXJ0eVVyaS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5VXJpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDdlZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1Byb3BlcnR5VXJpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi0vKioKLSAqIFVSSSBwcm9wZXJ0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVVyaSBleHRlbmRzIFByb3BlcnR5RGF0YTxTdHJpbmc+IHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1JlZGlyZWN0aW5nQ29udGVudFN0cmVhbS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1JlZGlyZWN0aW5nQ29udGVudFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNmMGNjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9SZWRpcmVjdGluZ0NvbnRlbnRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLS8qKgotICogQ29udGVudCBzdHJlYW0gcmVkaXJlY3RpbmcgdG8gYW5vdGhlciBsb2NhdGlvbi4gKEF0b21QdWIgYmluZGluZyBhbmQgQnJvd3NlcgotICogYmluZGluZyBzZXJ2ZXIgb25seS4pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVkaXJlY3RpbmdDb250ZW50U3RyZWFtIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEhUVFAgc3RhdHVzIGNvZGUsIGZvciBleGFtcGxlIDMwMSAobW92ZWQgcGVybWFuZW50bHkpIG9yIDMwNwotICAgICAqICh0ZW1wb3JhcnkgcmVkaXJlY3QpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUKLSAgICAgKi8KLSAgICBpbnQgZ2V0U3RhdHVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiB0byByZWRpcmVjdCB0by4KLSAgICAgKiAKLSAgICAgKiBUaGlzIHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBVUkwsIGFsdGhvdWdoIG1hbnkgY2xpZW50cyBjYW4gYWxzbyBoYW5kbGUgYQotICAgICAqIHJlbGF0aXZlIHBhdGguCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gdG8gcmVkaXJlY3QgdG8KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9SZW5kaXRpb25EYXRhLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUmVuZGl0aW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTE0ZDQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9SZW5kaXRpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJlbmRpdGlvbi4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGl0aW9uRGF0YSBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0cmVhbSBJRCBvZiB0aGUgcmVuZGl0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzdHJlYW0gSUQgaXMgcmVxdWlyZWQgdG8gZmV0Y2ggdGhlIGNvbnRlbnQgb2YgdGhlIHJlbmRpdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdHJlYW0gSUQsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U3RyZWFtSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgcmVuZGl0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIE1JTUUgdHlwZSwgc2hvdWxkIG5vdCBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlbmRpdGlvbiBpbiBieXRlcywgaWYgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHJlbmRpdGlvbiBpbiBieXRlcywgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0QmlnTGVuZ3RoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBraW5kIG9mIHRoZSByZW5kaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIENNSVMgc3BlY2lmaWNhdGlvbiBvbmx5IGRlZmluZXMgdGhlIGtpbmQge0Bjb2RlIGNtaXM6dGh1bWJuYWlsfSwgYnV0Ci0gICAgICogYSByZXBvc2l0b3J5IGNhbiBwcm92aWRlIG90aGVyIGtpbmRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRpdGlvbiBraW5kLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgU3RyaW5nIGdldEtpbmQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSByZW5kaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybnMgdGhlIHJlbmRpdGlvbiB0aXRsZSwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyBnZXRUaXRsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGVpZ2h0IGluIHBpeGVscywgaWYgdGhlIHJlbmRpdGlvbiBpcyBhbiBpbWFnZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJucyB0aGUgaGVpZ2h0IGluIHBpeGVscywgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0QmlnSGVpZ2h0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBpbiBwaXhlbHMsIGlmIHRoZSByZW5kaXRpb24gaXMgYW4gaW1hZ2UuCi0gICAgICogCi0gICAgICogQHJldHVybnMgdGhlIHdpZHRoIGluIHBpeGVscywgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0QmlnV2lkdGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBpZCBvZiB0aGUgcmVuZGl0aW9uIGRvY3VtZW50IGlmIHRoZSByZW5kaXRpb24gaXMgYQotICAgICAqIHN0YW5kLWFsb25lIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRpdGlvbiBkb2N1bWVudCBJRCwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyBnZXRSZW5kaXRpb25Eb2N1bWVudElkKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUmVwb3NpdG9yeUNhcGFiaWxpdGllcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1JlcG9zaXRvcnlDYXBhYmlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmOTYxNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvUmVwb3NpdG9yeUNhcGFiaWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDaGFuZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUpvaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5T3JkZXJCeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlSZW5kaXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgZXh0ZW5kcyBTZXJpYWxpemFibGUsIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8vIE9iamVjdAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIGdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQ2FwYWJpbGl0eUNoYW5nZXMgZ2V0Q2hhbmdlc0NhcGFiaWxpdHkoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIENhcGFiaWxpdHlSZW5kaXRpb25zIGdldFJlbmRpdGlvbnNDYXBhYmlsaXR5KCk7Ci0KLSAgICAvLyBOYXZpZ2F0aW9uCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNHZXRGb2xkZXJUcmVlU3VwcG9ydGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBDYXBhYmlsaXR5T3JkZXJCeSBnZXRPcmRlckJ5Q2FwYWJpbGl0eSgpOwotCi0gICAgLy8gRmlsaW5nCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGlzTXVsdGlmaWxpbmdTdXBwb3J0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNVbmZpbGluZ1N1cHBvcnRlZCgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc1ZlcnNpb25TcGVjaWZpY0ZpbGluZ1N1cHBvcnRlZCgpOwotCi0gICAgLy8gVmVyc2lvbmluZwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNQd2NVcGRhdGFibGVTdXBwb3J0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNBbGxWZXJzaW9uc1NlYXJjaGFibGVTdXBwb3J0ZWQoKTsKLQotICAgIC8vIFF1ZXJ5Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDYXBhYmlsaXR5UXVlcnkgZ2V0UXVlcnlDYXBhYmlsaXR5KCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDYXBhYmlsaXR5Sm9pbiBnZXRKb2luQ2FwYWJpbGl0eSgpOwotCi0gICAgLy8gQUNMcwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQ2FwYWJpbGl0eUFjbCBnZXRBY2xDYXBhYmlsaXR5KCk7Ci0KLSAgICAvLyBUeXBlIG11dGFiaWxpdHkKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIENyZWF0YWJsZVByb3BlcnR5VHlwZXMgZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBnZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGF0YS9SZXBvc2l0b3J5SW5mby5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1JlcG9zaXRvcnlJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMmI1MTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL1JlcG9zaXRvcnlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci0KLS8qKgotICogUmVwb3NpdG9yeSBJbmZvLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvc2l0b3J5SW5mbyBleHRlbmRzIFNlcmlhbGl6YWJsZSwgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSBJRC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IElELCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVwb3NpdG9yeSBuYW1lLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlcG9zaXRvcnkgZGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVwb3NpdG9yeSBkZXNjcmlwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVwb3NpdG9yeSB2ZW5kb3IgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IHZlbmRvciBuYW1lLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldFZlbmRvck5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlcG9zaXRvcnkgcHJvZHVjdCBuYW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlcG9zaXRvcnkgcHJvZHVjdCBuYW1lLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldFByb2R1Y3ROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IHByb2R1Y3QgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IHByb2R1Y3QgdmVyc2lvbiwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRQcm9kdWN0VmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IElEIG9mIHRoZSByb290IGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSByb290IGZvbGRlciBJRCwgbm90IHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRSb290Rm9sZGVySWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlcG9zaXRvcnkgY2FwYWJpbGl0aWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlcG9zaXRvcnkgY2FwYWJpbGl0aWVzLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBnZXRDYXBhYmlsaXRpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEFDTCBjYXBhYmlsaXRpZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgQUNMIGNhcGFiaWxpdGllcywgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEFjbENhcGFiaWxpdGllcyBnZXRBY2xDYXBhYmlsaXRpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhdGVzdCBjaGFuZ2UgbG9nIHRva2VuLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxhdGVzdCBjaGFuZ2UgbG9nIHRva2VuLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDTUlTIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3NpdG9yeSBhcyBhIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdXBwb3J0ZWQgQ01JUyB2ZXJzaW9uLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldENtaXNWZXJzaW9uU3VwcG9ydGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDTUlTIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3NpdG9yeSBhcyBhCi0gICAgICoge0BsaW5rIENtaXNWZXJzaW9ufSBlbnVtLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1cHBvcnRlZCBDTUlTIHZlcnNpb24sIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJMIG9mIGEgd2ViIGludGVyZmFjZSBmb3IgdGhpcyByZXBvc2l0b3J5LCBpZiBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdGhpbiBjbGllbnQgVVJMLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldFRoaW5DbGllbnRVcmkoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRyaWVzIGluIHRoZSBjaGFuZ2UgbG9nIGFyZSBpbmNvbXBsZXRlIG9yCi0gICAgICogY29tcGxldGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNoYW5nZXMgYXJlIGluY29tcGxldGUsIHtAY29kZSBmYWxzZX0gaWYgdGhlCi0gICAgICogICAgICAgICBjaGFuZ2VzIGFyZSBjb21wbGV0ZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXBvc2l0b3J5IGRpZG4ndAotICAgICAqICAgICAgICAgcHJvdmlkZSB0aGlzIGZsYWcKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGdldENoYW5nZXNJbmNvbXBsZXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoaWNoIHR5cGVzIG9mIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgaW4gdGhlIGNoYW5nZSBsb2cuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB0eXBlIElEcywgbm90IHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIExpc3Q8QmFzZVR5cGVJZD4gZ2V0Q2hhbmdlc09uVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBwcmluY2lwYWwgSUQgZm9yIGFuIGFub255bW91cyB1c2VyIChhbnkgYXV0aGVudGljYXRlZCB1c2VyKS4gVGhpcwotICAgICAqIHByaW5jaXBhbCBJRCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGFuIHtAbGluayBBY2V9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByaW5jaXBhbCBJRCBmb3IgYW4gYW5vbnltb3VzIHVzZXIgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSBkb2VzIG5vdCBzdXBwb3J0IGFub255bW91cyB1c2VycwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRQcmluY2lwYWxJZEFub255bW91cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBwcmluY2lwYWwgSUQgZm9yIHVuYXV0aGVudGljYXRlZCB1c2VyIChndWVzdCB1c2VyKS4gVGhpcwotICAgICAqIHByaW5jaXBhbCBJRCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGFuIHtAbGluayBBY2V9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByaW5jaXBhbCBJRCBmb3IgdW5hdXRoZW50aWNhdGVkIHVzZXIgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQotICAgICAqICAgICAgICAgcmVwb3NpdG9yeSBkb2VzIG5vdCBzdXBwb3J0IHVuYXV0aGVudGljYXRlZCB1c2VycwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRQcmluY2lwYWxJZEFueW9uZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBDTUlTIGV4dGVuc2lvbiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhpcyByZXBvc2l0b3J5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmVhdHVyZXMsIG1heSBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjEKLSAgICAgKi8KLSAgICBMaXN0PEV4dGVuc2lvbkZlYXR1cmU+IGdldEV4dGVuc2lvbkZlYXR1cmVzKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvcGFja2FnZS5odG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kYXRhL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzNjJlOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RhdGEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLSAKLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci1PcGVuQ01JUyBkYXRhIGludGVyZmFjZXMuCi08cD5UaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGludGVyZmFjZXMgZm9yIGNsYXNzZXMgdGhhdCB0cmFuc3BvcnQKLWRhdGEuPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvQ2hvaWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL0Nob2ljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI1N2RjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvQ2hvaWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIENob2ljZSB2YWx1ZSBpbnRlcmZhY2UuCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENob2ljZTxUPiBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgY2hvaWNlIHZhbHVlLgotICAgICAqLwotICAgIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgY2hvaWNlIHZhbHVlLiBTaW5nbGUgdmFsdWUgcHJvcGVydGllcyByZXR1cm4gYQotICAgICAqIGxpc3Qgd2l0aCBleGFjdGx5IG9uZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBMaXN0PFQ+IGdldFZhbHVlKCk7Ci0KLSAgICBMaXN0PENob2ljZTxUPj4gZ2V0Q2hvaWNlKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL0RvY3VtZW50VHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvRG9jdW1lbnRUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQxNzRiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvRG9jdW1lbnRUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotCi0vKioKLSAqIERvY3VtZW50IFR5cGUgRGVmaW5pdGlvbi4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBleHRlbmRzIFR5cGVEZWZpbml0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBvYmplY3RzIG9mIHRoaXMgdHlwZSBhcmUgdmVyc2lvbmFibGUgb3Igbm90LgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNWZXJzaW9uYWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiBhIGNvbnRlbnQgc3RyZWFtIG11c3QgYmUgc2V0LgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIENvbnRlbnRTdHJlYW1BbGxvd2VkIGdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL0ZvbGRlclR5cGVEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL0ZvbGRlclR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWFiYjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Gb2xkZXJUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLS8qKgotICogRm9sZGVyIFR5cGUgRGVmaW5pdGlvbi4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9sZGVyVHlwZURlZmluaXRpb24gZXh0ZW5kcyBUeXBlRGVmaW5pdGlvbiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvSXRlbVR5cGVEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL0l0ZW1UeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ4Yjg1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvSXRlbVR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotLyoqCi0gKiBJdGVtIFR5cGUgRGVmaW5pdGlvbi4KLSAqIAotICogQGNtaXMgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbVR5cGVEZWZpbml0aW9uIGV4dGVuZHMgVHlwZURlZmluaXRpb24gewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmIxM2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotCi0vKioKLSAqIE11dGFibGUgRG9jdW1lbnQgVHlwZSBEZWZpbml0aW9uLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBleHRlbmRzIERvY3VtZW50VHlwZURlZmluaXRpb24sIE11dGFibGVUeXBlRGVmaW5pdGlvbiB7Ci0KLSAgICB2b2lkIHNldENvbnRlbnRTdHJlYW1BbGxvd2VkKENvbnRlbnRTdHJlYW1BbGxvd2VkIGNvbnRlbnRTdHJlYW1BbGxvd2VkKTsKLQotICAgIHZvaWQgc2V0SXNWZXJzaW9uYWJsZShCb29sZWFuIGlzVmVyc2lvbmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlRm9sZGVyVHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZUZvbGRlclR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMGFhNWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlRm9sZGVyVHlwZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi0vKioKLSAqIE11dGFibGUgRm9sZGVyIFR5cGUgRGVmaW5pdGlvbi4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZUZvbGRlclR5cGVEZWZpbml0aW9uIGV4dGVuZHMgRm9sZGVyVHlwZURlZmluaXRpb24sIE11dGFibGVUeXBlRGVmaW5pdGlvbiB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVJdGVtVHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE2ZjAwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLS8qKgotICogTXV0YWJsZSBJdGVtIFR5cGUgRGVmaW5pdGlvbi4KLSAqIAotICogQGNtaXMgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbiBleHRlbmRzIEl0ZW1UeXBlRGVmaW5pdGlvbiwgTXV0YWJsZVR5cGVEZWZpbml0aW9uIHsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVBvbGljeVR5cGVEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGY1MmIzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVBvbGljeVR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotLyoqCi0gKiBNdXRhYmxlIFBvbGljeSBUeXBlIERlZmluaXRpb24uCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbiBleHRlbmRzIFBvbGljeVR5cGVEZWZpbml0aW9uLCBNdXRhYmxlVHlwZURlZmluaXRpb24gewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEzNmQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uIGV4dGVuZHMgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbiwgTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbjxCb29sZWFuPiB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NWJlMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lUmVzb2x1dGlvbjsKLQotcHVibGljIGludGVyZmFjZSBNdXRhYmxlUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24gZXh0ZW5kcyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbiwKLSAgICAgICAgTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbjxHcmVnb3JpYW5DYWxlbmRhcj4gewotCi0gICAgdm9pZCBzZXREYXRlVGltZVJlc29sdXRpb24oRGF0ZVRpbWVSZXNvbHV0aW9uIGRhdGVUaW1lUmVzb2x1dGlvbik7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzY4NTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGVjaW1hbFByZWNpc2lvbjsKLQotcHVibGljIGludGVyZmFjZSBNdXRhYmxlUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbiBleHRlbmRzIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24sCi0gICAgICAgIE11dGFibGVQcm9wZXJ0eURlZmluaXRpb248QmlnRGVjaW1hbD4gewotCi0gICAgdm9pZCBzZXRNaW5WYWx1ZShCaWdEZWNpbWFsIG1pblZhbHVlKTsKLQotICAgIHZvaWQgc2V0TWF4VmFsdWUoQmlnRGVjaW1hbCBtYXhWYWx1ZSk7Ci0KLSAgICB2b2lkIHNldFByZWNpc2lvbihEZWNpbWFsUHJlY2lzaW9uIHByZWNpc2lvbik7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTg2OTkyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci0KLS8qKgotICogTXV0YWJsZSBiYXNlIHByb3BlcnR5IGRlZmluaXRpb24gaW50ZXJmYWNlLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPFQ+IGV4dGVuZHMgUHJvcGVydHlEZWZpbml0aW9uPFQ+IHsKLQotICAgIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLQotICAgIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBsb2NhbE5hbWUpOwotCi0gICAgdm9pZCBzZXRMb2NhbE5hbWVzcGFjZShTdHJpbmcgbG9jYWxOYW1lc3BhY2UpOwotCi0gICAgdm9pZCBzZXRRdWVyeU5hbWUoU3RyaW5nIHF1ZXJ5TmFtZSk7Ci0KLSAgICB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSk7Ci0KLSAgICB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLSAgICB2b2lkIHNldFByb3BlcnR5VHlwZShQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlKTsKLQotICAgIHZvaWQgc2V0Q2FyZGluYWxpdHkoQ2FyZGluYWxpdHkgY2FyZGluYWxpdHkpOwotCi0gICAgdm9pZCBzZXRDaG9pY2VzKExpc3Q8Q2hvaWNlPFQ+PiBjaG9pY2VMaXN0KTsKLQotICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKExpc3Q8VD4gZGVmYXVsdFZhbHVlKTsKLQotICAgIHZvaWQgc2V0VXBkYXRhYmlsaXR5KFVwZGF0YWJpbGl0eSB1cGRhdGFiaWxpdHkpOwotCi0gICAgdm9pZCBzZXRJc0luaGVyaXRlZChCb29sZWFuIGlzSW5oZXJpdGVkKTsKLQotICAgIHZvaWQgc2V0SXNRdWVyeWFibGUoQm9vbGVhbiBpc1F1ZXJ5YWJsZSk7Ci0KLSAgICB2b2lkIHNldElzT3JkZXJhYmxlKEJvb2xlYW4gaXNPcmRlcmFibGUpOwotCi0gICAgdm9pZCBzZXRJc1JlcXVpcmVkKEJvb2xlYW4gaXNSZXF1aXJlZCk7Ci0KLSAgICB2b2lkIHNldElzT3BlbkNob2ljZShCb29sZWFuIGlzT3BlbkNob2ljZSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eUh0bWxEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eUh0bWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOWEyMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlIdG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZVByb3BlcnR5SHRtbERlZmluaXRpb24gZXh0ZW5kcyBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uLCBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlJZERlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVByb3BlcnR5SWREZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTg2MWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlJZERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIE11dGFibGVQcm9wZXJ0eUlkRGVmaW5pdGlvbiBleHRlbmRzIFByb3BlcnR5SWREZWZpbml0aW9uLCBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA0ODNjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVByb3BlcnR5SW50ZWdlckRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZVByb3BlcnR5SW50ZWdlckRlZmluaXRpb24gZXh0ZW5kcyBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uLAotICAgICAgICBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPEJpZ0ludGVnZXI+IHsKLQotICAgIHZvaWQgc2V0TWluVmFsdWUoQmlnSW50ZWdlciBtaW5WYWx1ZSk7Ci0KLSAgICB2b2lkIHNldE1heFZhbHVlKEJpZ0ludGVnZXIgbWF4VmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlMWJmMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZVByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiBleHRlbmRzIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiwgTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbjxTdHJpbmc+IHsKLQotICAgIHZvaWQgc2V0TWF4TGVuZ3RoKEJpZ0ludGVnZXIgbWF4TGVuZ3RoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVByb3BlcnR5VXJpRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlVcmlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzQzMmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUHJvcGVydHlVcmlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBNdXRhYmxlUHJvcGVydHlVcmlEZWZpbml0aW9uIGV4dGVuZHMgUHJvcGVydHlVcmlEZWZpbml0aW9uLCBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGNmMTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTXV0YWJsZSBSZWxhdGlvbnNoaXAgVHlwZSBEZWZpbml0aW9uLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBNdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gZXh0ZW5kcyBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiwgTXV0YWJsZVR5cGVEZWZpbml0aW9uIHsKLQotICAgIHZvaWQgc2V0QWxsb3dlZFNvdXJjZVR5cGVzKExpc3Q8U3RyaW5nPiBhbGxvd2VkU291cmNlVHlwZXMpOwotCi0gICAgdm9pZCBzZXRBbGxvd2VkVGFyZ2V0VHlwZXMoTGlzdDxTdHJpbmc+IGFsbG93ZWRUYXJnZXRUeXBlcyk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9NdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5MTFmNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLS8qKgotICogTXV0YWJsZSBTZWNvbmRhcnkgVHlwZSBEZWZpbml0aW9uLgotICogCi0gKiBAY21pcyAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gZXh0ZW5kcyBTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbiwgTXV0YWJsZVR5cGVEZWZpbml0aW9uIHsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVR5cGVEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL011dGFibGVUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjJlODdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvTXV0YWJsZVR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLQotcHVibGljIGludGVyZmFjZSBNdXRhYmxlVHlwZURlZmluaXRpb24gZXh0ZW5kcyBUeXBlRGVmaW5pdGlvbiB7Ci0KLSAgICB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0KLSAgICB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbG9jYWxOYW1lKTsKLQotICAgIHZvaWQgc2V0TG9jYWxOYW1lc3BhY2UoU3RyaW5nIGxvY2FsTmFtZXNwYWNlKTsKLQotICAgIHZvaWQgc2V0UXVlcnlOYW1lKFN0cmluZyBxdWVyeU5hbWUpOwotCi0gICAgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpOwotCi0gICAgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0gICAgdm9pZCBzZXRCYXNlVHlwZUlkKEJhc2VUeXBlSWQgYmFzZUlkKTsKLQotICAgIHZvaWQgc2V0UGFyZW50VHlwZUlkKFN0cmluZyBwYXJlbnRJZCk7Ci0KLSAgICB2b2lkIHNldElzQ3JlYXRhYmxlKEJvb2xlYW4gaXNDcmVhdGFibGUpOwotCi0gICAgdm9pZCBzZXRJc0ZpbGVhYmxlKEJvb2xlYW4gaXNGaWxlYWJsZSk7Ci0KLSAgICB2b2lkIHNldElzUXVlcnlhYmxlKEJvb2xlYW4gaXNRdWVyeWFibGUpOwotCi0gICAgdm9pZCBzZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeShCb29sZWFuIGlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KTsKLQotICAgIHZvaWQgc2V0SXNGdWxsdGV4dEluZGV4ZWQoQm9vbGVhbiBpc0Z1bGx0ZXh0SW5kZXhlZCk7Ci0KLSAgICB2b2lkIHNldElzQ29udHJvbGxhYmxlQWNsKEJvb2xlYW4gaXNDb250cm9sbGFibGVBQ0wpOwotCi0gICAgdm9pZCBzZXRJc0NvbnRyb2xsYWJsZVBvbGljeShCb29sZWFuIGlzQ29udHJvbGxhYmxlUG9saWN5KTsKLQotICAgIHZvaWQgc2V0VHlwZU11dGFiaWxpdHkoVHlwZU11dGFiaWxpdHkgdHlwZU11dGFiaWxpdHkpOwotCi0gICAgLy8gLS0tIHByb3BlcnR5IGRlZmluaXRpb25zIC0tLQotCi0gICAgLyoqCi0gICAgICogQWRkcyBvciByZXBsYWNlcyBhIHByb3BlcnR5IGRlZmluaXRpb24uCi0gICAgICovCi0gICAgdm9pZCBhZGRQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BlcnR5RGVmaW5pdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcHJvcGVydHkgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVByb3BlcnR5RGVmaW5pdGlvbihTdHJpbmcgcHJvcGVydHlJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBwcm9wZXJ0eSBkZWZpbml0aW9ucy4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUFsbFByb3BlcnR5RGVmaW5pdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUGVybWlzc2lvbkRlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUGVybWlzc2lvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4OWIwZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Blcm1pc3Npb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotCi0vKioKLSAqIFBlcm1pc3Npb24gZGVmaW5pdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJtaXNzaW9uRGVmaW5pdGlvbiBleHRlbmRzIFNlcmlhbGl6YWJsZSwgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGVybWlzc2lvbiBJRC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGVybWlzc2lvbi4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUG9saWN5VHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUG9saWN5VHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3ZDdiOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1BvbGljeVR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotLyoqCi0gKiBQb2xpY3kgVHlwZSBEZWZpbml0aW9uLgotICogCi0gKiBAY21pcyAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBQb2xpY3lUeXBlRGVmaW5pdGlvbiBleHRlbmRzIFR5cGVEZWZpbml0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhZTUzMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi0vKioKLSAqIFByb3BlcnR5IGRlZmluaXRpb24gb2YgYSBib29sZWFuIHByb3BlcnR5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24gZXh0ZW5kcyBQcm9wZXJ0eURlZmluaXRpb248Qm9vbGVhbj4gewotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE4OWFlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZVJlc29sdXRpb247Ci0KLS8qKgotICogUHJvcGVydHkgZGVmaW5pdGlvbiBvZiBhIGRhdGV0aW1lIHByb3BlcnR5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uIGV4dGVuZHMgUHJvcGVydHlEZWZpbml0aW9uPEdyZWdvcmlhbkNhbGVuZGFyPiB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoaWNoIGRhdGV0aW1lIHJlc29sdXRpb24gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHNlZSBEYXRlVGltZVJlc29sdXRpb24KLSAgICAgKi8KLSAgICBEYXRlVGltZVJlc29sdXRpb24gZ2V0RGF0ZVRpbWVSZXNvbHV0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJmMzMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGVjaW1hbFByZWNpc2lvbjsKLQotLyoqCi0gKiBQcm9wZXJ0eSBkZWZpbml0aW9uIG9mIGEgZGVjaW1hbCBwcm9wZXJ0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uIGV4dGVuZHMgUHJvcGVydHlEZWZpbml0aW9uPEJpZ0RlY2ltYWw+IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBvZiB0aGlzIGRlY2ltYWwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGxpbWl0IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIEJpZ0RlY2ltYWwgZ2V0TWluVmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBvZiB0aGlzIGRlY2ltYWwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4IHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGxpbWl0IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIEJpZ0RlY2ltYWwgZ2V0TWF4VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZWNpc2lvbiB0aGlzIGRlY2ltYWwuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJlY2lzaW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkZWNpbWFsIHN1cHBvcnRzIGFueQotICAgICAqICAgICAgICAgdmFsdWUKLSAgICAgKiAKLSAgICAgKiBAc2VlIERlY2ltYWxQcmVjaXNpb24KLSAgICAgKi8KLSAgICBEZWNpbWFsUHJlY2lzaW9uIGdldFByZWNpc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDg4ZDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci0KLS8qKgotICogQmFzZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGludGVyZmFjZS4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlEZWZpbml0aW9uPFQ+IGV4dGVuZHMgU2VyaWFsaXphYmxlLCBFeHRlbnNpb25zRGF0YSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uIElELgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGRlZmluaXRpb24gSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2FsIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbG9jYWwgbmFtZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRMb2NhbE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxvY2FsIG5hbWVzcGFjZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBuYW1lc3BhY2UKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TG9jYWxOYW1lc3BhY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBkaXNwbGF5IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHF1ZXJ5IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBxdWVyeSBuYW1lCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldFF1ZXJ5TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiByZXR1cm5zIHRoZSBkZXNjcmlwdGlvbgotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB0eXBlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgUHJvcGVydHlUeXBlIGdldFByb3BlcnR5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2FyZGluYWxpdHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2FyZGluYWxpdHkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBDYXJkaW5hbGl0eSBnZXRDYXJkaW5hbGl0eSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdXBkYXRhYmlsaXR5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0YWJpbGl0eQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFVwZGF0YWJpbGl0eSBnZXRVcGRhdGFiaWxpdHkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHByb3BlcnR5IGlzIGluaGVyaXRlZCBieSBhIHBhcmVudCB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IC0gaXMgaW5oZXJpdGVkOyB7QGNvZGUgZmFsc2V9IC0gaXMgbm90IGluaGVyaXRlZDsKLSAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSAtIHVua25vd24gKG5vbmNvbXBsaWFudCByZXBvc2l0b3J5KQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNJbmhlcml0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IC0gaXMgcmVxdWlyZWQ7IHtAY29kZSBmYWxzZX0gLSBpcyBub3QgcmVxdWlyZWQ7Ci0gICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gLSB1bmtub3duIChub25jb21wbGlhbnQgcmVwb3NpdG9yeSkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGlzUmVxdWlyZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHByb3BlcnR5IGlzIHF1ZXJ5YWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSAtIGlzIHF1ZXJ5YWJsZTsge0Bjb2RlIGZhbHNlfSAtIGlzIG5vdCBxdWVyeWFibGU7Ci0gICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gLSB1bmtub3duIChub25jb21wbGlhbnQgcmVwb3NpdG9yeSkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGlzUXVlcnlhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSBwcm9wZXJ0eSBpcyBPcmRlcmFibGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gLSBpcyBPcmRlcmFibGU7IHtAY29kZSBmYWxzZX0gLSBpcyBub3QgT3JkZXJhYmxlOwotICAgICAqICAgICAgICAge0Bjb2RlIG51bGx9IC0gdW5rbm93biAobm9uY29tcGxpYW50IHJlcG9zaXRvcnkpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc09yZGVyYWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgcHJvcGVydHkgc3VwcG9ydHMgb3BlbiBjaG9pY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gLSBzdXBwb3J0cyBvcGVuIGNob2ljZTsge0Bjb2RlIGZhbHNlfSAtIGRvZXMgbm90Ci0gICAgICogICAgICAgICBzdXBwb3J0IG9wZW4gY2hvaWNlOyB7QGNvZGUgbnVsbH0gLSB1bmtub3duIG9yIG5vdCBhcHBsaWNhYmxlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc09wZW5DaG9pY2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSAobGlzdCkgb3IgYW4gZW1wdHkgbGlzdCBpZiBubyBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogICAgICAgICBkZWZpbmVkCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxUPiBnZXREZWZhdWx0VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNob2ljZXMgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY2hvaWNlcyBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIGNob2ljZXMgYXJlIGRlZmluZWQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PENob2ljZTxUPj4gZ2V0Q2hvaWNlcygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5SHRtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExYTZmZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5SHRtbERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi0vKioKLSAqIFByb3BlcnR5IGRlZmluaXRpb24gb2YgYSBIVE1MIHByb3BlcnR5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5SHRtbERlZmluaXRpb24gZXh0ZW5kcyBQcm9wZXJ0eURlZmluaXRpb248U3RyaW5nPiB7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5SWREZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5SWREZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YzcxYzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eUlkRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLS8qKgotICogUHJvcGVydHkgZGVmaW5pdGlvbiBvZiBhbiBJRCBwcm9wZXJ0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUlkRGVmaW5pdGlvbiBleHRlbmRzIFByb3BlcnR5RGVmaW5pdGlvbjxTdHJpbmc+IHsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMDg3M2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIFByb3BlcnR5IGRlZmluaXRpb24gb2YgYW4gaW50ZWdlciBwcm9wZXJ0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uIGV4dGVuZHMgUHJvcGVydHlEZWZpbml0aW9uPEJpZ0ludGVnZXI+IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBvZiB0aGlzIGludGVnZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWluIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGxpbWl0IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0TWluVmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBvZiB0aGlzIGludGVnZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4IHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGxpbWl0IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0TWF4VmFsdWUoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTg0ZmY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIFByb3BlcnR5IGRlZmluaXRpb24gb2YgYSBzdHJpbmcgcHJvcGVydHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIGV4dGVuZHMgUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4IGxlbmd0aCBvZiB0aGUgc3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG1heCBzdHJpbmcgbGVuZ3RoIGluIGNoYXJhY3RlcnMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0gICAgICogICAgICAgICB0aGUgbGVuZ3RoIGlzIG5vdCBsaW1pdGVkCi0gICAgICovCi0gICAgQmlnSW50ZWdlciBnZXRNYXhMZW5ndGgoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlVcmlEZWZpbml0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1Byb3BlcnR5VXJpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDgxNDUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUHJvcGVydHlVcmlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotLyoqCi0gKiBQcm9wZXJ0eSBkZWZpbml0aW9uIG9mIGEgVVJJIHByb3BlcnR5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5VXJpRGVmaW5pdGlvbiBleHRlbmRzIFByb3BlcnR5RGVmaW5pdGlvbjxTdHJpbmc+IHsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlOTE3MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1JlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlbGF0aW9uc2hpcCBUeXBlIERlZmluaXRpb24uCi0gKiAKLSAqIEBjbWlzIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIGV4dGVuZHMgVHlwZURlZmluaXRpb24gewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0eXBlIElEcyB0aGF0IGFyZSBhbGxvd2VkIGFzIHNvdXJjZSBvYmplY3RzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbGlzdCBvZiB0eXBlIElEcyBvciB7QGNvZGUgbnVsbH0gaWYgYWxsIHR5cGVzIGFyZSBhbGxvd2VkCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldEFsbG93ZWRTb3VyY2VUeXBlSWRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHR5cGUgSURzIHRoYXQgYXJlIGFsbG93ZWQgYXMgdGFyZ2V0IG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBsaXN0IG9mIHR5cGUgSURzIG9yIHtAY29kZSBudWxsfSBpZiBhbGwgdHlwZXMgYXJlIGFsbG93ZWQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZFRhcmdldFR5cGVJZHMoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvU2Vjb25kYXJ5VHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvU2Vjb25kYXJ5VHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlYjQyNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1NlY29uZGFyeVR5cGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotLyoqCi0gKiBTZWNvbmRhcnkgVHlwZSBEZWZpbml0aW9uLgotICogCi0gKiBAY21pcyAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbiBleHRlbmRzIFR5cGVEZWZpbml0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9UeXBlRGVmaW5pdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9UeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWQwM2IyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvVHlwZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotCi0vKioKLSAqIEJhc2UgdHlwZSBkZWZpbml0aW9uIGludGVyZmFjZS4KLSAqIAotICogQGNtaXMgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZURlZmluaXRpb24gZXh0ZW5kcyBTZXJpYWxpemFibGUsIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgSUQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBJRCwgbm90IHtAY29kZSBudWxsfQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYWwgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBuYW1lCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldExvY2FsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYWwgbmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIG5hbWVzcGFjZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRMb2NhbE5hbWVzcGFjZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGRpc3BsYXkgbmFtZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcXVlcnkgbmFtZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHF1ZXJ5IG5hbWUKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UXVlcnlOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlc2NyaXB0aW9uCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIG9iamVjdCB0eXBlIElELgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJhc2Ugb2JqZWN0IHR5cGUgSUQKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCYXNlVHlwZUlkIGdldEJhc2VUeXBlSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhcmVudCB0eXBlIElELgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCB0eXBlIElEIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgdHlwZSBpcyBhIGJhc2UgdHlwZQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIFN0cmluZyBnZXRQYXJlbnRUeXBlSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgYW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBjYW4gYmUgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbiBiZSBjcmVhdGVkOwotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBjcmVhdGlvbiBvZiBvYmplY3RzIG9mIHRoaXMgdHlwZSBpcyBub3QKLSAgICAgKiAgICAgICAgIHBvc3NpYmxlOyB7QGNvZGUgbnVsbH0gLSB1bmtub3duIChub25jb21wbGlhbnQgcmVwb3NpdG9yeSkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGlzQ3JlYXRhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIGFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2FuIGJlIGZpbGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFuIG9iamVjdCBvZiB0aGlzIHR5cGUgY2FuIGJlIGZpbGVkOwotICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBhbiBvYmplY3Qgb2YgdGhpcyB0eXBlIGNhbm5vdCBiZSBmaWxlZDsKLSAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSAtIHVua25vd24gKG5vbmNvbXBsaWFudCByZXBvc2l0b3J5KQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNGaWxlYWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIHR5cGUgaXMgcXVlcnlhYmxlLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgdHlwZSBpcyBxdWVyeWFibGU7IHtAY29kZSBmYWxzZX0gaWYgdGhpcwotICAgICAqICAgICAgICAgdHlwZSBpcyBub3QgcXVlcnlhYmxlOyB7QGNvZGUgbnVsbH0gLSB1bmtub3duIChub25jb21wbGlhbnQKLSAgICAgKiAgICAgICAgIHJlcG9zaXRvcnkpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc1F1ZXJ5YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIHR5cGUgaXMgZnVsbCB0ZXh0IGluZGV4ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB0eXBlIGlzIGZ1bGwgdGV4dCBpbmRleGVkOyB7QGNvZGUgZmFsc2V9IGlmCi0gICAgICogICAgICAgICB0aGlzIHR5cGUgaXMgbm90IGZ1bGwgdGV4dCBpbmRleGVkOyB7QGNvZGUgbnVsbH0gLSB1bmtub3duCi0gICAgICogICAgICAgICAobm9uY29tcGxpYW50IHJlcG9zaXRvcnkpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc0Z1bGx0ZXh0SW5kZXhlZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGlzIHR5cGUgaXMgaW5jbHVkZWQgaW4gcXVlcmllcyB0aGF0IHF1ZXJ5IHRoZSBzdXBlciB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgdHlwZSBpcyBpbmNsdWRlZDsge0Bjb2RlIGZhbHNlfSBpZiB0aGlzIHR5cGUKLSAgICAgKiAgICAgICAgIGlzIG5vdCBpbmNsdWRlZDsge0Bjb2RlIG51bGx9IC0gdW5rbm93biAobm9uY29tcGxpYW50IHJlcG9zaXRvcnkpCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgQm9vbGVhbiBpc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiBvYmplY3RzIG9mIHRoaXMgdHlwZSBhcmUgY29udHJvbGxhYmxlIGJ5IHBvbGljaWVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG9iamVjdHMgYXJlIGNvbnRyb2xsYWJsZSBieSBwb2xpY2llczsKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgb2JqZWN0cyBhcmUgbm90IGNvbnRyb2xsYWJsZSBieSBwb2xpY2llczsKLSAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSAtIHVua25vd24gKG5vbmNvbXBsaWFudCByZXBvc2l0b3J5KQotICAgICAqIAotICAgICAqIEBjbWlzIDEuMAotICAgICAqLwotICAgIEJvb2xlYW4gaXNDb250cm9sbGFibGVQb2xpY3koKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgb2JqZWN0cyBvZiB0aGlzIHR5cGUgYXJlIGNvbnRyb2xsYWJsZSBieSBBQ0xzLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG9iamVjdHMgYXJlIGNvbnRyb2xsYWJsZSBieSBBQ0xzOyB7QGNvZGUgZmFsc2V9Ci0gICAgICogICAgICAgICBpZiBvYmplY3RzIGFyZSBub3QgY29udHJvbGxhYmxlIGJ5IEFDTHM7IHtAY29kZSBudWxsfSAtIHVua25vd24KLSAgICAgKiAgICAgICAgIChub25jb21wbGlhbnQgcmVwb3NpdG9yeSkKLSAgICAgKiAKLSAgICAgKiBAY21pcyAxLjAKLSAgICAgKi8KLSAgICBCb29sZWFuIGlzQ29udHJvbGxhYmxlQWNsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucyBvZiB0aGlzIHR5cGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcm9wZXJ0eQotICAgICAqICAgICAgICAgZGVmaW5pdGlvbnMgd2VyZSBub3QgcmVxdWVzdGVkCi0gICAgICogCi0gICAgICogQGNtaXMgMS4wCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBnZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHR5cGUgbXV0YWJpbGl0eSBmbGFncy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHR5cGUgbXV0YWJpbGl0eSBmbGFncwotICAgICAqIAotICAgICAqIEBjbWlzIDEuMQotICAgICAqLwotICAgIFR5cGVNdXRhYmlsaXR5IGdldFR5cGVNdXRhYmlsaXR5KCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1R5cGVEZWZpbml0aW9uQ29udGFpbmVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1R5cGVEZWZpbml0aW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YjAyZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9UeXBlRGVmaW5pdGlvbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLQotLyoqCi0gKiBUeXBlIERlZmluaXRpb24gQ29udGFpbmVyLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYnVpbGQgYSB0cmVlIG9mIHR5cGUKLSAqIGRlZmluaXRpb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGV4dGVuZHMgRXh0ZW5zaW9uc0RhdGEgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBkZWZpbml0aW9uIGF0IHRoaXMgbGV2ZWwuCi0gICAgICovCi0gICAgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZSB0eXBlIGRlZmluaXRpb24gYXQgdGhpcyBsZXZlbC4KLSAgICAgKi8KLSAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRDaGlsZHJlbigpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9UeXBlRGVmaW5pdGlvbkxpc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvVHlwZURlZmluaXRpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMmMxNTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9UeXBlRGVmaW5pdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci0KLS8qKgotICogTGlzdCBvZiB0eXBlIGRlZmluaXRpb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVEZWZpbml0aW9uTGlzdCBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdHlwZSBkZWZpbml0aW9ucy4KLSAgICAgKi8KLSAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiBnZXRMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgbW9yZSB0eXBlIGRlZmluaXRpb25zIG9yIG5vdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgbW9yZSB0eXBlIGRlZmluaXRpb25zLCB7QGNvZGUgZmFsc2V9IGlmCi0gICAgICogICAgICAgICB0aGVyZSBhcmUgbm8gbW9yZSB0eXBlIGRlZmluaXRpb25zLCB7QGNvZGUgbnVsbH0gaWYgaXQncyB1bmtub3duCi0gICAgICovCi0gICAgQm9vbGVhbiBoYXNNb3JlSXRlbXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiB0eXBlIGRlZmluaXRpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIHR5cGUgZGVmaW5pdGlvbnMgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB0b3RhbAotICAgICAqICAgICAgICAgbnVtYmVyIGlzIHVua25vd24KLSAgICAgKi8KLSAgICBCaWdJbnRlZ2VyIGdldE51bUl0ZW1zKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1R5cGVNdXRhYmlsaXR5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2RlZmluaXRpb25zL1R5cGVNdXRhYmlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OGUzNGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9UeXBlTXV0YWJpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci0KLS8qKgotICogVHlwZSBtdXRhYmlsaXR5IGZsYWdzLgotICogCi0gKiBAY21pcyAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlTXV0YWJpbGl0eSBleHRlbmRzIEV4dGVuc2lvbnNEYXRhIHsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiBhIHN1YiB0eXBlIG9mIHRoaXMgdHlwZSBjYW4gYmUgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgc3ViIHR5cGUgY2FuIGJlIGNyZWF0ZWQsCi0gICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgQm9vbGVhbiBjYW5DcmVhdGUoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHR5cGUgY2FuIGJlIHVwZGF0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgY2FuIGJlIHVwZGF0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgQm9vbGVhbiBjYW5VcGRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHR5cGUgY2FuIGJlIGRlbGV0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHR5cGUgY2FuIGJlIGRlbGV0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQGNtaXMgMS4xCi0gICAgICovCi0gICAgQm9vbGVhbiBjYW5EZWxldGUoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZGVmaW5pdGlvbnMvcGFja2FnZS5odG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZTAwYmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9kZWZpbml0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tIAotCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAtLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLU9wZW5DTUlTIHR5cGUgYW5kIHByb3BlcnR5IGRlZmluaXRpb24gaW50ZXJmYWNlcy4KLTxwPlRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgaW50ZXJmYWNlcyBmb3IgdHlwZSBhbmQgcHJvcGVydHkKLWRlZmluaXRpb25zLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0FjbFByb3BhZ2F0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0FjbFByb3BhZ2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDdiYTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9BY2xQcm9wYWdhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogQUNMIFByb3BhZ2F0aW9uIEVudW0uCi0gKi8KLXB1YmxpYyBlbnVtIEFjbFByb3BhZ2F0aW9uIHsKLQotICAgIFJFUE9TSVRPUllERVRFUk1JTkVEKCJyZXBvc2l0b3J5ZGV0ZXJtaW5lZCIpLCBPQkpFQ1RPTkxZKCJvYmplY3Rvbmx5IiksIFBST1BBR0FURSgicHJvcGFnYXRlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBBY2xQcm9wYWdhdGlvbihTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQWNsUHJvcGFnYXRpb24gZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoQWNsUHJvcGFnYXRpb24gYyA6IEFjbFByb3BhZ2F0aW9uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9BY3Rpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1M2E4ZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtczsKLQotcHVibGljIGVudW0gQWN0aW9uIHsKLQotICAgIC8vIGltcG9ydGFudDogZG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UgdmFsdWVzIQotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fREVMRVRFX09CSkVDVCgiY2FuRGVsZXRlT2JqZWN0IiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9VUERBVEVfUFJPUEVSVElFUygiY2FuVXBkYXRlUHJvcGVydGllcyIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fR0VUX0ZPTERFUl9UUkVFKCJjYW5HZXRGb2xkZXJUcmVlIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9HRVRfUFJPUEVSVElFUygiY2FuR2V0UHJvcGVydGllcyIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fR0VUX09CSkVDVF9SRUxBVElPTlNISVBTKCJjYW5HZXRPYmplY3RSZWxhdGlvbnNoaXBzIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9HRVRfT0JKRUNUX1BBUkVOVFMoImNhbkdldE9iamVjdFBhcmVudHMiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX0dFVF9GT0xERVJfUEFSRU5UKCJjYW5HZXRGb2xkZXJQYXJlbnQiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX0dFVF9ERVNDRU5EQU5UUygiY2FuR2V0RGVzY2VuZGFudHMiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX01PVkVfT0JKRUNUKCJjYW5Nb3ZlT2JqZWN0IiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0oImNhbkRlbGV0ZUNvbnRlbnRTdHJlYW0iKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX0NIRUNLX09VVCgiY2FuQ2hlY2tPdXQiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX0NBTkNFTF9DSEVDS19PVVQoImNhbkNhbmNlbENoZWNrT3V0IiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9DSEVDS19JTigiY2FuQ2hlY2tJbiIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fU0VUX0NPTlRFTlRfU1RSRUFNKCJjYW5TZXRDb250ZW50U3RyZWFtIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9HRVRfQUxMX1ZFUlNJT05TKCJjYW5HZXRBbGxWZXJzaW9ucyIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fQUREX09CSkVDVF9UT19GT0xERVIoImNhbkFkZE9iamVjdFRvRm9sZGVyIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSKCJjYW5SZW1vdmVPYmplY3RGcm9tRm9sZGVyIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9HRVRfQ09OVEVOVF9TVFJFQU0oImNhbkdldENvbnRlbnRTdHJlYW0iKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX0FQUExZX1BPTElDWSgiY2FuQXBwbHlQb2xpY3kiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX0dFVF9BUFBMSUVEX1BPTElDSUVTKCJjYW5HZXRBcHBsaWVkUG9saWNpZXMiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX1JFTU9WRV9QT0xJQ1koImNhblJlbW92ZVBvbGljeSIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fR0VUX0NISUxEUkVOKCJjYW5HZXRDaGlsZHJlbiIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fQ1JFQVRFX0RPQ1VNRU5UKCJjYW5DcmVhdGVEb2N1bWVudCIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fQ1JFQVRFX0ZPTERFUigiY2FuQ3JlYXRlRm9sZGVyIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9DUkVBVEVfUkVMQVRJT05TSElQKCJjYW5DcmVhdGVSZWxhdGlvbnNoaXAiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4xICovCi0gICAgQ0FOX0NSRUFURV9JVEVNKCJjYW5DcmVhdGVJdGVtIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENBTl9ERUxFVEVfVFJFRSgiY2FuRGVsZXRlVHJlZSIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fR0VUX1JFTkRJVElPTlMoImNhbkdldFJlbmRpdGlvbnMiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ0FOX0dFVF9BQ0woImNhbkdldEFDTCIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDQU5fQVBQTFlfQUNMKCJjYW5BcHBseUFDTCIpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBBY3Rpb24oU3RyaW5nIHYpIHsKLSAgICAgICAgdmFsdWUgPSB2OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFjdGlvbiBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChBY3Rpb24gYyA6IEFjdGlvbi52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKGMudmFsdWUuZXF1YWxzKHYpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0Jhc2VUeXBlSWQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQmFzZVR5cGVJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAwM2FkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQmFzZVR5cGVJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogQmFzZSBPYmplY3QgVHlwZSBJRHMgRW51bS4KLSAqLwotcHVibGljIGVudW0gQmFzZVR5cGVJZCB7Ci0KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ01JU19ET0NVTUVOVCgiY21pczpkb2N1bWVudCIpLCAvLwotICAgIC8qKiBAY21pcyAxLjAgKi8KLSAgICBDTUlTX0ZPTERFUigiY21pczpmb2xkZXIiKSwgLy8KLSAgICAvKiogQGNtaXMgMS4wICovCi0gICAgQ01JU19SRUxBVElPTlNISVAoImNtaXM6cmVsYXRpb25zaGlwIiksIC8vCi0gICAgLyoqIEBjbWlzIDEuMCAqLwotICAgIENNSVNfUE9MSUNZKCJjbWlzOnBvbGljeSIpLCAvLwotICAgIC8qKiBAY21pcyAxLjEgKi8KLSAgICBDTUlTX0lURU0oImNtaXM6aXRlbSIpLCAvLwotICAgIC8qKiBAY21pcyAxLjEgKi8KLSAgICBDTUlTX1NFQ09OREFSWSgiY21pczpzZWNvbmRhcnkiKTsgLy8KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgQmFzZVR5cGVJZChTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmFzZVR5cGVJZCBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChCYXNlVHlwZUlkIGMgOiBCYXNlVHlwZUlkLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQmluZGluZ1R5cGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQmluZGluZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmMGY3OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0JpbmRpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtczsKLQotLyoqCi0gKiBCaW5kaW5nIFR5cGUgRW51bS4KLSAqLwotcHVibGljIGVudW0gQmluZGluZ1R5cGUgewotCi0gICAgV0VCU0VSVklDRVMoIndlYnNlcnZpY2VzIiksIEFUT01QVUIoImF0b21wdWIiKSwgQlJPV1NFUigiYnJvd3NlciIpLCBMT0NBTCgibG9jYWwiKSwgQ1VTVE9NKCJjdXN0b20iKTsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgQmluZGluZ1R5cGUoU3RyaW5nIHYpIHsKLSAgICAgICAgdmFsdWUgPSB2OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdUeXBlIGZyb21WYWx1ZShTdHJpbmcgdikgewotICAgICAgICBmb3IgKEJpbmRpbmdUeXBlIGMgOiBCaW5kaW5nVHlwZS52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKGMudmFsdWUuZXF1YWxzKHYpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQ2FwYWJpbGl0eUFjbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5QWNsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODQwMmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5QWNsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtczsKLQotLyoqCi0gKiBDYXBhYmlsaXR5IEVudW06IEFDTC4KLSAqLwotcHVibGljIGVudW0gQ2FwYWJpbGl0eUFjbCB7Ci0KLSAgICBOT05FKCJub25lIiksIERJU0NPVkVSKCJkaXNjb3ZlciIpLCBNQU5BR0UoIm1hbmFnZSIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgQ2FwYWJpbGl0eUFjbChTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2FwYWJpbGl0eUFjbCBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChDYXBhYmlsaXR5QWNsIGMgOiBDYXBhYmlsaXR5QWNsLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5Q2hhbmdlcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5Q2hhbmdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTYwNGUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQ2FwYWJpbGl0eUNoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIENhcGFiaWxpdHkgRW51bTogQ2hhbmdlcy4KLSAqLwotcHVibGljIGVudW0gQ2FwYWJpbGl0eUNoYW5nZXMgewotCi0gICAgTk9ORSgibm9uZSIpLCBPQkpFQ1RJRFNPTkxZKCJvYmplY3RpZHNvbmx5IiksIFBST1BFUlRJRVMoInByb3BlcnRpZXMiKSwgQUxMKCJhbGwiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgIENhcGFiaWxpdHlDaGFuZ2VzKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDYXBhYmlsaXR5Q2hhbmdlcyBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChDYXBhYmlsaXR5Q2hhbmdlcyBjIDogQ2FwYWJpbGl0eUNoYW5nZXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2YjE5NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogQ2FwYWJpbGl0eSBFbnVtOiBDb250ZW50IFN0cmVhbSBVcGRhdGVzLgotICovCi1wdWJsaWMgZW51bSBDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMgewotCi0gICAgQU5ZVElNRSgiYW55dGltZSIpLCBQV0NPTkxZKCJwd2Nvbmx5IiksIE5PTkUoIm5vbmUiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgIENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyhTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIGZyb21WYWx1ZShTdHJpbmcgdikgewotICAgICAgICBmb3IgKENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyBjIDogQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5Sm9pbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5Sm9pbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTE0YmYxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQ2FwYWJpbGl0eUpvaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIENhcGFiaWxpdHkgRW51bTogSm9pbi4KLSAqLwotcHVibGljIGVudW0gQ2FwYWJpbGl0eUpvaW4gewotCi0gICAgTk9ORSgibm9uZSIpLCBJTk5FUk9OTFkoImlubmVyb25seSIpLCBJTk5FUkFORE9VVEVSKCJpbm5lcmFuZG91dGVyIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBDYXBhYmlsaXR5Sm9pbihTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2FwYWJpbGl0eUpvaW4gZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoQ2FwYWJpbGl0eUpvaW4gYyA6IENhcGFiaWxpdHlKb2luLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5T3JkZXJCeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5T3JkZXJCeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjM2YjkwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQ2FwYWJpbGl0eU9yZGVyQnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi1wdWJsaWMgZW51bSBDYXBhYmlsaXR5T3JkZXJCeSB7Ci0KLSAgICBOT05FKCJub25lIiksIENPTU1PTigiY29tbW9uIiksIENVU1RPTSgiY3VzdG9tIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBDYXBhYmlsaXR5T3JkZXJCeShTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2FwYWJpbGl0eU9yZGVyQnkgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoQ2FwYWJpbGl0eU9yZGVyQnkgYyA6IENhcGFiaWxpdHlPcmRlckJ5LnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5UXVlcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQ2FwYWJpbGl0eVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNDliOTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIENhcGFiaWxpdHkgRW51bTogUXVlcnkuCi0gKi8KLXB1YmxpYyBlbnVtIENhcGFiaWxpdHlRdWVyeSB7Ci0KLSAgICBOT05FKCJub25lIiksIE1FVEFEQVRBT05MWSgibWV0YWRhdGFvbmx5IiksIEZVTExURVhUT05MWSgiZnVsbHRleHRvbmx5IiksIEJPVEhTRVBBUkFURSgiYm90aHNlcGFyYXRlIiksIEJPVEhDT01CSU5FRCgKLSAgICAgICAgICAgICJib3RoY29tYmluZWQiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgIENhcGFiaWxpdHlRdWVyeShTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2FwYWJpbGl0eVF1ZXJ5IGZyb21WYWx1ZShTdHJpbmcgdikgewotICAgICAgICBmb3IgKENhcGFiaWxpdHlRdWVyeSBjIDogQ2FwYWJpbGl0eVF1ZXJ5LnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5UmVuZGl0aW9ucy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXBhYmlsaXR5UmVuZGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNhMTk1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQ2FwYWJpbGl0eVJlbmRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIENhcGFiaWxpdHkgRW51bTogUmVuZGl0aW9uLgotICovCi1wdWJsaWMgZW51bSBDYXBhYmlsaXR5UmVuZGl0aW9ucyB7Ci0KLSAgICBOT05FKCJub25lIiksIFJFQUQoInJlYWQiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgIENhcGFiaWxpdHlSZW5kaXRpb25zKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDYXBhYmlsaXR5UmVuZGl0aW9ucyBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChDYXBhYmlsaXR5UmVuZGl0aW9ucyBjIDogQ2FwYWJpbGl0eVJlbmRpdGlvbnMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NhcmRpbmFsaXR5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NhcmRpbmFsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTZlNjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DYXJkaW5hbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogQ2FyZGluYWxpdHkgRW51bS4KLSAqLwotcHVibGljIGVudW0gQ2FyZGluYWxpdHkgewotCi0gICAgU0lOR0xFKCJzaW5nbGUiKSwgTVVMVEkoIm11bHRpIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBDYXJkaW5hbGl0eShTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2FyZGluYWxpdHkgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoQ2FyZGluYWxpdHkgYyA6IENhcmRpbmFsaXR5LnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DaGFuZ2VUeXBlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NoYW5nZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxOWM3OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NoYW5nZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi1wdWJsaWMgZW51bSBDaGFuZ2VUeXBlIHsKLQotICAgIENSRUFURUQoImNyZWF0ZWQiKSwgVVBEQVRFRCgidXBkYXRlZCIpLCBERUxFVEVEKCJkZWxldGVkIiksIFNFQ1VSSVRZKCJzZWN1cml0eSIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgQ2hhbmdlVHlwZShTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2hhbmdlVHlwZSBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChDaGFuZ2VUeXBlIGMgOiBDaGFuZ2VUeXBlLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DbWlzVmVyc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9DbWlzVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTEwYTQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvQ21pc1ZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi1wdWJsaWMgZW51bSBDbWlzVmVyc2lvbiB7Ci0KLSAgICBDTUlTXzFfMCgiMS4wIiksIENNSVNfMV8xKCIxLjEiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgIENtaXNWZXJzaW9uKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbWlzVmVyc2lvbiBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChDbWlzVmVyc2lvbiBjIDogQ21pc1ZlcnNpb24udmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NvbnRlbnRTdHJlYW1BbGxvd2VkLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0NvbnRlbnRTdHJlYW1BbGxvd2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmUwYjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9Db250ZW50U3RyZWFtQWxsb3dlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogQ29udGVudCBTdHJlYW0gQWxsb3dlZCBFbnVtLgotICovCi1wdWJsaWMgZW51bSBDb250ZW50U3RyZWFtQWxsb3dlZCB7Ci0KLSAgICBOT1RBTExPV0VEKCJub3RhbGxvd2VkIiksIEFMTE9XRUQoImFsbG93ZWQiKSwgUkVRVUlSRUQoInJlcXVpcmVkIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBDb250ZW50U3RyZWFtQWxsb3dlZChTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFN0cmVhbUFsbG93ZWQgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoQ29udGVudFN0cmVhbUFsbG93ZWQgYyA6IENvbnRlbnRTdHJlYW1BbGxvd2VkLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9EYXRlVGltZUZvcm1hdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9EYXRlVGltZUZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTIyNDk2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvRGF0ZVRpbWVGb3JtYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIERhdGVUaW1lIEZvcm1hdCBFbnVtIGZvciB0aGUgYnJvd3NlciBiaW5kaW5nLgotICovCi1wdWJsaWMgZW51bSBEYXRlVGltZUZvcm1hdCB7Ci0KLSAgICBTSU1QTEUoInNpbXBsZSIpLCBFWFRFTkRFRCgiZXh0ZW5kZWQiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgIERhdGVUaW1lRm9ybWF0KFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBEYXRlVGltZUZvcm1hdCBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKLSAgICAgICAgZm9yIChEYXRlVGltZUZvcm1hdCBjIDogRGF0ZVRpbWVGb3JtYXQudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9EYXRlVGltZVJlc29sdXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvRGF0ZVRpbWVSZXNvbHV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTgwMzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9EYXRlVGltZVJlc29sdXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIERhdGUgVGltZSBSZXNvbHV0aW9uIEVudW0uCi0gKi8KLXB1YmxpYyBlbnVtIERhdGVUaW1lUmVzb2x1dGlvbiB7Ci0KLSAgICBZRUFSKCJ5ZWFyIiksIERBVEUoImRhdGUiKSwgVElNRSgidGltZSIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgRGF0ZVRpbWVSZXNvbHV0aW9uKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBEYXRlVGltZVJlc29sdXRpb24gZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoRGF0ZVRpbWVSZXNvbHV0aW9uIGMgOiBEYXRlVGltZVJlc29sdXRpb24udmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvRGVjaW1hbFByZWNpc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9EZWNpbWFsUHJlY2lzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWZmZDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9EZWNpbWFsUHJlY2lzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIERlY2ltYWwgUHJlY2lzaW9uIEVudW0uCi0gKi8KLXB1YmxpYyBlbnVtIERlY2ltYWxQcmVjaXNpb24gewotCi0gICAgQklUUzMyKEJpZ0ludGVnZXIudmFsdWVPZigzMikpLCBCSVRTNjQoQmlnSW50ZWdlci52YWx1ZU9mKDY0KSk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCaWdJbnRlZ2VyIHZhbHVlOwotCi0gICAgRGVjaW1hbFByZWNpc2lvbihCaWdJbnRlZ2VyIHYpIHsKLSAgICAgICAgdmFsdWUgPSB2OwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBEZWNpbWFsUHJlY2lzaW9uIGZyb21WYWx1ZShCaWdJbnRlZ2VyIHYpIHsKLSAgICAgICAgZm9yIChEZWNpbWFsUHJlY2lzaW9uIGMgOiBEZWNpbWFsUHJlY2lzaW9uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0V4dGVuc2lvbkxldmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0V4dGVuc2lvbkxldmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNGU3NWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9FeHRlbnNpb25MZXZlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLXB1YmxpYyBlbnVtIEV4dGVuc2lvbkxldmVsIHsKLQotICAgIE9CSkVDVCgib2JqZWN0IiksIC8vCi0gICAgUFJPUEVSVElFUygicHJvcGVydGllcyIpLCAvLwotICAgIEFMTE9XQUJMRV9BQ1RJT05TKCJhbGxvd2FibGVBY3Rpb25zIiksIC8vCi0gICAgQUNMKCJhY2wiKSwgLy8KLSAgICBQT0xJQ0lFUygicG9saWNpZXMiKSwgLy8KLSAgICBDSEFOR0VfRVZFTlQoImNoYW5nZUV2ZW50Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBFeHRlbnNpb25MZXZlbChTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uTGV2ZWwgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoRXh0ZW5zaW9uTGV2ZWwgYyA6IEV4dGVuc2lvbkxldmVsLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvSW5jbHVkZVJlbGF0aW9uc2hpcHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvSW5jbHVkZVJlbGF0aW9uc2hpcHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2YjUzMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL0luY2x1ZGVSZWxhdGlvbnNoaXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtczsKLQotLyoqCi0gKiBJbmNsdWRlIFJlbGF0aW9uc2hpcHMgRW51bS4KLSAqLwotcHVibGljIGVudW0gSW5jbHVkZVJlbGF0aW9uc2hpcHMgewotCi0gICAgTk9ORSgibm9uZSIpLCBTT1VSQ0UoInNvdXJjZSIpLCBUQVJHRVQoInRhcmdldCIpLCBCT1RIKCJib3RoIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyhTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSW5jbHVkZVJlbGF0aW9uc2hpcHMgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoSW5jbHVkZVJlbGF0aW9uc2hpcHMgYyA6IEluY2x1ZGVSZWxhdGlvbnNoaXBzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9Qcm9wZXJ0eVR5cGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvUHJvcGVydHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzMzZTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9Qcm9wZXJ0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIFByb3BlcnR5IFR5cGUgRW51bS4gCi0gKi8KLXB1YmxpYyBlbnVtIFByb3BlcnR5VHlwZSB7Ci0KLSAgICBCT09MRUFOKCJib29sZWFuIiksIElEKCJpZCIpLCBJTlRFR0VSKCJpbnRlZ2VyIiksIERBVEVUSU1FKCJkYXRldGltZSIpLCBERUNJTUFMKCJkZWNpbWFsIiksIEhUTUwoImh0bWwiKSwgU1RSSU5HKAotICAgICAgICAgICAgInN0cmluZyIpLCBVUkkoInVyaSIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgUHJvcGVydHlUeXBlKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eVR5cGUgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlUeXBlIGMgOiBQcm9wZXJ0eVR5cGUudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1JlbGF0aW9uc2hpcERpcmVjdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9SZWxhdGlvbnNoaXBEaXJlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkyNzk3NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1JlbGF0aW9uc2hpcERpcmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogUmVsYXRpb25zaGlwIERpcmVjdGlvbiBFbnVtLgotICovCi1wdWJsaWMgZW51bSBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gewotCi0gICAgU09VUkNFKCJzb3VyY2UiKSwgVEFSR0VUKCJ0YXJnZXQiKSwgRUlUSEVSKCJlaXRoZXIiKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbihTdHJpbmcgdikgewotICAgICAgICB2YWx1ZSA9IHY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVsYXRpb25zaGlwRGlyZWN0aW9uIGZyb21WYWx1ZShTdHJpbmcgdikgewotICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcERpcmVjdGlvbiBjIDogUmVsYXRpb25zaGlwRGlyZWN0aW9uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9TdXBwb3J0ZWRQZXJtaXNzaW9ucy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9TdXBwb3J0ZWRQZXJtaXNzaW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njg3MGEyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvU3VwcG9ydGVkUGVybWlzc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zOwotCi0vKioKLSAqIEFDTCBDYXBhYmlsaXR5IEVudW06IFN1cHBvcnRlZCBQZXJtaXNzaW9ucy4KLSAqLwotcHVibGljIGVudW0gU3VwcG9ydGVkUGVybWlzc2lvbnMgewotCi0gICAgQkFTSUMoImJhc2ljIiksIFJFUE9TSVRPUlkoInJlcG9zaXRvcnkiKSwgQk9USCgiYm90aCIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgU3VwcG9ydGVkUGVybWlzc2lvbnMoU3RyaW5nIHYpIHsKLSAgICAgICAgdmFsdWUgPSB2OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN1cHBvcnRlZFBlcm1pc3Npb25zIGZyb21WYWx1ZShTdHJpbmcgdikgewotICAgICAgICBmb3IgKFN1cHBvcnRlZFBlcm1pc3Npb25zIGMgOiBTdXBwb3J0ZWRQZXJtaXNzaW9ucy52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKGMudmFsdWUuZXF1YWxzKHYpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih2KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1VuZmlsZU9iamVjdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9VbmZpbGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmYzBhYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1VuZmlsZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogVW5maWxlIE9iamVjdCBFbnVtLgotICovCi1wdWJsaWMgZW51bSBVbmZpbGVPYmplY3QgewotCi0gICAgVU5GSUxFKCJ1bmZpbGUiKSwgLy8KLSAgICBERUxFVEVTSU5HTEVGSUxFRCgiZGVsZXRlc2luZ2xlZmlsZWQiKSwgLy8KLSAgICBERUxFVEUoImRlbGV0ZSIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgVW5maWxlT2JqZWN0KFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBVbmZpbGVPYmplY3QgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoVW5maWxlT2JqZWN0IGMgOiBVbmZpbGVPYmplY3QudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1VwZGF0YWJpbGl0eS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9VcGRhdGFiaWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjMmJhYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1VwZGF0YWJpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogVXBkYXRhYmlsaXR5IEVudW0uCi0gKi8KLXB1YmxpYyBlbnVtIFVwZGF0YWJpbGl0eSB7Ci0KLSAgICBSRUFET05MWSgicmVhZG9ubHkiKSwgUkVBRFdSSVRFKCJyZWFkd3JpdGUiKSwgV0hFTkNIRUNLRURPVVQoIndoZW5jaGVja2Vkb3V0IiksIE9OQ1JFQVRFKCJvbmNyZWF0ZSIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgVXBkYXRhYmlsaXR5KFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBVcGRhdGFiaWxpdHkgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoVXBkYXRhYmlsaXR5IGMgOiBVcGRhdGFiaWxpdHkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1ZlcnNpb25pbmdTdGF0ZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9lbnVtcy9WZXJzaW9uaW5nU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwMzc4Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL1ZlcnNpb25pbmdTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXM7Ci0KLS8qKgotICogVmVyc2lvbmluZ1N0YXRlIEVudW0uCi0gKi8KLXB1YmxpYyBlbnVtIFZlcnNpb25pbmdTdGF0ZSB7Ci0KLSAgICBOT05FKCJub25lIiksIE1BSk9SKCJtYWpvciIpLCBNSU5PUigibWlub3IiKSwgQ0hFQ0tFRE9VVCgiY2hlY2tlZG91dCIpOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgVmVyc2lvbmluZ1N0YXRlKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWZXJzaW9uaW5nU3RhdGUgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIGZvciAoVmVyc2lvbmluZ1N0YXRlIGMgOiBWZXJzaW9uaW5nU3RhdGUudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2VudW1zL3BhY2thZ2UuaHRtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzhlNDMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZW51bXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLSAKLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci1PcGVuQ01JUyBlbnVtcy4KLTxwPlRoaXMgcGFja2FnZSBjb250YWlucyBhbGwgZW51bXMgdXNlZCBieSBPcGVuQ01JUy48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNCYXNlRXhjZXB0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0Jhc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5YWJjOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0Jhc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQmFzZSBleGNlcHRpb24gY2xhc3MgZm9yIGFsbCBDTUlTIGV4Y2VwdGlvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbWlzQmFzZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKiogRXJyb3IgY29kZSB1c2VkIGJ5IHRoZSBXZWIgU2VydmljZXMgYmluZGluZy4gKi8KLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgY29kZSA9IEJpZ0ludGVnZXIuWkVSTzsKLQotICAgIC8qKiBDb250ZW50IHRoZSBvZiB0aGUgZXJyb3IgcGFnZSByZXR1cm5lZCBieSB0aGUgQXRvbVB1YiBzZXJ2ZXIuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JDb250ZW50OwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0Jhc2VFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENtaXNCYXNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDbWlzQmFzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICAgICAgdGhpcy5lcnJvckNvbnRlbnQgPSBlcnJvckNvbnRlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqLwotICAgIHByb3RlY3RlZCBDbWlzQmFzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0Jhc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgdGhpcy5jb2RlID0gY29kZTsKLSAgICAgICAgdGhpcy5lcnJvckNvbnRlbnQgPSBlcnJvckNvbnRlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0Jhc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIHRoaXMuZXJyb3JDb250ZW50ID0gZXJyb3JDb250ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0Jhc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICB0aGlzKG1lc3NhZ2UsIChCaWdJbnRlZ2VyKSBudWxsLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc0Jhc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlLCAoQmlnSW50ZWdlcikgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXJyb3IgY29kZSBzZW50IGJ5IHRoZSBDTUlTIHJlcG9zaXRvcnkgKFdlYiBTZXJ2aWNlcyBiaW5kaW5nCi0gICAgICogb25seSkuCi0gICAgICogCi0gICAgICogQHJldHVybiBlcnJvciBjb2RlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgQ01JUyByZXBvc2l0b3J5IGRpZG4ndCBzZW5kIGFuCi0gICAgICogICAgICAgICBlcnJvciBjb2RlIG9yIHRoZSBiaW5kaW5nIGRvZXNuJ3Qgc3VwcG9ydCBlcnJvciBjb2Rlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRDb2RlKCkgewotICAgICAgICByZXR1cm4gY29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBlcnJvciBwYWdlIHNlbnQgYnkgdGhlIHdlYiBzZXJ2ZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZXJyb3IgcGFnZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHNlcnZlcgotICAgICAqICAgICAgICAgZGlkbid0IHNlbmQgdGV4dCBjb250ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JDb250ZW50KCkgewotICAgICAgICByZXR1cm4gZXJyb3JDb250ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbiBhcyBkZWZpbmVkIGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFeGNlcHRpb25OYW1lKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM4OTA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIENvbm5lY3Rpb24gRXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24gZXh0ZW5kcyBDbWlzQmFzZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fTkFNRSA9ICJjb25uZWN0aW9uIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFWENFUFRJT05fTkFNRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzQ29uc3RyYWludEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBmY2RlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzQ29uc3RyYWludEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIENvbnN0cmFpbnQgRXhjZXB0aW9uLgotICogPHA+Ci0gKiBJbnRlbnQ6IFRoZSBvcGVyYXRpb24gdmlvbGF0ZXMgYSByZXBvc2l0b3J5LSBvciBvYmplY3QtbGV2ZWwgY29uc3RyYWludAotICogZGVmaW5lZCBpbiB0aGUgQ01JUyBkb21haW4gbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbiBleHRlbmRzIENtaXNCYXNlRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9OQU1FID0gImNvbnN0cmFpbnQiOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8sIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RXhjZXB0aW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9OQU1FOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MmJlMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIENNSVMgQ29udGVudEFscmVhZHlFeGlzdHMgRXhjZXB0aW9uLgotICogPHA+Ci0gKiBJbnRlbnQ6IFRoZSBvcGVyYXRpb24gYXR0ZW1wdHMgdG8gc2V0IHRoZSBjb250ZW50IHN0cmVhbSBmb3IgYSBkb2N1bWVudCB0aGF0Ci0gKiBhbHJlYWR5IGhhcyBhIGNvbnRlbnQgc3RyZWFtIHdpdGhvdXQgZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZQotICogIm92ZXJ3cml0ZUZsYWciIHBhcmFtZXRlci4KLSAqLwotcHVibGljIGNsYXNzIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiBleHRlbmRzIENtaXNCYXNlRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9OQU1FID0gImNvbnRlbnRBbHJlYWR5RXhpc3RzIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTywgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RXhjZXB0aW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9OQU1FOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyN2U5Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIENNSVMgRmlsdGVyTm90VmFsaWQgRXhjZXB0aW9uLgotICogPHA+Ci0gKiBJbnRlbnQ6IFRoZSBwcm9wZXJ0eSBmaWx0ZXIgb3IgcmVuZGl0aW9uIGZpbHRlciBpbnB1dCB0byB0aGUgb3BlcmF0aW9uIGlzIG5vdAotICogdmFsaWQuIFRoZSByZXBvc2l0b3J5IFNIT1VMRCBOT1QgdGhyb3cgdGhpcyBleGNlcHRpb24gaWYgdGhlIGZpbHRlciBzeW50YXggaXMKLSAqIGNvcnJlY3QgYnV0IG9uZSBvciBtb3JlIGVsZW1lbnRzIGluIHRoZSBmaWx0ZXIgaXMgdW5rbm93bi4gVW5rbm93biBlbGVtZW50cwotICogU0hPVUxEIGJlIGlnbm9yZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24gZXh0ZW5kcyBDbWlzQmFzZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fTkFNRSA9ICJmaWx0ZXJOb3RWYWxpZCI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNGaWx0ZXJOb3RWYWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNGaWx0ZXJOb3RWYWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50LCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50LCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8sIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFWENFUFRJT05fTkFNRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlZTg2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIEludmFsaWRBcmd1bWVudCBFeGNlcHRpb24uCi0gKiA8cD4KLSAqIENhdXNlOiBPbmUgb3IgbW9yZSBvZiB0aGUgaW5wdXQgcGFyYW1ldGVycyB0byB0aGUgc2VydmljZSBtZXRob2QgaXMgbWlzc2luZwotICogb3IgaW52YWxpZC4KLSAqLwotcHVibGljIGNsYXNzIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBDbWlzQmFzZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fTkFNRSA9ICJpbnZhbGlkQXJndW1lbnQiOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICovCi0gICAgcHVibGljIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTywgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFWENFUFRJT05fTkFNRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZWNlZWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIE5hbWVDb25zdHJhaW50VmlvbGF0aW9uIEV4Y2VwdGlvbi4KLSAqIDxwPgotICogSW50ZW50OiBUaGUgcmVwb3NpdG9yeSBpcyBub3QgYWJsZSB0byBzdG9yZSB0aGUgb2JqZWN0IHRoYXQgdGhlIHVzZXIgaXMKLSAqIGNyZWF0aW5nL3VwZGF0aW5nIGR1ZSB0byBhIG5hbWUgY29uc3RyYWludCB2aW9sYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBDbWlzQmFzZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fTkFNRSA9ICJuYW1lQ29uc3RyYWludFZpb2xhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50LCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50LCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8sIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFWENFUFRJT05fTkFNRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MWJjYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIE5vdFN1cHBvcnRlZCBFeGNlcHRpb24uCi0gKiA8cD4KLSAqIENhdXNlOiBUaGUgc2VydmljZSBtZXRob2QgaW52b2tlZCByZXF1aXJlcyBhbiBvcHRpb25hbCBjYXBhYmlsaXR5IG5vdAotICogc3VwcG9ydGVkIGJ5IHRoZSByZXBvc2l0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIENtaXNCYXNlRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9OQU1FID0gIm5vdFN1cHBvcnRlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50LCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50LCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RXhjZXB0aW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9OQU1FOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyY2ZjMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIENNSVMgT2JqZWN0Tm90Rm91bmQgRXhjZXB0aW9uLgotICogPHA+Ci0gKiBDYXVzZTogVGhlIHNlcnZpY2UgY2FsbCBoYXMgc3BlY2lmaWVkIGFuIG9iamVjdCwgYW4gb2JqZWN0LXR5cGUgb3IgYQotICogcmVwb3NpdG9yeSB0aGF0IGRvZXMgbm90IGV4aXN0LgotICovCi1wdWJsaWMgY2xhc3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgQ21pc0Jhc2VFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX05BTUUgPSAib2JqZWN0Tm90Rm91bmQiOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICovCi0gICAgcHVibGljIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRFeGNlcHRpb25OYW1lKCkgewotICAgICAgICByZXR1cm4gRVhDRVBUSU9OX05BTUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYjBlNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQ01JUyBQZXJtaXNzaW9uRGVuaWVkIEV4Y2VwdGlvbi4KLSAqIDxwPgotICogQ2F1c2U6IFRoZSBjYWxsZXIgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucwotICogdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZXh0ZW5kcyBDbWlzQmFzZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fTkFNRSA9ICJwZXJtaXNzaW9uRGVuaWVkIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFWENFUFRJT05fTkFNRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmMDM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBQcm94eSBhdXRoZW50aWNhdGlvbiBleGNlcHRpb24uCi0gKiAKLSAqIChUaGlzIGlzIGV4Y2VwdGlvbiBpcyBub3QgZGVmaW5lZCBpbiB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uIGFuZCBpcyB0aGVyZWZvcmUKLSAqIGRlcml2ZWQgZnJvbSB7QGxpbmsgQ21pc1J1bnRpbWVFeGNlcHRpb259LikKLSAqLwotcHVibGljIGNsYXNzIENtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQ21pc1J1bnRpbWVFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50LCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50LCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTywgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIENtaXNQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1J1bnRpbWVFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzUnVudGltZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJmZWZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIFJ1bnRpbWUgRXhjZXB0aW9uLgotICogPHA+Ci0gKiBDYXVzZTogQW55IG90aGVyIGNhdXNlIG5vdCBleHByZXNzaWJsZSBieSBhbm90aGVyIENNSVMgZXhjZXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ21pc1J1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBDbWlzQmFzZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fTkFNRSA9ICJydW50aW1lIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENtaXNSdW50aW1lRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1J1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1J1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1J1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFWENFUFRJT05fTkFNRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1NlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhYmQ5YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1NlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIENtaXNTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24gZXh0ZW5kcyBDbWlzUnVudGltZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENtaXNTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8sIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNTdG9yYWdlRXhjZXB0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1N0b3JhZ2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlMDdlZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1N0b3JhZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQ01JUyBTdG9yYWdlIEV4Y2VwdGlvbi4KLSAqIDxwPgotICogSW50ZW50OiBUaGUgcmVwb3NpdG9yeSBpcyBub3QgYWJsZSB0byBzdG9yZSB0aGUgb2JqZWN0IHRoYXQgdGhlIHVzZXIgaXMKLSAqIGNyZWF0aW5nL3VwZGF0aW5nIGR1ZSB0byBhbiBpbnRlcm5hbCBzdG9yYWdlIHByb2JsZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzU3RvcmFnZUV4Y2VwdGlvbiBleHRlbmRzIENtaXNCYXNlRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9OQU1FID0gInN0b3JhZ2UiOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1N0b3JhZ2VFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTdG9yYWdlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1N0b3JhZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTdG9yYWdlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZXJyb3JDb250ZW50Ci0gICAgICogICAgICAgICAgICBlcnJvciBwYWdlIGNvbnRlbnQKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1N0b3JhZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8sIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RXhjZXB0aW9uTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9OQU1FOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZiZTQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIENNSVMgU3RyZWFtTm90U3VwcG9ydGVkIEV4Y2VwdGlvbi4KLSAqIDxwPgotICogSW50ZW50OiBUaGUgb3BlcmF0aW9uIGlzIGF0dGVtcHRpbmcgdG8gZ2V0IG9yIHNldCBhIGNvbnRlbnQgc3RyZWFtIGZvciBhCi0gKiBkb2N1bWVudCB3aG9zZSBvYmplY3QtdHlwZSBzcGVjaWZpZXMgdGhhdCBhIGNvbnRlbnQgc3RyZWFtIGlzIG5vdCBhbGxvd2VkIGZvcgotICogZG9jdW1lbnQncyBvZiB0aGF0IHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgQ21pc0Jhc2VFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX05BTUUgPSAic3RyZWFtTm90U3VwcG9ydGVkIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8sIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRFeGNlcHRpb25OYW1lKCkgewotICAgICAgICByZXR1cm4gRVhDRVBUSU9OX05BTUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzVW5hdXRob3JpemVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTRiZWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogVW5hdXRob3JpemVkIGV4Y2VwdGlvbi4KLSAqIDxwPgotICogKFRoaXMgaXMgZXhjZXB0aW9uIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24gYW5kIGlzIHRoZXJlZm9yZQotICogZGVyaXZlZCBmcm9tIHtAbGluayBDbWlzUnVudGltZUV4Y2VwdGlvbn0uKQotICovCi1wdWJsaWMgY2xhc3MgQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbiBleHRlbmRzIENtaXNSdW50aW1lRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICovCi0gICAgcHVibGljIENtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yQ29udGVudCwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTywgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIENtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWZmYmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL0NtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIFVwZGF0ZUNvbmZsaWN0IEV4Y2VwdGlvbi4KLSAqIDxwPgotICogSW50ZW50OiBUaGUgb3BlcmF0aW9uIGlzIGF0dGVtcHRpbmcgdG8gdXBkYXRlIGFuIG9iamVjdCB0aGF0IGlzIG5vIGxvbmdlcgotICogY3VycmVudCAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgcmVwb3NpdG9yeSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24gZXh0ZW5kcyBDbWlzQmFzZUV4Y2VwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fTkFNRSA9ICJ1cGRhdGVDb25mbGljdCI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQmlnSW50ZWdlciBjb2RlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY29kZQotICAgICAqICAgICAgICAgICAgZXJyb3IgY29kZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50LCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50LCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBCaWdJbnRlZ2VyLlpFUk8sIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgQmlnSW50ZWdlci5aRVJPKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBFWENFUFRJT05fTkFNRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2V4Y2VwdGlvbnMvQ21pc1ZlcnNpb25pbmdFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWU4ZTBjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9DbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotLyoqCi0gKiBDTUlTIFZlcnNpb25pbmcgRXhjZXB0aW9uLgotICogPHA+Ci0gKiBJbnRlbnQ6IFRoZSBvcGVyYXRpb24gaXMgYXR0ZW1wdGluZyB0byBwZXJmb3JtIGFuIGFjdGlvbiBvbiBhIG5vbi1jdXJyZW50Ci0gKiB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQgdGhhdCBjYW5ub3QgYmUgcGVyZm9ybWVkIG9uIGEgbm9uLWN1cnJlbnQgdmVyc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uIGV4dGVuZHMgQ21pc0Jhc2VFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX05BTUUgPSAidmVyc2lvbmluZyI7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1ZlcnNpb25pbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNvZGUsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBDbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVycm9yQ29udGVudCkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlcnJvckNvbnRlbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNvZGUKLSAgICAgKiAgICAgICAgICAgIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1ZlcnNpb25pbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEJpZ0ludGVnZXIgY29kZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBjb2RlCi0gICAgICogICAgICAgICAgICBlcnJvciBjb2RlCi0gICAgICogQHBhcmFtIGVycm9yQ29udGVudAotICAgICAqICAgICAgICAgICAgZXJyb3IgcGFnZSBjb250ZW50Ci0gICAgICovCi0gICAgcHVibGljIENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCaWdJbnRlZ2VyIGNvZGUsIFN0cmluZyBlcnJvckNvbnRlbnQpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY29kZSwgZXJyb3JDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQotICAgICAqIEBwYXJhbSBlcnJvckNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGVycm9yIHBhZ2UgY29udGVudAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZXJyb3JDb250ZW50LCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3JDb250ZW50LCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTywgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRFeGNlcHRpb25OYW1lKCkgewotICAgICAgICByZXR1cm4gRVhDRVBUSU9OX05BTUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL3BhY2thZ2UtaW5mby5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9leGNlcHRpb25zL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGUyODNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvZXhjZXB0aW9ucy9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKiBDb250YWlucyBhbGwgZXhjZXB0aW9ucyB1c2VkIGJ5IE9wZW5DTUlTLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9uczsKLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9wYWNrYWdlLWluZm8uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTI3OGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyoqCi0gKiBDb250YWlucyBpbnRlcmZhY2VzLCBjbGFzc2VzLCBleGNlcHRpb25zLCBhbmQgY29uc3RhbnRzIHNoYXJlZCBieSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnM7Ci0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL0NhbGxDb250ZXh0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9DYWxsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjcyYTA0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL0NhbGxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLQotLyoqCi0gKiBBbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGhvbGRzIGNvbnRleHQgZGF0YSBvZiB0aGUgY3VycmVudCBjYWxsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbGxDb250ZXh0IHsKLQotICAgIC8qKiBCaW5kaW5nOiBBdG9tUHViICovCi0gICAgU3RyaW5nIEJJTkRJTkdfQVRPTVBVQiA9ICJhdG9tcHViIjsKLSAgICAvKiogQmluZGluZzogV2ViIFNlcnZpY2VzICovCi0gICAgU3RyaW5nIEJJTkRJTkdfV0VCU0VSVklDRVMgPSAid2Vic2VydmljZXMiOwotICAgIC8qKiBCaW5kaW5nOiBCcm93c2VyICovCi0gICAgU3RyaW5nIEJJTkRJTkdfQlJPV1NFUiA9ICJicm93c2VyIjsKLSAgICAvKiogQmluZGluZzogTG9jYWwgKi8KLSAgICBTdHJpbmcgQklORElOR19MT0NBTCA9ICJsb2NhbCI7Ci0KLSAgICAvKiogS2V5OiBDTUlTIHZlcnNpb24gKHZhbHVlIGlzIGEgQ21pc1ZlcnNpb24pICovCi0gICAgU3RyaW5nIENNSVNfVkVSU0lPTiA9ICJjbWlzVmVyc2lvbiI7Ci0KLSAgICAvKiogS2V5OiByZXBvc2l0b3J5IGlkICovCi0gICAgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAicmVwb3NpdG9yeUlkIjsKLSAgICAvKiogS2V5OiB1c2VybmFtZSAqLwotICAgIFN0cmluZyBVU0VSTkFNRSA9ICJ1c2VybmFtZSI7Ci0gICAgLyoqIEtleTogcGFzc3dvcmQgKi8KLSAgICBTdHJpbmcgUEFTU1dPUkQgPSAicGFzc3dvcmQiOwotICAgIC8qKiBLZXk6IGxvY2FsICovCi0gICAgU3RyaW5nIExPQ0FMRSA9ICJsb2NhbGUiOwotICAgIC8qKiBLZXk6IG9mZnNldCAodmFsdWUgaXMgYSBCaWdJbnRlZ2VyKSAqLwotICAgIFN0cmluZyBPRkZTRVQgPSAib2Zmc2V0IjsKLSAgICAvKiogS2V5OiBsZW5ndGggKHZhbHVlIGlzIGEgQmlnSW50ZWdlcikgKi8KLSAgICBTdHJpbmcgTEVOR1RIID0gImxlbmd0aCI7Ci0gICAgU3RyaW5nIExPQ0FMRV9JU082MzlfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwotICAgIFN0cmluZyBMT0NBTEVfSVNPMzE2Nl9DT1VOVFJZID0gImNvdW50cnkiOwotCi0gICAgLyoqIEtleTogc2VydmxldCBjb250ZXh0ICh2YWx1ZSBpcyBhIFNlcnZsZXRDb250ZXh0KSAqLwotICAgIFN0cmluZyBTRVJWTEVUX0NPTlRFWFQgPSAic2VydmxldENvbnRleHQiOwotICAgIC8qKiBLZXk6IHNlcnZsZXQgcmVxdWVzdCAodmFsdWUgaXMgYSBIdHRwU2VydmxldFJlcXVlc3QpICovCi0gICAgU3RyaW5nIEhUVFBfU0VSVkxFVF9SRVFVRVNUID0gImh0dHBTZXJ2bGV0UmVxdWVzdCI7Ci0gICAgLyoqIEtleTogc2VydmxldCByZXNwb25zZSAodmFsdWUgaXMgYSBIdHRwU2VydmxldFJlc3BvbnNlKSAqLwotICAgIFN0cmluZyBIVFRQX1NFUlZMRVRfUkVTUE9OU0UgPSAiaHR0cFNlcnZsZXRSZXNwb25zZSI7Ci0KLSAgICAvKiogS2V5OiB0ZW1wIGRpcmVjdG9yeSAqLwotICAgIFN0cmluZyBURU1QX0RJUiA9ICJ0ZW1wRGlyIjsKLSAgICAvKiogS2V5OiBtZW1vcnkgdGhyZXNob2xkICh2YWx1ZXMgaXMgYW4gSW50ZWdlcikgKi8KLSAgICBTdHJpbmcgTUVNT1JZX1RIUkVTSE9MRCA9ICJtZW1vcnlUaHJlc2hvbGQiOwotICAgIC8qKiBLZXk6IG1heCBjb250ZW50IHNpemUgKHZhbHVlcyBpcyBhIExvbmcpICovCi0gICAgU3RyaW5nIE1BWF9DT05URU5UX1NJWkUgPSAibWF4Q29udGVudFNpemUiOwotICAgIC8qKiBLZXk6IGVuY3J5cHQgdGVtcCBmaWxlcyAodmFsdWVzIGlzIGEgQm9vbGVhbikgKi8KLSAgICBTdHJpbmcgRU5DUllQVF9URU1QX0ZJTEUgPSAiZW5jcnlwdFRlbXBGaWxlcyI7Ci0gICAgLyoqIEtleTogZmFjdG9yeSBmb3IgdGhyZXNob2xkIHN0cmVhbXMgKHZhbHVlIGlzIGEgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSkgKi8KLSAgICBTdHJpbmcgU1RSRUFNX0ZBQ1RPUlkgPSAic3RyZWFtRmFjdG9yeSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZy4gVXN1YWxseSBpdCByZXR1cm5zCi0gICAgICoge0BsaW5rIENhbGxDb250ZXh0I0JJTkRJTkdfQVRPTVBVQn0sCi0gICAgICoge0BsaW5rIENhbGxDb250ZXh0I0JJTkRJTkdfV0VCU0VSVklDRVN9LAotICAgICAqIHtAbGluayBDYWxsQ29udGV4dCNCSU5ESU5HX0JST1dTRVJ9IG9yIHtAbGluayBDYWxsQ29udGV4dCNCSU5ESU5HX0xPQ0FMfS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0QmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiA8Y29kZT50cnVlPC9jb2RlPiBvYmplY3QgaW5mb3MgY2FuIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNPYmplY3RJbmZvUmVxdWlyZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY29udGV4dCBkYXRhIGJ5IGtleS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICB0aGUga2V5Ci0gICAgICogQHJldHVybiB0aGUgZGF0YSBpZiB0aGUga2V5IGlzIHZhbGlkLCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0KFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQ01JUyB2ZXJzaW9uLgotICAgICAqLwotICAgIENtaXNWZXJzaW9uIGdldENtaXNWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IGlkLgotICAgICAqLwotICAgIFN0cmluZyBnZXRSZXBvc2l0b3J5SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzZXIgbmFtZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VXNlcm5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhc3N3b3JkLgotICAgICAqLwotICAgIFN0cmluZyBnZXRQYXNzd29yZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYWxlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRMb2NhbGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2Zmc2V0IGlmIHNldCwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgQmlnSW50ZWdlciBnZXRPZmZzZXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgbGVuZ3RoIGlmIHNldCwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgQmlnSW50ZWdlciBnZXRMZW5ndGgoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRlbXAgZGlyZWN0b3J5LgotICAgICAqLwotICAgIEZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0ZW1wIGZpbGVzIHNob3VsZCBiZSBlbmNyeXB0ZWQuCi0gICAgICovCi0gICAgYm9vbGVhbiBlbmNyeXB0VGVtcEZpbGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1vcnkgdGhyZXNob2xkLgotICAgICAqLwotICAgIGludCBnZXRNZW1vcnlUaHJlc2hvbGQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1heSBzaXplIG9mIGNvbnRlbnQuCi0gICAgICovCi0gICAgbG9uZyBnZXRNYXhDb250ZW50U2l6ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvQ21pc1NlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL0NtaXNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMDAzNWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvQ21pc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkFjbFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuRGlzY292ZXJ5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Qb2xpY3lTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlbGF0aW9uc2hpcFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuVmVyc2lvbmluZ1NlcnZpY2U7Ci0KLS8qKgotICogT3BlbkNNSVMgc2VydmVyIGludGVyZmFjZS4KLSAqIAotICogPHA+Ci0gKiA8ZW0+Ci0gKiBTZWUgQ01JUyAxLjAgYW5kIENNSVMgMS4xIHNwZWNpZmljYXRpb25zIGZvciBkZXRhaWxzIG9uIHRoZSBvcGVyYXRpb25zLCBwYXJhbWV0ZXJzLAotICogZXhjZXB0aW9ucyBhbmQgdGhlIGRvbWFpbiBtb2RlbC4KLSAqIDwvZW0+Ci0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgYWRkcyBhIGZldyBtb3JlIG9wZXJhdGlvbnMgdG8gdGhlIG9wZXJhdGlvbiBzZXQgZGVmaW5lZCBieQotICogQ01JUyB0byBhZGRyZXNzIGJpbmRpbmcgc3BlY2lmaWMgcmVxdWlyZW1lbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENtaXNTZXJ2aWNlIGV4dGVuZHMgUmVwb3NpdG9yeVNlcnZpY2UsIE5hdmlnYXRpb25TZXJ2aWNlLCBPYmplY3RTZXJ2aWNlLCBWZXJzaW9uaW5nU2VydmljZSwKLSAgICAgICAgRGlzY292ZXJ5U2VydmljZSwgTXVsdGlGaWxpbmdTZXJ2aWNlLCBSZWxhdGlvbnNoaXBTZXJ2aWNlLCBBY2xTZXJ2aWNlLCBQb2xpY3lTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQsIGZvbGRlciwgcG9saWN5LCBvciBpdGVtLgotICAgICAqIAotICAgICAqIFRoZSBwcm9wZXJ0eSAiY21pczpvYmplY3RUeXBlSWQiIGRlZmluZXMgdGhlIHR5cGUgYW5kIGltcGxpY2l0bHkgdGhlIGJhc2UKLSAgICAgKiB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWVzIHRoYXQgTVVTVCBiZSBhcHBsaWVkIHRvIHRoZSBuZXdseSBjcmVhdGVkCi0gICAgICogICAgICAgICAgICBvYmplY3QKLSAgICAgKiBAcGFyYW0gZm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgc3BlY2lmaWVkLCB0aGUgaWRlbnRpZmllciBmb3IgdGhlCi0gICAgICogICAgICAgICAgICBmb2xkZXIgdGhhdCBNVVNUIGJlIHRoZSBwYXJlbnQgZm9sZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZAotICAgICAqICAgICAgICAgICAgb2JqZWN0Ci0gICAgICogQHBhcmFtIGNvbnRlbnRTdHJlYW0KLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgdGhlIG9iamVjdCB0byBjcmVhdGUgaXMgYSBkb2N1bWVudAotICAgICAqICAgICAgICAgICAgb2JqZWN0LCB0aGUgY29udGVudCBzdHJlYW0gdGhhdCBNVVNUIGJlIHN0b3JlZCBmb3IgdGhlIG5ld2x5Ci0gICAgICogICAgICAgICAgICBjcmVhdGVkIGRvY3VtZW50IG9iamVjdAotICAgICAqIEBwYXJhbSB2ZXJzaW9uaW5nU3RhdGUKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgdGhlIG9iamVjdCB0byBjcmVhdGUgaXMgYSBkb2N1bWVudAotICAgICAqICAgICAgICAgICAgb2JqZWN0LCBpdCBzcGVjaWZpZXMgd2hhdCB0aGUgdmVyc2lvbmluZyBzdGF0ZSBvZiB0aGUgbmV3bHkKLSAgICAgKiAgICAgICAgICAgIGNyZWF0ZWQgb2JqZWN0IE1VU1QgYmUgKGRlZmF1bHQgaXMKLSAgICAgKiAgICAgICAgICAgIHtAbGluayBWZXJzaW9uaW5nU3RhdGUjTUFKT1J9KQotICAgICAqIEBwYXJhbSBwb2xpY2llcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGxpc3Qgb2YgcG9saWN5IElEcyB0aGF0IE1VU1QgYmUgYXBwbGllZAotICAgICAqICAgICAgICAgICAgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFkZEFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBNVVNUIGJlIGFkZGVkIHRvIHRoZQotICAgICAqICAgICAgICAgICAgbmV3bHkgY3JlYXRlZCBvYmplY3QsIGVpdGhlciB1c2luZyB0aGUgQUNMIGZyb20KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZvbGRlcklkPC9jb2RlPiBpZiBzcGVjaWZpZWQsIG9yIGJlaW5nIGFwcGxpZWQgaWYgbm8KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZvbGRlcklkPC9jb2RlPiBpcyBzcGVjaWZpZWQKLSAgICAgKiBAcGFyYW0gcmVtb3ZlQWNlcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGxpc3Qgb2YgQUNFcyB0aGF0IE1VU1QgYmUgcmVtb3ZlZCBmcm9tCi0gICAgICogICAgICAgICAgICB0aGUgbmV3bHkgY3JlYXRlZCBvYmplY3QsIGVpdGhlciB1c2luZyB0aGUgQUNMIGZyb20KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZvbGRlcklkPC9jb2RlPiBpZiBzcGVjaWZpZWQsIG9yIGJlaW5nIGlnbm9yZWQgaWYgbm8KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZvbGRlcklkPC9jb2RlPiBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgY3JlYXRlKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGFuIG9iamVjdCBvciBjYW5jZWxzIGEgY2hlY2sgb3V0LgotICAgICAqIAotICAgICAqIEZvciB0aGUgV2ViIFNlcnZpY2VzIGJpbmRpbmcgdGhpcyBpcyBhbHdheXMgYW4gb2JqZWN0IGRlbGV0aW9uLiBGb3IgdGhlCi0gICAgICogQXRvbVB1YiBpdCBkZXBlbmRzIG9uIHRoZSByZWZlcmVuY2VkIG9iamVjdC4gSWYgaXQgaXMgYSBjaGVja2VkIG91dAotICAgICAqIGRvY3VtZW50IHRoZW4gdGhlIGNoZWNrIG91dCBtdXN0IGJlIGNhbmNlbGVkLiBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhCi0gICAgICogY2hlY2tlZCBvdXQgZG9jdW1lbnQgdGhlbiB0aGUgb2JqZWN0IG11c3QgYmUgZGVsZXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFsbFZlcnNpb25zCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gZGVsZXRlIGFsbAotICAgICAqICAgICAgICAgICAgdmVyc2lvbnMgb2YgdGhlIGRvY3VtZW50LCBvdGhlcndpc2UgZGVsZXRlIG9ubHkgdGhlIGRvY3VtZW50Ci0gICAgICogICAgICAgICAgICBvYmplY3Qgc3BlY2lmaWVkIChkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+KQotICAgICAqLwotICAgIHZvaWQgZGVsZXRlT2JqZWN0T3JDYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogQXBwbGllcyBhIG5ldyBBQ0wgdG8gYW4gb2JqZWN0LgotICAgICAqIAotICAgICAqIFNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0cmFuc21pdCBhbiAiYWRkIEFDTCIgYW5kIGEgInJlbW92ZSBBQ0wiIHZpYQotICAgICAqIEF0b21QdWIsIHRoZSBtZXJnaW5nIGhhcyB0byBiZSBkb25lIHRoZSBjbGllbnQgc2lkZS4gVGhlIEFDRXMgcHJvdmlkZWQKLSAgICAgKiBoZXJlIGlzIHN1cHBvc2VkIHRvIHRoZSBuZXcgY29tcGxldGUgQUNMLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gYWNlcwotICAgICAqICAgICAgICAgICAgdGhlIEFDRXMgdGhhdCBzaG91bGQgcmVwbGFjZSB0aGUgY3VycmVudCBBQ0wgb2YgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBhY2xQcm9wYWdhdGlvbgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBzcGVjaWZpZXMgaG93IEFDRXMgc2hvdWxkIGJlIGhhbmRsZWQKLSAgICAgKiAgICAgICAgICAgIChkZWZhdWx0IGlzIHtAbGluayBBY2xQcm9wYWdhdGlvbiNSRVBPU0lUT1JZREVURVJNSU5FRH0pCi0gICAgICovCi0gICAgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBPYmplY3RJbmZvfSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGlkIG9yCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gb2JqZWN0IGluZm8gZXhpc3RzLgotICAgICAqIAotICAgICAqIE9ubHkgQXRvbVB1YiByZXF1ZXN0cyB3aWxsIHJlcXVpcmUgb2JqZWN0IGluZm9zLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBPYmplY3RJbmZvIGdldE9iamVjdEluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkKTsKLQotICAgIC8qKgotICAgICAqIFNpZ25hbHMgdGhhdCB0aGlzIG9iamVjdCB3aWxsIG5vdCBiZSB1c2VkIGFueW1vcmUgYW5kIHJlc291cmNlcyBjYW4KLSAgICAgKiByZWxlYXNlZC4KLSAgICAgKi8KLSAgICB2b2lkIGNsb3NlKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9DbWlzU2VydmljZUZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL0NtaXNTZXJ2aWNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDc2NDZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL0NtaXNTZXJ2aWNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciB7QGxpbmsgQ21pc1NlcnZpY2V9IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ21pc1NlcnZpY2VGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBmYWN0b3J5IGluc3RhbmNlLgotICAgICAqLwotICAgIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpOwotCi0gICAgLyoqCi0gICAgICogQ2xlYW5zIHVwIHRoZSB0aGUgZmFjdG9yeSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICB2b2lkIGRlc3Ryb3koKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ21pc1NlcnZpY2V9IG9iamVjdCBmb3IgdGhlIGdpdmVuIHtAbGluayBDYWxsQ29udGV4dH0uCi0gICAgICogCi0gICAgICogV2hlbiB0aGUge0BsaW5rIENtaXNTZXJ2aWNlfSBvYmplY3QgaXMgbm90IGxvbmdlciBuZWVkZWQKLSAgICAgKiB7QGxpbmsgQ21pc1NlcnZpY2UjY2xvc2UoKX0gd2lsbCBiZSBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYWxsIGNvbnRleHQKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIENtaXNTZXJ2aWNlfSBpbnN0YW5jZSwgbmV2ZXIge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgQ21pc1NlcnZpY2UgZ2V0U2VydmljZShDYWxsQ29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRpcmVjdG9yeSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgotICAgICAqIHRlbXBvcmFyeSBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFic29sdXRlIHBhdGggb2YgdGVtcCBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBGaWxlIGdldFRlbXBEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0ZW1wb3JhcnkgZmlsZXMgc2hvdWxkIGJlIGVuY3J5cHRlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0ZW1wb3JhcnkgZmlsZXMgc2hvdWxkIGJlIGVuY3J5cHRlZCwKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQHNlZSBDbWlzU2VydmljZUZhY3RvcnkjZ2V0VGVtcERpcmVjdG9yeSgpCi0gICAgICovCi0gICAgYm9vbGVhbiBlbmNyeXB0VGVtcEZpbGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHVwIHRvIHdoaWNoIHNpemUgY29udGVudCBzaG91bGQgYmUga2VwdCBpbiBtZW1vcnkuIERvY3VtZW50cwotICAgICAqIGJpZ2dlciB0aGFuIHRoaXMgdGhyZXNob2xkIHdpbGwgYmUgY2FjaGVkIGluIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0aHJlc2hvbGQgaW4gYnl0ZXMKLSAgICAgKiAKLSAgICAgKiBAc2VlIENtaXNTZXJ2aWNlRmFjdG9yeSNnZXRUZW1wRGlyZWN0b3J5KCkKLSAgICAgKi8KLSAgICBpbnQgZ2V0TWVtb3J5VGhyZXNob2xkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbWFsIGNvbnRlbnQgc2l6ZSBpbiBieXRlcy4gSWYgYSBjbGllbnQgcHJvdmlkZXMgY29udGVudAotICAgICAqIGJpZ2dlciB0aGFuIHRoYXQsIGEge0BsaW5rIENtaXNDb25zdHJhaW50RXhjZXB0aW9ufSBpcyB0aHJvd24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbWF4IHNpemUgaW4gYnl0ZXMgb3IgLTEgdG8gZGlzYWJsZSB0aGUgc2l6ZSBjaGVjawotICAgICAqLwotICAgIGxvbmcgZ2V0TWF4Q29udGVudFNpemUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgVGVtcFN0b3JlT3V0cHV0U3RyZWFtfSBvYmplY3QgZm9yIHRoZSBnaXZlbgotICAgICAqIHtAbGluayBDYWxsQ29udGV4dH0uCi0gICAgICogCi0gICAgICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgZm9yIHRoZSBBdG9tUHViIGFuZCB0aGUgQnJvd3NlciBiaW5kaW5nCi0gICAgICogcmVxdWVzdHMuIFRoZSBXZWIgU2VydmljZXMgYmluZGluZyBhbHdheXMgdXNlZCB0ZW1wb3JhcnkgZmlsZXMgKHNlZQotICAgICAqIHtAbGluayAjZ2V0VGVtcERpcmVjdG9yeSgpfSkuCi0gICAgICogCi0gICAgICogSWYge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkLCBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGhhdCBzdG9yZXMgdGhlCi0gICAgICogZG9jdW1lbnQgY29udGVudCBpbiB0ZW1wb3JhcnkgZmlsZXMgaXMgdXNlZCAoc2VlCi0gICAgICoge0BsaW5rICNnZXRUZW1wRGlyZWN0b3J5KCl9KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBJRCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHJlcG9zaXRvcnkgSUQgaXMKLSAgICAgKiAgICAgICAgICAgIHVua25vd24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFRlbXBTdG9yZU91dHB1dFN0cmVhbX0gaW5zdGFuY2Ugb3Ige0Bjb2RlIG51bGx9IHRvIHVzZQotICAgICAqICAgICAgICAgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgKi8KLSAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gZ2V0VGVtcEZpbGVPdXRwdXRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9MaW5rSW5mby5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvTGlua0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJlMzIzNS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9MaW5rSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW4gYXJiaXRyYXJ5IEF0b20gbGluay4gVGhpcyBkYXRhIGlzCi0gKiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBhZGRpdGlvbmFsIGxpbmtzIGluIEF0b21QdWIgZW50cmllcyBhbmQKLSAqIGZlZWRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmtJbmZvIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpbmsgcmVsIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UmVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaW5rIGhyZWYgYXR0cmlidXRlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRIcmVmKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaW5rIHR5cGUgYXR0cmlidXRlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaW5rIGlkIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL011dGFibGVDYWxsQ29udGV4dC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvTXV0YWJsZUNhbGxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NjUwMzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvTXV0YWJsZUNhbGxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXI7Ci0KLS8qKgotICogTXV0YWJsZSBDYWxsQ29udGV4dC4KLSAqLwotcHVibGljIGludGVyZmFjZSBNdXRhYmxlQ2FsbENvbnRleHQgZXh0ZW5kcyBDYWxsQ29udGV4dCB7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIG9yIHJlcGxhY2VzIGFuIGVudHJ5Ci0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqICAgICAgICAgICAgdGhlIGVudHJ5IGtleQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGVudHJ5IG9iamVjdAotICAgICAqLwotICAgIHZvaWQgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcGFyYW1ldGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIHRoZSBlbnRyeSBrZXkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbnRyeSBvYmplY3Qgb2YgdGhlIHJlbW92ZWQgZW50cnkgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQotICAgICAqICAgICAgICAgZW50cnkgZGlkbid0IGV4aXN0Ci0gICAgICovCi0gICAgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvTmFtZXNwYWNlRGVmaW5pdGlvbnMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL05hbWVzcGFjZURlZmluaXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMTdlMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvTmFtZXNwYWNlRGVmaW5pdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRGVmaW5lcyBhIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgYXJlIGFkZGVkIHRvIHRoZSByb290IHRhZyBvZiBBdG9tUHViIFhNTAotICogcmVzcG9uc2VzLgotICogCi0gKiBPYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSB7QGxpbmsgQ21pc1NlcnZpY2V9IGludGVyZmFjZSBtYXkgYWxzbyBpbXBsZW1lbnQKLSAqIHRoaXMgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVzcGFjZURlZmluaXRpb25zIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG1hcCBvZiBuYW1lc3BhY2VzOyBrZXkgPSBwcmVmaXgsIHZhbHVlID0gbmFtZXNwYWNlIFVSSQotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TmFtZXNwYWNlcygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvT2JqZWN0SW5mby5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvT2JqZWN0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmZlNjU3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL09iamVjdEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBvYmplY3QuIFRoaXMgZGF0YSBpcyB1c2VkIHRvCi0gKiBnZW5lcmF0ZSB0aGUgYXBwcm9wcmlhdGUgbGlua3MgaW4gQXRvbVB1YiBlbnRyaWVzIGFuZCBmZWVkcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPYmplY3RJbmZvIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9iamVjdCBJRC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSUQgZm9yIHRoZSBhdG9tOmlkIHRhZy4gVGhpcyBJRCBtdXN0IGNvbXBseSB3aXRoIHRoZSBBdG9tCi0gICAgICogc3BlY2lmaWNhdGlvbi4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0sIE9wZW5DTUlTIGdlbmVyYXRlcyBhCi0gICAgICogdmFsaWQgSUQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEF0b21JZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IG5hbWUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNyZWF0b3IuCi0gICAgICovCi0gICAgU3RyaW5nIGdldENyZWF0ZWRCeSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3JlYXRpb24gZGF0ZS4KLSAgICAgKi8KLSAgICBHcmVnb3JpYW5DYWxlbmRhciBnZXRDcmVhdGlvbkRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuCi0gICAgICovCi0gICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgSUQuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFR5cGVJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmFzZSB0eXBlLgotICAgICAqLwotICAgIEJhc2VUeXBlSWQgZ2V0QmFzZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBvYmplY3QgaXMgYSBkb2N1bWVudCBhbmQgaWYgaXQgaXMgdGhlIGN1cnJlbnQKLSAgICAgKiB2ZXJzaW9uIG9yIGl0IGlzIG5vdCB2ZXJzaW9uYWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0N1cnJlbnRWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIHNlcmllcyBJRCBpZiB0aGUgb2JqZWN0IGlzIGEgZG9jdW1lbnQgYW5kIGl0IGlzCi0gICAgICogdmVyc2lvbmFibGUsIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFZlcnNpb25TZXJpZXNJZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IElEIGlmIHRoZSBvYmplY3QgaXMgYSBkb2N1bWVudCBhbmQgYSB3b3JraW5nCi0gICAgICogY29weSBleGlzdHMsIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgU3RyaW5nIGdldFdvcmtpbmdDb3B5SWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9yaWdpbmFsIElEIG9mIHRoZSB3b3JraW5nIGNvcHkgaWYgdGhlIG9iamVjdCBpcyBhIGRvY3VtZW50Ci0gICAgICogYW5kIGEgd29ya2luZyBjb3B5LCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRXb3JraW5nQ29weU9yaWdpbmFsSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBvYmplY3QgaXMgYSBkb2N1bWVudCBhbmQgaGFzIGNvbnRlbnQsCi0gICAgICoge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNDb250ZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGNvbnRlbnQgaWYgdGhlIG9iamVjdCBpcyBhIGRvY3VtZW50IGFuZAotICAgICAqIGhhcyBjb250ZW50LCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIG9mIHRoZSBjb250ZW50IGlmIHRoZSBvYmplY3QgaXMgYSBkb2N1bWVudCBhbmQgaGFzCi0gICAgICogY29udGVudCwge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RmlsZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgcmVuZGl0aW9uIGluZm9ybWF0aW9uIGlmIHRoZSBvYmplY3QgaGFzIHJlbmRpdGlvbnMsIHtAY29kZSBudWxsfQotICAgICAqIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBMaXN0PFJlbmRpdGlvbkluZm8+IGdldFJlbmRpdGlvbkluZm9zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IHN1cHBvcnRzIHJlbGF0aW9uc2hpcHMgZXZlbiBpZiBubwotICAgICAqIHJlbGF0aW9uc2hpcHMgZXhpc3QsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gc3VwcG9ydHNSZWxhdGlvbnNoaXBzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IHN1cHBvcnRzIHBvbGljaWVzIGV2ZW4gaWYgbm8gcG9saWNpZXMKLSAgICAgKiBhcmUgYXBwbGllZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBzdXBwb3J0c1BvbGljaWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IGhhcyBhbiBBQ0wsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQWNsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IGhhcyBhdCBsZWFzdCBvbmUgcGFyZW50LCB7QGNvZGUgZmFsc2V9Ci0gICAgICogb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzUGFyZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IGlzIGEgZm9sZGVyIGFuZCBzdXBwb3J0cwotICAgICAqIHtAY29kZSBnZXREZXNjZW5kYW50c30sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gc3VwcG9ydHNEZXNjZW5kYW50cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9iamVjdCBpcyBhIGZvbGRlciBhbmQgc3VwcG9ydHMKLSAgICAgKiB7QGNvZGUgZ2V0Rm9sZGVyVHJlZX0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gc3VwcG9ydHNGb2xkZXJUcmVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIElEcyBvZiB0aGUgcmVsYXRpb25zaGlwcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoaXMKLSAgICAgKiBvYmplY3QsIHtAY29kZSBudWxsfSBpcyBubyBzdWNoIHJlbGF0aW9uc2hpcHMgZXhpc3QuCi0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldFJlbGF0aW9uc2hpcFNvdXJjZUlkcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBJRHMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgdGhhdCBwb2ludCB0byB0aGlzIG9iamVjdCwKLSAgICAgKiB7QGNvZGUgbnVsbH0gaXMgbm8gc3VjaCByZWxhdGlvbnNoaXBzIGV4aXN0LgotICAgICAqLwotICAgIExpc3Q8U3RyaW5nPiBnZXRSZWxhdGlvbnNoaXBUYXJnZXRJZHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwgb2JqZWN0LgotICAgICAqLwotICAgIE9iamVjdERhdGEgZ2V0T2JqZWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFkZGl0aW9uYWwgbGlua3MgcmVsYXRlZCB0byB0aGlzIG9iamVjdCwge0Bjb2RlIG51bGx9Ci0gICAgICogaXMgbm8gc3VjaCBsaW5rcyBleGlzdC4KLSAgICAgKi8KLSAgICBMaXN0PExpbmtJbmZvPiBnZXRBZGRpdGlvbmFsTGlua3MoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL09iamVjdEluZm9IYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9PYmplY3RJbmZvSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmRhZDY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL09iamVjdEluZm9IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9iamVjdEluZm9IYW5kbGVyIHsKLQotICAgIE9iamVjdEluZm8gZ2V0T2JqZWN0SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpOwotCi0gICAgdm9pZCBhZGRPYmplY3RJbmZvKE9iamVjdEluZm8gb2JqZWN0SW5mbyk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9Qcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5YzU2OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9Qcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXI7Ci0KLS8qKgotICogQ21pc1NlcnZpY2UgY2xhc3NlcyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBjYW4gY29udHJvbCB3aGV0aGVyIHRoZQotICogc2VydmVyIGZyYW1ld29yayBjb250aW51ZXMgb3Igc3RvcHMgcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdC4KLSAqIAotICogVGhlIHNlcnZlciBmcmFtZXdvcmsgY2FsbHMge0BsaW5rICNiZWZvcmVTZXJ2aWNlQ2FsbCgpfSBiZWZvcmUgdGhlIHJlcXVlc3RlZAotICogc2VydmljZSBtZXRob2QgaXMgY2FsbGVkIGFuZCBjYWxscyB7QGxpbmsgI2FmdGVyU2VydmljZUNhbGwoKX0gYWZ0ZXIgdGhlCi0gKiByZXF1ZXN0ZWQgc2VydmljZSBtZXRob2QgaXMgY2FsbGVkLiBCb3RoIG1ldGhvZHMgcmV0dXJuIGEge0BsaW5rIFByb2dyZXNzfQotICogZW51bSB2YWx1ZS4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyB7QGxpbmsgUHJvZ3Jlc3MjQ09OVElOVUV9ICwgdGhlIHNlcnZlcgotICogZnJhbWV3b3JrIGNvbnRpbnVlcyBwcm9jZXNzaW5nLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHtAbGluayBQcm9ncmVzcyNTVE9QfSwKLSAqIHRoZSBzZXJ2ZXIgZnJhbWV3b3JrIHN0b3BzIHByb2Nlc3NpbmcuCi0gKiAKLSAqIElmIHRoZSBzZXJ2aWNlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB7QGxpbmsgI2FmdGVyU2VydmljZUNhbGwoKX0gaXMgbm90Ci0gKiBjYWxsZWQgYW5kIHRoZSBzZXJ2ZXIgZnJhbWV3b3JrIG9yIGEgc2VydmljZSB3cmFwcGVyIGhhbmRsZXMgdGhlIGV4Y2VwdGlvbi4KLSAqIAotICogVGhlIGVmZmVjdCBvZiBzdG9wcGluZyB0aGUgcHJvY2Vzc2luZyBpcyBiaW5kaW5nIHNwZWNpZmljLiA8Yj5EZWFsaW5nIHdpdGgKLSAqIHRoYXQgcmVxdWlyZXMgZ29vZCBrbm93bGVkZ2Ugb2YgQ01JUywgSFRUUCwgYW5kIFNPQVAuPC9iPgotICogCi0gKiBJZiBhbiBBdG9tUHViIG9yIEJyb3dzZXIgQmluZGluZyByZXF1ZXN0IGlzIHN0b3BwZWQsIHRoZSBmcmFtZXdvcmsgZG9lc24ndAotICogc2VuZCBhbnkgSFRUUCByZXNwb25zZS4gSXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHtAbGluayBDbWlzU2VydmljZX0KLSAqIGNsYXNzIG9yIGEgc2VydmljZSB3cmFwcGVyIHRvIGdlbmVyYXRlIGEgQ01JUyBjb21wbGlhbnQgSFRUUCByZXNwb25zZS4gSWYgYQotICogV2ViIFNlcnZpY2UgQmluZGluZyByZXF1ZXN0IGlzIHN0b3BwZWQsIGFuIGFkZGl0aW9uYWwgTWVzc2FnZUhhbmRsZXIgbXVzdCBiZQotICogaW5zdGFsbGVkIHRoYXQgaGFuZGxlcyB0aGUgc2l0dWF0aW9uLiBPdGhlcndpc2UgdGhlIHNlcnZpY2Ugc2VuZHMgYW4gaW52YWxpZAotICogcmVzcG9uc2UuIElmIGEgTG9jYWwgQmluZGluZyByZXF1ZXN0IGlzIHN0b3BwZWQsIHRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQuCi0gKiBDdXN0b20gYmluZGluZyBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgbm90IHN1cHBvcnQgdGhpcyBpbnRlcmZhY2UgYXQgYWxsLgotICogCi0gKiBEZXBlbmRpbmcgb24gdGhlIGJpbmRpbmcgYW5kIHRoZSBzZXJ2aWNlIG1ldGhvZCwgdGhlIHtAbGluayBDbWlzU2VydmljZX0KLSAqIG9iamVjdCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIE9ubHkgdGhlIG1ldGhvZCByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCBpcwotICogYWNjb21wYW5pZWQgYnkge0BsaW5rICNiZWZvcmVTZXJ2aWNlQ2FsbCgpfSBhbmQge0BsaW5rICNhZnRlclNlcnZpY2VDYWxsKCl9Ci0gKiBjYWxscy4gVGhlIGZyYW1ld29yayBtaWdodCBjYWxsIG90aGVyIHNlcnZpY2UgbWV0aG9kcyBiZWZvcmUsIGFmdGVyLCBhbmQgaW4KLSAqIGJldHdlZW4gdGhlc2UgdHdvIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UgZXh0ZW5kcyBDbWlzU2VydmljZSB7Ci0KLSAgICBwdWJsaWMgZW51bSBQcm9ncmVzcyB7Ci0gICAgICAgIENPTlRJTlVFLCBTVE9QCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgc2VydmVyIGZyYW1ld29yayBiZWZvcmUgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlIG1ldGhvZCBpcwotICAgICAqIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAbGluayBQcm9ncmVzcyNDT05USU5VRX0gaWYgdGhlIHNlcnZlciBmcmFtZXdvcmsgc2hvdWxkIGNvbnRpbnVlCi0gICAgICogICAgICAgICBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0LCB7QGxpbmsgUHJvZ3Jlc3MjU1RPUH0gaWQgdGhlIHNlcnZlcgotICAgICAqICAgICAgICAgZnJhbWV3b3JrIHNob3VsZCBzdG9wCi0gICAgICovCi0gICAgUHJvZ3Jlc3MgYmVmb3JlU2VydmljZUNhbGwoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgc2VydmVyIGZyYW1ld29yayBhZnRlciB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgbWV0aG9kIGhhcwotICAgICAqIGJlZW4gY2FsbGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0BsaW5rIFByb2dyZXNzI0NPTlRJTlVFfSBpZiB0aGUgc2VydmVyIGZyYW1ld29yayBzaG91bGQgY29udGludWUKLSAgICAgKiAgICAgICAgIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QsIHtAbGluayBQcm9ncmVzcyNTVE9QfSBpZCB0aGUgc2VydmVyCi0gICAgICogICAgICAgICBmcmFtZXdvcmsgc2hvdWxkIHN0b3AKLSAgICAgKi8KLSAgICBQcm9ncmVzcyBhZnRlclNlcnZpY2VDYWxsKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9SZW5kaXRpb25JbmZvLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9SZW5kaXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NGU1NjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvUmVuZGl0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSByZW5kaXRpb24gb2YgYW4gb2JqZWN0LiBUaGlzIGRhdGEgaXMgdXNlZCB0bwotICogZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGxpbmtzIGluIEF0b21QdWIgZW50cmllcyBhbmQgZmVlZHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVuZGl0aW9uSW5mbyB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIElEIG9mIHRoZSByZW5kaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGl0aW9uIElELCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICovCi0gICAgU3RyaW5nIGdldElkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVuZGl0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIE1JTUUgdHlwZSwgc2hvdWxkIG5vdCBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29udGVuVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBraW5kIG9mIHRoZSByZW5kaXRpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGl0aW9uIGtpbmQsIG1heSBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0S2luZCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB0aXRsZSBvZiB0aGUgcmVuZGl0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHJlbmRpdGlvbiB0aXRsZSwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIFN0cmluZyBnZXRUaXRsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSByZW5kaXRpb24gaW4gYnl0ZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcmVuZGl0aW9uIHNpemUgaW4gYnl0ZXMsIG1heSBiZSB7QGNvZGUgbnVsbH0gaWYgdW5rbm93bgotICAgICAqLwotICAgIEJpZ0ludGVnZXIgZ2V0TGVuZ3RoKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9UZW1wU3RvcmVPdXRwdXRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL1RlbXBTdG9yZU91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE4MzRlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc2VydmVyL1RlbXBTdG9yZU91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogU3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIGFyZSB1c2VkIHRvIHN0b3JlIGRvY3VtZW50IGNvbnRlbnQgZm9yIGEgc2hvcnQKLSAqIHBlcmlvZCBvZiB0aW1lLgotICogCi0gKiBUaGUgT3BlbkNNSVMgc2VydmVyIGZyYW1ld29yayBjcmVhdGVzIHN1Y2ggYSBuZXcgc3RyZWFtIHdoZW4gaXQgbmVlZHMgdG8KLSAqIG9mZmxvYWQgZG9jdW1lbnQgY29udGVudCBmb3IgYSBtb21lbnQuIFRoYXQgY2FuIGhhcHBlbiB3aGVuIGEgZG9jdW1lbnQgaXMKLSAqIGNyZWF0ZWQsIG5ldyBjb250ZW50IGlzIHNldCBmb3IgYW4gZXhpc3RpbmcgZG9jdW1lbnQsIG9yIGEgbmV3IGRvY3VtZW50Ci0gKiB2ZXJzaW9uIGlzIGNyZWF0ZWQuIEhvdyBhbmQgd2hlcmUgc3ViY2xhc3NlcyBvZiB0aGlzIG91dHB1dCBzdHJlYW0gc3RvcmUgdGhlCi0gKiBjb250ZW50IGlzIG5vdCBzcGVjaWZpZWQuCi0gKiAKLSAqIFRoZSB7QGxpbmsgI2dldElucHV0U3RyZWFtKCl9IGFuZCB7QGxpbmsgI2dldExlbmd0aCgpfSBtZXRob2RzIGFyZSBub3QgY2FsbGVkCi0gKiBiZWZvcmUgYWxsIGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuIHRvIHRoaXMgb3V0cHV0IHN0cmVhbSBhbmQgdGhlCi0gKiB7QGxpbmsgI2Nsb3NlKCl9IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuIFRoZSB7QGxpbmsgI2Rlc3Ryb3koVGhyb3dhYmxlKX0KLSAqIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFuZCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHN0cmVhbSBpcyBub3QgbmVlZGVkCi0gKiBhbnltb3JlIGFuZCBhdHRhY2hlZCByZXNvdXJjZXMgY2FuIGJlIGNsZWFuZWQgdXAuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXN1YWxseSBiZSBjYWxsZWQgb25jZSBiZWZvcmUge0BsaW5rICNnZXRJbnB1dFN0cmVhbSgpfSBpcwotICAgICAqIGNhbGxlZC4gSXQgbWlnaHQgbmV2ZXIgYmUgY2FsbGVkIGlmIHRoZSBNSU1FIHR5cGUgaXMgdW5rbm93biBvciBtdWx0aXBsZQotICAgICAqIHRpbWVzIGlmIHByZXZpb3VzIE1JTUUgdHlwZSBkZXRlY3Rpb25zIHdlcmUgaW5hY2N1cmF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWltZVR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBNSU1FIHR5cGUgaXMgdW5rbm93biBvcgotICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIHJlc2V0IHRvIHVua25vd24KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBuYW1lLgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIHtAbGluayAjZ2V0SW5wdXRTdHJlYW0oKX0gaXMKLSAgICAgKiBjYWxsZWQuIEl0IG1pZ2h0IG5ldmVyIGJlIGNhbGxlZCBpZiB0aGUgZmlsZSBuYW1lIGlzIHVua25vd24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgZmlsZSBuYW1lIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgZmlsZSBuYW1lIGlzIHVua25vd24gb3IKLSAgICAgKiAgICAgICAgICAgIHNob3VsZCBiZSByZXNldCB0byB1bmtub3duCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4ge0BsaW5rIElucHV0U3RyZWFtfSB0aGF0IHNlcnZlcyB0aGUgY29udGVudCB0aGF0IGhhcyBiZWVuCi0gICAgICogcHJvdmlkZWQgdG8gdGhpcyB7QGxpbmsgVGVtcFN0b3JlT3V0cHV0U3RyZWFtfSBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBzYW1lIHtAbGluayBJbnB1dFN0cmVhbX0KLSAgICAgKiBvYmplY3QgbXVzdCBiZSByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGNsZWFuIHVwIGFsbCBhdHRhY2hlZCByZXNvdXJjZXMgd2hlbiB0aGlzIHN0cmVhbQotICAgICAqIGlzIGNsb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbSBpbiBieXRlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldExlbmd0aCgpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIHRoZSBzdHJlYW0gaGFzIHRvIGJlIHJlbGVhc2VkIGJlZm9yZSBpdCBpcyBmdWxseQotICAgICAqIHdyaXR0ZW4gb3IgcmVhZC4KLSAgICAgKiAKLSAgICAgKiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGNsZWFuIHVwIGFsbCBhdHRhY2hlZCByZXNvdXJjZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICogICAgICAgICAgICB0aGUgdGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBjYWxsIG9mIHRoaXMgbWV0aG9kIG9yCi0gICAgICogICAgICAgICAgICB7QGNvZGUgbnVsbH0gaWYgbm8gdGhyb3dhYmxlIG9iamVjdCBpcyBhdmFpbGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkZXN0cm95KFRocm93YWJsZSBjYXVzZSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9wYWNrYWdlLmh0bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NlcnZlci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2M5YzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zZXJ2ZXIvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLSAKLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0gLS0+Ci08aHRtbD4KLTxoZWFkPgotPC9oZWFkPgotPGJvZHk+Ci1PcGVuQ01JUyBzZXJ2ZXIgaW50ZXJmYWNlcy4KLTxwPlRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgc2VydmVyIGludGVyZmFjZXMuPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0FjbFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0FjbFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlZjdhZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9BY2xTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotCi0vKioKLSAqIEFDTCBTZXJ2aWNlIGludGVyZmFjZS4KLSAqIAotICogPHA+Ci0gKiA8ZW0+Ci0gKiBTZWUgdGhlIENNSVMgMS4wIGFuZCBDTUlTIDEuMSBzcGVjaWZpY2F0aW9ucyBmb3IgZGV0YWlscyBvbiB0aGUgb3BlcmF0aW9ucywgcGFyYW1ldGVycywKLSAqIGV4Y2VwdGlvbnMgYW5kIHRoZSBkb21haW4gbW9kZWwuCi0gKiA8L2VtPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjbFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBBQ0wgY3VycmVudGx5IGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBvbmx5QmFzaWNQZXJtaXNzaW9ucwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhbiBpbmRpY2F0b3IgaWYgb25seSBiYXNpYyBwZXJtaXNzaW9ucwotICAgICAqICAgICAgICAgICAgc2hvdWxkIGJlIHJldHVybmVkIChkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+KQotICAgICAqIEByZXR1cm4gdGhlIEFDTCBvZiB0aGUgb2JqZWN0Ci0gICAgICovCi0gICAgQWNsIGdldEFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gb25seUJhc2ljUGVybWlzc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIG9yIHJlbW92ZXMgdGhlIGdpdmVuIEFDRXMgdG8gb3IgZnJvbSB0aGUgQUNMIG9mIHRoZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBhZGRBY2VzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IHRoZSBBQ0VzIHRvIGJlIGFkZGVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIEFDRXMgdG8gYmUgcmVtb3ZlZAotICAgICAqIEBwYXJhbSBhY2xQcm9wYWdhdGlvbgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBzcGVjaWZpZXMgaG93IEFDRXMgc2hvdWxkIGJlIGhhbmRsZWQKLSAgICAgKiAgICAgICAgICAgIChkZWZhdWx0IGlzIHtAbGluayBBY2xQcm9wYWdhdGlvbiNSRVBPU0lUT1JZREVURVJNSU5FRH0pCi0gICAgICogQHJldHVybiB0aGUgQUNMIG9mIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0F1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0F1dGhlbnRpY2F0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMDRlMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9BdXRoZW50aWNhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc2V0IG9mIEhUVFAgaGVhZGVycyAoa2V5LXZhbHVlIHBhaXJzKSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byBhCi0gICAgICogSFRUUCBjYWxsLiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBBdG9tUHViIGFuZCB0aGUgV2ViIFNlcnZpY2VzCi0gICAgICogYmluZGluZy4gWW91IG1pZ2h0IHdhbnQgdG8gY2hlY2sgdGhlIGJpbmRpbmcgaW4gdXNlIGJlZm9yZSB5b3Ugc2V0IHRoZQotICAgICAqIGhlYWRlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgdGhlIFVSTCBvZiB0aGUgSFRUUCBjYWxsCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgSFRUUCBoZWFkZXJzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFkZGl0aW9uYWwgaGVhZGVycwotICAgICAqICAgICAgICAgc2hvdWxkIGJlIHNldAotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SFRUUEhlYWRlcnMoU3RyaW5nIHVybCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgU09BUCBoZWFkZXIgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gYSBXZWIgU2VydmljZXMgY2FsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9ydE9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIHBvcnQgb2JqZWN0Ci0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgU09BUCBoZWFkZXJzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFkZGl0aW9uYWwgaGVhZGVycwotICAgICAqICAgICAgICAgc2hvdWxkIGJlIHNldAotICAgICAqLwotICAgIEVsZW1lbnQgZ2V0U09BUEhlYWRlcnMoT2JqZWN0IHBvcnRPYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBIYW5kbGVyUmVzb2x2ZXJ9IG9iamVjdCB0aGF0IHByb3ZpZGVzIGEgbGlzdCBvZiBTT0FQCi0gICAgICogaGFuZGxlcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgSGFuZGxlclJlc29sdmVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhhbmRsZXJzIHNob3VsZCBiZQotICAgICAqICAgICAgICAgc2V0Ci0gICAgICovCi0gICAgSGFuZGxlclJlc29sdmVyIGdldEhhbmRsZXJSZXNvbHZlcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU1NMIFNvY2tldCBGYWN0b3J5IHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBzb2NrZXRzIGZvciBIVFRQUwotICAgICAqIGNvbm5lY3Rpb25zLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU1NMU29ja2V0RmFjdG9yeX0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKi8KLSAgICBTU0xTb2NrZXRGYWN0b3J5IGdldFNTTFNvY2tldEZhY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEhvc3RuYW1lIFZlcmlmaWVyIGZvciBIVFRQUyBjb25uZWN0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIEhvc3RuYW1lVmVyaWZpZXJ9IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgSG9zdG5hbWVWZXJpZmllciBnZXRIb3N0bmFtZVZlcmlmaWVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWNlaXZlcyB0aGUgSFRUUCBoZWFkZXJzIGFmdGVyIGEgY2FsbC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJsCi0gICAgICogICAgICAgICAgICB0aGUgVVJMCi0gICAgICogQHBhcmFtIHN0YXR1c0NvZGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgY29kZQotICAgICAqIEBwYXJhbSBoZWFkZXJzCi0gICAgICogICAgICAgICAgICB0aGUgSFRUUCBoZWFkZXJzCi0gICAgICovCi0gICAgdm9pZCBwdXRSZXNwb25zZUhlYWRlcnMoU3RyaW5nIHVybCwgaW50IHN0YXR1c0NvZGUsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycyk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9CaW5kaW5nc09iamVjdEZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0JpbmRpbmdzT2JqZWN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTc3NjE2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0JpbmRpbmdzT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5Qm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGVUaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURlY2ltYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SHRtbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlVcmk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgQ01JUyBiaW5kaW5nIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ3NPYmplY3RGYWN0b3J5IHsKLQotICAgIEFjZSBjcmVhdGVBY2Nlc3NDb250cm9sRW50cnkoU3RyaW5nIHByaW5jaXBhbCwgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zKTsKLQotICAgIEFjbCBjcmVhdGVBY2Nlc3NDb250cm9sTGlzdChMaXN0PEFjZT4gYWNlcyk7Ci0KLSAgICA8VD4gUHJvcGVydHlEYXRhPFQ+IGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eURlZmluaXRpb248VD4gcGQsIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICBQcm9wZXJ0eUJvb2xlYW4gY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShTdHJpbmcgaWQsIExpc3Q8Qm9vbGVhbj4gdmFsdWVzKTsKLQotICAgIFByb3BlcnR5Qm9vbGVhbiBjcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKFN0cmluZyBpZCwgQm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICBQcm9wZXJ0eUlkIGNyZWF0ZVByb3BlcnR5SWREYXRhKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlcyk7Ci0KLSAgICBQcm9wZXJ0eUlkIGNyZWF0ZVByb3BlcnR5SWREYXRhKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKTsKLQotICAgIFByb3BlcnR5SW50ZWdlciBjcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFN0cmluZyBpZCwgTGlzdDxCaWdJbnRlZ2VyPiB2YWx1ZXMpOwotCi0gICAgUHJvcGVydHlJbnRlZ2VyIGNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoU3RyaW5nIGlkLCBCaWdJbnRlZ2VyIHZhbHVlKTsKLQotICAgIFByb3BlcnR5RGF0ZVRpbWUgY3JlYXRlUHJvcGVydHlEYXRlVGltZURhdGEoU3RyaW5nIGlkLCBMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPiB2YWx1ZXMpOwotCi0gICAgUHJvcGVydHlEYXRlVGltZSBjcmVhdGVQcm9wZXJ0eURhdGVUaW1lRGF0YShTdHJpbmcgaWQsIEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKTsKLQotICAgIFByb3BlcnR5RGVjaW1hbCBjcmVhdGVQcm9wZXJ0eURlY2ltYWxEYXRhKFN0cmluZyBpZCwgTGlzdDxCaWdEZWNpbWFsPiB2YWx1ZXMpOwotCi0gICAgUHJvcGVydHlEZWNpbWFsIGNyZWF0ZVByb3BlcnR5RGVjaW1hbERhdGEoU3RyaW5nIGlkLCBCaWdEZWNpbWFsIHZhbHVlKTsKLQotICAgIFByb3BlcnR5SHRtbCBjcmVhdGVQcm9wZXJ0eUh0bWxEYXRhKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlcyk7Ci0KLSAgICBQcm9wZXJ0eUh0bWwgY3JlYXRlUHJvcGVydHlIdG1sRGF0YShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICBQcm9wZXJ0eVN0cmluZyBjcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoU3RyaW5nIGlkLCBMaXN0PFN0cmluZz4gdmFsdWVzKTsKLQotICAgIFByb3BlcnR5U3RyaW5nIGNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICBQcm9wZXJ0eVVyaSBjcmVhdGVQcm9wZXJ0eVVyaURhdGEoU3RyaW5nIGlkLCBMaXN0PFN0cmluZz4gdmFsdWVzKTsKLQotICAgIFByb3BlcnR5VXJpIGNyZWF0ZVByb3BlcnR5VXJpRGF0YShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICBQcm9wZXJ0aWVzIGNyZWF0ZVByb3BlcnRpZXNEYXRhKExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzKTsKLQotICAgIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudFN0cmVhbShTdHJpbmcgZmlsZW5hbWUsIEJpZ0ludGVnZXIgbGVuZ3RoLCBTdHJpbmcgbWltZXR5cGUsIElucHV0U3RyZWFtIHN0cmVhbSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9DbWlzQmluZGluZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvQ21pc0JpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkYzA1OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9DbWlzQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLQotLyoqCi0gKiBFbnRyeSBwb2ludCBmb3IgYWxsIENNSVMgYmluZGluZyByZWxhdGVkIG9wZXJhdGlvbnMuIEl0IHByb3ZpZGVzIGFjY2VzcyB0bwotICogdGhlIHNlcnZpY2UgaW50ZXJmYWNlIG9iamVjdHMgd2hpY2ggYXJlIHZlcnkgc2ltaWxhciB0byB0aGUgQ01JUyAxLjAgZG9tYWluCi0gKiBtb2RlbC4KLSAqIAotICogPHA+Ci0gKiBFYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNlc3Npb24uIEEgc2Vzc2lvbiBjb21wcmlzZXMgb2YgYQotICogY29ubmVjdGlvbiB0byBvbmUgQ01JUyBlbmRwb2ludCBvdmVyIG9uZSBiaW5kaW5nIGZvciBvbmUgcGFydGljdWxhciB1c2VyIGFuZAotICogYSBzZXQgb2YgY2FjaGVzLiBBbGwgcmVwb3NpdG9yaWVzIHRoYXQgYXJlIGV4cG9zZWQgYnkgdGhpcyBDTUlTIGVuZHBvaW50IGFyZQotICogYWNjZXNzaWJsZSBpbiB0aGlzIHNlc3Npb24uIEFsbCBDTUlTIG9wZXJhdGlvbnMgYW5kIGV4dGVuc2lvbiBwb2ludHMgYXJlCi0gKiBwcm92aWRlZCBpZiB0aGV5IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIHVuZGVybHlpbmcgYmluZGluZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBDbWlzQmluZGluZyBleHRlbmRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGllbnQgc2Vzc2lvbiBpZC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0U2Vzc2lvbklkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nIHR5cGUuCi0gICAgICovCi0gICAgQmluZGluZ1R5cGUgZ2V0QmluZGluZ1R5cGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBSZXBvc2l0b3J5IFNlcnZpY2UgaW50ZXJmYWNlIG9iamVjdC4KLSAgICAgKi8KLSAgICBSZXBvc2l0b3J5U2VydmljZSBnZXRSZXBvc2l0b3J5U2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIE5hdmlnYXRpb24gU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIE5hdmlnYXRpb25TZXJ2aWNlIGdldE5hdmlnYXRpb25TZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIE9iamVjdCBTZXJ2aWNlIGludGVyZmFjZSBvYmplY3QuCi0gICAgICovCi0gICAgT2JqZWN0U2VydmljZSBnZXRPYmplY3RTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgVmVyc2lvbmluZyBTZXJ2aWNlIGludGVyZmFjZSBvYmplY3QuCi0gICAgICovCi0gICAgVmVyc2lvbmluZ1NlcnZpY2UgZ2V0VmVyc2lvbmluZ1NlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBSZWxhdGlvbnNoaXAgU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIFJlbGF0aW9uc2hpcFNlcnZpY2UgZ2V0UmVsYXRpb25zaGlwU2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIERpc2NvdmVyeSBTZXJ2aWNlIGludGVyZmFjZSBvYmplY3QuCi0gICAgICovCi0gICAgRGlzY292ZXJ5U2VydmljZSBnZXREaXNjb3ZlcnlTZXJ2aWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgTXVsdGlmaWxpbmcgU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIE11bHRpRmlsaW5nU2VydmljZSBnZXRNdWx0aUZpbGluZ1NlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gQUNMIFNlcnZpY2UgaW50ZXJmYWNlIG9iamVjdC4KLSAgICAgKi8KLSAgICBBY2xTZXJ2aWNlIGdldEFjbFNlcnZpY2UoKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBQb2xpY3kgU2VydmljZSBpbnRlcmZhY2Ugb2JqZWN0LgotICAgICAqLwotICAgIFBvbGljeVNlcnZpY2UgZ2V0UG9saWN5U2VydmljZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGZhY3RvcnkgZm9yIENNSVMgYmluZGluZyBzcGVjaWZpYyBvYmplY3RzLgotICAgICAqLwotICAgIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBnZXRPYmplY3RGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhdXRoZW50aWNhdGlvbiBwcm92aWRlci4KLSAgICAgKi8KLSAgICBBdXRoZW50aWNhdGlvblByb3ZpZGVyIGdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKTsKLQotICAgIC8qKgotICAgICAqIENsZWFycyBhbGwgY2FjaGVzIG9mIHRoZSBjdXJyZW50IENNSVMgYmluZGluZyBzZXNzaW9uLgotICAgICAqLwotICAgIHZvaWQgY2xlYXJBbGxDYWNoZXMoKTsKLQotICAgIC8qKgotICAgICAqIENsZWFycyBhbGwgY2FjaGVzIG9mIHRoZSBjdXJyZW50IENNSVMgYmluZGluZyBzZXNzaW9uIHRoYXQgYXJlIHJlbGF0ZWQgdG8KLSAgICAgKiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBpZAotICAgICAqLwotICAgIHZvaWQgY2xlYXJSZXBvc2l0b3J5Q2FjaGUoU3RyaW5nIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGFzc2lnbmVkIHRvIHRoaXMgYmluZGluZyBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICB2b2lkIGNsb3NlKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9EaXNjb3ZlcnlTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9EaXNjb3ZlcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMmQyYWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvRGlzY292ZXJ5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLQotLyoqCi0gKiBEaXNjb3ZlcnkgU2VydmljZSBpbnRlcmZhY2UuCi0gKiAKLSAqIDxwPgotICogPGVtPgotICogU2VlIHRoZSBDTUlTIDEuMCBhbmQgQ01JUyAxLjEgc3BlY2lmaWNhdGlvbnMgZm9yIGRldGFpbHMgb24gdGhlIG9wZXJhdGlvbnMsIHBhcmFtZXRlcnMsCi0gKiBleGNlcHRpb25zIGFuZCB0aGUgZG9tYWluIG1vZGVsLgotICogPC9lbT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjb3ZlcnlTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIGEgQ01JUyBxdWVyeSBzdGF0ZW1lbnQgYWdhaW5zdCB0aGUgY29udGVudHMgb2YgdGhlIHJlcG9zaXRvcnkuCi0gICAgICovCi0gICAgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc3RhdGVtZW50LCBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJpZ0ludGVnZXIgbWF4SXRlbXMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBsaXN0IG9mIGNvbnRlbnQgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBPYmplY3RMaXN0IGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9FeHRlbmRlZEFjbFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0V4dGVuZGVkQWNsU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjlhODA4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0V4dGVuZGVkQWNsU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLQotLyoqCi0gKiBFeHRlbmRlZCBBQ0wgU2VydmljZSBpbnRlcmZhY2UuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGhhcyBOTyBlcXVpdmFsZW50IGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uIEl0IGNvbnRhaW5zIEFDTAotICogY29udmVuaWVuY2Ugb3BlcmF0aW9ucyBmb3IgY2xpZW50cyBhbmQgaXMgYnVpbHQgb24gdG9wIG9mIHRoZSBDTUlTIHNwZWNpZmllZAotICogb3BlcmF0aW9ucy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgbmVlZCBub3QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgQ01JUyBzZXJ2ZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQWNsU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBkaXJlY3QgQUNFcyBvZiBhbiBvYmplY3QgYW5kIHNldHMgdGhlIHByb3ZpZGVkIEFDRXMuCi0gICAgICogCi0gICAgICogVGhlIGNoYW5nZXMgYXJlIGxvY2FsIHRvIHRoZSBnaXZlbiBvYmplY3QgYW5kIGFyZSBub3QgcHJvcGFnYXRlZCB0bwotICAgICAqIGRlcGVuZGVudCBvYmplY3RzLgotICAgICAqIAotICAgICAqIFRoZSBlZmZlY3Qgb2YgdGhpcyBvcGVyYXRpb24gZGVwZW5kcyBvbiB0aGUgcmVwb3NpdG9yeSBhbmQgdGhlIGJpbmRpbmcuCi0gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gcHJvY2VzcyB0aGUgcmV0dXJuZWQgQUNMIGFmdGVyIHRoZSBtZXRob2QgaGFzIGJlZW4KLSAgICAgKiBjYWxsZWQgYW5kIGNoZWNrIGlmIHJlc3VsdCBtYXRjaGVzIHRoZSBleHBlY3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFjZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBBQ0VzCi0gICAgICogQHJldHVybiB0aGUgQUNMIG9mIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBBY2wgc2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvRXh0ZW5kZWRIb2xkZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0V4dGVuZGVkSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWY5NmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvRXh0ZW5kZWRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEhvbGRlciBmb3IgSU4vT1VUIHBhcmFtZXRlcnMgdGhhdCBjYW4gaG9sZCBleHRyYSB2YWx1ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEhvbGRlcjxUPiBleHRlbmRzIEhvbGRlcjxUPiB7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZXh0cmFWYWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBob2xkZXIgd2l0aCBhIHtAY29kZSBudWxsfSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZW5kZWRIb2xkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGhvbGRlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRXh0ZW5kZWRIb2xkZXIoVCB2YWx1ZSkgewotICAgICAgICBzdXBlcih2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhbiBleHRyYSB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHZhbHVlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYVZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgZXh0cmFWYWx1ZXMucHV0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGV4dHJhIHZhbHVlLAotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gaWYgYSB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGRvZXNuJ3QKLSAgICAgKiAgICAgICAgIGV4aXN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRFeHRyYVZhbHVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBleHRyYVZhbHVlcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJFeHRlbmRlZEhvbGRlcigiICsgZ2V0VmFsdWUoKSArICIsICIgKyBleHRyYVZhbHVlcy50b1N0cmluZygpICsgIikiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0V4dGVuZGVkUmVwb3NpdG9yeVNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0V4dGVuZGVkUmVwb3NpdG9yeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyNmU2NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9FeHRlbmRlZFJlcG9zaXRvcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBFeHRlbmRlZCBSZXBvc2l0b3J5IFNlcnZpY2UgaW50ZXJmYWNlLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBoYXMgTk8gZXF1aXZhbGVudCBpbiB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uLiBJdCBjb250YWlucwotICogcmVwb3NpdG9yeSBjb252ZW5pZW5jZSBvcGVyYXRpb25zIGZvciBjbGllbnRzIGFuZCBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIENNSVMKLSAqIHNwZWNpZmllZCBvcGVyYXRpb25zLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBuZWVkIG5vdCB0byBiZSBpbXBsZW1lbnRlZCBieSBDTUlTIHNlcnZlcnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRSZXBvc2l0b3J5U2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHR5cGVJZAotICAgICAqICAgICAgICAgICAgdHlwZUlkIG9mIGFuIG9iamVjdCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSB1c2VDYWNoZQotICAgICAqICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHR5cGUgZGVmaW5pdGlvbiBzaG91bGQgYmUgbG9va2VkIHVwIGluCi0gICAgICogICAgICAgICAgICB0aGUgdHlwZSBkZWZpbml0aW9uIGNhY2hlIGZpcnN0IG9yIG5vdAotICAgICAqLwotICAgIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgYm9vbGVhbiB1c2VDYWNoZSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9Ib2xkZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0hvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWVlY2E5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL0hvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpOwotCi0vKioKLSAqIEhvbGRlciBmb3IgSU4vT1VUIHBhcmFtZXRlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIb2xkZXI8VD4gewotCi0gICAgcHJpdmF0ZSBUIHZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGhvbGRlciB3aXRoIGEge0Bjb2RlIG51bGx9IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBIb2xkZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGhvbGRlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSG9sZGVyKFQgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBob2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBuZXcgdmFsdWUgb2YgdGhlIGhvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkhvbGRlcigiICsgdmFsdWUgKyAiKSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvTXVsdGlGaWxpbmdTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9NdWx0aUZpbGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3OTEyMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9NdWx0aUZpbGluZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLQotLyoqCi0gKiBNdWx0aUZpbGluZyBTZXJ2aWNlIGludGVyZmFjZS4KLSAqIAotICogPHA+Ci0gKiA8ZW0+Ci0gKiBTZWUgdGhlIENNSVMgMS4wIGFuZCBDTUlTIDEuMSBzcGVjaWZpY2F0aW9ucyBmb3IgZGV0YWlscyBvbiB0aGUgb3BlcmF0aW9ucywgcGFyYW1ldGVycywKLSAqIGV4Y2VwdGlvbnMgYW5kIHRoZSBkb21haW4gbW9kZWwuCi0gKiA8L2VtPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE11bHRpRmlsaW5nU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGV4aXN0aW5nIGZpbGVhYmxlIG5vbi1mb2xkZXIgb2JqZWN0IHRvIGEgZm9sZGVyLgotICAgICAqLwotICAgIHZvaWQgYWRkT2JqZWN0VG9Gb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbiBleGlzdGluZyBmaWxlYWJsZSBub24tZm9sZGVyIG9iamVjdCBmcm9tIGEgZm9sZGVyLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL05hdmlnYXRpb25TZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9OYXZpZ2F0aW9uU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JhZGJhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL05hdmlnYXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLQotLyoqCi0gKiBOYXZpZ2F0aW9uIFNlcnZpY2UgaW50ZXJmYWNlLgotICogCi0gKiA8cD4KLSAqIDxlbT4KLSAqIFNlZSB0aGUgQ01JUyAxLjAgYW5kIENNSVMgMS4xIHNwZWNpZmljYXRpb25zIGZvciBkZXRhaWxzIG9uIHRoZSBvcGVyYXRpb25zLCBwYXJhbWV0ZXJzLAotICogZXhjZXB0aW9ucyBhbmQgdGhlIGRvbWFpbiBtb2RlbC4KLSAqIDwvZW0+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmF2aWdhdGlvblNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBjaGlsZCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gZm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgZm9sZGVyCi0gICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1ZXJ5IG5hbWVzIHRoYXQKLSAgICAgKiAgICAgICAgICAgIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBtdXN0IGJlIHJldHVybmVkIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqIEBwYXJhbSBvcmRlckJ5Ci0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcXVlcnkgbmFtZXMgdGhhdAotICAgICAqICAgICAgICAgICAgZGVmaW5lIHRoZSBvcmRlciBvZiB0aGUgcmVzdWx0IHNldC4gRWFjaCBxdWVyeSBuYW1lIG11c3QgYmUKLSAgICAgKiAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBhc2NlbmRpbmcgbW9kaWZpZXIgIkFTQyIgb3IgdGhlIGRlc2NlbmRpbmcKLSAgICAgKiAgICAgICAgICAgIG1vZGlmaWVyICJERVNDIiAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqIEBwYXJhbSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgbXVzdCByZXR1cm4gdGhlIGF2YWlsYWJsZSBhY3Rpb25zIGZvciBlYWNoIG9iamVjdCBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlc3VsdCBzZXQgKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqIEBwYXJhbSBpbmNsdWRlUmVsYXRpb25zaGlwcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpbmRpY2F0ZXMgd2hhdCByZWxhdGlvbnNoaXBzIGluIHdoaWNoIHRoZQotICAgICAqICAgICAgICAgICAgb2JqZWN0cyBwYXJ0aWNpcGF0ZSBtdXN0IGJlIHJldHVybmVkIChkZWZhdWx0IGlzCi0gICAgICogICAgICAgICAgICB7QGxpbmsgSW5jbHVkZVJlbGF0aW9uc2hpcHMjTk9ORX0pCi0gICAgICogQHBhcmFtIHJlbmRpdGlvbkZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpbmRpY2F0ZXMgd2hhdCBzZXQgb2YgcmVuZGl0aW9ucyB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgbXVzdCByZXR1cm4gd2hvc2Uga2luZCBtYXRjaGVzIHRoaXMgZmlsdGVyIChkZWZhdWx0Ci0gICAgICogICAgICAgICAgICBpcyA8Y29kZT4iY21pczpub25lIjwvY29kZT4pCi0gICAgICogQHBhcmFtIGluY2x1ZGVQYXRoU2VnbWVudAotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmV0dXJucyBhIHBhdGgKLSAgICAgKiAgICAgICAgICAgIHNlZ21lbnQgZm9yIGVhY2ggY2hpbGQgb2JqZWN0IGZvciB1c2UgaW4gY29uc3RydWN0aW5nIHRoYXQKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCdzIHBhdGggKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqIEBwYXJhbSBtYXhJdGVtcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuIGluIGEKLSAgICAgKiAgICAgICAgICAgIHJlc3BvbnNlIChkZWZhdWx0IGlzIHJlcG9zaXRvcnkgc3BlY2lmaWMpCi0gICAgICogQHBhcmFtIHNraXBDb3VudAotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBudW1iZXIgb2YgcG90ZW50aWFsIHJlc3VsdHMgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgTVVTVCBza2lwL3BhZ2Ugb3ZlciBiZWZvcmUgcmV0dXJuaW5nIGFueSByZXN1bHRzCi0gICAgICogICAgICAgICAgICAoZGVmYXVsdCBpcyAwKQotICAgICAqLwotICAgIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXQgb2YgZGVzY2VuZGFudCBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciBvcgotICAgICAqIGFueSBvZiBpdHMgY2hpbGQgZm9sZGVycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gZm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgZm9sZGVyCi0gICAgICogQHBhcmFtIGRlcHRoCi0gICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGxldmVscyBvZiBkZXB0aCBpbiB0aGUgZm9sZGVyIGhpZXJhcmNoeSBmcm9tCi0gICAgICogICAgICAgICAgICB3aGljaCB0byByZXR1cm4gcmVzdWx0cwotICAgICAqIEBwYXJhbSBmaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBxdWVyeSBuYW1lcyB0aGF0Ci0gICAgICogICAgICAgICAgICBkZWZpbmVzIHdoaWNoIHByb3BlcnRpZXMgbXVzdCBiZSByZXR1cm5lZCBieSB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgKGRlZmF1bHQgaXMgcmVwb3NpdG9yeSBzcGVjaWZpYykKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAgICAgICAgICAgIG11c3QgcmV0dXJuIHRoZSBhdmFpbGFibGUgYWN0aW9ucyBmb3IgZWFjaCBvYmplY3QgaW4gdGhlCi0gICAgICogICAgICAgICAgICByZXN1bHQgc2V0IChkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaW5kaWNhdGVzIHdoYXQgcmVsYXRpb25zaGlwcyBpbiB3aGljaCB0aGUKLSAgICAgKiAgICAgICAgICAgIG9iamVjdHMgcGFydGljaXBhdGUgbXVzdCBiZSByZXR1cm5lZCAoZGVmYXVsdCBpcwotICAgICAqICAgICAgICAgICAge0BsaW5rIEluY2x1ZGVSZWxhdGlvbnNoaXBzI05PTkV9KQotICAgICAqIEBwYXJhbSByZW5kaXRpb25GaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaW5kaWNhdGVzIHdoYXQgc2V0IG9mIHJlbmRpdGlvbnMgdGhlCi0gICAgICogICAgICAgICAgICByZXBvc2l0b3J5IG11c3QgcmV0dXJuIHdob3NlIGtpbmQgbWF0Y2hlcyB0aGlzIGZpbHRlciAoZGVmYXVsdAotICAgICAqICAgICAgICAgICAgaXMgPGNvZGU+ImNtaXM6bm9uZSI8L2NvZGU+KQotICAgICAqIEBwYXJhbSBpbmNsdWRlUGF0aFNlZ21lbnQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJldHVybnMgYSBwYXRoCi0gICAgICogICAgICAgICAgICBzZWdtZW50IGZvciBlYWNoIGNoaWxkIG9iamVjdCBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyB0aGF0Ci0gICAgICogICAgICAgICAgICBvYmplY3QncyBwYXRoIChkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPikKLSAgICAgKiovCi0gICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNldCBvZiBkZXNjZW5kYW50IGZvbGRlciBvYmplY3RzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogZm9sZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBmb2xkZXIKLSAgICAgKiBAcGFyYW0gZGVwdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbGV2ZWxzIG9mIGRlcHRoIGluIHRoZSBmb2xkZXIgaGllcmFyY2h5IGZyb20KLSAgICAgKiAgICAgICAgICAgIHdoaWNoIHRvIHJldHVybiByZXN1bHRzCi0gICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1ZXJ5IG5hbWVzIHRoYXQKLSAgICAgKiAgICAgICAgICAgIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBtdXN0IGJlIHJldHVybmVkIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqIEBwYXJhbSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgbXVzdCByZXR1cm4gdGhlIGF2YWlsYWJsZSBhY3Rpb25zIGZvciBlYWNoIG9iamVjdCBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlc3VsdCBzZXQgKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqIEBwYXJhbSBpbmNsdWRlUmVsYXRpb25zaGlwcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpbmRpY2F0ZXMgd2hhdCByZWxhdGlvbnNoaXBzIGluIHdoaWNoIHRoZQotICAgICAqICAgICAgICAgICAgb2JqZWN0cyBwYXJ0aWNpcGF0ZSBtdXN0IGJlIHJldHVybmVkIChkZWZhdWx0IGlzCi0gICAgICogICAgICAgICAgICB7QGxpbmsgSW5jbHVkZVJlbGF0aW9uc2hpcHMjTk9ORX0pCi0gICAgICogQHBhcmFtIHJlbmRpdGlvbkZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpbmRpY2F0ZXMgd2hhdCBzZXQgb2YgcmVuZGl0aW9ucyB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgbXVzdCByZXR1cm4gd2hvc2Uga2luZCBtYXRjaGVzIHRoaXMgZmlsdGVyIChkZWZhdWx0Ci0gICAgICogICAgICAgICAgICBpcyA8Y29kZT4iY21pczpub25lIjwvY29kZT4pCi0gICAgICogQHBhcmFtIGluY2x1ZGVQYXRoU2VnbWVudAotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmV0dXJucyBhIHBhdGgKLSAgICAgKiAgICAgICAgICAgIHNlZ21lbnQgZm9yIGVhY2ggY2hpbGQgb2JqZWN0IGZvciB1c2UgaW4gY29uc3RydWN0aW5nIHRoYXQKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCdzIHBhdGggKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqKi8KLSAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXRGb2xkZXJUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXJlbnQgZm9sZGVyKHMpIGZvciB0aGUgc3BlY2lmaWVkIG5vbi1mb2xkZXIsIGZpbGVhYmxlIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1ZXJ5IG5hbWVzIHRoYXQKLSAgICAgKiAgICAgICAgICAgIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBtdXN0IGJlIHJldHVybmVkIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqIEBwYXJhbSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgbXVzdCByZXR1cm4gdGhlIGF2YWlsYWJsZSBhY3Rpb25zIGZvciBlYWNoIG9iamVjdCBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlc3VsdCBzZXQgKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqIEBwYXJhbSBpbmNsdWRlUmVsYXRpb25zaGlwcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpbmRpY2F0ZXMgd2hhdCByZWxhdGlvbnNoaXBzIGluIHdoaWNoIHRoZQotICAgICAqICAgICAgICAgICAgb2JqZWN0cyBwYXJ0aWNpcGF0ZSBtdXN0IGJlIHJldHVybmVkIChkZWZhdWx0IGlzCi0gICAgICogICAgICAgICAgICB7QGxpbmsgSW5jbHVkZVJlbGF0aW9uc2hpcHMjTk9ORX0pCi0gICAgICogQHBhcmFtIHJlbmRpdGlvbkZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpbmRpY2F0ZXMgd2hhdCBzZXQgb2YgcmVuZGl0aW9ucyB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgbXVzdCByZXR1cm4gd2hvc2Uga2luZCBtYXRjaGVzIHRoaXMgZmlsdGVyIChkZWZhdWx0Ci0gICAgICogICAgICAgICAgICBpcyA8Y29kZT4iY21pczpub25lIjwvY29kZT4pCi0gICAgICogQHBhcmFtIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50Ci0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZXR1cm5zIGEgcmVsYXRpdmUKLSAgICAgKiAgICAgICAgICAgIHBhdGggc2VnbWVudCBmb3IgZWFjaCBwYXJlbnQgb2JqZWN0IGZvciB1c2UgaW4gY29uc3RydWN0aW5nCi0gICAgICogICAgICAgICAgICB0aGF0IG9iamVjdCdzIHBhdGggKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqLwotICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gZ2V0T2JqZWN0UGFyZW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXJlbnQgZm9sZGVyIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBmb2xkZXIgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBmb2xkZXIKLSAgICAgKiBAcGFyYW0gZmlsdGVyCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcXVlcnkgbmFtZXMgdGhhdAotICAgICAqICAgICAgICAgICAgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIG11c3QgYmUgcmV0dXJuZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAgICAgICAgICAgIChkZWZhdWx0IGlzIHJlcG9zaXRvcnkgc3BlY2lmaWMpCi0gICAgICovCi0gICAgT2JqZWN0RGF0YSBnZXRGb2xkZXJQYXJlbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBkb2N1bWVudHMgdGhhdCBhcmUgY2hlY2tlZCBvdXQgdGhhdCB0aGUgdXNlciBoYXMgYWNjZXNzCi0gICAgICogdG8uCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIGZvbGRlcklkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIGZvbGRlcgotICAgICAqIEBwYXJhbSBmaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBxdWVyeSBuYW1lcyB0aGF0Ci0gICAgICogICAgICAgICAgICBkZWZpbmVzIHdoaWNoIHByb3BlcnRpZXMgbXVzdCBiZSByZXR1cm5lZCBieSB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgKGRlZmF1bHQgaXMgcmVwb3NpdG9yeSBzcGVjaWZpYykKLSAgICAgKiBAcGFyYW0gb3JkZXJCeQotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1ZXJ5IG5hbWVzIHRoYXQKLSAgICAgKiAgICAgICAgICAgIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIHJlc3VsdCBzZXQuIEVhY2ggcXVlcnkgbmFtZSBtdXN0IGJlCi0gICAgICogICAgICAgICAgICBmb2xsb3dlZCBieSB0aGUgYXNjZW5kaW5nIG1vZGlmaWVyICJBU0MiIG9yIHRoZSBkZXNjZW5kaW5nCi0gICAgICogICAgICAgICAgICBtb2RpZmllciAiREVTQyIgKGRlZmF1bHQgaXMgcmVwb3NpdG9yeSBzcGVjaWZpYykKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAgICAgICAgICAgIG11c3QgcmV0dXJuIHRoZSBhdmFpbGFibGUgYWN0aW9ucyBmb3IgZWFjaCBvYmplY3QgaW4gdGhlCi0gICAgICogICAgICAgICAgICByZXN1bHQgc2V0IChkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaW5kaWNhdGVzIHdoYXQgcmVsYXRpb25zaGlwcyBpbiB3aGljaCB0aGUKLSAgICAgKiAgICAgICAgICAgIG9iamVjdHMgcGFydGljaXBhdGUgbXVzdCBiZSByZXR1cm5lZCAoZGVmYXVsdCBpcwotICAgICAqICAgICAgICAgICAge0BsaW5rIEluY2x1ZGVSZWxhdGlvbnNoaXBzI05PTkV9KQotICAgICAqIEBwYXJhbSByZW5kaXRpb25GaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaW5kaWNhdGVzIHdoYXQgc2V0IG9mIHJlbmRpdGlvbnMgdGhlCi0gICAgICogICAgICAgICAgICByZXBvc2l0b3J5IG11c3QgcmV0dXJuIHdob3NlIGtpbmQgbWF0Y2hlcyB0aGlzIGZpbHRlciAoZGVmYXVsdAotICAgICAqICAgICAgICAgICAgaXMgPGNvZGU+ImNtaXM6bm9uZSI8L2NvZGU+KQotICAgICAqIEBwYXJhbSBtYXhJdGVtcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcmV0dXJuIGluIGEKLSAgICAgKiAgICAgICAgICAgIHJlc3BvbnNlIChkZWZhdWx0IGlzIHJlcG9zaXRvcnkgc3BlY2lmaWMpCi0gICAgICogQHBhcmFtIHNraXBDb3VudAotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBudW1iZXIgb2YgcG90ZW50aWFsIHJlc3VsdHMgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgTVVTVCBza2lwL3BhZ2Ugb3ZlciBiZWZvcmUgcmV0dXJuaW5nIGFueSByZXN1bHRzCi0gICAgICogICAgICAgICAgICAoZGVmYXVsdCBpcyAwKQotICAgICAqLwotICAgIE9iamVjdExpc3QgZ2V0Q2hlY2tlZE91dERvY3MoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9PYmplY3RTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9PYmplY3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OTNiOWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvT2JqZWN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5GYWlsZWRUb0RlbGV0ZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLQotLyoqCi0gKiBPYmplY3QgU2VydmljZSBpbnRlcmZhY2UuCi0gKiAKLSAqIDxwPgotICogPGVtPgotICogU2VlIHRoZSBDTUlTIDEuMCBhbmQgQ01JUyAxLjEgc3BlY2lmaWNhdGlvbnMgZm9yIGRldGFpbHMgb24gdGhlIG9wZXJhdGlvbnMsIHBhcmFtZXRlcnMsCi0gKiBleGNlcHRpb25zIGFuZCB0aGUgZG9tYWluIG1vZGVsLgotICogPC9lbT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBPYmplY3RTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkb2N1bWVudCBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIChnaXZlbiBieSB0aGUKLSAgICAgKiBjbWlzOm9iamVjdFR5cGVJZCBwcm9wZXJ0eSkgaW4gdGhlIChvcHRpb25hbGx5KSBzcGVjaWZpZWQgbG9jYXRpb24uCi0gICAgICogCi0gICAgICogVGhlIHN0cmVhbSBpbiA8Y29kZT5jb250ZW50U3RyZWFtPC9jb2RlPiBpcyBjb25zdW1lZCBidXQgbm90IGNsb3NlZCBieQotICAgICAqIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWVzIHRoYXQgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBuZXdseSBjcmVhdGVkCi0gICAgICogICAgICAgICAgICBkb2N1bWVudCBvYmplY3QKLSAgICAgKiBAcGFyYW0gZm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgc3BlY2lmaWVkLCB0aGUgaWRlbnRpZmllciBmb3IgdGhlCi0gICAgICogICAgICAgICAgICBmb2xkZXIgdGhhdCBtdXN0IGJlIHRoZSBwYXJlbnQgZm9sZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZAotICAgICAqICAgICAgICAgICAgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHBhcmFtIGNvbnRlbnRTdHJlYW0KLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIGNvbnRlbnQgc3RyZWFtIHRoYXQgbXVzdCBiZSBzdG9yZWQgZm9yCi0gICAgICogICAgICAgICAgICB0aGUgbmV3bHkgY3JlYXRlZCBkb2N1bWVudCBvYmplY3QKLSAgICAgKiBAcGFyYW0gdmVyc2lvbmluZ1N0YXRlCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IHNwZWNpZmllcyB3aGF0IHRoZSB2ZXJzaW9uaW5nIHN0YXRlIG9mIHRoZQotICAgICAqICAgICAgICAgICAgbmV3bHkgY3JlYXRlZCBvYmplY3QgbXVzdCBiZSAoZGVmYXVsdCBpcwotICAgICAqICAgICAgICAgICAge0BsaW5rIFZlcnNpb25pbmdTdGF0ZSNNQUpPUn0pCi0gICAgICogQHBhcmFtIHBvbGljaWVzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBwb2xpY3kgSURzIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0gICAgICogICAgICAgICAgICB0byB0aGUgbmV3bHkgY3JlYXRlZCBkb2N1bWVudCBvYmplY3QKLSAgICAgKiBAcGFyYW0gYWRkQWNlcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGxpc3Qgb2YgQUNFcyB0aGF0IG11c3QgYmUgYWRkZWQgdG8gdGhlCi0gICAgICogICAgICAgICAgICBuZXdseSBjcmVhdGVkIGRvY3VtZW50IG9iamVjdCwgZWl0aGVyIHVzaW5nIHRoZSBBQ0wgZnJvbQotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlmIHNwZWNpZmllZCwgb3IgYmVpbmcgYXBwbGllZCBpZiBubwotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlzIHNwZWNpZmllZAotICAgICAqIEBwYXJhbSByZW1vdmVBY2VzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBBQ0VzIHRoYXQgbXVzdCBiZSByZW1vdmVkIGZyb20KLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXdseSBjcmVhdGVkIGRvY3VtZW50IG9iamVjdCwgZWl0aGVyIHVzaW5nIHRoZSBBQ0wgZnJvbQotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlmIHNwZWNpZmllZCwgb3IgYmVpbmcgaWdub3JlZCBpZiBubwotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRvY3VtZW50IG9iamVjdCBhcyBhIGNvcHkgb2YgdGhlIGdpdmVuIHNvdXJjZSBkb2N1bWVudCBpbiB0aGUKLSAgICAgKiAob3B0aW9uYWxseSkgc3BlY2lmaWVkIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBzb3VyY2VJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBzb3VyY2UgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlcyB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgbmV3bHkgY3JlYXRlZAotICAgICAqICAgICAgICAgICAgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHBhcmFtIGZvbGRlcklkCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIHNwZWNpZmllZCwgdGhlIGlkZW50aWZpZXIgZm9yIHRoZQotICAgICAqICAgICAgICAgICAgZm9sZGVyIHRoYXQgbXVzdCBiZSB0aGUgcGFyZW50IGZvbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQKLSAgICAgKiAgICAgICAgICAgIGRvY3VtZW50IG9iamVjdAotICAgICAqIEBwYXJhbSB2ZXJzaW9uaW5nU3RhdGUKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gc3BlY2lmaWVzIHdoYXQgdGhlIHZlcnNpb25pbmcgc3RhdGUgb2YgdGhlCi0gICAgICogICAgICAgICAgICBuZXdseSBjcmVhdGVkIG9iamVjdCBtdXN0IGJlIChkZWZhdWx0IGlzCi0gICAgICogICAgICAgICAgICB7QGxpbmsgVmVyc2lvbmluZ1N0YXRlI01BSk9SfSkKLSAgICAgKiBAcGFyYW0gcG9saWNpZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIHBvbGljeSBJRHMgdGhhdCBtdXN0IGJlIGFwcGxpZWQKLSAgICAgKiAgICAgICAgICAgIHRvIHRoZSBuZXdseSBjcmVhdGVkIGRvY3VtZW50IG9iamVjdAotICAgICAqIEBwYXJhbSBhZGRBY2VzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBBQ0VzIHRoYXQgbXVzdCBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQgb2JqZWN0LCBlaXRoZXIgdXNpbmcgdGhlIEFDTCBmcm9tCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaWYgc3BlY2lmaWVkLCBvciBiZWluZyBhcHBsaWVkIGlmIG5vCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaXMgc3BlY2lmaWVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIHJlbW92ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQgb2JqZWN0LCBlaXRoZXIgdXNpbmcgdGhlIEFDTCBmcm9tCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaWYgc3BlY2lmaWVkLCBvciBiZWluZyBpZ25vcmVkIGlmIG5vCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaXMgc3BlY2lmaWVkCi0gICAgICovCi0gICAgU3RyaW5nIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZvbGRlciBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIChnaXZlbiBieSB0aGUKLSAgICAgKiBjbWlzOm9iamVjdFR5cGVJZCBwcm9wZXJ0eSkgaW4gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlcyB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgbmV3bHkgY3JlYXRlZAotICAgICAqICAgICAgICAgICAgZm9sZGVyIG9iamVjdAotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBwYXJlbnQgZm9sZGVyCi0gICAgICogQHBhcmFtIHBvbGljaWVzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBwb2xpY3kgSURzIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0gICAgICogICAgICAgICAgICB0byB0aGUgbmV3bHkgY3JlYXRlZCBmb2xkZXIgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFkZEFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIGFkZGVkIHRvIHRoZQotICAgICAqICAgICAgICAgICAgbmV3bHkgY3JlYXRlZCBmb2xkZXIgb2JqZWN0LCBlaXRoZXIgdXNpbmcgdGhlIEFDTCBmcm9tCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaWYgc3BlY2lmaWVkLCBvciBiZWluZyBhcHBsaWVkIGlmIG5vCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaXMgc3BlY2lmaWVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIHJlbW92ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgZm9sZGVyIG9iamVjdCwgZWl0aGVyIHVzaW5nIHRoZSBBQ0wgZnJvbQotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlmIHNwZWNpZmllZCwgb3IgYmVpbmcgaWdub3JlZCBpZiBubwotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIFN0cmluZyBjcmVhdGVGb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZWxhdGlvbnNoaXAgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSAoZ2l2ZW4gYnkgdGhlCi0gICAgICogY21pczpvYmplY3RUeXBlSWQgcHJvcGVydHkpLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWVzIHRoYXQgbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBuZXdseSBjcmVhdGVkCi0gICAgICogICAgICAgICAgICByZWxhdGlvbnNoaXAgb2JqZWN0Ci0gICAgICogQHBhcmFtIHBvbGljaWVzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBwb2xpY3kgSURzIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0gICAgICogICAgICAgICAgICB0byB0aGUgbmV3bHkgY3JlYXRlZCByZWxhdGlvbnNoaXAgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFkZEFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIGFkZGVkIHRvIHRoZQotICAgICAqICAgICAgICAgICAgbmV3bHkgY3JlYXRlZCByZWxhdGlvbnNoaXAgb2JqZWN0LCBlaXRoZXIgdXNpbmcgdGhlIEFDTCBmcm9tCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaWYgc3BlY2lmaWVkLCBvciBiZWluZyBhcHBsaWVkIGlmIG5vCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaXMgc3BlY2lmaWVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIHJlbW92ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgcmVsYXRpb25zaGlwIG9iamVjdCwgZWl0aGVyIHVzaW5nIHRoZSBBQ0wKLSAgICAgKiAgICAgICAgICAgIGZyb20gPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlmIHNwZWNpZmllZCwgb3IgYmVpbmcgaWdub3JlZCBpZgotICAgICAqICAgICAgICAgICAgbm8gPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIFN0cmluZyBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcG9saWN5IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgKGdpdmVuIGJ5IHRoZQotICAgICAqIGNtaXM6b2JqZWN0VHlwZUlkIHByb3BlcnR5KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlcyB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgbmV3bHkgY3JlYXRlZAotICAgICAqICAgICAgICAgICAgcG9saWN5IG9iamVjdAotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiBzcGVjaWZpZWQsIHRoZSBpZGVudGlmaWVyIGZvciB0aGUKLSAgICAgKiAgICAgICAgICAgIGZvbGRlciB0aGF0IG11c3QgYmUgdGhlIHBhcmVudCBmb2xkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkCi0gICAgICogICAgICAgICAgICBwb2xpY3kgb2JqZWN0Ci0gICAgICogQHBhcmFtIHBvbGljaWVzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBwb2xpY3kgSURzIHRoYXQgbXVzdCBiZSBhcHBsaWVkCi0gICAgICogICAgICAgICAgICB0byB0aGUgbmV3bHkgY3JlYXRlZCBwb2xpY3kgb2JqZWN0Ci0gICAgICogQHBhcmFtIGFkZEFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIGFkZGVkIHRvIHRoZQotICAgICAqICAgICAgICAgICAgbmV3bHkgY3JlYXRlZCBwb2xpY3kgb2JqZWN0LCBlaXRoZXIgdXNpbmcgdGhlIEFDTCBmcm9tCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaWYgc3BlY2lmaWVkLCBvciBiZWluZyBhcHBsaWVkIGlmIG5vCi0gICAgICogICAgICAgICAgICA8Y29kZT5mb2xkZXJJZDwvY29kZT4gaXMgc3BlY2lmaWVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIHJlbW92ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgcG9saWN5IG9iamVjdCwgZWl0aGVyIHVzaW5nIHRoZSBBQ0wgZnJvbQotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlmIHNwZWNpZmllZCwgb3IgYmVpbmcgaWdub3JlZCBpZiBubwotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIFN0cmluZyBjcmVhdGVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaXRlbSBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIChnaXZlbiBieSB0aGUKLSAgICAgKiBjbWlzOm9iamVjdFR5cGVJZCBwcm9wZXJ0eSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHByb3BlcnRpZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQKLSAgICAgKiAgICAgICAgICAgIHBvbGljeSBvYmplY3QKLSAgICAgKiBAcGFyYW0gZm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaWYgc3BlY2lmaWVkLCB0aGUgaWRlbnRpZmllciBmb3IgdGhlCi0gICAgICogICAgICAgICAgICBmb2xkZXIgdGhhdCBtdXN0IGJlIHRoZSBwYXJlbnQgZm9sZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZAotICAgICAqICAgICAgICAgICAgcG9saWN5IG9iamVjdAotICAgICAqIEBwYXJhbSBwb2xpY2llcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGxpc3Qgb2YgcG9saWN5IElEcyB0aGF0IG11c3QgYmUgYXBwbGllZAotICAgICAqICAgICAgICAgICAgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcG9saWN5IG9iamVjdAotICAgICAqIEBwYXJhbSBhZGRBY2VzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBBQ0VzIHRoYXQgbXVzdCBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIG5ld2x5IGNyZWF0ZWQgcG9saWN5IG9iamVjdCwgZWl0aGVyIHVzaW5nIHRoZSBBQ0wgZnJvbQotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlmIHNwZWNpZmllZCwgb3IgYmVpbmcgYXBwbGllZCBpZiBubwotICAgICAqICAgICAgICAgICAgPGNvZGU+Zm9sZGVySWQ8L2NvZGU+IGlzIHNwZWNpZmllZAotICAgICAqIEBwYXJhbSByZW1vdmVBY2VzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBBQ0VzIHRoYXQgbXVzdCBiZSByZW1vdmVkIGZyb20KLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXdseSBjcmVhdGVkIHBvbGljeSBvYmplY3QsIGVpdGhlciB1c2luZyB0aGUgQUNMIGZyb20KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZvbGRlcklkPC9jb2RlPiBpZiBzcGVjaWZpZWQsIG9yIGJlaW5nIGlnbm9yZWQgaWYgbm8KLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZvbGRlcklkPC9jb2RlPiBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgY3JlYXRlSXRlbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywKLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGxvd2FibGUgYWN0aW9ucyBmb3IgYW4gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc3BlY2lmaWVkIGluZm9ybWF0aW9uIGZvciB0aGUgb2JqZWN0IHNwZWNpZmllZCBieSBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1ZXJ5IG5hbWVzIHRoYXQKLSAgICAgKiAgICAgICAgICAgIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBtdXN0IGJlIHJldHVybmVkIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqIEBwYXJhbSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgbXVzdCByZXR1cm4gdGhlIGFsbG93YWJsZSBhY3Rpb25zIGZvciB0aGUgb2JqZWN0IChkZWZhdWx0IGlzCi0gICAgICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4pCi0gICAgICogQHBhcmFtIGluY2x1ZGVSZWxhdGlvbnNoaXBzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGluZGljYXRlcyB3aGF0IHJlbGF0aW9uc2hpcHMgaW4gd2hpY2ggdGhlCi0gICAgICogICAgICAgICAgICBvYmplY3QgcGFydGljaXBhdGVzIG11c3QgYmUgcmV0dXJuZWQgKGRlZmF1bHQgaXMKLSAgICAgKiAgICAgICAgICAgIHtAbGluayBJbmNsdWRlUmVsYXRpb25zaGlwcyNOT05FfSkKLSAgICAgKiBAcGFyYW0gcmVuZGl0aW9uRmlsdGVyCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGluZGljYXRlcyB3aGF0IHNldCBvZiByZW5kaXRpb25zIHRoZQotICAgICAqICAgICAgICAgICAgcmVwb3NpdG9yeSBtdXN0IHJldHVybiB3aG9zZSBraW5kIG1hdGNoZXMgdGhpcyBmaWx0ZXIgKGRlZmF1bHQKLSAgICAgKiAgICAgICAgICAgIGlzIDxjb2RlPiJjbWlzOm5vbmUiPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVBvbGljeUlkcwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgbXVzdCByZXR1cm4gdGhlIHBvbGljeSBpZHMgZm9yIHRoZSBvYmplY3QgKGRlZmF1bHQgaXMKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFjbAotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgbXVzdCByZXR1cm4gdGhlIEFDTCBmb3IgdGhlIG9iamVjdCAoZGVmYXVsdCBpcwotICAgICAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqLwotICAgIE9iamVjdERhdGEgZ2V0T2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgZm9yIGFuIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHF1ZXJ5IG5hbWVzIHRoYXQKLSAgICAgKiAgICAgICAgICAgIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBtdXN0IGJlIHJldHVybmVkIGJ5IHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqLwotICAgIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFzc29jaWF0ZWQgcmVuZGl0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuIE9ubHkKLSAgICAgKiByZW5kaXRpb24gYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQsIG5vdCByZW5kaXRpb24gc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gcmVuZGl0aW9uRmlsdGVyCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGluZGljYXRlcyB3aGF0IHNldCBvZiByZW5kaXRpb25zIHRoZQotICAgICAqICAgICAgICAgICAgcmVwb3NpdG9yeSBtdXN0IHJldHVybiB3aG9zZSBraW5kIG1hdGNoZXMgdGhpcyBmaWx0ZXIgKGRlZmF1bHQKLSAgICAgKiAgICAgICAgICAgIGlzIDxjb2RlPiJjbWlzOm5vbmUiPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gbWF4SXRlbXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybiBpbiBhCi0gICAgICogICAgICAgICAgICByZXNwb25zZSAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqIEBwYXJhbSBza2lwQ291bnQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gbnVtYmVyIG9mIHBvdGVudGlhbCByZXN1bHRzIHRoYXQgdGhlCi0gICAgICogICAgICAgICAgICByZXBvc2l0b3J5IG11c3Qgc2tpcC9wYWdlIG92ZXIgYmVmb3JlIHJldHVybmluZyBhbnkgcmVzdWx0cwotICAgICAqICAgICAgICAgICAgKGRlZmF1bHQgaXMgMCkKLSAgICAgKi8KLSAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IGdldFJlbmRpdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzcGVjaWZpZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBvYmplY3Qgc3BlY2lmaWVkIGJ5IHBhdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gZmlsdGVyCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcXVlcnkgbmFtZXMgdGhhdAotICAgICAqICAgICAgICAgICAgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIG11c3QgYmUgcmV0dXJuZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAgICAgICAgICAgIChkZWZhdWx0IGlzIHJlcG9zaXRvcnkgc3BlY2lmaWMpCi0gICAgICogQHBhcmFtIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICBtdXN0IHJldHVybiB0aGUgYWxsb3dhYmxlIGFjdGlvbnMgZm9yIHRoZSBvYmplY3QgKGRlZmF1bHQgaXMKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaW5kaWNhdGVzIHdoYXQgcmVsYXRpb25zaGlwcyBpbiB3aGljaCB0aGUKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCBwYXJ0aWNpcGF0ZXMgbXVzdCBiZSByZXR1cm5lZCAoZGVmYXVsdCBpcwotICAgICAqICAgICAgICAgICAge0BsaW5rIEluY2x1ZGVSZWxhdGlvbnNoaXBzI05PTkV9KQotICAgICAqIEBwYXJhbSByZW5kaXRpb25GaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gaW5kaWNhdGVzIHdoYXQgc2V0IG9mIHJlbmRpdGlvbnMgdGhlCi0gICAgICogICAgICAgICAgICByZXBvc2l0b3J5IG11c3QgcmV0dXJuIHdob3NlIGtpbmQgbWF0Y2hlcyB0aGlzIGZpbHRlciAoZGVmYXVsdAotICAgICAqICAgICAgICAgICAgaXMgPGNvZGU+ImNtaXM6bm9uZSI8L2NvZGU+KQotICAgICAqIEBwYXJhbSBpbmNsdWRlUG9saWN5SWRzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICBtdXN0IHJldHVybiB0aGUgcG9saWN5IGlkcyBmb3IgdGhlIG9iamVjdCAoZGVmYXVsdCBpcwotICAgICAqICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqIEBwYXJhbSBpbmNsdWRlQWNsCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICBtdXN0IHJldHVybiB0aGUgQUNMIGZvciB0aGUgb2JqZWN0IChkZWZhdWx0IGlzCi0gICAgICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4pCi0gICAgICovCi0gICAgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGVudCBzdHJlYW0gZm9yIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgb2JqZWN0LCBvciBnZXRzIGEKLSAgICAgKiByZW5kaXRpb24gc3RyZWFtIGZvciBhIHNwZWNpZmllZCByZW5kaXRpb24gb2YgYSBkb2N1bWVudCBvciBmb2xkZXIKLSAgICAgKiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIG9iamVjdAotICAgICAqLwotICAgIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwgQmlnSW50ZWdlciBvZmZzZXQsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIGxlbmd0aCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgcHJvcGVydGllcyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0LiBUaGUgcmVwb3NpdG9yeSBtaWdodCByZXR1cm4gYQotICAgICAqICAgICAgICAgICAgZGlmZmVyZW50L25ldyBvYmplY3QgaWQKLSAgICAgKiBAcGFyYW0gY2hhbmdlVG9rZW4KLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIGxhc3QgY2hhbmdlIHRva2VuIG9mIHRoaXMgb2JqZWN0IHRoYXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBjbGllbnQgcmVjZWl2ZWQuIFRoZSByZXBvc2l0b3J5IG1pZ2h0IHJldHVybiBhIG5ldyBjaGFuZ2UKLSAgICAgKiAgICAgICAgICAgIHRva2VuIChkZWZhdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICB0aGUgdXBkYXRlZCBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIG9iamVjdAotICAgICAqLwotICAgIHZvaWQgdXBkYXRlUHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHByb3BlcnRpZXMgYW5kIHNlY29uZGFyeSB0eXBlcyBvZiBvbmUgb3IgbW9yZSBvYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZHNBbmRDaGFuZ2VUb2tlbnMKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZHMgYW5kIGNoYW5nZSB0b2tlbnMgb2YgdGhlIG9iamVjdHMgdG8gdXBkYXRlCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0aWVzIHRvIHNldAotICAgICAqIEBwYXJhbSBhZGRTZWNvbmRhcnlUeXBlSWRzCi0gICAgICogICAgICAgICAgICB0aGUgc2Vjb25kYXJ5IHR5cGVzIHRvIGFwcGx5Ci0gICAgICogQHBhcmFtIHJlbW92ZVNlY29uZGFyeVR5cGVJZHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzZWNvbmRhcnkgdHlwZXMgdG8gcmVtb3ZlCi0gICAgICovCi0gICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkc0FuZENoYW5nZVRva2VucywgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFkZFNlY29uZGFyeVR5cGVJZHMsIExpc3Q8U3RyaW5nPiByZW1vdmVTZWNvbmRhcnlUeXBlSWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIHNwZWNpZmllZCBmaWxlLWFibGUgb2JqZWN0IGZyb20gb25lIGZvbGRlciB0byBhbm90aGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3QuIFRoZSByZXBvc2l0b3J5IG1pZ2h0IHJldHVybiBhCi0gICAgICogICAgICAgICAgICBkaWZmZXJlbnQvbmV3IG9iamVjdCBpZAotICAgICAqIEBwYXJhbSB0YXJnZXRGb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSB0YXJnZXQgZm9sZGVyCi0gICAgICogQHBhcmFtIHNvdXJjZUZvbGRlcklkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHNvdXJjZSBmb2xkZXIKLSAgICAgKi8KLSAgICB2b2lkIG1vdmVPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIFN0cmluZyB0YXJnZXRGb2xkZXJJZCwgU3RyaW5nIHNvdXJjZUZvbGRlcklkLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSBhbGxWZXJzaW9ucwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBJZiA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGRlbGV0ZSBhbGwKLSAgICAgKiAgICAgICAgICAgIHZlcnNpb25zIG9mIHRoZSBkb2N1bWVudCwgb3RoZXJ3aXNlIGRlbGV0ZSBvbmx5IHRoZSBkb2N1bWVudAotICAgICAqICAgICAgICAgICAgb2JqZWN0IHNwZWNpZmllZCAoZGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPikKLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZm9sZGVyIG9iamVjdCBhbmQgYWxsIG9mIGl0cyBjaGlsZC0gYW5kCi0gICAgICogZGVzY2VuZGFudC1vYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBmb2xkZXIKLSAgICAgKiBAcGFyYW0gYWxsVmVyc2lvbnMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbiBkZWxldGUgYWxsCi0gICAgICogICAgICAgICAgICB2ZXJzaW9ucyBvZiB0aGUgZG9jdW1lbnQsIG90aGVyd2lzZSBkZWxldGUgb25seSB0aGUgZG9jdW1lbnQKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCBzcGVjaWZpZWQgKGRlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4pCi0gICAgICogQHBhcmFtIHVuZmlsZU9iamVjdHMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gZGVmaW5lcyBob3cgdGhlIHJlcG9zaXRvcnkgbXVzdCBwcm9jZXNzCi0gICAgICogICAgICAgICAgICBmaWxlLWFibGUgY2hpbGQtIG9yIGRlc2NlbmRhbnQtb2JqZWN0cyAoZGVmYXVsdCBpcwotICAgICAqICAgICAgICAgICAge0BsaW5rIFVuZmlsZU9iamVjdCNERUxFVEV9KQotICAgICAqIEBwYXJhbSBjb250aW51ZU9uRmFpbHVyZQotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgc2hvdWxkIGNvbnRpbnVlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBldmVuIGlmCi0gICAgICogICAgICAgICAgICBkZWxldGlvbiBvZiBhIGNoaWxkLSBvciBkZXNjZW5kYW50LW9iamVjdCBpbiB0aGUgc3BlY2lmaWVkCi0gICAgICogICAgICAgICAgICBmb2xkZXIgY2Fubm90IGJlIGRlbGV0ZWQgKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KQotICAgICAqLwotICAgIEZhaWxlZFRvRGVsZXRlRGF0YSBkZWxldGVUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIFVuZmlsZU9iamVjdCB1bmZpbGVPYmplY3RzLCBCb29sZWFuIGNvbnRpbnVlT25GYWlsdXJlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY29udGVudCBzdHJlYW0gZm9yIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgb2JqZWN0LgotICAgICAqIAotICAgICAqIFRoZSBzdHJlYW0gaW4gPGNvZGU+Y29udGVudFN0cmVhbTwvY29kZT4gaXMgY29uc3VtZWQgYnV0IG5vdCBjbG9zZWQgYnkKLSAgICAgKiB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0LiBUaGUgcmVwb3NpdG9yeSBtaWdodCByZXR1cm4gYQotICAgICAqICAgICAgICAgICAgZGlmZmVyZW50L25ldyBvYmplY3QgaWQKLSAgICAgKiBAcGFyYW0gb3ZlcndyaXRlRmxhZwotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgbXVzdCByZXBsYWNlIHRoZSBleGlzdGluZyBjb250ZW50IHN0cmVhbSBmb3IgdGhlIG9iamVjdCAoaWYKLSAgICAgKiAgICAgICAgICAgIGFueSkgd2l0aCB0aGUgaW5wdXQgY29udGVudCBzdHJlYW0uIElmIElmIDxjb2RlPmZhbHNlPC9jb2RlPiwKLSAgICAgKiAgICAgICAgICAgIHRoZW4gdGhlIHJlcG9zaXRvcnkgbXVzdCBvbmx5IHNldCB0aGUgaW5wdXQgY29udGVudCBzdHJlYW0gZm9yCi0gICAgICogICAgICAgICAgICB0aGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgY3VycmVudGx5IGRvZXMgbm90IGhhdmUgYSBjb250ZW50Ci0gICAgICogICAgICAgICAgICBzdHJlYW0gKGRlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4pCi0gICAgICogQHBhcmFtIGNoYW5nZVRva2VuCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IHRoZSBsYXN0IGNoYW5nZSB0b2tlbiBvZiB0aGlzIG9iamVjdCB0aGF0Ci0gICAgICogICAgICAgICAgICB0aGUgY2xpZW50IHJlY2VpdmVkLiBUaGUgcmVwb3NpdG9yeSBtaWdodCByZXR1cm4gYSBuZXcgY2hhbmdlCi0gICAgICogICAgICAgICAgICB0b2tlbiAoZGVmYXVsdCBpcyA8Y29kZT5udWxsPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gY29udGVudFN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgc3RyZWFtCi0gICAgICovCi0gICAgdm9pZCBzZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyB0aGUgY29udGVudCBzdHJlYW0gZm9yIHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3QuIFRoZSByZXBvc2l0b3J5IG1pZ2h0IHJldHVybiBhCi0gICAgICogICAgICAgICAgICBkaWZmZXJlbnQvbmV3IG9iamVjdCBpZAotICAgICAqIEBwYXJhbSBjaGFuZ2VUb2tlbgotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiB0aGUgbGFzdCBjaGFuZ2UgdG9rZW4gb2YgdGhpcyBvYmplY3QgdGhhdAotICAgICAqICAgICAgICAgICAgdGhlIGNsaWVudCByZWNlaXZlZC4gVGhlIHJlcG9zaXRvcnkgbWlnaHQgcmV0dXJuIGEgbmV3IGNoYW5nZQotICAgICAqICAgICAgICAgICAgdG9rZW4gKGRlZmF1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICovCi0gICAgdm9pZCBkZWxldGVDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIHRoZSBjb250ZW50IHN0cmVhbSB0byB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIG9iamVjdC4gVGhlIHJlcG9zaXRvcnkgbWlnaHQgcmV0dXJuIGEKLSAgICAgKiAgICAgICAgICAgIGRpZmZlcmVudC9uZXcgb2JqZWN0IGlkCi0gICAgICogQHBhcmFtIGNoYW5nZVRva2VuCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IHRoZSBsYXN0IGNoYW5nZSB0b2tlbiBvZiB0aGlzIG9iamVjdCB0aGF0Ci0gICAgICogICAgICAgICAgICB0aGUgY2xpZW50IHJlY2VpdmVkLiBUaGUgcmVwb3NpdG9yeSBtaWdodCByZXR1cm4gYSBuZXcgY2hhbmdlCi0gICAgICogICAgICAgICAgICB0b2tlbiAoZGVmYXVsdCBpcyA8Y29kZT5udWxsPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gY29udGVudFN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgc3RyZWFtIHRvIGFwcGVuZAotICAgICAqIEBwYXJhbSBpc0xhc3RDaHVuawotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRoaXMgY29udGVudCBzdHJlYW0gaXMgdGhlIGxhc3QgY2h1bmsKLSAgICAgKi8KLSAgICB2b2lkIGFwcGVuZENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIGlzTGFzdENodW5rLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvUG9saWN5U2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvUG9saWN5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE1OTE4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL1BvbGljeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotCi0vKioKLSAqIFBvbGljeSBTZXJ2aWNlIGludGVyZmFjZS4KLSAqIAotICogPHA+Ci0gKiA8ZW0+Ci0gKiBTZWUgdGhlIENNSVMgMS4wIGFuZCBDTUlTIDEuMSBzcGVjaWZpY2F0aW9ucyBmb3IgZGV0YWlscyBvbiB0aGUgb3BlcmF0aW9ucywgcGFyYW1ldGVycywKLSAqIGV4Y2VwdGlvbnMgYW5kIHRoZSBkb21haW4gbW9kZWwuCi0gKiA8L2VtPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvbGljeVNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQXBwbGllcyBhIHNwZWNpZmllZCBwb2xpY3kgdG8gYW4gb2JqZWN0LgotICAgICAqLwotICAgIHZvaWQgYXBwbHlQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgc3BlY2lmaWVkIHBvbGljeSBmcm9tIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgcG9saWNpZXMgY3VycmVudGx5IGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCi0gICAgICovCi0gICAgTGlzdDxPYmplY3REYXRhPiBnZXRBcHBsaWVkUG9saWNpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvUmVsYXRpb25zaGlwU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvUmVsYXRpb25zaGlwU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI4YmM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL1JlbGF0aW9uc2hpcFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotCi0vKioKLSAqIFJlbGF0aW9uc2hpcCBTZXJ2aWNlIGludGVyZmFjZS4KLSAqIAotICogPHA+Ci0gKiA8ZW0+Ci0gKiBTZWUgdGhlIENNSVMgMS4wIGFuZCBDTUlTIDEuMSBzcGVjaWZpY2F0aW9ucyBmb3IgZGV0YWlscyBvbiB0aGUgb3BlcmF0aW9ucywgcGFyYW1ldGVycywKLSAqIGV4Y2VwdGlvbnMgYW5kIHRoZSBkb21haW4gbW9kZWwuCi0gKiA8L2VtPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgb3IgYSBzdWJzZXQgb2YgcmVsYXRpb25zaGlwcyBhc3NvY2lhdGVkIHdpdGggYW4gaW5kZXBlbmRlbnQKLSAgICAgKiBvYmplY3QuCi0gICAgICovCi0gICAgT2JqZWN0TGlzdCBnZXRPYmplY3RSZWxhdGlvbnNoaXBzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsCi0gICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9SZXBvc2l0b3J5U2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9zcGkvUmVwb3NpdG9yeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2YjUzMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9SZXBvc2l0b3J5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkxpc3Q7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBTZXJ2aWNlIGludGVyZmFjZS4KLSAqIAotICogPHA+Ci0gKiA8ZW0+Ci0gKiBTZWUgdGhlIENNSVMgMS4wIGFuZCBDTUlTIDEuMSBzcGVjaWZpY2F0aW9ucyBmb3IgZGV0YWlscyBvbiB0aGUgb3BlcmF0aW9ucywgcGFyYW1ldGVycywKLSAqIGV4Y2VwdGlvbnMgYW5kIHRoZSBkb21haW4gbW9kZWwuCi0gKiA8L2VtPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9zaXRvcnlTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIENNSVMgcmVwb3NpdG9yeSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgZnJvbSB0aGlzIENNSVMKLSAgICAgKiBzZXJ2aWNlIGVuZHBvaW50LgotICAgICAqIAotICAgICAqIEluIGNvbnRyYXN0IHRvIHRoZSBDTUlTIHNwZWNpZmljYXRpb24gdGhpcyBtZXRob2QgcmV0dXJucyByZXBvc2l0b3J5Ci0gICAgICogaW5mb3Mgbm90IG9ubHkgcmVwb3NpdG9yeSBpZHMuCi0gICAgICovCi0gICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBDTUlTIHJlcG9zaXRvcnksIHRoZSBvcHRpb25hbCBjYXBhYmlsaXRpZXMKLSAgICAgKiBpdCBzdXBwb3J0cyBhbmQgaXRzIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uIGlmIGFwcGxpY2FibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICovCi0gICAgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygb2JqZWN0IHR5cGVzIGRlZmluZWQgZm9yIHRoZSByZXBvc2l0b3J5IHRoYXQgYXJlCi0gICAgICogY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIHR5cGVJZCBvZiBhbiBvYmplY3QgdHlwZSBzcGVjaWZpZWQgaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IChpZiBub3Qgc3BlY2lmaWVkIHRoZSByZXBvc2l0b3J5IE1VU1QgcmV0dXJuCi0gICAgICogICAgICAgICAgICBhbGwgYmFzZSBvYmplY3QgdHlwZXMpCi0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSByZXBvc2l0b3J5IE1VU1QKLSAgICAgKiAgICAgICAgICAgIHJldHVybiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgZm9yIGVhY2ggb2JqZWN0IHR5cGUgcmV0dXJuZWQKLSAgICAgKiAgICAgICAgICAgIChkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gbWF4SXRlbXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHVybiBpbiBhCi0gICAgICogICAgICAgICAgICByZXNwb25zZSAoZGVmYXVsdCBpcyByZXBvc2l0b3J5IHNwZWNpZmljKQotICAgICAqIEBwYXJhbSBza2lwQ291bnQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gbnVtYmVyIG9mIHBvdGVudGlhbCByZXN1bHRzIHRoYXQgdGhlCi0gICAgICogICAgICAgICAgICByZXBvc2l0b3J5IE1VU1Qgc2tpcC9wYWdlIG92ZXIgYmVmb3JlIHJldHVybmluZyBhbnkgcmVzdWx0cwotICAgICAqICAgICAgICAgICAgKGRlZmF1bHQgaXMgMCkKLSAgICAgKi8KLSAgICBUeXBlRGVmaW5pdGlvbkxpc3QgZ2V0VHlwZUNoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNldCBvZiBkZXNjZW5kYW50IG9iamVjdCB0eXBlIGRlZmluZWQgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogdW5kZXIgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIHR5cGVJZCBvZiBhbiBvYmplY3QgdHlwZSBzcGVjaWZpZWQgaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IChpZiBub3Qgc3BlY2lmaWVkIHRoZSByZXBvc2l0b3J5IE1VU1QgcmV0dXJuCi0gICAgICogICAgICAgICAgICBhbGwgdHlwZXMgYW5kIE1VU1QgaWdub3JlIHRoZSB2YWx1ZSBvZiB0aGUgZGVwdGggcGFyYW1ldGVyKQotICAgICAqIEBwYXJhbSBkZXB0aAotICAgICAqICAgICAgICAgICAgPGVtPihvcHRpb25hbCk8L2VtPiB0aGUgbnVtYmVyIG9mIGxldmVscyBvZiBkZXB0aCBpbiB0aGUgdHlwZQotICAgICAqICAgICAgICAgICAgaGllcmFyY2h5IGZyb20gd2hpY2ggdG8gcmV0dXJuIHJlc3VsdHMgKGRlZmF1bHQgaXMgcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgc3BlY2lmaWMpCi0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSByZXBvc2l0b3J5IE1VU1QKLSAgICAgKiAgICAgICAgICAgIHJldHVybiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgZm9yIGVhY2ggb2JqZWN0IHR5cGUgcmV0dXJuZWQKLSAgICAgKiAgICAgICAgICAgIChkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPikKLSAgICAgKi8KLSAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHR5cGVJZAotICAgICAqICAgICAgICAgICAgdHlwZUlkIG9mIGFuIG9iamVjdCB0eXBlIHNwZWNpZmllZCBpbiB0aGUgcmVwb3NpdG9yeQotICAgICAqLwotICAgIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIGRlZmluaXRpb24KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHR5cGUKLSAgICAgKi8KLSAgICBUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIGEgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgZGVmaW5pdGlvbgotICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgdHlwZQotICAgICAqLwotICAgIFR5cGVEZWZpbml0aW9uIHVwZGF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSB0eXBlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIHR5cGVJZCBvZiBhbiBvYmplY3QgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIHJlcG9zaXRvcnkKLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL1ZlcnNpb25pbmdTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9WZXJzaW9uaW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBlYTRjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL1ZlcnNpb25pbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotCi0vKioKLSAqIFZlcnNpb25pbmcgU2VydmljZSBpbnRlcmZhY2UuCi0gKiAKLSAqIDxwPgotICogPGVtPgotICogU2VlIHRoZSBDTUlTIDEuMCBhbmQgQ01JUyAxLjEgc3BlY2lmaWNhdGlvbnMgZm9yIGRldGFpbHMgb24gdGhlIG9wZXJhdGlvbnMsIHBhcmFtZXRlcnMsCi0gKiBleGNlcHRpb25zIGFuZCB0aGUgZG9tYWluIG1vZGVsLgotICogPC9lbT4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBWZXJzaW9uaW5nU2VydmljZSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJpdmF0ZSB3b3JraW5nIGNvcHkgb2YgdGhlIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgaW5wdXQ6IHRoZSBpZGVudGlmaWVyIGZvciB0aGUgZG9jdW1lbnQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZAotICAgICAqICAgICAgICAgICAgb3V0LCBvdXRwdXQ6IHRoZSBpZGVudGlmaWVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBQV0MKLSAgICAgKiBAcGFyYW0gY29udGVudENvcGllZAotICAgICAqICAgICAgICAgICAgb3V0cHV0OiBpbmRpY2F0b3IgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIG9yaWdpbmFsIGRvY3VtZW50IGhhcwotICAgICAqICAgICAgICAgICAgYmVlbiBjb3BpZWQgdG8gdGhlIFBXQwotICAgICAqLwotICAgIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQpOwotCi0gICAgLyoqCi0gICAgICogUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiBhIGNoZWNrLW91dC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgUFdDCi0gICAgICovCi0gICAgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MtaW4gdGhlIHByaXZhdGUgd29ya2luZyBjb3B5IChQV0MpIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIFRoZSBzdHJlYW0gaW4gPGNvZGU+Y29udGVudFN0cmVhbTwvY29kZT4gaXMgY29uc3VtZWQgYnV0IG5vdCBjbG9zZWQgYnkKLSAgICAgKiB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIGlucHV0OiB0aGUgaWRlbnRpZmllciBmb3IgdGhlIFBXQywgb3V0cHV0OiB0aGUgaWRlbnRpZmllciBmb3IKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXdseSBjcmVhdGVkIHZlcnNpb24gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gbWFqb3IKLSAgICAgKiAgICAgICAgICAgIGluZGljYXRvciBpZiB0aGUgbmV3IHZlcnNpb24gc2hvdWxkIGJlY29tZSBhIG1ham9yICgKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+KSBvciBtaW5vciAoPGNvZGU+ZmFsc2U8L2NvZGU+KSB2ZXJzaW9uCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIHByb3BlcnR5IHZhbHVlcyB0aGF0IG11c3QgYmUgYXBwbGllZAotICAgICAqICAgICAgICAgICAgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHBhcmFtIGNvbnRlbnRTdHJlYW0KLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gdGhlIGNvbnRlbnQgc3RyZWFtIHRoYXQgbXVzdCBiZSBzdG9yZWQgZm9yCi0gICAgICogICAgICAgICAgICB0aGUgbmV3bHkgY3JlYXRlZCBkb2N1bWVudCBvYmplY3QKLSAgICAgKiBAcGFyYW0gY2hlY2tpbkNvbW1lbnQKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSB2ZXJzaW9uIGNvbW1lbnQKLSAgICAgKiBAcGFyYW0gcG9saWNpZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIHBvbGljeSBJRHMgdGhhdCBtdXN0IGJlIGFwcGxpZWQKLSAgICAgKiAgICAgICAgICAgIHRvIHRoZSBuZXdseSBjcmVhdGVkIGRvY3VtZW50IG9iamVjdAotICAgICAqIEBwYXJhbSBhZGRBY2VzCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgbGlzdCBvZiBBQ0VzIHRoYXQgbXVzdCBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiAgICAgICAgICAgIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIDxlbT4ob3B0aW9uYWwpPC9lbT4gYSBsaXN0IG9mIEFDRXMgdGhhdCBtdXN0IGJlIHJlbW92ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQgb2JqZWN0Ci0gICAgICovCi0gICAgdm9pZCBjaGVja0luKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsYXRlc3QgZG9jdW1lbnQgb2JqZWN0IGluIHRoZSB2ZXJzaW9uIHNlcmllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKi8KLSAgICBPYmplY3REYXRhIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIEJvb2xlYW4gbWFqb3IsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3Vic2V0IG9mIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgbGF0ZXN0IGRvY3VtZW50IG9iamVjdCBpbiB0aGUKLSAgICAgKiB2ZXJzaW9uIHNlcmllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKi8KLSAgICBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIGRvY3VtZW50IG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCB2ZXJzaW9uIHNlcmllcywKLSAgICAgKiBzb3J0ZWQgYnkgdGhlIHByb3BlcnR5ICJjbWlzOmNyZWF0aW9uRGF0ZSIgZGVzY2VuZGluZy4KLSAgICAgKiAKLSAgICAgKiBFaXRoZXIgdGhlIDxjb2RlPm9iamVjdElkPC9jb2RlPiBvciB0aGUgPGNvZGU+dmVyc2lvblNlcmllc0lkPC9jb2RlPgotICAgICAqIHBhcmFtZXRlciBtdXN0IGJlIHNldC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgb2JqZWN0Ci0gICAgICogQHBhcmFtIHZlcnNpb25TZXJpZXNJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gZmlsdGVyCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcXVlcnkgbmFtZXMgdGhhdAotICAgICAqICAgICAgICAgICAgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIG11c3QgYmUgcmV0dXJuZWQgYnkgdGhlIHJlcG9zaXRvcnkKLSAgICAgKiAgICAgICAgICAgIChkZWZhdWx0IGlzIHJlcG9zaXRvcnkgc3BlY2lmaWMpCi0gICAgICogQHBhcmFtIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zCi0gICAgICogICAgICAgICAgICA8ZW0+KG9wdGlvbmFsKTwvZW0+IGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSByZXBvc2l0b3J5Ci0gICAgICogICAgICAgICAgICBtdXN0IHJldHVybiB0aGUgYWxsb3dhYmxlIGFjdGlvbnMgZm9yIHRoZSBvYmplY3RzIChkZWZhdWx0IGlzCi0gICAgICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4pCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29tcGxldGUgdmVyc2lvbiBoaXN0b3J5IG9mIHRoZSB2ZXJzaW9uIHNlcmllcwotICAgICAqLwotICAgIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QWxsVmVyc2lvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL3BhY2thZ2UuaHRtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvc3BpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNmOThmMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL3NwaS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tIAotCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAtLT4KLTxodG1sPgotPGhlYWQ+Ci08L2hlYWQ+Ci08Ym9keT4KLU9wZW5DTUlTIGNsaWVudCBhbmQgc2VydmVyIGJpbmRpbmcgc2VydmljZXMuCi08cD5UaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIENNSVMgc2VydmljZSBpbnRlcmZhY2VzIGZvciBsb3ctbGV2ZWwKLWNsaWVudCBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9ucy48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTE4MThlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIAotICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+T3BlbkNNSVMgQ29tbW9ucyBJbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndvb2RzdG94LWNvcmUtYXNsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt3b29kc3RveC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+IDwhLS0gaW5jbHVkZWQgaW4gSmF2YSA2IGFuZCBhYm92ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLnN0cmVhbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQubWltZXB1bGw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5taW1lcHVsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWltZXB1bGwudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+IAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLndzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4d3MtcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pheHdzLXJ0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+IDwhLS0gaW5jbHVkZWQgaW4gSmF2YSA2IGFuZCBhYm92ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLnN0cmVhbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBpbmNsdWRlZCBpbiBKYXZhIDYgYW5kIGFib3ZlIC0tPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4JIAotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53c3R4LWFzbDwvYXJ0aWZhY3RJZD4JIAotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4JIAotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4JIAotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQ8L2dyb3VwSWQ+CSAKLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWltZXB1bGw8L2FydGlmYWN0SWQ+CSAKLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4JIAotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuODwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hZGQtc291cmNlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGQtc291cmNlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPi4vdGFyZ2V0L2dlbmVyYXRlZDwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qdm5ldC5qYXgtd3MtY29tbW9uczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXh3cy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPndzaW1wb3J0PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3c2RsRGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTE8L3dzZGxEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzZGxGaWxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzZGxGaWxlPkNNSVNXUy1TZXJ2aWNlLndzZGw8L3dzZGxGaWxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3NkbEZpbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4YjwvcGFja2FnZU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc3RkaXIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlRGVzdERpcj4ke3Byb2plY3QuYmFzZWRpcn0vdGFyZ2V0L2dlbmVyYXRlZDwvc291cmNlRGVzdERpcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uPnRydWU8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjIuMTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+ICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEZpbGU+JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vTUVUQS1JTkYvTUFOSUZFU1QuTUY8L21hbmlmZXN0RmlsZT4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPiAKLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4gIAotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtmZWxpeC5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idW5kbGUtbWFuaWZlc3Q8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1hbmlmZXN0PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4gICAKLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuKjt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufQotICAgICAgICAgICAgICAgICAgICAgICAgPC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC53cy4qO3ZlcnNpb249IlsyLjEuNywzLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgICAgPC9JbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtRG9jVVJMPiR7cHJvamVjdC51cmx9PC9CdW5kbGUtRG9jVVJMPgotICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvQmFzZTY0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0Jhc2U2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDA0MjdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvQmFzZTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGw7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogRW5jb2RlcyBhbmQgZGVjb2RlcyB0byBhbmQgZnJvbSBCYXNlNjQgbm90YXRpb24uCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEhvbWVwYWdlOiA8YSBocmVmPSJodHRwOi8vaWhhcmRlci5uZXQvYmFzZTY0Ij5odHRwOi8vaWhhcmRlci5uZXQvYmFzZTY0PC9hPi4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBSb2JlcnQgSGFyZGVyCi0gKiBAYXV0aG9yIHJvYkBpaGFyZGVyLm5ldAotICogQHZlcnNpb24gMi4zLjcKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJhc2U2NCB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCYXNlNjQuY2xhc3MpOwotCi0gICAgLyogKioqKioqKiogUCBVIEIgTCBJIEMgRiBJIEUgTCBEIFMgKioqKioqKiogKi8KLQotICAgIC8qKiBObyBvcHRpb25zIHNwZWNpZmllZC4gVmFsdWUgaXMgemVyby4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19PUFRJT05TID0gMDsKLQotICAgIC8qKiBTcGVjaWZ5IGVuY29kaW5nIGluIGZpcnN0IGJpdC4gVmFsdWUgaXMgb25lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ERSA9IDE7Ci0KLSAgICAvKiogU3BlY2lmeSBkZWNvZGluZyBpbiBmaXJzdCBiaXQuIFZhbHVlIGlzIHplcm8uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDT0RFID0gMDsKLQotICAgIC8qKiBTcGVjaWZ5IHRoYXQgZGF0YSBzaG91bGQgYmUgZ3ppcC1jb21wcmVzc2VkIGluIHNlY29uZCBiaXQuIFZhbHVlIGlzIHR3by4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHWklQID0gMjsKLQotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhhdCBnemlwcGVkIGRhdGEgc2hvdWxkIDxlbT5ub3Q8L2VtPiBiZSBhdXRvbWF0aWNhbGx5IGd1bnppcHBlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET05UX0dVTlpJUCA9IDQ7Ci0KLSAgICAvKiogRG8gYnJlYWsgbGluZXMgd2hlbiBlbmNvZGluZy4gVmFsdWUgaXMgOC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET19CUkVBS19MSU5FUyA9IDg7Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGUgdXNpbmcgQmFzZTY0LWxpa2UgZW5jb2RpbmcgdGhhdCBpcyBVUkwtIGFuZCBGaWxlbmFtZS1zYWZlIGFzCi0gICAgICogZGVzY3JpYmVkIGluIFNlY3Rpb24gNCBvZiBSRkMzNTQ4OiA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMzNTQ4Lmh0bWwiCi0gICAgICogPmh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMzNTQ4Lmh0bWw8L2E+LiBJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0Ci0gICAgICogZGF0YSBlbmNvZGVkIHRoaXMgd2F5IGlzIDxlbT5ub3Q8L2VtPiBvZmZpY2lhbGx5IHZhbGlkIEJhc2U2NCwgb3IgYXQgdGhlCi0gICAgICogdmVyeSBsZWFzdCBzaG91bGQgbm90IGJlIGNhbGxlZCBCYXNlNjQgd2l0aG91dCBhbHNvIHNwZWNpZnlpbmcgdGhhdCBpcwotICAgICAqIHdhcyBlbmNvZGVkIHVzaW5nIHRoZSBVUkwtIGFuZCBGaWxlbmFtZS1zYWZlIGRpYWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJMX1NBRkUgPSAxNjsKLQotICAgIC8qKgotICAgICAqIEVuY29kZSB1c2luZyB0aGUgc3BlY2lhbCAib3JkZXJlZCIgZGlhbGVjdCBvZiBCYXNlNjQgZGVzY3JpYmVkIGhlcmU6IDxhCi0gICAgICogaHJlZj0iaHR0cDovL3d3dy5mYXFzLm9yZy9xYS9yZmNjLTE5NDAuaHRtbCI+aHR0cDovL3d3dy5mYXFzLm9yZy9xYS9yZmNjLQotICAgICAqIDE5NDAuaHRtbDwvYT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1JERVJFRCA9IDMyOwotCi0gICAgLyogKioqKioqKiogUCBSIEkgViBBIFQgRSBGIEkgRSBMIEQgUyAqKioqKioqKiAqLwotCi0gICAgLyoqIE1heGltdW0gbGluZSBsZW5ndGggKDc2KSBvZiBCYXNlNjQgb3V0cHV0LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTElORV9MRU5HVEggPSA3NjsKLQotICAgIC8qKiBUaGUgZXF1YWxzIHNpZ24gKD0pIGFzIGEgYnl0ZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEVRVUFMU19TSUdOID0gKGJ5dGUpICc9JzsKLQotICAgIC8qKiBUaGUgbmV3IGxpbmUgY2hhcmFjdGVyIChcbikgYXMgYSBieXRlLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTkVXX0xJTkUgPSAoYnl0ZSkgJ1xuJzsKLQotICAgIC8qKiBQcmVmZXJyZWQgZW5jb2RpbmcuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUlJFRF9FTkNPRElORyA9ICJVUy1BU0NJSSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFdISVRFX1NQQUNFX0VOQyA9IC01OyAvLyBJbmRpY2F0ZXMgd2hpdGUgc3BhY2UgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmNvZGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRVFVQUxTX1NJR05fRU5DID0gLTE7IC8vIEluZGljYXRlcyBlcXVhbHMgc2lnbiBpbgotICAgIC8vIGVuY29kaW5nCi0KLSAgICAvKiAqKioqKioqKiBTIFQgQSBOIEQgQSBSIEQgQiBBIFMgRSA2IDQgQSBMIFAgSCBBIEIgRSBUICoqKioqKioqICovCi0KLSAgICAvKiogVGhlIDY0IHZhbGlkIEJhc2U2NCB2YWx1ZXMuICovCi0gICAgLyoKLSAgICAgKiBIb3N0IHBsYXRmb3JtIG1lIGJlIHNvbWV0aGluZyBmdW5ueSBsaWtlIEVCQ0RJQywgc28gd2UgaGFyZGNvZGUgdGhlc2UKLSAgICAgKiB2YWx1ZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIF9TVEFOREFSRF9BTFBIQUJFVCA9IHsgKGJ5dGUpICdBJywgKGJ5dGUpICdCJywgKGJ5dGUpICdDJywgKGJ5dGUpICdEJywgKGJ5dGUpICdFJywKLSAgICAgICAgICAgIChieXRlKSAnRicsIChieXRlKSAnRycsIChieXRlKSAnSCcsIChieXRlKSAnSScsIChieXRlKSAnSicsIChieXRlKSAnSycsIChieXRlKSAnTCcsIChieXRlKSAnTScsIChieXRlKSAnTicsCi0gICAgICAgICAgICAoYnl0ZSkgJ08nLCAoYnl0ZSkgJ1AnLCAoYnl0ZSkgJ1EnLCAoYnl0ZSkgJ1InLCAoYnl0ZSkgJ1MnLCAoYnl0ZSkgJ1QnLCAoYnl0ZSkgJ1UnLCAoYnl0ZSkgJ1YnLCAoYnl0ZSkgJ1cnLAotICAgICAgICAgICAgKGJ5dGUpICdYJywgKGJ5dGUpICdZJywgKGJ5dGUpICdaJywgKGJ5dGUpICdhJywgKGJ5dGUpICdiJywgKGJ5dGUpICdjJywgKGJ5dGUpICdkJywgKGJ5dGUpICdlJywgKGJ5dGUpICdmJywKLSAgICAgICAgICAgIChieXRlKSAnZycsIChieXRlKSAnaCcsIChieXRlKSAnaScsIChieXRlKSAnaicsIChieXRlKSAnaycsIChieXRlKSAnbCcsIChieXRlKSAnbScsIChieXRlKSAnbicsIChieXRlKSAnbycsCi0gICAgICAgICAgICAoYnl0ZSkgJ3AnLCAoYnl0ZSkgJ3EnLCAoYnl0ZSkgJ3InLCAoYnl0ZSkgJ3MnLCAoYnl0ZSkgJ3QnLCAoYnl0ZSkgJ3UnLCAoYnl0ZSkgJ3YnLCAoYnl0ZSkgJ3cnLCAoYnl0ZSkgJ3gnLAotICAgICAgICAgICAgKGJ5dGUpICd5JywgKGJ5dGUpICd6JywgKGJ5dGUpICcwJywgKGJ5dGUpICcxJywgKGJ5dGUpICcyJywgKGJ5dGUpICczJywgKGJ5dGUpICc0JywgKGJ5dGUpICc1JywgKGJ5dGUpICc2JywKLSAgICAgICAgICAgIChieXRlKSAnNycsIChieXRlKSAnOCcsIChieXRlKSAnOScsIChieXRlKSAnKycsIChieXRlKSAnLycgfTsKLQotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgYSBCYXNlNjQgdmFsdWUgdG8gZWl0aGVyIGl0cyA2LWJpdCByZWNvbnN0cnVjdGlvbiB2YWx1ZSBvciBhCi0gICAgICogbmVnYXRpdmUgbnVtYmVyIGluZGljYXRpbmcgc29tZSBvdGhlciBtZWFuaW5nLgotICAgICAqKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gX1NUQU5EQVJEX0RFQ09EQUJFVCA9IHsgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOAotICAgICAgICAgICAgLTUsIC01LCAvLyBXaGl0ZXNwYWNlOiBUYWIgYW5kIExpbmVmZWVkCi0gICAgICAgICAgICAtOSwgLTksIC8vIERlY2ltYWwgMTEgLSAxMgotICAgICAgICAgICAgLTUsIC8vIFdoaXRlc3BhY2U6IENhcnJpYWdlIFJldHVybgotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMTQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI2Ci0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMjcgLSAzMQotICAgICAgICAgICAgLTUsIC8vIFdoaXRlc3BhY2U6IFNwYWNlCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAzMyAtIDQyCi0gICAgICAgICAgICA2MiwgLy8gUGx1cyBzaWduIGF0IGRlY2ltYWwgNDMKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC8vIERlY2ltYWwgNDQgLSA0NgotICAgICAgICAgICAgNjMsIC8vIFNsYXNoIGF0IGRlY2ltYWwgNDcKLSAgICAgICAgICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAvLyBOdW1iZXJzIHplcm8gdGhyb3VnaCBuaW5lCi0gICAgICAgICAgICAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDU4IC0gNjAKLSAgICAgICAgICAgIC0xLCAvLyBFcXVhbHMgc2lnbiBhdCBkZWNpbWFsIDYxCi0gICAgICAgICAgICAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDYyIC0gNjQKLSAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAvLyBMZXR0ZXJzICdBJyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ04nCi0gICAgICAgICAgICAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAvLyBMZXR0ZXJzICdPJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCAnWicKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgOTEgLSA5NgotICAgICAgICAgICAgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIC8vIExldHRlcnMgJ2EnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCAnbScKLSAgICAgICAgICAgIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCAvLyBMZXR0ZXJzICduJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggJ3onCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTkgLy8gRGVjaW1hbCAxMjMgLSAxMjcKLSAgICAgICAgICAgICwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAxMjggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMzkKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDE0MCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTUyCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAxNTMgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE2NQotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMTY2IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNzgKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDE3OSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTkxCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAxOTIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwNAotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMjA1IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyMTcKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDIxOCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjMwCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAyMzEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI0MwotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSAvLyBEZWNpbWFsIDI0NCAtIDI1NQotICAgIH07Ci0KLSAgICAvKiAqKioqKioqKiBVIFIgTCBTIEEgRiBFIEIgQSBTIEUgNiA0IEEgTCBQIEggQSBCIEUgVCAqKioqKioqKiAqLwotCi0gICAgLyoqCi0gICAgICogVXNlZCBpbiB0aGUgVVJMLSBhbmQgRmlsZW5hbWUtc2FmZSBkaWFsZWN0IGRlc2NyaWJlZCBpbiBTZWN0aW9uIDQgb2YKLSAgICAgKiBSRkMzNTQ4OiA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMzNTQ4Lmh0bWwiPmh0dHA6Ly93d3cuZmFxcy5vcmcKLSAgICAgKiAvcmZjcy9yZmMzNTQ4Lmh0bWw8L2E+LiBOb3RpY2UgdGhhdCB0aGUgbGFzdCB0d28gYnl0ZXMgYmVjb21lICJoeXBoZW4iCi0gICAgICogYW5kICJ1bmRlcnNjb3JlIiBpbnN0ZWFkIG9mICJwbHVzIiBhbmQgInNsYXNoLiIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gX1VSTF9TQUZFX0FMUEhBQkVUID0geyAoYnl0ZSkgJ0EnLCAoYnl0ZSkgJ0InLCAoYnl0ZSkgJ0MnLCAoYnl0ZSkgJ0QnLCAoYnl0ZSkgJ0UnLAotICAgICAgICAgICAgKGJ5dGUpICdGJywgKGJ5dGUpICdHJywgKGJ5dGUpICdIJywgKGJ5dGUpICdJJywgKGJ5dGUpICdKJywgKGJ5dGUpICdLJywgKGJ5dGUpICdMJywgKGJ5dGUpICdNJywgKGJ5dGUpICdOJywKLSAgICAgICAgICAgIChieXRlKSAnTycsIChieXRlKSAnUCcsIChieXRlKSAnUScsIChieXRlKSAnUicsIChieXRlKSAnUycsIChieXRlKSAnVCcsIChieXRlKSAnVScsIChieXRlKSAnVicsIChieXRlKSAnVycsCi0gICAgICAgICAgICAoYnl0ZSkgJ1gnLCAoYnl0ZSkgJ1knLCAoYnl0ZSkgJ1onLCAoYnl0ZSkgJ2EnLCAoYnl0ZSkgJ2InLCAoYnl0ZSkgJ2MnLCAoYnl0ZSkgJ2QnLCAoYnl0ZSkgJ2UnLCAoYnl0ZSkgJ2YnLAotICAgICAgICAgICAgKGJ5dGUpICdnJywgKGJ5dGUpICdoJywgKGJ5dGUpICdpJywgKGJ5dGUpICdqJywgKGJ5dGUpICdrJywgKGJ5dGUpICdsJywgKGJ5dGUpICdtJywgKGJ5dGUpICduJywgKGJ5dGUpICdvJywKLSAgICAgICAgICAgIChieXRlKSAncCcsIChieXRlKSAncScsIChieXRlKSAncicsIChieXRlKSAncycsIChieXRlKSAndCcsIChieXRlKSAndScsIChieXRlKSAndicsIChieXRlKSAndycsIChieXRlKSAneCcsCi0gICAgICAgICAgICAoYnl0ZSkgJ3knLCAoYnl0ZSkgJ3onLCAoYnl0ZSkgJzAnLCAoYnl0ZSkgJzEnLCAoYnl0ZSkgJzInLCAoYnl0ZSkgJzMnLCAoYnl0ZSkgJzQnLCAoYnl0ZSkgJzUnLCAoYnl0ZSkgJzYnLAotICAgICAgICAgICAgKGJ5dGUpICc3JywgKGJ5dGUpICc4JywgKGJ5dGUpICc5JywgKGJ5dGUpICctJywgKGJ5dGUpICdfJyB9OwotCi0gICAgLyoqCi0gICAgICogVXNlZCBpbiBkZWNvZGluZyBVUkwtIGFuZCBGaWxlbmFtZS1zYWZlIGRpYWxlY3RzIG9mIEJhc2U2NC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gX1VSTF9TQUZFX0RFQ09EQUJFVCA9IHsgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOAotICAgICAgICAgICAgLTUsIC01LCAvLyBXaGl0ZXNwYWNlOiBUYWIgYW5kIExpbmVmZWVkCi0gICAgICAgICAgICAtOSwgLTksIC8vIERlY2ltYWwgMTEgLSAxMgotICAgICAgICAgICAgLTUsIC8vIFdoaXRlc3BhY2U6IENhcnJpYWdlIFJldHVybgotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMTQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI2Ci0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMjcgLSAzMQotICAgICAgICAgICAgLTUsIC8vIFdoaXRlc3BhY2U6IFNwYWNlCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAzMyAtIDQyCi0gICAgICAgICAgICAtOSwgLy8gUGx1cyBzaWduIGF0IGRlY2ltYWwgNDMKLSAgICAgICAgICAgIC05LCAvLyBEZWNpbWFsIDQ0Ci0gICAgICAgICAgICA2MiwgLy8gTWludXMgc2lnbiBhdCBkZWNpbWFsIDQ1Ci0gICAgICAgICAgICAtOSwgLy8gRGVjaW1hbCA0NgotICAgICAgICAgICAgLTksIC8vIFNsYXNoIGF0IGRlY2ltYWwgNDcKLSAgICAgICAgICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAvLyBOdW1iZXJzIHplcm8gdGhyb3VnaCBuaW5lCi0gICAgICAgICAgICAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDU4IC0gNjAKLSAgICAgICAgICAgIC0xLCAvLyBFcXVhbHMgc2lnbiBhdCBkZWNpbWFsIDYxCi0gICAgICAgICAgICAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDYyIC0gNjQKLSAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAvLyBMZXR0ZXJzICdBJyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ04nCi0gICAgICAgICAgICAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAvLyBMZXR0ZXJzICdPJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCAnWicKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDkxIC0gOTQKLSAgICAgICAgICAgIDYzLCAvLyBVbmRlcnNjb3JlIGF0IGRlY2ltYWwgOTUKLSAgICAgICAgICAgIC05LCAvLyBEZWNpbWFsIDk2Ci0gICAgICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgLy8gTGV0dGVycyAnYScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoICdtJwotICAgICAgICAgICAgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIC8vIExldHRlcnMgJ24nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCAneicKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSAvLyBEZWNpbWFsIDEyMyAtIDEyNwotICAgICAgICAgICAgLCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDEyOCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEzOQotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMTQwIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNTIKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDE1MyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTY1Ci0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAxNjYgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE3OAotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMTc5IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxOTEKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDE5MiAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjA0Ci0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAyMDUgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIxNwotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMjE4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyMzAKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDIzMSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjQzCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05IC8vIERlY2ltYWwgMjQ0IC0gMjU1Ci0gICAgfTsKLQotICAgIC8qICoqKioqKioqIE8gUiBEIEUgUiBFIEQgQiBBIFMgRSA2IDQgQSBMIFAgSCBBIEIgRSBUICoqKioqKioqICovCi0KLSAgICAvKioKLSAgICAgKiBJIGRvbid0IGdldCB0aGUgcG9pbnQgb2YgdGhpcyB0ZWNobmlxdWUsIGJ1dCBzb21lb25lIHJlcXVlc3RlZCBpdCwgYW5kIGl0Ci0gICAgICogaXMgZGVzY3JpYmVkIGhlcmU6IDxhCi0gICAgICogaHJlZj0iaHR0cDovL3d3dy5mYXFzLm9yZy9xYS9yZmNjLTE5NDAuaHRtbCI+aHR0cDovLwotICAgICAqIHd3dy5mYXFzLm9yZy9xYS9yZmNjLTE5NDAuaHRtbDwvYT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIF9PUkRFUkVEX0FMUEhBQkVUID0geyAoYnl0ZSkgJy0nLCAoYnl0ZSkgJzAnLCAoYnl0ZSkgJzEnLCAoYnl0ZSkgJzInLCAoYnl0ZSkgJzMnLAotICAgICAgICAgICAgKGJ5dGUpICc0JywgKGJ5dGUpICc1JywgKGJ5dGUpICc2JywgKGJ5dGUpICc3JywgKGJ5dGUpICc4JywgKGJ5dGUpICc5JywgKGJ5dGUpICdBJywgKGJ5dGUpICdCJywgKGJ5dGUpICdDJywKLSAgICAgICAgICAgIChieXRlKSAnRCcsIChieXRlKSAnRScsIChieXRlKSAnRicsIChieXRlKSAnRycsIChieXRlKSAnSCcsIChieXRlKSAnSScsIChieXRlKSAnSicsIChieXRlKSAnSycsIChieXRlKSAnTCcsCi0gICAgICAgICAgICAoYnl0ZSkgJ00nLCAoYnl0ZSkgJ04nLCAoYnl0ZSkgJ08nLCAoYnl0ZSkgJ1AnLCAoYnl0ZSkgJ1EnLCAoYnl0ZSkgJ1InLCAoYnl0ZSkgJ1MnLCAoYnl0ZSkgJ1QnLCAoYnl0ZSkgJ1UnLAotICAgICAgICAgICAgKGJ5dGUpICdWJywgKGJ5dGUpICdXJywgKGJ5dGUpICdYJywgKGJ5dGUpICdZJywgKGJ5dGUpICdaJywgKGJ5dGUpICdfJywgKGJ5dGUpICdhJywgKGJ5dGUpICdiJywgKGJ5dGUpICdjJywKLSAgICAgICAgICAgIChieXRlKSAnZCcsIChieXRlKSAnZScsIChieXRlKSAnZicsIChieXRlKSAnZycsIChieXRlKSAnaCcsIChieXRlKSAnaScsIChieXRlKSAnaicsIChieXRlKSAnaycsIChieXRlKSAnbCcsCi0gICAgICAgICAgICAoYnl0ZSkgJ20nLCAoYnl0ZSkgJ24nLCAoYnl0ZSkgJ28nLCAoYnl0ZSkgJ3AnLCAoYnl0ZSkgJ3EnLCAoYnl0ZSkgJ3InLCAoYnl0ZSkgJ3MnLCAoYnl0ZSkgJ3QnLCAoYnl0ZSkgJ3UnLAotICAgICAgICAgICAgKGJ5dGUpICd2JywgKGJ5dGUpICd3JywgKGJ5dGUpICd4JywgKGJ5dGUpICd5JywgKGJ5dGUpICd6JyB9OwotCi0gICAgLyoqCi0gICAgICogVXNlZCBpbiBkZWNvZGluZyB0aGUgIm9yZGVyZWQiIGRpYWxlY3Qgb2YgQmFzZTY0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBfT1JERVJFRF9ERUNPREFCRVQgPSB7IC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDgKLSAgICAgICAgICAgIC01LCAtNSwgLy8gV2hpdGVzcGFjZTogVGFiIGFuZCBMaW5lZmVlZAotICAgICAgICAgICAgLTksIC05LCAvLyBEZWNpbWFsIDExIC0gMTIKLSAgICAgICAgICAgIC01LCAvLyBXaGl0ZXNwYWNlOiBDYXJyaWFnZSBSZXR1cm4KLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDE0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyNgotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDI3IC0gMzEKLSAgICAgICAgICAgIC01LCAvLyBXaGl0ZXNwYWNlOiBTcGFjZQotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMzMgLSA0MgotICAgICAgICAgICAgLTksIC8vIFBsdXMgc2lnbiBhdCBkZWNpbWFsIDQzCi0gICAgICAgICAgICAtOSwgLy8gRGVjaW1hbCA0NAotICAgICAgICAgICAgMCwgLy8gTWludXMgc2lnbiBhdCBkZWNpbWFsIDQ1Ci0gICAgICAgICAgICAtOSwgLy8gRGVjaW1hbCA0NgotICAgICAgICAgICAgLTksIC8vIFNsYXNoIGF0IGRlY2ltYWwgNDcKLSAgICAgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAvLyBOdW1iZXJzIHplcm8gdGhyb3VnaCBuaW5lCi0gICAgICAgICAgICAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDU4IC0gNjAKLSAgICAgICAgICAgIC0xLCAvLyBFcXVhbHMgc2lnbiBhdCBkZWNpbWFsIDYxCi0gICAgICAgICAgICAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDYyIC0gNjQKLSAgICAgICAgICAgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAvLyBMZXR0ZXJzICdBJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggJ00nCi0gICAgICAgICAgICAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgLy8gTGV0dGVycyAnTicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoICdaJwotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgOTEgLSA5NAotICAgICAgICAgICAgMzcsIC8vIFVuZGVyc2NvcmUgYXQgZGVjaW1hbCA5NQotICAgICAgICAgICAgLTksIC8vIERlY2ltYWwgOTYKLSAgICAgICAgICAgIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCAvLyBMZXR0ZXJzICdhJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggJ20nCi0gICAgICAgICAgICA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgLy8gTGV0dGVycyAnbicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdWdoICd6JwotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05IC8vIERlY2ltYWwgMTIzIC0gMTI3Ci0gICAgICAgICAgICAsIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDEyOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSAxMzkKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDE0MCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTUyCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAxNTMgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE2NQotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMTY2IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxNzgKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDE3OSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTkxCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAxOTIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwNAotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC8vIERlY2ltYWwgMjA1IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyMTcKLSAgICAgICAgICAgIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAvLyBEZWNpbWFsIDIxOCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjMwCi0gICAgICAgICAgICAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLy8gRGVjaW1hbCAyMzEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI0MwotICAgICAgICAgICAgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSwgLTksIC05LCAtOSAvLyBEZWNpbWFsIDI0NCAtIDI1NQotICAgIH07Ci0KLSAgICAvKiAqKioqKioqKiBEIEUgVCBFIFIgTSBJIE4gRSBXIEggSSBDIEggQSBMIEggQSBCIEUgVCAqKioqKioqKiAqLwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBvbmUgb2YgdGhlIF9TT01FVEhJTkdfQUxQSEFCRVQgYnl0ZSBhcnJheXMgZGVwZW5kaW5nIG9uIHRoZQotICAgICAqIG9wdGlvbnMgc3BlY2lmaWVkLiBJdCdzIHBvc3NpYmxlLCB0aG91Z2ggc2lsbHksIHRvIHNwZWNpZnkgT1JERVJFRAotICAgICAqIDxiPmFuZDwvYj4gVVJMU0FGRSBpbiB3aGljaCBjYXNlIG9uZSBvZiB0aGVtIHdpbGwgYmUgcGlja2VkLCB0aG91Z2ggdGhlcmUKLSAgICAgKiBpcyBubyBndWFyYW50ZWUgYXMgdG8gd2hpY2ggb25lIHdpbGwgYmUgcGlja2VkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXRBbHBoYWJldChpbnQgb3B0aW9ucykgewotICAgICAgICBpZiAoKG9wdGlvbnMgJiBVUkxfU0FGRSkgPT0gVVJMX1NBRkUpIHsKLSAgICAgICAgICAgIHJldHVybiBfVVJMX1NBRkVfQUxQSEFCRVQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG9wdGlvbnMgJiBPUkRFUkVEKSA9PSBPUkRFUkVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gX09SREVSRURfQUxQSEFCRVQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gX1NUQU5EQVJEX0FMUEhBQkVUOwotICAgICAgICB9Ci0gICAgfSAvLyBlbmQgZ2V0QWxwaGFiZXQKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgb25lIG9mIHRoZSBfU09NRVRISU5HX0RFQ09EQUJFVCBieXRlIGFycmF5cyBkZXBlbmRpbmcgb24gdGhlCi0gICAgICogb3B0aW9ucyBzcGVjaWZpZWQuIEl0J3MgcG9zc2libGUsIHRob3VnaCBzaWxseSwgdG8gc3BlY2lmeSBPUkRFUkVEIGFuZAotICAgICAqIFVSTF9TQUZFIGluIHdoaWNoIGNhc2Ugb25lIG9mIHRoZW0gd2lsbCBiZSBwaWNrZWQsIHRob3VnaCB0aGVyZSBpcyBubwotICAgICAqIGd1YXJhbnRlZSBhcyB0byB3aGljaCBvbmUgd2lsbCBiZSBwaWNrZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldERlY29kYWJldChpbnQgb3B0aW9ucykgewotICAgICAgICBpZiAoKG9wdGlvbnMgJiBVUkxfU0FGRSkgPT0gVVJMX1NBRkUpIHsKLSAgICAgICAgICAgIHJldHVybiBfVVJMX1NBRkVfREVDT0RBQkVUOwotICAgICAgICB9IGVsc2UgaWYgKChvcHRpb25zICYgT1JERVJFRCkgPT0gT1JERVJFRCkgewotICAgICAgICAgICAgcmV0dXJuIF9PUkRFUkVEX0RFQ09EQUJFVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBfU1RBTkRBUkRfREVDT0RBQkVUOwotICAgICAgICB9Ci0gICAgfSAvLyBlbmQgZ2V0QWxwaGFiZXQKLQotICAgIC8qKiBEZWZlYXRzIGluc3RhbnRpYXRpb24uICovCi0gICAgcHJpdmF0ZSBCYXNlNjQoKSB7Ci0gICAgfQotCi0gICAgLyogKioqKioqKiogRSBOIEMgTyBEIEkgTiBHIE0gRSBUIEggTyBEIFMgKioqKioqKiogKi8KLQotICAgIC8qKgotICAgICAqIEVuY29kZXMgdXAgdG8gdGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIGFycmF5IDx2YXI+dGhyZWVCeXRlczwvdmFyPiBhbmQKLSAgICAgKiByZXR1cm5zIGEgZm91ci1ieXRlIGFycmF5IGluIEJhc2U2NCBub3RhdGlvbi4gVGhlIGFjdHVhbCBudW1iZXIgb2YKLSAgICAgKiBzaWduaWZpY2FudCBieXRlcyBpbiB5b3VyIGFycmF5IGlzIGdpdmVuIGJ5IDx2YXI+bnVtU2lnQnl0ZXM8L3Zhcj4uIFRoZQotICAgICAqIGFycmF5IDx2YXI+dGhyZWVCeXRlczwvdmFyPiBuZWVkcyBvbmx5IGJlIGFzIGJpZyBhcwotICAgICAqIDx2YXI+bnVtU2lnQnl0ZXM8L3Zhcj4uIENvZGUgY2FuIHJldXNlIGEgYnl0ZSBhcnJheSBieSBwYXNzaW5nIGEKLSAgICAgKiBmb3VyLWJ5dGUgYXJyYXkgYXMgPHZhcj5iNDwvdmFyPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYjQKLSAgICAgKiAgICAgICAgICAgIEEgcmV1c2FibGUgYnl0ZSBhcnJheSB0byByZWR1Y2UgYXJyYXkgaW5zdGFudGlhdGlvbgotICAgICAqIEBwYXJhbSB0aHJlZUJ5dGVzCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdG8gY29udmVydAotICAgICAqIEBwYXJhbSBudW1TaWdCeXRlcwotICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB5b3VyIGFycmF5Ci0gICAgICogQHJldHVybiBmb3VyIGJ5dGUgYXJyYXkgaW4gQmFzZTY0IG5vdGF0aW9uLgotICAgICAqIEBzaW5jZSAxLjUuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBlbmNvZGUzdG80KGJ5dGVbXSBiNCwgYnl0ZVtdIHRocmVlQnl0ZXMsIGludCBudW1TaWdCeXRlcywgaW50IG9wdGlvbnMpIHsKLSAgICAgICAgZW5jb2RlM3RvNCh0aHJlZUJ5dGVzLCAwLCBudW1TaWdCeXRlcywgYjQsIDAsIG9wdGlvbnMpOwotICAgICAgICByZXR1cm4gYjQ7Ci0gICAgfSAvLyBlbmQgZW5jb2RlM3RvNAotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogRW5jb2RlcyB1cCB0byB0aHJlZSBieXRlcyBvZiB0aGUgYXJyYXkgPHZhcj5zb3VyY2U8L3Zhcj4gYW5kIHdyaXRlcyB0aGUKLSAgICAgKiByZXN1bHRpbmcgZm91ciBCYXNlNjQgYnl0ZXMgdG8gPHZhcj5kZXN0aW5hdGlvbjwvdmFyPi4gVGhlIHNvdXJjZSBhbmQKLSAgICAgKiBkZXN0aW5hdGlvbiBhcnJheXMgY2FuIGJlIG1hbmlwdWxhdGVkIGFueXdoZXJlIGFsb25nIHRoZWlyIGxlbmd0aCBieQotICAgICAqIHNwZWNpZnlpbmcgPHZhcj5zcmNPZmZzZXQ8L3Zhcj4gYW5kIDx2YXI+ZGVzdE9mZnNldDwvdmFyPi4gVGhpcyBtZXRob2QKLSAgICAgKiBkb2VzIG5vdCBjaGVjayB0byBtYWtlIHN1cmUgeW91ciBhcnJheXMgYXJlIGxhcmdlIGVub3VnaCB0byBhY2NvbW9kYXRlCi0gICAgICogPHZhcj5zcmNPZmZzZXQ8L3Zhcj4gKyAzIGZvciB0aGUgPHZhcj5zb3VyY2U8L3Zhcj4gYXJyYXkgb3IKLSAgICAgKiA8dmFyPmRlc3RPZmZzZXQ8L3Zhcj4gKyA0IGZvciB0aGUgPHZhcj5kZXN0aW5hdGlvbjwvdmFyPiBhcnJheS4gVGhlCi0gICAgICogYWN0dWFsIG51bWJlciBvZiBzaWduaWZpY2FudCBieXRlcyBpbiB5b3VyIGFycmF5IGlzIGdpdmVuIGJ5Ci0gICAgICogPHZhcj5udW1TaWdCeXRlczwvdmFyPi4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIG9mIHRoZSBlbmNvZGluZyBtZXRob2RzIHdpdGggYWxsIHBvc3NpYmxlCi0gICAgICogcGFyYW1ldGVycy4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZQotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRvIGNvbnZlcnQKLSAgICAgKiBAcGFyYW0gc3JjT2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2hlcmUgY29udmVyc2lvbiBiZWdpbnMKLSAgICAgKiBAcGFyYW0gbnVtU2lnQnl0ZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYnl0ZXMgaW4geW91ciBhcnJheQotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHRvIGhvbGQgdGhlIGNvbnZlcnNpb24KLSAgICAgKiBAcGFyYW0gZGVzdE9mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdoZXJlIG91dHB1dCB3aWxsIGJlIHB1dAotICAgICAqIEByZXR1cm4gdGhlIDx2YXI+ZGVzdGluYXRpb248L3Zhcj4gYXJyYXkKLSAgICAgKiBAc2luY2UgMS4zCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGVuY29kZTN0bzQoYnl0ZVtdIHNvdXJjZSwgaW50IHNyY09mZnNldCwgaW50IG51bVNpZ0J5dGVzLCBieXRlW10gZGVzdGluYXRpb24sIGludCBkZXN0T2Zmc2V0LAotICAgICAgICAgICAgaW50IG9wdGlvbnMpIHsKLQotICAgICAgICBieXRlW10gQUxQSEFCRVQgPSBnZXRBbHBoYWJldChvcHRpb25zKTsKLQotICAgICAgICAvLyAxIDIgMwotICAgICAgICAvLyAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMSBCaXQgcG9zaXRpb24KLSAgICAgICAgLy8gLS0tLS0tLS0wMDAwMDAwMDExMTExMTExMjIyMjIyMjIgQXJyYXkgcG9zaXRpb24gZnJvbSB0aHJlZUJ5dGVzCi0gICAgICAgIC8vIC0tLS0tLS0tfCB8fCB8fCB8fCB8IFNpeCBiaXQgZ3JvdXBzIHRvIGluZGV4IEFMUEhBQkVUCi0gICAgICAgIC8vID4+MTggPj4xMiA+PiA2ID4+IDAgUmlnaHQgc2hpZnQgbmVjZXNzYXJ5Ci0gICAgICAgIC8vIDB4M2YgMHgzZiAweDNmIEFkZGl0aW9uYWwgQU5ECi0KLSAgICAgICAgLy8gQ3JlYXRlIGJ1ZmZlciB3aXRoIHplcm8tcGFkZGluZyBpZiB0aGVyZSBhcmUgb25seSBvbmUgb3IgdHdvCi0gICAgICAgIC8vIHNpZ25pZmljYW50IGJ5dGVzIHBhc3NlZCBpbiB0aGUgYXJyYXkuCi0gICAgICAgIC8vIFdlIGhhdmUgdG8gc2hpZnQgbGVmdCAyNCBpbiBvcmRlciB0byBmbHVzaCBvdXQgdGhlIDEncyB0aGF0IGFwcGVhcgotICAgICAgICAvLyB3aGVuIEphdmEgdHJlYXRzIGEgdmFsdWUgYXMgbmVnYXRpdmUgdGhhdCBpcyBjYXN0IGZyb20gYSBieXRlIHRvIGFuCi0gICAgICAgIC8vIGludC4KLSAgICAgICAgaW50IGluQnVmZiA9IChudW1TaWdCeXRlcyA+IDAgPyAoKHNvdXJjZVtzcmNPZmZzZXRdIDw8IDI0KSA+Pj4gOCkgOiAwKQotICAgICAgICAgICAgICAgIHwgKG51bVNpZ0J5dGVzID4gMSA/ICgoc291cmNlW3NyY09mZnNldCArIDFdIDw8IDI0KSA+Pj4gMTYpIDogMCkKLSAgICAgICAgICAgICAgICB8IChudW1TaWdCeXRlcyA+IDIgPyAoKHNvdXJjZVtzcmNPZmZzZXQgKyAyXSA8PCAyNCkgPj4+IDI0KSA6IDApOwotCi0gICAgICAgIHN3aXRjaCAobnVtU2lnQnl0ZXMpIHsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgZGVzdGluYXRpb25bZGVzdE9mZnNldF0gPSBBTFBIQUJFVFsoaW5CdWZmID4+PiAxOCldOwotICAgICAgICAgICAgZGVzdGluYXRpb25bZGVzdE9mZnNldCArIDFdID0gQUxQSEFCRVRbKGluQnVmZiA+Pj4gMTIpICYgMHgzZl07Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbltkZXN0T2Zmc2V0ICsgMl0gPSBBTFBIQUJFVFsoaW5CdWZmID4+PiA2KSAmIDB4M2ZdOwotICAgICAgICAgICAgZGVzdGluYXRpb25bZGVzdE9mZnNldCArIDNdID0gQUxQSEFCRVRbKGluQnVmZikgJiAweDNmXTsKLSAgICAgICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjsKLQotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbltkZXN0T2Zmc2V0XSA9IEFMUEhBQkVUWyhpbkJ1ZmYgPj4+IDE4KV07Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbltkZXN0T2Zmc2V0ICsgMV0gPSBBTFBIQUJFVFsoaW5CdWZmID4+PiAxMikgJiAweDNmXTsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2Rlc3RPZmZzZXQgKyAyXSA9IEFMUEhBQkVUWyhpbkJ1ZmYgPj4+IDYpICYgMHgzZl07Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbltkZXN0T2Zmc2V0ICsgM10gPSBFUVVBTFNfU0lHTjsKLSAgICAgICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjsKLQotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbltkZXN0T2Zmc2V0XSA9IEFMUEhBQkVUWyhpbkJ1ZmYgPj4+IDE4KV07Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbltkZXN0T2Zmc2V0ICsgMV0gPSBBTFBIQUJFVFsoaW5CdWZmID4+PiAxMikgJiAweDNmXTsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2Rlc3RPZmZzZXQgKyAyXSA9IEVRVUFMU19TSUdOOwotICAgICAgICAgICAgZGVzdGluYXRpb25bZGVzdE9mZnNldCArIDNdID0gRVFVQUxTX1NJR047Ci0gICAgICAgICAgICByZXR1cm4gZGVzdGluYXRpb247Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjsKLSAgICAgICAgfSAvLyBlbmQgc3dpdGNoCi0gICAgfSAvLyBlbmQgZW5jb2RlM3RvNAotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgQmFzZTY0IGVuY29kaW5nIG9uIHRoZSA8Y29kZT5yYXc8L2NvZGU+IEJ5dGVCdWZmZXIsIHdyaXRpbmcgaXQKLSAgICAgKiB0byB0aGUgPGNvZGU+ZW5jb2RlZDwvY29kZT4gQnl0ZUJ1ZmZlci4gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KLSAgICAgKiBDdXJyZW50bHkgaXQgZG9lcyBub3QgcGFzcyBhbG9uZyBhbnkgb3B0aW9ucyAoc3VjaCBhcwotICAgICAqIHtAbGluayAjRE9fQlJFQUtfTElORVN9IG9yIHtAbGluayAjR1pJUH0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHJhdwotICAgICAqICAgICAgICAgICAgaW5wdXQgYnVmZmVyCi0gICAgICogQHBhcmFtIGVuY29kZWQKLSAgICAgKiAgICAgICAgICAgIG91dHB1dCBidWZmZXIKLSAgICAgKiBAc2luY2UgMi4zCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuY29kZShqYXZhLm5pby5CeXRlQnVmZmVyIHJhdywgamF2YS5uaW8uQnl0ZUJ1ZmZlciBlbmNvZGVkKSB7Ci0gICAgICAgIGJ5dGVbXSByYXczID0gbmV3IGJ5dGVbM107Ci0gICAgICAgIGJ5dGVbXSBlbmM0ID0gbmV3IGJ5dGVbNF07Ci0KLSAgICAgICAgd2hpbGUgKHJhdy5oYXNSZW1haW5pbmcoKSkgewotICAgICAgICAgICAgaW50IHJlbSA9IE1hdGgubWluKDMsIHJhdy5yZW1haW5pbmcoKSk7Ci0gICAgICAgICAgICByYXcuZ2V0KHJhdzMsIDAsIHJlbSk7Ci0gICAgICAgICAgICBCYXNlNjQuZW5jb2RlM3RvNChlbmM0LCByYXczLCByZW0sIEJhc2U2NC5OT19PUFRJT05TKTsKLSAgICAgICAgICAgIGVuY29kZWQucHV0KGVuYzQpOwotICAgICAgICB9IC8vIGVuZCBpbnB1dCByZW1haW5pbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBCYXNlNjQgZW5jb2Rpbmcgb24gdGhlIDxjb2RlPnJhdzwvY29kZT4gQnl0ZUJ1ZmZlciwgd3JpdGluZyBpdAotICAgICAqIHRvIHRoZSA8Y29kZT5lbmNvZGVkPC9jb2RlPiBDaGFyQnVmZmVyLiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgotICAgICAqIEN1cnJlbnRseSBpdCBkb2VzIG5vdCBwYXNzIGFsb25nIGFueSBvcHRpb25zIChzdWNoIGFzCi0gICAgICoge0BsaW5rICNET19CUkVBS19MSU5FU30gb3Ige0BsaW5rICNHWklQfS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmF3Ci0gICAgICogICAgICAgICAgICBpbnB1dCBidWZmZXIKLSAgICAgKiBAcGFyYW0gZW5jb2RlZAotICAgICAqICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlcgotICAgICAqIEBzaW5jZSAyLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5jb2RlKGphdmEubmlvLkJ5dGVCdWZmZXIgcmF3LCBqYXZhLm5pby5DaGFyQnVmZmVyIGVuY29kZWQpIHsKLSAgICAgICAgYnl0ZVtdIHJhdzMgPSBuZXcgYnl0ZVszXTsKLSAgICAgICAgYnl0ZVtdIGVuYzQgPSBuZXcgYnl0ZVs0XTsKLQotICAgICAgICB3aGlsZSAocmF3Lmhhc1JlbWFpbmluZygpKSB7Ci0gICAgICAgICAgICBpbnQgcmVtID0gTWF0aC5taW4oMywgcmF3LnJlbWFpbmluZygpKTsKLSAgICAgICAgICAgIHJhdy5nZXQocmF3MywgMCwgcmVtKTsKLSAgICAgICAgICAgIEJhc2U2NC5lbmNvZGUzdG80KGVuYzQsIHJhdzMsIHJlbSwgQmFzZTY0Lk5PX09QVElPTlMpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBlbmNvZGVkLnB1dCgoY2hhcikgKGVuYzRbaV0gJiAweEZGKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLy8gZW5kIGlucHV0IHJlbWFpbmluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZXMgYW4gb2JqZWN0IGFuZCByZXR1cm5zIHRoZSBCYXNlNjQtZW5jb2RlZCB2ZXJzaW9uIG9mIHRoYXQKLSAgICAgKiBzZXJpYWxpemVkIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBBcyBvZiB2IDIuMywgaWYgdGhlIG9iamVjdCBjYW5ub3QgYmUgc2VyaWFsaXplZCBvciB0aGVyZSBpcyBhbm90aGVyCi0gICAgICogZXJyb3IsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBqYXZhLmlvLklPRXhjZXB0aW9uLiA8Yj5UaGlzIGlzIG5ldyB0bwotICAgICAqIHYyLjMhPC9iPiBJbiBlYXJsaWVyIHZlcnNpb25zLCBpdCBqdXN0IHJldHVybmVkIGEgbnVsbCB2YWx1ZSwgYnV0IGluCi0gICAgICogcmV0cm9zcGVjdCB0aGF0J3MgYSBwcmV0dHkgcG9vciB3YXkgdG8gaGFuZGxlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBUaGUgb2JqZWN0IGlzIG5vdCBHWmlwLWNvbXByZXNzZWQgYmVmb3JlIGJlaW5nIGVuY29kZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcmlhbGl6YWJsZU9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBlbmNvZGUKLSAgICAgKiBAcmV0dXJuIFRoZSBCYXNlNjQtZW5jb2RlZCBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzZXJpYWxpemVkT2JqZWN0IGlzIG51bGwKLSAgICAgKiBAc2luY2UgMS40Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlT2JqZWN0KGphdmEuaW8uU2VyaWFsaXphYmxlIHNlcmlhbGl6YWJsZU9iamVjdCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZW5jb2RlT2JqZWN0KHNlcmlhbGl6YWJsZU9iamVjdCwgTk9fT1BUSU9OUyk7Ci0gICAgfSAvLyBlbmQgZW5jb2RlT2JqZWN0Ci0KLSAgICAvKioKLSAgICAgKiBTZXJpYWxpemVzIGFuIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgQmFzZTY0LWVuY29kZWQgdmVyc2lvbiBvZiB0aGF0Ci0gICAgICogc2VyaWFsaXplZCBvYmplY3QuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQXMgb2YgdiAyLjMsIGlmIHRoZSBvYmplY3QgY2Fubm90IGJlIHNlcmlhbGl6ZWQgb3IgdGhlcmUgaXMgYW5vdGhlcgotICAgICAqIGVycm9yLCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4gamF2YS5pby5JT0V4Y2VwdGlvbi4gPGI+VGhpcyBpcyBuZXcgdG8KLSAgICAgKiB2Mi4zITwvYj4gSW4gZWFybGllciB2ZXJzaW9ucywgaXQganVzdCByZXR1cm5lZCBhIG51bGwgdmFsdWUsIGJ1dCBpbgotICAgICAqIHJldHJvc3BlY3QgdGhhdCdzIGEgcHJldHR5IHBvb3Igd2F5IHRvIGhhbmRsZSBpdC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogVGhlIG9iamVjdCBpcyBub3QgR1ppcC1jb21wcmVzc2VkIGJlZm9yZSBiZWluZyBlbmNvZGVkLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGUgb3B0aW9uczoKLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqICAgR1pJUDogZ3ppcC1jb21wcmVzc2VzIG9iamVjdCBiZWZvcmUgZW5jb2RpbmcgaXQuCi0gICAgICogICBET19CUkVBS19MSU5FUzogYnJlYWsgbGluZXMgYXQgNzYgY2hhcmFjdGVycwotICAgICAqIDwvcHJlPgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGU6IDxjb2RlPmVuY29kZU9iamVjdCggbXlPYmosIEJhc2U2NC5HWklQICk8L2NvZGU+IG9yCi0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZToKLSAgICAgKiA8Y29kZT5lbmNvZGVPYmplY3QoIG15T2JqLCBCYXNlNjQuR1pJUCB8IEJhc2U2NC5ET19CUkVBS19MSU5FUyApPC9jb2RlPgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZXJpYWxpemFibGVPYmplY3QKLSAgICAgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gZW5jb2RlCi0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKiAgICAgICAgICAgIFNwZWNpZmllZCBvcHRpb25zCi0gICAgICogQHJldHVybiBUaGUgQmFzZTY0LWVuY29kZWQgb2JqZWN0Ci0gICAgICogQHNlZSBCYXNlNjQjR1pJUAotICAgICAqIEBzZWUgQmFzZTY0I0RPX0JSRUFLX0xJTkVTCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlT2JqZWN0KGphdmEuaW8uU2VyaWFsaXphYmxlIHNlcmlhbGl6YWJsZU9iamVjdCwgaW50IG9wdGlvbnMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoc2VyaWFsaXphYmxlT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IHNlcmlhbGl6ZSBhIG51bGwgb2JqZWN0LiIpOwotICAgICAgICB9IC8vIGVuZCBpZjogbnVsbAotCi0gICAgICAgIC8vIFN0cmVhbXMKLSAgICAgICAgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG51bGw7Ci0gICAgICAgIGphdmEuaW8uT3V0cHV0U3RyZWFtIGI2NG9zID0gbnVsbDsKLSAgICAgICAgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtIGd6b3MgPSBudWxsOwotICAgICAgICBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBPYmplY3RPdXRwdXRTdHJlYW0gLT4gKEdaSVApIC0+IEJhc2U2NCAtPiBCeXRlQXJyYXlPdXRwdXRTdHJlYW0KLSAgICAgICAgICAgIGJhb3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGI2NG9zID0gbmV3IEJhc2U2NC5PdXRwdXRTdHJlYW0oYmFvcywgRU5DT0RFIHwgb3B0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiBHWklQKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gR3ppcAotICAgICAgICAgICAgICAgIGd6b3MgPSBuZXcgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtKGI2NG9zKTsKLSAgICAgICAgICAgICAgICBvb3MgPSBuZXcgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0oZ3pvcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE5vdCBnemlwcGVkCi0gICAgICAgICAgICAgICAgb29zID0gbmV3IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtKGI2NG9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChzZXJpYWxpemFibGVPYmplY3QpOwotICAgICAgICB9IC8vIGVuZCB0cnkKLSAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ2F0Y2ggaXQgYW5kIHRoZW4gdGhyb3cgaXQgaW1tZWRpYXRlbHkgc28gdGhhdAotICAgICAgICAgICAgLy8gdGhlIGZpbmFsbHl7fSBibG9jayBpcyBjYWxsZWQgZm9yIGNsZWFudXAuCi0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IC8vIGVuZCBjYXRjaAotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KG9vcyk7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShnem9zKTsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGI2NG9zKTsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGJhb3MpOwotICAgICAgICB9IC8vIGVuZCBmaW5hbGx5Ci0KLSAgICAgICAgLy8gUmV0dXJuIHZhbHVlIGFjY29yZGluZyB0byByZWxldmFudCBlbmNvZGluZy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgUFJFRkVSUkVEX0VOQ09ESU5HKTsKLSAgICAgICAgfSAvLyBlbmQgdHJ5Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdXVlKSB7Ci0gICAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gVVRGLTgKLSAgICAgICAgICAgIHJldHVybiBJT1V0aWxzLnRvVVRGOFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICB9IC8vIGVuZCBjYXRjaAotCi0gICAgfSAvLyBlbmQgZW5jb2RlCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSBpbnRvIEJhc2U2NCBub3RhdGlvbi4gRG9lcyBub3QgR1ppcC1jb21wcmVzcyBkYXRhLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBkYXRhIHRvIGNvbnZlcnQKLSAgICAgKiBAcmV0dXJuIFRoZSBkYXRhIGluIEJhc2U2NC1lbmNvZGVkIGZvcm0KLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc291cmNlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAc2luY2UgMS40Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQnl0ZXMoYnl0ZVtdIHNvdXJjZSkgewotICAgICAgICAvLyBTaW5jZSB3ZSdyZSBub3QgZ29pbmcgdG8gaGF2ZSB0aGUgR1pJUCBlbmNvZGluZyB0dXJuZWQgb24sCi0gICAgICAgIC8vIHdlJ3JlIG5vdCBnb2luZyB0byBoYXZlIGFuIGphdmEuaW8uSU9FeGNlcHRpb24gdGhyb3duLCBzbwotICAgICAgICAvLyB3ZSBzaG91bGQgbm90IGZvcmNlIHRoZSB1c2VyIHRvIGhhdmUgdG8gY2F0Y2ggaXQuCi0gICAgICAgIFN0cmluZyBlbmNvZGVkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGVCeXRlcyhzb3VyY2UsIDAsIHNvdXJjZS5sZW5ndGgsIE5PX09QVElPTlMpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiBleC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIH0gLy8gZW5kIGNhdGNoCi0gICAgICAgIGFzc2VydCBlbmNvZGVkICE9IG51bGw7Ci0gICAgICAgIHJldHVybiBlbmNvZGVkOwotICAgIH0gLy8gZW5kIGVuY29kZUJ5dGVzCi0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSBpbnRvIEJhc2U2NCBub3RhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlIG9wdGlvbnM6Ci0gICAgICogCi0gICAgICogPHByZT4KLSAgICAgKiAgIEdaSVA6IGd6aXAtY29tcHJlc3NlcyBvYmplY3QgYmVmb3JlIGVuY29kaW5nIGl0LgotICAgICAqICAgRE9fQlJFQUtfTElORVM6IGJyZWFrIGxpbmVzIGF0IDc2IGNoYXJhY3RlcnMKLSAgICAgKiAgICAgPGk+Tm90ZTogVGVjaG5pY2FsbHksIHRoaXMgbWFrZXMgeW91ciBlbmNvZGluZyBub24tY29tcGxpYW50LjwvaT4KLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlOiA8Y29kZT5lbmNvZGVCeXRlcyggbXlEYXRhLCBCYXNlNjQuR1pJUCApPC9jb2RlPiBvcgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGU6Ci0gICAgICogPGNvZGU+ZW5jb2RlQnl0ZXMoIG15RGF0YSwgQmFzZTY0LkdaSVAgfCBCYXNlNjQuRE9fQlJFQUtfTElORVMgKTwvY29kZT4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBBcyBvZiB2IDIuMywgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2l0aCB0aGUgR1pJUCBzdHJlYW0sIHRoZSBtZXRob2Qgd2lsbAotICAgICAqIHRocm93IGFuIGphdmEuaW8uSU9FeGNlcHRpb24uIDxiPlRoaXMgaXMgbmV3IHRvIHYyLjMhPC9iPiBJbiBlYXJsaWVyCi0gICAgICogdmVyc2lvbnMsIGl0IGp1c3QgcmV0dXJuZWQgYSBudWxsIHZhbHVlLCBidXQgaW4gcmV0cm9zcGVjdCB0aGF0J3MgYQotICAgICAqIHByZXR0eSBwb29yIHdheSB0byBoYW5kbGUgaXQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBkYXRhIHRvIGNvbnZlcnQKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqICAgICAgICAgICAgU3BlY2lmaWVkIG9wdGlvbnMKLSAgICAgKiBAcmV0dXJuIFRoZSBCYXNlNjQtZW5jb2RlZCBkYXRhIGFzIGEgU3RyaW5nCi0gICAgICogQHNlZSBCYXNlNjQjR1pJUAotICAgICAqIEBzZWUgQmFzZTY0I0RPX0JSRUFLX0xJTkVTCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc291cmNlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQnl0ZXMoYnl0ZVtdIHNvdXJjZSwgaW50IG9wdGlvbnMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGVuY29kZUJ5dGVzKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCwgb3B0aW9ucyk7Ci0gICAgfSAvLyBlbmQgZW5jb2RlQnl0ZXMKLQotICAgIC8qKgotICAgICAqIEVuY29kZXMgYSBieXRlIGFycmF5IGludG8gQmFzZTY0IG5vdGF0aW9uLiBEb2VzIG5vdCBHWmlwLWNvbXByZXNzIGRhdGEuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQXMgb2YgdiAyLjMsIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4KLSAgICAgKiBqYXZhLmlvLklPRXhjZXB0aW9uLiA8Yj5UaGlzIGlzIG5ldyB0byB2Mi4zITwvYj4gSW4gZWFybGllciB2ZXJzaW9ucywgaXQKLSAgICAgKiBqdXN0IHJldHVybmVkIGEgbnVsbCB2YWx1ZSwgYnV0IGluIHJldHJvc3BlY3QgdGhhdCdzIGEgcHJldHR5IHBvb3Igd2F5IHRvCi0gICAgICogaGFuZGxlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogICAgICAgICAgICBUaGUgZGF0YSB0byBjb252ZXJ0Ci0gICAgICogQHBhcmFtIG9mZgotICAgICAqICAgICAgICAgICAgT2Zmc2V0IGluIGFycmF5IHdoZXJlIGNvbnZlcnNpb24gc2hvdWxkIGJlZ2luCi0gICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgTGVuZ3RoIG9mIGRhdGEgdG8gY29udmVydAotICAgICAqIEByZXR1cm4gVGhlIEJhc2U2NC1lbmNvZGVkIGRhdGEgYXMgYSBTdHJpbmcKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc291cmNlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNvdXJjZSBhcnJheSwgb2Zmc2V0LCBvciBsZW5ndGggYXJlIGludmFsaWQKLSAgICAgKiBAc2luY2UgMS40Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQnl0ZXMoYnl0ZVtdIHNvdXJjZSwgaW50IG9mZiwgaW50IGxlbikgewotICAgICAgICAvLyBTaW5jZSB3ZSdyZSBub3QgZ29pbmcgdG8gaGF2ZSB0aGUgR1pJUCBlbmNvZGluZyB0dXJuZWQgb24sCi0gICAgICAgIC8vIHdlJ3JlIG5vdCBnb2luZyB0byBoYXZlIGFuIGphdmEuaW8uSU9FeGNlcHRpb24gdGhyb3duLCBzbwotICAgICAgICAvLyB3ZSBzaG91bGQgbm90IGZvcmNlIHRoZSB1c2VyIHRvIGhhdmUgdG8gY2F0Y2ggaXQuCi0gICAgICAgIFN0cmluZyBlbmNvZGVkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGVCeXRlcyhzb3VyY2UsIG9mZiwgbGVuLCBOT19PUFRJT05TKTsKLSAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlIDogZXguZ2V0TWVzc2FnZSgpOwotICAgICAgICB9IC8vIGVuZCBjYXRjaAotICAgICAgICBhc3NlcnQgZW5jb2RlZCAhPSBudWxsOwotICAgICAgICByZXR1cm4gZW5jb2RlZDsKLSAgICB9IC8vIGVuZCBlbmNvZGVCeXRlcwotCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyBhIGJ5dGUgYXJyYXkgaW50byBCYXNlNjQgbm90YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZSBvcHRpb25zOgotICAgICAqIAotICAgICAqIDxwcmU+Ci0gICAgICogICBHWklQOiBnemlwLWNvbXByZXNzZXMgb2JqZWN0IGJlZm9yZSBlbmNvZGluZyBpdC4KLSAgICAgKiAgIERPX0JSRUFLX0xJTkVTOiBicmVhayBsaW5lcyBhdCA3NiBjaGFyYWN0ZXJzCi0gICAgICogICAgIDxpPk5vdGU6IFRlY2huaWNhbGx5LCB0aGlzIG1ha2VzIHlvdXIgZW5jb2Rpbmcgbm9uLWNvbXBsaWFudC48L2k+Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHA+Ci0gICAgICogRXhhbXBsZTogPGNvZGU+ZW5jb2RlQnl0ZXMoIG15RGF0YSwgQmFzZTY0LkdaSVAgKTwvY29kZT4gb3IKLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlOgotICAgICAqIDxjb2RlPmVuY29kZUJ5dGVzKCBteURhdGEsIEJhc2U2NC5HWklQIHwgQmFzZTY0LkRPX0JSRUFLX0xJTkVTICk8L2NvZGU+Ci0gICAgICogCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQXMgb2YgdiAyLjMsIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIEdaSVAgc3RyZWFtLCB0aGUgbWV0aG9kIHdpbGwKLSAgICAgKiB0aHJvdyBhbiBqYXZhLmlvLklPRXhjZXB0aW9uLiA8Yj5UaGlzIGlzIG5ldyB0byB2Mi4zITwvYj4gSW4gZWFybGllcgotICAgICAqIHZlcnNpb25zLCBpdCBqdXN0IHJldHVybmVkIGEgbnVsbCB2YWx1ZSwgYnV0IGluIHJldHJvc3BlY3QgdGhhdCdzIGEKLSAgICAgKiBwcmV0dHkgcG9vciB3YXkgdG8gaGFuZGxlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogICAgICAgICAgICBUaGUgZGF0YSB0byBjb252ZXJ0Ci0gICAgICogQHBhcmFtIG9mZgotICAgICAqICAgICAgICAgICAgT2Zmc2V0IGluIGFycmF5IHdoZXJlIGNvbnZlcnNpb24gc2hvdWxkIGJlZ2luCi0gICAgICogQHBhcmFtIGxlbgotICAgICAqICAgICAgICAgICAgTGVuZ3RoIG9mIGRhdGEgdG8gY29udmVydAotICAgICAqIEBwYXJhbSBvcHRpb25zCi0gICAgICogICAgICAgICAgICBTcGVjaWZpZWQgb3B0aW9ucwotICAgICAqIEByZXR1cm4gVGhlIEJhc2U2NC1lbmNvZGVkIGRhdGEgYXMgYSBTdHJpbmcKLSAgICAgKiBAc2VlIEJhc2U2NCNHWklQCi0gICAgICogQHNlZSBCYXNlNjQjRE9fQlJFQUtfTElORVMKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBzb3VyY2UgYXJyYXkgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc291cmNlIGFycmF5LCBvZmZzZXQsIG9yIGxlbmd0aCBhcmUgaW52YWxpZAotICAgICAqIEBzaW5jZSAyLjAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVCeXRlcyhieXRlW10gc291cmNlLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgb3B0aW9ucykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICBieXRlW10gZW5jb2RlZCA9IGVuY29kZUJ5dGVzVG9CeXRlcyhzb3VyY2UsIG9mZiwgbGVuLCBvcHRpb25zKTsKLQotICAgICAgICAvLyBSZXR1cm4gdmFsdWUgYWNjb3JkaW5nIHRvIHJlbGV2YW50IGVuY29kaW5nLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZW5jb2RlZCwgUFJFRkVSUkVEX0VOQ09ESU5HKTsKLSAgICAgICAgfSAvLyBlbmQgdHJ5Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdXVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU9VdGlscy50b1VURjhTdHJpbmcoZW5jb2RlZCk7Ci0gICAgICAgIH0gLy8gZW5kIGNhdGNoCi0KLSAgICB9IC8vIGVuZCBlbmNvZGVCeXRlcwotCi0gICAgLyoqCi0gICAgICogU2ltaWxhciB0byB7QGxpbmsgI2VuY29kZUJ5dGVzKGJ5dGVbXSl9IGJ1dCByZXR1cm5zIGEgYnl0ZSBhcnJheSBpbnN0ZWFkCi0gICAgICogb2YgaW5zdGFudGlhdGluZyBhIFN0cmluZy4gVGhpcyBpcyBtb3JlIGVmZmljaWVudCBpZiB5b3UncmUgd29ya2luZyB3aXRoCi0gICAgICogSS9PIHN0cmVhbXMgYW5kIGhhdmUgbGFyZ2UgZGF0YSBzZXRzIHRvIGVuY29kZS4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogICAgICAgICAgICBUaGUgZGF0YSB0byBjb252ZXJ0Ci0gICAgICogQHJldHVybiBUaGUgQmFzZTY0LWVuY29kZWQgZGF0YSBhcyBhIGJ5dGVbXSAob2YgQVNDSUkgY2hhcmFjdGVycykKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc291cmNlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAc2luY2UgMi4zLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVCeXRlc1RvQnl0ZXMoYnl0ZVtdIHNvdXJjZSkgewotICAgICAgICBieXRlW10gZW5jb2RlZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlbmNvZGVkID0gZW5jb2RlQnl0ZXNUb0J5dGVzKHNvdXJjZSwgMCwgc291cmNlLmxlbmd0aCwgQmFzZTY0Lk5PX09QVElPTlMpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnQgZmFsc2UgOiAiSU9FeGNlcHRpb25zIG9ubHkgY29tZSBmcm9tIEdaaXBwaW5nLCB3aGljaCBpcyB0dXJuZWQgb2ZmOiAiICsgZXguZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rICNlbmNvZGVCeXRlcyhieXRlW10sIGludCwgaW50LCBpbnQpfSBidXQgcmV0dXJucyBhIGJ5dGUKLSAgICAgKiBhcnJheSBpbnN0ZWFkIG9mIGluc3RhbnRpYXRpbmcgYSBTdHJpbmcuIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgaWYgeW91J3JlCi0gICAgICogd29ya2luZyB3aXRoIEkvTyBzdHJlYW1zIGFuZCBoYXZlIGxhcmdlIGRhdGEgc2V0cyB0byBlbmNvZGUuCi0gICAgICogCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvdXJjZQotICAgICAqICAgICAgICAgICAgVGhlIGRhdGEgdG8gY29udmVydAotICAgICAqIEBwYXJhbSBvZmYKLSAgICAgKiAgICAgICAgICAgIE9mZnNldCBpbiBhcnJheSB3aGVyZSBjb252ZXJzaW9uIHNob3VsZCBiZWdpbgotICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIExlbmd0aCBvZiBkYXRhIHRvIGNvbnZlcnQKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqICAgICAgICAgICAgU3BlY2lmaWVkIG9wdGlvbnMKLSAgICAgKiBAcmV0dXJuIFRoZSBCYXNlNjQtZW5jb2RlZCBkYXRhIGFzIGEgU3RyaW5nCi0gICAgICogQHNlZSBCYXNlNjQjR1pJUAotICAgICAqIEBzZWUgQmFzZTY0I0RPX0JSRUFLX0xJTkVTCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc291cmNlIGFycmF5IGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHNvdXJjZSBhcnJheSwgb2Zmc2V0LCBvciBsZW5ndGggYXJlIGludmFsaWQKLSAgICAgKiBAc2luY2UgMi4zLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVCeXRlc1RvQnl0ZXMoYnl0ZVtdIHNvdXJjZSwgaW50IG9mZiwgaW50IGxlbiwgaW50IG9wdGlvbnMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IHNlcmlhbGl6ZSBhIG51bGwgYXJyYXkuIik7Ci0gICAgICAgIH0gLy8gZW5kIGlmOiBudWxsCi0KLSAgICAgICAgaWYgKG9mZiA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBoYXZlIG5lZ2F0aXZlIG9mZnNldDogIiArIG9mZik7Ci0gICAgICAgIH0gLy8gZW5kIGlmOiBvZmYgPCAwCi0KLSAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBoYXZlIGxlbmd0aCBvZmZzZXQ6ICIgKyBsZW4pOwotICAgICAgICB9IC8vIGVuZCBpZjogbGVuIDwgMAotCi0gICAgICAgIGlmIChvZmYgKyBsZW4gPiBzb3VyY2UubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaGF2ZSBvZmZzZXQgb2YgJWQgYW5kIGxlbmd0aCBvZiAlZCB3aXRoIGFycmF5IG9mIGxlbmd0aCAlZCIsIG9mZiwgbGVuLCBzb3VyY2UubGVuZ3RoKSk7Ci0gICAgICAgIH0gLy8gZW5kIGlmOiBvZmYgPCAwCi0KLSAgICAgICAgLy8gQ29tcHJlc3M/Ci0gICAgICAgIGlmICgob3B0aW9ucyAmIEdaSVApICE9IDApIHsKLSAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBudWxsOwotICAgICAgICAgICAgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtIGd6b3MgPSBudWxsOwotICAgICAgICAgICAgQmFzZTY0Lk91dHB1dFN0cmVhbSBiNjRvcyA9IG51bGw7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gR1ppcCAtPiBCYXNlNjQgLT4gQnl0ZUFycmF5Ci0gICAgICAgICAgICAgICAgYmFvcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGI2NG9zID0gbmV3IEJhc2U2NC5PdXRwdXRTdHJlYW0oYmFvcywgRU5DT0RFIHwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgZ3pvcyA9IG5ldyBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW0oYjY0b3MpOwotCi0gICAgICAgICAgICAgICAgZ3pvcy53cml0ZShzb3VyY2UsIG9mZiwgbGVuKTsKLSAgICAgICAgICAgICAgICBnem9zLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IC8vIGVuZCB0cnkKLSAgICAgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDYXRjaCBpdCBhbmQgdGhlbiB0aHJvdyBpdCBpbW1lZGlhdGVseSBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgLy8gdGhlIGZpbmFsbHl7fSBibG9jayBpcyBjYWxsZWQgZm9yIGNsZWFudXAuCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gLy8gZW5kIGNhdGNoCi0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShnem9zKTsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShiNjRvcyk7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYmFvcyk7Ci0gICAgICAgICAgICB9IC8vIGVuZCBmaW5hbGx5Ci0KLSAgICAgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0gLy8gZW5kIGlmOiBjb21wcmVzcwotCi0gICAgICAgIC8vIEVsc2UsIGRvbid0IGNvbXByZXNzLiBCZXR0ZXIgbm90IHRvIHVzZSBzdHJlYW1zIGF0IGFsbCB0aGVuLgotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJvb2xlYW4gYnJlYWtMaW5lcyA9IChvcHRpb25zICYgRE9fQlJFQUtfTElORVMpICE9IDA7Ci0KLSAgICAgICAgICAgIC8vIGludCBsZW40MyA9IGxlbiAqIDQgLyAzOwotICAgICAgICAgICAgLy8gYnl0ZVtdIG91dEJ1ZmYgPSBuZXcgYnl0ZVsgKCBsZW40MyApIC8vIE1haW4gNDozCi0gICAgICAgICAgICAvLyArICggKGxlbiAlIDMpID4gMCA/IDQgOiAwICkgLy8gQWNjb3VudCBmb3IgcGFkZGluZwotICAgICAgICAgICAgLy8gKyAoYnJlYWtMaW5lcyA/ICggbGVuNDMgLyBNQVhfTElORV9MRU5HVEggKSA6IDApIF07IC8vIE5ldyBsaW5lcwotICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSBtb3JlIHByZWNpc2VseSBob3cgYmlnIHRoZSBhcnJheSBuZWVkcyB0byBiZS4KLSAgICAgICAgICAgIC8vIElmIHdlIGdldCBpdCByaWdodCwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbiBhcnJheSBjb3B5LCBhbmQKLSAgICAgICAgICAgIC8vIHdlIHNhdmUgYSBidW5jaCBvZiBtZW1vcnkuCi0gICAgICAgICAgICBpbnQgZW5jTGVuID0gKGxlbiAvIDMpICogNCArIChsZW4gJSAzID4gMCA/IDQgOiAwKTsgLy8gQnl0ZXMgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFjdHVhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY29kaW5nCi0gICAgICAgICAgICBpZiAoYnJlYWtMaW5lcykgewotICAgICAgICAgICAgICAgIGVuY0xlbiArPSBlbmNMZW4gLyBNQVhfTElORV9MRU5HVEg7IC8vIFBsdXMgZXh0cmEgbmV3bGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVbXSBvdXRCdWZmID0gbmV3IGJ5dGVbZW5jTGVuXTsKLQotICAgICAgICAgICAgaW50IGQgPSAwOwotICAgICAgICAgICAgaW50IGUgPSAwOwotICAgICAgICAgICAgaW50IGxlbjIgPSBsZW4gLSAyOwotICAgICAgICAgICAgaW50IGxpbmVMZW5ndGggPSAwOwotICAgICAgICAgICAgZm9yICg7IGQgPCBsZW4yOyBkICs9IDMsIGUgKz0gNCkgewotICAgICAgICAgICAgICAgIGVuY29kZTN0bzQoc291cmNlLCBkICsgb2ZmLCAzLCBvdXRCdWZmLCBlLCBvcHRpb25zKTsKLQotICAgICAgICAgICAgICAgIGxpbmVMZW5ndGggKz0gNDsKLSAgICAgICAgICAgICAgICBpZiAoYnJlYWtMaW5lcyAmJiBsaW5lTGVuZ3RoID49IE1BWF9MSU5FX0xFTkdUSCkgewotICAgICAgICAgICAgICAgICAgICBvdXRCdWZmW2UgKyA0XSA9IE5FV19MSU5FOwotICAgICAgICAgICAgICAgICAgICBlKys7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBlbmQgb2YgbGluZQotICAgICAgICAgICAgfSAvLyBlbiBkZm9yOiBlYWNoIHBpZWNlIG9mIGFycmF5Ci0KLSAgICAgICAgICAgIGlmIChkIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlM3RvNChzb3VyY2UsIGQgKyBvZmYsIGxlbiAtIGQsIG91dEJ1ZmYsIGUsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIGUgKz0gNDsKLSAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBzb21lIHBhZGRpbmcgbmVlZGVkCi0KLSAgICAgICAgICAgIC8vIE9ubHkgcmVzaXplIGFycmF5IGlmIHdlIGRpZG4ndCBndWVzcyBpdCByaWdodC4KLSAgICAgICAgICAgIGlmIChlIDw9IG91dEJ1ZmYubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIC8vIElmIGJyZWFraW5nIGxpbmVzIGFuZCB0aGUgbGFzdCBieXRlIGZhbGxzIHJpZ2h0IGF0Ci0gICAgICAgICAgICAgICAgLy8gdGhlIGxpbmUgbGVuZ3RoICg3NiBieXRlcyBwZXIgbGluZSksIHRoZXJlIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAvLyBvbmUgZXh0cmEgYnl0ZSwgYW5kIHRoZSBhcnJheSB3aWxsIG5lZWQgdG8gYmUgcmVzaXplZC4KLSAgICAgICAgICAgICAgICAvLyBOb3QgdG9vIGJhZCBvZiBhbiBlc3RpbWF0ZSBvbiBhcnJheSBzaXplLCBJJ2Qgc2F5LgotICAgICAgICAgICAgICAgIGJ5dGVbXSBmaW5hbE91dCA9IG5ldyBieXRlW2VdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3V0QnVmZiwgMCwgZmluYWxPdXQsIDAsIGUpOwotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiSGF2aW5nIHRvIHJlc2l6ZSBhcnJheSBmcm9tICIgKwotICAgICAgICAgICAgICAgIC8vIG91dEJ1ZmYubGVuZ3RoICsgIiB0byAiICsgZSApOwotICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbE91dDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJObyBuZWVkIHRvIHJlc2l6ZSBhcnJheS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0QnVmZjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IC8vIGVuZCBlbHNlOiBkb24ndCBjb21wcmVzcwotCi0gICAgfSAvLyBlbmQgZW5jb2RlQnl0ZXNUb0J5dGVzCi0KLSAgICAvKiAqKioqKioqKiBEIEUgQyBPIEQgSSBOIEcgTSBFIFQgSCBPIEQgUyAqKioqKioqKiAqLwotCi0gICAgLyoqCi0gICAgICogRGVjb2RlcyBmb3VyIGJ5dGVzIGZyb20gYXJyYXkgPHZhcj5zb3VyY2U8L3Zhcj4gYW5kIHdyaXRlcyB0aGUgcmVzdWx0aW5nCi0gICAgICogYnl0ZXMgKHVwIHRvIHRocmVlIG9mIHRoZW0pIHRvIDx2YXI+ZGVzdGluYXRpb248L3Zhcj4uIFRoZSBzb3VyY2UgYW5kCi0gICAgICogZGVzdGluYXRpb24gYXJyYXlzIGNhbiBiZSBtYW5pcHVsYXRlZCBhbnl3aGVyZSBhbG9uZyB0aGVpciBsZW5ndGggYnkKLSAgICAgKiBzcGVjaWZ5aW5nIDx2YXI+c3JjT2Zmc2V0PC92YXI+IGFuZCA8dmFyPmRlc3RPZmZzZXQ8L3Zhcj4uIFRoaXMgbWV0aG9kCi0gICAgICogZG9lcyBub3QgY2hlY2sgdG8gbWFrZSBzdXJlIHlvdXIgYXJyYXlzIGFyZSBsYXJnZSBlbm91Z2ggdG8gYWNjb21vZGF0ZQotICAgICAqIDx2YXI+c3JjT2Zmc2V0PC92YXI+ICsgNCBmb3IgdGhlIDx2YXI+c291cmNlPC92YXI+IGFycmF5IG9yCi0gICAgICogPHZhcj5kZXN0T2Zmc2V0PC92YXI+ICsgMyBmb3IgdGhlIDx2YXI+ZGVzdGluYXRpb248L3Zhcj4gYXJyYXkuIFRoaXMKLSAgICAgKiBtZXRob2QgcmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgY29udmVydGVkIGZyb20gdGhlCi0gICAgICogQmFzZTY0IGVuY29kaW5nLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCBvZiB0aGUgZGVjb2RpbmcgbWV0aG9kcyB3aXRoIGFsbCBwb3NzaWJsZQotICAgICAqIHBhcmFtZXRlcnMuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBhcnJheSB0byBjb252ZXJ0Ci0gICAgICogQHBhcmFtIHNyY09mZnNldAotICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IHdoZXJlIGNvbnZlcnNpb24gYmVnaW5zCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gICAgICogICAgICAgICAgICB0aGUgYXJyYXkgdG8gaG9sZCB0aGUgY29udmVyc2lvbgotICAgICAqIEBwYXJhbSBkZXN0T2Zmc2V0Ci0gICAgICogICAgICAgICAgICB0aGUgaW5kZXggd2hlcmUgb3V0cHV0IHdpbGwgYmUgcHV0Ci0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKiAgICAgICAgICAgIGFscGhhYmV0IHR5cGUgaXMgcHVsbGVkIGZyb20gdGhpcyAoc3RhbmRhcmQsIHVybC1zYWZlLAotICAgICAqICAgICAgICAgICAgb3JkZXJlZCkKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZGVjb2RlZCBieXRlcyBjb252ZXJ0ZWQKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFycmF5cyBhcmUgbnVsbAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgc3JjT2Zmc2V0IG9yIGRlc3RPZmZzZXQgYXJlIGludmFsaWQgb3IgdGhlcmUgaXMgbm90IGVub3VnaAotICAgICAqICAgICAgICAgICAgIHJvb20gaW4gdGhlIGFycmF5LgotICAgICAqIEBzaW5jZSAxLjMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVjb2RlNHRvMyhieXRlW10gc291cmNlLCBpbnQgc3JjT2Zmc2V0LCBieXRlW10gZGVzdGluYXRpb24sIGludCBkZXN0T2Zmc2V0LCBpbnQgb3B0aW9ucykgewotCi0gICAgICAgIC8vIExvdHMgb2YgZXJyb3IgY2hlY2tpbmcgYW5kIGV4Y2VwdGlvbiB0aHJvd2luZwotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiU291cmNlIGFycmF5IHdhcyBudWxsLiIpOwotICAgICAgICB9IC8vIGVuZCBpZgotICAgICAgICBpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBhcnJheSB3YXMgbnVsbC4iKTsKLSAgICAgICAgfSAvLyBlbmQgaWYKLSAgICAgICAgaWYgKHNyY09mZnNldCA8IDAgfHwgc3JjT2Zmc2V0ICsgMyA+PSBzb3VyY2UubGVuZ3RoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJTb3VyY2UgYXJyYXkgd2l0aCBsZW5ndGggJWQgY2Fubm90IGhhdmUgb2Zmc2V0IG9mICVkIGFuZCBzdGlsbCBwcm9jZXNzIGZvdXIgYnl0ZXMuIiwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmxlbmd0aCwgc3JjT2Zmc2V0KSk7Ci0gICAgICAgIH0gLy8gZW5kIGlmCi0gICAgICAgIGlmIChkZXN0T2Zmc2V0IDwgMCB8fCBkZXN0T2Zmc2V0ICsgMiA+PSBkZXN0aW5hdGlvbi5sZW5ndGgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkRlc3RpbmF0aW9uIGFycmF5IHdpdGggbGVuZ3RoICVkIGNhbm5vdCBoYXZlIG9mZnNldCBvZiAlZCBhbmQgc3RpbGwgc3RvcmUgdGhyZWUgYnl0ZXMuIiwKLSAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24ubGVuZ3RoLCBkZXN0T2Zmc2V0KSk7Ci0gICAgICAgIH0gLy8gZW5kIGlmCi0KLSAgICAgICAgYnl0ZVtdIERFQ09EQUJFVCA9IGdldERlY29kYWJldChvcHRpb25zKTsKLQotICAgICAgICAvLyBFeGFtcGxlOiBEaz09Ci0gICAgICAgIGlmIChzb3VyY2Vbc3JjT2Zmc2V0ICsgMl0gPT0gRVFVQUxTX1NJR04pIHsKLSAgICAgICAgICAgIC8vIFR3byB3YXlzIHRvIGRvIHRoZSBzYW1lIHRoaW5nLiBEb24ndCBrbm93IHdoaWNoIHdheSBJIGxpa2UgYmVzdC4KLSAgICAgICAgICAgIC8vIGludCBvdXRCdWZmID0gKCAoIERFQ09EQUJFVFsgc291cmNlWyBzcmNPZmZzZXQgXSBdIDw8IDI0ICkgPj4+IDYKLSAgICAgICAgICAgIC8vICkKLSAgICAgICAgICAgIC8vIHwgKCAoIERFQ09EQUJFVFsgc291cmNlWyBzcmNPZmZzZXQgKyAxXSBdIDw8IDI0ICkgPj4+IDEyICk7Ci0gICAgICAgICAgICBpbnQgb3V0QnVmZiA9ICgoREVDT0RBQkVUW3NvdXJjZVtzcmNPZmZzZXRdXSAmIDB4RkYpIDw8IDE4KQotICAgICAgICAgICAgICAgICAgICB8ICgoREVDT0RBQkVUW3NvdXJjZVtzcmNPZmZzZXQgKyAxXV0gJiAweEZGKSA8PCAxMik7Ci0KLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2Rlc3RPZmZzZXRdID0gKGJ5dGUpIChvdXRCdWZmID4+PiAxNik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4YW1wbGU6IERrTD0KLSAgICAgICAgZWxzZSBpZiAoc291cmNlW3NyY09mZnNldCArIDNdID09IEVRVUFMU19TSUdOKSB7Ci0gICAgICAgICAgICAvLyBUd28gd2F5cyB0byBkbyB0aGUgc2FtZSB0aGluZy4gRG9uJ3Qga25vdyB3aGljaCB3YXkgSSBsaWtlIGJlc3QuCi0gICAgICAgICAgICAvLyBpbnQgb3V0QnVmZiA9ICggKCBERUNPREFCRVRbIHNvdXJjZVsgc3JjT2Zmc2V0IF0gXSA8PCAyNCApID4+PiA2Ci0gICAgICAgICAgICAvLyApCi0gICAgICAgICAgICAvLyB8ICggKCBERUNPREFCRVRbIHNvdXJjZVsgc3JjT2Zmc2V0ICsgMSBdIF0gPDwgMjQgKSA+Pj4gMTIgKQotICAgICAgICAgICAgLy8gfCAoICggREVDT0RBQkVUWyBzb3VyY2VbIHNyY09mZnNldCArIDIgXSBdIDw8IDI0ICkgPj4+IDE4ICk7Ci0gICAgICAgICAgICBpbnQgb3V0QnVmZiA9ICgoREVDT0RBQkVUW3NvdXJjZVtzcmNPZmZzZXRdXSAmIDB4RkYpIDw8IDE4KQotICAgICAgICAgICAgICAgICAgICB8ICgoREVDT0RBQkVUW3NvdXJjZVtzcmNPZmZzZXQgKyAxXV0gJiAweEZGKSA8PCAxMikKLSAgICAgICAgICAgICAgICAgICAgfCAoKERFQ09EQUJFVFtzb3VyY2Vbc3JjT2Zmc2V0ICsgMl1dICYgMHhGRikgPDwgNik7Ci0KLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2Rlc3RPZmZzZXRdID0gKGJ5dGUpIChvdXRCdWZmID4+PiAxNik7Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbltkZXN0T2Zmc2V0ICsgMV0gPSAoYnl0ZSkgKG91dEJ1ZmYgPj4+IDgpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeGFtcGxlOiBEa0xFCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gVHdvIHdheXMgdG8gZG8gdGhlIHNhbWUgdGhpbmcuIERvbid0IGtub3cgd2hpY2ggd2F5IEkgbGlrZSBiZXN0LgotICAgICAgICAgICAgLy8gaW50IG91dEJ1ZmYgPSAoICggREVDT0RBQkVUWyBzb3VyY2VbIHNyY09mZnNldCBdIF0gPDwgMjQgKSA+Pj4gNgotICAgICAgICAgICAgLy8gKQotICAgICAgICAgICAgLy8gfCAoICggREVDT0RBQkVUWyBzb3VyY2VbIHNyY09mZnNldCArIDEgXSBdIDw8IDI0ICkgPj4+IDEyICkKLSAgICAgICAgICAgIC8vIHwgKCAoIERFQ09EQUJFVFsgc291cmNlWyBzcmNPZmZzZXQgKyAyIF0gXSA8PCAyNCApID4+PiAxOCApCi0gICAgICAgICAgICAvLyB8ICggKCBERUNPREFCRVRbIHNvdXJjZVsgc3JjT2Zmc2V0ICsgMyBdIF0gPDwgMjQgKSA+Pj4gMjQgKTsKLSAgICAgICAgICAgIGludCBvdXRCdWZmID0gKChERUNPREFCRVRbc291cmNlW3NyY09mZnNldF1dICYgMHhGRikgPDwgMTgpCi0gICAgICAgICAgICAgICAgICAgIHwgKChERUNPREFCRVRbc291cmNlW3NyY09mZnNldCArIDFdXSAmIDB4RkYpIDw8IDEyKQotICAgICAgICAgICAgICAgICAgICB8ICgoREVDT0RBQkVUW3NvdXJjZVtzcmNPZmZzZXQgKyAyXV0gJiAweEZGKSA8PCA2KSB8ICgoREVDT0RBQkVUW3NvdXJjZVtzcmNPZmZzZXQgKyAzXV0gJiAweEZGKSk7Ci0KLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2Rlc3RPZmZzZXRdID0gKGJ5dGUpIChvdXRCdWZmID4+IDE2KTsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2Rlc3RPZmZzZXQgKyAxXSA9IChieXRlKSAob3V0QnVmZiA+PiA4KTsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uW2Rlc3RPZmZzZXQgKyAyXSA9IChieXRlKSAob3V0QnVmZik7Ci0KLSAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICB9Ci0gICAgfSAvLyBlbmQgZGVjb2RlVG9CeXRlcwotCi0gICAgLyoqCi0gICAgICogTG93LWxldmVsIGFjY2VzcyB0byBkZWNvZGluZyBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtIG9mIGEgYnl0ZQotICAgICAqIGFycmF5LiA8c3Ryb25nPklnbm9yZXMgR1VOWklQIG9wdGlvbiwgaWYgaXQncyBzZXQuPC9zdHJvbmc+IFRoaXMgaXMgbm90Ci0gICAgICogZ2VuZXJhbGx5IGEgcmVjb21tZW5kZWQgbWV0aG9kLCBhbHRob3VnaCBpdCBpcyB1c2VkIGludGVybmFsbHkgYXMgcGFydCBvZgotICAgICAqIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBTcGVjaWFsIGNhc2U6IGlmIGxlbiA9IDAsIGFuIGVtcHR5IGFycmF5IGlzCi0gICAgICogcmV0dXJuZWQuIFN0aWxsLCBpZiB5b3UgbmVlZCBtb3JlIHNwZWVkIGFuZCByZWR1Y2VkIG1lbW9yeSBmb290cHJpbnQgKGFuZAotICAgICAqIGFyZW4ndCBnemlwcGluZyksIGNvbnNpZGVyIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBCYXNlNjQgZW5jb2RlZCBkYXRhCi0gICAgICogQHJldHVybiBkZWNvZGVkIGRhdGEKLSAgICAgKiBAc2luY2UgMi4zLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoYnl0ZVtdIHNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICBieXRlW10gZGVjb2RlZCA9IG51bGw7Ci0gICAgICAgIC8vIHRyeSB7Ci0gICAgICAgIGRlY29kZWQgPSBkZWNvZGUoc291cmNlLCAwLCBzb3VyY2UubGVuZ3RoLCBCYXNlNjQuTk9fT1BUSU9OUyk7Ci0gICAgICAgIC8vIH0gY2F0Y2goIGphdmEuaW8uSU9FeGNlcHRpb24gZXggKSB7Ci0gICAgICAgIC8vIGFzc2VydCBmYWxzZSA6Ci0gICAgICAgIC8vICJJT0V4Y2VwdGlvbnMgb25seSBjb21lIGZyb20gR1ppcHBpbmcsIHdoaWNoIGlzIHR1cm5lZCBvZmY6ICIgKwotICAgICAgICAvLyBleC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgcmV0dXJuIGRlY29kZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG93LWxldmVsIGFjY2VzcyB0byBkZWNvZGluZyBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtIG9mIGEgYnl0ZQotICAgICAqIGFycmF5LiA8c3Ryb25nPklnbm9yZXMgR1VOWklQIG9wdGlvbiwgaWYgaXQncyBzZXQuPC9zdHJvbmc+IFRoaXMgaXMgbm90Ci0gICAgICogZ2VuZXJhbGx5IGEgcmVjb21tZW5kZWQgbWV0aG9kLCBhbHRob3VnaCBpdCBpcyB1c2VkIGludGVybmFsbHkgYXMgcGFydCBvZgotICAgICAqIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBTcGVjaWFsIGNhc2U6IGlmIGxlbiA9IDAsIGFuIGVtcHR5IGFycmF5IGlzCi0gICAgICogcmV0dXJuZWQuIFN0aWxsLCBpZiB5b3UgbmVlZCBtb3JlIHNwZWVkIGFuZCByZWR1Y2VkIG1lbW9yeSBmb290cHJpbnQgKGFuZAotICAgICAqIGFyZW4ndCBnemlwcGluZyksIGNvbnNpZGVyIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgIFRoZSBCYXNlNjQgZW5jb2RlZCBkYXRhCi0gICAgICogQHBhcmFtIG9mZgotICAgICAqICAgICAgICAgICAgVGhlIG9mZnNldCBvZiB3aGVyZSB0byBiZWdpbiBkZWNvZGluZwotICAgICAqIEBwYXJhbSBsZW4KLSAgICAgKiAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgY2hhcmFjdGVycyB0byBkZWNvZGUKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqICAgICAgICAgICAgQ2FuIHNwZWNpZnkgb3B0aW9ucyBzdWNoIGFzIGFscGhhYmV0IHR5cGUgdG8gdXNlCi0gICAgICogQHJldHVybiBkZWNvZGVkIGRhdGEKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBJZiBib2d1cyBjaGFyYWN0ZXJzIGV4aXN0IGluIHNvdXJjZSBkYXRhCi0gICAgICogQHNpbmNlIDEuMwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShieXRlW10gc291cmNlLCBpbnQgb2ZmLCBpbnQgbGVuLCBpbnQgb3B0aW9ucykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgICAgIC8vIExvdHMgb2YgZXJyb3IgY2hlY2tpbmcgYW5kIGV4Y2VwdGlvbiB0aHJvd2luZwotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ2Fubm90IGRlY29kZSBudWxsIHNvdXJjZSBhcnJheS4iKTsKLSAgICAgICAgfSAvLyBlbmQgaWYKLSAgICAgICAgaWYgKG9mZiA8IDAgfHwgb2ZmICsgbGVuID4gc291cmNlLmxlbmd0aCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiU291cmNlIGFycmF5IHdpdGggbGVuZ3RoICVkIGNhbm5vdCBoYXZlIG9mZnNldCBvZiAlZCBhbmQgcHJvY2VzcyAlZCBieXRlcy4iLCBzb3VyY2UubGVuZ3RoLCBvZmYsCi0gICAgICAgICAgICAgICAgICAgIGxlbikpOwotICAgICAgICB9IC8vIGVuZCBpZgotCi0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOwotICAgICAgICB9IGVsc2UgaWYgKGxlbiA8IDQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJCYXNlNjQtZW5jb2RlZCBzdHJpbmcgbXVzdCBoYXZlIGF0IGxlYXN0IGZvdXIgY2hhcmFjdGVycywgYnV0IGxlbmd0aCBzcGVjaWZpZWQgd2FzICIgKyBsZW4pOwotICAgICAgICB9IC8vIGVuZCBpZgotCi0gICAgICAgIGJ5dGVbXSBERUNPREFCRVQgPSBnZXREZWNvZGFiZXQob3B0aW9ucyk7Ci0KLSAgICAgICAgaW50IGxlbjM0ID0gbGVuICogMyAvIDQ7IC8vIEVzdGltYXRlIG9uIGFycmF5IHNpemUKLSAgICAgICAgYnl0ZVtdIG91dEJ1ZmYgPSBuZXcgYnl0ZVtsZW4zNF07IC8vIFVwcGVyIGxpbWl0IG9uIHNpemUgb2Ygb3V0cHV0Ci0gICAgICAgIGludCBvdXRCdWZmUG9zbiA9IDA7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgd2UncmUgd3JpdGluZwotCi0gICAgICAgIGJ5dGVbXSBiNCA9IG5ldyBieXRlWzRdOyAvLyBGb3VyIGJ5dGUgYnVmZmVyIGZyb20gc291cmNlLCBlbGltaW5hdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGUgc3BhY2UKLSAgICAgICAgaW50IGI0UG9zbiA9IDA7IC8vIEtlZXAgdHJhY2sgb2YgZm91ciBieXRlIGlucHV0IGJ1ZmZlcgotICAgICAgICBpbnQgaSA9IDA7IC8vIFNvdXJjZSBhcnJheSBjb3VudGVyCi0gICAgICAgIGJ5dGUgc2JpRGVjb2RlID0gMDsgLy8gU3BlY2lhbCB2YWx1ZSBmcm9tIERFQ09EQUJFVAotCi0gICAgICAgIGZvciAoaSA9IG9mZjsgaSA8IG9mZiArIGxlbjsgaSsrKSB7IC8vIExvb3AgdGhyb3VnaCBzb3VyY2UKLQotICAgICAgICAgICAgc2JpRGVjb2RlID0gREVDT0RBQkVUW3NvdXJjZVtpXSAmIDB4RkZdOwotCi0gICAgICAgICAgICAvLyBXaGl0ZSBzcGFjZSwgRXF1YWxzIHNpZ24sIG9yIGxlZ2l0IEJhc2U2NCBjaGFyYWN0ZXIKLSAgICAgICAgICAgIC8vIE5vdGUgdGhlIHZhbHVlcyBzdWNoIGFzIC01IGFuZCAtOSBpbiB0aGUKLSAgICAgICAgICAgIC8vIERFQ09EQUJFVHMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4KLSAgICAgICAgICAgIGlmIChzYmlEZWNvZGUgPj0gV0hJVEVfU1BBQ0VfRU5DKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNiaURlY29kZSA+PSBFUVVBTFNfU0lHTl9FTkMpIHsKLSAgICAgICAgICAgICAgICAgICAgYjRbYjRQb3NuKytdID0gc291cmNlW2ldOyAvLyBTYXZlIG5vbi13aGl0ZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChiNFBvc24gPiAzKSB7IC8vIFRpbWUgdG8gZGVjb2RlPwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZlBvc24gKz0gZGVjb2RlNHRvMyhiNCwgMCwgb3V0QnVmZiwgb3V0QnVmZlBvc24sIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYjRQb3NuID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhhdCB3YXMgdGhlIGVxdWFscyBzaWduLCBicmVhayBvdXQgb2YgJ2ZvcicgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZVtpXSA9PSBFUVVBTFNfU0lHTikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGVxdWFscyBzaWduCi0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBxdWFydGV0IGJ1aWx0Ci0gICAgICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGVxdWFscyBzaWduIG9yIGJldHRlcgotICAgICAgICAgICAgfSAvLyBlbmQgaWY6IHdoaXRlIHNwYWNlLCBlcXVhbHMgc2lnbiBvciBiZXR0ZXIKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3MgYSBiYWQgaW5wdXQgY2hhcmFjdGVyIGluIHRoZSBCYXNlNjQgc3RyZWFtLgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQmFkIEJhc2U2NCBpbnB1dCBjaGFyYWN0ZXIgZGVjaW1hbCAlZCBpbiBhcnJheSBwb3NpdGlvbiAlZCIsICgoaW50KSBzb3VyY2VbaV0pICYgMHhGRiwgaSkpOwotICAgICAgICAgICAgfSAvLyBlbmQgZWxzZToKLSAgICAgICAgfSAvLyBlYWNoIGlucHV0IGNoYXJhY3RlcgotCi0gICAgICAgIGJ5dGVbXSBvdXQgPSBuZXcgYnl0ZVtvdXRCdWZmUG9zbl07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3V0QnVmZiwgMCwgb3V0LCAwLCBvdXRCdWZmUG9zbik7Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfSAvLyBlbmQgZGVjb2RlCi0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVzIGRhdGEgZnJvbSBCYXNlNjQgbm90YXRpb24sIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nCi0gICAgICogZ3ppcC1jb21wcmVzc2VkIGRhdGEgYW5kIGRlY29tcHJlc3NpbmcgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZGVjb2RlCi0gICAgICogQHJldHVybiB0aGUgZGVjb2RlZCBkYXRhCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAgICogQHNpbmNlIDEuNAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShTdHJpbmcgcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGVjb2RlKHMsIE5PX09QVElPTlMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY29kZXMgZGF0YSBmcm9tIEJhc2U2NCBub3RhdGlvbiwgYXV0b21hdGljYWxseSBkZXRlY3RpbmcKLSAgICAgKiBnemlwLWNvbXByZXNzZWQgZGF0YSBhbmQgZGVjb21wcmVzc2luZyBpdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBkZWNvZGUKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqICAgICAgICAgICAgZW5jb2RlIG9wdGlvbnMgc3VjaCBhcyBVUkxfU0FGRQotICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgZGF0YQotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDx0dD5zPC90dD4gaXMgbnVsbAotICAgICAqIEBzaW5jZSAxLjQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoU3RyaW5nIHMsIGludCBvcHRpb25zKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJJbnB1dCBzdHJpbmcgd2FzIG51bGwuIik7Ci0gICAgICAgIH0gLy8gZW5kIGlmCi0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZXMgPSBzLmdldEJ5dGVzKFBSRUZFUlJFRF9FTkNPRElORyk7Ci0gICAgICAgIH0gLy8gZW5kIHRyeQotICAgICAgICBjYXRjaCAoamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkgewotICAgICAgICAgICAgYnl0ZXMgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKHMpOwotICAgICAgICB9IC8vIGVuZCBjYXRjaAotICAgICAgICAgIC8vIDwvY2hhbmdlPgotCi0gICAgICAgIC8vIERlY29kZQotICAgICAgICBieXRlcyA9IGRlY29kZShieXRlcywgMCwgYnl0ZXMubGVuZ3RoLCBvcHRpb25zKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBnemlwLWNvbXByZXNzZWQKLSAgICAgICAgLy8gR1pJUCBNYWdpYyBUd28tQnl0ZSBOdW1iZXI6IDB4OGIxZiAoMzU2MTUpCi0gICAgICAgIGJvb2xlYW4gZG9udEd1bnppcCA9IChvcHRpb25zICYgRE9OVF9HVU5aSVApICE9IDA7Ci0gICAgICAgIGlmICgoYnl0ZXMgIT0gbnVsbCkgJiYgKGJ5dGVzLmxlbmd0aCA+PSA0KSAmJiAoIWRvbnRHdW56aXApKSB7Ci0KLSAgICAgICAgICAgIGludCBoZWFkID0gKChpbnQpIGJ5dGVzWzBdICYgMHhmZikgfCAoKGJ5dGVzWzFdIDw8IDgpICYgMHhmZjAwKTsKLSAgICAgICAgICAgIGlmIChqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbS5HWklQX01BR0lDID09IGhlYWQpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtIGd6aXMgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBudWxsOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsyMDQ4XTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhb3MgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgYmFpcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgZ3ppcyA9IG5ldyBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbShiYWlzLCA2NCAqIDEwMjQpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gZ3ppcy5yZWFkKGJ1ZmZlcikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCB3aGlsZTogcmVhZGluZyBpbnB1dAotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vIGVycm9yPyBHZXQgbmV3IGJ5dGVzLgotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLQotICAgICAgICAgICAgICAgIH0gLy8gZW5kIHRyeQotICAgICAgICAgICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gb3JpZ2luYWxseS1kZWNvZGVkIGJ5dGVzCi0gICAgICAgICAgICAgICAgfSAvLyBlbmQgY2F0Y2gKLSAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYmFvcyk7Ci0gICAgICAgICAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGd6aXMpOwotICAgICAgICAgICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShiYWlzKTsKLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBmaW5hbGx5Ci0KLSAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBnemlwcGVkCi0gICAgICAgIH0gLy8gZW5kIGlmOiBieXRlcy5sZW5ndGggPj0gMgotCi0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9IC8vIGVuZCBkZWNvZGUKLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGRlY29kZSBCYXNlNjQgZGF0YSBhbmQgZGVzZXJpYWxpemUgYSBKYXZhIE9iamVjdCB3aXRoaW4uCi0gICAgICogUmV0dXJucyA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIHdhcyBhbiBlcnJvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5jb2RlZE9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIEJhc2U2NCBkYXRhIHRvIGRlY29kZQotICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYW5kIGRlc2VyaWFsaXplZCBvYmplY3QKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZW5jb2RlZE9iamVjdCBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBnZW5lcmFsIGVycm9yCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGRlY29kZWQgb2JqZWN0IGlzIG9mIGEgY2xhc3MgdGhhdCBjYW5ub3QgYmUgZm91bmQgYnkKLSAgICAgKiAgICAgICAgICAgICB0aGUgSlZNCi0gICAgICogQHNpbmNlIDEuNQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlY29kZVRvT2JqZWN0KFN0cmluZyBlbmNvZGVkT2JqZWN0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZVRvT2JqZWN0KGVuY29kZWRPYmplY3QsIE5PX09QVElPTlMsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF0dGVtcHRzIHRvIGRlY29kZSBCYXNlNjQgZGF0YSBhbmQgZGVzZXJpYWxpemUgYSBKYXZhIE9iamVjdCB3aXRoaW4uCi0gICAgICogUmV0dXJucyA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gSWYgPHR0PmxvYWRlcjwvdHQ+IGlzIG5vdAotICAgICAqIG51bGwsIGl0IHdpbGwgYmUgdGhlIGNsYXNzIGxvYWRlciB1c2VkIHdoZW4gZGVzZXJpYWxpemluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZW5jb2RlZE9iamVjdAotICAgICAqICAgICAgICAgICAgVGhlIEJhc2U2NCBkYXRhIHRvIGRlY29kZQotICAgICAqIEBwYXJhbSBvcHRpb25zCi0gICAgICogICAgICAgICAgICBWYXJpb3VzIHBhcmFtZXRlcnMgcmVsYXRlZCB0byBkZWNvZGluZwotICAgICAqIEBwYXJhbSBsb2FkZXIKLSAgICAgKiAgICAgICAgICAgIE9wdGlvbmFsIGNsYXNzIGxvYWRlciB0byB1c2UgaW4gZGVzZXJpYWxpemluZyBjbGFzc2VzLgotICAgICAqIEByZXR1cm4gVGhlIGRlY29kZWQgYW5kIGRlc2VyaWFsaXplZCBvYmplY3QKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgZW5jb2RlZE9iamVjdCBpcyBudWxsCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBnZW5lcmFsIGVycm9yCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlIGRlY29kZWQgb2JqZWN0IGlzIG9mIGEgY2xhc3MgdGhhdCBjYW5ub3QgYmUgZm91bmQgYnkKLSAgICAgKiAgICAgICAgICAgICB0aGUgSlZNCi0gICAgICogQHNpbmNlIDIuMy40Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZGVjb2RlVG9PYmplY3QoU3RyaW5nIGVuY29kZWRPYmplY3QsIGludCBvcHRpb25zLCBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIpCi0gICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIERlY29kZSBhbmQgZ3VuemlwIGlmIG5lY2Vzc2FyeQotICAgICAgICBieXRlW10gb2JqQnl0ZXMgPSBkZWNvZGUoZW5jb2RlZE9iamVjdCwgb3B0aW9ucyk7Ci0KLSAgICAgICAgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbnVsbDsKLSAgICAgICAgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBudWxsOwotICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYmFpcyA9IG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKG9iakJ5dGVzKTsKLQotICAgICAgICAgICAgLy8gSWYgbm8gY3VzdG9tIGNsYXNzIGxvYWRlciBpcyBwcm92aWRlZCwgdXNlIEphdmEncyBidWlsdGluIE9JUy4KLSAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9pcyA9IG5ldyBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgICAgICAgICAgfSAvLyBlbmQgaWY6IG5vIGxvYWRlciBwcm92aWRlZAotCi0gICAgICAgICAgICAvLyBFbHNlIG1ha2UgYSBjdXN0b21pemVkIG9iamVjdCBpbnB1dCBzdHJlYW0gdGhhdCB1c2VzCi0gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgY2xhc3MgbG9hZGVyLgotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2lzID0gbmV3IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0oYmFpcykgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIENsYXNzPD8+IHJlc29sdmVDbGFzcyhqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzIHN0cmVhbUNsYXNzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGMgPSBDbGFzcy5mb3JOYW1lKHN0cmVhbUNsYXNzLmdldE5hbWUoKSwgZmFsc2UsIGxvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVDbGFzcyhzdHJlYW1DbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOyAvLyBDbGFzcyBsb2FkZXIga25vd3Mgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2U6IG5vdCBudWxsCi0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIHJlc29sdmVDbGFzcwotICAgICAgICAgICAgICAgIH07IC8vIGVuZCBvaXMKLSAgICAgICAgICAgIH0gLy8gZW5kIGVsc2U6IG5vIGN1c3RvbSBjbGFzcyBsb2FkZXIKLQotICAgICAgICAgICAgb2JqID0gb2lzLnJlYWRPYmplY3QoKTsKLSAgICAgICAgfSAvLyBlbmQgdHJ5Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7IC8vIENhdGNoIGFuZCB0aHJvdyBpbiBvcmRlciB0byBleGVjdXRlIGZpbmFsbHl7fQotICAgICAgICB9IC8vIGVuZCBjYXRjaAotICAgICAgICBjYXRjaCAoamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsgLy8gQ2F0Y2ggYW5kIHRocm93IGluIG9yZGVyIHRvIGV4ZWN1dGUgZmluYWxseXt9Ci0gICAgICAgIH0gLy8gZW5kIGNhdGNoCi0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYmFpcyk7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShvaXMpOwotICAgICAgICB9IC8vIGVuZCBmaW5hbGx5Ci0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9IC8vIGVuZCBkZWNvZGVPYmplY3QKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZW5jb2RpbmcgZGF0YSB0byBhIGZpbGUuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQXMgb2YgdiAyLjMsIGlmIHRoZXJlIGlzIGEgZXJyb3IsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbgotICAgICAqIGphdmEuaW8uSU9FeGNlcHRpb24uIDxiPlRoaXMgaXMgbmV3IHRvIHYyLjMhPC9iPiBJbiBlYXJsaWVyIHZlcnNpb25zLCBpdAotICAgICAqIGp1c3QgcmV0dXJuZWQgZmFsc2UsIGJ1dCBpbiByZXRyb3NwZWN0IHRoYXQncyBhIHByZXR0eSBwb29yIHdheSB0byBoYW5kbGUKLSAgICAgKiBpdC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUb0VuY29kZQotICAgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSBvZiBkYXRhIHRvIGVuY29kZSBpbiBiYXNlNjQgZm9ybQotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqICAgICAgICAgICAgRmlsZW5hbWUgZm9yIHNhdmluZyBlbmNvZGVkIGRhdGEKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBkYXRhVG9FbmNvZGUgaXMgbnVsbAotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5jb2RlVG9GaWxlKGJ5dGVbXSBkYXRhVG9FbmNvZGUsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChkYXRhVG9FbmNvZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJEYXRhIHRvIGVuY29kZSB3YXMgbnVsbC4iKTsKLSAgICAgICAgfSAvLyBlbmQgaWZmCi0KLSAgICAgICAgQmFzZTY0Lk91dHB1dFN0cmVhbSBib3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9zID0gbmV3IEJhc2U2NC5PdXRwdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSksIEJhc2U2NC5FTkNPREUpOwotICAgICAgICAgICAgYm9zLndyaXRlKGRhdGFUb0VuY29kZSk7Ci0gICAgICAgIH0gLy8gZW5kIHRyeQotICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOyAvLyBDYXRjaCBhbmQgdGhyb3cgdG8gZXhlY3V0ZSBmaW5hbGx5e30gYmxvY2sKLSAgICAgICAgfSAvLyBlbmQgY2F0Y2g6IGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShib3MpOwotICAgICAgICB9IC8vIGVuZCBmaW5hbGx5Ci0KLSAgICB9IC8vIGVuZCBlbmNvZGVUb0ZpbGUKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZGVjb2RpbmcgZGF0YSB0byBhIGZpbGUuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQXMgb2YgdiAyLjMsIGlmIHRoZXJlIGlzIGEgZXJyb3IsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbgotICAgICAqIGphdmEuaW8uSU9FeGNlcHRpb24uIDxiPlRoaXMgaXMgbmV3IHRvIHYyLjMhPC9iPiBJbiBlYXJsaWVyIHZlcnNpb25zLCBpdAotICAgICAqIGp1c3QgcmV0dXJuZWQgZmFsc2UsIGJ1dCBpbiByZXRyb3NwZWN0IHRoYXQncyBhIHByZXR0eSBwb29yIHdheSB0byBoYW5kbGUKLSAgICAgKiBpdC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGFUb0RlY29kZQotICAgICAqICAgICAgICAgICAgQmFzZTY0LWVuY29kZWQgZGF0YSBhcyBhIHN0cmluZwotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqICAgICAgICAgICAgRmlsZW5hbWUgZm9yIHNhdmluZyBkZWNvZGVkIGRhdGEKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVjb2RlVG9GaWxlKFN0cmluZyBkYXRhVG9EZWNvZGUsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgICAgIEJhc2U2NC5PdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvcyA9IG5ldyBCYXNlNjQuT3V0cHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpLCBCYXNlNjQuREVDT0RFKTsKLSAgICAgICAgICAgIGJvcy53cml0ZShkYXRhVG9EZWNvZGUuZ2V0Qnl0ZXMoUFJFRkVSUkVEX0VOQ09ESU5HKSk7Ci0gICAgICAgIH0gLy8gZW5kIHRyeQotICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOyAvLyBDYXRjaCBhbmQgdGhyb3cgdG8gZXhlY3V0ZSBmaW5hbGx5e30gYmxvY2sKLSAgICAgICAgfSAvLyBlbmQgY2F0Y2g6IGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShib3MpOwotICAgICAgICB9IC8vIGVuZCBmaW5hbGx5Ci0KLSAgICB9IC8vIGVuZCBkZWNvZGVUb0ZpbGUKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIGJhc2U2NC1lbmNvZGVkIGZpbGUgYW5kIGRlY29kaW5nIGl0LgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIEFzIG9mIHYgMi4zLCBpZiB0aGVyZSBpcyBhIGVycm9yLCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYW4KLSAgICAgKiBqYXZhLmlvLklPRXhjZXB0aW9uLiA8Yj5UaGlzIGlzIG5ldyB0byB2Mi4zITwvYj4gSW4gZWFybGllciB2ZXJzaW9ucywgaXQKLSAgICAgKiBqdXN0IHJldHVybmVkIGZhbHNlLCBidXQgaW4gcmV0cm9zcGVjdCB0aGF0J3MgYSBwcmV0dHkgcG9vciB3YXkgdG8gaGFuZGxlCi0gICAgICogaXQuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqICAgICAgICAgICAgRmlsZW5hbWUgZm9yIHJlYWRpbmcgZW5jb2RlZCBkYXRhCi0gICAgICogQHJldHVybiBkZWNvZGVkIGJ5dGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqIEBzaW5jZSAyLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGVGcm9tRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICBieXRlW10gZGVjb2RlZERhdGEgPSBudWxsOwotICAgICAgICBCYXNlNjQuSW5wdXRTdHJlYW0gYmlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNldCB1cCBzb21lIHVzZWZ1bCB2YXJpYWJsZXMKLSAgICAgICAgICAgIGphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbnVsbDsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICAgICAgaW50IG51bUJ5dGVzID0gMDsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHNpemUgb2YgZmlsZQotICAgICAgICAgICAgaWYgKGZpbGUubGVuZ3RoKCkgPiBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCJGaWxlIGlzIHRvbyBiaWcgZm9yIHRoaXMgY29udmVuaWVuY2UgbWV0aG9kICgiICsgZmlsZS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ5dGVzKS4iKTsKLSAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBmaWxlIHRvbyBiaWcgZm9yIGludCBpbmRleAotICAgICAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbKGludCkgZmlsZS5sZW5ndGgoKV07Ci0KLSAgICAgICAgICAgIC8vIE9wZW4gYSBzdHJlYW0KLSAgICAgICAgICAgIGJpcyA9IG5ldyBCYXNlNjQuSW5wdXRTdHJlYW0obmV3IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZSkpLAotICAgICAgICAgICAgICAgICAgICBCYXNlNjQuREVDT0RFKTsKLQotICAgICAgICAgICAgLy8gUmVhZCB1bnRpbCBkb25lCi0gICAgICAgICAgICB3aGlsZSAoKG51bUJ5dGVzID0gYmlzLnJlYWQoYnVmZmVyLCBsZW5ndGgsIDQwOTYpKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IG51bUJ5dGVzOwotICAgICAgICAgICAgfSAvLyBlbmQgd2hpbGUKLQotICAgICAgICAgICAgLy8gU2F2ZSBpbiBhIHZhcmlhYmxlIHRvIHJldHVybgotICAgICAgICAgICAgZGVjb2RlZERhdGEgPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGRlY29kZWREYXRhLCAwLCBsZW5ndGgpOwotCi0gICAgICAgIH0gLy8gZW5kIHRyeQotICAgICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOyAvLyBDYXRjaCBhbmQgcmVsZWFzZSB0byBleGVjdXRlIGZpbmFsbHl7fQotICAgICAgICB9IC8vIGVuZCBjYXRjaDogamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGJpcyk7Ci0gICAgICAgIH0gLy8gZW5kIGZpbmFsbHkKLQotICAgICAgICByZXR1cm4gZGVjb2RlZERhdGE7Ci0gICAgfSAvLyBlbmQgZGVjb2RlRnJvbUZpbGUKLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIGJpbmFyeSBmaWxlIGFuZCBiYXNlNjQtZW5jb2RpbmcgaXQuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogQXMgb2YgdiAyLjMsIGlmIHRoZXJlIGlzIGEgZXJyb3IsIHRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbgotICAgICAqIGphdmEuaW8uSU9FeGNlcHRpb24uIDxiPlRoaXMgaXMgbmV3IHRvIHYyLjMhPC9iPiBJbiBlYXJsaWVyIHZlcnNpb25zLCBpdAotICAgICAqIGp1c3QgcmV0dXJuZWQgZmFsc2UsIGJ1dCBpbiByZXRyb3NwZWN0IHRoYXQncyBhIHByZXR0eSBwb29yIHdheSB0byBoYW5kbGUKLSAgICAgKiBpdC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVuYW1lCi0gICAgICogICAgICAgICAgICBGaWxlbmFtZSBmb3IgcmVhZGluZyBiaW5hcnkgZGF0YQotICAgICAqIEByZXR1cm4gYmFzZTY0LWVuY29kZWQgc3RyaW5nCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IKLSAgICAgKiBAc2luY2UgMi4xCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlRnJvbUZpbGUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGVuY29kZWREYXRhID0gbnVsbDsKLSAgICAgICAgQmFzZTY0LklucHV0U3RyZWFtIGJpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTZXQgdXAgc29tZSB1c2VmdWwgdmFyaWFibGVzCi0gICAgICAgICAgICBqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUoZmlsZW5hbWUpOwotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW01hdGgubWF4KChpbnQpIChmaWxlLmxlbmd0aCgpICogMS40ICsgMSksIDQwKV07IC8vIE5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNtYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodjIuMi4xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ybmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodjIuMy41KQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBpbnQgbnVtQnl0ZXMgPSAwOwotCi0gICAgICAgICAgICAvLyBPcGVuIGEgc3RyZWFtCi0gICAgICAgICAgICBiaXMgPSBuZXcgQmFzZTY0LklucHV0U3RyZWFtKG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGZpbGUpKSwKLSAgICAgICAgICAgICAgICAgICAgQmFzZTY0LkVOQ09ERSk7Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgdW50aWwgZG9uZQotICAgICAgICAgICAgd2hpbGUgKChudW1CeXRlcyA9IGJpcy5yZWFkKGJ1ZmZlciwgbGVuZ3RoLCA0MDk2KSkgPj0gMCkgewotICAgICAgICAgICAgICAgIGxlbmd0aCArPSBudW1CeXRlczsKLSAgICAgICAgICAgIH0gLy8gZW5kIHdoaWxlCi0KLSAgICAgICAgICAgIC8vIFNhdmUgaW4gYSB2YXJpYWJsZSB0byByZXR1cm4KLSAgICAgICAgICAgIGVuY29kZWREYXRhID0gbmV3IFN0cmluZyhidWZmZXIsIDAsIGxlbmd0aCwgQmFzZTY0LlBSRUZFUlJFRF9FTkNPRElORyk7Ci0KLSAgICAgICAgfSAvLyBlbmQgdHJ5Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7IC8vIENhdGNoIGFuZCByZWxlYXNlIHRvIGV4ZWN1dGUgZmluYWxseXt9Ci0gICAgICAgIH0gLy8gZW5kIGNhdGNoOiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYmlzKTsKLSAgICAgICAgfSAvLyBlbmQgZmluYWxseQotCi0gICAgICAgIHJldHVybiBlbmNvZGVkRGF0YTsKLSAgICB9IC8vIGVuZCBlbmNvZGVGcm9tRmlsZQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgPHR0PmluZmlsZTwvdHQ+IGFuZCBlbmNvZGVzIGl0IHRvIDx0dD5vdXRmaWxlPC90dD4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGluZmlsZQotICAgICAqICAgICAgICAgICAgSW5wdXQgZmlsZQotICAgICAqIEBwYXJhbSBvdXRmaWxlCi0gICAgICogICAgICAgICAgICBPdXRwdXQgZmlsZQotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yCi0gICAgICogQHNpbmNlIDIuMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmNvZGVGaWxlVG9GaWxlKFN0cmluZyBpbmZpbGUsIFN0cmluZyBvdXRmaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGVuY29kZWQgPSBCYXNlNjQuZW5jb2RlRnJvbUZpbGUoaW5maWxlKTsKLSAgICAgICAgamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dCA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0ob3V0ZmlsZSkpOwotICAgICAgICAgICAgb3V0LndyaXRlKGVuY29kZWQuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOyAvLyBTdHJpY3QsIDctYml0IG91dHB1dC4KLSAgICAgICAgfSAvLyBlbmQgdHJ5Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7IC8vIENhdGNoIGFuZCByZWxlYXNlIHRvIGV4ZWN1dGUgZmluYWxseXt9Ci0gICAgICAgIH0gLy8gZW5kIGNhdGNoCi0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkob3V0KTsKLSAgICAgICAgfSAvLyBlbmQgZmluYWxseQotICAgIH0gLy8gZW5kIGVuY29kZUZpbGVUb0ZpbGUKLQotICAgIC8qKgotICAgICAqIFJlYWRzIDx0dD5pbmZpbGU8L3R0PiBhbmQgZGVjb2RlcyBpdCB0byA8dHQ+b3V0ZmlsZTwvdHQ+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbmZpbGUKLSAgICAgKiAgICAgICAgICAgIElucHV0IGZpbGUKLSAgICAgKiBAcGFyYW0gb3V0ZmlsZQotICAgICAqICAgICAgICAgICAgT3V0cHV0IGZpbGUKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvcgotICAgICAqIEBzaW5jZSAyLjIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVjb2RlRmlsZVRvRmlsZShTdHJpbmcgaW5maWxlLCBTdHJpbmcgb3V0ZmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgICAgIGJ5dGVbXSBkZWNvZGVkID0gQmFzZTY0LmRlY29kZUZyb21GaWxlKGluZmlsZSk7Ci0gICAgICAgIGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKG91dGZpbGUpKTsKLSAgICAgICAgICAgIG91dC53cml0ZShkZWNvZGVkKTsKLSAgICAgICAgfSAvLyBlbmQgdHJ5Ci0gICAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7IC8vIENhdGNoIGFuZCByZWxlYXNlIHRvIGV4ZWN1dGUgZmluYWxseXt9Ci0gICAgICAgIH0gLy8gZW5kIGNhdGNoCi0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkob3V0KTsKLSAgICAgICAgfSAvLyBlbmQgZmluYWxseQotICAgIH0gLy8gZW5kIGRlY29kZUZpbGVUb0ZpbGUKLQotICAgIC8qICoqKioqKioqIEkgTiBOIEUgUiBDIEwgQSBTIFMgSSBOIFAgVSBUIFMgVCBSIEUgQSBNICoqKioqKioqICovCi0KLSAgICAvKioKLSAgICAgKiBBIHtAbGluayBCYXNlNjQuSW5wdXRTdHJlYW19IHdpbGwgcmVhZCBkYXRhIGZyb20gYW5vdGhlcgotICAgICAqIDx0dD5qYXZhLmlvLklucHV0U3RyZWFtPC90dD4sIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIGVuY29kZS9kZWNvZGUKLSAgICAgKiB0by9mcm9tIEJhc2U2NCBub3RhdGlvbiBvbiB0aGUgZmx5LgotICAgICAqIAotICAgICAqIEBzZWUgQmFzZTY0Ci0gICAgICogQHNpbmNlIDEuMwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRTdHJlYW0gZXh0ZW5kcyBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtIHsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZW5jb2RlOyAvLyBFbmNvZGluZyBvciBkZWNvZGluZwotICAgICAgICBwcml2YXRlIGludCBwb3NpdGlvbjsgLy8gQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyCi0gICAgICAgIHByaXZhdGUgYnl0ZVtdIGJ1ZmZlcjsgLy8gU21hbGwgYnVmZmVyIGhvbGRpbmcgY29udmVydGVkIGRhdGEKLSAgICAgICAgcHJpdmF0ZSBpbnQgYnVmZmVyTGVuZ3RoOyAvLyBMZW5ndGggb2YgYnVmZmVyICgzIG9yIDQpCi0gICAgICAgIHByaXZhdGUgaW50IG51bVNpZ0J5dGVzOyAvLyBOdW1iZXIgb2YgbWVhbmluZ2Z1bCBieXRlcyBpbiB0aGUgYnVmZmVyCi0gICAgICAgIHByaXZhdGUgaW50IGxpbmVMZW5ndGg7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBicmVha0xpbmVzOyAvLyBCcmVhayBsaW5lcyBhdCBsZXNzIHRoYW4gODAgY2hhcmFjdGVycwotICAgICAgICBwcml2YXRlIGludCBvcHRpb25zOyAvLyBSZWNvcmQgb3B0aW9ucyB1c2VkIHRvIGNyZWF0ZSB0aGUgc3RyZWFtLgotICAgICAgICBwcml2YXRlIGJ5dGVbXSBkZWNvZGFiZXQ7IC8vIExvY2FsIGNvcGllcyB0byBhdm9pZCBleHRyYSBtZXRob2QgY2FsbHMKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIHtAbGluayBCYXNlNjQuSW5wdXRTdHJlYW19IGluIERFQ09ERSBtb2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGluCi0gICAgICAgICAqICAgICAgICAgICAgdGhlIDx0dD5qYXZhLmlvLklucHV0U3RyZWFtPC90dD4gZnJvbSB3aGljaCB0byByZWFkIGRhdGEuCi0gICAgICAgICAqIEBzaW5jZSAxLjMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgICAgICB0aGlzKGluLCBERUNPREUpOwotICAgICAgICB9IC8vIGVuZCBjb25zdHJ1Y3RvcgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RzIGEge0BsaW5rIEJhc2U2NC5JbnB1dFN0cmVhbX0gaW4gZWl0aGVyIEVOQ09ERSBvciBERUNPREUKLSAgICAgICAgICogbW9kZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFZhbGlkIG9wdGlvbnM6Ci0gICAgICAgICAqIAotICAgICAgICAgKiA8cHJlPgotICAgICAgICAgKiAgIEVOQ09ERSBvciBERUNPREU6IEVuY29kZSBvciBEZWNvZGUgYXMgZGF0YSBpcyByZWFkLgotICAgICAgICAgKiAgIERPX0JSRUFLX0xJTkVTOiBicmVhayBsaW5lcyBhdCA3NiBjaGFyYWN0ZXJzCi0gICAgICAgICAqICAgICAob25seSBtZWFuaW5nZnVsIHdoZW4gZW5jb2RpbmcpPC9pPgotICAgICAgICAgKiA8L3ByZT4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEV4YW1wbGU6IDxjb2RlPm5ldyBCYXNlNjQuSW5wdXRTdHJlYW0oIGluLCBCYXNlNjQuREVDT0RFICk8L2NvZGU+Ci0gICAgICAgICAqIAotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGluCi0gICAgICAgICAqICAgICAgICAgICAgdGhlIDx0dD5qYXZhLmlvLklucHV0U3RyZWFtPC90dD4gZnJvbSB3aGljaCB0byByZWFkIGRhdGEuCi0gICAgICAgICAqIEBwYXJhbSBvcHRpb25zCi0gICAgICAgICAqICAgICAgICAgICAgU3BlY2lmaWVkIG9wdGlvbnMKLSAgICAgICAgICogQHNlZSBCYXNlNjQjRU5DT0RFCi0gICAgICAgICAqIEBzZWUgQmFzZTY0I0RFQ09ERQotICAgICAgICAgKiBAc2VlIEJhc2U2NCNET19CUkVBS19MSU5FUwotICAgICAgICAgKiBAc2luY2UgMi4wCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG9wdGlvbnMpIHsKLQotICAgICAgICAgICAgc3VwZXIoaW4pOwotICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsgLy8gUmVjb3JkIGZvciBsYXRlcgotICAgICAgICAgICAgdGhpcy5icmVha0xpbmVzID0gKG9wdGlvbnMgJiBET19CUkVBS19MSU5FUykgPiAwOwotICAgICAgICAgICAgdGhpcy5lbmNvZGUgPSAob3B0aW9ucyAmIEVOQ09ERSkgPiAwOwotICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmNvZGUgPyA0IDogMzsKLSAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyTGVuZ3RoXTsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAtMTsKLSAgICAgICAgICAgIHRoaXMubGluZUxlbmd0aCA9IDA7Ci0gICAgICAgICAgICB0aGlzLmRlY29kYWJldCA9IGdldERlY29kYWJldChvcHRpb25zKTsKLSAgICAgICAgfSAvLyBlbmQgY29uc3RydWN0b3IKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZHMgZW5vdWdoIG9mIHRoZSBpbnB1dCBzdHJlYW0gdG8gY29udmVydCB0by9mcm9tIEJhc2U2NCBhbmQKLSAgICAgICAgICogcmV0dXJucyB0aGUgbmV4dCBieXRlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBuZXh0IGJ5dGUKLSAgICAgICAgICogQHNpbmNlIDEuMwotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBnZXQgZGF0YT8KLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZW5jb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiMyA9IG5ldyBieXRlWzNdOwotICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQmluYXJ5Qnl0ZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBpbi5yZWFkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVuZCBvZiBzdHJlYW0sIGIgaXMgLTEuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYjNbaV0gPSAoYnl0ZSkgYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaW5hcnlCeXRlcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gb3V0IG9mIGZvciBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlOiBlbmQgb2Ygc3RyZWFtCi0KLSAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZm9yOiBlYWNoIG5lZWRlZCBpbnB1dCBieXRlCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bUJpbmFyeUJ5dGVzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlM3RvNChiMywgMCwgbnVtQmluYXJ5Qnl0ZXMsIGJ1ZmZlciwgMCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1TaWdCeXRlcyA9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBnb3QgZGF0YQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gTXVzdCBiZSBlbmQgb2Ygc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2UKLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZjogZW5jb2RpbmcKLQotICAgICAgICAgICAgICAgIC8vIEVsc2UgZGVjb2RpbmcKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGI0ID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBmb3VyICJtZWFuaW5nZnVsIiBieXRlczoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gaW4ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYiA+PSAwICYmIGRlY29kYWJldFtiICYgMHg3Zl0gPD0gV0hJVEVfU1BBQ0VfRU5DKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFJlYWRzIGEgLTEgaWYgZW5kIG9mIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGVuZCBvZiBzdHJlYW0KLQotICAgICAgICAgICAgICAgICAgICAgICAgYjRbaV0gPSAoYnl0ZSkgYjsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZm9yOiBlYWNoIG5lZWRlZCBpbnB1dCBieXRlCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2lnQnl0ZXMgPSBkZWNvZGU0dG8zKGI0LCAwLCBidWZmZXIsIDAsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZjogZ290IGZvdXIgY2hhcmFjdGVycwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZWxzZSBpZjogYWxzbyBwYWRkZWQgY29ycmVjdGx5Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVzdCBoYXZlIGJyb2tlbiBvdXQgZnJvbSBhYm92ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCJJbXByb3Blcmx5IHBhZGRlZCBCYXNlNjQgaW5wdXQuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kCi0KLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlOiBkZWNvZGUKLSAgICAgICAgICAgIH0gLy8gZW5kIGVsc2U6IGdldCBkYXRhCi0KLSAgICAgICAgICAgIC8vIEdvdCBkYXRhPwotICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBFbmQgb2YgcmVsZXZhbnQgZGF0YT8KLSAgICAgICAgICAgICAgICBpZiAoIC8qICFlbmNvZGUgJiYgKi9wb3NpdGlvbiA+PSBudW1TaWdCeXRlcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGdvdCBkYXRhCi0KLSAgICAgICAgICAgICAgICBpZiAoZW5jb2RlICYmIGJyZWFrTGluZXMgJiYgbGluZUxlbmd0aCA+PSBNQVhfTElORV9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZUxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAnXG4nOwotICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmCi0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVMZW5ndGgrKzsgLy8gVGhpcyBpc24ndCBpbXBvcnRhbnQgd2hlbiBkZWNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aHJvd2luZyBhbiBleHRyYSAiaWYiIHNlZW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhcyB3YXN0ZWZ1bC4KLQotICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGJ1ZmZlcltwb3NpdGlvbisrXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gYnVmZmVyTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IC0xOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZjogZW5kCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgJiAweEZGOyAvLyBUaGlzIGlzIGhvdyB5b3UgImNhc3QiIGEgYnl0ZSB0aGF0J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlbmRlZCB0byBiZSB1bnNpZ25lZC4KLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlCi0gICAgICAgICAgICB9IC8vIGVuZCBpZjogcG9zaXRpb24gPj0gMAotCi0gICAgICAgICAgICAvLyBFbHNlIGVycm9yCi0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiRXJyb3IgaW4gQmFzZTY0IGNvZGUgcmVhZGluZyBzdHJlYW0uIik7Ci0gICAgICAgICAgICB9IC8vIGVuZCBlbHNlCi0gICAgICAgIH0gLy8gZW5kIHJlYWQKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbHMge0BsaW5rICNyZWFkKCl9IHJlcGVhdGVkbHkgdW50aWwgdGhlIGVuZCBvZiBzdHJlYW0gaXMgcmVhY2hlZAotICAgICAgICAgKiBvciA8dmFyPmxlbjwvdmFyPiBieXRlcyBhcmUgcmVhZC4gUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvCi0gICAgICAgICAqIGFycmF5IG9yIC0xIGlmIGVuZCBvZiBzdHJlYW0gaXMgZW5jb3VudGVyZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZGVzdAotICAgICAgICAgKiAgICAgICAgICAgIGFycmF5IHRvIGhvbGQgdmFsdWVzCi0gICAgICAgICAqIEBwYXJhbSBvZmYKLSAgICAgICAgICogICAgICAgICAgICBvZmZzZXQgZm9yIGFycmF5Ci0gICAgICAgICAqIEBwYXJhbSBsZW4KLSAgICAgICAgICogICAgICAgICAgICBtYXggbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaW50byBhcnJheQotICAgICAgICAgKiBAcmV0dXJuIGJ5dGVzIHJlYWQgaW50byBhcnJheSBvciAtMSBpZiBlbmQgb2Ygc3RyZWFtIGlzIGVuY291bnRlcmVkLgotICAgICAgICAgKiBAc2luY2UgMS4zCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBkZXN0LCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGludCBiOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYiA9IHJlYWQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChiID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdFtvZmYgKyBpXSA9IChieXRlKSBiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gT3V0IG9mICdmb3InIGxvb3AKLSAgICAgICAgICAgICAgICB9IC8vIE91dCBvZiAnZm9yJyBsb29wCi0gICAgICAgICAgICB9IC8vIGVuZCBmb3I6IGVhY2ggYnl0ZSByZWFkCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfSAvLyBlbmQgcmVhZAotCi0gICAgfSAvLyBlbmQgaW5uZXIgY2xhc3MgSW5wdXRTdHJlYW0KLQotICAgIC8qICoqKioqKioqIEkgTiBOIEUgUiBDIEwgQSBTIFMgTyBVIFQgUCBVIFQgUyBUIFIgRSBBIE0gKioqKioqKiogKi8KLQotICAgIC8qKgotICAgICAqIEEge0BsaW5rIEJhc2U2NC5PdXRwdXRTdHJlYW19IHdpbGwgd3JpdGUgZGF0YSB0byBhbm90aGVyCi0gICAgICogPHR0PmphdmEuaW8uT3V0cHV0U3RyZWFtPC90dD4sIGdpdmVuIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kCi0gICAgICogZW5jb2RlL2RlY29kZSB0by9mcm9tIEJhc2U2NCBub3RhdGlvbiBvbiB0aGUgZmx5LgotICAgICAqIAotICAgICAqIEBzZWUgQmFzZTY0Ci0gICAgICogQHNpbmNlIDEuMwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3V0cHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW0gewotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGU7Ci0gICAgICAgIHByaXZhdGUgaW50IHBvc2l0aW9uOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBidWZmZXI7Ci0gICAgICAgIHByaXZhdGUgaW50IGJ1ZmZlckxlbmd0aDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbGluZUxlbmd0aDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGJyZWFrTGluZXM7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIGI0OyAvLyBTY3JhdGNoIHVzZWQgaW4gYSBmZXcgcGxhY2VzCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzdXNwZW5kRW5jb2Rpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG9wdGlvbnM7IC8vIFJlY29yZCBmb3IgbGF0ZXIKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gZGVjb2RhYmV0OyAvLyBMb2NhbCBjb3BpZXMgdG8gYXZvaWQgZXh0cmEgbWV0aG9kIGNhbGxzCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdHMgYSB7QGxpbmsgQmFzZTY0Lk91dHB1dFN0cmVhbX0gaW4gRU5DT0RFIG1vZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICAgICAqICAgICAgICAgICAgdGhlIDx0dD5qYXZhLmlvLk91dHB1dFN0cmVhbTwvdHQ+IHRvIHdoaWNoIGRhdGEgd2lsbCBiZQotICAgICAgICAgKiAgICAgICAgICAgIHdyaXR0ZW4uCi0gICAgICAgICAqIEBzaW5jZSAxLjMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0KSB7Ci0gICAgICAgICAgICB0aGlzKG91dCwgRU5DT0RFKTsKLSAgICAgICAgfSAvLyBlbmQgY29uc3RydWN0b3IKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhIHtAbGluayBCYXNlNjQuT3V0cHV0U3RyZWFtfSBpbiBlaXRoZXIgRU5DT0RFIG9yIERFQ09ERQotICAgICAgICAgKiBtb2RlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVmFsaWQgb3B0aW9uczoKLSAgICAgICAgICogCi0gICAgICAgICAqIDxwcmU+Ci0gICAgICAgICAqICAgRU5DT0RFIG9yIERFQ09ERTogRW5jb2RlIG9yIERlY29kZSBhcyBkYXRhIGlzIHJlYWQuCi0gICAgICAgICAqICAgRE9fQlJFQUtfTElORVM6IGRvbid0IGJyZWFrIGxpbmVzIGF0IDc2IGNoYXJhY3RlcnMKLSAgICAgICAgICogICAgIChvbmx5IG1lYW5pbmdmdWwgd2hlbiBlbmNvZGluZyk8L2k+Ci0gICAgICAgICAqIDwvcHJlPgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogRXhhbXBsZTogPGNvZGU+bmV3IEJhc2U2NC5PdXRwdXRTdHJlYW0oIG91dCwgQmFzZTY0LkVOQ09ERSApPC9jb2RlPgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIG91dAotICAgICAgICAgKiAgICAgICAgICAgIHRoZSA8dHQ+amF2YS5pby5PdXRwdXRTdHJlYW08L3R0PiB0byB3aGljaCBkYXRhIHdpbGwgYmUKLSAgICAgICAgICogICAgICAgICAgICB3cml0dGVuLgotICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAgICAgKiAgICAgICAgICAgIFNwZWNpZmllZCBvcHRpb25zLgotICAgICAgICAgKiBAc2VlIEJhc2U2NCNFTkNPREUKLSAgICAgICAgICogQHNlZSBCYXNlNjQjREVDT0RFCi0gICAgICAgICAqIEBzZWUgQmFzZTY0I0RPX0JSRUFLX0xJTkVTCi0gICAgICAgICAqIEBzaW5jZSAxLjMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0oamF2YS5pby5PdXRwdXRTdHJlYW0gb3V0LCBpbnQgb3B0aW9ucykgewotICAgICAgICAgICAgc3VwZXIob3V0KTsKLSAgICAgICAgICAgIHRoaXMuYnJlYWtMaW5lcyA9IChvcHRpb25zICYgRE9fQlJFQUtfTElORVMpICE9IDA7Ci0gICAgICAgICAgICB0aGlzLmVuY29kZSA9IChvcHRpb25zICYgRU5DT0RFKSAhPSAwOwotICAgICAgICAgICAgdGhpcy5idWZmZXJMZW5ndGggPSBlbmNvZGUgPyAzIDogNDsKLSAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyTGVuZ3RoXTsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAwOwotICAgICAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIHRoaXMuc3VzcGVuZEVuY29kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB0aGlzLmI0ID0gbmV3IGJ5dGVbNF07Ci0gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotICAgICAgICAgICAgdGhpcy5kZWNvZGFiZXQgPSBnZXREZWNvZGFiZXQob3B0aW9ucyk7Ci0gICAgICAgIH0gLy8gZW5kIGNvbnN0cnVjdG9yCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlcyB0aGUgYnl0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBjb252ZXJ0aW5nIHRvL2Zyb20gQmFzZTY0Ci0gICAgICAgICAqIG5vdGF0aW9uLiBXaGVuIGVuY29kaW5nLCBieXRlcyBhcmUgYnVmZmVyZWQgdGhyZWUgYXQgYSB0aW1lIGJlZm9yZQotICAgICAgICAgKiB0aGUgb3V0cHV0IHN0cmVhbSBhY3R1YWxseSBnZXRzIGEgd3JpdGUoKSBjYWxsLiBXaGVuIGRlY29kaW5nLCBieXRlcwotICAgICAgICAgKiBhcmUgYnVmZmVyZWQgZm91ciBhdCBhIHRpbWUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdGhlQnl0ZQotICAgICAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIHRvIHdyaXRlCi0gICAgICAgICAqIEBzaW5jZSAxLjMKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgdGhlQnl0ZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgICAgLy8gRW5jb2Rpbmcgc3VzcGVuZGVkPwotICAgICAgICAgICAgaWYgKHN1c3BlbmRFbmNvZGluZykgewotICAgICAgICAgICAgICAgIHRoaXMub3V0LndyaXRlKHRoZUJ5dGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBzdXBzZW5kZWQKLQotICAgICAgICAgICAgLy8gRW5jb2RlPwotICAgICAgICAgICAgaWYgKGVuY29kZSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSB0aGVCeXRlOwotICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBidWZmZXJMZW5ndGgpIHsgLy8gRW5vdWdoIHRvIGVuY29kZS4KLQotICAgICAgICAgICAgICAgICAgICB0aGlzLm91dC53cml0ZShlbmNvZGUzdG80KGI0LCBidWZmZXIsIGJ1ZmZlckxlbmd0aCwgb3B0aW9ucykpOwotCi0gICAgICAgICAgICAgICAgICAgIGxpbmVMZW5ndGggKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyZWFrTGluZXMgJiYgbGluZUxlbmd0aCA+PSBNQVhfTElORV9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0LndyaXRlKE5FV19MSU5FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZjogZW5kIG9mIGxpbmUKLQotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGVub3VnaCB0byBvdXRwdXQKLSAgICAgICAgICAgIH0gLy8gZW5kIGlmOiBlbmNvZGluZwotCi0gICAgICAgICAgICAvLyBFbHNlLCBEZWNvZGluZwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTWVhbmluZ2Z1bCBCYXNlNjQgY2hhcmFjdGVyPwotICAgICAgICAgICAgICAgIGlmIChkZWNvZGFiZXRbdGhlQnl0ZSAmIDB4N2ZdID4gV0hJVEVfU1BBQ0VfRU5DKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSB0aGVCeXRlOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gYnVmZmVyTGVuZ3RoKSB7IC8vIEVub3VnaCB0byBvdXRwdXQuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBCYXNlNjQuZGVjb2RlNHRvMyhidWZmZXIsIDAsIGI0LCAwLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShiNCwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGVub3VnaCB0byBvdXRwdXQKLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZjogbWVhbmluZ2Z1bCBiYXNlNjQgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVjb2RhYmV0W3RoZUJ5dGUgJiAweDdmXSAhPSBXSElURV9TUEFDRV9FTkMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkludmFsaWQgY2hhcmFjdGVyIGluIEJhc2U2NCBkYXRhLiIpOwotICAgICAgICAgICAgICAgIH0gLy8gZW5kIGVsc2U6IG5vdCB3aGl0ZSBzcGFjZSBlaXRoZXIKLSAgICAgICAgICAgIH0gLy8gZW5kIGVsc2U6IGRlY29kaW5nCi0gICAgICAgIH0gLy8gZW5kIHdyaXRlCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxzIHtAbGluayAjd3JpdGUoaW50KX0gcmVwZWF0ZWRseSB1bnRpbCA8dmFyPmxlbjwvdmFyPiBieXRlcyBhcmUKLSAgICAgICAgICogd3JpdHRlbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSB0aGVCeXRlcwotICAgICAgICAgKiAgICAgICAgICAgIGFycmF5IGZyb20gd2hpY2ggdG8gcmVhZCBieXRlcwotICAgICAgICAgKiBAcGFyYW0gb2ZmCi0gICAgICAgICAqICAgICAgICAgICAgb2Zmc2V0IGZvciBhcnJheQotICAgICAgICAgKiBAcGFyYW0gbGVuCi0gICAgICAgICAqICAgICAgICAgICAgbWF4IG51bWJlciBvZiBieXRlcyB0byByZWFkIGludG8gYXJyYXkKLSAgICAgICAgICogQHNpbmNlIDEuMwotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSB0aGVCeXRlcywgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgICAgLy8gRW5jb2Rpbmcgc3VzcGVuZGVkPwotICAgICAgICAgICAgaWYgKHN1c3BlbmRFbmNvZGluZykgewotICAgICAgICAgICAgICAgIHRoaXMub3V0LndyaXRlKHRoZUJ5dGVzLCBvZmYsIGxlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSAvLyBlbmQgaWY6IHN1cHNlbmRlZAotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGUodGhlQnl0ZXNbb2ZmICsgaV0pOwotICAgICAgICAgICAgfSAvLyBlbmQgZm9yOiBlYWNoIGJ5dGUgd3JpdHRlbgotCi0gICAgICAgIH0gLy8gZW5kIHdyaXRlCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1ldGhvZCBhZGRlZCBieSBQSElMLiBbVGhhbmtzLCBQSElMLiAtUm9iXSBUaGlzIHBhZHMgdGhlIGJ1ZmZlcgotICAgICAgICAgKiB3aXRob3V0IGNsb3NpbmcgdGhlIHN0cmVhbS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAgICAgKiAgICAgICAgICAgICBpZiB0aGVyZSdzIGFuIGVycm9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZmx1c2hCYXNlNjQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVuY29kZSkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZW5jb2RlM3RvNChiNCwgYnVmZmVyLCBwb3NpdGlvbiwgb3B0aW9ucykpOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGVuY29kaW5nCi0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCJCYXNlNjQgaW5wdXQgbm90IHByb3Blcmx5IHBhZGRlZC4iKTsKLSAgICAgICAgICAgICAgICB9IC8vIGVuZCBlbHNlOiBkZWNvZGluZwotICAgICAgICAgICAgfSAvLyBlbmQgaWY6IGJ1ZmZlciBwYXJ0aWFsbHkgZnVsbAotCi0gICAgICAgIH0gLy8gZW5kIGZsdXNoCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZsdXNoZXMgYW5kIGNsb3NlcyAoSSB0aGluaywgaW4gdGhlIHN1cGVyY2xhc3MpIHRoZSBzdHJlYW0uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2luY2UgMS4zCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyAxLiBFbnN1cmUgdGhhdCBwZW5kaW5nIGNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4KLSAgICAgICAgICAgIGZsdXNoQmFzZTY0KCk7Ci0KLSAgICAgICAgICAgIC8vIDIuIEFjdHVhbGx5IGNsb3NlIHRoZSBzdHJlYW0KLSAgICAgICAgICAgIC8vIEJhc2UgY2xhc3MgYm90aCBmbHVzaGVzIGFuZCBjbG9zZXMuCi0gICAgICAgICAgICBzdXBlci5jbG9zZSgpOwotCi0gICAgICAgICAgICBidWZmZXIgPSBudWxsOwotICAgICAgICAgICAgb3V0ID0gbnVsbDsKLSAgICAgICAgfSAvLyBlbmQgY2xvc2UKLQotICAgICAgICAvKioKLSAgICAgICAgICogU3VzcGVuZHMgZW5jb2Rpbmcgb2YgdGhlIHN0cmVhbS4gTWF5IGJlIGhlbHBmdWwgaWYgeW91IG5lZWQgdG8gZW1iZWQKLSAgICAgICAgICogYSBwaWVjZSBvZiBiYXNlNjQtZW5jb2RlZCBkYXRhIGluIGEgc3RyZWFtLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICAgICAqICAgICAgICAgICAgIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZmx1c2hpbmcKLSAgICAgICAgICogQHNpbmNlIDEuNS4xCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdXNwZW5kRW5jb2RpbmcoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmbHVzaEJhc2U2NCgpOwotICAgICAgICAgICAgdGhpcy5zdXNwZW5kRW5jb2RpbmcgPSB0cnVlOwotICAgICAgICB9IC8vIGVuZCBzdXNwZW5kRW5jb2RpbmcKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVzdW1lcyBlbmNvZGluZyBvZiB0aGUgc3RyZWFtLiBNYXkgYmUgaGVscGZ1bCBpZiB5b3UgbmVlZCB0byBlbWJlZCBhCi0gICAgICAgICAqIHBpZWNlIG9mIGJhc2U2NC1lbmNvZGVkIGRhdGEgaW4gYSBzdHJlYW0uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2luY2UgMS41LjEKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc3VtZUVuY29kaW5nKCkgewotICAgICAgICAgICAgdGhpcy5zdXNwZW5kRW5jb2RpbmcgPSBmYWxzZTsKLSAgICAgICAgfSAvLyBlbmQgcmVzdW1lRW5jb2RpbmcKLQotICAgIH0gLy8gZW5kIGlubmVyIGNsYXNzIE91dHB1dFN0cmVhbQotCi19IC8vIGVuZCBjbGFzcyBCYXNlNjQKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvQ2xhc3NMb2FkZXJVdGlsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0NsYXNzTG9hZGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmJjMjAzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvQ2xhc3NMb2FkZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xhc3NMb2FkZXJVdGlsIHsKLQotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXJVdGlsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgY2xhc3MuIElmIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBpcyBzZXQsIGl0IGlzIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzc0xvYWRlciBjY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAoY2NsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2FkQ2xhc3MoY2xhc3NOYW1lLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9hZENsYXNzKGNsYXNzTmFtZSwgY2NsKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmYpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2FkQ2xhc3MoY2xhc3NOYW1lLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0NtaXNFbnVtSGVscGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0NtaXNFbnVtSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MmQ3NDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9DbWlzRW51bUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDaGFuZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUpvaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5T3JkZXJCeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlSZW5kaXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DaGFuZ2VUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Db250ZW50U3RyZWFtQWxsb3dlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRlY2ltYWxQcmVjaXNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlN1cHBvcnRlZFBlcm1pc3Npb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyB0byB0dXJuIGEgdmFsdWUgaW50byBhIENNSVMgZW51bS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENtaXNFbnVtSGVscGVyIHsKLQotICAgIHByaXZhdGUgQ21pc0VudW1IZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIEVudW08Pz4+IEUgZnJvbVZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSwgZmluYWwgQ2xhc3M8RT4gY2xhenopIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKEFjdGlvbi5jbGFzcyA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiAoRSkgQWN0aW9uLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2VUeXBlSWQuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIEJhc2VUeXBlSWQuZnJvbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ21pc1ZlcnNpb24uY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIENtaXNWZXJzaW9uLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzID09IGNsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFKSBJbmNsdWRlUmVsYXRpb25zaGlwcy5mcm9tVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChSZXR1cm5WZXJzaW9uLmNsYXNzID09IGNsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFKSBSZXR1cm5WZXJzaW9uLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFZlcnNpb25pbmdTdGF0ZS5jbGFzcyA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiAoRSkgVmVyc2lvbmluZ1N0YXRlLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFJlbGF0aW9uc2hpcERpcmVjdGlvbi5jbGFzcyA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiAoRSkgUmVsYXRpb25zaGlwRGlyZWN0aW9uLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEFjbFByb3BhZ2F0aW9uLmNsYXNzID09IGNsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFKSBBY2xQcm9wYWdhdGlvbi5mcm9tVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChVbmZpbGVPYmplY3QuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIFVuZmlsZU9iamVjdC5mcm9tVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChQcm9wZXJ0eVR5cGUuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIFByb3BlcnR5VHlwZS5mcm9tVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDYXJkaW5hbGl0eS5jbGFzcyA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiAoRSkgQ2FyZGluYWxpdHkuZnJvbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVXBkYXRhYmlsaXR5LmNsYXNzID09IGNsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFKSBVcGRhdGFiaWxpdHkuZnJvbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29udGVudFN0cmVhbUFsbG93ZWQuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIENvbnRlbnRTdHJlYW1BbGxvd2VkLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKERhdGVUaW1lUmVzb2x1dGlvbi5jbGFzcyA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiAoRSkgRGF0ZVRpbWVSZXNvbHV0aW9uLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENoYW5nZVR5cGUuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIENoYW5nZVR5cGUuZnJvbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU3VwcG9ydGVkUGVybWlzc2lvbnMuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIFN1cHBvcnRlZFBlcm1pc3Npb25zLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENhcGFiaWxpdHlBY2wuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIENhcGFiaWxpdHlBY2wuZnJvbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ2FwYWJpbGl0eUNoYW5nZXMuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIENhcGFiaWxpdHlDaGFuZ2VzLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcy5jbGFzcyA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiAoRSkgQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENhcGFiaWxpdHlKb2luLmNsYXNzID09IGNsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFKSBDYXBhYmlsaXR5Sm9pbi5mcm9tVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDYXBhYmlsaXR5T3JkZXJCeS5jbGFzcyA9PSBjbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiAoRSkgQ2FwYWJpbGl0eU9yZGVyQnkuZnJvbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ2FwYWJpbGl0eVF1ZXJ5LmNsYXNzID09IGNsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFKSBDYXBhYmlsaXR5UXVlcnkuZnJvbVZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ2FwYWJpbGl0eVJlbmRpdGlvbnMuY2xhc3MgPT0gY2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEUpIENhcGFiaWxpdHlSZW5kaXRpb25zLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBlbnVtIHZhbHVlICciICsgdmFsdWUgKyAiJyEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihjbGF6ei5nZXRTaW1wbGVOYW1lKCkgKyAiIGlzIG5vdCBhIENNSVMgZW51bSEiKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgRW51bTw/Pj4gRSBmcm9tVmFsdWUoZmluYWwgQmlnSW50ZWdlciB2YWx1ZSwgZmluYWwgQ2xhc3M8RT4gY2xhenopIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChEZWNpbWFsUHJlY2lzaW9uLmNsYXNzID09IGNsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFKSBEZWNpbWFsUHJlY2lzaW9uLmZyb21WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBlbnVtIHZhbHVlICciICsgdmFsdWUgKyAiJyEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihjbGF6ei5nZXRTaW1wbGVOYW1lKCkgKyAiIGlzIG5vdCBhIENNSVMgZW51bSEiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0NvbGxlY3Rpb25zSGVscGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0NvbGxlY3Rpb25zSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmIwZjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9Db2xsZWN0aW9uc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uc0hlbHBlciB7Ci0KLSAgICBwcml2YXRlIENvbGxlY3Rpb25zSGVscGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vdEVtcHR5KENvbGxlY3Rpb248Pz4gY29sKSB7Ci0gICAgICAgIHJldHVybiBjb2wgIT0gbnVsbCAmJiAhY29sLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOb3RFbXB0eShNYXA8PywgPz4gbWFwKSB7Ci0gICAgICAgIHJldHVybiBtYXAgIT0gbnVsbCAmJiAhbWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShDb2xsZWN0aW9uPD8+IGNvbCkgewotICAgICAgICByZXR1cm4gY29sID09IG51bGwgfHwgY29sLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsT3JFbXB0eShNYXA8PywgPz4gbWFwKSB7Ci0gICAgICAgIHJldHVybiBtYXAgPT0gbnVsbCB8fCBtYXAuaXNFbXB0eSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvQ29uc3RhbnRzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBmMjUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIENNSVMgc2VydmVyIGFuZCBjbGllbnQuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuQXZvaWREdXBsaWNhdGVMaXRlcmFscyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb25zdGFudHMoKSB7Ci0gICAgfQotCi0gICAgLy8gbWVkaWEgdHlwZXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQVRZUEVfU0VSVklDRSA9ICJhcHBsaWNhdGlvbi9hdG9tc3ZjK3htbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFUWVBFX0ZFRUQgPSAiYXBwbGljYXRpb24vYXRvbSt4bWw7dHlwZT1mZWVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQVRZUEVfRU5UUlkgPSAiYXBwbGljYXRpb24vYXRvbSt4bWw7dHlwZT1lbnRyeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFUWVBFX0NISUxEUkVOID0gTUVESUFUWVBFX0ZFRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFUWVBFX0RFU0NFTkRBTlRTID0gImFwcGxpY2F0aW9uL2NtaXN0cmVlK3htbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFUWVBFX1FVRVJZID0gImFwcGxpY2F0aW9uL2NtaXNxdWVyeSt4bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBVFlQRV9BTExPV0FCTEVBQ1RJT04gPSAiYXBwbGljYXRpb24vY21pc2FsbG93YWJsZWFjdGlvbnMreG1sIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQVRZUEVfQUNMID0gImFwcGxpY2F0aW9uL2NtaXNhY2wreG1sIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQVRZUEVfQ01JU0FUT00gPSAiYXBwbGljYXRpb24vY21pc2F0b20reG1sIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQVRZUEVfT0NURVRTVFJFQU0gPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKLQotICAgIC8vIGNvbGxlY3Rpb25zCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9ST09UID0gInJvb3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fVFlQRVMgPSAidHlwZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fUVVFUlkgPSAicXVlcnkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fQ0hFQ0tFRE9VVCA9ICJjaGVja2Vkb3V0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX1VORklMRUQgPSAidW5maWxlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9CVUxLX1VQREFURSA9ICJ1cGRhdGUiOwotCi0gICAgLy8gVVJJIHRlbXBsYXRlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX09CSkVDVF9CWV9JRCA9ICJvYmplY3RieWlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9PQkpFQ1RfQllfUEFUSCA9ICJvYmplY3RieXBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1RZUEVfQllfSUQgPSAidHlwZWJ5aWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1FVRVJZID0gInF1ZXJ5IjsKLQotICAgIC8vIExpbmsgcmVsCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1NFTEYgPSAic2VsZiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0VOQ0xPU1VSRSA9ICJlbmNsb3N1cmUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9TRVJWSUNFID0gInNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9ERVNDUklCRURCWSA9ICJkZXNjcmliZWRieSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0FMVEVSTkFURSA9ICJhbHRlcm5hdGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9ET1dOID0gImRvd24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9VUCA9ICJ1cCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0ZJUlNUID0gImZpcnN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfTEFTVCA9ICJsYXN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUFJFViA9ICJwcmV2aW91cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX05FWFQgPSAibmV4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1ZJQSA9ICJ2aWEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9FRElUID0gImVkaXQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9FRElUTUVESUEgPSAiZWRpdC1tZWRpYSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1ZFUlNJT05ISVNUT1JZID0gInZlcnNpb24taGlzdG9yeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0NVUlJFTlRWRVJTSU9OID0gImN1cnJlbnQtdmVyc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1dPUktJTkdDT1BZID0gIndvcmtpbmctY29weSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0ZPTERFUlRSRUUgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9mb2xkZXJ0cmVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfQUxMT1dBQkxFQUNUSU9OUyA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FsbG93YWJsZWFjdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9BQ0wgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hY2wiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9TT1VSQ0UgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9zb3VyY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9UQVJHRVQgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC90YXJnZXQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1JFTEFUSU9OU0hJUFMgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9yZWxhdGlvbnNoaXBzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUE9MSUNJRVMgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9wb2xpY2llcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBfUkVMX1RZUEVERVNDID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvdHlwZWRlc2NlbmRhbnRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBfUkVMX0ZPTERFUlRSRUUgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9mb2xkZXJ0cmVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBfUkVMX1JPT1RERVNDID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvcm9vdGRlc2NlbmRhbnRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBfUkVMX0NIQU5HRVMgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9jaGFuZ2VzIjsKLQotICAgIC8vIGJyb3dzZXIgYmluZGluZyBzZWxlY3RvcnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9MQVNUX1JFU1VMVCA9ICJsYXN0UmVzdWx0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9SRVBPU0lUT1JZX0lORk8gPSAicmVwb3NpdG9yeUluZm8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVE9SX1RZUEVfQ0hJTERSRU4gPSAidHlwZUNoaWxkcmVuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9UWVBFX0RFU0NFTkRBTlRTID0gInR5cGVEZXNjZW5kYW50cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfVFlQRV9ERUZJTklUSU9OID0gInR5cGVEZWZpbml0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9DT05URU5UID0gImNvbnRlbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVE9SX09CSkVDVCA9ICJvYmplY3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVE9SX1BST1BFUlRJRVMgPSAicHJvcGVydGllcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfQUxMT1dBQkxFQUNUSU9OUyA9ICJhbGxvd2FibGVBY3Rpb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9SRU5ESVRJT05TID0gInJlbmRpdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVE9SX0NISUxEUkVOID0gImNoaWxkcmVuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9ERVNDRU5EQU5UUyA9ICJkZXNjZW5kYW50cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfUEFSRU5UUyA9ICJwYXJlbnRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9QQVJFTlQgPSAicGFyZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9GT0xERVJfVFJFRSA9ICJmb2xkZXJUcmVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9RVUVSWSA9ICJxdWVyeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfVkVSU0lPTlMgPSAidmVyc2lvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVE9SX1JFTEFUSU9OU0hJUFMgPSAicmVsYXRpb25zaGlwcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfQ0hFQ0tFRE9VVCA9ICJjaGVja2Vkb3V0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RPUl9QT0xJQ0lFUyA9ICJwb2xpY2llcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfQUNMID0gImFjbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUT1JfQ09OVEVOVF9DSEFOR0VTID0gImNvbnRlbnRDaGFuZ2VzIjsKLQotICAgIC8vIGJyb3dzZXIgYmluZGluZyBhY3Rpb25zCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9DUkVBVEVfVFlQRSA9ICJjcmVhdGVUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX1VQREFURV9UWVBFID0gInVwZGF0ZVR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNBQ1RJT05fREVMRVRFX1RZUEUgPSAiZGVsZXRlVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9DUkVBVEVfRE9DVU1FTlQgPSAiY3JlYXRlRG9jdW1lbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNBQ1RJT05fQ1JFQVRFX0RPQ1VNRU5UX0ZST01fU09VUkNFID0gImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9DUkVBVEVfRk9MREVSID0gImNyZWF0ZUZvbGRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9DUkVBVEVfUkVMQVRJT05TSElQID0gImNyZWF0ZVJlbGF0aW9uc2hpcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9DUkVBVEVfUE9MSUNZID0gImNyZWF0ZVBvbGljeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9DUkVBVEVfSVRFTSA9ICJjcmVhdGVJdGVtIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX1VQREFURV9QUk9QRVJUSUVTID0gInVwZGF0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9CVUxLX1VQREFURSA9ICJidWxrVXBkYXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX0RFTEVURV9DT05URU5UID0gImRlbGV0ZUNvbnRlbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNBQ1RJT05fU0VUX0NPTlRFTlQgPSAic2V0Q29udGVudCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9BUFBFTkRfQ09OVEVOVCA9ICJhcHBlbmRDb250ZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX0RFTEVURSA9ICJkZWxldGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNBQ1RJT05fREVMRVRFX1RSRUUgPSAiZGVsZXRlVHJlZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9NT1ZFID0gIm1vdmUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNBQ1RJT05fQUREX09CSkVDVF9UT19GT0xERVIgPSAiYWRkT2JqZWN0VG9Gb2xkZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNBQ1RJT05fUkVNT1ZFX09CSkVDVF9GUk9NX0ZPTERFUiA9ICJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX1FVRVJZID0gInF1ZXJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX0NIRUNLX09VVCA9ICJjaGVja091dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU0FDVElPTl9DQU5DRUxfQ0hFQ0tfT1VUID0gImNhbmNlbENoZWNrT3V0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX0NIRUNLX0lOID0gImNoZWNrSW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNBQ1RJT05fQVBQTFlfUE9MSUNZID0gImFwcGx5UG9saWN5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX1JFTU9WRV9QT0xJQ1kgPSAicmVtb3ZlUG9saWN5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTQUNUSU9OX0FQUExZX0FDTCA9ICJhcHBseUFDTCI7Ci0KLSAgICAvLyBicm93c2VyIGJpbmRpbmcgY29udHJvbAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfQ01JU0FDVElPTiA9ICJjbWlzYWN0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1NVQ0NJTkNUID0gInN1Y2NpbmN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1RPS0VOID0gInRva2VuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX09CSkVDVF9JRCA9ICJvYmplY3RJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9QUk9QX0lEID0gInByb3BlcnR5SWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfUFJPUF9WQUxVRSA9ICJwcm9wZXJ0eVZhbHVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1BPTElDWSA9ICJwb2xpY3kiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfQUREX0FDRV9QUklOQ0lQQUwgPSAiYWRkQUNFUHJpbmNpcGFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX0FERF9BQ0VfUEVSTUlTU0lPTiA9ICJhZGRBQ0VQZXJtaXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX1JFTU9WRV9BQ0VfUFJJTkNJUEFMID0gInJlbW92ZUFDRVByaW5jaXBhbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9SRU1PVkVfQUNFX1BFUk1JU1NJT04gPSAicmVtb3ZlQUNFUGVybWlzc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9DT05URU5UX1RZUEUgPSAiY29udGVudHR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfRklMRU5BTUUgPSAiZmlsZW5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfSVNfTEFTVF9DSFVOSyA9ICJpc0xhc3RDaHVuayI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9UWVBFID0gInR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfVFlQRV9JRCA9ICJ0eXBlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfQ0hBTkdFX1RPS0VOID0gImNoYW5nZVRva2VuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MX0FERF9TRUNPTkRBUllfVFlQRSA9ICJhZGRTZWNvbmRhcnlUeXBlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfUkVNT1ZFX1NFQ09OREFSWV9UWVBFID0gInJlbW92ZVNlY29uZGFyeVR5cGVJZCI7Ci0KLSAgICAvLyBwYXJhbWV0ZXIKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BQ0wgPSAiaW5jbHVkZUFDTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMgPSAiaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FMTF9WRVJTSU9OUyA9ICJhbGxWZXJzaW9ucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVBQRU5EID0gImFwcGVuZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQ0hBTkdFX0xPR19UT0tFTiA9ICJjaGFuZ2VMb2dUb2tlbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQ0hBTkdFX1RPS0VOID0gImNoYW5nZVRva2VuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DSEVDS0lOX0NPTU1FTlQgPSAiY2hlY2tpbkNvbW1lbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NIRUNLX0lOID0gImNoZWNraW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NISUxEX1RZUEVTID0gImNoaWxkVHlwZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NPTlRJTlVFX09OX0ZBSUxVUkUgPSAiY29udGludWVPbkZhaWx1cmUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0RFUFRIID0gImRlcHRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9ET1dOTE9BRCA9ICJkb3dubG9hZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRklMVEVSID0gImZpbHRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1VDQ0lOQ1QgPSAic3VjY2luY3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0RBVEVUSU1FX0ZPUk1BVCA9ICJkYXRlVGltZUZvcm1hdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRk9MREVSX0lEID0gImZvbGRlcklkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9JRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fSVNfTEFTVF9DSFVOSyA9ICJpc0xhc3RDaHVuayI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTUFKT1IgPSAibWFqb3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX01BWF9JVEVNUyA9ICJtYXhJdGVtcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fT0JKRUNUX0lEID0gIm9iamVjdElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9PTkxZX0JBU0lDX1BFUk1JU1NJT05TID0gIm9ubHlCYXNpY1Blcm1pc3Npb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9PUkRFUl9CWSA9ICJvcmRlckJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9PVkVSV1JJVEVfRkxBRyA9ICJvdmVyd3JpdGVGbGFnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QQVRIID0gInBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BBVEhfU0VHTUVOVCA9ICJpbmNsdWRlUGF0aFNlZ21lbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BPTElDWV9JRCA9ICJwb2xpY3lJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUE9MSUNZX0lEUyA9ICJpbmNsdWRlUG9saWN5SWRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QUk9QRVJUSUVTID0gImluY2x1ZGVQcm9wZXJ0aWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9QUk9QRVJUWV9ERUZJTklUSU9OUyA9ICJpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUkVMQVRJT05TSElQUyA9ICJpbmNsdWRlUmVsYXRpb25zaGlwcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUkVMQVRJT05TSElQX0RJUkVDVElPTiA9ICJyZWxhdGlvbnNoaXBEaXJlY3Rpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCA9ICJpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUkVNT1ZFX0ZST00gPSAicmVtb3ZlRnJvbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUkVORElUSU9OX0ZJTFRFUiA9ICJyZW5kaXRpb25GaWx0ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JFUE9TSVRPUllfSUQgPSAicmVwb3NpdG9yeUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9SRVRVUk5fVkVSU0lPTiA9ICJyZXR1cm5WZXJzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TS0lQX0NPVU5UID0gInNraXBDb3VudCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU09VUkNFX0ZPTERFUl9JRCA9ICJzb3VyY2VGb2xkZXJJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVEFSR0VUX0ZPTERFUl9JRCA9ICJ0YXJnZXRGb2xkZXJJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1RSRUFNX0lEID0gInN0cmVhbUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TVUJfUkVMQVRJT05TSElQX1RZUEVTID0gImluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFlQRV9JRCA9ICJ0eXBlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VORklMRV9PQkpFQ1RTID0gInVuZmlsZU9iamVjdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1ZFUlNJT05fU0VSSUVTX0lEID0gInZlcnNpb25TZXJpZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1ZFUlNJT05JR19TVEFURSA9ICJ2ZXJzaW9uaW5nU3RhdGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1EgPSAicSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1RBVEVNRU5UID0gInN0YXRlbWVudCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0VBUkNIX0FMTF9WRVJTSU9OUyA9ICJzZWFyY2hBbGxWZXJzaW9ucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQUNMX1BST1BBR0FUSU9OID0gIkFDTFByb3BhZ2F0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TT1VSQ0VfSUQgPSAic291cmNlSWQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0VMRUNUT1IgPSAiY21pc3NlbGVjdG9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DQUxMQkFDSyA9ICJjYWxsYmFjayI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU1VQUFJFU1NfUkVTUE9OU0VfQ09ERVMgPSAic3VwcHJlc3NSZXNwb25zZUNvZGVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9UT0tFTiA9ICJ0b2tlbiI7Ci0KLSAgICAvLyByZW5kaXRpb24gZmlsdGVyCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVORElUSU9OX05PTkUgPSAiY21pczpub25lIjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvRGF0ZVRpbWVIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvRGF0ZVRpbWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlZTZmYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0RhdGVUaW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEYXRlVGltZUhlbHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lWm9uZSBHTVQgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFhNTF9EQVRFVElNRSA9IFBhdHRlcm4KLSAgICAgICAgICAgIC5jb21waWxlKCIoXFxkezQsOX0pLShbMDFdXFxkKS0oWzAtM11cXGQpVChbMC0yXVxcZCk6KFswLTVdXFxkKTooWzAtNV1cXGQpKFxcLihcXGQrKSk/KChbKy1dWzAtMl1cXGQ6WzAtNV1cXGQpfFopPyIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQkQxMDAwID0gbmV3IEJpZ0RlY2ltYWwoMTAwMCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXREFZUyA9IG5ldyBTdHJpbmdbXSB7ICJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNT05USFMgPSBuZXcgU3RyaW5nW10geyAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsCi0gICAgICAgICAgICAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIiB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gTU9OVEhTX01BUCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1PTlRIUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTU9OVEhTX01BUC5wdXQoTU9OVEhTW2ldLCBpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSFRUUF9EQVRFVElNRTEgPSBQYXR0ZXJuCi0gICAgICAgICAgICAuY29tcGlsZSgiXFx3ezN9LCAoWzAtM11cXGQpIChcXHd7M30pIChcXGR7NH0pIChbMC0yXVxcZCk6KFswLTVdXFxkKTooWzAtNV1cXGQpIEdNVCIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBIVFRQX0RBVEVUSU1FMiA9IFBhdHRlcm4KLSAgICAgICAgICAgIC5jb21waWxlKCJcXHd7Niw5fSwgKFswLTNdXFxkKS0oXFx3ezN9KS0oXFxkezJ9KSAoWzAtMl1cXGQpOihbMC01XVxcZCk6KFswLTVdXFxkKSBHTVQiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSFRUUF9EQVRFVElNRTMgPSBQYXR0ZXJuCi0gICAgICAgICAgICAuY29tcGlsZSgiXFx3ezN9IChcXHd7M30pIChbMC0zIF1cXGQpIChbMC0yXVxcZCk6KFswLTVdXFxkKTooWzAtNV1cXGQpIChcXGR7NH0pIik7Ci0KLSAgICBwcml2YXRlIERhdGVUaW1lSGVscGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIHhzZDpkYXRlVGltZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBHcmVnb3JpYW5DYWxlbmRhciBwYXJzZVhtbERhdGVUaW1lKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTWF0Y2hlciBtID0gWE1MX0RBVEVUSU1FLm1hdGNoZXIocyk7Ci0KLSAgICAgICAgaWYgKCFtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHllYXIgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMSkpOwotICAgICAgICAgICAgaW50IG1vbnRoID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIGludCBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMykpOwotICAgICAgICAgICAgaW50IGhvdXIgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNCkpOwotICAgICAgICAgICAgaW50IG1pbnV0ZSA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCg1KSk7Ci0gICAgICAgICAgICBpbnQgc2Vjb25kID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDYpKTsKLSAgICAgICAgICAgIGludCBtaWxsaXNlY29uZCA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChtLmdyb3VwKDgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtaWxsaXNlY29uZCA9IChuZXcgQmlnRGVjaW1hbCgiMC4iICsgbS5ncm91cCg4KSkpLm11bHRpcGx5KEJEMTAwMCkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVGltZVpvbmUgdHogPSBHTVQ7Ci0KLSAgICAgICAgICAgIGlmIChtLmdyb3VwKDEwKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHogPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIiArIG0uZ3JvdXAoMTApKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgR3JlZ29yaWFuQ2FsZW5kYXIgcmVzdWx0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICByZXN1bHQuY2xlYXIoKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFRpbWVab25lKHR6KTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXQoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIG1pbGxpc2Vjb25kKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHhzZDpkYXRlVGltZSBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0WG1sRGF0ZVRpbWUobG9uZyBtaWxsaXMpIHsKLSAgICAgICAgZmluYWwgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKEdNVCk7Ci0gICAgICAgIGNhbC5zZXRUaW1lSW5NaWxsaXMobWlsbGlzKTsKLQotICAgICAgICByZXR1cm4gZm9ybWF0WG1sRGF0ZVRpbWUoY2FsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgeHNkOmRhdGVUaW1lIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRYbWxEYXRlVGltZShHcmVnb3JpYW5DYWxlbmRhciBjYWwpIHsKLSAgICAgICAgaWYgKGNhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYWRkNGQoc2IsIGNhbC5nZXQoQ2FsZW5kYXIuWUVBUikpOwotICAgICAgICBzYi5hcHBlbmQoJy0nKTsKLSAgICAgICAgYWRkMmQoc2IsIGNhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpICsgMSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnLScpOwotICAgICAgICBhZGQyZChzYiwgY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCdUJyk7Ci0gICAgICAgIGFkZDJkKHNiLCBjYWwuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnOicpOwotICAgICAgICBhZGQyZChzYiwgY2FsLmdldChDYWxlbmRhci5NSU5VVEUpKTsKLSAgICAgICAgc2IuYXBwZW5kKCc6Jyk7Ci0gICAgICAgIGFkZDJkKHNiLCBjYWwuZ2V0KENhbGVuZGFyLlNFQ09ORCkpOwotCi0gICAgICAgIGludCBtcyA9IGNhbC5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpOwotICAgICAgICBpZiAobXMgPiAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgIGFkZDNkKHNiLCBtcyk7Ci0gICAgICAgICAgICB3aGlsZSAoc2IuY2hhckF0KHNiLmxlbmd0aCgpIC0gMSkgPT0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgc2IuZGVsZXRlQ2hhckF0KHNiLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdHogPSBjYWwuZ2V0VGltZVpvbmUoKS5nZXRPZmZzZXQoY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICAgICAgaWYgKHR6ID09IDApIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWicpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHR6ID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnKycpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKTsKLSAgICAgICAgICAgICAgICB0eiAqPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZDJkKHNiLCB0eiAvIDM2MDAwMDApOwotICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBpbnQgdHptID0gdHogJSAzNjAwMDAwOwotICAgICAgICAgICAgYWRkMmQoc2IsIHR6bSA9PSAwID8gMCA6IHR6bSAvIDYwMDAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIEhUVFAgZGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERhdGUgcGFyc2VIdHRwRGF0ZVRpbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzID0gcy50cmltKCk7Ci0gICAgICAgIGlmIChzLmxlbmd0aCgpID4gMSAmJiBzLmNoYXJBdCgwKSA9PSAnXCcnICYmIHMuZW5kc1dpdGgoIiciKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihHTVQpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKLQotICAgICAgICBNYXRjaGVyIG0gPSBudWxsOwotCi0gICAgICAgIG0gPSBIVFRQX0RBVEVUSU1FMS5tYXRjaGVyKHMpOwotICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEludGVnZXIgbW9udGggPSBNT05USFNfTUFQLmdldChtLmdyb3VwKDIpKTsKLSAgICAgICAgICAgIGlmIChtb250aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMSkpKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTU9OVEgsIG1vbnRoKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDMpKSk7Ci0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNCkpKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNSkpKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuU0VDT05ELCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNikpKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNhbC5nZXRUaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtID0gSFRUUF9EQVRFVElNRTIubWF0Y2hlcihzKTsKLSAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIG1vbnRoID0gTU9OVEhTX01BUC5nZXQobS5ncm91cCgyKSk7Ci0gICAgICAgICAgICBpZiAobW9udGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKSk7Ci0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1PTlRILCBtb250aCk7Ci0gICAgICAgICAgICBpbnQgeWVhciA9IEludGVnZXIucGFyc2VJbnQobS5ncm91cCgzKSk7Ci0gICAgICAgICAgICBpZiAoeWVhciA8IDEwMCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aGlzWWVhciA9IChuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoR01UKSkuZ2V0KENhbGVuZGFyLllFQVIpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0ZXN0WWVhciA9IHllYXIgKyB0aGlzWWVhciAtIHRoaXNZZWFyICUgMTAwOwotICAgICAgICAgICAgICAgIHllYXIgPSAodGVzdFllYXIgPCB0aGlzWWVhciArIDIwID8gdGVzdFllYXIgOiB0ZXN0WWVhciAtIDEwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLllFQVIsIHllYXIpOwotICAgICAgICAgICAgY2FsLnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDQpKSk7Ci0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTlVURSwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDUpKSk7Ci0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDYpKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjYWwuZ2V0VGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbSA9IEhUVFBfREFURVRJTUUzLm1hdGNoZXIocyk7Ci0gICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBtb250aCA9IE1PTlRIU19NQVAuZ2V0KG0uZ3JvdXAoMSkpOwotICAgICAgICAgICAgaWYgKG1vbnRoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FsLnNldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIEludGVnZXIucGFyc2VJbnQobS5ncm91cCgyKS50cmltKCkpKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTU9OVEgsIG1vbnRoKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDYpKSk7Ci0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMykpKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNCkpKTsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuU0VDT05ELCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNSkpKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNhbC5nZXRUaW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgSFRUUCBkYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdEh0dHBEYXRlVGltZShsb25nIG1pbGxpcykgewotICAgICAgICBmaW5hbCBHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoR01UKTsKLSAgICAgICAgY2FsLnNldFRpbWVJbk1pbGxpcyhtaWxsaXMpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBzYi5hcHBlbmQoV0RBWVNbY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfV0VFSykgLSAxXSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgYWRkMmQoc2IsIGNhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICBzYi5hcHBlbmQoTU9OVEhTW2NhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpXSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICBhZGQ0ZChzYiwgY2FsLmdldChDYWxlbmRhci5ZRUFSKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICBhZGQyZChzYiwgY2FsLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSkpOwotICAgICAgICBzYi5hcHBlbmQoJzonKTsKLSAgICAgICAgYWRkMmQoc2IsIGNhbC5nZXQoQ2FsZW5kYXIuTUlOVVRFKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnOicpOwotICAgICAgICBhZGQyZChzYiwgY2FsLmdldChDYWxlbmRhci5TRUNPTkQpKTsKLSAgICAgICAgc2IuYXBwZW5kKCIgR01UIik7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIEhUVFAgZGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRIdHRwRGF0ZVRpbWUoZmluYWwgRGF0ZSBkYXRlKSB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRIdHRwRGF0ZVRpbWUoZGF0ZS5nZXRUaW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBIVFRQIGRhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0SHR0cERhdGVUaW1lKGZpbmFsIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCkgewotICAgICAgICByZXR1cm4gZm9ybWF0SHR0cERhdGVUaW1lKGNhbC5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQyZChmaW5hbCBTdHJpbmdCdWlsZGVyIHNiLCBpbnQgdmFsdWUpIHsKLSAgICAgICAgYXNzZXJ0IHNiICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCB2YWx1ZSA+PSAwOwotCi0gICAgICAgIGlmICh2YWx1ZSA8IDEwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQodmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkM2QoZmluYWwgU3RyaW5nQnVpbGRlciBzYiwgaW50IHZhbHVlKSB7Ci0gICAgICAgIGFzc2VydCBzYiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdmFsdWUgPj0gMDsKLQotICAgICAgICBpZiAodmFsdWUgPCAxMCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCcwJyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIDwgMTAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQodmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkNGQoZmluYWwgU3RyaW5nQnVpbGRlciBzYiwgaW50IHZhbHVlKSB7Ci0gICAgICAgIGFzc2VydCBzYiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdmFsdWUgPj0gMDsKLQotICAgICAgICBpZiAodmFsdWUgPCAxMCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCcwJyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIDwgMTAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgPCAxMDAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQodmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9JT1V0aWxzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0lPVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1NWYzNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0lPVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBJT1V0aWxzIHsKLQotICAgIC8qKiBVVEYtOCBjaGFyYWN0ZXIgc2V0IG5hbWUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGOCA9ICJVVEYtOCI7Ci0gICAgLyoqIElTTy04ODU5LTEgY2hhcmFjdGVyIHNldCBuYW1lLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTT184ODU5XzEgPSAiSVNPLTg4NTktMSI7Ci0KLSAgICBwcml2YXRlIElPVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBVVEYtOCBieXRlcyBvZiB0aGUgZ2l2ZW4gc3RyaW5nIG9yIHRocm93cyBhCi0gICAgICoge0BsaW5rIENtaXNSdW50aW1lRXhjZXB0aW9ufSBpZiB0aGUgY2hhcnNldCAnVVRGLTgnIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJpbmcKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBVVEYtOCBieXRlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRvVVRGOEJ5dGVzKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBzLmdldEJ5dGVzKFVURjgpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2RpbmcgJ1VURi04JyEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgVVRGLTggZW5jb2RlZCBieXRlIGFycmF5IGludG8gYSBzdHJpbmcgb3IgdGhyb3dzIGEKLSAgICAgKiB7QGxpbmsgQ21pc1J1bnRpbWVFeGNlcHRpb259IGlmIHRoZSBjaGFyc2V0ICdVVEYtOCcgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnl0ZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBieXRlIGFycmF5Ci0gICAgICogQHJldHVybiB0aGUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9VVEY4U3RyaW5nKGJ5dGVbXSBieXRlcykgewotICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIFVURjgpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2RpbmcgJ1VURi04JyEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVSTCBlbmNvZGVzIHRoZSBnaXZlbiBzdHJpbmcgb3IgdGhyb3dzIGEge0BsaW5rIENtaXNSdW50aW1lRXhjZXB0aW9ufSBpZgotICAgICAqIHRoZSBjaGFyc2V0ICdVVEYtOCcgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcwotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBlbmNvZGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBVUkxFbmNvZGVyLmVuY29kZShzLCBVVEY4KTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGVuY29kaW5nICdVVEYtOCchIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVUkwgZGVjb2RlcyB0aGUgZ2l2ZW4gc3RyaW5nIG9yIHRocm93cyBhIHtAbGluayBDbWlzUnVudGltZUV4Y2VwdGlvbn0gaWYKLSAgICAgKiB0aGUgY2hhcnNldCAnVVRGLTgnIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gZGVjb2RlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb2RlZCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVVUkwoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHMsIFVURjgpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2RpbmcgJ1VURi04JyEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIHN0cmVhbSBoYXMgbW9yZSBieXRlcy4gSWYgdGhlIHByb3ZpZGVkIHN0cmVhbSBpcyBub3QKLSAgICAgKiBtYXJrYWJsZSwgaXQgd3JhcHBlcyBhIHtAbGluayBCdWZmZXJlZElucHV0U3RyZWFtfSBhcm91bmQgdGhlIHN0cmVhbSBhbmQKLSAgICAgKiByZXR1cm5zIGl0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0KLSAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcyBpZiBhCi0gICAgICogICAgICAgICAgICB7QGxpbmsgQnVmZmVyZWRJbnB1dFN0cmVhbX0gaGFzIHRvIGJlIGNyZWF0ZWQKLSAgICAgKiBAcmV0dXJuIHtAY29kZSBudWxsfSBpZiB0aGUgc3RyZWFtIGRvZXNuJ3QgaGF2ZSBtb3JlIGJ5dGVzLCB0aGUgcHJvdmlkZWQKLSAgICAgKiAgICAgICAgIHN0cmVhbSBpZiB0aGUgcHJvdmlkZWQgc3RyZWFtIGlzIG1hcmthYmxlIGFuZCBoYXMgbW9yZSBieXRlcywgb3IKLSAgICAgKiAgICAgICAgIGEge0BsaW5rIEJ1ZmZlcmVkSW5wdXRTdHJlYW19IGlmIHRoZSBwcm92aWRlZCBzdHJlYW0gaXMgbm90Ci0gICAgICogICAgICAgICBtYXJrYWJsZSBhbmQgaGFzIG1vcmUgYnl0ZXMKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBjaGVja0ZvckJ5dGVzKElucHV0U3RyZWFtIHN0cmVhbSwgaW50IGJ1ZmZlclNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBjaGVja1N0cmVhbSA9IHN0cmVhbTsKLQotICAgICAgICBpZiAoIXN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgIGNoZWNrU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3RyZWFtLCBidWZmZXJTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjaGVja0ZvckJ5dGVzKGNoZWNrU3RyZWFtKSkgewotICAgICAgICAgICAgcmV0dXJuIGNoZWNrU3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgc3RyZWFtIGhhcyBtb3JlIGJ5dGVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIGEgbWFya2FibGUgc3RyZWFtCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN0cmVhbSBoYXMgbW9yZSBieXRlcywge0Bjb2RlIGZhbHNlfQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRm9yQnl0ZXMoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIG11c3Qgc3VwcG9ydCBtYXJrcyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cmVhbS5tYXJrKDIpOwotCi0gICAgICAgIGlmIChzdHJlYW0ucmVhZCgpICE9IC0xKSB7Ci0gICAgICAgICAgICBzdHJlYW0ucmVzZXQoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyBhIHN0cmVhbSBhbmQgaWdub3JlcyBhbnkgZXhjZXB0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2xvc2VhYmxlCi0gICAgICogICAgICAgICAgICB0aGUge0BsaW5rIENsb3NlYWJsZX0gb2JqZWN0Ci0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIlBNRC5FbXB0eUNhdGNoQmxvY2siKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZVF1aWV0bHkoZmluYWwgQ2xvc2VhYmxlIGNsb3NlYWJsZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGNsb3NlYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VhYmxlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbSBvZiBhIHtAbGluayBDb250ZW50U3RyZWFtfSBvYmplY3QgYW5kIGlnbm9yZXMgYW55Ci0gICAgICogZXhjZXB0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGVudFN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUXVpZXRseShmaW5hbCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0pIHsKLSAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgY2xvc2VRdWlldGx5KGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3VtZXMgYW5kIGNsb3NlcyB0aGUgcHJvdmlkZWQgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJQTUQuRW1wdHlDYXRjaEJsb2NrIiwgIlBNRC5FbXB0eVdoaWxlU3RtdCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uc3VtZUFuZENsb3NlKGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNjQgKiAxMDI0XTsKLSAgICAgICAgICAgIHdoaWxlIChzdHJlYW0ucmVhZChidWZmZXIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGNvbnN1bWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3VtZXMgYW5kIGNsb3NlcyB0aGUgcHJvdmlkZWQgcmVhZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSByZWFkZXIKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJQTUQuRW1wdHlDYXRjaEJsb2NrIiwgIlBNRC5FbXB0eVdoaWxlU3RtdCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uc3VtZUFuZENsb3NlKGZpbmFsIFJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzY0ICogMTAyNF07Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyLnJlYWQoYnVmZmVyKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBjb25zdW1lCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkocmVhZGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyBhbGwgYnl0ZXMgb2YgYW4gaW5wdXQgc3RyZWFtIHRvIGFuIG91dHB1dCBzdHJlYW0uCi0gICAgICogCi0gICAgICogTmVpdGhlciB0aGUgaW5wdXQgc3RyZWFtIG5vciB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIHRoZSBjbG9zZWQgYWZ0ZXIgdGhlCi0gICAgICogY29weS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0sIG11c3Qgbm90IGJlIHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtLCBtdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY29weShpbiwgb3V0LCA2NCAqIDEwMjQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyBhbGwgYnl0ZXMgb2YgYW4gaW5wdXQgc3RyZWFtIHRvIGFuIG91dHB1dCBzdHJlYW0uCi0gICAgICogCi0gICAgICogTmVpdGhlciB0aGUgaW5wdXQgc3RyZWFtIG5vciB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIHRoZSBjbG9zZWQgYWZ0ZXIgdGhlCi0gICAgICogY29weS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0sIG11c3Qgbm90IGJlIHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtLCBtdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZQotICAgICAqICAgICAgICAgICAgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlciwgbXVzdCBiZSBwb3NpdGl2ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIGluLCBPdXRwdXRTdHJlYW0gb3V0LCBpbnQgYnVmZmVyU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IGluICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBvdXQgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGJ1ZmZlclNpemUgPiAwOwotCi0gICAgICAgIGludCBiOwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07Ci0KLSAgICAgICAgd2hpbGUgKChiID0gaW4ucmVhZChidWZmZXIpKSA+IC0xKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGxpbmVzIGZyb20gYW4gVVRGLTggZW5jb2RlZCBzdHJlYW0gYW5kIGNsb3NlcyB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0KLSAgICAgKiBAcGFyYW0gaGFuZGxlcgotICAgICAqICAgICAgICAgICAgYSBoYW5kbGVyIHRoZSBwcm9jZXNzZXMgZWFjaCBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWFkTGluZXNGcm9tU3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSwgTGluZUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sIFVURjgpKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghaGFuZGxlci5oYW5kbGUobGluZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VRdWlldGx5KHJlYWRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgZmlyc3QgbGluZSBmcm9tIGEgc3RyZWFtIGFuZCBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZEZpcnN0TGluZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICByZWFkTGluZXNGcm9tU3RyZWFtKHN0cmVhbSwgbmV3IExpbmVIYW5kbGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyBhbGwgbGluZXMgZnJvbSBhIHN0cmVhbSBhbmQgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRBbGxMaW5lcyhJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICByZWFkTGluZXNGcm9tU3RyZWFtKHN0cmVhbSwgbmV3IExpbmVIYW5kbGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYWxsIGxpbmVzIGZyb20gYSBzdHJlYW0sIHJlbW92ZXMgdGhlIGhlYWRlciwgYW5kIGNsb3NlcyB0aGUgc3RyZWFtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkQWxsTGluZXNBbmRSZW1vdmVIZWFkZXIoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgcmVhZExpbmVzRnJvbVN0cmVhbShzdHJlYW0sIG5ldyBTa2lwSGVhZGVyTGluZUhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGUoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzSGVhZGVyTGluZShsaW5lKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGFsbCBsaW5lcyBmcm9tIGEgc3RyZWFtLCBpZ25vcmVzIGFsbCBjb21tZW50cywgYW5kIGNsb3NlcyB0aGUKLSAgICAgKiBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRBbGxMaW5lc0FuZElnbm9yZUNvbW1lbnRzKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHJlYWRMaW5lc0Zyb21TdHJlYW0oc3RyZWFtLCBuZXcgSWdub3JlQ29tbWVudHNMaW5lSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZShTdHJpbmcgbGluZSkgewotICAgICAgICAgICAgICAgIGlmICghaXNDb21tZW50KGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYWxsIGxpbmVzIGZyb20gYSBzdHJlYW0sIGlnbm9yZXMgYWxsIGNvbW1lbnRzLCBhbmQgY2xvc2VzIHRoZQotICAgICAqIHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVhZEFsbExpbmVzQXNMaXN0KElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIHJlYWRMaW5lc0Zyb21TdHJlYW0oc3RyZWFtLCBuZXcgSWdub3JlQ29tbWVudHNMaW5lSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZShTdHJpbmcgbGluZSkgewotICAgICAgICAgICAgICAgIGlmICghaXNDb21tZW50KGxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGFsbCBsaW5lcyBmcm9tIGEgc3RyZWFtLCBpZ25vcmVzIGFsbCBjb21tZW50cywgYW5kIGNsb3NlcyB0aGUKLSAgICAgKiBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmVhbQotICAgICAqICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiByZWFkQWxsTGluZXNBc01hcChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgcmVhZExpbmVzRnJvbVN0cmVhbShzdHJlYW0sIG5ldyBJZ25vcmVDb21tZW50c0xpbmVIYW5kbGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc0NvbW1lbnQobGluZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHggPSBsaW5lLmluZGV4T2YoJz0nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KGxpbmUudHJpbSgpLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KGxpbmUuc3Vic3RyaW5nKDAsIHgpLnRyaW0oKSwgbGluZS5zdWJzdHJpbmcoeCArIDEpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBMaW5lSGFuZGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBIYW5kbGVzIGEgbGluZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBwYXJhbSBsaW5lCi0gICAgICAgICAqICAgICAgICAgICAgdGhlIGxpbmUgdG8gaGFuZGxlCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuZXh0IGxpbmUgc2hvdWxkIGJlIHByb2Nlc3NlZCwKLSAgICAgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIGhhbmRsZShTdHJpbmcgbGluZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBTa2lwSGVhZGVyTGluZUhhbmRsZXIgaW1wbGVtZW50cyBMaW5lSGFuZGxlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhlYWRlciA9IHRydWU7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNIZWFkZXJMaW5lKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICBpZiAoIWhlYWRlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHRyaW0gPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICh0cmltLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBoZWFkZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2hhciBjID0gdHJpbS5jaGFyQXQoMCk7Ci0gICAgICAgICAgICByZXR1cm4gKGMgPT0gJy8nKSB8fCAoYyA9PSAnKicpIHx8IChjID09ICcjJyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIElnbm9yZUNvbW1lbnRzTGluZUhhbmRsZXIgaW1wbGVtZW50cyBMaW5lSGFuZGxlciB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50KFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdHJpbSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgaWYgKHRyaW0ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJpbS5jaGFyQXQoMCkgPT0gJyMnOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9KU09OQ29uc3RhbnRzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0pTT05Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3ZmE5Yy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0pTT05Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotCi0vKioKLSAqIEpTT04gb2JqZWN0IGNvbnN0YW50cy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIlBNRC5Bdm9pZER1cGxpY2F0ZUxpdGVyYWxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBKU09OQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VYQ0VQVElPTiA9ICJleGNlcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX01FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU1RBQ0tUUkFDRSA9ICJzdGFja3RyYWNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUkVQSU5GT19JRCA9ICJyZXBvc2l0b3J5SWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUkVQSU5GT19OQU1FID0gInJlcG9zaXRvcnlOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fREVTQ1JJUFRJT04gPSAicmVwb3NpdG9yeURlc2NyaXB0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fVkVORE9SID0gInZlbmRvck5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUkVQSU5GT19QUk9EVUNUID0gInByb2R1Y3ROYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fUFJPRFVDVF9WRVJTSU9OID0gInByb2R1Y3RWZXJzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fUk9PVF9GT0xERVJfSUQgPSAicm9vdEZvbGRlcklkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fUkVQT1NJVE9SWV9VUkwgPSAicmVwb3NpdG9yeVVybCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRVBJTkZPX1JPT1RfRk9MREVSX1VSTCA9ICJyb290Rm9sZGVyVXJsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fQ0FQQUJJTElUSUVTID0gImNhcGFiaWxpdGllcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRVBJTkZPX0FDTF9DQVBBQklMSVRJRVMgPSAiYWNsQ2FwYWJpbGl0aWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fQ0hBTkdFX0xPR19UT0tFTiA9ICJsYXRlc3RDaGFuZ2VMb2dUb2tlbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRVBJTkZPX0NNSVNfVkVSU0lPTl9TVVBQT1JURUQgPSAiY21pc1ZlcnNpb25TdXBwb3J0ZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUkVQSU5GT19USElOX0NMSUVOVF9VUkkgPSAidGhpbkNsaWVudFVSSSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRVBJTkZPX0NIQU5HRVNfSU5DT01QTEVURSA9ICJjaGFuZ2VzSW5jb21wbGV0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRVBJTkZPX0NIQU5HRVNfT05fVFlQRSA9ICJjaGFuZ2VzT25UeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFUElORk9fUFJJTkNJUEFMX0lEX0FOT05ZTU9VUyA9ICJwcmluY2lwYWxJZEFub255bW91cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRVBJTkZPX1BSSU5DSVBBTF9JRF9BTllPTkUgPSAicHJpbmNpcGFsSWRBbnlvbmUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUkVQSU5GT19FWFRFTkRFRF9GRUFUVVJFUyA9ICJleHRlbmRlZEZlYXR1cmVzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUkVQSU5GT19LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoSlNPTl9SRVBJTkZPX0lEKTsKLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChKU09OX1JFUElORk9fTkFNRSk7Ci0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoSlNPTl9SRVBJTkZPX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChKU09OX1JFUElORk9fVkVORE9SKTsKLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChKU09OX1JFUElORk9fUFJPRFVDVCk7Ci0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoSlNPTl9SRVBJTkZPX1BST0RVQ1RfVkVSU0lPTik7Ci0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoSlNPTl9SRVBJTkZPX1JPT1RfRk9MREVSX0lEKTsKLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChKU09OX1JFUElORk9fUkVQT1NJVE9SWV9VUkwpOwotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKEpTT05fUkVQSU5GT19ST09UX0ZPTERFUl9VUkwpOwotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKEpTT05fUkVQSU5GT19DQVBBQklMSVRJRVMpOwotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKEpTT05fUkVQSU5GT19BQ0xfQ0FQQUJJTElUSUVTKTsKLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChKU09OX1JFUElORk9fQ0hBTkdFX0xPR19UT0tFTik7Ci0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoSlNPTl9SRVBJTkZPX0NNSVNfVkVSU0lPTl9TVVBQT1JURUQpOwotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKEpTT05fUkVQSU5GT19USElOX0NMSUVOVF9VUkkpOwotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKEpTT05fUkVQSU5GT19DSEFOR0VTX0lOQ09NUExFVEUpOwotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKEpTT05fUkVQSU5GT19DSEFOR0VTX09OX1RZUEUpOwotICAgICAgICBSRVBJTkZPX0tFWVMuYWRkKEpTT05fUkVQSU5GT19QUklOQ0lQQUxfSURfQU5PTllNT1VTKTsKLSAgICAgICAgUkVQSU5GT19LRVlTLmFkZChKU09OX1JFUElORk9fUFJJTkNJUEFMX0lEX0FOWU9ORSk7Ci0gICAgICAgIFJFUElORk9fS0VZUy5hZGQoSlNPTl9SRVBJTkZPX0VYVEVOREVEX0ZFQVRVUkVTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9DT05URU5UX1NUUkVBTV9VUERBVEFCSUxJVFkgPSAiY2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGFiaWxpdHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX0NIQU5HRVMgPSAiY2FwYWJpbGl0eUNoYW5nZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX1JFTkRJVElPTlMgPSAiY2FwYWJpbGl0eVJlbmRpdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX0dFVF9ERVNDRU5EQU5UUyA9ICJjYXBhYmlsaXR5R2V0RGVzY2VuZGFudHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX0dFVF9GT0xERVJfVFJFRSA9ICJjYXBhYmlsaXR5R2V0Rm9sZGVyVHJlZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9DQVBfTVVMVElGSUxJTkcgPSAiY2FwYWJpbGl0eU11bHRpZmlsaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9VTkZJTElORyA9ICJjYXBhYmlsaXR5VW5maWxpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX1ZFUlNJT05fU1BFQ0lGSUNfRklMSU5HID0gImNhcGFiaWxpdHlWZXJzaW9uU3BlY2lmaWNGaWxpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX1BXQ19TRUFSQ0hBQkxFID0gImNhcGFiaWxpdHlQV0NTZWFyY2hhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9QV0NfVVBEQVRBQkxFID0gImNhcGFiaWxpdHlQV0NVcGRhdGFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX0FMTF9WRVJTSU9OU19TRUFSQ0hBQkxFID0gImNhcGFiaWxpdHlBbGxWZXJzaW9uc1NlYXJjaGFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX09SREVSX0JZID0gImNhcGFiaWxpdHlPcmRlckJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9RVUVSWSA9ICJjYXBhYmlsaXR5UXVlcnkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX0pPSU4gPSAiY2FwYWJpbGl0eUpvaW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX0FDTCA9ICJjYXBhYmlsaXR5QUNMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVMgPSAiY2FwYWJpbGl0eUNyZWF0YWJsZVByb3BlcnR5VHlwZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVMgPSAiY2FwYWJpbGl0eU5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBDQVBfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfQ09OVEVOVF9TVFJFQU1fVVBEQVRBQklMSVRZKTsKLSAgICAgICAgQ0FQX0tFWVMuYWRkKEpTT05fQ0FQX0NIQU5HRVMpOwotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfUkVORElUSU9OUyk7Ci0gICAgICAgIENBUF9LRVlTLmFkZChKU09OX0NBUF9HRVRfREVTQ0VOREFOVFMpOwotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfR0VUX0ZPTERFUl9UUkVFKTsKLSAgICAgICAgQ0FQX0tFWVMuYWRkKEpTT05fQ0FQX01VTFRJRklMSU5HKTsKLSAgICAgICAgQ0FQX0tFWVMuYWRkKEpTT05fQ0FQX1VORklMSU5HKTsKLSAgICAgICAgQ0FQX0tFWVMuYWRkKEpTT05fQ0FQX1ZFUlNJT05fU1BFQ0lGSUNfRklMSU5HKTsKLSAgICAgICAgQ0FQX0tFWVMuYWRkKEpTT05fQ0FQX1BXQ19TRUFSQ0hBQkxFKTsKLSAgICAgICAgQ0FQX0tFWVMuYWRkKEpTT05fQ0FQX1BXQ19VUERBVEFCTEUpOwotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfQUxMX1ZFUlNJT05TX1NFQVJDSEFCTEUpOwotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfT1JERVJfQlkpOwotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfUVVFUlkpOwotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfSk9JTik7Ci0gICAgICAgIENBUF9LRVlTLmFkZChKU09OX0NBUF9BQ0wpOwotICAgICAgICBDQVBfS0VZUy5hZGQoSlNPTl9DQVBfQ1JFQVRBQkxFX1BST1BFUlRZX1RZUEVTKTsKLSAgICAgICAgQ0FQX0tFWVMuYWRkKEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX0NSRUFUQUJMRV9QUk9QRVJUWV9UWVBFU19DQU5DUkVBVEUgPSAiY2FuQ3JlYXRlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gQ0FQX0NSRUFUQUJMRV9QUk9QRVJUWV9UWVBFU19LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIENBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfS0VZUy5hZGQoSlNPTl9DQVBfQ1JFQVRBQkxFX1BST1BFUlRZX1RZUEVTX0NBTkNSRUFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19JRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19MT0NBTE5BTUUgPSAibG9jYWxOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0xPQ0FMTkFNRVNQQUNFID0gImxvY2FsTmFtZXNwYWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0RJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX1FVRVJZTkFNRSA9ICJxdWVyeU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ1JFQVRFQUJMRSA9ICJjcmVhdGFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRklMRUFCTEUgPSAiZmlsZWFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfUVVFUllBQkxFID0gInF1ZXJ5YWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19GVUxMVEVYVElOREVYRUQgPSAiZnVsbHRleHRJbmRleGVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lOQ0xVREVESU5TVVBFUlRZVFBFUVVFUlkgPSAiaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFUE9MSUNZID0gImNvbnRyb2xsYWJsZVBvbGljeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DT05UUk9MQUJMRUFDTCA9ICJjb250cm9sbGFibGVBQ0wiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBDQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIENBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0tFWVMuYWRkKEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfSUQpOwotICAgICAgICBDQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19LRVlTLmFkZChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0xPQ0FMTkFNRSk7Ci0gICAgICAgIENBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0tFWVMuYWRkKEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfTE9DQUxOQU1FU1BBQ0UpOwotICAgICAgICBDQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19LRVlTLmFkZChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0RJU1BMQVlOQU1FKTsKLSAgICAgICAgQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfS0VZUy5hZGQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19RVUVSWU5BTUUpOwotICAgICAgICBDQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19LRVlTLmFkZChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfS0VZUy5hZGQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DUkVBVEVBQkxFKTsKLSAgICAgICAgQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfS0VZUy5hZGQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19RVUVSWUFCTEUpOwotICAgICAgICBDQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19LRVlTLmFkZChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0ZJTEVBQkxFKTsKLSAgICAgICAgQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfS0VZUy5hZGQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19GVUxMVEVYVElOREVYRUQpOwotICAgICAgICBDQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19LRVlTLmFkZChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lOQ0xVREVESU5TVVBFUlRZVFBFUVVFUlkpOwotICAgICAgICBDQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19LRVlTLmFkZChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFUE9MSUNZKTsKLSAgICAgICAgQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfS0VZUy5hZGQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DT05UUk9MQUJMRUFDTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9BQ0xDQVBfU1VQUE9SVEVEX1BFUk1JU1NJT05TID0gInN1cHBvcnRlZFBlcm1pc3Npb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FDTENBUF9BQ0xfUFJPUEFHQVRJT04gPSAicHJvcGFnYXRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQUNMQ0FQX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FDTENBUF9QRVJNSVNTSU9OX01BUFBJTkcgPSAicGVybWlzc2lvbk1hcHBpbmciOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBQ0xDQVBfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBBQ0xDQVBfS0VZUy5hZGQoSlNPTl9BQ0xDQVBfU1VQUE9SVEVEX1BFUk1JU1NJT05TKTsKLSAgICAgICAgQUNMQ0FQX0tFWVMuYWRkKEpTT05fQUNMQ0FQX0FDTF9QUk9QQUdBVElPTik7Ci0gICAgICAgIEFDTENBUF9LRVlTLmFkZChKU09OX0FDTENBUF9QRVJNSVNTSU9OUyk7Ci0gICAgICAgIEFDTENBUF9LRVlTLmFkZChKU09OX0FDTENBUF9QRVJNSVNTSU9OX01BUFBJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQUNMQ0FQX1BFUk1JU1NJT05fUEVSTUlTU0lPTiA9ICJwZXJtaXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FDTENBUF9QRVJNSVNTSU9OX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gQUNMQ0FQX1BFUk1JU1NJT05fS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBBQ0xDQVBfUEVSTUlTU0lPTl9LRVlTLmFkZChKU09OX0FDTENBUF9QRVJNSVNTSU9OX1BFUk1JU1NJT04pOwotICAgICAgICBBQ0xDQVBfUEVSTUlTU0lPTl9LRVlTLmFkZChKU09OX0FDTENBUF9QRVJNSVNTSU9OX0RFU0NSSVBUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FDTENBUF9NQVBQSU5HX0tFWSA9ICJrZXkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQUNMQ0FQX01BUFBJTkdfUEVSTUlTU0lPTiA9ICJwZXJtaXNzaW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gQUNMQ0FQX01BUFBJTkdfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBBQ0xDQVBfTUFQUElOR19LRVlTLmFkZChKU09OX0FDTENBUF9NQVBQSU5HX0tFWSk7Ci0gICAgICAgIEFDTENBUF9NQVBQSU5HX0tFWVMuYWRkKEpTT05fQUNMQ0FQX01BUFBJTkdfUEVSTUlTU0lPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GRUFUVVJFX0lEID0gImlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0ZFQVRVUkVfVVJMID0gInVybCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GRUFUVVJFX0NPTU1PTl9OQU1FID0gImNvbW1vbk5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fRkVBVFVSRV9WRVJTSU9OX0xBQkVMID0gInZlcnNpb25MYWJlbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GRUFUVVJFX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0ZFQVRVUkVfREFUQSA9ICJmZWF0dXJlRGF0YSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEZFQVRVUkVfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBGRUFUVVJFX0tFWVMuYWRkKEpTT05fRkVBVFVSRV9JRCk7Ci0gICAgICAgIEZFQVRVUkVfS0VZUy5hZGQoSlNPTl9GRUFUVVJFX1VSTCk7Ci0gICAgICAgIEZFQVRVUkVfS0VZUy5hZGQoSlNPTl9GRUFUVVJFX0NPTU1PTl9OQU1FKTsKLSAgICAgICAgRkVBVFVSRV9LRVlTLmFkZChKU09OX0ZFQVRVUkVfVkVSU0lPTl9MQUJFTCk7Ci0gICAgICAgIEZFQVRVUkVfS0VZUy5hZGQoSlNPTl9GRUFUVVJFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgRkVBVFVSRV9LRVlTLmFkZChKU09OX0ZFQVRVUkVfREFUQSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVF9TVUNDSU5DVF9QUk9QRVJUSUVTID0gInN1Y2NpbmN0UHJvcGVydGllcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfUFJPUEVSVElFU19FWFRFTlNJT04gPSAicHJvcGVydGllc0V4dGVuc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfQUxMT1dBQkxFX0FDVElPTlMgPSAiYWxsb3dhYmxlQWN0aW9ucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfUkVMQVRJT05TSElQUyA9ICJyZWxhdGlvbnNoaXBzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVF9DSEFOR0VfRVZFTlRfSU5GTyA9ICJjaGFuZ2VFdmVudEluZm8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fT0JKRUNUX0FDTCA9ICJhY2wiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fT0JKRUNUX0VYQUNUX0FDTCA9ICJleGFjdEFDTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfUE9MSUNZX0lEUyA9ICJwb2xpY3lJZHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fT0JKRUNUX1BPTElDWV9JRFNfSURTID0gImlkcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfUkVORElUSU9OUyA9ICJyZW5kaXRpb25zIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gT0JKRUNUX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgT0JKRUNUX0tFWVMuYWRkKEpTT05fT0JKRUNUX1BST1BFUlRJRVMpOwotICAgICAgICBPQkpFQ1RfS0VZUy5hZGQoSlNPTl9PQkpFQ1RfU1VDQ0lOQ1RfUFJPUEVSVElFUyk7Ci0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChKU09OX09CSkVDVF9QUk9QRVJUSUVTX0VYVEVOU0lPTik7Ci0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChKU09OX09CSkVDVF9BTExPV0FCTEVfQUNUSU9OUyk7Ci0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChKU09OX09CSkVDVF9SRUxBVElPTlNISVBTKTsKLSAgICAgICAgT0JKRUNUX0tFWVMuYWRkKEpTT05fT0JKRUNUX0NIQU5HRV9FVkVOVF9JTkZPKTsKLSAgICAgICAgT0JKRUNUX0tFWVMuYWRkKEpTT05fT0JKRUNUX0FDTCk7Ci0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChKU09OX09CSkVDVF9FWEFDVF9BQ0wpOwotICAgICAgICBPQkpFQ1RfS0VZUy5hZGQoSlNPTl9PQkpFQ1RfUE9MSUNZX0lEUyk7Ci0gICAgICAgIE9CSkVDVF9LRVlTLmFkZChKU09OX09CSkVDVF9SRU5ESVRJT05TKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEFMTE9XQUJMRV9BQ1RJT05TX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgZm9yIChBY3Rpb24gYWN0aW9uIDogQWN0aW9uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBTExPV0FCTEVfQUNUSU9OU19LRVlTLmFkZChhY3Rpb24udmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFBPTElDWV9JRFNfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBQT0xJQ1lfSURTX0tFWVMuYWRkKEpTT05fT0JKRUNUX1BPTElDWV9JRFNfSURTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVElORk9MREVSX09CSkVDVCA9ICJvYmplY3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fT0JKRUNUSU5GT0xERVJfUEFUSF9TRUdNRU5UID0gInBhdGhTZWdtZW50IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gT0JKRUNUSU5GT0xERVJfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBPQkpFQ1RJTkZPTERFUl9LRVlTLmFkZChKU09OX09CSkVDVElORk9MREVSX09CSkVDVCk7Ci0gICAgICAgIE9CSkVDVElORk9MREVSX0tFWVMuYWRkKEpTT05fT0JKRUNUSU5GT0xERVJfUEFUSF9TRUdNRU5UKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVFBBUkVOVFNfT0JKRUNUID0gIm9iamVjdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RQQVJFTlRTX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCA9ICJyZWxhdGl2ZVBhdGhTZWdtZW50IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gT0JKRUNUUEFSRU5UU19LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIE9CSkVDVFBBUkVOVFNfS0VZUy5hZGQoSlNPTl9PQkpFQ1RQQVJFTlRTX09CSkVDVCk7Ci0gICAgICAgIE9CSkVDVFBBUkVOVFNfS0VZUy5hZGQoSlNPTl9PQkpFQ1RQQVJFTlRTX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9JRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9MT0NBTE5BTUUgPSAibG9jYWxOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX0RJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1FVRVJZTkFNRSA9ICJxdWVyeU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPUEVSVFlfVkFMVUUgPSAidmFsdWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPUEVSVFlfREFUQVRZUEUgPSAidHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9DQVJESU5BTElUWSA9ICJjYXJkaW5hbGl0eSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFBST1BFUlRZX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgUFJPUEVSVFlfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9JRCk7Ci0gICAgICAgIFBST1BFUlRZX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfTE9DQUxOQU1FKTsKLSAgICAgICAgUFJPUEVSVFlfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9ESVNQTEFZTkFNRSk7Ci0gICAgICAgIFBST1BFUlRZX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfUVVFUllOQU1FKTsKLSAgICAgICAgUFJPUEVSVFlfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9WQUxVRSk7Ci0gICAgICAgIFBST1BFUlRZX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfREFUQVRZUEUpOwotICAgICAgICBQUk9QRVJUWV9LRVlTLmFkZChKU09OX1BST1BFUlRZX0NBUkRJTkFMSVRZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0NIQU5HRV9FVkVOVF9UWVBFID0gImNoYW5nZVR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQ0hBTkdFX0VWRU5UX1RJTUUgPSAiY2hhbmdlVGltZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IENIQU5HRV9FVkVOVF9LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIENIQU5HRV9FVkVOVF9LRVlTLmFkZChKU09OX0NIQU5HRV9FVkVOVF9UWVBFKTsKLSAgICAgICAgQ0hBTkdFX0VWRU5UX0tFWVMuYWRkKEpTT05fQ0hBTkdFX0VWRU5UX1RJTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQUNMX0FDRVMgPSAiYWNlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9BQ0xfSVNfRVhBQ1QgPSAiaXNFeGFjdCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEFDTF9LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEFDTF9LRVlTLmFkZChKU09OX0FDTF9BQ0VTKTsKLSAgICAgICAgQUNMX0tFWVMuYWRkKEpTT05fQUNMX0lTX0VYQUNUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FDRV9QUklOQ0lQQUwgPSAicHJpbmNpcGFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FDRV9QUklOQ0lQQUxfSUQgPSAicHJpbmNpcGFsSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQUNFX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FDRV9JU19ESVJFQ1QgPSAiaXNEaXJlY3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBQ0VfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBBQ0VfS0VZUy5hZGQoSlNPTl9BQ0VfUFJJTkNJUEFMKTsKLSAgICAgICAgQUNFX0tFWVMuYWRkKEpTT05fQUNFX1BSSU5DSVBBTF9JRCk7Ci0gICAgICAgIEFDRV9LRVlTLmFkZChKU09OX0FDRV9QRVJNSVNTSU9OUyk7Ci0gICAgICAgIEFDRV9LRVlTLmFkZChKU09OX0FDRV9JU19ESVJFQ1QpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUFJJTkNJUEFMX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgUFJJTkNJUEFMX0tFWVMuYWRkKEpTT05fQUNFX1BSSU5DSVBBTF9JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRU5ESVRJT05fU1RSRUFNX0lEID0gInN0cmVhbUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFTkRJVElPTl9NSU1FVFlQRSA9ICJtaW1lVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRU5ESVRJT05fTEVOR1RIID0gImxlbmd0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRU5ESVRJT05fS0lORCA9ICJraW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1JFTkRJVElPTl9USVRMRSA9ICJ0aXRsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRU5ESVRJT05fSEVJR0hUID0gImhlaWdodCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9SRU5ESVRJT05fV0lEVEggPSAid2lkdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUkVORElUSU9OX0RPQ1VNRU5UX0lEID0gInJlbmRpdGlvbkRvY3VtZW50SWQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBSRU5ESVRJT05fS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBSRU5ESVRJT05fS0VZUy5hZGQoSlNPTl9SRU5ESVRJT05fU1RSRUFNX0lEKTsKLSAgICAgICAgUkVORElUSU9OX0tFWVMuYWRkKEpTT05fUkVORElUSU9OX01JTUVUWVBFKTsKLSAgICAgICAgUkVORElUSU9OX0tFWVMuYWRkKEpTT05fUkVORElUSU9OX0xFTkdUSCk7Ci0gICAgICAgIFJFTkRJVElPTl9LRVlTLmFkZChKU09OX1JFTkRJVElPTl9LSU5EKTsKLSAgICAgICAgUkVORElUSU9OX0tFWVMuYWRkKEpTT05fUkVORElUSU9OX1RJVExFKTsKLSAgICAgICAgUkVORElUSU9OX0tFWVMuYWRkKEpTT05fUkVORElUSU9OX0hFSUdIVCk7Ci0gICAgICAgIFJFTkRJVElPTl9LRVlTLmFkZChKU09OX1JFTkRJVElPTl9XSURUSCk7Ci0gICAgICAgIFJFTkRJVElPTl9LRVlTLmFkZChKU09OX1JFTkRJVElPTl9ET0NVTUVOVF9JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RMSVNUX09CSkVDVFMgPSAib2JqZWN0cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RMSVNUX0hBU19NT1JFX0lURU1TID0gImhhc01vcmVJdGVtcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RMSVNUX05VTV9JVEVNUyA9ICJudW1JdGVtcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RMSVNUX0NIQU5HRV9MT0dfVE9LRU4gPSAiY2hhbmdlTG9nVG9rZW4iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBPQkpFQ1RMSVNUX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgT0JKRUNUTElTVF9LRVlTLmFkZChKU09OX09CSkVDVExJU1RfT0JKRUNUUyk7Ci0gICAgICAgIE9CSkVDVExJU1RfS0VZUy5hZGQoSlNPTl9PQkpFQ1RMSVNUX0hBU19NT1JFX0lURU1TKTsKLSAgICAgICAgT0JKRUNUTElTVF9LRVlTLmFkZChKU09OX09CSkVDVExJU1RfTlVNX0lURU1TKTsKLSAgICAgICAgT0JKRUNUTElTVF9LRVlTLmFkZChKU09OX09CSkVDVExJU1RfQ0hBTkdFX0xPR19UT0tFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RJTkZPTERFUkxJU1RfT0JKRUNUUyA9ICJvYmplY3RzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVElORk9MREVSTElTVF9IQVNfTU9SRV9JVEVNUyA9ICJoYXNNb3JlSXRlbXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fT0JKRUNUSU5GT0xERVJMSVNUX05VTV9JVEVNUyA9ICJudW1JdGVtcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IE9CSkVDVElORk9MREVSTElTVF9LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIE9CSkVDVElORk9MREVSTElTVF9LRVlTLmFkZChKU09OX09CSkVDVElORk9MREVSTElTVF9PQkpFQ1RTKTsKLSAgICAgICAgT0JKRUNUSU5GT0xERVJMSVNUX0tFWVMuYWRkKEpTT05fT0JKRUNUSU5GT0xERVJMSVNUX0hBU19NT1JFX0lURU1TKTsKLSAgICAgICAgT0JKRUNUSU5GT0xERVJMSVNUX0tFWVMuYWRkKEpTT05fT0JKRUNUSU5GT0xERVJMSVNUX05VTV9JVEVNUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RJTkZPTERFUkNPTlRBSU5FUl9PQkpFQ1QgPSAib2JqZWN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVElORk9MREVSQ09OVEFJTkVSX0NISUxEUkVOID0gImNoaWxkcmVuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gT0JKRUNUSU5GT0xERVJDT05UQUlORVJfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBPQkpFQ1RJTkZPTERFUkNPTlRBSU5FUl9LRVlTLmFkZChKU09OX09CSkVDVElORk9MREVSQ09OVEFJTkVSX09CSkVDVCk7Ci0gICAgICAgIE9CSkVDVElORk9MREVSQ09OVEFJTkVSX0tFWVMuYWRkKEpTT05fT0JKRUNUSU5GT0xERVJDT05UQUlORVJfQ0hJTERSRU4pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUVVFUllSRVNVTFRMSVNUX1JFU1VMVFMgPSAicmVzdWx0cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9RVUVSWVJFU1VMVExJU1RfSEFTX01PUkVfSVRFTVMgPSAiaGFzTW9yZUl0ZW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1FVRVJZUkVTVUxUTElTVF9OVU1fSVRFTVMgPSAibnVtSXRlbXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBRVUVSWVJFU1VMVExJU1RfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBRVUVSWVJFU1VMVExJU1RfS0VZUy5hZGQoSlNPTl9RVUVSWVJFU1VMVExJU1RfUkVTVUxUUyk7Ci0gICAgICAgIFFVRVJZUkVTVUxUTElTVF9LRVlTLmFkZChKU09OX1FVRVJZUkVTVUxUTElTVF9IQVNfTU9SRV9JVEVNUyk7Ci0gICAgICAgIFFVRVJZUkVTVUxUTElTVF9LRVlTLmFkZChKU09OX1FVRVJZUkVTVUxUTElTVF9OVU1fSVRFTVMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9JRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFX0xPQ0FMTkFNRSA9ICJsb2NhbE5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9MT0NBTE5BTUVTUEFDRSA9ICJsb2NhbE5hbWVzcGFjZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFX0RJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfUVVFUllOQU1FID0gInF1ZXJ5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfQkFTRV9JRCA9ICJiYXNlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9QQVJFTlRfSUQgPSAicGFyZW50SWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9DUkVBVEFCTEUgPSAiY3JlYXRhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfRklMRUFCTEUgPSAiZmlsZWFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9RVUVSWUFCTEUgPSAicXVlcnlhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfRlVMTFRFWFRfSU5ERVhFRCA9ICJmdWxsdGV4dEluZGV4ZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9JTkNMVURFX0lOX1NVUEVSVFlQRV9RVUVSWSA9ICJpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9DT05UUk9MQUJMRV9QT0xJQ1kgPSAiY29udHJvbGxhYmxlUG9saWN5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfQ09OVFJPTEFCTEVfQUNMID0gImNvbnRyb2xsYWJsZUFDTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFX1BST1BFUlRZX0RFRklOSVRJT05TID0gInByb3BlcnR5RGVmaW5pdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFkgPSAidHlwZU11dGFiaWxpdHkiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFX1ZFUlNJT05BQkxFID0gInZlcnNpb25hYmxlIjsgLy8gZG9jdW1lbnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfQ09OVEVOVFNUUkVBTV9BTExPV0VEID0gImNvbnRlbnRTdHJlYW1BbGxvd2VkIjsgLy8gZG9jdW1lbnQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9BTExPV0VEX1NPVVJDRV9UWVBFUyA9ICJhbGxvd2VkU291cmNlVHlwZXMiOyAvLyByZWxhdGlvbnNoaXAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfQUxMT1dFRF9UQVJHRVRfVFlQRVMgPSAiYWxsb3dlZFRhcmdldFR5cGVzIjsgLy8gcmVsYXRpb25zaGlwCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFRZUEVfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9JRCk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX0xPQ0FMTkFNRSk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX0xPQ0FMTkFNRVNQQUNFKTsKLSAgICAgICAgVFlQRV9LRVlTLmFkZChKU09OX1RZUEVfRElTUExBWU5BTUUpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9RVUVSWU5BTUUpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9ERVNDUklQVElPTik7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX0JBU0VfSUQpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9QQVJFTlRfSUQpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9DUkVBVEFCTEUpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9GSUxFQUJMRSk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX1FVRVJZQUJMRSk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX0ZVTExURVhUX0lOREVYRUQpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9JTkNMVURFX0lOX1NVUEVSVFlQRV9RVUVSWSk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX0NPTlRST0xBQkxFX1BPTElDWSk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX0NPTlRST0xBQkxFX0FDTCk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX1BST1BFUlRZX0RFRklOSVRJT05TKTsKLSAgICAgICAgVFlQRV9LRVlTLmFkZChKU09OX1RZUEVfVkVSU0lPTkFCTEUpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9DT05URU5UU1RSRUFNX0FMTE9XRUQpOwotICAgICAgICBUWVBFX0tFWVMuYWRkKEpTT05fVFlQRV9BTExPV0VEX1NPVVJDRV9UWVBFUyk7Ci0gICAgICAgIFRZUEVfS0VZUy5hZGQoSlNPTl9UWVBFX0FMTE9XRURfVEFSR0VUX1RZUEVTKTsKLSAgICAgICAgVFlQRV9LRVlTLmFkZChKU09OX1RZUEVfVFlQRV9NVVRBQklMSVRZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfSUQgPSAiaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUUgPSAibG9jYWxOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfTE9DQUxOQU1FU1BBQ0UgPSAibG9jYWxOYW1lc3BhY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPUEVSVFlfVFlQRV9ESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX1FVRVJZTkFNRSA9ICJxdWVyeU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPUEVSVFlfVFlQRV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX1BST1BFUlRZX1RZUEUgPSAicHJvcGVydHlUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfQ0FSRElOQUxJVFkgPSAiY2FyZGluYWxpdHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPUEVSVFlfVFlQRV9VUERBVEFCSUxJVFkgPSAidXBkYXRhYmlsaXR5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfSU5IRVJJVEVEID0gImluaGVyaXRlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX1JFUVVJUkVEID0gInJlcXVpcmVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfUVVFUllBQkxFID0gInF1ZXJ5YWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX09SREVSQUJMRSA9ICJvcmRlcmFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPUEVSVFlfVFlQRV9PUEVOQ0hPSUNFID0gIm9wZW5DaG9pY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSA9ICJkZWZhdWx0VmFsdWUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX01BWF9MRU5HVEggPSAibWF4TGVuZ3RoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfTUlOX1ZBTFVFID0gIm1pblZhbHVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfTUFYX1ZBTFVFID0gIm1heFZhbHVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfUFJFQ0lTSU9OID0gInByZWNpc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX1JFU09MVVRJT04gPSAicmVzb2x1dGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFID0gImNob2ljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9ESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9WQUxVRSA9ICJ2YWx1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9DSE9JQ0UgPSAiY2hvaWNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUFJPUEVSVFlfVFlQRV9LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX0lEKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfTE9DQUxOQU1FKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfTE9DQUxOQU1FU1BBQ0UpOwotICAgICAgICBQUk9QRVJUWV9UWVBFX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfVFlQRV9ESVNQTEFZTkFNRSk7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX1FVRVJZTkFNRSk7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfUFJPUEVSVFlfVFlQRSk7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMSVRZKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfVVBEQVRBQklMSVRZKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfSU5IRVJJVEVEKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfUkVRVUlSRUQpOwotICAgICAgICBQUk9QRVJUWV9UWVBFX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfVFlQRV9RVUVSWUFCTEUpOwotICAgICAgICBQUk9QRVJUWV9UWVBFX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfVFlQRV9PUkRFUkFCTEUpOwotICAgICAgICBQUk9QRVJUWV9UWVBFX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfVFlQRV9PUEVOQ0hPSUNFKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfREVBVUxUX1ZBTFVFKTsKLSAgICAgICAgUFJPUEVSVFlfVFlQRV9LRVlTLmFkZChKU09OX1BST1BFUlRZX1RZUEVfTUFYX0xFTkdUSCk7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX01JTl9WQUxVRSk7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX01BWF9WQUxVRSk7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX1BSRUNJU0lPTik7Ci0gICAgICAgIFBST1BFUlRZX1RZUEVfS0VZUy5hZGQoSlNPTl9QUk9QRVJUWV9UWVBFX1JFU09MVVRJT04pOwotICAgICAgICBQUk9QRVJUWV9UWVBFX0tFWVMuYWRkKEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfQ1JFQVRFID0gImNyZWF0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFX1RZUEVfTVVUQUJJTElUWV9VUERBVEUgPSAidXBkYXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVfVFlQRV9NVVRBQklMSVRZX0RFTEVURSA9ICJkZWxldGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBKU09OX1RZUEVfVFlQRV9NVVRBQklMSVRZX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgSlNPTl9UWVBFX1RZUEVfTVVUQUJJTElUWV9LRVlTLmFkZChKU09OX1RZUEVfVFlQRV9NVVRBQklMSVRZX0NSRUFURSk7Ci0gICAgICAgIEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfS0VZUy5hZGQoSlNPTl9UWVBFX1RZUEVfTVVUQUJJTElUWV9VUERBVEUpOwotICAgICAgICBKU09OX1RZUEVfVFlQRV9NVVRBQklMSVRZX0tFWVMuYWRkKEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfREVMRVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVTTElTVF9UWVBFUyA9ICJ0eXBlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFU0xJU1RfSEFTX01PUkVfSVRFTVMgPSAiaGFzTW9yZUl0ZW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVTTElTVF9OVU1fSVRFTVMgPSAibnVtSXRlbXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBUWVBFU0xJU1RfS0VZUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBUWVBFU0xJU1RfS0VZUy5hZGQoSlNPTl9UWVBFU0xJU1RfVFlQRVMpOwotICAgICAgICBUWVBFU0xJU1RfS0VZUy5hZGQoSlNPTl9UWVBFU0xJU1RfSEFTX01PUkVfSVRFTVMpOwotICAgICAgICBUWVBFU0xJU1RfS0VZUy5hZGQoSlNPTl9UWVBFU0xJU1RfTlVNX0lURU1TKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEVTQ09OVEFJTkVSX1RZUEUgPSAidHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFU0NPTlRBSU5FUl9DSElMRFJFTiA9ICJjaGlsZHJlbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFRZUEVTQ09OVEFJTkVSX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgVFlQRVNDT05UQUlORVJfS0VZUy5hZGQoSlNPTl9UWVBFU0NPTlRBSU5FUl9UWVBFKTsKLSAgICAgICAgVFlQRVNDT05UQUlORVJfS0VZUy5hZGQoSlNPTl9UWVBFU0NPTlRBSU5FUl9DSElMRFJFTik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GQUlMRURUT0RFTEVURV9JRCA9ICJpZHMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBGQUlMRURUT0RFTEVURV9LRVlTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEZBSUxFRFRPREVMRVRFX0tFWVMuYWRkKEpTT05fRkFJTEVEVE9ERUxFVEVfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQlVMS19VUERBVEVfSUQgPSAiaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQlVMS19VUERBVEVfTkVXX0lEID0gIm5ld0lkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0JVTEtfVVBEQVRFX0NIQU5HRV9UT0tFTiA9ICJjaGFuZ2VUb2tlbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEJVTEtfVVBEQVRFX0tFWVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgQlVMS19VUERBVEVfS0VZUy5hZGQoSlNPTl9CVUxLX1VQREFURV9JRCk7Ci0gICAgICAgIEJVTEtfVVBEQVRFX0tFWVMuYWRkKEpTT05fQlVMS19VUERBVEVfTkVXX0lEKTsKLSAgICAgICAgQlVMS19VUERBVEVfS0VZUy5hZGQoSlNPTl9CVUxLX1VQREFURV9DSEFOR0VfVE9LRU4pOwotICAgIH0KLQotICAgIC8vIENvbnN0YW50IHV0aWxpdHkgY2xhc3MuCi0gICAgcHJpdmF0ZSBKU09OQ29uc3RhbnRzKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9KU09OQ29udmVydGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0pTT05Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhMWEyYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL0pTT05Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTnVsbE9yRW1wdHk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29uc3RhbnRzLio7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLkV4dGVuc2lvbkZlYXR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2xDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DaGFuZ2VFdmVudEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNtaXNFeHRlbnNpb25FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DcmVhdGFibGVQcm9wZXJ0eVR5cGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBlcm1pc3Npb25NYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qb2xpY3lJZExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5Qm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGFXaXRoRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRlVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEZWNpbWFsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUh0bWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5VXJpOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkNob2ljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5QZXJtaXNzaW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlJZERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlVcmlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZU11dGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5QWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNoYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Sm9pbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlPcmRlckJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVJlbmRpdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Db250ZW50U3RyZWFtQWxsb3dlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGF0ZVRpbWVSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGVjaW1hbFByZWNpc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlN1cHBvcnRlZFBlcm1pc3Npb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFsbG93YWJsZUFjdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNoYW5nZUV2ZW50SW5mb0RhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DaG9pY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DbWlzRXh0ZW5zaW9uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRXh0ZW5zaW9uRmVhdHVyZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkZhaWxlZFRvRGVsZXRlRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkZvbGRlclR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuSXRlbVR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RQYXJlbnREYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUG9saWN5SWRMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUG9saWN5VHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEYXRlVGltZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUlkSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlbmRpdGlvbkRhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUluZm9Ccm93c2VyQmluZGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlRGVmaW5pdGlvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlTXV0YWJpbGl0eUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTkFycmF5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05PYmplY3Q7Ci0KLS8qKgotICogT3BlbkNNSVMgb2JqZWN0cyB0byBKU09OIGNvbnZlcnRlci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpTT05Db252ZXJ0ZXIgewotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwcml2YXRlIEpTT05Db252ZXJ0ZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGVudW0gUHJvcGVydHlNb2RlIHsKLSAgICAgICAgLyoqIG9iamVjdCAqLwotICAgICAgICBPQkpFQ1QsCi0gICAgICAgIC8qKiBxdWVyeSByZXN1bHQgKi8KLSAgICAgICAgUVVFUlksCi0gICAgICAgIC8qKiBjaGFuZ2UgZXZlbnQgKi8KLSAgICAgICAgQ0hBTkdFCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSByZXBvc2l0b3J5IGluZm8gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnlJbmZvLCBmaW5hbCBTdHJpbmcgcmVwb3NpdG9yeVVybCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByb290VXJsLCBmaW5hbCBib29sZWFuIGFkZEV4dGVuZGVkRGF0ZXRpbWVFeHRlbnNpb25GZWF0dXJlKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICByZXN1bHQucHV0KEpTT05fUkVQSU5GT19JRCwgcmVwb3NpdG9yeUluZm8uZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9SRVBJTkZPX05BTUUsIHJlcG9zaXRvcnlJbmZvLmdldE5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9SRVBJTkZPX0RFU0NSSVBUSU9OLCByZXBvc2l0b3J5SW5mby5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFUElORk9fVkVORE9SLCByZXBvc2l0b3J5SW5mby5nZXRWZW5kb3JOYW1lKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fUkVQSU5GT19QUk9EVUNULCByZXBvc2l0b3J5SW5mby5nZXRQcm9kdWN0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFUElORk9fUFJPRFVDVF9WRVJTSU9OLCByZXBvc2l0b3J5SW5mby5nZXRQcm9kdWN0VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFUElORk9fUk9PVF9GT0xERVJfSUQsIHJlcG9zaXRvcnlJbmZvLmdldFJvb3RGb2xkZXJJZCgpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFUElORk9fQ0FQQUJJTElUSUVTLCBjb252ZXJ0KHJlcG9zaXRvcnlJbmZvLmdldENhcGFiaWxpdGllcygpKSk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX1JFUElORk9fQUNMX0NBUEFCSUxJVElFUywgY29udmVydChyZXBvc2l0b3J5SW5mby5nZXRBY2xDYXBhYmlsaXRpZXMoKSksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9SRVBJTkZPX0NIQU5HRV9MT0dfVE9LRU4sIHJlcG9zaXRvcnlJbmZvLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fUkVQSU5GT19DTUlTX1ZFUlNJT05fU1VQUE9SVEVELCByZXBvc2l0b3J5SW5mby5nZXRDbWlzVmVyc2lvblN1cHBvcnRlZCgpKTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUkVQSU5GT19USElOX0NMSUVOVF9VUkksIHJlcG9zaXRvcnlJbmZvLmdldFRoaW5DbGllbnRVcmkoKSwgcmVzdWx0KTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUkVQSU5GT19DSEFOR0VTX0lOQ09NUExFVEUsIHJlcG9zaXRvcnlJbmZvLmdldENoYW5nZXNJbmNvbXBsZXRlKCksIHJlc3VsdCk7Ci0KLSAgICAgICAgSlNPTkFycmF5IGNoYW5nZXNPblR5cGUgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SW5mby5nZXRDaGFuZ2VzT25UeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChCYXNlVHlwZUlkIHR5cGUgOiByZXBvc2l0b3J5SW5mby5nZXRDaGFuZ2VzT25UeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXNPblR5cGUuYWRkKGdldEpTT05TdHJpbmdWYWx1ZSh0eXBlLnZhbHVlKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFUElORk9fQ0hBTkdFU19PTl9UWVBFLCBjaGFuZ2VzT25UeXBlKTsKLQotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9SRVBJTkZPX1BSSU5DSVBBTF9JRF9BTk9OWU1PVVMsIHJlcG9zaXRvcnlJbmZvLmdldFByaW5jaXBhbElkQW5vbnltb3VzKCksIHJlc3VsdCk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX1JFUElORk9fUFJJTkNJUEFMX0lEX0FOWU9ORSwgcmVwb3NpdG9yeUluZm8uZ2V0UHJpbmNpcGFsSWRBbnlvbmUoKSwgcmVzdWx0KTsKLQotICAgICAgICBpZiAoaXNOb3RFbXB0eShyZXBvc2l0b3J5SW5mby5nZXRFeHRlbnNpb25GZWF0dXJlcygpKSkgewotICAgICAgICAgICAgSlNPTkFycmF5IGV4dGVuZGVkRmVhdHVyZXMgPSBuZXcgSlNPTkFycmF5KCk7Ci0KLSAgICAgICAgICAgIGZvciAoRXh0ZW5zaW9uRmVhdHVyZSBmZWF0dXJlIDogcmVwb3NpdG9yeUluZm8uZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSkgewotICAgICAgICAgICAgICAgIGV4dGVuZGVkRmVhdHVyZXMuYWRkKGNvbnZlcnQoZmVhdHVyZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fUkVQSU5GT19FWFRFTkRFRF9GRUFUVVJFUywgZXh0ZW5kZWRGZWF0dXJlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWRkRXh0ZW5kZWREYXRldGltZUV4dGVuc2lvbkZlYXR1cmUpIHsKLSAgICAgICAgICAgIEpTT05BcnJheSBleHRlbmRlZEZlYXR1cmVzID0gKEpTT05BcnJheSkgcmVzdWx0LmdldChKU09OX1JFUElORk9fRVhURU5ERURfRkVBVFVSRVMpOwotICAgICAgICAgICAgYm9vbGVhbiBhZGRGZWF0dXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChleHRlbmRlZEZlYXR1cmVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleHRlbmRlZEZlYXR1cmVzID0gbmV3IEpTT05BcnJheSgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9SRVBJTkZPX0VYVEVOREVEX0ZFQVRVUkVTLCBleHRlbmRlZEZlYXR1cmVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZWYgOiBleHRlbmRlZEZlYXR1cmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlZiBpbnN0YW5jZW9mIEV4dGVuc2lvbkZlYXR1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeHRlbnNpb25GZWF0dXJlcy5FWFRFTkRFRF9EQVRFVElNRV9GT1JNQVQuZ2V0SWQoKS5lcXVhbHMoKChFeHRlbnNpb25GZWF0dXJlKSBlZikuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRGZWF0dXJlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhZGRGZWF0dXJlKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5kZWRGZWF0dXJlcy5hZGQoY29udmVydChFeHRlbnNpb25GZWF0dXJlcy5FWFRFTkRFRF9EQVRFVElNRV9GT1JNQVQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9SRVBJTkZPX1JFUE9TSVRPUllfVVJMLCByZXBvc2l0b3J5VXJsKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFUElORk9fUk9PVF9GT0xERVJfVVJMLCByb290VXJsKTsKLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHJlcG9zaXRvcnlJbmZvLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIEV4dGVuc2lvbkZlYXR1cmUgZmVhdHVyZSkgewotICAgICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QganNvbkZlYXR1cmUgPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgIHNldElmTm90TnVsbChKU09OX0ZFQVRVUkVfSUQsIGZlYXR1cmUuZ2V0SWQoKSwganNvbkZlYXR1cmUpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9GRUFUVVJFX1VSTCwgZmVhdHVyZS5nZXRVcmwoKSwganNvbkZlYXR1cmUpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9GRUFUVVJFX0NPTU1PTl9OQU1FLCBmZWF0dXJlLmdldENvbW1vbk5hbWUoKSwganNvbkZlYXR1cmUpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9GRUFUVVJFX1ZFUlNJT05fTEFCRUwsIGZlYXR1cmUuZ2V0VmVyc2lvbkxhYmVsKCksIGpzb25GZWF0dXJlKTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fRkVBVFVSRV9ERVNDUklQVElPTiwgZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLCBqc29uRmVhdHVyZSk7Ci0KLSAgICAgICAgaWYgKGlzTm90RW1wdHkoZmVhdHVyZS5nZXRGZWF0dXJlRGF0YSgpKSkgewotICAgICAgICAgICAgSlNPTk9iamVjdCBkYXRhID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgICAgIGRhdGEucHV0QWxsKGZlYXR1cmUuZ2V0RmVhdHVyZURhdGEoKSk7Ci0gICAgICAgICAgICBqc29uRmVhdHVyZS5wdXQoSlNPTl9GRUFUVVJFX0RBVEEsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihmZWF0dXJlLCBqc29uRmVhdHVyZSk7Ci0KLSAgICAgICAgcmV0dXJuIGpzb25GZWF0dXJlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgY2FwYWJpbGl0aWVzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpTT05PYmplY3QgY29udmVydChmaW5hbCBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzIGNhcGFiaWxpdGllcykgewotICAgICAgICBpZiAoY2FwYWJpbGl0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9DQVBfQ09OVEVOVF9TVFJFQU1fVVBEQVRBQklMSVRZLAotICAgICAgICAgICAgICAgIGdldEpTT05FbnVtVmFsdWUoY2FwYWJpbGl0aWVzLmdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9DQVBfQ0hBTkdFUywgZ2V0SlNPTkVudW1WYWx1ZShjYXBhYmlsaXRpZXMuZ2V0Q2hhbmdlc0NhcGFiaWxpdHkoKSkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fQ0FQX1JFTkRJVElPTlMsIGdldEpTT05FbnVtVmFsdWUoY2FwYWJpbGl0aWVzLmdldFJlbmRpdGlvbnNDYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX0NBUF9HRVRfREVTQ0VOREFOVFMsIGNhcGFiaWxpdGllcy5pc0dldERlc2NlbmRhbnRzU3VwcG9ydGVkKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fQ0FQX0dFVF9GT0xERVJfVFJFRSwgY2FwYWJpbGl0aWVzLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX0NBUF9NVUxUSUZJTElORywgY2FwYWJpbGl0aWVzLmlzTXVsdGlmaWxpbmdTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9DQVBfVU5GSUxJTkcsIGNhcGFiaWxpdGllcy5pc1VuZmlsaW5nU3VwcG9ydGVkKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fQ0FQX1ZFUlNJT05fU1BFQ0lGSUNfRklMSU5HLCBjYXBhYmlsaXRpZXMuaXNWZXJzaW9uU3BlY2lmaWNGaWxpbmdTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9DQVBfUFdDX1NFQVJDSEFCTEUsIGNhcGFiaWxpdGllcy5pc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9DQVBfUFdDX1VQREFUQUJMRSwgY2FwYWJpbGl0aWVzLmlzUHdjVXBkYXRhYmxlU3VwcG9ydGVkKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fQ0FQX0FMTF9WRVJTSU9OU19TRUFSQ0hBQkxFLCBjYXBhYmlsaXRpZXMuaXNBbGxWZXJzaW9uc1NlYXJjaGFibGVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9DQVBfT1JERVJfQlksIGdldEpTT05FbnVtVmFsdWUoY2FwYWJpbGl0aWVzLmdldE9yZGVyQnlDYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX0NBUF9RVUVSWSwgZ2V0SlNPTkVudW1WYWx1ZShjYXBhYmlsaXRpZXMuZ2V0UXVlcnlDYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX0NBUF9KT0lOLCBnZXRKU09ORW51bVZhbHVlKGNhcGFiaWxpdGllcy5nZXRKb2luQ2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9DQVBfQUNMLCBnZXRKU09ORW51bVZhbHVlKGNhcGFiaWxpdGllcy5nZXRBY2xDYXBhYmlsaXR5KCkpKTsKLQotICAgICAgICBpZiAoY2FwYWJpbGl0aWVzLmdldENyZWF0YWJsZVByb3BlcnR5VHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzIGNyZWF0YWJsZVByb3BlcnR5VHlwZXMgPSBjYXBhYmlsaXRpZXMuZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpOwotCi0gICAgICAgICAgICBKU09OT2JqZWN0IGNyZWF0YWJsZVByb3BlcnR5VHlwZXNKc29uID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICAgICAgaWYgKGNyZWF0YWJsZVByb3BlcnR5VHlwZXMuY2FuQ3JlYXRlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpTT05BcnJheSBjYW5DcmVhdGUgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eVR5cGUgcHJvcFR5cGUgOiBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzLmNhbkNyZWF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW5DcmVhdGUuYWRkKHByb3BUeXBlLnZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNyZWF0YWJsZVByb3BlcnR5VHlwZXNKc29uLnB1dChKU09OX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfQ0FOQ1JFQVRFLCBjYW5DcmVhdGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGNyZWF0YWJsZVByb3BlcnR5VHlwZXMsIGNyZWF0YWJsZVByb3BlcnR5VHlwZXNKc29uKTsKLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVMsIGNyZWF0YWJsZVByb3BlcnR5VHlwZXNKc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYXBhYmlsaXRpZXMuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyA9IGNhcGFiaWxpdGllcy5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIEpTT05PYmplY3QgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24gPSBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24ucHV0KEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfSUQsCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SWQoKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbi5wdXQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19MT0NBTE5BTUUsCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24ucHV0KEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfTE9DQUxOQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbi5wdXQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19ESVNQTEFZTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLnB1dChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX1FVRVJZTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbi5wdXQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLnB1dChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NSRUFURUFCTEUsCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0Q3JlYXRhYmxlKCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24ucHV0KEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRklMRUFCTEUsCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RmlsZWFibGUoKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbi5wdXQoSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19RVUVSWUFCTEUsCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0UXVlcnlhYmxlKCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24ucHV0KEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRlVMTFRFWFRJTkRFWEVELAotICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldEZ1bGx0ZXh0SW5kZXhlZCgpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLnB1dChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lOQ0xVREVESU5TVVBFUlRZVFBFUVVFUlksCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24ucHV0KEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ09OVFJPTEFCTEVQT0xJQ1ksCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24ucHV0KEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ09OVFJPTEFCTEVBQ0wsCi0gICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0Q29udHJvbGxhYmxlQWNsKCkpOwotCi0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMsIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uKTsKLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTLCBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGNhcGFiaWxpdGllcywgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIEFDTCBjYXBhYmlsaXRpZXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIEFjbENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgaWYgKGNhcGFiaWxpdGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICByZXN1bHQucHV0KEpTT05fQUNMQ0FQX1NVUFBPUlRFRF9QRVJNSVNTSU9OUywgZ2V0SlNPTkVudW1WYWx1ZShjYXBhYmlsaXRpZXMuZ2V0U3VwcG9ydGVkUGVybWlzc2lvbnMoKSkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fQUNMQ0FQX0FDTF9QUk9QQUdBVElPTiwgZ2V0SlNPTkVudW1WYWx1ZShjYXBhYmlsaXRpZXMuZ2V0QWNsUHJvcGFnYXRpb24oKSkpOwotCi0gICAgICAgIC8vIHBlcm1pc3Npb25zCi0gICAgICAgIGlmIChjYXBhYmlsaXRpZXMuZ2V0UGVybWlzc2lvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKU09OQXJyYXkgcGVybWlzc2lvbnMgPSBuZXcgSlNPTkFycmF5KCk7Ci0KLSAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbkRlZmluaXRpb24gcGVybURlZiA6IGNhcGFiaWxpdGllcy5nZXRQZXJtaXNzaW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgSlNPTk9iamVjdCBwZXJtaXNzaW9uID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLnB1dChKU09OX0FDTENBUF9QRVJNSVNTSU9OX1BFUk1JU1NJT04sIHBlcm1EZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcGVybWlzc2lvbi5wdXQoSlNPTl9BQ0xDQVBfUEVSTUlTU0lPTl9ERVNDUklQVElPTiwgcGVybURlZi5nZXREZXNjcmlwdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLmFkZChwZXJtaXNzaW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX0FDTENBUF9QRVJNSVNTSU9OUywgcGVybWlzc2lvbnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGVybWlzc2lvbiBtYXBwaW5nCi0gICAgICAgIGlmIChjYXBhYmlsaXRpZXMuZ2V0UGVybWlzc2lvbk1hcHBpbmcoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKU09OQXJyYXkgcGVybWlzc2lvbk1hcHBpbmcgPSBuZXcgSlNPTkFycmF5KCk7Ci0KLSAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbk1hcHBpbmcgcGVybU1hcCA6IGNhcGFiaWxpdGllcy5nZXRQZXJtaXNzaW9uTWFwcGluZygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgSlNPTkFycmF5IG1hcHBpbmdQZXJtaXNzaW9ucyA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAocGVybU1hcC5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcCA6IHBlcm1NYXAuZ2V0UGVybWlzc2lvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1Blcm1pc3Npb25zLmFkZChwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEpTT05PYmplY3QgbWFwcGluZyA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgbWFwcGluZy5wdXQoSlNPTl9BQ0xDQVBfTUFQUElOR19LRVksIHBlcm1NYXAuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIG1hcHBpbmcucHV0KEpTT05fQUNMQ0FQX01BUFBJTkdfUEVSTUlTU0lPTiwgbWFwcGluZ1Blcm1pc3Npb25zKTsKLQotICAgICAgICAgICAgICAgIHBlcm1pc3Npb25NYXBwaW5nLmFkZChtYXBwaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX0FDTENBUF9QRVJNSVNTSU9OX01BUFBJTkcsIHBlcm1pc3Npb25NYXBwaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY2FwYWJpbGl0aWVzLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5SW5mbyBjb252ZXJ0UmVwb3NpdG9yeUluZm8oZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVwb3NpdG9yeUluZm9Ccm93c2VyQmluZGluZ0ltcGwgcmVzdWx0ID0gbmV3IFJlcG9zaXRvcnlJbmZvQnJvd3NlckJpbmRpbmdJbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldElkKGdldFN0cmluZyhqc29uLCBKU09OX1JFUElORk9fSUQpKTsKLSAgICAgICAgcmVzdWx0LnNldE5hbWUoZ2V0U3RyaW5nKGpzb24sIEpTT05fUkVQSU5GT19OQU1FKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREZXNjcmlwdGlvbihnZXRTdHJpbmcoanNvbiwgSlNPTl9SRVBJTkZPX0RFU0NSSVBUSU9OKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRWZW5kb3JOYW1lKGdldFN0cmluZyhqc29uLCBKU09OX1JFUElORk9fVkVORE9SKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRQcm9kdWN0TmFtZShnZXRTdHJpbmcoanNvbiwgSlNPTl9SRVBJTkZPX1BST0RVQ1QpKTsKLSAgICAgICAgcmVzdWx0LnNldFByb2R1Y3RWZXJzaW9uKGdldFN0cmluZyhqc29uLCBKU09OX1JFUElORk9fUFJPRFVDVF9WRVJTSU9OKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRSb290Rm9sZGVyKGdldFN0cmluZyhqc29uLCBKU09OX1JFUElORk9fUk9PVF9GT0xERVJfSUQpKTsKLSAgICAgICAgcmVzdWx0LnNldFJlcG9zaXRvcnlVcmwoZ2V0U3RyaW5nKGpzb24sIEpTT05fUkVQSU5GT19SRVBPU0lUT1JZX1VSTCkpOwotICAgICAgICByZXN1bHQuc2V0Um9vdFVybChnZXRTdHJpbmcoanNvbiwgSlNPTl9SRVBJTkZPX1JPT1RfRk9MREVSX1VSTCkpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0aWVzKGNvbnZlcnRSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzKGdldE1hcChqc29uLmdldChKU09OX1JFUElORk9fQ0FQQUJJTElUSUVTKSkpKTsKLSAgICAgICAgcmVzdWx0LnNldEFjbENhcGFiaWxpdGllcyhjb252ZXJ0QWNsQ2FwYWJpbGl0aWVzKGdldE1hcChqc29uLmdldChKU09OX1JFUElORk9fQUNMX0NBUEFCSUxJVElFUykpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbihnZXRTdHJpbmcoanNvbiwgSlNPTl9SRVBJTkZPX0NIQU5HRV9MT0dfVE9LRU4pKTsKLSAgICAgICAgcmVzdWx0LnNldENtaXNWZXJzaW9uU3VwcG9ydGVkKGdldFN0cmluZyhqc29uLCBKU09OX1JFUElORk9fQ01JU19WRVJTSU9OX1NVUFBPUlRFRCkpOwotICAgICAgICByZXN1bHQuc2V0VGhpbkNsaWVudFVyaShnZXRTdHJpbmcoanNvbiwgSlNPTl9SRVBJTkZPX1RISU5fQ0xJRU5UX1VSSSkpOwotICAgICAgICByZXN1bHQuc2V0Q2hhbmdlc0luY29tcGxldGUoZ2V0Qm9vbGVhbihqc29uLCBKU09OX1JFUElORk9fQ0hBTkdFU19JTkNPTVBMRVRFKSk7Ci0KLSAgICAgICAgTGlzdDxPYmplY3Q+IGNoYW5nZXNPblR5cGUgPSBnZXRMaXN0KGpzb24uZ2V0KEpTT05fUkVQSU5GT19DSEFOR0VTX09OX1RZUEUpKTsKLSAgICAgICAgaWYgKGNoYW5nZXNPblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxCYXNlVHlwZUlkPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8QmFzZVR5cGVJZD4oKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHR5cGUgOiBjaGFuZ2VzT25UeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQoQmFzZVR5cGVJZC5mcm9tVmFsdWUodHlwZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LnNldENoYW5nZXNPblR5cGUodHlwZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldFByaW5jaXBhbEFub255bW91cyhnZXRTdHJpbmcoanNvbiwgSlNPTl9SRVBJTkZPX1BSSU5DSVBBTF9JRF9BTk9OWU1PVVMpKTsKLSAgICAgICAgcmVzdWx0LnNldFByaW5jaXBhbEFueW9uZShnZXRTdHJpbmcoanNvbiwgSlNPTl9SRVBJTkZPX1BSSU5DSVBBTF9JRF9BTllPTkUpKTsKLQotICAgICAgICBMaXN0PE9iamVjdD4gZXh0ZW5kZWRGZWF0dXJlcyA9IGdldExpc3QoanNvbi5nZXQoSlNPTl9SRVBJTkZPX0VYVEVOREVEX0ZFQVRVUkVTKSk7Ci0gICAgICAgIGlmIChleHRlbmRlZEZlYXR1cmVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8RXh0ZW5zaW9uRmVhdHVyZT4gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEV4dGVuc2lvbkZlYXR1cmU+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGV4dGVuZGVkRmVhdHVyZSA6IGV4dGVuZGVkRmVhdHVyZXMpIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb25GZWF0dXJlID0gZ2V0TWFwKGV4dGVuZGVkRmVhdHVyZSk7Ci0KLSAgICAgICAgICAgICAgICBFeHRlbnNpb25GZWF0dXJlSW1wbCBmZWF0dXJlID0gbmV3IEV4dGVuc2lvbkZlYXR1cmVJbXBsKCk7Ci0gICAgICAgICAgICAgICAgZmVhdHVyZS5zZXRJZChnZXRTdHJpbmcoanNvbkZlYXR1cmUsIEpTT05fRkVBVFVSRV9JRCkpOwotICAgICAgICAgICAgICAgIGZlYXR1cmUuc2V0VXJsKGdldFN0cmluZyhqc29uRmVhdHVyZSwgSlNPTl9GRUFUVVJFX1VSTCkpOwotICAgICAgICAgICAgICAgIGZlYXR1cmUuc2V0Q29tbW9uTmFtZShnZXRTdHJpbmcoanNvbkZlYXR1cmUsIEpTT05fRkVBVFVSRV9DT01NT05fTkFNRSkpOwotICAgICAgICAgICAgICAgIGZlYXR1cmUuc2V0VmVyc2lvbkxhYmVsKGdldFN0cmluZyhqc29uRmVhdHVyZSwgSlNPTl9GRUFUVVJFX1ZFUlNJT05fTEFCRUwpKTsKLSAgICAgICAgICAgICAgICBmZWF0dXJlLnNldERlc2NyaXB0aW9uKGdldFN0cmluZyhqc29uRmVhdHVyZSwgSlNPTl9GRUFUVVJFX0RFU0NSSVBUSU9OKSk7Ci0KLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGEgPSBnZXRNYXAoanNvbkZlYXR1cmUuZ2V0KEpTT05fRkVBVFVSRV9EQVRBKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBkYXRhTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlIDogZGF0YS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhTWFwLnB1dChlLmdldEtleSgpLCAoZS5nZXRWYWx1ZSgpID09IG51bGwgPyBudWxsIDogZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YU1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuc2V0RmVhdHVyZURhdGEoZGF0YU1hcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGpzb25GZWF0dXJlLCBmZWF0dXJlLCBGRUFUVVJFX0tFWVMpOwotCi0gICAgICAgICAgICAgICAgZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWZlYXR1cmVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRFeHRlbnNpb25GZWF0dXJlKGZlYXR1cmVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvbiwgcmVzdWx0LCBSRVBJTkZPX0tFWVMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzIGNvbnZlcnRSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbikgewotICAgICAgICBpZiAoanNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsIHJlc3VsdCA9IG5ldyBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMoZ2V0RW51bShqc29uLCBKU09OX0NBUF9DT05URU5UX1NUUkVBTV9VUERBVEFCSUxJVFksCi0gICAgICAgICAgICAgICAgQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLmNsYXNzKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5Q2hhbmdlcyhnZXRFbnVtKGpzb24sIEpTT05fQ0FQX0NIQU5HRVMsIENhcGFiaWxpdHlDaGFuZ2VzLmNsYXNzKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5UmVuZGl0aW9uKGdldEVudW0oanNvbiwgSlNPTl9DQVBfUkVORElUSU9OUywgQ2FwYWJpbGl0eVJlbmRpdGlvbnMuY2xhc3MpKTsKLSAgICAgICAgcmVzdWx0LnNldFN1cHBvcnRzR2V0RGVzY2VuZGFudHMoZ2V0Qm9vbGVhbihqc29uLCBKU09OX0NBUF9HRVRfREVTQ0VOREFOVFMpKTsKLSAgICAgICAgcmVzdWx0LnNldFN1cHBvcnRzR2V0Rm9sZGVyVHJlZShnZXRCb29sZWFuKGpzb24sIEpTT05fQ0FQX0dFVF9GT0xERVJfVFJFRSkpOwotICAgICAgICByZXN1bHQuc2V0U3VwcG9ydHNNdWx0aWZpbGluZyhnZXRCb29sZWFuKGpzb24sIEpTT05fQ0FQX01VTFRJRklMSU5HKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRTdXBwb3J0c1VuZmlsaW5nKGdldEJvb2xlYW4oanNvbiwgSlNPTl9DQVBfVU5GSUxJTkcpKTsKLSAgICAgICAgcmVzdWx0LnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKGdldEJvb2xlYW4oanNvbiwgSlNPTl9DQVBfVkVSU0lPTl9TUEVDSUZJQ19GSUxJTkcpKTsKLSAgICAgICAgcmVzdWx0LnNldElzUHdjU2VhcmNoYWJsZShnZXRCb29sZWFuKGpzb24sIEpTT05fQ0FQX1BXQ19TRUFSQ0hBQkxFKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1B3Y1VwZGF0YWJsZShnZXRCb29sZWFuKGpzb24sIEpTT05fQ0FQX1BXQ19VUERBVEFCTEUpKTsKLSAgICAgICAgcmVzdWx0LnNldEFsbFZlcnNpb25zU2VhcmNoYWJsZShnZXRCb29sZWFuKGpzb24sIEpTT05fQ0FQX0FMTF9WRVJTSU9OU19TRUFSQ0hBQkxFKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5T3JkZXJCeShnZXRFbnVtKGpzb24sIEpTT05fQ0FQX09SREVSX0JZLCBDYXBhYmlsaXR5T3JkZXJCeS5jbGFzcykpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eVF1ZXJ5KGdldEVudW0oanNvbiwgSlNPTl9DQVBfUVVFUlksIENhcGFiaWxpdHlRdWVyeS5jbGFzcykpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eUpvaW4oZ2V0RW51bShqc29uLCBKU09OX0NBUF9KT0lOLCBDYXBhYmlsaXR5Sm9pbi5jbGFzcykpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eUFjbChnZXRFbnVtKGpzb24sIEpTT05fQ0FQX0FDTCwgQ2FwYWJpbGl0eUFjbC5jbGFzcykpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY3JlYXRhYmxlUHJvcGVydHlUeXBlc0pzb24gPSBnZXRNYXAoanNvbi5nZXQoSlNPTl9DQVBfQ1JFQVRBQkxFX1BST1BFUlRZX1RZUEVTKSk7Ci0gICAgICAgIGlmIChjcmVhdGFibGVQcm9wZXJ0eVR5cGVzSnNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbCBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzID0gbmV3IENyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsKCk7Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBjYW5DcmVhdGVKc29uID0gZ2V0TGlzdChjcmVhdGFibGVQcm9wZXJ0eVR5cGVzSnNvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0KEpTT05fQ0FQX0NSRUFUQUJMRV9QUk9QRVJUWV9UWVBFU19DQU5DUkVBVEUpKTsKLSAgICAgICAgICAgIGlmIChjYW5DcmVhdGVKc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTZXQ8UHJvcGVydHlUeXBlPiBjYW5DcmVhdGUgPSBFbnVtU2V0Lm5vbmVPZihQcm9wZXJ0eVR5cGUuY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGNhbkNyZWF0ZUpzb24pIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5DcmVhdGUuYWRkKFByb3BlcnR5VHlwZS5mcm9tVmFsdWUoby50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNyZWF0YWJsZVByb3BlcnR5VHlwZXMuc2V0Q2FuQ3JlYXRlKGNhbkNyZWF0ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY3JlYXRhYmxlUHJvcGVydHlUeXBlc0pzb24sIGNyZWF0YWJsZVByb3BlcnR5VHlwZXMsIENBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfS0VZUyk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKGNyZWF0YWJsZVByb3BlcnR5VHlwZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiA9IGdldE1hcChqc29uLmdldChKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTKSk7Ci0gICAgICAgIGlmIChuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSW1wbCBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzID0gbmV3IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsKCk7Ci0KLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0SWQoZ2V0Qm9vbGVhbihuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiwKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19JRCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5zZXRDYW5TZXRMb2NhbE5hbWUoZ2V0Qm9vbGVhbihuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiwKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19MT0NBTE5BTUUpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0TG9jYWxOYW1lc3BhY2UoZ2V0Qm9vbGVhbihuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiwKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19MT0NBTE5BTUVTUEFDRSkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5zZXRDYW5TZXREaXNwbGF5TmFtZShnZXRCb29sZWFuKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLAotICAgICAgICAgICAgICAgICAgICBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0RJU1BMQVlOQU1FKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldFF1ZXJ5TmFtZShnZXRCb29sZWFuKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLAotICAgICAgICAgICAgICAgICAgICBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX1FVRVJZTkFNRSkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5zZXRDYW5TZXREZXNjcmlwdGlvbihnZXRCb29sZWFuKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLAotICAgICAgICAgICAgICAgICAgICBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0RFU0NSSVBUSU9OKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldENyZWF0YWJsZShnZXRCb29sZWFuKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLAotICAgICAgICAgICAgICAgICAgICBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NSRUFURUFCTEUpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0RmlsZWFibGUoZ2V0Qm9vbGVhbihuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiwKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19GSUxFQUJMRSkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5zZXRDYW5TZXRRdWVyeWFibGUoZ2V0Qm9vbGVhbihuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiwKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19RVUVSWUFCTEUpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0RnVsbHRleHRJbmRleGVkKGdldEJvb2xlYW4obmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24sCi0gICAgICAgICAgICAgICAgICAgIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRlVMTFRFWFRJTkRFWEVEKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldEluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeShnZXRCb29sZWFuKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNKc29uLAotICAgICAgICAgICAgICAgICAgICBKU09OX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lOQ0xVREVESU5TVVBFUlRZVFBFUVVFUlkpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KGdldEJvb2xlYW4obmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24sCi0gICAgICAgICAgICAgICAgICAgIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ09OVFJPTEFCTEVQT0xJQ1kpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0Q29udHJvbGxhYmxlQWNsKGdldEJvb2xlYW4obmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0pzb24sCi0gICAgICAgICAgICAgICAgICAgIEpTT05fQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ09OVFJPTEFCTEVBQ0wpKTsKLQotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSnNvbiwgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfS0VZUyk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIENBUF9LRVlTKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgQWNsQ2FwYWJpbGl0aWVzIGNvbnZlcnRBY2xDYXBhYmlsaXRpZXMoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwgcmVzdWx0ID0gbmV3IEFjbENhcGFiaWxpdGllc0RhdGFJbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldFN1cHBvcnRlZFBlcm1pc3Npb25zKGdldEVudW0oanNvbiwgSlNPTl9BQ0xDQVBfU1VQUE9SVEVEX1BFUk1JU1NJT05TLCBTdXBwb3J0ZWRQZXJtaXNzaW9ucy5jbGFzcykpOwotICAgICAgICByZXN1bHQuc2V0QWNsUHJvcGFnYXRpb24oZ2V0RW51bShqc29uLCBKU09OX0FDTENBUF9BQ0xfUFJPUEFHQVRJT04sIEFjbFByb3BhZ2F0aW9uLmNsYXNzKSk7Ci0KLSAgICAgICAgTGlzdDxPYmplY3Q+IHBlcm1pc3Npb25zID0gZ2V0TGlzdChqc29uLmdldChKU09OX0FDTENBUF9QRVJNSVNTSU9OUykpOwotICAgICAgICBpZiAocGVybWlzc2lvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4gcGVybWlzc2lvbkRlZmluaXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4oKTsKLQotICAgICAgICAgICAgZm9yIChPYmplY3QgcGVybWlzc2lvbiA6IHBlcm1pc3Npb25zKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwZXJtaXNzaW9uTWFwID0gZ2V0TWFwKHBlcm1pc3Npb24pOwotICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbCBwZXJtRGVmID0gbmV3IFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGwoKTsKLQotICAgICAgICAgICAgICAgICAgICBwZXJtRGVmLnNldElkKGdldFN0cmluZyhwZXJtaXNzaW9uTWFwLCBKU09OX0FDTENBUF9QRVJNSVNTSU9OX1BFUk1JU1NJT04pKTsKLSAgICAgICAgICAgICAgICAgICAgcGVybURlZi5zZXREZXNjcmlwdGlvbihnZXRTdHJpbmcocGVybWlzc2lvbk1hcCwgSlNPTl9BQ0xDQVBfUEVSTUlTU0lPTl9ERVNDUklQVElPTikpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocGVybWlzc2lvbk1hcCwgcGVybURlZiwgQUNMQ0FQX1BFUk1JU1NJT05fS0VZUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkRlZmluaXRpb25MaXN0LmFkZChwZXJtRGVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGEocGVybWlzc2lvbkRlZmluaXRpb25MaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8T2JqZWN0PiBwZXJtaXNzaW9uTWFwcGluZyA9IGdldExpc3QoanNvbi5nZXQoSlNPTl9BQ0xDQVBfUEVSTUlTU0lPTl9NQVBQSU5HKSk7Ci0gICAgICAgIGlmIChwZXJtaXNzaW9uTWFwcGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4gcGVybU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGVybWlzc2lvbk1hcHBpbmc+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHBlcm1pc3Npb24gOiBwZXJtaXNzaW9uTWFwcGluZykgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGVybWlzc2lvbk1hcCA9IGdldE1hcChwZXJtaXNzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbk1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwgbWFwcGluZyA9IG5ldyBQZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFN0cmluZyhwZXJtaXNzaW9uTWFwLCBKU09OX0FDTENBUF9NQVBQSU5HX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcHBpbmcuc2V0S2V5KGtleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHBlcm1zID0gcGVybWlzc2lvbk1hcC5nZXQoSlNPTl9BQ0xDQVBfTUFQUElOR19QRVJNSVNTSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBlcm1zIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBlcm1MaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHBlcm0gOiAoTGlzdDxPYmplY3Q+KSBwZXJtcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZXJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybUxpc3QuYWRkKHBlcm0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLnNldFBlcm1pc3Npb25zKHBlcm1MaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocGVybWlzc2lvbk1hcCwgbWFwcGluZywgQUNMQ0FQX01BUFBJTkdfS0VZUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcGVybU1hcC5wdXQoa2V5LCBtYXBwaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRQZXJtaXNzaW9uTWFwcGluZ0RhdGEocGVybU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGpzb24sIHJlc3VsdCwgQUNMQ0FQX0tFWVMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjb252ZXJ0VHlwZURlZmluaXRpb24oZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWJzdHJhY3RUeXBlRGVmaW5pdGlvbiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBpZCA9IGdldFN0cmluZyhqc29uLCBKU09OX1RZUEVfSUQpOwotCi0gICAgICAgIC8vIGZpbmQgYmFzZSB0eXBlCi0gICAgICAgIEJhc2VUeXBlSWQgYmFzZVR5cGUgPSBnZXRFbnVtKGpzb24sIEpTT05fVFlQRV9CQVNFX0lELCBCYXNlVHlwZUlkLmNsYXNzKTsKLSAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGJhc2UgdHlwZTogIiArIGlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoYmFzZVR5cGUpIHsKLSAgICAgICAgY2FzZSBDTUlTX0ZPTERFUjoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENNSVNfRE9DVU1FTlQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwoKTsKLQotICAgICAgICAgICAgKChEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChnZXRFbnVtKGpzb24sCi0gICAgICAgICAgICAgICAgICAgIEpTT05fVFlQRV9DT05URU5UU1RSRUFNX0FMTE9XRUQsIENvbnRlbnRTdHJlYW1BbGxvd2VkLmNsYXNzKSk7Ci0gICAgICAgICAgICAoKERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldElzVmVyc2lvbmFibGUoZ2V0Qm9vbGVhbihqc29uLCBKU09OX1RZUEVfVkVSU0lPTkFCTEUpKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ01JU19SRUxBVElPTlNISVA6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBhbGxvd2VkU291cmNlVHlwZXMgPSBqc29uLmdldChKU09OX1RZUEVfQUxMT1dFRF9TT1VSQ0VfVFlQRVMpOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRTb3VyY2VUeXBlcyBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB0eXBlIDogKExpc3Q8T2JqZWN0PikgYWxsb3dlZFNvdXJjZVR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzLmFkZCh0eXBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0QWxsb3dlZFNvdXJjZVR5cGVzKHR5cGVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IGFsbG93ZWRUYXJnZXRUeXBlcyA9IGpzb24uZ2V0KEpTT05fVFlQRV9BTExPV0VEX1RBUkdFVF9UWVBFUyk7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZFRhcmdldFR5cGVzIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHR5cGUgOiAoTGlzdDxPYmplY3Q+KSBhbGxvd2VkVGFyZ2V0VHlwZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKHR5cGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAoKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRBbGxvd2VkVGFyZ2V0VHlwZXModHlwZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTUlTX1BPTElDWToKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQb2xpY3lUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENNSVNfSVRFTToKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtVHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTUlTX1NFQ09OREFSWToKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJUeXBlICciICsgaWQgKyAiJyBkb2VzIG5vdCBtYXRjaCBhIGJhc2UgdHlwZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRCYXNlVHlwZUlkKGJhc2VUeXBlKTsKLSAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKGdldFN0cmluZyhqc29uLCBKU09OX1RZUEVfREVTQ1JJUFRJT04pKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKGdldFN0cmluZyhqc29uLCBKU09OX1RZUEVfRElTUExBWU5BTUUpKTsKLSAgICAgICAgcmVzdWx0LnNldElkKGlkKTsKLSAgICAgICAgcmVzdWx0LnNldElzQ29udHJvbGxhYmxlQWNsKGdldEJvb2xlYW4oanNvbiwgSlNPTl9UWVBFX0NPTlRST0xBQkxFX0FDTCkpOwotICAgICAgICByZXN1bHQuc2V0SXNDb250cm9sbGFibGVQb2xpY3koZ2V0Qm9vbGVhbihqc29uLCBKU09OX1RZUEVfQ09OVFJPTEFCTEVfUE9MSUNZKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0NyZWF0YWJsZShnZXRCb29sZWFuKGpzb24sIEpTT05fVFlQRV9DUkVBVEFCTEUpKTsKLSAgICAgICAgcmVzdWx0LnNldElzRmlsZWFibGUoZ2V0Qm9vbGVhbihqc29uLCBKU09OX1RZUEVfRklMRUFCTEUpKTsKLSAgICAgICAgcmVzdWx0LnNldElzRnVsbHRleHRJbmRleGVkKGdldEJvb2xlYW4oanNvbiwgSlNPTl9UWVBFX0ZVTExURVhUX0lOREVYRUQpKTsKLSAgICAgICAgcmVzdWx0LnNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KGdldEJvb2xlYW4oanNvbiwgSlNPTl9UWVBFX0lOQ0xVREVfSU5fU1VQRVJUWVBFX1FVRVJZKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1F1ZXJ5YWJsZShnZXRCb29sZWFuKGpzb24sIEpTT05fVFlQRV9RVUVSWUFCTEUpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShnZXRTdHJpbmcoanNvbiwgSlNPTl9UWVBFX0xPQ0FMTkFNRSkpOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lc3BhY2UoZ2V0U3RyaW5nKGpzb24sIEpTT05fVFlQRV9MT0NBTE5BTUVTUEFDRSkpOwotICAgICAgICByZXN1bHQuc2V0UGFyZW50VHlwZUlkKGdldFN0cmluZyhqc29uLCBKU09OX1RZUEVfUEFSRU5UX0lEKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUoZ2V0U3RyaW5nKGpzb24sIEpTT05fVFlQRV9RVUVSWU5BTUUpKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHR5cGVNdXRhYmlsaXR5SnNvbiA9IGdldE1hcChqc29uLmdldChKU09OX1RZUEVfVFlQRV9NVVRBQklMSVRZKSk7Ci0gICAgICAgIGlmICh0eXBlTXV0YWJpbGl0eUpzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgVHlwZU11dGFiaWxpdHlJbXBsIHR5cGVNdXRhYmlsaXR5ID0gbmV3IFR5cGVNdXRhYmlsaXR5SW1wbCgpOwotCi0gICAgICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5DcmVhdGUoZ2V0Qm9vbGVhbih0eXBlTXV0YWJpbGl0eUpzb24sIEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfQ1JFQVRFKSk7Ci0gICAgICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5VcGRhdGUoZ2V0Qm9vbGVhbih0eXBlTXV0YWJpbGl0eUpzb24sIEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfVVBEQVRFKSk7Ci0gICAgICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5EZWxldGUoZ2V0Qm9vbGVhbih0eXBlTXV0YWJpbGl0eUpzb24sIEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfREVMRVRFKSk7Ci0KLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24odHlwZU11dGFiaWxpdHlKc29uLCB0eXBlTXV0YWJpbGl0eSwgSlNPTl9UWVBFX1RZUEVfTVVUQUJJTElUWV9LRVlTKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFR5cGVNdXRhYmlsaXR5KHR5cGVNdXRhYmlsaXR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlEZWZpbml0aW9ucyA9IGdldE1hcChqc29uLmdldChKU09OX1RZUEVfUFJPUEVSVFlfREVGSU5JVElPTlMpKTsKLSAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3QgcHJvcERlZiA6IHByb3BlcnR5RGVmaW5pdGlvbnMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNvbnZlcnRQcm9wZXJ0eURlZmluaXRpb24oZ2V0TWFwKHByb3BEZWYpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGpzb24sIHJlc3VsdCwgVFlQRV9LRVlTKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBjb252ZXJ0UHJvcGVydHlEZWZpbml0aW9uKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbikgewotICAgICAgICBpZiAoanNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0U3RyaW5nKGpzb24sIEpTT05fUFJPUEVSVFlfSUQpOwotCi0gICAgICAgIC8vIGZpbmQgcHJvcGVydHkgdHlwZQotICAgICAgICBQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlID0gZ2V0RW51bShqc29uLCBKU09OX1BST1BFUlRZX1RZUEVfUFJPUEVSVFlfVFlQRSwgUHJvcGVydHlUeXBlLmNsYXNzKTsKLSAgICAgICAgaWYgKHByb3BlcnR5VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJvcGVydHkgdHlwZSAnIiArIGlkICsgIichIERhdGEgdHlwZSBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmluZAotICAgICAgICBDYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSA9IGdldEVudW0oanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMSVRZLCBDYXJkaW5hbGl0eS5jbGFzcyk7Ci0gICAgICAgIGlmIChjYXJkaW5hbGl0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJvcGVydHkgdHlwZSAnIiArIGlkICsgIichIENhcmRpbmFsaXR5IG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHByb3BlcnR5VHlwZSkgewotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0TWF4TGVuZ3RoKGdldEludGVnZXIoanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX01BWF9MRU5HVEgpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0Q2hvaWNlcyhjb252ZXJ0Q2hvaWNlc1N0cmluZyhqc29uLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlJZERlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VzU3RyaW5nKGpzb24uZ2V0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCT09MRUFOOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldENob2ljZXMoY29udmVydENob2ljZXNCb29sZWFuKGpzb24KLSAgICAgICAgICAgICAgICAgICAgLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRNaW5WYWx1ZShnZXRJbnRlZ2VyKGpzb24sIEpTT05fUFJPUEVSVFlfVFlQRV9NSU5fVkFMVUUpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0TWF4VmFsdWUoZ2V0SW50ZWdlcihqc29uLCBKU09OX1BST1BFUlRZX1RZUEVfTUFYX1ZBTFVFKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldENob2ljZXMoY29udmVydENob2ljZXNJbnRlZ2VyKGpzb24KLSAgICAgICAgICAgICAgICAgICAgLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREYXRlVGltZVJlc29sdXRpb24oZ2V0RW51bShqc29uLAotICAgICAgICAgICAgICAgICAgICBKU09OX1BST1BFUlRZX1RZUEVfUkVTT0xVVElPTiwgRGF0ZVRpbWVSZXNvbHV0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VzRGF0ZVRpbWUoanNvbgotICAgICAgICAgICAgICAgICAgICAuZ2V0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBERUNJTUFMOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldE1pblZhbHVlKGdldERlY2ltYWwoanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX01JTl9WQUxVRSkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRNYXhWYWx1ZShnZXREZWNpbWFsKGpzb24sIEpTT05fUFJPUEVSVFlfVFlQRV9NQVhfVkFMVUUpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0UHJlY2lzaW9uKGdldEludEVudW0oanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX1BSRUNJU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgRGVjaW1hbFByZWNpc2lvbi5jbGFzcykpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VzRGVjaW1hbChqc29uCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRSkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0Q2hvaWNlcyhjb252ZXJ0Q2hvaWNlc1N0cmluZyhqc29uLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VzU3RyaW5nKGpzb24uZ2V0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUHJvcGVydHkgdHlwZSAnIiArIGlkICsgIicgZG9lcyBub3QgbWF0Y2ggYSBkYXRhIHR5cGUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWZhdWx0IHZhbHVlCi0gICAgICAgIE9iamVjdCBkZWZhdWx0VmFsdWUgPSBqc29uLmdldChKU09OX1BST1BFUlRZX1RZUEVfREVBVUxUX1ZBTFVFKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogKExpc3QpIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGdldENNSVNWYWx1ZSh2YWx1ZSwgcHJvcGVydHlUeXBlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXREZWZhdWx0VmFsdWUodmFsdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldERlZmF1bHRWYWx1ZSgoTGlzdCkgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRDTUlTVmFsdWUoZGVmYXVsdFZhbHVlLCBwcm9wZXJ0eVR5cGUpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZW5lcmljCi0gICAgICAgIHJlc3VsdC5zZXRJZChpZCk7Ci0gICAgICAgIHJlc3VsdC5zZXRQcm9wZXJ0eVR5cGUocHJvcGVydHlUeXBlKTsKLSAgICAgICAgcmVzdWx0LnNldENhcmRpbmFsaXR5KGNhcmRpbmFsaXR5KTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShnZXRTdHJpbmcoanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX0xPQ0FMTkFNRSkpOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lc3BhY2UoZ2V0U3RyaW5nKGpzb24sIEpTT05fUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUVTUEFDRSkpOwotICAgICAgICByZXN1bHQuc2V0UXVlcnlOYW1lKGdldFN0cmluZyhqc29uLCBKU09OX1BST1BFUlRZX1RZUEVfUVVFUllOQU1FKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREZXNjcmlwdGlvbihnZXRTdHJpbmcoanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX0RFU0NSSVBUSU9OKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREaXNwbGF5TmFtZShnZXRTdHJpbmcoanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX0RJU1BMQVlOQU1FKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0luaGVyaXRlZChnZXRCb29sZWFuKGpzb24sIEpTT05fUFJPUEVSVFlfVFlQRV9JTkhFUklURUQpKTsKLSAgICAgICAgcmVzdWx0LnNldElzT3BlbkNob2ljZShnZXRCb29sZWFuKGpzb24sIEpTT05fUFJPUEVSVFlfVFlQRV9PUEVOQ0hPSUNFKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc09yZGVyYWJsZShnZXRCb29sZWFuKGpzb24sIEpTT05fUFJPUEVSVFlfVFlQRV9PUkRFUkFCTEUpKTsKLSAgICAgICAgcmVzdWx0LnNldElzUXVlcnlhYmxlKGdldEJvb2xlYW4oanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX1FVRVJZQUJMRSkpOwotICAgICAgICByZXN1bHQuc2V0SXNSZXF1aXJlZChnZXRCb29sZWFuKGpzb24sIEpTT05fUFJPUEVSVFlfVFlQRV9SRVFVSVJFRCkpOwotICAgICAgICByZXN1bHQuc2V0VXBkYXRhYmlsaXR5KGdldEVudW0oanNvbiwgSlNPTl9QUk9QRVJUWV9UWVBFX1VQREFUQUJJTElUWSwgVXBkYXRhYmlsaXR5LmNsYXNzKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIFBST1BFUlRZX1RZUEVfS0VZUyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBjaG9pY2VzLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiB9KQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2hvaWNlPFN0cmluZz4+IGNvbnZlcnRDaG9pY2VzU3RyaW5nKGZpbmFsIE9iamVjdCBjaG9pY2VzKSB7Ci0gICAgICAgIGlmICghKGNob2ljZXMgaW5zdGFuY2VvZiBMaXN0KSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENob2ljZTxTdHJpbmc+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxTdHJpbmc+PigpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IChMaXN0KSBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNob2ljZU1hcCA9IGdldE1hcChvYmopOwotICAgICAgICAgICAgaWYgKGNob2ljZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2hvaWNlSW1wbDxTdHJpbmc+IGNob2ljZSA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBjaG9pY2Uuc2V0RGlzcGxheU5hbWUoZ2V0U3RyaW5nKGNob2ljZU1hcCwgSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9ESVNQTEFZTkFNRSkpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGNob2ljZVZhbHVlID0gY2hvaWNlTWFwLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNob2ljZVZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IChMaXN0KSBjaG9pY2VWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgoU3RyaW5nKSBnZXRDTUlTVmFsdWUodmFsdWUsIFByb3BlcnR5VHlwZS5TVFJJTkcpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoKFN0cmluZykgZ2V0Q01JU1ZhbHVlKGNob2ljZVZhbHVlLCBQcm9wZXJ0eVR5cGUuU1RSSU5HKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNob2ljZS5zZXRWYWx1ZSh2YWx1ZXMpOwotCi0gICAgICAgICAgICAgICAgY2hvaWNlLnNldENob2ljZShjb252ZXJ0Q2hvaWNlc1N0cmluZyhjaG9pY2VNYXAuZ2V0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0VfQ0hPSUNFKSkpOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjaG9pY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBjaG9pY2VzLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiB9KQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2hvaWNlPEJvb2xlYW4+PiBjb252ZXJ0Q2hvaWNlc0Jvb2xlYW4oZmluYWwgT2JqZWN0IGNob2ljZXMpIHsKLSAgICAgICAgaWYgKCEoY2hvaWNlcyBpbnN0YW5jZW9mIExpc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q2hvaWNlPEJvb2xlYW4+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxCb29sZWFuPj4oKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBvYmogOiAoTGlzdCkgY2hvaWNlcykgewotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjaG9pY2VNYXAgPSBnZXRNYXAob2JqKTsKLSAgICAgICAgICAgIGlmIChjaG9pY2VNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENob2ljZUltcGw8Qm9vbGVhbj4gY2hvaWNlID0gbmV3IENob2ljZUltcGw8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBjaG9pY2Uuc2V0RGlzcGxheU5hbWUoZ2V0U3RyaW5nKGNob2ljZU1hcCwgSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9ESVNQTEFZTkFNRSkpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGNob2ljZVZhbHVlID0gY2hvaWNlTWFwLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBMaXN0PEJvb2xlYW4+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8Qm9vbGVhbj4oKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hvaWNlVmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogKExpc3QpIGNob2ljZVZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKChCb29sZWFuKSBnZXRDTUlTVmFsdWUodmFsdWUsIFByb3BlcnR5VHlwZS5CT09MRUFOKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKChCb29sZWFuKSBnZXRDTUlTVmFsdWUoY2hvaWNlVmFsdWUsIFByb3BlcnR5VHlwZS5CT09MRUFOKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNob2ljZS5zZXRWYWx1ZSh2YWx1ZXMpOwotCi0gICAgICAgICAgICAgICAgY2hvaWNlLnNldENob2ljZShjb252ZXJ0Q2hvaWNlc0Jvb2xlYW4oY2hvaWNlTWFwLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFX0NIT0lDRSkpKTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY2hvaWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgY2hvaWNlcy4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIgfSkKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENob2ljZTxCaWdJbnRlZ2VyPj4gY29udmVydENob2ljZXNJbnRlZ2VyKGZpbmFsIE9iamVjdCBjaG9pY2VzKSB7Ci0gICAgICAgIGlmICghKGNob2ljZXMgaW5zdGFuY2VvZiBMaXN0KSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENob2ljZTxCaWdJbnRlZ2VyPj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8QmlnSW50ZWdlcj4+KCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogKExpc3QpIGNob2ljZXMpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY2hvaWNlTWFwID0gZ2V0TWFwKG9iaik7Ci0gICAgICAgICAgICBpZiAoY2hvaWNlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDaG9pY2VJbXBsPEJpZ0ludGVnZXI+IGNob2ljZSA9IG5ldyBDaG9pY2VJbXBsPEJpZ0ludGVnZXI+KCk7Ci0gICAgICAgICAgICAgICAgY2hvaWNlLnNldERpc3BsYXlOYW1lKGdldFN0cmluZyhjaG9pY2VNYXAsIEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0VfRElTUExBWU5BTUUpKTsKLQotICAgICAgICAgICAgICAgIE9iamVjdCBjaG9pY2VWYWx1ZSA9IGNob2ljZU1hcC5nZXQoSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgTGlzdDxCaWdJbnRlZ2VyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEJpZ0ludGVnZXI+KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNob2ljZVZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IChMaXN0KSBjaG9pY2VWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgoQmlnSW50ZWdlcikgZ2V0Q01JU1ZhbHVlKHZhbHVlLCBQcm9wZXJ0eVR5cGUuSU5URUdFUikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgoQmlnSW50ZWdlcikgZ2V0Q01JU1ZhbHVlKGNob2ljZVZhbHVlLCBQcm9wZXJ0eVR5cGUuSU5URUdFUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaG9pY2Uuc2V0VmFsdWUodmFsdWVzKTsKLQotICAgICAgICAgICAgICAgIGNob2ljZS5zZXRDaG9pY2UoY29udmVydENob2ljZXNJbnRlZ2VyKGNob2ljZU1hcC5nZXQoSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9DSE9JQ0UpKSk7Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGNob2ljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGNob2ljZXMuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiIH0pCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDaG9pY2U8QmlnRGVjaW1hbD4+IGNvbnZlcnRDaG9pY2VzRGVjaW1hbChmaW5hbCBPYmplY3QgY2hvaWNlcykgewotICAgICAgICBpZiAoIShjaG9pY2VzIGluc3RhbmNlb2YgTGlzdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxDaG9pY2U8QmlnRGVjaW1hbD4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q2hvaWNlPEJpZ0RlY2ltYWw+PigpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IChMaXN0KSBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNob2ljZU1hcCA9IGdldE1hcChvYmopOwotICAgICAgICAgICAgaWYgKGNob2ljZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2hvaWNlSW1wbDxCaWdEZWNpbWFsPiBjaG9pY2UgPSBuZXcgQ2hvaWNlSW1wbDxCaWdEZWNpbWFsPigpOwotICAgICAgICAgICAgICAgIGNob2ljZS5zZXREaXNwbGF5TmFtZShnZXRTdHJpbmcoY2hvaWNlTWFwLCBKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFX0RJU1BMQVlOQU1FKSk7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgY2hvaWNlVmFsdWUgPSBjaG9pY2VNYXAuZ2V0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0VfVkFMVUUpOwotICAgICAgICAgICAgICAgIExpc3Q8QmlnRGVjaW1hbD4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxCaWdEZWNpbWFsPigpOwotICAgICAgICAgICAgICAgIGlmIChjaG9pY2VWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiAoTGlzdCkgY2hvaWNlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoKEJpZ0RlY2ltYWwpIGdldENNSVNWYWx1ZSh2YWx1ZSwgUHJvcGVydHlUeXBlLkRFQ0lNQUwpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoKEJpZ0RlY2ltYWwpIGdldENNSVNWYWx1ZShjaG9pY2VWYWx1ZSwgUHJvcGVydHlUeXBlLkRFQ0lNQUwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hvaWNlLnNldFZhbHVlKHZhbHVlcyk7Ci0KLSAgICAgICAgICAgICAgICBjaG9pY2Uuc2V0Q2hvaWNlKGNvbnZlcnRDaG9pY2VzRGVjaW1hbChjaG9pY2VNYXAuZ2V0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0VfQ0hPSUNFKSkpOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjaG9pY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBjaG9pY2VzLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiB9KQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2hvaWNlPEdyZWdvcmlhbkNhbGVuZGFyPj4gY29udmVydENob2ljZXNEYXRlVGltZShmaW5hbCBPYmplY3QgY2hvaWNlcykgewotICAgICAgICBpZiAoIShjaG9pY2VzIGluc3RhbmNlb2YgTGlzdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxDaG9pY2U8R3JlZ29yaWFuQ2FsZW5kYXI+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxHcmVnb3JpYW5DYWxlbmRhcj4+KCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogKExpc3QpIGNob2ljZXMpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY2hvaWNlTWFwID0gZ2V0TWFwKG9iaik7Ci0gICAgICAgICAgICBpZiAoY2hvaWNlTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDaG9pY2VJbXBsPEdyZWdvcmlhbkNhbGVuZGFyPiBjaG9pY2UgPSBuZXcgQ2hvaWNlSW1wbDxHcmVnb3JpYW5DYWxlbmRhcj4oKTsKLSAgICAgICAgICAgICAgICBjaG9pY2Uuc2V0RGlzcGxheU5hbWUoZ2V0U3RyaW5nKGNob2ljZU1hcCwgSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9ESVNQTEFZTkFNRSkpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGNob2ljZVZhbHVlID0gY2hvaWNlTWFwLmdldChKU09OX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPigpOwotICAgICAgICAgICAgICAgIGlmIChjaG9pY2VWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiAoTGlzdCkgY2hvaWNlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoKEdyZWdvcmlhbkNhbGVuZGFyKSBnZXRDTUlTVmFsdWUodmFsdWUsIFByb3BlcnR5VHlwZS5EQVRFVElNRSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgoR3JlZ29yaWFuQ2FsZW5kYXIpIGdldENNSVNWYWx1ZShjaG9pY2VWYWx1ZSwgUHJvcGVydHlUeXBlLkRBVEVUSU1FKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNob2ljZS5zZXRWYWx1ZSh2YWx1ZXMpOwotCi0gICAgICAgICAgICAgICAgY2hvaWNlLnNldENob2ljZShjb252ZXJ0Q2hvaWNlc0RhdGVUaW1lKGNob2ljZU1hcC5nZXQoSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9DSE9JQ0UpKSk7Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGNob2ljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpTT05PYmplY3QgY29udmVydChmaW5hbCBPYmplY3REYXRhIG9iamVjdCwgZmluYWwgVHlwZUNhY2hlIHR5cGVDYWNoZSwKLSAgICAgICAgICAgIGZpbmFsIFByb3BlcnR5TW9kZSBwcm9wZXJ0eU1vZGUsIGZpbmFsIGJvb2xlYW4gc3VjY2luY3QsIGZpbmFsIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gcHJvcGVydGllcwotICAgICAgICBpZiAob2JqZWN0LmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc3VjY2luY3QpIHsKLSAgICAgICAgICAgICAgICBKU09OT2JqZWN0IHByb3BlcnRpZXMgPSBjb252ZXJ0KG9iamVjdC5nZXRQcm9wZXJ0aWVzKCksIG9iamVjdC5nZXRJZCgpLCB0eXBlQ2FjaGUsIHByb3BlcnR5TW9kZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9PQkpFQ1RfU1VDQ0lOQ1RfUFJPUEVSVElFUywgcHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBKU09OT2JqZWN0IHByb3BlcnRpZXMgPSBjb252ZXJ0KG9iamVjdC5nZXRQcm9wZXJ0aWVzKCksIG9iamVjdC5nZXRJZCgpLCB0eXBlQ2FjaGUsIHByb3BlcnR5TW9kZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRlVGltZUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KEpTT05fT0JKRUNUX1BST1BFUlRJRVMsIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSlNPTk9iamVjdCBwcm9wZXJ0aWVzRXh0ZW5zaW9uID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ob2JqZWN0LmdldFByb3BlcnRpZXMoKSwgcHJvcGVydGllc0V4dGVuc2lvbik7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXNFeHRlbnNpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX09CSkVDVF9QUk9QRVJUSUVTX0VYVEVOU0lPTiwgcHJvcGVydGllc0V4dGVuc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhbGxvd2FibGUgYWN0aW9ucwotICAgICAgICBpZiAob2JqZWN0LmdldEFsbG93YWJsZUFjdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fT0JKRUNUX0FMTE9XQUJMRV9BQ1RJT05TLCBjb252ZXJ0KG9iamVjdC5nZXRBbGxvd2FibGVBY3Rpb25zKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbGF0aW9uc2hpcHMKLSAgICAgICAgaWYgKGlzTm90RW1wdHkob2JqZWN0LmdldFJlbGF0aW9uc2hpcHMoKSkpIHsKLSAgICAgICAgICAgIEpTT05BcnJheSByZWxhdGlvbnNoaXBzID0gbmV3IEpTT05BcnJheSgpOwotCi0gICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgcmVsYXRpb25zaGlwIDogb2JqZWN0LmdldFJlbGF0aW9uc2hpcHMoKSkgewotICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMuYWRkKGNvbnZlcnQocmVsYXRpb25zaGlwLCB0eXBlQ2FjaGUsIHByb3BlcnR5TW9kZSwgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9PQkpFQ1RfUkVMQVRJT05TSElQUywgcmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGFuZ2UgZXZlbnQgaW5mbwotICAgICAgICBpZiAob2JqZWN0LmdldENoYW5nZUV2ZW50SW5mbygpICE9IG51bGwgJiYgcHJvcGVydHlNb2RlID09IFByb3BlcnR5TW9kZS5DSEFOR0UpIHsKLSAgICAgICAgICAgIEpTT05PYmplY3QgY2hhbmdlRXZlbnRJbmZvID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICAgICAgQ2hhbmdlRXZlbnRJbmZvIGNlaSA9IG9iamVjdC5nZXRDaGFuZ2VFdmVudEluZm8oKTsKLSAgICAgICAgICAgIGNoYW5nZUV2ZW50SW5mby5wdXQoSlNPTl9DSEFOR0VfRVZFTlRfVFlQRSwgZ2V0SlNPTkVudW1WYWx1ZShjZWkuZ2V0Q2hhbmdlVHlwZSgpKSk7Ci0gICAgICAgICAgICBjaGFuZ2VFdmVudEluZm8ucHV0KEpTT05fQ0hBTkdFX0VWRU5UX1RJTUUsIGdldEpTT05WYWx1ZShjZWkuZ2V0Q2hhbmdlVGltZSgpLCBkYXRlVGltZUZvcm1hdCkpOwotCi0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdC5nZXRDaGFuZ2VFdmVudEluZm8oKSwgY2hhbmdlRXZlbnRJbmZvKTsKLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX09CSkVDVF9DSEFOR0VfRVZFTlRfSU5GTywgY2hhbmdlRXZlbnRJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFDTAotICAgICAgICBpZiAoKG9iamVjdC5nZXRBY2woKSAhPSBudWxsKSAmJiAob2JqZWN0LmdldEFjbCgpLmdldEFjZXMoKSAhPSBudWxsKSAmJiBwcm9wZXJ0eU1vZGUgIT0gUHJvcGVydHlNb2RlLlFVRVJZKSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fT0JKRUNUX0FDTCwgY29udmVydChvYmplY3QuZ2V0QWNsKCkpKTsKLSAgICAgICAgfQotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9PQkpFQ1RfRVhBQ1RfQUNMLCBvYmplY3QuaXNFeGFjdEFjbCgpLCByZXN1bHQpOwotCi0gICAgICAgIC8vIHBvbGljeSBpZHMKLSAgICAgICAgaWYgKChvYmplY3QuZ2V0UG9saWN5SWRzKCkgIT0gbnVsbCkgJiYgKG9iamVjdC5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIHByb3BlcnR5TW9kZSAhPSBQcm9wZXJ0eU1vZGUuUVVFUlkpIHsKLSAgICAgICAgICAgIEpTT05PYmplY3QgcG9saWN5SWRzID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgICAgIEpTT05BcnJheSBpZHMgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgICAgICBwb2xpY3lJZHMucHV0KEpTT05fT0JKRUNUX1BPTElDWV9JRFNfSURTLCBpZHMpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBwaSA6IG9iamVjdC5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKSkgewotICAgICAgICAgICAgICAgIGlkcy5hZGQocGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdC5nZXRQb2xpY3lJZHMoKSwgcG9saWN5SWRzKTsKLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX09CSkVDVF9QT0xJQ1lfSURTLCBwb2xpY3lJZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVuZGl0aW9ucwotICAgICAgICBpZiAoaXNOb3RFbXB0eShvYmplY3QuZ2V0UmVuZGl0aW9ucygpKSkgewotICAgICAgICAgICAgSlNPTkFycmF5IHJlbmRpdGlvbnMgPSBuZXcgSlNPTkFycmF5KCk7Ci0KLSAgICAgICAgICAgIGZvciAoUmVuZGl0aW9uRGF0YSByZW5kaXRpb24gOiBvYmplY3QuZ2V0UmVuZGl0aW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgcmVuZGl0aW9ucy5hZGQoY29udmVydChyZW5kaXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX09CSkVDVF9SRU5ESVRJT05TLCByZW5kaXRpb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24ob2JqZWN0LCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBiYWcgb2YgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpTT05PYmplY3QgY29udmVydChmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIGZpbmFsIFN0cmluZyBvYmplY3RJZCwgZmluYWwgVHlwZUNhY2hlIHR5cGVDYWNoZSwKLSAgICAgICAgICAgIGZpbmFsIFByb3BlcnR5TW9kZSBwcm9wZXJ0eU1vZGUsIGZpbmFsIGJvb2xlYW4gc3VjY2luY3QsIGZpbmFsIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSB0eXBlCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSBudWxsOwotICAgICAgICBpZiAodHlwZUNhY2hlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiB0eXBlUHJvcCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgICAgICBpZiAodHlwZVByb3AgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9ICgoUHJvcGVydHlJZCkgdHlwZVByb3ApLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGVDYWNoZS5nZXRUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXMuZ2V0UHJvcGVydHlMaXN0KCkpIHsKLSAgICAgICAgICAgIGFzc2VydCBwcm9wZXJ0eSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHByb3BlcnR5LmdldElkKCkgIT0gbnVsbDsKLQotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgPSBudWxsOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlEYXRhV2l0aERlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICBwcm9wRGVmID0gKChQcm9wZXJ0eURhdGFXaXRoRGVmaW5pdGlvbjw/PikgcHJvcGVydHkpLmdldFByb3BlcnR5RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3BEZWYgPT0gbnVsbCAmJiB0eXBlQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BEZWYgPSB0eXBlQ2FjaGUuZ2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5LmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3BEZWYgPT0gbnVsbCAmJiB0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9wRGVmID0gdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KHByb3BlcnR5LmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3BEZWYgPT0gbnVsbCAmJiB0eXBlQ2FjaGUgIT0gbnVsbCAmJiBvYmplY3RJZCAhPSBudWxsICYmIHByb3BlcnR5TW9kZSAhPSBQcm9wZXJ0eU1vZGUuQ0hBTkdFKSB7Ci0gICAgICAgICAgICAgICAgdHlwZUNhY2hlLmdldFR5cGVEZWZpbml0aW9uRm9yT2JqZWN0KG9iamVjdElkKTsKLSAgICAgICAgICAgICAgICBwcm9wRGVmID0gdHlwZUNhY2hlLmdldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHByb3BJZCA9IChwcm9wZXJ0eU1vZGUgPT0gUHJvcGVydHlNb2RlLlFVRVJZID8gcHJvcGVydHkuZ2V0UXVlcnlOYW1lKCkgOiBwcm9wZXJ0eS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGlmIChwcm9wSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTm8gcXVlcnkgbmFtZSBvciBhbGlhcyBmb3IgcHJvcGVydHkgJyIgKyBwcm9wZXJ0eS5nZXRJZCgpICsgIichIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQucHV0KHByb3BJZCwgY29udmVydChwcm9wZXJ0eSwgcHJvcERlZiwgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydChmaW5hbCBQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHksIGZpbmFsIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmLCBib29sZWFuIHN1Y2NpbmN0LAotICAgICAgICAgICAgZmluYWwgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1Y2NpbmN0KSB7Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKHByb3BEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHByb3BlcnR5LmdldFZhbHVlcygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcERlZi5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5LlNJTkdMRSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXRKU09OVmFsdWUocHJvcGVydHkuZ2V0VmFsdWVzKCkuZ2V0KDApLCBkYXRlVGltZUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTkFycmF5IHZhbHVlcyA9IG5ldyBKU09OQXJyYXkoKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHByb3BlcnR5LmdldFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGdldEpTT05WYWx1ZSh2YWx1ZSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHByb3BlcnR5LmdldFZhbHVlcygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEpTT05BcnJheSB2YWx1ZXMgPSBuZXcgSlNPTkFycmF5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBwcm9wZXJ0eS5nZXRWYWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChnZXRKU09OVmFsdWUodmFsdWUsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fUFJPUEVSVFlfSUQsIHByb3BlcnR5LmdldElkKCkpOwotICAgICAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfTE9DQUxOQU1FLCBwcm9wZXJ0eS5nZXRMb2NhbE5hbWUoKSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHNldElmTm90TnVsbChKU09OX1BST1BFUlRZX0RJU1BMQVlOQU1FLCBwcm9wZXJ0eS5nZXREaXNwbGF5TmFtZSgpLCByZXN1bHQpOwotICAgICAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfUVVFUllOQU1FLCBwcm9wZXJ0eS5nZXRRdWVyeU5hbWUoKSwgcmVzdWx0KTsKLQotICAgICAgICAgICAgaWYgKHByb3BEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9EQVRBVFlQRSwgZ2V0SlNPTkVudW1WYWx1ZShwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpKSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX1BST1BFUlRZX0NBUkRJTkFMSVRZLCBnZXRKU09ORW51bVZhbHVlKHByb3BEZWYuZ2V0Q2FyZGluYWxpdHkoKSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkocHJvcGVydHkuZ2V0VmFsdWVzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9WQUxVRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wRGVmLmdldENhcmRpbmFsaXR5KCkgPT0gQ2FyZGluYWxpdHkuU0lOR0xFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9WQUxVRSwgZ2V0SlNPTlZhbHVlKHByb3BlcnR5LmdldFZhbHVlcygpLmdldCgwKSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBKU09OQXJyYXkgdmFsdWVzID0gbmV3IEpTT05BcnJheSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcHJvcGVydHkuZ2V0VmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoZ2V0SlNPTlZhbHVlKHZhbHVlLCBkYXRlVGltZUZvcm1hdCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX1BST1BFUlRZX1ZBTFVFLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX1BST1BFUlRZX0RBVEFUWVBFLCBnZXRKU09OUHJvcGVydHlEYXRhVHlwZShwcm9wZXJ0eSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkocHJvcGVydHkuZ2V0VmFsdWVzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9WQUxVRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSlNPTkFycmF5IHZhbHVlcyA9IG5ldyBKU09OQXJyYXkoKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHByb3BlcnR5LmdldFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGdldEpTT05WYWx1ZSh2YWx1ZSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9WQUxVRSwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocHJvcGVydHksIHJlc3VsdCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbGxvd2FibGUgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpTT05PYmplY3QgY29udmVydChmaW5hbCBBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMpIHsKLSAgICAgICAgaWYgKGFsbG93YWJsZUFjdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0KLSAgICAgICAgU2V0PEFjdGlvbj4gYWN0aW9uU2V0ID0gYWxsb3dhYmxlQWN0aW9ucy5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgICAgIGZvciAoQWN0aW9uIGFjdGlvbiA6IEFjdGlvbi52YWx1ZXMoKSkgewotICAgICAgICAgICAgcmVzdWx0LnB1dChhY3Rpb24udmFsdWUoKSwgYWN0aW9uU2V0LmNvbnRhaW5zKGFjdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihhbGxvd2FibGVBY3Rpb25zLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gQUNMLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIEFjbCBhY2wpIHsKLSAgICAgICAgaWYgKChhY2wgPT0gbnVsbCkgfHwgKGFjbC5nZXRBY2VzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTkFycmF5IGFjZU9iamVjdHMgPSBuZXcgSlNPTkFycmF5KCk7Ci0KLSAgICAgICAgZm9yIChBY2UgYWNlIDogYWNsLmdldEFjZXMoKSkgewotICAgICAgICAgICAgSlNPTkFycmF5IHBlcm1pc3Npb25zID0gbmV3IEpTT05BcnJheSgpOwotICAgICAgICAgICAgaWYgKGFjZS5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwIDogYWNlLmdldFBlcm1pc3Npb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMuYWRkKHApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSlNPTk9iamVjdCBhY2VPYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgICAgICBKU09OT2JqZWN0IHByaW5jaXBhbE9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgICAgICBwcmluY2lwYWxPYmplY3QucHV0KEpTT05fQUNFX1BSSU5DSVBBTF9JRCwgYWNlLmdldFByaW5jaXBhbElkKCkpOwotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihhY2UuZ2V0UHJpbmNpcGFsKCksIHByaW5jaXBhbE9iamVjdCk7Ci0gICAgICAgICAgICBhY2VPYmplY3QucHV0KEpTT05fQUNFX1BSSU5DSVBBTCwgcHJpbmNpcGFsT2JqZWN0KTsKLQotICAgICAgICAgICAgYWNlT2JqZWN0LnB1dChKU09OX0FDRV9QRVJNSVNTSU9OUywgcGVybWlzc2lvbnMpOwotICAgICAgICAgICAgYWNlT2JqZWN0LnB1dChKU09OX0FDRV9JU19ESVJFQ1QsIGFjZS5pc0RpcmVjdCgpKTsKLQotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihhY2UsIGFjZU9iamVjdCk7Ci0KLSAgICAgICAgICAgIGFjZU9iamVjdHMuYWRkKGFjZU9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9BQ0xfQUNFUywgYWNlT2JqZWN0cyk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX0FDTF9JU19FWEFDVCwgYWNsLmlzRXhhY3QoKSwgcmVzdWx0KTsKLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGFjbCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcmVuZGl0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIFJlbmRpdGlvbkRhdGEgcmVuZGl0aW9uKSB7Ci0gICAgICAgIGlmIChyZW5kaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0KLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFTkRJVElPTl9TVFJFQU1fSUQsIHJlbmRpdGlvbi5nZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFTkRJVElPTl9NSU1FVFlQRSwgcmVuZGl0aW9uLmdldE1pbWVUeXBlKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fUkVORElUSU9OX0xFTkdUSCwgcmVuZGl0aW9uLmdldEJpZ0xlbmd0aCgpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1JFTkRJVElPTl9LSU5ELCByZW5kaXRpb24uZ2V0S2luZCgpKTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUkVORElUSU9OX1RJVExFLCByZW5kaXRpb24uZ2V0VGl0bGUoKSwgcmVzdWx0KTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUkVORElUSU9OX0hFSUdIVCwgcmVuZGl0aW9uLmdldEJpZ0hlaWdodCgpLCByZXN1bHQpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9SRU5ESVRJT05fV0lEVEgsIHJlbmRpdGlvbi5nZXRCaWdXaWR0aCgpLCByZXN1bHQpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9SRU5ESVRJT05fRE9DVU1FTlRfSUQsIHJlbmRpdGlvbi5nZXRSZW5kaXRpb25Eb2N1bWVudElkKCksIHJlc3VsdCk7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihyZW5kaXRpb24sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHF1ZXJ5IG9iamVjdCBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIE9iamVjdExpc3QgbGlzdCwgZmluYWwgVHlwZUNhY2hlIHR5cGVDYWNoZSwgZmluYWwgUHJvcGVydHlNb2RlIHByb3BlcnR5TW9kZSwKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VjY2luY3QsIGZpbmFsIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0KSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgIEpTT05BcnJheSBvYmplY3RzID0gbmV3IEpTT05BcnJheSgpOwotICAgICAgICBpZiAobGlzdC5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IGxpc3QuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoY29udmVydChvYmplY3QsIHR5cGVDYWNoZSwgcHJvcGVydHlNb2RlLCBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0eU1vZGUgPT0gUHJvcGVydHlNb2RlLlFVRVJZKSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fUVVFUllSRVNVTFRMSVNUX1JFU1VMVFMsIG9iamVjdHMpOwotCi0gICAgICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9RVUVSWVJFU1VMVExJU1RfSEFTX01PUkVfSVRFTVMsIGxpc3QuaGFzTW9yZUl0ZW1zKCksIHJlc3VsdCk7Ci0gICAgICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9RVUVSWVJFU1VMVExJU1RfTlVNX0lURU1TLCBsaXN0LmdldE51bUl0ZW1zKCksIHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fT0JKRUNUTElTVF9PQkpFQ1RTLCBvYmplY3RzKTsKLQotICAgICAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fT0JKRUNUTElTVF9IQVNfTU9SRV9JVEVNUywgbGlzdC5oYXNNb3JlSXRlbXMoKSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHNldElmTm90TnVsbChKU09OX09CSkVDVExJU1RfTlVNX0lURU1TLCBsaXN0LmdldE51bUl0ZW1zKCksIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGxpc3QsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBvYmplY3QgaW4gYSBmb2xkZXIgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpTT05PYmplY3QgY29udmVydChmaW5hbCBPYmplY3RJbkZvbGRlckRhdGEgb2JqZWN0SW5Gb2xkZXIsIGZpbmFsIFR5cGVDYWNoZSB0eXBlQ2FjaGUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1Y2NpbmN0LCBmaW5hbCBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCkgewotICAgICAgICBpZiAoKG9iamVjdEluRm9sZGVyID09IG51bGwpIHx8IChvYmplY3RJbkZvbGRlci5nZXRPYmplY3QoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9PQkpFQ1RJTkZPTERFUl9PQkpFQ1QsCi0gICAgICAgICAgICAgICAgY29udmVydChvYmplY3RJbkZvbGRlci5nZXRPYmplY3QoKSwgdHlwZUNhY2hlLCBQcm9wZXJ0eU1vZGUuT0JKRUNULCBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fT0JKRUNUSU5GT0xERVJfUEFUSF9TRUdNRU5ULCBvYmplY3RJbkZvbGRlci5nZXRQYXRoU2VnbWVudCgpLCByZXN1bHQpOwotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24ob2JqZWN0SW5Gb2xkZXIsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGZvbGRlciBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIE9iamVjdEluRm9sZGVyTGlzdCBvYmplY3RJbkZvbGRlckxpc3QsIGZpbmFsIFR5cGVDYWNoZSB0eXBlQ2FjaGUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1Y2NpbmN0LCBmaW5hbCBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCkgewotICAgICAgICBpZiAob2JqZWN0SW5Gb2xkZXJMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgIGlmIChvYmplY3RJbkZvbGRlckxpc3QuZ2V0T2JqZWN0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEpTT05BcnJheSBvYmplY3RzID0gbmV3IEpTT05BcnJheSgpOwotCi0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBvYmplY3QgOiBvYmplY3RJbkZvbGRlckxpc3QuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoY29udmVydChvYmplY3QsIHR5cGVDYWNoZSwgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9PQkpFQ1RJTkZPTERFUkxJU1RfT0JKRUNUUywgb2JqZWN0cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9PQkpFQ1RJTkZPTERFUkxJU1RfSEFTX01PUkVfSVRFTVMsIG9iamVjdEluRm9sZGVyTGlzdC5oYXNNb3JlSXRlbXMoKSwgcmVzdWx0KTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fT0JKRUNUSU5GT0xERVJMSVNUX05VTV9JVEVNUywgb2JqZWN0SW5Gb2xkZXJMaXN0LmdldE51bUl0ZW1zKCksIHJlc3VsdCk7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihvYmplY3RJbkZvbGRlckxpc3QsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGZvbGRlciBjb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKU09OT2JqZWN0IGNvbnZlcnQoZmluYWwgT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgY29udGFpbmVyLCBmaW5hbCBUeXBlQ2FjaGUgdHlwZUNhY2hlLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdWNjaW5jdCwgZmluYWwgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQpIHsKLSAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX09CSkVDVElORk9MREVSQ09OVEFJTkVSX09CSkVDVCwKLSAgICAgICAgICAgICAgICBjb252ZXJ0KGNvbnRhaW5lci5nZXRPYmplY3QoKSwgdHlwZUNhY2hlLCBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpKTsKLQotICAgICAgICBpZiAoaXNOb3RFbXB0eShjb250YWluZXIuZ2V0Q2hpbGRyZW4oKSkpIHsKLSAgICAgICAgICAgIEpTT05BcnJheSBjaGlsZHJlbiA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgZGVzY2VuZGFudCA6IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKEpTT05Db252ZXJ0ZXIuY29udmVydChkZXNjZW5kYW50LCB0eXBlQ2FjaGUsIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fT0JKRUNUSU5GT0xERVJDT05UQUlORVJfQ0hJTERSRU4sIGNoaWxkcmVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY29udGFpbmVyLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gb2JqZWN0IHBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpTT05PYmplY3QgY29udmVydChmaW5hbCBPYmplY3RQYXJlbnREYXRhIHBhcmVudCwgZmluYWwgVHlwZUNhY2hlIHR5cGVDYWNoZSwgZmluYWwgYm9vbGVhbiBzdWNjaW5jdCwKLSAgICAgICAgICAgIGZpbmFsIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0KSB7Ci0gICAgICAgIGlmICgocGFyZW50ID09IG51bGwpIHx8IChwYXJlbnQuZ2V0T2JqZWN0KCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fT0JKRUNUUEFSRU5UU19PQkpFQ1QsCi0gICAgICAgICAgICAgICAgY29udmVydChwYXJlbnQuZ2V0T2JqZWN0KCksIHR5cGVDYWNoZSwgUHJvcGVydHlNb2RlLk9CSkVDVCwgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgIGlmIChwYXJlbnQuZ2V0UmVsYXRpdmVQYXRoU2VnbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9PQkpFQ1RQQVJFTlRTX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCwgcGFyZW50LmdldFJlbGF0aXZlUGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHBhcmVudCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIFR5cGVEZWZpbml0aW9uIHR5cGUsIGZpbmFsIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0KSB7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fVFlQRV9JRCwgdHlwZS5nZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1RZUEVfTE9DQUxOQU1FLCB0eXBlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1RZUEVfTE9DQUxOQU1FU1BBQ0UsIHR5cGUuZ2V0TG9jYWxOYW1lc3BhY2UoKSk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX1RZUEVfRElTUExBWU5BTUUsIHR5cGUuZ2V0RGlzcGxheU5hbWUoKSwgcmVzdWx0KTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fVFlQRV9RVUVSWU5BTUUsIHR5cGUuZ2V0UXVlcnlOYW1lKCksIHJlc3VsdCk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX1RZUEVfREVTQ1JJUFRJT04sIHR5cGUuZ2V0RGVzY3JpcHRpb24oKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1RZUEVfQkFTRV9JRCwgZ2V0SlNPTkVudW1WYWx1ZSh0eXBlLmdldEJhc2VUeXBlSWQoKSkpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9UWVBFX1BBUkVOVF9JRCwgdHlwZS5nZXRQYXJlbnRUeXBlSWQoKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LnB1dChKU09OX1RZUEVfQ1JFQVRBQkxFLCB0eXBlLmlzQ3JlYXRhYmxlKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fVFlQRV9GSUxFQUJMRSwgdHlwZS5pc0ZpbGVhYmxlKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fVFlQRV9RVUVSWUFCTEUsIHR5cGUuaXNRdWVyeWFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9UWVBFX0ZVTExURVhUX0lOREVYRUQsIHR5cGUuaXNGdWxsdGV4dEluZGV4ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9UWVBFX0lOQ0xVREVfSU5fU1VQRVJUWVBFX1FVRVJZLCB0eXBlLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fVFlQRV9DT05UUk9MQUJMRV9QT0xJQ1ksIHR5cGUuaXNDb250cm9sbGFibGVQb2xpY3koKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9UWVBFX0NPTlRST0xBQkxFX0FDTCwgdHlwZS5pc0NvbnRyb2xsYWJsZUFjbCgpKTsKLQotICAgICAgICBpZiAodHlwZS5nZXRUeXBlTXV0YWJpbGl0eSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFR5cGVNdXRhYmlsaXR5IHR5cGVNdXRhYmlsaXR5ID0gdHlwZS5nZXRUeXBlTXV0YWJpbGl0eSgpOwotICAgICAgICAgICAgSlNPTk9iamVjdCB0eXBlTXV0YWJpbGl0eUpzb24gPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgICAgICB0eXBlTXV0YWJpbGl0eUpzb24ucHV0KEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfQ1JFQVRFLCB0eXBlTXV0YWJpbGl0eS5jYW5DcmVhdGUoKSk7Ci0gICAgICAgICAgICB0eXBlTXV0YWJpbGl0eUpzb24ucHV0KEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfVVBEQVRFLCB0eXBlTXV0YWJpbGl0eS5jYW5VcGRhdGUoKSk7Ci0gICAgICAgICAgICB0eXBlTXV0YWJpbGl0eUpzb24ucHV0KEpTT05fVFlQRV9UWVBFX01VVEFCSUxJVFlfREVMRVRFLCB0eXBlTXV0YWJpbGl0eS5jYW5EZWxldGUoKSk7Ci0KLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24odHlwZU11dGFiaWxpdHksIHR5cGVNdXRhYmlsaXR5SnNvbik7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9UWVBFX1RZUEVfTVVUQUJJTElUWSwgdHlwZU11dGFiaWxpdHlKc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX1RZUEVfVkVSU0lPTkFCTEUsICgoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZSkuaXNWZXJzaW9uYWJsZSgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9UWVBFX0NPTlRFTlRTVFJFQU1fQUxMT1dFRCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0SlNPTkVudW1WYWx1ZSgoKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGUpLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9UWVBFX0FMTE9XRURfU09VUkNFX1RZUEVTLAotICAgICAgICAgICAgICAgICAgICBnZXRKU09OQXJyYXlGcm9tTGlzdCgoKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSB0eXBlKS5nZXRBbGxvd2VkU291cmNlVHlwZUlkcygpKSk7Ci0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fVFlQRV9BTExPV0VEX1RBUkdFVF9UWVBFUywKLSAgICAgICAgICAgICAgICAgICAgZ2V0SlNPTkFycmF5RnJvbUxpc3QoKChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0QWxsb3dlZFRhcmdldFR5cGVJZHMoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzTm90RW1wdHkodHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkpKSB7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IHByb3BlcnR5RGVmcyA9IG5ldyBKU09OT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkIDogdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURlZnMucHV0KHBkLmdldElkKCksIGNvbnZlcnQocGQsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9UWVBFX1BST1BFUlRZX0RFRklOSVRJT05TLCBwcm9wZXJ0eURlZnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbih0eXBlLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBwcm9wZXJ0eSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKU09OT2JqZWN0IGNvbnZlcnQoZmluYWwgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BlcnR5RGVmaW5pdGlvbiwgZmluYWwgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICAvLyB0eXBlIHNwZWNpZmljCi0gICAgICAgIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHNldElmTm90TnVsbChKU09OX1BST1BFUlRZX1RZUEVfTUFYX0xFTkdUSCwgKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0TWF4TGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlJZERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9QUk9QRVJUWV9UWVBFX01JTl9WQUxVRSwgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSBwcm9wZXJ0eURlZmluaXRpb24pLmdldE1pblZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9QUk9QRVJUWV9UWVBFX01BWF9WQUxVRSwgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSBwcm9wZXJ0eURlZmluaXRpb24pLmdldE1heFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgewotICAgICAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfVFlQRV9NSU5fVkFMVUUsICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgcHJvcGVydHlEZWZpbml0aW9uKS5nZXRNaW5WYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwotICAgICAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfVFlQRV9NQVhfVkFMVUUsICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgcHJvcGVydHlEZWZpbml0aW9uKS5nZXRNYXhWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwotICAgICAgICAgICAgRGVjaW1hbFByZWNpc2lvbiBwcmVjaXNpb24gPSAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0UHJlY2lzaW9uKCk7Ci0gICAgICAgICAgICBpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9QUkVDSVNJT04sIHByZWNpc2lvbi52YWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIERhdGVUaW1lUmVzb2x1dGlvbiByZXNvbHV0aW9uID0gKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbikgcHJvcGVydHlEZWZpbml0aW9uKS5nZXREYXRlVGltZVJlc29sdXRpb24oKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9SRVNPTFVUSU9OLCByZXNvbHV0aW9uLnZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5SHRtbERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlEZWZpbml0aW9uLmdldENhcmRpbmFsaXR5KCkgPT0gQ2FyZGluYWxpdHkuU0lOR0xFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRKU09OVmFsdWUocHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpLmdldCgwKSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEpTT05BcnJheSB2YWx1ZXMgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChnZXRKU09OVmFsdWUodmFsdWUsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNob2ljZXMKLSAgICAgICAgaWYgKGlzTm90RW1wdHkocHJvcGVydHlEZWZpbml0aW9uLmdldENob2ljZXMoKSkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRDaG9pY2VzKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDaG9pY2VzKCksIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDYXJkaW5hbGl0eSgpLCBkYXRlVGltZUZvcm1hdCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2VuZXJpYwotICAgICAgICByZXN1bHQucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9JRCwgcHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUUsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX1BST1BFUlRZX1RZUEVfTE9DQUxOQU1FU1BBQ0UsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRMb2NhbE5hbWVzcGFjZSgpLCByZXN1bHQpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9QUk9QRVJUWV9UWVBFX0RJU1BMQVlOQU1FLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGlzcGxheU5hbWUoKSwgcmVzdWx0KTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfVFlQRV9RVUVSWU5BTUUsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRRdWVyeU5hbWUoKSwgcmVzdWx0KTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfVFlQRV9ERVNDUklQVElPTiwgcHJvcGVydHlEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9UWVBFX1BST1BFUlRZX1RZUEUsIGdldEpTT05FbnVtVmFsdWUocHJvcGVydHlEZWZpbml0aW9uLmdldFByb3BlcnR5VHlwZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMSVRZLCBnZXRKU09ORW51bVZhbHVlKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDYXJkaW5hbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9UWVBFX1VQREFUQUJJTElUWSwgZ2V0SlNPTkVudW1WYWx1ZShwcm9wZXJ0eURlZmluaXRpb24uZ2V0VXBkYXRhYmlsaXR5KCkpKTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfVFlQRV9JTkhFUklURUQsIHByb3BlcnR5RGVmaW5pdGlvbi5pc0luaGVyaXRlZCgpLCByZXN1bHQpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9SRVFVSVJFRCwgcHJvcGVydHlEZWZpbml0aW9uLmlzUmVxdWlyZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoSlNPTl9QUk9QRVJUWV9UWVBFX1FVRVJZQUJMRSwgcHJvcGVydHlEZWZpbml0aW9uLmlzUXVlcnlhYmxlKCkpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9PUkRFUkFCTEUsIHByb3BlcnR5RGVmaW5pdGlvbi5pc09yZGVyYWJsZSgpKTsKLSAgICAgICAgc2V0SWZOb3ROdWxsKEpTT05fUFJPUEVSVFlfVFlQRV9PUEVOQ0hPSUNFLCBwcm9wZXJ0eURlZmluaXRpb24uaXNPcGVuQ2hvaWNlKCksIHJlc3VsdCk7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihwcm9wZXJ0eURlZmluaXRpb24sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBjaG9pY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIDxUPiBKU09OQXJyYXkgY29udmVydENob2ljZXMoZmluYWwgTGlzdDxDaG9pY2U8VD4+IGNob2ljZXMsIGZpbmFsIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5LAotICAgICAgICAgICAgZmluYWwgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQpIHsKLSAgICAgICAgYXNzZXJ0IGNhcmRpbmFsaXR5ICE9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNob2ljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OQXJyYXkgcmVzdWx0ID0gbmV3IEpTT05BcnJheSgpOwotCi0gICAgICAgIGZvciAoQ2hvaWNlPD8+IGNob2ljZSA6IGNob2ljZXMpIHsKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbkNob2ljZSA9IG5ldyBKU09OT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgIGpzb25DaG9pY2UucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0VfRElTUExBWU5BTUUsIGNob2ljZS5nZXREaXNwbGF5TmFtZSgpKTsKLQotICAgICAgICAgICAgaWYgKGNhcmRpbmFsaXR5ID09IENhcmRpbmFsaXR5LlNJTkdMRSkgewotICAgICAgICAgICAgICAgIGlmICghY2hvaWNlLmdldFZhbHVlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpzb25DaG9pY2UucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0VfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SlNPTlZhbHVlKGNob2ljZS5nZXRWYWx1ZSgpLmdldCgwKSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEpTT05BcnJheSB2YWx1ZXMgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBjaG9pY2UuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGdldEpTT05WYWx1ZSh2YWx1ZSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAganNvbkNob2ljZS5wdXQoSlNPTl9QUk9QRVJUWV9UWVBFX0NIT0lDRV9WQUxVRSwgdmFsdWVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoY2hvaWNlLmdldENob2ljZSgpKSkgewotICAgICAgICAgICAgICAgIGpzb25DaG9pY2UucHV0KEpTT05fUFJPUEVSVFlfVFlQRV9DSE9JQ0VfQ0hPSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydENob2ljZXMoY2hvaWNlLmdldENob2ljZSgpLCBjYXJkaW5hbGl0eSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LmFkZChqc29uQ2hvaWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSB0eXBlIGRlZmluaXRpb24gbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpTT05PYmplY3QgY29udmVydChmaW5hbCBUeXBlRGVmaW5pdGlvbkxpc3QgbGlzdCwgZmluYWwgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0KLSAgICAgICAgaWYgKGxpc3QuZ2V0TGlzdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEpTT05BcnJheSBvYmplY3RzID0gbmV3IEpTT05BcnJheSgpOwotCi0gICAgICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGUgOiBsaXN0LmdldExpc3QoKSkgewotICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKGNvbnZlcnQodHlwZSwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LnB1dChKU09OX1RZUEVTTElTVF9UWVBFUywgb2JqZWN0cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9UWVBFU0xJU1RfSEFTX01PUkVfSVRFTVMsIGxpc3QuaGFzTW9yZUl0ZW1zKCksIHJlc3VsdCk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX1RZUEVTTElTVF9OVU1fSVRFTVMsIGxpc3QuZ2V0TnVtSXRlbXMoKSwgcmVzdWx0KTsKLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGxpc3QsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHR5cGUgZGVmaW5pdGlvbiBsaXN0LgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIFR5cGVEZWZpbml0aW9uTGlzdCBjb252ZXJ0VHlwZUNoaWxkcmVuKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbikgewotICAgICAgICBpZiAoanNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdEltcGwgcmVzdWx0ID0gbmV3IFR5cGVEZWZpbml0aW9uTGlzdEltcGwoKTsKLQotICAgICAgICBPYmplY3QgdHlwZXNMaXN0ID0ganNvbi5nZXQoSlNPTl9UWVBFU0xJU1RfVFlQRVMpOwotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgaWYgKHR5cGVzTGlzdCBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHR5cGUgOiAoTGlzdCkgdHlwZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKGNvbnZlcnRUeXBlRGVmaW5pdGlvbigoTWFwPFN0cmluZywgT2JqZWN0PikgdHlwZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRMaXN0KHR5cGVzKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhnZXRCb29sZWFuKGpzb24sIEpTT05fVFlQRVNMSVNUX0hBU19NT1JFX0lURU1TKSk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhnZXRJbnRlZ2VyKGpzb24sIEpTT05fVFlQRVNMSVNUX05VTV9JVEVNUykpOwotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvbiwgcmVzdWx0LCBUWVBFU0xJU1RfS0VZUyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHR5cGUgZGVmaW5pdGlvbiBjb250YWluZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKU09OT2JqZWN0IGNvbnZlcnQoZmluYWwgVHlwZURlZmluaXRpb25Db250YWluZXIgY29udGFpbmVyLCBmaW5hbCBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCkgewotICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICByZXN1bHQucHV0KEpTT05fVFlQRVNDT05UQUlORVJfVFlQRSwgY29udmVydChjb250YWluZXIuZ2V0VHlwZURlZmluaXRpb24oKSwgZGF0ZVRpbWVGb3JtYXQpKTsKLQotICAgICAgICBpZiAoaXNOb3RFbXB0eShjb250YWluZXIuZ2V0Q2hpbGRyZW4oKSkpIHsKLSAgICAgICAgICAgIEpTT05BcnJheSBjaGlsZHJlbiA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgY2hpbGQgOiBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChjb252ZXJ0KGNoaWxkLCBkYXRlVGltZUZvcm1hdCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQucHV0KEpTT05fVFlQRVNDT05UQUlORVJfQ0hJTERSRU4sIGNoaWxkcmVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY29udGFpbmVyLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSB0eXBlIGRlZmluaXRpb24gbGlzdC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiIH0pCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBjb252ZXJ0VHlwZURlc2NlbmRhbnRzKGZpbmFsIExpc3Q8T2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGpzb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPigpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IGpzb24pIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb25Db250YWluZXIgPSAoTWFwPFN0cmluZywgT2JqZWN0Pikgb2JqOwotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCBjb250YWluZXIgPSBuZXcgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsKCk7Ci0KLSAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0VHlwZURlZmluaXRpb24oY29udmVydFR5cGVEZWZpbml0aW9uKGdldE1hcChqc29uQ29udGFpbmVyLmdldChKU09OX1RZUEVTQ09OVEFJTkVSX1RZUEUpKSkpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGNoaWxkcmVuID0ganNvbkNvbnRhaW5lci5nZXQoSlNPTl9UWVBFU0NPTlRBSU5FUl9DSElMRFJFTik7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0Q2hpbGRyZW4oY29udmVydFR5cGVEZXNjZW5kYW50cygoTGlzdDxPYmplY3Q+KSBjaGlsZHJlbikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zZXRDaGlsZHJlbihDb2xsZWN0aW9ucy48VHlwZURlZmluaXRpb25Db250YWluZXI+IGVtcHR5TGlzdCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGpzb25Db250YWluZXIsIGNvbnRhaW5lciwgVFlQRVNDT05UQUlORVJfS0VZUyk7Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGNvbnRhaW5lcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdERhdGEgY29udmVydE9iamVjdChmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24sIGZpbmFsIFR5cGVDYWNoZSB0eXBlQ2FjaGUpIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3REYXRhSW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0RGF0YUltcGwoKTsKLQotICAgICAgICByZXN1bHQuc2V0QWNsKGNvbnZlcnRBY2woZ2V0TWFwKGpzb24uZ2V0KEpTT05fT0JKRUNUX0FDTCkpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRBbGxvd2FibGVBY3Rpb25zKGNvbnZlcnRBbGxvd2FibGVBY3Rpb25zKGdldE1hcChqc29uLmdldChKU09OX09CSkVDVF9BTExPV0FCTEVfQUNUSU9OUykpKSk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbkNoYW5nZUV2ZW50SW5mbyA9IGdldE1hcChqc29uLmdldChKU09OX09CSkVDVF9DSEFOR0VfRVZFTlRfSU5GTykpOwotICAgICAgICBpZiAoanNvbkNoYW5nZUV2ZW50SW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDaGFuZ2VFdmVudEluZm9EYXRhSW1wbCBjaGFuZ2VFdmVudEluZm8gPSBuZXcgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwoKTsKLQotICAgICAgICAgICAgY2hhbmdlRXZlbnRJbmZvLnNldENoYW5nZVRpbWUoZ2V0RGF0ZVRpbWUoanNvbkNoYW5nZUV2ZW50SW5mbywgSlNPTl9DSEFOR0VfRVZFTlRfVElNRSkpOwotICAgICAgICAgICAgY2hhbmdlRXZlbnRJbmZvLnNldENoYW5nZVR5cGUoZ2V0RW51bShqc29uQ2hhbmdlRXZlbnRJbmZvLCBKU09OX0NIQU5HRV9FVkVOVF9UWVBFLCBDaGFuZ2VUeXBlLmNsYXNzKSk7Ci0KLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvbiwgcmVzdWx0LCBDSEFOR0VfRVZFTlRfS0VZUyk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRDaGFuZ2VFdmVudEluZm8oY2hhbmdlRXZlbnRJbmZvKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0SXNFeGFjdEFjbChnZXRCb29sZWFuKGpzb24sIEpTT05fT0JKRUNUX0VYQUNUX0FDTCkpOwotICAgICAgICByZXN1bHQuc2V0UG9saWN5SWRzKGNvbnZlcnRQb2xpY3lJZHMoZ2V0TWFwKGpzb24uZ2V0KEpTT05fT0JKRUNUX1BPTElDWV9JRFMpKSkpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcE1hcCA9IGdldE1hcChqc29uLmdldChKU09OX09CSkVDVF9TVUNDSU5DVF9QUk9QRVJUSUVTKSk7Ci0gICAgICAgIGlmIChwcm9wTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRQcm9wZXJ0aWVzKGNvbnZlcnRTdWNjaW5jdFByb3BlcnRpZXMocHJvcE1hcCwgZ2V0TWFwKGpzb24uZ2V0KEpTT05fT0JKRUNUX1BST1BFUlRJRVNfRVhURU5TSU9OKSksCi0gICAgICAgICAgICAgICAgICAgIHR5cGVDYWNoZSkpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BNYXAgPSBnZXRNYXAoanNvbi5nZXQoSlNPTl9PQkpFQ1RfUFJPUEVSVElFUykpOwotICAgICAgICBpZiAocHJvcE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0UHJvcGVydGllcyhjb252ZXJ0UHJvcGVydGllcyhwcm9wTWFwLCBnZXRNYXAoanNvbi5nZXQoSlNPTl9PQkpFQ1RfUFJPUEVSVElFU19FWFRFTlNJT04pKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxPYmplY3Q+IGpzb25SZWxhdGlvbnNoaXBzID0gZ2V0TGlzdChqc29uLmdldChKU09OX09CSkVDVF9SRUxBVElPTlNISVBTKSk7Ci0gICAgICAgIGlmIChqc29uUmVsYXRpb25zaGlwcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0UmVsYXRpb25zaGlwcyhjb252ZXJ0T2JqZWN0cyhqc29uUmVsYXRpb25zaGlwcywgdHlwZUNhY2hlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxPYmplY3Q+IGpzb25SZW5kaXRpb25zID0gZ2V0TGlzdChqc29uLmdldChKU09OX09CSkVDVF9SRU5ESVRJT05TKSk7Ci0gICAgICAgIGlmIChqc29uUmVuZGl0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0UmVuZGl0aW9ucyhjb252ZXJ0UmVuZGl0aW9ucyhqc29uUmVuZGl0aW9ucykpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIE9CSkVDVF9LRVlTKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0RGF0YT4gY29udmVydE9iamVjdHMoZmluYWwgTGlzdDxPYmplY3Q+IGpzb24sIGZpbmFsIFR5cGVDYWNoZSB0eXBlQ2FjaGUpIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb2JqIDoganNvbikgewotICAgICAgICAgICAgT2JqZWN0RGF0YSByZWxhdGlvbnNoaXAgPSBjb252ZXJ0T2JqZWN0KGdldE1hcChvYmopLCB0eXBlQ2FjaGUpOwotICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChyZWxhdGlvbnNoaXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBBQ0wuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBY2wgY29udmVydEFjbChmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24pIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBY2Nlc3NDb250cm9sTGlzdEltcGwgcmVzdWx0ID0gbmV3IEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCgpOwotCi0gICAgICAgIExpc3Q8QWNlPiBhY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0KLSAgICAgICAgTGlzdDxPYmplY3Q+IGpzb25BY2VzID0gZ2V0TGlzdChqc29uLmdldChKU09OX0FDTF9BQ0VTKSk7Ci0gICAgICAgIGlmIChqc29uQWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBqc29uQWNlcykgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBnZXRNYXAob2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sRW50cnlJbXBsIGFjZSA9IG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBpc0RpcmVjdCA9IGdldEJvb2xlYW4oZW50cnksIEpTT05fQUNFX0lTX0RJUkVDVCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjZS5zZXREaXJlY3QoaXNEaXJlY3QgIT0gbnVsbCA/IGlzRGlyZWN0LmJvb2xlYW5WYWx1ZSgpIDogdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGpzb25QZXJtaXNzaW9ucyA9IGdldExpc3QoZW50cnkuZ2V0KEpTT05fQUNFX1BFUk1JU1NJT05TKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqc29uUGVybWlzc2lvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBwZXJtIDoganNvblBlcm1pc3Npb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlcm0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucy5hZGQocGVybS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY2Uuc2V0UGVybWlzc2lvbnMocGVybWlzc2lvbnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uUHJpbmNpcGFsID0gZ2V0TWFwKGVudHJ5LmdldChKU09OX0FDRV9QUklOQ0lQQUwpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25QcmluY2lwYWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsIHByaW5jaXBhbCA9IG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmNpcGFsLnNldElkKGdldFN0cmluZyhqc29uUHJpbmNpcGFsLCBKU09OX0FDRV9QUklOQ0lQQUxfSUQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uUHJpbmNpcGFsLCBwcmluY2lwYWwsIFBSSU5DSVBBTF9LRVlTKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYWNlLnNldFByaW5jaXBhbChwcmluY2lwYWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihlbnRyeSwgYWNlLCBBQ0VfS0VZUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWNlcy5hZGQoYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0QWNlcyhhY2VzKTsKLQotICAgICAgICByZXN1bHQuc2V0RXhhY3QoZ2V0Qm9vbGVhbihqc29uLCBKU09OX0FDTF9JU19FWEFDVCkpOwotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvbiwgcmVzdWx0LCBBQ0xfS0VZUyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbGxvd2FibGUgYWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFsbG93YWJsZUFjdGlvbnMgY29udmVydEFsbG93YWJsZUFjdGlvbnMoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWxsb3dhYmxlQWN0aW9uc0ltcGwgcmVzdWx0ID0gbmV3IEFsbG93YWJsZUFjdGlvbnNJbXBsKCk7Ci0gICAgICAgIFNldDxBY3Rpb24+IGFsbG93YWJsZUFjdGlvbnMgPSBFbnVtU2V0Lm5vbmVPZihBY3Rpb24uY2xhc3MpOwotCi0gICAgICAgIGZvciAoQWN0aW9uIGFjdGlvbiA6IEFjdGlvbi52YWx1ZXMoKSkgewotICAgICAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IGdldEJvb2xlYW4oanNvbiwgYWN0aW9uLnZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBhbGxvd2FibGVBY3Rpb25zLmFkZChhY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldEFsbG93YWJsZUFjdGlvbnMoYWxsb3dhYmxlQWN0aW9ucyk7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIEFMTE9XQUJMRV9BQ1RJT05TX0tFWVMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBsaXN0IG9mIHBvbGljeSBpZHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQb2xpY3lJZExpc3QgY29udmVydFBvbGljeUlkcyhmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24pIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQb2xpY3lJZExpc3RJbXBsIHJlc3VsdCA9IG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBMaXN0PE9iamVjdD4gaWRzID0gZ2V0TGlzdChqc29uLmdldChKU09OX09CSkVDVF9QT0xJQ1lfSURTX0lEUykpOwotCi0gICAgICAgIGlmIChpZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogaWRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICBwb2xpY3lJZHMuYWRkKChTdHJpbmcpIG9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIFBPTElDWV9JRFNfS0VZUyk7Ci0KLSAgICAgICAgcmVzdWx0LnNldFBvbGljeUlkcyhwb2xpY3lJZHMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgY29udmVydFByb3BlcnRpZXMoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uLCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGV4dEpzb24pIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0aWVzSW1wbCByZXN1bHQgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBqc29uUHJvcGVydHkgOiBqc29uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb25Qcm9wZXJ0eU1hcCA9IGdldE1hcChqc29uUHJvcGVydHkpOwotICAgICAgICAgICAgaWYgKGpzb25Qcm9wZXJ0eU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQWJzdHJhY3RQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0U3RyaW5nKGpzb25Qcm9wZXJ0eU1hcCwgSlNPTl9QUk9QRVJUWV9JRCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IGdldFN0cmluZyhqc29uUHJvcGVydHlNYXAsIEpTT05fUFJPUEVSVFlfUVVFUllOQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCAmJiBxdWVyeU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgcHJvcGVydHkhIE5laXRoZXIgYSBwcm9wZXJ0eSBJRCBub3IgYSBxdWVyeSBuYW1lIGlzIHByb3ZpZGVkISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZSBwcm9wZXJ0eVR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSA9IFByb3BlcnR5VHlwZS5mcm9tVmFsdWUoZ2V0U3RyaW5nKGpzb25Qcm9wZXJ0eU1hcCwgSlNPTl9QUk9QRVJUWV9EQVRBVFlQRSkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eSBkYXRhdHlwZTogIiArIGlkLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBqc29uUHJvcGVydHlNYXAuZ2V0KEpTT05fUFJPUEVSVFlfVkFMVUUpOwotICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWx1ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gKExpc3Q8T2JqZWN0PikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHlUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5U3RyaW5nSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5U3RyaW5nSW1wbCkgcHJvcGVydHkpLnNldFZhbHVlcyhjb3B5U3RyaW5nVmFsdWVzKHZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElEOgotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eUlkSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SWRJbXBsKSBwcm9wZXJ0eSkuc2V0VmFsdWVzKGNvcHlTdHJpbmdWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlCb29sZWFuSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weUJvb2xlYW5WYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weUludGVnZXJWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbEltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weURlY2ltYWxWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlEYXRlVGltZUltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weURhdGVUaW1lVmFsdWVzKHZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SHRtbEltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUh0bWxJbXBsKSBwcm9wZXJ0eSkuc2V0VmFsdWVzKGNvcHlTdHJpbmdWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eVVyaUltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eVVyaUltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weVN0cmluZ1ZhbHVlcyh2YWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IGRhdGEgdHlwZSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eS5zZXRJZChpZCk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0RGlzcGxheU5hbWUoZ2V0U3RyaW5nKGpzb25Qcm9wZXJ0eU1hcCwgSlNPTl9QUk9QRVJUWV9ESVNQTEFZTkFNRSkpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5LnNldFF1ZXJ5TmFtZShxdWVyeU5hbWUpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5LnNldExvY2FsTmFtZShnZXRTdHJpbmcoanNvblByb3BlcnR5TWFwLCBKU09OX1BST1BFUlRZX0xPQ0FMTkFNRSkpOwotCi0gICAgICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uUHJvcGVydHlNYXAsIHByb3BlcnR5LCBQUk9QRVJUWV9LRVlTKTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0SnNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGV4dEpzb24sIHJlc3VsdCwgQ29sbGVjdGlvbnMuPFN0cmluZz4gZW1wdHlTZXQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGNvbnZlcnRTdWNjaW5jdFByb3BlcnRpZXMoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uLAotICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBleHRKc29uLCBmaW5hbCBUeXBlQ2FjaGUgdHlwZUNhY2hlKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IG51bGw7Ci0gICAgICAgIGlmIChqc29uLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHR5cGVEZWYgPSB0eXBlQ2FjaGUuZ2V0VHlwZURlZmluaXRpb24oKFN0cmluZykganNvbi5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8T2JqZWN0PiBzZWNUeXBlSWRzID0gZ2V0TGlzdChqc29uLmdldChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKSk7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHNlY1R5cGVEZWZzID0gbnVsbDsKLSAgICAgICAgaWYgKGlzTm90RW1wdHkoc2VjVHlwZUlkcykpIHsKLSAgICAgICAgICAgIHNlY1R5cGVEZWZzID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbj4oc2VjVHlwZUlkcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgc2VjVHlwZUlkIDogc2VjVHlwZUlkcykgewotICAgICAgICAgICAgICAgIGlmIChzZWNUeXBlSWQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VjVHlwZURlZnMuYWRkKHR5cGVDYWNoZS5nZXRUeXBlRGVmaW5pdGlvbigoU3RyaW5nKSBzZWNUeXBlSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0aWVzSW1wbCByZXN1bHQgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBqc29uLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IGVudHJ5LmdldEtleSgpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodHlwZURlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcERlZiA9IHR5cGVEZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wRGVmID09IG51bGwgJiYgc2VjVHlwZURlZnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gc2VjVHlwZURlZiA6IHNlY1R5cGVEZWZzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWNUeXBlRGVmICE9IG51bGwgJiYgc2VjVHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcERlZiA9IHNlY1R5cGVEZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9wRGVmID0gdHlwZUNhY2hlLmdldFR5cGVEZWZpbml0aW9uKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoaWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcERlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcERlZiA9IHR5cGVDYWNoZS5nZXRUeXBlRGVmaW5pdGlvbihCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoaWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcERlZiA9PSBudWxsICYmIHR5cGVEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHJlbG9hZGVkVHlwZURlZiA9IHR5cGVDYWNoZS5yZWxvYWRUeXBlRGVmaW5pdGlvbih0eXBlRGVmLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGlmIChyZWxvYWRlZFR5cGVEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wRGVmID0gcmVsb2FkZWRUeXBlRGVmLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByb3BEZWYgPT0gbnVsbCAmJiBzZWNUeXBlRGVmcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiBzZWNUeXBlRGVmIDogc2VjVHlwZURlZnMpIHsKLSAgICAgICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gcmVsb2FkZWRUeXBlRGVmID0gdHlwZUNhY2hlLnJlbG9hZFR5cGVEZWZpbml0aW9uKHNlY1R5cGVEZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWxvYWRlZFR5cGVEZWYgIT0gbnVsbCAmJiByZWxvYWRlZFR5cGVEZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BEZWYgPSByZWxvYWRlZFR5cGVEZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWx1ZXMgPSBudWxsOwotICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gKExpc3Q8T2JqZWN0PikgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWJzdHJhY3RQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAocHJvcERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5U3RyaW5nSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5U3RyaW5nSW1wbCkgcHJvcGVydHkpLnNldFZhbHVlcyhjb3B5U3RyaW5nVmFsdWVzKHZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIElEOgotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eUlkSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SWRJbXBsKSBwcm9wZXJ0eSkuc2V0VmFsdWVzKGNvcHlTdHJpbmdWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlCb29sZWFuSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weUJvb2xlYW5WYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weUludGVnZXJWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbEltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weURlY2ltYWxWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlEYXRlVGltZUltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weURhdGVUaW1lVmFsdWVzKHZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SHRtbEltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUh0bWxJbXBsKSBwcm9wZXJ0eSkuc2V0VmFsdWVzKGNvcHlTdHJpbmdWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eVVyaUltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eVVyaUltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weVN0cmluZ1ZhbHVlcyh2YWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IHR5cGUhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0SWQoaWQpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5LnNldERpc3BsYXlOYW1lKHByb3BEZWYuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0UXVlcnlOYW1lKHByb3BEZWYuZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5LnNldExvY2FsTmFtZShwcm9wRGVmLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBlbHNlIGJsb2NrIHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgaW4gcmFyZSBjaXJjdW1zdGFuY2VzCi0gICAgICAgICAgICAgICAgLy8gaXQgbWF5IHJldHVybiBpbmNvcnJlY3QgdHlwZXMKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0ltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0VmFsdWUgPSB2YWx1ZXMuZ2V0KDApOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlCb29sZWFuSW1wbCkgcHJvcGVydHkpLnNldFZhbHVlcyhjb3B5Qm9vbGVhblZhbHVlcyh2YWx1ZXMpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdFZhbHVlIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJJbXBsKSBwcm9wZXJ0eSkuc2V0VmFsdWVzKGNvcHlJbnRlZ2VyVmFsdWVzKHZhbHVlcykpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eURlY2ltYWxJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbEltcGwpIHByb3BlcnR5KS5zZXRWYWx1ZXMoY29weURlY2ltYWxWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlTdHJpbmdJbXBsKSBwcm9wZXJ0eSkuc2V0VmFsdWVzKGNvcHlTdHJpbmdWYWx1ZXModmFsdWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcm9wZXJ0eS5zZXRJZChpZCk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHkuc2V0RGlzcGxheU5hbWUoaWQpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5LnNldFF1ZXJ5TmFtZShudWxsKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eS5zZXRMb2NhbE5hbWUobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0SnNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGV4dEpzb24sIHJlc3VsdCwgQ29sbGVjdGlvbnMuPFN0cmluZz4gZW1wdHlTZXQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBjb3B5U3RyaW5nVmFsdWVzKExpc3Q8T2JqZWN0PiBzb3VyY2UpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNvdXJjZS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG9iai50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJvcGVydHkgdmFsdWU6ICIgKyBvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxCb29sZWFuPiBjb3B5Qm9vbGVhblZhbHVlcyhMaXN0PE9iamVjdD4gc291cmNlKSB7Ci0gICAgICAgIExpc3Q8Qm9vbGVhbj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEJvb2xlYW4+KHNvdXJjZS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCgoQm9vbGVhbikgb2JqKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJvcGVydHkgdmFsdWU6ICIgKyBvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxCaWdJbnRlZ2VyPiBjb3B5SW50ZWdlclZhbHVlcyhMaXN0PE9iamVjdD4gc291cmNlKSB7Ci0gICAgICAgIExpc3Q8QmlnSW50ZWdlcj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEJpZ0ludGVnZXI+KHNvdXJjZS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCgoQmlnSW50ZWdlcikgb2JqKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJvcGVydHkgdmFsdWU6ICIgKyBvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxCaWdEZWNpbWFsPiBjb3B5RGVjaW1hbFZhbHVlcyhMaXN0PE9iamVjdD4gc291cmNlKSB7Ci0gICAgICAgIExpc3Q8QmlnRGVjaW1hbD4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEJpZ0RlY2ltYWw+KHNvdXJjZS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogc291cmNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCgoQmlnRGVjaW1hbCkgb2JqKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgQmlnRGVjaW1hbCgoQmlnSW50ZWdlcikgb2JqKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IHZhbHVlOiAiICsgb2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+IGNvcHlEYXRlVGltZVZhbHVlcyhMaXN0PE9iamVjdD4gc291cmNlKSB7Ci0gICAgICAgIExpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4oc291cmNlLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBzb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICAgICAgICAgICAgICBjYWwuc2V0VGltZUluTWlsbGlzKCgoTnVtYmVyKSBvYmopLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjYWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IERhdGVUaW1lSGVscGVyLnBhcnNlWG1sRGF0ZVRpbWUoKFN0cmluZykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJvcGVydHkgdmFsdWU6ICIgKyBvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY2FsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcHJvcGVydHkgdmFsdWU6ICIgKyBvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSByZW5kaXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZW5kaXRpb25EYXRhIGNvbnZlcnRSZW5kaXRpb24oZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGl0aW9uRGF0YUltcGwgcmVzdWx0ID0gbmV3IFJlbmRpdGlvbkRhdGFJbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldEJpZ0hlaWdodChnZXRJbnRlZ2VyKGpzb24sIEpTT05fUkVORElUSU9OX0hFSUdIVCkpOwotICAgICAgICByZXN1bHQuc2V0S2luZChnZXRTdHJpbmcoanNvbiwgSlNPTl9SRU5ESVRJT05fS0lORCkpOwotICAgICAgICByZXN1bHQuc2V0QmlnTGVuZ3RoKGdldEludGVnZXIoanNvbiwgSlNPTl9SRU5ESVRJT05fTEVOR1RIKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRNaW1lVHlwZShnZXRTdHJpbmcoanNvbiwgSlNPTl9SRU5ESVRJT05fTUlNRVRZUEUpKTsKLSAgICAgICAgcmVzdWx0LnNldFJlbmRpdGlvbkRvY3VtZW50SWQoZ2V0U3RyaW5nKGpzb24sIEpTT05fUkVORElUSU9OX0RPQ1VNRU5UX0lEKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRTdHJlYW1JZChnZXRTdHJpbmcoanNvbiwgSlNPTl9SRU5ESVRJT05fU1RSRUFNX0lEKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRUaXRsZShnZXRTdHJpbmcoanNvbiwgSlNPTl9SRU5ESVRJT05fVElUTEUpKTsKLSAgICAgICAgcmVzdWx0LnNldEJpZ1dpZHRoKGdldEludGVnZXIoanNvbiwgSlNPTl9SRU5ESVRJT05fV0lEVEgpKTsKLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGpzb24sIHJlc3VsdCwgUkVORElUSU9OX0tFWVMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBsaXN0IG9mIHJlbmRpdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFJlbmRpdGlvbkRhdGE+IGNvbnZlcnRSZW5kaXRpb25zKGZpbmFsIExpc3Q8T2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxSZW5kaXRpb25EYXRhPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFJlbmRpdGlvbkRhdGE+KCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3Qgb2JqIDoganNvbikgewotICAgICAgICAgICAgUmVuZGl0aW9uRGF0YSByZW5kaXRpb24gPSBjb252ZXJ0UmVuZGl0aW9uKGdldE1hcChvYmopKTsKLSAgICAgICAgICAgIGlmIChyZW5kaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocmVuZGl0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBvYmplY3QgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdEluRm9sZGVyTGlzdCBjb252ZXJ0T2JqZWN0SW5Gb2xkZXJMaXN0KGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiwgZmluYWwgVHlwZUNhY2hlIHR5cGVDYWNoZSkgewotICAgICAgICBpZiAoanNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdEltcGwgcmVzdWx0ID0gbmV3IE9iamVjdEluRm9sZGVyTGlzdEltcGwoKTsKLQotICAgICAgICBMaXN0PE9iamVjdD4ganNvbkNoaWxkcmVuID0gZ2V0TGlzdChqc29uLmdldChKU09OX09CSkVDVElORk9MREVSTElTVF9PQkpFQ1RTKSk7Ci0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPiBvYmplY3RzID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckRhdGE+KCk7Ci0KLSAgICAgICAgaWYgKGpzb25DaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBqc29uQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb25PYmplY3QgPSBnZXRNYXAob2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoanNvbk9iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKGNvbnZlcnRPYmplY3RJbkZvbGRlcihqc29uT2JqZWN0LCB0eXBlQ2FjaGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0T2JqZWN0cyhvYmplY3RzKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhnZXRCb29sZWFuKGpzb24sIEpTT05fT0JKRUNUSU5GT0xERVJMSVNUX0hBU19NT1JFX0lURU1TKSk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhnZXRJbnRlZ2VyKGpzb24sIEpTT05fT0JKRUNUSU5GT0xERVJMSVNUX05VTV9JVEVNUykpOwotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvbiwgcmVzdWx0LCBPQkpFQ1RJTkZPTERFUkxJU1RfS0VZUyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBvYmplY3QgaW4gYSBmb2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RJbkZvbGRlckRhdGEgY29udmVydE9iamVjdEluRm9sZGVyKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiwgZmluYWwgVHlwZUNhY2hlIHR5cGVDYWNoZSkgewotICAgICAgICBpZiAoanNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdEluRm9sZGVyRGF0YUltcGwgcmVzdWx0ID0gbmV3IE9iamVjdEluRm9sZGVyRGF0YUltcGwoKTsKLQotICAgICAgICByZXN1bHQuc2V0T2JqZWN0KGNvbnZlcnRPYmplY3QoZ2V0TWFwKGpzb24uZ2V0KEpTT05fT0JKRUNUSU5GT0xERVJfT0JKRUNUKSksIHR5cGVDYWNoZSkpOwotICAgICAgICByZXN1bHQuc2V0UGF0aFNlZ21lbnQoZ2V0U3RyaW5nKGpzb24sIEpTT05fT0JKRUNUSU5GT0xERVJfUEFUSF9TRUdNRU5UKSk7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIE9CSkVDVElORk9MREVSX0tFWVMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBkZXNjZW5kYW50cyB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gY29udmVydERlc2NlbmRhbnRzKGZpbmFsIExpc3Q8T2JqZWN0PiBqc29uLCBmaW5hbCBUeXBlQ2FjaGUgdHlwZUNhY2hlKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBqc29uKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGRlc2MgPSBnZXRNYXAob2JqKTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGNvbnZlcnREZXNjZW5kYW50KGRlc2MsIHR5cGVDYWNoZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGRlc2NlbmRhbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RJbkZvbGRlckNvbnRhaW5lciBjb252ZXJ0RGVzY2VuZGFudChmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24sIGZpbmFsIFR5cGVDYWNoZSB0eXBlQ2FjaGUpIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwgcmVzdWx0ID0gbmV3IE9iamVjdEluRm9sZGVyQ29udGFpbmVySW1wbCgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRPYmplY3QoY29udmVydE9iamVjdEluRm9sZGVyKGdldE1hcChqc29uLmdldChKU09OX09CSkVDVElORk9MREVSQ09OVEFJTkVSX09CSkVDVCkpLCB0eXBlQ2FjaGUpKTsKLQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBjb250YWluZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLSAgICAgICAgTGlzdDxPYmplY3Q+IGpzb25Db250YWluZXJMaXN0ID0gZ2V0TGlzdChqc29uLmdldChKU09OX09CSkVDVElORk9MREVSQ09OVEFJTkVSX0NISUxEUkVOKSk7Ci0gICAgICAgIGlmIChqc29uQ29udGFpbmVyTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBqc29uQ29udGFpbmVyTGlzdCkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udGFpbmVyQ2hpbGQgPSBnZXRNYXAob2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyQ2hpbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250YWluZXJMaXN0LmFkZChjb252ZXJ0RGVzY2VuZGFudChjb250YWluZXJDaGlsZCwgdHlwZUNhY2hlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldENoaWxkcmVuKGNvbnRhaW5lckxpc3QpOwotCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvbiwgcmVzdWx0LCBPQkpFQ1RJTkZPTERFUkNPTlRBSU5FUl9LRVlTKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIG9iamVjdCBwYXJlbnRzIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGNvbnZlcnRPYmplY3RQYXJlbnRzKGZpbmFsIExpc3Q8T2JqZWN0PiBqc29uLCBmaW5hbCBUeXBlQ2FjaGUgdHlwZUNhY2hlKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFBhcmVudERhdGE+KCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3Qgb2JqIDoganNvbikgewotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uUGFyZW50ID0gZ2V0TWFwKG9iaik7Ci0gICAgICAgICAgICBpZiAoanNvblBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0UGFyZW50RGF0YUltcGwgcGFyZW50ID0gbmV3IE9iamVjdFBhcmVudERhdGFJbXBsKCk7Ci0KLSAgICAgICAgICAgICAgICBwYXJlbnQuc2V0T2JqZWN0KGNvbnZlcnRPYmplY3QoZ2V0TWFwKGpzb25QYXJlbnQuZ2V0KEpTT05fT0JKRUNUUEFSRU5UU19PQkpFQ1QpKSwgdHlwZUNhY2hlKSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50LnNldFJlbGF0aXZlUGF0aFNlZ21lbnQoZ2V0U3RyaW5nKGpzb25QYXJlbnQsIEpTT05fT0JKRUNUUEFSRU5UU19SRUxBVElWRV9QQVRIX1NFR01FTlQpKTsKLQotICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvblBhcmVudCwgcGFyZW50LCBPQkpFQ1RQQVJFTlRTX0tFWVMpOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChwYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIG9iamVjdCBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0TGlzdCBjb252ZXJ0T2JqZWN0TGlzdChmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24sIGZpbmFsIFR5cGVDYWNoZSB0eXBlQ2FjaGUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzUXVlcnlSZXN1bHQpIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsKLQotICAgICAgICBMaXN0PE9iamVjdD4ganNvbkNoaWxkcmVuID0gZ2V0TGlzdChqc29uLmdldChpc1F1ZXJ5UmVzdWx0ID8gSlNPTl9RVUVSWVJFU1VMVExJU1RfUkVTVUxUUwotICAgICAgICAgICAgICAgIDogSlNPTl9PQkpFQ1RMSVNUX09CSkVDVFMpKTsKLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiBvYmplY3RzID0gbmV3IEFycmF5TGlzdDxPYmplY3REYXRhPigpOwotCi0gICAgICAgIGlmIChqc29uQ2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDoganNvbkNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uT2JqZWN0ID0gZ2V0TWFwKG9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGpzb25PYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChjb252ZXJ0T2JqZWN0KGpzb25PYmplY3QsIHR5cGVDYWNoZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG9iamVjdHMpOwotCi0gICAgICAgIGlmIChpc1F1ZXJ5UmVzdWx0KSB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKGdldEJvb2xlYW4oanNvbiwgSlNPTl9RVUVSWVJFU1VMVExJU1RfSEFTX01PUkVfSVRFTVMpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhnZXRJbnRlZ2VyKGpzb24sIEpTT05fUVVFUllSRVNVTFRMSVNUX05VTV9JVEVNUykpOwotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIFFVRVJZUkVTVUxUTElTVF9LRVlTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoZ2V0Qm9vbGVhbihqc29uLCBKU09OX09CSkVDVExJU1RfSEFTX01PUkVfSVRFTVMpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhnZXRJbnRlZ2VyKGpzb24sIEpTT05fT0JKRUNUTElTVF9OVU1fSVRFTVMpKTsKLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oanNvbiwgcmVzdWx0LCBPQkpFQ1RMSVNUX0tFWVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgRmFpbGVkVG9EZWxldGUgaWRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSlNPTk9iamVjdCBjb252ZXJ0KGZpbmFsIEZhaWxlZFRvRGVsZXRlRGF0YSBmdGQpIHsKLSAgICAgICAgaWYgKGZ0ZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICBKU09OQXJyYXkgaWRzID0gbmV3IEpTT05BcnJheSgpOwotICAgICAgICBpZiAoZnRkLmdldElkcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogZnRkLmdldElkcygpKSB7Ci0gICAgICAgICAgICAgICAgaWRzLmFkZChpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQucHV0KEpTT05fRkFJTEVEVE9ERUxFVEVfSUQsIGlkcyk7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihmdGQsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBGYWlsZWRUb0RlbGV0ZSBpZHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGYWlsZWRUb0RlbGV0ZURhdGEgY29udmVydEZhaWxlZFRvRGVsZXRlKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbikgewotICAgICAgICBpZiAoanNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEZhaWxlZFRvRGVsZXRlRGF0YUltcGwgcmVzdWx0ID0gbmV3IEZhaWxlZFRvRGVsZXRlRGF0YUltcGwoKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiBqc29uSWRzID0gZ2V0TGlzdChqc29uLmdldChKU09OX0ZBSUxFRFRPREVMRVRFX0lEKSk7Ci0KLSAgICAgICAgaWYgKGpzb25JZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDoganNvbklkcykgewotICAgICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZHMuYWRkKG9iai50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SWRzKGlkcyk7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIEZBSUxFRFRPREVMRVRFX0tFWVMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGJ1bGsgdXBkYXRlIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKU09OT2JqZWN0IGNvbnZlcnQoQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4gb2MpIHsKLSAgICAgICAgaWYgKG9jID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTk9iamVjdCByZXN1bHQgPSBuZXcgSlNPTk9iamVjdCgpOwotCi0gICAgICAgIHNldElmTm90TnVsbChKU09OX0JVTEtfVVBEQVRFX0lELCBvYy5nZXRJZCgpLCByZXN1bHQpOwotICAgICAgICBzZXRJZk5vdE51bGwoSlNPTl9CVUxLX1VQREFURV9ORVdfSUQsIG9jLmdldE5ld0lkKCksIHJlc3VsdCk7Ci0gICAgICAgIHNldElmTm90TnVsbChKU09OX0JVTEtfVVBEQVRFX0NIQU5HRV9UT0tFTiwgb2MuZ2V0Q2hhbmdlVG9rZW4oKSwgcmVzdWx0KTsKLQotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9jLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYnVsayB1cGRhdGUgZGF0YSBsaXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IGNvbnZlcnRCdWxrVXBkYXRlKGZpbmFsIExpc3Q8T2JqZWN0PiBqc29uKSB7Ci0gICAgICAgIGlmIChqc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4oKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBvY0pzb24gOiBqc29uKSB7Ci0gICAgICAgICAgICBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiBvYyA9IGNvbnZlcnRCdWxrVXBkYXRlKGdldE1hcChvY0pzb24pKTsKLSAgICAgICAgICAgIGlmIChvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChvYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGJ1bGsgdXBkYXRlIGRhdGEuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiBjb252ZXJ0QnVsa1VwZGF0ZShmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24pIHsKLSAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaWQgPSBnZXRTdHJpbmcoanNvbiwgSlNPTl9CVUxLX1VQREFURV9JRCk7Ci0gICAgICAgIFN0cmluZyBuZXdJZCA9IGdldFN0cmluZyhqc29uLCBKU09OX0JVTEtfVVBEQVRFX05FV19JRCk7Ci0gICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9IGdldFN0cmluZyhqc29uLCBKU09OX0JVTEtfVVBEQVRFX0NIQU5HRV9UT0tFTik7Ci0KLSAgICAgICAgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsIHJlc3VsdCA9IG5ldyBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwoaWQsIG5ld0lkLCBjaGFuZ2VUb2tlbik7Ci0KLSAgICAgICAgY29udmVydEV4dGVuc2lvbihqc29uLCByZXN1bHQsIEJVTEtfVVBEQVRFX0tFWVMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0RXh0ZW5zaW9uKGZpbmFsIEV4dGVuc2lvbnNEYXRhIHNvdXJjZSwgZmluYWwgSlNPTk9iamVjdCB0YXJnZXQpIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5nZXRFeHRlbnNpb25zKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBleHQgOiBzb3VyY2UuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0gICAgICAgICAgICBhZGRFeHRlbnNpb25Ub1RhcmdldChleHQsIHRhcmdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBKU09OT2JqZWN0IGNvbnZlcnRFeHRlbnNpb25MaXN0KGZpbmFsIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbkxpc3QpIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbkxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0KLSAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBleHQgOiBleHRlbnNpb25MaXN0KSB7Ci0gICAgICAgICAgICBhZGRFeHRlbnNpb25Ub1RhcmdldChleHQsIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRXh0ZW5zaW9uVG9UYXJnZXQoZmluYWwgQ21pc0V4dGVuc2lvbkVsZW1lbnQgZXh0LCBmaW5hbCBKU09OT2JqZWN0IHRhcmdldCkgewotICAgICAgICBpZiAoZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGlzTm90RW1wdHkoZXh0LmdldENoaWxkcmVuKCkpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRFeHRlbnNpb25MaXN0KGV4dC5nZXRDaGlsZHJlbigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlID0gZXh0LmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXRhcmdldC5jb250YWluc0tleShleHQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgdGFyZ2V0LnB1dChleHQuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPYmplY3QgZXh0VmFsdWUgPSB0YXJnZXQuZ2V0KGV4dC5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBKU09OQXJyYXkgYXJyYXk7Ci0gICAgICAgICAgICBpZiAoZXh0VmFsdWUgaW5zdGFuY2VvZiBKU09OQXJyYXkpIHsKLSAgICAgICAgICAgICAgICBhcnJheSA9IChKU09OQXJyYXkpIGV4dFZhbHVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcnJheSA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBhcnJheS5hZGQoZXh0VmFsdWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcnJheS5hZGQodmFsdWUpOwotCi0gICAgICAgICAgICB0YXJnZXQucHV0KGV4dC5nZXROYW1lKCksIGFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0RXh0ZW5zaW9uKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gc291cmNlLCBmaW5hbCBFeHRlbnNpb25zRGF0YSB0YXJnZXQsCi0gICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBjbWlzS2V5cykgewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbnMgPSBudWxsOwotCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbGVtZW50IDogc291cmNlLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChjbWlzS2V5cy5jb250YWlucyhlbGVtZW50LmdldEtleSgpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFkZChuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG51bGwsIGVsZW1lbnQuZ2V0S2V5KCksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBlbGVtZW50LmdldFZhbHVlKCkpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFkZEFsbChjb252ZXJ0RXh0ZW5zaW9uKGVsZW1lbnQuZ2V0S2V5KCksIChMaXN0PE9iamVjdD4pIGVsZW1lbnQuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoZWxlbWVudC5nZXRWYWx1ZSgpID09IG51bGwgPyBudWxsIDogZWxlbWVudC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkKG5ldyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwobnVsbCwgZWxlbWVudC5nZXRLZXkoKSwgbnVsbCwgdmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRhcmdldC5zZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gY29udmVydEV4dGVuc2lvbihmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVsZW1lbnQgOiBtYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkKG5ldyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwobnVsbCwgZWxlbWVudC5nZXRLZXkoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVsZW1lbnQuZ2V0VmFsdWUoKSkpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkQWxsKGNvbnZlcnRFeHRlbnNpb24oZWxlbWVudC5nZXRLZXkoKSwgKExpc3Q8T2JqZWN0PikgZWxlbWVudC5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChlbGVtZW50LmdldFZhbHVlKCkgPT0gbnVsbCA/IG51bGwgOiBlbGVtZW50LmdldFZhbHVlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGQobmV3IENtaXNFeHRlbnNpb25FbGVtZW50SW1wbChudWxsLCBlbGVtZW50LmdldEtleSgpLCBudWxsLCB2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnM7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBjb252ZXJ0RXh0ZW5zaW9uKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PigpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0KSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkKG5ldyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwobnVsbCwgbmFtZSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oKE1hcDxTdHJpbmcsIE9iamVjdD4pIGVsZW1lbnQpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGRBbGwoY29udmVydEV4dGVuc2lvbihuYW1lLCAoTGlzdDxPYmplY3Q+KSBlbGVtZW50KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChlbGVtZW50ID09IG51bGwgPyBudWxsIDogZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFkZChuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG51bGwsIG5hbWUsIG51bGwsIHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SlNPTlN0cmluZ1ZhbHVlKGZpbmFsIE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRKU09OVmFsdWUoZmluYWwgT2JqZWN0IHZhbHVlLCBmaW5hbCBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCkgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgaWYgKGRhdGVUaW1lRm9ybWF0ID09IERhdGVUaW1lRm9ybWF0LkVYVEVOREVEKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKChHcmVnb3JpYW5DYWxlbmRhcikgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChHcmVnb3JpYW5DYWxlbmRhcikgdmFsdWUpLmdldFRpbWVJbk1pbGxpcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpTT05FbnVtVmFsdWUoZmluYWwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBtID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJ2YWx1ZSIsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbS5pbnZva2Uob2JqLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBlbnVtIHZhbHVlISIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q01JU1ZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHByb3BlcnR5VHlwZSkgewotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgY2FzZSBJRDoKLSAgICAgICAgY2FzZSBIVE1MOgotICAgICAgICBjYXNlIFVSSToKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBTdHJpbmcgdmFsdWUhIik7Ci0gICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgQm9vbGVhbiB2YWx1ZSEiKTsKLSAgICAgICAgY2FzZSBJTlRFR0VSOgotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBJbnRlZ2VyIHZhbHVlISIpOwotICAgICAgICBjYXNlIERFQ0lNQUw6Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIERlY2ltYWwgdmFsdWUhIik7Ci0gICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgICAgICAgICBjYWwuc2V0VGltZUluTWlsbGlzKCgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBjYWw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gRGF0ZVRpbWVIZWxwZXIucGFyc2VYbWxEYXRlVGltZSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBEYXRlVGltZSB2YWx1ZSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBEYXRlVGltZSB2YWx1ZSEiKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5rb3duIHByb3BlcnR5IHR5cGUhIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBKU09OQXJyYXkgZ2V0SlNPTkFycmF5RnJvbUxpc3QoZmluYWwgTGlzdDw/PiBsaXN0KSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgSlNPTkFycmF5IHJlc3VsdCA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgcmVzdWx0LmFkZEFsbChsaXN0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpTT05Qcm9wZXJ0eURhdGFUeXBlKGZpbmFsIFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSkgewotICAgICAgICBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eUJvb2xlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0eVR5cGUuQk9PTEVBTi52YWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlJZCkgewotICAgICAgICAgICAgcmV0dXJuIFByb3BlcnR5VHlwZS5JRC52YWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gUHJvcGVydHlUeXBlLklOVEVHRVIudmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5RGF0ZVRpbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0eVR5cGUuREFURVRJTUUudmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbCkgewotICAgICAgICAgICAgcmV0dXJuIFByb3BlcnR5VHlwZS5ERUNJTUFMLnZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWwpIHsKLSAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0eVR5cGUuSFRNTC52YWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0eVR5cGUuU1RSSU5HLnZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaSkgewotICAgICAgICAgICAgcmV0dXJuIFByb3BlcnR5VHlwZS5VUkkudmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZk5vdE51bGwoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmosIEpTT05PYmplY3QganNvbikgewotICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgIGpzb24ucHV0KG5hbWUsIG9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0TWFwKGZpbmFsIE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgT2JqZWN0PikgbzsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgYSBKU09OIG9iamVjdCBidXQgZm91bmQgYSAiCi0gICAgICAgICAgICAgICAgKyAobyBpbnN0YW5jZW9mIExpc3QgPyAiSlNPTiBhcnJheSIgOiBvLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSArICI6ICIgKyBvLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IGdldExpc3QoZmluYWwgT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIHJldHVybiAoTGlzdDxPYmplY3Q+KSBvOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBhIEpTT04gYXJyYXkgYnV0IGZvdW5kIGEgIgotICAgICAgICAgICAgICAgICsgKG8gaW5zdGFuY2VvZiBMaXN0ID8gIkpTT04gb2JqZWN0IiA6IG8uZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpICsgIjogIiArIG8udG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiwgZmluYWwgU3RyaW5nIGtleSkgewotICAgICAgICBPYmplY3Qgb2JqID0ganNvbi5nZXQoa2V5KTsKLSAgICAgICAgcmV0dXJuIG9iaiA9PSBudWxsID8gbnVsbCA6IG9iai50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBnZXRCb29sZWFuKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiwgZmluYWwgU3RyaW5nIGtleSkgewotICAgICAgICBPYmplY3Qgb2JqID0ganNvbi5nZXQoa2V5KTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBvYmo7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgZ2V0SW50ZWdlcihmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGpzb24sIGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGpzb24uZ2V0KGtleSk7Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoQmlnSW50ZWdlcikgb2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCaWdEZWNpbWFsIGdldERlY2ltYWwoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uLCBmaW5hbCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBqc29uLmdldChrZXkpOwotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEJpZ0RlY2ltYWwpIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwoKEJpZ0ludGVnZXIpIG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEdyZWdvcmlhbkNhbGVuZGFyIGdldERhdGVUaW1lKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiwgZmluYWwgU3RyaW5nIGtleSkgewotICAgICAgICBPYmplY3Qgb2JqID0ganNvbi5nZXQoa2V5KTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0gICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgICAgIGNhbC5zZXRUaW1lSW5NaWxsaXMoKChOdW1iZXIpIG9iaikubG9uZ1ZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGNhbDsKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBEYXRlVGltZUhlbHBlci5wYXJzZVhtbERhdGVUaW1lKChTdHJpbmcpIG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRW51bTxUPj4gVCBnZXRFbnVtKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4ganNvbiwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKLSAgICAgICAgcmV0dXJuIENtaXNFbnVtSGVscGVyLmZyb21WYWx1ZShnZXRTdHJpbmcoanNvbiwga2V5KSwgY2xhenopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBUIGdldEludEVudW0oZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uLCBmaW5hbCBTdHJpbmcga2V5LAotICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKLSAgICAgICAgcmV0dXJuIENtaXNFbnVtSGVscGVyLmZyb21WYWx1ZShnZXRJbnRlZ2VyKGpzb24sIGtleSksIGNsYXp6KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL01pbWVIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvTWltZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZhNjA5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvTWltZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JpZ2luYWwgY29udHJpYnV0b3JzIGZyb20gZ2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWMtMS43LjEKLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZQotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci0KLS8qKgotICogTUlNRSBoZWxwZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNaW1lSGVscGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElTUE9TSVRJT04gPSAiQ29udGVudC1EaXNwb3NpdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQT1NJVElPTl9BVFRBQ0hNRU5UID0gImF0dGFjaG1lbnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUE9TSVRJT05fSU5MSU5FID0gImlubGluZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQT1NJVElPTl9GSUxFTkFNRSA9ICJmaWxlbmFtZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQT1NJVElPTl9OQU1FID0gIm5hbWUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUE9TSVRJT05fRk9STV9EQVRBX0NPTlRFTlQgPSAiZm9ybS1kYXRhOyAiICsgRElTUE9TSVRJT05fTkFNRSArICI9XCJjb250ZW50XCIiOwotCi0gICAgLy8gUkZDIDIwNDUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9TUEVDSUFMUyA9ICIoKTw+QCw7OlxcXCIvW10/PSIgKyAiXHQgIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRkMyMjMxX1NQRUNJQUxTID0gIionJSIgKyBNSU1FX1NQRUNJQUxTOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFID0gIiBcdFxuXHIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9ESUdJVFMgPSAiMDEyMzQ1Njc4OUFCQ0RFRiIudG9DaGFyQXJyYXkoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBIRVhfREVDT0RFID0gbmV3IGJ5dGVbMHg4MF07Ci0gICAgc3RhdGljIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBIRVhfRElHSVRTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBIRVhfREVDT0RFW0hFWF9ESUdJVFNbaV1dID0gKGJ5dGUpIGk7Ci0gICAgICAgICAgICBIRVhfREVDT0RFW0NoYXJhY3Rlci50b0xvd2VyQ2FzZShIRVhfRElHSVRTW2ldKV0gPSAoYnl0ZSkgaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWltZUhlbHBlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIGEgdmFsdWUgcGVyIFJGQyAyMjMxLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgdXNlZCB0byBwYXNzIG5vbi1BU0NJSSBwYXJhbWV0ZXJzIHRvIE1JTUUgcGFyYW1ldGVyIGxpc3RzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHVzZXMgVVRGLTggYW5kIG5vIGxhbmd1YWdlLgotICAgICAqIDxwPgotICAgICAqIFNlZSA8YSBocmVmPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMjMxIj5SRkMgMjIzMTwvYT4gZm9yCi0gICAgICogZGV0YWlscy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBlbmNvZGUKLSAgICAgKiBAcGFyYW0gYnVmCi0gICAgICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGZpbGwKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhbiBlbmNvZGluZyB3YXMgbmVlZGVkLCBvciB7QGNvZGUgZmFsc2V9IGlmIG5vCi0gICAgICogICAgICAgICBlbmNvZGluZyB3YXMgYWN0dWFsbHkgbmVlZGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGVuY29kZVJGQzIyMzF2YWx1ZShTdHJpbmcgdmFsdWUsIFN0cmluZ0J1aWxkZXIgYnVmKSB7Ci0gICAgICAgIGFzc2VydCB2YWx1ZSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgYnVmICE9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBJT1V0aWxzLlVURjg7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoY2hhcnNldCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIicnIik7IC8vIG5vIGxhbmd1YWdlCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IElPVXRpbHMudG9VVEY4Qnl0ZXModmFsdWUpOwotCi0gICAgICAgIGJvb2xlYW4gZW5jb2RlZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgY2ggPSBieXRlc1tpXSAmIDB4ZmY7Ci0gICAgICAgICAgICBpZiAoY2ggPD0gMzIgfHwgY2ggPj0gMTI3IHx8IFJGQzIyMzFfU1BFQ0lBTFMuaW5kZXhPZihjaCkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCclJyk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChIRVhfRElHSVRTW2NoID4+IDRdKTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKEhFWF9ESUdJVFNbY2ggJiAweGZdKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuY29kZXMgYSBNSU1FIHBhcmFtZXRlciBwZXIgUkZDIDIyMzEuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdXNlcyBVVEYtOCBhbmQgbm8gbGFuZ3VhZ2UuCi0gICAgICogPHA+Ci0gICAgICogU2VlIDxhIGhyZWY9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIyMzEiPlJGQyAyMjMxPC9hPiBmb3IKLSAgICAgKiBkZXRhaWxzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBlbmNvZGUKLSAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGVuY29kZVJGQzIyMzEoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYm9vbGVhbiBlbmNvZGVkID0gZW5jb2RlUkZDMjIzMXZhbHVlKHZhbHVlLCBidWYpOwotICAgICAgICBpZiAoZW5jb2RlZCkgewotICAgICAgICAgICAgcmV0dXJuICI7ICIgKyBrZXkgKyAiKj0iICsgYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIjsgIiArIGtleSArICI9IiArIHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyB0aGUgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIgdmFsdWUgYWNjb3JkaW5nIHRvIFJGQyAyMTgzIGFuZAotICAgICAqIFJGQyAyMjMxLgotICAgICAqIDxwPgotICAgICAqIFNlZSA8YSBocmVmPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMjMxIj5SRkMgMjIzMTwvYT4gZm9yCi0gICAgICogZGV0YWlscy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlzcG9zaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSBkaXNwb3NpdGlvbgotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgaGVhZGVyIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQ29udGVudERpc3Bvc2l0aW9uKFN0cmluZyBkaXNwb3NpdGlvbiwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIGlmIChkaXNwb3NpdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwb3NpdGlvbiA9IERJU1BPU0lUSU9OX0FUVEFDSE1FTlQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpc3Bvc2l0aW9uICsgZW5jb2RlUkZDMjIzMShESVNQT1NJVElPTl9GSUxFTkFNRSwgZmlsZW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlY29kZXMgYSBmaWxlbmFtZSBmcm9tIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB2YWx1ZSBhY2NvcmRpbmcgdG8KLSAgICAgKiBSRkMgMjE4MyBhbmQgUkZDIDIyMzEuCi0gICAgICogPHA+Ci0gICAgICogU2VlIDxhIGhyZWY9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIyMzEiPlJGQyAyMjMxPC9hPiBmb3IKLSAgICAgKiBkZXRhaWxzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgdGhlIGhlYWRlciB2YWx1ZSB0byBkZWNvZGUKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZUNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBkZWNvZGVDb250ZW50RGlzcG9zaXRpb24odmFsdWUsIHBhcmFtcyk7Ci0gICAgICAgIHJldHVybiBwYXJhbXMuZ2V0KERJU1BPU0lUSU9OX0ZJTEVOQU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWNvZGVzIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciB2YWx1ZSBhY2NvcmRpbmcgdG8gUkZDIDIxODMgYW5kCi0gICAgICogUkZDIDIyMzEuCi0gICAgICogPHA+Ci0gICAgICogRG9lcyBub3QgZGVhbCB3aXRoIGNvbnRpbnVhdGlvbiBsaW5lcy4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWUgPGEgaHJlZj0iaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjIzMSI+UkZDIDIyMzE8L2E+IGZvcgotICAgICAqIGRldGFpbHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIHZhbHVlIHRvIGRlY29kZQotICAgICAqIEBwYXJhbSBwYXJhbXMKLSAgICAgKiAgICAgICAgICAgIHRoZSBtYXAgb2YgcGFyYW1ldGVycyB0byBmaWxsCi0gICAgICogQHJldHVybiB0aGUgZGlzcG9zaXRpb24KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVDb250ZW50RGlzcG9zaXRpb24oU3RyaW5nIHZhbHVlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGVhZGVyVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBIZWFkZXJUb2tlbml6ZXIodmFsdWUpOwotICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCB0b2tlbiwgd2hpY2ggbXVzdCBiZSBhbiBBVE9NCi0gICAgICAgICAgICBUb2tlbiB0b2tlbiA9IHRva2VuaXplci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpICE9IFRva2VuLkFUT00pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBkaXNwb3NpdGlvbiA9IHRva2VuLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAvLyB2YWx1ZSBpZ25vcmVkIGluIHRoaXMgbWV0aG9kCi0KLSAgICAgICAgICAgIC8vIHRoZSByZW1haW5kZXIgaXMgdGhlIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyByZW1haW5kZXIgPSB0b2tlbml6ZXIuZ2V0UmVtYWluZGVyKCk7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJzKHJlbWFpbmRlciwgcGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkaXNwb3NpdGlvbjsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGNoYXJzZXQgZnJvbSBhIGNvbnRlbnQgdHlwZSBoZWFkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIHZhbHVlIHRvIGRlY29kZQotICAgICAqIEByZXR1cm4gdGhlIGNoYXJzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gdmFsaWQgYm91bmRhcnkgYXZhaWxhYmxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hhcnNldEZyb21Db250ZW50VHlwZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhlYWRlclRva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgSGVhZGVyVG9rZW5pemVyKHZhbHVlLCAiOyIsIHRydWUpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IHRva2VuLCB3aGljaCBtdXN0IGJlIGFuIEFUT00KLSAgICAgICAgICAgIFRva2VuIHRva2VuID0gdG9rZW5pemVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgIT0gVG9rZW4uQVRPTSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0aGUgcmVtYWluZGVyIGlzIHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgcmVtYWluZGVyID0gdG9rZW5pemVyLmdldFJlbWFpbmRlcigpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXM7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJzKHJlbWFpbmRlciwgcGFyYW1zKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXMuZ2V0KCJjaGFyc2V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIHZhbHVlIHRvIHBhcnNlCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG1hcCB3aXRoIHRoZSAobG93ZXIgY2FzZSkgY2hhbGxlbmdlIG5hbWUgYXMga2V5IGFuZCBhcyB0aGUKLSAgICAgKiAgICAgICAgIHZhbHVlIGEgc3ViLW1hcCB3aXRoIHBhcmFtZXRlcnMgb2YgdGhlIGNoYWxsZW5nZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gZ2V0Q2hhbGxlbmdlc0Zyb21BdXRoZW50aWNhdGVIZWFkZXIoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHRyaW1WYWx1ZSA9IHZhbHVlLnRyaW0oKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBpblF1b3RlcyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGluTmFtZSA9IHRydWU7Ci0gICAgICAgIFN0cmluZyBjaGFsbGVuZ2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gIiI7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyaW1WYWx1ZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSB0cmltVmFsdWUuY2hhckF0KGkpOwotCi0gICAgICAgICAgICBpZiAoYyA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpblF1b3RlcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRyaW1WYWx1ZS5sZW5ndGgoKSA+IGkgJiYgdHJpbVZhbHVlLmNoYXJBdChpICsgMSkgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyaW1WYWx1ZS5sZW5ndGgoKSA+IGkgJiYgdHJpbVZhbHVlLmNoYXJBdChpICsgMSkgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnIicpOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgewotICAgICAgICAgICAgICAgIGlmIChpbk5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpblF1b3RlcykgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhNYXAgPSByZXN1bHQuZ2V0KGNoYWxsZW5nZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdXRoTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGF1dGhNYXAucHV0KHBhcmFtTmFtZSwgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5OYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IHNiLnRvU3RyaW5nKCkudHJpbSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBzcGNJZHggPSBwYXJhbU5hbWUuaW5kZXhPZignICcpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3BjSWR4ID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZSA9IHBhcmFtTmFtZS5zdWJzdHJpbmcoMCwgc3BjSWR4KS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KGNoYWxsZW5nZSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gcGFyYW1OYW1lLnN1YnN0cmluZyhzcGNJZHgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5OYW1lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5RdW90ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcsJykgewotICAgICAgICAgICAgICAgIGlmIChpbk5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbGxlbmdlID0gc2IudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KGNoYWxsZW5nZSwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluUXVvdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhNYXAgPSByZXN1bHQuZ2V0KGNoYWxsZW5nZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0aE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF1dGhNYXAuY29udGFpbnNLZXkocGFyYW1OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhNYXAucHV0KHBhcmFtTmFtZSwgc2IudG9TdHJpbmcoKS50cmltKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpblF1b3RlcykgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluTmFtZSkgewotICAgICAgICAgICAgY2hhbGxlbmdlID0gc2IudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgcmVzdWx0LnB1dChjaGFsbGVuZ2UsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aE1hcCA9IHJlc3VsdC5nZXQoY2hhbGxlbmdlKTsKLSAgICAgICAgICAgIGlmIChhdXRoTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYXV0aE1hcC5jb250YWluc0tleShwYXJhbU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYXV0aE1hcC5wdXQocGFyYW1OYW1lLCBzYi50b1N0cmluZygpLnRyaW0oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGJvdW5kYXJ5IGZyb20gYSA8Y29kZT5tdWx0aXBhcnQvZm9ybWRhdGE8L2NvZGU+IGNvbnRlbnQgdHlwZQotICAgICAqIGhlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBoZWFkZXIgdmFsdWUgdG8gZGVjb2RlCi0gICAgICogQHJldHVybiB0aGUgYm91bmRhcnkgYXMgYSBieXRlIGFycmF5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHZhbGlkCi0gICAgICogICAgICAgICBib3VuZGFyeSBhdmFpbGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRCb3VuZGFyeUZyb21NdWx0aVBhcnQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIZWFkZXJUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IEhlYWRlclRva2VuaXplcih2YWx1ZSwgIjsiLCB0cnVlKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCB0b2tlbiwgd2hpY2ggbXVzdCBiZSBhbiBBVE9NCi0gICAgICAgICAgICBUb2tlbiB0b2tlbiA9IHRva2VuaXplci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpICE9IFRva2VuLkFUT00pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudCB0eXBlCi0gICAgICAgICAgICBTdHJpbmcgbXVsdGlwYXJ0Q29udGVudFR5cGUgPSB0b2tlbi5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKG11bHRpcGFydENvbnRlbnRUeXBlID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgIShtdWx0aXBhcnRDb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikgfHwgbXVsdGlwYXJ0Q29udGVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZSgibXVsdGlwYXJ0L3JlbGF0ZWQiKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGhlIHJlbWFpbmRlciBpcyB0aGUgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIHJlbWFpbmRlciA9IHRva2VuaXplci5nZXRSZW1haW5kZXIoKTsKLSAgICAgICAgICAgIGlmIChyZW1haW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZ2V0UGFyYW1ldGVycyhyZW1haW5kZXIsIHBhcmFtcyk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYm91bmRhcnlTdHIgPSBwYXJhbXMuZ2V0KCJib3VuZGFyeSIpOwotICAgICAgICAgICAgICAgIGlmIChib3VuZGFyeVN0ciAhPSBudWxsICYmIGJvdW5kYXJ5U3RyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJ5U3RyLmdldEJ5dGVzKElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNvZGluZyAnSVNPLTg4NTktMSciLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZyb20gZ2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWMtMS43LjEuIFRva2VuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUb2tlbiB7Ci0gICAgICAgIC8vIENvbnN0YW50IHZhbHVlcyBmcm9tIEoyU0UgMS40IEFQSSBEb2NzIChDb25zdGFudCB2YWx1ZXMpCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUT00gPSAtMTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UID0gLTM7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTQ7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVPVEVEU1RSSU5HID0gLTI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLQotICAgICAgICBwdWJsaWMgVG9rZW4oaW50IHR5cGUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVHdlYWtlZCBmcm9tIGdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjLTEuNy4xLiBIZWFkZXJUb2tlbml6ZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEhlYWRlclRva2VuaXplciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVG9rZW4gRU9GID0gbmV3IFRva2VuKFRva2VuLkVPRiwgbnVsbCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaGVhZGVyOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlbGltaXRlcnM7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNraXBDb21tZW50czsKLQotICAgICAgICBwcml2YXRlIGludCBwb3M7Ci0KLSAgICAgICAgcHVibGljIEhlYWRlclRva2VuaXplcihTdHJpbmcgaGVhZGVyKSB7Ci0gICAgICAgICAgICB0aGlzKGhlYWRlciwgTUlNRV9TUEVDSUFMUywgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgSGVhZGVyVG9rZW5pemVyKFN0cmluZyBoZWFkZXIsIFN0cmluZyBkZWxpbWl0ZXJzLCBib29sZWFuIHNraXBDb21tZW50cykgewotICAgICAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7Ci0gICAgICAgICAgICB0aGlzLmRlbGltaXRlcnMgPSBkZWxpbWl0ZXJzOwotICAgICAgICAgICAgdGhpcy5za2lwQ29tbWVudHMgPSBza2lwQ29tbWVudHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlbWFpbmRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXIuc3Vic3RyaW5nKHBvcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVG9rZW4gbmV4dCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZFRva2VuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBBVE9NIHRva2VuIGZyb20gdGhlIHBhcnNlZCBoZWFkZXIuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIEEgdG9rZW4gY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIGF0b20gdG9rZW4uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFRva2VuIHJlYWRBdG9taWNUb2tlbigpIHsKLSAgICAgICAgICAgIC8vIHNraXAgdG8gbmV4dCBkZWxpbWl0ZXIKLSAgICAgICAgICAgIGludCBzdGFydCA9IHBvczsKLSAgICAgICAgICAgIHdoaWxlICgrK3BvcyA8IGhlYWRlci5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIC8vIGJyZWFrIG9uIHRoZSBmaXJzdCBub24tYXRvbSBjaGFyYWN0ZXIuCi0gICAgICAgICAgICAgICAgY2hhciBjaCA9IGhlYWRlci5jaGFyQXQocG9zKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsaW1pdGVycy5pbmRleE9mKGhlYWRlci5jaGFyQXQocG9zKSkgIT0gLTEgfHwgY2ggPCAzMiB8fCBjaCA+PSAxMjcpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihUb2tlbi5BVE9NLCBoZWFkZXIuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIHRoZSBuZXh0IHRva2VuIGZyb20gdGhlIGhlYWRlci4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgaGVhZGVyLiBXaGl0ZSBzcGFjZSBpcyBza2lwcGVkLCBhbmQKLSAgICAgICAgICogICAgICAgICBjb21tZW50IHRva2VucyBhcmUgYWxzbyBza2lwcGVkIGlmIGluZGljYXRlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgVG9rZW4gcmVhZFRva2VuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChwb3MgPj0gaGVhZGVyLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gaGVhZGVyLmNoYXJBdChwb3MpOwotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnQgdG9rZW4uLi5yZWFkIGFuZCBza2lwIG92ZXIgdGhpcwotICAgICAgICAgICAgICAgIGlmIChjID09ICcoJykgewotICAgICAgICAgICAgICAgICAgICBUb2tlbiBjb21tZW50ID0gcmVhZENvbW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBDb21tZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gcXVvdGVkIGxpdGVyYWwKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1wiJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFF1b3RlZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZSBzcGFjZSwgZWF0IHRoaXMgYW5kIGZpbmQgYSByZWFsIHRva2VuLgotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoV0hJVEUuaW5kZXhPZihjKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBlYXRXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIGEgQ1RMIG9yIHNwZWNpYWwuIFRoZXNlIGNoYXJhY3RlcnMgaGF2ZSBhCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlbGYtZGVmaW5pbmcgdG9rZW4gdHlwZS4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPCAzMiB8fCBjID49IDEyNyB8fCBkZWxpbWl0ZXJzLmluZGV4T2YoYykgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oKGludCkgYywgU3RyaW5nLnZhbHVlT2YoYykpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIGFuIGF0b20sIHBhcnNlIGl0IG9mZi4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRBdG9taWNUb2tlbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFeHRyYWN0IGEgc3Vic3RyaW5nIGZyb20gdGhlIGhlYWRlciBzdHJpbmcgYW5kIGFwcGx5IGFueQotICAgICAgICAgKiBlc2NhcGluZy9mb2xkaW5nIHJ1bGVzIHRvIHRoZSBzdHJpbmcuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gc3RhcnQKLSAgICAgICAgICogICAgICAgICAgICBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBoZWFkZXIuCi0gICAgICAgICAqIEBwYXJhbSBlbmQKLSAgICAgICAgICogICAgICAgICAgICBUaGUgaGVhZGVyIGVuZCBvZmZzZXQgKyAxLgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBwcm9jZXNzZWQgc3RyaW5nIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gaGVhZGVyLmNoYXJBdChpKTsKLSAgICAgICAgICAgICAgICAvLyBpcyB0aGlzIGFuIGVzY2FwZSBjaGFyYWN0ZXI/Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW52YWxpZCBlc2NhcGUgY2hhcmFjdGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKGhlYWRlci5jaGFyQXQoaSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIGJyZWFrcyBhcmUgaWdub3JlZCwgZXhjZXB0IGZvciBuYWtlZCAnXG4nCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBjb25zaWRlciBwYXJ0cyBvZiBsaW5lYXIKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hpdGVzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHRoaXMgaXMgYSBDUkxGIHNlcXVlbmNlLCBhbmQgc2tpcCB0aGUgc2Vjb25kIGlmIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlzLgotICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGVuZCAtIDEgJiYgaGVhZGVyLmNoYXJBdChpICsgMSkgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhcHBlbmQgdGhlIGNoIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBjb21tZW50IGZyb20gdGhlIGhlYWRlciwgYXBwbHlpbmcgbmVzdGluZyBhbmQgZXNjYXBlIHJ1bGVzIHRvCi0gICAgICAgICAqIHRoZSBjb250ZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBBIGNvbW1lbnQgdG9rZW4gd2l0aCB0aGUgdG9rZW4gdmFsdWUuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFRva2VuIHJlYWRDb21tZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IHBvcyArIDE7Ci0gICAgICAgICAgICBpbnQgbmVzdGluZyA9IDE7Ci0gICAgICAgICAgICBib29sZWFuIHJlcXVpcmVzRXNjYXBpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIHNraXAgdG8gZW5kIG9mIGNvbW1lbnQvc3RyaW5nCi0gICAgICAgICAgICB3aGlsZSAoKytwb3MgPCBoZWFkZXIubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gaGVhZGVyLmNoYXJBdChwb3MpOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnKScpIHsKLSAgICAgICAgICAgICAgICAgICAgbmVzdGluZy0tOwotICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGluZyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lc3RpbmcrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzRXNjYXBpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHByb2Nlc3MgbGluZSBicmVha3MgYWxzbwotICAgICAgICAgICAgICAgICAgICByZXF1aXJlc0VzY2FwaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmVzdGluZyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbmJhbGFuY2VkIGNvbW1lbnRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgICAgICBpZiAocmVxdWlyZXNFc2NhcGluZykgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0RXNjYXBlZFZhbHVlKHN0YXJ0LCBwb3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIHBvcysrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4oVG9rZW4uQ09NTUVOVCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBhcnNlIG91dCBhIHF1b3RlZCBzdHJpbmcgZnJvbSB0aGUgaGVhZGVyLCBhcHBseWluZyBlc2NhcGluZyBydWxlcyB0bwotICAgICAgICAgKiB0aGUgdmFsdWUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIFRoZSBRVU9URURTVFJJTkcgdG9rZW4gd2l0aCB0aGUgdmFsdWUuCi0gICAgICAgICAqIEBleGNlcHRpb24gUGFyc2VFeGNlcHRpb24KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgVG9rZW4gcmVhZFF1b3RlZFN0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSBwb3MgKyAxOwotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlc0VzY2FwaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAvLyBza2lwIHRvIGVuZCBvZiBjb21tZW50L3N0cmluZwotICAgICAgICAgICAgd2hpbGUgKCsrcG9zIDwgaGVhZGVyLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjaCA9IGhlYWRlci5jaGFyQXQocG9zKTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVzRXNjYXBpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0RXNjYXBlZFZhbHVlKHN0YXJ0LCBwb3MrKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIHBvcysrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKFRva2VuLlFVT1RFRFNUUklORywgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICAgICBwb3MrKzsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNFc2NhcGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcHJvY2VzcyBsaW5lIGJyZWFrcyBhbHNvCi0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzRXNjYXBpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiTWlzc2luZyAnXCInIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2tpcCB3aGl0ZSBzcGFjZSBpbiB0aGUgdG9rZW4gc3RyaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGVhdFdoaXRlU3BhY2UoKSB7Ci0gICAgICAgICAgICAvLyBza2lwIHRvIGVuZCBvZiB3aGl0ZXNwYWNlCi0gICAgICAgICAgICB3aGlsZSAoKytwb3MgPCBoZWFkZXIubGVuZ3RoKCkgJiYgV0hJVEUuaW5kZXhPZihoZWFkZXIuY2hhckF0KHBvcykpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCByZWFkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFR3ZWFrZWQgZnJvbSBnZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYy0xLjcuMS4gUGFyYW1ldGVyTGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKFN0cmluZyBsaXN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgSGVhZGVyVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBIZWFkZXJUb2tlbml6ZXIobGlzdCk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBUb2tlbiB0b2tlbiA9IHRva2VuaXplci5uZXh0KCk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHRva2VuLmdldFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBUb2tlbi5FT0Y6Ci0gICAgICAgICAgICAgICAgLy8gdGhlIEVPRiB0b2tlbiB0ZXJtaW5hdGVzIHBhcnNpbmcuCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtczsKLQotICAgICAgICAgICAgY2FzZSAnOyc6Ci0gICAgICAgICAgICAgICAgLy8gZWFjaCBuZXcgcGFyYW1ldGVyIGlzIHNlcGFyYXRlZCBieSBhIHNlbWljb2xvbiwgaW5jbHVkaW5nCi0gICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0LCB3aGljaCBzZXBhcmF0ZXMKLSAgICAgICAgICAgICAgICAvLyB0aGUgcGFyYW1ldGVycyBmcm9tIHRoZSBtYWluIHBhcnQgb2YgdGhlIGhlYWRlci4KLSAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCB0b2tlbiBuZWVkcyB0byBiZSBhIHBhcmFtZXRlciBuYW1lCi0gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIGFsbG93IGEgdHJhaWxpbmcgc2VtaWNvbG9uIG9uIHRoZSBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgPT0gVG9rZW4uRU9GKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRva2VuLmdldFR5cGUoKSAhPSBUb2tlbi5BVE9NKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXIgbmFtZTogIiArIHRva2VuLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcGFyYW1ldGVyIG5hbWUgYXMgYSBsb3dlciBjYXNlIHZlcnNpb24gZm9yIGJldHRlcgotICAgICAgICAgICAgICAgIC8vIG1hcHBpbmcuCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0b2tlbi5nZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQotICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgYXJlIG5hbWU9dmFsdWUsIHNvIHdlIG11c3QgaGF2ZSB0aGUgIj0iIGhlcmUuCi0gICAgICAgICAgICAgICAgaWYgKHRva2VuLmdldFR5cGUoKSAhPSAnPScpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJNaXNzaW5nICc9JyIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIG5vdyB0aGUgdmFsdWUsIHdoaWNoIG1heSBiZSBhbiBhdG9tIG9yIGEgbGl0ZXJhbAotICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgIT0gVG9rZW4uQVRPTSAmJiB0b2tlbi5nZXRUeXBlKCkgIT0gVG9rZW4uUVVPVEVEU1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXIgdmFsdWU6ICIgKyB0b2tlbi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0b2tlbi5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgLy8gd2UgbWlnaHQgaGF2ZSB0byBkbyBzb21lIGFkZGl0aW9uYWwgZGVjb2RpbmcuIEEgbmFtZSB0aGF0Ci0gICAgICAgICAgICAgICAgLy8gZW5kcyB3aXRoICIqIiBpcyBtYXJrZWQgYXMgYmVpbmcgZW5jb2RlZCwgc28gaWYgcmVxdWVzdGVkLCB3ZQotICAgICAgICAgICAgICAgIC8vIGRlY29kZSB0aGUgdmFsdWUuCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIioiKSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlY29kZVJGQzIyMzF2YWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcmFtcy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk1pc3NpbmcgJzsnIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBkZWNvZGVSRkMyMjMxdmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGludCBxMSA9IHZhbHVlLmluZGV4T2YoJ1wnJyk7Ci0gICAgICAgIGlmIChxMSA9PSAtMSkgewotICAgICAgICAgICAgLy8gbWlzc2luZyBjaGFyc2V0Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1pbWVDaGFyc2V0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHExKTsKLSAgICAgICAgaW50IHEyID0gdmFsdWUuaW5kZXhPZignXCcnLCBxMSArIDEpOwotICAgICAgICBpZiAocTIgPT0gLTEpIHsKLSAgICAgICAgICAgIC8vIG1pc3NpbmcgbGFuZ3VhZ2UKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBieXRlW10gYnl0ZXMgPSBmcm9tSGV4KHZhbHVlLnN1YnN0cmluZyhxMiArIDEpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBnZXRKYXZhQ2hhcnNldChtaW1lQ2hhcnNldCkpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGluY29ycmVjdCBlbmNvZGluZwotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gZnJvbUhleChTdHJpbmcgZGF0YSkgewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShkYXRhLmxlbmd0aCgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCgpOykgewotICAgICAgICAgICAgY2hhciBjID0gZGF0YS5jaGFyQXQoaSsrKTsKLSAgICAgICAgICAgIGlmIChjID09ICclJykgewotICAgICAgICAgICAgICAgIGlmIChpID4gZGF0YS5sZW5ndGgoKSAtIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHVudGVybWluYXRlZCBzZXF1ZW5jZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlIGIxID0gSEVYX0RFQ09ERVtkYXRhLmNoYXJBdChpKyspICYgMHg3Zl07Ci0gICAgICAgICAgICAgICAgYnl0ZSBiMiA9IEhFWF9ERUNPREVbZGF0YS5jaGFyQXQoaSsrKSAmIDB4N2ZdOwotICAgICAgICAgICAgICAgIG91dC53cml0ZSgoYjEgPDwgNCkgfCBiMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSgoYnl0ZSkgYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEphdmFDaGFyc2V0KFN0cmluZyBtaW1lQ2hhcnNldCkgewotICAgICAgICAvLyBnb29kIGVub3VnaCBmb3Igc3RhbmRhcmQgdmFsdWVzCi0gICAgICAgIHJldHVybiBtaW1lQ2hhcnNldDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvTWltZVR5cGVzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL01pbWVUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGUxYTFjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvTWltZVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLk1pbWV0eXBlc0ZpbGVUeXBlTWFwOwotCi1AU3VwcHJlc3NXYXJuaW5ncygiUE1ELkF2b2lkRHVwbGljYXRlTGl0ZXJhbHMiKQotcHVibGljIGZpbmFsIGNsYXNzIE1pbWVUeXBlcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NURVRfU1RSRUFNID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWltZXR5cGVzRmlsZVR5cGVNYXAgVFlQRV9NQVAgPSBuZXcgTWltZXR5cGVzRmlsZVR5cGVNYXAoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IE1JTUUyRVhUID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIE1pbWVUeXBlcygpIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBNSU1FIHR5cGUgdG8gZXh0ZW5zaW9uCi0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwgIiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL2Vudm95IiwgImV2eSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL2VwdWIremlwIiwgImVwdWIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi9mcmFjdGFscyIsICJmaWYiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2giLCAic3BsIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vaHRhIiwgImh0YSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZSIsICJqYXIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi9qYXZhLXNlcmlhbGl6ZWQtb2JqZWN0IiwgInNlciIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL2phdmEtdm0iLCAiY2xhc3MiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwgImpzIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vanNvbiIsICJqc29uIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIiwgImhxeCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL21zd29yZCIsICJkb2MiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi9vZGEiLCAib2RhIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vb2xlc2NyaXB0IiwgImF4cyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL29uZW5vdGUiLCAib25ldG9jIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vcGRmIiwgInBkZiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3BpY3MtcnVsZXMiLCAicHJmIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vcGtjczEwIiwgInAxMCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3BraXgtY2VydCIsICJjZXIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi9wa2l4LWNybCIsICJjcmwiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0IiwgInBzIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vcnRmIiwgInJ0ZiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSIsICJhcGsiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQuYXBwbGUua2V5bm90ZSIsICJrZXkiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQuYXBwbGUubnVtYmVycyIsICJudW1iZXJzIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLmFwcGxlLnBhZ2VzIiwgInBhZ2VzIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLmZyYW1lbWFrZXIiLCAiZm0iKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwiLCAieGxzIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm1zLXBraWNlcnRzdG9yZSIsICJzc3QiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQubXMtcGtpc2VjY2F0IiwgImNhdCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2lzdGwiLCAic3RsIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCAicHB0Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm1zLXByb2plY3QiLCAibXBwIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzIiwgIndwcyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQiLCAib2RjIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZSIsICJvdGMiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlIiwgIm9kYiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYSIsICJvZGYiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGUiLCAib2RmdCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3MiLCAib2RnIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5ncmFwaGljcy10ZW1wbGF0ZSIsICJvdGciKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmltYWdlIiwgIm9kaSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGUiLCAib3RpIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24iLCAib2RwIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5wcmVzZW50YXRpb24tdGVtcGxhdGUiLCAib3RwIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCIsICJvZHMiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlIiwgIm90cyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dCIsICJvZHQiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyIiwgIm9kbSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC10ZW1wbGF0ZSIsICJvdHQiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtd2ViIiwgIm90aCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24iLCAicHB0eCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3ciLCAicHBzeCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZSIsICJwb3R4Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQiLCAieGxzeCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlIiwgInhsdHgiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi93aW5obHAiLCAiaGxwIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1jZGYiLCAiY2RmIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1jb21wcmVzcyIsICJ6Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1jb21wcmVzc2VkIiwgInRneiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtY3BpbyIsICJjcGlvIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1jc2giLCAiY3NoIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1kaXJlY3RvciIsICJkeHIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LWR2aSIsICJkdmkiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LWd0YXIiLCAiZ3RhciIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtZ3ppcCIsICJneiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtaGRmIiwgImhkZiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtaW50ZXJuZXQtc2lnbnVwIiwgImlzcCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtaXBob25lIiwgImlpaSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtaXdvcmsta2V5bm90ZS1zZmZrZXkiLCAia2V5Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1pd29yay1udW1iZXJzLXNmZm51bWJlciIsICJudW1iZXJzIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1pd29yay1wYWdlcy1zZmZwYWdlcyIsICJwYWdlcyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsICJqcyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtbGF0ZXgiLCAibGF0ZXgiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LW1zYWNjZXNzIiwgIm1kYiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtbXNjYXJkZmlsZSIsICJjcmQiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LW1zY2xpcCIsICJjbHAiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LW1zZG93bmxvYWQiLCAiZGxsIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1tc21lZGlhdmlldyIsICJtdmIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LW1zbWV0YWZpbGUiLCAid21mIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1tc3B1Ymxpc2hlciIsICJwdWIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LW1zc2NoZWR1bGUiLCAic2NkIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1tc3Rlcm1pbmFsIiwgInRybSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtbXN3cml0ZSIsICJ3cmkiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXBlcmZtb24iLCAicG13Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1wa2NzMTIiLCAicGZ4Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1wa2NzMTJ2IiwgInAxMiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtcGtjczctY2VydGlmaWNhdGVzIiwgInA3YiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtcGtjczctY2VydHJlcXJlc3AiLCAicDdyIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC1wa2NzNy1taW1lIiwgInA3bSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtcGtjczctc2lnbmF0dXJlIiwgInA3cyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtc2giLCAic2giKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXNoYXIiLCAic2hhciIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiwgInN3ZiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtc3R1ZmZpdCIsICJzaXQiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXRhciIsICJ0YXIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXRjbCIsICJ0Y2wiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXRleCIsICJ0ZXgiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXRleGluZm8iLCAidGV4aW5mbyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuIiwgIm1hbiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtdHJvZmYtbWUiLCAibWUiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXRyb2ZmLW1zIiwgIm1zIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24veC10cm9mZiIsICJ0ciIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gtdXN0YXIiLCAidXN0YXIiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIiwgInNyYyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0IiwgImNlciIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3luZC5tcy1wa2lwa28iLCAidnBrbyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImFwcGxpY2F0aW9uL3ppcCIsICJ6aXAiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby9iYXNpYyIsICJzbmQiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby9mbGFjIiwgImZsYWMiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby9tcDQiLCAibTRhIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXVkaW8vbWlkIiwgIm1pZCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImF1ZGlvL21pZGkiLCAibWlkIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXVkaW8vbXBlZyIsICJtcDMiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby9vZ2ciLCAib2dnIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXVkaW8vd2VibSIsICJ3ZWJtIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXVkaW8veC1haWZmIiwgImFpZiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImF1ZGlvL3gtbTRhIiwgIm00YSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImF1ZGlvL3gtbXBlZ3VybCIsICJtM3UiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby94LW1zLXdheCIsICJ3YXgiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby94LW1zLXdtYSIsICJ3bWEiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby94LXBuLXJlYWxhdWRpbyIsICJyYW0iKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhdWRpby94LXdhdiIsICJ3YXYiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZSIsICJkb2N0Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiLCAiZG9jeCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL2JtcCIsICJibXAiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJpbWFnZS9jaXMtY29kIiwgImNvZCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL2dpZiIsICJnaWYiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJpbWFnZS9pZWYiLCAiaWVmIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiaW1hZ2UvanBlZyIsICJqcGVnIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiaW1hZ2UvcGlwZWciLCAiamZpZiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL3BuZyIsICJwbmciKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJpbWFnZS9zdmcreG1sIiwgInN2ZyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL3RpZmYiLCAidGlmZiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL3dlYnAiLCAid2VicCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL3gtY211LXJhc3RlciIsICJyYXMiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJpbWFnZS94LWNteCIsICJjbXgiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJpbWFnZS94LWljb24iLCAiaWNvIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAiLCAicG5tIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAiLCAicGJtIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwIiwgInBnbSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL3gtcG9ydGFibGUtcGl4bWFwIiwgInBwbSIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL3gtcmdiIiwgInJnYiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoImltYWdlL3gteGJpdG1hcCIsICJ4Ym0iKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJpbWFnZS94LXhwaXhtYXAiLCAieHBtIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgiaW1hZ2UveC14d2luZG93ZHVtcCIsICJ4d2QiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJtZXNzYWdlL3JmYzgyMiIsICJtaHRtbCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoInRleHQvY3NzIiwgImNzcyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoInRleHQvaHRtbCIsICJodG1sIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgidGV4dC9pdWxzIiwgInVscyIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoInRleHQvcGxhaW4iLCAidHh0Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgidGV4dC9yaWNodGV4dCIsICJydHgiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ0ZXh0L3NjcmlwdGxldCIsICJzY3QiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIiwgInRzdiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoInRleHQvd2Vidmlld2h0bWwiLCAiaHR0Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgidGV4dC94LWNvbXBvbmVudCIsICJodGMiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ0ZXh0L3gtc2V0ZXh0IiwgImV0eCIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoInRleHQveC12Y2FyZCIsICJ2Y2YiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ0ZXh0L3htbCIsICJ4bWwiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby9tcDQiLCAibXA0Iik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgidmlkZW8vbXBlZyIsICJtcGVnIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgidmlkZW8vbXBlZ3YiLCAibXBlIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgidmlkZW8vb2dnIiwgIm9ndiIpOwotICAgICAgICBNSU1FMkVYVC5wdXQoInZpZGVvL3F1aWNrdGltZSIsICJtb3YiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby9xdWlja3RpbWUiLCAicXQiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby93ZWJtIiwgIndlYm0iKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby94LWY0diIsICJmNHYiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby94LWZsaSIsICJmbGkiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby94LWZsdiIsICJmbHYiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby94LWxhLWFzZiIsICJsc2YiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby94LW00diIsICJtNHYiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby94LW1zLWFzZiIsICJhc2YiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ2aWRlby94LW1zdmlkZW8iLCAiYXZpIik7Ci0gICAgICAgIE1JTUUyRVhULnB1dCgidmlkZW8veC1zZ2ktbW92aWUiLCAibW92aWUiKTsKLSAgICAgICAgTUlNRTJFWFQucHV0KCJ4LXdvcmxkL3gtdnJtbCIsICJ2cm1sIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIGZvciBmaWxlIGV4dGVuc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNSU1FVHlwZShTdHJpbmcgZXh0KSB7Ci0gICAgICAgIGlmIChleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE9DVEVUX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB4ID0gZXh0Lmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmICh4ID4gLTEpIHsKLSAgICAgICAgICAgIGV4dCA9IGV4dC5zdWJzdHJpbmcoeCArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFRZUEVfTUFQLmdldENvbnRlbnRUeXBlKCJ4LiIgKyBleHQudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNSU1FIHR5cGUgZm9yIGEgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNSU1FVHlwZShGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE9DVEVUX1NUUkVBTTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBUWVBFX01BUC5nZXRDb250ZW50VHlwZShmaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHdWVzc2VzIGEgZXh0ZW5zaW9uIGZyb20gYSBNSU1FIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHggPSBtaW1lVHlwZS5pbmRleE9mKCc7Jyk7Ci0gICAgICAgIGlmICh4ID4gLTEpIHsKLSAgICAgICAgICAgIG1pbWVUeXBlID0gbWltZVR5cGUuc3Vic3RyaW5nKDAsIHgpOwotICAgICAgICB9Ci0gICAgICAgIG1pbWVUeXBlID0gbWltZVR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQotICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gTUlNRTJFWFQuZ2V0KG1pbWVUeXBlKTsKLSAgICAgICAgcmV0dXJuICgoZXh0ZW5zaW9uID09IG51bGwgfHwgZXh0ZW5zaW9uLmxlbmd0aCgpID09IDApID8gIiIgOiAiLiIgKyBleHRlbnNpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvUmV0dXJuVmVyc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9SZXR1cm5WZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYmNlZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9SZXR1cm5WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOwotCi0vKioKLSAqIFJldHVybiBWZXJzaW9uIEVudW0uCi0gKi8KLXB1YmxpYyBlbnVtIFJldHVyblZlcnNpb24gewotCi0gICAgVEhJUygidGhpcyIpLCBMQVRFU1QoImxhdGVzdCIpLCBMQVNURVNUTUFKT1IoImxhdGVzdG1ham9yIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0KLSAgICBSZXR1cm5WZXJzaW9uKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXR1cm5WZXJzaW9uIGZyb21WYWx1ZShTdHJpbmcgdikgewotICAgICAgICBmb3IgKFJldHVyblZlcnNpb24gYyA6IFJldHVyblZlcnNpb24udmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1N0cmluZ0xpc3RCdWlsZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1N0cmluZ0xpc3RCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OWEzYTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9TdHJpbmdMaXN0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotcHVibGljIGNsYXNzIFN0cmluZ0xpc3RCdWlsZGVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlcGVyYXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3Q7Ci0KLSAgICBwdWJsaWMgU3RyaW5nTGlzdEJ1aWxkZXIoKSB7Ci0gICAgICAgIHRoaXMoIiwiLCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nTGlzdEJ1aWxkZXIoU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyKSB7Ci0gICAgICAgIHRoaXMoIiwiLCBzdHJpbmdCdWlsZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nTGlzdEJ1aWxkZXIoU3RyaW5nIHNlcGVyYXRvcikgewotICAgICAgICB0aGlzKHNlcGVyYXRvciwgbmV3IFN0cmluZ0J1aWxkZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ0xpc3RCdWlsZGVyKFN0cmluZyBzZXBlcmF0b3IsIFN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlcikgewotICAgICAgICB0aGlzLnNlcGVyYXRvciA9IHNlcGVyYXRvcjsKLSAgICAgICAgdGhpcy5zdHJpbmdCdWlsZGVyID0gc3RyaW5nQnVpbGRlcjsKLSAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgcykgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChzZXBlcmF0b3IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGdldFN0cmluZ0J1aWxkZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdCdWlsZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1R5cGVDYWNoZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9UeXBlQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwM2RmNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1R5cGVDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogVGVtcG9yYXJ5IHR5cGUgY2FjaGUgdXNlZCBmb3Igb25lIGNhbGwuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZUNhY2hlIHsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgZGVmaW5pdGlvbiBieSB0eXBlIElELgotICAgICAqLwotICAgIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyB0eXBlSWQpOwotCi0gICAgLyoqCi0gICAgICogUmVsb2FkcyB0aGUgdHlwZSBkZWZpbml0aW9uIGJ5IHR5cGUgSUQuCi0gICAgICovCi0gICAgVHlwZURlZmluaXRpb24gcmVsb2FkVHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBkZWZpbml0aW9uIG9mIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbkZvck9iamVjdChTdHJpbmcgb2JqZWN0SWQpOwotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gYWxsIGNhY2hlZCB0eXBlcy4KLSAgICAgKi8KLSAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gZ2V0UHJvcGVydHlEZWZpbml0aW9uKFN0cmluZyBwcm9wSWQpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9VcmxCdWlsZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1VybEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyMTc5ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1VybEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBoZWxwcyBidWlsZGluZyBVUkxzLgotICovCi1wdWJsaWMgY2xhc3MgVXJsQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgdXJsUGFydDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgcXVlcnlQYXJ0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVybAotICAgICAqICAgICAgICAgICAgaW5pdGlhbCBVUkwKLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsQnVpbGRlcihTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVVJMIG11c3QgYmUgc2V0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB1cmxQYXJ0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcXVlcnlQYXJ0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBpbnQgcW0gPSB1cmwuaW5kZXhPZignPycpOwotICAgICAgICBpZiAocW0gPT0gLTEpIHsKLSAgICAgICAgICAgIHVybFBhcnQuYXBwZW5kKHVybCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1cmxQYXJ0LmFwcGVuZCh1cmwuc3Vic3RyaW5nKDAsIHFtKSk7Ci0gICAgICAgICAgICBpZiAocW0gPCB1cmwubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBxdWVyeVBhcnQuYXBwZW5kKHVybC5zdWJzdHJpbmcocW0gKyAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2NoZW1lCi0gICAgICogICAgICAgICAgICBzY2hlbWUKLSAgICAgKiBAcGFyYW0gaG9zdAotICAgICAqICAgICAgICAgICAgaG9zdAotICAgICAqIEBwYXJhbSBwb3J0Ci0gICAgICogICAgICAgICAgICBwb3J0Ci0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiAgICAgICAgICAgIHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsQnVpbGRlcihTdHJpbmcgc2NoZW1lLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyBwYXRoKSB7Ci0KLSAgICAgICAgaWYgKCJodHRwIi5lcXVhbHNJZ25vcmVDYXNlKHNjaGVtZSkgJiYgKHBvcnQgPT0gODApKSB7Ci0gICAgICAgICAgICBwb3J0ID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJodHRwcyIuZXF1YWxzSWdub3JlQ2FzZShzY2hlbWUpICYmIChwb3J0ID09IDQ0MykpIHsKLSAgICAgICAgICAgIHBvcnQgPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHVybFBhcnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBxdWVyeVBhcnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHVybFBhcnQuYXBwZW5kKHNjaGVtZSk7Ci0gICAgICAgIHVybFBhcnQuYXBwZW5kKCI6Ly8iKTsKLSAgICAgICAgdXJsUGFydC5hcHBlbmQoaG9zdCk7Ci0gICAgICAgIGlmIChwb3J0ID4gMCkgewotICAgICAgICAgICAgdXJsUGFydC5hcHBlbmQoJzonKS5hcHBlbmQocG9ydCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWYgKHVybFBhcnQuY2hhckF0KHVybFBhcnQubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICB1cmxQYXJ0LmFwcGVuZCgnLycpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhdGguY2hhckF0KDApID09ICcvJykgewotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXJsUGFydC5hcHBlbmQocXVvdGVVUklQYXRoQ29tcG9uZW50KHBhdGgsIHRydWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcHkgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFVybEJ1aWxkZXIoVXJsQnVpbGRlciB1cmxCdWlsZGVyKSB7Ci0gICAgICAgIGlmICh1cmxCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVybEJ1aWxkZXIgbXVzdCBiZSBzZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVybFBhcnQgPSBuZXcgU3RyaW5nQnVpbGRlcih1cmxCdWlsZGVyLnVybFBhcnQpOwotICAgICAgICBxdWVyeVBhcnQgPSBuZXcgU3RyaW5nQnVpbGRlcih1cmxCdWlsZGVyLnF1ZXJ5UGFydCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBhcmFtZXRlciB0byB0aGUgVVJMLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFVybEJ1aWxkZXIgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKChuYW1lID09IG51bGwpIHx8ICh2YWx1ZSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdmFsdWVTdHIgPSBub3JtYWxpemVQYXJhbWV0ZXIodmFsdWUpOwotCi0gICAgICAgIGlmIChxdWVyeVBhcnQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBxdWVyeVBhcnQuYXBwZW5kKCcmJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcXVlcnlQYXJ0LmFwcGVuZChuYW1lKTsKLSAgICAgICAgcXVlcnlQYXJ0LmFwcGVuZCgnPScpOwotICAgICAgICBxdWVyeVBhcnQuYXBwZW5kKElPVXRpbHMuZW5jb2RlVVJMKHZhbHVlU3RyKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBhcmFtZXRlciB3aXRob3V0IHZhbHVlIHRvIHRoZSBVUkwuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFVybEJ1aWxkZXIgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHF1ZXJ5UGFydC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHF1ZXJ5UGFydC5hcHBlbmQoJyYnKTsKLSAgICAgICAgfQotICAgICAgICBxdWVyeVBhcnQuYXBwZW5kKG5hbWUpOwotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBwYXRoIHNlZ21lbnQgdG8gdGhlIFVSTC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aFNlZ21lbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHNlZ21lbnQuCi0gICAgICovCi0gICAgcHVibGljIFVybEJ1aWxkZXIgYWRkUGF0aFNlZ21lbnQoU3RyaW5nIHBhdGhTZWdtZW50KSB7Ci0gICAgICAgIHJldHVybiBhZGRQYXRoUGFydChwYXRoU2VnbWVudCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBhdGggdG8gdGhlIFVSTC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsQnVpbGRlciBhZGRQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBhZGRQYXRoUGFydChwYXRoLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFVybEJ1aWxkZXIgYWRkUGF0aFBhcnQoU3RyaW5nIHBhcnQsIGJvb2xlYW4gcXVvdGVTbGFzaCkgewotICAgICAgICBpZiAocGFydCA9PSBudWxsIHx8IHBhcnQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVybFBhcnQuY2hhckF0KHVybFBhcnQubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKLSAgICAgICAgICAgIHVybFBhcnQuYXBwZW5kKCcvJyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcnQuY2hhckF0KDApID09ICcvJykgewotICAgICAgICAgICAgcGFydCA9IHBhcnQuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHVybFBhcnQuYXBwZW5kKHF1b3RlVVJJUGF0aENvbXBvbmVudChwYXJ0LCBxdW90ZVNsYXNoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFJGQzcyMzJfUkVTRVJWRUQgPSAiOz86QCY9KyQsW10iLnRvQ2hhckFycmF5KCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZVVSSVBhdGhDb21wb25lbnQoU3RyaW5nIHMsIGJvb2xlYW4gcXVvdGVTbGFzaCkgewotICAgICAgICBpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgICAvLyByZXVzZSB0aGUgVVJJIGNsYXNzIHdoaWNoIGtub3dzIGEgbG90IGFib3V0IGVzY2FwaW5nCi0gICAgICAgIFVSSSB1cmk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmYWtlIHNjaGVtZSBzbyB0aGF0IGEgY29sb24gaXMgbm90IG1pc3Rha2VuIGFzIGEgc2NoZW1lCi0gICAgICAgICAgICB1cmkgPSBuZXcgVVJJKCJ4IiwgcywgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGNoYXJhY3RlcnMgaW46ICIgKyBzLCBlKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgciA9IHVyaS50b0FTQ0lJU3RyaW5nKCkuc3Vic3RyaW5nKDIpOyAvLyByZW1vdmUgeDoKLSAgICAgICAgLy8gcXVvdGUgc29tZSBhZGRpdGlvbmFsIHJlc2VydmVkIGNoYXJhY3RlcnMgdG8gYmUgc2FmZQotICAgICAgICBmb3IgKGNoYXIgYyA6IFJGQzcyMzJfUkVTRVJWRUQpIHsKLSAgICAgICAgICAgIGlmIChyLmluZGV4T2YoYykgPj0gMCkgewotICAgICAgICAgICAgICAgIHIgPSByLnJlcGxhY2UoU3RyaW5nLnZhbHVlT2YoYyksICIlIiArIEludGVnZXIudG9IZXhTdHJpbmcoYykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChxdW90ZVNsYXNoICYmIHIuaW5kZXhPZignLycpID49IDApIHsKLSAgICAgICAgICAgIHIgPSByLnJlcGxhY2UoIi8iLCAiJTJGIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gb2JqZWN0IHRvIGEgU3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplUGFyYW1ldGVyKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbmNsdWRlUmVsYXRpb25zaGlwcykgewotICAgICAgICAgICAgcmV0dXJuICgoSW5jbHVkZVJlbGF0aW9uc2hpcHMpIHZhbHVlKS52YWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChWZXJzaW9uaW5nU3RhdGUpIHZhbHVlKS52YWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVW5maWxlT2JqZWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChVbmZpbGVPYmplY3QpIHZhbHVlKS52YWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwRGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZWxhdGlvbnNoaXBEaXJlY3Rpb24pIHZhbHVlKS52YWx1ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmV0dXJuVmVyc2lvbikgewotICAgICAgICAgICAgcmV0dXJuICgoUmV0dXJuVmVyc2lvbikgdmFsdWUpLnZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBY2xQcm9wYWdhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICgoQWNsUHJvcGFnYXRpb24pIHZhbHVlKS52YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHVybFBhcnQudG9TdHJpbmcoKSArIChxdWVyeVBhcnQubGVuZ3RoKCkgPT0gMCA/ICIiIDogIj8iICsgcXVlcnlQYXJ0LnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvV1NDb252ZXJ0ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvV1NDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4ZjM4My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1dTQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTm90RW1wdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2xDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DbWlzRXh0ZW5zaW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ3JlYXRhYmxlUHJvcGVydHlUeXBlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5QZXJtaXNzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUG9saWN5SWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUJvb2xlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRlVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEZWNpbWFsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUh0bWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5VXJpOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkNob2ljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Gb2xkZXJUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkl0ZW1UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUG9saWN5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEYXRlVGltZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SWREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5VXJpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZU11dGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5QWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNoYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Sm9pbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlPcmRlckJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVJlbmRpdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGF0ZVRpbWVSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGVjaW1hbFByZWNpc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlN1cHBvcnRlZFBlcm1pc3Npb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFsbG93YWJsZUFjdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNoYW5nZUV2ZW50SW5mb0RhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DaG9pY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DbWlzRXh0ZW5zaW9uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkV4dGVuc2lvbkRhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5FeHRlbnNpb25GZWF0dXJlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRmFpbGVkVG9EZWxldGVEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRm9sZGVyVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5JdGVtVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0RGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyQ29udGFpbmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0TGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdFBhcmVudERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5QYXJ0aWFsQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBvbGljeUlkTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBvbGljeVR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUJvb2xlYW5JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEZWNpbWFsSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SHRtbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SWREZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5VXJpSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZW5kaXRpb25EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVEZWZpbml0aW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVNdXRhYmlsaXR5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQUNMQ2FwYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0FDTFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQWNjZXNzQ29udHJvbFByaW5jaXBhbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0FsbG93YWJsZUFjdGlvbnNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNCdWxrVXBkYXRlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQ2hhbmdlRXZlbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNDaG9pY2VCb29sZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNDaG9pY2VEYXRlVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQ2hvaWNlRGVjaW1hbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQ2hvaWNlSHRtbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQ2hvaWNlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0Nob2ljZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0Nob2ljZVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQ2hvaWNlVXJpOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNDb250ZW50U3RyZWFtVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQ3JlYXRhYmxlUHJvcGVydHlUeXBlc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4dGVuc2lvbkZlYXR1cmVLZXlWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4dGVuc2lvbkZlYXR1cmVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeHRlbnNpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNMaXN0T2ZJZHNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RJbkZvbGRlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc09iamVjdExpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RQYXJlbnRzVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUGVybWlzc2lvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1Blcm1pc3Npb25NYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNQcm9wZXJ0aWVzVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1Byb3BlcnR5Qm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1Byb3BlcnR5RGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlEZWNpbWFsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlIdG1sOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNQcm9wZXJ0eUh0bWxEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlJZERlZmluaXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNQcm9wZXJ0eUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1Byb3BlcnR5SW50ZWdlckRlZmluaXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNQcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydHlVcmk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1Byb3BlcnR5VXJpRGVmaW5pdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1JlbmRpdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1JlcG9zaXRvcnlDYXBhYmlsaXRpZXNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNSZXBvc2l0b3J5SW5mb1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVEZWZpbml0aW9uTGlzdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVGb2xkZXJEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzVHlwZUl0ZW1EZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzVHlwZU11dGFiaWxpdHlDYXBhYmlsaXRpZXNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNUeXBlUG9saWN5RGVmaW5pdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVSZWxhdGlvbnNoaXBEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzVHlwZVNlY29uZGFyeURlZmluaXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkRlbGV0ZVRyZWVSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQUNMUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUFsbG93YWJsZUFjdGlvbnNLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUJhc2VPYmplY3RUeXBlSWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1DYXBhYmlsaXR5QUNMOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1DYXBhYmlsaXR5Q2hhbmdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1DYXBhYmlsaXR5Sm9pbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQ2FwYWJpbGl0eU9yZGVyQnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQ2FwYWJpbGl0eVJlbmRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1EYXRlVGltZVJlc29sdXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bVByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtU3VwcG9ydGVkUGVybWlzc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bVR5cGVPZkNoYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bVVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQ29udGFpbnMgY29udmVydGVyIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0NvbnZlcnRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT05fTlMgPSAiaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnL29wZW5jbWlzL2V4dGVuc2lvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNjQgKiAxMDI0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFdTQ29udmVydGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQklHX0lOVF8zMiA9IEJpZ0ludGVnZXIudmFsdWVPZigzMik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCSUdfSU5UXzY0ID0gQmlnSW50ZWdlci52YWx1ZU9mKDY0KTsKLQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IHN0cmVhbURhdGFIYW5kbGVyQ2xhc3MxOwotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBzdHJlYW1EYXRhSGFuZGxlclJlYWRNZXRob2QxOwotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBzdHJlYW1EYXRhSGFuZGxlckNsb3NlTWV0aG9kMTsKLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBzdHJlYW1EYXRhSGFuZGxlckNsYXNzMjsKLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2Qgc3RyZWFtRGF0YUhhbmRsZXJSZWFkTWV0aG9kMjsKLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2Qgc3RyZWFtRGF0YUhhbmRsZXJDbG9zZU1ldGhvZDI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyZWFtRGF0YUhhbmRsZXJDbGFzczEgPSBDbGFzcy5mb3JOYW1lKCJvcmcuanZuZXQuc3RheGV4LlN0cmVhbWluZ0RhdGFIYW5kbGVyIik7Ci0gICAgICAgICAgICBzdHJlYW1EYXRhSGFuZGxlclJlYWRNZXRob2QxID0gc3RyZWFtRGF0YUhhbmRsZXJDbGFzczEuZ2V0TWV0aG9kKCJyZWFkT25jZSIsIG5ldyBDbGFzczw/PlswXSk7Ci0gICAgICAgICAgICBzdHJlYW1EYXRhSGFuZGxlckNsb3NlTWV0aG9kMSA9IHN0cmVhbURhdGFIYW5kbGVyQ2xhc3MxLmdldE1ldGhvZCgiY2xvc2UiLCBuZXcgQ2xhc3M8Pz5bMF0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc3RyZWFtRGF0YUhhbmRsZXJDbGFzczEgPSBudWxsOwotICAgICAgICAgICAgc3RyZWFtRGF0YUhhbmRsZXJSZWFkTWV0aG9kMSA9IG51bGw7Ci0gICAgICAgICAgICBzdHJlYW1EYXRhSGFuZGxlckNsb3NlTWV0aG9kMSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyZWFtRGF0YUhhbmRsZXJDbGFzczIgPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnhtbC5pbnRlcm5hbC5vcmcuanZuZXQuc3RheGV4LlN0cmVhbWluZ0RhdGFIYW5kbGVyIik7Ci0gICAgICAgICAgICBzdHJlYW1EYXRhSGFuZGxlclJlYWRNZXRob2QyID0gc3RyZWFtRGF0YUhhbmRsZXJDbGFzczIuZ2V0TWV0aG9kKCJyZWFkT25jZSIsIG5ldyBDbGFzczw/PlswXSk7Ci0gICAgICAgICAgICBzdHJlYW1EYXRhSGFuZGxlckNsb3NlTWV0aG9kMiA9IHN0cmVhbURhdGFIYW5kbGVyQ2xhc3MxLmdldE1ldGhvZCgiY2xvc2UiLCBuZXcgQ2xhc3M8Pz5bMF0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgc3RyZWFtRGF0YUhhbmRsZXJDbGFzczIgPSBudWxsOwotICAgICAgICAgICAgc3RyZWFtRGF0YUhhbmRsZXJSZWFkTWV0aG9kMiA9IG51bGw7Ci0gICAgICAgICAgICBzdHJlYW1EYXRhSGFuZGxlckNsb3NlTWV0aG9kMiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHByaXZhdGUgV1NDb252ZXJ0ZXIoKSB7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBSZXBvc2l0b3J5IEluZm8gLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSByZXBvc2l0b3J5IGluZm8gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeUluZm8gY29udmVydChDbWlzUmVwb3NpdG9yeUluZm9UeXBlIHJlcG9zaXRvcnlJbmZvKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvSW1wbCByZXN1bHQgPSBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldEFjbENhcGFiaWxpdGllcyhjb252ZXJ0KHJlcG9zaXRvcnlJbmZvLmdldEFjbENhcGFiaWxpdHkoKSkpOwotICAgICAgICByZXN1bHQuc2V0Q2hhbmdlc0luY29tcGxldGUocmVwb3NpdG9yeUluZm8uaXNDaGFuZ2VzSW5jb21wbGV0ZSgpKTsKLSAgICAgICAgTGlzdDxCYXNlVHlwZUlkPiBiYXNlT2JqZWN0VHlwZUlkcyA9IG5ldyBBcnJheUxpc3Q8QmFzZVR5cGVJZD4oKTsKLSAgICAgICAgZm9yIChFbnVtQmFzZU9iamVjdFR5cGVJZHMgYm90IDogcmVwb3NpdG9yeUluZm8uZ2V0Q2hhbmdlc09uVHlwZSgpKSB7Ci0gICAgICAgICAgICBiYXNlT2JqZWN0VHlwZUlkcy5hZGQoY29udmVydChCYXNlVHlwZUlkLmNsYXNzLCBib3QpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0Q2hhbmdlc09uVHlwZShiYXNlT2JqZWN0VHlwZUlkcyk7Ci0gICAgICAgIHJlc3VsdC5zZXRDbWlzVmVyc2lvblN1cHBvcnRlZChyZXBvc2l0b3J5SW5mby5nZXRDbWlzVmVyc2lvblN1cHBvcnRlZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldExhdGVzdENoYW5nZUxvZ1Rva2VuKHJlcG9zaXRvcnlJbmZvLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCkpOwotICAgICAgICByZXN1bHQuc2V0UHJpbmNpcGFsQW5vbnltb3VzKHJlcG9zaXRvcnlJbmZvLmdldFByaW5jaXBhbEFub255bW91cygpKTsKLSAgICAgICAgcmVzdWx0LnNldFByaW5jaXBhbEFueW9uZShyZXBvc2l0b3J5SW5mby5nZXRQcmluY2lwYWxBbnlvbmUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRQcm9kdWN0TmFtZShyZXBvc2l0b3J5SW5mby5nZXRQcm9kdWN0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFByb2R1Y3RWZXJzaW9uKHJlcG9zaXRvcnlJbmZvLmdldFByb2R1Y3RWZXJzaW9uKCkpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0aWVzKGNvbnZlcnQocmVwb3NpdG9yeUluZm8uZ2V0Q2FwYWJpbGl0aWVzKCkpKTsKLSAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKHJlcG9zaXRvcnlJbmZvLmdldFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpKTsKLSAgICAgICAgcmVzdWx0LnNldElkKHJlcG9zaXRvcnlJbmZvLmdldFJlcG9zaXRvcnlJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldE5hbWUocmVwb3NpdG9yeUluZm8uZ2V0UmVwb3NpdG9yeU5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRSb290Rm9sZGVyKHJlcG9zaXRvcnlJbmZvLmdldFJvb3RGb2xkZXJJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldFRoaW5DbGllbnRVcmkocmVwb3NpdG9yeUluZm8uZ2V0VGhpbkNsaWVudFVSSSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFZlbmRvck5hbWUocmVwb3NpdG9yeUluZm8uZ2V0VmVuZG9yTmFtZSgpKTsKLSAgICAgICAgaWYgKGlzTm90RW1wdHkocmVwb3NpdG9yeUluZm8uZ2V0RXh0ZW5kZWRGZWF0dXJlcygpKSkgewotICAgICAgICAgICAgTGlzdDxFeHRlbnNpb25GZWF0dXJlPiBleHRlbnNpb25GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RXh0ZW5zaW9uRmVhdHVyZT4oKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRFeHRlbnNpb25GZWF0dXJlKGV4dGVuc2lvbkZlYXR1cmVzKTsKLQotICAgICAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRmVhdHVyZVR5cGUgZmVhdHVyZSA6IHJlcG9zaXRvcnlJbmZvLmdldEV4dGVuZGVkRmVhdHVyZXMoKSkgewotICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZlYXR1cmVJbXBsIHRhcmdldCA9IG5ldyBFeHRlbnNpb25GZWF0dXJlSW1wbCgpOwotCi0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldElkKGZlYXR1cmUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldFVybChmZWF0dXJlLmdldFVybCgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q29tbW9uTmFtZShmZWF0dXJlLmdldENvbW1vbk5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldFZlcnNpb25MYWJlbChmZWF0dXJlLmdldFZlcnNpb25MYWJlbCgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVzY3JpcHRpb24oZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KGZlYXR1cmUuZ2V0RmVhdHVyZURhdGEoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlRGF0YSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoQ21pc0V4dGVuc2lvbkZlYXR1cmVLZXlWYWx1ZVBhaXIga2V5VmFsdWUgOiBmZWF0dXJlLmdldEZlYXR1cmVEYXRhKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVEYXRhLnB1dChrZXlWYWx1ZS5nZXRLZXkoKSwga2V5VmFsdWUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RmVhdHVyZURhdGEoZmVhdHVyZURhdGEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oZmVhdHVyZSwgdGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZlYXR1cmVzLmFkZCh0YXJnZXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihyZXBvc2l0b3J5SW5mbywgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcmVwb3NpdG9yeSBjYXBhYmlsaXR5IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgY29udmVydChDbWlzUmVwb3NpdG9yeUNhcGFiaWxpdGllc1R5cGUgY2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgIGlmIChjYXBhYmlsaXRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCByZXN1bHQgPSBuZXcgUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGwoKTsKLQotICAgICAgICByZXN1bHQuc2V0QWxsVmVyc2lvbnNTZWFyY2hhYmxlKGNhcGFiaWxpdGllcy5pc0NhcGFiaWxpdHlBbGxWZXJzaW9uc1NlYXJjaGFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5QWNsKGNvbnZlcnQoQ2FwYWJpbGl0eUFjbC5jbGFzcywgY2FwYWJpbGl0aWVzLmdldENhcGFiaWxpdHlBQ0woKSkpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eUNoYW5nZXMoY29udmVydChDYXBhYmlsaXR5Q2hhbmdlcy5jbGFzcywgY2FwYWJpbGl0aWVzLmdldENhcGFiaWxpdHlDaGFuZ2VzKCkpKTsKLSAgICAgICAgcmVzdWx0LnNldENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyhjb252ZXJ0KENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcy5jbGFzcywKLSAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZ2V0Q2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGFiaWxpdHkoKSkpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eUpvaW4oY29udmVydChDYXBhYmlsaXR5Sm9pbi5jbGFzcywgY2FwYWJpbGl0aWVzLmdldENhcGFiaWxpdHlKb2luKCkpKTsKLSAgICAgICAgcmVzdWx0LnNldENhcGFiaWxpdHlRdWVyeShjb252ZXJ0KENhcGFiaWxpdHlRdWVyeS5jbGFzcywgY2FwYWJpbGl0aWVzLmdldENhcGFiaWxpdHlRdWVyeSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5UmVuZGl0aW9uKGNvbnZlcnQoQ2FwYWJpbGl0eVJlbmRpdGlvbnMuY2xhc3MsIGNhcGFiaWxpdGllcy5nZXRDYXBhYmlsaXR5UmVuZGl0aW9ucygpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1B3Y1NlYXJjaGFibGUoY2FwYWJpbGl0aWVzLmlzQ2FwYWJpbGl0eVBXQ1NlYXJjaGFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1B3Y1VwZGF0YWJsZShjYXBhYmlsaXRpZXMuaXNDYXBhYmlsaXR5UFdDVXBkYXRhYmxlKCkpOwotICAgICAgICByZXN1bHQuc2V0U3VwcG9ydHNHZXREZXNjZW5kYW50cyhjYXBhYmlsaXRpZXMuaXNDYXBhYmlsaXR5R2V0RGVzY2VuZGFudHMoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRTdXBwb3J0c0dldEZvbGRlclRyZWUoY2FwYWJpbGl0aWVzLmlzQ2FwYWJpbGl0eUdldEZvbGRlclRyZWUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5T3JkZXJCeShjb252ZXJ0KENhcGFiaWxpdHlPcmRlckJ5LmNsYXNzLCBjYXBhYmlsaXRpZXMuZ2V0Q2FwYWJpbGl0eU9yZGVyQnkoKSkpOwotICAgICAgICByZXN1bHQuc2V0U3VwcG9ydHNNdWx0aWZpbGluZyhjYXBhYmlsaXRpZXMuaXNDYXBhYmlsaXR5TXVsdGlmaWxpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRTdXBwb3J0c1VuZmlsaW5nKGNhcGFiaWxpdGllcy5pc0NhcGFiaWxpdHlVbmZpbGluZygpKTsKLSAgICAgICAgcmVzdWx0LnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKGNhcGFiaWxpdGllcy5pc0NhcGFiaWxpdHlWZXJzaW9uU3BlY2lmaWNGaWxpbmcoKSk7Ci0gICAgICAgIGlmIChjYXBhYmlsaXRpZXMuZ2V0Q2FwYWJpbGl0eUNyZWF0YWJsZVByb3BlcnR5VHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbWlzQ3JlYXRhYmxlUHJvcGVydHlUeXBlc1R5cGUgY3JlYXRhYmxlUHJvcGVydHlUeXBlcyA9IGNhcGFiaWxpdGllcy5nZXRDYXBhYmlsaXR5Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpOwotCi0gICAgICAgICAgICBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbCB0YXJnZXQgPSBuZXcgQ3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGwoKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKHRhcmdldCk7Ci0KLSAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KGNyZWF0YWJsZVByb3BlcnR5VHlwZXMuZ2V0Q2FuQ3JlYXRlKCkpKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFByb3BlcnR5VHlwZT4gcHJvcGVydHlUeXBlU2V0ID0gRW51bVNldC5ub25lT2YoUHJvcGVydHlUeXBlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuQ3JlYXRlKHByb3BlcnR5VHlwZVNldCk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnVtUHJvcGVydHlUeXBlIHByb3BUeXBlIDogY3JlYXRhYmxlUHJvcGVydHlUeXBlcy5nZXRDYW5DcmVhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlID0gY29udmVydChQcm9wZXJ0eVR5cGUuY2xhc3MsIHByb3BUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGVTZXQuYWRkKHByb3BlcnR5VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY3JlYXRhYmxlUHJvcGVydHlUeXBlcywgdGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FwYWJpbGl0aWVzLmdldENhcGFiaWxpdHlOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgQ21pc05ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyA9IGNhcGFiaWxpdGllcwotICAgICAgICAgICAgICAgICAgICAuZ2V0Q2FwYWJpbGl0eU5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwgdGFyZ2V0ID0gbmV3IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyh0YXJnZXQpOwotCi0gICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0SWQobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5pc0lkKCkpOwotICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldExvY2FsTmFtZShuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmlzTG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldExvY2FsTmFtZXNwYWNlKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuaXNMb2NhbE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXREaXNwbGF5TmFtZShuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmlzRGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0UXVlcnlOYW1lKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuaXNRdWVyeU5hbWUoKSk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0RGVzY3JpcHRpb24obmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5pc0Rlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldENyZWF0YWJsZShuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmlzQ3JlYXRhYmxlKCkpOwotICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldEZpbGVhYmxlKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuaXNGaWxlYWJsZSgpKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRRdWVyeWFibGUobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5pc1F1ZXJ5YWJsZSgpKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRGdWxsdGV4dEluZGV4ZWQobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5pc0Z1bGx0ZXh0SW5kZXhlZCgpKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5pc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRDb250cm9sbGFibGVQb2xpY3kobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5pc0NvbnRyb2xsYWJsZVBvbGljeSgpKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRDb250cm9sbGFibGVBY2wobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5pc0NvbnRyb2xsYWJsZUFDTCgpKTsKLQotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLCB0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihjYXBhYmlsaXRpZXMsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIEFDTCBjYXBhYmlsaXR5IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFjbENhcGFiaWxpdGllcyBjb252ZXJ0KENtaXNBQ0xDYXBhYmlsaXR5VHlwZSBhY2xDYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgaWYgKGFjbENhcGFiaWxpdGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFjbENhcGFiaWxpdGllc0RhdGFJbXBsIHJlc3VsdCA9IG5ldyBBY2xDYXBhYmlsaXRpZXNEYXRhSW1wbCgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRTdXBwb3J0ZWRQZXJtaXNzaW9ucyhjb252ZXJ0KFN1cHBvcnRlZFBlcm1pc3Npb25zLmNsYXNzLCBhY2xDYXBhYmlsaXRpZXMuZ2V0U3VwcG9ydGVkUGVybWlzc2lvbnMoKSkpOwotCi0gICAgICAgIHJlc3VsdC5zZXRBY2xQcm9wYWdhdGlvbihjb252ZXJ0KEFjbFByb3BhZ2F0aW9uLmNsYXNzLCBhY2xDYXBhYmlsaXRpZXMuZ2V0UHJvcGFnYXRpb24oKSkpOwotCi0gICAgICAgIExpc3Q8UGVybWlzc2lvbkRlZmluaXRpb24+IHBlcm1pc3Npb25EZWZpbml0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGVybWlzc2lvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgIGZvciAoQ21pc1Blcm1pc3Npb25EZWZpbml0aW9uIHBlcm1EZWYgOiBhY2xDYXBhYmlsaXRpZXMuZ2V0UGVybWlzc2lvbnMoKSkgewotICAgICAgICAgICAgUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbCBwZXJtRGVmRGF0YSA9IG5ldyBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsKCk7Ci0gICAgICAgICAgICBwZXJtRGVmRGF0YS5zZXRJZChwZXJtRGVmLmdldFBlcm1pc3Npb24oKSk7Ci0gICAgICAgICAgICBwZXJtRGVmRGF0YS5zZXREZXNjcmlwdGlvbihwZXJtRGVmLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihwZXJtRGVmLCBwZXJtRGVmRGF0YSk7Ci0KLSAgICAgICAgICAgIHBlcm1pc3Npb25EZWZpbml0aW9uTGlzdC5hZGQocGVybURlZkRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5zZXRQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGEocGVybWlzc2lvbkRlZmluaXRpb25MaXN0KTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4gcGVybWlzc2lvbk1hcHBpbmcgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFBlcm1pc3Npb25NYXBwaW5nPigpOwotICAgICAgICBmb3IgKENtaXNQZXJtaXNzaW9uTWFwcGluZyBwZXJtTWFwcGluZyA6IGFjbENhcGFiaWxpdGllcy5nZXRNYXBwaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChwZXJtTWFwcGluZy5nZXRLZXkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbCBwZXJtTWFwcGluZ0RhdGEgPSBuZXcgUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBwZXJtTWFwcGluZy5nZXRLZXkoKS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIHBlcm1NYXBwaW5nRGF0YS5zZXRLZXkoa2V5KTsKLSAgICAgICAgICAgICAgICBwZXJtTWFwcGluZ0RhdGEuc2V0UGVybWlzc2lvbnMocGVybU1hcHBpbmcuZ2V0UGVybWlzc2lvbigpKTsKLSAgICAgICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHBlcm1NYXBwaW5nLCBwZXJtTWFwcGluZ0RhdGEpOwotICAgICAgICAgICAgICAgIHBlcm1pc3Npb25NYXBwaW5nLnB1dChrZXksIHBlcm1NYXBwaW5nRGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnNldFBlcm1pc3Npb25NYXBwaW5nRGF0YShwZXJtaXNzaW9uTWFwcGluZyk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihhY2xDYXBhYmlsaXRpZXMsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHJlcG9zaXRvcnkgaW5mbyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzUmVwb3NpdG9yeUluZm9UeXBlIGNvbnZlcnQoUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeUluZm8sIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNSZXBvc2l0b3J5SW5mb1R5cGUgcmVzdWx0ID0gbmV3IENtaXNSZXBvc2l0b3J5SW5mb1R5cGUoKTsKLQotICAgICAgICByZXN1bHQuc2V0QWNsQ2FwYWJpbGl0eShjb252ZXJ0KHJlcG9zaXRvcnlJbmZvLmdldEFjbENhcGFiaWxpdGllcygpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXRpZXMoY29udmVydChyZXBvc2l0b3J5SW5mby5nZXRDYXBhYmlsaXRpZXMoKSwgY21pc1ZlcnNpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldENoYW5nZXNJbmNvbXBsZXRlKHJlcG9zaXRvcnlJbmZvLmdldENoYW5nZXNJbmNvbXBsZXRlKCkpOwotICAgICAgICByZXN1bHQuc2V0Q21pc1ZlcnNpb25TdXBwb3J0ZWQocmVwb3NpdG9yeUluZm8uZ2V0Q21pc1ZlcnNpb25TdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbihyZXBvc2l0b3J5SW5mby5nZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbigpKTsKLSAgICAgICAgcmVzdWx0LnNldFByaW5jaXBhbEFub255bW91cyhyZXBvc2l0b3J5SW5mby5nZXRQcmluY2lwYWxJZEFub255bW91cygpKTsKLSAgICAgICAgcmVzdWx0LnNldFByaW5jaXBhbEFueW9uZShyZXBvc2l0b3J5SW5mby5nZXRQcmluY2lwYWxJZEFueW9uZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFByb2R1Y3ROYW1lKHJlcG9zaXRvcnlJbmZvLmdldFByb2R1Y3ROYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0UHJvZHVjdFZlcnNpb24ocmVwb3NpdG9yeUluZm8uZ2V0UHJvZHVjdFZlcnNpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRSZXBvc2l0b3J5RGVzY3JpcHRpb24ocmVwb3NpdG9yeUluZm8uZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUluZm8uZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRSZXBvc2l0b3J5TmFtZShyZXBvc2l0b3J5SW5mby5nZXROYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0Um9vdEZvbGRlcklkKHJlcG9zaXRvcnlJbmZvLmdldFJvb3RGb2xkZXJJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldFRoaW5DbGllbnRVUkkocmVwb3NpdG9yeUluZm8uZ2V0VGhpbkNsaWVudFVyaSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFZlbmRvck5hbWUocmVwb3NpdG9yeUluZm8uZ2V0VmVuZG9yTmFtZSgpKTsKLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJbmZvLmdldENoYW5nZXNPblR5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEJhc2VUeXBlSWQgYmFzZVR5cGUgOiByZXBvc2l0b3J5SW5mby5nZXRDaGFuZ2VzT25UeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzAgJiYgYmFzZVR5cGUgPT0gQmFzZVR5cGVJZC5DTUlTX0lURU0pIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIlJlY2VpdmVyIG9ubHkgdW5kZXJzdGFuZHMgQ01JUyAxLjAgYnV0IHRoZSBDaGFuZ2VzIE9uIFR5cGUgbGlzdCBpbiB0aGUgUmVwb3NpdG9yeSBpbmZvIGNvbnRhaW5zIHRoZSBiYXNlIHR5cGUgSXRlbS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBJdGVtIGJhc2UgdHlwZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0Q2hhbmdlc09uVHlwZSgpLmFkZChjb252ZXJ0KEVudW1CYXNlT2JqZWN0VHlwZUlkcy5jbGFzcywgYmFzZVR5cGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY21pc1ZlcnNpb24gIT0gQ21pc1ZlcnNpb24uQ01JU18xXzAgJiYgcmVwb3NpdG9yeUluZm8uZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEV4dGVuc2lvbkZlYXR1cmU+IGV4dGVuc2lvbkZlYXR1cmVzID0gcmVwb3NpdG9yeUluZm8uZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKTsKLQotICAgICAgICAgICAgZm9yIChFeHRlbnNpb25GZWF0dXJlIGZlYXR1cmUgOiBleHRlbnNpb25GZWF0dXJlcykgewotICAgICAgICAgICAgICAgIENtaXNFeHRlbnNpb25GZWF0dXJlVHlwZSB0YXJnZXQgPSBuZXcgQ21pc0V4dGVuc2lvbkZlYXR1cmVUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQoZmVhdHVyZS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VXJsKGZlYXR1cmUuZ2V0VXJsKCkpOwotICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDb21tb25OYW1lKGZlYXR1cmUuZ2V0Q29tbW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VmVyc2lvbkxhYmVsKGZlYXR1cmUuZ2V0VmVyc2lvbkxhYmVsKCkpOwotICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXNjcmlwdGlvbihmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZURhdGEoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGZlYXR1cmUuZ2V0RmVhdHVyZURhdGEoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbWlzRXh0ZW5zaW9uRmVhdHVyZUtleVZhbHVlUGFpciBrZXlWYWx1ZSA9IG5ldyBDbWlzRXh0ZW5zaW9uRmVhdHVyZUtleVZhbHVlUGFpcigpOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWUuc2V0S2V5KGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlLnNldFZhbHVlKGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldEZlYXR1cmVEYXRhKCkuYWRkKGtleVZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oZmVhdHVyZSwgdGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRFeHRlbmRlZEZlYXR1cmVzKCkuYWRkKHRhcmdldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHJlcG9zaXRvcnlJbmZvLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSByZXBvc2l0b3J5IGNhcGFiaWxpdHkgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc1JlcG9zaXRvcnlDYXBhYmlsaXRpZXNUeXBlIGNvbnZlcnQoUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChjYXBhYmlsaXRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzUmVwb3NpdG9yeUNhcGFiaWxpdGllc1R5cGUgcmVzdWx0ID0gbmV3IENtaXNSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzVHlwZSgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5QUNMKGNvbnZlcnQoRW51bUNhcGFiaWxpdHlBQ0wuY2xhc3MsIGNhcGFiaWxpdGllcy5nZXRBY2xDYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgcmVzdWx0LnNldENhcGFiaWxpdHlBbGxWZXJzaW9uc1NlYXJjaGFibGUoY2FwYWJpbGl0aWVzLmlzQWxsVmVyc2lvbnNTZWFyY2hhYmxlU3VwcG9ydGVkKCkpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eUNoYW5nZXMoY29udmVydChFbnVtQ2FwYWJpbGl0eUNoYW5nZXMuY2xhc3MsIGNhcGFiaWxpdGllcy5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0YWJpbGl0eShjb252ZXJ0KEVudW1DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMuY2xhc3MsCi0gICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5R2V0RGVzY2VuZGFudHMoY2FwYWJpbGl0aWVzLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5R2V0Rm9sZGVyVHJlZShjYXBhYmlsaXRpZXMuaXNHZXRGb2xkZXJUcmVlU3VwcG9ydGVkKCkpOwotICAgICAgICBpZiAoY21pc1ZlcnNpb24gIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5T3JkZXJCeShjb252ZXJ0KEVudW1DYXBhYmlsaXR5T3JkZXJCeS5jbGFzcywgY2FwYWJpbGl0aWVzLmdldE9yZGVyQnlDYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eUpvaW4oY29udmVydChFbnVtQ2FwYWJpbGl0eUpvaW4uY2xhc3MsIGNhcGFiaWxpdGllcy5nZXRKb2luQ2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5TXVsdGlmaWxpbmcoY2FwYWJpbGl0aWVzLmlzTXVsdGlmaWxpbmdTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5UFdDU2VhcmNoYWJsZShjYXBhYmlsaXRpZXMuaXNQd2NTZWFyY2hhYmxlU3VwcG9ydGVkKCkpOwotICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eVBXQ1VwZGF0YWJsZShjYXBhYmlsaXRpZXMuaXNQd2NVcGRhdGFibGVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5UXVlcnkoY29udmVydChFbnVtQ2FwYWJpbGl0eVF1ZXJ5LmNsYXNzLCBjYXBhYmlsaXRpZXMuZ2V0UXVlcnlDYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgcmVzdWx0LnNldENhcGFiaWxpdHlSZW5kaXRpb25zKGNvbnZlcnQoRW51bUNhcGFiaWxpdHlSZW5kaXRpb24uY2xhc3MsIGNhcGFiaWxpdGllcy5nZXRSZW5kaXRpb25zQ2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5VW5maWxpbmcoY2FwYWJpbGl0aWVzLmlzVW5maWxpbmdTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXBhYmlsaXR5VmVyc2lvblNwZWNpZmljRmlsaW5nKGNhcGFiaWxpdGllcy5pc1ZlcnNpb25TcGVjaWZpY0ZpbGluZ1N1cHBvcnRlZCgpKTsKLQotICAgICAgICBpZiAoY21pc1ZlcnNpb24gIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIGlmIChjYXBhYmlsaXRpZXMuZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzIGNyZWF0YWJsZVByb3BlcnR5VHlwZXMgPSBjYXBhYmlsaXRpZXMuZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpOwotCi0gICAgICAgICAgICAgICAgQ21pc0NyZWF0YWJsZVByb3BlcnR5VHlwZXNUeXBlIHRhcmdldCA9IG5ldyBDbWlzQ3JlYXRhYmxlUHJvcGVydHlUeXBlc1R5cGUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0Q2FwYWJpbGl0eUNyZWF0YWJsZVByb3BlcnR5VHlwZXModGFyZ2V0KTsKLQotICAgICAgICAgICAgICAgIGlmIChjcmVhdGFibGVQcm9wZXJ0eVR5cGVzLmNhbkNyZWF0ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eVR5cGUgcHQgOiBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzLmNhbkNyZWF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0Q2FuQ3JlYXRlKCkuYWRkKGNvbnZlcnQoRW51bVByb3BlcnR5VHlwZS5jbGFzcywgcHQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY3JlYXRhYmxlUHJvcGVydHlUeXBlcywgdGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYXBhYmlsaXRpZXMuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgPSBjYXBhYmlsaXRpZXMuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgQ21pc05ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgdGFyZ2V0ID0gbmV3IENtaXNOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldENhcGFiaWxpdHlOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKHRhcmdldCk7Ci0KLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRJZCgpID09IG51bGwgPyB0cnVlIDogbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0TG9jYWxOYW1lKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lKCkgPT0gbnVsbCA/IHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldExvY2FsTmFtZXNwYWNlKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lc3BhY2UoKSA9PSBudWxsID8gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldExvY2FsTmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIHRhcmdldC5zZXREaXNwbGF5TmFtZShuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERpc3BsYXlOYW1lKCkgPT0gbnVsbCA/IHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UXVlcnlOYW1lKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0UXVlcnlOYW1lKCkgPT0gbnVsbCA/IHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlc2NyaXB0aW9uKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RGVzY3JpcHRpb24oKSA9PSBudWxsID8gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDcmVhdGFibGUobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDcmVhdGFibGUoKSA9PSBudWxsID8gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENyZWF0YWJsZSgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RmlsZWFibGUobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRGaWxlYWJsZSgpID09IG51bGwgPyB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RmlsZWFibGUoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldFF1ZXJ5YWJsZShuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldFF1ZXJ5YWJsZSgpID09IG51bGwgPyB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0UXVlcnlhYmxlKCkpOwotICAgICAgICAgICAgICAgIHRhcmdldC5zZXRGdWxsdGV4dEluZGV4ZWQobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRGdWxsdGV4dEluZGV4ZWQoKSA9PSBudWxsID8gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldEZ1bGx0ZXh0SW5kZXhlZCgpKTsKLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkgPT0gbnVsbCA/IHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoKSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldENvbnRyb2xsYWJsZVBvbGljeShuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENvbnRyb2xsYWJsZVBvbGljeSgpID09IG51bGwgPyB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KCkpOwotICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDb250cm9sbGFibGVBQ0wobmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDb250cm9sbGFibGVBY2woKSA9PSBudWxsID8gdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENvbnRyb2xsYWJsZUFjbCgpKTsKLQotICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24obmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcywgdGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY2FwYWJpbGl0aWVzLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBBQ0wgY2FwYWJpbGl0eSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzQUNMQ2FwYWJpbGl0eVR5cGUgY29udmVydChBY2xDYXBhYmlsaXRpZXMgYWNsQ2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgIGlmIChhY2xDYXBhYmlsaXRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzQUNMQ2FwYWJpbGl0eVR5cGUgcmVzdWx0ID0gbmV3IENtaXNBQ0xDYXBhYmlsaXR5VHlwZSgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRTdXBwb3J0ZWRQZXJtaXNzaW9ucyhjb252ZXJ0KEVudW1TdXBwb3J0ZWRQZXJtaXNzaW9ucy5jbGFzcywKLSAgICAgICAgICAgICAgICBhY2xDYXBhYmlsaXRpZXMuZ2V0U3VwcG9ydGVkUGVybWlzc2lvbnMoKSkpOwotCi0gICAgICAgIHJlc3VsdC5zZXRQcm9wYWdhdGlvbihjb252ZXJ0KEVudW1BQ0xQcm9wYWdhdGlvbi5jbGFzcywgYWNsQ2FwYWJpbGl0aWVzLmdldEFjbFByb3BhZ2F0aW9uKCkpKTsKLQotICAgICAgICBpZiAoYWNsQ2FwYWJpbGl0aWVzLmdldFBlcm1pc3Npb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQZXJtaXNzaW9uRGVmaW5pdGlvbiBwZGQgOiBhY2xDYXBhYmlsaXRpZXMuZ2V0UGVybWlzc2lvbnMoKSkgewotICAgICAgICAgICAgICAgIENtaXNQZXJtaXNzaW9uRGVmaW5pdGlvbiBwZXJtRGVmID0gbmV3IENtaXNQZXJtaXNzaW9uRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIHBlcm1EZWYuc2V0RGVzY3JpcHRpb24ocGRkLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIHBlcm1EZWYuc2V0UGVybWlzc2lvbihwZGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihwZGQsIHBlcm1EZWYpOwotCi0gICAgICAgICAgICAgICAgcmVzdWx0LmdldFBlcm1pc3Npb25zKCkuYWRkKHBlcm1EZWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjbENhcGFiaWxpdGllcy5nZXRQZXJtaXNzaW9uTWFwcGluZygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbk1hcHBpbmcgcG1kIDogYWNsQ2FwYWJpbGl0aWVzLmdldFBlcm1pc3Npb25NYXBwaW5nKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBDbWlzUGVybWlzc2lvbk1hcHBpbmcgcGVybU1hcCA9IG5ldyBDbWlzUGVybWlzc2lvbk1hcHBpbmcoKTsKLSAgICAgICAgICAgICAgICBwZXJtTWFwLnNldEtleShFbnVtQWxsb3dhYmxlQWN0aW9uc0tleS5mcm9tVmFsdWUocG1kLmdldEtleSgpKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocG1kLmdldFBlcm1pc3Npb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXNzaW9uIDogcG1kLmdldFBlcm1pc3Npb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1NYXAuZ2V0UGVybWlzc2lvbigpLmFkZChwZXJtaXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocG1kLCBwZXJtTWFwKTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRNYXBwaW5nKCkuYWRkKHBlcm1NYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihhY2xDYXBhYmlsaXRpZXMsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tIFR5cGVzIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgdHlwZSBkZWZpbml0aW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVEZWZpbml0aW9uIGNvbnZlcnQoQ21pc1R5cGVEZWZpbml0aW9uVHlwZSB0eXBlRGVmaW5pdGlvbikgewotICAgICAgICBpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgQ21pc1R5cGVGb2xkZXJEZWZpbml0aW9uVHlwZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEZvbGRlclR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgQ21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwoKTsKLQotICAgICAgICAgICAgKChEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChjb252ZXJ0KENvbnRlbnRTdHJlYW1BbGxvd2VkLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAoKENtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSkgdHlwZURlZmluaXRpb24pLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkpKTsKLSAgICAgICAgICAgICgoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0SXNWZXJzaW9uYWJsZSgoKENtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSkgdHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgIC5pc1ZlcnNpb25hYmxlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgQ21pc1R5cGVSZWxhdGlvbnNoaXBEZWZpbml0aW9uVHlwZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCgpOwotCi0gICAgICAgICAgICAoKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0QWxsb3dlZFNvdXJjZVR5cGVzKCgoQ21pc1R5cGVSZWxhdGlvbnNoaXBEZWZpbml0aW9uVHlwZSkgdHlwZURlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFsbG93ZWRTb3VyY2VUeXBlcygpKTsKLSAgICAgICAgICAgICgoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRBbGxvd2VkVGFyZ2V0VHlwZXMoKChDbWlzVHlwZVJlbGF0aW9uc2hpcERlZmluaXRpb25UeXBlKSB0eXBlRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWxsb3dlZFRhcmdldFR5cGVzKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgQ21pc1R5cGVQb2xpY3lEZWZpbml0aW9uVHlwZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBvbGljeVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgQ21pc1R5cGVJdGVtRGVmaW5pdGlvblR5cGUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtVHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBDbWlzVHlwZVNlY29uZGFyeURlZmluaXRpb25UeXBlKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlR5cGUgJyIgKyB0eXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIicgZG9lcyBub3QgbWF0Y2ggYSBiYXNlIHR5cGUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0QmFzZVR5cGVJZChjb252ZXJ0KEJhc2VUeXBlSWQuY2xhc3MsIHR5cGVEZWZpbml0aW9uLmdldEJhc2VJZCgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREZXNjcmlwdGlvbih0eXBlRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKHR5cGVEZWZpbml0aW9uLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0SWQodHlwZURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0NvbnRyb2xsYWJsZUFjbCh0eXBlRGVmaW5pdGlvbi5pc0NvbnRyb2xsYWJsZUFDTCgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzQ29udHJvbGxhYmxlUG9saWN5KHR5cGVEZWZpbml0aW9uLmlzQ29udHJvbGxhYmxlUG9saWN5KCkpOwotICAgICAgICByZXN1bHQuc2V0SXNDcmVhdGFibGUodHlwZURlZmluaXRpb24uaXNDcmVhdGFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0ZpbGVhYmxlKHR5cGVEZWZpbml0aW9uLmlzRmlsZWFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0Z1bGx0ZXh0SW5kZXhlZCh0eXBlRGVmaW5pdGlvbi5pc0Z1bGx0ZXh0SW5kZXhlZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KHR5cGVEZWZpbml0aW9uLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOwotICAgICAgICByZXN1bHQuc2V0SXNRdWVyeWFibGUodHlwZURlZmluaXRpb24uaXNRdWVyeWFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWUodHlwZURlZmluaXRpb24uZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lc3BhY2UodHlwZURlZmluaXRpb24uZ2V0TG9jYWxOYW1lc3BhY2UoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRQYXJlbnRUeXBlSWQodHlwZURlZmluaXRpb24uZ2V0UGFyZW50SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUodHlwZURlZmluaXRpb24uZ2V0UXVlcnlOYW1lKCkpOwotCi0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbi5nZXRUeXBlTXV0YWJpbGl0eSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIENtaXNUeXBlTXV0YWJpbGl0eUNhcGFiaWxpdGllc1R5cGUgdHlwZU11dGFiaWxpdHkgPSB0eXBlRGVmaW5pdGlvbi5nZXRUeXBlTXV0YWJpbGl0eSgpOwotICAgICAgICAgICAgVHlwZU11dGFiaWxpdHlJbXBsIHRhcmdldCA9IG5ldyBUeXBlTXV0YWJpbGl0eUltcGwoKTsKLQotICAgICAgICAgICAgdGFyZ2V0LnNldENhbkNyZWF0ZSh0eXBlTXV0YWJpbGl0eS5pc0NyZWF0ZSgpKTsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDYW5VcGRhdGUodHlwZU11dGFiaWxpdHkuaXNVcGRhdGUoKSk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0Q2FuRGVsZXRlKHR5cGVNdXRhYmlsaXR5LmlzRGVsZXRlKCkpOwotCi0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHR5cGVNdXRhYmlsaXR5LCB0YXJnZXQpOwotCi0gICAgICAgICAgICByZXN1bHQuc2V0VHlwZU11dGFiaWxpdHkodGFyZ2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUgcHJvcGVydHlEZWZpbml0aW9uIDogdHlwZURlZmluaXRpb24uZ2V0UHJvcGVydHlEZWZpbml0aW9uKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRQcm9wZXJ0eURlZmluaXRpb24oY29udmVydChwcm9wZXJ0eURlZmluaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24odHlwZURlZmluaXRpb24sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHByb3BlcnR5IGRlZmluaXRpb24gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEZWZpbml0aW9uPD8+IGNvbnZlcnQoQ21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUgcHJvcGVydHlEZWZpbml0aW9uKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eURlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uVHlwZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwoKTsKLQotICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VTdHJpbmdMaXN0KCgoQ21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hvaWNlKCkpKTsKLQotICAgICAgICAgICAgQ21pc1Byb3BlcnR5U3RyaW5nIHByb3AgPSAoKENtaXNQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25UeXBlKSBwcm9wZXJ0eURlZmluaXRpb24pLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICgoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3BlY2lmaWMKLSAgICAgICAgICAgICgoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0TWF4TGVuZ3RoKCgoQ21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0TWF4TGVuZ3RoKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIENtaXNQcm9wZXJ0eUlkRGVmaW5pdGlvblR5cGUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwoKTsKLQotICAgICAgICAgICAgKChQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldENob2ljZXMoY29udmVydENob2ljZUlkTGlzdCgoKENtaXNQcm9wZXJ0eUlkRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0Q2hvaWNlKCkpKTsKLQotICAgICAgICAgICAgQ21pc1Byb3BlcnR5SWQgcHJvcCA9ICgoQ21pc1Byb3BlcnR5SWREZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvblR5cGUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCgpOwotCi0gICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VJbnRlZ2VyTGlzdCgoKENtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaG9pY2UoKSkpOwotCi0gICAgICAgICAgICBDbWlzUHJvcGVydHlJbnRlZ2VyIHByb3AgPSAoKENtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzcGVjaWZpYwotICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0TWluVmFsdWUoKChDbWlzUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0TWluVmFsdWUoKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRNYXhWYWx1ZSgoKENtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXRNYXhWYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvblR5cGUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCgpOwotCi0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VEZWNpbWFsTGlzdCgoKENtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaG9pY2UoKSkpOwotCi0gICAgICAgICAgICBDbWlzUHJvcGVydHlEZWNpbWFsIHByb3AgPSAoKENtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzcGVjaWZpYwotICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0TWluVmFsdWUoKChDbWlzUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0TWluVmFsdWUoKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRNYXhWYWx1ZSgoKENtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXRNYXhWYWx1ZSgpKTsKLQotICAgICAgICAgICAgQmlnSW50ZWdlciBwcmVjaXNpb24gPSAoKENtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXRQcmVjaXNpb24oKTsKLSAgICAgICAgICAgIGlmIChwcmVjaXNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChCSUdfSU5UXzMyLmVxdWFscyhwcmVjaXNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0UHJlY2lzaW9uKERlY2ltYWxQcmVjaXNpb24uQklUUzMyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJJR19JTlRfNjQuZXF1YWxzKHByZWNpc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRQcmVjaXNpb24oRGVjaW1hbFByZWNpc2lvbi5CSVRTNjQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvblR5cGUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCgpOwotCi0gICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VCb29sZWFuTGlzdCgoKENtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaG9pY2UoKSkpOwotCi0gICAgICAgICAgICBDbWlzUHJvcGVydHlCb29sZWFuIHByb3AgPSAoKENtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIENtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwoKTsKLQotICAgICAgICAgICAgKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldENob2ljZXMoY29udmVydENob2ljZURhdGVUaW1lTGlzdCgoKENtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hvaWNlKCkpKTsKLQotICAgICAgICAgICAgQ21pc1Byb3BlcnR5RGF0ZVRpbWUgcHJvcCA9ICgoQ21pc1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uVHlwZSkgcHJvcGVydHlEZWZpbml0aW9uKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChwcm9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREZWZhdWx0VmFsdWUoY29udmVydFhNTENhbGVuZGFyKHByb3AuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzcGVjaWZpYwotICAgICAgICAgICAgKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0RGF0ZVRpbWVSZXNvbHV0aW9uKGNvbnZlcnQoRGF0ZVRpbWVSZXNvbHV0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAoKENtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0UmVzb2x1dGlvbigpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgQ21pc1Byb3BlcnR5SHRtbERlZmluaXRpb25UeXBlKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwoKTsKLQotICAgICAgICAgICAgKChQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0Q2hvaWNlcyhjb252ZXJ0Q2hvaWNlSHRtbExpc3QoKChDbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0Q2hvaWNlKCkpKTsKLQotICAgICAgICAgICAgQ21pc1Byb3BlcnR5SHRtbCBwcm9wID0gKChDbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAocHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgKChQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlVcmlEZWZpbml0aW9uVHlwZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwoKTsKLQotICAgICAgICAgICAgKChQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaG9pY2VzKGNvbnZlcnRDaG9pY2VVcmlMaXN0KCgoQ21pc1Byb3BlcnR5VXJpRGVmaW5pdGlvblR5cGUpIHByb3BlcnR5RGVmaW5pdGlvbikuZ2V0Q2hvaWNlKCkpKTsKLQotICAgICAgICAgICAgQ21pc1Byb3BlcnR5VXJpIHByb3AgPSAoKENtaXNQcm9wZXJ0eVVyaURlZmluaXRpb25UeXBlKSBwcm9wZXJ0eURlZmluaXRpb24pLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHByb3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICgoUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldENhcmRpbmFsaXR5KGNvbnZlcnQoQ2FyZGluYWxpdHkuY2xhc3MsIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRDYXJkaW5hbGl0eSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREZXNjcmlwdGlvbihwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREaXNwbGF5TmFtZShwcm9wZXJ0eURlZmluaXRpb24uZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJZChwcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0luaGVyaXRlZChwcm9wZXJ0eURlZmluaXRpb24uaXNJbmhlcml0ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc09wZW5DaG9pY2UocHJvcGVydHlEZWZpbml0aW9uLmlzT3BlbkNob2ljZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzUXVlcnlhYmxlKHByb3BlcnR5RGVmaW5pdGlvbi5pc1F1ZXJ5YWJsZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzT3JkZXJhYmxlKHByb3BlcnR5RGVmaW5pdGlvbi5pc09yZGVyYWJsZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzUmVxdWlyZWQocHJvcGVydHlEZWZpbml0aW9uLmlzUmVxdWlyZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWUocHJvcGVydHlEZWZpbml0aW9uLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZXNwYWNlKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRMb2NhbE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFByb3BlcnR5VHlwZShjb252ZXJ0KFByb3BlcnR5VHlwZS5jbGFzcywgcHJvcGVydHlEZWZpbml0aW9uLmdldFByb3BlcnR5VHlwZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUocHJvcGVydHlEZWZpbml0aW9uLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFVwZGF0YWJpbGl0eShjb252ZXJ0KFVwZGF0YWJpbGl0eS5jbGFzcywgcHJvcGVydHlEZWZpbml0aW9uLmdldFVwZGF0YWJpbGl0eSgpKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihwcm9wZXJ0eURlZmluaXRpb24sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHR5cGUgZGVmaW5pdGlvbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzVHlwZURlZmluaXRpb25UeXBlIGNvbnZlcnQoVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgaWYgKHR5cGVEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc1R5cGVEZWZpbml0aW9uVHlwZSByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUoKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2NUeXBlRGVmaW50aW9uID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVEZWZpbml0aW9uOwotICAgICAgICAgICAgKChDbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUpIHJlc3VsdCkuc2V0VmVyc2lvbmFibGUoY29udmVydEJvb2xlYW4oZG9jVHlwZURlZmludGlvbi5pc1ZlcnNpb25hYmxlKCksCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7Ci0gICAgICAgICAgICAoKENtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSkgcmVzdWx0KS5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChjb252ZXJ0KEVudW1Db250ZW50U3RyZWFtQWxsb3dlZC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgZG9jVHlwZURlZmludGlvbi5nZXRDb250ZW50U3RyZWFtQWxsb3dlZCgpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBGb2xkZXJUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNUeXBlRm9sZGVyRGVmaW5pdGlvblR5cGUoKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc1R5cGVSZWxhdGlvbnNoaXBEZWZpbml0aW9uVHlwZSgpOwotCi0gICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiByZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiA9IChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbikgdHlwZURlZmluaXRpb247Ci0KLSAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbi5nZXRBbGxvd2VkU291cmNlVHlwZUlkcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlIDogcmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24uZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAoKENtaXNUeXBlUmVsYXRpb25zaGlwRGVmaW5pdGlvblR5cGUpIHJlc3VsdCkuZ2V0QWxsb3dlZFNvdXJjZVR5cGVzKCkuYWRkKHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGUgOiByZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbi5nZXRBbGxvd2VkVGFyZ2V0VHlwZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoQ21pc1R5cGVSZWxhdGlvbnNoaXBEZWZpbml0aW9uVHlwZSkgcmVzdWx0KS5nZXRBbGxvd2VkVGFyZ2V0VHlwZXMoKS5hZGQodHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgUG9saWN5VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzVHlwZVBvbGljeURlZmluaXRpb25UeXBlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZURlZmluaXRpb24gaW5zdGFuY2VvZiBJdGVtVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzVHlwZUl0ZW1EZWZpbml0aW9uVHlwZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgU2Vjb25kYXJ5VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzVHlwZVNlY29uZGFyeURlZmluaXRpb25UeXBlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRCYXNlSWQoY29udmVydChFbnVtQmFzZU9iamVjdFR5cGVJZHMuY2xhc3MsIHR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlSWQoKSkpOwotICAgICAgICByZXN1bHQuc2V0Q29udHJvbGxhYmxlQUNMKGNvbnZlcnRCb29sZWFuKHR5cGVEZWZpbml0aW9uLmlzQ29udHJvbGxhYmxlQWNsKCksIGZhbHNlKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDb250cm9sbGFibGVQb2xpY3koY29udmVydEJvb2xlYW4odHlwZURlZmluaXRpb24uaXNDb250cm9sbGFibGVQb2xpY3koKSwgZmFsc2UpKTsKLSAgICAgICAgcmVzdWx0LnNldENyZWF0YWJsZShjb252ZXJ0Qm9vbGVhbih0eXBlRGVmaW5pdGlvbi5pc0NyZWF0YWJsZSgpLCBmYWxzZSkpOwotICAgICAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24odHlwZURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREaXNwbGF5TmFtZSh0eXBlRGVmaW5pdGlvbi5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldEZpbGVhYmxlKGNvbnZlcnRCb29sZWFuKHR5cGVEZWZpbml0aW9uLmlzRmlsZWFibGUoKSwgZmFsc2UpKTsKLSAgICAgICAgcmVzdWx0LnNldEZ1bGx0ZXh0SW5kZXhlZChjb252ZXJ0Qm9vbGVhbih0eXBlRGVmaW5pdGlvbi5pc0Z1bGx0ZXh0SW5kZXhlZCgpLCBmYWxzZSkpOwotICAgICAgICByZXN1bHQuc2V0SWQodHlwZURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoY29udmVydEJvb2xlYW4odHlwZURlZmluaXRpb24uaXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoKSwgZmFsc2UpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZSh0eXBlRGVmaW5pdGlvbi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWVzcGFjZSh0eXBlRGVmaW5pdGlvbi5nZXRMb2NhbE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFBhcmVudElkKHR5cGVEZWZpbml0aW9uLmdldFBhcmVudFR5cGVJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldFF1ZXJ5YWJsZShjb252ZXJ0Qm9vbGVhbih0eXBlRGVmaW5pdGlvbi5pc1F1ZXJ5YWJsZSgpLCBmYWxzZSkpOwotICAgICAgICByZXN1bHQuc2V0UXVlcnlOYW1lKHR5cGVEZWZpbml0aW9uLmdldFF1ZXJ5TmFtZSgpKTsKLQotICAgICAgICBpZiAodHlwZURlZmluaXRpb24uZ2V0VHlwZU11dGFiaWxpdHkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlTXV0YWJpbGl0eSB0eXBlTXV0YWJpbGl0eSA9IHR5cGVEZWZpbml0aW9uLmdldFR5cGVNdXRhYmlsaXR5KCk7Ci0gICAgICAgICAgICBDbWlzVHlwZU11dGFiaWxpdHlDYXBhYmlsaXRpZXNUeXBlIHRhcmdldCA9IG5ldyBDbWlzVHlwZU11dGFiaWxpdHlDYXBhYmlsaXRpZXNUeXBlKCk7Ci0KLSAgICAgICAgICAgIHRhcmdldC5zZXRDcmVhdGUodHlwZU11dGFiaWxpdHkuY2FuQ3JlYXRlKCkgPT0gbnVsbCA/IHRydWUgOiB0eXBlTXV0YWJpbGl0eS5jYW5DcmVhdGUoKSk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0VXBkYXRlKHR5cGVNdXRhYmlsaXR5LmNhblVwZGF0ZSgpID09IG51bGwgPyB0cnVlIDogdHlwZU11dGFiaWxpdHkuY2FuVXBkYXRlKCkpOwotICAgICAgICAgICAgdGFyZ2V0LnNldERlbGV0ZSh0eXBlTXV0YWJpbGl0eS5jYW5EZWxldGUoKSA9PSBudWxsID8gdHJ1ZSA6IHR5cGVNdXRhYmlsaXR5LmNhbkRlbGV0ZSgpKTsKLQotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbih0eXBlTXV0YWJpbGl0eSwgdGFyZ2V0KTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldFR5cGVNdXRhYmlsaXR5KHRhcmdldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZURlZmluaXRpb24uZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiB0eXBlRGVmaW5pdGlvbi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UHJvcGVydHlEZWZpbml0aW9uKCkuYWRkKGNvbnZlcnQocHJvcERlZikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbih0eXBlRGVmaW5pdGlvbiwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcHJvcGVydHkgZGVmaW5pdGlvbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSBjb252ZXJ0KFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25UeXBlKCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiBzb3VyY2UgPSAoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKSBwcm9wZXJ0eURlZmluaXRpb247Ci0gICAgICAgICAgICBDbWlzUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uVHlwZSB0YXJnZXQgPSAoQ21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUpIHJlc3VsdDsKLQotICAgICAgICAgICAgY29udmVydENob2ljZVN0cmluZ0xpc3Qoc291cmNlLmdldENob2ljZXMoKSwgdGFyZ2V0LmdldENob2ljZSgpKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ21pc1Byb3BlcnR5U3RyaW5nIGRlZmF1bHRWYWx1ZSA9IG5ldyBDbWlzUHJvcGVydHlTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuc2V0UHJvcGVydHlEZWZpbml0aW9uSWQocHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogc291cmNlLmdldERlZmF1bHRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5nZXRWYWx1ZSgpLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3BlY2lmaWMKLSAgICAgICAgICAgIHRhcmdldC5zZXRNYXhMZW5ndGgoc291cmNlLmdldE1heExlbmd0aCgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUlkRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0eUlkRGVmaW5pdGlvblR5cGUoKTsKLQotICAgICAgICAgICAgUHJvcGVydHlJZERlZmluaXRpb24gc291cmNlID0gKFByb3BlcnR5SWREZWZpbml0aW9uKSBwcm9wZXJ0eURlZmluaXRpb247Ci0gICAgICAgICAgICBDbWlzUHJvcGVydHlJZERlZmluaXRpb25UeXBlIHRhcmdldCA9IChDbWlzUHJvcGVydHlJZERlZmluaXRpb25UeXBlKSByZXN1bHQ7Ci0KLSAgICAgICAgICAgIGNvbnZlcnRDaG9pY2VJZExpc3Qoc291cmNlLmdldENob2ljZXMoKSwgdGFyZ2V0LmdldENob2ljZSgpKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ21pc1Byb3BlcnR5SWQgZGVmYXVsdFZhbHVlID0gbmV3IENtaXNQcm9wZXJ0eUlkKCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLnNldFByb3BlcnR5RGVmaW5pdGlvbklkKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuZ2V0VmFsdWUoKS5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSgpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uIHNvdXJjZSA9IChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSBwcm9wZXJ0eURlZmluaXRpb247Ci0gICAgICAgICAgICBDbWlzUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvblR5cGUgdGFyZ2V0ID0gKENtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSkgcmVzdWx0OwotCi0gICAgICAgICAgICBjb252ZXJ0Q2hvaWNlSW50ZWdlckxpc3Qoc291cmNlLmdldENob2ljZXMoKSwgdGFyZ2V0LmdldENob2ljZSgpKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ21pc1Byb3BlcnR5SW50ZWdlciBkZWZhdWx0VmFsdWUgPSBuZXcgQ21pc1Byb3BlcnR5SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5zZXRQcm9wZXJ0eURlZmluaXRpb25JZChwcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIHZhbHVlIDogc291cmNlLmdldERlZmF1bHRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5nZXRWYWx1ZSgpLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3BlY2lmaWMKLSAgICAgICAgICAgIHRhcmdldC5zZXRNaW5WYWx1ZShzb3VyY2UuZ2V0TWluVmFsdWUoKSk7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0TWF4VmFsdWUoc291cmNlLmdldE1heFZhbHVlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvblR5cGUoKTsKLQotICAgICAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbiBzb3VyY2UgPSAoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgcHJvcGVydHlEZWZpbml0aW9uOwotICAgICAgICAgICAgQ21pc1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb25UeXBlIHRhcmdldCA9IChDbWlzUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvblR5cGUpIHJlc3VsdDsKLQotICAgICAgICAgICAgY29udmVydENob2ljZURlY2ltYWxMaXN0KHNvdXJjZS5nZXRDaG9pY2VzKCksIHRhcmdldC5nZXRDaG9pY2UoKSk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENtaXNQcm9wZXJ0eURlY2ltYWwgZGVmYXVsdFZhbHVlID0gbmV3IENtaXNQcm9wZXJ0eURlY2ltYWwoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuc2V0UHJvcGVydHlEZWZpbml0aW9uSWQocHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCB2YWx1ZSA6IHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuZ2V0VmFsdWUoKS5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNwZWNpZmljCi0gICAgICAgICAgICB0YXJnZXQuc2V0TWluVmFsdWUoc291cmNlLmdldE1pblZhbHVlKCkpOwotICAgICAgICAgICAgdGFyZ2V0LnNldE1heFZhbHVlKHNvdXJjZS5nZXRNYXhWYWx1ZSgpKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0UHJlY2lzaW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQcmVjaXNpb24oc291cmNlLmdldFByZWNpc2lvbigpLnZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvblR5cGUoKTsKLQotICAgICAgICAgICAgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbiBzb3VyY2UgPSAoUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbikgcHJvcGVydHlEZWZpbml0aW9uOwotICAgICAgICAgICAgQ21pc1Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25UeXBlIHRhcmdldCA9IChDbWlzUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvblR5cGUpIHJlc3VsdDsKLQotICAgICAgICAgICAgY29udmVydENob2ljZUJvb2xlYW5MaXN0KHNvdXJjZS5nZXRDaG9pY2VzKCksIHRhcmdldC5nZXRDaG9pY2UoKSk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENtaXNQcm9wZXJ0eUJvb2xlYW4gZGVmYXVsdFZhbHVlID0gbmV3IENtaXNQcm9wZXJ0eUJvb2xlYW4oKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuc2V0UHJvcGVydHlEZWZpbml0aW9uSWQocHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGZvciAoQm9vbGVhbiB2YWx1ZSA6IHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuZ2V0VmFsdWUoKS5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25UeXBlKCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uIHNvdXJjZSA9IChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbikgcHJvcGVydHlEZWZpbml0aW9uOwotICAgICAgICAgICAgQ21pc1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uVHlwZSB0YXJnZXQgPSAoQ21pc1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uVHlwZSkgcmVzdWx0OwotCi0gICAgICAgICAgICBjb252ZXJ0Q2hvaWNlRGF0ZVRpbWVMaXN0KHNvdXJjZS5nZXRDaG9pY2VzKCksIHRhcmdldC5nZXRDaG9pY2UoKSk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENtaXNQcm9wZXJ0eURhdGVUaW1lIGRlZmF1bHRWYWx1ZSA9IG5ldyBDbWlzUHJvcGVydHlEYXRlVGltZSgpOwotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5zZXRQcm9wZXJ0eURlZmluaXRpb25JZChwcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSA6IGNvbnZlcnRDYWxlbmRhcihzb3VyY2UuZ2V0RGVmYXVsdFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5nZXRWYWx1ZSgpLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3BlY2lmaWMKLSAgICAgICAgICAgIHRhcmdldC5zZXRSZXNvbHV0aW9uKGNvbnZlcnQoRW51bURhdGVUaW1lUmVzb2x1dGlvbi5jbGFzcywgc291cmNlLmdldERhdGVUaW1lUmVzb2x1dGlvbigpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlIdG1sRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0eUh0bWxEZWZpbml0aW9uVHlwZSgpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uIHNvdXJjZSA9IChQcm9wZXJ0eUh0bWxEZWZpbml0aW9uKSBwcm9wZXJ0eURlZmluaXRpb247Ci0gICAgICAgICAgICBDbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUgdGFyZ2V0ID0gKENtaXNQcm9wZXJ0eUh0bWxEZWZpbml0aW9uVHlwZSkgcmVzdWx0OwotCi0gICAgICAgICAgICBjb252ZXJ0Q2hvaWNlSHRtbExpc3Qoc291cmNlLmdldENob2ljZXMoKSwgdGFyZ2V0LmdldENob2ljZSgpKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ21pc1Byb3BlcnR5SHRtbCBkZWZhdWx0VmFsdWUgPSBuZXcgQ21pc1Byb3BlcnR5SHRtbCgpOwotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5zZXRQcm9wZXJ0eURlZmluaXRpb25JZChwcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBzb3VyY2UuZ2V0RGVmYXVsdFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLmdldFZhbHVlKCkuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlZmF1bHRWYWx1ZShkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5VXJpRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0eVVyaURlZmluaXRpb25UeXBlKCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5VXJpRGVmaW5pdGlvbiBzb3VyY2UgPSAoUHJvcGVydHlVcmlEZWZpbml0aW9uKSBwcm9wZXJ0eURlZmluaXRpb247Ci0gICAgICAgICAgICBDbWlzUHJvcGVydHlVcmlEZWZpbml0aW9uVHlwZSB0YXJnZXQgPSAoQ21pc1Byb3BlcnR5VXJpRGVmaW5pdGlvblR5cGUpIHJlc3VsdDsKLQotICAgICAgICAgICAgY29udmVydENob2ljZVVyaUxpc3Qoc291cmNlLmdldENob2ljZXMoKSwgdGFyZ2V0LmdldENob2ljZSgpKTsKLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ21pc1Byb3BlcnR5VXJpIGRlZmF1bHRWYWx1ZSA9IG5ldyBDbWlzUHJvcGVydHlVcmkoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuc2V0UHJvcGVydHlEZWZpbml0aW9uSWQocHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogc291cmNlLmdldERlZmF1bHRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5nZXRWYWx1ZSgpLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldENhcmRpbmFsaXR5KGNvbnZlcnQoRW51bUNhcmRpbmFsaXR5LmNsYXNzLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0Q2FyZGluYWxpdHkoKSkpOwotICAgICAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24ocHJvcGVydHlEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXN1bHQuc2V0RGlzcGxheU5hbWUocHJvcGVydHlEZWZpbml0aW9uLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0SWQocHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkpOwotICAgICAgICByZXN1bHQuc2V0SW5oZXJpdGVkKHByb3BlcnR5RGVmaW5pdGlvbi5pc0luaGVyaXRlZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShwcm9wZXJ0eURlZmluaXRpb24uZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lc3BhY2UocHJvcGVydHlEZWZpbml0aW9uLmdldExvY2FsTmFtZXNwYWNlKCkpOwotICAgICAgICByZXN1bHQuc2V0T3BlbkNob2ljZShwcm9wZXJ0eURlZmluaXRpb24uaXNPcGVuQ2hvaWNlKCkpOwotICAgICAgICByZXN1bHQuc2V0T3JkZXJhYmxlKGNvbnZlcnRCb29sZWFuKHByb3BlcnR5RGVmaW5pdGlvbi5pc09yZGVyYWJsZSgpLCBmYWxzZSkpOwotICAgICAgICByZXN1bHQuc2V0UHJvcGVydHlUeXBlKGNvbnZlcnQoRW51bVByb3BlcnR5VHlwZS5jbGFzcywgcHJvcGVydHlEZWZpbml0aW9uLmdldFByb3BlcnR5VHlwZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeWFibGUoY29udmVydEJvb2xlYW4ocHJvcGVydHlEZWZpbml0aW9uLmlzUXVlcnlhYmxlKCksIGZhbHNlKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUocHJvcGVydHlEZWZpbml0aW9uLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFJlcXVpcmVkKGNvbnZlcnRCb29sZWFuKHByb3BlcnR5RGVmaW5pdGlvbi5pc1JlcXVpcmVkKCksIGZhbHNlKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRVcGRhdGFiaWxpdHkoY29udmVydChFbnVtVXBkYXRhYmlsaXR5LmNsYXNzLCBwcm9wZXJ0eURlZmluaXRpb24uZ2V0VXBkYXRhYmlsaXR5KCkpKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHByb3BlcnR5RGVmaW5pdGlvbiwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gQ2hvaWNlcyAtLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNob2ljZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENob2ljZTxTdHJpbmc+PiBjb252ZXJ0Q2hvaWNlU3RyaW5nTGlzdChMaXN0PENtaXNDaG9pY2VTdHJpbmc+IGNob2ljZXMpIHsKLSAgICAgICAgaWYgKGNob2ljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENob2ljZTxTdHJpbmc+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxTdHJpbmc+PigpOwotCi0gICAgICAgIGZvciAoQ21pc0Nob2ljZVN0cmluZyBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDaG9pY2VJbXBsPFN0cmluZz4gbmV3Q2hvaWNlID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0Q2hvaWNlKGNvbnZlcnRDaG9pY2VTdHJpbmdMaXN0KGNob2ljZS5nZXRDaG9pY2UoKSkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldERpc3BsYXlOYW1lKGNob2ljZS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXRWYWx1ZShjaG9pY2UuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3Q2hvaWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBjaG9pY2VzIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2hvaWNlU3RyaW5nTGlzdChMaXN0PENob2ljZTxTdHJpbmc+PiBjaG9pY2VzLCBMaXN0PENtaXNDaG9pY2VTdHJpbmc+IHRhcmdldCkgewotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENob2ljZTxTdHJpbmc+IGNob2ljZSA6IGNob2ljZXMpIHsKLSAgICAgICAgICAgIENtaXNDaG9pY2VTdHJpbmcgbmV3Q2hvaWNlID0gbmV3IENtaXNDaG9pY2VTdHJpbmcoKTsKLQotICAgICAgICAgICAgY29udmVydENob2ljZVN0cmluZ0xpc3QoY2hvaWNlLmdldENob2ljZSgpLCBuZXdDaG9pY2UuZ2V0Q2hvaWNlKCkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldERpc3BsYXlOYW1lKGNob2ljZS5nZXREaXNwbGF5TmFtZSgpKTsKLQotICAgICAgICAgICAgaWYgKGNob2ljZS5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGNob2ljZS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0Nob2ljZS5nZXRWYWx1ZSgpLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YXJnZXQuYWRkKG5ld0Nob2ljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNob2ljZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENob2ljZTxTdHJpbmc+PiBjb252ZXJ0Q2hvaWNlSWRMaXN0KExpc3Q8Q21pc0Nob2ljZUlkPiBjaG9pY2VzKSB7Ci0gICAgICAgIGlmIChjaG9pY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxDaG9pY2U8U3RyaW5nPj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8U3RyaW5nPj4oKTsKLQotICAgICAgICBmb3IgKENtaXNDaG9pY2VJZCBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDaG9pY2VJbXBsPFN0cmluZz4gbmV3Q2hvaWNlID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0Q2hvaWNlKGNvbnZlcnRDaG9pY2VJZExpc3QoY2hvaWNlLmdldENob2ljZSgpKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0RGlzcGxheU5hbWUoY2hvaWNlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldFZhbHVlKGNob2ljZS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgcmVzdWx0LmFkZChuZXdDaG9pY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNob2ljZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDaG9pY2VJZExpc3QoTGlzdDxDaG9pY2U8U3RyaW5nPj4gY2hvaWNlcywgTGlzdDxDbWlzQ2hvaWNlSWQ+IHRhcmdldCkgewotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENob2ljZTxTdHJpbmc+IGNob2ljZSA6IGNob2ljZXMpIHsKLSAgICAgICAgICAgIENtaXNDaG9pY2VJZCBuZXdDaG9pY2UgPSBuZXcgQ21pc0Nob2ljZUlkKCk7Ci0KLSAgICAgICAgICAgIGNvbnZlcnRDaG9pY2VJZExpc3QoY2hvaWNlLmdldENob2ljZSgpLCBuZXdDaG9pY2UuZ2V0Q2hvaWNlKCkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldERpc3BsYXlOYW1lKGNob2ljZS5nZXREaXNwbGF5TmFtZSgpKTsKLQotICAgICAgICAgICAgaWYgKGNob2ljZS5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGNob2ljZS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0Nob2ljZS5nZXRWYWx1ZSgpLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YXJnZXQuYWRkKG5ld0Nob2ljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNob2ljZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENob2ljZTxCaWdJbnRlZ2VyPj4gY29udmVydENob2ljZUludGVnZXJMaXN0KExpc3Q8Q21pc0Nob2ljZUludGVnZXI+IGNob2ljZXMpIHsKLSAgICAgICAgaWYgKGNob2ljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENob2ljZTxCaWdJbnRlZ2VyPj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8QmlnSW50ZWdlcj4+KCk7Ci0KLSAgICAgICAgZm9yIChDbWlzQ2hvaWNlSW50ZWdlciBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDaG9pY2VJbXBsPEJpZ0ludGVnZXI+IG5ld0Nob2ljZSA9IG5ldyBDaG9pY2VJbXBsPEJpZ0ludGVnZXI+KCk7Ci0KLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXRDaG9pY2UoY29udmVydENob2ljZUludGVnZXJMaXN0KGNob2ljZS5nZXRDaG9pY2UoKSkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldERpc3BsYXlOYW1lKGNob2ljZS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXRWYWx1ZShjaG9pY2UuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3Q2hvaWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBjaG9pY2VzIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2hvaWNlSW50ZWdlckxpc3QoTGlzdDxDaG9pY2U8QmlnSW50ZWdlcj4+IGNob2ljZXMsIExpc3Q8Q21pc0Nob2ljZUludGVnZXI+IHRhcmdldCkgewotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENob2ljZTxCaWdJbnRlZ2VyPiBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDbWlzQ2hvaWNlSW50ZWdlciBuZXdDaG9pY2UgPSBuZXcgQ21pc0Nob2ljZUludGVnZXIoKTsKLQotICAgICAgICAgICAgY29udmVydENob2ljZUludGVnZXJMaXN0KGNob2ljZS5nZXRDaG9pY2UoKSwgbmV3Q2hvaWNlLmdldENob2ljZSgpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXREaXNwbGF5TmFtZShjaG9pY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChjaG9pY2UuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIHZhbHVlIDogY2hvaWNlLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q2hvaWNlLmdldFZhbHVlKCkuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhcmdldC5hZGQobmV3Q2hvaWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgY2hvaWNlcyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2hvaWNlPEJpZ0RlY2ltYWw+PiBjb252ZXJ0Q2hvaWNlRGVjaW1hbExpc3QoTGlzdDxDbWlzQ2hvaWNlRGVjaW1hbD4gY2hvaWNlcykgewotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q2hvaWNlPEJpZ0RlY2ltYWw+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxCaWdEZWNpbWFsPj4oKTsKLQotICAgICAgICBmb3IgKENtaXNDaG9pY2VEZWNpbWFsIGNob2ljZSA6IGNob2ljZXMpIHsKLSAgICAgICAgICAgIENob2ljZUltcGw8QmlnRGVjaW1hbD4gbmV3Q2hvaWNlID0gbmV3IENob2ljZUltcGw8QmlnRGVjaW1hbD4oKTsKLQotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldENob2ljZShjb252ZXJ0Q2hvaWNlRGVjaW1hbExpc3QoY2hvaWNlLmdldENob2ljZSgpKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0RGlzcGxheU5hbWUoY2hvaWNlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldFZhbHVlKGNob2ljZS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgcmVzdWx0LmFkZChuZXdDaG9pY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNob2ljZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDaG9pY2VEZWNpbWFsTGlzdChMaXN0PENob2ljZTxCaWdEZWNpbWFsPj4gY2hvaWNlcywgTGlzdDxDbWlzQ2hvaWNlRGVjaW1hbD4gdGFyZ2V0KSB7Ci0gICAgICAgIGFzc2VydCB0YXJnZXQgIT0gbnVsbDsKLQotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENob2ljZTxCaWdEZWNpbWFsPiBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDbWlzQ2hvaWNlRGVjaW1hbCBuZXdDaG9pY2UgPSBuZXcgQ21pc0Nob2ljZURlY2ltYWwoKTsKLQotICAgICAgICAgICAgY29udmVydENob2ljZURlY2ltYWxMaXN0KGNob2ljZS5nZXRDaG9pY2UoKSwgbmV3Q2hvaWNlLmdldENob2ljZSgpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXREaXNwbGF5TmFtZShjaG9pY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChjaG9pY2UuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChCaWdEZWNpbWFsIHZhbHVlIDogY2hvaWNlLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q2hvaWNlLmdldFZhbHVlKCkuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhcmdldC5hZGQobmV3Q2hvaWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgY2hvaWNlcyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2hvaWNlPEJvb2xlYW4+PiBjb252ZXJ0Q2hvaWNlQm9vbGVhbkxpc3QoTGlzdDxDbWlzQ2hvaWNlQm9vbGVhbj4gY2hvaWNlcykgewotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q2hvaWNlPEJvb2xlYW4+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxCb29sZWFuPj4oKTsKLQotICAgICAgICBmb3IgKENtaXNDaG9pY2VCb29sZWFuIGNob2ljZSA6IGNob2ljZXMpIHsKLSAgICAgICAgICAgIENob2ljZUltcGw8Qm9vbGVhbj4gbmV3Q2hvaWNlID0gbmV3IENob2ljZUltcGw8Qm9vbGVhbj4oKTsKLQotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldENob2ljZShjb252ZXJ0Q2hvaWNlQm9vbGVhbkxpc3QoY2hvaWNlLmdldENob2ljZSgpKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0RGlzcGxheU5hbWUoY2hvaWNlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldFZhbHVlKGNob2ljZS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgcmVzdWx0LmFkZChuZXdDaG9pY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNob2ljZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDaG9pY2VCb29sZWFuTGlzdChMaXN0PENob2ljZTxCb29sZWFuPj4gY2hvaWNlcywgTGlzdDxDbWlzQ2hvaWNlQm9vbGVhbj4gdGFyZ2V0KSB7Ci0gICAgICAgIGFzc2VydCB0YXJnZXQgIT0gbnVsbDsKLQotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENob2ljZTxCb29sZWFuPiBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDbWlzQ2hvaWNlQm9vbGVhbiBuZXdDaG9pY2UgPSBuZXcgQ21pc0Nob2ljZUJvb2xlYW4oKTsKLQotICAgICAgICAgICAgY29udmVydENob2ljZUJvb2xlYW5MaXN0KGNob2ljZS5nZXRDaG9pY2UoKSwgbmV3Q2hvaWNlLmdldENob2ljZSgpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXREaXNwbGF5TmFtZShjaG9pY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChjaG9pY2UuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChCb29sZWFuIHZhbHVlIDogY2hvaWNlLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q2hvaWNlLmdldFZhbHVlKCkuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhcmdldC5hZGQobmV3Q2hvaWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgY2hvaWNlcyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2hvaWNlPEdyZWdvcmlhbkNhbGVuZGFyPj4gY29udmVydENob2ljZURhdGVUaW1lTGlzdChMaXN0PENtaXNDaG9pY2VEYXRlVGltZT4gY2hvaWNlcykgewotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q2hvaWNlPEdyZWdvcmlhbkNhbGVuZGFyPj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8R3JlZ29yaWFuQ2FsZW5kYXI+PigpOwotCi0gICAgICAgIGZvciAoQ21pc0Nob2ljZURhdGVUaW1lIGNob2ljZSA6IGNob2ljZXMpIHsKLSAgICAgICAgICAgIENob2ljZUltcGw8R3JlZ29yaWFuQ2FsZW5kYXI+IG5ld0Nob2ljZSA9IG5ldyBDaG9pY2VJbXBsPEdyZWdvcmlhbkNhbGVuZGFyPigpOwotCi0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0Q2hvaWNlKGNvbnZlcnRDaG9pY2VEYXRlVGltZUxpc3QoY2hvaWNlLmdldENob2ljZSgpKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0RGlzcGxheU5hbWUoY2hvaWNlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldFZhbHVlKGNvbnZlcnRYTUxDYWxlbmRhcihjaG9pY2UuZ2V0VmFsdWUoKSkpOwotCi0gICAgICAgICAgICByZXN1bHQuYWRkKG5ld0Nob2ljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgY2hvaWNlcyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENob2ljZURhdGVUaW1lTGlzdChMaXN0PENob2ljZTxHcmVnb3JpYW5DYWxlbmRhcj4+IGNob2ljZXMsCi0gICAgICAgICAgICBMaXN0PENtaXNDaG9pY2VEYXRlVGltZT4gdGFyZ2V0KSB7Ci0gICAgICAgIGFzc2VydCB0YXJnZXQgIT0gbnVsbDsKLQotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENob2ljZTxHcmVnb3JpYW5DYWxlbmRhcj4gY2hvaWNlIDogY2hvaWNlcykgewotICAgICAgICAgICAgQ21pc0Nob2ljZURhdGVUaW1lIG5ld0Nob2ljZSA9IG5ldyBDbWlzQ2hvaWNlRGF0ZVRpbWUoKTsKLQotICAgICAgICAgICAgY29udmVydENob2ljZURhdGVUaW1lTGlzdChjaG9pY2UuZ2V0Q2hvaWNlKCksIG5ld0Nob2ljZS5nZXRDaG9pY2UoKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0RGlzcGxheU5hbWUoY2hvaWNlLmdldERpc3BsYXlOYW1lKCkpOwotCi0gICAgICAgICAgICBpZiAoY2hvaWNlLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUgOiBjb252ZXJ0Q2FsZW5kYXIoY2hvaWNlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0Nob2ljZS5nZXRWYWx1ZSgpLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YXJnZXQuYWRkKG5ld0Nob2ljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNob2ljZXMgbGlzdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENob2ljZTxTdHJpbmc+PiBjb252ZXJ0Q2hvaWNlSHRtbExpc3QoTGlzdDxDbWlzQ2hvaWNlSHRtbD4gY2hvaWNlcykgewotICAgICAgICBpZiAoY2hvaWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q2hvaWNlPFN0cmluZz4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q2hvaWNlPFN0cmluZz4+KCk7Ci0KLSAgICAgICAgZm9yIChDbWlzQ2hvaWNlSHRtbCBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDaG9pY2VJbXBsPFN0cmluZz4gbmV3Q2hvaWNlID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0Q2hvaWNlKGNvbnZlcnRDaG9pY2VIdG1sTGlzdChjaG9pY2UuZ2V0Q2hvaWNlKCkpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXREaXNwbGF5TmFtZShjaG9pY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0VmFsdWUoY2hvaWNlLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICByZXN1bHQuYWRkKG5ld0Nob2ljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgY2hvaWNlcyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENob2ljZUh0bWxMaXN0KExpc3Q8Q2hvaWNlPFN0cmluZz4+IGNob2ljZXMsIExpc3Q8Q21pc0Nob2ljZUh0bWw+IHRhcmdldCkgewotICAgICAgICBhc3NlcnQgdGFyZ2V0ICE9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNob2ljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDaG9pY2U8U3RyaW5nPiBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICBDbWlzQ2hvaWNlSHRtbCBuZXdDaG9pY2UgPSBuZXcgQ21pc0Nob2ljZUh0bWwoKTsKLQotICAgICAgICAgICAgY29udmVydENob2ljZUh0bWxMaXN0KGNob2ljZS5nZXRDaG9pY2UoKSwgbmV3Q2hvaWNlLmdldENob2ljZSgpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXREaXNwbGF5TmFtZShjaG9pY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChjaG9pY2UuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBjaG9pY2UuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXdDaG9pY2UuZ2V0VmFsdWUoKS5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGFyZ2V0LmFkZChuZXdDaG9pY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBjaG9pY2VzIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDaG9pY2U8U3RyaW5nPj4gY29udmVydENob2ljZVVyaUxpc3QoTGlzdDxDbWlzQ2hvaWNlVXJpPiBjaG9pY2VzKSB7Ci0gICAgICAgIGlmIChjaG9pY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxDaG9pY2U8U3RyaW5nPj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8U3RyaW5nPj4oKTsKLQotICAgICAgICBmb3IgKENtaXNDaG9pY2VVcmkgY2hvaWNlIDogY2hvaWNlcykgewotICAgICAgICAgICAgQ2hvaWNlSW1wbDxTdHJpbmc+IG5ld0Nob2ljZSA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLQotICAgICAgICAgICAgbmV3Q2hvaWNlLnNldENob2ljZShjb252ZXJ0Q2hvaWNlVXJpTGlzdChjaG9pY2UuZ2V0Q2hvaWNlKCkpKTsKLSAgICAgICAgICAgIG5ld0Nob2ljZS5zZXREaXNwbGF5TmFtZShjaG9pY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0VmFsdWUoY2hvaWNlLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICByZXN1bHQuYWRkKG5ld0Nob2ljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgY2hvaWNlcyBsaXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENob2ljZVVyaUxpc3QoTGlzdDxDaG9pY2U8U3RyaW5nPj4gY2hvaWNlcywgTGlzdDxDbWlzQ2hvaWNlVXJpPiB0YXJnZXQpIHsKLSAgICAgICAgYXNzZXJ0IHRhcmdldCAhPSBudWxsOwotCi0gICAgICAgIGlmIChjaG9pY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ2hvaWNlPFN0cmluZz4gY2hvaWNlIDogY2hvaWNlcykgewotICAgICAgICAgICAgQ21pc0Nob2ljZVVyaSBuZXdDaG9pY2UgPSBuZXcgQ21pc0Nob2ljZVVyaSgpOwotCi0gICAgICAgICAgICBjb252ZXJ0Q2hvaWNlVXJpTGlzdChjaG9pY2UuZ2V0Q2hvaWNlKCksIG5ld0Nob2ljZS5nZXRDaG9pY2UoKSk7Ci0gICAgICAgICAgICBuZXdDaG9pY2Uuc2V0RGlzcGxheU5hbWUoY2hvaWNlLmdldERpc3BsYXlOYW1lKCkpOwotCi0gICAgICAgICAgICBpZiAoY2hvaWNlLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogY2hvaWNlLmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q2hvaWNlLmdldFZhbHVlKCkuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhcmdldC5hZGQobmV3Q2hvaWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gT2JqZWN0cyAtLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIENNSVMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0RGF0YSBjb252ZXJ0KENtaXNPYmplY3RUeXBlIG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0RGF0YUltcGwgcmVzdWx0ID0gbmV3IE9iamVjdERhdGFJbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldEFjbChjb252ZXJ0KG9iamVjdC5nZXRBY2woKSwgbnVsbCkpOwotICAgICAgICByZXN1bHQuc2V0QWxsb3dhYmxlQWN0aW9ucyhjb252ZXJ0KG9iamVjdC5nZXRBbGxvd2FibGVBY3Rpb25zKCkpKTsKLSAgICAgICAgaWYgKG9iamVjdC5nZXRDaGFuZ2VFdmVudEluZm8oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDaGFuZ2VFdmVudEluZm9EYXRhSW1wbCBjaGFuZ2VFdmVudEluZm8gPSBuZXcgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkuZ2V0Q2hhbmdlVGltZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VFdmVudEluZm8uc2V0Q2hhbmdlVGltZShvYmplY3QuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkuZ2V0Q2hhbmdlVGltZSgpLnRvR3JlZ29yaWFuQ2FsZW5kYXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFuZ2VFdmVudEluZm8uc2V0Q2hhbmdlVHlwZShjb252ZXJ0KENoYW5nZVR5cGUuY2xhc3MsIG9iamVjdC5nZXRDaGFuZ2VFdmVudEluZm8oKS5nZXRDaGFuZ2VUeXBlKCkpKTsKLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ob2JqZWN0LmdldENoYW5nZUV2ZW50SW5mbygpLCBjaGFuZ2VFdmVudEluZm8pOwotCi0gICAgICAgICAgICByZXN1bHQuc2V0Q2hhbmdlRXZlbnRJbmZvKGNoYW5nZUV2ZW50SW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnNldElzRXhhY3RBY2wob2JqZWN0LmlzRXhhY3RBQ0woKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRQb2xpY3lJZHMoY29udmVydChvYmplY3QuZ2V0UG9saWN5SWRzKCkpKTsKLSAgICAgICAgcmVzdWx0LnNldFByb3BlcnRpZXMoY29udmVydChvYmplY3QuZ2V0UHJvcGVydGllcygpKSk7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gcmVsYXRpb25zaGlwcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0VHlwZSBjbWlzT2JqZWN0IDogb2JqZWN0LmdldFJlbGF0aW9uc2hpcCgpKSB7Ci0gICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFkZChjb252ZXJ0KGNtaXNPYmplY3QpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgTGlzdDxSZW5kaXRpb25EYXRhPiByZW5kaXRpb25zID0gbmV3IEFycmF5TGlzdDxSZW5kaXRpb25EYXRhPigpOwotICAgICAgICBmb3IgKENtaXNSZW5kaXRpb25UeXBlIHJlbmRpdGlvbiA6IG9iamVjdC5nZXRSZW5kaXRpb24oKSkgewotICAgICAgICAgICAgcmVuZGl0aW9ucy5hZGQoY29udmVydChyZW5kaXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0UmVuZGl0aW9ucyhyZW5kaXRpb25zKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcHJvcGVydGllcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGNvbnZlcnQoQ21pc1Byb3BlcnRpZXNUeXBlIHByb3BlcnRpZXMpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0aWVzSW1wbCByZXN1bHQgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLQotICAgICAgICBmb3IgKENtaXNQcm9wZXJ0eSBwcm9wZXJ0eSA6IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoKSkgewotICAgICAgICAgICAgcmVzdWx0LmFkZFByb3BlcnR5KGNvbnZlcnQocHJvcGVydHkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocHJvcGVydGllcywgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcHJvcGVydHkgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEYXRhPD8+IGNvbnZlcnQoQ21pc1Byb3BlcnR5IHByb3BlcnR5KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIENtaXNQcm9wZXJ0eVN0cmluZykgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5U3RyaW5nSW1wbChwcm9wZXJ0eS5nZXRQcm9wZXJ0eURlZmluaXRpb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAoKENtaXNQcm9wZXJ0eVN0cmluZykgcHJvcGVydHkpLmdldFZhbHVlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgQ21pc1Byb3BlcnR5SWQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUlkSW1wbChwcm9wZXJ0eS5nZXRQcm9wZXJ0eURlZmluaXRpb25JZCgpLCAoKENtaXNQcm9wZXJ0eUlkKSBwcm9wZXJ0eSkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbChwcm9wZXJ0eS5nZXRQcm9wZXJ0eURlZmluaXRpb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAoKENtaXNQcm9wZXJ0eUludGVnZXIpIHByb3BlcnR5KS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIENtaXNQcm9wZXJ0eURlY2ltYWwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURlY2ltYWxJbXBsKHByb3BlcnR5LmdldFByb3BlcnR5RGVmaW5pdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICgoQ21pc1Byb3BlcnR5RGVjaW1hbCkgcHJvcGVydHkpLmdldFZhbHVlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgQ21pc1Byb3BlcnR5Qm9vbGVhbikgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwocHJvcGVydHkuZ2V0UHJvcGVydHlEZWZpbml0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgKChDbWlzUHJvcGVydHlCb29sZWFuKSBwcm9wZXJ0eSkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlEYXRlVGltZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKHByb3BlcnR5LmdldFByb3BlcnR5RGVmaW5pdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRYTUxDYWxlbmRhcigoKENtaXNQcm9wZXJ0eURhdGVUaW1lKSBwcm9wZXJ0eSkuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgQ21pc1Byb3BlcnR5SHRtbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SHRtbEltcGwocHJvcGVydHkuZ2V0UHJvcGVydHlEZWZpbml0aW9uSWQoKSwgKChDbWlzUHJvcGVydHlIdG1sKSBwcm9wZXJ0eSkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBDbWlzUHJvcGVydHlVcmkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVVyaUltcGwocHJvcGVydHkuZ2V0UHJvcGVydHlEZWZpbml0aW9uSWQoKSwgKChDbWlzUHJvcGVydHlVcmkpIHByb3BlcnR5KS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgKChBYnN0cmFjdFByb3BlcnR5RGF0YTw/PikgcmVzdWx0KS5zZXRMb2NhbE5hbWUocHJvcGVydHkuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAoKEFic3RyYWN0UHJvcGVydHlEYXRhPD8+KSByZXN1bHQpLnNldFF1ZXJ5TmFtZShwcm9wZXJ0eS5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgICgoQWJzdHJhY3RQcm9wZXJ0eURhdGE8Pz4pIHJlc3VsdCkuc2V0RGlzcGxheU5hbWUocHJvcGVydHkuZ2V0RGlzcGxheU5hbWUoKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihwcm9wZXJ0eSwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcHJvcGVydGllcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzUHJvcGVydGllc1R5cGUgY29udmVydChQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzUHJvcGVydGllc1R5cGUgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0aWVzVHlwZSgpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXMuZ2V0UHJvcGVydHlMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UHJvcGVydHkoKS5hZGQoY29udmVydChwcm9wZXJ0eSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihwcm9wZXJ0aWVzLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBwcm9wZXJ0eSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzUHJvcGVydHkgY29udmVydChQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc1Byb3BlcnR5IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDbWlzUHJvcGVydHlTdHJpbmcoKTsKLSAgICAgICAgICAgICgoQ21pc1Byb3BlcnR5U3RyaW5nKSByZXN1bHQpLmdldFZhbHVlKCkuYWRkQWxsKCgoUHJvcGVydHlTdHJpbmcpIHByb3BlcnR5KS5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc1Byb3BlcnR5SWQoKTsKLSAgICAgICAgICAgICgoQ21pc1Byb3BlcnR5SWQpIHJlc3VsdCkuZ2V0VmFsdWUoKS5hZGRBbGwoKChQcm9wZXJ0eUlkKSBwcm9wZXJ0eSkuZ2V0VmFsdWVzKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc1Byb3BlcnR5SW50ZWdlcigpOwotICAgICAgICAgICAgKChDbWlzUHJvcGVydHlJbnRlZ2VyKSByZXN1bHQpLmdldFZhbHVlKCkuYWRkQWxsKCgoUHJvcGVydHlJbnRlZ2VyKSBwcm9wZXJ0eSkuZ2V0VmFsdWVzKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlEZWNpbWFsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc1Byb3BlcnR5RGVjaW1hbCgpOwotICAgICAgICAgICAgKChDbWlzUHJvcGVydHlEZWNpbWFsKSByZXN1bHQpLmdldFZhbHVlKCkuYWRkQWxsKCgoUHJvcGVydHlEZWNpbWFsKSBwcm9wZXJ0eSkuZ2V0VmFsdWVzKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc1Byb3BlcnR5Qm9vbGVhbigpOwotICAgICAgICAgICAgKChDbWlzUHJvcGVydHlCb29sZWFuKSByZXN1bHQpLmdldFZhbHVlKCkuYWRkQWxsKCgoUHJvcGVydHlCb29sZWFuKSBwcm9wZXJ0eSkuZ2V0VmFsdWVzKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0eURhdGVUaW1lKCk7Ci0gICAgICAgICAgICAoKENtaXNQcm9wZXJ0eURhdGVUaW1lKSByZXN1bHQpLmdldFZhbHVlKCkuYWRkQWxsKAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0Q2FsZW5kYXIoKChQcm9wZXJ0eURhdGVUaW1lKSBwcm9wZXJ0eSkuZ2V0VmFsdWVzKCkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5SHRtbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENtaXNQcm9wZXJ0eUh0bWwoKTsKLSAgICAgICAgICAgICgoQ21pc1Byb3BlcnR5SHRtbCkgcmVzdWx0KS5nZXRWYWx1ZSgpLmFkZEFsbCgoKFByb3BlcnR5SHRtbCkgcHJvcGVydHkpLmdldFZhbHVlcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5VXJpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc1Byb3BlcnR5VXJpKCk7Ci0gICAgICAgICAgICAoKENtaXNQcm9wZXJ0eVVyaSkgcmVzdWx0KS5nZXRWYWx1ZSgpLmFkZEFsbCgoKFByb3BlcnR5VXJpKSBwcm9wZXJ0eSkuZ2V0VmFsdWVzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0UHJvcGVydHlEZWZpbml0aW9uSWQocHJvcGVydHkuZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWUocHJvcGVydHkuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0UXVlcnlOYW1lKHByb3BlcnR5LmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKHByb3BlcnR5LmdldERpc3BsYXlOYW1lKCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSByZW5kaXRpb24gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVuZGl0aW9uRGF0YSBjb252ZXJ0KENtaXNSZW5kaXRpb25UeXBlIHJlbmRpdGlvbikgewotICAgICAgICBpZiAocmVuZGl0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGl0aW9uRGF0YUltcGwgcmVzdWx0ID0gbmV3IFJlbmRpdGlvbkRhdGFJbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldEJpZ0hlaWdodChyZW5kaXRpb24uZ2V0SGVpZ2h0KCkpOwotICAgICAgICByZXN1bHQuc2V0S2luZChyZW5kaXRpb24uZ2V0S2luZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldEJpZ0xlbmd0aChyZW5kaXRpb24uZ2V0TGVuZ3RoKCkpOwotICAgICAgICByZXN1bHQuc2V0TWltZVR5cGUocmVuZGl0aW9uLmdldE1pbWV0eXBlKCkpOwotICAgICAgICByZXN1bHQuc2V0UmVuZGl0aW9uRG9jdW1lbnRJZChyZW5kaXRpb24uZ2V0UmVuZGl0aW9uRG9jdW1lbnRJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldFN0cmVhbUlkKHJlbmRpdGlvbi5nZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldFRpdGxlKHJlbmRpdGlvbi5nZXRUaXRsZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldEJpZ1dpZHRoKHJlbmRpdGlvbi5nZXRXaWR0aCgpKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHJlbmRpdGlvbiwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcmVuZGl0aW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENtaXNSZW5kaXRpb25UeXBlIGNvbnZlcnQoUmVuZGl0aW9uRGF0YSByZW5kaXRpb24pIHsKLSAgICAgICAgaWYgKHJlbmRpdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNSZW5kaXRpb25UeXBlIHJlc3VsdCA9IG5ldyBDbWlzUmVuZGl0aW9uVHlwZSgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRIZWlnaHQocmVuZGl0aW9uLmdldEJpZ0hlaWdodCgpKTsKLSAgICAgICAgcmVzdWx0LnNldEtpbmQocmVuZGl0aW9uLmdldEtpbmQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMZW5ndGgocmVuZGl0aW9uLmdldEJpZ0xlbmd0aCgpKTsKLSAgICAgICAgcmVzdWx0LnNldE1pbWV0eXBlKHJlbmRpdGlvbi5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldFJlbmRpdGlvbkRvY3VtZW50SWQocmVuZGl0aW9uLmdldFJlbmRpdGlvbkRvY3VtZW50SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRTdHJlYW1JZChyZW5kaXRpb24uZ2V0U3RyZWFtSWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRUaXRsZShyZW5kaXRpb24uZ2V0VGl0bGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRXaWR0aChyZW5kaXRpb24uZ2V0QmlnV2lkdGgoKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihyZW5kaXRpb24sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIENNSVMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc09iamVjdFR5cGUgY29udmVydChPYmplY3REYXRhIG9iamVjdCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNPYmplY3RUeXBlIHJlc3VsdCA9IG5ldyBDbWlzT2JqZWN0VHlwZSgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRBY2woY29udmVydChvYmplY3QuZ2V0QWNsKCkpKTsKLSAgICAgICAgcmVzdWx0LnNldEFsbG93YWJsZUFjdGlvbnMoY29udmVydChvYmplY3QuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLCBjbWlzVmVyc2lvbikpOwotICAgICAgICBpZiAob2JqZWN0LmdldENoYW5nZUV2ZW50SW5mbygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIENtaXNDaGFuZ2VFdmVudFR5cGUgY2hhbmdlRXZlbnRJbmZvID0gbmV3IENtaXNDaGFuZ2VFdmVudFR5cGUoKTsKLQotICAgICAgICAgICAgY2hhbmdlRXZlbnRJbmZvCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaGFuZ2VUeXBlKGNvbnZlcnQoRW51bVR5cGVPZkNoYW5nZXMuY2xhc3MsIG9iamVjdC5nZXRDaGFuZ2VFdmVudEluZm8oKS5nZXRDaGFuZ2VUeXBlKCkpKTsKLSAgICAgICAgICAgIGNoYW5nZUV2ZW50SW5mby5zZXRDaGFuZ2VUaW1lKGNvbnZlcnRDYWxlbmRhcihvYmplY3QuZ2V0Q2hhbmdlRXZlbnRJbmZvKCkuZ2V0Q2hhbmdlVGltZSgpKSk7Ci0KLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ob2JqZWN0LmdldENoYW5nZUV2ZW50SW5mbygpLCBjaGFuZ2VFdmVudEluZm8pOwotCi0gICAgICAgICAgICByZXN1bHQuc2V0Q2hhbmdlRXZlbnRJbmZvKGNoYW5nZUV2ZW50SW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnNldEV4YWN0QUNMKG9iamVjdC5pc0V4YWN0QWNsKCkpOwotICAgICAgICByZXN1bHQuc2V0UG9saWN5SWRzKGNvbnZlcnQob2JqZWN0LmdldFBvbGljeUlkcygpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRQcm9wZXJ0aWVzKGNvbnZlcnQob2JqZWN0LmdldFByb3BlcnRpZXMoKSkpOwotICAgICAgICBpZiAob2JqZWN0LmdldFJlbGF0aW9uc2hpcHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgcmVsYXRpb25zaGlwIDogb2JqZWN0LmdldFJlbGF0aW9uc2hpcHMoKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRSZWxhdGlvbnNoaXAoKS5hZGQoY29udmVydChyZWxhdGlvbnNoaXAsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdC5nZXRSZW5kaXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChSZW5kaXRpb25EYXRhIHJlbmRpdGlvbiA6IG9iamVjdC5nZXRSZW5kaXRpb25zKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmVuZGl0aW9uKCkuYWRkKGNvbnZlcnQocmVuZGl0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gQUNMcyBhbmQgUG9saWNpZXMgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gQUNMIG9iamVjdCB3aXRoIGl0cyBBQ0VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQWNsIGNvbnZlcnQoQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSBhY2wsIEJvb2xlYW4gaXNFeGFjdCkgewotICAgICAgICBpZiAoYWNsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQWNjZXNzQ29udHJvbExpc3RJbXBsIHJlc3VsdCA9IG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoKTsKLQotICAgICAgICBMaXN0PEFjZT4gYWNlcyA9IG5ldyBBcnJheUxpc3Q8QWNlPigpOwotICAgICAgICBmb3IgKENtaXNBY2Nlc3NDb250cm9sRW50cnlUeXBlIGVudHJ5IDogYWNsLmdldFBlcm1pc3Npb24oKSkgewotICAgICAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWNjZXNzQ29udHJvbEVudHJ5SW1wbCBhY2UgPSBuZXcgQWNjZXNzQ29udHJvbEVudHJ5SW1wbCgpOwotICAgICAgICAgICAgYWNlLnNldERpcmVjdChlbnRyeS5pc0RpcmVjdCgpKTsKLSAgICAgICAgICAgIGFjZS5zZXRQZXJtaXNzaW9ucyhlbnRyeS5nZXRQZXJtaXNzaW9uKCkpOwotICAgICAgICAgICAgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsIHByaW5jaXBhbCA9IG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwoCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFByaW5jaXBhbCgpID09IG51bGwgPyBudWxsIDogZW50cnkuZ2V0UHJpbmNpcGFsKCkuZ2V0UHJpbmNpcGFsSWQoKSk7Ci0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGVudHJ5LmdldFByaW5jaXBhbCgpLCBwcmluY2lwYWwpOwotICAgICAgICAgICAgYWNlLnNldFByaW5jaXBhbChwcmluY2lwYWwpOwotCi0gICAgICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihlbnRyeSwgYWNlKTsKLQotICAgICAgICAgICAgYWNlcy5hZGQoYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRBY2VzKGFjZXMpOwotCi0gICAgICAgIHJlc3VsdC5zZXRFeGFjdChpc0V4YWN0KTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGFjbCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIEFDTCBvYmplY3Qgd2l0aCBpdHMgQUNFcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgY29udmVydChBY2wgYWNsKSB7Ci0gICAgICAgIGlmIChhY2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIHJlc3VsdCA9IG5ldyBDbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlKCk7Ci0KLSAgICAgICAgaWYgKGFjbC5nZXRBY2VzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChBY2UgYWNlIDogYWNsLmdldEFjZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBDbWlzQWNjZXNzQ29udHJvbEVudHJ5VHlwZSBlbnRyeSA9IG5ldyBDbWlzQWNjZXNzQ29udHJvbEVudHJ5VHlwZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFjZS5nZXRQcmluY2lwYWwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENtaXNBY2Nlc3NDb250cm9sUHJpbmNpcGFsVHlwZSBwaW5jaXBhbCA9IG5ldyBDbWlzQWNjZXNzQ29udHJvbFByaW5jaXBhbFR5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBwaW5jaXBhbC5zZXRQcmluY2lwYWxJZChhY2UuZ2V0UHJpbmNpcGFsKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocGluY2lwYWwsIGFjZS5nZXRQcmluY2lwYWwoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZW50cnkuc2V0UHJpbmNpcGFsKHBpbmNpcGFsKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbnRyeS5zZXREaXJlY3QoYWNlLmlzRGlyZWN0KCkpOwotICAgICAgICAgICAgICAgIGVudHJ5LmdldFBlcm1pc3Npb24oKS5hZGRBbGwoYWNlLmdldFBlcm1pc3Npb25zKCkpOwotCi0gICAgICAgICAgICAgICAgY29udmVydEV4dGVuc2lvbihhY2UsIGVudHJ5KTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRQZXJtaXNzaW9uKCkuYWRkKGVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oYWNsLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gQWxsb3dhYmxlQWN0aW9ucyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbGxvd2FibGVBY3Rpb25zIGNvbnZlcnQoQ21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIGFsbG93YWJsZUFjdGlvbnMpIHsKLSAgICAgICAgaWYgKGFsbG93YWJsZUFjdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBbGxvd2FibGVBY3Rpb25zSW1wbCByZXN1bHQgPSBuZXcgQWxsb3dhYmxlQWN0aW9uc0ltcGwoKTsKLQotICAgICAgICBTZXQ8QWN0aW9uPiBzZXQgPSBFbnVtU2V0Lm5vbmVPZihBY3Rpb24uY2xhc3MpOwotCi0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5BZGRPYmplY3RUb0ZvbGRlcigpKSkgewotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0FERF9PQkpFQ1RfVE9fRk9MREVSKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuQXBwbHlBQ0woKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9BUFBMWV9BQ0wpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5BcHBseVBvbGljeSgpKSkgewotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0FQUExZX1BPTElDWSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkNhbmNlbENoZWNrT3V0KCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fQ0FOQ0VMX0NIRUNLX09VVCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkNoZWNrSW4oKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9DSEVDS19JTik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkNoZWNrT3V0KCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fQ0hFQ0tfT1VUKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuQ3JlYXRlRG9jdW1lbnQoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9DUkVBVEVfRE9DVU1FTlQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5DcmVhdGVGb2xkZXIoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9DUkVBVEVfRk9MREVSKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuQ3JlYXRlUmVsYXRpb25zaGlwKCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fQ1JFQVRFX1JFTEFUSU9OU0hJUCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkNyZWF0ZUl0ZW0oKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9DUkVBVEVfSVRFTSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkRlbGV0ZUNvbnRlbnRTdHJlYW0oKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5EZWxldGVPYmplY3QoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9ERUxFVEVfT0JKRUNUKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuRGVsZXRlVHJlZSgpKSkgewotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0RFTEVURV9UUkVFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuR2V0QUNMKCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX0FDTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkdldEFsbFZlcnNpb25zKCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX0FMTF9WRVJTSU9OUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkdldEFwcGxpZWRQb2xpY2llcygpKSkgewotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0dFVF9BUFBMSUVEX1BPTElDSUVTKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuR2V0Q2hpbGRyZW4oKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfQ0hJTERSRU4pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5HZXRDb250ZW50U3RyZWFtKCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX0NPTlRFTlRfU1RSRUFNKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuR2V0RGVzY2VuZGFudHMoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfREVTQ0VOREFOVFMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5HZXRGb2xkZXJQYXJlbnQoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfRk9MREVSX1BBUkVOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkdldEZvbGRlclRyZWUoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfRk9MREVSX1RSRUUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5HZXRPYmplY3RQYXJlbnRzKCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX09CSkVDVF9QQVJFTlRTKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcygpKSkgewotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0dFVF9PQkpFQ1RfUkVMQVRJT05TSElQUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkdldFByb3BlcnRpZXMoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfUFJPUEVSVElFUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhbkdldFJlbmRpdGlvbnMoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfUkVORElUSU9OUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0Nhbk1vdmVPYmplY3QoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9NT1ZFX09CSkVDVCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhblJlbW92ZU9iamVjdEZyb21Gb2xkZXIoKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhbGxvd2FibGVBY3Rpb25zLmlzQ2FuUmVtb3ZlUG9saWN5KCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fUkVNT1ZFX1BPTElDWSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsb3dhYmxlQWN0aW9ucy5pc0NhblNldENvbnRlbnRTdHJlYW0oKSkpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9TRVRfQ09OVEVOVF9TVFJFQU0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFsbG93YWJsZUFjdGlvbnMuaXNDYW5VcGRhdGVQcm9wZXJ0aWVzKCkpKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fVVBEQVRFX1BST1BFUlRJRVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldEFsbG93YWJsZUFjdGlvbnMoc2V0KTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGFsbG93YWJsZUFjdGlvbnMsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBBbGxvd2FibGVBY3Rpb25zIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSBjb252ZXJ0KEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9ucywgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgaWYgKGFsbG93YWJsZUFjdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzQWxsb3dhYmxlQWN0aW9uc1R5cGUgcmVzdWx0ID0gbmV3IENtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSgpOwotCi0gICAgICAgIGlmIChhbGxvd2FibGVBY3Rpb25zLmdldEFsbG93YWJsZUFjdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8QWN0aW9uPiBzZXQgPSBhbGxvd2FibGVBY3Rpb25zLmdldEFsbG93YWJsZUFjdGlvbnMoKTsKLQotICAgICAgICAgICAgcmVzdWx0LnNldENhbkFkZE9iamVjdFRvRm9sZGVyKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX0FERF9PQkpFQ1RfVE9fRk9MREVSKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q2FuQXBwbHlBQ0woc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fQVBQTFlfQUNMKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q2FuQXBwbHlQb2xpY3koc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fQVBQTFlfUE9MSUNZKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q2FuQ2FuY2VsQ2hlY2tPdXQoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fQ0FOQ0VMX0NIRUNLX09VVCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkNoZWNrSW4oc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fQ0hFQ0tfSU4pKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5DaGVja091dChzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9DSEVDS19PVVQpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5DcmVhdGVEb2N1bWVudChzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9DUkVBVEVfRE9DVU1FTlQpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5DcmVhdGVGb2xkZXIoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fQ1JFQVRFX0ZPTERFUikpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkNyZWF0ZVJlbGF0aW9uc2hpcChzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9DUkVBVEVfUkVMQVRJT05TSElQKSk7Ci0gICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fQ1JFQVRFX0lURU0pICYmIGNtaXNWZXJzaW9uID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oIlJlY2VpdmVyIG9ubHkgdW5kZXJzdGFuZHMgQ01JUyAxLjAgYnV0IHRoZSBBbGxvd2FibGUgQWN0aW9ucyBjb250YWluIHRoZSBjYW5DcmVhdGVJdGVtIGFjdGlvbi4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIGNhbkNyZWF0ZUl0ZW0gYWN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgQWxsb3dhYmxlIEFjdGlvbnMuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5DcmVhdGVJdGVtKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX0NSRUFURV9JVEVNKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q2FuRGVsZXRlQ29udGVudFN0cmVhbShzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0pKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5EZWxldGVPYmplY3Qoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fREVMRVRFX09CSkVDVCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkRlbGV0ZVRyZWUoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fREVMRVRFX1RSRUUpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5HZXRBQ0woc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX0FDTCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkdldEFsbFZlcnNpb25zKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9BTExfVkVSU0lPTlMpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5HZXRBcHBsaWVkUG9saWNpZXMoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX0FQUExJRURfUE9MSUNJRVMpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5HZXRDaGlsZHJlbihzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfQ0hJTERSRU4pKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5HZXRDb250ZW50U3RyZWFtKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9DT05URU5UX1NUUkVBTSkpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkdldERlc2NlbmRhbnRzKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9ERVNDRU5EQU5UUykpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkdldEZvbGRlclBhcmVudChzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfRk9MREVSX1BBUkVOVCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkdldEZvbGRlclRyZWUoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX0ZPTERFUl9UUkVFKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q2FuR2V0T2JqZWN0UGFyZW50cyhzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfT0JKRUNUX1BBUkVOVFMpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5HZXRPYmplY3RSZWxhdGlvbnNoaXBzKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9PQkpFQ1RfUkVMQVRJT05TSElQUykpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhbkdldFByb3BlcnRpZXMoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX1BST1BFUlRJRVMpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5HZXRSZW5kaXRpb25zKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9SRU5ESVRJT05TKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q2FuTW92ZU9iamVjdChzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9NT1ZFX09CSkVDVCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhblJlbW92ZU9iamVjdEZyb21Gb2xkZXIoc2V0LmNvbnRhaW5zKEFjdGlvbi5DQU5fUkVNT1ZFX09CSkVDVF9GUk9NX0ZPTERFUikpOwotICAgICAgICAgICAgcmVzdWx0LnNldENhblJlbW92ZVBvbGljeShzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9SRU1PVkVfUE9MSUNZKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0Q2FuU2V0Q29udGVudFN0cmVhbShzZXQuY29udGFpbnMoQWN0aW9uLkNBTl9TRVRfQ09OVEVOVF9TVFJFQU0pKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRDYW5VcGRhdGVQcm9wZXJ0aWVzKHNldC5jb250YWlucyhBY3Rpb24uQ0FOX1VQREFURV9QUk9QRVJUSUVTKSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oYWxsb3dhYmxlQWN0aW9ucywgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgbGlzdCBvZiBwb2xpY3kgaWRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUG9saWN5SWRMaXN0IGNvbnZlcnQoQ21pc0xpc3RPZklkc1R5cGUgcG9saWN5SWRzKSB7Ci0gICAgICAgIGlmIChwb2xpY3lJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQb2xpY3lJZExpc3RJbXBsIHJlc3VsdCA9IG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRQb2xpY3lJZHMocG9saWN5SWRzLmdldElkKCkpOwotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocG9saWN5SWRzLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBsaXN0IG9mIHBvbGljeSBpZHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzTGlzdE9mSWRzVHlwZSBjb252ZXJ0KFBvbGljeUlkTGlzdCBwb2xpY3lJZHMpIHsKLSAgICAgICAgaWYgKHBvbGljeUlkcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNMaXN0T2ZJZHNUeXBlIHJlc3VsdCA9IG5ldyBDbWlzTGlzdE9mSWRzVHlwZSgpOwotICAgICAgICBpZiAocG9saWN5SWRzLmdldFBvbGljeUlkcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogcG9saWN5SWRzLmdldFBvbGljeUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmdldElkKCkuYWRkKGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24ocG9saWN5SWRzLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBsaXN0IG9mIHBvbGljeSBpZHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzTGlzdE9mSWRzVHlwZSBjb252ZXJ0UG9saWN5SWRzKExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMpIHsKLSAgICAgICAgaWYgKHBvbGljeUlkcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNMaXN0T2ZJZHNUeXBlIHJlc3VsdCA9IG5ldyBDbWlzTGlzdE9mSWRzVHlwZSgpOwotICAgICAgICByZXN1bHQuZ2V0SWQoKS5hZGRBbGwocG9saWN5SWRzKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gTGlzdHMsIGNvbnRhaW5lcnMgYW5kIHNpbWlsYXIgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBsaXN0IG9mIGNhbGVuZGFyIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPiBjb252ZXJ0WE1MQ2FsZW5kYXIoTGlzdDxYTUxHcmVnb3JpYW5DYWxlbmRhcj4gY2FsZW5kYXIpIHsKLSAgICAgICAgaWYgKGNhbGVuZGFyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4oKTsKLSAgICAgICAgZm9yIChYTUxHcmVnb3JpYW5DYWxlbmRhciBjYWwgOiBjYWxlbmRhcikgewotICAgICAgICAgICAgaWYgKGNhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjYWwudG9HcmVnb3JpYW5DYWxlbmRhcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBsaXN0IG9mIGNhbGVuZGFyIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFhNTEdyZWdvcmlhbkNhbGVuZGFyPiBjb252ZXJ0Q2FsZW5kYXIoTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gY2FsZW5kYXIpIHsKLSAgICAgICAgaWYgKGNhbGVuZGFyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgRGF0YXR5cGVGYWN0b3J5IGRmOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGYgPSBEYXRhdHlwZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ29udmVydCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFhNTEdyZWdvcmlhbkNhbGVuZGFyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFhNTEdyZWdvcmlhbkNhbGVuZGFyPigpOwotICAgICAgICBmb3IgKEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA6IGNhbGVuZGFyKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKGRmLm5ld1hNTEdyZWdvcmlhbkNhbGVuZGFyKGNhbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGNhbGVuZGFyIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGNvbnZlcnRDYWxlbmRhcihHcmVnb3JpYW5DYWxlbmRhciBjYWxlbmRhcikgewotICAgICAgICBpZiAoY2FsZW5kYXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBEYXRhdHlwZUZhY3RvcnkgZGY7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZiA9IERhdGF0eXBlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChEYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDb252ZXJ0IGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZi5uZXdYTUxHcmVnb3JpYW5DYWxlbmRhcihjYWxlbmRhcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSB0eXBlIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlRGVmaW5pdGlvbkxpc3QgY29udmVydChDbWlzVHlwZURlZmluaXRpb25MaXN0VHlwZSB0eXBlTGlzdCkgewotICAgICAgICBpZiAodHlwZUxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsIHJlc3VsdCA9IG5ldyBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsKCk7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHR5cGVzID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgZm9yIChDbWlzVHlwZURlZmluaXRpb25UeXBlIHR5cGVEZWZpbml0aW9uIDogdHlwZUxpc3QuZ2V0VHlwZXMoKSkgewotICAgICAgICAgICAgdHlwZXMuYWRkKGNvbnZlcnQodHlwZURlZmluaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRMaXN0KHR5cGVzKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyh0eXBlTGlzdC5pc0hhc01vcmVJdGVtcygpKTsKLSAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKHR5cGVMaXN0LmdldE51bUl0ZW1zKCkpOwotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24odHlwZUxpc3QsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHR5cGUgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENtaXNUeXBlRGVmaW5pdGlvbkxpc3RUeXBlIGNvbnZlcnQoVHlwZURlZmluaXRpb25MaXN0IHR5cGVMaXN0KSB7Ci0gICAgICAgIGlmICh0eXBlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNUeXBlRGVmaW5pdGlvbkxpc3RUeXBlIHJlc3VsdCA9IG5ldyBDbWlzVHlwZURlZmluaXRpb25MaXN0VHlwZSgpOwotCi0gICAgICAgIGlmICh0eXBlTGlzdC5nZXRMaXN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0ZGQgOiB0eXBlTGlzdC5nZXRMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VHlwZXMoKS5hZGQoY29udmVydCh0ZGQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoY29udmVydEJvb2xlYW4odHlwZUxpc3QuaGFzTW9yZUl0ZW1zKCksIGZhbHNlKSk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyh0eXBlTGlzdC5nZXROdW1JdGVtcygpKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKHR5cGVMaXN0LCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSB0eXBlIGNvbnRhaW5lciBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gY29udmVydFR5cGVDb250YWluZXJMaXN0KExpc3Q8Q21pc1R5cGVDb250YWluZXI+IHR5cGVDb250YWluZXJzKSB7Ci0gICAgICAgIGlmICh0eXBlQ29udGFpbmVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+KCk7Ci0gICAgICAgIGZvciAoQ21pc1R5cGVDb250YWluZXIgY29udGFpbmVyIDogdHlwZUNvbnRhaW5lcnMpIHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCBuZXdDb25hdGluZXIgPSBuZXcgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsKCk7Ci0gICAgICAgICAgICBuZXdDb25hdGluZXIuc2V0VHlwZURlZmluaXRpb24oY29udmVydChjb250YWluZXIuZ2V0VHlwZSgpKSk7Ci0gICAgICAgICAgICBuZXdDb25hdGluZXIuc2V0Q2hpbGRyZW4oY29udmVydFR5cGVDb250YWluZXJMaXN0KGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSk7Ci0gICAgICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGNvbnRhaW5lciwgbmV3Q29uYXRpbmVyKTsKLQotICAgICAgICAgICAgcmVzdWx0LmFkZChuZXdDb25hdGluZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHR5cGUgY29udGFpbmVyIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUeXBlQ29udGFpbmVyTGlzdChMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlQ29udGFpbmVycywKLSAgICAgICAgICAgIExpc3Q8Q21pc1R5cGVDb250YWluZXI+IHRhcmdldCkgewotICAgICAgICBpZiAodHlwZUNvbnRhaW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBjb250YWluZXIgOiB0eXBlQ29udGFpbmVycykgewotICAgICAgICAgICAgQ21pc1R5cGVDb250YWluZXIgbmV3Q29uYXRpbmVyID0gbmV3IENtaXNUeXBlQ29udGFpbmVyKCk7Ci0gICAgICAgICAgICBuZXdDb25hdGluZXIuc2V0VHlwZShjb252ZXJ0KGNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpKSk7Ci0gICAgICAgICAgICBjb252ZXJ0VHlwZUNvbnRhaW5lckxpc3QoY29udGFpbmVyLmdldENoaWxkcmVuKCksIG5ld0NvbmF0aW5lci5nZXRDaGlsZHJlbigpKTsKLSAgICAgICAgICAgIGNvbnZlcnRFeHRlbnNpb24oY29udGFpbmVyLCBuZXdDb25hdGluZXIpOwotCi0gICAgICAgICAgICB0YXJnZXQuYWRkKG5ld0NvbmF0aW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBPYmplY3RJbkZvbGRlciBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RJbkZvbGRlckRhdGEgY29udmVydChDbWlzT2JqZWN0SW5Gb2xkZXJUeXBlIG9iamVjdEluRm9sZGVyKSB7Ci0gICAgICAgIGlmIChvYmplY3RJbkZvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdEluRm9sZGVyRGF0YUltcGwgcmVzdWx0ID0gbmV3IE9iamVjdEluRm9sZGVyRGF0YUltcGwoKTsKLQotICAgICAgICByZXN1bHQuc2V0T2JqZWN0KGNvbnZlcnQob2JqZWN0SW5Gb2xkZXIuZ2V0T2JqZWN0KCkpKTsKLSAgICAgICAgcmVzdWx0LnNldFBhdGhTZWdtZW50KG9iamVjdEluRm9sZGVyLmdldFBhdGhTZWdtZW50KCkpOwotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24ob2JqZWN0SW5Gb2xkZXIsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBPYmplY3RJbkZvbGRlciBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzT2JqZWN0SW5Gb2xkZXJUeXBlIGNvbnZlcnQoT2JqZWN0SW5Gb2xkZXJEYXRhIG9iamVjdEluRm9sZGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgewotICAgICAgICBpZiAob2JqZWN0SW5Gb2xkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzT2JqZWN0SW5Gb2xkZXJUeXBlIHJlc3VsdCA9IG5ldyBDbWlzT2JqZWN0SW5Gb2xkZXJUeXBlKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChjb252ZXJ0KG9iamVjdEluRm9sZGVyLmdldE9iamVjdCgpLCBjbWlzVmVyc2lvbikpOwotICAgICAgICByZXN1bHQuc2V0UGF0aFNlZ21lbnQob2JqZWN0SW5Gb2xkZXIuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihvYmplY3RJbkZvbGRlciwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIE9iamVjdFBhcmVudCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RQYXJlbnREYXRhIGNvbnZlcnQoQ21pc09iamVjdFBhcmVudHNUeXBlIG9iamVjdFBhcmVudCkgewotICAgICAgICBpZiAob2JqZWN0UGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0UGFyZW50RGF0YUltcGwgcmVzdWx0ID0gbmV3IE9iamVjdFBhcmVudERhdGFJbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChjb252ZXJ0KG9iamVjdFBhcmVudC5nZXRPYmplY3QoKSkpOwotICAgICAgICByZXN1bHQuc2V0UmVsYXRpdmVQYXRoU2VnbWVudChvYmplY3RQYXJlbnQuZ2V0UmVsYXRpdmVQYXRoU2VnbWVudCgpKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdFBhcmVudCwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIE9iamVjdFBhcmVudCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzT2JqZWN0UGFyZW50c1R5cGUgY29udmVydChPYmplY3RQYXJlbnREYXRhIG9iamVjdFBhcmVudCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgaWYgKG9iamVjdFBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNPYmplY3RQYXJlbnRzVHlwZSByZXN1bHQgPSBuZXcgQ21pc09iamVjdFBhcmVudHNUeXBlKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChjb252ZXJ0KG9iamVjdFBhcmVudC5nZXRPYmplY3QoKSwgY21pc1ZlcnNpb24pKTsKLSAgICAgICAgcmVzdWx0LnNldFJlbGF0aXZlUGF0aFNlZ21lbnQob2JqZWN0UGFyZW50LmdldFJlbGF0aXZlUGF0aFNlZ21lbnQoKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihvYmplY3RQYXJlbnQsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBPYmplY3RJbkZvbGRlciBsaXN0IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdEluRm9sZGVyTGlzdCBjb252ZXJ0KENtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIG9iamVjdEluRm9sZGVyTGlzdCkgewotICAgICAgICBpZiAob2JqZWN0SW5Gb2xkZXJMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbCgpOwotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gb2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPigpOwotICAgICAgICBmb3IgKENtaXNPYmplY3RJbkZvbGRlclR5cGUgb2JqZWN0IDogb2JqZWN0SW5Gb2xkZXJMaXN0LmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgb2JqZWN0cy5hZGQoY29udmVydChvYmplY3QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG9iamVjdHMpOwotCi0gICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMob2JqZWN0SW5Gb2xkZXJMaXN0LmlzSGFzTW9yZUl0ZW1zKCkpOwotICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMob2JqZWN0SW5Gb2xkZXJMaXN0LmdldE51bUl0ZW1zKCkpOwotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24ob2JqZWN0SW5Gb2xkZXJMaXN0LCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gT2JqZWN0SW5Gb2xkZXIgbGlzdCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzT2JqZWN0SW5Gb2xkZXJMaXN0VHlwZSBjb252ZXJ0KE9iamVjdEluRm9sZGVyTGlzdCBvYmplY3RJbkZvbGRlckxpc3QsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChvYmplY3RJbkZvbGRlckxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzT2JqZWN0SW5Gb2xkZXJMaXN0VHlwZSByZXN1bHQgPSBuZXcgQ21pc09iamVjdEluRm9sZGVyTGlzdFR5cGUoKTsKLQotICAgICAgICBpZiAob2JqZWN0SW5Gb2xkZXJMaXN0LmdldE9iamVjdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBvYmplY3QgOiBvYmplY3RJbkZvbGRlckxpc3QuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQoY29udmVydChvYmplY3QsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKG9iamVjdEluRm9sZGVyTGlzdC5oYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhvYmplY3RJbkZvbGRlckxpc3QuZ2V0TnVtSXRlbXMoKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihvYmplY3RJbkZvbGRlckxpc3QsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBPYmplY3QgbGlzdCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RMaXN0IGNvbnZlcnQoQ21pc09iamVjdExpc3RUeXBlIG9iamVjdExpc3QpIHsKLSAgICAgICAgaWYgKG9iamVjdExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsKLQotICAgICAgICBMaXN0PE9iamVjdERhdGE+IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KCk7Ci0gICAgICAgIGZvciAoQ21pc09iamVjdFR5cGUgb2JqZWN0IDogb2JqZWN0TGlzdC5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgIG9iamVjdHMuYWRkKGNvbnZlcnQob2JqZWN0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0T2JqZWN0cyhvYmplY3RzKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhvYmplY3RMaXN0LmlzSGFzTW9yZUl0ZW1zKCkpOwotICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMob2JqZWN0TGlzdC5nZXROdW1JdGVtcygpKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdExpc3QsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBPYmplY3QgbGlzdCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzT2JqZWN0TGlzdFR5cGUgY29udmVydChPYmplY3RMaXN0IG9iamVjdExpc3QsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChvYmplY3RMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc09iamVjdExpc3RUeXBlIHJlc3VsdCA9IG5ldyBDbWlzT2JqZWN0TGlzdFR5cGUoKTsKLQotICAgICAgICBpZiAob2JqZWN0TGlzdC5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IG9iamVjdExpc3QuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQoY29udmVydChvYmplY3QsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKG9iamVjdExpc3QuaGFzTW9yZUl0ZW1zKCkpOwotICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMob2JqZWN0TGlzdC5nZXROdW1JdGVtcygpKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdExpc3QsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBPYmplY3RJbkZvbGRlciBjb250YWluZXIgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgY29udmVydChDbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIGNvbnRhaW5lcikgewotICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwoKTsKLQotICAgICAgICByZXN1bHQuc2V0T2JqZWN0KGNvbnZlcnQoY29udGFpbmVyLmdldE9iamVjdEluRm9sZGVyKCkpKTsKLQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBjb250YWluZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIGNvbnRhaW5lckNoaWxkIDogY29udGFpbmVyLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIGNvbnRhaW5lckxpc3QuYWRkKGNvbnZlcnQoY29udGFpbmVyQ2hpbGQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRDaGlsZHJlbihjb250YWluZXJMaXN0KTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGNvbnRhaW5lciwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIE9iamVjdEluRm9sZGVyIGNvbnRhaW5lciBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIGNvbnZlcnQoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgY29udGFpbmVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgewotICAgICAgICBpZiAoY29udGFpbmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSByZXN1bHQgPSBuZXcgQ21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRPYmplY3RJbkZvbGRlcihjb252ZXJ0KGNvbnRhaW5lci5nZXRPYmplY3QoKSwgY21pc1ZlcnNpb24pKTsKLQotICAgICAgICBpZiAoY29udGFpbmVyLmdldENoaWxkcmVuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckNvbnRhaW5lciBjaGlsZCA6IGNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmdldENoaWxkcmVuKCkuYWRkKGNvbnZlcnQoY2hpbGQsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGNvbnRhaW5lciwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIGFjY2VzcyBjb250cm9sIGxpc3Qgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQWNsIGNvbnZlcnQoQ21pc0FDTFR5cGUgYWNsKSB7Ci0gICAgICAgIGlmIChhY2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBY2wgcmVzdWx0ID0gY29udmVydChhY2wuZ2V0QUNMKCksIGFjbC5pc0V4YWN0KCkpOwotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oYWNsLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBGYWlsZWRUb0RlbGV0ZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGYWlsZWRUb0RlbGV0ZURhdGEgY29udmVydChEZWxldGVUcmVlUmVzcG9uc2UuRmFpbGVkVG9EZWxldGUgZmFpbGVkVG9EZWxldGUpIHsKLSAgICAgICAgaWYgKGZhaWxlZFRvRGVsZXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCByZXN1bHQgPSBuZXcgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRJZHMoZmFpbGVkVG9EZWxldGUuZ2V0T2JqZWN0SWRzKCkpOwotCi0gICAgICAgIC8vIGhhbmRsZSBleHRlbnNpb25zCi0gICAgICAgIGNvbnZlcnRFeHRlbnNpb24oZmFpbGVkVG9EZWxldGUsIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIEZhaWxlZFRvRGVsZXRlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERlbGV0ZVRyZWVSZXNwb25zZS5GYWlsZWRUb0RlbGV0ZSBjb252ZXJ0KEZhaWxlZFRvRGVsZXRlRGF0YSBmYWlsZWRUb0RlbGV0ZSkgewotICAgICAgICBpZiAoZmFpbGVkVG9EZWxldGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBEZWxldGVUcmVlUmVzcG9uc2UuRmFpbGVkVG9EZWxldGUgcmVzdWx0ID0gbmV3IERlbGV0ZVRyZWVSZXNwb25zZS5GYWlsZWRUb0RlbGV0ZSgpOwotCi0gICAgICAgIGlmIChmYWlsZWRUb0RlbGV0ZS5nZXRJZHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGZhaWxlZFRvRGVsZXRlLmdldElkcygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdElkcygpLmFkZChpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGZhaWxlZFRvRGVsZXRlLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBTdHJlYW0gLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBjb250ZW50IHN0cmVhbSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb250ZW50U3RyZWFtIGNvbnZlcnQoQ21pc0NvbnRlbnRTdHJlYW1UeXBlIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gcGFydGlhbCkgewotICAgICAgICBpZiAoY29udGVudFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRlbnRTdHJlYW1JbXBsIHJlc3VsdDsKLSAgICAgICAgaWYgKHBhcnRpYWwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQYXJ0aWFsQ29udGVudFN0cmVhbUltcGwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDb250ZW50U3RyZWFtSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldEZpbGVOYW1lKGNvbnRlbnRTdHJlYW0uZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMZW5ndGgoY29udGVudFN0cmVhbS5nZXRMZW5ndGgoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRNaW1lVHlwZShjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkpOwotCi0gICAgICAgIERhdGFIYW5kbGVyIHN0cmVhbURhdGFIYW5kbGVyID0gY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKTsKLSAgICAgICAgaWYgKHN0cmVhbURhdGFIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbURhdGFIYW5kbGVyQ2xhc3MxICE9IG51bGwgJiYgc3RyZWFtRGF0YUhhbmRsZXJDbGFzczEuaXNJbnN0YW5jZShzdHJlYW1EYXRhSGFuZGxlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFN0cmVhbSgoSW5wdXRTdHJlYW0pIHN0cmVhbURhdGFIYW5kbGVyUmVhZE1ldGhvZDEuaW52b2tlKHN0cmVhbURhdGFIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtRGF0YUhhbmRsZXJDbGFzczIgIT0gbnVsbCAmJiBzdHJlYW1EYXRhSGFuZGxlckNsYXNzMi5pc0luc3RhbmNlKHN0cmVhbURhdGFIYW5kbGVyKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0U3RyZWFtKChJbnB1dFN0cmVhbSkgc3RyZWFtRGF0YUhhbmRsZXJSZWFkTWV0aG9kMi5pbnZva2Uoc3RyZWFtRGF0YUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9iamVjdFtdKSBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldFN0cmVhbShjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IHRoZSBzdHJlYW06ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKGNvbnRlbnRTdHJlYW0sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VTdHJlYW0oQ21pc0NvbnRlbnRTdHJlYW1UeXBlIGNvbnRlbnRTdHJlYW0pIHsKLSAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRGF0YUhhbmRsZXIgc3RyZWFtRGF0YUhhbmRsZXIgPSBjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpOwotCi0gICAgICAgIGlmIChzdHJlYW1EYXRhSGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzdHJlYW1EYXRhSGFuZGxlciBpbnN0YW5jZW9mIENsb3NlYWJsZSkgewotICAgICAgICAgICAgICAgICAgICAoKENsb3NlYWJsZSkgc3RyZWFtRGF0YUhhbmRsZXIpLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbURhdGFIYW5kbGVyQ2xhc3MxICE9IG51bGwgJiYgc3RyZWFtRGF0YUhhbmRsZXJDbGFzczEuaXNJbnN0YW5jZShzdHJlYW1EYXRhSGFuZGxlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGFIYW5kbGVyQ2xvc2VNZXRob2QxLmludm9rZShzdHJlYW1EYXRhSGFuZGxlciwgKE9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1EYXRhSGFuZGxlckNsYXNzMiAhPSBudWxsICYmIHN0cmVhbURhdGFIYW5kbGVyQ2xhc3MyLmlzSW5zdGFuY2Uoc3RyZWFtRGF0YUhhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EYXRhSGFuZGxlckNsb3NlTWV0aG9kMi5pbnZva2Uoc3RyZWFtRGF0YUhhbmRsZXIsIChPYmplY3RbXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNsb3NpbmcgdGhlIHN0cmVhbSBmYWlsZWQ6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBjb250ZW50IHN0cmVhbSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzQ29udGVudFN0cmVhbVR5cGUgY29udmVydChmaW5hbCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGZpbmFsIGJvb2xlYW4gYWxsb3dDbG9zZSkgewotICAgICAgICBpZiAoY29udGVudFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNDb250ZW50U3RyZWFtVHlwZSByZXN1bHQgPSBuZXcgQ21pc0NvbnRlbnRTdHJlYW1UeXBlKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldEZpbGVuYW1lKGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMZW5ndGgoY29udGVudFN0cmVhbS5nZXRCaWdMZW5ndGgoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRNaW1lVHlwZShjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkpOwotCi0gICAgICAgIElucHV0U3RyZWFtIGluID0gY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKTsKLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtOwotCi0gICAgICAgIC8vIGF2b2lkIGRvdWJsZSBidWZmZXJpbmcKLSAgICAgICAgaWYgKCEoaW4gaW5zdGFuY2VvZiBCdWZmZXJlZElucHV0U3RyZWFtKSAmJiAhKGluIGluc3RhbmNlb2YgQnl0ZUFycmF5SW5wdXRTdHJlYW0pKSB7Ci0gICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbiwgQlVGRkVSX1NJWkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RyZWFtID0gaW47Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0U3RyZWFtKG5ldyBEYXRhSGFuZGxlcihuZXcgRGF0YVNvdXJjZSgpIHsKLQotICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dDbG9zZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVySW5wdXRTdHJlYW0oc3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGNsb3NpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBCdWxrIHVwZGF0ZSAtLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBidWxrIHVwZGF0ZSBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc0J1bGtVcGRhdGVUeXBlIGNvbnZlcnQoTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbnMsCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlSWRzLCBMaXN0PFN0cmluZz4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcykgewotICAgICAgICBpZiAob2JqZWN0SWRBbmRDaGFuZ2VUb2tlbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzQnVsa1VwZGF0ZVR5cGUgcmVzdWx0ID0gbmV3IENtaXNCdWxrVXBkYXRlVHlwZSgpOwotCi0gICAgICAgIGZvciAoQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4gaWRBbmRUb2tlbiA6IG9iamVjdElkQW5kQ2hhbmdlVG9rZW5zKSB7Ci0gICAgICAgICAgICByZXN1bHQuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpLmFkZChjb252ZXJ0KGlkQW5kVG9rZW4pKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0UHJvcGVydGllcyhjb252ZXJ0KHByb3BlcnRpZXMpKTsKLSAgICAgICAgaWYgKGFkZFNlY29uZGFyeVR5cGVJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LmdldEFkZFNlY29uZGFyeVR5cGVJZHMoKS5hZGRBbGwoYWRkU2Vjb25kYXJ5VHlwZUlkcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlbW92ZVNlY29uZGFyeVR5cGVJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LmdldFJlbW92ZVNlY29uZGFyeVR5cGVJZHMoKS5hZGRBbGwocmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGJ1bGsgdXBkYXRlIG9iamVjdCBpZCBhbmQgY2hhbmdlIHRva2VuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlIGNvbnZlcnQoQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4gb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbikgewotICAgICAgICBpZiAob2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZSByZXN1bHQgPSBuZXcgQ21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldElkKG9iamVjdElkQW5kQ2hhbmdlVG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXROZXdJZChvYmplY3RJZEFuZENoYW5nZVRva2VuLmdldE5ld0lkKCkpOwotICAgICAgICByZXN1bHQuc2V0Q2hhbmdlVG9rZW4ob2JqZWN0SWRBbmRDaGFuZ2VUb2tlbi5nZXRDaGFuZ2VUb2tlbigpKTsKLQotICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucwotICAgICAgICBjb252ZXJ0RXh0ZW5zaW9uKG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIHJlc3VsdCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBidWxrIHVwZGF0ZSBvYmplY3QgaWQgYW5kIGNoYW5nZSB0b2tlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuIGNvbnZlcnQoQ21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlIG9iamVjdElkQW5kQ2hhbmdlVG9rZW4pIHsKLSAgICAgICAgaWYgKG9iamVjdElkQW5kQ2hhbmdlVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwgcmVzdWx0ID0gbmV3IEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbCgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRJZChvYmplY3RJZEFuZENoYW5nZVRva2VuLmdldElkKCkpOwotICAgICAgICByZXN1bHQuc2V0TmV3SWQob2JqZWN0SWRBbmRDaGFuZ2VUb2tlbi5nZXROZXdJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldENoYW5nZVRva2VuKG9iamVjdElkQW5kQ2hhbmdlVG9rZW4uZ2V0Q2hhbmdlVG9rZW4oKSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGV4dGVuc2lvbnMKLSAgICAgICAgY29udmVydEV4dGVuc2lvbihvYmplY3RJZEFuZENoYW5nZVRva2VuLCByZXN1bHQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBFeHRlbnNpb25zIGFuZCBob2xkZXJzIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgYmluZGluZyBleHRlbnNpb24gaW50byBhIFdlYiBTZXJ2aWNlcyBleHRlbnNpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbWlzRXh0ZW5zaW9uVHlwZSBjb252ZXJ0KEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc0V4dGVuc2lvblR5cGUgcmVzdWx0ID0gbmV3IENtaXNFeHRlbnNpb25UeXBlKCk7Ci0KLSAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRFeHRlbnNpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBleHQgOiBleHRlbnNpb24uZ2V0RXh0ZW5zaW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmdldEFueSgpLmFkZChjb252ZXJ0Q21pc0V4dGVuc2lvbkVsZW1lbnRUb05vZGUoZXh0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgYmluZGluZyBleHRlbnNpb24gaW50byBhIFdlYiBTZXJ2aWNlcyBleHRlbnNpb24gaG9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgamF2YXgueG1sLndzLkhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gY29udmVydEV4dGVuc2lvbkhvbGRlcihFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IHJlc3VsdCA9IG5ldyBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPigpOwotICAgICAgICByZXN1bHQudmFsdWUgPSBjb252ZXJ0KGV4dGVuc2lvbik7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBob2xkZXIgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dGVuc2lvblZhbHVlcyhqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBzb3VyY2UsIEV4dGVuc2lvbnNEYXRhIHRhcmdldCkgewotICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXQuc2V0RXh0ZW5zaW9ucyhudWxsKTsKLQotICAgICAgICBpZiAoKHNvdXJjZSA9PSBudWxsKSB8fCAoc291cmNlLnZhbHVlID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4oKTsKLSAgICAgICAgdGFyZ2V0LnNldEV4dGVuc2lvbnMobGlzdCk7Ci0KLSAgICAgICAgaWYgKCFzb3VyY2UudmFsdWUuZ2V0QW55KCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBzb3VyY2UudmFsdWUuZ2V0QW55KCkpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChjb252ZXJ0RG9tVG9DbWlzRXh0ZW5zaW9uRWxlbWVudChvYmopKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgV2ViIFNlcnZpY2VzIGV4dGVuc2lvbiBleHRlbnNpb24gaW50byBhIGJpbmRpbmcgaG9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uc0RhdGEgY29udmVydEV4dGVuc2lvbkhvbGRlcihqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0KGV4dGVuc2lvbi52YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgaG9sZGVyIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbnNpb25WYWx1ZXMoRXh0ZW5zaW9uc0RhdGEgc291cmNlLCBqYXZheC54bWwud3MuSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiB0YXJnZXQpIHsKLSAgICAgICAgaWYgKCh0YXJnZXQgPT0gbnVsbCkgfHwgKHRhcmdldC52YWx1ZSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRhcmdldC52YWx1ZS5nZXRBbnkoKS5jbGVhcigpOwotCi0gICAgICAgIGlmICgoc291cmNlID09IG51bGwpIHx8IChzb3VyY2UuZ2V0RXh0ZW5zaW9ucygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmdldEV4dGVuc2lvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNFeHRlbnNpb25FbGVtZW50IGV4dCA6IHNvdXJjZS5nZXRFeHRlbnNpb25zKCkpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXQudmFsdWUuZ2V0QW55KCkuYWRkKGNvbnZlcnRDbWlzRXh0ZW5zaW9uRWxlbWVudFRvTm9kZShleHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgaG9sZGVyIGludG8gYSBXUyBob2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gamF2YXgueG1sLndzLkhvbGRlcjxUPiBjb252ZXJ0SG9sZGVyKEhvbGRlcjxUPiBvcmdIb2xkZXIpIHsKLSAgICAgICAgaWYgKG9yZ0hvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8VD4gcmVzdWx0ID0gbmV3IGphdmF4LnhtbC53cy5Ib2xkZXI8VD4oKTsKLSAgICAgICAgcmVzdWx0LnZhbHVlID0gb3JnSG9sZGVyLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIFdTIGhvbGRlciBpbnRvIGEgaG9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEhvbGRlcjxUPiBjb252ZXJ0SG9sZGVyKGphdmF4LnhtbC53cy5Ib2xkZXI8VD4gb3JnSG9sZGVyKSB7Ci0gICAgICAgIGlmIChvcmdIb2xkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBIb2xkZXI8VD4gcmVzdWx0ID0gbmV3IEhvbGRlcjxUPigpOwotICAgICAgICByZXN1bHQuc2V0VmFsdWUob3JnSG9sZGVyLnZhbHVlKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyBhIGhvbGRlciB2YWx1ZSBmb3IgYSBXUyBob2xkZXIgdG8gYSBob2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gdm9pZCBzZXRIb2xkZXJWYWx1ZShqYXZheC54bWwud3MuSG9sZGVyPFQ+IHNvdXJjZSwgSG9sZGVyPFQ+IHRhcmdldCkgewotICAgICAgICBpZiAoKHNvdXJjZSA9PSBudWxsKSB8fCAodGFyZ2V0ID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0YXJnZXQuc2V0VmFsdWUoc291cmNlLnZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgYSBob2xkZXIgdmFsdWUgZm9yIGEgaG9sZGVyIHRvIGEgV1MgaG9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgc2V0SG9sZGVyVmFsdWUoSG9sZGVyPFQ+IHNvdXJjZSwgamF2YXgueG1sLndzLkhvbGRlcjxUPiB0YXJnZXQpIHsKLSAgICAgICAgaWYgKChzb3VyY2UgPT0gbnVsbCkgfHwgKHRhcmdldCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFyZ2V0LnZhbHVlID0gc291cmNlLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRFeHRlbnNpb24oT2JqZWN0IHNvdXJjZSwgRXh0ZW5zaW9uc0RhdGEgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBtID0gc291cmNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRBbnkiLCBuZXcgQ2xhc3M8Pz5bMF0pOwotICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSAoTGlzdDxPYmplY3Q+KSBtLmludm9rZShzb3VyY2UsIG5ldyBPYmplY3RbMF0pOwotCi0gICAgICAgICAgICBpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogbGlzdCkgewotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFkZChjb252ZXJ0RG9tVG9DbWlzRXh0ZW5zaW9uRWxlbWVudChvYmopKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0LnNldEV4dGVuc2lvbnMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRFeHRlbnNpb24oRXh0ZW5zaW9uc0RhdGEgc291cmNlLCBPYmplY3QgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBtID0gdGFyZ2V0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRBbnkiLCBuZXcgQ2xhc3M8Pz5bMF0pOwotICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSAoTGlzdDxPYmplY3Q+KSBtLmludm9rZSh0YXJnZXQsIG5ldyBPYmplY3RbMF0pOwotCi0gICAgICAgICAgICBsaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAoc291cmNlLmdldEV4dGVuc2lvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBleHQgOiBzb3VyY2UuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbnZlcnRDbWlzRXh0ZW5zaW9uRWxlbWVudFRvTm9kZShleHQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gZXh0ZW5zaW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvbnNEYXRhIGNvbnZlcnQoQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBFeHRlbnNpb25EYXRhSW1wbCByZXN1bHQgPSBuZXcgRXh0ZW5zaW9uRGF0YUltcGwoKTsKLSAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0gICAgICAgIHJlc3VsdC5zZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCi0gICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IGV4dGVuc2lvbi5nZXRBbnkoKSkgewotICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGQoY29udmVydERvbVRvQ21pc0V4dGVuc2lvbkVsZW1lbnQob2JqKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgRE9NIG5vZGUgdG8gYSBDTUlTIGV4dGVuc2lvbiBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ21pc0V4dGVuc2lvbkVsZW1lbnQgY29udmVydERvbVRvQ21pc0V4dGVuc2lvbkVsZW1lbnQoT2JqZWN0IHNvdXJjZSkgewotICAgICAgICAvLyBpZiBpdCdzIG5vdCBhIE5vZGUsIHNraXAgaXQKLSAgICAgICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgTm9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIHNvdXJjZTsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IG5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgIENtaXNFeHRlbnNpb25FbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGNtaXNDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQotICAgICAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICBDbWlzRXh0ZW5zaW9uRWxlbWVudCBjbWlzQ2hpbGQgPSBjb252ZXJ0RG9tVG9DbWlzRXh0ZW5zaW9uRWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNtaXNDaGlsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNtaXNDaGlsZHJlbi5hZGQoY21pc0NoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJ1dGVzID0gbnVsbDsKLSAgICAgICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIE5vZGUgYXR0ck5vZGUgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5pdGVtKGkpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lc3BhY2UgPSBhdHRyTm9kZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZXNwYWNlID09IG51bGwgfHwgYXR0ck5hbWVzcGFjZS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChhdHRyTm9kZS5nZXRMb2NhbE5hbWUoKSwgYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbWlzQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcywgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcywgY21pc0NoaWxkcmVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBDTUlTIGV4dGVuc2lvbiBlbGVtZW50IHRvIGEgRE9NIG5vZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9kZSBjb252ZXJ0Q21pc0V4dGVuc2lvbkVsZW1lbnRUb05vZGUoQ21pc0V4dGVuc2lvbkVsZW1lbnQgc291cmNlKSB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb2MgPSBYTUxVdGlscy5uZXdEb21Eb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNvbnZlcnQgZXh0ZW5zaW9ucyEiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgICAgICAgKHNvdXJjZS5nZXROYW1lc3BhY2UoKSA9PSBudWxsID8gREVGQVVMVF9FWFRFTlNJT05fTlMgOiBzb3VyY2UuZ2V0TmFtZXNwYWNlKCkpLCBzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3QpOwotCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZShzb3VyY2UuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBjaGlsZCA6IHNvdXJjZS5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChjb252ZXJ0Q21pc0V4dGVuc2lvbkVsZW1lbnRUb05vZGUoY2hpbGQsIHJvb3QsIGRvYykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IGF0dHJpYnV0ZXMKLSAgICAgICAgaWYgKHNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICByb290LnNldEF0dHJpYnV0ZU5TKChzb3VyY2UuZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCA/IERFRkFVTFRfRVhURU5TSU9OX05TIDogc291cmNlLmdldE5hbWVzcGFjZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIENNSVMgZXh0ZW5zaW9uIGVsZW1lbnQgdG8gYSBET00gbm9kZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGNvbnZlcnRDbWlzRXh0ZW5zaW9uRWxlbWVudFRvTm9kZShDbWlzRXh0ZW5zaW9uRWxlbWVudCBzb3VyY2UsIEVsZW1lbnQgcGFyZW50LCBEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgICAgICAgKHNvdXJjZS5nZXROYW1lc3BhY2UoKSA9PSBudWxsID8gREVGQVVMVF9FWFRFTlNJT05fTlMgOiBzb3VyY2UuZ2V0TmFtZXNwYWNlKCkpLCBzb3VyY2UuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoc291cmNlLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoc291cmNlLmdldFZhbHVlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoQ21pc0V4dGVuc2lvbkVsZW1lbnQgY2hpbGQgOiBzb3VyY2UuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udmVydENtaXNFeHRlbnNpb25FbGVtZW50VG9Ob2RlKGNoaWxkLCBlbGVtZW50LCBkb2MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogc291cmNlLmdldEF0dHJpYnV0ZXMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUygoc291cmNlLmdldE5hbWVzcGFjZSgpID09IG51bGwgPyBERUZBVUxUX0VYVEVOU0lPTl9OUyA6IHNvdXJjZS5nZXROYW1lc3BhY2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb252ZXJ0Qm9vbGVhbihCb29sZWFuIHZhbHVlLCBib29sZWFuIGRlZikgewotICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwgPyBkZWYgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBFbnVtcyAtLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhbiBFbnVtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBUIGNvbnZlcnQoQ2xhc3M8VD4gZGVzdENsYXNzLCBFbnVtPD8+IHNvdXJjZSkgewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEVudW0udmFsdWVPZihkZXN0Q2xhc3MsIHNvdXJjZS5uYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MQ29uc3RhbnRzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjFhNmUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIlBNRC5Bdm9pZER1cGxpY2F0ZUxpdGVyYWxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBYTUxDb25zdGFudHMoKSB7Ci0gICAgfQotCi0gICAgLy8gbmFtZXNwYWNlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9DTUlTID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRPTSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9BUFAgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNy9hcHAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9SRVNUQVRPTSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3Jlc3RhdG9tLzIwMDkwOC8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9YU0kgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9BUEFDSEVfQ0hFTUlTVFJZID0gImh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy8iOwotCi0gICAgLy8gcHJlZml4ZXMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfWFNJID0gInhzaSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0FUT00gPSAiYXRvbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0FQUCA9ICJhcHAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9DTUlTID0gImNtaXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9SRVNUQVRPTSA9ICJjbWlzcmEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9BUEFDSEVfQ0hFTUlTVFkgPSAiY2hlbWlzdHJ5IjsKLQotICAgIC8vIHRhZ3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQT1NJVE9SWV9JTkZPID0gInJlcG9zaXRvcnlJbmZvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX0lEID0gInJlcG9zaXRvcnlJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fTkFNRSA9ICJyZXBvc2l0b3J5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fREVTQ1JJUFRJT04gPSAicmVwb3NpdG9yeURlc2NyaXB0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19WRU5ET1IgPSAidmVuZG9yTmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fUFJPRFVDVCA9ICJwcm9kdWN0TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fUFJPRFVDVF9WRVJTSU9OID0gInByb2R1Y3RWZXJzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19ST09UX0ZPTERFUl9JRCA9ICJyb290Rm9sZGVySWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX0NBUEFCSUxJVElFUyA9ICJjYXBhYmlsaXRpZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX0FDTF9DQVBBQklMSVRJRVMgPSAiYWNsQ2FwYWJpbGl0eSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fQ0hBTkdFX0xPR19UT0tFTiA9ICJsYXRlc3RDaGFuZ2VMb2dUb2tlbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fQ01JU19WRVJTSU9OX1NVUFBPUlRFRCA9ICJjbWlzVmVyc2lvblN1cHBvcnRlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fVEhJTl9DTElFTlRfVVJJID0gInRoaW5DbGllbnRVUkkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX0NIQU5HRVNfSU5DT01QTEVURSA9ICJjaGFuZ2VzSW5jb21wbGV0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fQ0hBTkdFU19PTl9UWVBFID0gImNoYW5nZXNPblR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBJTkZPX1BSSU5DSVBBTF9JRF9BTk9OWU1PVVMgPSAicHJpbmNpcGFsQW5vbnltb3VzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVQSU5GT19QUklOQ0lQQUxfSURfQU5ZT05FID0gInByaW5jaXBhbEFueW9uZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFUElORk9fRVhURU5ERURfRkVBVFVSRVMgPSAiZXh0ZW5kZWRGZWF0dXJlcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX0NPTlRFTlRfU1RSRUFNX1VQREFUQUJJTElUWSA9ICJjYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0YWJpbGl0eSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9DSEFOR0VTID0gImNhcGFiaWxpdHlDaGFuZ2VzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX1JFTkRJVElPTlMgPSAiY2FwYWJpbGl0eVJlbmRpdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfR0VUX0RFU0NFTkRBTlRTID0gImNhcGFiaWxpdHlHZXREZXNjZW5kYW50cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9HRVRfRk9MREVSX1RSRUUgPSAiY2FwYWJpbGl0eUdldEZvbGRlclRyZWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfTVVMVElGSUxJTkcgPSAiY2FwYWJpbGl0eU11bHRpZmlsaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX1VORklMSU5HID0gImNhcGFiaWxpdHlVbmZpbGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9WRVJTSU9OX1NQRUNJRklDX0ZJTElORyA9ICJjYXBhYmlsaXR5VmVyc2lvblNwZWNpZmljRmlsaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX1BXQ19TRUFSQ0hBQkxFID0gImNhcGFiaWxpdHlQV0NTZWFyY2hhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX1BXQ19VUERBVEFCTEUgPSAiY2FwYWJpbGl0eVBXQ1VwZGF0YWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9BTExfVkVSU0lPTlNfU0VBUkNIQUJMRSA9ICJjYXBhYmlsaXR5QWxsVmVyc2lvbnNTZWFyY2hhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX09SREVSX0JZID0gImNhcGFiaWxpdHlPcmRlckJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX1FVRVJZID0gImNhcGFiaWxpdHlRdWVyeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9KT0lOID0gImNhcGFiaWxpdHlKb2luIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX0FDTCA9ICJjYXBhYmlsaXR5QUNMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX0NSRUFUQUJMRV9QUk9QRVJUWV9UWVBFUyA9ICJjYXBhYmlsaXR5Q3JlYXRhYmxlUHJvcGVydHlUeXBlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTID0gImNhcGFiaWxpdHlOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfQ1JFQVRBQkxFX1BST1BFUlRZX1RZUEVTX0NBTkNSRUFURSA9ICJjYW5DcmVhdGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lEID0gImlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfTE9DQUxOQU1FID0gImxvY2FsTmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0xPQ0FMTkFNRVNQQUNFID0gImxvY2FsTmFtZXNwYWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRElTUExBWU5BTUUgPSAiZGlzcGxheU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19RVUVSWU5BTUUgPSAicXVlcnlOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DUkVBVEVBQkxFID0gImNyZWF0YWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0ZJTEVBQkxFID0gImZpbGVhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfUVVFUllBQkxFID0gInF1ZXJ5YWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0ZVTExURVhUSU5ERVhFRCA9ICJmdWxsdGV4dEluZGV4ZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19JTkNMVURFRElOU1VQRVJUWVRQRVFVRVJZID0gImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFUE9MSUNZID0gImNvbnRyb2xsYWJsZVBvbGljeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFQUNMID0gImNvbnRyb2xsYWJsZUFDTCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNMQ0FQX1NVUFBPUlRFRF9QRVJNSVNTSU9OUyA9ICJzdXBwb3J0ZWRQZXJtaXNzaW9ucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDTENBUF9BQ0xfUFJPUEFHQVRJT04gPSAicHJvcGFnYXRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xDQVBfUEVSTUlTU0lPTlMgPSAicGVybWlzc2lvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xDQVBfUEVSTUlTU0lPTl9NQVBQSU5HID0gIm1hcHBpbmciOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDTENBUF9QRVJNSVNTSU9OX1BFUk1JU1NJT04gPSAicGVybWlzc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDTENBUF9QRVJNSVNTSU9OX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xDQVBfTUFQUElOR19LRVkgPSAia2V5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNMQ0FQX01BUFBJTkdfUEVSTUlTU0lPTiA9ICJwZXJtaXNzaW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GRUFUVVJFX0lEID0gImlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRkVBVFVSRV9VUkwgPSAidXJsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRkVBVFVSRV9DT01NT05fTkFNRSA9ICJjb21tb25OYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRkVBVFVSRV9WRVJTSU9OX0xBQkVMID0gInZlcnNpb25MYWJlbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZFQVRVUkVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19GRUFUVVJFX0RBVEEgPSAiZmVhdHVyZURhdGEiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0ZFQVRVUkVfREFUQV9LRVkgPSAia2V5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRkVBVFVSRV9EQVRBX1ZBTFVFID0gInZhbHVlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1QgPSAib2JqZWN0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT0JKRUNUX0FMTE9XQUJMRV9BQ1RJT05TID0gImFsbG93YWJsZUFjdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfUkVMQVRJT05TSElQID0gInJlbGF0aW9uc2hpcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09CSkVDVF9DSEFOR0VfRVZFTlRfSU5GTyA9ICJjaGFuZ2VFdmVudEluZm8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfQUNMID0gImFjbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09CSkVDVF9FWEFDVF9BQ0wgPSAiZXhhY3RBQ0wiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfUE9MSUNZX0lEUyA9ICJwb2xpY3lJZHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1RfUkVORElUSU9OID0gInJlbmRpdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPUF9CT09MRUFOID0gInByb3BlcnR5Qm9vbGVhbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BfSUQgPSAicHJvcGVydHlJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BfSU5URUdFUiA9ICJwcm9wZXJ0eUludGVnZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QX0RBVEVUSU1FID0gInByb3BlcnR5RGF0ZVRpbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QX0RFQ0lNQUwgPSAicHJvcGVydHlEZWNpbWFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPUF9IVE1MID0gInByb3BlcnR5SHRtbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BfU1RSSU5HID0gInByb3BlcnR5U3RyaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPUF9VUkkgPSAicHJvcGVydHlVcmkiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NIQU5HRV9FVkVOVF9UWVBFID0gImNoYW5nZVR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DSEFOR0VfRVZFTlRfVElNRSA9ICJjaGFuZ2VUaW1lIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xfUEVSTUlTU0lTT05TID0gInBlcm1pc3Npb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BQ0xfSVNfRVhBQ1QgPSAicGVybWlzc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDRV9QUklOQ0lQQUwgPSAicHJpbmNpcGFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNFX1BSSU5DSVBBTF9JRCA9ICJwcmluY2lwYWxJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDRV9QRVJNSVNTSU9OUyA9ICJwZXJtaXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQUNFX0lTX0RJUkVDVCA9ICJkaXJlY3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BPTElDWV9JRCA9ICJpZCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVORElUSU9OX1NUUkVBTV9JRCA9ICJzdHJlYW1JZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9NSU1FVFlQRSA9ICJtaW1ldHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9MRU5HVEggPSAibGVuZ3RoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVORElUSU9OX0tJTkQgPSAia2luZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9USVRMRSA9ICJ0aXRsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1JFTkRJVElPTl9IRUlHSFQgPSAiaGVpZ2h0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVORElUSU9OX1dJRFRIID0gIndpZHRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUkVORElUSU9OX0RPQ1VNRU5UX0lEID0gInJlbmRpdGlvbkRvY3VtZW50SWQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9JRCA9ICJwcm9wZXJ0eURlZmluaXRpb25JZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUk9QRVJUWV9MT0NBTE5BTUUgPSAibG9jYWxOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX0RJU1BMQVlOQU1FID0gImRpc3BsYXlOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1BFUlRZX1FVRVJZTkFNRSA9ICJxdWVyeU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9WQUxVRSA9ICJ2YWx1ZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRSA9ICJ0eXBlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRE9DVU1FTlRfVFlQRSA9ICJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRk9MREVSX1RZUEUgPSAiY21pc1R5cGVGb2xkZXJEZWZpbml0aW9uVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SRUxBVElPTlNISVBfVFlQRSA9ICJjbWlzVHlwZVJlbGF0aW9uc2hpcERlZmluaXRpb25UeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BPTElDWV9UWVBFID0gImNtaXNUeXBlUG9saWN5RGVmaW5pdGlvblR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSVRFTV9UWVBFID0gImNtaXNUeXBlSXRlbURlZmluaXRpb25UeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NFQ09OREFSWV9UWVBFID0gImNtaXNUeXBlU2Vjb25kYXJ5RGVmaW5pdGlvblR5cGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfSUQgPSAiaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX0xPQ0FMTkFNRSA9ICJsb2NhbE5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX0xPQ0FMTkFNRVNQQUNFID0gImxvY2FsTmFtZXNwYWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9ESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfUVVFUllOQU1FID0gInF1ZXJ5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX0JBU0VfSUQgPSAiYmFzZUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9QQVJFTlRfSUQgPSAicGFyZW50SWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX0NSRUFUQUJMRSA9ICJjcmVhdGFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX0ZJTEVBQkxFID0gImZpbGVhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9RVUVSWUFCTEUgPSAicXVlcnlhYmxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9GVUxMVEVYVF9JTkRFWEVEID0gImZ1bGx0ZXh0SW5kZXhlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfSU5DTFVERV9JTl9TVVBFUlRZUEVfUVVFUlkgPSAiaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9DT05UUk9MQUJMRV9QT0xJQ1kgPSAiY29udHJvbGxhYmxlUG9saWN5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9DT05UUk9MQUJMRV9BQ0wgPSAiY29udHJvbGxhYmxlQUNMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9UWVBFX01VVEFCSUxJVFkgPSAidHlwZU11dGFiaWxpdHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX1ZFUlNJT05BQkxFID0gInZlcnNpb25hYmxlIjsgLy8gZG9jdW1lbnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9DT05URU5UU1RSRUFNX0FMTE9XRUQgPSAiY29udGVudFN0cmVhbUFsbG93ZWQiOyAvLyBkb2N1bWVudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX0FMTE9XRURfU09VUkNFX1RZUEVTID0gImFsbG93ZWRTb3VyY2VUeXBlcyI7IC8vIHJlbGF0aW9uc2hpcAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX0FMTE9XRURfVEFSR0VUX1RZUEVTID0gImFsbG93ZWRUYXJnZXRUeXBlcyI7IC8vIHJlbGF0aW9uc2hpcAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfUFJPUF9ERUZfQk9PTEVBTiA9ICJwcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9QUk9QX0RFRl9EQVRFVElNRSA9ICJwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfUFJPUF9ERUZfREVDSU1BTCA9ICJwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9QUk9QX0RFRl9JRCA9ICJwcm9wZXJ0eUlkRGVmaW5pdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfUFJPUF9ERUZfSU5URUdFUiA9ICJwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9QUk9QX0RFRl9IVE1MID0gInByb3BlcnR5SHRtbERlZmluaXRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX1BST1BfREVGX1NUUklORyA9ICJwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX1BST1BfREVGX1VSSSA9ICJwcm9wZXJ0eVVyaURlZmluaXRpb24iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfSUQgPSAiaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX0xPQ0FMTkFNRSA9ICJsb2NhbE5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX0xPQ0FMTkFNRVNQQUNFID0gImxvY2FsTmFtZXNwYWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPUEVSVFlfVFlQRV9ESVNQTEFZTkFNRSA9ICJkaXNwbGF5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfUVVFUllOQU1FID0gInF1ZXJ5TmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX1BST1BFUlRZX1RZUEUgPSAicHJvcGVydHlUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPUEVSVFlfVFlQRV9DQVJESU5BTElUWSA9ICJjYXJkaW5hbGl0eSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfVVBEQVRBQklMSVRZID0gInVwZGF0YWJpbGl0eSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfSU5IRVJJVEVEID0gImluaGVyaXRlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX1FVRVJZQUJMRSA9ICJxdWVyeWFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX09SREVSQUJMRSA9ICJvcmRlcmFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX09QRU5DSE9JQ0UgPSAib3BlbkNob2ljZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUUgPSAiZGVmYXVsdFZhbHVlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX01BWF9MRU5HVEggPSAibWF4TGVuZ3RoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFJPUEVSVFlfVFlQRV9NSU5fVkFMVUUgPSAibWluVmFsdWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX01BWF9WQUxVRSA9ICJtYXhWYWx1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfUFJFQ0lTSU9OID0gInByZWNpc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfUkVTT0xVVElPTiA9ICJyZXNvbHV0aW9uIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRSA9ICJjaG9pY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJPUEVSVFlfVFlQRV9DSE9JQ0VfRElTUExBWU5BTUUgPSAiZGlzcGxheU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRV9WQUxVRSA9ICJ2YWx1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX0NIT0lDRSA9ICJjaG9pY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZX0NSRUFURSA9ICJjcmVhdGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UWVBFX1RZUEVfTVVUQUJJTElUWV9VUERBVEUgPSAidXBkYXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRV9UWVBFX01VVEFCSUxJVFlfREVMRVRFID0gImRlbGV0ZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUVVFUlkgPSAicXVlcnkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19RVUVSWV9TVEFURU1FTlQgPSAic3RhdGVtZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUVVFUllfU0VBUkNIQUxMVkVSU0lPTlMgPSAic2VhcmNoQWxsVmVyc2lvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19RVUVSWV9JTkNMVURFQUxMT1dBQkxFQUNUSU9OUyA9ICJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1FVRVJZX0lOQ0xVREVSRUxBVElPTlNISVBTID0gImluY2x1ZGVSZWxhdGlvbnNoaXBzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUVVFUllfUkVORElUSU9ORklMVEVSID0gInJlbmRpdGlvbkZpbHRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1FVRVJZX01BWElURU1TID0gIm1heEl0ZW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUVVFUllfU0tJUENPVU5UID0gInNraXBDb3VudCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQlVMS19VUERBVEUgPSAiYnVsa1VwZGF0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0JVTEtfVVBEQVRFX0lEX0FORF9UT0tFTiA9ICJvYmplY3RJZEFuZENoYW5nZVRva2VuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQlVMS19VUERBVEVfUFJPUEVSVElFUyA9ICJwcm9wZXJ0aWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQlVMS19VUERBVEVfQUREX1NFQ09OREFSWV9UWVBFUyA9ICJhZGRTZWNvbmRhcnlUeXBlSWRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQlVMS19VUERBVEVfUkVNT1ZFX1NFQ09OREFSWV9UWVBFUyA9ICJyZW1vdmVTZWNvbmRhcnlUeXBlSWRzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JREFORFRPS0VOX0lEID0gImlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURBTkRUT0tFTl9ORVdJRCA9ICJuZXdJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEQU5EVE9LRU5fQ0hBTkdFVE9LRU4gPSAiY2hhbmdlVG9rZW4iOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9YTUxDb25zdHJhaW50cy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9YTUxDb25zdHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmU3Zjc4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MQ29uc3RyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGw7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUxDb25zdHJhaW50cyB7Ci0KLSAgICBwcml2YXRlIFhNTENvbnN0cmFpbnRzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9TVFJJTkdfTEVOR1RIID0gMTAwICogMTAyNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9FWFRFTlNJT05TX1dJRFRIID0gNTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9FWFRFTlNJT05TX0RFUFRIID0gMjA7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTENvbnZlcnRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9YTUxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxYmRkOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb25zdGFudHMuKjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbENhcGFiaWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNoYW5nZUV2ZW50SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNyZWF0YWJsZVByb3BlcnR5VHlwZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5QZXJtaXNzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUG9saWN5SWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5QcmluY2lwYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5Qm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGVUaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURlY2ltYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SHRtbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlVcmk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SHRtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUlkRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eVVyaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZU11dGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5QWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNoYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Sm9pbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlPcmRlckJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVJlbmRpdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGF0ZVRpbWVSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGVjaW1hbFByZWNpc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuU3VwcG9ydGVkUGVybWlzc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xFbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2xDYXBhYmlsaXRpZXNEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWxsb3dhYmxlQWN0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNoYW5nZUV2ZW50SW5mb0RhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DaG9pY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkV4dGVuc2lvbkZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Gb2xkZXJUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkl0ZW1UeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3REYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUG9saWN5SWRMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUG9saWN5VHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEYXRlVGltZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUlkSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5RdWVyeVR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlbmRpdGlvbkRhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5TZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVNdXRhYmlsaXR5SW1wbDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MQ29udmVydGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihYTUxDb252ZXJ0ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBYTUxDb252ZXJ0ZXIoKSB7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tIHdyaXRlcnMgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVSZXBvc2l0b3J5SW5mbyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgIFJlcG9zaXRvcnlJbmZvIHNvdXJjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgVEFHX1JFUE9TSVRPUllfSU5GTyk7Ci0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0lELCBzb3VyY2UuZ2V0SWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19OQU1FLCBzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0RFU0NSSVBUSU9OLCBzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19WRU5ET1IsIHNvdXJjZS5nZXRWZW5kb3JOYW1lKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fUFJPRFVDVCwgc291cmNlLmdldFByb2R1Y3ROYW1lKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fUFJPRFVDVF9WRVJTSU9OLCBzb3VyY2UuZ2V0UHJvZHVjdFZlcnNpb24oKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVQSU5GT19ST09UX0ZPTERFUl9JRCwgc291cmNlLmdldFJvb3RGb2xkZXJJZCgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0NIQU5HRV9MT0dfVE9LRU4sCi0gICAgICAgICAgICAgICAgc291cmNlLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCkpOwotICAgICAgICB3cml0ZVJlcG9zaXRvcnlDYXBhYmlsaXRpZXMod3JpdGVyLCBjbWlzVmVyc2lvbiwgc291cmNlLmdldENhcGFiaWxpdGllcygpKTsKLSAgICAgICAgd3JpdGVBY2xDYXBhYmlsaXRpZXMod3JpdGVyLCBjbWlzVmVyc2lvbiwgc291cmNlLmdldEFjbENhcGFiaWxpdGllcygpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0NNSVNfVkVSU0lPTl9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgc291cmNlLmdldENtaXNWZXJzaW9uU3VwcG9ydGVkKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fVEhJTl9DTElFTlRfVVJJLCBzb3VyY2UuZ2V0VGhpbkNsaWVudFVyaSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX0NIQU5HRVNfSU5DT01QTEVURSwKLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0Q2hhbmdlc0luY29tcGxldGUoKSk7Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hhbmdlc09uVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQmFzZVR5cGVJZCBiYXNlVHlwZSA6IHNvdXJjZS5nZXRDaGFuZ2VzT25UeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzAgJiYgYmFzZVR5cGUgPT0gQmFzZVR5cGVJZC5DTUlTX0lURU0pIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIlJlY2VpdmVyIG9ubHkgdW5kZXJzdGFuZHMgQ01JUyAxLjAgYnV0IHRoZSBDaGFuZ2VzIE9uIFR5cGUgbGlzdCBpbiB0aGUgUmVwb3NpdG9yeSBpbmZvIGNvbnRhaW5zIHRoZSBiYXNlIHR5cGUgSXRlbS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBJdGVtIGJhc2UgdHlwZSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fQ0hBTkdFU19PTl9UWVBFLCBiYXNlVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRVBJTkZPX1BSSU5DSVBBTF9JRF9BTk9OWU1PVVMsCi0gICAgICAgICAgICAgICAgc291cmNlLmdldFByaW5jaXBhbElkQW5vbnltb3VzKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFUElORk9fUFJJTkNJUEFMX0lEX0FOWU9ORSwKLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0UHJpbmNpcGFsSWRBbnlvbmUoKSk7Ci0gICAgICAgIGlmIChjbWlzVmVyc2lvbiAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCAmJiBzb3VyY2UuZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEV4dGVuc2lvbkZlYXR1cmUgZmVhdHVyZSA6IHNvdXJjZS5nZXRFeHRlbnNpb25GZWF0dXJlcygpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVFeHRlbmRlZEZlYXR1cmVzKHdyaXRlciwgY21pc1ZlcnNpb24sIGZlYXR1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVJlcG9zaXRvcnlDYXBhYmlsaXRpZXMoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sCi0gICAgICAgICAgICBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzIHNvdXJjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfUkVQSU5GT19DQVBBQklMSVRJRVMsIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9BQ0wsIHNvdXJjZS5nZXRBY2xDYXBhYmlsaXR5KCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9BTExfVkVSU0lPTlNfU0VBUkNIQUJMRSwKLSAgICAgICAgICAgICAgICBzb3VyY2UuaXNBbGxWZXJzaW9uc1NlYXJjaGFibGVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0NIQU5HRVMsIHNvdXJjZS5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfQ09OVEVOVF9TVFJFQU1fVVBEQVRBQklMSVRZLAotICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRDb250ZW50U3RyZWFtVXBkYXRlc0NhcGFiaWxpdHkoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0dFVF9ERVNDRU5EQU5UUywgc291cmNlLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0dFVF9GT0xERVJfVFJFRSwgc291cmNlLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpKTsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9PUkRFUl9CWSwgc291cmNlLmdldE9yZGVyQnlDYXBhYmlsaXR5KCkpOwotICAgICAgICB9Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX01VTFRJRklMSU5HLCBzb3VyY2UuaXNNdWx0aWZpbGluZ1N1cHBvcnRlZCgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfUFdDX1NFQVJDSEFCTEUsIHNvdXJjZS5pc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX1BXQ19VUERBVEFCTEUsIHNvdXJjZS5pc1B3Y1VwZGF0YWJsZVN1cHBvcnRlZCgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfUVVFUlksIHNvdXJjZS5nZXRRdWVyeUNhcGFiaWxpdHkoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX1JFTkRJVElPTlMsIHNvdXJjZS5nZXRSZW5kaXRpb25zQ2FwYWJpbGl0eSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DQVBfVU5GSUxJTkcsIHNvdXJjZS5pc1VuZmlsaW5nU3VwcG9ydGVkKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9WRVJTSU9OX1NQRUNJRklDX0ZJTElORywKLSAgICAgICAgICAgICAgICBzb3VyY2UuaXNWZXJzaW9uU3BlY2lmaWNGaWxpbmdTdXBwb3J0ZWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX0pPSU4sIHNvdXJjZS5nZXRKb2luQ2FwYWJpbGl0eSgpKTsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlLmdldENyZWF0YWJsZVByb3BlcnR5VHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRhYmxlUHJvcGVydHlUeXBlcyBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzID0gc291cmNlLmdldENyZWF0YWJsZVByb3BlcnR5VHlwZXMoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVMsIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICAgICAgICAgIGlmIChjcmVhdGFibGVQcm9wZXJ0eVR5cGVzLmNhbkNyZWF0ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eVR5cGUgcHQgOiBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzLmNhbkNyZWF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfQ0FOQ1JFQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc291cmNlLmdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzID0gc291cmNlLmdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTLCBOQU1FU1BBQ0VfQ01JUyk7Ci0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0xPQ0FMTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLAotICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0xPQ0FMTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRMb2NhbE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0RJU1BMQVlOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX1FVRVJZTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0UXVlcnlOYW1lKCkpOwotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ1JFQVRFQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0Q3JlYXRhYmxlKCkpOwotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRklMRUFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldEZpbGVhYmxlKCkpOwotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfUVVFUllBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRRdWVyeWFibGUoKSk7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsCi0gICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRlVMTFRFWFRJTkRFWEVELAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRGdWxsdGV4dEluZGV4ZWQoKSk7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsCi0gICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfSU5DTFVERURJTlNVUEVSVFlUUEVRVUVSWSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOwotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLAotICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFUE9MSUNZLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDb250cm9sbGFibGVQb2xpY3koKSk7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsCi0gICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfQ09OVFJPTEFCTEVBQ0wsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENvbnRyb2xsYWJsZUFjbCgpKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHNvdXJjZSk7Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVBY2xDYXBhYmlsaXRpZXMoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIEFjbENhcGFiaWxpdGllcyBzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19SRVBJTkZPX0FDTF9DQVBBQklMSVRJRVMsIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9TVVBQT1JURURfUEVSTUlTU0lPTlMsCi0gICAgICAgICAgICAgICAgc291cmNlLmdldFN1cHBvcnRlZFBlcm1pc3Npb25zKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9BQ0xfUFJPUEFHQVRJT04sIHNvdXJjZS5nZXRBY2xQcm9wYWdhdGlvbigpKTsKLSAgICAgICAgaWYgKHNvdXJjZS5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbkRlZmluaXRpb24gcGQgOiBzb3VyY2UuZ2V0UGVybWlzc2lvbnMoKSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX0FDTENBUF9QRVJNSVNTSU9OUywgTkFNRVNQQUNFX0NNSVMpOwotCi0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTl9QRVJNSVNTSU9OLCBwZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9QRVJNSVNTSU9OX0RFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBwZCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0UGVybWlzc2lvbk1hcHBpbmcoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFBlcm1pc3Npb25NYXBwaW5nIHBtIDogc291cmNlLmdldFBlcm1pc3Npb25NYXBwaW5nKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTl9NQVBQSU5HLCBOQU1FU1BBQ0VfQ01JUyk7Ci0KLSAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDTENBUF9NQVBQSU5HX0tFWSwgcG0uZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIGlmIChwbS5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGVybSA6IHBtLmdldFBlcm1pc3Npb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQUNMQ0FQX01BUFBJTkdfUEVSTUlTU0lPTiwgcGVybSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBwbSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUV4dGVuZGVkRmVhdHVyZXMoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIEV4dGVuc2lvbkZlYXR1cmUgc291cmNlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfUkVQSU5GT19FWFRFTkRFRF9GRUFUVVJFUywgTkFNRVNQQUNFX0NNSVMpOwotCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfRkVBVFVSRV9JRCwgc291cmNlLmdldElkKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0ZFQVRVUkVfVVJMLCBzb3VyY2UuZ2V0VXJsKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0ZFQVRVUkVfQ09NTU9OX05BTUUsIHNvdXJjZS5nZXRDb21tb25OYW1lKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0ZFQVRVUkVfVkVSU0lPTl9MQUJFTCwgc291cmNlLmdldFZlcnNpb25MYWJlbCgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19GRUFUVVJFX0RFU0NSSVBUSU9OLCBzb3VyY2UuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0RmVhdHVyZURhdGEoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZGF0YSA6IHNvdXJjZS5nZXRGZWF0dXJlRGF0YSgpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19GRUFUVVJFX0RBVEEsIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfRkVBVFVSRV9EQVRBX0tFWSwgZGF0YS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19GRUFUVVJFX0RBVEFfVkFMVUUsIGRhdGEuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gZGVmaW5pdGlvbiB3cml0ZXJzIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUeXBlRGVmaW5pdGlvbihYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHNvdXJjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfSVRFTSkgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJSZWNlaXZlciBvbmx5IHVuZGVyc3RhbmRzIENNSVMgMS4wLiBJdCBtYXkgbm90IGFibGUgdG8gaGFuZGxlIGFuIEl0ZW0gdHlwZSBkZWZpbml0aW9uLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkpIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiUmVjZWl2ZXIgb25seSB1bmRlcnN0YW5kcyBDTUlTIDEuMC4gSXQgbWF5IG5vdCBhYmxlIHRvIGhhbmRsZSBhIFNlY29uZGFyeSB0eXBlIGRlZmluaXRpb24uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBUQUdfVFlQRSk7Ci0gICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShQUkVGSVhfWFNJLCBOQU1FU1BBQ0VfWFNJKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoUFJFRklYX1hTSSwgTkFNRVNQQUNFX1hTSSwgInR5cGUiLCBQUkVGSVhfQ01JUyArICI6IiArIEFUVFJfRE9DVU1FTlRfVFlQRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfRk9MREVSKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoUFJFRklYX1hTSSwgTkFNRVNQQUNFX1hTSSwgInR5cGUiLCBQUkVGSVhfQ01JUyArICI6IiArIEFUVFJfRk9MREVSX1RZUEUpOwotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKFBSRUZJWF9YU0ksIE5BTUVTUEFDRV9YU0ksICJ0eXBlIiwgUFJFRklYX0NNSVMgKyAiOiIgKyBBVFRSX1JFTEFUSU9OU0hJUF9UWVBFKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShQUkVGSVhfWFNJLCBOQU1FU1BBQ0VfWFNJLCAidHlwZSIsIFBSRUZJWF9DTUlTICsgIjoiICsgQVRUUl9QT0xJQ1lfVFlQRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfSVRFTSkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKFBSRUZJWF9YU0ksIE5BTUVTUEFDRV9YU0ksICJ0eXBlIiwgUFJFRklYX0NNSVMgKyAiOiIgKyBBVFRSX0lURU1fVFlQRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfU0VDT05EQVJZKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoUFJFRklYX1hTSSwgTkFNRVNQQUNFX1hTSSwgInR5cGUiLCBQUkVGSVhfQ01JUyArICI6IiArIEFUVFJfU0VDT05EQVJZX1RZUEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJUeXBlIGRlZmluaXRpb24gaGFzIG5vIGJhc2UgdHlwZSBpZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9JRCwgc291cmNlLmdldElkKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfTE9DQUxOQU1FLCBzb3VyY2UuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfTE9DQUxOQU1FU1BBQ0UsIHNvdXJjZS5nZXRMb2NhbE5hbWVzcGFjZSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0RJU1BMQVlOQU1FLCBzb3VyY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9RVUVSWU5BTUUsIHNvdXJjZS5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9ERVNDUklQVElPTiwgc291cmNlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfQkFTRV9JRCwgc291cmNlLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9QQVJFTlRfSUQsIHNvdXJjZS5nZXRQYXJlbnRUeXBlSWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9DUkVBVEFCTEUsIHNvdXJjZS5pc0NyZWF0YWJsZSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0ZJTEVBQkxFLCBzb3VyY2UuaXNGaWxlYWJsZSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX1FVRVJZQUJMRSwgc291cmNlLmlzUXVlcnlhYmxlKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfRlVMTFRFWFRfSU5ERVhFRCwgc291cmNlLmlzRnVsbHRleHRJbmRleGVkKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfSU5DTFVERV9JTl9TVVBFUlRZUEVfUVVFUlksCi0gICAgICAgICAgICAgICAgc291cmNlLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfQ09OVFJPTEFCTEVfUE9MSUNZLCBzb3VyY2UuaXNDb250cm9sbGFibGVQb2xpY3koKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9DT05UUk9MQUJMRV9BQ0wsIHNvdXJjZS5pc0NvbnRyb2xsYWJsZUFjbCgpKTsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wICYmIHNvdXJjZS5nZXRUeXBlTXV0YWJpbGl0eSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFR5cGVNdXRhYmlsaXR5IHRtID0gc291cmNlLmdldFR5cGVNdXRhYmlsaXR5KCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZLCBOQU1FU1BBQ0VfQ01JUyk7Ci0KLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9UWVBFX01VVEFCSUxJVFlfQ1JFQVRFLCB0bS5jYW5DcmVhdGUoKSk7Ci0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZX1VQREFURSwgdG0uY2FuVXBkYXRlKCkpOwotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX1RZUEVfTVVUQUJJTElUWV9ERUxFVEUsIHRtLmNhbkRlbGV0ZSgpKTsKLQotICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgdG0pOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkIDogc291cmNlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHlEZWZpbml0aW9uKHdyaXRlciwgY21pc1ZlcnNpb24sIHBkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uIGRvY0RlZiA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSBzb3VyY2U7Ci0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1RZUEVfVkVSU0lPTkFCTEUsIGRvY0RlZi5pc1ZlcnNpb25hYmxlKCkpOwotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0NPTlRFTlRTVFJFQU1fQUxMT1dFRCwKLSAgICAgICAgICAgICAgICAgICAgZG9jRGVmLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiByZWxEZWYgPSAoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHNvdXJjZTsKLSAgICAgICAgICAgIGlmIChyZWxEZWYuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiByZWxEZWYuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19UWVBFX0FMTE9XRURfU09VUkNFX1RZUEVTLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVsRGVmLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogcmVsRGVmLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfVFlQRV9BTExPV0VEX1RBUkdFVF9UWVBFUywgaWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVByb3BlcnR5RGVmaW5pdGlvbihYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwKLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBzb3VyY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0UHJvcGVydHlUeXBlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQcm9wZXJ0eSB0eXBlIGZvciBwcm9wZXJ0eSBkZWZpbml0aW9uICciICsgc291cmNlLmdldElkKCkgKyAiJyBpcyBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChzb3VyY2UuZ2V0UHJvcGVydHlUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19UWVBFX1BST1BfREVGX1NUUklORywgTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUQ6Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19UWVBFX1BST1BfREVGX0lELCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlRFR0VSOgotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfVFlQRV9QUk9QX0RFRl9JTlRFR0VSLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCT09MRUFOOgotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfVFlQRV9QUk9QX0RFRl9CT09MRUFOLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVRFVElNRToKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1RZUEVfUFJPUF9ERUZfREFURVRJTUUsIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFQ0lNQUw6Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19UWVBFX1BST1BfREVGX0RFQ0lNQUwsIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19UWVBFX1BST1BfREVGX0hUTUwsIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVSSToKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1RZUEVfUFJPUF9ERUZfVVJJLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUHJvcGVydHkgZGVmaW50aW9uIGhhcyBubyBwcm9wZXJ0eSB0eXBlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX0lELCBzb3VyY2UuZ2V0SWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUUsIHNvdXJjZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0TG9jYWxOYW1lc3BhY2UoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9ESVNQTEFZTkFNRSwgc291cmNlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfUVVFUllOQU1FLCBzb3VyY2UuZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfREVTQ1JJUFRJT04sIHNvdXJjZS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX1BST1BFUlRZX1RZUEUsIHNvdXJjZS5nZXRQcm9wZXJ0eVR5cGUoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9DQVJESU5BTElUWSwgc291cmNlLmdldENhcmRpbmFsaXR5KCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfVVBEQVRBQklMSVRZLCBzb3VyY2UuZ2V0VXBkYXRhYmlsaXR5KCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfSU5IRVJJVEVELCBzb3VyY2UuaXNJbmhlcml0ZWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9SRVFVSVJFRCwgc291cmNlLmlzUmVxdWlyZWQoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9RVUVSWUFCTEUsIHNvdXJjZS5pc1F1ZXJ5YWJsZSgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX09SREVSQUJMRSwgc291cmNlLmlzT3JkZXJhYmxlKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfT1BFTkNIT0lDRSwgc291cmNlLmlzT3BlbkNob2ljZSgpKTsKLQotICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24gZGVmID0gKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbikgc291cmNlOwotCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5KHdyaXRlciwgbmV3IFByb3BlcnR5U3RyaW5nSW1wbCgoU3RyaW5nKSBudWxsLCBkZWYuZ2V0RGVmYXVsdFZhbHVlKCkpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX01BWF9MRU5HVEgsIGRlZi5nZXRNYXhMZW5ndGgoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlJZERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIFByb3BlcnR5SWREZWZpbml0aW9uIGRlZiA9IChQcm9wZXJ0eUlkRGVmaW5pdGlvbikgc291cmNlOwotCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5KHdyaXRlciwgbmV3IFByb3BlcnR5SWRJbXBsKChTdHJpbmcpIG51bGwsIGRlZi5nZXREZWZhdWx0VmFsdWUoKSksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24gZGVmID0gKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHNvdXJjZTsKLQotICAgICAgICAgICAgaWYgKGRlZi5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIG5ldyBQcm9wZXJ0eUludGVnZXJJbXBsKChTdHJpbmcpIG51bGwsIGRlZi5nZXREZWZhdWx0VmFsdWUoKSksIHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfTUFYX1ZBTFVFLCBkZWYuZ2V0TWF4VmFsdWUoKSk7Ci0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfTUlOX1ZBTFVFLCBkZWYuZ2V0TWluVmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbikgewotICAgICAgICAgICAgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbiBkZWYgPSAoUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbikgc291cmNlOwotCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5KHdyaXRlciwgbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwoKFN0cmluZykgbnVsbCwgZGVmLmdldERlZmF1bHRWYWx1ZSgpKSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uIGRlZiA9IChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbikgc291cmNlOwotCi0gICAgICAgICAgICBpZiAoZGVmLmdldERlZmF1bHRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5KHdyaXRlciwgbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKChTdHJpbmcpIG51bGwsIGRlZi5nZXREZWZhdWx0VmFsdWUoKSksIHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfUkVTT0xVVElPTiwKLSAgICAgICAgICAgICAgICAgICAgZGVmLmdldERhdGVUaW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uIGRlZiA9IChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uKSBzb3VyY2U7Ci0KLSAgICAgICAgICAgIGlmIChkZWYuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHkod3JpdGVyLCBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbCgoU3RyaW5nKSBudWxsLCBkZWYuZ2V0RGVmYXVsdFZhbHVlKCkpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX01BWF9WQUxVRSwgZGVmLmdldE1heFZhbHVlKCkpOwotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX01JTl9WQUxVRSwgZGVmLmdldE1pblZhbHVlKCkpOwotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19QUk9QRVJUWV9UWVBFX1BSRUNJU0lPTiwgZGVmLmdldFByZWNpc2lvbigpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uIGRlZiA9IChQcm9wZXJ0eUh0bWxEZWZpbml0aW9uKSBzb3VyY2U7Ci0KLSAgICAgICAgICAgIGlmIChkZWYuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHkod3JpdGVyLCBuZXcgUHJvcGVydHlIdG1sSW1wbCgoU3RyaW5nKSBudWxsLCBkZWYuZ2V0RGVmYXVsdFZhbHVlKCkpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIFByb3BlcnR5VXJpRGVmaW5pdGlvbiBkZWYgPSAoUHJvcGVydHlVcmlEZWZpbml0aW9uKSBzb3VyY2U7Ci0KLSAgICAgICAgICAgIGlmIChkZWYuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHkod3JpdGVyLCBuZXcgUHJvcGVydHlVcmlJbXBsKChTdHJpbmcpIG51bGwsIGRlZi5nZXREZWZhdWx0VmFsdWUoKSksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRDaG9pY2VzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDaG9pY2U8Pz4gYyA6IHNvdXJjZS5nZXRDaG9pY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlQ2hvaWNlKHdyaXRlciwgc291cmNlLmdldFByb3BlcnR5VHlwZSgpLCBjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQ2hvaWNlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFByb3BlcnR5VHlwZSBwcm9wVHlwZSwgQ2hvaWNlPD8+IHNvdXJjZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFLCBOQU1FU1BBQ0VfQ01JUyk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXREaXNwbGF5TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShBVFRSX1BST1BFUlRZX1RZUEVfQ0hPSUNFX0RJU1BMQVlOQU1FLCBzb3VyY2UuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgc3dpdGNoIChwcm9wVHlwZSkgewotICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIElEOgotICAgICAgICAgICAgY2FzZSBIVE1MOgotICAgICAgICAgICAgY2FzZSBVUkk6Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiAoTGlzdDxTdHJpbmc+KSBzb3VyY2UuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTlRFR0VSOgotICAgICAgICAgICAgICAgIGZvciAoQmlnSW50ZWdlciB2YWx1ZSA6IChMaXN0PEJpZ0ludGVnZXI+KSBzb3VyY2UuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCT09MRUFOOgotICAgICAgICAgICAgICAgIGZvciAoQm9vbGVhbiB2YWx1ZSA6IChMaXN0PEJvb2xlYW4+KSBzb3VyY2UuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEQVRFVElNRToKLSAgICAgICAgICAgICAgICBmb3IgKEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlIDogKExpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+KSBzb3VyY2UuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBERUNJTUFMOgotICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCB2YWx1ZSA6IChMaXN0PEJpZ0RlY2ltYWw+KSBzb3VyY2UuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0Q2hvaWNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDaG9pY2U8Pz4gYyA6IHNvdXJjZS5nZXRDaG9pY2UoKSkgewotICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVDaG9pY2Uod3JpdGVyLCBwcm9wVHlwZSwgYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tIG9iamVjdCB3cml0ZXJzIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVPYmplY3QoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIFN0cmluZyBuYW1lc3BhY2UsIE9iamVjdERhdGEgc291cmNlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlT2JqZWN0KHdyaXRlciwgY21pc1ZlcnNpb24sIGZhbHNlLCBUQUdfT0JKRUNULCBuYW1lc3BhY2UsIHNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlT2JqZWN0KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBib29sZWFuIHJvb3QsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSwgT2JqZWN0RGF0YSBzb3VyY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbWlzVmVyc2lvbiA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgaWYgKHNvdXJjZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0lURU0pIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiUmVjZWl2ZXIgb25seSB1bmRlcnN0YW5kcyBDTUlTIDEuMC4gSXQgbWF5IG5vdCBiZSBhYmxlIHRvIGhhbmRsZSBhbiBJdGVtIG9iamVjdC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyb290KSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIG5hbWUsIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmdldFByb3BlcnRpZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBzb3VyY2UuZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19PQkpFQ1RfUFJPUEVSVElFUywgTkFNRVNQQUNFX0NNSVMpOwotCi0gICAgICAgICAgICBpZiAocHJvcGVydGllcy5nZXRQcm9wZXJ0eUxpc3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkgOiBwcm9wZXJ0aWVzLmdldFByb3BlcnR5TGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvcGVydHkod3JpdGVyLCBwcm9wZXJ0eSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgcHJvcGVydGllcyk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVBbGxvd2FibGVBY3Rpb25zKHdyaXRlciwgY21pc1ZlcnNpb24sIGZhbHNlLCBzb3VyY2UuZ2V0QWxsb3dhYmxlQWN0aW9ucygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc291cmNlLmdldFJlbGF0aW9uc2hpcHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgcmVsIDogc291cmNlLmdldFJlbGF0aW9uc2hpcHMoKSkgewotICAgICAgICAgICAgICAgIGlmIChyZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU9iamVjdCh3cml0ZXIsIGNtaXNWZXJzaW9uLCBmYWxzZSwgVEFHX09CSkVDVF9SRUxBVElPTlNISVAsIE5BTUVTUEFDRV9DTUlTLCByZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc291cmNlLmdldENoYW5nZUV2ZW50SW5mbygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIENoYW5nZUV2ZW50SW5mbyBpbmZvID0gc291cmNlLmdldENoYW5nZUV2ZW50SW5mbygpOwotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19PQkpFQ1RfQ0hBTkdFX0VWRU5UX0lORk8sIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DSEFOR0VfRVZFTlRfVFlQRSwgaW5mby5nZXRDaGFuZ2VUeXBlKCkpOwotICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19DSEFOR0VfRVZFTlRfVElNRSwgaW5mby5nZXRDaGFuZ2VUaW1lKCkpOwotCi0gICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBpbmZvKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc291cmNlLmdldEFjbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlQWNsKHdyaXRlciwgY21pc1ZlcnNpb24sIGZhbHNlLCBzb3VyY2UuZ2V0QWNsKCkpOwotICAgICAgICB9Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfT0JKRUNUX0VYQUNUX0FDTCwgc291cmNlLmlzRXhhY3RBY2woKSk7Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0UG9saWN5SWRzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUG9saWN5SWRMaXN0IHBpZHMgPSBzb3VyY2UuZ2V0UG9saWN5SWRzKCk7Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX09CSkVDVF9QT0xJQ1lfSURTLCBOQU1FU1BBQ0VfQ01JUyk7Ci0KLSAgICAgICAgICAgIGlmIChwaWRzLmdldFBvbGljeUlkcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IHBpZHMuZ2V0UG9saWN5SWRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUE9MSUNZX0lELCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHBpZHMpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0UmVuZGl0aW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUmVuZGl0aW9uRGF0YSByZW5kIDogc291cmNlLmdldFJlbmRpdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIGlmIChyZW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfT0JKRUNUX1JFTkRJVElPTiwgTkFNRVNQQUNFX0NNSVMpOwotCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVORElUSU9OX1NUUkVBTV9JRCwgcmVuZC5nZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRU5ESVRJT05fTUlNRVRZUEUsIHJlbmQuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVORElUSU9OX0xFTkdUSCwgcmVuZC5nZXRCaWdMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVORElUSU9OX0tJTkQsIHJlbmQuZ2V0S2luZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19SRU5ESVRJT05fVElUTEUsIHJlbmQuZ2V0VGl0bGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVORElUSU9OX0hFSUdIVCwgcmVuZC5nZXRCaWdIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUkVORElUSU9OX1dJRFRILCByZW5kLmdldEJpZ1dpZHRoKCkpOwotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1JFTkRJVElPTl9ET0NVTUVOVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kLmdldFJlbmRpdGlvbkRvY3VtZW50SWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgcmVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlUHJvcGVydHkoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgUHJvcGVydHlEYXRhPD8+IHNvdXJjZSwgYm9vbGVhbiBpc0RlZmF1bHRWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0RlZmF1bHRWYWx1ZSkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUUsIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1BST1BfU1RSSU5HLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19QUk9QX0lELCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5SW50ZWdlcikgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1BST1BfSU5URUdFUiwgTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUJvb2xlYW4pIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19QUk9QX0JPT0xFQU4sIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1BST1BfREFURVRJTUUsIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlEZWNpbWFsKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfUFJPUF9ERUNJTUFMLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5SHRtbCkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1BST1BfSFRNTCwgTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX1BST1BfVVJJLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eSBkYXRhdHlwZSEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0SWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9QUk9QRVJUWV9JRCwgc291cmNlLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0RGlzcGxheU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9QUk9QRVJUWV9ESVNQTEFZTkFNRSwgc291cmNlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKEFUVFJfUFJPUEVSVFlfTE9DQUxOQU1FLCBzb3VyY2UuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UuZ2V0UXVlcnlOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKEFUVFJfUFJPUEVSVFlfUVVFUllOQU1FLCBzb3VyY2UuZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykgfHwgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpIHx8IChzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWwpCi0gICAgICAgICAgICAgICAgfHwgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5VXJpKSkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IChMaXN0PFN0cmluZz4pIHNvdXJjZS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVkFMVUUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBMaXN0PEJpZ0ludGVnZXI+IHZhbHVlcyA9ICgoUHJvcGVydHlJbnRlZ2VyKSBzb3VyY2UpLmdldFZhbHVlcygpOwotICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVkFMVUUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuKSB7Ci0gICAgICAgICAgICBMaXN0PEJvb2xlYW4+IHZhbHVlcyA9ICgoUHJvcGVydHlCb29sZWFuKSBzb3VyY2UpLmdldFZhbHVlcygpOwotICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChCb29sZWFuIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUFJPUEVSVFlfVkFMVUUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZSkgewotICAgICAgICAgICAgTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gdmFsdWVzID0gKChQcm9wZXJ0eURhdGVUaW1lKSBzb3VyY2UpLmdldFZhbHVlcygpOwotICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbCkgewotICAgICAgICAgICAgTGlzdDxCaWdEZWNpbWFsPiB2YWx1ZXMgPSAoKFByb3BlcnR5RGVjaW1hbCkgc291cmNlKS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoQmlnRGVjaW1hbCB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1BST1BFUlRZX1ZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUFsbG93YWJsZUFjdGlvbnMoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIGJvb2xlYW4gcm9vdCwKLSAgICAgICAgICAgIEFsbG93YWJsZUFjdGlvbnMgc291cmNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocm9vdCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCAiYWxsb3dhYmxlQWN0aW9ucyIsIE5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfT0JKRUNUX0FMTE9XQUJMRV9BQ1RJT05TLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmdldEFsbG93YWJsZUFjdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEFjdGlvbiBhY3Rpb24gOiBBY3Rpb24udmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gQWN0aW9uLkNBTl9DUkVBVEVfSVRFTSAmJiBjbWlzVmVyc2lvbiA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIlJlY2VpdmVyIG9ubHkgdW5kZXJzdGFuZHMgQ01JUyAxLjAgYnV0IHRoZSBBbGxvd2FibGUgQWN0aW9ucyBjb250YWluIHRoZSBjYW5DcmVhdGVJdGVtIGFjdGlvbi4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgY2FuQ3JlYXRlSXRlbSBhY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBBbGxvd2FibGUgQWN0aW9ucy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBhY3Rpb24udmFsdWUoKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBzb3VyY2UpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQWNsKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBib29sZWFuIHJvb3QsIEFjbCBzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocm9vdCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCAiYWNsIiwgTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19PQkpFQ1RfQUNMLCBOQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmdldEFjZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiBzb3VyY2UuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX0FDTF9QRVJNSVNTSVNPTlMsIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYWNlLmdldFByaW5jaXBhbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSBhY2UuZ2V0UHJpbmNpcGFsKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChQUkVGSVhfQ01JUywgVEFHX0FDRV9QUklOQ0lQQUwsIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19BQ0VfUFJJTkNJUEFMX0lELCBwcmluY2lwYWwuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHByaW5jaXBhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjZS5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBlcm0gOiBhY2UuZ2V0UGVybWlzc2lvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQUNFX1BFUk1JU1NJT05TLCBwZXJtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX0FDRV9JU19ESVJFQ1QsIGFjZS5pc0RpcmVjdCgpKTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBhY2UpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgc291cmNlKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gcXVlcnkgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlUXVlcnkoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIFF1ZXJ5VHlwZUltcGwgc291cmNlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KE5BTUVTUEFDRV9DTUlTLCBUQUdfUVVFUlkpOwotICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTKTsKLQotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZX1NUQVRFTUVOVCwgc291cmNlLmdldFN0YXRlbWVudCgpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19RVUVSWV9TRUFSQ0hBTExWRVJTSU9OUywgc291cmNlLmdldFNlYXJjaEFsbFZlcnNpb25zKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZX0lOQ0xVREVBTExPV0FCTEVBQ1RJT05TLAotICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucygpKTsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19RVUVSWV9JTkNMVURFUkVMQVRJT05TSElQUywKLSAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUVVFUllfUkVORElUSU9ORklMVEVSLCBzb3VyY2UuZ2V0UmVuZGl0aW9uRmlsdGVyKCkpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh3cml0ZXIsIFBSRUZJWF9DTUlTLCBOQU1FU1BBQ0VfQ01JUywgVEFHX1FVRVJZX01BWElURU1TLCBzb3VyY2UuZ2V0TWF4SXRlbXMoKSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfUVVFUllfU0tJUENPVU5ULCBzb3VyY2UuZ2V0U2tpcENvdW50KCkpOwotCi0gICAgICAgIHdyaXRlRXh0ZW5zaW9ucyh3cml0ZXIsIHNvdXJjZSk7Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tIGJ1bGsgdXBkYXRlIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUJ1bGtVcGRhdGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgU3RyaW5nIG5hbWVzcGFjZSwgQnVsa1VwZGF0ZUltcGwgYnVsa1VwZGF0ZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoYnVsa1VwZGF0ZSA9PSBudWxsIHx8IGJ1bGtVcGRhdGUuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIFRBR19CVUxLX1VQREFURSk7Ci0KLSAgICAgICAgZm9yIChCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiBpZEFuZFRva2VuIDogYnVsa1VwZGF0ZS5nZXRPYmplY3RJZEFuZENoYW5nZVRva2VuKCkpIHsKLSAgICAgICAgICAgIGlmIChpZEFuZFRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWF9DTUlTLCBUQUdfQlVMS19VUERBVEVfSURfQU5EX1RPS0VOLCBOQU1FU1BBQ0VfQ01JUyk7Ci0KLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfSURBTkRUT0tFTl9JRCwgaWRBbmRUb2tlbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfSURBTkRUT0tFTl9DSEFOR0VUT0tFTiwgaWRBbmRUb2tlbi5nZXRDaGFuZ2VUb2tlbigpKTsKLQotICAgICAgICAgICAgd3JpdGVFeHRlbnNpb25zKHdyaXRlciwgaWRBbmRUb2tlbik7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnVsa1VwZGF0ZS5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gYnVsa1VwZGF0ZS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYX0NNSVMsIFRBR19CVUxLX1VQREFURV9QUk9QRVJUSUVTLCBOQU1FU1BBQ0VfQ01JUyk7Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmdldFByb3BlcnR5TGlzdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXMuZ2V0UHJvcGVydHlMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVQcm9wZXJ0eSh3cml0ZXIsIHByb3BlcnR5LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZUV4dGVuc2lvbnMod3JpdGVyLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChidWxrVXBkYXRlLmdldEFkZFNlY29uZGFyeVR5cGVJZHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGJ1bGtVcGRhdGUuZ2V0QWRkU2Vjb25kYXJ5VHlwZUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMud3JpdGUod3JpdGVyLCBQUkVGSVhfQ01JUywgTkFNRVNQQUNFX0NNSVMsIFRBR19CVUxLX1VQREFURV9BRERfU0VDT05EQVJZX1RZUEVTLCBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnVsa1VwZGF0ZS5nZXRSZW1vdmVTZWNvbmRhcnlUeXBlSWRzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBidWxrVXBkYXRlLmdldFJlbW92ZVNlY29uZGFyeVR5cGVJZHMoKSkgewotICAgICAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHdyaXRlciwgUFJFRklYX0NNSVMsIE5BTUVTUEFDRV9DTUlTLCBUQUdfQlVMS19VUERBVEVfUkVNT1ZFX1NFQ09OREFSWV9UWVBFUywgaWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gZXh0ZW5zaW9uIHdyaXRlcnMgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRXh0ZW5zaW9ucyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBFeHRlbnNpb25zRGF0YSBzb3VyY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0RXh0ZW5zaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc0V4dGVuc2lvbkVsZW1lbnQgZWxlbWVudCA6IHNvdXJjZS5nZXRFeHRlbnNpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdyaXRlRXh0ZW5zaW9uRWxlbWVudCh3cml0ZXIsIGVsZW1lbnQsIG5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVFeHRlbnNpb25FbGVtZW50KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIENtaXNFeHRlbnNpb25FbGVtZW50IHNvdXJjZSwgTGlzdDxTdHJpbmc+IG5zKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gYWRkZWROYW1lc3BhY2UgPSBmYWxzZTsKLQotICAgICAgICBpZiAoc291cmNlLmdldE5hbWVzcGFjZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KHNvdXJjZS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgcCA9IG5zLmluZGV4T2Yoc291cmNlLmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChwID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJlIiArIChucy5zaXplKCkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgbnMuYWRkKHNvdXJjZS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkTmFtZXNwYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAiZSIgKyAocCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgc291cmNlLmdldE5hbWUoKSwgc291cmNlLmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICAgICAgaWYgKGFkZGVkTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgc291cmNlLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UuZ2V0QXR0cmlidXRlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBhdHRyIDogc291cmNlLmdldEF0dHJpYnV0ZXMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dHIuZ2V0S2V5KCksIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlLmdldENoaWxkcmVuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoQ21pc0V4dGVuc2lvbkVsZW1lbnQgY2hpbGQgOiBzb3VyY2UuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZUV4dGVuc2lvbkVsZW1lbnQod3JpdGVyLCBjaGlsZCwgbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAoYWRkZWROYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIG5zLnJlbW92ZShucy5zaXplKCkgLSAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBwYXJzZXJzIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5SW5mbyBjb252ZXJ0UmVwb3NpdG9yeUluZm8oWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBSRVBPU0lUT1JZX0lORk9fUEFSU0VSLndhbGsocGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVEZWZpbml0aW9uIGNvbnZlcnRUeXBlRGVmaW5pdGlvbihYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFRZUEVfREVGX1BBUlNFUi53YWxrKHBhcnNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3REYXRhIGNvbnZlcnRPYmplY3QoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBPQkpFQ1RfUEFSU0VSLndhbGsocGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFF1ZXJ5VHlwZUltcGwgY29udmVydFF1ZXJ5KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gUVVFUllfUEFSU0VSLndhbGsocGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFsbG93YWJsZUFjdGlvbnMgY29udmVydEFsbG93YWJsZUFjdGlvbnMoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBBTExPV0FCTEVfQUNUSU9OU19QQVJTRVIud2FsayhwYXJzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQWNsIGNvbnZlcnRBY2woWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBBQ0xfUEFSU0VSLndhbGsocGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1bGtVcGRhdGVJbXBsIGNvbnZlcnRCdWxrVXBkYXRlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQlVMS19VUERBVEVfUEFSU0VSLndhbGsocGFyc2VyKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gcmVwb3NpdG9yeSBpbmZvIHBhcnNlciAtLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxSZXBvc2l0b3J5SW5mb0ltcGw+IFJFUE9TSVRPUllfSU5GT19QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFJlcG9zaXRvcnlJbmZvSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgUmVwb3NpdG9yeUluZm9JbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlcG9zaXRvcnlJbmZvSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSwgUmVwb3NpdG9yeUluZm9JbXBsIHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJZChyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXROYW1lKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fREVTQ1JJUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXNjcmlwdGlvbihyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX1ZFTkRPUikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFZlbmRvck5hbWUocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19QUk9EVUNUKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJvZHVjdE5hbWUocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19QUk9EVUNUX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQcm9kdWN0VmVyc2lvbihyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX1JPT1RfRk9MREVSX0lEKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Um9vdEZvbGRlcihyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX0NIQU5HRV9MT0dfVE9LRU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbihyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX0NBUEFCSUxJVElFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhcGFiaWxpdGllcyhDQVBBQklMSVRJRVNfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19BQ0xfQ0FQQUJJTElUSUVTKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QWNsQ2FwYWJpbGl0aWVzKEFDTF9DQVBBQklMSVRJRVNfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19DTUlTX1ZFUlNJT05fU1VQUE9SVEVEKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q21pc1ZlcnNpb25TdXBwb3J0ZWQocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19USElOX0NMSUVOVF9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRUaGluQ2xpZW50VXJpKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fQ0hBTkdFU19JTkNPTVBMRVRFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2hhbmdlc0luY29tcGxldGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19DSEFOR0VTX09OX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDaGFuZ2VzT25UeXBlKGFkZFRvTGlzdCh0YXJnZXQuZ2V0Q2hhbmdlc09uVHlwZSgpLCByZWFkRW51bShwYXJzZXIsIEJhc2VUeXBlSWQuY2xhc3MpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUkVQSU5GT19QUklOQ0lQQUxfSURfQU5PTllNT1VTKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJpbmNpcGFsQW5vbnltb3VzKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFUElORk9fUFJJTkNJUEFMX0lEX0FOWU9ORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByaW5jaXBhbEFueW9uZShyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRVBJTkZPX0VYVEVOREVEX0ZFQVRVUkVTKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RXh0ZW5zaW9uRmVhdHVyZShhZGRUb0xpc3QodGFyZ2V0LmdldEV4dGVuc2lvbkZlYXR1cmVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhURU5ERURfRkVBVFVSRVNfUEFSU0VSLndhbGsocGFyc2VyKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGw+IENBUEFCSUxJVElFU19QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCBwcmVwYXJlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfQUNMKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FwYWJpbGl0eUFjbChyZWFkRW51bShwYXJzZXIsIENhcGFiaWxpdHlBY2wuY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfQUxMX1ZFUlNJT05TX1NFQVJDSEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRBbGxWZXJzaW9uc1NlYXJjaGFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX0NIQU5HRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYXBhYmlsaXR5Q2hhbmdlcyhyZWFkRW51bShwYXJzZXIsIENhcGFiaWxpdHlDaGFuZ2VzLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX0NPTlRFTlRfU1RSRUFNX1VQREFUQUJJTElUWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyhyZWFkRW51bShwYXJzZXIsIENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcy5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9HRVRfREVTQ0VOREFOVFMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTdXBwb3J0c0dldERlc2NlbmRhbnRzKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9HRVRfRk9MREVSX1RSRUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTdXBwb3J0c0dldEZvbGRlclRyZWUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX09SREVSX0JZKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FwYWJpbGl0eU9yZGVyQnkocmVhZEVudW0ocGFyc2VyLCBDYXBhYmlsaXR5T3JkZXJCeS5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9NVUxUSUZJTElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFN1cHBvcnRzTXVsdGlmaWxpbmcocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX1BXQ19TRUFSQ0hBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNQd2NTZWFyY2hhYmxlKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9QV0NfVVBEQVRBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNQd2NVcGRhdGFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX1FVRVJZKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FwYWJpbGl0eVF1ZXJ5KHJlYWRFbnVtKHBhcnNlciwgQ2FwYWJpbGl0eVF1ZXJ5LmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX1JFTkRJVElPTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYXBhYmlsaXR5UmVuZGl0aW9uKHJlYWRFbnVtKHBhcnNlciwgQ2FwYWJpbGl0eVJlbmRpdGlvbnMuY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfVU5GSUxJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTdXBwb3J0c1VuZmlsaW5nKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9WRVJTSU9OX1NQRUNJRklDX0ZJTElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9KT0lOKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FwYWJpbGl0eUpvaW4ocmVhZEVudW0ocGFyc2VyLCBDYXBhYmlsaXR5Sm9pbi5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKENSRUFUQUJMRV9QUk9QRVJUWV9UWVBFU19QQVJTRVIud2FsayhwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoTkVXX1RZUEVTX1NFVFRBQkxFX0FUVFJJQlVURVNfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxDcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbD4gQ1JFQVRBQkxFX1BST1BFUlRZX1RZUEVTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8Q3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIENyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsIHRhcmdldCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9DUkVBVEFCTEVfUFJPUEVSVFlfVFlQRVNfQ0FOQ1JFQVRFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuY2FuQ3JlYXRlKCkuYWRkKHJlYWRFbnVtKHBhcnNlciwgUHJvcGVydHlUeXBlLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGw+IE5FV19UWVBFU19TRVRUQUJMRV9BVFRSSUJVVEVTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsIHRhcmdldCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0lEKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0SWQocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfTE9DQUxOQU1FKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0TG9jYWxOYW1lKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0xPQ0FMTkFNRVNQQUNFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0TG9jYWxOYW1lc3BhY2UocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfRElTUExBWU5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXREaXNwbGF5TmFtZShyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19RVUVSWU5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXRRdWVyeU5hbWUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfREVTQ1JJUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5TZXREZXNjcmlwdGlvbihyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19DUkVBVEVBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0Q3JlYXRhYmxlKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0ZJTEVBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0RmlsZWFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0FQX05FV19UWVBFX1NFVFRBQkxFX0FUVFJJQlVURVNfUVVFUllBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0UXVlcnlhYmxlKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0ZVTExURVhUSU5ERVhFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhblNldEZ1bGx0ZXh0SW5kZXhlZChyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DQVBfTkVXX1RZUEVfU0VUVEFCTEVfQVRUUklCVVRFU19JTkNMVURFRElOU1VQRVJUWVRQRVFVRVJZKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFUE9MSUNZKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0NBUF9ORVdfVFlQRV9TRVRUQUJMRV9BVFRSSUJVVEVTX0NPTlRST0xBQkxFQUNMKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuU2V0Q29udHJvbGxhYmxlQWNsKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8QWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw+IEFDTF9DQVBBQklMSVRJRVNfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxBY2xDYXBhYmlsaXRpZXNEYXRhSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEFjbENhcGFiaWxpdGllc0RhdGFJbXBsIHRhcmdldCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0FDTENBUF9TVVBQT1JURURfUEVSTUlTU0lPTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTdXBwb3J0ZWRQZXJtaXNzaW9ucyhyZWFkRW51bShwYXJzZXIsIFN1cHBvcnRlZFBlcm1pc3Npb25zLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNMQ0FQX0FDTF9QUk9QQUdBVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEFjbFByb3BhZ2F0aW9uKHJlYWRFbnVtKHBhcnNlciwgQWNsUHJvcGFnYXRpb24uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGEoYWRkVG9MaXN0KHRhcmdldC5nZXRQZXJtaXNzaW9ucygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1JU1NJT05fREVGSU5JVElPTl9QQVJTRVIud2FsayhwYXJzZXIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNMQ0FQX1BFUk1JU1NJT05fTUFQUElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbk1hcHBpbmcgcG0gPSBQRVJNSVNTSU9OX01BUFBJTkdfUEFSU0VSLndhbGsocGFyc2VyKTsKLQotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4gbWFwcGluZyA9IHRhcmdldC5nZXRQZXJtaXNzaW9uTWFwcGluZygpOwotICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLnB1dChwbS5nZXRLZXkoKSwgcG0pOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsPiBQRVJNSVNTSU9OX0RFRklOSVRJT05fUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSwgUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbCB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0xDQVBfUEVSTUlTU0lPTl9QRVJNSVNTSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNMQ0FQX1BFUk1JU1NJT05fREVTQ1JJUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXNjcmlwdGlvbihyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGw+IFBFUk1JU1NJT05fTUFQUElOR19QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSwgUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbCB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0xDQVBfTUFQUElOR19LRVkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRLZXkocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNMQ0FQX01BUFBJTkdfUEVSTUlTU0lPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFBlcm1pc3Npb25zKGFkZFRvTGlzdCh0YXJnZXQuZ2V0UGVybWlzc2lvbnMoKSwgcmVhZFRleHQocGFyc2VyKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8RXh0ZW5zaW9uRmVhdHVyZUltcGw+IEVYVEVOREVEX0ZFQVRVUkVTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8RXh0ZW5zaW9uRmVhdHVyZUltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEV4dGVuc2lvbkZlYXR1cmVJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbkZlYXR1cmVJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBFeHRlbnNpb25GZWF0dXJlSW1wbCB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19GRUFUVVJFX0lEKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfRkVBVFVSRV9VUkwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRVcmwocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfRkVBVFVSRV9DT01NT05fTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENvbW1vbk5hbWUocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfRkVBVFVSRV9WRVJTSU9OX0xBQkVMKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VmVyc2lvbkxhYmVsKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0ZFQVRVUkVfREVTQ1JJUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXNjcmlwdGlvbihyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19GRUFUVVJFX0RBVEEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRhdGEgPSBGRUFUVVJFX0RBVEFfUEFSU0VSLndhbGsocGFyc2VyKTsKLQotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGZlYXR1cmVEYXRhID0gdGFyZ2V0LmdldEZlYXR1cmVEYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVEYXRhLnB1dChkYXRhWzBdLCBkYXRhWzFdKTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8U3RyaW5nW10+IEZFQVRVUkVfREFUQV9QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFN0cmluZ1tdPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwcmVwYXJlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMl07Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBTdHJpbmdbXSB0YXJnZXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfRkVBVFVSRV9EQVRBX0tFWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WzBdID0gcmVhZFRleHQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19GRUFUVVJFX0RBVEFfVkFMVUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldFsxXSA9IHJlYWRUZXh0KHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tIGRlZmluaXRpb24gcGFyc2VycyAtLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPEFic3RyYWN0VHlwZURlZmluaXRpb24+IFRZUEVfREVGX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWJzdHJhY3RUeXBlRGVmaW5pdGlvbj4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RUeXBlRGVmaW5pdGlvbiBwcmVwYXJlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgICAgIFN0cmluZyB0eXBlQXR0ciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShOQU1FU1BBQ0VfWFNJLCAidHlwZSIpOwotICAgICAgICAgICAgaWYgKHR5cGVBdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZUF0dHIuZW5kc1dpdGgoQVRUUl9ET0NVTUVOVF9UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfRk9MREVSX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfUkVMQVRJT05TSElQX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgKChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0QWxsb3dlZFNvdXJjZVR5cGVzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLSAgICAgICAgICAgICAgICAgICAgKChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0QWxsb3dlZFRhcmdldFR5cGVzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfUE9MSUNZX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQb2xpY3lUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVBdHRyLmVuZHNXaXRoKEFUVFJfSVRFTV9UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUF0dHIuZW5kc1dpdGgoQVRUUl9TRUNPTkRBUllfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCByZWFkIHR5cGUgZGVmaW5pdGlvbiEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEFic3RyYWN0VHlwZURlZmluaXRpb24gdGFyZ2V0KQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElkKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfTE9DQUxOQU1FKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0TG9jYWxOYW1lKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfTE9DQUxOQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRMb2NhbE5hbWVzcGFjZShyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0RJU1BMQVlOQU1FKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGlzcGxheU5hbWUocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9RVUVSWU5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRRdWVyeU5hbWUocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9ERVNDUklQVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlc2NyaXB0aW9uKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQkFTRV9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVJZCBiYXNlVHlwZSA9IHJlYWRFbnVtKHBhcnNlciwgQmFzZVR5cGVJZC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBiYXNlIHR5cGUhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QmFzZVR5cGVJZChiYXNlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9QQVJFTlRfSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQYXJlbnRUeXBlSWQocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9DUkVBVEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc0NyZWF0YWJsZShyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0ZJTEVBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNGaWxlYWJsZShyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1FVRVJZQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzUXVlcnlhYmxlKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfRlVMTFRFWFRfSU5ERVhFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzRnVsbHRleHRJbmRleGVkKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfSU5DTFVERV9JTl9TVVBFUlRZUEVfUVVFUlkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeShyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX0NPTlRST0xBQkxFX1BPTElDWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzQ29udHJvbGxhYmxlUG9saWN5KHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQ09OVFJPTEFCTEVfQUNMKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNDb250cm9sbGFibGVBY2wocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9UWVBFX01VVEFCSUxJVFkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRUeXBlTXV0YWJpbGl0eShUWVBFX01VVEFCSUxJVFlfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9TVFJJTkcpIHx8IGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX0lEKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfQk9PTEVBTikgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfSU5URUdFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX0RBVEVUSU1FKSB8fCBpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9ERUNJTUFMKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfSFRNTCkgfHwgaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfVVJJKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHlEZWZpbml0aW9uKFBST1BFUlRZX1RZUEVfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfVkVSU0lPTkFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldElzVmVyc2lvbmFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9DT05URU5UU1RSRUFNX0FMTE9XRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldENvbnRlbnRTdHJlYW1BbGxvd2VkKHJlYWRFbnVtKHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbUFsbG93ZWQuY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfQUxMT1dFRF9TT1VSQ0VfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwgcmVsVGFyZ2V0ID0gKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCkgdGFyZ2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVsVGFyZ2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbGxvd2VkU291cmNlVHlwZXMoYWRkVG9MaXN0KHJlbFRhcmdldC5nZXRBbGxvd2VkU291cmNlVHlwZUlkcygpLCByZWFkVGV4dChwYXJzZXIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9BTExPV0VEX1RBUkdFVF9UWVBFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCByZWxUYXJnZXQgPSAoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsKSB0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxUYXJnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFsbG93ZWRUYXJnZXRUeXBlcyhhZGRUb0xpc3QocmVsVGFyZ2V0LmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCksIHJlYWRUZXh0KHBhcnNlcikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPFR5cGVNdXRhYmlsaXR5SW1wbD4gVFlQRV9NVVRBQklMSVRZX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8VHlwZU11dGFiaWxpdHlJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBUeXBlTXV0YWJpbGl0eUltcGwgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZU11dGFiaWxpdHlJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBUeXBlTXV0YWJpbGl0eUltcGwgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfVFlQRV9NVVRBQklMSVRZX0NSRUFURSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENhbkNyZWF0ZShyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1RZUEVfTVVUQUJJTElUWV9VUERBVEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDYW5VcGRhdGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9UWVBFX01VVEFCSUxJVFlfREVMRVRFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FuRGVsZXRlKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8QWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248Pz4+IFBST1BFUlRZX1RZUEVfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248Pz4gcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX1NUUklORykpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1RhZyhuYW1lLCBUQUdfVFlQRV9QUk9QX0RFRl9JRCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlJZERlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX0JPT0xFQU4pKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX0lOVEVHRVIpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGFnKG5hbWUsIFRBR19UWVBFX1BST1BfREVGX0RBVEVUSU1FKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfREVDSU1BTCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfSFRNTCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNUYWcobmFtZSwgVEFHX1RZUEVfUFJPUF9ERUZfVVJJKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgcmVhZCBwcm9wZXJ0eSB0eXBlIGRlZmluaXRpb24hIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0lEKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRMb2NhbE5hbWUocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9MT0NBTE5BTUVTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldExvY2FsTmFtZXNwYWNlKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfRElTUExBWU5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREaXNwbGF5TmFtZShyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX1FVRVJZTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFF1ZXJ5TmFtZShyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFU0NSSVBUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVzY3JpcHRpb24ocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9QUk9QRVJUWV9UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUgcHJvcFR5cGUgPSByZWFkRW51bShwYXJzZXIsIFByb3BlcnR5VHlwZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eSBkYXRhIHR5cGUhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UHJvcGVydHlUeXBlKHByb3BUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0NBUkRJTkFMSVRZKSkgewotICAgICAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSA9IHJlYWRFbnVtKHBhcnNlciwgQ2FyZGluYWxpdHkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2FyZGluYWxpdHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY2FyZGluYWxpdHkhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2FyZGluYWxpdHkoY2FyZGluYWxpdHkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfVVBEQVRBQklMSVRZKSkgewotICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkYXRhYmlsaXR5ID0gcmVhZEVudW0ocGFyc2VyLCBVcGRhdGFiaWxpdHkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRhYmlsaXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHVwZGF0YWJpbGl0eSEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRVcGRhdGFiaWxpdHkodXBkYXRhYmlsaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0lOSEVSSVRFRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzSW5oZXJpdGVkKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfUkVRVUlSRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc1JlcXVpcmVkKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfUVVFUllBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SXNRdWVyeWFibGUocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9PUkRFUkFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc09yZGVyYWJsZShyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX09QRU5DSE9JQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJc09wZW5DaG9pY2UocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVN0cmluZyBwcm9wID0gUFJPUEVSVFlfU1RSSU5HX1BBUlNFUi53YWxrKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0RGVmYXVsdFZhbHVlKHByb3AuZ2V0VmFsdWVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX1NUUklOR19QQVJTRVIuYWRkVG9DaG9pY2VMaXN0KHBhcnNlciwgKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwpIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9NQVhfTEVOR1RIKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldE1heExlbmd0aChyZWFkSW50ZWdlcihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SWQgcHJvcCA9IFBST1BFUlRZX0lEX1BBUlNFUi53YWxrKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSE9JQ0VfU1RSSU5HX1BBUlNFUi5hZGRUb0Nob2ljZUxpc3QocGFyc2VyLCAoUHJvcGVydHlJZERlZmluaXRpb25JbXBsKSB0YXJnZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJvb2xlYW4gcHJvcCA9IFBST1BFUlRZX0JPT0xFQU5fUEFSU0VSLndhbGsocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0RGVmYXVsdFZhbHVlKHByb3AuZ2V0VmFsdWVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX0JPT0xFQU5fUEFSU0VSLmFkZFRvQ2hvaWNlTGlzdChwYXJzZXIsIChQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCkgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfREVBVUxUX1ZBTFVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyIHByb3AgPSBQUk9QRVJUWV9JTlRFR0VSX1BBUlNFUi53YWxrKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIT0lDRV9JTlRFR0VSX1BBUlNFUi5hZGRUb0Nob2ljZUxpc3QocGFyc2VyLCAoUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwpIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9NQVhfVkFMVUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldE1heFZhbHVlKHJlYWRJbnRlZ2VyKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfTUlOX1ZBTFVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXRNaW5WYWx1ZShyZWFkSW50ZWdlcihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0ZVRpbWUgcHJvcCA9IFBST1BFUlRZX0RBVEVUSU1FX1BBUlNFUi53YWxrKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSE9JQ0VfREFURVRJTUVfUEFSU0VSLmFkZFRvQ2hvaWNlTGlzdChwYXJzZXIsIChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9SRVNPTFVUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0RGF0ZVRpbWVSZXNvbHV0aW9uKHJlYWRFbnVtKHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVSZXNvbHV0aW9uLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0RFQVVMVF9WQUxVRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGVjaW1hbCBwcm9wID0gUFJPUEVSVFlfREVDSU1BTF9QQVJTRVIud2FsayhwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXREZWZhdWx0VmFsdWUocHJvcC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9DSE9JQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSE9JQ0VfREVDSU1BTF9QQVJTRVIuYWRkVG9DaG9pY2VMaXN0KHBhcnNlciwgKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSB0YXJnZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfTUFYX1ZBTFVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KS5zZXRNYXhWYWx1ZShyZWFkRGVjaW1hbChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX01JTl9WQUxVRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0TWluVmFsdWUocmVhZERlY2ltYWwocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9QUkVDSVNJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0UHJlY2lzaW9uKERlY2ltYWxQcmVjaXNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tVmFsdWUocmVhZEludGVnZXIocGFyc2VyKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGVudW0gdmFsdWUgLSBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfREVBVUxUX1ZBTFVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlIdG1sIHByb3AgPSBQUk9QRVJUWV9IVE1MX1BBUlNFUi53YWxrKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsKSB0YXJnZXQpLnNldERlZmF1bHRWYWx1ZShwcm9wLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENIT0lDRV9TVFJJTkdfUEFSU0VSLmFkZFRvQ2hvaWNlTGlzdChwYXJzZXIsIChQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCkgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUEVSVFlfVFlQRV9ERUFVTFRfVkFMVUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVVyaSBwcm9wID0gUFJPUEVSVFlfVVJJX1BBUlNFUi53YWxrKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwpIHRhcmdldCkuc2V0RGVmYXVsdFZhbHVlKHByb3AuZ2V0VmFsdWVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BFUlRZX1RZUEVfQ0hPSUNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0hPSUNFX1NUUklOR19QQVJTRVIuYWRkVG9DaG9pY2VMaXN0KHBhcnNlciwgKFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwpIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENob2ljZVhNTFdhbGtlcjxTdHJpbmc+IENIT0lDRV9TVFJJTkdfUEFSU0VSID0gbmV3IENob2ljZVhNTFdhbGtlcjxTdHJpbmc+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENob2ljZUltcGw8U3RyaW5nPiBjcmVhdGVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBDaG9pY2VJbXBsPFN0cmluZz4gdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZShhZGRUb0xpc3QodGFyZ2V0LmdldFZhbHVlKCksIHJlYWRUZXh0KHBhcnNlcikpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZENob2ljZShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBDaG9pY2VJbXBsPFN0cmluZz4gdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDaG9pY2UoYWRkVG9MaXN0KHRhcmdldC5nZXRDaG9pY2UoKSwgQ0hPSUNFX1NUUklOR19QQVJTRVIud2FsayhwYXJzZXIpKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hvaWNlWE1MV2Fsa2VyPEJvb2xlYW4+IENIT0lDRV9CT09MRUFOX1BBUlNFUiA9IG5ldyBDaG9pY2VYTUxXYWxrZXI8Qm9vbGVhbj4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2hvaWNlSW1wbDxCb29sZWFuPiBjcmVhdGVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VJbXBsPEJvb2xlYW4+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWUoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgQ2hvaWNlSW1wbDxCb29sZWFuPiB0YXJnZXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgdGFyZ2V0LnNldFZhbHVlKGFkZFRvTGlzdCh0YXJnZXQuZ2V0VmFsdWUoKSwgcmVhZEJvb2xlYW4ocGFyc2VyKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hvaWNlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIENob2ljZUltcGw8Qm9vbGVhbj4gdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDaG9pY2UoYWRkVG9MaXN0KHRhcmdldC5nZXRDaG9pY2UoKSwgQ0hPSUNFX0JPT0xFQU5fUEFSU0VSLndhbGsocGFyc2VyKSkpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENob2ljZVhNTFdhbGtlcjxCaWdJbnRlZ2VyPiBDSE9JQ0VfSU5URUdFUl9QQVJTRVIgPSBuZXcgQ2hvaWNlWE1MV2Fsa2VyPEJpZ0ludGVnZXI+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENob2ljZUltcGw8QmlnSW50ZWdlcj4gY3JlYXRlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2hvaWNlSW1wbDxCaWdJbnRlZ2VyPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIENob2ljZUltcGw8QmlnSW50ZWdlcj4gdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZShhZGRUb0xpc3QodGFyZ2V0LmdldFZhbHVlKCksIHJlYWRJbnRlZ2VyKHBhcnNlcikpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZENob2ljZShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBDaG9pY2VJbXBsPEJpZ0ludGVnZXI+IHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0Q2hvaWNlKGFkZFRvTGlzdCh0YXJnZXQuZ2V0Q2hvaWNlKCksIENIT0lDRV9JTlRFR0VSX1BBUlNFUi53YWxrKHBhcnNlcikpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaG9pY2VYTUxXYWxrZXI8R3JlZ29yaWFuQ2FsZW5kYXI+IENIT0lDRV9EQVRFVElNRV9QQVJTRVIgPSBuZXcgQ2hvaWNlWE1MV2Fsa2VyPEdyZWdvcmlhbkNhbGVuZGFyPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBDaG9pY2VJbXBsPEdyZWdvcmlhbkNhbGVuZGFyPiBjcmVhdGVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDaG9pY2VJbXBsPEdyZWdvcmlhbkNhbGVuZGFyPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIENob2ljZUltcGw8R3JlZ29yaWFuQ2FsZW5kYXI+IHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZSgpLCByZWFkRGF0ZVRpbWUocGFyc2VyKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hvaWNlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIENob2ljZUltcGw8R3JlZ29yaWFuQ2FsZW5kYXI+IHRhcmdldCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRDaG9pY2UoYWRkVG9MaXN0KHRhcmdldC5nZXRDaG9pY2UoKSwgQ0hPSUNFX0RBVEVUSU1FX1BBUlNFUi53YWxrKHBhcnNlcikpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaG9pY2VYTUxXYWxrZXI8QmlnRGVjaW1hbD4gQ0hPSUNFX0RFQ0lNQUxfUEFSU0VSID0gbmV3IENob2ljZVhNTFdhbGtlcjxCaWdEZWNpbWFsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBDaG9pY2VJbXBsPEJpZ0RlY2ltYWw+IGNyZWF0ZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENob2ljZUltcGw8QmlnRGVjaW1hbD4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBDaG9pY2VJbXBsPEJpZ0RlY2ltYWw+IHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0YXJnZXQuc2V0VmFsdWUoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZSgpLCByZWFkRGVjaW1hbChwYXJzZXIpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDaG9pY2UoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgQ2hvaWNlSW1wbDxCaWdEZWNpbWFsPiB0YXJnZXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgdGFyZ2V0LnNldENob2ljZShhZGRUb0xpc3QodGFyZ2V0LmdldENob2ljZSgpLCBDSE9JQ0VfREVDSU1BTF9QQVJTRVIud2FsayhwYXJzZXIpKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ2hvaWNlWE1MV2Fsa2VyPFQ+IGV4dGVuZHMgWE1MV2Fsa2VyPENob2ljZUltcGw8VD4+IHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRUb0Nob2ljZUxpc3QoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248VD4gcHJvcERlZikKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHByb3BEZWYuc2V0Q2hvaWNlcyhhZGRUb0xpc3QocHJvcERlZi5nZXRDaG9pY2VzKCksIHdhbGsocGFyc2VyKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IENob2ljZUltcGw8VD4gY3JlYXRlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2hvaWNlSW1wbDxUPiBwcmVwYXJlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgQ2hvaWNlSW1wbDxUPiByZXN1bHQgPSBjcmVhdGVUYXJnZXQocGFyc2VyLCBuYW1lKTsKLQotICAgICAgICAgICAgaWYgKHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0ciA9IHBhcnNlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChBVFRSX1BST1BFUlRZX1RZUEVfQ0hPSUNFX0RJU1BMQVlOQU1FLmVxdWFscyhhdHRyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBDaG9pY2VJbXBsPFQ+IHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRV9WQUxVRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZhbHVlKHBhcnNlciwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZldyByZXBvc2l0b3JpZXMgc2VuZCBpbnZhbGlkIHZhbHVlcyBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9HLmlzV2FybkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJGb3VuZCBpbnZhbGlkIGNob2ljZSB2YWx1ZSBmb3IgY2hvaWNlIGVudHJ5IFwie31cIiEiLCB0YXJnZXQuZ2V0RGlzcGxheU5hbWUoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9UWVBFX0NIT0lDRV9DSE9JQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENob2ljZShwYXJzZXIsIHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkVmFsdWUoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgQ2hvaWNlSW1wbDxUPiB0YXJnZXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci0KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkQ2hvaWNlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIENob2ljZUltcGw8VD4gdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBvYmplY3RzIGFuZCBsaXN0cyBwYXJzZXJzIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPE9iamVjdERhdGFJbXBsPiBPQkpFQ1RfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxPYmplY3REYXRhSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YUltcGwgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0RGF0YUltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIE9iamVjdERhdGFJbXBsIHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19PQkpFQ1RfUFJPUEVSVElFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByb3BlcnRpZXMoUFJPUEVSVElFU19QQVJTRVIud2FsayhwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19PQkpFQ1RfQUxMT1dBQkxFX0FDVElPTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRBbGxvd2FibGVBY3Rpb25zKEFMTE9XQUJMRV9BQ1RJT05TX1BBUlNFUi53YWxrKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX09CSkVDVF9SRUxBVElPTlNISVApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRSZWxhdGlvbnNoaXBzKGFkZFRvTGlzdCh0YXJnZXQuZ2V0UmVsYXRpb25zaGlwcygpLCBPQkpFQ1RfUEFSU0VSLndhbGsocGFyc2VyKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX09CSkVDVF9DSEFOR0VfRVZFTlRfSU5GTykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENoYW5nZUV2ZW50SW5mbyhDSEFOR0VfRVZFTlRfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfT0JKRUNUX0FDTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEFjbChBQ0xfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfT0JKRUNUX0VYQUNUX0FDTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElzRXhhY3RBY2wocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfT0JKRUNUX1BPTElDWV9JRFMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQb2xpY3lJZHMoUE9MSUNZX0lEU19QQVJTRVIud2FsayhwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19PQkpFQ1RfUkVORElUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UmVuZGl0aW9ucyhhZGRUb0xpc3QodGFyZ2V0LmdldFJlbmRpdGlvbnMoKSwgUkVORElUSU9OX1BBUlNFUi53YWxrKHBhcnNlcikpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPFByb3BlcnRpZXNJbXBsPiBQUk9QRVJUSUVTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8UHJvcGVydGllc0ltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFByb3BlcnRpZXNJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBQcm9wZXJ0aWVzSW1wbCB0YXJnZXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUF9TVFJJTkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRQcm9wZXJ0eShQUk9QRVJUWV9TVFJJTkdfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUF9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZFByb3BlcnR5KFBST1BFUlRZX0lEX1BBUlNFUi53YWxrKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BfQk9PTEVBTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmFkZFByb3BlcnR5KFBST1BFUlRZX0JPT0xFQU5fUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUF9JTlRFR0VSKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfSU5URUdFUl9QQVJTRVIud2FsayhwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QX0RBVEVUSU1FKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfREFURVRJTUVfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUFJPUF9ERUNJTUFMKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfREVDSU1BTF9QQVJTRVIud2FsayhwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QX0hUTUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRQcm9wZXJ0eShQUk9QRVJUWV9IVE1MX1BBUlNFUi53YWxrKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1BST1BfVVJJKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHkoUFJPUEVSVFlfVVJJX1BBUlNFUi53YWxrKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8QWxsb3dhYmxlQWN0aW9uc0ltcGw+IEFMTE9XQUJMRV9BQ1RJT05TX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWxsb3dhYmxlQWN0aW9uc0ltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEFsbG93YWJsZUFjdGlvbnNJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFsbG93YWJsZUFjdGlvbnNJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBBbGxvd2FibGVBY3Rpb25zSW1wbCB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IEFjdGlvbi5mcm9tVmFsdWUobmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU2V0PEFjdGlvbj4gYWN0aW9ucyA9IHRhcmdldC5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZEJvb2xlYW4ocGFyc2VyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBleHRlbnNpb24gdGFnIC0+IGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxDaGFuZ2VFdmVudEluZm9EYXRhSW1wbD4gQ0hBTkdFX0VWRU5UX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8Q2hhbmdlRXZlbnRJbmZvRGF0YUltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENoYW5nZUV2ZW50SW5mb0RhdGFJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENoYW5nZUV2ZW50SW5mb0RhdGFJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBDaGFuZ2VFdmVudEluZm9EYXRhSW1wbCB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19DSEFOR0VfRVZFTlRfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldENoYW5nZVR5cGUocmVhZEVudW0ocGFyc2VyLCBDaGFuZ2VUeXBlLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQ0hBTkdFX0VWRU5UX1RJTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRDaGFuZ2VUaW1lKHJlYWREYXRlVGltZShwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPEFjY2Vzc0NvbnRyb2xMaXN0SW1wbD4gQUNMX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWNjZXNzQ29udHJvbExpc3RJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBBY2Nlc3NDb250cm9sTGlzdEltcGwgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBBY2Nlc3NDb250cm9sTGlzdEltcGwgdGFyZ2V0KQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNMX1BFUk1JU1NJU09OUykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEFjZXMoYWRkVG9MaXN0KHRhcmdldC5nZXRBY2VzKCksIEFDRV9QQVJTRVIud2FsayhwYXJzZXIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxBY2Nlc3NDb250cm9sRW50cnlJbXBsPiBBQ0VfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxBY2Nlc3NDb250cm9sRW50cnlJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBBY2Nlc3NDb250cm9sRW50cnlJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwgdGFyZ2V0KQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNFX1BSSU5DSVBBTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByaW5jaXBhbChQUklOQ0lQQUxfUEFSU0VSLndhbGsocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNFX1BFUk1JU1NJT05TKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UGVybWlzc2lvbnMoYWRkVG9MaXN0KHRhcmdldC5nZXRQZXJtaXNzaW9ucygpLCByZWFkVGV4dChwYXJzZXIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQUNFX0lTX0RJUkVDVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERpcmVjdChyZWFkQm9vbGVhbihwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MV2Fsa2VyPEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbD4gUFJJTkNJUEFMX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8QWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbCB0YXJnZXQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19BQ0VfUFJJTkNJUEFMX0lEKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SWQocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxQb2xpY3lJZExpc3RJbXBsPiBQT0xJQ1lfSURTX1BBUlNFUiA9IG5ldyBYTUxXYWxrZXI8UG9saWN5SWRMaXN0SW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgUG9saWN5SWRMaXN0SW1wbCBwcmVwYXJlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBQb2xpY3lJZExpc3RJbXBsIHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QT0xJQ1lfSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRQb2xpY3lJZHMoYWRkVG9MaXN0KHRhcmdldC5nZXRQb2xpY3lJZHMoKSwgcmVhZFRleHQocGFyc2VyKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UmVuZGl0aW9uRGF0YUltcGw+IFJFTkRJVElPTl9QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPFJlbmRpdGlvbkRhdGFJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBSZW5kaXRpb25EYXRhSW1wbCBwcmVwYXJlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZW5kaXRpb25EYXRhSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSwgUmVuZGl0aW9uRGF0YUltcGwgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFTkRJVElPTl9TVFJFQU1fSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRTdHJlYW1JZChyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fTUlNRVRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRNaW1lVHlwZShyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fTEVOR1RIKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QmlnTGVuZ3RoKHJlYWRJbnRlZ2VyKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFTkRJVElPTl9LSU5EKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0S2luZChyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRUaXRsZShyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19SRU5ESVRJT05fSEVJR0hUKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QmlnSGVpZ2h0KHJlYWRJbnRlZ2VyKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFTkRJVElPTl9XSURUSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEJpZ1dpZHRoKHJlYWRJbnRlZ2VyKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1JFTkRJVElPTl9ET0NVTUVOVF9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFJlbmRpdGlvbkRvY3VtZW50SWQocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBwcm9wZXJ0eSBwYXJzZXJzIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlYTUxXYWxrZXI8UHJvcGVydHlTdHJpbmdJbXBsPiBQUk9QRVJUWV9TVFJJTkdfUEFSU0VSID0gbmV3IFByb3BlcnR5U3RyaW5nWE1MV2Fsa2VyPFByb3BlcnR5U3RyaW5nSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgUHJvcGVydHlTdHJpbmdJbXBsIGNyZWF0ZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5U3RyaW5nSW1wbCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5SWRJbXBsPiBQUk9QRVJUWV9JRF9QQVJTRVIgPSBuZXcgUHJvcGVydHlTdHJpbmdYTUxXYWxrZXI8UHJvcGVydHlJZEltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFByb3BlcnR5SWRJbXBsIGNyZWF0ZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SWRJbXBsKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlYTUxXYWxrZXI8UHJvcGVydHlIdG1sSW1wbD4gUFJPUEVSVFlfSFRNTF9QQVJTRVIgPSBuZXcgUHJvcGVydHlTdHJpbmdYTUxXYWxrZXI8UHJvcGVydHlIdG1sSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgUHJvcGVydHlIdG1sSW1wbCBjcmVhdGVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUh0bWxJbXBsKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlYTUxXYWxrZXI8UHJvcGVydHlVcmlJbXBsPiBQUk9QRVJUWV9VUklfUEFSU0VSID0gbmV3IFByb3BlcnR5U3RyaW5nWE1MV2Fsa2VyPFByb3BlcnR5VXJpSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgUHJvcGVydHlVcmlJbXBsIGNyZWF0ZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5VXJpSW1wbCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5Qm9vbGVhbkltcGw+IFBST1BFUlRZX0JPT0xFQU5fUEFSU0VSID0gbmV3IFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5Qm9vbGVhbkltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFByb3BlcnR5Qm9vbGVhbkltcGwgY3JlYXRlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlCb29sZWFuSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFByb3BlcnR5Qm9vbGVhbkltcGwgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZXMoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZXMoKSwgcmVhZEJvb2xlYW4ocGFyc2VyKSkpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5SW50ZWdlckltcGw+IFBST1BFUlRZX0lOVEVHRVJfUEFSU0VSID0gbmV3IFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5SW50ZWdlckltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFByb3BlcnR5SW50ZWdlckltcGwgY3JlYXRlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFByb3BlcnR5SW50ZWdlckltcGwgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZXMoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZXMoKSwgcmVhZEludGVnZXIocGFyc2VyKSkpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5RGVjaW1hbEltcGw+IFBST1BFUlRZX0RFQ0lNQUxfUEFSU0VSID0gbmV3IFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5RGVjaW1hbEltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFByb3BlcnR5RGVjaW1hbEltcGwgY3JlYXRlVGFyZ2V0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFByb3BlcnR5RGVjaW1hbEltcGwgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZXMoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZXMoKSwgcmVhZERlY2ltYWwocGFyc2VyKSkpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5WE1MV2Fsa2VyPFByb3BlcnR5RGF0ZVRpbWVJbXBsPiBQUk9QRVJUWV9EQVRFVElNRV9QQVJTRVIgPSBuZXcgUHJvcGVydHlYTUxXYWxrZXI8UHJvcGVydHlEYXRlVGltZUltcGw+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFByb3BlcnR5RGF0ZVRpbWVJbXBsIGNyZWF0ZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWUoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUHJvcGVydHlEYXRlVGltZUltcGwgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZXMoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZXMoKSwgcmVhZERhdGVUaW1lKHBhcnNlcikpKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQcm9wZXJ0eVhNTFdhbGtlcjxUIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eURhdGE8Pz4+IGV4dGVuZHMgWE1MV2Fsa2VyPFQ+IHsKLQotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBjcmVhdGVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBUIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBUIHJlc3VsdCA9IGNyZWF0ZVRhcmdldChwYXJzZXIsIG5hbWUpOwotCi0gICAgICAgICAgICBpZiAocGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyID0gcGFyc2VyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFUVFJfUFJPUEVSVFlfSUQuZXF1YWxzKGF0dHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0SWQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBVFRSX1BST1BFUlRZX0xPQ0FMTkFNRS5lcXVhbHMoYXR0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWUocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBVFRSX1BST1BFUlRZX0RJU1BMQVlOQU1FLmVxdWFscyhhdHRyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQVRUUl9QUk9QRVJUWV9RVUVSWU5BTUUuZXF1YWxzKGF0dHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0UXVlcnlOYW1lKHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRWYWx1ZShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBUIHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBUIHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19QUk9QRVJUWV9WQUxVRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZhbHVlKHBhcnNlciwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZldyByZXBvc2l0b3JpZXMgc2VuZCBpbnZhbGlkIHZhbHVlcyBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgaW4gc29tZSBjYXNlcyBTaGFyZVBvaW50IHNlbmRzIGFuIGVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAidmFsdWUiIHRhZyBpbnN0ZWFkIG9mIG9taXR0aW5nIHRoZSAidmFsdWUiIHRhZyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgYSAibm90IHNldCIgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0+IGJlaW5nIHRvbGVyYW50IGlzIGJldHRlciB0aGFuIGJyZWFraW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBiZWNhdXNlIG9mIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNXYXJuRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIkZvdW5kIGludmFsaWQgcHJvcGVydHkgdmFsdWUgZm9yIHByb3BlcnR5IHt9ISIsIHRhcmdldC5nZXRJZCgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUHJvcGVydHlTdHJpbmdYTUxXYWxrZXI8VCBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlEYXRhPFN0cmluZz4+IGV4dGVuZHMKLSAgICAgICAgICAgIFByb3BlcnR5WE1MV2Fsa2VyPFQ+IHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFQgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRhcmdldC5zZXRWYWx1ZXMoYWRkVG9MaXN0KHRhcmdldC5nZXRWYWx1ZXMoKSwgcmVhZFRleHQocGFyc2VyKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0gcXVlcnkgcGFyc2VyIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxXYWxrZXI8UXVlcnlUeXBlSW1wbD4gUVVFUllfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxRdWVyeVR5cGVJbXBsPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBRdWVyeVR5cGVJbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5VHlwZUltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIFF1ZXJ5VHlwZUltcGwgdGFyZ2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChpc0NtaXNOYW1lc3BhY2UobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1FVRVJZX1NUQVRFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFN0YXRlbWVudChyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19RVUVSWV9TRUFSQ0hBTExWRVJTSU9OUykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFNlYXJjaEFsbFZlcnNpb25zKHJlYWRCb29sZWFuKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1FVRVJZX0lOQ0xVREVBTExPV0FCTEVBQ1RJT05TKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMocmVhZEJvb2xlYW4ocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUVVFUllfSU5DTFVERVJFTEFUSU9OU0hJUFMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJbmNsdWRlUmVsYXRpb25zaGlwcyhyZWFkRW51bShwYXJzZXIsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUVVFUllfUkVORElUSU9ORklMVEVSKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0UmVuZGl0aW9uRmlsdGVyKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX1FVRVJZX01BWElURU1TKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0TWF4SXRlbXMocmVhZEludGVnZXIocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfUVVFUllfU0tJUENPVU5UKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0U2tpcENvdW50KHJlYWRJbnRlZ2VyKHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBidWxrIHVwZGF0ZSBwYXJzZXIgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxCdWxrVXBkYXRlSW1wbD4gQlVMS19VUERBVEVfUEFSU0VSID0gbmV3IFhNTFdhbGtlcjxCdWxrVXBkYXRlSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQnVsa1VwZGF0ZUltcGwgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVsa1VwZGF0ZUltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZWFkKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFFOYW1lIG5hbWUsIEJ1bGtVcGRhdGVJbXBsIHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbWlzTmFtZXNwYWNlKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19CVUxLX1VQREFURV9JRF9BTkRfVE9LRU4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRPYmplY3RJZEFuZENoYW5nZVRva2VuKGFkZFRvTGlzdCh0YXJnZXQuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0FORF9UT0tFTl9QQVJTRVIud2FsayhwYXJzZXIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfQlVMS19VUERBVEVfUFJPUEVSVElFUykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFByb3BlcnRpZXMoUFJPUEVSVElFU19QQVJTRVIud2FsayhwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19CVUxLX1VQREFURV9BRERfU0VDT05EQVJZX1RZUEVTKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QWRkU2Vjb25kYXJ5VHlwZUlkcyhhZGRUb0xpc3QodGFyZ2V0LmdldEFkZFNlY29uZGFyeVR5cGVJZHMoKSwgcmVhZFRleHQocGFyc2VyKSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0JVTEtfVVBEQVRFX1JFTU9WRV9TRUNPTkRBUllfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRSZW1vdmVTZWNvbmRhcnlUeXBlSWRzKGFkZFRvTGlzdCh0YXJnZXQuZ2V0UmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcygpLCByZWFkVGV4dChwYXJzZXIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTFdhbGtlcjxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw+IElEX0FORF9UT0tFTl9QQVJTRVIgPSBuZXcgWE1MV2Fsa2VyPEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsIHByZXBhcmVUYXJnZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgUU5hbWUgbmFtZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwgdGFyZ2V0KQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQ21pc05hbWVzcGFjZShuYW1lKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1RhZyhuYW1lLCBUQUdfSURBTkRUT0tFTl9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElkKHJlYWRUZXh0KHBhcnNlcikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNUYWcobmFtZSwgVEFHX0lEQU5EVE9LRU5fTkVXSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXROZXdJZChyZWFkVGV4dChwYXJzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzVGFnKG5hbWUsIFRBR19JREFORFRPS0VOX0NIQU5HRVRPS0VOKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0Q2hhbmdlVG9rZW4ocmVhZFRleHQocGFyc2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MVXRpbHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvWE1MVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1ZWE3MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgY29tLmN0Yy53c3R4LmFwaS5JbnZhbGlkQ2hhckhhbmRsZXI7Ci1pbXBvcnQgY29tLmN0Yy53c3R4LmFwaS5Xc3R4T3V0cHV0UHJvcGVydGllczsKLWltcG9ydCBjb20uY3RjLndzdHguc3RheC5Xc3R4SW5wdXRGYWN0b3J5OwotaW1wb3J0IGNvbS5jdGMud3N0eC5zdGF4LldzdHhPdXRwdXRGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFhNTFV0aWxzLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTElucHV0RmFjdG9yeSBYTUxfSU5QVVRfRkFDVE9SWTsKLSAgICBzdGF0aWMgewotICAgICAgICBYTUxJbnB1dEZhY3RvcnkgZmFjdG9yeTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gV29vZHN0b3ggaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGFuZCB0ZXN0ZWQgU3RBWCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgV3N0eElucHV0RmFjdG9yeSB3c3R4RmFjdG9yeSA9IChXc3R4SW5wdXRGYWN0b3J5KSBDbGFzc0xvYWRlclV0aWwubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAiY29tLmN0Yy53c3R4LnN0YXguV3N0eElucHV0RmFjdG9yeSIpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB3c3R4RmFjdG9yeS5jb25maWd1cmVGb3JTcGVlZCgpOwotCi0gICAgICAgICAgICBmYWN0b3J5ID0gd3N0eEZhY3Rvcnk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBvdGhlciBTdEFYIGltcGxlbWVudGF0aW9ucyBtYXkgd29yaywgdG9vCi0gICAgICAgICAgICBmYWN0b3J5ID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBTSlNYUCBwYXJzZXIKLSAgICAgICAgICAgICAgICBmYWN0b3J5LnNldFByb3BlcnR5KCJyZXVzZS1pbnN0YW5jZSIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExPRy53YXJuKCJVbnN1cHBvcnRlZCBTdEFYIHBhcnNlcjogIiArIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIChFeGNlcHRpb246ICIgKyBlLnRvU3RyaW5nKCkgKyAiKSIsCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmFjdG9yeS5zZXRQcm9wZXJ0eShYTUxJbnB1dEZhY3RvcnkuSVNfQ09BTEVTQ0lORywgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0UHJvcGVydHkoWE1MSW5wdXRGYWN0b3J5LlNVUFBPUlRfRFRELCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgZmFjdG9yeS5zZXRQcm9wZXJ0eShYTUxJbnB1dEZhY3RvcnkuSVNfVkFMSURBVElORywgQm9vbGVhbi5GQUxTRSk7Ci0KLSAgICAgICAgWE1MX0lOUFVUX0ZBQ1RPUlkgPSBmYWN0b3J5OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFhNTE91dHB1dEZhY3RvcnkgWE1MX09VVFBVVF9GQUNUT1JZOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFhNTE91dHB1dEZhY3RvcnkgZmFjdG9yeTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gV29vZHN0b3ggaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGFuZCB0ZXN0ZWQgU3RBWCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgV3N0eE91dHB1dEZhY3Rvcnkgd3N0eEZhY3RvcnkgPSAoV3N0eE91dHB1dEZhY3RvcnkpIENsYXNzTG9hZGVyVXRpbC5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICJjb20uY3RjLndzdHguc3RheC5Xc3R4T3V0cHV0RmFjdG9yeSIpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB3c3R4RmFjdG9yeS5jb25maWd1cmVGb3JTcGVlZCgpOwotICAgICAgICAgICAgd3N0eEZhY3Rvcnkuc2V0UHJvcGVydHkoV3N0eE91dHB1dFByb3BlcnRpZXMuUF9PVVRQVVRfSU5WQUxJRF9DSEFSX0hBTkRMRVIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnZhbGlkQ2hhckhhbmRsZXIuUmVwbGFjaW5nSGFuZGxlcignICcpKTsKLQotICAgICAgICAgICAgZmFjdG9yeSA9IHdzdHhGYWN0b3J5OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb3RoZXIgU3RBWCBpbXBsZW1lbnRhdGlvbnMgbWF5IHdvcmssIHRvbwotICAgICAgICAgICAgZmFjdG9yeSA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIFNKU1hQIHBhcnNlcgotICAgICAgICAgICAgICAgIGZhY3Rvcnkuc2V0UHJvcGVydHkoInJldXNlLWluc3RhbmNlIiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTE9HLndhcm4oIlVuc3VwcG9ydGVkIFN0QVggcGFyc2VyOiAiICsgZmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgKEV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSArICIpIiwKLSAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmYWN0b3J5LnNldFByb3BlcnR5KFhNTE91dHB1dEZhY3RvcnkuSVNfUkVQQUlSSU5HX05BTUVTUEFDRVMsIEJvb2xlYW4uRkFMU0UpOwotCi0gICAgICAgIFhNTF9PVVRQVVRfRkFDVE9SWSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYTUxVdGlscygpIHsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSB3cml0ZXIgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgWE1MIHdyaXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCBvdXQgIT0gbnVsbDsKLQotICAgICAgICByZXR1cm4gWE1MX09VVFBVVF9GQUNUT1JZLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXQsIElPVXRpbHMuVVRGOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGEgWE1MIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydFhtbERvY3VtZW50KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgd3JpdGVyICE9IG51bGw7Ci0KLSAgICAgICAgd3JpdGVyLnNldFByZWZpeChYTUxDb25zdGFudHMuUFJFRklYX0FUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7Ci0gICAgICAgIHdyaXRlci5zZXRQcmVmaXgoWE1MQ29uc3RhbnRzLlBSRUZJWF9DTUlTLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00pOwotICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFhNTENvbnN0YW50cy5QUkVGSVhfQVBBQ0hFX0NIRU1JU1RZLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQQUNIRV9DSEVNSVNUUlkpOwotCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmRzIGEgWE1MIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmRYbWxEb2N1bWVudChYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHdyaXRlciAhPSBudWxsOwotCi0gICAgICAgIHdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIFN0cmluZyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyB0YWcsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgd3JpdGVyICE9IG51bGw7Ci0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHRhZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCB0YWcsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyh2YWx1ZSk7Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gSW50ZWdlciB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyB0YWcsIEJpZ0ludGVnZXIgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHdyaXRlciAhPSBudWxsOwotCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZSh3cml0ZXIsIHByZWZpeCwgbmFtZXNwYWNlLCB0YWcsIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIERlY2ltYWwgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdGFnLCBCaWdEZWNpbWFsIHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCB3cml0ZXIgIT0gbnVsbDsKLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGUod3JpdGVyLCBwcmVmaXgsIG5hbWVzcGFjZSwgdGFnLCB2YWx1ZS50b1BsYWluU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIERhdGVUaW1lIHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHRhZywKLSAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHdyaXRlciAhPSBudWxsOwotCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZSh3cml0ZXIsIHByZWZpeCwgbmFtZXNwYWNlLCB0YWcsIERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgQm9vbGVhbiB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyB0YWcsIEJvb2xlYW4gdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHdyaXRlciAhPSBudWxsOwotCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZSh3cml0ZXIsIHByZWZpeCwgbmFtZXNwYWNlLCB0YWcsIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIEVudW0gdGFnLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgdGFnLCBFbnVtPD8+IHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCB3cml0ZXIgIT0gbnVsbDsKLQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGVudW1WYWx1ZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVudW1WYWx1ZSA9IHZhbHVlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJ2YWx1ZSIsIG5ldyBDbGFzc1swXSkuaW52b2tlKHZhbHVlLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkNhbm5vdCBnZXQgZW51bSB2YWx1ZSIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGUod3JpdGVyLCBwcmVmaXgsIG5hbWVzcGFjZSwgdGFnLCBlbnVtVmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tLSBwYXJzZXIgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IFhNTCBwYXJzZXIgd2l0aCBPcGVuQ01JUyBkZWZhdWx0IHNldHRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtUmVhZGVyIGNyZWF0ZVBhcnNlcihJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gWE1MX0lOUFVUX0ZBQ1RPUlkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHN0cmVhbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIHBhcnNlciB0byB0aGUgbmV4dCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXh0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7Ci0KLSAgICAgICAgaWYgKHBhcnNlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHBhcnNlci5uZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTa2lwcyBhIHRhZyBvciBzdWJ0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7Ci0KLSAgICAgICAgaW50IGxldmVsID0gMTsKLSAgICAgICAgd2hpbGUgKG5leHQocGFyc2VyKSkgewotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbGV2ZWwrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgbGV2ZWwtLTsKLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0KHBhcnNlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTW92ZXMgdGhlIHBhcnNlciB0byB0aGUgbmV4dCBzdGFydCBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5vdGhlciBzdGFydCBlbGVtZW50IGhhcyBiZWVuIGZvdW5kLAotICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaW5kTmV4dFN0YXJ0RWxlbWVuZXQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCBwYXJzZXIgIT0gbnVsbDsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOwotCi0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcnNlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBwYXJzZXIubmV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSB0YWcgdGhhdCBjb250YWlucyB0ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRUZXh0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIGludCBtYXhMZW5ndGgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBtYXhMZW5ndGggPj0gMDsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBuZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMgfHwgZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNEQVRBKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHBhcnNlci5nZXRUZXh0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpICsgbGVuID4gbWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGxpbWl0IGV4Y2VlZGVkISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gcGFyc2VyLmdldFRleHRDaGFyYWN0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBwYXJzZXIuZ2V0VGV4dFN0YXJ0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoYXJzLCBvZmZzZXQsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGFnOiAiICsgcGFyc2VyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbmV4dChwYXJzZXIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tLSBET00gc3R1ZmYgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBEb2N1bWVudEJ1aWxkZXJ9IG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXIgbmV3RG9jdW1lbnRCdWlsZGVyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0RmVhdHVyZShqYXZheC54bWwuWE1MQ29uc3RhbnRzLkZFQVRVUkVfU0VDVVJFX1BST0NFU1NJTkcsIHRydWUpOwotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICBmYWN0b3J5LnNldElnbm9yaW5nQ29tbWVudHModHJ1ZSk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhmYWxzZSk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0Q29hbGVzY2luZyhmYWxzZSk7Ci0KLSAgICAgICAgZmFjdG9yeS5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyIsIGZhbHNlKTsKLSAgICAgICAgZmFjdG9yeS5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtcGFyYW1ldGVyLWVudGl0aWVzIiwgZmFsc2UpOwotICAgICAgICBmYWN0b3J5LnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9kaXNhbGxvdy1kb2N0eXBlLWRlY2wiLCB0cnVlKTsKLQotICAgICAgICByZXR1cm4gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IERPTSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IG5ld0RvbURvY3VtZW50KCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBzdHJlYW0gYW5kIHJldHVybnMgdGhlIERPTSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlRG9tRG9jdW1lbnQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2Uoc3RyZWFtKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTFdhbGtlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9YTUxXYWxrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkMTA5Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL1hNTFdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzLm5leHQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlscy5za2lwOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DbWlzRXh0ZW5zaW9uRWxlbWVudEltcGw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxXYWxrZXI8VD4gewotCi0gICAgcHVibGljIFQgd2FsayhYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHBhcnNlciAhPSBudWxsOwotCi0gICAgICAgIGZpbmFsIFQgcmVzdWx0ID0gcHJlcGFyZVRhcmdldChwYXJzZXIsIHBhcnNlci5nZXROYW1lKCkpOwotCi0gICAgICAgIG5leHQocGFyc2VyKTsKLQotICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIHRhZ3MKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICghcmVhZChwYXJzZXIsIG5hbWUsIHJlc3VsdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEV4dGVuc2lvbnNEYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeHRlbnNpb24ocGFyc2VyLCAoRXh0ZW5zaW9uc0RhdGEpIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBza2lwKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIW5leHQocGFyc2VyKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NtaXNOYW1lc3BhY2UoUU5hbWUgbmFtZSkgewotICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotCi0gICAgICAgIHJldHVybiBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMuaGFzaENvZGUoKSA9PSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmhhc2hDb2RlKCkKLSAgICAgICAgICAgICAgICAmJiBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMuZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXRvbU5hbWVzcGFjZShRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGFzc2VydCBuYW1lICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTS5oYXNoQ29kZSgpID09IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICYmIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWcoUU5hbWUgbmFtZSwgU3RyaW5nIHRhZykgewotICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdGFnICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIHRhZy5oYXNoQ29kZSgpID09IG5hbWUuZ2V0TG9jYWxQYXJ0KCkuaGFzaENvZGUoKSAmJiB0YWcuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUV4dGVuc2lvbihYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBFeHRlbnNpb25zRGF0YSBleHREYXRhKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHBhcnNlciAhPSBudWxsOwotCi0gICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbnMgPSBleHREYXRhLmdldEV4dGVuc2lvbnMoKTsKLSAgICAgICAgaWYgKGV4dGVuc2lvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICBleHREYXRhLnNldEV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zaXplKCkgKyAxID4gWE1MQ29uc3RyYWludHMuTUFYX0VYVEVOU0lPTlNfV0lEVEgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUb28gbWFueSBleHRlbnNpb25zISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXh0ZW5zaW9ucy5hZGQoaGFuZGxlRXh0ZW5zaW9uTGV2ZWwocGFyc2VyLCAwKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbWlzRXh0ZW5zaW9uRWxlbWVudCBoYW5kbGVFeHRlbnNpb25MZXZlbChmaW5hbCBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBmaW5hbCBpbnQgbGV2ZWwpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHBhcnNlciAhPSBudWxsOwotCi0gICAgICAgIGZpbmFsIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gY2hpbGRyZW4gPSBudWxsOwotCi0gICAgICAgIGlmIChwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQocGFyc2VyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKSwgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG5leHQocGFyc2VyKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gcGFyc2VyLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSArIHMubGVuZ3RoKCkgPiBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBsaW1pdCBleGNlZWRlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGlmIChsZXZlbCArIDEgPiBYTUxDb25zdHJhaW50cy5NQVhfRVhURU5TSU9OU19ERVBUSCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiRXh0ZW5zaW9ucyB0cmVlIHRvbyBkZWVwISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4uc2l6ZSgpICsgMSA+IFhNTENvbnN0cmFpbnRzLk1BWF9FWFRFTlNJT05TX1dJRFRIKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJFeHRlbnNpb25zIHRyZWUgdG9vIHdpZGUhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGhhbmRsZUV4dGVuc2lvbkxldmVsKHBhcnNlciwgbGV2ZWwgKyAxKSk7Ci0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFuZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG5leHQocGFyc2VyKTsKLQotICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwobmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSwgYXR0cmlidXRlcywgY2hpbGRyZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwobmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZS5nZXRMb2NhbFBhcnQoKSwgYXR0cmlidXRlcywgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgPFM+IExpc3Q8Uz4gYWRkVG9MaXN0KExpc3Q8Uz4gbGlzdCwgUyB2YWx1ZSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxTPigpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRUZXh0KGZpbmFsIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIFhNTFV0aWxzLnJlYWRUZXh0KHBhcnNlciwgWE1MQ29uc3RyYWludHMuTUFYX1NUUklOR19MRU5HVEgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCb29sZWFuIHJlYWRCb29sZWFuKGZpbmFsIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZFRleHQocGFyc2VyKTsKLQotICAgICAgICBpZiAoInRydWUiLmVxdWFscyh2YWx1ZSkgfHwgIjEiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoImZhbHNlIi5lcXVhbHModmFsdWUpIHx8ICIwIi5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGJvb2xlYW4gdmFsdWUhIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmVhZEludGVnZXIoZmluYWwgWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCBwYXJzZXIgIT0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSByZWFkVGV4dChwYXJzZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgaW50ZWdlciB2YWx1ZSEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBCaWdEZWNpbWFsIHJlYWREZWNpbWFsKGZpbmFsIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZFRleHQocGFyc2VyKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRlY2ltYWwgdmFsdWUhIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgR3JlZ29yaWFuQ2FsZW5kYXIgcmVhZERhdGVUaW1lKGZpbmFsIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBhc3NlcnQgcGFyc2VyICE9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZFRleHQocGFyc2VyKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciByZXN1bHQgPSBEYXRlVGltZUhlbHBlci5wYXJzZVhtbERhdGVUaW1lKHZhbHVlKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkYXRldGltZSB2YWx1ZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIDxFIGV4dGVuZHMgRW51bTxFPj4gRSByZWFkRW51bShmaW5hbCBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBmaW5hbCBDbGFzczxFPiBjbGF6eikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydCBwYXJzZXIgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGNsYXp6ICE9IG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIENtaXNFbnVtSGVscGVyLmZyb21WYWx1ZShyZWFkVGV4dChwYXJzZXIpLCBjbGF6eik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFQgcHJlcGFyZVRhcmdldChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcmVhZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBRTmFtZSBuYW1lLCBUIHRhcmdldCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RFeHRlbnNpb25EYXRhLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0Fic3RyYWN0RXh0ZW5zaW9uRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDZiMGI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RFeHRlbnNpb25EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotCi0vKioKLSAqIEFic3RyYWN0IGV4dGVuc2lvbiBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgRXh0ZW5zaW9uc0RhdGEsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9uczsKLQotICAgIHB1YmxpYyBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBnZXRFeHRlbnNpb25zKCkgewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25zKExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIltleHRlbnNpb25zPSIgKyBleHRlbnNpb25zICsgIl0iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RQcm9wZXJ0eURhdGEuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RQcm9wZXJ0eURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2YmU5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0Fic3RyYWN0UHJvcGVydHlEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVQcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YVdpdGhEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0IHByb3BlcnR5IGRhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5RGF0YTxUPiBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzIE11dGFibGVQcm9wZXJ0eURhdGE8VD4sCi0gICAgICAgIFByb3BlcnR5RGF0YVdpdGhEZWZpbml0aW9uPFQ+IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5TmFtZTsKLSAgICBwcml2YXRlIFByb3BlcnR5RGVmaW5pdGlvbjxUPiBwcm9wRGVmOwotCi0gICAgcHJpdmF0ZSBMaXN0PFQ+IHZhbHVlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0gICAgcHVibGljIFByb3BlcnR5RGVmaW5pdGlvbjxUPiBnZXRQcm9wZXJ0eURlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBwcm9wRGVmOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248VD4gcHJvcERlZikgewotICAgICAgICB0aGlzLnByb3BEZWYgPSBwcm9wRGVmOwotICAgICAgICBpZiAocHJvcERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gcHJvcERlZi5nZXRJZCgpOwotICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IHByb3BEZWYuZ2V0RGlzcGxheU5hbWUoKTsKLSAgICAgICAgICAgIHRoaXMubG9jYWxOYW1lID0gcHJvcERlZi5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIHRoaXMucXVlcnlOYW1lID0gcHJvcERlZi5nZXRRdWVyeU5hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuaWQgPSBudWxsOwotICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLnF1ZXJ5TmFtZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICByZXR1cm4gZGlzcGxheU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0gICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeU5hbWUoU3RyaW5nIHF1ZXJ5TmFtZSkgewotICAgICAgICB0aGlzLnF1ZXJ5TmFtZSA9IHF1ZXJ5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUPiBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWVzKExpc3Q8VD4gdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWVzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFQ+KDEpOwotICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBnZXRGaXJzdFZhbHVlKCkgewotICAgICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuZ2V0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSBbaWQ9IiArIGlkICsgIiwgZGlzcGxheSBOYW1lPSIgKyBkaXNwbGF5TmFtZSArICIsIGxvY2FsIG5hbWU9IiArIGxvY2FsTmFtZSArICIsIHF1ZXJ5IG5hbWU9IgotICAgICAgICAgICAgICAgICsgcXVlcnlOYW1lICsgIiwgdmFsdWVzPSIgKyB2YWx1ZXMgKyAiXSIgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiNWU4Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0Fic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkNob2ljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLQotLyoqCi0gKiBBYnN0cmFjdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGRhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjxUPiBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzCi0gICAgICAgIE11dGFibGVQcm9wZXJ0eURlZmluaXRpb248VD4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZTsKLSAgICBwcml2YXRlIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5OwotICAgIHByaXZhdGUgTGlzdDxDaG9pY2U8VD4+IGNob2ljZUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFQ+IGRlZmF1bHRWYWx1ZTsKLSAgICBwcml2YXRlIFVwZGF0YWJpbGl0eSB1cGRhdGFiaWxpdHk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzSW5oZXJpdGVkOwotICAgIHByaXZhdGUgQm9vbGVhbiBpc1F1ZXJ5YWJsZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gaXNPcmRlcmFibGU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzUmVxdWlyZWQ7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzT3BlbkNob2ljZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gbG9jYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWVzcGFjZShTdHJpbmcgbG9jYWxOYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWVzcGFjZSA9IGxvY2FsTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlOYW1lKCkgewotICAgICAgICByZXR1cm4gcXVlcnlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5TmFtZShTdHJpbmcgcXVlcnlOYW1lKSB7Ci0gICAgICAgIHRoaXMucXVlcnlOYW1lID0gcXVlcnlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLSAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eVR5cGUgZ2V0UHJvcGVydHlUeXBlKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VHlwZShQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHlUeXBlID0gcHJvcGVydHlUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBDYXJkaW5hbGl0eSBnZXRDYXJkaW5hbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIGNhcmRpbmFsaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhcmRpbmFsaXR5KENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5KSB7Ci0gICAgICAgIHRoaXMuY2FyZGluYWxpdHkgPSBjYXJkaW5hbGl0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDaG9pY2U8VD4+IGdldENob2ljZXMoKSB7Ci0gICAgICAgIGlmIChjaG9pY2VMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNob2ljZUxpc3QgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxUPj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaG9pY2VMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZXMoTGlzdDxDaG9pY2U8VD4+IGNob2ljZUxpc3QpIHsKLSAgICAgICAgdGhpcy5jaG9pY2VMaXN0ID0gY2hvaWNlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUPiBnZXREZWZhdWx0VmFsdWUoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gbmV3IEFycmF5TGlzdDxUPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoTGlzdDxUPiBkZWZhdWx0VmFsdWUpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFVwZGF0YWJpbGl0eSBnZXRVcGRhdGFiaWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiB1cGRhdGFiaWxpdHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXBkYXRhYmlsaXR5KFVwZGF0YWJpbGl0eSB1cGRhdGFiaWxpdHkpIHsKLSAgICAgICAgdGhpcy51cGRhdGFiaWxpdHkgPSB1cGRhdGFiaWxpdHk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0luaGVyaXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0luaGVyaXRlZChCb29sZWFuIGlzSW5oZXJpdGVkKSB7Ci0gICAgICAgIHRoaXMuaXNJbmhlcml0ZWQgPSBpc0luaGVyaXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1F1ZXJ5YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzUXVlcnlhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzUXVlcnlhYmxlKEJvb2xlYW4gaXNRdWVyeWFibGUpIHsKLSAgICAgICAgdGhpcy5pc1F1ZXJ5YWJsZSA9IGlzUXVlcnlhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzT3JkZXJhYmxlKCkgewotICAgICAgICByZXR1cm4gaXNPcmRlcmFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNPcmRlcmFibGUoQm9vbGVhbiBpc09yZGVyYWJsZSkgewotICAgICAgICB0aGlzLmlzT3JkZXJhYmxlID0gaXNPcmRlcmFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNSZXF1aXJlZChCb29sZWFuIGlzUmVxdWlyZWQpIHsKLSAgICAgICAgdGhpcy5pc1JlcXVpcmVkID0gaXNSZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc09wZW5DaG9pY2UoKSB7Ci0gICAgICAgIHJldHVybiBpc09wZW5DaG9pY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNPcGVuQ2hvaWNlKEJvb2xlYW4gaXNPcGVuQ2hvaWNlKSB7Ci0gICAgICAgIHRoaXMuaXNPcGVuQ2hvaWNlID0gaXNPcGVuQ2hvaWNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUHJvcGVydHkgRGVmaW5pdGlvbiBbaWQ9IiArIGlkICsgIiwgZGlzcGxheSBuYW1lPSIgKyBkaXNwbGF5TmFtZSArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICsgIiwgbG9jYWwgbmFtZT0iICsgbG9jYWxOYW1lICsgIiwgbG9jYWwgbmFtZXNwYWNlPSIgKyBsb2NhbE5hbWVzcGFjZSArICIsIHF1ZXJ5IG5hbWU9IiArIHF1ZXJ5TmFtZQotICAgICAgICAgICAgICAgICsgIiwgcHJvcGVydHkgdHlwZT0iICsgcHJvcGVydHlUeXBlICsgIiwgY2FyZGluYWxpdHk9IiArIGNhcmRpbmFsaXR5ICsgIiwgY2hvaWNlIGxpc3Q9IiArIGNob2ljZUxpc3QKLSAgICAgICAgICAgICAgICArICIsIGRlZmF1bHQgdmFsdWU9IiArIGRlZmF1bHRWYWx1ZSArICIsIGlzIGluaGVyaXRlZD0iICsgaXNJbmhlcml0ZWQgKyAiLCBpcyBvcGVuIGNob2ljZT0iCi0gICAgICAgICAgICAgICAgKyBpc09wZW5DaG9pY2UgKyAiLCBpcyBxdWVyeWFibGU9IiArIGlzUXVlcnlhYmxlICsgIiwgaXMgcmVxdWlyZWQ9IiArIGlzUmVxdWlyZWQgKyAiLCB1cGRhdGFiaWxpdHk9IgotICAgICAgICAgICAgICAgICsgdXBkYXRhYmlsaXR5ICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0Fic3RyYWN0VHlwZURlZmluaXRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RUeXBlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2Y3MTQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWJzdHJhY3RUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVNdXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLQotLyoqCi0gKiBBYnN0cmFjdCB0eXBlIGRlZmluaXRpb24gZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHlwZURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBNdXRhYmxlVHlwZURlZmluaXRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMkw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgQmFzZVR5cGVJZCBiYXNlSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50SWQ7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzQ3JlYXRhYmxlOwotICAgIHByaXZhdGUgQm9vbGVhbiBpc0ZpbGVhYmxlOwotICAgIHByaXZhdGUgQm9vbGVhbiBpc1F1ZXJ5YWJsZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gaXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzRnVsbHRleHRJbmRleGVkOwotICAgIHByaXZhdGUgQm9vbGVhbiBpc0NvbnRyb2xsYWJsZUFDTDsKLSAgICBwcml2YXRlIEJvb2xlYW4gaXNDb250cm9sbGFibGVQb2xpY3k7Ci0gICAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wZXJ0eURlZmluaXRpb25zID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+KCk7Ci0gICAgcHJpdmF0ZSBUeXBlTXV0YWJpbGl0eSB0eXBlTXV0YWJpbGl0eTsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgYXNzZXJ0IHR5cGVEZWZpbml0aW9uICE9IG51bGw7Ci0KLSAgICAgICAgc2V0SWQodHlwZURlZmluaXRpb24uZ2V0SWQoKSk7Ci0gICAgICAgIHNldExvY2FsTmFtZSh0eXBlRGVmaW5pdGlvbi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIHNldExvY2FsTmFtZXNwYWNlKHR5cGVEZWZpbml0aW9uLmdldExvY2FsTmFtZXNwYWNlKCkpOwotICAgICAgICBzZXRRdWVyeU5hbWUodHlwZURlZmluaXRpb24uZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICBzZXREaXNwbGF5TmFtZSh0eXBlRGVmaW5pdGlvbi5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24odHlwZURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHNldEJhc2VUeXBlSWQodHlwZURlZmluaXRpb24uZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgc2V0UGFyZW50VHlwZUlkKHR5cGVEZWZpbml0aW9uLmdldFBhcmVudFR5cGVJZCgpKTsKLSAgICAgICAgc2V0SXNDcmVhdGFibGUodHlwZURlZmluaXRpb24uaXNDcmVhdGFibGUoKSk7Ci0gICAgICAgIHNldElzRmlsZWFibGUodHlwZURlZmluaXRpb24uaXNGaWxlYWJsZSgpKTsKLSAgICAgICAgc2V0SXNRdWVyeWFibGUodHlwZURlZmluaXRpb24uaXNRdWVyeWFibGUoKSk7Ci0gICAgICAgIHNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KHR5cGVEZWZpbml0aW9uLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOwotICAgICAgICBzZXRJc0Z1bGx0ZXh0SW5kZXhlZCh0eXBlRGVmaW5pdGlvbi5pc0Z1bGx0ZXh0SW5kZXhlZCgpKTsKLSAgICAgICAgc2V0SXNDb250cm9sbGFibGVBY2wodHlwZURlZmluaXRpb24uaXNDb250cm9sbGFibGVBY2woKSk7Ci0gICAgICAgIHNldElzQ29udHJvbGxhYmxlUG9saWN5KHR5cGVEZWZpbml0aW9uLmlzQ29udHJvbGxhYmxlUG9saWN5KCkpOwotICAgICAgICBzZXRQcm9wZXJ0eURlZmluaXRpb25zKHR5cGVEZWZpbml0aW9uLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSk7Ci0gICAgICAgIHNldFR5cGVNdXRhYmlsaXR5KHR5cGVEZWZpbml0aW9uLmdldFR5cGVNdXRhYmlsaXR5KCkpOwotICAgICAgICBzZXRFeHRlbnNpb25zKHR5cGVEZWZpbml0aW9uLmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZXNwYWNlKFN0cmluZyBsb2NhbE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZXNwYWNlID0gbG9jYWxOYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRRdWVyeU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBxdWVyeU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UXVlcnlOYW1lKFN0cmluZyBxdWVyeU5hbWUpIHsKLSAgICAgICAgdGhpcy5xdWVyeU5hbWUgPSBxdWVyeU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRpc3BsYXlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkgewotICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEJhc2VUeXBlSWQgZ2V0QmFzZVR5cGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVHlwZUlkKEJhc2VUeXBlSWQgYmFzZUlkKSB7Ci0gICAgICAgIHRoaXMuYmFzZUlkID0gYmFzZUlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50VHlwZUlkKCkgewotICAgICAgICByZXR1cm4gcGFyZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50VHlwZUlkKFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCB8fCBwYXJlbnRJZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudElkID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzQ3JlYXRhYmxlKCkgewotICAgICAgICByZXR1cm4gaXNDcmVhdGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNDcmVhdGFibGUoQm9vbGVhbiBpc0NyZWF0YWJsZSkgewotICAgICAgICB0aGlzLmlzQ3JlYXRhYmxlID0gaXNDcmVhdGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNGaWxlYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzRmlsZWFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNGaWxlYWJsZShCb29sZWFuIGlzRmlsZWFibGUpIHsKLSAgICAgICAgdGhpcy5pc0ZpbGVhYmxlID0gaXNGaWxlYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1F1ZXJ5YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzUXVlcnlhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzUXVlcnlhYmxlKEJvb2xlYW4gaXNRdWVyeWFibGUpIHsKLSAgICAgICAgdGhpcy5pc1F1ZXJ5YWJsZSA9IGlzUXVlcnlhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkgewotICAgICAgICByZXR1cm4gaXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoQm9vbGVhbiBpc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSkgewotICAgICAgICB0aGlzLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5ID0gaXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNGdWxsdGV4dEluZGV4ZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0Z1bGx0ZXh0SW5kZXhlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0Z1bGx0ZXh0SW5kZXhlZChCb29sZWFuIGlzRnVsbHRleHRJbmRleGVkKSB7Ci0gICAgICAgIHRoaXMuaXNGdWxsdGV4dEluZGV4ZWQgPSBpc0Z1bGx0ZXh0SW5kZXhlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0NvbnRyb2xsYWJsZUFjbCgpIHsKLSAgICAgICAgcmV0dXJuIGlzQ29udHJvbGxhYmxlQUNMOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzQ29udHJvbGxhYmxlQWNsKEJvb2xlYW4gaXNDb250cm9sbGFibGVBQ0wpIHsKLSAgICAgICAgdGhpcy5pc0NvbnRyb2xsYWJsZUFDTCA9IGlzQ29udHJvbGxhYmxlQUNMOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzQ29udHJvbGxhYmxlUG9saWN5KCkgewotICAgICAgICByZXR1cm4gaXNDb250cm9sbGFibGVQb2xpY3k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNDb250cm9sbGFibGVQb2xpY3koQm9vbGVhbiBpc0NvbnRyb2xsYWJsZVBvbGljeSkgewotICAgICAgICB0aGlzLmlzQ29udHJvbGxhYmxlUG9saWN5ID0gaXNDb250cm9sbGFibGVQb2xpY3k7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5RGVmaW5pdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlEZWZpbml0aW9ucyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IG5ld1Byb3BlcnR5RGVmaW5pdGlvbnMpIHsKLSAgICAgICAgaWYgKG5ld1Byb3BlcnR5RGVmaW5pdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PigpOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1Byb3BlcnR5RGVmaW5pdGlvbnMgaW5zdGFuY2VvZiBMaW5rZWRIYXNoTWFwKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zID0gKExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+KSBuZXdQcm9wZXJ0eURlZmluaXRpb25zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PihuZXdQcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcGVydHlEZWZpbml0aW9uKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eURlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcGVydHlEZWZpbml0aW9uLmdldElkKCksIHByb3BlcnR5RGVmaW5pdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlEZWZpbml0aW9uKFN0cmluZyBwcm9wZXJ0eUlkKSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucmVtb3ZlKHByb3BlcnR5SWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFByb3BlcnR5RGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZU11dGFiaWxpdHkgZ2V0VHlwZU11dGFiaWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTXV0YWJpbGl0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlTXV0YWJpbGl0eShUeXBlTXV0YWJpbGl0eSB0eXBlTXV0YWJpbGl0eSkgewotICAgICAgICB0aGlzLnR5cGVNdXRhYmlsaXR5ID0gdHlwZU11dGFiaWxpdHk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJUeXBlIERlZmluaXRpb24gW2Jhc2UgaWQ9IiArIGJhc2VJZCArICIsIGlkPSIgKyBpZCArICIsIGRpc3BsYXkgTmFtZT0iICsgZGlzcGxheU5hbWUgKyAiLCBkZXNjcmlwdGlvbj0iCi0gICAgICAgICAgICAgICAgKyBkZXNjcmlwdGlvbiArICIsIGxvY2FsIG5hbWU9IiArIGxvY2FsTmFtZSArICIsIGxvY2FsIG5hbWVzcGFjZT0iICsgbG9jYWxOYW1lc3BhY2UgKyAiLCBxdWVyeSBuYW1lPSIKLSAgICAgICAgICAgICAgICArIHF1ZXJ5TmFtZSArICIsIHBhcmVudCBpZD0iICsgcGFyZW50SWQgKyAiLCBpcyBjb250cm9sbGFibGUgQUNMPSIgKyBpc0NvbnRyb2xsYWJsZUFDTAotICAgICAgICAgICAgICAgICsgIiwgaXMgY29udHJvbGxhYmxlIHBvbGljeT0iICsgaXNDb250cm9sbGFibGVQb2xpY3kgKyAiLCBpcyBjcmVhdGFibGU9IiArIGlzQ3JlYXRhYmxlCi0gICAgICAgICAgICAgICAgKyAiLCBpcyBmaWxlYWJsZT0iICsgaXNGaWxlYWJsZSArICIsIGlzIGZ1bGx0ZXh0IGluZGV4ZWQ9IiArIGlzRnVsbHRleHRJbmRleGVkCi0gICAgICAgICAgICAgICAgKyAiLCBpcyBpbmNsdWRlZCBpbiBzdXBlcnR5cGUgcXVlcnk9IiArIGlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5ICsgIiwgaXMgcXVlcnlhYmxlPSIgKyBpc1F1ZXJ5YWJsZQotICAgICAgICAgICAgICAgICsgIiwgcHJvcGVydHkgZGVmaW5pdGlvbnM9IiArIHByb3BlcnR5RGVmaW5pdGlvbnMgKyAiLCB0eXBlTXV0YWJpbGl0eT0iICsgdHlwZU11dGFiaWxpdHkgKyAiXSIKLSAgICAgICAgICAgICAgICArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9BY2Nlc3NDb250cm9sRW50cnlJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0FjY2Vzc0NvbnRyb2xFbnRyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyNzlkMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0FjY2Vzc0NvbnRyb2xFbnRyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVBY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByaW5jaXBhbDsKLQotLyoqCi0gKiBBY2Nlc3MgQ29udHJvbCBFbnRyeSBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQWNjZXNzQ29udHJvbEVudHJ5SW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzIE11dGFibGVBY2UsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zOwotICAgIHByaXZhdGUgUHJpbmNpcGFsIHByaW5jaXBhbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEaXJlY3QgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwoUHJpbmNpcGFsIHByaW5jaXBhbCwgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zKSB7Ci0gICAgICAgIHRoaXMucHJpbmNpcGFsID0gcHJpbmNpcGFsOwotICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoKSB7Ci0gICAgICAgIHJldHVybiBwcmluY2lwYWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmluY2lwYWxJZCgpIHsKLSAgICAgICAgcmV0dXJuIHByaW5jaXBhbCA9PSBudWxsID8gbnVsbCA6IHByaW5jaXBhbC5nZXRJZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsKSB7Ci0gICAgICAgIHRoaXMucHJpbmNpcGFsID0gcHJpbmNpcGFsOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGVybWlzc2lvbnMoKSB7Ci0gICAgICAgIGlmIChwZXJtaXNzaW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwZXJtaXNzaW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcm1pc3Npb25zKExpc3Q8U3RyaW5nPiBwZXJtaXNzaW9ucykgewotICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3QoKSB7Ci0gICAgICAgIHJldHVybiBpc0RpcmVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3QoYm9vbGVhbiBkaXJlY3QpIHsKLSAgICAgICAgdGhpcy5pc0RpcmVjdCA9IGRpcmVjdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkFjY2VzcyBDb250cm9sIEVudHJ5IFtwcmluY2lwYWw9IiArIHByaW5jaXBhbCArICIsIHBlcm1pc3Npb25zPSIgKyBwZXJtaXNzaW9ucyArICIsIGlzIGRpcmVjdD0iCi0gICAgICAgICAgICAgICAgKyBpc0RpcmVjdCArICJdIiArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9BY2Nlc3NDb250cm9sTGlzdEltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWNjZXNzQ29udHJvbExpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjVjYzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9BY2Nlc3NDb250cm9sTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTXV0YWJsZUFjbDsKLQotLyoqCi0gKiBBY2Nlc3MgY29udHJvbCBsaXN0IGRhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sTGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBNdXRhYmxlQWNsLCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIExpc3Q8QWNlPiBhY2VzOwotICAgIHByaXZhdGUgQm9vbGVhbiBpc0V4YWN0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjZXNzQ29udHJvbExpc3RJbXBsKExpc3Q8QWNlPiBhY2VzKSB7Ci0gICAgICAgIHRoaXMuYWNlcyA9IGFjZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8QWNlPiBnZXRBY2VzKCkgewotICAgICAgICBpZiAoYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2VzKExpc3Q8QWNlPiBhY2VzKSB7Ci0gICAgICAgIHRoaXMuYWNlcyA9IGFjZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNFeGFjdCgpIHsKLSAgICAgICAgcmV0dXJuIGlzRXhhY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhhY3QoQm9vbGVhbiBpc0V4YWN0KSB7Ci0gICAgICAgIHRoaXMuaXNFeGFjdCA9IGlzRXhhY3Q7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJBY2Nlc3MgQ29udHJvbCBMaXN0IFtBQ0VzPSIgKyBhY2VzICsgIiwgaXMgZXhhY3Q9IiArIGlzRXhhY3QgKyAiXSIgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0FjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIzMTI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVQcmluY2lwYWw7Ci0KLS8qKgotICogQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBNdXRhYmxlUHJpbmNpcGFsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJpbmNpcGFsSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHdpdGggcHJpbmNpcGFsIElELgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcmluY2lwYWxJZAotICAgICAqICAgICAgICAgICAgdGhlIHByaW5jaXBhbCBJRAotICAgICAqLwotICAgIHB1YmxpYyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwoU3RyaW5nIHByaW5jaXBhbElkKSB7Ci0gICAgICAgIHRoaXMucHJpbmNpcGFsSWQgPSBwcmluY2lwYWxJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gcHJpbmNpcGFsSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIHByaW5jaXBhbElkKSB7Ci0gICAgICAgIHRoaXMucHJpbmNpcGFsSWQgPSBwcmluY2lwYWxJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNzZXRJZChTdHJpbmcpfQotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgc2V0UHJpbmNpcGFsSWQoU3RyaW5nIHByaW5jaXBhbElkKSB7Ci0gICAgICAgIHNldElkKHByaW5jaXBhbElkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkFjY2VzcyBDb250cm9sIFByaW5jaXBhbCBbcHJpbmNpcGFsSWQ9IiArIHByaW5jaXBhbElkICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0FjbENhcGFiaWxpdGllc0RhdGFJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0FjbENhcGFiaWxpdGllc0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWRhMzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9BY2xDYXBhYmlsaXRpZXNEYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2xDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBlcm1pc3Npb25NYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUGVybWlzc2lvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlN1cHBvcnRlZFBlcm1pc3Npb25zOwotCi0vKioKLSAqIEFjbENhcGFiaWxpdGllcyBJbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEFjbENhcGFiaWxpdGllc0RhdGFJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgQWNsQ2FwYWJpbGl0aWVzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTdXBwb3J0ZWRQZXJtaXNzaW9ucyBzdXBwb3J0ZWRQZXJtaXNzaW9uczsKLSAgICBwcml2YXRlIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUGVybWlzc2lvbk1hcHBpbmc+IHBlcm1pc3Npb25NYXBwaW5nOwotICAgIHByaXZhdGUgTGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4gcGVybWlzc2lvbkRlZmluaXRpb25MaXN0OwotCi0gICAgcHVibGljIFN1cHBvcnRlZFBlcm1pc3Npb25zIGdldFN1cHBvcnRlZFBlcm1pc3Npb25zKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydGVkUGVybWlzc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydGVkUGVybWlzc2lvbnMoU3VwcG9ydGVkUGVybWlzc2lvbnMgc3VwcG9ydGVkUGVybWlzc2lvbnMpIHsKLSAgICAgICAgdGhpcy5zdXBwb3J0ZWRQZXJtaXNzaW9ucyA9IHN1cHBvcnRlZFBlcm1pc3Npb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2xQcm9wYWdhdGlvbiBnZXRBY2xQcm9wYWdhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGFjbFByb3BhZ2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjbFByb3BhZ2F0aW9uKEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKSB7Ci0gICAgICAgIHRoaXMuYWNsUHJvcGFnYXRpb24gPSBhY2xQcm9wYWdhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgUGVybWlzc2lvbk1hcHBpbmc+IGdldFBlcm1pc3Npb25NYXBwaW5nKCkgewotICAgICAgICBpZiAocGVybWlzc2lvbk1hcHBpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcGVybWlzc2lvbk1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBlcm1pc3Npb25NYXBwaW5nPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25NYXBwaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcm1pc3Npb25NYXBwaW5nRGF0YShNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4gcGVybWlzc2lvbk1hcHBpbmcpIHsKLSAgICAgICAgdGhpcy5wZXJtaXNzaW9uTWFwcGluZyA9IHBlcm1pc3Npb25NYXBwaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBlcm1pc3Npb25EZWZpbml0aW9uPiBnZXRQZXJtaXNzaW9ucygpIHsKLSAgICAgICAgaWYgKHBlcm1pc3Npb25EZWZpbml0aW9uTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwZXJtaXNzaW9uRGVmaW5pdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFBlcm1pc3Npb25EZWZpbml0aW9uPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25EZWZpbml0aW9uTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGEoTGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4gcGVybWlzc2lvbkRlZmluaXRpb25MaXN0KSB7Ci0gICAgICAgIHRoaXMucGVybWlzc2lvbkRlZmluaXRpb25MaXN0ID0gcGVybWlzc2lvbkRlZmluaXRpb25MaXN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQUNMIENhcGFiaWxpdGllcyBbQUNMIHByb3BhZ2F0aW9uPSIgKyBhY2xQcm9wYWdhdGlvbiArICIsIHBlcm1pc3Npb24gZGVmaW5pdGlvbiBsaXN0PSIKLSAgICAgICAgICAgICAgICArIHBlcm1pc3Npb25EZWZpbml0aW9uTGlzdCArICIsIHBlcm1pc3Npb24gbWFwcGluZ3M9IiArIHBlcm1pc3Npb25NYXBwaW5nICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0FsbG93YWJsZUFjdGlvbnNJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0FsbG93YWJsZUFjdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjQzMzIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9BbGxvd2FibGVBY3Rpb25zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLQotLyoqCi0gKiBBbGxvd2FibGUgQWN0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEFsbG93YWJsZUFjdGlvbnNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgQWxsb3dhYmxlQWN0aW9ucyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU2V0PEFjdGlvbj4gYWxsb3dhYmxlQWN0aW9uczsKLQotICAgIHB1YmxpYyBTZXQ8QWN0aW9uPiBnZXRBbGxvd2FibGVBY3Rpb25zKCkgewotICAgICAgICBpZiAoYWxsb3dhYmxlQWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbGxvd2FibGVBY3Rpb25zID0gRW51bVNldC5ub25lT2YoQWN0aW9uLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhbGxvd2FibGVBY3Rpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93YWJsZUFjdGlvbnMoU2V0PEFjdGlvbj4gYWxsb3dhYmxlQWN0aW9ucykgewotICAgICAgICB0aGlzLmFsbG93YWJsZUFjdGlvbnMgPSBhbGxvd2FibGVBY3Rpb25zOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQWxsb3dhYmxlIEFjdGlvbnMgW2FsbG93YWJsZSBhY3Rpb25zPSIgKyBhbGxvd2FibGVBY3Rpb25zICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0JpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQmluZGluZ3NPYmplY3RGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmJiZTBlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQmluZGluZ3NPYmplY3RGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVBY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVDb250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTXV0YWJsZVByb3BlcnR5Qm9vbGVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTXV0YWJsZVByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTXV0YWJsZVByb3BlcnR5RGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVQcm9wZXJ0eURlY2ltYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVQcm9wZXJ0eUh0bWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVQcm9wZXJ0eUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydHlJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVQcm9wZXJ0eVVyaTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SHRtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUlkRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eVVyaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQmluZGluZ3NPYmplY3RGYWN0b3J5OwotCi0vKioKLSAqIENNSVMgYmluZGluZyBvYmplY3QgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGwgaW1wbGVtZW50cyBCaW5kaW5nc09iamVjdEZhY3RvcnksIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBCaW5kaW5nc09iamVjdEZhY3RvcnlJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlQWNlIGNyZWF0ZUFjY2Vzc0NvbnRyb2xFbnRyeShTdHJpbmcgcHJpbmNpcGFsLCBMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwocHJpbmNpcGFsKSwgcGVybWlzc2lvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlQWNsIGNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KExpc3Q8QWNlPiBhY2VzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKGFjZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlQ29udGVudFN0cmVhbSBjcmVhdGVDb250ZW50U3RyZWFtKFN0cmluZyBmaWxlbmFtZSwgQmlnSW50ZWdlciBsZW5ndGgsIFN0cmluZyBtaW1ldHlwZSwKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRTdHJlYW1JbXBsKGZpbGVuYW1lLCBsZW5ndGgsIG1pbWV0eXBlLCBzdHJlYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlUHJvcGVydGllcyBjcmVhdGVQcm9wZXJ0aWVzRGF0YShMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcykgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnRpZXNJbXBsKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyA8VD4gTXV0YWJsZVByb3BlcnR5RGF0YTxUPiBjcmVhdGVQcm9wZXJ0eURhdGEoUHJvcGVydHlEZWZpbml0aW9uPFQ+IHBkLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gcGQuZ2V0SWQoKTsKLSAgICAgICAgYm9vbGVhbiBzaW5nbGUgPSBwZC5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5LlNJTkdMRTsKLSAgICAgICAgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbikgewotICAgICAgICAgICAgaWYgKHNpbmdsZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoTXV0YWJsZVByb3BlcnR5RGF0YTxUPikgY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShpZCwgKEJvb2xlYW4pIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNdXRhYmxlUHJvcGVydHlEYXRhPFQ+KSBjcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKGlkLCAoTGlzdDxCb29sZWFuPikgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChzaW5nbGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKE11dGFibGVQcm9wZXJ0eURhdGE8VD4pIGNyZWF0ZVByb3BlcnR5RGF0ZVRpbWVEYXRhKGlkLCAoR3JlZ29yaWFuQ2FsZW5kYXIpIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNdXRhYmxlUHJvcGVydHlEYXRhPFQ+KSBjcmVhdGVQcm9wZXJ0eURhdGVUaW1lRGF0YShpZCwgKExpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+KSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGQgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoc2luZ2xlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNdXRhYmxlUHJvcGVydHlEYXRhPFQ+KSBjcmVhdGVQcm9wZXJ0eURlY2ltYWxEYXRhKGlkLCAoQmlnRGVjaW1hbCkgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKE11dGFibGVQcm9wZXJ0eURhdGE8VD4pIGNyZWF0ZVByb3BlcnR5RGVjaW1hbERhdGEoaWQsIChMaXN0PEJpZ0RlY2ltYWw+KSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGQgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoc2luZ2xlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNdXRhYmxlUHJvcGVydHlEYXRhPFQ+KSBjcmVhdGVQcm9wZXJ0eUh0bWxEYXRhKGlkLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAoTXV0YWJsZVByb3BlcnR5RGF0YTxUPikgY3JlYXRlUHJvcGVydHlIdG1sRGF0YShpZCwgKExpc3Q8U3RyaW5nPikgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlJZERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChzaW5nbGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKE11dGFibGVQcm9wZXJ0eURhdGE8VD4pIGNyZWF0ZVByb3BlcnR5SWREYXRhKGlkLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAoTXV0YWJsZVByb3BlcnR5RGF0YTxUPikgY3JlYXRlUHJvcGVydHlJZERhdGEoaWQsIChMaXN0PFN0cmluZz4pIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwZCBpbnN0YW5jZW9mIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChzaW5nbGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKE11dGFibGVQcm9wZXJ0eURhdGE8VD4pIGNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoaWQsIChCaWdJbnRlZ2VyKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAoTXV0YWJsZVByb3BlcnR5RGF0YTxUPikgY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YShpZCwgKExpc3Q8QmlnSW50ZWdlcj4pIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwZCBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbikgewotICAgICAgICAgICAgaWYgKHNpbmdsZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoTXV0YWJsZVByb3BlcnR5RGF0YTxUPikgY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKGlkLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAoTXV0YWJsZVByb3BlcnR5RGF0YTxUPikgY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKGlkLCAoTGlzdDxTdHJpbmc+KSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGQgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChzaW5nbGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKE11dGFibGVQcm9wZXJ0eURhdGE8VD4pIGNyZWF0ZVByb3BlcnR5VXJpRGF0YShpZCwgKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKE11dGFibGVQcm9wZXJ0eURhdGE8VD4pIGNyZWF0ZVByb3BlcnR5VXJpRGF0YShpZCwgKExpc3Q8U3RyaW5nPikgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBwcm9wZXJ0eSBkZWZpbml0aW9uOiAiICsgcGQpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlUHJvcGVydHlCb29sZWFuIGNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEoU3RyaW5nIGlkLCBMaXN0PEJvb2xlYW4+IHZhbHVlcykgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwoaWQsIHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eUJvb2xlYW4gY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShTdHJpbmcgaWQsIEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUJvb2xlYW5JbXBsKGlkLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eURhdGVUaW1lIGNyZWF0ZVByb3BlcnR5RGF0ZVRpbWVEYXRhKFN0cmluZyBpZCwgTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlEYXRlVGltZUltcGwoaWQsIHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eURhdGVUaW1lIGNyZWF0ZVByb3BlcnR5RGF0ZVRpbWVEYXRhKFN0cmluZyBpZCwgR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURhdGVUaW1lSW1wbChpZCwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlUHJvcGVydHlEZWNpbWFsIGNyZWF0ZVByb3BlcnR5RGVjaW1hbERhdGEoU3RyaW5nIGlkLCBMaXN0PEJpZ0RlY2ltYWw+IHZhbHVlcykgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGVjaW1hbEltcGwoaWQsIHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eURlY2ltYWwgY3JlYXRlUHJvcGVydHlEZWNpbWFsRGF0YShTdHJpbmcgaWQsIEJpZ0RlY2ltYWwgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURlY2ltYWxJbXBsKGlkLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eUh0bWwgY3JlYXRlUHJvcGVydHlIdG1sRGF0YShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUh0bWxJbXBsKGlkLCB2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlUHJvcGVydHlIdG1sIGNyZWF0ZVByb3BlcnR5SHRtbERhdGEoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eUh0bWxJbXBsKGlkLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eUlkIGNyZWF0ZVByb3BlcnR5SWREYXRhKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SWRJbXBsKGlkLCB2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdXRhYmxlUHJvcGVydHlJZCBjcmVhdGVQcm9wZXJ0eUlkRGF0YShTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SWRJbXBsKGlkLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eUludGVnZXIgY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YShTdHJpbmcgaWQsIExpc3Q8QmlnSW50ZWdlcj4gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbChpZCwgdmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXV0YWJsZVByb3BlcnR5SW50ZWdlciBjcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFN0cmluZyBpZCwgQmlnSW50ZWdlciB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SW50ZWdlckltcGwoaWQsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXV0YWJsZVByb3BlcnR5U3RyaW5nIGNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoaWQsIHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eVN0cmluZyBjcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoaWQsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXV0YWJsZVByb3BlcnR5VXJpIGNyZWF0ZVByb3BlcnR5VXJpRGF0YShTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVVyaUltcGwoaWQsIHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE11dGFibGVQcm9wZXJ0eVVyaSBjcmVhdGVQcm9wZXJ0eVVyaURhdGEoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVVyaUltcGwoaWQsIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0J1bGtVcGRhdGVJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0J1bGtVcGRhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjAzNTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9CdWxrVXBkYXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotCi1wdWJsaWMgY2xhc3MgQnVsa1VwZGF0ZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYWRkU2Vjb25kYXJ5VHlwZUlkczsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiByZW1vdmVTZWNvbmRhcnlUeXBlSWRzOwotCi0gICAgcHVibGljIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IGdldE9iamVjdElkQW5kQ2hhbmdlVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBvYmplY3RJZEFuZENoYW5nZVRva2VuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdElkQW5kQ2hhbmdlVG9rZW4oTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbikgewotICAgICAgICB0aGlzLm9iamVjdElkQW5kQ2hhbmdlVG9rZW4gPSBvYmplY3RJZEFuZENoYW5nZVRva2VuOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBZGRTZWNvbmRhcnlUeXBlSWRzKCkgewotICAgICAgICByZXR1cm4gYWRkU2Vjb25kYXJ5VHlwZUlkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBZGRTZWNvbmRhcnlUeXBlSWRzKExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlSWRzKSB7Ci0gICAgICAgIHRoaXMuYWRkU2Vjb25kYXJ5VHlwZUlkcyA9IGFkZFNlY29uZGFyeVR5cGVJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZW1vdmVTZWNvbmRhcnlUeXBlSWRzKCkgewotICAgICAgICByZXR1cm4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVTZWNvbmRhcnlUeXBlSWRzKExpc3Q8U3RyaW5nPiByZW1vdmVTZWNvbmRhcnlUeXBlSWRzKSB7Ci0gICAgICAgIHRoaXMucmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcyA9IHJlbW92ZVNlY29uZGFyeVR5cGVJZHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJCdWxrVXBkYXRlIFtvYmplY3RJZEFuZENoYW5nZVRva2VuPSIgKyBvYmplY3RJZEFuZENoYW5nZVRva2VuICsgIiwgcHJvcGVydGllcz0iICsgcHJvcGVydGllcwotICAgICAgICAgICAgICAgICsgIiwgYWRkU2Vjb25kYXJ5VHlwZUlkcz0iICsgYWRkU2Vjb25kYXJ5VHlwZUlkcyArICIsIHJlbW92ZVNlY29uZGFyeVR5cGVJZHM9IiArIHJlbW92ZVNlY29uZGFyeVR5cGVJZHMKLSAgICAgICAgICAgICAgICArICJdIiArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZWNmNmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cwotICAgICAgICBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIG5ld0lkOwotICAgIHByaXZhdGUgU3RyaW5nIGNoYW5nZVRva2VuID0gbnVsbDsKLQotICAgIHB1YmxpYyBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbChTdHJpbmcgaWQsIFN0cmluZyBjaGFuZ2VUb2tlbikgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHRoaXMubmV3SWQgPSBudWxsOwotICAgICAgICB0aGlzLmNoYW5nZVRva2VuID0gY2hhbmdlVG9rZW47Ci0gICAgfQotCi0gICAgcHVibGljIEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbChTdHJpbmcgaWQsIFN0cmluZyBuZXdJZCwgU3RyaW5nIGNoYW5nZVRva2VuKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgdGhpcy5uZXdJZCA9IG5ld0lkOwotICAgICAgICB0aGlzLmNoYW5nZVRva2VuID0gY2hhbmdlVG9rZW47Ci0gICAgfQotCi0gICAgcHVibGljIEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbChTdHJpbmcgaWQsIFN0cmluZyBuZXdJZCwgU3RyaW5nIGNoYW5nZVRva2VuLAotICAgICAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0ZW5zaW9ucykgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHRoaXMubmV3SWQgPSBuZXdJZDsKLSAgICAgICAgdGhpcy5jaGFuZ2VUb2tlbiA9IGNoYW5nZVRva2VuOwotICAgICAgICBzZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld0lkKCkgewotICAgICAgICByZXR1cm4gbmV3SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFuZ2VUb2tlbigpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5nZVRva2VuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmV3SWQoU3RyaW5nIG5ld0lkKSB7Ci0gICAgICAgIHRoaXMubmV3SWQgPSBuZXdJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2VUb2tlbihTdHJpbmcgY2hhbmdlVG9rZW4pIHsKLSAgICAgICAgdGhpcy5jaGFuZ2VUb2tlbiA9IGNoYW5nZVRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4gW2lkPSIgKyBpZCArICIsIG5ld0lkPSIgKyBuZXdJZCArICIsIGNoYW5nZVRva2VuPSIgKyBjaGFuZ2VUb2tlbiArICJdIgotICAgICAgICAgICAgICAgICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NoYW5nZUV2ZW50SW5mb0RhdGFJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NoYW5nZUV2ZW50SW5mb0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDgwZDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9DaGFuZ2VFdmVudEluZm9EYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DaGFuZ2VFdmVudEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DaGFuZ2VUeXBlOwotCi0vKioKLSAqIENoYW5nZSBldmVudC4KLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUV2ZW50SW5mb0RhdGFJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgQ2hhbmdlRXZlbnRJbmZvIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBHcmVnb3JpYW5DYWxlbmRhciBjaGFuZ2VUaW1lOwotICAgIHByaXZhdGUgQ2hhbmdlVHlwZSBjaGFuZ2VUeXBlOwotCi0gICAgcHVibGljIENoYW5nZUV2ZW50SW5mb0RhdGFJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBDaGFuZ2VFdmVudEluZm9EYXRhSW1wbChDaGFuZ2VUeXBlIGNoYW5nZVR5cGUsIEdyZWdvcmlhbkNhbGVuZGFyIGNoYW5nZVRpbWUpIHsKLSAgICAgICAgdGhpcy5jaGFuZ2VUeXBlID0gY2hhbmdlVHlwZTsKLSAgICAgICAgdGhpcy5jaGFuZ2VUaW1lID0gY2hhbmdlVGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0Q2hhbmdlVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5nZVRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlVGltZShHcmVnb3JpYW5DYWxlbmRhciBjaGFuZ2VUaW1lKSB7Ci0gICAgICAgIHRoaXMuY2hhbmdlVGltZSA9IGNoYW5nZVRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIENoYW5nZVR5cGUgZ2V0Q2hhbmdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5nZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlVHlwZShDaGFuZ2VUeXBlIGNoYW5nZVR5cGUpIHsKLSAgICAgICAgdGhpcy5jaGFuZ2VUeXBlID0gY2hhbmdlVHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0Nob2ljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQ2hvaWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjBkOTkzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvQ2hvaWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkNob2ljZTsKLQotLyoqCi0gKiBDaG9pY2UgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBDaG9pY2VJbXBsPFQ+IGltcGxlbWVudHMgQ2hvaWNlPFQ+IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0gICAgcHJpdmF0ZSBMaXN0PFQ+IHZhbHVlOwotICAgIHByaXZhdGUgTGlzdDxDaG9pY2U8VD4+IGNob2ljZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKLSAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFQ+IGdldFZhbHVlKCkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoTGlzdDxUPiB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gbmV3IEFycmF5TGlzdDxUPigpOwotICAgICAgICB0aGlzLnZhbHVlLmFkZCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q2hvaWNlPFQ+PiBnZXRDaG9pY2UoKSB7Ci0gICAgICAgIGlmIChjaG9pY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hvaWNlID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8VD4+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hvaWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENob2ljZShMaXN0PENob2ljZTxUPj4gY2hvaWNlKSB7Ci0gICAgICAgIHRoaXMuY2hvaWNlID0gY2hvaWNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQ2hvaWNlIFtkaXNwbGF5TmFtZT0iICsgZGlzcGxheU5hbWUgKyAiLCB2YWx1ZT0iICsgdmFsdWUgKyAiLCBjaG9pY2U9IiArIGNob2ljZSArICJdIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NtaXNFeHRlbnNpb25FbGVtZW50SW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9DbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZTU2Yy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NtaXNFeHRlbnNpb25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNtaXNFeHRlbnNpb25FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ21pc0V4dGVuc2lvbkVsZW1lbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlczsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGNoaWxkcmVuOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIGEgbGVhZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIG11c3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgY2hpbGRyZW4gPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGF0dHJpYnV0ZXMpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlcywKLSAgICAgICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGNoaWxkcmVuKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWUgbXVzdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KGNoaWxkcmVuKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGF0dHJpYnV0ZXMpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwoQ21pc0V4dGVuc2lvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbGVtZW50IG11c3Qgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIG11c3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5uYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IGVsZW1lbnQuZ2V0VmFsdWUoKTsKLSAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvVHJlZVN0cmluZyhpbnQgbGV2ZWwpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIG5leHRUcmVlbGV2ZWwoc2IsIGxldmVsKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5leHRUcmVlbGV2ZWwoU3RyaW5nQnVpbGRlciBzYiwgaW50IGxldmVsKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykgewotICAgICAgICAgICAgc2IuYXBwZW5kKCIgICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKChuYW1lc3BhY2UgPT0gbnVsbCA/ICIiIDogInsiICsgbmFtZXNwYWNlICsgIn0iKSArIG5hbWUgKyAiICIgKyBhdHRyaWJ1dGVzICsgIjogIik7Ci0KLSAgICAgICAgaWYgKGNoaWxkcmVuLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLQotICAgICAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBlbGVtZW50IDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENtaXNFeHRlbnNpb25FbGVtZW50SW1wbCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKChDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwpIGVsZW1lbnQpLnRvVHJlZVN0cmluZyhsZXZlbCArIDEpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVsICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gKG5hbWVzcGFjZSA9PSBudWxsID8gIiIgOiAieyIgKyBuYW1lc3BhY2UgKyAifSIpICsgbmFtZSArICIgIiArIGF0dHJpYnV0ZXMgKyAiOiAiCi0gICAgICAgICAgICAgICAgKyAoY2hpbGRyZW4uaXNFbXB0eSgpID8gdmFsdWUgOiBjaGlsZHJlbi50b1N0cmluZygpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NvbnRlbnRTdHJlYW1IYXNoSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Db250ZW50U3RyZWFtSGFzaEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljMTY5YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NvbnRlbnRTdHJlYW1IYXNoSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtSGFzaDsKLQotcHVibGljIGNsYXNzIENvbnRlbnRTdHJlYW1IYXNoSW1wbCBpbXBsZW1lbnRzIENvbnRlbnRTdHJlYW1IYXNoIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMR09SSVRITV9NRDUgPSAibWQ1IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEdPUklUSE1fU0hBMSA9ICJzaGEtMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxHT1JJVEhNX1NIQTIyNCA9ICJzaGEtMjI0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEdPUklUSE1fU0hBMjU2ID0gInNoYS0yNTYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMR09SSVRITV9TSEEzODQgPSAic2hhLTM4NCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxHT1JJVEhNX1NIQTUxMiA9ICJzaGEtNTEyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEdPUklUSE1fU0hBMyA9ICJzaGEtMyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0RJR0lUUyA9ICIwMTIzNDU2Nzg5YWJjZGVmIi50b0NoYXJBcnJheSgpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBhbGdvcml0aG0gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGhhc2ggPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgZnJvbSB0aGUge0Bjb2RlIGNtaXM6Y29udGVudFN0cmVhbUhhc2h9IHByb3BlcnR5Ci0gICAgICogdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtSGFzaEltcGwoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKLQotICAgICAgICBpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcHYgPSBwcm9wZXJ0eVZhbHVlLnRyaW0oKTsKLSAgICAgICAgaW50IGFsZ0VuZCA9IHB2LmluZGV4T2YoJ30nKTsKLSAgICAgICAgaWYgKHB2LmNoYXJBdCgwKSAhPSAneycgfHwgYWxnRW5kIDwgMSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBwdi5zdWJzdHJpbmcoMSwgYWxnRW5kKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgIHRoaXMuaGFzaCA9IHB2LnN1YnN0cmluZyhhbGdFbmQgKyAxKS5yZXBsYWNlQWxsKCJcXHMiLCAiIikudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gb2JqZWN0IGZyb20gdGhlIGFsZ29yaXRobSBhbmQgaGFzaC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCi0gICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtCi0gICAgICogQHBhcmFtIGhhc2gKLSAgICAgKiAgICAgICAgICAgIHRoZSBoYXNoIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW1IYXNoSW1wbChTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgaGFzaFN0cikgewotICAgICAgICBpZiAoYWxnb3JpdGhtID09IG51bGwgfHwgYWxnb3JpdGhtLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbGdvcml0aG0gbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzaFN0ciA9PSBudWxsIHx8IGhhc2hTdHIudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhhc2ggbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgIHRoaXMuaGFzaCA9IGhhc2hTdHIucmVwbGFjZUFsbCgiXFxzIiwgIiIpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0gInsiICsgdGhpcy5hbGdvcml0aG0gKyAifSIgKyB0aGlzLmhhc2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgZnJvbSB0aGUgYWxnb3JpdGhtIGFuZCBoYXNoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBhbGdvcml0aG0KLSAgICAgKiAgICAgICAgICAgIHRoZSBhbGdvcml0aG0KLSAgICAgKiBAcGFyYW0gaGFzaEJ5dGVzCi0gICAgICogICAgICAgICAgICB0aGUgaGFzaCB2YWx1ZSBhcyBieXRlIGFycmF5Ci0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW1IYXNoSW1wbChTdHJpbmcgYWxnb3JpdGhtLCBieXRlW10gaGFzaEJ5dGVzKSB7Ci0gICAgICAgIGlmIChhbGdvcml0aG0gPT0gbnVsbCB8fCBhbGdvcml0aG0udHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFsZ29yaXRobSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNoQnl0ZXMgPT0gbnVsbCB8fCBoYXNoQnl0ZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhhc2ggbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgIHRoaXMuaGFzaCA9IGJ5dGVBcnJheVRvSGV4U3RyaW5nKGhhc2hCeXRlcyk7Ci0gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZSA9ICJ7IiArIHRoaXMuYWxnb3JpdGhtICsgIn0iICsgdGhpcy5oYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7Ci0gICAgICAgIHJldHVybiBhbGdvcml0aG07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRIYXNoKCkgewotICAgICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRlbnRTdHJlYW1IYXNoSW1wbCBvdGhlciA9IChDb250ZW50U3RyZWFtSGFzaEltcGwpIG9iajsKLSAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG90aGVyLnByb3BlcnR5VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghcHJvcGVydHlWYWx1ZS5lcXVhbHMob3RoZXIucHJvcGVydHlWYWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaXN0IG9mIGNvbnRlbnQgaGFzaGVzIGZyb20gYSBzdHJlYW0KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBjb25zdW1lcyB0aGUgc3RyZWFtIGJ1dCBkb2Vzbid0IGNsb3NlIGl0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0KLSAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCi0gICAgICogICAgICAgICAgICB0aGUgYWxnb3JpdGhtcwotICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29udGVudCBoYXNoZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q29udGVudFN0cmVhbUhhc2g+IGNyZWF0ZUNvbnRlbnRTdHJlYW1IYXNoZXMoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcuLi4gYWxnb3JpdGhtKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmVhbSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbGdvcml0aG0gPT0gbnVsbCB8fCBhbGdvcml0aG0ubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFsZ29yaXRobSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2VEaWdlc3RbXSBtZCA9IG5ldyBNZXNzYWdlRGlnZXN0W2FsZ29yaXRobS5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsZ29yaXRobS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbWRbaV0gPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGFsZ29yaXRobVtpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYjsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY0ICogMTAyNF07Ci0gICAgICAgIHdoaWxlICgoYiA9IHN0cmVhbS5yZWFkKGJ1ZmZlcikpID4gLTEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWQubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBtZFtqXS51cGRhdGUoYnVmZmVyLCAwLCBiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q29udGVudFN0cmVhbUhhc2g+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q29udGVudFN0cmVhbUhhc2g+KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgQ29udGVudFN0cmVhbUhhc2hJbXBsKGFsZ29yaXRobVtpXSwgbWRbaV0uZGlnZXN0KCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgYnl0ZUFycmF5VG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgIGludCBuID0gYnl0ZXMubGVuZ3RoOwotICAgICAgICBjaGFyW10gaGFzaEhleCA9IG5ldyBjaGFyW24gKiAyXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIGhhc2hIZXhbaSAqIDJdID0gSEVYX0RJR0lUU1soMHhGMCAmIGJ5dGVzW2ldKSA+Pj4gNF07Ci0gICAgICAgICAgICBoYXNoSGV4W2kgKiAyICsgMV0gPSBIRVhfRElHSVRTWzB4MEYgJiBieXRlc1tpXV07Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhoYXNoSGV4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NvbnRlbnRTdHJlYW1JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NvbnRlbnRTdHJlYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjQyNjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Db250ZW50U3RyZWFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVDb250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb250ZW50IHN0cmVhbSBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFN0cmVhbUltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBNdXRhYmxlQ29udGVudFN0cmVhbSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBsZW5ndGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWltZXR5cGU7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSW5wdXRTdHJlYW0gc3RyZWFtOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW1JbXBsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtSW1wbChTdHJpbmcgZmlsZW5hbWUsIEJpZ0ludGVnZXIgbGVuZ3RoLCBTdHJpbmcgbWltZXR5cGUsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICB0aGlzLm1pbWV0eXBlID0gbWltZXR5cGU7Ci0gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yIGZvciB0ZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbUltcGwoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgbWltZXR5cGUsIFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gYnl0ZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZXMgPSBzdHJpbmcuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNvZGluZyAnVVRGLTgnISIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgICAgICB0aGlzLmxlbmd0aCA9IEJpZ0ludGVnZXIudmFsdWVPZihieXRlcy5sZW5ndGgpOwotICAgICAgICB0aGlzLm1pbWV0eXBlID0gbWltZXR5cGU7Ci0gICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBsZW5ndGggPT0gbnVsbCA/IC0xIDogbGVuZ3RoLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ0xlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoQmlnSW50ZWdlciBsZW5ndGgpIHsKLSAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1pbWV0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICB0aGlzLm1pbWV0eXBlID0gbWltZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmVhbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQ29udGVudFN0cmVhbSBbZmlsZW5hbWU9IiArIGZpbGVuYW1lICsgIiwgbGVuZ3RoPSIgKyBsZW5ndGggKyAiLCBNSU1FIHR5cGU9IiArIG1pbWV0eXBlCi0gICAgICAgICAgICAgICAgKyAiLCBoYXMgc3RyZWFtPSIgKyAoc3RyZWFtICE9IG51bGwpICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0NyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTM1NjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9DcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqIDtMaWNlbnNlOyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogO0FTIElTOyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ3JlYXRhYmxlUHJvcGVydHlUeXBlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLQotcHVibGljIGNsYXNzIENyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsIGV4dGVuZHMgRXh0ZW5zaW9uRGF0YUltcGwgaW1wbGVtZW50cyBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBTZXQ8UHJvcGVydHlUeXBlPiBwcm9wZXJ0eVR5cGVTZXQ7Ci0KLSAgICBwdWJsaWMgU2V0PFByb3BlcnR5VHlwZT4gY2FuQ3JlYXRlKCkgewotICAgICAgICBpZiAocHJvcGVydHlUeXBlU2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnR5VHlwZVNldCA9IEVudW1TZXQubm9uZU9mKFByb3BlcnR5VHlwZS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHlUeXBlU2V0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbkNyZWF0ZShTZXQ8UHJvcGVydHlUeXBlPiBwcm9wZXJ0eVR5cGVTZXQpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eVR5cGVTZXQgPSBwcm9wZXJ0eVR5cGVTZXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJDcmVhdGFibGVQcm9wZXJ0eVR5cGVzIFtwcm9wZXJ0eVR5cGVTZXQ9IiArIHByb3BlcnR5VHlwZVNldCArICJdIiArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQwMGIxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ29udGVudFN0cmVhbUFsbG93ZWQ7Ci0KLS8qKgotICogRG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIGltcGxlbWVudHMgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIENvbnRlbnRTdHJlYW1BbGxvd2VkIGNvbnRlbnRTdHJlYW1BbGxvd2VkID0gQ29udGVudFN0cmVhbUFsbG93ZWQuTk9UQUxMT1dFRDsKLSAgICBwcml2YXRlIEJvb2xlYW4gaXNWZXJzaW9uYWJsZSA9IEJvb2xlYW4uRkFMU0U7Ci0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbUFsbG93ZWQgZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50U3RyZWFtQWxsb3dlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50U3RyZWFtQWxsb3dlZChDb250ZW50U3RyZWFtQWxsb3dlZCBjb250ZW50U3RyZWFtQWxsb3dlZCkgewotICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW1BbGxvd2VkID0gY29udGVudFN0cmVhbUFsbG93ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNWZXJzaW9uYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzVmVyc2lvbmFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNWZXJzaW9uYWJsZShCb29sZWFuIGlzVmVyc2lvbmFibGUpIHsKLSAgICAgICAgdGhpcy5pc1ZlcnNpb25hYmxlID0gaXNWZXJzaW9uYWJsZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0V4dGVuc2lvbkRhdGFJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0V4dGVuc2lvbkRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMGUwZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9FeHRlbnNpb25EYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotCi0vKioKLSAqIEV4dGVuc2lvbnNEYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uRGF0YUltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cwotICAgICAgICBFeHRlbnNpb25zRGF0YSwgU2VyaWFsaXphYmxlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvRXh0ZW5zaW9uRmVhdHVyZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvRXh0ZW5zaW9uRmVhdHVyZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczODg1Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0V4dGVuc2lvbkZlYXR1cmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbkZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25GZWF0dXJlSW1wbCBleHRlbmRzIEV4dGVuc2lvbkRhdGFJbXBsIGltcGxlbWVudHMgRXh0ZW5zaW9uRmVhdHVyZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIHVybDsKLSAgICBwcml2YXRlIFN0cmluZyBjb21tb25OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHZlcnNpb25MYWJlbDsKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZmVhdHVyZURhdGE7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIHVybCkgewotICAgICAgICB0aGlzLnVybCA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1vbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjb21tb25OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbW1vbk5hbWUoU3RyaW5nIGNvbW1vbk5hbWUpIHsKLSAgICAgICAgdGhpcy5jb21tb25OYW1lID0gY29tbW9uTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25MYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb25MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uTGFiZWwoU3RyaW5nIHZlcnNpb25MYWJlbCkgewotICAgICAgICB0aGlzLnZlcnNpb25MYWJlbCA9IHZlcnNpb25MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRGZWF0dXJlRGF0YSgpIHsKLSAgICAgICAgaWYgKGZlYXR1cmVEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIGZlYXR1cmVEYXRhID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmVhdHVyZURhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZURhdGEoTWFwPFN0cmluZywgU3RyaW5nPiBmZWF0dXJlRGF0YSkgewotICAgICAgICB0aGlzLmZlYXR1cmVEYXRhID0gZmVhdHVyZURhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJFeHRlbnNpb24gRmVhdHVyZSBbaWQ9IiArIGlkICsgIiwgdXJsPSIgKyB1cmwgKyAiLCBjb21tb25OYW1lPSIgKyBjb21tb25OYW1lICsgIiwgdmVyc2lvbkxhYmVsPSIKLSAgICAgICAgICAgICAgICArIHZlcnNpb25MYWJlbCArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIGZlYXR1cmVEYXRhPSIgKyBmZWF0dXJlRGF0YSArICJdIgotICAgICAgICAgICAgICAgICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvRmFpbGVkVG9EZWxldGVEYXRhSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9GYWlsZWRUb0RlbGV0ZURhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOGQzNmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9GYWlsZWRUb0RlbGV0ZURhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5GYWlsZWRUb0RlbGV0ZURhdGE7Ci0KLS8qKgotICogRmFpbGVkVG9EZWxldGVEYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzIEZhaWxlZFRvRGVsZXRlRGF0YSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGlkczsKLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SWRzKCkgewotICAgICAgICBpZiAoaWRzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZHMoTGlzdDxTdHJpbmc+IGlkcykgewotICAgICAgICB0aGlzLmlkcyA9IGlkczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkZhaWxlZFRvRGVsZXRlRGF0YSBbSURzPSIgKyBpZHMgKyAiXSIgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvRm9sZGVyVHlwZURlZmluaXRpb25JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0ZvbGRlclR5cGVEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjcxMDMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvRm9sZGVyVHlwZURlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlRm9sZGVyVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogRm9sZGVyIHR5cGUgZGVmaW5pdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEZvbGRlclR5cGVEZWZpbml0aW9uSW1wbCBleHRlbmRzIEFic3RyYWN0VHlwZURlZmluaXRpb24gaW1wbGVtZW50cyBNdXRhYmxlRm9sZGVyVHlwZURlZmluaXRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvSXRlbVR5cGVEZWZpbml0aW9uSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9JdGVtVHlwZURlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTJlODAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9JdGVtVHlwZURlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlSXRlbVR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIEl0ZW0gdHlwZSBkZWZpbml0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCBleHRlbmRzIEFic3RyYWN0VHlwZURlZmluaXRpb24gaW1wbGVtZW50cyBNdXRhYmxlSXRlbVR5cGVEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0xhc3RNb2RpZmllZENvbnRlbnRTdHJlYW1JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL0xhc3RNb2RpZmllZENvbnRlbnRTdHJlYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGQzMjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9MYXN0TW9kaWZpZWRDb250ZW50U3RyZWFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkxhc3RNb2RpZmllZENvbnRlbnRTdHJlYW07Ci0KLS8qKgotICogQ29udGVudCBzdHJlYW0gZGF0YSB3aXRoIGxhc3QgbW9kaWZpZWQgZGF0ZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIExhc3RNb2RpZmllZENvbnRlbnRTdHJlYW1JbXBsIGV4dGVuZHMgQ29udGVudFN0cmVhbUltcGwgaW1wbGVtZW50cyBMYXN0TW9kaWZpZWRDb250ZW50U3RyZWFtIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBHcmVnb3JpYW5DYWxlbmRhciBsYXN0TW9kaWZpZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGFzdE1vZGlmaWVkQ29udGVudFN0cmVhbUltcGwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIExhc3RNb2RpZmllZENvbnRlbnRTdHJlYW1JbXBsKFN0cmluZyBmaWxlbmFtZSwgQmlnSW50ZWdlciBsZW5ndGgsIFN0cmluZyBtaW1ldHlwZSwgSW5wdXRTdHJlYW0gc3RyZWFtLAotICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbGFzdE1vZGlmaWVkKSB7Ci0gICAgICAgIHN1cGVyKGZpbGVuYW1lLCBsZW5ndGgsIG1pbWV0eXBlLCBzdHJlYW0pOwotICAgICAgICB0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0TGFzdE1vZGlmaWVkKCkgewotICAgICAgICByZXR1cm4gbGFzdE1vZGlmaWVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChHcmVnb3JpYW5DYWxlbmRhciBsYXN0TW9kaWZpZWQpIHsKLSAgICAgICAgdGhpcy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlZjUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogO0xpY2Vuc2U7KTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiA7QVMgSVM7IEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlczsKLQotcHVibGljIGNsYXNzIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsIGV4dGVuZHMgRXh0ZW5zaW9uRGF0YUltcGwgaW1wbGVtZW50cyBOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIEJvb2xlYW4gaWQ7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGxvY2FsTmFtZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gbG9jYWxOYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGRpc3BsYXlOYW1lOwotICAgIHByaXZhdGUgQm9vbGVhbiBxdWVyeU5hbWU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGRlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgQm9vbGVhbiBjcmVhdGFibGU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGZpbGVhYmxlOwotICAgIHByaXZhdGUgQm9vbGVhbiBxdWVyeWFibGU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGZ1bGx0ZXh0SW5kZXhlZDsKLSAgICBwcml2YXRlIEJvb2xlYW4gaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5OwotICAgIHByaXZhdGUgQm9vbGVhbiBjb250cm9sbGFibGVQb2xpY3k7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGNvbnRyb2xsYWJsZUFDTDsKLQotICAgIHB1YmxpYyBCb29sZWFuIGNhblNldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuU2V0SWQoQm9vbGVhbiBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gY2FuU2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gbG9jYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhblNldExvY2FsTmFtZShCb29sZWFuIGxvY2FsTmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBjYW5TZXRMb2NhbE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhblNldExvY2FsTmFtZXNwYWNlKEJvb2xlYW4gbG9jYWxOYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWVzcGFjZSA9IGxvY2FsTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGNhblNldERpc3BsYXlOYW1lKCkgewotICAgICAgICByZXR1cm4gZGlzcGxheU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuU2V0RGlzcGxheU5hbWUoQm9vbGVhbiBkaXNwbGF5TmFtZSkgewotICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gY2FuU2V0UXVlcnlOYW1lKCkgewotICAgICAgICByZXR1cm4gcXVlcnlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhblNldFF1ZXJ5TmFtZShCb29sZWFuIHF1ZXJ5TmFtZSkgewotICAgICAgICB0aGlzLnF1ZXJ5TmFtZSA9IHF1ZXJ5TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBjYW5TZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhblNldERlc2NyaXB0aW9uKEJvb2xlYW4gZGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGNhblNldENyZWF0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0YWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5TZXRDcmVhdGFibGUoQm9vbGVhbiBjcmVhdGFibGUpIHsKLSAgICAgICAgdGhpcy5jcmVhdGFibGUgPSBjcmVhdGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gY2FuU2V0RmlsZWFibGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5TZXRGaWxlYWJsZShCb29sZWFuIGZpbGVhYmxlKSB7Ci0gICAgICAgIHRoaXMuZmlsZWFibGUgPSBmaWxlYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBjYW5TZXRRdWVyeWFibGUoKSB7Ci0gICAgICAgIHJldHVybiBxdWVyeWFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuU2V0UXVlcnlhYmxlKEJvb2xlYW4gcXVlcnlhYmxlKSB7Ci0gICAgICAgIHRoaXMucXVlcnlhYmxlID0gcXVlcnlhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGNhblNldEZ1bGx0ZXh0SW5kZXhlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bGx0ZXh0SW5kZXhlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5TZXRGdWxsdGV4dEluZGV4ZWQoQm9vbGVhbiBmdWxsdGV4dEluZGV4ZWQpIHsKLSAgICAgICAgdGhpcy5mdWxsdGV4dEluZGV4ZWQgPSBmdWxsdGV4dEluZGV4ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gY2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhblNldEluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeShCb29sZWFuIGluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSkgewotICAgICAgICB0aGlzLmluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSA9IGluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBjYW5TZXRDb250cm9sbGFibGVQb2xpY3koKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sbGFibGVQb2xpY3k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KEJvb2xlYW4gY29udHJvbGxhYmxlUG9saWN5KSB7Ci0gICAgICAgIHRoaXMuY29udHJvbGxhYmxlUG9saWN5ID0gY29udHJvbGxhYmxlUG9saWN5OwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGNhblNldENvbnRyb2xsYWJsZUFjbCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsYWJsZUFDTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5TZXRDb250cm9sbGFibGVBY2woQm9vbGVhbiBjb250cm9sbGFibGVBQ0wpIHsKLSAgICAgICAgdGhpcy5jb250cm9sbGFibGVBQ0wgPSBjb250cm9sbGFibGVBQ0w7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIFtpZD0iICsgaWQgKyAiLCBsb2NhbE5hbWU9IiArIGxvY2FsTmFtZSArICIsIGxvY2FsTmFtZXNwYWNlPSIKLSAgICAgICAgICAgICAgICArIGxvY2FsTmFtZXNwYWNlICsgIiwgZGlzcGxheU5hbWU9IiArIGRpc3BsYXlOYW1lICsgIiwgcXVlcnlOYW1lPSIgKyBxdWVyeU5hbWUgKyAiLCBkZXNjcmlwdGlvbj0iCi0gICAgICAgICAgICAgICAgKyBkZXNjcmlwdGlvbiArICIsIGNyZWF0YWJsZT0iICsgY3JlYXRhYmxlICsgIiwgZmlsZWFibGU9IiArIGZpbGVhYmxlICsgIiwgcXVlcnlhYmxlPSIgKyBxdWVyeWFibGUKLSAgICAgICAgICAgICAgICArICIsIGZ1bGx0ZXh0SW5kZXhlZD0iICsgZnVsbHRleHRJbmRleGVkICsgIiwgaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PSIgKyBpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkKLSAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsYWJsZVBvbGljeT0iICsgY29udHJvbGxhYmxlUG9saWN5ICsgIiwgY29udHJvbGxhYmxlQUNMPSIgKyBjb250cm9sbGFibGVBQ0wgKyAiXSIKLSAgICAgICAgICAgICAgICArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3REYXRhSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3REYXRhSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzM5ZWIxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvT2JqZWN0RGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ2hhbmdlRXZlbnRJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUG9saWN5SWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotCi0vKioKLSAqIE9iamVjdERhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3REYXRhSW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzIE11dGFibGVPYmplY3REYXRhIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBDaGFuZ2VFdmVudEluZm8gY2hhbmdlRXZlbnRJbmZvOwotICAgIHByaXZhdGUgTGlzdDxPYmplY3REYXRhPiByZWxhdGlvbnNoaXBzOwotICAgIHByaXZhdGUgTGlzdDxSZW5kaXRpb25EYXRhPiByZW5kaXRpb25zOwotICAgIHByaXZhdGUgUG9saWN5SWRMaXN0IHBvbGljeUlkczsKLSAgICBwcml2YXRlIEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9uczsKLSAgICBwcml2YXRlIEFjbCBhY2w7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGlzRXhhY3RBY2w7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRGaXJzdFZhbHVlKFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEJhc2VUeXBlSWQgZ2V0QmFzZVR5cGVJZCgpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0Rmlyc3RWYWx1ZShQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQpOwotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJhc2VUeXBlSWQuZnJvbVZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW52YWxpZCBiYXNlIHR5cGUgLT4gcmV0dXJuIG51bGwKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIENoYW5nZUV2ZW50SW5mbyBnZXRDaGFuZ2VFdmVudEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBjaGFuZ2VFdmVudEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhbmdlRXZlbnRJbmZvKENoYW5nZUV2ZW50SW5mbyBjaGFuZ2VFdmVudEluZm8pIHsKLSAgICAgICAgdGhpcy5jaGFuZ2VFdmVudEluZm8gPSBjaGFuZ2VFdmVudEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0UmVsYXRpb25zaGlwcygpIHsKLSAgICAgICAgaWYgKHJlbGF0aW9uc2hpcHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVsYXRpb25zaGlwcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZWxhdGlvbnNoaXBzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcHMoTGlzdDxPYmplY3REYXRhPiByZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAgIHRoaXMucmVsYXRpb25zaGlwcyA9IHJlbGF0aW9uc2hpcHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucygpIHsKLSAgICAgICAgaWYgKHJlbmRpdGlvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGl0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UmVuZGl0aW9uRGF0YT4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZW5kaXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlbmRpdGlvbnMoTGlzdDxSZW5kaXRpb25EYXRhPiByZW5kaXRpb25zKSB7Ci0gICAgICAgIHRoaXMucmVuZGl0aW9ucyA9IHJlbmRpdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeUlkTGlzdCBnZXRQb2xpY3lJZHMoKSB7Ci0gICAgICAgIHJldHVybiBwb2xpY3lJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9saWN5SWRzKFBvbGljeUlkTGlzdCBwb2xpY3lJZHMpIHsKLSAgICAgICAgdGhpcy5wb2xpY3lJZHMgPSBwb2xpY3lJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIEFsbG93YWJsZUFjdGlvbnMgZ2V0QWxsb3dhYmxlQWN0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGFsbG93YWJsZUFjdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dhYmxlQWN0aW9ucyhBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMpIHsKLSAgICAgICAgdGhpcy5hbGxvd2FibGVBY3Rpb25zID0gYWxsb3dhYmxlQWN0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGdldEFjbCgpIHsKLSAgICAgICAgcmV0dXJuIGFjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2woQWNsIGFjbCkgewotICAgICAgICB0aGlzLmFjbCA9IGFjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0V4YWN0QWNsKCkgewotICAgICAgICByZXR1cm4gaXNFeGFjdEFjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0V4YWN0QWNsKEJvb2xlYW4gaXNFeGFjdEFDTCkgewotICAgICAgICB0aGlzLmlzRXhhY3RBY2wgPSBpc0V4YWN0QUNMOwotICAgIH0KLQotICAgIC8vIC0tLS0gaW50ZXJuYWwgLS0tLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc2V0LgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldEZpcnN0VmFsdWUoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlmICgocHJvcGVydGllcyA9PSBudWxsKSB8fCAocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGlkKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldEZpcnN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIk9iamVjdCBEYXRhIFtwcm9wZXJ0aWVzPSIgKyBwcm9wZXJ0aWVzICsgIiwgYWxsb3dhYmxlIGFjdGlvbnM9IiArIGFsbG93YWJsZUFjdGlvbnMKLSAgICAgICAgICAgICAgICArICIsIGNoYW5nZSBldmVudCBpbmZvPSIgKyBjaGFuZ2VFdmVudEluZm8gKyAiLCBBQ0w9IiArIGFjbCArICIsIGlzIGV4YWN0IEFDTD0iICsgaXNFeGFjdEFjbAotICAgICAgICAgICAgICAgICsgIiwgcG9saWN5IGlkcz0iICsgcG9saWN5SWRzICsgIiwgcmVsYXRpb25zaGlwcz0iICsgcmVsYXRpb25zaGlwcyArICIsIHJlbmRpdGlvbnM9IiArIHJlbmRpdGlvbnMgKyAiXSIKLSAgICAgICAgICAgICAgICArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWNiODYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci0KLS8qKgotICogT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBPYmplY3RJbkZvbGRlckNvbnRhaW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgT2JqZWN0SW5Gb2xkZXJEYXRhIG9iamVjdDsKLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGNoaWxkcmVuOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyQ29udGFpbmVySW1wbCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsKE9iamVjdEluRm9sZGVyRGF0YSBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0SW5Gb2xkZXJEYXRhIGdldE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0SW5Gb2xkZXJEYXRhIG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBjaGlsZHJlbikgewotICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJPYmplY3RJbkZvbGRlciBDb250YWluZXIgW29iamVjdD0iICsgb2JqZWN0ICsgIiwgY2hpbGRyZW49IiArIGNoaWxkcmVuICsgIl0iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3RJbkZvbGRlckRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYmI1NDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3RJbkZvbGRlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyRGF0YTsKLQotLyoqCi0gKiBPYmplY3RJbkZvbGRlckRhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RJbkZvbGRlckRhdGFJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgT2JqZWN0SW5Gb2xkZXJEYXRhIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBPYmplY3REYXRhIG9iamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRoU2VnbWVudDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckRhdGFJbXBsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckRhdGFJbXBsKE9iamVjdERhdGEgb2JqZWN0KSB7Ci0gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0KCkgewotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3REYXRhIG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFNlZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXRoU2VnbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXRoU2VnbWVudChTdHJpbmcgcGF0aFNlZ21lbnQpIHsKLSAgICAgICAgdGhpcy5wYXRoU2VnbWVudCA9IHBhdGhTZWdtZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiT2JqZWN0SW5Gb2xkZXIgW29iamVjdD0iICsgb2JqZWN0ICsgIiwgcGF0aCBzZWdtZW50PSIgKyBwYXRoU2VnbWVudCArICJdIiArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3RJbkZvbGRlckxpc3RJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL09iamVjdEluRm9sZGVyTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlMTgzYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL09iamVjdEluRm9sZGVyTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotCi0vKioKLSAqIE9iamVjdEluRm9sZGVyTGlzdCBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdEluRm9sZGVyTGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBPYmplY3RJbkZvbGRlckxpc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPiBvYmplY3RzOwotICAgIHByaXZhdGUgQm9vbGVhbiBoYXNNb3JlSXRlbXMgPSBCb29sZWFuLkZBTFNFOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBudW1JdGVtczsKLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gZ2V0T2JqZWN0cygpIHsKLSAgICAgICAgaWYgKG9iamVjdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0cyhMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gb2JqZWN0cykgewotICAgICAgICB0aGlzLm9iamVjdHMgPSBvYmplY3RzOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGhhc01vcmVJdGVtcygpIHsKLSAgICAgICAgcmV0dXJuIGhhc01vcmVJdGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYXNNb3JlSXRlbXMoQm9vbGVhbiBoYXNNb3JlSXRlbXMpIHsKLSAgICAgICAgdGhpcy5oYXNNb3JlSXRlbXMgPSBoYXNNb3JlSXRlbXM7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtSXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiBudW1JdGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1JdGVtcyhCaWdJbnRlZ2VyIG51bUl0ZW1zKSB7Ci0gICAgICAgIHRoaXMubnVtSXRlbXMgPSBudW1JdGVtczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIk9iamVjdEluRm9sZGVyIExpc3QgW29iamVjdHM9IiArIG9iamVjdHMgKyAiLCBoYXMgbW9yZSBpdGVtcz0iICsgaGFzTW9yZUl0ZW1zICsgIiwgbnVtIGl0ZW1zPSIKLSAgICAgICAgICAgICAgICArIG51bUl0ZW1zICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL09iamVjdExpc3RJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL09iamVjdExpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYzYzMzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3RMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLQotLyoqCi0gKiBPYmplY3RMaXN0IGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdEltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBPYmplY3RMaXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdERhdGE+IG9iamVjdHM7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGhhc01vcmVJdGVtcyA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIG51bUl0ZW1zOwotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0T2JqZWN0cygpIHsKLSAgICAgICAgaWYgKG9iamVjdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmplY3RzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdHMoTGlzdDxPYmplY3REYXRhPiBvYmplY3RzKSB7Ci0gICAgICAgIHRoaXMub2JqZWN0cyA9IG9iamVjdHM7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaGFzTW9yZUl0ZW1zKCkgewotICAgICAgICByZXR1cm4gaGFzTW9yZUl0ZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhc01vcmVJdGVtcyhCb29sZWFuIGhhc01vcmVJdGVtcykgewotICAgICAgICB0aGlzLmhhc01vcmVJdGVtcyA9IGhhc01vcmVJdGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXROdW1JdGVtcygpIHsKLSAgICAgICAgcmV0dXJuIG51bUl0ZW1zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bUl0ZW1zKEJpZ0ludGVnZXIgbnVtSXRlbXMpIHsKLSAgICAgICAgdGhpcy5udW1JdGVtcyA9IG51bUl0ZW1zOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiT2JqZWN0IExpc3QgW29iamVjdHM9IiArIG9iamVjdHMgKyAiLCBoYXMgbW9yZSBpdGVtcz0iICsgaGFzTW9yZUl0ZW1zICsgIiwgbnVtIGl0ZW1zPSIgKyBudW1JdGVtcyArICJdIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL09iamVjdFBhcmVudERhdGFJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL09iamVjdFBhcmVudERhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGEyMzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9PYmplY3RQYXJlbnREYXRhSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotCi0vKioKLSAqIE9iamVjdFBhcmVudERhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RQYXJlbnREYXRhSW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzIE9iamVjdFBhcmVudERhdGEgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIE9iamVjdERhdGEgb2JqZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0aXZlUGF0aFNlZ21lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0UGFyZW50RGF0YUltcGwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFBhcmVudERhdGFJbXBsKE9iamVjdERhdGEgb2JqZWN0KSB7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0RGF0YSBvYmplY3QpIHsKLSAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGhTZWdtZW50KCkgewotICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoU2VnbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZVBhdGhTZWdtZW50KFN0cmluZyByZWxhdGl2ZVBhdGhTZWdtZW50KSB7Ci0gICAgICAgIHRoaXMucmVsYXRpdmVQYXRoU2VnbWVudCA9IHJlbGF0aXZlUGF0aFNlZ21lbnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJPYmplY3QgUGFyZW50IFtvYmplY3Q9IiArIG9iamVjdCArICIsIHJlbGF0aXZlIHBhdGggc2VnbWVudD0iICsgcmVsYXRpdmVQYXRoU2VnbWVudCArICJdIgotICAgICAgICAgICAgICAgICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1BhcnRpYWxDb250ZW50U3RyZWFtSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9QYXJ0aWFsQ29udGVudFN0cmVhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1ZWZlNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1BhcnRpYWxDb250ZW50U3RyZWFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUGFydGlhbENvbnRlbnRTdHJlYW07Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBQYXJ0aWFsQ29udGVudFN0cmVhbX0gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgUGFydGlhbENvbnRlbnRTdHJlYW1JbXBsIGV4dGVuZHMgQ29udGVudFN0cmVhbUltcGwgaW1wbGVtZW50cyBQYXJ0aWFsQ29udGVudFN0cmVhbSB7Ci0KLSAgICBwdWJsaWMgUGFydGlhbENvbnRlbnRTdHJlYW1JbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBQYXJ0aWFsQ29udGVudFN0cmVhbUltcGwoU3RyaW5nIGZpbGVuYW1lLCBCaWdJbnRlZ2VyIGxlbmd0aCwgU3RyaW5nIG1pbWV0eXBlLCBJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICAgICAgc3VwZXIoZmlsZW5hbWUsIGxlbmd0aCwgbWltZXR5cGUsIHN0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcnRpYWxDb250ZW50U3RyZWFtSW1wbChTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBtaW1ldHlwZSwgU3RyaW5nIHN0cmluZykgewotICAgICAgICBzdXBlcihmaWxlbmFtZSwgbWltZXR5cGUsIHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9QZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzZkZGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9QZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5QZXJtaXNzaW9uRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQZXJtaXNzaW9uIGRlZmluaXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgUGVybWlzc2lvbkRlZmluaXRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwZXJtaXNzaW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIHBlcm1pc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIHBlcm1pc3Npb24pIHsKLSAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0gcGVybWlzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlBlcm1pc3Npb24gRGVmaW5pdGlvbiBbcGVybWlzc2lvbj0iICsgcGVybWlzc2lvbiArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICJdIgotICAgICAgICAgICAgICAgICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9QZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjViZTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9QZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5QZXJtaXNzaW9uTWFwcGluZzsKLQotLyoqCi0gKiBQZXJtaXNzaW9uIG1hcHBpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgUGVybWlzc2lvbk1hcHBpbmcgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGVybWlzc2lvbnM7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBlcm1pc3Npb25zKCkgewotICAgICAgICBpZiAocGVybWlzc2lvbnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcGVybWlzc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwZXJtaXNzaW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJtaXNzaW9ucyhMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMpIHsKLSAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUGVybWlzc2lvbiBNYXBwaW5nIFtrZXk9IiArIGtleSArICIsIHBlcm1pc3Npb25zPSIgKyBwZXJtaXNzaW9ucyArICJdIiArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1BvbGljeUlkTGlzdEltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUG9saWN5SWRMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDJmOGJhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUG9saWN5SWRMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBvbGljeUlkTGlzdDsKLQotLyoqCi0gKiBQb2xpY3lJZExpc3QgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2xpY3lJZExpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgUG9saWN5SWRMaXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcG9saWN5SWRzOwotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQb2xpY3lJZHMoKSB7Ci0gICAgICAgIHJldHVybiBwb2xpY3lJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9saWN5SWRzKExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMpIHsKLSAgICAgICAgdGhpcy5wb2xpY3lJZHMgPSBwb2xpY3lJZHM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1BvbGljeVR5cGVEZWZpbml0aW9uSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qb2xpY3lUeXBlRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2ODRkZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1BvbGljeVR5cGVEZWZpbml0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZVBvbGljeVR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIFBvbGljeSB0eXBlIGRlZmluaXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2xpY3lUeXBlRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIGltcGxlbWVudHMgTXV0YWJsZVBvbGljeVR5cGVEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnRpZXNJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnRpZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NGExNzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0aWVzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotCi0vKioKLSAqIFByb3BlcnRpZXMgZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgTXV0YWJsZVByb3BlcnRpZXMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PigpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXNJbXBsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICBpbml0aWFsIGNvbGxlY3Rpb24gb2YgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0aWVzSW1wbChDb2xsZWN0aW9uPFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcykgewotICAgICAgICBhZGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNoYWxsb3cgY29weSBjb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbGxlY3Rpb24gb2YgcHJvcGVydGllcyBidXQgcmVmZXJlbmNlcyB0aGUgb3JpZ2luYWwKLSAgICAgKiBwcm9wZXJ0eSBhbmQgZXh0ZW5zaW9uIG9iamVjdHMuCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXNJbXBsKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMuZ2V0UHJvcGVydHlMaXN0KCkpOwotICAgICAgICBzZXRFeHRlbnNpb25zKHByb3BlcnRpZXMuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gZ2V0UHJvcGVydHlMaXN0KCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChwcm9wZXJ0eUxpc3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnRpZXMoQ29sbGVjdGlvbjxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcHJvcCA6IHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eShwcm9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSkgewotICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChwcm9wZXJ0eSk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KHByb3BlcnR5LmdldElkKCksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUHJvcGVydHkoUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5KSB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVtb3ZlUHJvcGVydHkocHJvcGVydHkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChwcm9wZXJ0eSk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KHByb3BlcnR5LmdldElkKCksIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yPFByb3BlcnR5RGF0YTw/Pj4gaXRlcmF0b3IgPSBwcm9wZXJ0eUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhwcm9wZXJ0eS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoaWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUHJvcGVydGllcyBEYXRhIFtwcm9wZXJ0aWVzPSIgKyBwcm9wZXJ0eUxpc3QgKyAiXSIgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjEwYjc3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uOwotCi0vKioKLSAqIEJvb2xlYW4gcHJvcGVydHkgZGVmaW5pdGlvbiBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjxCb29sZWFuPiBpbXBsZW1lbnRzCi0gICAgICAgIE11dGFibGVQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUJvb2xlYW5JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5Qm9vbGVhbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWY5MS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5Qm9vbGVhbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydHlCb29sZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotCi0vKioKLSAqIEJvb2xlYW4gcHJvcGVydHkgZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Qm9vbGVhbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGF0YTxCb29sZWFuPiBpbXBsZW1lbnRzIE11dGFibGVQcm9wZXJ0eUJvb2xlYW4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlCb29sZWFuSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlCb29sZWFuSW1wbChTdHJpbmcgaWQsIExpc3Q8Qm9vbGVhbj4gdmFsdWVzKSB7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5Qm9vbGVhbkltcGwoU3RyaW5nIGlkLCBCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eUJvb2xlYW5JbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxCb29sZWFuPiBwcm9wRGVmLCBMaXN0PEJvb2xlYW4+IHZhbHVlcykgewotICAgICAgICBzZXRQcm9wZXJ0eURlZmluaXRpb24ocHJvcERlZik7Ci0gICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eUJvb2xlYW5JbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxCb29sZWFuPiBwcm9wRGVmLCBCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHNldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDg3NGFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUHJvcGVydHlEYXRlVGltZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZVJlc29sdXRpb247Ci0KLS8qKgotICogRGF0ZVRpbWUgcHJvcGVydHkgZGVmaW5pdGlvbiBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248R3JlZ29yaWFuQ2FsZW5kYXI+IGltcGxlbWVudHMKLSAgICAgICAgTXV0YWJsZVByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBEYXRlVGltZVJlc29sdXRpb24gZGF0ZVRpbWVSZXNvbHV0aW9uOwotCi0gICAgcHVibGljIERhdGVUaW1lUmVzb2x1dGlvbiBnZXREYXRlVGltZVJlc29sdXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkYXRlVGltZVJlc29sdXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0ZVRpbWVSZXNvbHV0aW9uKERhdGVUaW1lUmVzb2x1dGlvbiBkYXRlVGltZVJlc29sdXRpb24pIHsKLSAgICAgICAgdGhpcy5kYXRlVGltZVJlc29sdXRpb24gPSBkYXRlVGltZVJlc29sdXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eURhdGVUaW1lSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eURhdGVUaW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI3NDQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlEYXRlVGltZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTXV0YWJsZVByb3BlcnR5RGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci0KLS8qKgotICogRGF0ZVRpbWUgcHJvcGVydHkgZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGF0ZVRpbWVJbXBsIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eURhdGE8R3JlZ29yaWFuQ2FsZW5kYXI+IGltcGxlbWVudHMgTXV0YWJsZVByb3BlcnR5RGF0ZVRpbWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEYXRlVGltZUltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGF0ZVRpbWVJbXBsKFN0cmluZyBpZCwgTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gdmFsdWVzKSB7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGF0ZVRpbWVJbXBsKFN0cmluZyBpZCwgR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgc2V0SWQoaWQpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGF0ZVRpbWVJbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxHcmVnb3JpYW5DYWxlbmRhcj4gcHJvcERlZiwgTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gdmFsdWVzKSB7Ci0gICAgICAgIHNldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGF0ZVRpbWVJbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxHcmVnb3JpYW5DYWxlbmRhcj4gcHJvcERlZiwgR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgc2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY5ZjU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZVByb3BlcnR5RGVjaW1hbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EZWNpbWFsUHJlY2lzaW9uOwotCi0vKioKLSAqIERlY2ltYWwgcHJvcGVydHkgZGVmaW5pdGlvbiBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjxCaWdEZWNpbWFsPiBpbXBsZW1lbnRzCi0gICAgICAgIE11dGFibGVQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBCaWdEZWNpbWFsIG1pblZhbHVlOwotICAgIHByaXZhdGUgQmlnRGVjaW1hbCBtYXhWYWx1ZTsKLSAgICBwcml2YXRlIERlY2ltYWxQcmVjaXNpb24gcHJlY2lzaW9uOwotCi0gICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0TWluVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtaW5WYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW5WYWx1ZShCaWdEZWNpbWFsIG1pblZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWluVmFsdWUgPSBtaW5WYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRNYXhWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1heFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1heFZhbHVlKEJpZ0RlY2ltYWwgbWF4VmFsdWUpIHsKLSAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG1heFZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWNpbWFsUHJlY2lzaW9uIGdldFByZWNpc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHByZWNpc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVjaXNpb24oRGVjaW1hbFByZWNpc2lvbiBwcmVjaXNpb24pIHsKLSAgICAgICAgdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eURlY2ltYWxJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5RGVjaW1hbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkNzllYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5RGVjaW1hbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydHlEZWNpbWFsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotCi0vKioKLSAqIERlY2ltYWwgcHJvcGVydHkgZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGVjaW1hbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGF0YTxCaWdEZWNpbWFsPiBpbXBsZW1lbnRzIE11dGFibGVQcm9wZXJ0eURlY2ltYWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZWNpbWFsSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZWNpbWFsSW1wbChTdHJpbmcgaWQsIExpc3Q8QmlnRGVjaW1hbD4gdmFsdWVzKSB7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGVjaW1hbEltcGwoU3RyaW5nIGlkLCBCaWdEZWNpbWFsIHZhbHVlKSB7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eURlY2ltYWxJbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxCaWdEZWNpbWFsPiBwcm9wRGVmLCBMaXN0PEJpZ0RlY2ltYWw+IHZhbHVlcykgewotICAgICAgICBzZXRQcm9wZXJ0eURlZmluaXRpb24ocHJvcERlZik7Ci0gICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eURlY2ltYWxJbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxCaWdEZWNpbWFsPiBwcm9wRGVmLCBCaWdEZWNpbWFsIHZhbHVlKSB7Ci0gICAgICAgIHNldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4YTBjNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5SHRtbERlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUHJvcGVydHlIdG1sRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBIVE1MIHByb3BlcnR5IGRlZmluaXRpb24gZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248U3RyaW5nPiBpbXBsZW1lbnRzCi0gICAgICAgIE11dGFibGVQcm9wZXJ0eUh0bWxEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUh0bWxJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5SHRtbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhYWQ2Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5SHRtbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydHlIdG1sOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotCi0vKioKLSAqIEhUTUwgcHJvcGVydHkgZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SHRtbEltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGF0YTxTdHJpbmc+IGltcGxlbWVudHMgTXV0YWJsZVByb3BlcnR5SHRtbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eUh0bWxJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eUh0bWxJbXBsKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eUh0bWxJbXBsKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eUh0bWxJbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxTdHJpbmc+IHByb3BEZWYsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgc2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlIdG1sSW1wbChQcm9wZXJ0eURlZmluaXRpb248U3RyaW5nPiBwcm9wRGVmLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgc2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlJZERlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTU4ODUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eUlkRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBJZCBwcm9wZXJ0eSBkZWZpbml0aW9uIGRhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjxTdHJpbmc+IGltcGxlbWVudHMgTXV0YWJsZVByb3BlcnR5SWREZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUlkSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eUlkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzliZWFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlJZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLQotLyoqCi0gKiBJZCBwcm9wZXJ0eSBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJZEltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGF0YTxTdHJpbmc+IGltcGxlbWVudHMgTXV0YWJsZVByb3BlcnR5SWQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlJZEltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5SWRJbXBsKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eUlkSW1wbChTdHJpbmcgaWQsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgIHNldFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFByb3BlcnR5SWRJbXBsKFByb3BlcnR5RGVmaW5pdGlvbjxTdHJpbmc+IHByb3BEZWYsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgc2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlJZEltcGwoUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gcHJvcERlZiwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHNldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkMDVlZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uOwotCi0vKioKLSAqIEJvb2xlYW4gcHJvcGVydHkgZGVmaW5pdGlvbiBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjxCaWdJbnRlZ2VyPiBpbXBsZW1lbnRzCi0gICAgICAgIE11dGFibGVQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIG1pblZhbHVlOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBtYXhWYWx1ZTsKLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1pblZhbHVlKCkgewotICAgICAgICByZXR1cm4gbWluVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWluVmFsdWUoQmlnSW50ZWdlciBtaW5WYWx1ZSkgewotICAgICAgICB0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWF4VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXhWYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhWYWx1ZShCaWdJbnRlZ2VyIG1heFZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWF4VmFsdWUgPSBtYXhWYWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5SW50ZWdlckltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlJbnRlZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTlmNWVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlJbnRlZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk11dGFibGVQcm9wZXJ0eUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci0KLS8qKgotICogSW50ZWdlciBwcm9wZXJ0eSBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbnRlZ2VySW1wbCBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlEYXRhPEJpZ0ludGVnZXI+IGltcGxlbWVudHMgTXV0YWJsZVByb3BlcnR5SW50ZWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eUludGVnZXJJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eUludGVnZXJJbXBsKFN0cmluZyBpZCwgTGlzdDxCaWdJbnRlZ2VyPiB2YWx1ZXMpIHsKLSAgICAgICAgc2V0SWQoaWQpOwotICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlJbnRlZ2VySW1wbChTdHJpbmcgaWQsIEJpZ0ludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgc2V0SWQoaWQpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5SW50ZWdlckltcGwoUHJvcGVydHlEZWZpbml0aW9uPEJpZ0ludGVnZXI+IHByb3BEZWYsIExpc3Q8QmlnSW50ZWdlcj4gdmFsdWVzKSB7Ci0gICAgICAgIHNldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5SW50ZWdlckltcGwoUHJvcGVydHlEZWZpbml0aW9uPEJpZ0ludGVnZXI+IHByb3BEZWYsIEJpZ0ludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgc2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlMzliNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZVByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gaW1wbGVtZW50cwotICAgICAgICBNdXRhYmxlUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIG1heExlbmd0aDsKLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1heExlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhMZW5ndGgoQmlnSW50ZWdlciBtYXhMZW5ndGgpIHsKLSAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eVN0cmluZ0ltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlTdHJpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzI5MTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eVN0cmluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5NdXRhYmxlUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci0KLS8qKgotICogU3RyaW5nIHByb3BlcnR5IGRhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVN0cmluZ0ltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGF0YTxTdHJpbmc+IGltcGxlbWVudHMgTXV0YWJsZVByb3BlcnR5U3RyaW5nIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIFByb3BlcnR5U3RyaW5nSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlTdHJpbmdJbXBsKFN0cmluZyBpZCwgTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eVN0cmluZ0ltcGwoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgc2V0SWQoaWQpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5U3RyaW5nSW1wbChQcm9wZXJ0eURlZmluaXRpb248U3RyaW5nPiBwcm9wRGVmLCBMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0gICAgICAgIHNldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5U3RyaW5nSW1wbChQcm9wZXJ0eURlZmluaXRpb248U3RyaW5nPiBwcm9wRGVmLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgc2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9Qcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0MmI5OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eVVyaURlZmluaXRpb247Ci0KLS8qKgotICogVVJJIHByb3BlcnR5IGRlZmluaXRpb24gZGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjxTdHJpbmc+IGltcGxlbWVudHMKLSAgICAgICAgTXV0YWJsZVByb3BlcnR5VXJpRGVmaW5pdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlVcmlJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1Byb3BlcnR5VXJpSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Y5ZDI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUHJvcGVydHlVcmlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTXV0YWJsZVByb3BlcnR5VXJpOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotCi0vKioKLSAqIFVyaSBwcm9wZXJ0eSBkYXRhIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlVcmlJbXBsIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eURhdGE8U3RyaW5nPiBpbXBsZW1lbnRzIE11dGFibGVQcm9wZXJ0eVVyaSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eVVyaUltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5VXJpSW1wbChTdHJpbmcgaWQsIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKLSAgICAgICAgc2V0SWQoaWQpOwotICAgICAgICBzZXRWYWx1ZXModmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlVcmlJbXBsKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eVVyaUltcGwoUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gcHJvcERlZiwgTGlzdDxTdHJpbmc+IHZhbHVlcykgewotICAgICAgICBzZXRQcm9wZXJ0eURlZmluaXRpb24ocHJvcERlZik7Ci0gICAgICAgIHNldFZhbHVlcyh2YWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eVVyaUltcGwoUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gcHJvcERlZiwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHNldFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUXVlcnlUeXBlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9RdWVyeVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmVmMTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9RdWVyeVR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLQotcHVibGljIGNsYXNzIFF1ZXJ5VHlwZUltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdGF0ZW1lbnQ7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zOwotICAgIHByaXZhdGUgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9uczsKLSAgICBwcml2YXRlIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzOwotICAgIHByaXZhdGUgU3RyaW5nIHJlbmRpdGlvbkZpbHRlcjsKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgbWF4SXRlbXM7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHNraXBDb3VudDsKLQotICAgIHB1YmxpYyBRdWVyeVR5cGVJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGVtZW50KCkgewotICAgICAgICByZXR1cm4gc3RhdGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlbWVudChTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIHRoaXMuc3RhdGVtZW50ID0gc3RhdGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGdldFNlYXJjaEFsbFZlcnNpb25zKCkgewotICAgICAgICByZXR1cm4gc2VhcmNoQWxsVmVyc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VhcmNoQWxsVmVyc2lvbnMoQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucykgewotICAgICAgICB0aGlzLnNlYXJjaEFsbFZlcnNpb25zID0gc2VhcmNoQWxsVmVyc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyhCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKSB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5jbHVkZVJlbGF0aW9uc2hpcHMgZ2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlUmVsYXRpb25zaGlwczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlUmVsYXRpb25zaGlwcyhJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcykgewotICAgICAgICB0aGlzLmluY2x1ZGVSZWxhdGlvbnNoaXBzID0gaW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW5kaXRpb25GaWx0ZXIoKSB7Ci0gICAgICAgIHJldHVybiByZW5kaXRpb25GaWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVuZGl0aW9uRmlsdGVyKFN0cmluZyByZW5kaXRpb25GaWx0ZXIpIHsKLSAgICAgICAgdGhpcy5yZW5kaXRpb25GaWx0ZXIgPSByZW5kaXRpb25GaWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TWF4SXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiBtYXhJdGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhJdGVtcyhCaWdJbnRlZ2VyIG1heEl0ZW1zKSB7Ci0gICAgICAgIHRoaXMubWF4SXRlbXMgPSBtYXhJdGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRTa2lwQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBza2lwQ291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcENvdW50KEJpZ0ludGVnZXIgc2tpcENvdW50KSB7Ci0gICAgICAgIHRoaXMuc2tpcENvdW50ID0gc2tpcENvdW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUXVlcnlUeXBlIFtzdGF0ZW1lbnQ9IiArIHN0YXRlbWVudCArICIsIHNlYXJjaEFsbFZlcnNpb25zPSIgKyBzZWFyY2hBbGxWZXJzaW9ucwotICAgICAgICAgICAgICAgICsgIiwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnM9IiArIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zICsgIiwgaW5jbHVkZVJlbGF0aW9uc2hpcHM9IgotICAgICAgICAgICAgICAgICsgaW5jbHVkZVJlbGF0aW9uc2hpcHMgKyAiLCByZW5kaXRpb25GaWx0ZXI9IiArIHJlbmRpdGlvbkZpbHRlciArICIsIG1heEl0ZW1zPSIgKyBtYXhJdGVtcwotICAgICAgICAgICAgICAgICsgIiwgc2tpcENvdW50PSIgKyBza2lwQ291bnQgKyAiXSIgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1JlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzAzYTUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIFJlbGF0aW9uc2hpcCB0eXBlIGRlZmluaXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIGltcGxlbWVudHMgTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYWxsb3dlZFNvdXJjZVR5cGVzOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGFsbG93ZWRUYXJnZXRUeXBlczsKLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSB7Ci0gICAgICAgIGlmIChhbGxvd2VkU291cmNlVHlwZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWxsb3dlZFNvdXJjZVR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWxsb3dlZFNvdXJjZVR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRTb3VyY2VUeXBlcyhMaXN0PFN0cmluZz4gYWxsb3dlZFNvdXJjZVR5cGVzKSB7Ci0gICAgICAgIHRoaXMuYWxsb3dlZFNvdXJjZVR5cGVzID0gYWxsb3dlZFNvdXJjZVR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZFRhcmdldFR5cGVJZHMoKSB7Ci0gICAgICAgIGlmIChhbGxvd2VkVGFyZ2V0VHlwZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWxsb3dlZFRhcmdldFR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWxsb3dlZFRhcmdldFR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRUYXJnZXRUeXBlcyhMaXN0PFN0cmluZz4gYWxsb3dlZFRhcmdldFR5cGVzKSB7Ci0gICAgICAgIHRoaXMuYWxsb3dlZFRhcmdldFR5cGVzID0gYWxsb3dlZFRhcmdldFR5cGVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUmVuZGl0aW9uRGF0YUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUmVuZGl0aW9uRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5ZjZjNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1JlbmRpdGlvbkRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci0KLS8qKgotICogUmVuZGl0aW9uRGF0YSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFJlbmRpdGlvbkRhdGFJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgUmVuZGl0aW9uRGF0YSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHN0cmVhbUlkOwotICAgIHByaXZhdGUgU3RyaW5nIG1pbWVUeXBlOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBsZW5ndGg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcga2luZDsKLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgd2lkdGg7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGhlaWdodDsKLSAgICBwcml2YXRlIFN0cmluZyByZW5kaXRpb25Eb2N1bWVudElkOwotCi0gICAgcHVibGljIFJlbmRpdGlvbkRhdGFJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBSZW5kaXRpb25EYXRhSW1wbChTdHJpbmcgc3RyZWFtSWQsIFN0cmluZyBtaW1lVHlwZSwgQmlnSW50ZWdlciBsZW5ndGgsIFN0cmluZyBraW5kLCBTdHJpbmcgdGl0bGUsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIHdpZHRoLCBCaWdJbnRlZ2VyIGhlaWdodCwgU3RyaW5nIHJlbmRpdGlvbkRvY3VtZW50SWQpIHsKLSAgICAgICAgdGhpcy5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICB0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7Ci0gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDsKLSAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHRoaXMucmVuZGl0aW9uRG9jdW1lbnRJZCA9IHJlbmRpdGlvbkRvY3VtZW50SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJlYW1JZCgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmVhbUlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0cmVhbUlkKFN0cmluZyBzdHJlYW1JZCkgewotICAgICAgICB0aGlzLnN0cmVhbUlkID0gc3RyZWFtSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1pbWVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICB0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0QmlnTGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJpZ0xlbmd0aChCaWdJbnRlZ2VyIGxlbmd0aCkgewotICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKSB7Ci0gICAgICAgIHJldHVybiBraW5kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEtpbmQoU3RyaW5nIGtpbmQpIHsKLSAgICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdIZWlnaHQoKSB7Ci0gICAgICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmlnSGVpZ2h0KEJpZ0ludGVnZXIgaGVpZ2h0KSB7Ci0gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldEJpZ1dpZHRoKCkgewotICAgICAgICByZXR1cm4gd2lkdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmlnV2lkdGgoQmlnSW50ZWdlciB3aWR0aCkgewotICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZW5kaXRpb25Eb2N1bWVudElkKCkgewotICAgICAgICByZXR1cm4gcmVuZGl0aW9uRG9jdW1lbnRJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kaXRpb25Eb2N1bWVudElkKFN0cmluZyByZW5kaXRpb25Eb2N1bWVudElkKSB7Ci0gICAgICAgIHRoaXMucmVuZGl0aW9uRG9jdW1lbnRJZCA9IHJlbmRpdGlvbkRvY3VtZW50SWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJSZW5kaXRpb25EYXRhSW1wbCBbLCBraW5kPSIgKyBraW5kICsgIiwgdGl0bGU9IiArIHRpdGxlICsgIiwgTUlNRSB0eXBlPSIgKyBtaW1lVHlwZSArICIsIGxlbmd0aD0iCi0gICAgICAgICAgICAgICAgKyBsZW5ndGggKyAiLCByZW5kaXRpb24gZG9jdW1lbnQgaWQ9IiArIHJlbmRpdGlvbkRvY3VtZW50SWQgKyAiLCBzdHJlYW0gaWQ9IiArIHN0cmVhbUlkICsgIiBoZWlnaHQ9IgotICAgICAgICAgICAgICAgICsgaGVpZ2h0ICsgIiwgd2lkdGg9IiArIHdpZHRoICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM1YzRjYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1JlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DcmVhdGFibGVQcm9wZXJ0eVR5cGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDaGFuZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUpvaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5T3JkZXJCeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlSZW5kaXRpb25zOwotCi0vKioKLSAqIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgSW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMkw7Ci0KLSAgICBwcml2YXRlIEJvb2xlYW4gYWxsVmVyc2lvbnNTZWFyY2hhYmxlOwotICAgIHByaXZhdGUgQ2FwYWJpbGl0eUFjbCBjYXBhYmlsaXR5QWNsOwotICAgIHByaXZhdGUgQ2FwYWJpbGl0eUNoYW5nZXMgY2FwYWJpbGl0eUNoYW5nZXM7Ci0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMgY2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzOwotICAgIHByaXZhdGUgQ2FwYWJpbGl0eUpvaW4gY2FwYWJpbGl0eUpvaW47Ci0gICAgcHJpdmF0ZSBDYXBhYmlsaXR5UXVlcnkgY2FwYWJpbGl0eVF1ZXJ5OwotICAgIHByaXZhdGUgQ2FwYWJpbGl0eVJlbmRpdGlvbnMgY2FwYWJpbGl0eVJlbmRpdGlvbjsKLSAgICBwcml2YXRlIEJvb2xlYW4gaXNQd2NTZWFyY2hhYmxlOwotICAgIHByaXZhdGUgQm9vbGVhbiBpc1B3Y1VwZGF0YWJsZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gc3VwcG9ydHNHZXREZXNjZW5kYW50czsKLSAgICBwcml2YXRlIEJvb2xlYW4gc3VwcG9ydHNHZXRGb2xkZXJUcmVlOwotICAgIHByaXZhdGUgQ2FwYWJpbGl0eU9yZGVyQnkgY2FwYWJpbGl0eU9yZGVyQnk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHN1cHBvcnRzTXVsdGlmaWxpbmc7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHN1cHBvcnRzVW5maWxpbmc7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nOwotICAgIHByaXZhdGUgQ3JlYXRhYmxlUHJvcGVydHlUeXBlcyBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzOwotICAgIHByaXZhdGUgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbChSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzIGRhdGEpIHsKLSAgICAgICAgYWxsVmVyc2lvbnNTZWFyY2hhYmxlID0gZGF0YS5pc0FsbFZlcnNpb25zU2VhcmNoYWJsZVN1cHBvcnRlZCgpOwotICAgICAgICBjYXBhYmlsaXR5QWNsID0gZGF0YS5nZXRBY2xDYXBhYmlsaXR5KCk7Ci0gICAgICAgIGNhcGFiaWxpdHlDaGFuZ2VzID0gZGF0YS5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpOwotICAgICAgICBjYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMgPSBkYXRhLmdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpOwotICAgICAgICBjYXBhYmlsaXR5Sm9pbiA9IGRhdGEuZ2V0Sm9pbkNhcGFiaWxpdHkoKTsKLSAgICAgICAgY2FwYWJpbGl0eVF1ZXJ5ID0gZGF0YS5nZXRRdWVyeUNhcGFiaWxpdHkoKTsKLSAgICAgICAgY2FwYWJpbGl0eVJlbmRpdGlvbiA9IGRhdGEuZ2V0UmVuZGl0aW9uc0NhcGFiaWxpdHkoKTsKLSAgICAgICAgaXNQd2NTZWFyY2hhYmxlID0gZGF0YS5pc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKTsKLSAgICAgICAgaXNQd2NVcGRhdGFibGUgPSBkYXRhLmlzUHdjVXBkYXRhYmxlU3VwcG9ydGVkKCk7Ci0gICAgICAgIHN1cHBvcnRzR2V0RGVzY2VuZGFudHMgPSBkYXRhLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKTsKLSAgICAgICAgc3VwcG9ydHNHZXRGb2xkZXJUcmVlID0gZGF0YS5pc0dldEZvbGRlclRyZWVTdXBwb3J0ZWQoKTsKLSAgICAgICAgY2FwYWJpbGl0eU9yZGVyQnkgPSBkYXRhLmdldE9yZGVyQnlDYXBhYmlsaXR5KCk7Ci0gICAgICAgIHN1cHBvcnRzTXVsdGlmaWxpbmcgPSBkYXRhLmlzTXVsdGlmaWxpbmdTdXBwb3J0ZWQoKTsKLSAgICAgICAgc3VwcG9ydHNVbmZpbGluZyA9IGRhdGEuaXNVbmZpbGluZ1N1cHBvcnRlZCgpOwotICAgICAgICBzdXBwb3J0c1ZlcnNpb25TcGVjaWZpY0ZpbGluZyA9IGRhdGEuaXNWZXJzaW9uU3BlY2lmaWNGaWxpbmdTdXBwb3J0ZWQoKTsKLSAgICAgICAgY3JlYXRhYmxlUHJvcGVydHlUeXBlcyA9IGRhdGEuZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpOwotICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzID0gZGF0YS5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHNldEV4dGVuc2lvbnMoZGF0YS5nZXRFeHRlbnNpb25zKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzQWxsVmVyc2lvbnNTZWFyY2hhYmxlU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gYWxsVmVyc2lvbnNTZWFyY2hhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbFZlcnNpb25zU2VhcmNoYWJsZShCb29sZWFuIGFsbFZlcnNpb25zU2VhcmNoYWJsZSkgewotICAgICAgICB0aGlzLmFsbFZlcnNpb25zU2VhcmNoYWJsZSA9IGFsbFZlcnNpb25zU2VhcmNoYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FwYWJpbGl0eUFjbCBnZXRBY2xDYXBhYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gY2FwYWJpbGl0eUFjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5QWNsKENhcGFiaWxpdHlBY2wgY2FwYWJpbGl0eUFjbCkgewotICAgICAgICB0aGlzLmNhcGFiaWxpdHlBY2wgPSBjYXBhYmlsaXR5QWNsOwotICAgIH0KLQotICAgIHB1YmxpYyBDYXBhYmlsaXR5Q2hhbmdlcyBnZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHlDaGFuZ2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHlDaGFuZ2VzKENhcGFiaWxpdHlDaGFuZ2VzIGNhcGFiaWxpdHlDaGFuZ2VzKSB7Ci0gICAgICAgIHRoaXMuY2FwYWJpbGl0eUNoYW5nZXMgPSBjYXBhYmlsaXR5Q2hhbmdlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIGdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMoQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIGNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcykgewotICAgICAgICB0aGlzLmNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyA9IGNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FwYWJpbGl0eUpvaW4gZ2V0Sm9pbkNhcGFiaWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiBjYXBhYmlsaXR5Sm9pbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5Sm9pbihDYXBhYmlsaXR5Sm9pbiBjYXBhYmlsaXR5Sm9pbikgewotICAgICAgICB0aGlzLmNhcGFiaWxpdHlKb2luID0gY2FwYWJpbGl0eUpvaW47Ci0gICAgfQotCi0gICAgcHVibGljIENhcGFiaWxpdHlRdWVyeSBnZXRRdWVyeUNhcGFiaWxpdHkoKSB7Ci0gICAgICAgIHJldHVybiBjYXBhYmlsaXR5UXVlcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0eVF1ZXJ5KENhcGFiaWxpdHlRdWVyeSBjYXBhYmlsaXR5UXVlcnkpIHsKLSAgICAgICAgdGhpcy5jYXBhYmlsaXR5UXVlcnkgPSBjYXBhYmlsaXR5UXVlcnk7Ci0gICAgfQotCi0gICAgcHVibGljIENhcGFiaWxpdHlSZW5kaXRpb25zIGdldFJlbmRpdGlvbnNDYXBhYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gY2FwYWJpbGl0eVJlbmRpdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXR5UmVuZGl0aW9uKENhcGFiaWxpdHlSZW5kaXRpb25zIGNhcGFiaWxpdHlSZW5kaXRpb24pIHsKLSAgICAgICAgdGhpcy5jYXBhYmlsaXR5UmVuZGl0aW9uID0gY2FwYWJpbGl0eVJlbmRpdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc1B3Y1NlYXJjaGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNQd2NTZWFyY2hhYmxlKEJvb2xlYW4gaXNQd2NTZWFyY2hhYmxlKSB7Ci0gICAgICAgIHRoaXMuaXNQd2NTZWFyY2hhYmxlID0gaXNQd2NTZWFyY2hhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzUHdjVXBkYXRhYmxlU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gaXNQd2NVcGRhdGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNQd2NVcGRhdGFibGUoQm9vbGVhbiBpc1B3Y1VwZGF0YWJsZSkgewotICAgICAgICB0aGlzLmlzUHdjVXBkYXRhYmxlID0gaXNQd2NVcGRhdGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNHZXREZXNjZW5kYW50c1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHN1cHBvcnRzR2V0RGVzY2VuZGFudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydHNHZXREZXNjZW5kYW50cyhCb29sZWFuIHN1cHBvcnRzR2V0RGVzY2VuZGFudHMpIHsKLSAgICAgICAgdGhpcy5zdXBwb3J0c0dldERlc2NlbmRhbnRzID0gc3VwcG9ydHNHZXREZXNjZW5kYW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc0dldEZvbGRlclRyZWVTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBzdXBwb3J0c0dldEZvbGRlclRyZWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydHNHZXRGb2xkZXJUcmVlKEJvb2xlYW4gc3VwcG9ydHNHZXRGb2xkZXJUcmVlKSB7Ci0gICAgICAgIHRoaXMuc3VwcG9ydHNHZXRGb2xkZXJUcmVlID0gc3VwcG9ydHNHZXRGb2xkZXJUcmVlOwotICAgIH0KLQotICAgIHB1YmxpYyBDYXBhYmlsaXR5T3JkZXJCeSBnZXRPcmRlckJ5Q2FwYWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHlPcmRlckJ5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhcGFiaWxpdHlPcmRlckJ5KENhcGFiaWxpdHlPcmRlckJ5IGNhcGFiaWxpdHlPcmRlckJ5KSB7Ci0gICAgICAgIHRoaXMuY2FwYWJpbGl0eU9yZGVyQnkgPSBjYXBhYmlsaXR5T3JkZXJCeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNzZXRDYXBhYmlsaXR5T3JkZXJCeShDYXBhYmlsaXR5T3JkZXJCeSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBzZXRPcmRlckJ5Q2FwYWJpbGl0eShDYXBhYmlsaXR5T3JkZXJCeSBjYXBhYmlsaXR5T3JkZXJCeSkgewotICAgICAgICBzZXRDYXBhYmlsaXR5T3JkZXJCeShjYXBhYmlsaXR5T3JkZXJCeSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gaXNNdWx0aWZpbGluZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHN1cHBvcnRzTXVsdGlmaWxpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydHNNdWx0aWZpbGluZyhCb29sZWFuIHN1cHBvcnRzTXVsdGlmaWxpbmcpIHsKLSAgICAgICAgdGhpcy5zdXBwb3J0c011bHRpZmlsaW5nID0gc3VwcG9ydHNNdWx0aWZpbGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBpc1VuZmlsaW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydHNVbmZpbGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0c1VuZmlsaW5nKEJvb2xlYW4gc3VwcG9ydHNVbmZpbGluZykgewotICAgICAgICB0aGlzLnN1cHBvcnRzVW5maWxpbmcgPSBzdXBwb3J0c1VuZmlsaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGlzVmVyc2lvblNwZWNpZmljRmlsaW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydHNWZXJzaW9uU3BlY2lmaWNGaWxpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydHNWZXJzaW9uU3BlY2lmaWNGaWxpbmcoQm9vbGVhbiBzdXBwb3J0c1ZlcnNpb25TcGVjaWZpY0ZpbGluZykgewotICAgICAgICB0aGlzLnN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nID0gc3VwcG9ydHNWZXJzaW9uU3BlY2lmaWNGaWxpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIENyZWF0YWJsZVByb3BlcnR5VHlwZXMgZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0YWJsZVByb3BlcnR5VHlwZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcyhDcmVhdGFibGVQcm9wZXJ0eVR5cGVzIGNyZWF0YWJsZVByb3BlcnR5VHlwZXMpIHsKLSAgICAgICAgdGhpcy5jcmVhdGFibGVQcm9wZXJ0eVR5cGVzID0gY3JlYXRhYmxlUHJvcGVydHlUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBnZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcykgewotICAgICAgICB0aGlzLm5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgPSBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUmVwb3NpdG9yeSBDYXBhYmlsaXRpZXMgW2FsbCB2ZXJzaW9ucyBzZWFyY2hhYmxlPSIgKyBhbGxWZXJzaW9uc1NlYXJjaGFibGUgKyAiLCBjYXBhYmlsaXR5IEFDTD0iCi0gICAgICAgICAgICAgICAgKyBjYXBhYmlsaXR5QWNsICsgIiwgY2FwYWJpbGl0eSBjaGFuZ2VzPSIgKyBjYXBhYmlsaXR5Q2hhbmdlcyArICIsIGNhcGFiaWxpdHkgY29udGVudCBzdHJlYW0gdXBkYXRlcz0iCi0gICAgICAgICAgICAgICAgKyBjYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMgKyAiLCBjYXBhYmlsaXR5IGpvaW49IiArIGNhcGFiaWxpdHlKb2luICsgIiwgY2FwYWJpbGl0eSBxdWVyeT0iCi0gICAgICAgICAgICAgICAgKyBjYXBhYmlsaXR5UXVlcnkgKyAiLCBjYXBhYmlsaXR5IHJlbmRpdGlvbj0iICsgY2FwYWJpbGl0eVJlbmRpdGlvbiArICIsIGlzIFBXQyBzZWFyY2hhYmxlPSIKLSAgICAgICAgICAgICAgICArIGlzUHdjU2VhcmNoYWJsZSArICIsIGlzIFBXQyB1cGRhdGFibGU9IiArIGlzUHdjVXBkYXRhYmxlICsgIiwgc3VwcG9ydHMgR2V0RGVzY2VuZGFudHM9IgotICAgICAgICAgICAgICAgICsgc3VwcG9ydHNHZXREZXNjZW5kYW50cyArICIsIHN1cHBvcnRzIEdldEZvbGRlclRyZWU9IiArIHN1cHBvcnRzR2V0Rm9sZGVyVHJlZQotICAgICAgICAgICAgICAgICsgIiwgc3VwcG9ydHMgbXVsdGlmaWxpbmc9IiArIHN1cHBvcnRzTXVsdGlmaWxpbmcgKyAiLCBzdXBwb3J0cyB1bmZpbGluZz0iICsgc3VwcG9ydHNVbmZpbGluZwotICAgICAgICAgICAgICAgICsgIiwgc3VwcG9ydHMgdmVyc2lvbiBzcGVjaWZpYyBmaWxpbmc9IiArIHN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nICsgIiwgY3JlYXRhYmxlIHByb3BlcnR5IHR5cGVzPSIKLSAgICAgICAgICAgICAgICArIGNyZWF0YWJsZVByb3BlcnR5VHlwZXMgKyAiLCBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzPSIgKyBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzICsgIl0iCi0gICAgICAgICAgICAgICAgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9SZXBvc2l0b3J5SW5mb0Jyb3dzZXJCaW5kaW5nSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9SZXBvc2l0b3J5SW5mb0Jyb3dzZXJCaW5kaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTAzOWYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvUmVwb3NpdG9yeUluZm9Ccm93c2VyQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBpbmZvIGRhdGEgaW1wbGVtZW50YXRpb24gaW5jbHVkaW5nIGJyb3dzZXIgYmluZGluZyBzcGVjaWZpYyBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUluZm9Ccm93c2VyQmluZGluZ0ltcGwgZXh0ZW5kcyBSZXBvc2l0b3J5SW5mb0ltcGwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5VXJsOwotICAgIHByaXZhdGUgU3RyaW5nIHJvb3RVcmw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlVcmwoKSB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5VXJsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnlVcmwoU3RyaW5nIHJlcG9zaXRvcnlVcmwpIHsKLSAgICAgICAgdGhpcy5yZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeVVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RVcmwoKSB7Ci0gICAgICAgIHJldHVybiByb290VXJsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJvb3RVcmwoU3RyaW5nIHJvb3RVcmwpIHsKLSAgICAgICAgdGhpcy5yb290VXJsID0gcm9vdFVybDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1JlcG9zaXRvcnlJbmZvSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9SZXBvc2l0b3J5SW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0YTNmNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1JlcG9zaXRvcnlJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbENhcGFiaWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUNhcGFiaWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci0KLS8qKgotICogUmVwb3NpdG9yeSBpbmZvIGRhdGEgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5SW5mb0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEV4dGVuc2lvbkRhdGEgaW1wbGVtZW50cyBSZXBvc2l0b3J5SW5mbyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvblN1cHBvcnRlZDsKLSAgICBwcml2YXRlIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzOwotICAgIHByaXZhdGUgU3RyaW5nIHJvb3RGb2xkZXJJZDsKLSAgICBwcml2YXRlIEFjbENhcGFiaWxpdGllcyBhY2xDYXBhYmlsaXRpZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJpbmNpcGFsQW5vbnltb3VzOwotICAgIHByaXZhdGUgU3RyaW5nIHByaW5jaXBhbEFueW9uZTsKLSAgICBwcml2YXRlIFN0cmluZyB0aGluQ2xpZW50VXJpOwotICAgIHByaXZhdGUgQm9vbGVhbiBjaGFuZ2VzSW5jb21wbGV0ZTsKLSAgICBwcml2YXRlIExpc3Q8QmFzZVR5cGVJZD4gY2hhbmdlc09uVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBsYXRlc3RDaGFuZ2VMb2dUb2tlbjsKLSAgICBwcml2YXRlIFN0cmluZyB2ZW5kb3JOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3ROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHByb2R1Y3RWZXJzaW9uOwotICAgIHByaXZhdGUgTGlzdDxFeHRlbnNpb25GZWF0dXJlPiBleHRlbnNpb25GZWF0dXJlczsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mb0ltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvSW1wbChSZXBvc2l0b3J5SW5mbyBkYXRhKSB7Ci0gICAgICAgIGlkID0gZGF0YS5nZXRJZCgpOwotICAgICAgICBuYW1lID0gZGF0YS5nZXROYW1lKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uID0gZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICB2ZXJzaW9uU3VwcG9ydGVkID0gZGF0YS5nZXRDbWlzVmVyc2lvblN1cHBvcnRlZCgpOwotICAgICAgICBjYXBhYmlsaXRpZXMgPSBkYXRhLmdldENhcGFiaWxpdGllcygpOwotICAgICAgICByb290Rm9sZGVySWQgPSBkYXRhLmdldFJvb3RGb2xkZXJJZCgpOwotICAgICAgICBhY2xDYXBhYmlsaXRpZXMgPSBkYXRhLmdldEFjbENhcGFiaWxpdGllcygpOwotICAgICAgICBwcmluY2lwYWxBbm9ueW1vdXMgPSBkYXRhLmdldFByaW5jaXBhbElkQW5vbnltb3VzKCk7Ci0gICAgICAgIHByaW5jaXBhbEFueW9uZSA9IGRhdGEuZ2V0UHJpbmNpcGFsSWRBbnlvbmUoKTsKLSAgICAgICAgdGhpbkNsaWVudFVyaSA9IGRhdGEuZ2V0VGhpbkNsaWVudFVyaSgpOwotICAgICAgICBjaGFuZ2VzSW5jb21wbGV0ZSA9IGRhdGEuZ2V0Q2hhbmdlc0luY29tcGxldGUoKTsKLSAgICAgICAgY2hhbmdlc09uVHlwZSA9IGRhdGEuZ2V0Q2hhbmdlc09uVHlwZSgpOwotICAgICAgICBsYXRlc3RDaGFuZ2VMb2dUb2tlbiA9IGRhdGEuZ2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oKTsKLSAgICAgICAgdmVuZG9yTmFtZSA9IGRhdGEuZ2V0VmVuZG9yTmFtZSgpOwotICAgICAgICBwcm9kdWN0TmFtZSA9IGRhdGEuZ2V0UHJvZHVjdE5hbWUoKTsKLSAgICAgICAgcHJvZHVjdFZlcnNpb24gPSBkYXRhLmdldFByb2R1Y3RWZXJzaW9uKCk7Ci0gICAgICAgIGV4dGVuc2lvbkZlYXR1cmVzID0gZGF0YS5nZXRFeHRlbnNpb25GZWF0dXJlcygpOwotICAgICAgICBzZXRFeHRlbnNpb25zKGRhdGEuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENtaXNWZXJzaW9uU3VwcG9ydGVkKCkgewotICAgICAgICBpZiAodmVyc2lvblN1cHBvcnRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIjEuMCI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmVyc2lvblN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbWlzVmVyc2lvblN1cHBvcnRlZChTdHJpbmcgdmVyc2lvblN1cHBvcnRlZCkgewotICAgICAgICB0aGlzLnZlcnNpb25TdXBwb3J0ZWQgPSB2ZXJzaW9uU3VwcG9ydGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgaWYgKHZlcnNpb25TdXBwb3J0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDbWlzVmVyc2lvbi5mcm9tVmFsdWUodmVyc2lvblN1cHBvcnRlZCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ21pc1ZlcnNpb24uQ01JU18xXzA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbWlzVmVyc2lvbihDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgewotICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdmVyc2lvblN1cHBvcnRlZCA9IENtaXNWZXJzaW9uLkNNSVNfMV8wLnZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJzaW9uU3VwcG9ydGVkID0gY21pc1ZlcnNpb24udmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzIGdldENhcGFiaWxpdGllcygpIHsKLSAgICAgICAgcmV0dXJuIGNhcGFiaWxpdGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXRpZXMoUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSb290Rm9sZGVySWQoKSB7Ci0gICAgICAgIHJldHVybiByb290Rm9sZGVySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Um9vdEZvbGRlcihTdHJpbmcgcm9vdEZvbGRlcklkKSB7Ci0gICAgICAgIHRoaXMucm9vdEZvbGRlcklkID0gcm9vdEZvbGRlcklkOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2xDYXBhYmlsaXRpZXMgZ2V0QWNsQ2FwYWJpbGl0aWVzKCkgewotICAgICAgICByZXR1cm4gYWNsQ2FwYWJpbGl0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjbENhcGFiaWxpdGllcyhBY2xDYXBhYmlsaXRpZXMgYWNsQ2FwYWJpbGl0aWVzKSB7Ci0gICAgICAgIHRoaXMuYWNsQ2FwYWJpbGl0aWVzID0gYWNsQ2FwYWJpbGl0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJpbmNpcGFsSWRBbm9ueW1vdXMoKSB7Ci0gICAgICAgIHJldHVybiBwcmluY2lwYWxBbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJpbmNpcGFsQW5vbnltb3VzKFN0cmluZyBwcmluY2lwYWxBbm9ueW1vdXMpIHsKLSAgICAgICAgdGhpcy5wcmluY2lwYWxBbm9ueW1vdXMgPSBwcmluY2lwYWxBbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmluY2lwYWxJZEFueW9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHByaW5jaXBhbEFueW9uZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmluY2lwYWxBbnlvbmUoU3RyaW5nIHByaW5jaXBhbEFueW9uZSkgewotICAgICAgICB0aGlzLnByaW5jaXBhbEFueW9uZSA9IHByaW5jaXBhbEFueW9uZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRoaW5DbGllbnRVcmkoKSB7Ci0gICAgICAgIHJldHVybiB0aGluQ2xpZW50VXJpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRoaW5DbGllbnRVcmkoU3RyaW5nIHRoaW5DbGllbnRVcmkpIHsKLSAgICAgICAgdGhpcy50aGluQ2xpZW50VXJpID0gdGhpbkNsaWVudFVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRDaGFuZ2VzSW5jb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5nZXNJbmNvbXBsZXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENoYW5nZXNJbmNvbXBsZXRlKEJvb2xlYW4gY2hhbmdlc0luY29tcGxldGUpIHsKLSAgICAgICAgdGhpcy5jaGFuZ2VzSW5jb21wbGV0ZSA9IGNoYW5nZXNJbmNvbXBsZXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEJhc2VUeXBlSWQ+IGdldENoYW5nZXNPblR5cGUoKSB7Ci0gICAgICAgIGlmIChjaGFuZ2VzT25UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoYW5nZXNPblR5cGUgPSBuZXcgQXJyYXlMaXN0PEJhc2VUeXBlSWQ+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hhbmdlc09uVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2VzT25UeXBlKExpc3Q8QmFzZVR5cGVJZD4gY2hhbmdlc09uVHlwZSkgewotICAgICAgICB0aGlzLmNoYW5nZXNPblR5cGUgPSBjaGFuZ2VzT25UeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBsYXRlc3RDaGFuZ2VMb2dUb2tlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbihTdHJpbmcgbGF0ZXN0Q2hhbmdlTG9nVG9rZW4pIHsKLSAgICAgICAgdGhpcy5sYXRlc3RDaGFuZ2VMb2dUb2tlbiA9IGxhdGVzdENoYW5nZUxvZ1Rva2VuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHZlbmRvck5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVuZG9yTmFtZShTdHJpbmcgdmVuZG9yTmFtZSkgewotICAgICAgICB0aGlzLnZlbmRvck5hbWUgPSB2ZW5kb3JOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9kdWN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0TmFtZShTdHJpbmcgcHJvZHVjdE5hbWUpIHsKLSAgICAgICAgdGhpcy5wcm9kdWN0TmFtZSA9IHByb2R1Y3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBwcm9kdWN0VmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9kdWN0VmVyc2lvbihTdHJpbmcgcHJvZHVjdFZlcnNpb24pIHsKLSAgICAgICAgdGhpcy5wcm9kdWN0VmVyc2lvbiA9IHByb2R1Y3RWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEV4dGVuc2lvbkZlYXR1cmU+IGdldEV4dGVuc2lvbkZlYXR1cmVzKCkgewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uRmVhdHVyZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uRmVhdHVyZShMaXN0PEV4dGVuc2lvbkZlYXR1cmU+IGV4dGVuc2lvbkZlYXR1cmVzKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uRmVhdHVyZXMgPSBleHRlbnNpb25GZWF0dXJlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlJlcG9zaXRvcnkgSW5mbyBbaWQ9IiArIGlkICsgIiwgbmFtZT0iICsgbmFtZSArICIsIGRlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArICIsIGNhcGFiaWxpdGllcz0iCi0gICAgICAgICAgICAgICAgKyBjYXBhYmlsaXRpZXMgKyAiLCBBQ0wgY2FwYWJpbGl0aWVzPSIgKyBhY2xDYXBhYmlsaXRpZXMgKyAiLCBjaGFuZ2VzIGluY29tcGxldGU9IiArIGNoYW5nZXNJbmNvbXBsZXRlCi0gICAgICAgICAgICAgICAgKyAiLCBjaGFuZ2VzIG9uIHR5cGU9IiArIGNoYW5nZXNPblR5cGUgKyAiLCBsYXRlc3QgY2hhbmdlIGxvZyB0b2tlbj0iICsgbGF0ZXN0Q2hhbmdlTG9nVG9rZW4KLSAgICAgICAgICAgICAgICArICIsIHByaW5jaXBhbCBhbm9ueW1vdXM9IiArIHByaW5jaXBhbEFub255bW91cyArICIsIHByaW5jaXBhbCBhbnlvbmU9IiArIHByaW5jaXBhbEFueW9uZQotICAgICAgICAgICAgICAgICsgIiwgdmVuZG9yIG5hbWU9IiArIHZlbmRvck5hbWUgKyAiLCBwcm9kdWN0IG5hbWU9IiArIHByb2R1Y3ROYW1lICsgIiwgcHJvZHVjdCB2ZXJzaW9uPSIKLSAgICAgICAgICAgICAgICArIHByb2R1Y3RWZXJzaW9uICsgIiwgcm9vdCBmb2xkZXIgaWQ9IiArIHJvb3RGb2xkZXJJZCArICIsIHRoaW4gY2xpZW50IFVSST0iICsgdGhpbkNsaWVudFVyaQotICAgICAgICAgICAgICAgICsgIiwgdmVyc2lvbiBzdXBwb3J0ZWQ9IiArIHZlcnNpb25TdXBwb3J0ZWQgKyAiLCBleHRlbnNpb24gZmVhdHVyZXM9IiArIGV4dGVuc2lvbkZlYXR1cmVzICsgIl0iCi0gICAgICAgICAgICAgICAgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9TZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjY3ZmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9TZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbCBleHRlbmRzIEFic3RyYWN0VHlwZURlZmluaXRpb24gaW1wbGVtZW50cyBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1R5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmNiYmRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLQotLyoqCi0gKiBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCBleHRlbmRzIEFic3RyYWN0RXh0ZW5zaW9uRGF0YSBpbXBsZW1lbnRzIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBUeXBlRGVmaW5pdGlvbiB0eXBlOwotICAgIHByaXZhdGUgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gY2hpbGRyZW47Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwoVHlwZURlZmluaXRpb24gdHlwZURlZikgewotICAgICAgICB0eXBlID0gdHlwZURlZjsKLSAgICAgICAgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBjaGlsZHJlbikgewotICAgICAgICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJUeXBlIERlZmluaXRpb24gQ29udGFpbmVyIFt0eXBlPSIgKyB0eXBlICsgIiAsY2hpbGRyZW49IiArIGNoaWxkcmVuICsgIl0iICsgc3VwZXIudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2RhdGFvYmplY3RzL1R5cGVEZWZpbml0aW9uTGlzdEltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvVHlwZURlZmluaXRpb25MaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjZiZDVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvVHlwZURlZmluaXRpb25MaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0czsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLQotLyoqCi0gKiBUeXBlRGVmaW5pdGlvbkxpc3QgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RFeHRlbnNpb25EYXRhIGltcGxlbWVudHMgVHlwZURlZmluaXRpb25MaXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBMaXN0PFR5cGVEZWZpbml0aW9uPiBsaXN0OwotICAgIHByaXZhdGUgQm9vbGVhbiBoYXNNb3JlSXRlbXMgPSBCb29sZWFuLkZBTFNFOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBudW1JdGVtczsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdEltcGwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZnJvbSBhIGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGxpc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSBpbml0aWFsIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0SW1wbChMaXN0PFR5cGVEZWZpbml0aW9uPiBsaXN0KSB7Ci0gICAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgICAgIHRoaXMuaGFzTW9yZUl0ZW1zID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgdGhpcy5udW1JdGVtcyA9IEJpZ0ludGVnZXIudmFsdWVPZihsaXN0LnNpemUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb24+IGdldExpc3QoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExpc3QoTGlzdDxUeXBlRGVmaW5pdGlvbj4gbGlzdCkgewotICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGhhc01vcmVJdGVtcygpIHsKLSAgICAgICAgcmV0dXJuIGhhc01vcmVJdGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYXNNb3JlSXRlbXMoQm9vbGVhbiBoYXNNb3JlSXRlbXMpIHsKLSAgICAgICAgdGhpcy5oYXNNb3JlSXRlbXMgPSBoYXNNb3JlSXRlbXM7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtSXRlbXMoKSB7Ci0gICAgICAgIHJldHVybiBudW1JdGVtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1JdGVtcyhCaWdJbnRlZ2VyIG51bUl0ZW1zKSB7Ci0gICAgICAgIHRoaXMubnVtSXRlbXMgPSBudW1JdGVtczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlR5cGUgRGVmaW5pdGlvbiBMaXN0IFtsaXN0PSIgKyBsaXN0ICsgIiwgaGFzIG1vcmUgaXRlbXM9IiArIGhhc01vcmVJdGVtcyArICIsIG51bSBpdGVtcz0iICsgbnVtSXRlbXMKLSAgICAgICAgICAgICAgICArICJdIiArIHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9UeXBlTXV0YWJpbGl0eUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvVHlwZU11dGFiaWxpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjgyZmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9kYXRhb2JqZWN0cy9UeXBlTXV0YWJpbGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVNdXRhYmlsaXR5OwotCi1wdWJsaWMgY2xhc3MgVHlwZU11dGFiaWxpdHlJbXBsIGV4dGVuZHMgRXh0ZW5zaW9uRGF0YUltcGwgaW1wbGVtZW50cyBUeXBlTXV0YWJpbGl0eSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgQm9vbGVhbiBjYW5DcmVhdGU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIGNhblVwZGF0ZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gY2FuRGVsZXRlOwotCi0gICAgcHVibGljIEJvb2xlYW4gY2FuQ3JlYXRlKCkgewotICAgICAgICByZXR1cm4gY2FuQ3JlYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbkNyZWF0ZShCb29sZWFuIGNhbkNyZWF0ZSkgewotICAgICAgICB0aGlzLmNhbkNyZWF0ZSA9IGNhbkNyZWF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBjYW5VcGRhdGUoKSB7Ci0gICAgICAgIHJldHVybiBjYW5VcGRhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuVXBkYXRlKEJvb2xlYW4gY2FuVXBkYXRlKSB7Ci0gICAgICAgIHRoaXMuY2FuVXBkYXRlID0gY2FuVXBkYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIGNhbkRlbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhbkRlbGV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5EZWxldGUoQm9vbGVhbiBjYW5EZWxldGUpIHsKLSAgICAgICAgdGhpcy5jYW5EZWxldGUgPSBjYW5EZWxldGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJUeXBlTXV0YWJpbGl0eSBbY2FuQ3JlYXRlPSIgKyBjYW5DcmVhdGUgKyAiLCBjYW5VcGRhdGU9IiArIGNhblVwZGF0ZSArICIsIGNhbkRlbGV0ZT0iICsgY2FuRGVsZXRlICsgIl0iCi0gICAgICAgICAgICAgICAgKyBzdXBlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OQXJyYXkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjOTBjZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vSlNPTkFycmF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgSlNPTiBhcnJheS4gSlNPTk9iamVjdCBzdXBwb3J0cyBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuCi0gKiAKLSAqIChUYWtlbiBmcm9tIEpTT04uc2ltcGxlIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPiBhbmQgbW9kaWZpZWQKLSAqIGZvciBPcGVuQ01JUy4pCi0gKiAKLSAqIEBhdXRob3IgRmFuZ1lpZG9uZzxmYW5neWlkb25nQHlhaG9vLmNvbS5jbj4KLSAqLwotcHVibGljIGNsYXNzIEpTT05BcnJheSBleHRlbmRzIEFycmF5TGlzdDxPYmplY3Q+IGltcGxlbWVudHMgTGlzdDxPYmplY3Q+LCBKU09OQXdhcmUsIEpTT05TdHJlYW1Bd2FyZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzk1Nzk4ODMwMzY3NTIzMTk4MUw7Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGUgYSBsaXN0IGludG8gSlNPTiB0ZXh0IGFuZCB3cml0ZSBpdCB0byBvdXQuIElmIHRoaXMgbGlzdCBpcyBhbHNvIGEKLSAgICAgKiBKU09OU3RyZWFtQXdhcmUgb3IgYSBKU09OQXdhcmUsIEpTT05TdHJlYW1Bd2FyZSBhbmQgSlNPTkF3YXJlIHNwZWNpZmljCi0gICAgICogYmVoYXZpb3VycyB3aWxsIGJlIGlnbm9yZWQgYXQgdGhpcyB0b3AgbGV2ZWwuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlI3dyaXRlSlNPTlN0cmluZyhPYmplY3QsIFdyaXRlcikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVKU09OU3RyaW5nKExpc3Q8T2JqZWN0PiBsaXN0LCBXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIm51bGwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCi0gICAgICAgIG91dC53cml0ZSgnWycpOwotICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IGxpc3QpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSgnLCcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSgibnVsbCIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBKU09OVmFsdWUud3JpdGVKU09OU3RyaW5nKHZhbHVlLCBvdXQpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZSgnXScpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSlNPTlN0cmluZyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZUpTT05TdHJpbmcodGhpcywgb3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgbGlzdCB0byBKU09OIHRleHQuIFRoZSByZXN1bHQgaXMgYSBKU09OIGFycmF5LiBJZiB0aGlzIGxpc3QgaXMKLSAgICAgKiBhbHNvIGEgSlNPTkF3YXJlLCBKU09OQXdhcmUgc3BlY2lmaWMgYmVoYXZpb3VycyB3aWxsIGJlIG9taXR0ZWQgYXQgdGhpcwotICAgICAqIHRvcCBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWUjdG9KU09OU3RyaW5nKE9iamVjdCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqIEByZXR1cm4gSlNPTiB0ZXh0LCBvciAibnVsbCIgaWYgbGlzdCBpcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSlNPTlN0cmluZyhMaXN0PE9iamVjdD4gbGlzdCkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IGxpc3QpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKEpTT05WYWx1ZS50b0pTT05TdHJpbmcodmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b0pTT05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0b0pTT05TdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHRvSlNPTlN0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OQXdhcmUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVhNDY1NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vSlNPTkF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb247Ci0KLS8qKgotICogQmVhbnMgdGhhdCBzdXBwb3J0IGN1c3RvbWl6ZWQgb3V0cHV0IG9mIEpTT04gdGV4dCBzaGFsbCBpbXBsZW1lbnQgdGhpcwotICogaW50ZXJmYWNlLgotICogCi0gKiAoVGFrZW4gZnJvbSBKU09OLnNpbXBsZSA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2ltcGxlLz4gYW5kIG1vZGlmaWVkCi0gKiBmb3IgT3BlbkNNSVMuKQotICogCi0gKiBAYXV0aG9yIEZhbmdZaWRvbmc8ZmFuZ3lpZG9uZ0B5YWhvby5jb20uY24+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNPTkF3YXJlIHsKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEpTT04gdGV4dAotICAgICAqLwotICAgIFN0cmluZyB0b0pTT05TdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OT2JqZWN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vSlNPTk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNjZGVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgSlNPTiBvYmplY3QuIEtleSB2YWx1ZSBwYWlycyBhcmUgb3JkZXIgYnkgaW5zZXJ0aW9uLiBKU09OT2JqZWN0IHN1cHBvcnRzCi0gKiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4KLSAqIAotICogKFRha2VuIGZyb20gSlNPTi5zaW1wbGUgPGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc29uLXNpbXBsZS8+IGFuZCBtb2RpZmllZAotICogZm9yIE9wZW5DTUlTLikKLSAqIAotICogQGF1dGhvciBGYW5nWWlkb25nPGZhbmd5aWRvbmdAeWFob28uY29tLmNuPgotICovCi1wdWJsaWMgY2xhc3MgSlNPTk9iamVjdCBleHRlbmRzIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGltcGxlbWVudHMgTWFwPFN0cmluZywgT2JqZWN0PiwgSlNPTkF3YXJlLCBKU09OU3RyZWFtQXdhcmUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiSlNPTiBrZXkgbXVzdCBub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlIGEgbWFwIGludG8gSlNPTiB0ZXh0IGFuZCB3cml0ZSBpdCB0byBvdXQuIElmIHRoaXMgbWFwIGlzIGFsc28gYQotICAgICAqIEpTT05Bd2FyZSBvciBKU09OU3RyZWFtQXdhcmUsIEpTT05Bd2FyZSBvciBKU09OU3RyZWFtQXdhcmUgc3BlY2lmaWMKLSAgICAgKiBiZWhhdmlvdXJzIHdpbGwgYmUgaWdub3JlZCBhdCB0aGlzIHRvcCBsZXZlbC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWUjd3JpdGVKU09OU3RyaW5nKE9iamVjdCwgV3JpdGVyKQotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlSlNPTlN0cmluZyhNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIm51bGwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCi0gICAgICAgIG91dC53cml0ZSgneycpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCcsJyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC53cml0ZSgnXCInKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCJudWxsIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC53cml0ZShlc2NhcGUoZW50cnkuZ2V0S2V5KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC53cml0ZSgnXCInKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgnOicpOwotICAgICAgICAgICAgSlNPTlZhbHVlLndyaXRlSlNPTlN0cmluZyhlbnRyeS5nZXRWYWx1ZSgpLCBvdXQpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZSgnfScpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSlNPTlN0cmluZyhXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZUpTT05TdHJpbmcodGhpcywgb3V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgbWFwIHRvIEpTT04gdGV4dC4gVGhlIHJlc3VsdCBpcyBhIEpTT04gb2JqZWN0LiBJZiB0aGlzIG1hcCBpcwotICAgICAqIGFsc28gYSBKU09OQXdhcmUsIEpTT05Bd2FyZSBzcGVjaWZpYyBiZWhhdmlvdXJzIHdpbGwgYmUgb21pdHRlZCBhdCB0aGlzCi0gICAgICogdG9wIGxldmVsLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZSN0b0pTT05TdHJpbmcoT2JqZWN0KQotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKiBAcmV0dXJuIEpTT04gdGV4dCwgb3IgIm51bGwiIGlmIG1hcCBpcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSlNPTlN0cmluZyhNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCd7Jyk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG9KU09OU3RyaW5nKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCBzYik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKCd9Jyk7Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b0pTT05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0b0pTT05TdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvSlNPTlN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLSAgICAgICAgc2IuYXBwZW5kKCdcIicpOwotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSlNPTlZhbHVlLmVzY2FwZShrZXksIHNiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCgnXCInKS5hcHBlbmQoJzonKTsKLQotICAgICAgICBzYi5hcHBlbmQoSlNPTlZhbHVlLnRvSlNPTlN0cmluZyh2YWx1ZSkpOwotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0b0pTT05TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHRvSlNPTlN0cmluZyhrZXksIHZhbHVlLCBzYik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZSBxdW90ZXMsIFwsIC8sIFxyLCBcbiwgXGIsIFxmLCBcdCBhbmQgb3RoZXIgY29udHJvbCBjaGFyYWN0ZXJzCi0gICAgICogKFUrMDAwMCB0aHJvdWdoIFUrMDAxRikuIEl0J3MgdGhlIHNhbWUgYXMgSlNPTlZhbHVlLmVzY2FwZSgpIG9ubHkgZm9yCi0gICAgICogY29tcGF0aWJpbGl0eSBoZXJlLgotICAgICAqIAotICAgICAqIEBzZWUgSlNPTlZhbHVlI2VzY2FwZShTdHJpbmcpCi0gICAgICogCi0gICAgICogQHBhcmFtIHMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBKU09OVmFsdWUuZXNjYXBlKHMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OU3RyZWFtQXdhcmUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OU3RyZWFtQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyYzllMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vSlNPTlN0cmVhbUF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotCi0vKioKLSAqIEJlYW5zIHRoYXQgc3VwcG9ydCBjdXN0b21pemVkIG91dHB1dCBvZiBKU09OIHRleHQgdG8gYSB3cml0ZXIgc2hhbGwgaW1wbGVtZW50Ci0gKiB0aGlzIGludGVyZmFjZS4KLSAqIAotICogKFRha2VuIGZyb20gSlNPTi5zaW1wbGUgPGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc29uLXNpbXBsZS8+IGFuZCBtb2RpZmllZAotICogZm9yIE9wZW5DTUlTLikKLSAqIAotICogQGF1dGhvciBGYW5nWWlkb25nPGZhbmd5aWRvbmdAeWFob28uY29tLmNuPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTT05TdHJlYW1Bd2FyZSB7Ci0gICAgLyoqCi0gICAgICogd3JpdGUgSlNPTiBzdHJpbmcgdG8gb3V0LgotICAgICAqLwotICAgIHZvaWQgd3JpdGVKU09OU3RyaW5nKFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OVmFsdWUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9KU09OVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNThmNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vSlNPTlZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyLkpTT05QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5wYXJzZXIuSlNPTlBhcnNlcjsKLQotLyoqCi0gKiAoVGFrZW4gZnJvbSBKU09OLnNpbXBsZSA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2ltcGxlLz4gYW5kIG1vZGlmaWVkCi0gKiBmb3IgT3BlbkNNSVMuKQotICogCi0gKiBAYXV0aG9yIEZhbmdZaWRvbmc8ZmFuZ3lpZG9uZ0B5YWhvby5jb20uY24+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKU09OVmFsdWUgewotCi0gICAgcHJpdmF0ZSBKU09OVmFsdWUoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgSlNPTiB0ZXh0IGludG8gamF2YSBvYmplY3QgZnJvbSB0aGUgaW5wdXQgc291cmNlLiBQbGVhc2UgdXNlCi0gICAgICogcGFyc2VXaXRoRXhjZXB0aW9uKCkgaWYgeW91IGRvbid0IHdhbnQgdG8gaWdub3JlIHRoZSBleGNlcHRpb24uCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuanNvbi5zaW1wbGUucGFyc2VyLkpTT05QYXJzZXIjcGFyc2UoUmVhZGVyKQotICAgICAqIEBzZWUgI3BhcnNlV2l0aEV4Y2VwdGlvbihSZWFkZXIpCi0gICAgICogCi0gICAgICogQHBhcmFtIGluCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgZm9sbG93aW5nOiBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdCwKLSAgICAgKiAgICAgICAgIG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXksIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5OdW1iZXIsCi0gICAgICogICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbiwgbnVsbAotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFJlYWRlciBpbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSlNPTlBhcnNlciBwYXJzZXIgPSBuZXcgSlNPTlBhcnNlcigpOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFN0cmluZyBzKSB7Ci0gICAgICAgIFN0cmluZ1JlYWRlciBpbiA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0gICAgICAgIHJldHVybiBwYXJzZShpbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgSlNPTiB0ZXh0IGludG8gamF2YSBvYmplY3QgZnJvbSB0aGUgaW5wdXQgc291cmNlLgotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmpzb24uc2ltcGxlLnBhcnNlci5KU09OUGFyc2VyCi0gICAgICogCi0gICAgICogQHBhcmFtIGluCi0gICAgICogQHJldHVybiBJbnN0YW5jZSBvZiB0aGUgZm9sbG93aW5nOiBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdCwKLSAgICAgKiAgICAgICAgIG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXksIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5OdW1iZXIsCi0gICAgICogICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbiwgbnVsbAotICAgICAqIAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlV2l0aEV4Y2VwdGlvbihSZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgSlNPTlBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgSlNPTlBhcnNlciBwYXJzZXIgPSBuZXcgSlNPTlBhcnNlcigpOwotICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBwYXJzZVdpdGhFeGNlcHRpb24oU3RyaW5nIHMpIHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24gewotICAgICAgICBKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7Ci0gICAgICAgIHJldHVybiBwYXJzZXIucGFyc2Uocyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlIGFuIG9iamVjdCBpbnRvIEpTT04gdGV4dCBhbmQgd3JpdGUgaXQgdG8gb3V0LgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgb2JqZWN0IGlzIGEgTWFwIG9yIGEgTGlzdCwgYW5kIGl0J3MgYWxzbyBhIEpTT05TdHJlYW1Bd2FyZSBvciBhCi0gICAgICogSlNPTkF3YXJlLCBKU09OU3RyZWFtQXdhcmUgb3IgSlNPTkF3YXJlIHdpbGwgYmUgY29uc2lkZXJlZCBmaXJzdGx5LgotICAgICAqIDxwPgotICAgICAqIERPIE5PVCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gd3JpdGVKU09OU3RyaW5nKFdyaXRlcikgb2YgYSBjbGFzcyB0aGF0Ci0gICAgICogaW1wbGVtZW50cyBib3RoIEpTT05TdHJlYW1Bd2FyZSBhbmQgKE1hcCBvciBMaXN0KSB3aXRoICJ0aGlzIiBhcyB0aGUKLSAgICAgKiBmaXJzdCBwYXJhbWV0ZXIsIHVzZSBKU09OT2JqZWN0LndyaXRlSlNPTlN0cmluZyhNYXAsIFdyaXRlcikgb3IKLSAgICAgKiBKU09OQXJyYXkud3JpdGVKU09OU3RyaW5nKExpc3QsIFdyaXRlcikgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0I3dyaXRlSlNPTlN0cmluZyhNYXAsIFdyaXRlcikKLSAgICAgKiBAc2VlIG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXkjd3JpdGVKU09OU3RyaW5nKExpc3QsIFdyaXRlcikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlSlNPTlN0cmluZyhPYmplY3QgdmFsdWUsIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIm51bGwiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgb3V0LndyaXRlKCdcIicpOwotICAgICAgICAgICAgb3V0LndyaXRlKGVzY2FwZSgoU3RyaW5nKSB2YWx1ZSkpOwotICAgICAgICAgICAgb3V0LndyaXRlKCdcIicpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICBpZiAoKChEb3VibGUpIHZhbHVlKS5pc0luZmluaXRlKCkgfHwgKChEb3VibGUpIHZhbHVlKS5pc05hTigpKSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCJudWxsIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSh2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0gICAgICAgICAgICBpZiAoKChGbG9hdCkgdmFsdWUpLmlzSW5maW5pdGUoKSB8fCAoKEZsb2F0KSB2YWx1ZSkuaXNOYU4oKSkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSgibnVsbCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoKChCaWdEZWNpbWFsKSB2YWx1ZSkudG9QbGFpblN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgb3V0LndyaXRlKHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgb3V0LndyaXRlKHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSlNPTlN0cmVhbUF3YXJlKSB7Ci0gICAgICAgICAgICAoKEpTT05TdHJlYW1Bd2FyZSkgdmFsdWUpLndyaXRlSlNPTlN0cmluZyhvdXQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSlNPTkF3YXJlKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoKChKU09OQXdhcmUpIHZhbHVlKS50b0pTT05TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgIEpTT05PYmplY3Qud3JpdGVKU09OU3RyaW5nKChNYXA8U3RyaW5nLCBPYmplY3Q+KSB2YWx1ZSwgb3V0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIEpTT05BcnJheS53cml0ZUpTT05TdHJpbmcoKExpc3Q8T2JqZWN0PikgdmFsdWUsIG91dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQud3JpdGUodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhbiBvYmplY3QgdG8gSlNPTiB0ZXh0LgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgb2JqZWN0IGlzIGEgTWFwIG9yIGEgTGlzdCwgYW5kIGl0J3MgYWxzbyBhIEpTT05Bd2FyZSwgSlNPTkF3YXJlCi0gICAgICogd2lsbCBiZSBjb25zaWRlcmVkIGZpcnN0bHkuCi0gICAgICogPHA+Ci0gICAgICogRE8gTk9UIGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0b0pTT05TdHJpbmcoKSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cwotICAgICAqIGJvdGggSlNPTkF3YXJlIGFuZCBNYXAgb3IgTGlzdCB3aXRoICJ0aGlzIiBhcyB0aGUgcGFyYW1ldGVyLCB1c2UKLSAgICAgKiBKU09OT2JqZWN0LnRvSlNPTlN0cmluZyhNYXApIG9yIEpTT05BcnJheS50b0pTT05TdHJpbmcoTGlzdCkgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0I3RvSlNPTlN0cmluZyhNYXApCi0gICAgICogQHNlZSBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5I3RvSlNPTlN0cmluZyhMaXN0KQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gSlNPTiB0ZXh0LCBvciAibnVsbCIgaWYgdmFsdWUgaXMgbnVsbCBvciBpdCdzIGFuIE5hTiBvciBhbiBJTkYKLSAgICAgKiAgICAgICAgIG51bWJlci4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0pTT05TdHJpbmcoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlwiIiArIGVzY2FwZSgoU3RyaW5nKSB2YWx1ZSkgKyAiXCIiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICAgICAgICBpZiAoKChEb3VibGUpIHZhbHVlKS5pc0luZmluaXRlKCkgfHwgKChEb3VibGUpIHZhbHVlKS5pc05hTigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgewotICAgICAgICAgICAgaWYgKCgoRmxvYXQpIHZhbHVlKS5pc0luZmluaXRlKCkgfHwgKChGbG9hdCkgdmFsdWUpLmlzTmFOKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ0RlY2ltYWwpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJpZ0RlY2ltYWwpIHZhbHVlKS50b1BsYWluU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBKU09OQXdhcmUpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEpTT05Bd2FyZSkgdmFsdWUpLnRvSlNPTlN0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gSlNPTk9iamVjdC50b0pTT05TdHJpbmcoKE1hcDxTdHJpbmcsIE9iamVjdD4pIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBKU09OQXJyYXkudG9KU09OU3RyaW5nKChMaXN0PE9iamVjdD4pIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZSBxdW90ZXMsIFwsIC8sIFxyLCBcbiwgXGIsIFxmLCBcdCBhbmQgb3RoZXIgY29udHJvbCBjaGFyYWN0ZXJzCi0gICAgICogKFUrMDAwMCB0aHJvdWdoIFUrMDAxRikuCi0gICAgICogCi0gICAgICogQHBhcmFtIHMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGVzY2FwZShzLCBzYik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICAtIE11c3Qgbm90IGJlIG51bGwuCi0gICAgICogQHBhcmFtIHNiCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgZXNjYXBlKFN0cmluZyBzLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gcy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFxmIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcciIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICcvJzoKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcLyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2U6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTUuMS4wLwotICAgICAgICAgICAgICAgIGlmICgoY2ggPj0gJ1x1MDAwMCcgJiYgY2ggPD0gJ1x1MDAxRicpIHx8IChjaCA+PSAnXHUwMDdGJyAmJiBjaCA8PSAnXHUwMDlGJykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCA+PSAnXHUyMDAwJyAmJiBjaCA8PSAnXHUyMEZGJykpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNzID0gSW50ZWdlci50b0hleFN0cmluZyhjaCk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFx1Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNCAtIHNzLmxlbmd0aCgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnMCcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzcy50b1VwcGVyQ2FzZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS8vIGZvcgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9wYXJzZXIvQ29udGFpbmVyRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9Db250YWluZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjkwM2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9Db250YWluZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBDb250YWluZXIgZmFjdG9yeSBmb3IgY3JlYXRpbmcgY29udGFpbmVycyBmb3IgSlNPTiBvYmplY3QgYW5kIEpTT04gYXJyYXkuCi0gKiAKLSAqIChUYWtlbiBmcm9tIEpTT04uc2ltcGxlIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPiBhbmQgbW9kaWZpZWQKLSAqIGZvciBPcGVuQ01JUy4pCi0gKiAKLSAqIEBzZWUgSlNPTlBhcnNlciNwYXJzZShqYXZhLmlvLlJlYWRlciwgQ29udGFpbmVyRmFjdG9yeSkKLSAqIAotICogQGF1dGhvciBGYW5nWWlkb25nPGZhbmd5aWRvbmdAeWFob28uY29tLmNuPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRhaW5lckZhY3RvcnkgewotICAgIC8qKgotICAgICAqIEByZXR1cm4gQSBNYXAgaW5zdGFuY2UgdG8gc3RvcmUgSlNPTiBvYmplY3QsIG9yIG51bGwgaWYgeW91IHdhbnQgdG8gdXNlCi0gICAgICogICAgICAgICBKU09OT2JqZWN0LgotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY3JlYXRlT2JqZWN0Q29udGFpbmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIEEgTGlzdCBpbnN0YW5jZSB0byBzdG9yZSBKU09OIGFycmF5LCBvciBudWxsIGlmIHlvdSB3YW50IHRvIHVzZQotICAgICAqICAgICAgICAgSlNPTkFycmF5LgotICAgICAqLwotICAgIExpc3Q8T2JqZWN0PiBjcmVhdEFycmF5Q29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vcGFyc2VyL0NvbnRlbnRIYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vcGFyc2VyL0NvbnRlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzN2M2NTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9Db250ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgc2ltcGxpZmllZCBhbmQgc3RvcHBhYmxlIFNBWC1saWtlIGNvbnRlbnQgaGFuZGxlciBmb3Igc3RyZWFtIHByb2Nlc3Npbmcgb2YKLSAqIEpTT04gdGV4dC4KLSAqIAotICogKFRha2VuIGZyb20gSlNPTi5zaW1wbGUgPGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc29uLXNpbXBsZS8+IGFuZCBtb2RpZmllZAotICogZm9yIE9wZW5DTUlTLikKLSAqIAotICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcgotICogQHNlZSBKU09OUGFyc2VyI3BhcnNlKGphdmEuaW8uUmVhZGVyLCBDb250ZW50SGFuZGxlciwgYm9vbGVhbikKLSAqIAotICogQGF1dGhvciBGYW5nWWlkb25nPGZhbmd5aWRvbmdAeWFob28uY29tLmNuPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRIYW5kbGVyIHsKLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIEpTT04gcHJvY2Vzc2luZy4gVGhlIHBhcnNlciB3aWxsCi0gICAgICogaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIC0gSlNPTlBhcnNlciB3aWxsIHN0b3AgYW5kIHRocm93IHRoZSBzYW1lIGV4Y2VwdGlvbiB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICBjYWxsZXIgd2hlbiByZWNlaXZpbmcgdGhpcyBleGNlcHRpb24uCi0gICAgICovCi0gICAgdm9pZCBzdGFydEpTT04oKSB0aHJvd3MgSlNPTlBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgSlNPTiBwcm9jZXNzaW5nLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSlNPTlBhcnNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgdm9pZCBlbmRKU09OKCkgdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIGEgSlNPTiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgaGFuZGxlciB3YW50cyB0byBzdG9wIHBhcnNpbmcgYWZ0ZXIgcmV0dXJuLgotICAgICAqIEB0aHJvd3MgSlNPTlBhcnNlRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgLSBKU09OUGFyc2VyIHdpbGwgc3RvcCBhbmQgdGhyb3cgdGhlIHNhbWUgZXhjZXB0aW9uIHRvIHRoZQotICAgICAqICAgICAgICAgICAgIGNhbGxlciB3aGVuIHJlY2VpdmluZyB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKiBAc2VlICNlbmRKU09OCi0gICAgICovCi0gICAgYm9vbGVhbiBzdGFydE9iamVjdCgpIHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiBhIEpTT04gb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGhhbmRsZXIgd2FudHMgdG8gc3RvcCBwYXJzaW5nIGFmdGVyIHJldHVybi4KLSAgICAgKiBAdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIEBzZWUgI3N0YXJ0T2JqZWN0Ci0gICAgICovCi0gICAgYm9vbGVhbiBlbmRPYmplY3QoKSB0aHJvd3MgSlNPTlBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgYSBKU09OIG9iamVjdCBlbnRyeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogICAgICAgICAgICAtIEtleSBvZiBhIEpTT04gb2JqZWN0IGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGhhbmRsZXIgd2FudHMgdG8gc3RvcCBwYXJzaW5nIGFmdGVyIHJldHVybi4KLSAgICAgKiBAdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIEBzZWUgI2VuZE9iamVjdEVudHJ5Ci0gICAgICovCi0gICAgYm9vbGVhbiBzdGFydE9iamVjdEVudHJ5KFN0cmluZyBrZXkpIHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgdmFsdWUgb2YgcHJldmlvdXMgb2JqZWN0IGVudHJ5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGhhbmRsZXIgd2FudHMgdG8gc3RvcCBwYXJzaW5nIGFmdGVyIHJldHVybi4KLSAgICAgKiBAdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIEBzZWUgI3N0YXJ0T2JqZWN0RW50cnkKLSAgICAgKi8KLSAgICBib29sZWFuIGVuZE9iamVjdEVudHJ5KCkgdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIGEgSlNPTiBhcnJheS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBoYW5kbGVyIHdhbnRzIHRvIHN0b3AgcGFyc2luZyBhZnRlciByZXR1cm4uCi0gICAgICogQHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24KLSAgICAgKiAKLSAgICAgKiBAc2VlICNlbmRBcnJheQotICAgICAqLwotICAgIGJvb2xlYW4gc3RhcnRBcnJheSgpIHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiBhIEpTT04gYXJyYXkuCi0gICAgICogCi0gICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgaGFuZGxlciB3YW50cyB0byBzdG9wIHBhcnNpbmcgYWZ0ZXIgcmV0dXJuLgotICAgICAqIEB0aHJvd3MgSlNPTlBhcnNlRXhjZXB0aW9uCi0gICAgICogCi0gICAgICogQHNlZSAjc3RhcnRBcnJheQotICAgICAqLwotICAgIGJvb2xlYW4gZW5kQXJyYXkoKSB0aHJvd3MgSlNPTlBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBKU09OIHByaW1pdGl2ZSB2YWx1ZXM6IGphdmEubGFuZy5TdHJpbmcsCi0gICAgICogamF2YS5sYW5nLk51bWJlciwgamF2YS5sYW5nLkJvb2xlYW4gbnVsbAotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqICAgICAgICAgICAgLSBJbnN0YW5jZSBvZiB0aGUgZm9sbG93aW5nOiBqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgICAgICAgamF2YS5sYW5nLk51bWJlciwgamF2YS5sYW5nLkJvb2xlYW4gbnVsbAotICAgICAqIAotICAgICAqIEByZXR1cm4gZmFsc2UgaWYgdGhlIGhhbmRsZXIgd2FudHMgdG8gc3RvcCBwYXJzaW5nIGFmdGVyIHJldHVybi4KLSAgICAgKiBAdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIGJvb2xlYW4gcHJpbWl0aXZlKE9iamVjdCB2YWx1ZSkgdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vcGFyc2VyL0pTT05QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9KU09OUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwNjdkMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vcGFyc2VyL0pTT05QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5wYXJzZXI7Ci0KLS8qKgotICogUGFyc2VFeGNlcHRpb24gZXhwbGFpbnMgd2h5IGFuZCB3aGVyZSB0aGUgZXJyb3Igb2NjdXJzIGluIHNvdXJjZSBKU09OIHRleHQuCi0gKiAKLSAqIChUYWtlbiBmcm9tIEpTT04uc2ltcGxlIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPiBhbmQgbW9kaWZpZWQKLSAqIGZvciBPcGVuQ01JUy4pCi0gKiAKLSAqIEBhdXRob3IgRmFuZ1lpZG9uZzxmYW5neWlkb25nQHlhaG9vLmNvbS5jbj4KLSAqLwotcHVibGljIGNsYXNzIEpTT05QYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc4ODA2OTg5NjgxODc3Mjg1NDhMOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5FWFBFQ1RFRF9DSEFSID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTkVYUEVDVEVEX1RPS0VOID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiA9IDI7Ci0KLSAgICBwcml2YXRlIGludCBlcnJvclR5cGU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdW5leHBlY3RlZE9iamVjdDsKLSAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKLQotICAgIHB1YmxpYyBKU09OUGFyc2VFeGNlcHRpb24oaW50IGVycm9yVHlwZSkgewotICAgICAgICB0aGlzKC0xLCBlcnJvclR5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBKU09OUGFyc2VFeGNlcHRpb24oaW50IGVycm9yVHlwZSwgT2JqZWN0IHVuZXhwZWN0ZWRPYmplY3QpIHsKLSAgICAgICAgdGhpcygtMSwgZXJyb3JUeXBlLCB1bmV4cGVjdGVkT2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlNPTlBhcnNlRXhjZXB0aW9uKGludCBwb3NpdGlvbiwgaW50IGVycm9yVHlwZSwgT2JqZWN0IHVuZXhwZWN0ZWRPYmplY3QpIHsKLSAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgICAgICB0aGlzLmVycm9yVHlwZSA9IGVycm9yVHlwZTsKLSAgICAgICAgdGhpcy51bmV4cGVjdGVkT2JqZWN0ID0gdW5leHBlY3RlZE9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEVycm9yVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGVycm9yVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclR5cGUoaW50IGVycm9yVHlwZSkgewotICAgICAgICB0aGlzLmVycm9yVHlwZSA9IGVycm9yVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5qc29uLnNpbXBsZS5wYXJzZXIuSlNPTlBhcnNlciNnZXRQb3NpdGlvbigpCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgY2hhcmFjdGVyIHBvc2l0aW9uIChzdGFydGluZyB3aXRoIDApIG9mIHRoZSBpbnB1dCB3aGVyZSB0aGUKLSAgICAgKiAgICAgICAgIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewotICAgICAgICByZXR1cm4gcG9zaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5qc29uLnNpbXBsZS5wYXJzZXIuWXl0b2tlbgotICAgICAqIAotICAgICAqIEByZXR1cm4gT25lIG9mIHRoZSBmb2xsb3dpbmcgYmFzZSBvbiB0aGUgdmFsdWUgb2YgZXJyb3JUeXBlOgotICAgICAqICAgICAgICAgRVJST1JfVU5FWFBFQ1RFRF9DSEFSIGphdmEubGFuZy5DaGFyYWN0ZXIgRVJST1JfVU5FWFBFQ1RFRF9UT0tFTgotICAgICAqICAgICAgICAgb3JnLmpzb24uc2ltcGxlLnBhcnNlci5ZeXRva2VuIEVSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OCi0gICAgICogICAgICAgICBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRVbmV4cGVjdGVkT2JqZWN0KCkgewotICAgICAgICByZXR1cm4gdW5leHBlY3RlZE9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVbmV4cGVjdGVkT2JqZWN0KE9iamVjdCB1bmV4cGVjdGVkT2JqZWN0KSB7Ci0gICAgICAgIHRoaXMudW5leHBlY3RlZE9iamVjdCA9IHVuZXhwZWN0ZWRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgc3dpdGNoIChlcnJvclR5cGUpIHsKLSAgICAgICAgY2FzZSBFUlJPUl9VTkVYUEVDVEVEX0NIQVI6Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICgiKS5hcHBlbmQodW5leHBlY3RlZE9iamVjdCkuYXBwZW5kKCIpIGF0IHBvc2l0aW9uICIpLmFwcGVuZChwb3NpdGlvbikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnLicpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVJST1JfVU5FWFBFQ1RFRF9UT0tFTjoKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiVW5leHBlY3RlZCB0b2tlbiAiKS5hcHBlbmQodW5leHBlY3RlZE9iamVjdCkuYXBwZW5kKCIgYXQgcG9zaXRpb24gIikuYXBwZW5kKHBvc2l0aW9uKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcuJyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTjoKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiVW5leHBlY3RlZCBleGNlcHRpb24gYXQgcG9zaXRpb24gIikuYXBwZW5kKHBvc2l0aW9uKS5hcHBlbmQoIjogIikuYXBwZW5kKHVuZXhwZWN0ZWRPYmplY3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlVua293biBlcnJvciBhdCBwb3NpdGlvbiAiKS5hcHBlbmQocG9zaXRpb24pLmFwcGVuZCgnLicpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9KU09OUGFyc2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vcGFyc2VyL0pTT05QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzODJkMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vcGFyc2VyL0pTT05QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKLWltcG9ydCBqYXZhLnV0aWwuRGVxdWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05BcnJheTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OT2JqZWN0OwotCi0vKioKLSAqIFBhcnNlciBmb3IgSlNPTiB0ZXh0LiBQbGVhc2Ugbm90ZSB0aGF0IEpTT05QYXJzZXIgaXMgTk9UIHRocmVhZC1zYWZlLgotICogCi0gKiAoVGFrZW4gZnJvbSBKU09OLnNpbXBsZSA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2ltcGxlLz4gYW5kIG1vZGlmaWVkCi0gKiBmb3IgT3BlbkNNSVMuKQotICogCi0gKiBAYXV0aG9yIEZhbmdZaWRvbmc8ZmFuZ3lpZG9uZ0B5YWhvby5jb20uY24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU09OUGFyc2VyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lOSVQgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSU5fRklOSVNIRURfVkFMVUUgPSAxOyAvLyBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVsbCwgb2JqZWN0LCBhcnJheQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSU5fT0JKRUNUID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lOX0FSUkFZID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX1BBU1NFRF9QQUlSX0tFWSA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JTl9QQUlSX1ZBTFVFID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0VORCA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JTl9FUlJPUiA9IC0xOwotCi0gICAgcHJpdmF0ZSBBcnJheURlcXVlPEludGVnZXI+IGhhbmRsZXJTdGF0dXNTdGFjazsKLSAgICBwcml2YXRlIFl5bGV4IGxleGVyID0gbmV3IFl5bGV4KChSZWFkZXIpIG51bGwpOwotICAgIHByaXZhdGUgWXl0b2tlbiB0b2tlbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdHVzID0gU19JTklUOwotCi0gICAgcHJpdmF0ZSBpbnQgcGVla1N0YXR1cyhEZXF1ZTxJbnRlZ2VyPiBzdGF0dXNTdGFjaykgewotICAgICAgICBpZiAoc3RhdHVzU3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzU3RhY2suZ2V0Rmlyc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCB0aGUgcGFyc2VyIHRvIHRoZSBpbml0aWFsIHN0YXRlIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSB1bmRlcmx5aW5nCi0gICAgICogcmVhZGVyLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB0b2tlbiA9IG51bGw7Ci0gICAgICAgIHN0YXR1cyA9IFNfSU5JVDsKLSAgICAgICAgaGFuZGxlclN0YXR1c1N0YWNrID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldCB0aGUgcGFyc2VyIHRvIHRoZSBpbml0aWFsIHN0YXRlIHdpdGggYSBuZXcgY2hhcmFjdGVyIHJlYWRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIC0gVGhlIG5ldyBjaGFyYWN0ZXIgcmVhZGVyLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciBpbikgewotICAgICAgICBsZXhlci55eXJlc2V0KGluKTsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IHRva2VuLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsZXhlci5nZXRQb3NpdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcGFyc2UoU3RyaW5nIHMpIHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcGFyc2UocywgKENvbnRhaW5lckZhY3RvcnkpIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcGFyc2UoU3RyaW5nIHMsIENvbnRhaW5lckZhY3RvcnkgY29udGFpbmVyRmFjdG9yeSkgdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1JlYWRlciBpbiA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2UoaW4sIGNvbnRhaW5lckZhY3RvcnkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFjdHVhbGx5IGl0IHdpbGwgbmV2ZXIgaGFwcGVuLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0aHJvdyBuZXcgSlNPTlBhcnNlRXhjZXB0aW9uKC0xLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04sIGllKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcGFyc2UoUmVhZGVyIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTT05QYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwYXJzZShpbiwgKENvbnRhaW5lckZhY3RvcnkpIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIEpTT04gdGV4dCBpbnRvIGphdmEgb2JqZWN0IGZyb20gdGhlIGlucHV0IHNvdXJjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAcGFyYW0gY29udGFpbmVyRmFjdG9yeQotICAgICAqICAgICAgICAgICAgLSBVc2UgdGhpcyBmYWN0b3J5IHRvIGNyZWF0ZXlvdXIgb3duIEpTT04gb2JqZWN0IGFuZCBKU09OCi0gICAgICogICAgICAgICAgICBhcnJheSBjb250YWluZXJzLgotICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgdGhlIGZvbGxvd2luZzogb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3QsCi0gICAgICogICAgICAgICBvcmcuanNvbi5zaW1wbGUuSlNPTkFycmF5LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuTnVtYmVyLAotICAgICAqICAgICAgICAgamF2YS5sYW5nLkJvb2xlYW4sIG51bGwKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgT2JqZWN0IHBhcnNlKFJlYWRlciBpbiwgQ29udGFpbmVyRmFjdG9yeSBjb250YWluZXJGYWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTT05QYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc2V0KGluKTsKLSAgICAgICAgRGVxdWU8SW50ZWdlcj4gc3RhdHVzU3RhY2sgPSBuZXcgQXJyYXlEZXF1ZTxJbnRlZ2VyPigpOwotICAgICAgICBEZXF1ZTxPYmplY3Q+IHZhbHVlU3RhY2sgPSBuZXcgQXJyYXlEZXF1ZTxPYmplY3Q+KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgICAgIGNhc2UgU19JTklUOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfVkFMVUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX0lOX0ZJTklTSEVEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2suYWRkRmlyc3QoSW50ZWdlci52YWx1ZU9mKHN0YXR1cykpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdGFjay5hZGRGaXJzdCh0b2tlbi52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfTEVGVF9CUkFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fT0JKRUNUOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2suYWRkRmlyc3QoSW50ZWdlci52YWx1ZU9mKHN0YXR1cykpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdGFjay5hZGRGaXJzdChjcmVhdGVPYmplY3RDb250YWluZXIoY29udGFpbmVyRmFjdG9yeSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWXl0b2tlbi5UWVBFX0xFRlRfU1FVQVJFOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9BUlJBWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1N0YWNrLmFkZEZpcnN0KEludGVnZXIudmFsdWVPZihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RhY2suYWRkRmlyc3QoY3JlYXRlQXJyYXlDb250YWluZXIoY29udGFpbmVyRmFjdG9yeSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX0lOX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ly8gaW5uZXIgc3dpdGNoCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTX0lOX0ZJTklTSEVEX1ZBTFVFOgotICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udHlwZSA9PSBZeXRva2VuLlRZUEVfRU9GKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTT05QYXJzZUV4Y2VwdGlvbihnZXRQb3NpdGlvbigpLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9UT0tFTiwgdG9rZW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNfSU5fT0JKRUNUOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfQ09NTUE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfVkFMVUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgdG9rZW4udmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdGFjay5hZGRGaXJzdChrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfUEFTU0VEX1BBSVJfS0VZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1N0YWNrLmFkZEZpcnN0KEludGVnZXIudmFsdWVPZihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9SSUdIVF9CUkFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVN0YWNrLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RhY2sucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwZWVrU3RhdHVzKHN0YXR1c1N0YWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9GSU5JU0hFRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ly8gaW5uZXIgc3dpdGNoCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTX1BBU1NFRF9QQUlSX0tFWToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWXl0b2tlbi5UWVBFX0NPTE9OOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWXl0b2tlbi5UWVBFX1ZBTFVFOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2sucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSB2YWx1ZVN0YWNrLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmVudCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSB2YWx1ZVN0YWNrLmdldEZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucHV0KGtleSwgdG9rZW4udmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGVla1N0YXR1cyhzdGF0dXNTdGFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfTEVGVF9TUVVBUkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gKFN0cmluZykgdmFsdWVTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHZhbHVlU3RhY2suZ2V0Rmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBuZXdBcnJheSA9IGNyZWF0ZUFycmF5Q29udGFpbmVyKGNvbnRhaW5lckZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnB1dChrZXksIG5ld0FycmF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fQVJSQVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5hZGRGaXJzdChJbnRlZ2VyLnZhbHVlT2Yoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0YWNrLmFkZEZpcnN0KG5ld0FycmF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9MRUZUX0JSQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2sucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIHZhbHVlU3RhY2sucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSB2YWx1ZVN0YWNrLmdldEZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld09iamVjdCA9IGNyZWF0ZU9iamVjdENvbnRhaW5lcihjb250YWluZXJGYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5wdXQoa2V5LCBuZXdPYmplY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9PQkpFQ1Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5hZGRGaXJzdChJbnRlZ2VyLnZhbHVlT2Yoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0YWNrLmFkZEZpcnN0KG5ld09iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNfSU5fQVJSQVk6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9DT01NQToKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9WQUxVRToKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWwgPSAoTGlzdDxPYmplY3Q+KSB2YWx1ZVN0YWNrLmdldEZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwuYWRkKHRva2VuLnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9SSUdIVF9TUVVBUkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVTdGFjay5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2sucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0YWNrLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGVla1N0YXR1cyhzdGF0dXNTdGFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fRklOSVNIRURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfTEVGVF9CUkFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IChMaXN0PE9iamVjdD4pIHZhbHVlU3RhY2suZ2V0Rmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbmV3T2JqZWN0ID0gY3JlYXRlT2JqZWN0Q29udGFpbmVyKGNvbnRhaW5lckZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmFkZChuZXdPYmplY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9PQkpFQ1Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5hZGRGaXJzdChJbnRlZ2VyLnZhbHVlT2Yoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0YWNrLmFkZEZpcnN0KG5ld09iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfTEVGVF9TUVVBUkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAoTGlzdDxPYmplY3Q+KSB2YWx1ZVN0YWNrLmdldEZpcnN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gbmV3QXJyYXkgPSBjcmVhdGVBcnJheUNvbnRhaW5lcihjb250YWluZXJGYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbC5hZGQobmV3QXJyYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9BUlJBWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1N0YWNrLmFkZEZpcnN0KEludGVnZXIudmFsdWVPZihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RhY2suYWRkRmlyc3QobmV3QXJyYXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX0lOX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ly8gaW5uZXIgc3dpdGNoCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU19JTl9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTT05QYXJzZUV4Y2VwdGlvbihnZXRQb3NpdGlvbigpLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9UT0tFTiwgdG9rZW4pOwotICAgICAgICAgICAgICAgIH0vLyBzd2l0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFNfSU5fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTT05QYXJzZUV4Y2VwdGlvbihnZXRQb3NpdGlvbigpLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9UT0tFTiwgdG9rZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHRva2VuLnR5cGUgIT0gWXl0b2tlbi5UWVBFX0VPRik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICB0aHJvdyBpZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBKU09OUGFyc2VFeGNlcHRpb24oZ2V0UG9zaXRpb24oKSwgSlNPTlBhcnNlRXhjZXB0aW9uLkVSUk9SX1VORVhQRUNURURfVE9LRU4sIHRva2VuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbmV4dFRva2VuKCkgdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0b2tlbiA9IGxleGVyLnl5bGV4KCk7Ci0gICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0b2tlbiA9IG5ldyBZeXRva2VuKFl5dG9rZW4uVFlQRV9FT0YsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGNyZWF0ZU9iamVjdENvbnRhaW5lcihDb250YWluZXJGYWN0b3J5IGNvbnRhaW5lckZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGNvbnRhaW5lckZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBjb250YWluZXJGYWN0b3J5LmNyZWF0ZU9iamVjdENvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gY3JlYXRlQXJyYXlDb250YWluZXIoQ29udGFpbmVyRmFjdG9yeSBjb250YWluZXJGYWN0b3J5KSB7Ci0gICAgICAgIGlmIChjb250YWluZXJGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE9iamVjdD4gbCA9IGNvbnRhaW5lckZhY3RvcnkuY3JlYXRBcnJheUNvbnRhaW5lcigpOwotCi0gICAgICAgIGlmIChsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgcywgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIpIHRocm93cyBKU09OUGFyc2VFeGNlcHRpb24gewotICAgICAgICBwYXJzZShzLCBjb250ZW50SGFuZGxlciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBzLCBDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgYm9vbGVhbiBpc1Jlc3VtZSkgdGhyb3dzIEpTT05QYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1JlYWRlciBpbiA9IG5ldyBTdHJpbmdSZWFkZXIocyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZShpbiwgY29udGVudEhhbmRsZXIsIGlzUmVzdW1lKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBBY3R1YWxseSBpdCB3aWxsIG5ldmVyIGhhcHBlbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdGhyb3cgbmV3IEpTT05QYXJzZUV4Y2VwdGlvbigtMSwgSlNPTlBhcnNlRXhjZXB0aW9uLkVSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OLCBpZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShSZWFkZXIgaW4sIENvbnRlbnRIYW5kbGVyIGNvbnRlbnRIYW5kbGVyKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTT05QYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHBhcnNlKGluLCBjb250ZW50SGFuZGxlciwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVhbSBwcm9jZXNzaW5nIG9mIEpTT04gdGV4dC4KLSAgICAgKiAKLSAgICAgKiBAc2VlIENvbnRlbnRIYW5kbGVyCi0gICAgICogCi0gICAgICogQHBhcmFtIGluCi0gICAgICogQHBhcmFtIGNvbnRlbnRIYW5kbGVyCi0gICAgICogQHBhcmFtIGlzUmVzdW1lCi0gICAgICogICAgICAgICAgICAtIEluZGljYXRlcyBpZiBpdCBjb250aW51ZXMgcHJldmlvdXMgcGFyc2luZyBvcGVyYXRpb24uIElmIHNldAotICAgICAqICAgICAgICAgICAgdG8gdHJ1ZSwgcmVzdW1lIHBhcnNpbmcgdGhlIG9sZCBzdHJlYW0sIGFuZCBwYXJhbWV0ZXIgJ2luJwotICAgICAqICAgICAgICAgICAgd2lsbCBiZSBpZ25vcmVkLiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lCi0gICAgICogICAgICAgICAgICBpbiB0aGlzIGluc3RhbmNlLCBpc1Jlc3VtZSB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSlNPTlBhcnNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoUmVhZGVyIGluLCBDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciwgYm9vbGVhbiBpc1Jlc3VtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgSlNPTlBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFpc1Jlc3VtZSkgewotICAgICAgICAgICAgcmVzZXQoaW4pOwotICAgICAgICAgICAgaGFuZGxlclN0YXR1c1N0YWNrID0gbmV3IEFycmF5RGVxdWU8SW50ZWdlcj4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyU3RhdHVzU3RhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlzUmVzdW1lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmVzZXQoaW4pOwotICAgICAgICAgICAgICAgIGhhbmRsZXJTdGF0dXNTdGFjayA9IG5ldyBBcnJheURlcXVlPEludGVnZXI+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheURlcXVlPEludGVnZXI+IHN0YXR1c1N0YWNrID0gaGFuZGxlclN0YXR1c1N0YWNrOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNfSU5JVDoKLSAgICAgICAgICAgICAgICAgICAgY29udGVudEhhbmRsZXIuc3RhcnRKU09OKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfVkFMVUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX0lOX0ZJTklTSEVEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2suYWRkRmlyc3QoSW50ZWdlci52YWx1ZU9mKHN0YXR1cykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50SGFuZGxlci5wcmltaXRpdmUodG9rZW4udmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWXl0b2tlbi5UWVBFX0xFRlRfQlJBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX0lOX09CSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1N0YWNrLmFkZEZpcnN0KEludGVnZXIudmFsdWVPZihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudEhhbmRsZXIuc3RhcnRPYmplY3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9MRUZUX1NRVUFSRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fQVJSQVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5hZGRGaXJzdChJbnRlZ2VyLnZhbHVlT2Yoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRIYW5kbGVyLnN0YXJ0QXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfS8vIGlubmVyIHN3aXRjaAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU19JTl9GSU5JU0hFRF9WQUxVRToKLSAgICAgICAgICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09IFl5dG9rZW4uVFlQRV9FT0YpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIYW5kbGVyLmVuZEpTT04oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfRU5EOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKU09OUGFyc2VFeGNlcHRpb24oZ2V0UG9zaXRpb24oKSwgSlNPTlBhcnNlRXhjZXB0aW9uLkVSUk9SX1VORVhQRUNURURfVE9LRU4sIHRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBTX0lOX09CSkVDVDoKLSAgICAgICAgICAgICAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9DT01NQToKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9WQUxVRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi52YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSB0b2tlbi52YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX1BBU1NFRF9QQUlSX0tFWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5hZGRGaXJzdChJbnRlZ2VyLnZhbHVlT2Yoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50SGFuZGxlci5zdGFydE9iamVjdEVudHJ5KGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9SSUdIVF9CUkFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXNTdGFjay5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2sucmVtb3ZlRmlyc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwZWVrU3RhdHVzKHN0YXR1c1N0YWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9GSU5JU0hFRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudEhhbmRsZXIuZW5kT2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfS8vIGlubmVyIHN3aXRjaAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU19QQVNTRURfUEFJUl9LRVk6Ci0gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfQ09MT046Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfVkFMVUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcGVla1N0YXR1cyhzdGF0dXNTdGFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRIYW5kbGVyLnByaW1pdGl2ZSh0b2tlbi52YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRIYW5kbGVyLmVuZE9iamVjdEVudHJ5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfTEVGVF9TUVVBUkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2suYWRkRmlyc3QoSW50ZWdlci52YWx1ZU9mKFNfSU5fUEFJUl9WQUxVRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9BUlJBWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1N0YWNrLmFkZEZpcnN0KEludGVnZXIudmFsdWVPZihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudEhhbmRsZXIuc3RhcnRBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWXl0b2tlbi5UWVBFX0xFRlRfQlJBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzU3RhY2suYWRkRmlyc3QoSW50ZWdlci52YWx1ZU9mKFNfSU5fUEFJUl9WQUxVRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9PQkpFQ1Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5hZGRGaXJzdChJbnRlZ2VyLnZhbHVlT2Yoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRIYW5kbGVyLnN0YXJ0T2JqZWN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNfSU5fUEFJUl9WQUxVRToKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU19JTl9QQUlSX1ZBTFVFIGlzIGp1c3QgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgICAgICAgKiBhbiBvYmplY3QgZW50cnksIGl0IGRvZXNuJ3QgcHJvY2Nlc3MgYW55IHRva2VuLCB0aGVyZWZvcmUKLSAgICAgICAgICAgICAgICAgICAgICogZGVsYXkgY29uc3VtaW5nIHRva2VuIHVudGlsIG5leHQgcm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwZWVrU3RhdHVzKHN0YXR1c1N0YWNrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50SGFuZGxlci5lbmRPYmplY3RFbnRyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNfSU5fQVJSQVk6Ci0gICAgICAgICAgICAgICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfQ09NTUE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfVkFMVUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRIYW5kbGVyLnByaW1pdGl2ZSh0b2tlbi52YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBZeXRva2VuLlRZUEVfUklHSFRfU1FVQVJFOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c1N0YWNrLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5yZW1vdmVGaXJzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBlZWtTdGF0dXMoc3RhdHVzU3RhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX0lOX0ZJTklTSEVEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50SGFuZGxlci5lbmRBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWXl0b2tlbi5UWVBFX0xFRlRfQlJBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTX0lOX09CSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1N0YWNrLmFkZEZpcnN0KEludGVnZXIudmFsdWVPZihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudEhhbmRsZXIuc3RhcnRPYmplY3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFl5dG9rZW4uVFlQRV9MRUZUX1NRVUFSRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNfSU5fQVJSQVk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNTdGFjay5hZGRGaXJzdChJbnRlZ2VyLnZhbHVlT2Yoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRIYW5kbGVyLnN0YXJ0QXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU19JTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfS8vIGlubmVyIHN3aXRjaAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU19FTkQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgIGNhc2UgU19JTl9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTT05QYXJzZUV4Y2VwdGlvbihnZXRQb3NpdGlvbigpLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9UT0tFTiwgdG9rZW4pOwotICAgICAgICAgICAgICAgIH0vLyBzd2l0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFNfSU5fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpTT05QYXJzZUV4Y2VwdGlvbihnZXRQb3NpdGlvbigpLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9UT0tFTiwgdG9rZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHRva2VuLnR5cGUgIT0gWXl0b2tlbi5UWVBFX0VPRik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBTX0lOX0VSUk9SOwotICAgICAgICAgICAgdGhyb3cgaWU7Ci0gICAgICAgIH0gY2F0Y2ggKEpTT05QYXJzZUV4Y2VwdGlvbiBwZSkgewotICAgICAgICAgICAgc3RhdHVzID0gU19JTl9FUlJPUjsKLSAgICAgICAgICAgIHRocm93IHBlOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBTX0lOX0VSUk9SOwotICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBTX0lOX0VSUk9SOwotICAgICAgICB0aHJvdyBuZXcgSlNPTlBhcnNlRXhjZXB0aW9uKGdldFBvc2l0aW9uKCksIEpTT05QYXJzZUV4Y2VwdGlvbi5FUlJPUl9VTkVYUEVDVEVEX1RPS0VOLCB0b2tlbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9ZeWxleC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9ZeWxleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODU5MDFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9wYXJzZXIvWXlsZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLS8qKgotICogKFRha2VuIGZyb20gSlNPTi5zaW1wbGUgPGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc29uLXNpbXBsZS8+IGFuZCBtb2RpZmllZAotICogZm9yIE9wZW5DTUlTLikKLSAqLwotY2xhc3MgWXlsZXggewotCi0gICAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAgIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDE2Mzg0OwotCi0gICAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJJTkdfQkVHSU4gPSAyOwotCi0gICAgLyoqCi0gICAgICogWlpfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICAgKiBaWl9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsIGF0IHRoZQotICAgICAqIGJlZ2lubmluZyBvZiBhIGxpbmUgbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTEVYU1RBVEVbXSA9IHsgMCwgMCwgMSwgMSB9OwotCi0gICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0NNQVBfUEFDS0VEID0gIlwxMVwwXDFcN1wxXDdcMlwwXDFcN1wyMlwwXDFcN1wxXDBcMVwxMVwxMFwwIgotICAgICAgICAgICAgKyAiXDFcNlwxXDMxXDFcMlwxXDRcMVwxMlwxMlwzXDFcMzJcNlwwXDRcMVwxXDUiICsgIlwxXDFcMjRcMFwxXDI3XDFcMTBcMVwzMFwzXDBcMVwyMlwxXDEzXDJcMVwxXDIxIgotICAgICAgICAgICAgKyAiXDFcMTRcNVwwXDFcMjNcMVwwXDFcMTVcM1wwXDFcMTZcMVwyNFwxXDE3XDFcMjAiICsgIlw1XDBcMVwyNVwxXDBcMVwyNlx1ZmY4MlwwIjsKLQotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9ICJcMlwwXDJcMVwxXDJcMVwzXDFcNFwzXDFcMVw1XDFcNiIKLSAgICAgICAgICAgICsgIlwxXDdcMVwxMFwxXDExXDFcMTJcMVwxM1wxXDE0XDFcMTVcNVwwIiArICJcMVwxNFwxXDE2XDFcMTdcMVwyMFwxXDIxXDFcMjJcMVwyM1wxXDI0IgotICAgICAgICAgICAgKyAiXDFcMFwxXDI1XDFcMFwxXDI1XDRcMFwxXDI2XDFcMjdcMlwwIiArICJcMVwzMCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFs0NV07Ci0gICAgICAgIHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgMCwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50W10gcmVzdWx0KSB7Ci0gICAgICAgIGludCBpID0gMDsgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAqLwotICAgICAgICBpbnQgaiA9IG9mZnNldDsgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICAgICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHJlc3VsdFtqKytdID0gdmFsdWU7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPSAiXDBcMFwwXDMzXDBcNjZcMFwxMjFcMFwxNTRcMFwyMDdcMFw2NlwwXDI0MiIKLSAgICAgICAgICAgICsgIlwwXDI3NVwwXDMzMFwwXDY2XDBcNjZcMFw2NlwwXDY2XDBcNjZcMFw2NiIKLSAgICAgICAgICAgICsgIlwwXDM2M1wwXHUwMTBlXDBcNjZcMFx1MDEyOVwwXHUwMTQ0XDBcdTAxNWZcMFx1MDE3YVwwXHUwMTk1IgotICAgICAgICAgICAgKyAiXDBcNjZcMFw2NlwwXDY2XDBcNjZcMFw2NlwwXDY2XDBcNjZcMFw2NiIKLSAgICAgICAgICAgICsgIlwwXHUwMWIwXDBcdTAxY2JcMFx1MDFlNlwwXHUwMWU2XDBcdTAyMDFcMFx1MDIxY1wwXHUwMjM3XDBcdTAyNTIiICsgIlwwXDY2XDBcNjZcMFx1MDI2ZFwwXHUwMjg4XDBcNjYiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50W10genpVbnBhY2tSb3dNYXAoKSB7Ci0gICAgICAgIGludFtdIHJlc3VsdCA9IG5ldyBpbnRbNDVdOwotICAgICAgICB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIDAsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludFtdIHJlc3VsdCkgewotICAgICAgICBpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLSAgICAgICAgaW50IGogPSBvZmZzZXQ7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgICAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgICAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVFJBTlNbXSA9IHsgMiwgMiwgMywgNCwgMiwgMiwgMiwgNSwgMiwgNiwgMiwgMiwgNywgOCwgMiwgOSwgMiwgMiwgMiwgMiwgMiwgMTAsIDExLCAxMiwKLSAgICAgICAgICAgIDEzLCAxNCwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE4LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gICAgICAgICAgICAxNiwgMTYsIDE2LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNCwgMTksIDIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAyMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDIzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAtMSwgLTEsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAgICAgICAgICAgIDE2LCAxNiwgMTYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAzNCwgMzUsIC0xLCAtMSwgMzQsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzNiwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzcsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDM4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAzOSwgLTEsIDM5LCAtMSwgMzksIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzksIDM5LCAtMSwgLTEsIC0xLCAtMSwgMzksIDM5LCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAzMywgLTEsIDIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDIwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMzgsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDAsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0MSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCA0MiwgLTEsIDQyLCAtMSwgNDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDIsIDQyLCAtMSwgLTEsIC0xLCAtMSwgNDIsIDQyLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgNDMsIC0xLCA0MywgLTEsIDQzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQzLCA0MywgLTEsIC0xLCAtMSwgLTEsIDQzLCA0MywgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDQ0LCAtMSwgNDQsIC0xLCA0NCwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NCwgNDQsIC0xLCAtMSwgLTEsIC0xLCA0NCwgNDQsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIH07Ci0KLSAgICAvKiBlcnJvciBjb2RlcyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAgIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7ICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAgICAgICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIgfTsKLQotICAgIC8qKgotICAgICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FUVFJJQlVURV9QQUNLRURfMCA9ICJcMlwwXDFcMTFcM1wxXDFcMTFcM1wxXDZcMTFcMlwxXDFcMTEiCi0gICAgICAgICAgICArICJcNVwwXDEwXDExXDFcMFwxXDFcMVwwXDFcMVw0XDBcMlwxMSIgKyAiXDJcMFwxXDExIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGludFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50WzQ1XTsKLSAgICAgICAgenpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCAwLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnRbXSByZXN1bHQpIHsKLSAgICAgICAgaW50IGkgPSAwOyAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICovCi0gICAgICAgIGludCBqID0gb2Zmc2V0OyAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgICAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICAgICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICAgICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2orK10gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gajsKLSAgICB9Ci0KLSAgICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICAgIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAgIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAgIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gICAgLyoqCi0gICAgICogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcyB0aGUgc291cmNlIG9mCi0gICAgICogdGhlIHl5dGV4dCgpIHN0cmluZwotICAgICAqLwotICAgIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAgIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgICAvKioKLSAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQgZnJvbQotICAgICAqIGlucHV0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gICAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAgIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAgIC8qIHVzZXIgY29kZTogKi8KLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgaW50IGdldFBvc2l0aW9uKCkgewotICAgICAgICByZXR1cm4geXljaGFyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lciBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMKLSAgICAgKiBjb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiAgICAgICAgICAgIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAgICovCi0gICAgWXlsZXgoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICAgICAgdGhpcy56elJlYWRlciA9IGluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYWNrZWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAgICogQHJldHVybiB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHp6VW5wYWNrQ01hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgICAgIGNoYXJbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICAgICAgaW50IGkgPSAwOyAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICovCi0gICAgICAgIGludCBqID0gMDsgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICAgICAgd2hpbGUgKGkgPCA5MCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBtYXBbaisrXSA9IHZhbHVlOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICAgKiAKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICAgICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgICAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpCdWZmZXIsIDAsIHp6RW5kUmVhZCAtIHp6U3RhcnRSZWFkKTsKLQotICAgICAgICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgICAgICAgIHp6RW5kUmVhZCAtPSB6elN0YXJ0UmVhZDsKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAtPSB6elN0YXJ0UmVhZDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zIC09IHp6U3RhcnRSZWFkOwotICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgICAgICBpZiAoenpDdXJyZW50UG9zID49IHp6QnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICAgICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbenpDdXJyZW50UG9zICogMl07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICAgICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgICAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwgenpCdWZmZXIubGVuZ3RoIC0genpFbmRSZWFkKTsKLQotICAgICAgICBpZiAobnVtUmVhZCA+IDApIHsKLSAgICAgICAgICAgIHp6RW5kUmVhZCArPSBudW1SZWFkOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIHVubGlrZWx5IGJ1dCBub3QgaW1wb3NzaWJsZTogcmVhZCAwIGNoYXJhY3RlcnMsIGJ1dCBub3QgYXQgZW5kIG9mCi0gICAgICAgIC8vIHN0cmVhbQotICAgICAgICBpZiAobnVtUmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICBpbnQgYyA9IHp6UmVhZGVyLnJlYWQoKTsKLSAgICAgICAgICAgIGlmIChjID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHp6QnVmZmVyW3p6RW5kUmVhZCsrXSA9IChjaGFyKSBjOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG51bVJlYWQgPCAwCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHp6QXRFT0YgPSB0cnVlOyAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgLyogaW52YWxpZGF0ZSBidWZmZXIgKi8KLQotICAgICAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLiBEb2VzIG5vdCBjbG9zZSB0aGUKLSAgICAgKiBvbGQgcmVhZGVyLgotICAgICAqIAotICAgICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSA8Yj5jYW5ub3Q8L2I+IGJlCi0gICAgICogcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4gTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8KLSAgICAgKiA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAgICAgIHp6QXRFT0YgPSBmYWxzZTsKLSAgICAgICAgenpFbmRSZWFkID0gMDsKLSAgICAgICAgenpTdGFydFJlYWQgPSAwOwotICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotICAgICAgICB6ek1hcmtlZFBvcyA9IDA7Ci0gICAgICAgIHl5Y2hhciA9IDA7Ci0gICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IHl5c3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgICAqIAotICAgICAqIEBwYXJhbSBuZXdTdGF0ZQotICAgICAqICAgICAgICAgICAgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyh6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zIC0genpTdGFydFJlYWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgbWF0Y2hlZCB0ZXh0LgotICAgICAqIAotICAgICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9zCi0gICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gQSB2YWx1ZSBmcm9tIDAgdG8KLSAgICAgKiAgICAgICAgICAgIHl5bGVuZ3RoKCktMS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgICAgICByZXR1cm4genpCdWZmZXJbenpTdGFydFJlYWQgKyBwb3NdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgICAgICByZXR1cm4genpNYXJrZWRQb3MgLSB6elN0YXJ0UmVhZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICAgKiAKLSAgICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIHl5cHVzaGJhY2soaW50KSBhbmQKLSAgICAgKiBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzCi0gICAgICogdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMKLSAgICAgKiBzZXJpb3VzbHkgd3JvbmcgKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAgICogCi0gICAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUgaW4gZXJyb3IKLSAgICAgKiBmYWxsYmFjayBydWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZXJyb3JDb2RlCi0gICAgICogICAgICAgICAgICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgICAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAgICogCi0gICAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgICAqIAotICAgICAqIEBwYXJhbSBudW1iZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLiBUaGlzIG51bWJlciBtdXN0Ci0gICAgICogICAgICAgICAgICBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgICAgIGlmIChudW1iZXIgPiB5eWxlbmd0aCgpKSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLSAgICAgICAgfQotCi0gICAgICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLCB0aGUgZW5kIG9mCi0gICAgICogaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHRva2VuCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgWXl0b2tlbiB5eWxleCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBKU09OUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpbnQgenpJbnB1dDsKLSAgICAgICAgaW50IHp6QWN0aW9uOwotCi0gICAgICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgICAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgICAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICAgICAgY2hhcltdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgICAgICBjaGFyW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLSAgICAgICAgaW50W10genpUcmFuc0wgPSBaWl9UUkFOUzsKLSAgICAgICAgaW50W10genpSb3dNYXBMID0gWlpfUk9XTUFQOwotICAgICAgICBpbnRbXSB6ekF0dHJMID0gWlpfQVRUUklCVVRFOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgICAgICAgeXljaGFyICs9IHp6TWFya2VkUG9zTCAtIHp6U3RhcnRSZWFkOwotCi0gICAgICAgICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgenpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZV07Ci0KLSAgICAgICAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgenpDdXJyZW50UG9zID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMW3p6Um93TWFwTFt6elN0YXRlXSArIHp6Q01hcExbenpJbnB1dF1dOwotICAgICAgICAgICAgICAgICAgICBpZiAoenpOZXh0ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB6elN0YXRlID0genpOZXh0OwotCi0gICAgICAgICAgICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHp6QXR0cmlidXRlcyAmIDEpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHp6QXR0cmlidXRlcyAmIDgpID09IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgICAgICBjYXNlIDExOiB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHl5dGV4dCgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IHsKLSAgICAgICAgICAgICAgICBzYi5kZWxldGUoMCwgc2IubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIHl5YmVnaW4oU1RSSU5HX0JFR0lOKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcYicpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjogewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWXl0b2tlbihZeXRva2VuLlRZUEVfUklHSFRfQlJBQ0UsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjM6IHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIHZhbCA9IEJvb2xlYW4udmFsdWVPZih5eXRleHQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBZeXRva2VuKFl5dG9rZW4uVFlQRV9WQUxVRSwgdmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIyOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBZeXRva2VuKFl5dG9rZW4uVFlQRV9WQUxVRSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMzogewotICAgICAgICAgICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFl5dG9rZW4oWXl0b2tlbi5UWVBFX1ZBTFVFLCBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyOiB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcXCcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjE6IHsKLSAgICAgICAgICAgICAgICBCaWdEZWNpbWFsIHZhbCA9IG5ldyBCaWdEZWNpbWFsKHl5dGV4dCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFl5dG9rZW4oWXl0b2tlbi5UWVBFX1ZBTFVFLCB2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKU09OUGFyc2VFeGNlcHRpb24oeXljaGFyLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9DSEFSLAotICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnZhbHVlT2YoeXljaGFyYXQoMCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFl5dG9rZW4oWXl0b2tlbi5UWVBFX1JJR0hUX1NRVUFSRSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOTogewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXHInKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1OiB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWXl0b2tlbihZeXRva2VuLlRZUEVfQ09MT04sIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ6IHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDU6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFl5dG9rZW4oWXl0b2tlbi5UWVBFX0xFRlRfQlJBQ0UsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTc6IHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xmJyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaCA9IEludGVnZXIucGFyc2VJbnQoeXl0ZXh0KCkuc3Vic3RyaW5nKDIpLCAxNik7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgY2gpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKU09OUGFyc2VFeGNlcHRpb24oeXljaGFyLCBKU09OUGFyc2VFeGNlcHRpb24uRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04sIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIwOiB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcdCcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFl5dG9rZW4oWXl0b2tlbi5UWVBFX0xFRlRfU1FVQVJFLCBudWxsKTsKLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIHZhbCA9IG5ldyBCaWdJbnRlZ2VyKHl5dGV4dCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFl5dG9rZW4oWXl0b2tlbi5UWVBFX1ZBTFVFLCB2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDQ2OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWXl0b2tlbihZeXRva2VuLlRZUEVfQ09NTUEsIG51bGwpOwotICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvanNvbi9wYXJzZXIvWXl0b2tlbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9ZeXRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDcyMTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL3BhcnNlci9ZeXRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyOwotCi0vKioKLSAqIChUYWtlbiBmcm9tIEpTT04uc2ltcGxlIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPiBhbmQgbW9kaWZpZWQKLSAqIGZvciBPcGVuQ01JUy4pCi0gKiAKLSAqIEBhdXRob3IgRmFuZ1lpZG9uZzxmYW5neWlkb25nQHlhaG9vLmNvbS5jbj4KLSAqLwotcHVibGljIGNsYXNzIFl5dG9rZW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVkFMVUUgPSAwOy8vIEpTT04gcHJpbWl0aXZlIHZhbHVlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyxudW1iZXIsYm9vbGVhbixudWxsCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9MRUZUX0JSQUNFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUX0JSQUNFID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0xFRlRfU1FVQVJFID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUX1NRVUFSRSA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DT01NQSA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DT0xPTiA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FT0YgPSAtMTsvLyBlbmQgb2YgZmlsZQotCi0gICAgcHVibGljIGludCB0eXBlID0gMDsKLSAgICBwdWJsaWMgT2JqZWN0IHZhbHVlID0gbnVsbDsKLQotICAgIHB1YmxpYyBZeXRva2VuKGludCB0eXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBUWVBFX1ZBTFVFOgotICAgICAgICAgICAgc2IuYXBwZW5kKCJWQUxVRSgiKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgnKScpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFlQRV9MRUZUX0JSQUNFOgotICAgICAgICAgICAgc2IuYXBwZW5kKCJMRUZUIEJSQUNFKHspIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUWVBFX1JJR0hUX0JSQUNFOgotICAgICAgICAgICAgc2IuYXBwZW5kKCJSSUdIVCBCUkFDRSh9KSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFlQRV9MRUZUX1NRVUFSRToKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiTEVGVCBTUVVBUkUoWykiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfUklHSFRfU1FVQVJFOgotICAgICAgICAgICAgc2IuYXBwZW5kKCJSSUdIVCBTUVVBUkUoXSkiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRZUEVfQ09NTUE6Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkNPTU1BKCwpIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUWVBFX0NPTE9OOgotICAgICAgICAgICAgc2IuYXBwZW5kKCJDT0xPTig6KSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFlQRV9FT0Y6Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkVORCBPRiBGSUxFIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3NlcnZlci9BYnN0cmFjdENtaXNTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3NlcnZlci9BYnN0cmFjdENtaXNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWRiNWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9zZXJ2ZXIvQWJzdHJhY3RDbWlzU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUJvb2xlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRlVGltZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUNhcGFiaWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5SZW5kaXRpb25JbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbWlzU2VydmljZSBpbXBsZW1lbnRzIENtaXNTZXJ2aWNlLCBPYmplY3RJbmZvSGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RDbWlzU2VydmljZS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdEluZm8+IG9iamVjdEluZm9NYXA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFkZE9iamVjdEluZm9zID0gdHJ1ZTsKLQotICAgIC8vIC0tLSByZXBvc2l0b3J5IHNlcnZpY2UgLS0tCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZC4gQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gaXMgcHJlc2VudC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHJlcG9zaXRvcmllcyA9IGdldFJlcG9zaXRvcnlJbmZvcyhleHRlbnNpb24pOwotICAgICAgICBpZiAocmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUmVwb3NpdG9yeUluZm8gcmkgOiByZXBvc2l0b3JpZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmkuZ2V0SWQoKS5lcXVhbHMocmVwb3NpdG9yeUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByaTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJSZXBvc2l0b3J5ICciICsgcmVwb3NpdG9yeUlkICsgIicgZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIHJlcXVpcmVkLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIGlzIHByZXNlbnQuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBjaGVjayBkZXB0aAotICAgICAgICBpbnQgZCA9IChkZXB0aCA9PSBudWxsID8gLTEgOiBkZXB0aC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKGQgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkRlcHRoIG11c3Qgbm90IGJlIDAhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPigpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdCBjaGlsZHJlbiA9IGdldFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKSwgQmlnSW50ZWdlci5aRVJPLCBudWxsKTsKLQotICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBpc05vdEVtcHR5KGNoaWxkcmVuLmdldExpc3QoKSkpIHsKLSAgICAgICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdGQgOiBjaGlsZHJlbi5nZXRMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgdGRjID0gbmV3IFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCh0ZCk7Ci0gICAgICAgICAgICAgICAgYWRkVHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIChkID4gMCA/IGQgLSAxIDogLTEpLCB0ZGMpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodGRjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCBmb3IKLSAgICAgKiB7QGxpbmsgI2dldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcsIFN0cmluZywgQmlnSW50ZWdlciwgQm9vbGVhbiwgRXh0ZW5zaW9uc0RhdGEpfQotICAgICAqIC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkVHlwZUNoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIGludCBkZXB0aCwKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCBjb250YWluZXIpIHsKLQotICAgICAgICBpZiAoZGVwdGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IGNoaWxkcmVuID0gZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgY29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgQmlnSW50ZWdlci52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKSwgQmlnSW50ZWdlci5aRVJPLCBudWxsKTsKLQotICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBpc05vdEVtcHR5KGNoaWxkcmVuLmdldExpc3QoKSkpIHsKLSAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPigpOwotICAgICAgICAgICAgY29udGFpbmVyLnNldENoaWxkcmVuKGxpc3QpOwotCi0gICAgICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHRkIDogY2hpbGRyZW4uZ2V0TGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsIHRkYyA9IG5ldyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwodGQpOwotICAgICAgICAgICAgICAgIGFkZFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCAoZGVwdGggPiAwID8gZGVwdGggLSAxIDogLTEpLCB0ZGMpOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHRkYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5JbnRyb2R1Y2VkIGluIENNSVMgMS4xPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5JbnRyb2R1Y2VkIGluIENNSVMgMS4xPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiB1cGRhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5JbnRyb2R1Y2VkIGluIENNSVMgMS4xPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8vIC0tLSBuYXZpZ2F0aW9uIHNlcnZpY2UgLS0tCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGRlciBhbmQgYWxsIHJldHVybmVkIGNoaWxkcmVuLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0SW5Gb2xkZXJMaXN0IGdldENoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPGxpPk9iamVjdCBpbmZvcyBzaG91bGQgY29udGFpbiB0aGUgZm9sZGVyIGFuZCBhbGwgcmV0dXJuZWQgZGVzY2VuZGFudHMuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXREZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8bGk+T2JqZWN0IGluZm9zIHNob3VsZCBjb250YWluIHRoZSBmb2xkZXIgYW5kIGFsbCByZXR1cm5lZCBkZXNjZW5kYW50cy48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldEZvbGRlclRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIHJlcXVpcmVkLjwvbGk+Ci0gICAgICogPGxpPk9iamVjdCBpbmZvcyBzaG91bGQgY29udGFpbiB0aGUgb2JqZWN0IGFuZCBhbGwgcmV0dXJuZWQgcGFyZW50cy48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gZ2V0T2JqZWN0UGFyZW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIHJldHVybmVkIHBhcmVudCBmb2xkZXIuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldEZvbGRlclBhcmVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGRlciBhbmQgdGhlIHJldHVybmVkIG9iamVjdHMuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENoZWNrZWRPdXREb2NzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLy8gLS0tIG9iamVjdCBzZXJ2aWNlIC0tLQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIGlzIHByZXNlbnQuPC9saT4KLSAgICAgKiA8bGk+T2JqZWN0IGluZm9zIHNob3VsZCBjb250YWluIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIGNoZWNrIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydGllcyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIG9iamVjdCB0eXBlIGlkCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBvYmJqZWN0VHlwZUlkUHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICBpZiAob2JiamVjdFR5cGVJZFByb3BlcnR5ID09IG51bGwgfHwgIShvYmJqZWN0VHlwZUlkUHJvcGVydHkuZ2V0Rmlyc3RWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQgKyAiJyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgdHlwZQotICAgICAgICBTdHJpbmcgb2JqZWN0VHlwZUlkID0gb2JiamVjdFR5cGVJZFByb3BlcnR5LmdldEZpcnN0VmFsdWUoKS50b1N0cmluZygpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RUeXBlSWQsIG51bGwpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBvYmplY3QKLSAgICAgICAgU3RyaW5nIG5ld0lkOwotICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0QmFzZVR5cGVJZCgpKSB7Ci0gICAgICAgIGNhc2UgQ01JU19ET0NVTUVOVDoKLSAgICAgICAgICAgIG5ld0lkID0gY3JlYXRlRG9jdW1lbnQocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENNSVNfRk9MREVSOgotICAgICAgICAgICAgbmV3SWQgPSBjcmVhdGVGb2xkZXIocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIG51bGwsIG51bGwsIGV4dGVuc2lvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTUlTX1BPTElDWToKLSAgICAgICAgICAgIG5ld0lkID0gY3JlYXRlUG9saWN5KHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIHBvbGljaWVzLCBudWxsLCBudWxsLCBleHRlbnNpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ01JU19JVEVNOgotICAgICAgICAgICAgbmV3SWQgPSBjcmVhdGVJdGVtKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIHBvbGljaWVzLCBudWxsLCBudWxsLCBleHRlbnNpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBuZXdJZCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBuZXcgb2JqZWN0IGlkCi0gICAgICAgIGlmIChuZXdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNyZWF0aW9uIGZhaWxlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHVybiB0aGUgbmV3IG9iamVjdCBpZAotICAgICAgICByZXR1cm4gbmV3SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbGF0aW9uc2hpcChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSXRlbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIGlzIHByZXNlbnQuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldE9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCAiY21pczpvYmplY3RJZCIsIHRydWUsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsICJjbWlzOm5vbmUiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgZXh0ZW5zaW9uKS5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQuPC9saT4KLSAgICAgKiA8bGk+T2JqZWN0IGluZm9zIHNob3VsZCBjb250YWluIHRoZSByZXR1cm5lZCBvYmplY3QuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOwotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIGlzIHByZXNlbnQuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldE9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCAiY21pczpub25lIiwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbikuZ2V0UHJvcGVydGllcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxSZW5kaXRpb25EYXRhPiBnZXRSZW5kaXRpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8bGk+T2JqZWN0IGluZm9zIHNob3VsZCBjb250YWluIHRoZSByZXR1cm5lZCBvYmplY3QuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdEJ5UGF0aChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwgQmlnSW50ZWdlciBvZmZzZXQsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIGxlbmd0aCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPGxpPk9iamVjdCBpbmZvcyBzaG91bGQgY29udGFpbiB0aGUgdXBkYXRlZCBvYmplY3QuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8bGk+SW50cm9kdWNlZCBpbiBDTUlTIDEuMTwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlSWRzLCBMaXN0PFN0cmluZz4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPGxpPk9iamVjdCBpbmZvcyBzaG91bGQgY29udGFpbiB0aGUgbW92ZWQgb2JqZWN0LjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtb3ZlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBTdHJpbmcgdGFyZ2V0Rm9sZGVySWQsIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC4gQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gaXMgcHJlc2VudAotICAgICAqIChmb3J3YXJkcyB0bwotICAgICAqIHtAbGluayAjZGVsZXRlT2JqZWN0T3JDYW5jZWxDaGVja091dChTdHJpbmcsIFN0cmluZywgQm9vbGVhbiwgRXh0ZW5zaW9uc0RhdGEpfQotICAgICAqICkuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBkZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YjwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIEZhaWxlZFRvRGVsZXRlRGF0YSBkZWxldGVUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIFVuZmlsZU9iamVjdCB1bmZpbGVPYmplY3RzLCBCb29sZWFuIGNvbnRpbnVlT25GYWlsdXJlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5JbnRyb2R1Y2VkIGluIENNSVMgMS4xPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIGlzTGFzdENodW5rLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8vIC0tLSB2ZXJzaW9uaW5nIHNlcnZpY2UgLS0tCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIGNoZWNrZWQgb3V0IG9iamVjdC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIGNoZWNrZWQgaW4gb2JqZWN0LjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8bGk+T2JqZWN0IGluZm9zIHNob3VsZCBjb250YWluIHRoZSByZXR1cm5lZCBvYmplY3QuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBXZWIgU2VydmljZXMsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIGlzIHByZXNlbnQsIGlmCi0gICAgICoge0BsaW5rICNnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24oU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQm9vbGVhbiwgU3RyaW5nLCBCb29sZWFuLCBJbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nLCBCb29sZWFuLCBCb29sZWFuLCBFeHRlbnNpb25zRGF0YSl9Ci0gICAgICogaXMgaW1wbGVtZW50ZWQuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBtYWpvciwgZmlsdGVyLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCAiY21pczpub25lIiwgZmFsc2UsIGZhbHNlLCBleHRlbnNpb24pLmdldFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIHJldHVybmVkIG9iamVjdHMuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE9iamVjdERhdGE+IGdldEFsbFZlcnNpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gZGlzY292ZXJ5IHNlcnZpY2UgLS0tCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIHJldHVybmVkIG9iamVjdHMuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gbXVsdGkgZmlsaW5nIHNlcnZpY2UgLS0tCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIGFkZGVkIG9iamVjdC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT2JqZWN0VG9Gb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBBdG9tUHViLCBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8bGk+T2JqZWN0IGluZm9zIHNob3VsZCBjb250YWluIHRoZSByZW1vdmVkIG9iamVjdC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8vIC0tLSByZWxhdGlvbnNoaXAgc2VydmljZSAtLS0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPGxpPk9iamVjdCBpbmZvcyBzaG91bGQgY29udGFpbiB0aGUgb2JqZWN0IGFuZCB0aGUgcmV0dXJuZWQgcmVsYXRpb25zaGlwCi0gICAgICogb2JqZWN0cy48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQotCi0gICAgLy8gLS0tIEFDTCBzZXJ2aWNlIC0tLQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIDxiPkltcGxlbWVudGF0aW9uIEhpbnRzOjwvYj4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPkJpbmRpbmdzOiBXZWIgU2VydmljZXMsIEJyb3dzZXIsIExvY2FsPC9saT4KLSAgICAgKiA8bGk+SW1wbGVtZW50YXRpb24gaXMgb3B0aW9uYWwuPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqLwotICAgIHB1YmxpYyBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YjwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNsIGdldEFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gb25seUJhc2ljUGVybWlzc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gcG9saWN5IHNlcnZpY2UgLS0tCi0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIGFwcGxpZWQgcG9saWN5IG9iamVjdC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogPGI+SW1wbGVtZW50YXRpb24gSGludHM6PC9iPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+QmluZGluZ3M6IEF0b21QdWIsIFdlYiBTZXJ2aWNlcywgQnJvd3NlciwgTG9jYWw8L2xpPgotICAgICAqIDxsaT5JbXBsZW1lbnRhdGlvbiBpcyBvcHRpb25hbC48L2xpPgotICAgICAqIDxsaT5PYmplY3QgaW5mb3Mgc2hvdWxkIGNvbnRhaW4gdGhlIHJldHVybmVkIHBvbGljeSBvYmplY3RzLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBcHBsaWVkUG9saWNpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkISIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YiwgV2ViIFNlcnZpY2VzLCBCcm93c2VyLCBMb2NhbDwvbGk+Ci0gICAgICogPGxpPkltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCEiKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gc2VydmVyIHNwZWNpZmljIC0tLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGluZm8gbWFwLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0SW5mbz4gZ2V0T2JqZWN0SW5mb01hcCgpIHsKLSAgICAgICAgaWYgKG9iamVjdEluZm9NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgb2JqZWN0SW5mb01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0SW5mbz4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmplY3RJbmZvTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5JbXBsZW1lbnRhdGlvbiBIaW50czo8L2I+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5CaW5kaW5nczogQXRvbVB1YjwvbGk+Ci0gICAgICogPGxpPklmIHRoZSBvYmplY3QgaW5mbyBpcyBub3QgZm91bmQsIHRoZSBvYmplY3QgaW5mbyB3aWxsIGJlIGFzc2VtYmxlZC4KLSAgICAgKiBUbyBkbyB0aGF0IHRoZSByZXBvc2l0b3J5IGluZm8sIHRoZSBvYmplY3QsIHRoZSBvYmplY3QgcGFyZW50LCB0aGUgb2JqZWN0Ci0gICAgICogaGlzdG9yeSBhbmQgdGhlIGJhc2UgdHlwZSBkZWZpbml0aW9ucyB3aWxsIGJlIGZldGNoZWQuIElmIHlvdSB3YW50IHRvCi0gICAgICogY2hhbmdlIHRoaXMgYmVoYXZpb3IsIG92ZXJyaWRlIHRoaXMgbWV0aG9kLjwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0SW5mbyBnZXRPYmplY3RJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3RJbmZvPiBvaW0gPSBnZXRPYmplY3RJbmZvTWFwKCk7Ci0gICAgICAgIE9iamVjdEluZm8gaW5mbyA9IG9pbS5nZXQob2JqZWN0SWQpOwotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBvYmplY3QgaW5mbyBoYXMgbm90IGJlZW4gZm91bmQgLT4gY3JlYXRlIG9uZQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggb2ZmIG9iamVjdCBpbmZvIGNvbGxlY3Rpb24gdG8gYXZvaWQgc2lkZSBlZmZlY3RzCi0gICAgICAgICAgICAgICAgYWRkT2JqZWN0SW5mb3MgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgb2JqZWN0IGFuZCBpdHMgaW5mbwotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0T2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG51bGwsIEJvb2xlYW4uVFJVRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCwKLSAgICAgICAgICAgICAgICAgICAgICAgICIqIiwgQm9vbGVhbi5UUlVFLCBCb29sZWFuLkZBTFNFLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpbmZvID0gZ2V0T2JqZWN0SW5mb0ludGVybihyZXBvc2l0b3J5SWQsIG9iamVjdCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggb24gb2JqZWN0IGluZm8gY29sbGVjdGlvbgotICAgICAgICAgICAgICAgIGFkZE9iamVjdEluZm9zID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCBvYmplY3QgaW5mbwotICAgICAgICAgICAgICAgIGFkZE9iamVjdEluZm8oaW5mbyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGluZm8gPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKExPRy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy50cmFjZSgiR2V0dGluZyB0aGUgb2JqZWN0IGluZm8gZm9yIG9iamVjdCB7fSBpbiByZXBvc2l0b3J5IHt9ICBmYWlsZWQ6IHt9Iiwgb2JqZWN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeUlkLCBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgYWRkT2JqZWN0SW5mb3MgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbGxlY3RzIHRoZSB7QGxpbmsgT2JqZWN0SW5mb30gYWJvdXQgYW4gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IGlkCi0gICAgICogQHBhcmFtIG9iamVjdAotICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIGNvbGxlY3RlZCBvYmplY3QgaW5mbwotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3RJbmZvIGdldE9iamVjdEluZm9JbnRlcm4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgT2JqZWN0RGF0YSBvYmplY3QpIHsKLSAgICAgICAgLy8gaWYgdGhlIG9iamVjdCBoYXMgbm8gcHJvcGVydGllcywgc3RvcCBoZXJlCi0gICAgICAgIGlmIChvYmplY3QuZ2V0UHJvcGVydGllcygpID09IG51bGwgfHwgb2JqZWN0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJObyBwcm9wZXJ0aWVzISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0SW5mb0ltcGwgaW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotCi0gICAgICAgIC8vIGdldCB0aGUgcmVwb3NpdG9yeSBpbmZvCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnlJbmZvID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlcG9zaXRvcnlJbmZvID0gZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1J1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJnZXRSZXBvc2l0b3J5SW5mbyByZXR1cm5lZCBhbiBlcnJvciB3aGlsZSBjb21waWxpbmcgb2JqZWN0IGluZm8gZm9yIG9iamVjdCB7fS4iLCBvYmplY3QuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2VuZXJhbCBwcm9wZXJ0aWVzCi0gICAgICAgIGluZm8uc2V0T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgIGluZm8uc2V0SWQob2JqZWN0LmdldElkKCkpOwotICAgICAgICBpbmZvLnNldE5hbWUoZ2V0U3RyaW5nUHJvcGVydHkob2JqZWN0LCBQcm9wZXJ0eUlkcy5OQU1FKSk7Ci0gICAgICAgIGluZm8uc2V0Q3JlYXRlZEJ5KGdldFN0cmluZ1Byb3BlcnR5KG9iamVjdCwgUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSkpOwotICAgICAgICBpbmZvLnNldENyZWF0aW9uRGF0ZShnZXREYXRlVGltZVByb3BlcnR5KG9iamVjdCwgUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSkpOwotICAgICAgICBpbmZvLnNldExhc3RNb2RpZmljYXRpb25EYXRlKGdldERhdGVUaW1lUHJvcGVydHkob2JqZWN0LCBQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFKSk7Ci0gICAgICAgIGluZm8uc2V0VHlwZUlkKGdldElkUHJvcGVydHkob2JqZWN0LCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkpOwotICAgICAgICBpbmZvLnNldEJhc2VUeXBlKG9iamVjdC5nZXRCYXNlVHlwZUlkKCkpOwotCi0gICAgICAgIC8vIHZlcnNpb25pbmcKLSAgICAgICAgaW5mby5zZXRJc0N1cnJlbnRWZXJzaW9uKG9iamVjdC5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKTsKLSAgICAgICAgaW5mby5zZXRXb3JraW5nQ29weUlkKG51bGwpOwotICAgICAgICBpbmZvLnNldFdvcmtpbmdDb3B5T3JpZ2luYWxJZChudWxsKTsKLQotICAgICAgICBpbmZvLnNldFZlcnNpb25TZXJpZXNJZChnZXRJZFByb3BlcnR5KG9iamVjdCwgUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpKTsKLSAgICAgICAgaWYgKGluZm8uZ2V0VmVyc2lvblNlcmllc0lkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgQm9vbGVhbiBpc0xhdGVzdCA9IGdldEJvb2xlYW5Qcm9wZXJ0eShvYmplY3QsIFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OKTsKLSAgICAgICAgICAgIGluZm8uc2V0SXNDdXJyZW50VmVyc2lvbihpc0xhdGVzdCA9PSBudWxsID8gdHJ1ZSA6IGlzTGF0ZXN0LmJvb2xlYW5WYWx1ZSgpKTsKLQotICAgICAgICAgICAgQm9vbGVhbiBpc0NoZWNrZWRPdXQgPSBnZXRCb29sZWFuUHJvcGVydHkob2JqZWN0LCBQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCk7Ci0gICAgICAgICAgICBpZiAoaXNDaGVja2VkT3V0ICE9IG51bGwgJiYgaXNDaGVja2VkT3V0LmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRXb3JraW5nQ29weUlkKGdldElkUHJvcGVydHkob2JqZWN0LCBQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCkpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IGxhdGVzdCB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3REYXRhPiB2ZXJzaW9ucyA9IGdldEFsbFZlcnNpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0LmdldElkKCksIGluZm8uZ2V0VmVyc2lvblNlcmllc0lkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KHZlcnNpb25zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zZXRXb3JraW5nQ29weU9yaWdpbmFsSWQodmVyc2lvbnMuZ2V0KDApLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbiBuc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPRy5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJnZXRBbGxWZXJzaW9ucyBpcyBub3QgaW1wbGVtZW50ZWQhIE9iamVjdCBpbmZvIGZvciBvYmplY3Qge30gbWlnaHQgYmUgaW5jb3JyZWN0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0SWQoKSwgbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnRlbnQKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkob2JqZWN0LCBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUpOwotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBnZXRTdHJpbmdQcm9wZXJ0eShvYmplY3QsIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSk7Ci0gICAgICAgIFN0cmluZyBzdHJlYW1JZCA9IGdldElkUHJvcGVydHkob2JqZWN0LCBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9JRCk7Ci0gICAgICAgIEJpZ0ludGVnZXIgbGVuZ3RoID0gZ2V0SW50ZWdlclByb3BlcnR5KG9iamVjdCwgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RIKTsKLSAgICAgICAgYm9vbGVhbiBoYXNDb250ZW50ID0gZmlsZU5hbWUgIT0gbnVsbCB8fCBtaW1lVHlwZSAhPSBudWxsIHx8IHN0cmVhbUlkICE9IG51bGwgfHwgbGVuZ3RoICE9IG51bGw7Ci0gICAgICAgIGlmIChoYXNDb250ZW50KSB7Ci0gICAgICAgICAgICBpbmZvLnNldEhhc0NvbnRlbnQoaGFzQ29udGVudCk7Ci0gICAgICAgICAgICBpbmZvLnNldENvbnRlbnRUeXBlKG1pbWVUeXBlKTsKLSAgICAgICAgICAgIGluZm8uc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mby5zZXRIYXNDb250ZW50KGZhbHNlKTsKLSAgICAgICAgICAgIGluZm8uc2V0Q29udGVudFR5cGUobnVsbCk7Ci0gICAgICAgICAgICBpbmZvLnNldEZpbGVOYW1lKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGFyZW50Ci0gICAgICAgIGlmIChvYmplY3QuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVApIHsKLSAgICAgICAgICAgIGluZm8uc2V0SGFzUGFyZW50KGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19GT0xERVIpIHsKLSAgICAgICAgICAgIGluZm8uc2V0SGFzUGFyZW50KCFvYmplY3QuZ2V0SWQoKS5lcXVhbHMocmVwb3NpdG9yeUluZm8uZ2V0Um9vdEZvbGRlcklkKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBwYXJlbnRzID0gZ2V0T2JqZWN0UGFyZW50cyhyZXBvc2l0b3J5SWQsIG9iamVjdC5nZXRJZCgpLCBudWxsLCBCb29sZWFuLkZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgImNtaXM6bm9uZSIsIEJvb2xlYW4uRkFMU0UsIG51bGwpOwotICAgICAgICAgICAgICAgIGluZm8uc2V0SGFzUGFyZW50KGlzTm90RW1wdHkocGFyZW50cykpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRIYXNQYXJlbnQoZmFsc2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbiBuc2UpIHsKLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzV2FybkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiZ2V0T2JqZWN0UGFyZW50cyBpcyBub3QgaW1wbGVtZW50ZWQhIE9iamVjdCBpbmZvIGZvciBvYmplY3Qge30gbWlnaHQgYmUgaW5jb3JyZWN0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRJZCgpLCBuc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBvbGljaWVzIGFuZCByZWxhdGlvbnNoaXBzCi0gICAgICAgIGluZm8uc2V0U3VwcG9ydHNSZWxhdGlvbnNoaXBzKGZhbHNlKTsKLSAgICAgICAgaW5mby5zZXRTdXBwb3J0c1BvbGljaWVzKGZhbHNlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IGJhc2VUeXBlc0xpc3QgPSBnZXRUeXBlQ2hpbGRyZW4ocmVwb3NpdG9yeUlkLCBudWxsLCBCb29sZWFuLkZBTFNFLAotICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoNiksIEJpZ0ludGVnZXIuWkVSTywgbnVsbCk7Ci0gICAgICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGUgOiBiYXNlVHlwZXNMaXN0LmdldExpc3QoKSkgewotICAgICAgICAgICAgICAgIGlmIChCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQLnZhbHVlKCkuZXF1YWxzKHR5cGUuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5zZXRTdXBwb3J0c1JlbGF0aW9uc2hpcHModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCYXNlVHlwZUlkLkNNSVNfUE9MSUNZLnZhbHVlKCkuZXF1YWxzKHR5cGUuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5zZXRTdXBwb3J0c1BvbGljaWVzKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbiBuc2UpIHsKLSAgICAgICAgICAgIGlmIChMT0cuaXNXYXJuRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oImdldFR5cGVDaGlsZHJlbiBpcyBub3QgaW1wbGVtZW50ZWQhIE9iamVjdCBpbmZvIGZvciBvYmplY3Qge30gbWlnaHQgYmUgaW5jb3JyZWN0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmdldElkKCksIG5zZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW5kaXRpb25zCi0gICAgICAgIGluZm8uc2V0UmVuZGl0aW9uSW5mb3MobnVsbCk7Ci0gICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyA9IG9iamVjdC5nZXRSZW5kaXRpb25zKCk7Ci0gICAgICAgIGlmIChpc05vdEVtcHR5KHJlbmRpdGlvbnMpKSB7Ci0gICAgICAgICAgICBMaXN0PFJlbmRpdGlvbkluZm8+IHJlbmRpdGlvbkluZm9zID0gbmV3IEFycmF5TGlzdDxSZW5kaXRpb25JbmZvPigpOwotICAgICAgICAgICAgZm9yIChSZW5kaXRpb25EYXRhIHJlbmRpdGlvbiA6IHJlbmRpdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBSZW5kaXRpb25JbmZvSW1wbCByZW5kaXRpb25JbmZvID0gbmV3IFJlbmRpdGlvbkluZm9JbXBsKCk7Ci0gICAgICAgICAgICAgICAgcmVuZGl0aW9uSW5mby5zZXRJZChyZW5kaXRpb24uZ2V0U3RyZWFtSWQoKSk7Ci0gICAgICAgICAgICAgICAgcmVuZGl0aW9uSW5mby5zZXRLaW5kKHJlbmRpdGlvbi5nZXRLaW5kKCkpOwotICAgICAgICAgICAgICAgIHJlbmRpdGlvbkluZm8uc2V0Q29udGVudFR5cGUocmVuZGl0aW9uLmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgICAgIHJlbmRpdGlvbkluZm8uc2V0VGl0bGUocmVuZGl0aW9uLmdldFRpdGxlKCkpOwotICAgICAgICAgICAgICAgIHJlbmRpdGlvbkluZm8uc2V0TGVuZ3RoKHJlbmRpdGlvbi5nZXRCaWdMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgcmVuZGl0aW9uSW5mb3MuYWRkKHJlbmRpdGlvbkluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5mby5zZXRSZW5kaXRpb25JbmZvcyhyZW5kaXRpb25JbmZvcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWxhdGlvbnNoaXBzCi0gICAgICAgIGluZm8uc2V0UmVsYXRpb25zaGlwU291cmNlSWRzKG51bGwpOwotICAgICAgICBpbmZvLnNldFJlbGF0aW9uc2hpcFRhcmdldElkcyhudWxsKTsKLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiByZWxhdGlvbnNoaXBzID0gb2JqZWN0LmdldFJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgaWYgKGlzTm90RW1wdHkocmVsYXRpb25zaGlwcykpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzb3VyY2VJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB0YXJnZXRJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSByZWxhdGlvbnNoaXAgOiByZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNvdXJjZUlkID0gZ2V0SWRQcm9wZXJ0eShyZWxhdGlvbnNoaXAsIFByb3BlcnR5SWRzLlNPVVJDRV9JRCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldElkID0gZ2V0SWRQcm9wZXJ0eShyZWxhdGlvbnNoaXAsIFByb3BlcnR5SWRzLlRBUkdFVF9JRCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRJZCgpLmVxdWFscyhzb3VyY2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc291cmNlSWRzLmFkZChyZWxhdGlvbnNoaXAuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0SWQoKS5lcXVhbHModGFyZ2V0SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldElkcy5hZGQocmVsYXRpb25zaGlwLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KHNvdXJjZUlkcykpIHsKLSAgICAgICAgICAgICAgICBpbmZvLnNldFJlbGF0aW9uc2hpcFNvdXJjZUlkcyhzb3VyY2VJZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkodGFyZ2V0SWRzKSkgewotICAgICAgICAgICAgICAgIGluZm8uc2V0UmVsYXRpb25zaGlwVGFyZ2V0SWRzKHRhcmdldElkcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnbG9iYWwgc2V0dGluZ3MKLSAgICAgICAgaW5mby5zZXRIYXNBY2woZmFsc2UpOwotICAgICAgICBpbmZvLnNldFN1cHBvcnRzRGVzY2VuZGFudHMoZmFsc2UpOwotICAgICAgICBpbmZvLnNldFN1cHBvcnRzRm9sZGVyVHJlZShmYWxzZSk7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMgPSByZXBvc2l0b3J5SW5mby5nZXRDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgaWYgKGNhcGFiaWxpdGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmZvLnNldEhhc0FjbChjYXBhYmlsaXRpZXMuZ2V0QWNsQ2FwYWJpbGl0eSgpID09IENhcGFiaWxpdHlBY2wuRElTQ09WRVIKLSAgICAgICAgICAgICAgICAgICAgfHwgY2FwYWJpbGl0aWVzLmdldEFjbENhcGFiaWxpdHkoKSA9PSBDYXBhYmlsaXR5QWNsLk1BTkFHRSk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0LmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRTdXBwb3J0c0Rlc2NlbmRhbnRzKEJvb2xlYW4uVFJVRS5lcXVhbHMoY2FwYWJpbGl0aWVzLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSkpOwotICAgICAgICAgICAgICAgIGluZm8uc2V0U3VwcG9ydHNGb2xkZXJUcmVlKEJvb2xlYW4uVFJVRS5lcXVhbHMoY2FwYWJpbGl0aWVzLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIG9iamVjdCBpbmZvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE9iamVjdEluZm8oT2JqZWN0SW5mbyBvYmplY3RJbmZvKSB7Ci0gICAgICAgIGlmICghYWRkT2JqZWN0SW5mb3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmplY3RJbmZvICE9IG51bGwgJiYgb2JqZWN0SW5mby5nZXRJZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE9iamVjdEluZm9NYXAoKS5wdXQob2JqZWN0SW5mby5nZXRJZCgpLCBvYmplY3RJbmZvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgb2JqZWN0IGluZm8gbWFwLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyT2JqZWN0SW5mb3MoKSB7Ci0gICAgICAgIG9iamVjdEluZm9NYXAgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBjbGVhck9iamVjdEluZm9zKCk7Ci0gICAgfQotCi0gICAgLy8gLS0tIGhlbHBlcnMgLS0tCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KE9iamVjdERhdGEgb2JqZWN0LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkgPSBvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQcm9wZXJ0eVN0cmluZykgcHJvcGVydHkpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldElkUHJvcGVydHkoT2JqZWN0RGF0YSBvYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA9IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlJZCkgewotICAgICAgICAgICAgcmV0dXJuICgoUHJvcGVydHlJZCkgcHJvcGVydHkpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RGF0ZVRpbWVQcm9wZXJ0eShPYmplY3REYXRhIG9iamVjdCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5ID0gb2JqZWN0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQcm9wZXJ0eURhdGVUaW1lKSBwcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCb29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShPYmplY3REYXRhIG9iamVjdCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5ID0gb2JqZWN0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KG5hbWUpOwotICAgICAgICBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eUJvb2xlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoKFByb3BlcnR5Qm9vbGVhbikgcHJvcGVydHkpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBnZXRJbnRlZ2VyUHJvcGVydHkoT2JqZWN0RGF0YSBvYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA9IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlJbnRlZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQcm9wZXJ0eUludGVnZXIpIHByb3BlcnR5KS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9zZXJ2ZXIvQWJzdHJhY3RTZXJ2aWNlRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9zZXJ2ZXIvQWJzdHJhY3RTZXJ2aWNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg3NjUxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvc2VydmVyL0Fic3RyYWN0U2VydmljZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuVGVtcFN0b3JlT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlRmFjdG9yeSBpbXBsZW1lbnRzIENtaXNTZXJ2aWNlRmFjdG9yeSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGFic3RyYWN0IENtaXNTZXJ2aWNlIGdldFNlcnZpY2UoQ2FsbENvbnRleHQgY29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHRlbXAgZGlyZWN0b3J5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWxlIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0gICAgICAgIFN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotICAgICAgICByZXR1cm4gbmV3IEZpbGUodGVtcERpcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGNvZGUgZmFsc2V9LCBkbyBub3QgZW5jcnlwdCB0ZW1wb3JhcnkgZmlsZXMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZW5jcnlwdFRlbXBGaWxlcygpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB0aHJlc2hvbGQgb2YgNCBNaUIuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNZW1vcnlUaHJlc2hvbGQoKSB7Ci0gICAgICAgIHJldHVybiA0ICogMTAyNCAqIDEwMjQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG1heCBzaXplIG9mIDQgR2lCLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldE1heENvbnRlbnRTaXplKCkgewotICAgICAgICByZXR1cm4gKGxvbmcpIDQgKiAxMDI0ICogMTAyNCAqIDEwMjQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB7QGNvZGUgbnVsbH0gdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCwgdGVtcCBmaWxlcyBiYXNlZAotICAgICAqIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gZ2V0VGVtcEZpbGVPdXRwdXRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3NlcnZlci9MaW5rSW5mb0ltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvc2VydmVyL0xpbmtJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjViOTYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvc2VydmVyL0xpbmtJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5MaW5rSW5mbzsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIExpbmtJbmZvfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSW5mb0ltcGwgaW1wbGVtZW50cyBMaW5rSW5mbyB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaHJlZjsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTGlua0luZm9JbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBMaW5rSW5mb0ltcGwoU3RyaW5nIHJlbCwgU3RyaW5nIGhyZWYpIHsKLSAgICAgICAgdGhpcy5yZWwgPSByZWw7Ci0gICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7Ci0gICAgfQotCi0gICAgcHVibGljIExpbmtJbmZvSW1wbChTdHJpbmcgcmVsLCBTdHJpbmcgaHJlZiwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgdGhpcyhyZWwsIGhyZWYpOwotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaW5rSW5mb0ltcGwoU3RyaW5nIHJlbCwgU3RyaW5nIGhyZWYsIFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcyhyZWwsIGhyZWYsIHR5cGUpOwotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWwoKSB7Ci0gICAgICAgIHJldHVybiByZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVsKFN0cmluZyByZWwpIHsKLSAgICAgICAgdGhpcy5yZWwgPSByZWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotICAgICAgICByZXR1cm4gaHJlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIcmVmKFN0cmluZyBocmVmKSB7Ci0gICAgICAgIHRoaXMuaHJlZiA9IGhyZWY7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9zZXJ2ZXIvT2JqZWN0SW5mb0ltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvc2VydmVyL09iamVjdEluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmM0M2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9zZXJ2ZXIvT2JqZWN0SW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlcjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5MaW5rSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlJlbmRpdGlvbkluZm87Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBPYmplY3RJbmZvfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RJbmZvSW1wbCBpbXBsZW1lbnRzIE9iamVjdEluZm8sIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotICAgIHByaXZhdGUgU3RyaW5nIGF0b21JZDsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZWRCeTsKLSAgICBwcml2YXRlIEdyZWdvcmlhbkNhbGVuZGFyIGNyZWF0aW9uRGF0ZTsKLSAgICBwcml2YXRlIEdyZWdvcmlhbkNhbGVuZGFyIGxhc3RNb2RpZmljYXRpb25EYXRlOwotICAgIHByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLSAgICBwcml2YXRlIEJhc2VUeXBlSWQgYmFzZVR5cGVJZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDdXJyZW50VmVyc2lvbiA9IHRydWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvblNlcmllc0lkID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB3b3JraW5nQ29weUlkID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB3b3JraW5nQ29weU9yaWdpbmFsSWQgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDb250ZW50ID0gdHJ1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgTGlzdDxSZW5kaXRpb25JbmZvPiByZW5kaXRpb25JbmZvcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzUmVsYXRpb25zaGlwcyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwb3J0c1BvbGljaWVzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0FjbCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQYXJlbnQgPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwb3J0c0Rlc2NlbmRhbnRzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzRm9sZGVyVHJlZSA9IGZhbHNlOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHJlbGF0aW9uc2hpcFNvdXJjZUlkcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcmVsYXRpb25zaGlwVGFyZ2V0SWRzID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8TGlua0luZm8+IGFkZGl0aW9uYWxMaW5rcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPYmplY3REYXRhIG9iamVjdCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgT2JqZWN0SW5mb0ltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEluZm9JbXBsKFN0cmluZyBpZCwgQmFzZVR5cGVJZCBiYXNlT2JqZWN0VHlwZUlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgYmFzZVR5cGVJZCA9IGJhc2VPYmplY3RUeXBlSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdG9tSWQoKSB7Ci0gICAgICAgIHJldHVybiBhdG9tSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXRvbUlkKFN0cmluZyBhdG9tSWQpIHsKLSAgICAgICAgdGhpcy5hdG9tSWQgPSBhdG9tSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVkQnkoKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVkQnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3JlYXRlZEJ5KFN0cmluZyBjcmVhdGVkQnkpIHsKLSAgICAgICAgdGhpcy5jcmVhdGVkQnkgPSBjcmVhdGVkQnk7Ci0gICAgfQotCi0gICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyIGdldENyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0aW9uRGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoR3JlZ29yaWFuQ2FsZW5kYXIgY3JlYXRpb25EYXRlKSB7Ci0gICAgICAgIHRoaXMuY3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhciBnZXRMYXN0TW9kaWZpY2F0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmljYXRpb25EYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmljYXRpb25EYXRlKEdyZWdvcmlhbkNhbGVuZGFyIGxhc3RNb2RpZmljYXRpb25EYXRlKSB7Ci0gICAgICAgIHRoaXMubGFzdE1vZGlmaWNhdGlvbkRhdGUgPSBsYXN0TW9kaWZpY2F0aW9uRGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlSWQoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmFzZVR5cGVJZCBnZXRCYXNlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VUeXBlSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZVR5cGUoQmFzZVR5cGVJZCBiYXNlT2JqZWN0VHlwZUlkKSB7Ci0gICAgICAgIHRoaXMuYmFzZVR5cGVJZCA9IGJhc2VPYmplY3RUeXBlSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDdXJyZW50VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGlzQ3VycmVudFZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXNDdXJyZW50VmVyc2lvbihib29sZWFuIGN1cnJlbnRWZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMuaXNDdXJyZW50VmVyc2lvbiA9IGN1cnJlbnRWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvblNlcmllc0lkKCkgewotICAgICAgICByZXR1cm4gdmVyc2lvblNlcmllc0lkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb25TZXJpZXNJZChTdHJpbmcgdmVyc2lvblNlcmllc0lkKSB7Ci0gICAgICAgIHRoaXMudmVyc2lvblNlcmllc0lkID0gdmVyc2lvblNlcmllc0lkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0NvcHlJZCgpIHsKLSAgICAgICAgcmV0dXJuIHdvcmtpbmdDb3B5SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V29ya2luZ0NvcHlJZChTdHJpbmcgd29ya2luZ0NvcHlJZCkgewotICAgICAgICB0aGlzLndvcmtpbmdDb3B5SWQgPSB3b3JraW5nQ29weUlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0NvcHlPcmlnaW5hbElkKCkgewotICAgICAgICByZXR1cm4gd29ya2luZ0NvcHlPcmlnaW5hbElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdvcmtpbmdDb3B5T3JpZ2luYWxJZChTdHJpbmcgd29ya2luZ0NvcHlPcmlnaW5hbElkKSB7Ci0gICAgICAgIHRoaXMud29ya2luZ0NvcHlPcmlnaW5hbElkID0gd29ya2luZ0NvcHlPcmlnaW5hbElkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnQoKSB7Ci0gICAgICAgIHJldHVybiBoYXNDb250ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhc0NvbnRlbnQoYm9vbGVhbiBoYXNDb250ZW50KSB7Ci0gICAgICAgIHRoaXMuaGFzQ29udGVudCA9IGhhc0NvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uSW5mbz4gZ2V0UmVuZGl0aW9uSW5mb3MoKSB7Ci0gICAgICAgIHJldHVybiByZW5kaXRpb25JbmZvczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW5kaXRpb25JbmZvcyhMaXN0PFJlbmRpdGlvbkluZm8+IHJlbmRpdGlvbnMpIHsKLSAgICAgICAgdGhpcy5yZW5kaXRpb25JbmZvcyA9IHJlbmRpdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNSZWxhdGlvbnNoaXBzKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydHNSZWxhdGlvbnNoaXBzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN1cHBvcnRzUmVsYXRpb25zaGlwcyhib29sZWFuIHN1cHBvcnRzUmVsYXRpb25zaGlwcykgewotICAgICAgICB0aGlzLnN1cHBvcnRzUmVsYXRpb25zaGlwcyA9IHN1cHBvcnRzUmVsYXRpb25zaGlwczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1BvbGljaWVzKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydHNQb2xpY2llczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0c1BvbGljaWVzKGJvb2xlYW4gc3VwcG9ydHNQb2xpY2llcykgewotICAgICAgICB0aGlzLnN1cHBvcnRzUG9saWNpZXMgPSBzdXBwb3J0c1BvbGljaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0FjbCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc0FjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYXNBY2woYm9vbGVhbiBoYXNBY2wpIHsKLSAgICAgICAgdGhpcy5oYXNBY2wgPSBoYXNBY2w7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUGFyZW50KCkgewotICAgICAgICByZXR1cm4gaGFzUGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhhc1BhcmVudChib29sZWFuIGhhc1BhcmVudCkgewotICAgICAgICB0aGlzLmhhc1BhcmVudCA9IGhhc1BhcmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Rlc2NlbmRhbnRzKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydHNEZXNjZW5kYW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0c0Rlc2NlbmRhbnRzKGJvb2xlYW4gc3VwcG9ydHNEZXNjZW5kYW50cykgewotICAgICAgICB0aGlzLnN1cHBvcnRzRGVzY2VuZGFudHMgPSBzdXBwb3J0c0Rlc2NlbmRhbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRm9sZGVyVHJlZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1cHBvcnRzRm9sZGVyVHJlZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwb3J0c0ZvbGRlclRyZWUoYm9vbGVhbiBzdXBwb3J0c0ZvbGRlclRyZWUpIHsKLSAgICAgICAgdGhpcy5zdXBwb3J0c0ZvbGRlclRyZWUgPSBzdXBwb3J0c0ZvbGRlclRyZWU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWxhdGlvbnNoaXBTb3VyY2VJZHMoKSB7Ci0gICAgICAgIHJldHVybiByZWxhdGlvbnNoaXBTb3VyY2VJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwU291cmNlSWRzKExpc3Q8U3RyaW5nPiByZWxhdGlvbnNoaXBTb3VyY2VJZHMpIHsKLSAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBTb3VyY2VJZHMgPSByZWxhdGlvbnNoaXBTb3VyY2VJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWxhdGlvbnNoaXBUYXJnZXRJZHMoKSB7Ci0gICAgICAgIHJldHVybiByZWxhdGlvbnNoaXBUYXJnZXRJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwVGFyZ2V0SWRzKExpc3Q8U3RyaW5nPiByZWxhdGlvbnNoaXBUYXJnZXRJZHMpIHsKLSAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBUYXJnZXRJZHMgPSByZWxhdGlvbnNoaXBUYXJnZXRJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TGlua0luZm8+IGdldEFkZGl0aW9uYWxMaW5rcygpIHsKLSAgICAgICAgcmV0dXJuIGFkZGl0aW9uYWxMaW5rczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsTGlua3MoTGlzdDxMaW5rSW5mbz4gYWRkaXRpb25hbExpbmtzKSB7Ci0gICAgICAgIHRoaXMuYWRkaXRpb25hbExpbmtzID0gYWRkaXRpb25hbExpbmtzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0RGF0YSBvYmplY3QpIHsKLSAgICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9zZXJ2ZXIvUmVuZGl0aW9uSW5mb0ltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvc2VydmVyL1JlbmRpdGlvbkluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjgzMzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9zZXJ2ZXIvUmVuZGl0aW9uSW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5SZW5kaXRpb25JbmZvOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUmVuZGl0aW9uSW5mb30gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgY2xhc3MgUmVuZGl0aW9uSW5mb0ltcGwgaW1wbGVtZW50cyBSZW5kaXRpb25JbmZvLCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBpZDsKLSAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBraW5kOwotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotICAgIHByaXZhdGUgQmlnSW50ZWdlciBsZW5ndGg7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2luZCgpIHsKLSAgICAgICAgcmV0dXJuIGtpbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2luZChTdHJpbmcga2luZCkgewotICAgICAgICB0aGlzLmtpbmQgPSBraW5kOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoQmlnSW50ZWdlciBsZW5ndGgpIHsKLSAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL0Fic3RyYWN0SnJlV3NzVHViZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL0Fic3RyYWN0SnJlV3NzVHViZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGYxMzliLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9BYnN0cmFjdEpyZVdzc1R1YmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuaGVscGVyLkFic3RyYWN0RmlsdGVyVHViZUltcGw7Ci0KLS8qKgotICogQWJzdHJhY3QgV1MtU2VjdXJpdHkgdHViZSBmb3IgT3BlbkNNSVMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpyZVdzc1R1YmUgZXh0ZW5kcyBBYnN0cmFjdEZpbHRlclR1YmVJbXBsIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTU0VfTkFNRVNQQUNFID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NVX05BTUVTUEFDRSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFFOYW1lIFdTU0UgPSBuZXcgUU5hbWUoV1NTRV9OQU1FU1BBQ0UsICJTZWN1cml0eSIpOwotCi0gICAgcHVibGljIEFic3RyYWN0SnJlV3NzVHViZShUdWJlIG5leHQpIHsKLSAgICAgICAgc3VwZXIobmV4dCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0SnJlV3NzVHViZShBYnN0cmFjdEZpbHRlclR1YmVJbXBsIHRoYXQsIFR1YmVDbG9uZXIgY2xvbmVyKSB7Ci0gICAgICAgIHN1cGVyKHRoYXQsIGNsb25lcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL0Fic3RyYWN0V3NzVHViZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL0Fic3RyYWN0V3NzVHViZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTI3Y2U4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9BYnN0cmFjdFdzc1R1YmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5UdWJlOwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLnBpcGUuaGVscGVyLkFic3RyYWN0RmlsdGVyVHViZUltcGw7Ci0KLS8qKgotICogQWJzdHJhY3QgV1MtU2VjdXJpdHkgdHViZSBmb3IgT3BlbkNNSVMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdzc1R1YmUgZXh0ZW5kcyBBYnN0cmFjdEZpbHRlclR1YmVJbXBsIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTU0VfTkFNRVNQQUNFID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NVX05BTUVTUEFDRSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFFOYW1lIFdTU0UgPSBuZXcgUU5hbWUoV1NTRV9OQU1FU1BBQ0UsICJTZWN1cml0eSIpOwotCi0gICAgcHVibGljIEFic3RyYWN0V3NzVHViZShUdWJlIG5leHQpIHsKLSAgICAgICAgc3VwZXIobmV4dCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0V3NzVHViZShBYnN0cmFjdEZpbHRlclR1YmVJbXBsIHRoYXQsIFR1YmVDbG9uZXIgY2xvbmVyKSB7Ci0gICAgICAgIHN1cGVyKHRoYXQsIGNsb25lcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL09wZW5DTUlTSnJlVHViZUFzc2VtYmxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL09wZW5DTUlTSnJlVHViZUFzc2VtYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTE1MjZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9PcGVuQ01JU0pyZVR1YmVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC50dWJlLmNsaWVudC5KcmVXc3NNVVR1YmU7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5DbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5TZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVsaW5lQXNzZW1ibGVyOwotCi0vKioKLSAqIEFzc2VtYmxlciBmb3IgT3BlbkNNSVMgY2xpZW50IGFuZCBzZXJ2ZXIgdHViZWxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNNSVNKcmVUdWJlQXNzZW1ibGVyIGltcGxlbWVudHMgVHViZWxpbmVBc3NlbWJsZXIgewotCi0gICAgcHVibGljIFR1YmUgY3JlYXRlQ2xpZW50KENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHViZSBoZWFkID0gY29udGV4dC5jcmVhdGVUcmFuc3BvcnRUdWJlKCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVNlY3VyaXR5VHViZShoZWFkKTsKLSAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlV3NhVHViZShoZWFkKTsKLSAgICAgICAgaGVhZCA9IG5ldyBKcmVXc3NNVVR1YmUoY29udGV4dC5nZXRCaW5kaW5nKCksIGhlYWQpOwotCi0gICAgICAgIHJldHVybiBjb250ZXh0LmNyZWF0ZUhhbmRsZXJUdWJlKGhlYWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBUdWJlIGNyZWF0ZVNlcnZlcihTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR1YmUgaGVhZCA9IGNvbnRleHQuZ2V0VGVybWluYWxUdWJlKCk7Ci0gICAgICAgIC8vIG5vIEpBWC1XUyBKUkUgc2VydmVyIHN1cHBvcnQKLSAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlSGFuZGxlclR1YmUoaGVhZCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZU1vbml0b3JpbmdUdWJlKGhlYWQpOwotICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVTZXJ2ZXJNVVR1YmUoaGVhZCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVdzYVR1YmUoaGVhZCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVNlY3VyaXR5VHViZShoZWFkKTsKLQotICAgICAgICByZXR1cm4gaGVhZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3R1YmUvT3BlbkNNSVNKcmVUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9PcGVuQ01JU0pyZVR1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDY3ZTBhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9PcGVuQ01JU0pyZVR1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC50dWJlOwotCi1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLkJpbmRpbmdJRDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlckZhY3Rvcnk7Ci0KLS8qKgotICogQXNzZW1ibGVyIEZhY3RvcnkgZm9yIE9wZW5DTUlTIGNsaWVudCBhbmQgc2VydmVyIHR1YmVsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5DTUlTSnJlVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5IGV4dGVuZHMgVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUdWJlbGluZUFzc2VtYmxlciBkb0NyZWF0ZShCaW5kaW5nSUQgYmluZGluZ0lEKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT3BlbkNNSVNKcmVUdWJlQXNzZW1ibGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL09wZW5DTUlTVHViZUFzc2VtYmxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL09wZW5DTUlTVHViZUFzc2VtYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2IxNzBiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9PcGVuQ01JU1R1YmVBc3NlbWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC50dWJlLmNsaWVudC5Xc3NNVVR1YmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnR1YmUuc2VydmVyLldzc1R1YmU7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5DbGllbnRUdWJlQXNzZW1ibGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5TZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5UdWJlOwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5waXBlLlR1YmVsaW5lQXNzZW1ibGVyOwotCi0vKioKLSAqIEFzc2VtYmxlciBmb3IgT3BlbkNNSVMgY2xpZW50IGFuZCBzZXJ2ZXIgdHViZWxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkNNSVNUdWJlQXNzZW1ibGVyIGltcGxlbWVudHMgVHViZWxpbmVBc3NlbWJsZXIgewotCi0gICAgcHVibGljIFR1YmUgY3JlYXRlQ2xpZW50KENsaWVudFR1YmVBc3NlbWJsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHViZSBoZWFkID0gY29udGV4dC5jcmVhdGVUcmFuc3BvcnRUdWJlKCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVNlY3VyaXR5VHViZShoZWFkKTsKLSAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlV3NhVHViZShoZWFkKTsKLSAgICAgICAgaGVhZCA9IG5ldyBXc3NNVVR1YmUoY29udGV4dC5nZXRCaW5kaW5nKCksIGhlYWQpOwotCi0gICAgICAgIHJldHVybiBjb250ZXh0LmNyZWF0ZUhhbmRsZXJUdWJlKGhlYWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBUdWJlIGNyZWF0ZVNlcnZlcihTZXJ2ZXJUdWJlQXNzZW1ibGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR1YmUgaGVhZCA9IGNvbnRleHQuZ2V0VGVybWluYWxUdWJlKCk7Ci0gICAgICAgIGhlYWQgPSBuZXcgV3NzVHViZShoZWFkKTsKLSAgICAgICAgaGVhZCA9IGNvbnRleHQuY3JlYXRlSGFuZGxlclR1YmUoaGVhZCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZU1vbml0b3JpbmdUdWJlKGhlYWQpOwotICAgICAgICBoZWFkID0gY29udGV4dC5jcmVhdGVTZXJ2ZXJNVVR1YmUoaGVhZCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVdzYVR1YmUoaGVhZCk7Ci0gICAgICAgIGhlYWQgPSBjb250ZXh0LmNyZWF0ZVNlY3VyaXR5VHViZShoZWFkKTsKLQotICAgICAgICByZXR1cm4gaGVhZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3R1YmUvT3BlbkNNSVNUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9PcGVuQ01JU1R1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNlZTdhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9PcGVuQ01JU1R1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC50dWJlOwotCi1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLkJpbmRpbmdJRDsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlcjsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlckZhY3Rvcnk7Ci0KLS8qKgotICogQXNzZW1ibGVyIEZhY3RvcnkgZm9yIE9wZW5DTUlTIGNsaWVudCBhbmQgc2VydmVyIHR1YmVsaW5lcy4KLSAqLwotcHVibGljIGNsYXNzIE9wZW5DTUlTVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5IGV4dGVuZHMgVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUdWJlbGluZUFzc2VtYmxlciBkb0NyZWF0ZShCaW5kaW5nSUQgYmluZGluZ0lEKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT3BlbkNNSVNUdWJlQXNzZW1ibGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL2NsaWVudC9KcmVXc3NNVVR1YmUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9jbGllbnQvSnJlV3NzTVVUdWJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTkyMjUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC90dWJlL2NsaWVudC9KcmVXc3NNVVR1YmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZS5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25uZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZS5BYnN0cmFjdEpyZVdzc1R1YmU7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkuU09BUFZlcnNpb247Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLldTQmluZGluZzsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyTGlzdDsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlOwotaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7Ci0KLXB1YmxpYyBjbGFzcyBKcmVXc3NNVVR1YmUgZXh0ZW5kcyBBYnN0cmFjdEpyZVdzc1R1YmUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKLQotICAgIHB1YmxpYyBKcmVXc3NNVVR1YmUoV1NCaW5kaW5nIGJpbmRpbmcsIFR1YmUgbmV4dCkgewotICAgICAgICBzdXBlcihuZXh0KTsKLSAgICAgICAgc29hcFZlcnNpb24gPSBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEpyZVdzc01VVHViZShKcmVXc3NNVVR1YmUgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKLSAgICAgICAgc3VwZXIodGhhdCwgY2xvbmVyKTsKLSAgICAgICAgc29hcFZlcnNpb24gPSB0aGF0LnNvYXBWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBKcmVXc3NNVVR1YmUgY29weShUdWJlQ2xvbmVyIGNsb25lcikgewotICAgICAgICByZXR1cm4gbmV3IEpyZVdzc01VVHViZSh0aGlzLCBjbG9uZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NSZXNwb25zZShQYWNrZXQgcmVzcG9uc2UpIHsKLSAgICAgICAgaWYgKHJlc3BvbnNlLmdldE1lc3NhZ2UoKSA9PSBudWxsIHx8ICFyZXNwb25zZS5nZXRNZXNzYWdlKCkuaGFzSGVhZGVycygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBoZWFkZXJzT2JqZWN0ID0gcmVzcG9uc2UuZ2V0TWVzc2FnZSgpLmdldEhlYWRlcnMoKTsKLQotICAgICAgICBpZiAoaGVhZGVyc09iamVjdCBpbnN0YW5jZW9mIEhlYWRlckxpc3QpIHsKLSAgICAgICAgICAgIEhlYWRlckxpc3QgaGVhZGVycyA9IChIZWFkZXJMaXN0KSBoZWFkZXJzT2JqZWN0OwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMuaXNVbmRlcnN0b29kKGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSBoZWFkZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWFkZXIuaXNJZ25vcmFibGUoc29hcFZlcnNpb24sIHNvYXBWZXJzaW9uLmltcGxpY2l0Um9sZVNldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKGhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwgaGVhZGVyLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU1NFLmVxdWFscyhxTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NlY3VyaXR5SGVhZGVyKGhlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiTXVzdFVuZGVyc3RhbmQgaGVhZGVyIGlzIG5vdCB1bmRlcnN0b29kOiAiICsgcU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXRob2QgbSA9IGhlYWRlcnNPYmplY3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInVuZGVyc3Rvb2QiLCBRTmFtZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgbS5pbnZva2UoaGVhZGVyc09iamVjdCwgV1NTRSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IG1hcmsgV1NTRSBoZWFkZXIgYXMgdW5kZXJzdG9vZC4iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1NlY3VyaXR5SGVhZGVyKEhlYWRlciBoZWFkZXIpIHsKLSAgICAgICAgLy8gVE9ETwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9jbGllbnQvV3NzTVVUdWJlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3R1YmUvY2xpZW50L1dzc01VVHViZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUwZDI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9jbGllbnQvV3NzTVVUdWJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnR1YmUuY2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZS5BYnN0cmFjdFdzc1R1YmU7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkuU09BUFZlcnNpb247Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLldTQmluZGluZzsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkubWVzc2FnZS5IZWFkZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLm1lc3NhZ2UuSGVhZGVyTGlzdDsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5UdWJlOwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7Ci0KLXB1YmxpYyBjbGFzcyBXc3NNVVR1YmUgZXh0ZW5kcyBBYnN0cmFjdFdzc1R1YmUgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTT0FQVmVyc2lvbiBzb2FwVmVyc2lvbjsKLQotICAgIHB1YmxpYyBXc3NNVVR1YmUoV1NCaW5kaW5nIGJpbmRpbmcsIFR1YmUgbmV4dCkgewotICAgICAgICBzdXBlcihuZXh0KTsKLSAgICAgICAgc29hcFZlcnNpb24gPSBiaW5kaW5nLmdldFNPQVBWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFdzc01VVHViZShXc3NNVVR1YmUgdGhhdCwgVHViZUNsb25lciBjbG9uZXIpIHsKLSAgICAgICAgc3VwZXIodGhhdCwgY2xvbmVyKTsKLSAgICAgICAgc29hcFZlcnNpb24gPSB0aGF0LnNvYXBWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBXc3NNVVR1YmUgY29weShUdWJlQ2xvbmVyIGNsb25lcikgewotICAgICAgICByZXR1cm4gbmV3IFdzc01VVHViZSh0aGlzLCBjbG9uZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBOZXh0QWN0aW9uIHByb2Nlc3NSZXNwb25zZShQYWNrZXQgcmVzcG9uc2UpIHsKLSAgICAgICAgaWYgKHJlc3BvbnNlLmdldE1lc3NhZ2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhlYWRlckxpc3QgaGVhZGVycyA9IHJlc3BvbnNlLmdldE1lc3NhZ2UoKS5nZXRIZWFkZXJzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWhlYWRlcnMuaXNVbmRlcnN0b29kKGkpKSB7Ci0gICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IGhlYWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICghaGVhZGVyLmlzSWdub3JhYmxlKHNvYXBWZXJzaW9uLCBzb2FwVmVyc2lvbi5pbXBsaWNpdFJvbGVTZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKGhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwgaGVhZGVyLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdTU0UuZXF1YWxzKHFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTZWN1cml0eUhlYWRlcihoZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25uZWN0aW9uRXhjZXB0aW9uKCJNdXN0VW5kZXJzdGFuZCBoZWFkZXIgaXMgbm90IHVuZGVyc3Rvb2Q6ICIgKyBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tTZWN1cml0eUhlYWRlcihIZWFkZXIgaGVhZGVyKSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3R1YmUvc2VydmVyL1dzc1R1YmUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9zZXJ2ZXIvV3NzVHViZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWMwZTNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvdHViZS9zZXJ2ZXIvV3NzVHViZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC50dWJlLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnR1YmUuQWJzdHJhY3RXc3NUdWJlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5tZXNzYWdlLkhlYWRlcnM7Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkubWVzc2FnZS5QYWNrZXQ7Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLnBpcGUuTmV4dEFjdGlvbjsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkucGlwZS5UdWJlOwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5waXBlLlR1YmVDbG9uZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLnBpcGUuaGVscGVyLkFic3RyYWN0RmlsdGVyVHViZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXc3NUdWJlIGV4dGVuZHMgQWJzdHJhY3RXc3NUdWJlIHsKLQotICAgIHB1YmxpYyBXc3NUdWJlKFR1YmUgbmV4dCkgewotICAgICAgICBzdXBlcihuZXh0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgV3NzVHViZShBYnN0cmFjdEZpbHRlclR1YmVJbXBsIHRoYXQsIFR1YmVDbG9uZXIgY2xvbmVyKSB7Ci0gICAgICAgIHN1cGVyKHRoYXQsIGNsb25lcik7Ci0gICAgfQotCi0gICAgcHVibGljIFdzc1R1YmUgY29weShUdWJlQ2xvbmVyIGNsb25lcikgewotICAgICAgICByZXR1cm4gbmV3IFdzc1R1YmUodGhpcywgY2xvbmVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTmV4dEFjdGlvbiBwcm9jZXNzUmVzcG9uc2UoUGFja2V0IHBhY2tldCkgewotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBwYWNrZXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1Jlc3BvbnNlKHBhY2tldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBjcmVhdGVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBsb25nIGV4cGlyZXMgPSBjcmVhdGVkICsgMjQgKiA2MCAqIDYwICogMTAwMDsgLy8gMjQgaG91cnMKLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlscy5uZXdEb21Eb2N1bWVudCgpOwotCi0gICAgICAgICAgICBFbGVtZW50IHdzc2VTZWN1cml0eUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoV1NTRV9OQU1FU1BBQ0UsICJTZWN1cml0eSIpOwotCi0gICAgICAgICAgICBFbGVtZW50IHdzdVRpbWVzdGFtcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoV1NVX05BTUVTUEFDRSwgIlRpbWVzdGFtcCIpOwotICAgICAgICAgICAgd3NzZVNlY3VyaXR5RWxlbWVudC5hcHBlbmRDaGlsZCh3c3VUaW1lc3RhbXBFbGVtZW50KTsKLQotICAgICAgICAgICAgRWxlbWVudCB0c0NyZWF0ZWRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFdTVV9OQU1FU1BBQ0UsICJDcmVhdGVkIik7Ci0gICAgICAgICAgICB0c0NyZWF0ZWRFbGVtZW50LnNldFRleHRDb250ZW50KERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKGNyZWF0ZWQpKTsKLSAgICAgICAgICAgIHdzdVRpbWVzdGFtcEVsZW1lbnQuYXBwZW5kQ2hpbGQodHNDcmVhdGVkRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgdHNFeHBpcmVzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhXU1VfTkFNRVNQQUNFLCAiRXhwaXJlcyIpOwotICAgICAgICAgICAgdHNFeHBpcmVzRWxlbWVudC5zZXRUZXh0Q29udGVudChEYXRlVGltZUhlbHBlci5mb3JtYXRYbWxEYXRlVGltZShleHBpcmVzKSk7Ci0gICAgICAgICAgICB3c3VUaW1lc3RhbXBFbGVtZW50LmFwcGVuZENoaWxkKHRzRXhwaXJlc0VsZW1lbnQpOwotCi0gICAgICAgICAgICBIZWFkZXJMaXN0IGhlYWRlcnMgPSBtZXNzYWdlLmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgIGhlYWRlcnMuYWRkKEhlYWRlcnMuY3JlYXRlKHdzc2VTZWN1cml0eUVsZW1lbnQpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDcmVhdGluZyBTT0FQIGhlYWRlciBmYWlsZWQhIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc1Jlc3BvbnNlKHBhY2tldCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzg4ZWI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotT3BlbkNNSVMgQ29tbW9ucyBJbXBsZW1lbnRhdGlvbgotQ29weXJpZ2h0IDIwMDktMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotCi1PcGVuQ01JUyBjb250YWlucyBjb2RlIGZyb20gdGhlIGZvbGxvd2luZyBPcGVuIFNvdXJjZSBwcm9qZWN0czoKLQotLSBCYXNlNjQgCi0gIENvcHlyaWdodCAoYykgMjAxMCBSb2JlcnQgSGFyZGVyCi0gIFB1YmxpYyBEb21haW4sIDxodHRwOi8vaWhhcmRlci5uZXQvYmFzZTY0PgotCi0tIEpTT04uc2ltcGxlCi0gIENvcHlyaWdodCAoYykgMjAxMiBZaWRvbmcgRmFuZwotICBBcGFjaGUgTGljZW5zZSAyLjAsIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPgotICAKLSAgCi1PcGVuQ01JUyBjb250YWlucyBPQVNJUyBDTUlTIDEuMCBhbmQgQ01JUyAxLjEgc2NoZW1hIGFuZCBXU0RMIGZpbGVzLgotQ29weXJpZ2h0IChjKSAyMDEwIGFuZCAyMDEzIE9BU0lTIE9wZW4KLTxodHRwczovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2NtaXM+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9taW1lLnR5cGVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWltZS50eXBlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3MjdjMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9taW1lLnR5cGVzCisrKyAvZGV2L251bGwKQEAgLTEsOTMwICswLDAgQEAKLWFwcGxpY2F0aW9uL2FuZHJldy1pbnNldCBlegotYXBwbGljYXRpb24vYW5ub2RleCBhbngKLWFwcGxpY2F0aW9uL2FwcGxpeHdhcmUgYXcKLWFwcGxpY2F0aW9uL2F0b20reG1sIGF0b20KLWFwcGxpY2F0aW9uL2F0b21jYXQreG1sIGF0b21jYXQKLWFwcGxpY2F0aW9uL2F0b21zZXJ2K3htbCBhdG9tc3J2Ci1hcHBsaWNhdGlvbi9hdG9tc3ZjK3htbCBhdG9tc3ZjCi1hcHBsaWNhdGlvbi9iYm9saW4gbGluCi1hcHBsaWNhdGlvbi9jY3htbCt4bWwgY2N4bWwKLWFwcGxpY2F0aW9uL2NkbWktY2FwYWJpbGl0eSBjZG1pYQotYXBwbGljYXRpb24vY2RtaS1jb250YWluZXIgY2RtaWMKLWFwcGxpY2F0aW9uL2NkbWktZG9tYWluIGNkbWlkCi1hcHBsaWNhdGlvbi9jZG1pLW9iamVjdCBjZG1pbwotYXBwbGljYXRpb24vY2RtaS1xdWV1ZSBjZG1pcQotYXBwbGljYXRpb24vY3Utc2VlbWUgY3UKLWFwcGxpY2F0aW9uL2Rhdm1vdW50K3htbCBkYXZtb3VudAotYXBwbGljYXRpb24vZGljb20gZGNtCi1hcHBsaWNhdGlvbi9kb2Nib29rK3htbCBkYmsKLWFwcGxpY2F0aW9uL2RzcHR5cGUgdHNwCi1hcHBsaWNhdGlvbi9kc3NjK2RlciBkc3NjCi1hcHBsaWNhdGlvbi9kc3NjK3htbCB4ZHNzYwotYXBwbGljYXRpb24vZWNtYXNjcmlwdCBlY21hCi1hcHBsaWNhdGlvbi9lbW1hK3htbCBlbW1hCi1hcHBsaWNhdGlvbi9lbnZveSBldnkKLWFwcGxpY2F0aW9uL2VwdWIremlwIGVwdWIKLWFwcGxpY2F0aW9uL2V4aSBleGkKLWFwcGxpY2F0aW9uL2ZvbnQtdGRwZnIgcGZyCi1hcHBsaWNhdGlvbi9mb250LXdvZmYgd29mZgotYXBwbGljYXRpb24vZnJhY3RhbHMgZmlmCi1hcHBsaWNhdGlvbi9mdXR1cmVzcGxhc2ggc3BsCi1hcHBsaWNhdGlvbi9nbWwreG1sIGdtbAotYXBwbGljYXRpb24vZ3B4K3htbCBncHgKLWFwcGxpY2F0aW9uL2d4ZiBneGYKLWFwcGxpY2F0aW9uL2h0YSBodGEKLWFwcGxpY2F0aW9uL2h5cGVyc3R1ZGlvIHN0awotYXBwbGljYXRpb24vaW5rbWwreG1sIGluayBpbmttbAotYXBwbGljYXRpb24vaXBmaXggaXBmaXgKLWFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZSBqYXIgd2FyIGVhciAKLWFwcGxpY2F0aW9uL2phdmEtc2VyaWFsaXplZC1vYmplY3Qgc2VyCi1hcHBsaWNhdGlvbi9qYXZhLXZtIGNsYXNzCi1hcHBsaWNhdGlvbi9qYXZhc2NyaXB0IGpzCi1hcHBsaWNhdGlvbi9qc29uIGpzb24KLWFwcGxpY2F0aW9uL2pzb25tbCtqc29uIGpzb25tbAotYXBwbGljYXRpb24vbG9zdCt4bWwgbG9zdHhtbAotYXBwbGljYXRpb24vbTNnIG0zZwotYXBwbGljYXRpb24vbWFjLWJpbmhleDQwIGhxeAotYXBwbGljYXRpb24vbWFkcyt4bWwgbWFkcwotYXBwbGljYXRpb24vbWFyYyBtcmMKLWFwcGxpY2F0aW9uL21hcmN4bWwreG1sIG1yY3gKLWFwcGxpY2F0aW9uL21hdGhlbWF0aWNhIG1hIG5iIG1iCi1hcHBsaWNhdGlvbi9tYXRobWwreG1sIG1hdGhtbAotYXBwbGljYXRpb24vbWJveCBtYm94Ci1hcHBsaWNhdGlvbi9tZWRpYXNlcnZlcmNvbnRyb2wreG1sIG1zY21sCi1hcHBsaWNhdGlvbi9tZXRhbGluayt4bWwgbWV0YWxpbmsKLWFwcGxpY2F0aW9uL21ldGFsaW5rNCt4bWwgbWV0YTQKLWFwcGxpY2F0aW9uL21ldHMreG1sIG1ldHMKLWFwcGxpY2F0aW9uL21vZHMreG1sIG1vZHMKLWFwcGxpY2F0aW9uL21wMjEgbTIxIG1wMjEKLWFwcGxpY2F0aW9uL21wNCBtcDRzCi1hcHBsaWNhdGlvbi9tc3dvcmQgZG9jIGRvdAotYXBwbGljYXRpb24vbXhmIG14ZgotYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIGJpbiBscmYgbWFyIHNvIGRpc3QgZGlzdHogcGtnIGJwayBkdW1wIGVsYyBkZXBsb3kKLWFwcGxpY2F0aW9uL29kYSBvZGEKLWFwcGxpY2F0aW9uL29lYnBzLXBhY2thZ2UreG1sIG9wZgotYXBwbGljYXRpb24vb2dnIG9neAotYXBwbGljYXRpb24vb2xlc2NyaXB0IGF4cwotYXBwbGljYXRpb24vb21kb2MreG1sIG9tZG9jCi1hcHBsaWNhdGlvbi9vbmVub3RlIG9uZXRvYyBvbmV0bXAgb25ldG9jMiBvbmVwa2cKLWFwcGxpY2F0aW9uL294cHMgb3hwcwotYXBwbGljYXRpb24vcGF0Y2gtb3BzLWVycm9yK3htbCB4ZXIKLWFwcGxpY2F0aW9uL3BkZiBwZGYKLWFwcGxpY2F0aW9uL3BncC1lbmNyeXB0ZWQgcGdwCi1hcHBsaWNhdGlvbi9wZ3Ata2V5cyBrZXkKLWFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUgYXNjIHNpZwotYXBwbGljYXRpb24vcGljcy1ydWxlcyBwcmYKLWFwcGxpY2F0aW9uL3BrY3MxMCBwMTAKLWFwcGxpY2F0aW9uL3BrY3M3LW1pbWUgcDdtIHA3YwotYXBwbGljYXRpb24vcGtjczctc2lnbmF0dXJlIHA3cwotYXBwbGljYXRpb24vcGtjczggcDgKLWFwcGxpY2F0aW9uL3BraXgtYXR0ci1jZXJ0IGFjCi1hcHBsaWNhdGlvbi9wa2l4LXBraXBhdGggcGtpcGF0aAotYXBwbGljYXRpb24vcGtpeGNtcCBwa2kKLWFwcGxpY2F0aW9uL3Bscyt4bWwgcGxzCi1hcHBsaWNhdGlvbi9wb3N0c2NyaXB0IHBzIGFpIGVwcyBlcHNmIGVwc2kgZXBzMyBlcHMyCi1hcHBsaWNhdGlvbi9wcnMuY3d3IGN3dwotYXBwbGljYXRpb24vcHNrYyt4bWwgcHNrY3htbAotYXBwbGljYXRpb24vcmRmK3htbCByZGYKLWFwcGxpY2F0aW9uL3JlZ2luZm8reG1sIHJpZgotYXBwbGljYXRpb24vcmVsYXgtbmctY29tcGFjdC1zeW50YXggcm5jCi1hcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cy1kaWZmK3htbCBybGQKLWFwcGxpY2F0aW9uL3Jlc291cmNlLWxpc3RzK3htbCBybAotYXBwbGljYXRpb24vcmxzLXNlcnZpY2VzK3htbCBycwotYXBwbGljYXRpb24vcnBraS1naG9zdGJ1c3RlcnMgZ2JyCi1hcHBsaWNhdGlvbi9ycGtpLW1hbmlmZXN0IG1mdAotYXBwbGljYXRpb24vcnBraS1yb2Egcm9hCi1hcHBsaWNhdGlvbi9yc2QreG1sIHJzZAotYXBwbGljYXRpb24vcnNzK3htbCByc3MKLWFwcGxpY2F0aW9uL3J0ZiBydGYKLWFwcGxpY2F0aW9uL3NibWwreG1sIHNibWwKLWFwcGxpY2F0aW9uL3NjdnAtY3YtcmVxdWVzdCBzY3EKLWFwcGxpY2F0aW9uL3NjdnAtY3YtcmVzcG9uc2Ugc2NzCi1hcHBsaWNhdGlvbi9zY3ZwLXZwLXJlcXVlc3Qgc3BxCi1hcHBsaWNhdGlvbi9zY3ZwLXZwLXJlc3BvbnNlIHNwcAotYXBwbGljYXRpb24vc2RwIHNkcAotYXBwbGljYXRpb24vc2V0LXBheW1lbnQtaW5pdGlhdGlvbiBzZXRwYXkKLWFwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24taW5pdGlhdGlvbiBzZXRyZWcKLWFwcGxpY2F0aW9uL3NoZit4bWwgc2hmCi1hcHBsaWNhdGlvbi9zbGEgc3RsCi1hcHBsaWNhdGlvbi9zbWlsIHNtaSBzbWlsCi1hcHBsaWNhdGlvbi9zcGFycWwtcXVlcnkgcnEKLWFwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbCBzcngKLWFwcGxpY2F0aW9uL3NyZ3MgZ3JhbQotYXBwbGljYXRpb24vc3Jncyt4bWwgZ3J4bWwKLWFwcGxpY2F0aW9uL3NydSt4bWwgc3J1Ci1hcHBsaWNhdGlvbi9zc2RsK3htbCBzc2RsCi1hcHBsaWNhdGlvbi9zc21sK3htbCBzc21sCi1hcHBsaWNhdGlvbi90ZWkreG1sIHRlaSB0ZWljb3JwdXMKLWFwcGxpY2F0aW9uL3RocmF1ZCt4bWwgdGZpCi1hcHBsaWNhdGlvbi90aW1lc3RhbXBlZC1kYXRhIHRzZAotYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LWxhcmdlIHBsYgotYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXNtYWxsIHBzYgotYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXZhciBwdmIKLWFwcGxpY2F0aW9uL3ZuZC4zZ3BwMi50Y2FwIHRjYXAKLWFwcGxpY2F0aW9uL3ZuZC4zbS5wb3N0LWl0LW5vdGVzIHB3bgotYXBwbGljYXRpb24vdm5kLmFjdWNvYm9sIGFjdQotYXBwbGljYXRpb24vdm5kLmFjdWNvcnAgYXRjIGFjdXRjCi1hcHBsaWNhdGlvbi92bmQuYWRvYmUuYWlyLWFwcGxpY2F0aW9uLWluc3RhbGxlci1wYWNrYWdlK3ppcCBhaXIKLWFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5mb3Jtc2NlbnRyYWwuZmNkdCBmY2R0Ci1hcHBsaWNhdGlvbi92bmQuYWRvYmUuZnhwIGZ4cCBmeHBsCi1hcHBsaWNhdGlvbi92bmQuYWRvYmUueGRwK3htbCB4ZHAKLWFwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZmRmIHhmZGYKLWFwcGxpY2F0aW9uL3ZuZC5haGVhZC5zcGFjZSBhaGVhZAotYXBwbGljYXRpb24vdm5kLmFpcnppcC5maWxlc2VjdXJlLmF6ZiBhemYKLWFwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5henMgYXpzCi1hcHBsaWNhdGlvbi92bmQuYW1hem9uLmVib29rIGF6dwotYXBwbGljYXRpb24vdm5kLmFtZXJpY2FuZHluYW1pY3MuYWNjIGFjYwotYXBwbGljYXRpb24vdm5kLmFtaWdhLmFtaSBhbWkKLWFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZSBhcGsKLWFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItY2VydGlmaWNhdGUtaXNzdWUtaW5pdGlhdGlvbiBjaWkKLWFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItZnVuZHMtdHJhbnNmZXItaW5pdGlhdGlvbiBmdGkKLWFwcGxpY2F0aW9uL3ZuZC5hbnRpeC5nYW1lLWNvbXBvbmVudCBhdHgKLWFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pbnN0YWxsZXIreG1sIG1wa2cKLWFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5rZXlub3RlIGtleQotYXBwbGljYXRpb24vdm5kLmFwcGxlLm1wZWd1cmwgbTN1OAotYXBwbGljYXRpb24vdm5kLmFwcGxlLm51bWJlcnMgbnVtYmVycwotYXBwbGljYXRpb24vdm5kLmFwcGxlLnBhZ2VzIHBhZ2VzCi1hcHBsaWNhdGlvbi92bmQuYXJhc3RyYS5zd2kgc3dpCi1hcHBsaWNhdGlvbi92bmQuYXJpc3RhbmV0d29ya3Muc3dpIHN3aQotYXBwbGljYXRpb24vdm5kLmFzdHJhZWEtc29mdHdhcmUuaW90YSBpb3RhCi1hcHBsaWNhdGlvbi92bmQuYXVkaW9ncmFwaCBhZXAKLWFwcGxpY2F0aW9uL3ZuZC5ibHVlaWNlLm11bHRpcGFzcyBtcG0KLWFwcGxpY2F0aW9uL3ZuZC5ibWkgYm1pCi1hcHBsaWNhdGlvbi92bmQuYnVzaW5lc3NvYmplY3RzIHJlcAotYXBwbGljYXRpb24vdm5kLmNoZW1kcmF3K3htbCBjZHhtbAotYXBwbGljYXRpb24vdm5kLmNoaXBudXRzLmthcmFva2UtbW1kIG1tZAotYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGEgY2R5Ci1hcHBsaWNhdGlvbi92bmQuY2xheW1vcmUgY2xhCi1hcHBsaWNhdGlvbi92bmQuY2xvYW50by5ycDkgcnA5Ci1hcHBsaWNhdGlvbi92bmQuY2xvbmsuYzRncm91cCBjNGcgYzRkIGM0ZiBjNHAgYzR1Ci1hcHBsaWNhdGlvbi92bmQuY2x1ZXRydXN0LmNhcnRvbW9iaWxlLWNvbmZpZyBjMTFhbWMKLWFwcGxpY2F0aW9uL3ZuZC5jbHVldHJ1c3QuY2FydG9tb2JpbGUtY29uZmlnLXBrZyBjMTFhbXoKLWFwcGxpY2F0aW9uL3ZuZC5jb21tb25zcGFjZSBjc3AKLWFwcGxpY2F0aW9uL3ZuZC5jb250YWN0LmNtc2cgY2RiY21zZwotYXBwbGljYXRpb24vdm5kLmNvc21vY2FsbGVyIGNtYwotYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIgY2xreAotYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIua2V5Ym9hcmQgY2xrawotYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIucGFsZXR0ZSBjbGtwCi1hcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci50ZW1wbGF0ZSBjbGt0Ci1hcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci53b3JkYmFuayBjbGt3Ci1hcHBsaWNhdGlvbi92bmQuY3JpdGljYWx0b29scy53YnMreG1sIHdicwotYXBwbGljYXRpb24vdm5kLmN0Yy1wb3NtbCBwbWwKLWFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBwZCBwcGQKLWFwcGxpY2F0aW9uL3ZuZC5jdXJsLmNhciBjYXIKLWFwcGxpY2F0aW9uL3ZuZC5jdXJsLnBjdXJsIHBjdXJsCi1hcHBsaWNhdGlvbi92bmQuZGFydCBkYXJ0Ci1hcHBsaWNhdGlvbi92bmQuZGF0YS12aXNpb24ucmR6IHJkegotYXBwbGljYXRpb24vdm5kLmRlY2UuZGF0YSB1dmYgdXZ2ZiB1dmQgdXZ2ZAotYXBwbGljYXRpb24vdm5kLmRlY2UudHRtbCt4bWwgdXZ0IHV2dnQKLWFwcGxpY2F0aW9uL3ZuZC5kZWNlLnVuc3BlY2lmaWVkIHV2eCB1dnZ4Ci1hcHBsaWNhdGlvbi92bmQuZGVjZS56aXAgdXZ6IHV2dnoKLWFwcGxpY2F0aW9uL3ZuZC5kZW5vdm8uZmNzZWxheW91dC1saW5rIGZlX2xhdW5jaAotYXBwbGljYXRpb24vdm5kLmRuYSBkbmEKLWFwcGxpY2F0aW9uL3ZuZC5kb2xieS5tbHAgbWxwCi1hcHBsaWNhdGlvbi92bmQuZHBncmFwaCBkcGcKLWFwcGxpY2F0aW9uL3ZuZC5kcmVhbWZhY3RvcnkgZGZhYwotYXBwbGljYXRpb24vdm5kLmRzLWtleXBvaW50IGtweHgKLWFwcGxpY2F0aW9uL3ZuZC5kdmIuYWl0IGFpdAotYXBwbGljYXRpb24vdm5kLmR2Yi5zZXJ2aWNlIHN2YwotYXBwbGljYXRpb24vdm5kLmR5bmFnZW8gZ2VvCi1hcHBsaWNhdGlvbi92bmQuZWNvd2luLmNoYXJ0IG1hZwotYXBwbGljYXRpb24vdm5kLmVubGl2ZW4gbm1sCi1hcHBsaWNhdGlvbi92bmQuZXBzb24uZXNmIGVzZgotYXBwbGljYXRpb24vdm5kLmVwc29uLm1zZiBtc2YKLWFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5xdWlja2FuaW1lIHFhbQotYXBwbGljYXRpb24vdm5kLmVwc29uLnNhbHQgc2x0Ci1hcHBsaWNhdGlvbi92bmQuZXBzb24uc3NmIHNzZgotYXBwbGljYXRpb24vdm5kLmVzemlnbm8zK3htbCBlczMgZXQzCi1hcHBsaWNhdGlvbi92bmQuZXpwaXgtYWxidW0gZXoyCi1hcHBsaWNhdGlvbi92bmQuZXpwaXgtcGFja2FnZSBlejMKLWFwcGxpY2F0aW9uL3ZuZC5mZGYgZmRmCi1hcHBsaWNhdGlvbi92bmQuZmRzbi5tc2VlZCBtc2VlZAotYXBwbGljYXRpb24vdm5kLmZkc24uc2VlZCBzZWVkIGRhdGFsZXNzCi1hcHBsaWNhdGlvbi92bmQuZmxvZ3JhcGhpdCBncGgKLWFwcGxpY2F0aW9uL3ZuZC5mbHV4dGltZS5jbGlwIGZ0YwotYXBwbGljYXRpb24vdm5kLmZyYW1lbWFrZXIgZm0gbWFrZXIgYm9vayBmcmFtZQotYXBwbGljYXRpb24vdm5kLmZyb2dhbnMuZm5jIGZuYwotYXBwbGljYXRpb24vdm5kLmZyb2dhbnMubHRmIGx0ZgotYXBwbGljYXRpb24vdm5kLmZzYy53ZWJsYXVuY2ggZnNjCi1hcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5cyBvYXMKLWFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMiBvYTIKLWFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMyBvYTMKLWFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3AgZmc1Ci1hcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c3BycyBiaDIKLWFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkIGRkZAotYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MgeGR3Ci1hcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5iaW5kZXIgeGJkCi1hcHBsaWNhdGlvbi92bmQuZnV6enlzaGVldCBmenMKLWFwcGxpY2F0aW9uL3ZuZC5nZW5vbWF0aXgudHV4ZWRvIHR4ZAotYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGUgZ2diCi1hcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEudG9vbCBnZ3QKLWFwcGxpY2F0aW9uL3ZuZC5nZW9tZXRyeS1leHBsb3JlciBnZXggZ3JlCi1hcHBsaWNhdGlvbi92bmQuZ2VvbmV4dCBneHQKLWFwcGxpY2F0aW9uL3ZuZC5nZW9wbGFuIGcydwotYXBwbGljYXRpb24vdm5kLmdlb3NwYWNlIGczdwotYXBwbGljYXRpb24vdm5kLmdteCBnbXgKLWFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua21sK3htbCBrbWwKLWFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua216IGttegotYXBwbGljYXRpb24vdm5kLmdyYWZlcSBncWYgZ3FzCi1hcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWFjY291bnQgZ2FjCi1hcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWhlbHAgZ2hmCi1hcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWlkZW50aXR5LW1lc3NhZ2UgZ2ltCi1hcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWluamVjdG9yIGdydgotYXBwbGljYXRpb24vdm5kLmdyb292ZS10b29sLW1lc3NhZ2UgZ3RtCi1hcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtdGVtcGxhdGUgdHBsCi1hcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXZjYXJkIHZjZwotYXBwbGljYXRpb24vdm5kLmhhbCt4bWwgaGFsCi1hcHBsaWNhdGlvbi92bmQuaGFuZGhlbGQtZW50ZXJ0YWlubWVudCt4bWwgem1tCi1hcHBsaWNhdGlvbi92bmQuaGJjaSBoYmNpCi1hcHBsaWNhdGlvbi92bmQuaGhlLmxlc3Nvbi1wbGF5ZXIgbGVzCi1hcHBsaWNhdGlvbi92bmQuaHAtaHBnbCBocGdsCi1hcHBsaWNhdGlvbi92bmQuaHAtaHBpZCBocGlkCi1hcHBsaWNhdGlvbi92bmQuaHAtaHBzIGhwcwotYXBwbGljYXRpb24vdm5kLmhwLWpseXQgamx0Ci1hcHBsaWNhdGlvbi92bmQuaHAtcGNsIHBjbAotYXBwbGljYXRpb24vdm5kLmhwLXBjbHhsIHBjbHhsCi1hcHBsaWNhdGlvbi92bmQuaHlkcm9zdGF0aXguc29mLWRhdGEgc2ZkLWhkc3R4Ci1hcHBsaWNhdGlvbi92bmQuaWJtLm1pbmlwYXkgbXB5Ci1hcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcCBhZnAgbGlzdGFmcCBsaXN0MzgyMAotYXBwbGljYXRpb24vdm5kLmlibS5yaWdodHMtbWFuYWdlbWVudCBpcm0KLWFwcGxpY2F0aW9uL3ZuZC5pYm0uc2VjdXJlLWNvbnRhaW5lciBzYwotYXBwbGljYXRpb24vdm5kLmljY3Byb2ZpbGUgaWNjIGljbQotYXBwbGljYXRpb24vdm5kLmlnbG9hZGVyIGlnbAotYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2cCBpdnAKLWFwcGxpY2F0aW9uL3ZuZC5pbW1lcnZpc2lvbi1pdnUgaXZ1Ci1hcHBsaWNhdGlvbi92bmQuaW5zb3JzLmlnbSBpZ20KLWFwcGxpY2F0aW9uL3ZuZC5pbnRlcmNvbi5mb3JtbmV0IHhwdyB4cHgKLWFwcGxpY2F0aW9uL3ZuZC5pbnRlcmdlbyBpMmcKLWFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFibyBxYm8KLWFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFmeCBxZngKLWFwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGUgcmNwcm9maWxlCi1hcHBsaWNhdGlvbi92bmQuaXJlcG9zaXRvcnkucGFja2FnZSt4bWwgaXJwCi1hcHBsaWNhdGlvbi92bmQuaXMteHByIHhwcgotYXBwbGljYXRpb24vdm5kLmlzYWMuZmNzIGZjcwotYXBwbGljYXRpb24vdm5kLmphbSBqYW0KLWFwcGxpY2F0aW9uL3ZuZC5qY3AuamF2YW1lLm1pZGxldC1ybXMgcm1zCi1hcHBsaWNhdGlvbi92bmQuamlzcCBqaXNwCi1hcHBsaWNhdGlvbi92bmQuam9vc3Quam9kYS1hcmNoaXZlIGpvZGEKLWFwcGxpY2F0aW9uL3ZuZC5rYWhvb3R6IGt0eiBrdHIKLWFwcGxpY2F0aW9uL3ZuZC5rZGUua2FyYm9uIGthcmJvbgotYXBwbGljYXRpb24vdm5kLmtkZS5rY2hhcnQgY2hydAotYXBwbGljYXRpb24vdm5kLmtkZS5rZm9ybXVsYSBrZm8KLWFwcGxpY2F0aW9uL3ZuZC5rZGUua2l2aW8gZmx3Ci1hcHBsaWNhdGlvbi92bmQua2RlLmtvbnRvdXIga29uCi1hcHBsaWNhdGlvbi92bmQua2RlLmtwcmVzZW50ZXIga3ByIGtwdAotYXBwbGljYXRpb24vdm5kLmtkZS5rc3ByZWFkIGtzcAotYXBwbGljYXRpb24vdm5kLmtkZS5rd29yZCBrd2Qga3d0Ci1hcHBsaWNhdGlvbi92bmQua2VuYW1lYWFwcCBodGtlCi1hcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uIGtpYQotYXBwbGljYXRpb24vdm5kLmtpbmFyIGtuZSBrbnAKLWFwcGxpY2F0aW9uL3ZuZC5rb2FuIHNrcCBza2Qgc2t0IHNrbQotYXBwbGljYXRpb24vdm5kLmtvZGFrLWRlc2NyaXB0b3Igc3NlCi1hcHBsaWNhdGlvbi92bmQubGFzLmxhcyt4bWwgbGFzeG1sCi1hcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZGVza3RvcCBsYmQKLWFwcGxpY2F0aW9uL3ZuZC5sbGFtYWdyYXBoaWNzLmxpZmUtYmFsYW5jZS5leGNoYW5nZSt4bWwgbGJlCi1hcHBsaWNhdGlvbi92bmQubG90dXMtMS0yLTMgMTIzCi1hcHBsaWNhdGlvbi92bmQubG90dXMtYXBwcm9hY2ggYXByCi1hcHBsaWNhdGlvbi92bmQubG90dXMtZnJlZWxhbmNlIHByZQotYXBwbGljYXRpb24vdm5kLmxvdHVzLW5vdGVzIG5zZgotYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplciBvcmcKLWFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1zY3JlZW5jYW0gc2NtCi1hcHBsaWNhdGlvbi92bmQubG90dXMtd29yZHBybyBsd3AKLWFwcGxpY2F0aW9uL3ZuZC5tYWNwb3J0cy5wb3J0cGtnIHBvcnRwa2cKLWFwcGxpY2F0aW9uL3ZuZC5tY2QgbWNkCi1hcHBsaWNhdGlvbi92bmQubWVkY2FsY2RhdGEgbWMxCi1hcHBsaWNhdGlvbi92bmQubWVkaWFzdGF0aW9uLmNka2V5IGNka2V5Ci1hcHBsaWNhdGlvbi92bmQubWZlciBtd2YKLWFwcGxpY2F0aW9uL3ZuZC5tZm1wIG1mbQotYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguZmxvIGZsbwotYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguaWd4IGlneAotYXBwbGljYXRpb24vdm5kLm1pZiBtaWYKLWFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGFmIGRhZgotYXBwbGljYXRpb24vdm5kLm1vYml1cy5kaXMgZGlzCi1hcHBsaWNhdGlvbi92bmQubW9iaXVzLm1iayBtYmsKLWFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXF5IG1xeQotYXBwbGljYXRpb24vdm5kLm1vYml1cy5tc2wgbXNsCi1hcHBsaWNhdGlvbi92bmQubW9iaXVzLnBsYyBwbGMKLWFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMudHhmIHR4ZgotYXBwbGljYXRpb24vdm5kLm1vcGh1bi5hcHBsaWNhdGlvbiBtcG4KLWFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uY2VydGlmaWNhdGUgbXBjCi1hcHBsaWNhdGlvbi92bmQubW96aWxsYS54dWwreG1sIHh1bAotYXBwbGljYXRpb24vdm5kLm1zLWFydGdhbHJ5IGNpbAotYXBwbGljYXRpb24vdm5kLm1zLWNhYi1jb21wcmVzc2VkIGNhYgotYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIHhscyB4bGEgeGxjIHhsbSB4bHQgeGx3Ci1hcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9lbmFibGVkLjEyIHhsYW0KLWFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9lbmFibGVkLjEyIHhsc2IKLWFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb2VuYWJsZWQuMTIgeGxzbQotYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMiB4bHRtCi1hcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdCBlb3QKLWFwcGxpY2F0aW9uL3ZuZC5tcy1odG1saGVscCBjaG0KLWFwcGxpY2F0aW9uL3ZuZC5tcy1pbXMgaW1zCi1hcHBsaWNhdGlvbi92bmQubXMtbHJtIGxybQotYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZXRoZW1lIHRobXgKLWFwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rIG1zZwotYXBwbGljYXRpb24vdm5kLm1zLXBraS5zZWNjYXQgY2F0Ci1hcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bCBzdGwKLWFwcGxpY2F0aW9uL3ZuZC5tcy1wa2ljZXJ0c3RvcmUgc3N0Ci1hcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCBwcHQgcHBzIHBvdAotYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuYWRkaW4ubWFjcm9lbmFibGVkLjEyIHBwYW0KLWFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnByZXNlbnRhdGlvbi5tYWNyb2VuYWJsZWQuMTIgcHB0bQotYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuc2xpZGUubWFjcm9lbmFibGVkLjEyIHNsZG0KLWFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlc2hvdy5tYWNyb2VuYWJsZWQuMTIgcHBzbQotYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyIHBvdG0KLWFwcGxpY2F0aW9uL3ZuZC5tcy1wcm9qZWN0IG1wcCBtcHQKLWFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLmRvY3VtZW50Lm1hY3JvZW5hYmxlZC4xMiBkb2NtCi1hcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTIgZG90bQotYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzIHdwcyB3ZGIgd2NtIHdrcwotYXBwbGljYXRpb24vdm5kLm1zLXdwbCB3cGwKLWFwcGxpY2F0aW9uL3ZuZC5tcy14cHNkb2N1bWVudCB4cHMKLWFwcGxpY2F0aW9uL3ZuZC5tc2VxIG1zZXEKLWFwcGxpY2F0aW9uL3ZuZC5tdXNpY2lhbiBtdXMKLWFwcGxpY2F0aW9uL3ZuZC5tdXZlZS5zdHlsZSBtc3R5Ci1hcHBsaWNhdGlvbi92bmQubXluZmMgdGFnbGV0Ci1hcHBsaWNhdGlvbi92bmQubmV1cm9sYW5ndWFnZS5ubHUgbmx1Ci1hcHBsaWNhdGlvbi92bmQubml0ZiBudGYgbml0ZgotYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LWRpcmVjdG9yeSBubmQKLWFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1zZWFsZXIgbm5zCi1hcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtd2ViIG5udwotYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5kYXRhIG5nZGF0Ci1hcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLnN5bWJpYW4uaW5zdGFsbCBuLWdhZ2UKLWFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXQgcnBzdAotYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldHMgcnBzcwotYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmVkbSBlZG0KLWFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZHggZWR4Ci1hcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZXh0IGV4dAotYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydCBvZGMKLWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQtdGVtcGxhdGUgb3RjCi1hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlIG9kYgotYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhIG9kZgotYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlIG9kZnQKLWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3Mgb2RnCi1hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlIG90ZwotYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZSBvZGkKLWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGUgb3RpCi1hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvbiBvZHAKLWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlIG90cAotYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldCBvZHMKLWFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGUgb3RzCi1hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQgb2R0Ci1hcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyIG9kbQotYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlIG90dAotYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYiBvdGgKLWFwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyIHhvCi1hcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWwgZGQyCi1hcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb24gb3h0Ci1hcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uIHBwdHgKLWFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZSBzbGR4Ci1hcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93IHBwc3gKLWFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZSBwb3R4Ci1hcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCB4bHN4Ci1hcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZSB4bHR4Ci1hcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCBkb2N4Ci1hcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZSBkb2N0IGRvdHgKLWFwcGxpY2F0aW9uL3ZuZC5vc2dlby5tYXBndWlkZS5wYWNrYWdlIG1ncAotYXBwbGljYXRpb24vdm5kLm9zZ2kuZHAgZHAKLWFwcGxpY2F0aW9uL3ZuZC5vc2dpLnN1YnN5c3RlbSBlc2EKLWFwcGxpY2F0aW9uL3ZuZC5wYWxtIHBkYiBwcWEgb3ByYwotYXBwbGljYXRpb24vdm5kLnBhd2FhZmlsZSBwYXcKLWFwcGxpY2F0aW9uL3ZuZC5wZy5mb3JtYXQgc3RyCi1hcHBsaWNhdGlvbi92bmQucGcub3Nhc2xpIGVpNgotYXBwbGljYXRpb24vdm5kLnBpY3NlbCBlZmlmCi1hcHBsaWNhdGlvbi92bmQucG1pLndpZGdldCB3ZwotYXBwbGljYXRpb24vdm5kLnBvY2tldGxlYXJuIHBsZgotYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjYgcGJkCi1hcHBsaWNhdGlvbi92bmQucHJldmlld3N5c3RlbXMuYm94IGJveAotYXBwbGljYXRpb24vdm5kLnByb3RldXMubWFnYXppbmUgbWd6Ci1hcHBsaWNhdGlvbi92bmQucHVibGlzaGFyZS1kZWx0YS10cmVlIHFwcwotYXBwbGljYXRpb24vdm5kLnB2aS5wdGlkMSBwdGlkCi1hcHBsaWNhdGlvbi92bmQucXVhcmsucXVhcmt4cHJlc3MgcXhkIHF4dCBxd2QgcXd0IHF4bCBxeGIKLWFwcGxpY2F0aW9uL3ZuZC5yZWFsdm5jLmJlZCBiZWQKLWFwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwgbXhsCi1hcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sK3htbCBtdXNpY3htbAotYXBwbGljYXRpb24vdm5kLnJpZy5jcnlwdG9ub3RlIGNyeXB0b25vdGUKLWFwcGxpY2F0aW9uL3ZuZC5ybi1yZWFsbWVkaWEgcm0KLWFwcGxpY2F0aW9uL3ZuZC5ybi1yZWFsbWVkaWEtdmJyIHJtdmIKLWFwcGxpY2F0aW9uL3ZuZC5yb3V0ZTY2Lmxpbms2Nit4bWwgbGluazY2Ci1hcHBsaWNhdGlvbi92bmQuc2FpbGluZ3RyYWNrZXIudHJhY2sgc3QKLWFwcGxpY2F0aW9uL3ZuZC5zZWVtYWlsIHNlZQotYXBwbGljYXRpb24vdm5kLnNlbWEgc2VtYQotYXBwbGljYXRpb24vdm5kLnNlbWQgc2VtZAotYXBwbGljYXRpb24vdm5kLnNlbWYgc2VtZgotYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm1kYXRhIGlmbQotYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm10ZW1wbGF0ZSBpdHAKLWFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZSBpaWYKLWFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5wYWNrYWdlIGlwawotYXBwbGljYXRpb24vdm5kLnNpbXRlY2gtbWluZG1hcHBlciB0d2QgdHdkcwotYXBwbGljYXRpb24vdm5kLnNtYWYgbW1mCi1hcHBsaWNhdGlvbi92bmQuc21hcnQudGVhY2hlciB0ZWFjaGVyCi1hcHBsaWNhdGlvbi92bmQuc29sZW50LnNka20reG1sIHNka20gc2RrZAotYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLmR4cCBkeHAKLWFwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5zZnMgc2ZzCi1hcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGMgc2RjCi1hcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNoYXJ0IHNkcwotYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5kcmF3IHNkYQotYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5pbXByZXNzIHNkZAotYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi5tYXRoIHNtZgotYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXIgc2R3IHZvcgotYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsIHNnbAotYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5wYWNrYWdlIHNtemlwCi1hcHBsaWNhdGlvbi92bmQuc3RlcG1hbmlhLnN0ZXBjaGFydCBzbQotYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYyBzeGMKLWFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmNhbGMudGVtcGxhdGUgc3RjCi1hcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3IHN4ZAotYXBwbGljYXRpb24vdm5kLnN1bi54bWwuZHJhdy50ZW1wbGF0ZSBzdGQKLWFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3Mgc3hpCi1hcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5pbXByZXNzLnRlbXBsYXRlIHN0aQotYXBwbGljYXRpb24vdm5kLnN1bi54bWwubWF0aCBzeG0KLWFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlciBzeHcKLWFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci5nbG9iYWwgc3hnCi1hcHBsaWNhdGlvbi92bmQuc3VuLnhtbC53cml0ZXIudGVtcGxhdGUgc3R3Ci1hcHBsaWNhdGlvbi92bmQuc3VzLWNhbGVuZGFyIHN1cyBzdXNwCi1hcHBsaWNhdGlvbi92bmQuc3ZkIHN2ZAotYXBwbGljYXRpb24vdm5kLnN5bWJpYW4uaW5zdGFsbCBzaXMgc2lzeAotYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt3YnhtbCBiZG0KLWFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sIHhkbQotYXBwbGljYXRpb24vdm5kLnN5bmNtbCt4bWwgeHNtCi1hcHBsaWNhdGlvbi92bmQudGFvLmludGVudC1tb2R1bGUtYXJjaGl2ZSB0YW8KLWFwcGxpY2F0aW9uL3ZuZC50Y3BkdW1wLnBjYXAgcGNhcCBjYXAgZG1wCi1hcHBsaWNhdGlvbi92bmQudG1vYmlsZS1saXZldHYgdG1vCi1hcHBsaWNhdGlvbi92bmQudHJpZC50cHQgdHB0Ci1hcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzIG14cwotYXBwbGljYXRpb24vdm5kLnRydWVhcHAgdHJhCi1hcHBsaWNhdGlvbi92bmQudWZkbCB1ZmQgdWZkbAotYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZSB1dHoKLWFwcGxpY2F0aW9uL3ZuZC51bWFqaW4gdW1qCi1hcHBsaWNhdGlvbi92bmQudW5pdHkgdW5pdHl3ZWIKLWFwcGxpY2F0aW9uL3ZuZC51b21sK3htbCB1b21sCi1hcHBsaWNhdGlvbi92bmQudmN4IHZjeAotYXBwbGljYXRpb24vdm5kLnZpc2lvIHZzZCB2c3QgdnNzIHZzdwotYXBwbGljYXRpb24vdm5kLnZpc2lvbmFyeSB2aXMKLWFwcGxpY2F0aW9uL3ZuZC52c2YgdnNmCi1hcHBsaWNhdGlvbi92bmQud2FwLndieG1sIHdieG1sCi1hcHBsaWNhdGlvbi92bmQud2FwLndtbGMgd21sYwotYXBwbGljYXRpb24vdm5kLndhcC53bWxzY3JpcHRjIHdtbHNjCi1hcHBsaWNhdGlvbi92bmQud2VidHVyYm8gd3RiCi1hcHBsaWNhdGlvbi92bmQud29sZnJhbS5wbGF5ZXIgbmJwCi1hcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3Qgd3BkCi1hcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3Q1LjEgd3A1Ci1hcHBsaWNhdGlvbi92bmQud3FkIHdxZAotYXBwbGljYXRpb24vdm5kLnd0LnN0ZiBzdGYKLWFwcGxpY2F0aW9uL3ZuZC54YXJhIHhhcgotYXBwbGljYXRpb24vdm5kLnhmZGwgeGZkbAotYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1kaWMgaHZkCi1hcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LXNjcmlwdCBodnMKLWFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2UgaHZwCi1hcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdCBvc2YKLWFwcGxpY2F0aW9uL3ZuZC55YW1haGEub3BlbnNjb3JlZm9ybWF0Lm9zZnB2Zyt4bWwgb3NmcHZnCi1hcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtYXVkaW8gc2FmCi1hcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlIHNwZgotYXBwbGljYXRpb24vdm5kLnllbGxvd3JpdmVyLWN1c3RvbS1tZW51IGNtcAotYXBwbGljYXRpb24vdm5kLnp1bCB6aXIgemlyegotYXBwbGljYXRpb24vdm5kLnp6YXp6LmRlY2sreG1sIHphegotYXBwbGljYXRpb24vdm9pY2V4bWwreG1sIHZ4bWwKLWFwcGxpY2F0aW9uL3dpZGdldCB3Z3QKLWFwcGxpY2F0aW9uL3dpbmhscCBobHAKLWFwcGxpY2F0aW9uL3dvcmRwZXJmZWN0IHdwZAotYXBwbGljYXRpb24vd3NkbCt4bWwgd3NkbAotYXBwbGljYXRpb24vd3Nwb2xpY3kreG1sIHdzcG9saWN5Ci1hcHBsaWNhdGlvbi94LTEyMyB3awotYXBwbGljYXRpb24veC03ei1jb21wcmVzc2VkIDd6Ci1hcHBsaWNhdGlvbi94LWFiaXdvcmQgYWJ3Ci1hcHBsaWNhdGlvbi94LWFjZS1jb21wcmVzc2VkIGFjZQotYXBwbGljYXRpb24veC1hcHBsZS1kaXNraW1hZ2UgZG1nCi1hcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtYmluIGFhYiB4MzIgdTMyIHZveAotYXBwbGljYXRpb24veC1hdXRob3J3YXJlLW1hcCBhYW0KLWFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1zZWcgYWFzCi1hcHBsaWNhdGlvbi94LWJjcGlvIGJjcGlvCi1hcHBsaWNhdGlvbi94LWJpdHRvcnJlbnQgdG9ycmVudAotYXBwbGljYXRpb24veC1ibG9yYiBibGIgYmxvcmIKLWFwcGxpY2F0aW9uL3gtYnppcCBiegotYXBwbGljYXRpb24veC1iemlwMiBiejIgYm96Ci1hcHBsaWNhdGlvbi94LWNiciBjYnIgY2JhIGNidCBjYjcKLWFwcGxpY2F0aW9uL3gtY2J6IGNiegotYXBwbGljYXRpb24veC1jZGYgY2RmCi1hcHBsaWNhdGlvbi94LWNkbGluayB2Y2QKLWFwcGxpY2F0aW9uL3gtY2ZzLWNvbXByZXNzZWQgY2ZzCi1hcHBsaWNhdGlvbi94LWNoYXQgY2hhdAotYXBwbGljYXRpb24veC1jaGVzcy1wZ24gcGduCi1hcHBsaWNhdGlvbi94LWNvY29hIGNjbyAKLWFwcGxpY2F0aW9uL3gtY29tcHJlc3MgegotYXBwbGljYXRpb24veC1jb21wcmVzc2VkIHRneiB6Ci1hcHBsaWNhdGlvbi94LWNvbXNvbCBtcGgKLWFwcGxpY2F0aW9uL3gtY29uZmVyZW5jZSBuc2MKLWFwcGxpY2F0aW9uL3gtY3BpbyBjcGlvCi1hcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlIGRlYiB1ZGViCi1hcHBsaWNhdGlvbi94LWRnYy1jb21wcmVzc2VkIGRnYwotYXBwbGljYXRpb24veC1kaXJlY3RvciBkeHIgZGNyIGZnZCBzd2EgY2N0IGN4dCBjc3QgZGlyIHczZAotYXBwbGljYXRpb24veC1kbXMgZG1zCi1hcHBsaWNhdGlvbi94LWRvb20gd2FkCi1hcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWwgbmN4Ci1hcHBsaWNhdGlvbi94LWR0Ym9vayt4bWwgZHRiCi1hcHBsaWNhdGlvbi94LWR0YnJlc291cmNlK3htbCByZXMKLWFwcGxpY2F0aW9uL3gtZHZpIGR2aQotYXBwbGljYXRpb24veC1ldmEgZXZhCi1hcHBsaWNhdGlvbi94LWZvbnQgZ3NmIHBjZgotYXBwbGljYXRpb24veC1mb250LWJkZiBiZGYKLWFwcGxpY2F0aW9uL3gtZm9udC1saW51eC1wc2YgcHNmCi1hcHBsaWNhdGlvbi94LWZvbnQtb3RmIG90ZgotYXBwbGljYXRpb24veC1mb250LXBjZiBwY2YKLWFwcGxpY2F0aW9uL3gtZm9udC1zbmYgc25mCi1hcHBsaWNhdGlvbi94LWZvbnQtdHRmIHR0ZiB0dGMKLWFwcGxpY2F0aW9uL3gtZm9udC10eXBlMSBwZmEgcGZiIHBmbSBhZm0KLWFwcGxpY2F0aW9uL3gtZnJlZWFyYyBhcmMKLWFwcGxpY2F0aW9uL3gtZnJlZW1pbmQgbW0KLWFwcGxpY2F0aW9uL3gtZnV0dXJlc3BsYXNoIHNwbAotYXBwbGljYXRpb24veC1nYW50dHByb2plY3QgZ2FuCi1hcHBsaWNhdGlvbi94LWdjYS1jb21wcmVzc2VkIGdjYQotYXBwbGljYXRpb24veC1nbHVseCB1bHgKLWFwcGxpY2F0aW9uL3gtZ251bWVyaWMgZ251bWVyaWMKLWFwcGxpY2F0aW9uL3gtZ28tc2dmIHNnZgotYXBwbGljYXRpb24veC1ncmFtcHMteG1sIGdyYW1wcwotYXBwbGljYXRpb24veC1ncmFwaGluZy1jYWxjdWxhdG9yIGdjZgotYXBwbGljYXRpb24veC1ndGFyIGd0YXIKLWFwcGxpY2F0aW9uL3gtZ3Rhci1jb21wcmVzc2VkIHRhegotYXBwbGljYXRpb24veC1nemlwIGd6Ci1hcHBsaWNhdGlvbi94LWhkZiBoZGYKLWFwcGxpY2F0aW9uL3gtaHdwIGh3cAotYXBwbGljYXRpb24veC1pY2EgaWNhCi1hcHBsaWNhdGlvbi94LWluZm8gaW5mbwotYXBwbGljYXRpb24veC1pbnN0YWxsLWluc3RydWN0aW9ucyBpbnN0YWxsCi1hcHBsaWNhdGlvbi94LWludGVybmV0LXNpZ251cCBpc3AKLWFwcGxpY2F0aW9uL3gtaXBob25lIGlpaQotYXBwbGljYXRpb24veC1pc285NjYwLWltYWdlIGlzbwotYXBwbGljYXRpb24veC1qYXZhLWFyY2hpdmUtZGlmZiBqYXJkaWZmCi1hcHBsaWNhdGlvbi94LWphdmEtam5scC1maWxlIGpubHAgCi1hcHBsaWNhdGlvbi94LWptb2wgam16Ci1hcHBsaWNhdGlvbi94LWxhdGV4IGxhdGV4Ci1hcHBsaWNhdGlvbi94LWx5eCBseXgKLWFwcGxpY2F0aW9uL3gtbHpoLWNvbXByZXNzZWQgbHpoIGxoYQotYXBwbGljYXRpb24veC1senggbHp4Ci1hcHBsaWNhdGlvbi94LW1ha2VzZWxmIHJ1biAKLWFwcGxpY2F0aW9uL3gtbWQ1IG1kNQotYXBwbGljYXRpb24veC1taWUgbWllCi1hcHBsaWNhdGlvbi94LW1pZiBtaWYKLWFwcGxpY2F0aW9uL3gtbW9iaXBvY2tldC1lYm9vayBwcmMgbW9iaQotYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvbiBhcHBsaWNhdGlvbgotYXBwbGljYXRpb24veC1tcy1zaG9ydGN1dCBsbmsKLWFwcGxpY2F0aW9uL3gtbXMtd21kIHdtZAotYXBwbGljYXRpb24veC1tcy13bXogd216Ci1hcHBsaWNhdGlvbi94LW1zLXhiYXAgeGJhcAotYXBwbGljYXRpb24veC1tc2FjY2VzcyBtZGIKLWFwcGxpY2F0aW9uL3gtbXNiaW5kZXIgb2JkCi1hcHBsaWNhdGlvbi94LW1zY2FyZGZpbGUgY3JkCi1hcHBsaWNhdGlvbi94LW1zY2xpcCBjbHAKLWFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCBkbGwgYmF0IGV4ZSBjb20KLWFwcGxpY2F0aW9uL3gtbXNpIG1zaQotYXBwbGljYXRpb24veC1tc21lZGlhdmlldyBtdmIgbTE0IG0xMyAKLWFwcGxpY2F0aW9uL3gtbXNtZXRhZmlsZSB3bWYgZW1mIGVteiB3bXogCi1hcHBsaWNhdGlvbi94LW1zbW9uZXkgbW55Ci1hcHBsaWNhdGlvbi94LW1zcHVibGlzaGVyIHB1YgotYXBwbGljYXRpb24veC1tc3NjaGVkdWxlIHNjZAotYXBwbGljYXRpb24veC1tc3Rlcm1pbmFsIHRybQotYXBwbGljYXRpb24veC1tc3dyaXRlIHdyaQotYXBwbGljYXRpb24veC1uZXRjZGYgbmMgY2RmCi1hcHBsaWNhdGlvbi94LW5zLXByb3h5LWF1dG9jb25maWcgZGF0IHBhYwotYXBwbGljYXRpb24veC1ud2MgbndjCi1hcHBsaWNhdGlvbi94LW56YiBuemIKLWFwcGxpY2F0aW9uL3gtb2JqZWN0IG8KLWFwcGxpY2F0aW9uL3gtb3otYXBwbGljYXRpb24gb3phCi1hcHBsaWNhdGlvbi94LXBlcmZtb24gcG1hIHBtYyBwbWwgcG1yIHBtdwotYXBwbGljYXRpb24veC1wa2NzMTIgcGZ4Ci1hcHBsaWNhdGlvbi94LXBrY3MxMnYgcDEyCi1hcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRpZmljYXRlcyBwN2Igc3BjCi1hcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRyZXFyZXNwIHA3cgotYXBwbGljYXRpb24veC1wa2NzNy1jcmwgY3JsCi1hcHBsaWNhdGlvbi94LXBrY3M3LW1pbWUgcDdjIHA3bQotYXBwbGljYXRpb24veC1wa2NzNy1zaWduYXR1cmUgcDdzCi1hcHBsaWNhdGlvbi94LXByb2R1Y2VyLXBhY2thZ2UgZGtwCi1hcHBsaWNhdGlvbi94LXB5dGhvbi1jb2RlIHB5YyBweW8KLWFwcGxpY2F0aW9uL3gtcWdpcyBxZ3Mgc2hwIHNoeAotYXBwbGljYXRpb24veC1xdWlja3RpbWVwbGF5ZXIgcXRsCi1hcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkIHJhcgotYXBwbGljYXRpb24veC1yZHAgcmRwCi1hcHBsaWNhdGlvbi94LXJlZGhhdC1wYWNrYWdlLW1hbmFnZXIgcnBtIAotYXBwbGljYXRpb24veC1yZXNlYXJjaC1pbmZvLXN5c3RlbXMgcmlzCi1hcHBsaWNhdGlvbi94LXJ1YnkgcmIKLWFwcGxpY2F0aW9uL3gtc2NpbGFiIHNjZSBzY2kKLWFwcGxpY2F0aW9uL3gtc2NpbGFiLXhjb3MgeGNvcwotYXBwbGljYXRpb24veC1zaCBzaAotYXBwbGljYXRpb24veC1zaGExIHNoYTEKLWFwcGxpY2F0aW9uL3gtc2hhciBzaGFyCi1hcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCBzd2YKLWFwcGxpY2F0aW9uL3gtc2lsdmVybGlnaHQgc2NyCi1hcHBsaWNhdGlvbi94LXNpbHZlcmxpZ2h0LWFwcCB4YXAKLWFwcGxpY2F0aW9uL3gtc3FsIHNxbAotYXBwbGljYXRpb24veC1zdHVmZml0IHNpdAotYXBwbGljYXRpb24veC1zdHVmZml0eCBzaXR4Ci1hcHBsaWNhdGlvbi94LXN1YnJpcCBzcnQKLWFwcGxpY2F0aW9uL3gtc3Y0Y3BpbyBzdjRjcGlvCi1hcHBsaWNhdGlvbi94LXN2NGNyYyBzdjRjcmMKLWFwcGxpY2F0aW9uL3gtdDN2bS1pbWFnZSB0MwotYXBwbGljYXRpb24veC10YXIgdGFyCi1hcHBsaWNhdGlvbi94LXRleCB0ZXgKLWFwcGxpY2F0aW9uL3gtdGV4LWdmIGdmCi1hcHBsaWNhdGlvbi94LXRleC1wayBwawotYXBwbGljYXRpb24veC10ZXgtdGZtIHRmbQotYXBwbGljYXRpb24veC10ZXhpbmZvIHRleGluZm8gdGV4aQotYXBwbGljYXRpb24veC10Z2lmIG9iagotYXBwbGljYXRpb24veC10cm9mZi1tYW4gbWFuCi1hcHBsaWNhdGlvbi94LXRyb2ZmLW1lIG1lCi1hcHBsaWNhdGlvbi94LXRyb2ZmLW1zIG1zCi1hcHBsaWNhdGlvbi94LXVzdGFyIHVzdGFyCi1hcHBsaWNhdGlvbi94LXdhaXMtc291cmNlIHNyYwotYXBwbGljYXRpb24veC13aW5neiB3egotYXBwbGljYXRpb24veC13cGItc2xjIHNsYwotYXBwbGljYXRpb24veC14NTA5LWNhLWNlcnQgY3J0IGRlcgotYXBwbGljYXRpb24veC14Y2YgeGNmCi1hcHBsaWNhdGlvbi94LXhmaWcgZmlnCi1hcHBsaWNhdGlvbi94LXhsaWZmK3htbCB4bGYKLWFwcGxpY2F0aW9uL3gteHBpbnN0YWxsIHhwaQotYXBwbGljYXRpb24veC14eiB4egotYXBwbGljYXRpb24veC16bWFjaGluZSB6MSB6MiB6MyB6NCB6NSB6NiB6NyB6OAotYXBwbGljYXRpb24veGFtbCt4bWwgeGFtbAotYXBwbGljYXRpb24veGNhcC1kaWZmK3htbCB4ZGYKLWFwcGxpY2F0aW9uL3hlbmMreG1sIHhlbmMKLWFwcGxpY2F0aW9uL3hodG1sK3htbCB4aHRtbCB4aHQKLWFwcGxpY2F0aW9uL3htbCB4bWwKLWFwcGxpY2F0aW9uL3htbC1kdGQgZHRkCi1hcHBsaWNhdGlvbi94b3AreG1sIHhvcAotYXBwbGljYXRpb24veHByb2MreG1sIHhwbAotYXBwbGljYXRpb24veHNsdCt4bWwgeHNsdAotYXBwbGljYXRpb24veHNwZit4bWwgeHNwZgotYXBwbGljYXRpb24veHYreG1sIG14bWwgeGh2bWwgeHZtbCB4dm0KLWFwcGxpY2F0aW9uL3lhbmcgeWFuZwotYXBwbGljYXRpb24veWluK3htbCB5aW4KLWFwcGxpY2F0aW9uL3luZC5tcy1wa2lwa28gdnBrbwotYXBwbGljYXRpb24vemlwIHppcAotYXVkaW8vYWRwY20gYWRwCi1hdWRpby9hbXIgYW1yCi1hdWRpby9hbXItd2IgYXdiCi1hdWRpby9hbm5vZGV4IGF4YQotYXVkaW8vYmFzaWMgc25kIGF1Ci1hdWRpby9jc291bmQgY3NkIG9yYyBzY28KLWF1ZGlvL2ZsYWMgZmxhYwotYXVkaW8vbWlkaSBtaWQgcm1pIGthciBtaWRpCi1hdWRpby9tcDQgbTRhIG00YiBtNHAgbTRyCi1hdWRpby9tcGVnIG1wMyBtMmEgbXBnYSBtcDJhIG1wMgotYXVkaW8vb2dnIG9nZyBvZ2Egc3B4Ci1hdWRpby9wcnMuc2lkIHNpZAotYXVkaW8vczNtIHMzbQotYXVkaW8vc2lsayBzaWwKLWF1ZGlvL3ZuZC5kZWNlLmF1ZGlvIHV2YSB1dnZhCi1hdWRpby92bmQuZGlnaXRhbC13aW5kcyBlb2wKLWF1ZGlvL3ZuZC5kcmEgZHJhCi1hdWRpby92bmQuZHRzIGR0cwotYXVkaW8vdm5kLmR0cy5oZCBkdHNoZAotYXVkaW8vdm5kLmx1Y2VudC52b2ljZSBsdnAKLWF1ZGlvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHlhIHB5YQotYXVkaW8vdm5kLm51ZXJhLmVjZWxwNDgwMCBlY2VscDQ4MDAKLWF1ZGlvL3ZuZC5udWVyYS5lY2VscDc0NzAgZWNlbHA3NDcwCi1hdWRpby92bmQubnVlcmEuZWNlbHA5NjAwIGVjZWxwOTYwMAotYXVkaW8vdm5kLnJpcCByaXAKLWF1ZGlvL3dlYm0gd2ViYQotYXVkaW8veC1hYWMgYWFjCi1hdWRpby94LWFpZmYgYWlmIGFpZmMgYWlmZgotYXVkaW8veC1jYWYgY2FmCi1hdWRpby94LWdzbSBnc20KLWF1ZGlvL3gtbWF0cm9za2EgbWthCi1hdWRpby94LW1wZWd1cmwgbTN1Ci1hdWRpby94LW1zLXdheCB3YXgKLWF1ZGlvL3gtbXMtd21hIHdtYQotYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luIHJtcAotYXVkaW8veC1yZWFsYXVkaW8gcmEKLWF1ZGlvL3gtc2NwbHMgcGxzCi1hdWRpby94LXNkMiBzZDIKLWF1ZGlvL3gtd2F2IHdhdgotYXVkaW8veG0geG0KLWNoZW1pY2FsL3gtYWxjaGVteSBhbGMKLWNoZW1pY2FsL3gtY2FjaGUgY2FjIGNhY2hlCi1jaGVtaWNhbC94LWNhY2hlLWNzZiBjc2YKLWNoZW1pY2FsL3gtY2FjdHZzLWJpbmFyeSBjYXNjaWkgY2JpbiBjdGFiCi1jaGVtaWNhbC94LWNkeCBjZHgKLWNoZW1pY2FsL3gtY2hlbTNkIGMzZAotY2hlbWljYWwveC1jaWYgY2lmCi1jaGVtaWNhbC94LWNtZGYgY21kZgotY2hlbWljYWwveC1jbWwgY21sCi1jaGVtaWNhbC94LWNvbXBhc3MgY3BhCi1jaGVtaWNhbC94LWNyb3NzZmlyZSBic2QKLWNoZW1pY2FsL3gtY3NtbCBjc21sCi1jaGVtaWNhbC94LWN0eCBjdHgKLWNoZW1pY2FsL3gtY3hmIGNlZiBjeGYKLWNoZW1pY2FsL3gtZW1ibC1kbC1udWNsZW90aWRlIGVtYiBlbWJsCi1jaGVtaWNhbC94LWdhbGFjdGljLXNwYyBzcGMKLWNoZW1pY2FsL3gtZ2FtZXNzLWlucHV0IGdhbSBnYW1pbiBpbnAKLWNoZW1pY2FsL3gtZ2F1c3NpYW4tY2hlY2twb2ludCBmY2ggZmNoawotY2hlbWljYWwveC1nYXVzc2lhbi1jdWJlIGN1YgotY2hlbWljYWwveC1nYXVzc2lhbi1pbnB1dCBnYXUgZ2pjIGdqZgotY2hlbWljYWwveC1nYXVzc2lhbi1sb2cgZ2FsCi1jaGVtaWNhbC94LWdjZzgtc2VxdWVuY2UgZ2NnCi1jaGVtaWNhbC94LWdlbmJhbmsgZ2VuCi1jaGVtaWNhbC94LWhpbiBoaW4KLWNoZW1pY2FsL3gtaXNvc3RhciBpc3QgaXN0cgotY2hlbWljYWwveC1qY2FtcC1keCBkeCBqZHgKLWNoZW1pY2FsL3gta2luZW1hZ2Uga2luCi1jaGVtaWNhbC94LW1hY21vbGVjdWxlIG1jbQotY2hlbWljYWwveC1tYWNyb21vZGVsLWlucHV0IG1tZCBtbW9kCi1jaGVtaWNhbC94LW1kbC1tb2xmaWxlIG1vbAotY2hlbWljYWwveC1tZGwtcmRmaWxlIHJkCi1jaGVtaWNhbC94LW1kbC1yeG5maWxlIHJ4bgotY2hlbWljYWwveC1tZGwtc2RmaWxlIHNkIHNkZgotY2hlbWljYWwveC1tZGwtdGdmIHRnZgotY2hlbWljYWwveC1tbWNpZiBtY2lmCi1jaGVtaWNhbC94LW1vbDIgbW9sMgotY2hlbWljYWwveC1tb2xjb25uLVogYgotY2hlbWljYWwveC1tb3BhYy1ncmFwaCBncHQKLWNoZW1pY2FsL3gtbW9wYWMtaW5wdXQgZGF0IG1vcCBtb3BjcnQgbXBjIHptdAotY2hlbWljYWwveC1tb3BhYy1vdXQgbW9vCi1jaGVtaWNhbC94LW1vcGFjLXZpYiBtdmIKLWNoZW1pY2FsL3gtbmNiaS1hc24xIGFzbgotY2hlbWljYWwveC1uY2JpLWFzbjEtYXNjaWkgZW50IHBydAotY2hlbWljYWwveC1uY2JpLWFzbjEtYmluYXJ5IGFzbyB2YWwKLWNoZW1pY2FsL3gtcGRiIGVudCBwZGIKLWNoZW1pY2FsL3gtcm9zZGFsIHJvcwotY2hlbWljYWwveC1zd2lzc3Byb3Qgc3cKLWNoZW1pY2FsL3gtdmFtYXMtaXNvMTQ5NzYgdm1zCi1jaGVtaWNhbC94LXZtZCB2bWQKLWNoZW1pY2FsL3gteHRlbCB4dGVsCi1jaGVtaWNhbC94LXh5eiB4eXoKLWltYWdlL2JtcCBibXAKLWltYWdlL2NnbSBjZ20KLWltYWdlL2Npcy1jb2QgY29kCi1pbWFnZS9nM2ZheCBnMwotaW1hZ2UvZ2lmIGdpZgotaW1hZ2UvaWVmIGllZgotaW1hZ2UvanBlZyBqcGVnIGpwZyBqcGUKLWltYWdlL2t0eCBrdHgKLWltYWdlL3BjeCBwY3gKLWltYWdlL3BpcGVnIGpmaWYKLWltYWdlL3BuZyBwbmcKLWltYWdlL3Bycy5idGlmIGJ0aWYKLWltYWdlL3NnaSBzZ2kKLWltYWdlL3N2Zyt4bWwgc3ZnIHN2Z3oKLWltYWdlL3RpZmYgdGlmIHRpZmYKLWltYWdlL3ZuZC5hZG9iZS5waG90b3Nob3AgcHNkCi1pbWFnZS92bmQuZGVjZS5ncmFwaGljIHV2aSB1dnZpIHV2ZyB1dnZnCi1pbWFnZS92bmQuZGp2dSBkanZ1IGRqdgotaW1hZ2Uvdm5kLmR2Yi5zdWJ0aXRsZSBzdWIKLWltYWdlL3ZuZC5kd2cgZHdnCi1pbWFnZS92bmQuZHhmIGR4ZgotaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldCBmYnMKLWltYWdlL3ZuZC5mcHggZnB4Ci1pbWFnZS92bmQuZnN0IGZzdAotaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtbW1yIG1tcgotaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtcmxjIHJsYwotaW1hZ2Uvdm5kLm1zLW1vZGkgbWRpCi1pbWFnZS92bmQubXMtcGhvdG8gd2RwCi1pbWFnZS92bmQubmV0LWZweCBucHgKLWltYWdlL3ZuZC53YXAud2JtcCB3Ym1wCi1pbWFnZS92bmQueGlmZiB4aWYKLWltYWdlL3dlYnAgd2VicAotaW1hZ2UveC0zZHMgM2RzCi1pbWFnZS94LWNhbm9uLWNyMiBjcjIKLWltYWdlL3gtY2Fub24tY3J3IGNydwotaW1hZ2UveC1jbXUtcmFzdGVyIHJhcwotaW1hZ2UveC1jbXggY214Ci1pbWFnZS94LWNvcmVsZHJhdyBjZHIKLWltYWdlL3gtY29yZWxkcmF3cGF0dGVybiBwYXQKLWltYWdlL3gtY29yZWxkcmF3dGVtcGxhdGUgY2R0Ci1pbWFnZS94LWNvcmVscGhvdG9wYWludCBjcHQKLWltYWdlL3gtZXBzb24tZXJmIGVyZgotaW1hZ2UveC1mcmVlaGFuZCBmaCBmaGMgZmg0IGZoNSBmaDcKLWltYWdlL3gtaWNvbiBpY28KLWltYWdlL3gtamcgYXJ0Ci1pbWFnZS94LWpuZyBqbmcKLWltYWdlL3gtbXJzaWQtaW1hZ2Ugc2lkCi1pbWFnZS94LW5pa29uLW5lZiBuZWYKLWltYWdlL3gtb2x5bXB1cy1vcmYgb3JmCi1pbWFnZS94LXBpY3QgcGljIHBjdAotaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAgcG5tCi1pbWFnZS94LXBvcnRhYmxlLWJpdG1hcCBwYm0KLWltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCBwZ20KLWltYWdlL3gtcG9ydGFibGUtcGl4bWFwIHBwbQotaW1hZ2UveC1yZ2IgcmdiCi1pbWFnZS94LXRnYSB0Z2EKLWltYWdlL3gteGJpdG1hcCB4Ym0KLWltYWdlL3gteHBpeG1hcCB4cG0KLWltYWdlL3gteHdpbmRvd2R1bXAgeHdkCi1tZXNzYWdlL3JmYzgyMiBtaHRtbCBtaHR2IGVtbCBtaW1lIG53cwotbW9kZWwvaWdlcyBpZ3MgaWdlcwotbW9kZWwvbWVzaCBtc2ggbWVzaCBzaWxvCi1tb2RlbC92bmQuY29sbGFkYSt4bWwgZGFlCi1tb2RlbC92bmQuZHdmIGR3ZgotbW9kZWwvdm5kLmdkbCBnZGwKLW1vZGVsL3ZuZC5ndHcgZ3R3Ci1tb2RlbC92bmQubXRzIG10cwotbW9kZWwvdm5kLnZ0dSB2dHUKLW1vZGVsL3gzZCtiaW5hcnkgeDNkYiB4M2RiegotbW9kZWwveDNkK3ZybWwgeDNkdiB4M2R2egotbW9kZWwveDNkK3htbCB4M2QgeDNkegotdGV4dC9jYWNoZS1tYW5pZmVzdCBhcHBjYWNoZQotdGV4dC9jYWxlbmRhciBpY3MgaWZiCi10ZXh0L2NzcyBjc3MKLXRleHQvY3N2IGNzdgotdGV4dC9oMzIzIDMyMwotdGV4dC9odG1sIGh0bWwgaHRtIHN0bQotdGV4dC9pdWxzIHVscwotdGV4dC9tYXRobWwgbW1sIAotdGV4dC9uMyBuMwotdGV4dC9wbGFpbiB0eHQgYmFzIGluIGRlZiB0ZXh0IGxvZyBjb25mIGxpc3QKLXRleHQvcHJzLmxpbmVzLnRhZyBkc2MKLXRleHQvcmljaHRleHQgcnR4Ci10ZXh0L3NjcmlwdGxldCBzY3QKLXRleHQvc2dtbCBzZ21sIHNnbQotdGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyB0c3YKLXRleHQvdGV4bWFjcyB0bSB0cwotdGV4dC90cm9mZiB0IHRyIHJvZmYgbWFuIG1lIG1zCi10ZXh0L3R1cnRsZSB0dGwKLXRleHQvdXJpLWxpc3QgdXJpIHVyaXMgdXJscwotdGV4dC92Y2FyZCB2Y2FyZAotdGV4dC92bmQuY3VybCBjdXJsCi10ZXh0L3ZuZC5jdXJsLmRjdXJsIGRjdXJsCi10ZXh0L3ZuZC5jdXJsLm1jdXJsIG1jdXJsCi10ZXh0L3ZuZC5jdXJsLnNjdXJsIHNjdXJsCi10ZXh0L3ZuZC5kdmIuc3VidGl0bGUgc3ViCi10ZXh0L3ZuZC5mbHkgZmx5Ci10ZXh0L3ZuZC5mbWkuZmxleHN0b3IgZmx4Ci10ZXh0L3ZuZC5ncmFwaHZpeiBndgotdGV4dC92bmQuaW4zZC4zZG1sIDNkbWwKLXRleHQvdm5kLmluM2Quc3BvdCBzcG90Ci10ZXh0L3ZuZC5zdW4uajJtZS5hcHAtZGVzY3JpcHRvciBqYWQKLXRleHQvdm5kLndhcC53bWwgd21sCi10ZXh0L3ZuZC53YXAud21sc2NyaXB0IHdtbHMKLXRleHQvd2Vidmlld2h0bWwgaHR0Ci10ZXh0L3gtYXNtIHMgYXNtCi10ZXh0L3gtYmlidGV4IGJpYgotdGV4dC94LWJvbyBib28KLXRleHQveC1jIGMgaCBkaWMKLXRleHQveC1jKytoZHIgaCsrIGhoIGhwcCBoeHgKLXRleHQveC1jKytzcmMgYysrIGNjIGNwcCBjeHgKLXRleHQveC1jb21wb25lbnQgaHRjCi10ZXh0L3gtY3NoIGNzaAotdGV4dC94LWRpZmYgZGlmZiBwYXRjaAotdGV4dC94LWRzcmMgZAotdGV4dC94LWZvcnRyYW4gZiBmb3IgZjc3IGY5MAotdGV4dC94LWhhc2tlbGwgaHMKLXRleHQveC1qYXZhLXNvdXJjZSBqYXZhCi10ZXh0L3gtbGlseXBvbmQgbHkKLXRleHQveC1saXRlcmF0ZS1oYXNrZWxsIGxocwotdGV4dC94LW1vYyBtb2MKLXRleHQveC1uZm8gbmZvCi10ZXh0L3gtb3BtbCBvcG1sCi10ZXh0L3gtcGFzY2FsIHAgcGFzCi10ZXh0L3gtcGNzLWdjZCBnY2QKLXRleHQveC1wZXJsIHBsIHBtCi10ZXh0L3gtcHNwIHBzcAotdGV4dC94LXB5dGhvbiBweQotdGV4dC94LXNjYWxhIHNjYWxhCi10ZXh0L3gtc2V0ZXh0IGV0eAotdGV4dC94LXNmdiBzZnYKLXRleHQveC10Y2wgdGNsIHRrCi10ZXh0L3gtdXVlbmNvZGUgdXUKLXRleHQveC12Y2FsZW5kYXIgdmNzCi10ZXh0L3gtdmNhcmQgdmNmCi12aWRlby8zZ3BwIDNncHAgM2dwCi12aWRlby8zZ3BwMiAzZzIKLXZpZGVvL2Fubm9kZXggYXh2Ci12aWRlby9kbCBkbAotdmlkZW8vZHYgZGlmIGR2Ci12aWRlby9mbGkgZmxpCi12aWRlby9nbCBnbAotdmlkZW8vaDI2MSBoMjYxCi12aWRlby9oMjYzIGgyNjMKLXZpZGVvL2gyNjQgaDI2NAotdmlkZW8vanBlZyBqcGd2Ci12aWRlby9qcG0ganBtIGpwZ20KLXZpZGVvL21qMiBtajIgbWpwMgotdmlkZW8vbXA0IG1wNCBtcGc0Ci12aWRlby9tcGVnIG1wZWcgbXBhIG1wMiBtcHYyCi12aWRlby9tcGVndiBtcGUgbXBnIG0xdiBtMnYKLXZpZGVvL29nZyBvZ3YKLXZpZGVvL3F1aWNrdGltZSBtb3YgcXQKLXZpZGVvL3ZuZC5kZWNlLmhkIHV2aCB1dnZoCi12aWRlby92bmQuZGVjZS5tb2JpbGUgdXZtIHV2dm0KLXZpZGVvL3ZuZC5kZWNlLnBkIHV2cCB1dnZwCi12aWRlby92bmQuZGVjZS5zZCB1dnMgdXZ2cwotdmlkZW8vdm5kLmRlY2UudmlkZW8gdXZ2IHV2dnYKLXZpZGVvL3ZuZC5kdmIuZmlsZSBkdmIKLXZpZGVvL3ZuZC5mdnQgZnZ0Ci12aWRlby92bmQubXBlZ3VybCBteHUgbTR1Ci12aWRlby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5diBweXYKLXZpZGVvL3ZuZC51dnZ1Lm1wNCB1dnUgdXZ2dQotdmlkZW8vdm5kLnZpdm8gdml2Ci12aWRlby93ZWJtIHdlYm0KLXZpZGVvL3gtZjR2IGY0dgotdmlkZW8veC1mbHYgZmx2Ci12aWRlby94LWxhLWFzZiBsc2YgbHN4Ci12aWRlby94LW00diBtNHYKLXZpZGVvL3gtbWF0cm9za2EgbWt2IG1rM2QgbWtzCi12aWRlby94LW1uZyBtbmcKLXZpZGVvL3gtbXMtYXNmIGFzZiBhc3IgYXN4Ci12aWRlby94LW1zLXZvYiB2b2IKLXZpZGVvL3gtbXMtd20gd20KLXZpZGVvL3gtbXMtd212IHdtdgotdmlkZW8veC1tcy13bXggd214Ci12aWRlby94LW1zLXd2eCB3dngKLXZpZGVvL3gtbXN2aWRlbyBhdmkKLXZpZGVvL3gtc2dpLW1vdmllIG1vdmllCi12aWRlby94LXNtdiBzbXYKLXgtY29uZmVyZW5jZS94LWNvb2x0YWxrIGljZQoteC1lcG9jL3gtc2lzeC1hcHAgc2lzeAoteC13b3JsZC94LXZybWwgdnJtbCBmbHIgd3JsIHdyeiB4YWYgeG9mCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlckZhY3RvcnkgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnhtbC5pbnRlcm5hbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlckZhY3RvcnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWM4MmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi54bWwuaW50ZXJuYWwud3MuYXBpLnBpcGUuVHViZWxpbmVBc3NlbWJsZXJGYWN0b3J5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnR1YmUuT3BlbkNNSVNKcmVUdWJlbGluZUFzc2VtYmxlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4ueG1sLndzLmFwaS5waXBlLlR1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4ueG1sLndzLmFwaS5waXBlLlR1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMGI1NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnhtbC53cy5hcGkucGlwZS5UdWJlbGluZUFzc2VtYmxlckZhY3RvcnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwudHViZS5PcGVuQ01JU1R1YmVsaW5lQXNzZW1ibGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTAvQ01JUy1Db3JlLnhzZCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL3dzZGwvY21pczEwL0NNSVMtQ29yZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDI3YjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTAvQ01JUy1Db3JlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCTwhLS0KLQkJTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdQotCQltYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heQotCQlvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLQkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieQotCQlhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0JCUxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi0JCUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IKLQkJdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0JCUxpY2Vuc2UuCi0JLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmF0b209Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgeG1sbnM6eGpjPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiL3hqYyIKLQlqYXhiOmV4dGVuc2lvbkJpbmRpbmdQcmVmaXhlcz0ieGpjIiBqYXhiOnZlcnNpb249IjIuMSIKLQl4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIgdmVyc2lvbj0iMS4wIj4KLQotCTwhLS0gIGVudW1zIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1EZWNpbWFsUHJlY2lzaW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIzMiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNvbnRlbnRTdHJlYW1BbGxvd2VkIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vdGFsbG93ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbG93ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FyZGluYWxpdHkiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2luZ2xlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtdWx0aSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVwZGF0YWJpbGl0eSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZWFkb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVhZHdyaXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ3aGVuY2hlY2tlZG91dCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib25jcmVhdGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1EYXRlVGltZVJlc29sdXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVhciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGltZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnR5VHlwZSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib29sZWFuIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW50ZWdlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGF0ZXRpbWUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlY2ltYWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0bWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXJpIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQmFzZU9iamVjdFR5cGVJZHMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpkb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpmb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cmVsYXRpb25zaGlwIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBvbGljeSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlRdWVyeSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtZXRhZGF0YW9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGx0ZXh0b25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90aHNlcGFyYXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3RoY29tYmluZWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5Sm9pbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lcm9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyYW5kb3V0ZXIiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW55dGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHdjb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVmVyc2lvbmluZ1N0YXRlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrZWRvdXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1pbm9yIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYWpvciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVW5maWxlT2JqZWN0Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuZmlsZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlc2luZ2xlZmlsZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVJlbGF0aW9uc2hpcERpcmVjdGlvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzb3VyY2UiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRhcmdldCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZWl0aGVyIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0YXJnZXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGgiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPCEtLSAgcHJvcGVydGllcyBpbiBDTUlTIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1Qcm9wZXJ0aWVzQmFzZSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm5hbWUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6b2JqZWN0SWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6b2JqZWN0VHlwZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmJhc2VUeXBlSWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y3JlYXRlZEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNyZWF0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpZWRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjaGFuZ2VUb2tlbiIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0RvY3VtZW50Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNJbW11dGFibGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNMYXRlc3RWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTGF0ZXN0TWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25MYWJlbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzSWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y2hlY2tpbkNvbW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjb250ZW50U3RyZWFtTWltZVR5cGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUZpbGVOYW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1JZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0ZvbGRlciI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBhcmVudElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cGF0aCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1JlbGF0aW9uc2hpcCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnNvdXJjZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnRhcmdldElkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1BvbGljeSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBvbGljeVRleHQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiPgotCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czphdHRyaWJ1dGVHcm91cD4KLQotCTwhLS0gIG1haW4gY21pcyBvYmplY3QgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJjbWlzOmNtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTwhLS0gIGlmIGNoYW5nZSBsb2cgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VFdmVudEluZm8iIHR5cGU9ImNtaXM6Y21pc0NoYW5nZUV2ZW50VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgQUNMIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWNsIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImV4YWN0QUNMIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIEFwcGxpZWQgUG9saWN5IElEcyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljeUlkcyIgdHlwZT0iY21pczpjbWlzTGlzdE9mSWRzVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgUmVuZGl0aW9uIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uIiB0eXBlPSJjbWlzOmNtaXNSZW5kaXRpb25UeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbnMgLS0+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IgotCQkJCW5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gcHJvcGVydHkgYmFnIC0tPgotCTx4czphdHRyaWJ1dGUgbmFtZT0ia2V5IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdHlwZT0ieHM6aW50ZWdlciIgLz4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydGllc1R5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQk8eHM6YXBwaW5mbz4KLQkJCQkJCTxqYXhiOnByb3BlcnR5IG5hbWU9InByb3BlcnR5IiAvPgotCQkJCQk8L3hzOmFwcGluZm8+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5Qm9vbGVhbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlCb29sZWFuIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUlkIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUlkIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUludGVnZXIiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SW50ZWdlciIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlEYXRlVGltZSIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEYXRlVGltZSIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlEZWNpbWFsIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURlY2ltYWwiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SHRtbCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlIdG1sIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVN0cmluZyIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlTdHJpbmciCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5VXJpIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVVyaSIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSBzdGFydCB0aGUgcHJvcCBkZWZpbml0aW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5Ij4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eURlZmluaXRpb25JZCIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpZCBmb3IgdGhpcwotCQkJCQlwcm9wZXJ0eSBpbnN0YW5jZS4gVGhpcyBpcwotCQkJCQlub3QgcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZCBhcyBhCi0JCQkJCWRlZmF1bHQgdmFsdWUuIFRoaXMgaXMKLQkJCQkJcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZCBmb3IgcXVlcnkgcmVzdWx0Ci0JCQkJCXNldCBvciByZXR1cm5pbmcKLQkJCQkJcHJvcGVydGllcyBvbiBhbiBvYmplY3QuCi0JCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWxOYW1lIiB1c2U9Im9wdGlvbmFsIj4KLQkJCTx4czphbm5vdGF0aW9uPgotCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQlUaGlzIGlzIHRoZSBsb2NhbG5hbWUgYXMgZGVmaW5lZCBieSB0aGUgcHJvcGVydHkKLQkJCQkJZGVmaW5pdGlvbgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0iZGlzcGxheU5hbWUiIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIGRpc3BsYXluYW1lIGFzIGRlZmluZWQgYnkgdGhlIHByb3BlcnR5Ci0JCQkJCWRlZmluaXRpb24KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1ZXJ5TmFtZSIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgcXVlcnlOYW1lLiBUaGlzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JCQkJCXRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5LiBJZiBhbGlhc2VzIGFyZSB1c2VkLCB0aGUgYWxpYXMgaXMgdG8KLQkJCQkJYmUgc3BlY2lmaWVkIGhlcmUgaW5zdGVhZCBvZiB0aGUgcXVlcnlOYW1lLgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlCb29sZWFuIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmJvb2xlYW4iIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUlkIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SW50ZWdlciI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czppbnRlZ2VyIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEYXRlVGltZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkYXRlVGltZSIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGVjaW1hbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkZWNpbWFsIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlIdG1sIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVN0cmluZyI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVVyaSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gY21pcyBjaG9pY2UgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2UiPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUJvb2xlYW4iPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmJvb2xlYW4iIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUJvb2xlYW4iIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VJZCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUludGVnZXIiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUludGVnZXIiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VEYXRlVGltZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZURhdGVUaW1lIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlRGVjaW1hbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGVjaW1hbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGVjaW1hbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUh0bWwiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSHRtbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlU3RyaW5nIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVN0cmluZyIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZVVyaSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6YW55VVJJIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VVcmkiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSAgYWxsb3dhYmxlIGFjdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZU9iamVjdCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhblVwZGF0ZVByb3BlcnRpZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRGb2xkZXJUcmVlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0UHJvcGVydGllcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldE9iamVjdFJlbGF0aW9uc2hpcHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRPYmplY3RQYXJlbnRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Rm9sZGVyUGFyZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0RGVzY2VuZGFudHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5Nb3ZlT2JqZWN0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuRGVsZXRlQ29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNoZWNrT3V0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ2FuY2VsQ2hlY2tPdXQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DaGVja0luIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuU2V0Q29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQWRkT2JqZWN0VG9Gb2xkZXIiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5SZW1vdmVPYmplY3RGcm9tRm9sZGVyIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Q29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkFwcGx5UG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QXBwbGllZFBvbGljaWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuUmVtb3ZlUG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Q2hpbGRyZW4iIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DcmVhdGVEb2N1bWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZUZvbGRlciIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZVJlbGF0aW9uc2hpcCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZVRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcmVuZGl0aW9ucyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldFJlbmRpdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gQUNMIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QUNMIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQXBwbHlBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNMaXN0T2ZJZHNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gUHJvcGVydHkgQXR0cmlidXRlcyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5VHlwZSIgdHlwZT0iY21pczplbnVtUHJvcGVydHlUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FyZGluYWxpdHkiIHR5cGU9ImNtaXM6ZW51bUNhcmRpbmFsaXR5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRhYmlsaXR5IiB0eXBlPSJjbWlzOmVudW1VcGRhdGFiaWxpdHkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gZmxhZ3MgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmhlcml0ZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im9yZGVyYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3BlbkNob2ljZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPCEtLSAgdHlwZSBzcGVjaWZpYyBkZWZpbml0aW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUJvb2xlYW4iIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUJvb2xlYW4iIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SWREZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlJZCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSWQiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SW50ZWdlckRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXIiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heFZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1pblZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUludGVnZXIiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlEYXRlVGltZSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc29sdXRpb24iCi0JCQkJCQl0eXBlPSJjbWlzOmVudW1EYXRlVGltZVJlc29sdXRpb24iIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZURhdGVUaW1lIiAvPgotCi0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhWYWx1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtaW5WYWx1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9ImNtaXM6ZW51bURlY2ltYWxQcmVjaXNpb24iCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGVjaW1hbCIgLz4KLQotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSHRtbCIgLz4KLQotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlTdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heExlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VTdHJpbmciIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5VXJpRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5VXJpIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VVcmkiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSB0eXBlIGRlZmluaXRpb24gLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8IS0tICBwcmltYXJ5IGlkZW50aWZ5aW5nIGF0dHJpYnV0ZSAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgYmFzZSB0eXBlIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYmFzZUlkIiB0eXBlPSJjbWlzOmVudW1CYXNlT2JqZWN0VHlwZUlkcyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBwYXJlbnQgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJlbnRJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIGlzIHRoZSBpZCBmb3IgdGhlIHBhcmVudCB0eXBlIGRlZmluaXRpb24uIElmCi0JCQkJCQl0aGlzIGlzIGEgYmFzZSB0eXBlLAotCQkJCQkJdGhpcyBpcyBub3QgcHJlc2VudC4KLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwhLS0gZmxhZ3MgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWxlYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImZ1bGx0ZXh0SW5kZXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgZGVmYXVsdD0idHJ1ZSIgLz4KLQotCQkJPCEtLSBjb250cm9sbGFibGUgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbnMgLS0+Ci0JCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQk8eHM6YXBwaW5mbz4KLQkJCQkJCTxqYXhiOnByb3BlcnR5IG5hbWU9InByb3BlcnR5RGVmaW5pdGlvbiIgLz4KLQkJCQkJPC94czphcHBpbmZvPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbiIKLQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGVjaW1hbERlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SWREZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUlkRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlIdG1sRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5VXJpRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmlEZWZpbml0aW9uVHlwZSIgLz4KLQkJCTwveHM6Y2hvaWNlPgotCi0JCQk8IS0tIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSB0eXBlIHNwZWNpZmljIHR5cGVkZWZzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtQWxsb3dlZCIgdHlwZT0iY21pczplbnVtQ29udGVudFN0cmVhbUFsbG93ZWQiCi0JCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVGb2xkZXJEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlUmVsYXRpb25zaGlwRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2VkU291cmNlVHlwZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93ZWRUYXJnZXRUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVQb2xpY3lEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tICBxdWVyeSAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1F1ZXJ5VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InN0YXRlbWVudCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2VhcmNoQWxsVmVyc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6YW55IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWVzcGFjZT0iIyNvdGhlciIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCi0JPCEtLSAgcmVwb3NpdG9yeSBpbmZvIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVwb3NpdG9yeUluZm9UeXBlIj4KLQkJPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMSI+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlOYW1lIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5RGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InZlbmRvck5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb2R1Y3ROYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9kdWN0VmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icm9vdEZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsYXRlc3RDaGFuZ2VMb2dUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdGllcyIgdHlwZT0iY21pczpjbWlzUmVwb3NpdG9yeUNhcGFiaWxpdGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhY2xDYXBhYmlsaXR5IiB0eXBlPSJjbWlzOmNtaXNBQ0xDYXBhYmlsaXR5VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNtaXNWZXJzaW9uU3VwcG9ydGVkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0aGluQ2xpZW50VVJJIiB0eXBlPSJ4czphbnlVUkkiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VzSW5jb21wbGV0ZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZXNPblR5cGUiIHR5cGU9ImNtaXM6ZW51bUJhc2VPYmplY3RUeXBlSWRzIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbEFub255bW91cyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlJZiBzZXQsIHRoaXMgZmllbGQgaG9sZHMgdGhlIHByaW5jaXBhbCB3aG8gaXMKLQkJCQkJCXVzZWQgZm9yIGFub255bW91cwotCQkJCQkJYWNjZXNzLiBUaGlzIHByaW5jaXBhbCBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gdGhlCi0JCQkJCQlBQ0wgc2VydmljZXMgdG8KLQkJCQkJCXNwZWNpZnkgd2hhdCBwZXJtaXNzaW9ucyBhbm9ueW1vdXMgdXNlcnMgc2hvdWxkCi0JCQkJCQloYXZlCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbEFueW9uZSIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlJZiBzZXQsIHRoaXMgZmllbGQgaG9sZHMgdGhlIHByaW5jaXBhbCB3aG8gaXMKLQkJCQkJCXVzZWQgZm9yIGV2ZXJ5b25lJ3MgYWNjZXNzLiBUaGlzIHByaW5jaXBhbCBjYW4gdGhlbiBiZSBwYXNzZWQgdG8KLQkJCQkJCXRoZQotCQkJCQkJQUNMIHNlcnZpY2VzIHRvCi0JCQkJCQlzcGVjaWZ5IHdoYXQgcGVybWlzc2lvbnMgZXZlcnlvbmUgc2hvdWxkCi0JCQkJCQloYXZlCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVwb3NpdG9yeUNhcGFiaWxpdGllc1R5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5QUNMIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5QUNMIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUFsbFZlcnNpb25zU2VhcmNoYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlDaGFuZ2VzIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5Q2hhbmdlcyIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGFiaWxpdHkiCi0JCQkJdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUdldERlc2NlbmRhbnRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUdldEZvbGRlclRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlNdWx0aWZpbGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlQV0NTZWFyY2hhYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVBXQ1VwZGF0YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlRdWVyeSIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eVF1ZXJ5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVJlbmRpdGlvbnMiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlSZW5kaXRpb24iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5VW5maWxpbmciIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5VmVyc2lvblNwZWNpZmljRmlsaW5nIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUpvaW4iIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlKb2luIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIFVuaWZpZWQgU2VhcmNoIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1UeXBlT2ZDaGFuZ2VzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhIG5ldyBJRCBoYXMgYmVlbiBjcmVhdGVkIC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjcmVhdGVkIiAvPgotCQkJPCEtLSBjb250ZW50IHdpdGggYW4gZXhpc3RpbmcgSUQgaGFzIGJlZW4gbW9kaWZpZWQgLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZWQiIC8+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhbiBleGlzdGluZyBJRCBoYXMgYmVlbiBkZWxldGVkIC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGVkIiAvPgotCQkJPCEtLSBjb250ZW50IHdpdGggYW4gZXhpc3RpbmcgSUQgaGFzIGhhZCBpdHMgc2VjdXJpdHkgcG9saWN5IGNoYW5nZWQtLT4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2VjdXJpdHkiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlDaGFuZ2VzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdGlkc29ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb3BlcnRpZXMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaGFuZ2VFdmVudFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUeXBlIiB0eXBlPSJjbWlzOmVudW1UeXBlT2ZDaGFuZ2VzIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIEFDTCAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQUNMUHJvcGFnYXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwb3NpdG9yeWRldGVybWluZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdG9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb3BhZ2F0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUFDTCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkaXNjb3ZlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFuYWdlIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1CYXNpY1Blcm1pc3Npb25zIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cmVhZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp3cml0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczphbGwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uRGVmaW5pdGlvbiI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBwcm9jZXNzQ29udGVudHM9ImxheCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uTWFwcGluZyI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0iY21pczplbnVtQWxsb3dhYmxlQWN0aW9uc0tleSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlNdWx0aXBsZSBlbnRyaWVzIGFyZSBPUidlZCB0b2dldGhlci4gQW55Ci0JCQkJCQlwZXJtaXNzaW9uIHRoYXQgc3BlY2lmaWVkIGlzCi0JCQkJCQlzdWZmaWNpZW50IHRvIHByb3ZpZGUgcmlnaHRzIHJlcXVpcmVkCi0JCQkJCQlpbiBrZXkKLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCTwveHM6ZWxlbWVudD4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1BbGxvd2FibGVBY3Rpb25zS2V5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldERlc2NlbmRlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Q2hpbGRyZW4uRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQYXJlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Rm9sZGVyUGFyZW50Lk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlRG9jdW1lbnQuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVGb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuU291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuVmlld0NvbnRlbnQuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5VcGRhdGVQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuTW92ZS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbk1vdmUuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5Nb3ZlLlNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlVHJlZS5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblNldENvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZUNvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFRvRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQWRkVG9Gb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVGcm9tRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuUmVtb3ZlRnJvbUZvbGRlci5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNoZWNrb3V0LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DYW5jZWxDaGVja291dC5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ2hlY2tpbi5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0QWxsVmVyc2lvbnMuVmVyc2lvblNlcmllcyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFwcGxpZWRQb2xpY2llcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFDTC5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFwcGx5QUNMLk9iamVjdCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVXNlcnMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp1c2VyIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIHVzZXIgY2FuIGJlIHVzZWQgb24gc2V0dGluZyBBQ0xzIHRvIHNwZWNpZnkKLQkJCQkJCXRoZSBwZXJtaXNzaW9uIHRoaXMKLQkJCQkJCXVzZXIgY29udGV4dCBzaG91bGQgaGF2ZS4KLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVudW1lcmF0aW9uPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gQUNMIG9uIG9iamVjdHMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sUHJpbmNpcGFsVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbElkIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWwiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xQcmluY2lwYWxUeXBlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkaXJlY3QiIHR5cGU9InhzOmJvb2xlYW4iIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQUNMQ2FwYWJpbGl0eVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJzdXBwb3J0ZWRQZXJtaXNzaW9ucyIgdHlwZT0iY21pczplbnVtU3VwcG9ydGVkUGVybWlzc2lvbnMiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wYWdhdGlvbiIgdHlwZT0iY21pczplbnVtQUNMUHJvcGFnYXRpb24iIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9ucyIgdHlwZT0iY21pczpjbWlzUGVybWlzc2lvbkRlZmluaXRpb24iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im1hcHBpbmciIHR5cGU9ImNtaXM6Y21pc1Blcm1pc3Npb25NYXBwaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1TdXBwb3J0ZWRQZXJtaXNzaW9ucyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJiYXNpYyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwb3NpdG9yeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90aCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tIHJlbmRpdGlvbnMgLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlSZW5kaXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVhZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUmVuZGl0aW9uS2luZCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnRodW1ibmFpbCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1JlbmRpdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJzdHJlYW1JZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImtpbmQiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InRpdGxlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImhlaWdodCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0id2lkdGgiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkRvY3VtZW50SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gZWxlbWVudHMgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0iY21pczpjbWlzQWxsb3dhYmxlQWN0aW9uc1R5cGUiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCVRoaXMgaXMgdGhlIHJvb3QgdGFnIGZvciBhIENNSVMgQWxsb3dhYmxlQWN0aW9ucwotCQkJCURvY3VtZW50IFR5cGUKLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCTwveHM6ZWxlbWVudD4KLQotCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJjbWlzOmNtaXNRdWVyeVR5cGUiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCVRoaXMgaXMgdGhlIHJvb3QgdGFnIGZvciBhIENNSVMgUXVlcnkgRG9jdW1lbnQgVHlwZQotCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImFjbCIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIEFDTCBEb2N1bWVudCBUeXBlCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KLQk8IS0tIEVPRiAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy93c2RsL2NtaXMxMC9DTUlTLU1lc3NhZ2luZy54c2QgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy93c2RsL2NtaXMxMC9DTUlTLU1lc3NhZ2luZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWQ3ODcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTAvQ01JUy1NZXNzYWdpbmcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjA3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi0JPCEtLQotCQlMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0JCW1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5Ci0JCW9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotCQlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0JCWFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKLQkJTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLQkJQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvcgotCQl0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLQkJTGljZW5zZS4KLQktLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvIgotCXhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmNtaXNtPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvIgotCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHZlcnNpb249IjEuMCIKLQl4bWxuczp4amM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIveGpjIgotCWpheGI6ZXh0ZW5zaW9uQmluZGluZ1ByZWZpeGVzPSJ4amMiIGpheGI6dmVyc2lvbj0iMi4xIgotCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotCTx4czppbXBvcnQgc2NoZW1hTG9jYXRpb249IkNNSVMtQ29yZS54c2QiCi0JCW5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iIC8+Ci0KLQk8IS0tIGV4Y2VwdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNGYXVsdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJjbWlzbTplbnVtU2VydmljZUV4Y2VwdGlvbiIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNvZGUiIHR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmVsZW1lbnQgbmFtZT0iY21pc0ZhdWx0IiB0eXBlPSJjbWlzbTpjbWlzRmF1bHRUeXBlIiAvPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1TZXJ2aWNlRXhjZXB0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnN0cmFpbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5hbWVDb25zdHJhaW50VmlvbGF0aW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjb250ZW50QWxyZWFkeUV4aXN0cyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmlsdGVyTm90VmFsaWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRBcmd1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90U3VwcG9ydGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvYmplY3ROb3RGb3VuZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icGVybWlzc2lvbkRlbmllZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icnVudGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RvcmFnZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyZWFtTm90U3VwcG9ydGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGVDb25mbGljdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idmVyc2lvbmluZyIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tIGV4dGVuc2lvbiAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0V4dGVuc2lvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTwhLS0gdHlwZXMgZm9yIFdTIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZUNvbnRhaW5lciI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIgCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGlsZHJlbiIgdHlwZT0iY21pc206Y21pc1R5cGVDb250YWluZXIiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURlZmluaXRpb25MaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVzIiB0eXBlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Imhhc01vcmVJdGVtcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im51bUl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SW5Gb2xkZXIiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RJbkZvbGRlclR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGlsZHJlbiIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4JCi0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0TGlzdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJoYXNNb3JlSXRlbXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJudW1JdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+CQkKLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SW5Gb2xkZXJUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0IiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIiAKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGF0aFNlZ21lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+CQkKLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RQYXJlbnRzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIgCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbGF0aXZlUGF0aFNlZ21lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+IAotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaGFzTW9yZUl0ZW1zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibnVtSXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZXBvc2l0b3J5RW50cnlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDb250ZW50U3RyZWFtVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWltZVR5cGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsZW5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWFtIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiCi0JCQkJeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQUNMVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9IkFDTCIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXhhY3QiIHR5cGU9InhzOmJvb2xlYW4iIAotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtSZXBvc2l0b3J5IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIGdldFJlcG9zaXRvcmllcyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yaWVzIiB0eXBlPSJjbWlzbTpjbWlzUmVwb3NpdG9yeUVudHJ5VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCi0JPCEtLSBnZXRSZXBvc2l0b3J5SW5mbyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm8iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mb1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJbmZvIiB0eXBlPSJjbWlzOmNtaXNSZXBvc2l0b3J5SW5mb1R5cGUiIAotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldFR5cGVDaGlsZHJlbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZUNoaWxkcmVuIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlQ2hpbGRyZW5SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlcyIgdHlwZT0iY21pc206Y21pc1R5cGVEZWZpbml0aW9uTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldFR5cGVEZXNjZW5kYW50cyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZURlc2NlbmRhbnRzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImRlcHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlcyIgdHlwZT0iY21pc206Y21pc1R5cGVDb250YWluZXIiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0VHlwZURlZmluaXRpb24gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVEZWZpbml0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVEZWZpbml0aW9uUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbTmF2aWdhdGlvbiBTZXJ2aWNlc10gLS0+Ci0JCi0JPCEtLSBnZXREZXNjZW5kYW50cyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0RGVzY2VuZGFudHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImRlcHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0RGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldERlc2NlbmRhbnRzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRGb2xkZXJUcmVlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJkZXB0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUGF0aFNlZ21lbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRGb2xkZXJUcmVlUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRDaGlsZHJlbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Q2hpbGRyZW4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3JkZXJCeSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRGb2xkZXJQYXJlbnQgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclBhcmVudFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0T2JqZWN0UGFyZW50cyBPcGVyYXRpb24tLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RQYXJlbnRzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFBhcmVudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJlbnRzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0UGFyZW50c1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0UmVuZGl0aW9ucyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVuZGl0aW9ucyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFJlbmRpdGlvbnNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25zIiB0eXBlPSJjbWlzOmNtaXNSZW5kaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENoZWNrZWRvdXREb2NzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGVja2VkT3V0RG9jcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlckJ5IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGVja2VkT3V0RG9jc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbT2JqZWN0IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIGNyZWF0ZURvY3VtZW50IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVEb2N1bWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtIiB0eXBlPSJjbWlzbTpjbWlzQ29udGVudFN0cmVhbVR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uaW5nU3RhdGUiIHR5cGU9ImNtaXM6ZW51bVZlcnNpb25pbmdTdGF0ZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZURvY3VtZW50UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzb3VyY2VJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+CQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idmVyc2lvbmluZ1N0YXRlIiB0eXBlPSJjbWlzOmVudW1WZXJzaW9uaW5nU3RhdGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVGb2xkZXIgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZUZvbGRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZUZvbGRlclJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVSZWxhdGlvbnNoaXAgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWNpZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWRkQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVQb2xpY3kgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZVBvbGljeSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVQb2xpY3lSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSBnZXRBbGxvd2FibGVBY3Rpb25zIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRQcm9wZXJ0aWVzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiAKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUG9saWN5SWRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdEJ5UGF0aCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0QnlQYXRoIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXRoIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIAotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQb2xpY3lJZHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RCeVBhdGhSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENvbnRlbnRTdHJlYW0gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRTdHJlYW0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InN0cmVhbUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvZmZzZXQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtIiB0eXBlPSJjbWlzbTpjbWlzQ29udGVudFN0cmVhbVR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIHVwZGF0ZVByb3BlcnRpZXMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZVByb3BlcnRpZXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTwhLS0KLQkJCQkJaWYgb2JqZWN0SWQgaXMgcHJlc2VudCBpbiB0aGUgcHJvcGVydGllcyB0aGUgdmFsdWUgbXVzdCBtYXRjaCB0aGlzCi0JCQkJCW9iamVjdElkCi0JCQkJLS0+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZVByb3BlcnRpZXNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gbW92ZU9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ibW92ZU9iamVjdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idGFyZ2V0Rm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic291cmNlRm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Im1vdmVPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGRlbGV0ZU9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlT2JqZWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBkZWxldGVUcmVlIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVUcmVlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InVuZmlsZU9iamVjdHMiIHR5cGU9ImNtaXM6ZW51bVVuZmlsZU9iamVjdCIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRpbnVlT25GYWlsdXJlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImRlbGV0ZVRyZWVSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmYWlsZWRUb0RlbGV0ZSI+Ci0JCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZHMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQkJCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBzZXRDb250ZW50U3RyZWFtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXRDb250ZW50U3RyZWFtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvdmVyd3JpdGVGbGFnIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZGVsZXRlQ29udGVudFN0cmVhbSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImRlbGV0ZUNvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLVtNdWx0aS1maWxpbmcgU2VydmljZXNdLS0+Ci0KLQk8IS0tIGFkZE9iamVjdFRvRm9sZGVyIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRPYmplY3RUb0ZvbGRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWxsVmVyc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRPYmplY3RUb0ZvbGRlclJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gcmVtb3ZlT2JqZWN0RnJvbUZvbGRlciBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlT2JqZWN0RnJvbUZvbGRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQkKLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS0gW0Rpc2NvdmVyeSBTZXJ2aWNlc10gLS0+Ci0JCi0JPCEtLSBxdWVyeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icXVlcnkiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InN0YXRlbWVudCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzZWFyY2hBbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRDb250ZW50Q2hhbmdlcyBvcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Q29udGVudENoYW5nZXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZUxvZ1Rva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUHJvcGVydGllcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBvbGljeUlkcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDb250ZW50Q2hhbmdlc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlTG9nVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbVmVyc2lvbmluZyBTZXJ2aWNlc10gLS0+Ci0KLQk8IS0tIGNoZWNrT3V0IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjaGVja091dCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNoZWNrT3V0UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udGVudENvcGllZCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjYW5jZWxDaGVja091dCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2FuY2VsQ2hlY2tPdXQiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5jZWxDaGVja091dFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNoZWNrSW4gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNoZWNrSW4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1ham9yIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtIiB0eXBlPSJjbWlzbTpjbWlzQ29udGVudFN0cmVhbVR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGVja2luQ29tbWVudCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tJblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYWpvciIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWFqb3IiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiAKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUG9saWN5SWRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RPZkxhdGVzdFZlcnNpb25SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldEFsbFZlcnNpb25zIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRBbGxWZXJzaW9ucyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldEFsbFZlcnNpb25zUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tW1JlbGF0aW9uc2hpcCBTZXJ2aWNlc10tLT4KLQotCTwhLS0gZ2V0UmVsYXRpb25zaGlwcyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBEaXJlY3Rpb24iIHR5cGU9ImNtaXM6ZW51bVJlbGF0aW9uc2hpcERpcmVjdGlvbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tW1BvbGljeSBTZXJ2aWNlc10tLT4KLQotCTwhLS0gYXBwbHlQb2xpY3kgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFwcGx5UG9saWN5Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY3lJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlQb2xpY3lSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSByZW1vdmVQb2xpY3kgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9InJlbW92ZVBvbGljeSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWN5SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InJlbW92ZVBvbGljeVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0QXBwbGllZFBvbGljaWVzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRBcHBsaWVkUG9saWNpZXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldEFwcGxpZWRQb2xpY2llc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0QUNMIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRBQ0wiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9ubHlCYXNpY1Blcm1pc3Npb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldEFDTFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFDTCIgdHlwZT0iY21pc206Y21pc0FDTFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4JCi0JPC94czplbGVtZW50PgotCQotCTwhLS0gYXBwbHlBQ0wgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFwcGx5QUNMIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQUNMUHJvcGFnYXRpb24iIHR5cGU9ImNtaXM6ZW51bUFDTFByb3BhZ2F0aW9uIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlBQ0xSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0wiIHR5cGU9ImNtaXNtOmNtaXNBQ0xUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy93c2RsL2NtaXMxMC9DTUlTV1MtU2VydmljZS53c2RsIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTAvQ01JU1dTLVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0OTUxMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy93c2RsL2NtaXMxMC9DTUlTV1MtU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTE3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi0JPCEtLQotCQlMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0JCW1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5Ci0JCW9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotCQlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0JCWFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKLQkJTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLQkJQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvcgotCQl0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLQkJTGljZW5zZS4KLQktLT4KLQotPGRlZmluaXRpb25zIHhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmNtaXNtPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvIgotCXhtbG5zOmNtaXN3PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOm5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC8iCi0JeG1sbnM6amF4d3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheHdzIiBuYW1lPSJDTUlTV2ViU2VydmljZXMiPgotCTx0eXBlcz4KLQkJPHhzZDpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyI+Ci0JCQk8eHNkOmltcG9ydCBzY2hlbWFMb2NhdGlvbj0iQ01JUy1Db3JlLnhzZCIKLQkJCQluYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIiAvPgotCQkJPHhzZDppbXBvcnQgc2NoZW1hTG9jYXRpb249IkNNSVMtTWVzc2FnaW5nLnhzZCIKLQkJCQluYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC8iIC8+Ci0JCTwveHNkOnNjaGVtYT4KLQk8L3R5cGVzPgotCi0JPG1lc3NhZ2UgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCTxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJjbWlzbTpjbWlzRmF1bHQiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0QUNMUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFDTCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QUNMUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBQ0xSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJhcHBseUFDTFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphcHBseUFDTCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYXBwbHlBQ0xSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGx5QUNMUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0icXVlcnlSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206cXVlcnkiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InF1ZXJ5UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpxdWVyeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDb250ZW50Q2hhbmdlc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDb250ZW50Q2hhbmdlcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q29udGVudENoYW5nZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRDaGFuZ2VzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iYWRkT2JqZWN0VG9Gb2xkZXJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YWRkT2JqZWN0VG9Gb2xkZXIiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphZGRPYmplY3RUb0ZvbGRlclJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZU9iamVjdEZyb21Gb2xkZXIiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXREZXNjZW5kYW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXREZXNjZW5kYW50cyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0RGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldERlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENoaWxkcmVuUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENoaWxkcmVuIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q2hpbGRyZW5SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEZvbGRlclBhcmVudCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRGb2xkZXJQYXJlbnRSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UGFyZW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RQYXJlbnRzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RQYXJlbnRzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RQYXJlbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFJlbmRpdGlvbnNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVuZGl0aW9ucyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVuZGl0aW9uc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVuZGl0aW9uc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDaGVja2VkT3V0RG9jc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDaGVja2VkT3V0RG9jcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q2hlY2tlZE91dERvY3NSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENoZWNrZWRPdXREb2NzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iY3JlYXRlRG9jdW1lbnRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRG9jdW1lbnQiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZURvY3VtZW50UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVEb2N1bWVudFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVGb2xkZXJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRm9sZGVyIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVGb2xkZXJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZUZvbGRlclJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUmVsYXRpb25zaGlwIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXBSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVJlbGF0aW9uc2hpcFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVQb2xpY3lSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUG9saWN5IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVQb2xpY3lSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVBvbGljeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFsbG93YWJsZUFjdGlvbnMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFsbG93YWJsZUFjdGlvbnNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFsbG93YWJsZUFjdGlvbnNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UHJvcGVydGllc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRQcm9wZXJ0aWVzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0QnlQYXRoUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdEJ5UGF0aCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0QnlQYXRoUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RCeVBhdGhSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRDb250ZW50U3RyZWFtUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRTdHJlYW0iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0idXBkYXRlUHJvcGVydGllc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTp1cGRhdGVQcm9wZXJ0aWVzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJ1cGRhdGVQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTp1cGRhdGVQcm9wZXJ0aWVzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9Im1vdmVPYmplY3RSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206bW92ZU9iamVjdCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ibW92ZU9iamVjdFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206bW92ZU9iamVjdFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVPYmplY3RSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlT2JqZWN0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVPYmplY3RSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZU9iamVjdFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVUcmVlUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZVRyZWUiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZVRyZWVSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZVRyZWVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ic2V0Q29udGVudFN0cmVhbVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpzZXRDb250ZW50U3RyZWFtIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZUNvbnRlbnRTdHJlYW1SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlQ29udGVudFN0cmVhbSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImFwcGx5UG9saWN5UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGx5UG9saWN5IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJhcHBseVBvbGljeVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YXBwbHlQb2xpY3lSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icmVtb3ZlUG9saWN5UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZVBvbGljeSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icmVtb3ZlUG9saWN5UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpyZW1vdmVQb2xpY3lSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFwcGxpZWRQb2xpY2llcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBcHBsaWVkUG9saWNpZXNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdFJlbGF0aW9uc2hpcHMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZXBvc2l0b3JpZXNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVwb3NpdG9yaWVzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZXBvc2l0b3JpZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFJlcG9zaXRvcmllc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mb1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRSZXBvc2l0b3J5SW5mbyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm9SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFJlcG9zaXRvcnlJbmZvUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVDaGlsZHJlblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlQ2hpbGRyZW4iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZUNoaWxkcmVuUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlRGVzY2VuZGFudHMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50c1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZURlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVEZWZpbml0aW9uUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFR5cGVEZWZpbml0aW9uIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRUeXBlRGVmaW5pdGlvblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZURlZmluaXRpb25SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJjaGVja091dFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjaGVja091dCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY2hlY2tPdXRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNoZWNrT3V0UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNhbmNlbENoZWNrT3V0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNhbmNlbENoZWNrT3V0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjYW5jZWxDaGVja091dFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y2FuY2VsQ2hlY2tPdXRSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY2hlY2tJblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjaGVja0luIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjaGVja0luUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjaGVja0luUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgkKLQk8bWVzc2FnZSBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QWxsVmVyc2lvbnNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QWxsVmVyc2lvbnMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFsbFZlcnNpb25zUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBbGxWZXJzaW9uc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImdldEZvbGRlclRyZWVSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Rm9sZGVyVHJlZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyVHJlZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Rm9sZGVyVHJlZVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJEaXNjb3ZlcnlTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0icXVlcnkiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnF1ZXJ5UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6cXVlcnlSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRDb250ZW50Q2hhbmdlcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q29udGVudENoYW5nZXNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDb250ZW50Q2hhbmdlc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYWRkT2JqZWN0VG9Gb2xkZXIiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmFkZE9iamVjdFRvRm9sZGVyUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6YWRkT2JqZWN0VG9Gb2xkZXJSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpyZW1vdmVPYmplY3RGcm9tRm9sZGVyUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6cmVtb3ZlT2JqZWN0RnJvbUZvbGRlclJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9Ik5hdmlnYXRpb25TZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0RGVzY2VuZGFudHMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldERlc2NlbmRhbnRzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0RGVzY2VuZGFudHNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRDaGlsZHJlbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q2hpbGRyZW5SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDaGlsZHJlblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Rm9sZGVyUGFyZW50UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0Rm9sZGVyUGFyZW50UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Rm9sZGVyVHJlZSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Rm9sZGVyVHJlZVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEZvbGRlclRyZWVSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RQYXJlbnRzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRPYmplY3RQYXJlbnRzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UGFyZW50c1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENoZWNrZWRPdXREb2NzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDaGVja2VkT3V0RG9jc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldENoZWNrZWRPdXREb2NzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iT2JqZWN0U2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVEb2N1bWVudFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZURvY3VtZW50UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVGb2xkZXIiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZUZvbGRlclJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZUZvbGRlclJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlUmVsYXRpb25zaGlwUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlUG9saWN5Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVQb2xpY3lSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVQb2xpY3lSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBbGxvd2FibGVBY3Rpb25zUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UHJvcGVydGllcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UHJvcGVydGllc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFByb3BlcnRpZXNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZW5kaXRpb25zIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRSZW5kaXRpb25zUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVuZGl0aW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdEJ5UGF0aCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0QnlQYXRoUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0QnlQYXRoUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudFN0cmVhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q29udGVudFN0cmVhbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGVQcm9wZXJ0aWVzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzp1cGRhdGVQcm9wZXJ0aWVzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6dXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9Im1vdmVPYmplY3QiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3Om1vdmVPYmplY3RSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzptb3ZlT2JqZWN0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlT2JqZWN0Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVPYmplY3RSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVPYmplY3RSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVUcmVlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVUcmVlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6ZGVsZXRlVHJlZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InNldENvbnRlbnRTdHJlYW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnNldENvbnRlbnRTdHJlYW1SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6ZGVsZXRlQ29udGVudFN0cmVhbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmRlbGV0ZUNvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJQb2xpY3lTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwbHlQb2xpY3kiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmFwcGx5UG9saWN5UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6YXBwbHlQb2xpY3lSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJyZW1vdmVQb2xpY3kiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnJlbW92ZVBvbGljeVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OnJlbW92ZVBvbGljeVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0QXBwbGllZFBvbGljaWVzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVsYXRpb25zaGlwc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJSZXBvc2l0b3J5U2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFJlcG9zaXRvcmllcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVwb3NpdG9yaWVzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVwb3NpdG9yaWVzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm8iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFJlcG9zaXRvcnlJbmZvUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVwb3NpdG9yeUluZm9SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlQ2hpbGRyZW4iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVDaGlsZHJlblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVDaGlsZHJlblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50cyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZURlc2NlbmRhbnRzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZURlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZURlZmluaXRpb24iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVEZWZpbml0aW9uUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZURlZmluaXRpb25SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJWZXJzaW9uaW5nU2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrT3V0Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjaGVja091dFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNoZWNrT3V0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY2FuY2VsQ2hlY2tPdXQiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNhbmNlbENoZWNrT3V0UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y2FuY2VsQ2hlY2tPdXRSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0luIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjaGVja0luUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y2hlY2tJblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxWZXJzaW9ucyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0QWxsVmVyc2lvbnNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBbGxWZXJzaW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9IkFDTFNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBQ0wiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFDTFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFDTFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFwcGx5QUNMIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzphcHBseUFDTFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmFwcGx5QUNMUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQotCi0JPGJpbmRpbmcgbmFtZT0iRGlzY292ZXJ5U2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpEaXNjb3ZlcnlTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0icXVlcnkiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudENoYW5nZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9Ik11bHRpRmlsaW5nU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpNdWx0aUZpbGluZ1NlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGRPYmplY3RUb0ZvbGRlciI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpOYXZpZ2F0aW9uU2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldERlc2NlbmRhbnRzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENoaWxkcmVuIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRGb2xkZXJUcmVlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdFBhcmVudHMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q2hlY2tlZE91dERvY3MiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9Ik9iamVjdFNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6T2JqZWN0U2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVGb2xkZXIiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVBvbGljeSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRQcm9wZXJ0aWVzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFJlbmRpdGlvbnMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0QnlQYXRoIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0idXBkYXRlUHJvcGVydGllcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJtb3ZlT2JqZWN0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZU9iamVjdCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVUcmVlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InNldENvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iUG9saWN5U2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpQb2xpY3lTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwbHlQb2xpY3kiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0icmVtb3ZlUG9saWN5Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iUmVwb3NpdG9yeVNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6UmVwb3NpdG9yeVNlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZXBvc2l0b3JpZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm8iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZUNoaWxkcmVuIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50cyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlRGVmaW5pdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iVmVyc2lvbmluZ1NlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6VmVyc2lvbmluZ1NlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja091dCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjYW5jZWxDaGVja091dCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0luIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFsbFZlcnNpb25zIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJBQ0xTZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3OkFDTFNlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBQ0wiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwbHlBQ0wiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCi0KLQk8c2VydmljZSBuYW1lPSJEaXNjb3ZlcnlTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iRGlzY292ZXJ5U2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3OkRpc2NvdmVyeVNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL0Rpc2NvdmVyeVNlcnZpY2UuRGlzY292ZXJ5U2VydmljZVBvcnQiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6TXVsdGlGaWxpbmdTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vY21pcy9zZXJ2aWNlcy9NdWx0aUZpbGluZ1NlcnZpY2UuTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9Ik5hdmlnYXRpb25TZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6TmF2aWdhdGlvblNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlLk5hdmlnYXRpb25TZXJ2aWNlUG9ydCIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJPYmplY3RTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iT2JqZWN0U2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3Ok9iamVjdFNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vY21pcy9zZXJ2aWNlcy9PYmplY3RTZXJ2aWNlLk9iamVjdFNlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlBvbGljeVNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJQb2xpY3lTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6UG9saWN5U2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL1BvbGljeVNlcnZpY2UuUG9saWN5U2VydmljZVBvcnQiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vY21pcy9zZXJ2aWNlcy9SZWxhdGlvbnNoaXBTZXJ2aWNlLlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlJlcG9zaXRvcnlTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iUmVwb3NpdG9yeVNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpSZXBvc2l0b3J5U2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2NtaXMvc2VydmljZXMvUmVwb3NpdG9yeVNlcnZpY2UuUmVwb3NpdG9yeVNlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlZlcnNpb25pbmdTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iVmVyc2lvbmluZ1NlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpWZXJzaW9uaW5nU2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2NtaXMvc2VydmljZXMvVmVyc2lvbmluZ1NlcnZpY2UuVmVyc2lvbmluZ1NlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IkFDTFNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJBQ0xTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6QUNMU2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL0FDTFNlcnZpY2UuQUNMU2VydmljZVBvcnQiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTAveG1sLnhzZCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL3dzZGwvY21pczEwL3htbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODkzZmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTAveG1sLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLQk8IS0tCi0JCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLQkJbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkKLQkJb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLQkJYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotCQlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotCQlDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yCi0JCXRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotCQlMaWNlbnNlLgotCS0tPgotCQotPHhzZDpzY2hlbWEgCi10YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgCi14bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLXhtbDpsYW5nPSJlbiI+Ci0gPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+Ci0gIDx4c2Q6c2ltcGxlVHlwZT4KLSAgIDx4c2Q6dW5pb24gbWVtYmVyVHlwZXM9InhzZDpsYW5ndWFnZSI+Ci0gICAgPHhzZDpzaW1wbGVUeXBlPiAgICAKLSAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IiIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgPC94c2Q6dW5pb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gPC94c2Q6YXR0cmlidXRlPgotCi0gPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiPgotICA8eHNkOnNpbXBsZVR5cGU+Ci0gICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KLSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcmVzZXJ2ZSIvPgotICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gPC94c2Q6YXR0cmlidXRlPgotCi0gPHhzZDphdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0ieHNkOmFueVVSSSI+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZWUgaHR0cDovL3d3dy53My5vcmcvVFIveG1sYmFzZS8gZm9yCi0gICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotIDwveHNkOmF0dHJpYnV0ZT4KLSAKLSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOklEIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtaWQvIGZvcgotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSA8L3hzZDphdHRyaWJ1dGU+Ci0KLSA8eHNkOmF0dHJpYnV0ZUdyb3VwIG5hbWU9InNwZWNpYWxBdHRycyI+Ci0gIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmJhc2UiLz4KLSAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgotICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpzcGFjZSIvPgotICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDppZCIvPgotIDwveHNkOmF0dHJpYnV0ZUdyb3VwPgotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTEvQ01JUy1Db3JlLnhzZCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL3dzZGwvY21pczExL0NNSVMtQ29yZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YWQwMWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTEvQ01JUy1Db3JlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCTwhLS0KLQkJTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdQotCQltYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heQotCQlvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLQkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieQotCQlhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0JCUxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi0JCUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IKLQkJdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0JCUxpY2Vuc2UuCi0JLS0+Ci0JCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHhtbG5zOnhqYz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiCi0JamF4YjpleHRlbnNpb25CaW5kaW5nUHJlZml4ZXM9InhqYyIgamF4Yjp2ZXJzaW9uPSIyLjEiCi0JeG1sbnM6Y21pcz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iIHZlcnNpb249IjEuMCI+Ci0KLQk8IS0tICBlbnVtcyAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtRGVjaW1hbFByZWNpc2lvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMzIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjY0IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ29udGVudFN0cmVhbUFsbG93ZWQiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90YWxsb3dlZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsb3dlZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVxdWlyZWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXJkaW5hbGl0eSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzaW5nbGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im11bHRpIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVXBkYXRhYmlsaXR5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlYWRvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZWFkd3JpdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IndoZW5jaGVja2Vkb3V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvbmNyZWF0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bURhdGVUaW1lUmVzb2x1dGlvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZWFyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkYXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0aW1lIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydHlUeXBlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvb2xlYW4iIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlZ2VyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkYXRldGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVjaW1hbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHRtbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cmkiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1CYXNlT2JqZWN0VHlwZUlkcyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpyZWxhdGlvbnNoaXAiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cG9saWN5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOml0ZW0iIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6c2Vjb25kYXJ5IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eVF1ZXJ5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1ldGFkYXRhb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbHRleHRvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3Roc2VwYXJhdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGhjb21iaW5lZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlKb2luIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW5uZXJhbmRvdXRlciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbnl0aW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwd2Nvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVmVyc2lvbmluZ1N0YXRlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrZWRvdXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1pbm9yIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYWpvciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVuZmlsZU9iamVjdCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmZpbGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZXNpbmdsZWZpbGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1SZWxhdGlvbnNoaXBEaXJlY3Rpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0YXJnZXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVpdGhlciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3RoIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gIHByb3BlcnRpZXMgaW4gQ01JUyAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0Jhc2UiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpuYW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmRlc2NyaXB0aW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm9iamVjdElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm9iamVjdFR5cGVJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpiYXNlVHlwZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnNlY29uZGFyeU9iamVjdFR5cGVJZHMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y3JlYXRlZEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNyZWF0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpZWRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjaGFuZ2VUb2tlbiIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0RvY3VtZW50Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNJbW11dGFibGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNMYXRlc3RWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTGF0ZXN0TWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzUHJpdmF0ZVdvcmtpbmdDb3B5IiAvPgkJCQotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25MYWJlbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzSWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y2hlY2tpbkNvbW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjb250ZW50U3RyZWFtTWltZVR5cGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUZpbGVOYW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1JZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0ZvbGRlciI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBhcmVudElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cGF0aCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1JlbGF0aW9uc2hpcCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnNvdXJjZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnRhcmdldElkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQkKLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1BvbGljeSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBvbGljeVRleHQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiPgotCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czphdHRyaWJ1dGVHcm91cD4KLQotCTwhLS0gIG1haW4gY21pcyBvYmplY3QgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXAiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQotCQkJPCEtLSAgaWYgY2hhbmdlIGxvZyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZUV2ZW50SW5mbyIgdHlwZT0iY21pczpjbWlzQ2hhbmdlRXZlbnRUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tICBBQ0wgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhY2wiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXhhY3RBQ0wiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gQXBwbGllZCBQb2xpY3kgSURzIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWN5SWRzIiB0eXBlPSJjbWlzOmNtaXNMaXN0T2ZJZHNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tICBSZW5kaXRpb24gLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb24iIHR5cGU9ImNtaXM6Y21pc1JlbmRpdGlvblR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQotCQkJPCEtLSAgZXh0ZW5zaW9ucyAtLT4KLQkJCTx4czphbnkgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0JCQkJbmFtZXNwYWNlPSIjI290aGVyIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSBwcm9wZXJ0eSBiYWcgLS0+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnRpZXNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmFwcGluZm8+Ci0JCQkJCQk8amF4Yjpwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eSIgLz4KLQkJCQkJPC94czphcHBpbmZvPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUJvb2xlYW4iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5Qm9vbGVhbiIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJZCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJZCIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJbnRlZ2VyIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXIiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGF0ZVRpbWUiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGF0ZVRpbWUiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGVjaW1hbCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUh0bWwiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbCIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlTdHJpbmciIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVVyaSIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmkiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gc3RhcnQgdGhlIHByb3AgZGVmaW5pdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eSI+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvcGVydHlEZWZpbml0aW9uSWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpZCBmb3IgdGhpcwotCQkJCQlwcm9wZXJ0eSBpbnN0YW5jZS4gVGhpcyBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZAotCQkJCQlhcyBhIGRlZmF1bHQgdmFsdWUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZCBmb3IgCi0JCQkJCXF1ZXJ5IHJlc3VsdCBzZXQgb3IgcmV0dXJuaW5nIHByb3BlcnRpZXMgb24gYW4gb2JqZWN0LgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIGxvY2FsbmFtZSBhcyBkZWZpbmVkIGJ5IHRoZSBwcm9wZXJ0eQotCQkJCQlkZWZpbml0aW9uLgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgZGlzcGxheW5hbWUgYXMgZGVmaW5lZCBieSB0aGUgcHJvcGVydHkKLQkJCQkJZGVmaW5pdGlvbi4KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIj4KLQkJCTx4czphbm5vdGF0aW9uPgotCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQlUaGlzIGlzIHRoZSBxdWVyeU5hbWUuIFRoaXMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLQkJCQkJdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgcXVlcnkuIElmIGFsaWFzZXMgYXJlIHVzZWQsIHRoZSBhbGlhcyBpcyB0bwotCQkJCQliZSBzcGVjaWZpZWQgaGVyZSBpbnN0ZWFkIG9mIHRoZSBxdWVyeU5hbWUuCi0JCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJPC94czphbm5vdGF0aW9uPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUJvb2xlYW4iPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6Ym9vbGVhbiIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SWQiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlJbnRlZ2VyIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURhdGVUaW1lIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmRhdGVUaW1lIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEZWNpbWFsIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmRlY2ltYWwiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUh0bWwiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVN0cmluZyI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVVyaSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gY21pcyBjaG9pY2UgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2UiPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlQm9vbGVhbiI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6Ym9vbGVhbiIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlQm9vbGVhbiIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUlkIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUlkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlSW50ZWdlciI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6aW50ZWdlciIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSW50ZWdlciIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZURhdGVUaW1lIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkYXRlVGltZSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGF0ZVRpbWUiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VEZWNpbWFsIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkZWNpbWFsIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEZWNpbWFsIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlSHRtbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VIdG1sIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VTdHJpbmciPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlU3RyaW5nIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlVXJpIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVVyaSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCi0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tICBhbGxvd2FibGUgYWN0aW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuRGVsZXRlT2JqZWN0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuVXBkYXRlUHJvcGVydGllcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEZvbGRlclRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRQcm9wZXJ0aWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldE9iamVjdFBhcmVudHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRGb2xkZXJQYXJlbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXREZXNjZW5kYW50cyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbk1vdmVPYmplY3QiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5EZWxldGVDb250ZW50U3RyZWFtIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ2hlY2tPdXQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DYW5jZWxDaGVja091dCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNoZWNrSW4iIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5TZXRDb250ZW50U3RyZWFtIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QWxsVmVyc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5BZGRPYmplY3RUb0ZvbGRlciIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhblJlbW92ZU9iamVjdEZyb21Gb2xkZXIiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRDb250ZW50U3RyZWFtIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQXBwbHlQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRBcHBsaWVkUG9saWNpZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5SZW1vdmVQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRDaGlsZHJlbiIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZURvY3VtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlRm9sZGVyIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlUmVsYXRpb25zaGlwIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlSXRlbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZVRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcmVuZGl0aW9ucyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldFJlbmRpdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gQUNMIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QUNMIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQXBwbHlBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNMaXN0T2ZJZHNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIGJ1bGtVcGRhdGVQcm9wZXJ0aWVzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SWRBbmRDaGFuZ2VUb2tlblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibmV3SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQnVsa1VwZGF0ZVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZEFuZENoYW5nZVRva2VuIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRTZWNvbmRhcnlUeXBlSWRzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZVNlY29uZGFyeVR5cGVJZHMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCQotCQkJPCEtLSAgZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIFByb3BlcnR5IEF0dHJpYnV0ZXMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVR5cGUiIHR5cGU9ImNtaXM6ZW51bVByb3BlcnR5VHlwZSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcmRpbmFsaXR5IiB0eXBlPSJjbWlzOmVudW1DYXJkaW5hbGl0eSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InVwZGF0YWJpbGl0eSIgdHlwZT0iY21pczplbnVtVXBkYXRhYmlsaXR5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIGZsYWdzIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGVkIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlcmFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9Im9wZW5DaG9pY2UiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTwhLS0gIHR5cGUgc3BlY2lmaWMgZGVmaW5pdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlCb29sZWFuIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VCb29sZWFuIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlJZERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUlkIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SW50ZWdlckRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXIiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heFZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1pblZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUludGVnZXIiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGF0ZVRpbWUiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXNvbHV0aW9uIgotCQkJCQkJdHlwZT0iY21pczplbnVtRGF0ZVRpbWVSZXNvbHV0aW9uIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEYXRlVGltZSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURlY2ltYWwiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heFZhbHVlIiB0eXBlPSJ4czpkZWNpbWFsIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1pblZhbHVlIiB0eXBlPSJ4czpkZWNpbWFsIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InByZWNpc2lvbiIgdHlwZT0iY21pczplbnVtRGVjaW1hbFByZWNpc2lvbiIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEZWNpbWFsIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSHRtbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhMZW5ndGgiIHR5cGU9InhzOmludGVnZXIiCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlU3RyaW5nIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlVcmlEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmkiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVVyaSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSB0eXBlIGRlZmluaXRpb24gLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8IS0tICBwcmltYXJ5IGlkZW50aWZ5aW5nIGF0dHJpYnV0ZSAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgYmFzZSB0eXBlIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYmFzZUlkIiB0eXBlPSJjbWlzOmVudW1CYXNlT2JqZWN0VHlwZUlkcyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBwYXJlbnQgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJlbnRJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIGlzIHRoZSBpZCBmb3IgdGhlIHBhcmVudCB0eXBlIGRlZmluaXRpb24uCi0JCQkJCQlJZiB0aGlzIGlzIGEgYmFzZSB0eXBlLCB0aGlzIGlzIE1VU1QgTk9UIGJlIHByZXNlbnQuCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwhLS0gZmxhZ3MgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWxlYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImZ1bGx0ZXh0SW5kZXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgZGVmYXVsdD0idHJ1ZSIgLz4KLQotCQkJPCEtLSBjb250cm9sbGFibGUgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCi0JCQk8IS0tIHR5cGUgbXV0YWJpbGl0eS0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZU11dGFiaWxpdHkiIHR5cGU9ImNtaXM6Y21pc1R5cGVNdXRhYmlsaXR5Q2FwYWJpbGl0aWVzVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBwcm9wZXJ0eSBkZWZpbml0aW9ucyAtLT4KLQkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czphcHBpbmZvPgotCQkJCQkJPGpheGI6cHJvcGVydHkgbmFtZT0icHJvcGVydHlEZWZpbml0aW9uIiAvPgotCQkJCQk8L3hzOmFwcGluZm8+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJZERlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SWREZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUh0bWxEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUh0bWxEZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlVcmlEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVVyaURlZmluaXRpb25UeXBlIiAvPgotCQkJPC94czpjaG9pY2U+Ci0KLQkJCTwhLS0gZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIHR5cGUgc3BlY2lmaWMgdHlwZWRlZnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InZlcnNpb25hYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW1BbGxvd2VkIiB0eXBlPSJjbWlzOmVudW1Db250ZW50U3RyZWFtQWxsb3dlZCIKLQkJCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZUZvbGRlckRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVSZWxhdGlvbnNoaXBEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93ZWRTb3VyY2VUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWxsb3dlZFRhcmdldFR5cGVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZVBvbGljeURlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVJdGVtRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZVNlY29uZGFyeURlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4JCi0KLQk8IS0tICBxdWVyeSAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1F1ZXJ5VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InN0YXRlbWVudCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2VhcmNoQWxsVmVyc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6YW55IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWVzcGFjZT0iIyNvdGhlciIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCi0JPCEtLSAgcmVwb3NpdG9yeSBpbmZvIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVwb3NpdG9yeUluZm9UeXBlIj4KLQkJPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMSI+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlOYW1lIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5RGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InZlbmRvck5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb2R1Y3ROYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9kdWN0VmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icm9vdEZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxhdGVzdENoYW5nZUxvZ1Rva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXRpZXMiIHR5cGU9ImNtaXM6Y21pc1JlcG9zaXRvcnlDYXBhYmlsaXRpZXNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWNsQ2FwYWJpbGl0eSIgdHlwZT0iY21pczpjbWlzQUNMQ2FwYWJpbGl0eVR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjbWlzVmVyc2lvblN1cHBvcnRlZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idGhpbkNsaWVudFVSSSIgdHlwZT0ieHM6YW55VVJJIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlc0luY29tcGxldGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VzT25UeXBlIiB0eXBlPSJjbWlzOmVudW1CYXNlT2JqZWN0VHlwZUlkcyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxBbm9ueW1vdXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJSWYgc2V0LCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBwcmluY2lwYWwgd2hvIGlzCi0JCQkJCQl1c2VkIGZvciBhbm9ueW1vdXMgYWNjZXNzLiBUaGlzIHByaW5jaXBhbCBjYW4gdGhlbiBiZSAKLQkJCQkJCXBhc3NlZCB0byB0aGUgQUNMIHNlcnZpY2VzIHRvIHNwZWNpZnkgd2hhdCBwZXJtaXNzaW9ucwotCQkJCQkJYW5vbnltb3VzIHVzZXJzIHNob3VsZCBoYXZlLgotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxBbnlvbmUiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJSWYgc2V0LCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBwcmluY2lwYWwgd2hvIGlzCi0JCQkJCQl1c2VkIGZvciBldmVyeW9uZSdzIGFjY2Vzcy4gVGhpcyBwcmluY2lwYWwgY2FuIHRoZW4gYmUgCi0JCQkJCQlwYXNzZWQgdG8gdGhlIEFDTCBzZXJ2aWNlcyB0byBzcGVjaWZ5IHdoYXQgcGVybWlzc2lvbnMKLQkJCQkJCWV2ZXJ5b25lIHNob3VsZCBoYXZlLgotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbmRlZEZlYXR1cmVzIgotCQkJCXR5cGU9ImNtaXM6Y21pc0V4dGVuc2lvbkZlYXR1cmVUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlBQ0wiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlBQ0wiCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5QWxsVmVyc2lvbnNTZWFyY2hhYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUNoYW5nZXMiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlDaGFuZ2VzIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0YWJpbGl0eSIKLQkJCQl0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMiIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5R2V0RGVzY2VuZGFudHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5R2V0Rm9sZGVyVHJlZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlPcmRlckJ5IiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5T3JkZXJCeSIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eU11bHRpZmlsaW5nIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVBXQ1NlYXJjaGFibGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5UFdDVXBkYXRhYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVF1ZXJ5IiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5UXVlcnkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5UmVuZGl0aW9ucyIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eVJlbmRpdGlvbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlVbmZpbGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlWZXJzaW9uU3BlY2lmaWNGaWxpbmciIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5Sm9pbiIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eUpvaW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlDcmVhdGFibGVQcm9wZXJ0eVR5cGVzIgotCQkJCXR5cGU9ImNtaXM6Y21pc0NyZWF0YWJsZVByb3BlcnR5VHlwZXNUeXBlIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyIKLQkJCQl0eXBlPSJjbWlzOmNtaXNOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwhLS0gZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTwhLS0gVW5pZmllZCBTZWFyY2ggLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVR5cGVPZkNoYW5nZXMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTwhLS0gY29udGVudCB3aXRoIGEgbmV3IElEIGhhcyBiZWVuIGNyZWF0ZWQgLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNyZWF0ZWQiIC8+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhbiBleGlzdGluZyBJRCBoYXMgYmVlbiBtb2RpZmllZCAtLT4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlZCIgLz4KLQkJCTwhLS0gY29udGVudCB3aXRoIGFuIGV4aXN0aW5nIElEIGhhcyBiZWVuIGRlbGV0ZWQgLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZWQiIC8+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhbiBleGlzdGluZyBJRCBoYXMgaGFkIGl0cyBzZWN1cml0eSBwb2xpY3kgY2hhbmdlZC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzZWN1cml0eSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUNoYW5nZXMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib2JqZWN0aWRzb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvcGVydGllcyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQkKLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eU9yZGVyQnkiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29tbW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjdXN0b20iIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaGFuZ2VFdmVudFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUeXBlIiB0eXBlPSJjbWlzOmVudW1UeXBlT2ZDaGFuZ2VzIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIEFDTCAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQUNMUHJvcGFnYXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwb3NpdG9yeWRldGVybWluZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdG9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb3BhZ2F0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUFDTCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkaXNjb3ZlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFuYWdlIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1CYXNpY1Blcm1pc3Npb25zIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cmVhZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp3cml0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczphbGwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uRGVmaW5pdGlvbiI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBwcm9jZXNzQ29udGVudHM9ImxheCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uTWFwcGluZyI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0iY21pczplbnVtQWxsb3dhYmxlQWN0aW9uc0tleSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlNdWx0aXBsZSBlbnRyaWVzIGFyZSBPUidlZCB0b2dldGhlci4gQW55Ci0JCQkJCQlwZXJtaXNzaW9uIHRoYXQgc3BlY2lmaWVkIGlzIHN1ZmZpY2llbnQgdG8gCi0JCQkJCQlwcm92aWRlIHJpZ2h0cyByZXF1aXJlZCBpbiBrZXkKLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCTwveHM6ZWxlbWVudD4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1BbGxvd2FibGVBY3Rpb25zS2V5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldERlc2NlbmRlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Q2hpbGRyZW4uRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQYXJlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Rm9sZGVyUGFyZW50Lk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlRG9jdW1lbnQuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVGb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuU291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuVmlld0NvbnRlbnQuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5VcGRhdGVQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuTW92ZS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbk1vdmUuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5Nb3ZlLlNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlVHJlZS5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblNldENvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZUNvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFRvRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQWRkVG9Gb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVGcm9tRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuUmVtb3ZlRnJvbUZvbGRlci5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNoZWNrb3V0LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DYW5jZWxDaGVja291dC5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ2hlY2tpbi5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0QWxsVmVyc2lvbnMuVmVyc2lvblNlcmllcyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFwcGxpZWRQb2xpY2llcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFDTC5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFwcGx5QUNMLk9iamVjdCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVXNlcnMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp1c2VyIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIHVzZXIgY2FuIGJlIHVzZWQgb24gc2V0dGluZyBBQ0xzIHRvIHNwZWNpZnkKLQkJCQkJCXRoZSBwZXJtaXNzaW9uIHRoaXMKLQkJCQkJCXVzZXIgY29udGV4dCBzaG91bGQgaGF2ZS4KLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVudW1lcmF0aW9uPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gQUNMIG9uIG9iamVjdHMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sUHJpbmNpcGFsVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbElkIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWwiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xQcmluY2lwYWxUeXBlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkaXJlY3QiIHR5cGU9InhzOmJvb2xlYW4iIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FDTENhcGFiaWxpdHlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkUGVybWlzc2lvbnMiIHR5cGU9ImNtaXM6ZW51bVN1cHBvcnRlZFBlcm1pc3Npb25zIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGFnYXRpb24iIHR5cGU9ImNtaXM6ZW51bUFDTFByb3BhZ2F0aW9uIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbnMiIHR5cGU9ImNtaXM6Y21pc1Blcm1pc3Npb25EZWZpbml0aW9uIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXBwaW5nIiB0eXBlPSJjbWlzOmNtaXNQZXJtaXNzaW9uTWFwcGluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtU3VwcG9ydGVkUGVybWlzc2lvbnMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYmFzaWMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcG9zaXRvcnkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGgiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPCEtLSByZW5kaXRpb25zIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5UmVuZGl0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlYWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVJlbmRpdGlvbktpbmQiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp0aHVtYm5haWwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZW5kaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWFtSWQiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJraW5kIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJoZWlnaHQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9IndpZHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25Eb2N1bWVudElkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIGVsZW1lbnRzIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIEFsbG93YWJsZUFjdGlvbnMKLQkJCQlEb2N1bWVudCBUeXBlCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0iY21pczpjbWlzUXVlcnlUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIFF1ZXJ5IERvY3VtZW50IFR5cGUKLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhY2wiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJVGhpcyBpcyB0aGUgcm9vdCB0YWcgZm9yIGEgQ01JUyBBQ0wgRG9jdW1lbnQgVHlwZQotCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gdHlwZSBtdXRhYmlsaXR5IC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZU11dGFiaWxpdHlDYXBhYmlsaXRpZXNUeXBlIj4gCi0JCTx4czpzZXF1ZW5jZT4gCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4gCi0JPC94czpjb21wbGV4VHlwZT4gCi0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0NyZWF0YWJsZVByb3BlcnR5VHlwZXNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlIiB0eXBlPSJjbWlzOmVudW1Qcm9wZXJ0eVR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc05ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lc3BhY2UiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkaXNwbGF5TmFtZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImZpbGVhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmdWxsdGV4dEluZGV4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udHJvbGxhYmxlUG9saWN5IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRyb2xsYWJsZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTwhLS0gZmVhdHVyZSBleHRlbnNpb25zIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzRXh0ZW5zaW9uRmVhdHVyZUtleVZhbHVlUGFpciI+CQotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ia2V5IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPiAKLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzRXh0ZW5zaW9uRmVhdHVyZVR5cGUiPgkKLQkJPHhzOnNlcXVlbmNlPgotCQkJPCEtLSBpZCBpcyB0aGUgb25seSBtYW5kYXRvcnkgZmllbGQgLSB0eXBpY2FsbHkgd2lsbCBiZSBhIFVSTi0tPgotCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlkIiB0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQk8IS0tIG9wdGlvbmFsIHVybCBmb3IgYSBzaXRlIGRlc2NyaWJpbmcgdGhlIGV4dGVuc2lvbiAtLT4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ1cmwiIHR5cGU9InhzOmFueVVSSSIgLz4KLQkJCTwhLS0gb3B0aW9uYWwgc2hvcnQgbmFtZSBmb3Igc3RhbmRhcmQgaS5lLiBGb29TdGFuZGFyZCAtLT4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjb21tb25OYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8IS0tIG9wdGlvbmFsIHZlcnNpb24gbGFiZWwtLT4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ2ZXJzaW9uTGFiZWwiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmVhdHVyZURhdGEiIHR5cGU9ImNtaXM6Y21pc0V4dGVuc2lvbkZlYXR1cmVLZXlWYWx1ZVBhaXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4gCi0JCi08L3hzOnNjaGVtYT4KLQk8IS0tIEVPRiAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy93c2RsL2NtaXMxMS9DTUlTLU1lc3NhZ2luZy54c2QgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy93c2RsL2NtaXMxMS9DTUlTLU1lc3NhZ2luZy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOWM1NzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTEvQ01JUy1NZXNzYWdpbmcueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjMwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi0JPCEtLQotCQlMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0JCW1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5Ci0JCW9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotCQlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0JCWFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKLQkJTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLQkJQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvcgotCQl0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLQkJTGljZW5zZS4KLQktLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvIgotCXhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmNtaXNtPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvIgotCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHZlcnNpb249IjEuMCIKLQl4bWxuczp4amM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIveGpjIgotCWpheGI6ZXh0ZW5zaW9uQmluZGluZ1ByZWZpeGVzPSJ4amMiIGpheGI6dmVyc2lvbj0iMi4xIgotCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotCTx4czppbXBvcnQgc2NoZW1hTG9jYXRpb249IkNNSVMtQ29yZS54c2QiCi0JCW5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iIC8+Ci0KLQk8IS0tIGV4Y2VwdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNGYXVsdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJjbWlzbTplbnVtU2VydmljZUV4Y2VwdGlvbiIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNvZGUiIHR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmVsZW1lbnQgbmFtZT0iY21pc0ZhdWx0IiB0eXBlPSJjbWlzbTpjbWlzRmF1bHRUeXBlIiAvPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1TZXJ2aWNlRXhjZXB0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnN0cmFpbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5hbWVDb25zdHJhaW50VmlvbGF0aW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjb250ZW50QWxyZWFkeUV4aXN0cyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmlsdGVyTm90VmFsaWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRBcmd1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90U3VwcG9ydGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvYmplY3ROb3RGb3VuZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icGVybWlzc2lvbkRlbmllZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icnVudGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RvcmFnZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyZWFtTm90U3VwcG9ydGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGVDb25mbGljdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idmVyc2lvbmluZyIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tIGV4dGVuc2lvbiAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0V4dGVuc2lvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTwhLS0gdHlwZXMgZm9yIFdTIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZUNvbnRhaW5lciI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIgCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGlsZHJlbiIgdHlwZT0iY21pc206Y21pc1R5cGVDb250YWluZXIiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURlZmluaXRpb25MaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVzIiB0eXBlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Imhhc01vcmVJdGVtcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im51bUl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SW5Gb2xkZXIiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RJbkZvbGRlclR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGlsZHJlbiIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4JCi0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0TGlzdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJoYXNNb3JlSXRlbXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJudW1JdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+CQkKLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SW5Gb2xkZXJUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0IiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIiAKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGF0aFNlZ21lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+CQkKLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RQYXJlbnRzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIgCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbGF0aXZlUGF0aFNlZ21lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+IAotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaGFzTW9yZUl0ZW1zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibnVtSXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZXBvc2l0b3J5RW50cnlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDb250ZW50U3RyZWFtVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWltZVR5cGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsZW5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWFtIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiCi0JCQkJeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQUNMVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9IkFDTCIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXhhY3QiIHR5cGU9InhzOmJvb2xlYW4iIAotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtSZXBvc2l0b3J5IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIGdldFJlcG9zaXRvcmllcyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yaWVzIiB0eXBlPSJjbWlzbTpjbWlzUmVwb3NpdG9yeUVudHJ5VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCi0JPCEtLSBnZXRSZXBvc2l0b3J5SW5mbyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm8iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mb1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJbmZvIiB0eXBlPSJjbWlzOmNtaXNSZXBvc2l0b3J5SW5mb1R5cGUiIAotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldFR5cGVDaGlsZHJlbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZUNoaWxkcmVuIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlQ2hpbGRyZW5SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlcyIgdHlwZT0iY21pc206Y21pc1R5cGVEZWZpbml0aW9uTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldFR5cGVEZXNjZW5kYW50cyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZURlc2NlbmRhbnRzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImRlcHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlcyIgdHlwZT0iY21pc206Y21pc1R5cGVDb250YWluZXIiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0VHlwZURlZmluaXRpb24gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVEZWZpbml0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVEZWZpbml0aW9uUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gY3JlYXRlVHlwZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlVHlwZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlVHlwZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gdXBkYXRlVHlwZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlVHlwZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlVHlwZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZGVsZXRlVHlwZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlVHlwZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlVHlwZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbTmF2aWdhdGlvbiBTZXJ2aWNlc10gLS0+Ci0JCi0JPCEtLSBnZXREZXNjZW5kYW50cyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0RGVzY2VuZGFudHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImRlcHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0RGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldERlc2NlbmRhbnRzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRGb2xkZXJUcmVlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJkZXB0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUGF0aFNlZ21lbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRGb2xkZXJUcmVlUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRDaGlsZHJlbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Q2hpbGRyZW4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3JkZXJCeSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRGb2xkZXJQYXJlbnQgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclBhcmVudFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0T2JqZWN0UGFyZW50cyBPcGVyYXRpb24tLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RQYXJlbnRzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFBhcmVudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJlbnRzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0UGFyZW50c1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0UmVuZGl0aW9ucyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVuZGl0aW9ucyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFJlbmRpdGlvbnNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25zIiB0eXBlPSJjbWlzOmNtaXNSZW5kaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENoZWNrZWRvdXREb2NzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGVja2VkT3V0RG9jcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlckJ5IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGVja2VkT3V0RG9jc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbT2JqZWN0IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIGNyZWF0ZURvY3VtZW50IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVEb2N1bWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtIiB0eXBlPSJjbWlzbTpjbWlzQ29udGVudFN0cmVhbVR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uaW5nU3RhdGUiIHR5cGU9ImNtaXM6ZW51bVZlcnNpb25pbmdTdGF0ZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZURvY3VtZW50UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzb3VyY2VJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+CQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idmVyc2lvbmluZ1N0YXRlIiB0eXBlPSJjbWlzOmVudW1WZXJzaW9uaW5nU3RhdGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVGb2xkZXIgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZUZvbGRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZUZvbGRlclJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVSZWxhdGlvbnNoaXAgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWNpZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWRkQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVQb2xpY3kgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZVBvbGljeSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVQb2xpY3lSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSBjcmVhdGVJdGVtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVJdGVtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlSXRlbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JCi0JPCEtLSBnZXRBbGxvd2FibGVBY3Rpb25zIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRQcm9wZXJ0aWVzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiAKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUG9saWN5SWRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdEJ5UGF0aCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0QnlQYXRoIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXRoIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIAotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQb2xpY3lJZHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RCeVBhdGhSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENvbnRlbnRTdHJlYW0gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRTdHJlYW0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InN0cmVhbUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvZmZzZXQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtIiB0eXBlPSJjbWlzbTpjbWlzQ29udGVudFN0cmVhbVR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIHVwZGF0ZVByb3BlcnRpZXMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZVByb3BlcnRpZXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTwhLS0KLQkJCQkJaWYgb2JqZWN0SWQgaXMgcHJlc2VudCBpbiB0aGUgcHJvcGVydGllcyB0aGUgdmFsdWUgbXVzdCBtYXRjaCB0aGlzCi0JCQkJCW9iamVjdElkCi0JCQkJLS0+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZVByb3BlcnRpZXNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQkKLQk8IS0tIGJ1bGtVcGRhdGVQcm9wZXJ0aWVzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJidWxrVXBkYXRlUHJvcGVydGllcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImJ1bGtVcGRhdGVEYXRhIiB0eXBlPSJjbWlzOmNtaXNCdWxrVXBkYXRlVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJidWxrVXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkQW5kQ2hhbmdlVG9rZW4iIHR5cGU9ImNtaXM6Y21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gbW92ZU9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ibW92ZU9iamVjdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idGFyZ2V0Rm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic291cmNlRm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Im1vdmVPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGRlbGV0ZU9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlT2JqZWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBkZWxldGVUcmVlIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVUcmVlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InVuZmlsZU9iamVjdHMiIHR5cGU9ImNtaXM6ZW51bVVuZmlsZU9iamVjdCIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRpbnVlT25GYWlsdXJlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImRlbGV0ZVRyZWVSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmYWlsZWRUb0RlbGV0ZSI+Ci0JCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZHMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQkJCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBzZXRDb250ZW50U3RyZWFtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXRDb250ZW50U3RyZWFtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvdmVyd3JpdGVGbGFnIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gYXBwZW5kQ29udGVudFN0cmVhbSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwZW5kQ29udGVudFN0cmVhbSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaXNMYXN0Q2h1bmsiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udGVudFN0cmVhbSIgdHlwZT0iY21pc206Y21pc0NvbnRlbnRTdHJlYW1UeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwZW5kQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBkZWxldGVDb250ZW50U3RyZWFtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVDb250ZW50U3RyZWFtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tW011bHRpLWZpbGluZyBTZXJ2aWNlc10tLT4KLQotCTwhLS0gYWRkT2JqZWN0VG9Gb2xkZXIgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSByZW1vdmVPYmplY3RGcm9tRm9sZGVyIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbRGlzY292ZXJ5IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIHF1ZXJ5IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RhdGVtZW50IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNlYXJjaEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icXVlcnlSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0TGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENvbnRlbnRDaGFuZ2VzIG9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDb250ZW50Q2hhbmdlcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlTG9nVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQcm9wZXJ0aWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUG9saWN5SWRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRDaGFuZ2VzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VMb2dUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtWZXJzaW9uaW5nIFNlcnZpY2VzXSAtLT4KLQotCTwhLS0gY2hlY2tPdXQgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNoZWNrT3V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tPdXRSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50Q29waWVkIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNhbmNlbENoZWNrT3V0IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5jZWxDaGVja091dCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNhbmNlbENoZWNrT3V0UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gY2hlY2tJbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tJbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWFqb3IiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoZWNraW5Db21tZW50IiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjaGVja0luUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1ham9yIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYWpvciIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIAotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQb2xpY3lJZHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0QWxsVmVyc2lvbnMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFsbFZlcnNpb25zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QWxsVmVyc2lvbnNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS1bUmVsYXRpb25zaGlwIFNlcnZpY2VzXS0tPgotCi0JPCEtLSBnZXRSZWxhdGlvbnNoaXBzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcERpcmVjdGlvbiIgdHlwZT0iY21pczplbnVtUmVsYXRpb25zaGlwRGlyZWN0aW9uIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0TGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS1bUG9saWN5IFNlcnZpY2VzXS0tPgotCi0JPCEtLSBhcHBseVBvbGljeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlQb2xpY3kiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhcHBseVBvbGljeVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIHJlbW92ZVBvbGljeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlUG9saWN5Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY3lJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlUG9saWN5UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRBcHBsaWVkUG9saWNpZXMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRBQ0wgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFDTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib25seUJhc2ljUGVybWlzc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QUNMUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQUNMIiB0eXBlPSJjbWlzbTpjbWlzQUNMVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgkKLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSBhcHBseUFDTCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlBQ0wiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0xQcm9wYWdhdGlvbiIgdHlwZT0iY21pczplbnVtQUNMUHJvcGFnYXRpb24iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhcHBseUFDTFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFDTCIgdHlwZT0iY21pc206Y21pc0FDTFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL3dzZGwvY21pczExL0NNSVNXUy1TZXJ2aWNlLndzZGwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy9tYWluL3Jlc291cmNlcy93c2RsL2NtaXMxMS9DTUlTV1MtU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmRhNzljLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL3dzZGwvY21pczExL0NNSVNXUy1TZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLQk8IS0tCi0JCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLQkJbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkKLQkJb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLQkJYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotCQlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotCQlDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yCi0JCXRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotCQlMaWNlbnNlLgotCS0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6Y21pcz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iCi0JeG1sbnM6Y21pc209Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC8iCi0JeG1sbnM6Y21pc3c9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6bnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyIKLQl4bWxuczpqYXh3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4d3MiIG5hbWU9IkNNSVNXZWJTZXJ2aWNlcyI+Ci0JPHR5cGVzPgotCQk8eHNkOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvIj4KLQkJCTx4c2Q6aW1wb3J0IHNjaGVtYUxvY2F0aW9uPSJDTUlTLUNvcmUueHNkIgotCQkJCW5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iIC8+Ci0JCQk8eHNkOmltcG9ydCBzY2hlbWFMb2NhdGlvbj0iQ01JUy1NZXNzYWdpbmcueHNkIgotCQkJCW5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9tZXNzYWdpbmcvMjAwOTA4LyIgLz4KLQkJPC94c2Q6c2NoZW1hPgotCTwvdHlwZXM+Ci0KLQk8bWVzc2FnZSBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9ImNtaXNtOmNtaXNGYXVsdCIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRBQ0xSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QUNMIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBQ0xSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFDTFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImFwcGx5QUNMUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGx5QUNMIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJhcHBseUFDTFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YXBwbHlBQ0xSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJxdWVyeVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpxdWVyeSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icXVlcnlSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnF1ZXJ5UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENvbnRlbnRDaGFuZ2VzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRDaGFuZ2VzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDb250ZW50Q2hhbmdlc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q29udGVudENoYW5nZXNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJhZGRPYmplY3RUb0ZvbGRlclJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphZGRPYmplY3RUb0ZvbGRlciIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYWRkT2JqZWN0VG9Gb2xkZXJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206cmVtb3ZlT2JqZWN0RnJvbUZvbGRlciIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icmVtb3ZlT2JqZWN0RnJvbUZvbGRlclJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206cmVtb3ZlT2JqZWN0RnJvbUZvbGRlclJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImdldERlc2NlbmRhbnRzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldERlc2NlbmRhbnRzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXREZXNjZW5kYW50c1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0RGVzY2VuZGFudHNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q2hpbGRyZW5SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q2hpbGRyZW4iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENoaWxkcmVuUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDaGlsZHJlblJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRGb2xkZXJQYXJlbnRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Rm9sZGVyUGFyZW50IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRGb2xkZXJQYXJlbnRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEZvbGRlclBhcmVudFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RQYXJlbnRzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdFBhcmVudHMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdFBhcmVudHNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdFBhcmVudHNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVuZGl0aW9uc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRSZW5kaXRpb25zIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZW5kaXRpb25zUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRSZW5kaXRpb25zUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENoZWNrZWRPdXREb2NzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENoZWNrZWRPdXREb2NzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDaGVja2VkT3V0RG9jc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q2hlY2tlZE91dERvY3NSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVEb2N1bWVudFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVEb2N1bWVudCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY3JlYXRlRG9jdW1lbnRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZURvY3VtZW50UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRG9jdW1lbnRGcm9tU291cmNlUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZUZvbGRlclJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVGb2xkZXIiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZUZvbGRlclJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRm9sZGVyUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVSZWxhdGlvbnNoaXAiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUmVsYXRpb25zaGlwUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZVBvbGljeVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVQb2xpY3kiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZVBvbGljeVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUG9saWN5UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVJdGVtUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZUl0ZW0iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZUl0ZW1SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZUl0ZW1SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QWxsb3dhYmxlQWN0aW9uc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBbGxvd2FibGVBY3Rpb25zIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBbGxvd2FibGVBY3Rpb25zUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3QiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFByb3BlcnRpZXNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UHJvcGVydGllcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UHJvcGVydGllc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UHJvcGVydGllc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdEJ5UGF0aFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RCeVBhdGgiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdEJ5UGF0aFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0QnlQYXRoUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q29udGVudFN0cmVhbVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDb250ZW50U3RyZWFtIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InVwZGF0ZVByb3BlcnRpZXNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206dXBkYXRlUHJvcGVydGllcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0idXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206dXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJidWxrVXBkYXRlUHJvcGVydGllc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpidWxrVXBkYXRlUHJvcGVydGllcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYnVsa1VwZGF0ZVByb3BlcnRpZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmJ1bGtVcGRhdGVQcm9wZXJ0aWVzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9Im1vdmVPYmplY3RSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206bW92ZU9iamVjdCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ibW92ZU9iamVjdFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206bW92ZU9iamVjdFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVPYmplY3RSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlT2JqZWN0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVPYmplY3RSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZU9iamVjdFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVUcmVlUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZVRyZWUiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZVRyZWVSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZVRyZWVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ic2V0Q29udGVudFN0cmVhbVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpzZXRDb250ZW50U3RyZWFtIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFwcGVuZENvbnRlbnRTdHJlYW1SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YXBwZW5kQ29udGVudFN0cmVhbSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYXBwZW5kQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YXBwZW5kQ29udGVudFN0cmVhbVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVDb250ZW50U3RyZWFtUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZUNvbnRlbnRTdHJlYW0iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZUNvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZUNvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJhcHBseVBvbGljeVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphcHBseVBvbGljeSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYXBwbHlQb2xpY3lSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGx5UG9saWN5UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InJlbW92ZVBvbGljeVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpyZW1vdmVQb2xpY3kiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InJlbW92ZVBvbGljeVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206cmVtb3ZlUG9saWN5UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFwcGxpZWRQb2xpY2llc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBcHBsaWVkUG9saWNpZXMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFwcGxpZWRQb2xpY2llc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RSZWxhdGlvbnNoaXBzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RSZWxhdGlvbnNoaXBzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFJlcG9zaXRvcmllcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRSZXBvc2l0b3JpZXNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm9SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVwb3NpdG9yeUluZm8iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFJlcG9zaXRvcnlJbmZvUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRSZXBvc2l0b3J5SW5mb1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRUeXBlQ2hpbGRyZW5SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZUNoaWxkcmVuIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRUeXBlQ2hpbGRyZW5SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFR5cGVDaGlsZHJlblJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZURlc2NlbmRhbnRzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFR5cGVEZXNjZW5kYW50c1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRUeXBlRGVmaW5pdGlvblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlRGVmaW5pdGlvbiIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0VHlwZURlZmluaXRpb25SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFR5cGVEZWZpbml0aW9uUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZVR5cGVSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlVHlwZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY3JlYXRlVHlwZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlVHlwZVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJ1cGRhdGVUeXBlUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnVwZGF0ZVR5cGUiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InVwZGF0ZVR5cGVSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnVwZGF0ZVR5cGVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlVHlwZVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpkZWxldGVUeXBlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVUeXBlUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpkZWxldGVUeXBlUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iY2hlY2tPdXRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y2hlY2tPdXQiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNoZWNrT3V0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjaGVja091dFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjYW5jZWxDaGVja091dFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjYW5jZWxDaGVja091dCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY2FuY2VsQ2hlY2tPdXRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNhbmNlbENoZWNrT3V0UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNoZWNrSW5SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y2hlY2tJbiIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY2hlY2tJblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y2hlY2tJblJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RPZkxhdGVzdFZlcnNpb25SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RPZkxhdGVzdFZlcnNpb25SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4JCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFsbFZlcnNpb25zUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFsbFZlcnNpb25zIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBbGxWZXJzaW9uc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QWxsVmVyc2lvbnNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRGb2xkZXJUcmVlUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEZvbGRlclRyZWUiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEZvbGRlclRyZWVSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEZvbGRlclRyZWVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iRGlzY292ZXJ5U2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9InF1ZXJ5Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpxdWVyeVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OnF1ZXJ5UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudENoYW5nZXMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldENvbnRlbnRDaGFuZ2VzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q29udGVudENoYW5nZXNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCi0JPHBvcnRUeXBlIG5hbWU9Ik11bHRpRmlsaW5nU2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzphZGRPYmplY3RUb0ZvbGRlclJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0icmVtb3ZlT2JqZWN0RnJvbUZvbGRlciI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6cmVtb3ZlT2JqZWN0RnJvbUZvbGRlclJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OnJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldERlc2NlbmRhbnRzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXREZXNjZW5kYW50c1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldERlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q2hpbGRyZW4iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldENoaWxkcmVuUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q2hpbGRyZW5SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRGb2xkZXJQYXJlbnQiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldEZvbGRlclBhcmVudFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEZvbGRlclBhcmVudFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEZvbGRlclRyZWUiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldEZvbGRlclRyZWVSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRGb2xkZXJUcmVlUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0UGFyZW50cyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UGFyZW50c1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdFBhcmVudHNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRDaGVja2VkT3V0RG9jcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q2hlY2tlZE91dERvY3NSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDaGVja2VkT3V0RG9jc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9Ik9iamVjdFNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVEb2N1bWVudCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlRG9jdW1lbnRSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVEb2N1bWVudFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlRG9jdW1lbnRGcm9tU291cmNlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlRG9jdW1lbnRGcm9tU291cmNlUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlRm9sZGVyIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVGb2xkZXJSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVGb2xkZXJSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXAiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZVJlbGF0aW9uc2hpcFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVBvbGljeSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlUG9saWN5UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlUG9saWN5UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlSXRlbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlSXRlbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZUl0ZW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBbGxvd2FibGVBY3Rpb25zUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UHJvcGVydGllcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UHJvcGVydGllc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFByb3BlcnRpZXNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZW5kaXRpb25zIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRSZW5kaXRpb25zUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVuZGl0aW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdEJ5UGF0aCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0QnlQYXRoUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0QnlQYXRoUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudFN0cmVhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q29udGVudFN0cmVhbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGVQcm9wZXJ0aWVzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzp1cGRhdGVQcm9wZXJ0aWVzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6dXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImJ1bGtVcGRhdGVQcm9wZXJ0aWVzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpidWxrVXBkYXRlUHJvcGVydGllc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmJ1bGtVcGRhdGVQcm9wZXJ0aWVzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0ibW92ZU9iamVjdCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6bW92ZU9iamVjdFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3Om1vdmVPYmplY3RSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVPYmplY3QiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmRlbGV0ZU9iamVjdFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmRlbGV0ZU9iamVjdFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZVRyZWUiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmRlbGV0ZVRyZWVSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVUcmVlUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0ic2V0Q29udGVudFN0cmVhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6c2V0Q29udGVudFN0cmVhbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OnNldENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhcHBlbmRDb250ZW50U3RyZWFtIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzphcHBlbmRDb250ZW50U3RyZWFtUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6YXBwZW5kQ29udGVudFN0cmVhbVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZUNvbnRlbnRTdHJlYW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmRlbGV0ZUNvbnRlbnRTdHJlYW1SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iUG9saWN5U2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFwcGx5UG9saWN5Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzphcHBseVBvbGljeVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmFwcGx5UG9saWN5UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0icmVtb3ZlUG9saWN5Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpyZW1vdmVQb2xpY3lSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpyZW1vdmVQb2xpY3lSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBcHBsaWVkUG9saWNpZXMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFwcGxpZWRQb2xpY2llc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFwcGxpZWRQb2xpY2llc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRPYmplY3RSZWxhdGlvbnNoaXBzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iUmVwb3NpdG9yeVNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZXBvc2l0b3JpZXMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFJlcG9zaXRvcmllc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFJlcG9zaXRvcmllc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFJlcG9zaXRvcnlJbmZvIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRSZXBvc2l0b3J5SW5mb1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFJlcG9zaXRvcnlJbmZvUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZUNoaWxkcmVuIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRUeXBlQ2hpbGRyZW5SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRUeXBlQ2hpbGRyZW5SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVEZXNjZW5kYW50c1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVEZXNjZW5kYW50c1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVEZWZpbml0aW9uIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRUeXBlRGVmaW5pdGlvblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVEZWZpbml0aW9uUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JIAk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVR5cGUiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZVR5cGVSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVUeXBlUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JIAk8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZVR5cGUiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnVwZGF0ZVR5cGVSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzp1cGRhdGVUeXBlUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JIAk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZVR5cGUiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmRlbGV0ZVR5cGVSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVUeXBlUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iVmVyc2lvbmluZ1NlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja091dCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y2hlY2tPdXRSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjaGVja091dFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNhbmNlbENoZWNrT3V0Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjYW5jZWxDaGVja091dFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNhbmNlbENoZWNrT3V0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY2hlY2tJbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y2hlY2tJblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNoZWNrSW5SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0QWxsVmVyc2lvbnMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFsbFZlcnNpb25zUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0QWxsVmVyc2lvbnNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJBQ0xTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0QUNMIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBQ0xSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBQ0xSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhcHBseUFDTCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6YXBwbHlBQ0xSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzphcHBseUFDTFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0KLQotCTxiaW5kaW5nIG5hbWU9IkRpc2NvdmVyeVNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6RGlzY292ZXJ5U2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9InF1ZXJ5Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJxdWVyeSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudENoYW5nZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldENvbnRlbnRDaGFuZ2VzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3Ok11bHRpRmlsaW5nU2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJhZGRPYmplY3RUb0ZvbGRlciIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0icmVtb3ZlT2JqZWN0RnJvbUZvbGRlciI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0icmVtb3ZlT2JqZWN0RnJvbUZvbGRlciIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9Ik5hdmlnYXRpb25TZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3Ok5hdmlnYXRpb25TZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0RGVzY2VuZGFudHMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldERlc2NlbmRhbnRzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRDaGlsZHJlbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0Q2hpbGRyZW4iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0Rm9sZGVyUGFyZW50IiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRGb2xkZXJUcmVlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRGb2xkZXJUcmVlIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RQYXJlbnRzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRPYmplY3RQYXJlbnRzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRDaGVja2VkT3V0RG9jcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0Q2hlY2tlZE91dERvY3MiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJPYmplY3RTZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3Ok9iamVjdFNlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVEb2N1bWVudCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iY3JlYXRlRG9jdW1lbnQiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVGb2xkZXIiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImNyZWF0ZUZvbGRlciIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJjcmVhdGVSZWxhdGlvbnNoaXAiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVBvbGljeSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iY3JlYXRlUG9saWN5IiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVJdGVtIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFsbG93YWJsZUFjdGlvbnMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldEFsbG93YWJsZUFjdGlvbnMiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0T2JqZWN0IiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRQcm9wZXJ0aWVzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRQcm9wZXJ0aWVzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZW5kaXRpb25zIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRSZW5kaXRpb25zIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RCeVBhdGgiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldE9iamVjdEJ5UGF0aCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudFN0cmVhbSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0Q29udGVudFN0cmVhbSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0idXBkYXRlUHJvcGVydGllcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXBkYXRlUHJvcGVydGllcyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYnVsa1VwZGF0ZVByb3BlcnRpZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImJ1bGtVcGRhdGVQcm9wZXJ0aWVzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJtb3ZlT2JqZWN0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJtb3ZlT2JqZWN0IiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVPYmplY3QiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImRlbGV0ZU9iamVjdCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlVHJlZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZGVsZXRlVHJlZSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0ic2V0Q29udGVudFN0cmVhbSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ic2V0Q29udGVudFN0cmVhbSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwZW5kQ29udGVudFN0cmVhbSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iYXBwZW5kQ29udGVudFN0cmVhbSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZGVsZXRlQ29udGVudFN0cmVhbSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9IlBvbGljeVNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6UG9saWN5U2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFwcGx5UG9saWN5Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJhcHBseVBvbGljeSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0icmVtb3ZlUG9saWN5Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJyZW1vdmVQb2xpY3kiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0QXBwbGllZFBvbGljaWVzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9IlJlcG9zaXRvcnlTZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3OlJlcG9zaXRvcnlTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVwb3NpdG9yaWVzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRSZXBvc2l0b3JpZXMiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFJlcG9zaXRvcnlJbmZvIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRSZXBvc2l0b3J5SW5mbyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZUNoaWxkcmVuIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRUeXBlQ2hpbGRyZW4iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50cyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0VHlwZURlc2NlbmRhbnRzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlRGVmaW5pdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0VHlwZURlZmluaXRpb24iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVR5cGUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImNyZWF0ZVR5cGUiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZVR5cGUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVwZGF0ZVR5cGUiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZVR5cGUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImRlbGV0ZVR5cGUiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJWZXJzaW9uaW5nU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpWZXJzaW9uaW5nU2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrT3V0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJjaGVja091dCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY2FuY2VsQ2hlY2tPdXQiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImNhbmNlbENoZWNrT3V0IiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0luIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJjaGVja0luIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0QWxsVmVyc2lvbnMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldEFsbFZlcnNpb25zIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iQUNMU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpBQ0xTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0QUNMIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRBQ0wiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFwcGx5QUNMIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJhcHBseUFDTCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCi0KLQk8c2VydmljZSBuYW1lPSJEaXNjb3ZlcnlTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iRGlzY292ZXJ5U2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3OkRpc2NvdmVyeVNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL0Rpc2NvdmVyeVNlcnZpY2UuRGlzY292ZXJ5U2VydmljZVBvcnQiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6TXVsdGlGaWxpbmdTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vY21pcy9zZXJ2aWNlcy9NdWx0aUZpbGluZ1NlcnZpY2UuTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9Ik5hdmlnYXRpb25TZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6TmF2aWdhdGlvblNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlLk5hdmlnYXRpb25TZXJ2aWNlUG9ydCIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJPYmplY3RTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iT2JqZWN0U2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3Ok9iamVjdFNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vY21pcy9zZXJ2aWNlcy9PYmplY3RTZXJ2aWNlLk9iamVjdFNlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlBvbGljeVNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJQb2xpY3lTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6UG9saWN5U2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL1BvbGljeVNlcnZpY2UuUG9saWN5U2VydmljZVBvcnQiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vY21pcy9zZXJ2aWNlcy9SZWxhdGlvbnNoaXBTZXJ2aWNlLlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlJlcG9zaXRvcnlTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iUmVwb3NpdG9yeVNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpSZXBvc2l0b3J5U2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2NtaXMvc2VydmljZXMvUmVwb3NpdG9yeVNlcnZpY2UuUmVwb3NpdG9yeVNlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlZlcnNpb25pbmdTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iVmVyc2lvbmluZ1NlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpWZXJzaW9uaW5nU2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2NtaXMvc2VydmljZXMvVmVyc2lvbmluZ1NlcnZpY2UuVmVyc2lvbmluZ1NlcnZpY2VQb3J0IiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IkFDTFNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJBQ0xTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6QUNMU2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9jbWlzL3NlcnZpY2VzL0FDTFNlcnZpY2UuQUNMU2VydmljZVBvcnQiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTEveG1sLnhzZCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL21haW4vcmVzb3VyY2VzL3dzZGwvY21pczExL3htbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWRhZDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvbWFpbi9yZXNvdXJjZXMvd3NkbC9jbWlzMTEveG1sLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLQk8IS0tCi0JCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLQkJbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkKLQkJb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLQkJYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotCQlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotCQlDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yCi0JCXRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotCQlMaWNlbnNlLgotCS0tPgotCi08eHNkOnNjaGVtYSAKLXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiAKLXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAoteG1sOmxhbmc9ImVuIj4KLSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj4KLSAgPHhzZDpzaW1wbGVUeXBlPgotICAgPHhzZDp1bmlvbiBtZW1iZXJUeXBlcz0ieHNkOmxhbmd1YWdlIj4KLSAgICA8eHNkOnNpbXBsZVR5cGU+ICAgIAotICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iIi8+Ci0gICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICA8L3hzZDp1bmlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSA8L3hzZDphdHRyaWJ1dGU+Ci0KLSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzcGFjZSI+Ci0gIDx4c2Q6c2ltcGxlVHlwZT4KLSAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0gICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZGVmYXVsdCIvPgotICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+Ci0gICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSA8L3hzZDphdHRyaWJ1dGU+Ci0KLSA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4c2Q6YW55VVJJIj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi94bWxiYXNlLyBmb3IKLSAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0gPC94c2Q6YXR0cmlidXRlPgotIAotIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6SUQiPgotICA8eHNkOmFubm90YXRpb24+Ci0gICA8eHNkOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1pZC8gZm9yCi0gICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotIDwveHNkOmF0dHJpYnV0ZT4KLQotIDx4c2Q6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KLSAgPHhzZDphdHRyaWJ1dGUgcmVmPSJ4bWw6YmFzZSIvPgotICA8eHNkOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+Ci0gIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+Ci0gIDx4c2Q6YXR0cmlidXRlIHJlZj0ieG1sOmlkIi8+Ci0gPC94c2Q6YXR0cmlidXRlR3JvdXA+Ci0KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTczNmM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jc2FtcGxlIGxvZzRqLnByb3BlcnRpZXMKLQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8KLQotIyBTdGRvdXQKLWxvZzRqLmFwcGVuZGVyLk89b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBGaWxlCi1sb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuUi5GaWxlPWxvZzRqLmxvZwotCi0jIENvbnRyb2wgdGhlIG1heGltdW0gbG9nIGZpbGUgc2l6ZQotbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT0xMDBLQgotCi0jIEFyY2hpdmUgbG9nIGZpbGVzIChvbmUgYmFja3VwIGZpbGUgaGVyZSkKLWxvZzRqLmFwcGVuZGVyLlIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5PLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgWyV0XSAlYzogJW0lbgotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuCi0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm9wZW5jbWlzLmNsaWVudC5wcm92aWRlci5zcGk9TwpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9qc29uL0RhdGVUaW1lVGltZXpvbmVUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vRGF0ZVRpbWVUaW1lem9uZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjNWU1OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vRGF0ZVRpbWVUaW1lem9uZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuRGF0ZVRpbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEYXRlVGltZUltcGw7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEYXRlVGltZVRpbWV6b25lVGVzdCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVF9QUk9QID0gInRlc3Q6cHJvcCI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRJTUVaT05FID0gIkdNVCswMToyMyI7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlVGltZVByb3BlcnR5V3JpdGUoKSB7Ci0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIG9yZ1ZhbHVlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKFRJTUVaT05FKSk7Ci0KLSAgICAgICAgUHJvcGVydGllc0ltcGwgcHJvcHMgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgcHJvcHMuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKFRFU1RfUFJPUCwgb3JnVmFsdWUpKTsKLQotICAgICAgICAvLyBtaWxsaXNlY29uZHMKLQotICAgICAgICBKU09OT2JqZWN0IGpzb24xID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KHByb3BzLCAiaWQiLCBudWxsLCBQcm9wZXJ0eU1vZGUuT0JKRUNULCBmYWxzZSwgRGF0ZVRpbWVGb3JtYXQuU0lNUExFKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGpzb24xKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChqc29uMS5nZXQoVEVTVF9QUk9QKSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wMSA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uMS5nZXQoVEVTVF9QUk9QKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wMS5nZXQoSlNPTkNvbnN0YW50cy5KU09OX1BST1BFUlRZX1ZBTFVFKSk7Ci0gICAgICAgIGFzc2VydFRydWUocHJvcDEuZ2V0KEpTT05Db25zdGFudHMuSlNPTl9QUk9QRVJUWV9WQUxVRSkgaW5zdGFuY2VvZiBMaXN0PD8+KTsKLQotICAgICAgICBMaXN0PD8+IHZhbHVlczEgPSAoTGlzdDw/PikgcHJvcDEuZ2V0KEpTT05Db25zdGFudHMuSlNPTl9QUk9QRVJUWV9WQUxVRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZXMxLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUodmFsdWVzMS5nZXQoMCkgaW5zdGFuY2VvZiBOdW1iZXIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcmdWYWx1ZS5nZXRUaW1lSW5NaWxsaXMoKSwgKChOdW1iZXIpIHZhbHVlczEuZ2V0KDApKS5sb25nVmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gRGF0ZVRpbWUgc3RyaW5nCi0KLSAgICAgICAgSlNPTk9iamVjdCBqc29uMiA9IEpTT05Db252ZXJ0ZXIKLSAgICAgICAgICAgICAgICAuY29udmVydChwcm9wcywgImlkIiwgbnVsbCwgUHJvcGVydHlNb2RlLk9CSkVDVCwgZmFsc2UsIERhdGVUaW1lRm9ybWF0LkVYVEVOREVEKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGpzb24yKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChqc29uMi5nZXQoVEVTVF9QUk9QKSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wMiA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uMi5nZXQoVEVTVF9QUk9QKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wMi5nZXQoSlNPTkNvbnN0YW50cy5KU09OX1BST1BFUlRZX1ZBTFVFKSk7Ci0gICAgICAgIGFzc2VydFRydWUocHJvcDIuZ2V0KEpTT05Db25zdGFudHMuSlNPTl9QUk9QRVJUWV9WQUxVRSkgaW5zdGFuY2VvZiBMaXN0PD8+KTsKLQotICAgICAgICBMaXN0PD8+IHZhbHVlczIgPSAoTGlzdDw/PikgcHJvcDIuZ2V0KEpTT05Db25zdGFudHMuSlNPTl9QUk9QRVJUWV9WQUxVRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZXMyLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUodmFsdWVzMi5nZXQoMCkgaW5zdGFuY2VvZiBTdHJpbmcpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbFZhbHVlID0gRGF0ZVRpbWVIZWxwZXIucGFyc2VYbWxEYXRlVGltZSh2YWx1ZXMyLmdldCgwKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yZ1ZhbHVlLmdldFRpbWVJbk1pbGxpcygpLCBjYWxWYWx1ZS5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3JnVmFsdWUuZ2V0VGltZVpvbmUoKS5oYXNTYW1lUnVsZXMoY2FsVmFsdWUuZ2V0VGltZVpvbmUoKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERhdGVUaW1lUHJvcGVydHlSZWFkKCkgewotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIG9yZ1ZhbHVlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKFRJTUVaT05FKSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBqc29uID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcEpzb24gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICBqc29uLnB1dChURVNUX1BST1AsIHByb3BKc29uKTsKLQotICAgICAgICAvLyBtaWxsaXNlY29uZHMKLQotICAgICAgICBwcm9wSnNvbi5wdXQoSlNPTkNvbnN0YW50cy5KU09OX1BST1BFUlRZX0lELCBURVNUX1BST1ApOwotICAgICAgICBwcm9wSnNvbi5wdXQoSlNPTkNvbnN0YW50cy5KU09OX1BST1BFUlRZX0RBVEFUWVBFLCBQcm9wZXJ0eVR5cGUuREFURVRJTUUudmFsdWUoKSk7Ci0gICAgICAgIHByb3BKc29uLnB1dChKU09OQ29uc3RhbnRzLkpTT05fUFJPUEVSVFlfVkFMVUUsIG9yZ1ZhbHVlLmdldFRpbWVJbk1pbGxpcygpKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzMSA9IEpTT05Db252ZXJ0ZXIuY29udmVydFByb3BlcnRpZXMoanNvbiwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wczEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzMS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzMS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFRFU1RfUFJPUCkpOwotICAgICAgICBhc3NlcnRUcnVlKHByb3BzMS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFRFU1RfUFJPUCkgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZTEgPSAoKFByb3BlcnR5RGF0ZVRpbWUpIHByb3BzMS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFRFU1RfUFJPUCkpLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3JnVmFsdWUuZ2V0VGltZUluTWlsbGlzKCksIHZhbHVlMS5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUodmFsdWUxLmdldFRpbWVab25lKCkuaGFzU2FtZVJ1bGVzKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSkpOwotCi0gICAgICAgIC8vIERhdGVUaW1lIHN0cmluZwotCi0gICAgICAgIHByb3BKc29uLnB1dChKU09OQ29uc3RhbnRzLkpTT05fUFJPUEVSVFlfSUQsIFRFU1RfUFJPUCk7Ci0gICAgICAgIHByb3BKc29uLnB1dChKU09OQ29uc3RhbnRzLkpTT05fUFJPUEVSVFlfREFUQVRZUEUsIFByb3BlcnR5VHlwZS5EQVRFVElNRS52YWx1ZSgpKTsKLSAgICAgICAgcHJvcEpzb24ucHV0KEpTT05Db25zdGFudHMuSlNPTl9QUk9QRVJUWV9WQUxVRSwgRGF0ZVRpbWVIZWxwZXIuZm9ybWF0WG1sRGF0ZVRpbWUob3JnVmFsdWUpKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzMiA9IEpTT05Db252ZXJ0ZXIuY29udmVydFByb3BlcnRpZXMoanNvbiwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9wczIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzMi5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzMi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFRFU1RfUFJPUCkpOwotICAgICAgICBhc3NlcnRUcnVlKHByb3BzMi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFRFU1RfUFJPUCkgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZTIgPSAoKFByb3BlcnR5RGF0ZVRpbWUpIHByb3BzMi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFRFU1RfUFJPUCkpLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3JnVmFsdWUuZ2V0VGltZUluTWlsbGlzKCksIHZhbHVlMi5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUodmFsdWUyLmdldFRpbWVab25lKCkuaGFzU2FtZVJ1bGVzKFRpbWVab25lLmdldFRpbWVab25lKFRJTUVaT05FKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9CYXNlNjRUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvQmFzZTY0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDEzNTUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9CYXNlNjRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLm1pc2M7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIEJhc2U2NCB0ZXN0cy4gKFBsYWNlaG9sZGVyIGZvciBtb3JlIHRlc3RzLikKLSAqLwotcHVibGljIGNsYXNzIEJhc2U2NFRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQmFzZTY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBpbnB1dCA9IElPVXRpbHMudG9VVEY4Qnl0ZXMoInRlc3QiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImRHVnpkQT09IiwgQmFzZTY0LmVuY29kZUJ5dGVzKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoaW5wdXQsIEJhc2U2NC5kZWNvZGUoImRHVnpkQT09IikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dCwgQmFzZTY0LmRlY29kZShCYXNlNjQuZW5jb2RlQnl0ZXMoaW5wdXQpKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzZTY0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiZEdWemRBPT0iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gYmFzZTY0c3RyZWFtID0gbmV3IEJhc2U2NC5JbnB1dFN0cmVhbShzdHJlYW0pOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgSU9VdGlscy5jb3B5KGJhc2U2NHN0cmVhbSwgb3V0cHV0KTsKLQotICAgICAgICBiYXNlNjRzdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICBhc3NlcnRBcnJheUVxdWFscygidGVzdCIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIiksIG91dHB1dC50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvQ29sbGVjdGlvbnNIZWxwZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvQ29sbGVjdGlvbnNIZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWFjZGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9taXNjL0NvbGxlY3Rpb25zSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5taXNjOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbnNIZWxwZXJUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEhlbHBlcnMoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eSgoTGlzdDxTdHJpbmc+KSBudWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eSgoTWFwPFN0cmluZywgU3RyaW5nPikgbnVsbCkpOwotICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uc0hlbHBlci5pc05vdEVtcHR5KChMaXN0PFN0cmluZz4pIG51bGwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eSgoTWFwPFN0cmluZywgU3RyaW5nPikgbnVsbCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eShDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKENvbGxlY3Rpb25zSGVscGVyLmlzTnVsbE9yRW1wdHkoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkpOwotICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uc0hlbHBlci5pc05vdEVtcHR5KENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKENvbGxlY3Rpb25zSGVscGVyLmlzTm90RW1wdHkoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKENvbGxlY3Rpb25zSGVscGVyLmlzTnVsbE9yRW1wdHkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidmFsdWUiKSkpOwotICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uc0hlbHBlci5pc051bGxPckVtcHR5KENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgia2V5IiwgInZhbHVlIikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uc0hlbHBlci5pc05vdEVtcHR5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInZhbHVlIikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uc0hlbHBlci5pc05vdEVtcHR5KENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgia2V5IiwgInZhbHVlIikpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvQ29udGVudFN0cmVhbUhhc2hUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvQ29udGVudFN0cmVhbUhhc2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGI2MTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9taXNjL0NvbnRlbnRTdHJlYW1IYXNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwubWlzYzsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW1IYXNoOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSGFzaEltcGw7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50U3RyZWFtSGFzaFRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb250ZW50U3RyZWFtSGFzaEltcGwgaGFzaDEgPSBuZXcgQ29udGVudFN0cmVhbUhhc2hJbXBsKCJ7YWxnfTAxMjM0NTY3ODlhYmNkZWYiKTsKLSAgICAgICAgQ29udGVudFN0cmVhbUhhc2hJbXBsIGhhc2gyID0gbmV3IENvbnRlbnRTdHJlYW1IYXNoSW1wbCgiYWxnIiwgIjAxMjM0NTY3ODlhYmNkZWYiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImFsZyIsIGhhc2gxLmdldEFsZ29yaXRobSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5YWJjZGVmIiwgaGFzaDEuZ2V0SGFzaCgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoaGFzaDEuZ2V0UHJvcGVydHlWYWx1ZSgpLCBoYXNoMi5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaGFzaDEuZ2V0QWxnb3JpdGhtKCksIGhhc2gyLmdldEFsZ29yaXRobSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc2gxLmdldEhhc2goKSwgaGFzaDIuZ2V0SGFzaCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29ycmVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW1IYXNoSW1wbCBoYXNoMSA9IG5ldyBDb250ZW50U3RyZWFtSGFzaEltcGwoInthbGd9IDAxIDIzIDQ1IDY3IDg5IEFCIENEIEVGICIpOwotICAgICAgICBDb250ZW50U3RyZWFtSGFzaEltcGwgaGFzaDIgPSBuZXcgQ29udGVudFN0cmVhbUhhc2hJbXBsKCJBTEciLCAiMDEyMyA0NTY3IDg5YWIgY2RlZiIpOwotICAgICAgICBDb250ZW50U3RyZWFtSGFzaEltcGwgaGFzaDMgPSBuZXcgQ29udGVudFN0cmVhbUhhc2hJbXBsKCJhTGciLCBuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4MDEsIChieXRlKSAweDIzLAotICAgICAgICAgICAgICAgIChieXRlKSAweDQ1LCAoYnl0ZSkgMHg2NywgKGJ5dGUpIDB4ODksIChieXRlKSAweGFiLCAoYnl0ZSkgMHhjZCwgKGJ5dGUpIDB4ZWYgfSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbGciLCBoYXNoMS5nZXRBbGdvcml0aG0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMDEyMzQ1Njc4OWFiY2RlZiIsIGhhc2gxLmdldEhhc2goKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc2gxLmdldEFsZ29yaXRobSgpLCBoYXNoMi5nZXRBbGdvcml0aG0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhoYXNoMS5nZXRIYXNoKCksIGhhc2gyLmdldEhhc2goKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGhhc2gxLmdldEFsZ29yaXRobSgpLCBoYXNoMy5nZXRBbGdvcml0aG0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhoYXNoMS5nZXRIYXNoKCksIGhhc2gzLmdldEhhc2goKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoaGFzaDEuZXF1YWxzKGhhc2gyKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGhhc2gxLmVxdWFscyhoYXNoMikpOwotICAgICAgICBhc3NlcnRUcnVlKGhhc2gyLmVxdWFscyhoYXNoMykpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEhhc2hTdHJlYW1NRDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKCJIZWxsbyBXb3JsZCEiKTsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOwotCi0gICAgICAgIENvbnRlbnRTdHJlYW1IYXNoIGhhc2ggPSBDb250ZW50U3RyZWFtSGFzaEltcGwuY3JlYXRlQ29udGVudFN0cmVhbUhhc2hlcyhzdHJlYW0sCi0gICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbUhhc2hJbXBsLkFMR09SSVRITV9NRDUpLmdldCgwKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoQ29udGVudFN0cmVhbUhhc2hJbXBsLkFMR09SSVRITV9NRDUsIGhhc2guZ2V0QWxnb3JpdGhtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImVkMDc2Mjg3NTMyZTg2MzY1ZTg0MWU5MmJmYzUwZDhjIiwgaGFzaC5nZXRIYXNoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInttZDV9ZWQwNzYyODc1MzJlODYzNjVlODQxZTkyYmZjNTBkOGMiLCBoYXNoLmdldFByb3BlcnR5VmFsdWUoKSk7Ci0KLSAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaFN0cmVhbVNIQTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKCJIZWxsbyBXb3JsZCEiKTsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOwotCi0gICAgICAgIENvbnRlbnRTdHJlYW1IYXNoIGhhc2ggPSBDb250ZW50U3RyZWFtSGFzaEltcGwuY3JlYXRlQ29udGVudFN0cmVhbUhhc2hlcyhzdHJlYW0sCi0gICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbUhhc2hJbXBsLkFMR09SSVRITV9TSEExKS5nZXQoMCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENvbnRlbnRTdHJlYW1IYXNoSW1wbC5BTEdPUklUSE1fU0hBMSwgaGFzaC5nZXRBbGdvcml0aG0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMmVmN2JkZTYwOGNlNTQwNGU5N2Q1ZjA0MmY5NWY4OWYxYzIzMjg3MSIsIGhhc2guZ2V0SGFzaCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7c2hhLTF9MmVmN2JkZTYwOGNlNTQwNGU5N2Q1ZjA0MmY5NWY4OWYxYzIzMjg3MSIsIGhhc2guZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQotICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoU3RyZWFtU0hBMjU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50ID0gSU9VdGlscy50b1VURjhCeXRlcygiSGVsbG8gV29ybGQhIik7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KTsKLQotICAgICAgICBDb250ZW50U3RyZWFtSGFzaCBoYXNoID0gQ29udGVudFN0cmVhbUhhc2hJbXBsLmNyZWF0ZUNvbnRlbnRTdHJlYW1IYXNoZXMoc3RyZWFtLAotICAgICAgICAgICAgICAgIENvbnRlbnRTdHJlYW1IYXNoSW1wbC5BTEdPUklUSE1fU0hBMjU2KS5nZXQoMCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENvbnRlbnRTdHJlYW1IYXNoSW1wbC5BTEdPUklUSE1fU0hBMjU2LCBoYXNoLmdldEFsZ29yaXRobSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI3ZjgzYjE2NTdmZjFmYzUzYjkyZGMxODE0OGExZDY1ZGZjMmQ0YjFmYTNkNjc3Mjg0YWRkZDIwMDEyNmQ5MDY5IiwgaGFzaC5nZXRIYXNoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIntzaGEtMjU2fTdmODNiMTY1N2ZmMWZjNTNiOTJkYzE4MTQ4YTFkNjVkZmMyZDRiMWZhM2Q2NzcyODRhZGRkMjAwMTI2ZDkwNjkiLAotICAgICAgICAgICAgICAgIGhhc2guZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQotICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoU3RyZWFtU0hBNTEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50ID0gSU9VdGlscy50b1VURjhCeXRlcygiSGVsbG8gV29ybGQhIik7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KTsKLQotICAgICAgICBDb250ZW50U3RyZWFtSGFzaCBoYXNoID0gQ29udGVudFN0cmVhbUhhc2hJbXBsLmNyZWF0ZUNvbnRlbnRTdHJlYW1IYXNoZXMoc3RyZWFtLAotICAgICAgICAgICAgICAgIENvbnRlbnRTdHJlYW1IYXNoSW1wbC5BTEdPUklUSE1fU0hBNTEyKS5nZXQoMCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENvbnRlbnRTdHJlYW1IYXNoSW1wbC5BTEdPUklUSE1fU0hBNTEyLCBoYXNoLmdldEFsZ29yaXRobSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICI4NjE4NDRkNjcwNGU4NTczZmVjMzRkOTY3ZTIwYmNmZWYzZDQyNGNmNDhiZTA0ZTZkYzA4ZjJiZDU4YzcyOTc0MzM3MTAxNWVhZDg5MWNjM2NmMWM5ZDM0YjQ5MjY0YjUxMDc1MWIxZmY5ZTUzNzkzN2JjNDZiNWQ2ZmY0ZWNjOCIsCi0gICAgICAgICAgICAgICAgaGFzaC5nZXRIYXNoKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIntzaGEtNTEyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjg2MTg0NGQ2NzA0ZTg1NzNmZWMzNGQ5NjdlMjBiY2ZlZjNkNDI0Y2Y0OGJlMDRlNmRjMDhmMmJkNThjNzI5NzQzMzcxMDE1ZWFkODkxY2MzY2YxYzlkMzRiNDkyNjRiNTEwNzUxYjFmZjllNTM3OTM3YmM0NmI1ZDZmZjRlY2M4IiwKLSAgICAgICAgICAgICAgICBoYXNoLmdldFByb3BlcnR5VmFsdWUoKSk7Ci0KLSAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaFN0cmVhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKCJIZWxsbyBXb3JsZCEiKTsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOwotCi0gICAgICAgIExpc3Q8Q29udGVudFN0cmVhbUhhc2g+IGhhc2hlcyA9IENvbnRlbnRTdHJlYW1IYXNoSW1wbC5jcmVhdGVDb250ZW50U3RyZWFtSGFzaGVzKHN0cmVhbSwKLSAgICAgICAgICAgICAgICBDb250ZW50U3RyZWFtSGFzaEltcGwuQUxHT1JJVEhNX1NIQTEsIENvbnRlbnRTdHJlYW1IYXNoSW1wbC5BTEdPUklUSE1fU0hBMjU2LAotICAgICAgICAgICAgICAgIENvbnRlbnRTdHJlYW1IYXNoSW1wbC5BTEdPUklUSE1fU0hBNTEyKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGhhc2hlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBoYXNoZXMuc2l6ZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIntzaGEtMX0yZWY3YmRlNjA4Y2U1NDA0ZTk3ZDVmMDQyZjk1Zjg5ZjFjMjMyODcxIiwgaGFzaGVzLmdldCgwKS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIntzaGEtMjU2fTdmODNiMTY1N2ZmMWZjNTNiOTJkYzE4MTQ4YTFkNjVkZmMyZDRiMWZhM2Q2NzcyODRhZGRkMjAwMTI2ZDkwNjkiLCBoYXNoZXMuZ2V0KDEpCi0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAie3NoYS01MTJ9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiODYxODQ0ZDY3MDRlODU3M2ZlYzM0ZDk2N2UyMGJjZmVmM2Q0MjRjZjQ4YmUwNGU2ZGMwOGYyYmQ1OGM3Mjk3NDMzNzEwMTVlYWQ4OTFjYzNjZjFjOWQzNGI0OTI2NGI1MTA3NTFiMWZmOWU1Mzc5MzdiYzQ2YjVkNmZmNGVjYzgiLAotICAgICAgICAgICAgICAgIGhhc2hlcy5nZXQoMikuZ2V0UHJvcGVydHlWYWx1ZSgpKTsKLQotICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvQ29udmVydGVyVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9taXNjL0NvbnZlcnRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlMWU2ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvQ29udmVydGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwubWlzYzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUGVybWlzc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUGVybWlzc2lvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q2hhbmdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlKb2luOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVJlbmRpdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkRvY3VtZW50VHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3REYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlJbmZvSW1wbDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBUZXN0cyBjb252ZXJ0ZXIgbWV0aG9kcy4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5SW5mbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBkcnkgcnVuCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvSW1wbCBvYmoxID0gbmV3IFJlcG9zaXRvcnlJbmZvSW1wbCgpOwotICAgICAgICBSZXBvc2l0b3J5SW5mbyBvYmoyID0gV1NDb252ZXJ0ZXIuY29udmVydChXU0NvbnZlcnRlci5jb252ZXJ0KG9iajEsIENtaXNWZXJzaW9uLkNNSVNfMV8xKSk7Ci0KLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlJlcG9zaXRvcnlJbmZvIiwgb2JqMSwgb2JqMik7Ci0KLSAgICAgICAgLy8gdmFsdWVzCi0gICAgICAgIG9iajEgPSBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKCk7Ci0gICAgICAgIG9iajEuc2V0Q2hhbmdlc0luY29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgb2JqMS5zZXRDaGFuZ2VzT25UeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSk7Ci0gICAgICAgIG9iajEuc2V0Q21pc1ZlcnNpb25TdXBwb3J0ZWQoIjEuMCIpOwotICAgICAgICBvYmoxLnNldExhdGVzdENoYW5nZUxvZ1Rva2VuKCJjaGFuZ2VMb2dUb2tlbiIpOwotICAgICAgICBvYmoxLnNldFByaW5jaXBhbEFub255bW91cygicHJpbmNpcGFsQW5vbnltb3VzIik7Ci0gICAgICAgIG9iajEuc2V0UHJpbmNpcGFsQW55b25lKCJwcmluY2lwYWxBbnlvbmUiKTsKLSAgICAgICAgb2JqMS5zZXRQcm9kdWN0TmFtZSgicHJvZHVjdE5hbWUiKTsKLSAgICAgICAgb2JqMS5zZXRQcm9kdWN0VmVyc2lvbigicHJvZHVjdFZlcnNpb24iKTsKLSAgICAgICAgb2JqMS5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24iKTsKLSAgICAgICAgb2JqMS5zZXRJZCgiaWQiKTsKLSAgICAgICAgb2JqMS5zZXROYW1lKCJuYW1lIik7Ci0gICAgICAgIG9iajEuc2V0Um9vdEZvbGRlcigicm9vdEZvbGRlcklkIik7Ci0gICAgICAgIG9iajEuc2V0VGhpbkNsaWVudFVyaSgidGhpbkNsaWVudFVyaSIpOwotICAgICAgICBvYmoxLnNldFZlbmRvck5hbWUoInZlbmRvck5hbWUiKTsKLQotICAgICAgICBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCBjYXAxID0gbmV3IFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsKCk7Ci0gICAgICAgIGNhcDEuc2V0QWxsVmVyc2lvbnNTZWFyY2hhYmxlKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGNhcDEuc2V0Q2FwYWJpbGl0eUFjbChDYXBhYmlsaXR5QWNsLkRJU0NPVkVSKTsKLSAgICAgICAgY2FwMS5zZXRDYXBhYmlsaXR5Q2hhbmdlcyhDYXBhYmlsaXR5Q2hhbmdlcy5BTEwpOwotICAgICAgICBjYXAxLnNldENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyhDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMuQU5ZVElNRSk7Ci0gICAgICAgIGNhcDEuc2V0Q2FwYWJpbGl0eUpvaW4oQ2FwYWJpbGl0eUpvaW4uSU5ORVJBTkRPVVRFUik7Ci0gICAgICAgIGNhcDEuc2V0Q2FwYWJpbGl0eVF1ZXJ5KENhcGFiaWxpdHlRdWVyeS5CT1RIQ09NQklORUQpOwotICAgICAgICBjYXAxLnNldENhcGFiaWxpdHlSZW5kaXRpb24oQ2FwYWJpbGl0eVJlbmRpdGlvbnMuUkVBRCk7Ci0gICAgICAgIGNhcDEuc2V0SXNQd2NTZWFyY2hhYmxlKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGNhcDEuc2V0SXNQd2NVcGRhdGFibGUoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgY2FwMS5zZXRTdXBwb3J0c0dldERlc2NlbmRhbnRzKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGNhcDEuc2V0U3VwcG9ydHNHZXRGb2xkZXJUcmVlKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGNhcDEuc2V0U3VwcG9ydHNNdWx0aWZpbGluZyhCb29sZWFuLlRSVUUpOwotICAgICAgICBjYXAxLnNldFN1cHBvcnRzVW5maWxpbmcoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgY2FwMS5zZXRTdXBwb3J0c1ZlcnNpb25TcGVjaWZpY0ZpbGluZyhCb29sZWFuLlRSVUUpOwotICAgICAgICBvYmoxLnNldENhcGFiaWxpdGllcyhjYXAxKTsKLQotICAgICAgICBBY2xDYXBhYmlsaXRpZXNEYXRhSW1wbCBhY2wxID0gbmV3IEFjbENhcGFiaWxpdGllc0RhdGFJbXBsKCk7Ci0gICAgICAgIGFjbDEuc2V0QWNsUHJvcGFnYXRpb24oQWNsUHJvcGFnYXRpb24uUFJPUEFHQVRFKTsKLSAgICAgICAgTGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4gcGRkTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGVybWlzc2lvbkRlZmluaXRpb24+KCk7Ci0gICAgICAgIFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGwgcGRkMSA9IG5ldyBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsKCk7Ci0gICAgICAgIHBkZDEuc2V0SWQoInRlc3Q6cGVybTEiKTsKLSAgICAgICAgcGRkMS5zZXREZXNjcmlwdGlvbigiUGVybWlzc2lvbjEiKTsKLSAgICAgICAgcGRkTGlzdC5hZGQocGRkMSk7Ci0gICAgICAgIFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGwgcGRkMiA9IG5ldyBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsKCk7Ci0gICAgICAgIHBkZDIuc2V0SWQoInRlc3Q6cGVybTIiKTsKLSAgICAgICAgcGRkMi5zZXREZXNjcmlwdGlvbigiUGVybWlzc2lvbjIiKTsKLSAgICAgICAgcGRkTGlzdC5hZGQocGRkMik7Ci0gICAgICAgIGFjbDEuc2V0UGVybWlzc2lvbkRlZmluaXRpb25EYXRhKHBkZExpc3QpOwotICAgICAgICBNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4gcG1kID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4oKTsKLSAgICAgICAgUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbCBwbWQxID0gbmV3IFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwoKTsKLSAgICAgICAgcG1kMS5zZXRLZXkoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0NSRUFURV9ET0NVTUVOVF9GT0xERVIpOwotICAgICAgICBwbWQxLnNldFBlcm1pc3Npb25zKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInAxIiwgInAyIiB9KSk7Ci0gICAgICAgIHBtZC5wdXQocG1kMS5nZXRLZXkoKSwgcG1kMSk7Ci0gICAgICAgIFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwgcG1kMiA9IG5ldyBQZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsKCk7Ci0gICAgICAgIHBtZDIuc2V0S2V5KFBlcm1pc3Npb25NYXBwaW5nLkNBTl9ERUxFVEVfT0JKRUNUKTsKLSAgICAgICAgcG1kMi5zZXRQZXJtaXNzaW9ucyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJwMyIsICJwNCIgfSkpOwotICAgICAgICBwbWQucHV0KHBtZDIuZ2V0S2V5KCksIHBtZDIpOwotICAgICAgICBhY2wxLnNldFBlcm1pc3Npb25NYXBwaW5nRGF0YShwbWQpOwotICAgICAgICBvYmoxLnNldEFjbENhcGFiaWxpdGllcyhhY2wxKTsKLQotICAgICAgICBvYmoyID0gV1NDb252ZXJ0ZXIuY29udmVydChXU0NvbnZlcnRlci5jb252ZXJ0KG9iajEsIENtaXNWZXJzaW9uLkNNSVNfMV8xKSk7Ci0KLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlJlcG9zaXRvcnlJbmZvIiwgb2JqMSwgb2JqMik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZURlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZHJ5IHJ1bgotICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCBvYmoxID0gbmV3IERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIG9iajIgPSBXU0NvbnZlcnRlci5jb252ZXJ0KFdTQ29udmVydGVyLmNvbnZlcnQob2JqMSkpOwotCi0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJUeXBlRGVmaW5pdGlvbiIsIG9iajEsIG9iajIpOwotCi0gICAgICAgIC8vIHNpbXBsZSB2YWx1ZXMKLSAgICAgICAgb2JqMSA9IG5ldyBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBvYmoxLnNldEJhc2VUeXBlSWQoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKTsKLSAgICAgICAgb2JqMS5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChDb250ZW50U3RyZWFtQWxsb3dlZC5BTExPV0VEKTsKLSAgICAgICAgb2JqMS5zZXREZXNjcmlwdGlvbigiZGVzY3JpcHRpb24iKTsKLSAgICAgICAgb2JqMS5zZXREaXNwbGF5TmFtZSgiZGlzcGxheU5hbWUiKTsKLSAgICAgICAgb2JqMS5zZXRJZCgiaWQiKTsKLSAgICAgICAgb2JqMS5zZXRJc0NvbnRyb2xsYWJsZUFjbChCb29sZWFuLlRSVUUpOwotICAgICAgICBvYmoxLnNldElzQ29udHJvbGxhYmxlUG9saWN5KEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIG9iajEuc2V0SXNDcmVhdGFibGUoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgb2JqMS5zZXRJc0ZpbGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIG9iajEuc2V0SXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgb2JqMS5zZXRJc1F1ZXJ5YWJsZShCb29sZWFuLlRSVUUpOwotICAgICAgICBvYmoxLnNldElzVmVyc2lvbmFibGUoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgb2JqMS5zZXRMb2NhbE5hbWUoImxvY2FsTmFtZSIpOwotICAgICAgICBvYmoxLnNldExvY2FsTmFtZXNwYWNlKCJsb2NhbE5hbWVzcGFjZSIpOwotICAgICAgICBvYmoxLnNldFBhcmVudFR5cGVJZCgicGFyZW50SWQiKTsKLSAgICAgICAgb2JqMS5zZXRRdWVyeU5hbWUoInF1ZXJ5TmFtZSIpOwotCi0gICAgICAgIG9iajIgPSBXU0NvbnZlcnRlci5jb252ZXJ0KFdTQ29udmVydGVyLmNvbnZlcnQob2JqMSkpOwotCi0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJUeXBlRGVmaW5pdGlvbiIsIG9iajEsIG9iajIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBkcnkgcnVuCi0gICAgICAgIE9iamVjdERhdGFJbXBsIG9iajEgPSBuZXcgT2JqZWN0RGF0YUltcGwoKTsKLSAgICAgICAgT2JqZWN0RGF0YSBvYmoyID0gV1NDb252ZXJ0ZXIuY29udmVydChXU0NvbnZlcnRlci5jb252ZXJ0KG9iajEsIENtaXNWZXJzaW9uLkNNSVNfMV8xKSk7Ci0KLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIk9iamVjdCIsIG9iajEsIG9iajIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFzc2VydHMgT3BlbkNNSVMgZGF0YSBvYmplY3RzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKFN0cmluZyBuYW1lLCBPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGlmICgoZXhwZWN0ZWQgPT0gbnVsbCkgJiYgKGFjdHVhbCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChleHBlY3RlZCA9PSBudWxsKSAmJiAoYWN0dWFsIGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoKChDb2xsZWN0aW9uPD8+KSBhY3R1YWwpLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoKGV4cGVjdGVkIGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikgJiYgKGFjdHVhbCA9PSBudWxsKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoKENvbGxlY3Rpb248Pz4pIGV4cGVjdGVkKS5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKChleHBlY3RlZCA9PSBudWxsKSB8fCAoYWN0dWFsID09IG51bGwpKSB7Ci0gICAgICAgICAgICBmYWlsKCJEYXRhIG9iamVjdCBpcyBudWxsISBuYW1lOiAiICsgbmFtZSArICIgLyBleHBlY3RlZDogIiArIGV4cGVjdGVkICsgIiAvIGFjdHVhbDogIiArIGFjdHVhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgc2ltcGxlIHR5cGVzCi0gICAgICAgIGlmICgoZXhwZWN0ZWQgaW5zdGFuY2VvZiBTdHJpbmcpIHx8IChleHBlY3RlZCBpbnN0YW5jZW9mIEJvb2xlYW4pIHx8IChleHBlY3RlZCBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpCi0gICAgICAgICAgICAgICAgfHwgKGV4cGVjdGVkIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgfHwgKGV4cGVjdGVkIGluc3RhbmNlb2YgRW51bTw/PikpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgTGlzdDw/PikgewotICAgICAgICAgICAgTGlzdDw/PiBleHBlY3RlZExpc3QgPSAoTGlzdDw/PikgZXhwZWN0ZWQ7Ci0gICAgICAgICAgICBMaXN0PD8+IGFjdHVhbExpc3QgPSAoTGlzdDw/PikgYWN0dWFsOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaXN0LnNpemUoKSwgYWN0dWFsTGlzdC5zaXplKCkpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKG5hbWUgKyAiWyIgKyBpICsgIl0iLCBleHBlY3RlZExpc3QuZ2V0KGkpLCBhY3R1YWxMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIE1hcDw/LCA/PikgewotICAgICAgICAgICAgTWFwPD8sID8+IGV4cGVjdGVkTWFwID0gKE1hcDw/LCA/PikgZXhwZWN0ZWQ7Ci0gICAgICAgICAgICBNYXA8PywgPz4gYWN0dWFsTWFwID0gKE1hcDw/LCA/PikgYWN0dWFsOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNYXAuc2l6ZSgpLCBhY3R1YWxNYXAuc2l6ZSgpKTsKLQotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8PywgPz4gZW50cnkgOiBleHBlY3RlZE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3R1YWxNYXAuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscyhuYW1lICsgIlsiICsgZW50cnkuZ2V0S2V5KCkgKyAiXSIsIGVudHJ5LmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxNYXAuZ2V0KGVudHJ5LmdldEtleSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoTWV0aG9kIG0gOiBleHBlY3RlZC5nZXRDbGFzcygpLmdldE1ldGhvZHMoKSkgewotICAgICAgICAgICAgaWYgKCFtLmdldE5hbWUoKS5zdGFydHNXaXRoKCJnZXQiKSAmJiAhbS5nZXROYW1lKCkuc3RhcnRzV2l0aCgic3VwcG9ydHMiKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJnZXRDbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0IGV4cGVjdGVkVmFsdWUgPSBtLmludm9rZShleHBlY3RlZCwgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgICAgICBPYmplY3QgYWN0dWFsVmFsdWUgPSBtLmludm9rZShhY3R1YWwsIG5ldyBPYmplY3RbMF0pOwotCi0gICAgICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscyhuYW1lICsgIi4iICsgbS5nZXROYW1lKCksIGV4cGVjdGVkVmFsdWUsIGFjdHVhbFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9EYXRlVGltZVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9EYXRlVGltZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiYzNhOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvRGF0ZVRpbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5taXNjOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIERhdGVUaW1lVGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxEYXRlVGltZVBhcnNlcigpIHsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsMSA9IERhdGVUaW1lSGVscGVyLnBhcnNlWG1sRGF0ZVRpbWUoIjIwMTItMTItMjRUMDk6MTU6MDYuMTIzWiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMjAxMiwgY2FsMS5nZXQoQ2FsZW5kYXIuWUVBUikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTEsIGNhbDEuZ2V0KENhbGVuZGFyLk1PTlRIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyNCwgY2FsMS5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg5LCBjYWwxLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIGNhbDEuZ2V0KENhbGVuZGFyLk1JTlVURSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgY2FsMS5nZXQoQ2FsZW5kYXIuU0VDT05EKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMjMsIGNhbDEuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBjYWwxLmdldFRpbWVab25lKCkuZ2V0UmF3T2Zmc2V0KCkpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDIgPSBEYXRlVGltZUhlbHBlci5wYXJzZVhtbERhdGVUaW1lKCIyMDEzLTAyLTA0VDIzOjQ1OjU1Ljk4NzY1NDMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMTMsIGNhbDIuZ2V0KENhbGVuZGFyLllFQVIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNhbDIuZ2V0KENhbGVuZGFyLk1PTlRIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBjYWwyLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIzLCBjYWwyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNDUsIGNhbDIuZ2V0KENhbGVuZGFyLk1JTlVURSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNTUsIGNhbDIuZ2V0KENhbGVuZGFyLlNFQ09ORCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoOTg3LCBjYWwyLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY2FsMi5nZXRUaW1lWm9uZSgpLmdldFJhd09mZnNldCgpKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwzID0gRGF0ZVRpbWVIZWxwZXIucGFyc2VYbWxEYXRlVGltZSgiMjAxMy0wMS0wMlQwMzowNDowNS42NzgrMDU6MDAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMTMsIGNhbDMuZ2V0KENhbGVuZGFyLllFQVIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNhbDMuZ2V0KENhbGVuZGFyLk1PTlRIKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBjYWwzLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNhbDMuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBjYWwzLmdldChDYWxlbmRhci5NSU5VVEUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGNhbDMuZ2V0KENhbGVuZGFyLlNFQ09ORCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNjc4LCBjYWwzLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSAqIDYwICogNjAgKiAxMDAwLCBjYWwzLmdldFRpbWVab25lKCkuZ2V0UmF3T2Zmc2V0KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFhtbERhdGVUaW1lV3JpdGVyKCkgewotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwxID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgIGNhbDEuc2V0KDIwMTIsIDExLCAyNCwgOSwgMTAsIDExKTsKLSAgICAgICAgY2FsMS5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiMjAxMi0xMi0yNFQwOToxMDoxMVoiLCBEYXRlVGltZUhlbHBlci5mb3JtYXRYbWxEYXRlVGltZShjYWwxKSk7Ci0KLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsMiA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICBjYWwyLnNldCgyMDEzLCAwLCAxLCAyLCAzLCA0KTsKLSAgICAgICAgY2FsMi5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDUwKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMTMtMDEtMDFUMDI6MDM6MDQuMDVaIiwgRGF0ZVRpbWVIZWxwZXIuZm9ybWF0WG1sRGF0ZVRpbWUoY2FsMikpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDMgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNTowMCIpKTsKLSAgICAgICAgY2FsMy5zZXQoMjAxMiwgMTEsIDI0LCA5LCAxMCwgMTEpOwotICAgICAgICBjYWwzLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDEyLTEyLTI0VDA5OjEwOjExKzA1OjAwIiwgRGF0ZVRpbWVIZWxwZXIuZm9ybWF0WG1sRGF0ZVRpbWUoY2FsMykpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDQgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVC0wMzowMiIpKTsKLSAgICAgICAgY2FsNC5zZXQoMTAwLCA4LCAxNywgMTgsIDMwLCA3KTsKLSAgICAgICAgY2FsNC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDY1NCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTAwLTA5LTE3VDE4OjMwOjA3LjY1NC0wMzowMiIsIERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKGNhbDQpKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWw1ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDE6MDAiKSk7Ci0gICAgICAgIGNhbDUuc2V0KDIwMTIsIDExLCAyNCwgOSwgMTAsIDExKTsKLSAgICAgICAgY2FsNS5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiMjAxMi0xMi0yNFQwODoxMDoxMVoiLCBEYXRlVGltZUhlbHBlci5mb3JtYXRYbWxEYXRlVGltZShjYWw1LmdldFRpbWVJbk1pbGxpcygpKSk7Ci0KLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsNiA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiRXVyb3BlL0JlcmxpbiIpKTsKLSAgICAgICAgY2FsNi5zZXQoMjAxMywgNCwgNiwgOSwgMTAsIDExKTsKLSAgICAgICAgY2FsNi5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiMjAxMy0wNS0wNlQwOToxMDoxMSswMjowMCIsIERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKGNhbDYpKTsKLSAgICAgICAgCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDcgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkV1cm9wZS9CZXJsaW4iKSk7Ci0gICAgICAgIGNhbDcuc2V0KDIwMTIsIDExLCAyNCwgOSwgMTAsIDExKTsKLSAgICAgICAgY2FsNy5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiMjAxMi0xMi0yNFQwOToxMDoxMSswMTowMCIsIERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKGNhbDcpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxEYXRlVGltZVdyaXRlckFuZFBhcnNlcigpIHsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsMSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICBjYWwxLnNldCgyMDEyLCAxMSwgMjQsIDksIDEwLCAxMSk7Ci0gICAgICAgIGNhbDEuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwyID0gRGF0ZVRpbWVIZWxwZXIucGFyc2VYbWxEYXRlVGltZShEYXRlVGltZUhlbHBlci5mb3JtYXRYbWxEYXRlVGltZShjYWwxKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbDEsIGNhbDIpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDMgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNTowMCIpKTsKLSAgICAgICAgY2FsMy5zZXQoMjAxMiwgMTEsIDI0LCA5LCAxMCwgMTEpOwotICAgICAgICBjYWwzLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMTIpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDQgPSBEYXRlVGltZUhlbHBlci5wYXJzZVhtbERhdGVUaW1lKERhdGVUaW1lSGVscGVyLmZvcm1hdFhtbERhdGVUaW1lKGNhbDMpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsMywgY2FsNCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFhtbERhdGVUaW1lKCkgewotICAgICAgICAvLyBudWxsIGlzIG5vdCBhIGRhdGUKLSAgICAgICAgYXNzZXJ0TnVsbChEYXRlVGltZUhlbHBlci5wYXJzZVhtbERhdGVUaW1lKG51bGwpKTsKLQotICAgICAgICAvLyAiIiBpcyBub3QgYSBkYXRlCi0gICAgICAgIGFzc2VydE51bGwoRGF0ZVRpbWVIZWxwZXIucGFyc2VYbWxEYXRlVGltZSgiIikpOwotCi0gICAgICAgIC8vIHdyb25nIGZvcm1hdAotICAgICAgICBhc3NlcnROdWxsKERhdGVUaW1lSGVscGVyLnBhcnNlWG1sRGF0ZVRpbWUoIjExMTExMTExMTExMTExMTEiKSk7Ci0KLSAgICAgICAgLy8gaW52YWxpZCB5ZWFyCi0gICAgICAgIGFzc2VydE51bGwoRGF0ZVRpbWVIZWxwZXIucGFyc2VYbWxEYXRlVGltZSgiMTExLTExLTExVDExOjExOjExLjExMVoiKSk7Ci0KLSAgICAgICAgLy8gaW52YWxpZCBtb250aAotICAgICAgICBhc3NlcnROdWxsKERhdGVUaW1lSGVscGVyLnBhcnNlWG1sRGF0ZVRpbWUoIjExMTEtMjEtMTFUMTE6MTE6MTEuMTExWiIpKTsKLQotICAgICAgICAvLyBpbnZhbGlkIGRheQotICAgICAgICBhc3NlcnROdWxsKERhdGVUaW1lSGVscGVyLnBhcnNlWG1sRGF0ZVRpbWUoIjExMTEtMTEtNTFUMTE6MTE6MTEuMTExWiIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwRGF0ZVRpbWVQYXJzZXIoKSB7Ci0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDEgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgY2FsMS5zZXQoMjAxMiwgMTEsIDI0LCA5LCAxMCwgMTEpOwotICAgICAgICBjYWwxLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7Ci0KLSAgICAgICAgU3RyaW5nIGRhdGVTdHIxID0gRGF0ZVRpbWVIZWxwZXIuZm9ybWF0SHR0cERhdGVUaW1lKGNhbDEuZ2V0VGltZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNb24sIDI0IERlYyAyMDEyIDA5OjEwOjExIEdNVCIsIGRhdGVTdHIxKTsKLQotICAgICAgICBEYXRlIGRhdGUxID0gRGF0ZVRpbWVIZWxwZXIucGFyc2VIdHRwRGF0ZVRpbWUoZGF0ZVN0cjEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhjYWwxLmdldFRpbWUoKSwgZGF0ZTEpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCswNTowMCIpKTsKLSAgICAgICAgY2FsMi5zZXQoMjAxMywgMCwgMSwgMiwgMywgNCk7Ci0gICAgICAgIGNhbDIuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKLQotICAgICAgICBTdHJpbmcgZGF0ZVN0cjIgPSAiICAnIiArIERhdGVUaW1lSGVscGVyLmZvcm1hdEh0dHBEYXRlVGltZShjYWwyLmdldFRpbWVJbk1pbGxpcygpKSArICInICI7Ci0gICAgICAgIERhdGUgZGF0ZTIgPSBEYXRlVGltZUhlbHBlci5wYXJzZUh0dHBEYXRlVGltZShkYXRlU3RyMik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbDIuZ2V0VGltZSgpLCBkYXRlMik7Ci0KLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsMyA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UKzA1OjAwIikpOwotICAgICAgICBjYWwzLnNldCgyMDEyLCAxMSwgMjQsIDksIDEwLCAxMSk7Ci0gICAgICAgIGNhbDMuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKLQotICAgICAgICBTdHJpbmcgZGF0ZVN0cjMgPSBEYXRlVGltZUhlbHBlci5mb3JtYXRIdHRwRGF0ZVRpbWUoY2FsMyk7Ci0gICAgICAgIERhdGUgZGF0ZTMgPSBEYXRlVGltZUhlbHBlci5wYXJzZUh0dHBEYXRlVGltZShkYXRlU3RyMyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbDMuZ2V0VGltZSgpLCBkYXRlMyk7Ci0KLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsNCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICBjYWw0LnNldCgxOTk0LCAxMCwgNiwgOCwgNDksIDM3KTsKLSAgICAgICAgY2FsNC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOwotCi0gICAgICAgIFN0cmluZyBkYXRlU3RyNCA9ICJTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQiOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhjYWw0LmdldFRpbWUoKSwgRGF0ZVRpbWVIZWxwZXIucGFyc2VIdHRwRGF0ZVRpbWUoZGF0ZVN0cjQpKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWw1ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgIGNhbDUuc2V0KDE5OTQsIDEwLCA2LCA4LCA0OSwgMzcpOwotICAgICAgICBjYWw1LnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7Ci0KLSAgICAgICAgU3RyaW5nIGRhdGVTdHI1ID0gIlN1biBOb3YgIDYgMDg6NDk6MzcgMTk5NCI7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbDUuZ2V0VGltZSgpLCBEYXRlVGltZUhlbHBlci5wYXJzZUh0dHBEYXRlVGltZShkYXRlU3RyNSkpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbDYgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgY2FsNi5zZXQoMTk5NCwgMTAsIDE2LCA4LCA0OSwgMzcpOwotICAgICAgICBjYWw2LnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7Ci0KLSAgICAgICAgU3RyaW5nIGRhdGVTdHI2ID0gIlN1biBOb3YgMTYgMDg6NDk6MzcgMTk5NCI7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbDYuZ2V0VGltZSgpLCBEYXRlVGltZUhlbHBlci5wYXJzZUh0dHBEYXRlVGltZShkYXRlU3RyNikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRIdHRwRGF0ZVRpbWUoKSB7Ci0gICAgICAgIC8vIG51bGwgaXMgbm90IGEgZGF0ZQotICAgICAgICBhc3NlcnROdWxsKERhdGVUaW1lSGVscGVyLnBhcnNlSHR0cERhdGVUaW1lKG51bGwpKTsKLQotICAgICAgICAvLyAiIiBpcyBub3QgYSBkYXRlCi0gICAgICAgIGFzc2VydE51bGwoRGF0ZVRpbWVIZWxwZXIucGFyc2VIdHRwRGF0ZVRpbWUoIiIpKTsKLQotICAgICAgICAvLyB3cm9uZyBmb3JtYXQKLSAgICAgICAgYXNzZXJ0TnVsbChEYXRlVGltZUhlbHBlci5wYXJzZUh0dHBEYXRlVGltZSgiMTExMTExMTExMTExMTExMSIpKTsKLQotICAgICAgICAvLyBpbnZhbGlkIHllYXIKLSAgICAgICAgYXNzZXJ0TnVsbChEYXRlVGltZUhlbHBlci5wYXJzZUh0dHBEYXRlVGltZSgiTW9uLCAyNCBEZWMgYWJjZCAwOToxMDoxMSBHTVQiKSk7Ci0KLSAgICAgICAgLy8gaW52YWxpZCBtb250aAotICAgICAgICBhc3NlcnROdWxsKERhdGVUaW1lSGVscGVyLnBhcnNlSHR0cERhdGVUaW1lKCJNb24sIDI0IGFiYyAyMDEyIDA5OjEwOjExIEdNVCIpKTsKLQotICAgICAgICAvLyBpbnZhbGlkIGRheQotICAgICAgICBhc3NlcnROdWxsKERhdGVUaW1lSGVscGVyLnBhcnNlSHR0cERhdGVUaW1lKCJNb24sIHh5IERlYyAyMDEyIDA5OjEwOjExIEdNVCIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvSU9VdGlsc1Rlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9JT1V0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDk3YmQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9JT1V0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwubWlzYzsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgSU9VdGlsc1Rlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VVRGOCgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoY2hhciBjID0gJyAnOyBjIDw9IDB4ZmZmOyBjKyspIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscyhzYi50b1N0cmluZygpLCBJT1V0aWxzLnRvVVRGOFN0cmluZyhJT1V0aWxzLnRvVVRGOEJ5dGVzKHNiLnRvU3RyaW5nKCkpKSk7Ci0gICAgICAgIGFzc2VydE51bGwoSU9VdGlscy50b1VURjhCeXRlcyhudWxsKSk7Ci0gICAgICAgIGFzc2VydE51bGwoSU9VdGlscy50b1VURjhTdHJpbmcobnVsbCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVuY29kaW5nKCkgewotICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS9hYmM/a2V5PcOkw7bDvCBAIcKnJCUmLyI7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHVybCwgSU9VdGlscy5kZWNvZGVVUkwoSU9VdGlscy5lbmNvZGVVUkwodXJsKSkpOwotICAgICAgICBhc3NlcnROdWxsKElPVXRpbHMuZW5jb2RlVVJMKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChJT1V0aWxzLmRlY29kZVVSTChudWxsKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tGb3JCeXRlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRGYWxzZShJT1V0aWxzLmNoZWNrRm9yQnl0ZXMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSkpOwotICAgICAgICBhc3NlcnRUcnVlKElPVXRpbHMuY2hlY2tGb3JCeXRlcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oSU9VdGlscy50b1VURjhCeXRlcygiSGVsbG8gV29ybGQhIikpKSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChJT1V0aWxzLmNoZWNrRm9yQnl0ZXMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSwgMTAyNCkpOwotICAgICAgICBhc3NlcnRUcnVlKElPVXRpbHMuY2hlY2tGb3JCeXRlcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oSU9VdGlscy50b1VURjhCeXRlcygiSGVsbG8gV29ybGQhIikpLCAxMDI0KSBpbnN0YW5jZW9mIEJ5dGVBcnJheUlucHV0U3RyZWFtKTsKLQotICAgICAgICBhc3NlcnROdWxsKElPVXRpbHMuY2hlY2tGb3JCeXRlcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgMTAyNCkpOwotICAgICAgICBhc3NlcnRUcnVlKElPVXRpbHMuY2hlY2tGb3JCeXRlcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oSU9VdGlscy50b1VURjhCeXRlcygiSGVsbG8gV29ybGQhIikpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDEwMjQpIGluc3RhbmNlb2YgQnVmZmVyZWRJbnB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZUFuZENsb3NlKCkgewotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oSU9VdGlscy50b1VURjhCeXRlcygidGVzdCIpKTsKLQotICAgICAgICBJT1V0aWxzLmNvbnN1bWVBbmRDbG9zZShzdHJlYW0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RyZWFtLmF2YWlsYWJsZSgpKTsKLQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0yID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKElPVXRpbHMudG9VVEY4Qnl0ZXMoInRlc3QiKSk7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0yKTsKLQotICAgICAgICBJT1V0aWxzLmNvbnN1bWVBbmRDbG9zZShyZWFkZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RyZWFtMi5hdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRlci5yZWFkKCk7Ci0gICAgICAgICAgICBmYWlsKCJSZWFkZXIgc2hvdWxkIGJlIGNsb3NlZC4iKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotCi0gICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHJlYWRlcik7Ci0gICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KChDbG9zZWFibGUpIG51bGwpOwotICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseSgoQ29udGVudFN0cmVhbSkgbnVsbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBieXRlW10gaW5wdXQgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKCJ0ZXN0Iik7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBJT1V0aWxzLmNvcHkoaW4sIG91dCk7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoaW5wdXQsIG91dC50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShpbik7Ci0gICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KG91dCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rmlyc3RMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAibGluZSAxXG5saW5lIDJcbmxpbmUgMyI7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNyZWF0ZVN0cmVhbShjb250ZW50KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImxpbmUgMSIsIElPVXRpbHMucmVhZEZpcnN0TGluZShzdHJlYW0pKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxMaW5lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50ID0gImxpbmUgMVxubGluZSAyXG5saW5lIDMiOwotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjcmVhdGVTdHJlYW0oY29udGVudCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW5lIDFcbmxpbmUgMlxubGluZSAzXG4iLCBJT1V0aWxzLnJlYWRBbGxMaW5lcyhzdHJlYW0pKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxMaW5lc0FuZFNraXBIZWFkZXIxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAiI2hlYWRlclxuXG5saW5lIDFcbmxpbmUgMiI7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNyZWF0ZVN0cmVhbShjb250ZW50KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImxpbmUgMVxubGluZSAyXG4iLCBJT1V0aWxzLnJlYWRBbGxMaW5lc0FuZFJlbW92ZUhlYWRlcihzdHJlYW0pKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxMaW5lc0FuZFNraXBIZWFkZXIyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAiLyogaGVhZGVyIDFcbiAqIGhlYWRlciAyXG4qL1xuXG5saW5lIDFcbmxpbmUgMiI7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNyZWF0ZVN0cmVhbShjb250ZW50KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImxpbmUgMVxubGluZSAyXG4iLCBJT1V0aWxzLnJlYWRBbGxMaW5lc0FuZFJlbW92ZUhlYWRlcihzdHJlYW0pKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVDb21tZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50ID0gIiNjb21tZW50MVxuXG5saW5lIDFcbiAgIyBjb21tZW50IDJcbmxpbmUgMlxubGluZSAzIjsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY3JlYXRlU3RyZWFtKGNvbnRlbnQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygibGluZSAxXG5saW5lIDJcbmxpbmUgM1xuIiwgSU9VdGlscy5yZWFkQWxsTGluZXNBbmRJZ25vcmVDb21tZW50cyhzdHJlYW0pKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBc0xpc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29udGVudCA9ICIjY29tbWVudDFcblxubGluZSAxXG4gICMgY29tbWVudCAyXG5saW5lIDJcbmxpbmUgMyI7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNyZWF0ZVN0cmVhbShjb250ZW50KTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IElPVXRpbHMucmVhZEFsbExpbmVzQXNMaXN0KHN0cmVhbSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChsaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaW5lIDEiLCBsaXN0LmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGluZSAyIiwgbGlzdC5nZXQoMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxpbmUgMyIsIGxpc3QuZ2V0KDIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBc01hcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50ID0gIiNjb21tZW50MVxua2V5MVxuICAjIGNvbW1lbnQgMlxua2V5Mj12YWx1ZTJcbmtleTMgPSB2YWx1ZTMiOwotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBjcmVhdGVTdHJlYW0oY29udGVudCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBJT1V0aWxzLnJlYWRBbGxMaW5lc0FzTWFwKHN0cmVhbSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgbWFwLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgbWFwLmdldCgia2V5MSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCBtYXAuZ2V0KCJrZXkyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMyIsIG1hcC5nZXQoImtleTMiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBjcmVhdGVTdHJlYW0oU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShJT1V0aWxzLnRvVVRGOEJ5dGVzKGNvbnRlbnQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvTWltZUhlbHBlclRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9NaW1lSGVscGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDcxODY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9NaW1lSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRmxvcmVudCBHdWlsbGF1bWUKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwubWlzYzsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZUhlbHBlci5kZWNvZGVDb250ZW50RGlzcG9zaXRpb247Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5NaW1lSGVscGVyLmRlY29kZUNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZUhlbHBlci5lbmNvZGVDb250ZW50RGlzcG9zaXRpb247Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5NaW1lSGVscGVyLmdldEJvdW5kYXJ5RnJvbU11bHRpUGFydDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLk1pbWVIZWxwZXIuZ2V0Q2hhbGxlbmdlc0Zyb21BdXRoZW50aWNhdGVIZWFkZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5NaW1lSGVscGVyLmdldENoYXJzZXRGcm9tQ29udGVudFR5cGU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgTWltZUhlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVDb250ZW50RGlzcG9zaXRpb24oKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW5saW5lOyBmaWxlbmFtZT1mb28uYmFyIiwgZW5jb2RlQ29udGVudERpc3Bvc2l0aW9uKCJpbmxpbmUiLCAiZm9vLmJhciIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRhY2htZW50OyBmaWxlbmFtZT1mb28uYmFyIiwgZW5jb2RlQ29udGVudERpc3Bvc2l0aW9uKG51bGwsICJmb28uYmFyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImF0dGFjaG1lbnQ7IGZpbGVuYW1lKj1VVEYtOCcnY2FmJUMzJUE5LnBkZiIsIGVuY29kZUNvbnRlbnREaXNwb3NpdGlvbihudWxsLCAiY2FmXHUwMGU5LnBkZiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRhY2htZW50OyBmaWxlbmFtZSo9VVRGLTgnJyUyMCUyNyUyQSUyNSUyMGFiYyUyMCVDMiU4MSVDMiU4MiUwRCUwQSUwOSIsCi0gICAgICAgICAgICAgICAgZW5jb2RlQ29udGVudERpc3Bvc2l0aW9uKG51bGwsICIgJyolIGFiYyBcdTAwODFcdTAwODJcclxuXHQiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlQ29udGVudERpc3Bvc2l0aW9uKCkgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRhY2htZW50IiwgZGVjb2RlQ29udGVudERpc3Bvc2l0aW9uKCJhdHRhY2htZW50OyBhPWI7IGM9ZCIsIHBhcmFtcykpOwotICAgICAgICBleHBlY3RlZC5wdXQoImEiLCAiYiIpOwotICAgICAgICBleHBlY3RlZC5wdXQoImMiLCAiZCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHBhcmFtcyk7Ci0gICAgICAgIHBhcmFtcy5jbGVhcigpOwotICAgICAgICBleHBlY3RlZC5jbGVhcigpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiaW5saW5lIiwgZGVjb2RlQ29udGVudERpc3Bvc2l0aW9uKCIgIGlubGluZSA7IGEgPSBcImIgYlwiICh0aGlzIGlzIGEgY29tbWVudCkgOyBjID1kOyIsIHBhcmFtcykpOwotICAgICAgICBleHBlY3RlZC5wdXQoImEiLCAiYiBiIik7Ci0gICAgICAgIGV4cGVjdGVkLnB1dCgiYyIsICJkIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcGFyYW1zKTsKLSAgICAgICAgcGFyYW1zLmNsZWFyKCk7Ci0gICAgICAgIGV4cGVjdGVkLmNsZWFyKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmxpbmUiLAotICAgICAgICAgICAgICAgIGRlY29kZUNvbnRlbnREaXNwb3NpdGlvbigiaW5saW5lOyBtb2RpZmljYXRpb24tZGF0ZT1cIldlZCwgMTIgRmViIDE5OTcgMTY6Mjk6NTEgLTA1MDBcIiIsIHBhcmFtcykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKCJtb2RpZmljYXRpb24tZGF0ZSIsICJXZWQsIDEyIEZlYiAxOTk3IDE2OjI5OjUxIC0wNTAwIiksIHBhcmFtcyk7Ci0gICAgICAgIHBhcmFtcy5jbGVhcigpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlY29kZUNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKCkgewotICAgICAgICBhc3NlcnROdWxsKGRlY29kZUNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKCJhdHRhY2htZW50OyBhPWI7IGM9ZDsiKSk7Ci0gICAgICAgIGFzc2VydE51bGwoZGVjb2RlQ29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUoImlubGluZSIpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChkZWNvZGVDb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSgiaW5saW5lOyBtb2RpZmljYXRpb24tZGF0ZT1cIldlZCwgMTIgRmViIDE5OTcgMTY6Mjk6NTEgLTA1MDBcIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28uYmFyIiwgZGVjb2RlQ29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUoImF0dGFjaG1lbnQ7IGZpbGVuYW1lPWZvby5iYXIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZm9vLmJhciIsIGRlY29kZUNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKCJhdHRhY2htZW50OyBmaWxlbmFtZSA9IFwiZm9vLmJhclwiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZvby5iYXIiLAotICAgICAgICAgICAgICAgIGRlY29kZUNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKCIgZ3Vlc3MgOyBmaWxlbmFtZSA9ICh0aGlzIGlzIHJmYzgyMiBhIGNvbW1lbnQpIFwiZm9vLmJhclwiIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNhZlx1MDBlOS5wZGYiLCBkZWNvZGVDb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSgiZm9vOyBmaWxlbmFtZSo9VVRGLTgnJ2NhZiVDMyVBOS5wZGYiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2FmXHUwMGU5LnBkZiIsIGRlY29kZUNvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lKCJiYXI7IGZpbGVuYW1lKj1JU08tODg1OS0xJydjYWYlRTkucGRmIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZsYXNrLWRvY3MucGRmIiwKLSAgICAgICAgICAgICAgICBkZWNvZGVDb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSgiYXR0YWNobWVudDsgZmlsZW5hbWUqPVVURi04JyclNjYlNmMlNjElNzMlNmIlMmQlNjQlNmYlNjMlNzMucGRmOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaXplPTg5MzA5OTsgY3JlYXRpb24tZGF0ZT1Nb24sIDEyIEF1ZyAyMDEzIDIyOjAyOjU0IC0wNzAwOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtb2RpZmljYXRpb24tZGF0ZT1Nb24sIDEyIEF1ZyAyMDEzIDIyOjAyOjU1IC0wNzAwOyIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyc2V0RnJvbUNvbnRlbnRUeXBlKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoInV0Zi04IiwgZ2V0Q2hhcnNldEZyb21Db250ZW50VHlwZSgidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInV0Zi04IiwgZ2V0Q2hhcnNldEZyb21Db250ZW50VHlwZSgidGV4dC9wbGFpbjtjaGFyc2V0PVwidXRmLThcIiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1dGYtOCIsIGdldENoYXJzZXRGcm9tQ29udGVudFR5cGUoInRleHQvcGxhaW4gIDsgIGNoYXJzZXQgICAgPSAgICBcInV0Zi04XCIgICAiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm91bmRhcnlGcm9tTXVsdGlQYXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGUgYm91bmRhcnlbXSA9ICJ0aGlzaXNhQm91bmRhcnkiLmdldEJ5dGVzKElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChnZXRCb3VuZGFyeUZyb21NdWx0aVBhcnQoIm11bHRpcGFydC9mb3JtLWRhdGEiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGJvdW5kYXJ5LCBnZXRCb3VuZGFyeUZyb21NdWx0aVBhcnQoIm11bHRpcGFydC9mb3JtLWRhdGE7Ym91bmRhcnk9IgotICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhib3VuZGFyeSwgSU9VdGlscy5JU09fODg1OV8xKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEF1dGhlbnRpY2F0ZUhlYWRlclBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGNoYWxsZW5nZXMgPSBudWxsOwotCi0gICAgICAgIGNoYWxsZW5nZXMgPSBnZXRDaGFsbGVuZ2VzRnJvbUF1dGhlbnRpY2F0ZUhlYWRlcihudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChjaGFsbGVuZ2VzKTsKLQotICAgICAgICBjaGFsbGVuZ2VzID0gZ2V0Q2hhbGxlbmdlc0Zyb21BdXRoZW50aWNhdGVIZWFkZXIoIiIpOwotICAgICAgICBhc3NlcnROdWxsKGNoYWxsZW5nZXMpOwotCi0gICAgICAgIGNoYWxsZW5nZXMgPSBnZXRDaGFsbGVuZ2VzRnJvbUF1dGhlbnRpY2F0ZUhlYWRlcigiQmFzaWMiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGFsbGVuZ2VzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGFsbGVuZ2VzLmNvbnRhaW5zS2V5KCJiYXNpYyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGFsbGVuZ2VzLmdldCgiYmFzaWMiKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIGNoYWxsZW5nZXMgPSBnZXRDaGFsbGVuZ2VzRnJvbUF1dGhlbnRpY2F0ZUhlYWRlcigiQmFzaWMgcmVhbG09XCJleGFtcGxlXCIiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGFsbGVuZ2VzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGFsbGVuZ2VzLmNvbnRhaW5zS2V5KCJiYXNpYyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGFtcGxlIiwgY2hhbGxlbmdlcy5nZXQoImJhc2ljIikuZ2V0KCJyZWFsbSIpKTsKLQotICAgICAgICBjaGFsbGVuZ2VzID0gZ2V0Q2hhbGxlbmdlc0Zyb21BdXRoZW50aWNhdGVIZWFkZXIoIkJhc2ljIHJlYWxtPSBcImV4YW1wbGVcIiAiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGFsbGVuZ2VzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGFsbGVuZ2VzLmNvbnRhaW5zS2V5KCJiYXNpYyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGFtcGxlIiwgY2hhbGxlbmdlcy5nZXQoImJhc2ljIikuZ2V0KCJyZWFsbSIpKTsKLQotICAgICAgICBjaGFsbGVuZ2VzID0gZ2V0Q2hhbGxlbmdlc0Zyb21BdXRoZW50aWNhdGVIZWFkZXIoIkJhc2ljIHJlYWxtPWV4YW1wbGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGFsbGVuZ2VzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGFsbGVuZ2VzLmNvbnRhaW5zS2V5KCJiYXNpYyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGFtcGxlIiwgY2hhbGxlbmdlcy5nZXQoImJhc2ljIikuZ2V0KCJyZWFsbSIpKTsKLQotICAgICAgICBjaGFsbGVuZ2VzID0gZ2V0Q2hhbGxlbmdlc0Zyb21BdXRoZW50aWNhdGVIZWFkZXIoIkJhc2ljIHJlYWxtPVwiZXhhbXBsZVwiLGNoYXJzZXQ9XCJVVEYtOFwiIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2hhbGxlbmdlcyk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hhbGxlbmdlcy5jb250YWluc0tleSgiYmFzaWMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZXhhbXBsZSIsIGNoYWxsZW5nZXMuZ2V0KCJiYXNpYyIpLmdldCgicmVhbG0iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVVRGLTgiLCBjaGFsbGVuZ2VzLmdldCgiYmFzaWMiKS5nZXQoImNoYXJzZXQiKSk7Ci0KLSAgICAgICAgY2hhbGxlbmdlcyA9IGdldENoYWxsZW5nZXNGcm9tQXV0aGVudGljYXRlSGVhZGVyKCJCZWFyZXIgcmVhbG09XCJleGFtcGxlXCIsIGVycm9yPVwiaW52YWxpZF90b2tlblwiIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2hhbGxlbmdlcyk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hhbGxlbmdlcy5jb250YWluc0tleSgiYmVhcmVyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImV4YW1wbGUiLCBjaGFsbGVuZ2VzLmdldCgiYmVhcmVyIikuZ2V0KCJyZWFsbSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZhbGlkX3Rva2VuIiwgY2hhbGxlbmdlcy5nZXQoImJlYXJlciIpLmdldCgiZXJyb3IiKSk7Ci0KLSAgICAgICAgY2hhbGxlbmdlcyA9IGdldENoYWxsZW5nZXNGcm9tQXV0aGVudGljYXRlSGVhZGVyKCJCZWFyZXIgcmVhbG09XCJleGFtcGxlXCIsIGVycm9yPWludmFsaWRfdG9rZW4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGFsbGVuZ2VzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGFtcGxlIiwgY2hhbGxlbmdlcy5nZXQoImJlYXJlciIpLmdldCgicmVhbG0iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW52YWxpZF90b2tlbiIsIGNoYWxsZW5nZXMuZ2V0KCJiZWFyZXIiKS5nZXQoImVycm9yIikpOwotCi0gICAgICAgIGNoYWxsZW5nZXMgPSBnZXRDaGFsbGVuZ2VzRnJvbUF1dGhlbnRpY2F0ZUhlYWRlcigiQmVhcmVyIHJlYWxtPVwiZXhhbXBsZVwiLCBlcnJvcj1cImludmFsaWRfdG9rZW5cIiwgZXJyb3JfZGVzY3JpcHRpb249XCJUaGUgYWNjZXNzIHRva2VuIGV4cGlyZWRcIiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNoYWxsZW5nZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImV4YW1wbGUiLCBjaGFsbGVuZ2VzLmdldCgiYmVhcmVyIikuZ2V0KCJyZWFsbSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZhbGlkX3Rva2VuIiwgY2hhbGxlbmdlcy5nZXQoImJlYXJlciIpLmdldCgiZXJyb3IiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVGhlIGFjY2VzcyB0b2tlbiBleHBpcmVkIiwgY2hhbGxlbmdlcy5nZXQoImJlYXJlciIpLmdldCgiZXJyb3JfZGVzY3JpcHRpb24iKSk7Ci0KLSAgICAgICAgY2hhbGxlbmdlcyA9IGdldENoYWxsZW5nZXNGcm9tQXV0aGVudGljYXRlSGVhZGVyKCJCZWFyZXIgcmVhbG09XCJleGFtcGxlXCIsZXJyb3JfZGVzY3JpcHRpb249XCJJdCdzIGV4cGlyZXMsIHJlYWxseSFcIiwgZXJyb3I9XCJpbnZhbGlkX3Rva2VuXCIsIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2hhbGxlbmdlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZXhhbXBsZSIsIGNoYWxsZW5nZXMuZ2V0KCJiZWFyZXIiKS5nZXQoInJlYWxtIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludmFsaWRfdG9rZW4iLCBjaGFsbGVuZ2VzLmdldCgiYmVhcmVyIikuZ2V0KCJlcnJvciIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJJdCdzIGV4cGlyZXMsIHJlYWxseSEiLCBjaGFsbGVuZ2VzLmdldCgiYmVhcmVyIikuZ2V0KCJlcnJvcl9kZXNjcmlwdGlvbiIpKTsKLQotICAgICAgICBjaGFsbGVuZ2VzID0gZ2V0Q2hhbGxlbmdlc0Zyb21BdXRoZW50aWNhdGVIZWFkZXIoIk5ld2F1dGggcmVhbG09XCJhcHBzXCIsIHR5cGU9MSwgdGl0bGU9XCJMb2dpbiB0byBcXFwiYXBwc1xcXCJcIiwgQmFzaWMgcmVhbG09XCJzaW1wbGVcIiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNoYWxsZW5nZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFwcHMiLCBjaGFsbGVuZ2VzLmdldCgibmV3YXV0aCIpLmdldCgicmVhbG0iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMSIsIGNoYWxsZW5nZXMuZ2V0KCJuZXdhdXRoIikuZ2V0KCJ0eXBlIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxvZ2luIHRvIFwiYXBwc1wiIiwgY2hhbGxlbmdlcy5nZXQoIm5ld2F1dGgiKS5nZXQoInRpdGxlIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInNpbXBsZSIsIGNoYWxsZW5nZXMuZ2V0KCJiYXNpYyIpLmdldCgicmVhbG0iKSk7Ci0KLSAgICAgICAgY2hhbGxlbmdlcyA9IGdldENoYWxsZW5nZXNGcm9tQXV0aGVudGljYXRlSGVhZGVyKCJhMSwgYTIgLGEzICxhNCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNoYWxsZW5nZXMpOwotICAgICAgICBhc3NlcnRUcnVlKGNoYWxsZW5nZXMuY29udGFpbnNLZXkoImExIikpOwotICAgICAgICBhc3NlcnRUcnVlKGNoYWxsZW5nZXMuY29udGFpbnNLZXkoImEyIikpOwotICAgICAgICBhc3NlcnRUcnVlKGNoYWxsZW5nZXMuY29udGFpbnNLZXkoImEzIikpOwotICAgICAgICBhc3NlcnRUcnVlKGNoYWxsZW5nZXMuY29udGFpbnNLZXkoImE0IikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvbWlzYy9NaXNjVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9taXNjL01pc2NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MzE3NDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9taXNjL01pc2NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBGbG9yaWFuIE11ZWxsZXIKLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwubWlzYzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFRlc3RzIG1pc2NlbGxhbmVvdXMgZGV0YWlscy4KLSAqLwotcHVibGljIGNsYXNzIE1pc2NUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXJsQnVpbGRlcigpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0IiwgKG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vaG9zdC90ZXN0IikpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9ob3N0L3Rlc3Q/cXVlcnk9dmFsdWUiLCAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9ob3N0L3Rlc3Q/cXVlcnk9dmFsdWUiKSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2hvc3QvdGVzdCIsIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2hvc3QvdGVzdD8iKSkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXJsQnVpbGRlckFkZFBhcmFtZXRlcigpIHsKLSAgICAgICAgVXJsQnVpbGRlciB1cmxCdWlsZGVyOwotCi0gICAgICAgIHVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigiaHR0cDovL2hvc3QvdGVzdCIpOwotICAgICAgICB1cmxCdWlsZGVyLmFkZFBhcmFtZXRlcigicXVlcnkiLCAidmFsdWUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0P3F1ZXJ5PXZhbHVlIiwgdXJsQnVpbGRlci50b1N0cmluZygpKTsKLQotICAgICAgICB1cmxCdWlsZGVyID0gbmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9ob3N0L3Rlc3Q/Zm9vPWJhciIpOwotICAgICAgICB1cmxCdWlsZGVyLmFkZFBhcmFtZXRlcigicXVlcnkiLCAidmFsdWUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0P2Zvbz1iYXImcXVlcnk9dmFsdWUiLCB1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIHNwZWNpYWwgY2hhcnMsIHNwYWNlIHR1cm5zIGludG8gcGx1cwotICAgICAgICB1cmxCdWlsZGVyID0gbmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9ob3N0L3Rlc3QiKTsKLSAgICAgICAgdXJsQnVpbGRlci5hZGRQYXJhbWV0ZXIoInF1ZXJ5IiwgImNhZlx1MDBlOSBjclx1MDBlOG1lIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2hvc3QvdGVzdD9xdWVyeT1jYWYlQzMlQTkrY3IlQzMlQThtZSIsIHVybEJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXJsQnVpbGRlckFkZFBhdGgoKSB7Ci0gICAgICAgIFVybEJ1aWxkZXIgdXJsQnVpbGRlcjsKLQotICAgICAgICB1cmxCdWlsZGVyID0gbmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9ob3N0L3Rlc3QiKTsKLSAgICAgICAgdXJsQnVpbGRlci5hZGRQYXJhbWV0ZXIoInF1ZXJ5IiwgInZhbHVlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2hvc3QvdGVzdD9xdWVyeT12YWx1ZSIsIHVybEJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgdXJsQnVpbGRlciA9IG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vaG9zdC90ZXN0Iik7Ci0gICAgICAgIHVybEJ1aWxkZXIuYWRkUGF0aCgicGF0aCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9ob3N0L3Rlc3QvcGF0aCIsIHVybEJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgdXJsQnVpbGRlciA9IG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vaG9zdC90ZXN0LyIpOwotICAgICAgICB1cmxCdWlsZGVyLmFkZFBhdGgoInBhdGgiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0L3BhdGgiLCB1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigiaHR0cDovL2hvc3QvdGVzdCIpOwotICAgICAgICB1cmxCdWlsZGVyLmFkZFBhdGgoIi9wYXRoIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2hvc3QvdGVzdC9wYXRoIiwgdXJsQnVpbGRlci50b1N0cmluZygpKTsKLQotICAgICAgICB1cmxCdWlsZGVyID0gbmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9ob3N0L3Rlc3QvIik7Ci0gICAgICAgIHVybEJ1aWxkZXIuYWRkUGF0aCgiL3BhdGgiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0L3BhdGgiLCB1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIG11bHRpLXNlZ21lbnQgcGF0aCB3aXRoIHNwZWNpYWwgY2hhcnMsIHNwYWNlIHR1cm5zIGludG8gJTIwCi0gICAgICAgIHVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigiaHR0cDovL2hvc3QvdGVzdC8iKTsKLSAgICAgICAgdXJsQnVpbGRlci5hZGRQYXRoKCJwYXRoL2NhZlx1MDBlOSBkQGQiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0L3BhdGgvY2FmJUMzJUE5JTIwZCU0MGQiLCB1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFVybEJ1aWxkZXJBZGRQYXRoU2VnbWVudCgpIHsKLSAgICAgICAgVXJsQnVpbGRlciB1cmxCdWlsZGVyOwotCi0gICAgICAgIHVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigiaHR0cDovL2hvc3QvdGVzdCIpOwotICAgICAgICB1cmxCdWlsZGVyLmFkZFBhcmFtZXRlcigicXVlcnkiLCAidmFsdWUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0P3F1ZXJ5PXZhbHVlIiwgdXJsQnVpbGRlci50b1N0cmluZygpKTsKLQotICAgICAgICB1cmxCdWlsZGVyID0gbmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9ob3N0L3Rlc3QiKTsKLSAgICAgICAgdXJsQnVpbGRlci5hZGRQYXRoU2VnbWVudCgicGF0aCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9ob3N0L3Rlc3QvcGF0aCIsIHVybEJ1aWxkZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgdXJsQnVpbGRlciA9IG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vaG9zdC90ZXN0LyIpOwotICAgICAgICB1cmxCdWlsZGVyLmFkZFBhdGhTZWdtZW50KCJwYXRoIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2hvc3QvdGVzdC9wYXRoIiwgdXJsQnVpbGRlci50b1N0cmluZygpKTsKLQotICAgICAgICB1cmxCdWlsZGVyID0gbmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9ob3N0L3Rlc3QiKTsKLSAgICAgICAgdXJsQnVpbGRlci5hZGRQYXRoU2VnbWVudCgiL3BhdGgiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0L3BhdGgiLCB1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigiaHR0cDovL2hvc3QvdGVzdC8iKTsKLSAgICAgICAgdXJsQnVpbGRlci5hZGRQYXRoU2VnbWVudCgiL3BhdGgiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vaG9zdC90ZXN0L3BhdGgiLCB1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIHdpdGggc3BlY2lhbCBjaGFycyBhbmQgc2xhc2gsIHNwYWNlIHR1cm5zIGludG8gJTIwCi0gICAgICAgIHVybEJ1aWxkZXIgPSBuZXcgVXJsQnVpbGRlcigiaHR0cDovL2hvc3QvdGVzdC8iKTsKLSAgICAgICAgdXJsQnVpbGRlci5hZGRQYXRoU2VnbWVudCgicGF0aC9jYWZcdTAwZTkgZEBkIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2hvc3QvdGVzdC9wYXRoJTJGY2FmJUMzJUE5JTIwZCU0MGQiLCB1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC9taXNjL1VybEJ1aWxkZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvVXJsQnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MTI4NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL21pc2MvVXJsQnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLm1pc2M7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5SZXR1cm5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFVybEJ1aWxkZXIgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcmxCdWlsZGVyVGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVcmxzKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbSIsIG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vZXhhbXBsZS5jb20iKS50b1N0cmluZygpKTsKLQotICAgICAgICAvLyBwYXRoCi0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgiLCAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbSIpKS5hZGRQYXRoKCJwYXRoIikudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2V4YW1wbGUuY29tL3BhdGg/cGFyYW09dmFsdWUiLCAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbSIpKS5hZGRQYXRoKCJwYXRoIikKLSAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKCJwYXJhbSIsICJ2YWx1ZSIpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoP3BhcmFtPXZhbHVlIiwKLSAgICAgICAgICAgICAgICAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbSIpKS5hZGRQYXJhbWV0ZXIoInBhcmFtIiwgInZhbHVlIikuYWRkUGF0aCgicGF0aCIpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoIiwgKG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vZXhhbXBsZS5jb20iKSkuYWRkUGF0aCgiL3BhdGgiKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aCIsIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tLyIpKS5hZGRQYXRoKCJwYXRoIikudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2V4YW1wbGUuY29tL3BhdGgiLCAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbS8iKSkuYWRkUGF0aCgiL3BhdGgiKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aDEvcGF0aDIiLAotICAgICAgICAgICAgICAgIG5ldyBVcmxCdWlsZGVyKChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tIikpLmFkZFBhdGgoInBhdGgxIikuYWRkUGF0aCgicGF0aDIiKSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2V4YW1wbGUuY29tIiwgbmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbSIpLmFkZFBhdGgoIiIpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbSIsIG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vZXhhbXBsZS5jb20iKS5hZGRQYXRoKG51bGwpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIHBhdGggc2VnbWVudHMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aDEvcGF0aDIiLCAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbSIpKS5hZGRQYXRoKCJwYXRoMS9wYXRoMiIpCi0gICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoMSUyRnBhdGgyIiwKLSAgICAgICAgICAgICAgICAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbSIpKS5hZGRQYXRoU2VnbWVudCgicGF0aDEvcGF0aDIiKS50b1N0cmluZygpKTsKLQotICAgICAgICAvLyBwYXJhbWV0ZXJzCi0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2V4YW1wbGUuY29tP3BhcmFtIiwgKG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vZXhhbXBsZS5jb20iKSkuYWRkUGFyYW1ldGVyKCJwYXJhbSIpCi0gICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbT9wYXJhbT12YWx1ZSIsCi0gICAgICAgICAgICAgICAgKG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vZXhhbXBsZS5jb20iKSkuYWRkUGFyYW1ldGVyKCJwYXJhbSIsICJ2YWx1ZSIpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbT94PXkmcGFyYW09dmFsdWUiLAotICAgICAgICAgICAgICAgIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tP3g9eSIpKS5hZGRQYXJhbWV0ZXIoInBhcmFtIiwgInZhbHVlIikudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tP3BhcmFtPWJvdGgiLAotICAgICAgICAgICAgICAgIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tIikpLmFkZFBhcmFtZXRlcigicGFyYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgVXJsQnVpbGRlci5ub3JtYWxpemVQYXJhbWV0ZXIoSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCkpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbT9wYXJhbT1sYXRlc3QiLAotICAgICAgICAgICAgICAgIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tIikpLmFkZFBhcmFtZXRlcigicGFyYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgVXJsQnVpbGRlci5ub3JtYWxpemVQYXJhbWV0ZXIoUmV0dXJuVmVyc2lvbi5MQVRFU1QpKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20iLCAobmV3IFVybEJ1aWxkZXIoImh0dHA6Ly9leGFtcGxlLmNvbSIpKS5hZGRQYXJhbWV0ZXIobnVsbCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2V4YW1wbGUuY29tIiwgKG5ldyBVcmxCdWlsZGVyKCJodHRwOi8vZXhhbXBsZS5jb20iKSkuYWRkUGFyYW1ldGVyKG51bGwsICJ2YWx1ZSIpCi0gICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbSIsIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tIikpLmFkZFBhcmFtZXRlcigicGFyYW0iLCBudWxsKQotICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20/cGFyYW09JnBhcmFtMj12YWx1ZTIiLAotICAgICAgICAgICAgICAgIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tIikpLmFkZFBhcmFtZXRlcigicGFyYW0iLCAiIikuYWRkUGFyYW1ldGVyKCJwYXJhbTIiLCAidmFsdWUyIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aD9wYXJhbT12YWx1ZSIsIChuZXcgVXJsQnVpbGRlcigiaHR0cDovL2V4YW1wbGUuY29tIikpLmFkZFBhdGgoInBhdGgiKQotICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoInBhcmFtIiwgInZhbHVlIikudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gb3RoZXIgY29uc3RydWN0b3IKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20vcGF0aD9wYXJhbT12YWx1ZSIsIChuZXcgVXJsQnVpbGRlcigiaHR0cCIsICJleGFtcGxlLmNvbSIsIDgwLCAicGF0aCIpKQotICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoInBhcmFtIiwgInZhbHVlIikudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cHM6Ly9leGFtcGxlLmNvbS9wYXRoP3BhcmFtPXZhbHVlIiwgKG5ldyBVcmxCdWlsZGVyKCJodHRwcyIsICJleGFtcGxlLmNvbSIsIDQ0MywgInBhdGgiKSkKLSAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKCJwYXJhbSIsICJ2YWx1ZSIpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbToxMjM0L3BhdGg/cGFyYW09dmFsdWUiLCAobmV3IFVybEJ1aWxkZXIoImh0dHAiLCAiZXhhbXBsZS5jb20iLCAxMjM0LCAicGF0aCIpKQotICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoInBhcmFtIiwgInZhbHVlIikudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBVcmxCdWlsZGVyKChTdHJpbmcpIG51bGwpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgVXJsQnVpbGRlcigoVXJsQnVpbGRlcikgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvQWJzdHJhY3RDb252ZXJ0ZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3htbC9BYnN0cmFjdENvbnZlcnRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyYzZlNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3htbC9BYnN0cmFjdENvbnZlcnRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnhtbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DbWlzRXh0ZW5zaW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUJvb2xlYW5JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEZWNpbWFsSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlJbXBsOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBCYXNlIHRlc3QgY2xhc3MgZm9yIGNvbnZlcnRlciB0ZXN0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udmVydGVyVGVzdCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RDb252ZXJ0ZXJUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgU0VFRCA9IDEyMzQ1Njc4OTA7Ci0KLSAgICBwcm90ZWN0ZWQgUmFuZG9tIHJuZDsKLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJuZCA9IG5ldyBSYW5kb20oU0VFRCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5RGF0YTw/PiBjcmVhdGVQcm9wZXJ0eURhdGEoUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSwgaW50IG51bVZhbHVlcykgewotICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGF0YTw/PiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAocHJvcGVydHlUeXBlKSB7Ci0gICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUJvb2xlYW5JbXBsKCk7Ci0gICAgICAgICAgICBpZiAobnVtVmFsdWVzID4gMCkgewotICAgICAgICAgICAgICAgIExpc3Q8Qm9vbGVhbj4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxCb29sZWFuPigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkltcGwpIHJlc3VsdCkuc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVRFVElNRToKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lSW1wbCgpOwotICAgICAgICAgICAgaWYgKG51bVZhbHVlcyA+IDApIHsKLSAgICAgICAgICAgICAgICBMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPigpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZChyYW5kb21EYXRlVGltZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKChQcm9wZXJ0eURhdGVUaW1lSW1wbCkgcmVzdWx0KS5zZXRWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFQ0lNQUw6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbCgpOwotICAgICAgICAgICAgaWYgKG51bVZhbHVlcyA+IDApIHsKLSAgICAgICAgICAgICAgICBMaXN0PEJpZ0RlY2ltYWw+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8QmlnRGVjaW1hbD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQocmFuZG9tRGVjaW1hbCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxJbXBsKSByZXN1bHQpLnNldFZhbHVlcyh2YWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSFRNTDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUh0bWxJbXBsKCk7Ci0gICAgICAgICAgICBpZiAobnVtVmFsdWVzID4gMCkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5SHRtbEltcGwpIHJlc3VsdCkuc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJRDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUlkSW1wbCgpOwotICAgICAgICAgICAgaWYgKG51bVZhbHVlcyA+IDApIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKChQcm9wZXJ0eUlkSW1wbCkgcmVzdWx0KS5zZXRWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlJbnRlZ2VySW1wbCgpOwotICAgICAgICAgICAgaWYgKG51bVZhbHVlcyA+IDApIHsKLSAgICAgICAgICAgICAgICBMaXN0PEJpZ0ludGVnZXI+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8QmlnSW50ZWdlcj4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQocmFuZG9tSW50ZWdlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJJbXBsKSByZXN1bHQpLnNldFZhbHVlcyh2YWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5U3RyaW5nSW1wbCgpOwotICAgICAgICAgICAgaWYgKG51bVZhbHVlcyA+IDApIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0ltcGwpIHJlc3VsdCkuc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVUkk6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlVcmlJbXBsKCk7Ci0gICAgICAgICAgICBpZiAobnVtVmFsdWVzID4gMCkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVZhbHVlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQocmFuZG9tVXJpKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAoKFByb3BlcnR5VXJpSW1wbCkgcmVzdWx0KS5zZXRWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldElkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUocmFuZG9tU3RyaW5nKCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5SWQgY3JlYXRlSWRQcm9wZXJ0eURhdGEoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgUHJvcGVydHlJZEltcGwgcmVzdWx0ID0gbmV3IFByb3BlcnR5SWRJbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldElkKGlkKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKGlkKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShpZCk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUoaWQpOwotICAgICAgICByZXN1bHQuc2V0VmFsdWUodmFsdWUpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGNyZWF0ZUV4dGVuc2lvbnMoaW50IGRlcHRoKSB7Ci0gICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0KLSAgICAgICAgU3RyaW5nW10gbmFtZXNwYWNlcyA9IG5ldyBTdHJpbmdbXSB7ICJodHRwOi8vZXh0MS5jb20iLCAiaHR0cDovL2V4dDIub3JnIiwgImh0dHA6Ly9leHQzLm5ldCIgfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmRvbUludCg0KSArIDE7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIG5zID0gbmFtZXNwYWNlc1tyYW5kb21JbnQobmFtZXNwYWNlcy5sZW5ndGgpXTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJhbmRvbUludCgzKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgYXR0ci5wdXQocmFuZG9tVGFnKCksIHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsIGVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAocmFuZG9tQm9vbGVhbigpIHx8IGRlcHRoIDwgMSkgewotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG5zLCByYW5kb21UYWcoKSwgYXR0ciwgcmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IENtaXNFeHRlbnNpb25FbGVtZW50SW1wbChucywgcmFuZG9tVGFnKCksIGF0dHIsIGNyZWF0ZUV4dGVuc2lvbnMoZGVwdGggLSAxKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGQoZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmFuZG9tU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBpbnQgbGVuZ3RoID0gcm5kLm5leHRJbnQoMjEpICsgMzsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSAocm5kLm5leHRJbnQoOTQpICsgMzIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmFuZG9tVXJpKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoInVybjp0ZXN0OiIpOwotCi0gICAgICAgIGludCBsZW5ndGggPSBybmQubmV4dEludCgyMSkgKyAzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIChybmQubmV4dEludCgyNikgKyA5NykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gcmFuZG9tQm9vbGVhbigpIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihybmQubmV4dEJvb2xlYW4oKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgcmFuZG9tSW50ZWdlcigpIHsKLSAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihybmQubmV4dEludCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQmlnRGVjaW1hbCByYW5kb21EZWNpbWFsKCkgewotICAgICAgICByZXR1cm4gQmlnRGVjaW1hbC52YWx1ZU9mKHJuZC5uZXh0RG91YmxlKCkgKiBybmQubmV4dEludCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgR3JlZ29yaWFuQ2FsZW5kYXIgcmFuZG9tRGF0ZVRpbWUoKSB7Ci0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICBjYWwuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIgKyAocm5kLm5leHRCb29sZWFuKCkgPyAiKyIgOiAiLSIpICsgKHJuZC5uZXh0SW50KDIzKSAtIDEyKSArICI6MDAiKSk7Ci0gICAgICAgIGNhbC5zZXQoMTU4MyArIHJuZC5uZXh0SW50KDg0MTYpLCBybmQubmV4dEludCgxMiksIHJuZC5uZXh0SW50KDMxKSArIDEsIHJuZC5uZXh0SW50KDIzKSwgcm5kLm5leHRJbnQoNjApLAotICAgICAgICAgICAgICAgIHJuZC5uZXh0SW50KDYwKSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDApOwotCi0gICAgICAgIHJldHVybiBjYWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCByYW5kb21JbnQoaW50IG4pIHsKLSAgICAgICAgcmV0dXJuIHJuZC5uZXh0SW50KG4pOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIEVudW08Pz4+IFQgcmFuZG9tRW51bShDbGFzczxUPiBlbnVtQ2xhc3MpIHsKLSAgICAgICAgVFtdIHZhbHVlcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSAoVFtdKSBlbnVtQ2xhc3MuZ2V0TWV0aG9kKCJ2YWx1ZXMiLCBuZXcgQ2xhc3M8Pz5bMF0pLmludm9rZShudWxsLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZXNbcm5kLm5leHRJbnQodmFsdWVzLmxlbmd0aCldOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcmFuZG9tVGFnKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBpbnQgbGVuZ3RoID0gcm5kLm5leHRJbnQoNykgKyAzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIChybmQubmV4dEludCgyNikgKyAnYScpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBkYXRhIG9iamVjdHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoU3RyaW5nIG5hbWUsIE9iamVjdCBleHBlY3RlZCwgT2JqZWN0IGFjdHVhbCwgU2V0PFN0cmluZz4gaWdub3JlTWV0aG9kcykgewotCi0gICAgICAgIExPRy5kZWJ1ZyhuYW1lICsgIjogIiArIGV4cGVjdGVkICsgIiAvICIgKyBhY3R1YWwpOwotCi0gICAgICAgIGlmICgoZXhwZWN0ZWQgPT0gbnVsbCkgJiYgKGFjdHVhbCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChleHBlY3RlZCA9PSBudWxsKSB8fCAoYWN0dWFsID09IG51bGwpKSB7Ci0gICAgICAgICAgICBmYWlsKCJEYXRhIG9iamVjdCBpcyBudWxsISBuYW1lOiAiICsgbmFtZSArICIgLyBleHBlY3RlZDogIiArIGV4cGVjdGVkICsgIiAvIGFjdHVhbDogIiArIGFjdHVhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgc2ltcGxlIHR5cGVzCi0gICAgICAgIGlmICgoZXhwZWN0ZWQgaW5zdGFuY2VvZiBTdHJpbmcpIHx8IChleHBlY3RlZCBpbnN0YW5jZW9mIEJvb2xlYW4pIHx8IChleHBlY3RlZCBpbnN0YW5jZW9mIEJpZ0ludGVnZXIpCi0gICAgICAgICAgICAgICAgfHwgKGV4cGVjdGVkIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgfHwgKGV4cGVjdGVkIGluc3RhbmNlb2YgRW51bTw/PikpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLCBleHBlY3RlZCwgYWN0dWFsKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgR3JlZ29yaWFuQ2FsZW5kYXIpIHsKLSAgICAgICAgICAgIGxvbmcgZXhwZWN0ZWRNaWxsaXMgPSAoKEdyZWdvcmlhbkNhbGVuZGFyKSBleHBlY3RlZCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0gICAgICAgICAgICBsb25nIGFjdHVhbE1pbGxpcyA9ICgoR3JlZ29yaWFuQ2FsZW5kYXIpIGFjdHVhbCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLCBleHBlY3RlZE1pbGxpcywgYWN0dWFsTWlsbGlzKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgTGlzdDw/PikgewotICAgICAgICAgICAgTGlzdDw/PiBleHBlY3RlZExpc3QgPSAoTGlzdDw/PikgZXhwZWN0ZWQ7Ci0gICAgICAgICAgICBMaXN0PD8+IGFjdHVhbExpc3QgPSAoTGlzdDw/PikgYWN0dWFsOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSArICIubGVuZ3RoIiwgZXhwZWN0ZWRMaXN0LnNpemUoKSwgYWN0dWFsTGlzdC5zaXplKCkpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKG5hbWUgKyAiWyIgKyBpICsgIl0iLCBleHBlY3RlZExpc3QuZ2V0KGkpLCBhY3R1YWxMaXN0LmdldChpKSwgaWdub3JlTWV0aG9kcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIE1hcDw/LCA/PikgewotICAgICAgICAgICAgTWFwPD8sID8+IGV4cGVjdGVkTWFwID0gKE1hcDw/LCA/PikgZXhwZWN0ZWQ7Ci0gICAgICAgICAgICBNYXA8PywgPz4gYWN0dWFsTWFwID0gKE1hcDw/LCA/PikgYWN0dWFsOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSArICIubGVuZ3RoIiwgZXhwZWN0ZWRNYXAuc2l6ZSgpLCBhY3R1YWxNYXAuc2l6ZSgpKTsKLQotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8PywgPz4gZW50cnkgOiBleHBlY3RlZE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuYW1lICsgIi5jb250YWluc1siICsgZW50cnkuZ2V0S2V5KCkgKyAiXSIsIGFjdHVhbE1hcC5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpOwotICAgICAgICAgICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKG5hbWUgKyAiWyIgKyBlbnRyeS5nZXRLZXkoKSArICJdIiwgZW50cnkuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbE1hcC5nZXQoZW50cnkuZ2V0S2V5KCkpLCBpZ25vcmVNZXRob2RzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgU2V0PD8+KSB7Ci0gICAgICAgICAgICBTZXQ8Pz4gZXhwZWN0ZWRTZXQgPSAoU2V0PD8+KSBleHBlY3RlZDsKLSAgICAgICAgICAgIFNldDw/PiBhY3R1YWxTZXQgPSAoU2V0PD8+KSBhY3R1YWw7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lICsgIi5sZW5ndGgiLCBleHBlY3RlZFNldC5zaXplKCksIGFjdHVhbFNldC5zaXplKCkpOwotCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBpdGVtIDogZXhwZWN0ZWRTZXQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG5hbWUgKyAiLmNvbnRhaW5zWyIgKyBpdGVtICsgIl0iLCBhY3R1YWxTZXQuY29udGFpbnMoaXRlbSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE1ldGhvZCBtIDogZXhwZWN0ZWQuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIGlmICghbS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZ2V0IikgJiYgIW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImlzIikgJiYgIW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInN1cHBvcnRzIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlnbm9yZU1ldGhvZHMgIT0gbnVsbCAmJiBpZ25vcmVNZXRob2RzLmNvbnRhaW5zKG0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobS5nZXROYW1lKCkuZXF1YWxzKCJnZXRDbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZXhwZWN0ZWRWYWx1ZSA9IG0uaW52b2tlKGV4cGVjdGVkLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgYWN0dWFsVmFsdWUgPSBtLmludm9rZShhY3R1YWwsIG5ldyBPYmplY3RbMF0pOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMobmFtZSArICIuIiArIG0uZ2V0TmFtZSgpLCBleHBlY3RlZFZhbHVlLCBhY3R1YWxWYWx1ZSwgaWdub3JlTWV0aG9kcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwveG1sL0Fic3RyYWN0WE1MQ29udmVydGVyVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvQWJzdHJhY3RYTUxDb252ZXJ0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2JmM2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvQWJzdHJhY3RYTUxDb252ZXJ0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC54bWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsKLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWFGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYTUxDb252ZXJ0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb252ZXJ0ZXJUZXN0IHsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFU1RfTkFNRVNQQUNFID0gImh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy90ZXN0L3NjaGVtYSI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVF9QUkVGSVggPSAidGVzdCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RYTUxDb252ZXJ0ZXJUZXN0LmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFU1RfU0NIRU1BMTAgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgotICAgICAgICAgICAgKyAiPHhzOnNjaGVtYSB4bWxuczp4cz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCIgdGFyZ2V0TmFtZXNwYWNlPVwiIgotICAgICAgICAgICAgKyBURVNUX05BTUVTUEFDRQotICAgICAgICAgICAgKyAiXCIgeG1sbnM6dGVzdD1cIiIKLSAgICAgICAgICAgICsgVEVTVF9OQU1FU1BBQ0UKLSAgICAgICAgICAgICsgIlwiIHhtbG5zOmNtaXM9XCIiCi0gICAgICAgICAgICArIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQ01JUwotICAgICAgICAgICAgKyAiXCIgdmVyc2lvbj1cIjEuMFwiPiIKLSAgICAgICAgICAgICsgIjx4czppbXBvcnQgbmFtZXNwYWNlPVwiIgotICAgICAgICAgICAgKyBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMKLSAgICAgICAgICAgICsgIlwiLz4iCi0gICAgICAgICAgICArICI8eHM6Y29tcGxleFR5cGUgbmFtZT1cInRlc3RUeXBlXCI+IgotICAgICAgICAgICAgKyAiPHhzOnNlcXVlbmNlPiIKLSAgICAgICAgICAgICsgIjx4czplbGVtZW50IG5hbWU9XCJyZXBvc2l0b3J5SW5mb1wiIHR5cGU9XCJjbWlzOmNtaXNSZXBvc2l0b3J5SW5mb1R5cGVcIiBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwiMVwiIC8+IgotICAgICAgICAgICAgKyAiPHhzOmVsZW1lbnQgbmFtZT1cInR5cGVcIiB0eXBlPVwiY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlXCIgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cIjFcIiAvPiIKLSAgICAgICAgICAgICsgIjx4czplbGVtZW50IG5hbWU9XCJvYmplY3RcIiB0eXBlPVwiY21pczpjbWlzT2JqZWN0VHlwZVwiIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCIxXCIgLz4iCi0gICAgICAgICAgICArICI8eHM6ZWxlbWVudCBuYW1lPVwicXVlcnlcIiB0eXBlPVwiY21pczpjbWlzUXVlcnlUeXBlXCIgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cIjFcIiAvPiIKLSAgICAgICAgICAgICsgIjwveHM6c2VxdWVuY2U+IiAvLwotICAgICAgICAgICAgKyAiPC94czpjb21wbGV4VHlwZT4iIC8vCi0gICAgICAgICAgICArICI8eHM6ZWxlbWVudCBuYW1lPVwidGVzdFwiIHR5cGU9XCJ0ZXN0OnRlc3RUeXBlXCIvPiIgLy8KLSAgICAgICAgICAgICsgIjwveHM6c2NoZW1hPiI7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBURVNUX1NDSEVNQTExID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIKLSAgICAgICAgICAgICsgIjx4czpzY2hlbWEgeG1sbnM6eHM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIGVsZW1lbnRGb3JtRGVmYXVsdD1cInF1YWxpZmllZFwiIHRhcmdldE5hbWVzcGFjZT1cIiIKLSAgICAgICAgICAgICsgVEVTVF9OQU1FU1BBQ0UKLSAgICAgICAgICAgICsgIlwiIHhtbG5zOnRlc3Q9XCIiCi0gICAgICAgICAgICArIFRFU1RfTkFNRVNQQUNFCi0gICAgICAgICAgICArICJcIiB4bWxuczpjbWlzPVwiIgotICAgICAgICAgICAgKyBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMKLSAgICAgICAgICAgICsgIlwiIHZlcnNpb249XCIxLjBcIj4iCi0gICAgICAgICAgICArICI8eHM6aW1wb3J0IG5hbWVzcGFjZT1cIiIKLSAgICAgICAgICAgICsgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9DTUlTCi0gICAgICAgICAgICArICJcIi8+IgotICAgICAgICAgICAgKyAiPHhzOmNvbXBsZXhUeXBlIG5hbWU9XCJ0ZXN0VHlwZVwiPiIKLSAgICAgICAgICAgICsgIjx4czpzZXF1ZW5jZT4iCi0gICAgICAgICAgICArICI8eHM6ZWxlbWVudCBuYW1lPVwicmVwb3NpdG9yeUluZm9cIiB0eXBlPVwiY21pczpjbWlzUmVwb3NpdG9yeUluZm9UeXBlXCIgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cIjFcIiAvPiIKLSAgICAgICAgICAgICsgIjx4czplbGVtZW50IG5hbWU9XCJ0eXBlXCIgdHlwZT1cImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZVwiIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCIxXCIgLz4iCi0gICAgICAgICAgICArICI8eHM6ZWxlbWVudCBuYW1lPVwib2JqZWN0XCIgdHlwZT1cImNtaXM6Y21pc09iamVjdFR5cGVcIiBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwiMVwiIC8+IgotICAgICAgICAgICAgKyAiPHhzOmVsZW1lbnQgbmFtZT1cInF1ZXJ5XCIgdHlwZT1cImNtaXM6Y21pc1F1ZXJ5VHlwZVwiIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCIxXCIgLz4iCi0gICAgICAgICAgICArICI8eHM6ZWxlbWVudCBuYW1lPVwiYnVsa1VwZGF0ZVwiIHR5cGU9XCJjbWlzOmNtaXNCdWxrVXBkYXRlVHlwZVwiIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCIxXCIgLz4iCi0gICAgICAgICAgICArICI8L3hzOnNlcXVlbmNlPiIgLy8KLSAgICAgICAgICAgICsgIjwveHM6Y29tcGxleFR5cGU+IiAvLwotICAgICAgICAgICAgKyAiPHhzOmVsZW1lbnQgbmFtZT1cInRlc3RcIiB0eXBlPVwidGVzdDp0ZXN0VHlwZVwiLz4iIC8vCi0gICAgICAgICAgICArICI8L3hzOnNjaGVtYT4iOwotCi0gICAgcHJvdGVjdGVkIFNjaGVtYSBzY2hlbWExMDsKLSAgICBwcm90ZWN0ZWQgU2NoZW1hIHNjaGVtYTExOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB1cCB0aGUgc2NoZW1hLgotICAgICAqLwotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoKTsKLQotICAgICAgICBTY2hlbWFGYWN0b3J5IHNmID0gU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLQotICAgICAgICBJbnB1dFN0cmVhbSBzY2hlbWExMHN0cmVhbSA9IEFic3RyYWN0WE1MQ29udmVydGVyVGVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvc2NoZW1hL2NtaXMxMC9DTUlTLWNvcmUueHNkIik7Ci0gICAgICAgIGlmIChzY2hlbWExMHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgY29yZTEwID0gbmV3IFN0cmVhbVNvdXJjZShzY2hlbWExMHN0cmVhbSk7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgdGVzdDEwID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oSU9VdGlscy50b1VURjhCeXRlcyhURVNUX1NDSEVNQTEwKSkpOwotICAgICAgICAgICAgc2NoZW1hMTAgPSBzZi5uZXdTY2hlbWEobmV3IFNvdXJjZVtdIHsgY29yZTEwLCB0ZXN0MTAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBzY2hlbWExMXN0cmVhbSA9IEFic3RyYWN0WE1MQ29udmVydGVyVGVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvc2NoZW1hL2NtaXMxMS9DTUlTLWNvcmUueHNkIik7Ci0gICAgICAgIGlmIChzY2hlbWExMXN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgY29yZTExID0gbmV3IFN0cmVhbVNvdXJjZShzY2hlbWExMXN0cmVhbSk7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgdGVzdDExID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oSU9VdGlscy50b1VURjhCeXRlcyhURVNUX1NDSEVNQTExKSkpOwotICAgICAgICAgICAgc2NoZW1hMTEgPSBzZi5uZXdTY2hlbWEobmV3IFNvdXJjZVtdIHsgY29yZTExLCB0ZXN0MTEgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgcm9vdCB0YWcgb2YgdGhlIHRlc3QgWE1MLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlUm9vdFRhZyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVyLnNldFByZWZpeChURVNUX1BSRUZJWCwgVEVTVF9OQU1FU1BBQ0UpOwotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoVEVTVF9OQU1FU1BBQ0UsIFRFU1RfUFJFRklYKTsKLSAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKFhNTENvbnN0YW50cy5QUkVGSVhfWFNJLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1hTSSk7Ci0gICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShYTUxDb25zdGFudHMuUFJFRklYX0NNSVMsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShURVNUX1BSRUZJWCwgVEVTVF9OQU1FU1BBQ0UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0ZXN0IFhNTCB3cml0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVdyaXRlciBjcmVhdGVXcml0ZXIoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxVdGlscy5jcmVhdGVXcml0ZXIob3V0KTsKLQotICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIHdyaXRlUm9vdFRhZyh3cml0ZXIpOwotCi0gICAgICAgIHJldHVybiB3cml0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSB0ZXN0IFhNTCB3cml0ZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2xvc2VXcml0ZXIoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwYXJzZXIgYW5kIG1vdmVzIGl0IHRvIHRoZSB0YWcgdGhhdCBzaG91bGQgYmUgdGVzdGVkLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlUGFyc2VyKGJ5dGVbXSB4bWxEb2N1bWVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBYTUxVdGlscy5jcmVhdGVQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbERvY3VtZW50KSk7Ci0gICAgICAgIG1vdmVUb1Rlc3RUYWcocGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gcGFyc2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgcGFyc2VyLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlUGFyc2VyKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBwYXJzZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNb3ZlcyB0aGUgcGFyc2VyIHRvIHRhZyB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbW92ZVRvVGVzdFRhZyhYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKFhNTFV0aWxzLmZpbmROZXh0U3RhcnRFbGVtZW5ldChwYXJzZXIpKSB7Ci0gICAgICAgICAgICBpZiAocGFyc2VyLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoInRlc3QiKSkgewotICAgICAgICAgICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICBYTUxVdGlscy5maW5kTmV4dFN0YXJ0RWxlbWVuZXQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gWE1MLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKGJ5dGVbXSB4bWxEb2N1bWVudCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0gICAgICAgIGlmIChjbWlzVmVyc2lvbiA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgaWYgKHNjaGVtYTEwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IgPSBzY2hlbWExMC5uZXdWYWxpZGF0b3IoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oIkNNSVMgMS4wIHNjaGVtYSBub3QgbG9hZGVkLiBDYW5ub3QgdmFsaWRhdGUgWE1MLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzY2hlbWExMSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdG9yID0gc2NoZW1hMTEubmV3VmFsaWRhdG9yKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJDTUlTIDEuMSBzY2hlbWEgbm90IGxvYWRlZC4gQ2Fubm90IHZhbGlkYXRlIFhNTC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sRG9jdW1lbnQpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHNvdXJjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIExPRy5lcnJvcigiU2NoZW1hIHZhbGlkYXRpb24gZmFpbGVkOlxuIiArIGZvcm1hdCh4bWxEb2N1bWVudCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmb3JtYXQoeG1sRG9jdW1lbnQpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmYWlsKCJTY2hlbWEgIiArIGNtaXNWZXJzaW9uLnZhbHVlKCkgKyAiIHZhbGlkYXRpb24gZmFpbGVkOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JtYXRzIGFuIFhNTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdChieXRlW10geG1sRG9jdW1lbnQpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB0Zi5zZXRBdHRyaWJ1dGUoImluZGVudC1udW1iZXIiLCBJbnRlZ2VyLnZhbHVlT2YoMikpOwotCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdGYubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgU3RyaW5nV3JpdGVyKCkpOwotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sRG9jdW1lbnQpKTsKLSAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0LmdldFdyaXRlcigpLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvQWNsQ29udmVydFRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwveG1sL0FjbENvbnZlcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDZlMDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvQWNsQ29udmVydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnhtbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xFbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQWNsQ29udmVydFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFhNTENvbnZlcnRlclRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWNsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IGEgZmV3IHRpbWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCBhY2wgPSBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKCk7Ci0gICAgICAgICAgICBMaXN0PEFjZT4gYWNlcyA9IG5ldyBBcnJheUxpc3Q8QWNlPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByYW5kb21JbnQoOSkgKyAxOyBqKyspIHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sRW50cnlJbXBsIGFjZSA9IG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKCk7Ci0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCByYW5kb21JbnQoNCkgKyAxOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMuYWRkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWNlLnNldFBlcm1pc3Npb25zKHBlcm1pc3Npb25zKTsKLSAgICAgICAgICAgICAgICBhY2Uuc2V0RGlyZWN0KHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICAgICAgYWNlLnNldFByaW5jaXBhbChuZXcgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsKHJhbmRvbVN0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgYWNlcy5hZGQoYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFjbC5zZXRBY2VzKGFjZXMpOwotCi0gICAgICAgICAgICBhc3NlcnRBY2wxMChhY2wsIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0QWNsMTEoYWNsLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFjbDEwKEFjbCBkYXRhLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MVXRpbHMuY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgIFhNTFV0aWxzLnN0YXJ0WG1sRG9jdW1lbnQod3JpdGVyKTsKLSAgICAgICAgWE1MQ29udmVydGVyLndyaXRlQWNsKHdyaXRlciwgQ21pc1ZlcnNpb24uQ01JU18xXzAsIHRydWUsIGRhdGEpOwotICAgICAgICBYTUxVdGlscy5lbmRYbWxEb2N1bWVudCh3cml0ZXIpOwotCi0gICAgICAgIGJ5dGVbXSB4bWwgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQotICAgICAgICBpZiAodmFsaWRhdGUpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlKHhtbCwgQ21pc1ZlcnNpb24uQ01JU18xXzApOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IFhNTFV0aWxzLmNyZWF0ZVBhcnNlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sKSk7Ci0gICAgICAgIFhNTFV0aWxzLmZpbmROZXh0U3RhcnRFbGVtZW5ldChwYXJzZXIpOwotICAgICAgICBBY2wgcmVzdWx0ID0gWE1MQ29udmVydGVyLmNvbnZlcnRBY2wocGFyc2VyKTsKLSAgICAgICAgcGFyc2VyLmNsb3NlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiQUNMIiwgZGF0YSwgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBY2wxMShBY2wgZGF0YSwgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihvdXQpOwotICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZUFjbCh3cml0ZXIsIENtaXNWZXJzaW9uLkNNSVNfMV8xLCB0cnVlLCBkYXRhKTsKLSAgICAgICAgWE1MVXRpbHMuZW5kWG1sRG9jdW1lbnQod3JpdGVyKTsKLQotICAgICAgICBieXRlW10geG1sID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSh4bWwsIENtaXNWZXJzaW9uLkNNSVNfMV8xKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBYTUxVdGlscy5jcmVhdGVQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbCkpOwotICAgICAgICBYTUxVdGlscy5maW5kTmV4dFN0YXJ0RWxlbWVuZXQocGFyc2VyKTsKLSAgICAgICAgQWNsIHJlc3VsdCA9IFhNTENvbnZlcnRlci5jb252ZXJ0QWNsKHBhcnNlcik7Ci0gICAgICAgIHBhcnNlci5jbG9zZSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIkFDTCIsIGRhdGEsIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvQWxsb3dhYmxlQWN0aW9uc0NvbnZlcnRUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3htbC9BbGxvd2FibGVBY3Rpb25zQ29udmVydFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwOTZlOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3htbC9BbGxvd2FibGVBY3Rpb25zQ29udmVydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnhtbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFsbG93YWJsZUFjdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQWxsb3dhYmxlQWN0aW9uc0NvbnZlcnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RYTUxDb252ZXJ0ZXJUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFsbG93YWJsZUFjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgQWxsb3dhYmxlQWN0aW9uc0ltcGwgYWxsb3dhYmxlQWN0aW9ucyA9IG5ldyBBbGxvd2FibGVBY3Rpb25zSW1wbCgpOwotICAgICAgICAgICAgSGFzaFNldDxBY3Rpb24+IGFjdGlvbnMgPSBuZXcgSGFzaFNldDxBY3Rpb24+KCk7Ci0gICAgICAgICAgICBmb3IgKEFjdGlvbiBhY3Rpb24gOiBBY3Rpb24udmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocmFuZG9tQm9vbGVhbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRBbGxvd2FibGVBY3Rpb25zMTAoYWxsb3dhYmxlQWN0aW9ucywgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRBbGxvd2FibGVBY3Rpb25zMTEoYWxsb3dhYmxlQWN0aW9ucywgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRBbGxvd2FibGVBY3Rpb25zMTAoQWxsb3dhYmxlQWN0aW9ucyBkYXRhLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MVXRpbHMuY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgIFhNTFV0aWxzLnN0YXJ0WG1sRG9jdW1lbnQod3JpdGVyKTsKLSAgICAgICAgWE1MQ29udmVydGVyLndyaXRlQWxsb3dhYmxlQWN0aW9ucyh3cml0ZXIsIENtaXNWZXJzaW9uLkNNSVNfMV8wLCB0cnVlLCBkYXRhKTsKLSAgICAgICAgWE1MVXRpbHMuZW5kWG1sRG9jdW1lbnQod3JpdGVyKTsKLQotICAgICAgICBieXRlW10geG1sID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSh4bWwsIENtaXNWZXJzaW9uLkNNSVNfMV8wKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBYTUxVdGlscy5jcmVhdGVQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbCkpOwotICAgICAgICBYTUxVdGlscy5maW5kTmV4dFN0YXJ0RWxlbWVuZXQocGFyc2VyKTsKLSAgICAgICAgQWxsb3dhYmxlQWN0aW9ucyByZXN1bHQgPSBYTUxDb252ZXJ0ZXIuY29udmVydEFsbG93YWJsZUFjdGlvbnMocGFyc2VyKTsKLSAgICAgICAgcGFyc2VyLmNsb3NlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiQWxsb3dhYmxlQWN0aW9ucyIsIGRhdGEsIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0QWxsb3dhYmxlQWN0aW9uczExKEFsbG93YWJsZUFjdGlvbnMgZGF0YSwgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihvdXQpOwotICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZUFsbG93YWJsZUFjdGlvbnMod3JpdGVyLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSwgdHJ1ZSwgZGF0YSk7Ci0gICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7Ci0KLSAgICAgICAgYnl0ZVtdIHhtbCA9IG91dC50b0J5dGVBcnJheSgpOwotCi0gICAgICAgIGlmICh2YWxpZGF0ZSkgewotICAgICAgICAgICAgdmFsaWRhdGUoeG1sLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gWE1MVXRpbHMuY3JlYXRlUGFyc2VyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwpKTsKLSAgICAgICAgWE1MVXRpbHMuZmluZE5leHRTdGFydEVsZW1lbmV0KHBhcnNlcik7Ci0gICAgICAgIEFsbG93YWJsZUFjdGlvbnMgcmVzdWx0ID0gWE1MQ29udmVydGVyLmNvbnZlcnRBbGxvd2FibGVBY3Rpb25zKHBhcnNlcik7Ci0gICAgICAgIHBhcnNlci5jbG9zZSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIkFsbG93YWJsZUFjdGlvbnMiLCBkYXRhLCByZXN1bHQsIG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXRFeHRlbnNpb25zKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwveG1sL0J1bGtVcGRhdGVDb252ZXJ0ZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3htbC9CdWxrVXBkYXRlQ29udmVydGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODljZTVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwveG1sL0J1bGtVcGRhdGVDb252ZXJ0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC54bWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5wYXJzZXIuSlNPTlBhcnNlcjsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIEJ1bGtVcGRhdGVDb252ZXJ0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RYTUxDb252ZXJ0ZXJUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJ1bGtVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IGEgZmV3IHRpbWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgQnVsa1VwZGF0ZUltcGwgYnVsa1VwZGF0ZSA9IG5ldyBCdWxrVXBkYXRlSW1wbCgpOwotCi0gICAgICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmFuZG9tSW50KDE5KSArIDE7IGorKykgewotICAgICAgICAgICAgICAgIEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbCBpZEFuZFRva2VuID0gbmV3IEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbVN0cmluZygpLCByYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoaWRBbmRUb2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWxrVXBkYXRlLnNldE9iamVjdElkQW5kQ2hhbmdlVG9rZW4obGlzdCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnRpZXNJbXBsIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmFuZG9tSW50KDkpICsgMTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShjcmVhdGVQcm9wZXJ0eURhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUudmFsdWVzKClbcmFuZG9tSW50KFByb3BlcnR5VHlwZS52YWx1ZXMoKS5sZW5ndGgpXSwgcmFuZG9tSW50KDIpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWxrVXBkYXRlLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhZGRTZWNUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByYW5kb21JbnQoNCkgKyAxOyBqKyspIHsKLSAgICAgICAgICAgICAgICBhZGRTZWNUeXBlcy5hZGQocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVsa1VwZGF0ZS5zZXRBZGRTZWNvbmRhcnlUeXBlSWRzKGFkZFNlY1R5cGVzKTsKLQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlbW92ZVNlY1R5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJhbmRvbUludCg0KSArIDE7IGorKykgewotICAgICAgICAgICAgICAgIHJlbW92ZVNlY1R5cGVzLmFkZChyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWxrVXBkYXRlLnNldFJlbW92ZVNlY29uZGFyeVR5cGVJZHMocmVtb3ZlU2VjVHlwZXMpOwotCi0gICAgICAgICAgICBhc3NlcnRCdWxrVXBkYXRlMTEoYnVsa1VwZGF0ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRCdWxrVXBkYXRlMTEoQnVsa1VwZGF0ZUltcGwgYnVsa1VwZGF0ZSwgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFhtbEJ1bGtVcGRhdGUxMShidWxrVXBkYXRlLCB2YWxpZGF0ZSk7Ci0gICAgICAgIGFzc2VydFdzQnVsa1VwZGF0ZTExKGJ1bGtVcGRhdGUpOwotICAgICAgICBhc3NlcnRKc29uQnVsa1VwZGF0ZTExKGJ1bGtVcGRhdGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFhtbEJ1bGtVcGRhdGUxMShCdWxrVXBkYXRlSW1wbCBidWxrVXBkYXRlLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZUJ1bGtVcGRhdGUod3JpdGVyLCBURVNUX05BTUVTUEFDRSwgYnVsa1VwZGF0ZSk7Ci0gICAgICAgIGNsb3NlV3JpdGVyKHdyaXRlcik7Ci0KLSAgICAgICAgYnl0ZVtdIHhtbCA9IG91dC50b0J5dGVBcnJheSgpOwotCi0gICAgICAgIGlmICh2YWxpZGF0ZSkgewotICAgICAgICAgICAgdmFsaWRhdGUoeG1sLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gY3JlYXRlUGFyc2VyKHhtbCk7Ci0gICAgICAgIEJ1bGtVcGRhdGVJbXBsIHJlc3VsdCA9IFhNTENvbnZlcnRlci5jb252ZXJ0QnVsa1VwZGF0ZShwYXJzZXIpOwotICAgICAgICBjbG9zZVBhcnNlcihwYXJzZXIpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIkJ1bGtVcGRhdGUiLCBidWxrVXBkYXRlLCByZXN1bHQsIG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXRFeHRlbnNpb25zKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFdzQnVsa1VwZGF0ZTExKEJ1bGtVcGRhdGVJbXBsIGJ1bGtVcGRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbWlzT2JqZWN0SWRBbmRDaGFuZ2VUb2tlblR5cGUgd3MgPSBXU0NvbnZlcnRlci5jb252ZXJ0KGJ1bGtVcGRhdGUuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpLmdldCgwKSk7Ci0KLSAgICAgICAgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4gcmVzdWx0ID0gV1NDb252ZXJ0ZXIuY29udmVydCh3cyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiQnVsa1VwZGF0ZSIsIGJ1bGtVcGRhdGUuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpLmdldCgwKSwgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRKc29uQnVsa1VwZGF0ZTExKEJ1bGtVcGRhdGVJbXBsIGJ1bGtVcGRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgSlNPTkNvbnZlcnRlci5jb252ZXJ0KGJ1bGtVcGRhdGUuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpLmdldCgwKSkud3JpdGVKU09OU3RyaW5nKHN3KTsKLQotICAgICAgICBPYmplY3QganNvbiA9IChuZXcgSlNPTlBhcnNlcigpKS5wYXJzZShzdy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uIGluc3RhbmNlb2YgTWFwPD8sID8+KTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuIHJlc3VsdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydEJ1bGtVcGRhdGUoKE1hcDxTdHJpbmcsIE9iamVjdD4pIGpzb24pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIkJ1bGtVcGRhdGUiLCBidWxrVXBkYXRlLmdldE9iamVjdElkQW5kQ2hhbmdlVG9rZW4oKS5nZXQoMCksIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvT2JqZWN0Q29udmVydFRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwveG1sL09iamVjdENvbnZlcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYTZiMWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvT2JqZWN0Q29udmVydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnhtbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2hhbmdlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGF0ZVRpbWVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlR5cGVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbEVudHJ5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFsbG93YWJsZUFjdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DaGFuZ2VFdmVudEluZm9EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0RGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyQ29udGFpbmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0TGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBvbGljeUlkTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZW5kaXRpb25EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RMaXN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLnBhcnNlci5KU09OUGFyc2VyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0Q29udmVydFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFhNTENvbnZlcnRlclRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0RGF0YUltcGwgZGF0YTEwID0gY3JlYXRlT2JqZWN0RGF0YSh0cnVlLCBDbWlzVmVyc2lvbi5DTUlTXzFfMCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRPYmplY3REYXRhMTAoZGF0YTEwLCB0cnVlKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YUltcGwgZGF0YTExID0gY3JlYXRlT2JqZWN0RGF0YSh0cnVlLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRPYmplY3REYXRhMTEoZGF0YTExLCB0cnVlKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YUltcGwgZGF0YTExaiA9IGNyZWF0ZU9iamVjdERhdGEodHJ1ZSwgQ21pc1ZlcnNpb24uQ01JU18xXzEsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIGFzc2VydEpzb25PYmplY3REYXRhMTEoZGF0YTExaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdERhdGE+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxPYmplY3REYXRhPigpOwotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckRhdGE+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckRhdGE+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmFuZG9tSW50KDEwKSArIDEwOyBqKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIGRhdGEgPSBjcmVhdGVPYmplY3REYXRhKHRydWUsIENtaXNWZXJzaW9uLkNNSVNfMV8xLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgbGlzdDEuYWRkKGRhdGEpOwotCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCBkYXRhSW5Gb2xkZXIgPSBuZXcgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbChkYXRhKTsKLSAgICAgICAgICAgICAgICBkYXRhSW5Gb2xkZXIuc2V0UGF0aFNlZ21lbnQocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGxpc3QyLmFkZChkYXRhSW5Gb2xkZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RMaXN0SW1wbCBjaGlsZHJlbjEgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsKLSAgICAgICAgICAgIGNoaWxkcmVuMS5zZXRPYmplY3RzKGxpc3QxKTsKLQotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbCBjaGlsZHJlbjIgPSBuZXcgT2JqZWN0SW5Gb2xkZXJMaXN0SW1wbCgpOwotICAgICAgICAgICAgY2hpbGRyZW4yLnNldE9iamVjdHMobGlzdDIpOwotCi0gICAgICAgICAgICBpZiAocmFuZG9tQm9vbGVhbigpKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4xLnNldE51bUl0ZW1zKEJpZ0ludGVnZXIudmFsdWVPZihsaXN0MS5zaXplKCkpKTsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbjEuc2V0SGFzTW9yZUl0ZW1zKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbjIuc2V0TnVtSXRlbXMoQmlnSW50ZWdlci52YWx1ZU9mKGxpc3QyLnNpemUoKSkpOwotICAgICAgICAgICAgICAgIGNoaWxkcmVuMi5zZXRIYXNNb3JlSXRlbXMoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbjEuc2V0TnVtSXRlbXMoQmlnSW50ZWdlci52YWx1ZU9mKGxpc3QxLnNpemUoKSArIDEgKyByYW5kb21JbnQoOTkpKSk7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4xLnNldEhhc01vcmVJdGVtcyh0cnVlKTsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbjIuc2V0TnVtSXRlbXMoQmlnSW50ZWdlci52YWx1ZU9mKGxpc3QyLnNpemUoKSArIDEgKyByYW5kb21JbnQoOTkpKSk7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4yLnNldEhhc01vcmVJdGVtcyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0T2JqZWN0TGlzdChjaGlsZHJlbjEsIGNoaWxkcmVuMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZXNjZW5kYW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckNvbnRhaW5lciBjb250YWluZXIgPSBjcmVhdGVPYmplY3RJbkZvbGRlckNvbnRhaW5lcihyYW5kb21JbnQoNykgKyAyKTsKLSAgICAgICAgICAgIGFzc2VydE9iamVjdENvbnRhaW5lcihjb250YWluZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RJbkZvbGRlckNvbnRhaW5lciBjcmVhdGVPYmplY3RJbkZvbGRlckNvbnRhaW5lcihpbnQgbGV2ZWwpIHsKLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwoKTsKLQotICAgICAgICBPYmplY3RJbkZvbGRlckRhdGFJbXBsIGRhdGFJbkZvbGRlciA9IG5ldyBPYmplY3RJbkZvbGRlckRhdGFJbXBsKGNyZWF0ZU9iamVjdERhdGEodHJ1ZSwgQ21pc1ZlcnNpb24uQ01JU18xXzEsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSk7Ci0gICAgICAgIGRhdGFJbkZvbGRlci5zZXRQYXRoU2VnbWVudChyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRPYmplY3QoZGF0YUluRm9sZGVyKTsKLQotICAgICAgICBpZiAobGV2ZWwgPiAwKSB7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmRvbUludCgzKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGNyZWF0ZU9iamVjdEluRm9sZGVyQ29udGFpbmVyKGxldmVsIC0gMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQuc2V0Q2hpbGRyZW4oY2hpbGRyZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YUltcGwgY3JlYXRlT2JqZWN0RGF0YShib29sZWFuIGFkZFJlbGF0aW9uc2hpcHMsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBib29sZWFuIHdpdGhDaGFuZ2VzLAotICAgICAgICAgICAgYm9vbGVhbiB3aXRoRXh0ZW5zaW9ucykgewotICAgICAgICBPYmplY3REYXRhSW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0RGF0YUltcGwoKTsKLQotICAgICAgICAvLyBwcm9wZXJ0aWVzCi0gICAgICAgIFByb3BlcnRpZXNJbXBsIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShjcmVhdGVJZFByb3BlcnR5RGF0YShQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkoY3JlYXRlSWRQcm9wZXJ0eURhdGEoUHJvcGVydHlJZHMuT0JKRUNUX0lELCByYW5kb21TdHJpbmcoKSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZUlkUHJvcGVydHlEYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCByYW5kb21TdHJpbmcoKSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuQk9PTEVBTiwgMCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuQk9PTEVBTiwgMSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuQk9PTEVBTiwgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuREFURVRJTUUsIDApKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShjcmVhdGVQcm9wZXJ0eURhdGEoUHJvcGVydHlUeXBlLkRBVEVUSU1FLCAxKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkoY3JlYXRlUHJvcGVydHlEYXRhKFByb3BlcnR5VHlwZS5EQVRFVElNRSwgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuREVDSU1BTCwgMCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuREVDSU1BTCwgMSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuREVDSU1BTCwgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuSFRNTCwgMCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuSFRNTCwgMSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuSFRNTCwgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuSUQsIDApKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShjcmVhdGVQcm9wZXJ0eURhdGEoUHJvcGVydHlUeXBlLklELCAxKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkoY3JlYXRlUHJvcGVydHlEYXRhKFByb3BlcnR5VHlwZS5JRCwgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuSU5URUdFUiwgMCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuSU5URUdFUiwgMSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuSU5URUdFUiwgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuU1RSSU5HLCAwKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkoY3JlYXRlUHJvcGVydHlEYXRhKFByb3BlcnR5VHlwZS5TVFJJTkcsIDEpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShjcmVhdGVQcm9wZXJ0eURhdGEoUHJvcGVydHlUeXBlLlNUUklORywgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KGNyZWF0ZVByb3BlcnR5RGF0YShQcm9wZXJ0eVR5cGUuVVJJLCAwKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkoY3JlYXRlUHJvcGVydHlEYXRhKFByb3BlcnR5VHlwZS5VUkksIDEpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShjcmVhdGVQcm9wZXJ0eURhdGEoUHJvcGVydHlUeXBlLlVSSSwgcmFuZG9tSW50KDgpICsgMikpOwotICAgICAgICBpZiAod2l0aEV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0RXh0ZW5zaW9ucyhjcmVhdGVFeHRlbnNpb25zKDMpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyBhbGxvd2FibGUgYWN0aW9ucwotICAgICAgICBBbGxvd2FibGVBY3Rpb25zSW1wbCBhbGxvd2FibGVBY3Rpb25zID0gbmV3IEFsbG93YWJsZUFjdGlvbnNJbXBsKCk7Ci0gICAgICAgIFNldDxBY3Rpb24+IGFjdGlvbnMgPSBuZXcgSGFzaFNldDxBY3Rpb24+KCk7Ci0gICAgICAgIGZvciAoQWN0aW9uIGFjdGlvbiA6IEFjdGlvbi52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBBY3Rpb24uQ0FOX0NSRUFURV9JVEVNICYmIGNtaXNWZXJzaW9uID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhY3Rpb25zLmFkZChhY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIGFsbG93YWJsZUFjdGlvbnMuc2V0QWxsb3dhYmxlQWN0aW9ucyhhY3Rpb25zKTsKLSAgICAgICAgcmVzdWx0LnNldEFsbG93YWJsZUFjdGlvbnMoYWxsb3dhYmxlQWN0aW9ucyk7Ci0KLSAgICAgICAgLy8gcmVsYXRpb25zaGlwcwotICAgICAgICBpZiAoYWRkUmVsYXRpb25zaGlwcykgewotICAgICAgICAgICAgTGlzdDxPYmplY3REYXRhPiByZWxhdGlvbnNoaXBzID0gbmV3IEFycmF5TGlzdDxPYmplY3REYXRhPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kb21JbnQoNCkgKyAxOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmFkZChjcmVhdGVPYmplY3REYXRhKGZhbHNlLCBjbWlzVmVyc2lvbiwgd2l0aENoYW5nZXMsIHdpdGhFeHRlbnNpb25zKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuc2V0UmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoYW5nZSBldmVudCBpbmZvCi0gICAgICAgIGlmICh3aXRoQ2hhbmdlcykgewotICAgICAgICAgICAgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwgY2hhbmdlRXZlbnRJbmZvID0gbmV3IENoYW5nZUV2ZW50SW5mb0RhdGFJbXBsKCk7Ci0gICAgICAgICAgICBjaGFuZ2VFdmVudEluZm8uc2V0Q2hhbmdlVGltZShyYW5kb21EYXRlVGltZSgpKTsKLSAgICAgICAgICAgIGNoYW5nZUV2ZW50SW5mby5zZXRDaGFuZ2VUeXBlKHJhbmRvbUVudW0oQ2hhbmdlVHlwZS5jbGFzcykpOwotICAgICAgICAgICAgcmVzdWx0LnNldENoYW5nZUV2ZW50SW5mbyhjaGFuZ2VFdmVudEluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQUNMCi0gICAgICAgIEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCBhY2wgPSBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKCk7Ci0gICAgICAgIExpc3Q8QWNlPiBhY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZG9tSW50KDkpICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICBBY2Nlc3NDb250cm9sRW50cnlJbXBsIGFjZSA9IG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKCk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmFuZG9tSW50KDQpICsgMTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgcGVybWlzc2lvbnMuYWRkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFjZS5zZXRQZXJtaXNzaW9ucyhwZXJtaXNzaW9ucyk7Ci0gICAgICAgICAgICBhY2Uuc2V0RGlyZWN0KHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBhY2Uuc2V0UHJpbmNpcGFsKG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwocmFuZG9tU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIGFjZXMuYWRkKGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWNsLnNldEFjZXMoYWNlcyk7Ci0gICAgICAgIHJlc3VsdC5zZXRBY2woYWNsKTsKLQotICAgICAgICByZXN1bHQuc2V0SXNFeGFjdEFjbChyYW5kb21Cb29sZWFuKCkpOwotCi0gICAgICAgIC8vIHBvbGljeSBpZHMKLSAgICAgICAgTGlzdDxTdHJpbmc+IHBJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kb21JbnQoOSkgKyAxOyBpKyspIHsKLSAgICAgICAgICAgIHBJZHMuYWRkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBQb2xpY3lJZExpc3RJbXBsIHBvbGljeUxpc3QgPSBuZXcgUG9saWN5SWRMaXN0SW1wbCgpOwotICAgICAgICBwb2xpY3lMaXN0LnNldFBvbGljeUlkcyhwSWRzKTsKLSAgICAgICAgcmVzdWx0LnNldFBvbGljeUlkcyhwb2xpY3lMaXN0KTsKLQotICAgICAgICAvLyByZW5kaXRpb25zCi0gICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UmVuZGl0aW9uRGF0YT4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kb21JbnQoNCkgKyAxOyBpKyspIHsKLSAgICAgICAgICAgIFJlbmRpdGlvbkRhdGFJbXBsIHJlbmRpdGlvbiA9IG5ldyBSZW5kaXRpb25EYXRhSW1wbCgpOwotICAgICAgICAgICAgcmVuZGl0aW9uLnNldEtpbmQocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcmVuZGl0aW9uLnNldE1pbWVUeXBlKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIHJlbmRpdGlvbi5zZXRSZW5kaXRpb25Eb2N1bWVudElkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIHJlbmRpdGlvbi5zZXRTdHJlYW1JZChyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZW5kaXRpb24uc2V0VGl0bGUocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcmVuZGl0aW9uLnNldEJpZ0xlbmd0aChyYW5kb21JbnRlZ2VyKCkpOwotICAgICAgICAgICAgcmVuZGl0aW9uLnNldEJpZ0hlaWdodChyYW5kb21JbnRlZ2VyKCkpOwotICAgICAgICAgICAgcmVuZGl0aW9uLnNldEJpZ1dpZHRoKHJhbmRvbUludGVnZXIoKSk7Ci0KLSAgICAgICAgICAgIHJlbmRpdGlvbnMuYWRkKHJlbmRpdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LnNldFJlbmRpdGlvbnMocmVuZGl0aW9ucyk7Ci0KLSAgICAgICAgLy8gZXh0ZW5zaW9ucwotICAgICAgICBpZiAod2l0aEV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRFeHRlbnNpb25zKGNyZWF0ZUV4dGVuc2lvbnMoNSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyAtLS0gYXNzZXJ0cyAtLS0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE9iamVjdERhdGExMChPYmplY3REYXRhIGRhdGEsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRYbWxPYmplY3REYXRhMTAoZGF0YSwgdmFsaWRhdGUpOwotICAgICAgICBhc3NlcnRXc09iamVjdERhdGExMChkYXRhKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRYbWxPYmplY3REYXRhMTAoT2JqZWN0RGF0YSBkYXRhLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZU9iamVjdCh3cml0ZXIsIENtaXNWZXJzaW9uLkNNSVNfMV8wLCBURVNUX05BTUVTUEFDRSwgZGF0YSk7Ci0gICAgICAgIGNsb3NlV3JpdGVyKHdyaXRlcik7Ci0KLSAgICAgICAgYnl0ZVtdIHhtbCA9IG91dC50b0J5dGVBcnJheSgpOwotCi0gICAgICAgIGlmICh2YWxpZGF0ZSkgewotICAgICAgICAgICAgdmFsaWRhdGUoeG1sLCBDbWlzVmVyc2lvbi5DTUlTXzFfMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gY3JlYXRlUGFyc2VyKHhtbCk7Ci0gICAgICAgIE9iamVjdERhdGEgcmVzdWx0ID0gWE1MQ29udmVydGVyLmNvbnZlcnRPYmplY3QocGFyc2VyKTsKLSAgICAgICAgY2xvc2VQYXJzZXIocGFyc2VyKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJPYmplY3REYXRhIiwgZGF0YSwgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRXc09iamVjdERhdGExMChPYmplY3REYXRhIGRhdGEpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbWlzT2JqZWN0VHlwZSB3cyA9IFdTQ29udmVydGVyLmNvbnZlcnQoZGF0YSwgQ21pc1ZlcnNpb24uQ01JU18xXzApOwotCi0gICAgICAgIE9iamVjdERhdGEgcmVzdWx0ID0gV1NDb252ZXJ0ZXIuY29udmVydCh3cyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiT2JqZWN0RGF0YSIsIGRhdGEsIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0T2JqZWN0RGF0YTExKE9iamVjdERhdGEgZGF0YSwgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFhtbE9iamVjdERhdGExMShkYXRhLCB2YWxpZGF0ZSk7Ci0gICAgICAgIGFzc2VydFdzT2JqZWN0RGF0YTExKGRhdGEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFhtbE9iamVjdERhdGExMShPYmplY3REYXRhIGRhdGEsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBjcmVhdGVXcml0ZXIob3V0KTsKLSAgICAgICAgWE1MQ29udmVydGVyLndyaXRlT2JqZWN0KHdyaXRlciwgQ21pc1ZlcnNpb24uQ01JU18xXzEsIFRFU1RfTkFNRVNQQUNFLCBkYXRhKTsKLSAgICAgICAgY2xvc2VXcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBieXRlW10geG1sID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSh4bWwsIENtaXNWZXJzaW9uLkNNSVNfMV8xKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBjcmVhdGVQYXJzZXIoeG1sKTsKLSAgICAgICAgT2JqZWN0RGF0YSByZXN1bHQgPSBYTUxDb252ZXJ0ZXIuY29udmVydE9iamVjdChwYXJzZXIpOwotICAgICAgICBjbG9zZVBhcnNlcihwYXJzZXIpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIk9iamVjdERhdGEiLCBkYXRhLCByZXN1bHQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRFeHRlbnNpb25zKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFdzT2JqZWN0RGF0YTExKE9iamVjdERhdGEgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNPYmplY3RUeXBlIHdzID0gV1NDb252ZXJ0ZXIuY29udmVydChkYXRhLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSByZXN1bHQgPSBXU0NvbnZlcnRlci5jb252ZXJ0KHdzKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJPYmplY3REYXRhIiwgZGF0YSwgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRKc29uT2JqZWN0RGF0YTExKE9iamVjdERhdGEgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBudWxsOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQoZGF0YSwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5DSEFOR0UsIGZhbHNlLAotICAgICAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0LlNJTVBMRSk7Ci0gICAgICAgIGpzb25PYmplY3Qud3JpdGVKU09OU3RyaW5nKHN3KTsKLQotICAgICAgICAvLyB0ZXN0IHRvSlNPTlN0cmluZygpCi0gICAgICAgIGFzc2VydEVxdWFscyhzdy50b1N0cmluZygpLCBqc29uT2JqZWN0LnRvSlNPTlN0cmluZygpKTsKLQotICAgICAgICBPYmplY3QganNvbiA9IChuZXcgSlNPTlBhcnNlcigpKS5wYXJzZShzdy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uIGluc3RhbmNlb2YgTWFwPD8sID8+KTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIE9iamVjdERhdGEgcmVzdWx0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uLCB0eXBlQ2FjaGUpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIk9iamVjdERhdGEiLCBkYXRhLCByZXN1bHQsIG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE9iamVjdExpc3QoT2JqZWN0TGlzdCBjaGlsZHJlbjEsIE9iamVjdEluRm9sZGVyTGlzdCBjaGlsZHJlbjIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRXc09iamVjdExpc3QoY2hpbGRyZW4xKTsKLSAgICAgICAgYXNzZXJ0SnNvbk9iamVjdExpc3QoY2hpbGRyZW4xKTsKLSAgICAgICAgYXNzZXJ0V3NPYmplY3RJbkZvbGRlckxpc3QoY2hpbGRyZW4yKTsKLSAgICAgICAgYXNzZXJ0SnNvbk9iamVjdEluRm9sZGVyTGlzdChjaGlsZHJlbjIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFdzT2JqZWN0TGlzdChPYmplY3RMaXN0IGNoaWxkcmVuKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc09iamVjdExpc3RUeXBlIHdzID0gV1NDb252ZXJ0ZXIuY29udmVydChjaGlsZHJlbiwgQ21pc1ZlcnNpb24uQ01JU18xXzEpOwotCi0gICAgICAgIE9iamVjdExpc3QgcmVzdWx0ID0gV1NDb252ZXJ0ZXIuY29udmVydCh3cyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiT2JqZWN0TGlzdCIsIGNoaWxkcmVuLCByZXN1bHQsIG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEpzb25PYmplY3RMaXN0KE9iamVjdExpc3QgY2hpbGRyZW4pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbnVsbDsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgSlNPTkNvbnZlcnRlci5jb252ZXJ0KGNoaWxkcmVuLCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLkNIQU5HRSwgZmFsc2UsIERhdGVUaW1lRm9ybWF0LlNJTVBMRSkKLSAgICAgICAgICAgICAgICAud3JpdGVKU09OU3RyaW5nKHN3KTsKLQotICAgICAgICBPYmplY3QganNvbiA9IChuZXcgSlNPTlBhcnNlcigpKS5wYXJzZShzdy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uIGluc3RhbmNlb2YgTWFwPD8sID8+KTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIE9iamVjdExpc3QgcmVzdWx0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0T2JqZWN0TGlzdCgoTWFwPFN0cmluZywgT2JqZWN0PikganNvbiwgdHlwZUNhY2hlLCBmYWxzZSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiT2JqZWN0TGlzdCIsIGNoaWxkcmVuLCByZXN1bHQsIG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFdzT2JqZWN0SW5Gb2xkZXJMaXN0KE9iamVjdEluRm9sZGVyTGlzdCBjaGlsZHJlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIHdzID0gV1NDb252ZXJ0ZXIuY29udmVydChjaGlsZHJlbiwgQ21pc1ZlcnNpb24uQ01JU18xXzEpOwotCi0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCByZXN1bHQgPSBXU0NvbnZlcnRlci5jb252ZXJ0KHdzKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJPYmplY3RJbkZvbGRlckxpc3QiLCBjaGlsZHJlbiwgcmVzdWx0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRKc29uT2JqZWN0SW5Gb2xkZXJMaXN0KE9iamVjdEluRm9sZGVyTGlzdCBjaGlsZHJlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBudWxsOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICBKU09OQ29udmVydGVyLmNvbnZlcnQoY2hpbGRyZW4sIHR5cGVDYWNoZSwgZmFsc2UsIERhdGVUaW1lRm9ybWF0LlNJTVBMRSkud3JpdGVKU09OU3RyaW5nKHN3KTsKLQotICAgICAgICBPYmplY3QganNvbiA9IChuZXcgSlNPTlBhcnNlcigpKS5wYXJzZShzdy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uIGluc3RhbmNlb2YgTWFwPD8sID8+KTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCByZXN1bHQgPSBKU09OQ29udmVydGVyLmNvbnZlcnRPYmplY3RJbkZvbGRlckxpc3QoKE1hcDxTdHJpbmcsIE9iamVjdD4pIGpzb24sIHR5cGVDYWNoZSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiT2JqZWN0SW5Gb2xkZXJMaXN0IiwgY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0T2JqZWN0Q29udGFpbmVyKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIGNvbnRhaW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFdzT2JqZWN0Q29udGFpbmVyKGNvbnRhaW5lcik7Ci0gICAgICAgIGFzc2VydEpzb25PYmplY3RDb250YWluZXIoY29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRXc09iamVjdENvbnRhaW5lcihPYmplY3RJbkZvbGRlckNvbnRhaW5lciBjb250YWluZXIpIHsKLSAgICAgICAgQ21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSB3cyA9IFdTQ29udmVydGVyLmNvbnZlcnQoY29udGFpbmVyLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSk7Ci0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgcmVzdWx0ID0gV1NDb252ZXJ0ZXIuY29udmVydCh3cyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiT2JqZWN0Q29udGFpbmVyIiwgY29udGFpbmVyLCByZXN1bHQsIG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEpzb25PYmplY3RDb250YWluZXIoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0gICAgICAgIEpTT05Db252ZXJ0ZXIuY29udmVydChjb250YWluZXIsIHR5cGVDYWNoZSwgZmFsc2UsIERhdGVUaW1lRm9ybWF0LkVYVEVOREVEKS53cml0ZUpTT05TdHJpbmcoc3cpOwotCi0gICAgICAgIE9iamVjdCBqc29uID0gKG5ldyBKU09OUGFyc2VyKCkpLnBhcnNlKHN3LnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGpzb24gaW5zdGFuY2VvZiBNYXA8PywgPz4pOwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgcmVzdWx0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0RGVzY2VuZGFudCgoTWFwPFN0cmluZywgT2JqZWN0PikganNvbiwgdHlwZUNhY2hlKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJPYmplY3RDb250YWluZXIiLCBjb250YWluZXIsIHJlc3VsdCwgbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvUXVlcnlDb252ZXJ0VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvUXVlcnlDb252ZXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjU4NTcyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwveG1sL1F1ZXJ5Q29udmVydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnhtbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUXVlcnlUeXBlSW1wbDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFF1ZXJ5Q29udmVydFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFhNTENvbnZlcnRlclRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IGEgZmV3IHRpbWVzIHdpdGggZGlmZmVyZW50IHZhbHVlcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIFF1ZXJ5VHlwZUltcGwgcXVlcnkgPSBuZXcgUXVlcnlUeXBlSW1wbCgpOwotCi0gICAgICAgICAgICBxdWVyeS5zZXRTdGF0ZW1lbnQocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcXVlcnkuc2V0U2VhcmNoQWxsVmVyc2lvbnMocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIHF1ZXJ5LnNldEluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBxdWVyeS5zZXRJbmNsdWRlUmVsYXRpb25zaGlwcyhyYW5kb21FbnVtKEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzKSk7Ci0gICAgICAgICAgICBxdWVyeS5zZXRSZW5kaXRpb25GaWx0ZXIocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcXVlcnkuc2V0TWF4SXRlbXMocmFuZG9tSW50ZWdlcigpKTsKLSAgICAgICAgICAgIHF1ZXJ5LnNldFNraXBDb3VudChyYW5kb21JbnRlZ2VyKCkpOwotCi0gICAgICAgICAgICBhc3NlcnRRdWVyeVR5cGUxMChxdWVyeSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRRdWVyeVR5cGUxMShxdWVyeSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFF1ZXJ5VHlwZTEwKFF1ZXJ5VHlwZUltcGwgZGF0YSwgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihvdXQpOwotICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZVF1ZXJ5KHdyaXRlciwgQ21pc1ZlcnNpb24uQ01JU18xXzAsIGRhdGEpOwotICAgICAgICBYTUxVdGlscy5lbmRYbWxEb2N1bWVudCh3cml0ZXIpOwotCi0gICAgICAgIGJ5dGVbXSB4bWwgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQotICAgICAgICBpZiAodmFsaWRhdGUpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlKHhtbCwgQ21pc1ZlcnNpb24uQ01JU18xXzApOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IFhNTFV0aWxzLmNyZWF0ZVBhcnNlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sKSk7Ci0gICAgICAgIFhNTFV0aWxzLmZpbmROZXh0U3RhcnRFbGVtZW5ldChwYXJzZXIpOwotICAgICAgICBRdWVyeVR5cGVJbXBsIHJlc3VsdCA9IFhNTENvbnZlcnRlci5jb252ZXJ0UXVlcnkocGFyc2VyKTsKLSAgICAgICAgcGFyc2VyLmNsb3NlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiUXVlcnlUeXBlIiwgZGF0YSwgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRRdWVyeVR5cGUxMShRdWVyeVR5cGVJbXBsIGRhdGEsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxVdGlscy5jcmVhdGVXcml0ZXIob3V0KTsKLSAgICAgICAgWE1MVXRpbHMuc3RhcnRYbWxEb2N1bWVudCh3cml0ZXIpOwotICAgICAgICBYTUxDb252ZXJ0ZXIud3JpdGVRdWVyeSh3cml0ZXIsIENtaXNWZXJzaW9uLkNNSVNfMV8xLCBkYXRhKTsKLSAgICAgICAgWE1MVXRpbHMuZW5kWG1sRG9jdW1lbnQod3JpdGVyKTsKLQotICAgICAgICBieXRlW10geG1sID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSh4bWwsIENtaXNWZXJzaW9uLkNNSVNfMV8xKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBYTUxVdGlscy5jcmVhdGVQYXJzZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbCkpOwotICAgICAgICBYTUxVdGlscy5maW5kTmV4dFN0YXJ0RWxlbWVuZXQocGFyc2VyKTsKLSAgICAgICAgUXVlcnlUeXBlSW1wbCByZXN1bHQgPSBYTUxDb252ZXJ0ZXIuY29udmVydFF1ZXJ5KHBhcnNlcik7Ci0gICAgICAgIHBhcnNlci5jbG9zZSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlF1ZXJ5VHlwZSIsIGRhdGEsIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvUmVwb3NpdG9yeUluZm9Db252ZXJ0ZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3htbC9SZXBvc2l0b3J5SW5mb0NvbnZlcnRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyNzQ0MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3htbC9SZXBvc2l0b3J5SW5mb0NvbnZlcnRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnhtbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5QZXJtaXNzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5QZXJtaXNzaW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q2hhbmdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlKb2luOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eU9yZGVyQnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UmVuZGl0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuU3VwcG9ydGVkUGVybWlzc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjbENhcGFiaWxpdGllc0RhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRXh0ZW5zaW9uRmVhdHVyZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5QZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5QZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNSZXBvc2l0b3J5SW5mb1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyLkpTT05QYXJzZXI7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5SW5mb0NvbnZlcnRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFhNTENvbnZlcnRlclRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gY21pczEwaWdub3JlTWV0aG9kcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBjbWlzMTBpZ25vcmVNZXRob2RzLmFkZCgiZ2V0T3JkZXJCeUNhcGFiaWxpdHkiKTsKLSAgICAgICAgY21pczEwaWdub3JlTWV0aG9kcy5hZGQoImdldENyZWF0YWJsZVByb3BlcnR5VHlwZXMiKTsKLSAgICAgICAgY21pczEwaWdub3JlTWV0aG9kcy5hZGQoImdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMiKTsKLSAgICAgICAgY21pczEwaWdub3JlTWV0aG9kcy5hZGQoImdldEV4dGVuc2lvbkZlYXR1cmVzIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeUluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgUmVwb3NpdG9yeUluZm9JbXBsIHJlcEluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFJlcG9zaXRvcnlJbmZvMTAocmVwSW5mbywgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyB2YWx1ZXMKLSAgICAgICAgICAgIHJlcEluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKCk7Ci0gICAgICAgICAgICByZXBJbmZvLnNldENoYW5nZXNJbmNvbXBsZXRlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICByZXBJbmZvLnNldENoYW5nZXNPblR5cGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQpKTsKLSAgICAgICAgICAgIHJlcEluZm8uc2V0Q21pc1ZlcnNpb25TdXBwb3J0ZWQoIjEuMCIpOwotICAgICAgICAgICAgcmVwSW5mby5zZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbihyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXBJbmZvLnNldFByaW5jaXBhbEFub255bW91cyhyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXBJbmZvLnNldFByaW5jaXBhbEFueW9uZShyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXBJbmZvLnNldFByb2R1Y3ROYW1lKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIHJlcEluZm8uc2V0UHJvZHVjdFZlcnNpb24ocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcmVwSW5mby5zZXREZXNjcmlwdGlvbihyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXBJbmZvLnNldElkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIHJlcEluZm8uc2V0TmFtZShyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXBJbmZvLnNldFJvb3RGb2xkZXIocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcmVwSW5mby5zZXRUaGluQ2xpZW50VXJpKHJhbmRvbVVyaSgpKTsKLSAgICAgICAgICAgIHJlcEluZm8uc2V0VmVuZG9yTmFtZShyYW5kb21TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsIGNhcDEgPSBuZXcgUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGwoKTsKLSAgICAgICAgICAgIGNhcDEuc2V0QWxsVmVyc2lvbnNTZWFyY2hhYmxlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBjYXAxLnNldENhcGFiaWxpdHlBY2wocmFuZG9tRW51bShDYXBhYmlsaXR5QWNsLmNsYXNzKSk7Ci0gICAgICAgICAgICBjYXAxLnNldENhcGFiaWxpdHlDaGFuZ2VzKENhcGFiaWxpdHlDaGFuZ2VzLkFMTCk7Ci0gICAgICAgICAgICBjYXAxLnNldENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyhyYW5kb21FbnVtKENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcy5jbGFzcykpOwotICAgICAgICAgICAgY2FwMS5zZXRDYXBhYmlsaXR5Sm9pbihyYW5kb21FbnVtKENhcGFiaWxpdHlKb2luLmNsYXNzKSk7Ci0gICAgICAgICAgICBjYXAxLnNldENhcGFiaWxpdHlRdWVyeShyYW5kb21FbnVtKENhcGFiaWxpdHlRdWVyeS5jbGFzcykpOwotICAgICAgICAgICAgY2FwMS5zZXRDYXBhYmlsaXR5UmVuZGl0aW9uKHJhbmRvbUVudW0oQ2FwYWJpbGl0eVJlbmRpdGlvbnMuY2xhc3MpKTsKLSAgICAgICAgICAgIGNhcDEuc2V0SXNQd2NTZWFyY2hhYmxlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBjYXAxLnNldElzUHdjVXBkYXRhYmxlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBjYXAxLnNldFN1cHBvcnRzR2V0RGVzY2VuZGFudHMocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIGNhcDEuc2V0U3VwcG9ydHNHZXRGb2xkZXJUcmVlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBjYXAxLnNldFN1cHBvcnRzTXVsdGlmaWxpbmcocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIGNhcDEuc2V0Q2FwYWJpbGl0eU9yZGVyQnkocmFuZG9tRW51bShDYXBhYmlsaXR5T3JkZXJCeS5jbGFzcykpOwotICAgICAgICAgICAgY2FwMS5zZXRTdXBwb3J0c1VuZmlsaW5nKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBjYXAxLnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKHJhbmRvbUJvb2xlYW4oKSk7Ci0KLSAgICAgICAgICAgIENyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsIGNwdCA9IG5ldyBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbCgpOwotICAgICAgICAgICAgU2V0PFByb3BlcnR5VHlwZT4gcHQgPSBuZXcgSGFzaFNldDxQcm9wZXJ0eVR5cGU+KCk7Ci0gICAgICAgICAgICBwdC5hZGQoUHJvcGVydHlUeXBlLkJPT0xFQU4pOwotICAgICAgICAgICAgcHQuYWRkKFByb3BlcnR5VHlwZS5JRCk7Ci0gICAgICAgICAgICBwdC5hZGQoUHJvcGVydHlUeXBlLklOVEVHRVIpOwotICAgICAgICAgICAgcHQuYWRkKFByb3BlcnR5VHlwZS5EQVRFVElNRSk7Ci0gICAgICAgICAgICBwdC5hZGQoUHJvcGVydHlUeXBlLkRFQ0lNQUwpOwotICAgICAgICAgICAgcHQuYWRkKFByb3BlcnR5VHlwZS5IVE1MKTsKLSAgICAgICAgICAgIHB0LmFkZChQcm9wZXJ0eVR5cGUuU1RSSU5HKTsKLSAgICAgICAgICAgIHB0LmFkZChQcm9wZXJ0eVR5cGUuVVJJKTsKLSAgICAgICAgICAgIGNwdC5zZXRDYW5DcmVhdGUocHQpOwotICAgICAgICAgICAgY2FwMS5zZXRDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKGNwdCk7Ci0KLSAgICAgICAgICAgIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgPSBuZXcgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwoKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0SWQocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0TG9jYWxOYW1lKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldExvY2FsTmFtZXNwYWNlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldERpc3BsYXlOYW1lKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldFF1ZXJ5TmFtZShyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5zZXRDYW5TZXREZXNjcmlwdGlvbihyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5zZXRDYW5TZXRDcmVhdGFibGUocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0RmlsZWFibGUocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0UXVlcnlhYmxlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldEZ1bGx0ZXh0SW5kZXhlZChyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5zZXRDYW5TZXRJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuc2V0Q2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLnNldENhblNldENvbnRyb2xsYWJsZUFjbChyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICAgICAgY2FwMS5zZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMpOwotCi0gICAgICAgICAgICByZXBJbmZvLnNldENhcGFiaWxpdGllcyhjYXAxKTsKLQotICAgICAgICAgICAgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwgYWNsMSA9IG5ldyBBY2xDYXBhYmlsaXRpZXNEYXRhSW1wbCgpOwotICAgICAgICAgICAgYWNsMS5zZXRTdXBwb3J0ZWRQZXJtaXNzaW9ucyhyYW5kb21FbnVtKFN1cHBvcnRlZFBlcm1pc3Npb25zLmNsYXNzKSk7Ci0gICAgICAgICAgICBhY2wxLnNldEFjbFByb3BhZ2F0aW9uKHJhbmRvbUVudW0oQWNsUHJvcGFnYXRpb24uY2xhc3MpKTsKLSAgICAgICAgICAgIExpc3Q8UGVybWlzc2lvbkRlZmluaXRpb24+IHBkZExpc3QgPSBuZXcgQXJyYXlMaXN0PFBlcm1pc3Npb25EZWZpbml0aW9uPigpOwotICAgICAgICAgICAgUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbCBwZGQxID0gbmV3IFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGwoKTsKLSAgICAgICAgICAgIHBkZDEuc2V0SWQocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcGRkMS5zZXREZXNjcmlwdGlvbihyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICBwZGRMaXN0LmFkZChwZGQxKTsKLSAgICAgICAgICAgIFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGwgcGRkMiA9IG5ldyBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsKCk7Ci0gICAgICAgICAgICBwZGQyLnNldElkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIHBkZDIuc2V0RGVzY3JpcHRpb24ocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgcGRkTGlzdC5hZGQocGRkMik7Ci0gICAgICAgICAgICBhY2wxLnNldFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YShwZGRMaXN0KTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFBlcm1pc3Npb25NYXBwaW5nPiBwbWQgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFBlcm1pc3Npb25NYXBwaW5nPigpOwotICAgICAgICAgICAgUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbCBwbWQxID0gbmV3IFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwoKTsKLSAgICAgICAgICAgIHBtZDEuc2V0S2V5KFBlcm1pc3Npb25NYXBwaW5nLkNBTl9DUkVBVEVfRE9DVU1FTlRfRk9MREVSKTsKLSAgICAgICAgICAgIHBtZDEuc2V0UGVybWlzc2lvbnMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyByYW5kb21TdHJpbmcoKSwgcmFuZG9tU3RyaW5nKCkgfSkpOwotICAgICAgICAgICAgcG1kLnB1dChwbWQxLmdldEtleSgpLCBwbWQxKTsKLSAgICAgICAgICAgIFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwgcG1kMiA9IG5ldyBQZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsKCk7Ci0gICAgICAgICAgICBwbWQyLnNldEtleShQZXJtaXNzaW9uTWFwcGluZy5DQU5fREVMRVRFX09CSkVDVCk7Ci0gICAgICAgICAgICBwbWQyLnNldFBlcm1pc3Npb25zKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgcmFuZG9tU3RyaW5nKCksIHJhbmRvbVN0cmluZygpIH0pKTsKLSAgICAgICAgICAgIHBtZC5wdXQocG1kMi5nZXRLZXkoKSwgcG1kMik7Ci0gICAgICAgICAgICBhY2wxLnNldFBlcm1pc3Npb25NYXBwaW5nRGF0YShwbWQpOwotICAgICAgICAgICAgcmVwSW5mby5zZXRBY2xDYXBhYmlsaXRpZXMoYWNsMSk7Ci0KLSAgICAgICAgICAgIExpc3Q8RXh0ZW5zaW9uRmVhdHVyZT4gZXh0ZW5zaW9uRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEV4dGVuc2lvbkZlYXR1cmU+KCk7Ci0KLSAgICAgICAgICAgIEV4dGVuc2lvbkZlYXR1cmVJbXBsIGVmMSA9IG5ldyBFeHRlbnNpb25GZWF0dXJlSW1wbCgpOwotICAgICAgICAgICAgZWYxLnNldElkKHJhbmRvbVVyaSgpKTsKLSAgICAgICAgICAgIGVmMS5zZXRDb21tb25OYW1lKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIGVmMS5zZXREZXNjcmlwdGlvbihyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICBlZjEuc2V0VXJsKHJhbmRvbVVyaSgpKTsKLSAgICAgICAgICAgIGVmMS5zZXRWZXJzaW9uTGFiZWwocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlZmQxID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICBlZmQxLnB1dChyYW5kb21TdHJpbmcoKSwgcmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgZWZkMS5wdXQocmFuZG9tU3RyaW5nKCksIHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIGVmMS5zZXRGZWF0dXJlRGF0YShlZmQxKTsKLSAgICAgICAgICAgIGV4dGVuc2lvbkZlYXR1cmVzLmFkZChlZjEpOwotCi0gICAgICAgICAgICBFeHRlbnNpb25GZWF0dXJlSW1wbCBlZjIgPSBuZXcgRXh0ZW5zaW9uRmVhdHVyZUltcGwoKTsKLSAgICAgICAgICAgIGVmMi5zZXRJZChyYW5kb21VcmkoKSk7Ci0gICAgICAgICAgICBlZjIuc2V0Q29tbW9uTmFtZShyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICBlZjIuc2V0RGVzY3JpcHRpb24ocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICAgICAgZWYyLnNldFVybChyYW5kb21VcmkoKSk7Ci0gICAgICAgICAgICBlZjIuc2V0VmVyc2lvbkxhYmVsKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZWZkMiA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgZWZkMi5wdXQocmFuZG9tU3RyaW5nKCksIHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgICAgIGVmZDIucHV0KHJhbmRvbVN0cmluZygpLCByYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgICAgICBlZjIuc2V0RmVhdHVyZURhdGEoZWZkMik7Ci0gICAgICAgICAgICBleHRlbnNpb25GZWF0dXJlcy5hZGQoZWYyKTsKLQotICAgICAgICAgICAgcmVwSW5mby5zZXRFeHRlbnNpb25GZWF0dXJlKGV4dGVuc2lvbkZlYXR1cmVzKTsKLQotICAgICAgICAgICAgYXNzZXJ0UmVwb3NpdG9yeUluZm8xMChyZXBJbmZvLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydFJlcG9zaXRvcnlJbmZvMTEocmVwSW5mbywgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRSZXBvc2l0b3J5SW5mbzEwKFJlcG9zaXRvcnlJbmZvIHJlcEluZm8sIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRYbWxSZXBvc2l0b3J5SW5mbzEwKHJlcEluZm8sIHZhbGlkYXRlKTsKLSAgICAgICAgYXNzZXJ0V3NSZXBvc2l0b3J5SW5mbzEwKHJlcEluZm8pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFhtbFJlcG9zaXRvcnlJbmZvMTAoUmVwb3NpdG9yeUluZm8gcmVwSW5mbywgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IGNyZWF0ZVdyaXRlcihvdXQpOwotICAgICAgICBYTUxDb252ZXJ0ZXIud3JpdGVSZXBvc2l0b3J5SW5mbyh3cml0ZXIsIENtaXNWZXJzaW9uLkNNSVNfMV8wLCBURVNUX05BTUVTUEFDRSwgcmVwSW5mbyk7Ci0gICAgICAgIGNsb3NlV3JpdGVyKHdyaXRlcik7Ci0KLSAgICAgICAgYnl0ZVtdIHhtbCA9IG91dC50b0J5dGVBcnJheSgpOwotCi0gICAgICAgIGlmICh2YWxpZGF0ZSkgewotICAgICAgICAgICAgdmFsaWRhdGUoeG1sLCBDbWlzVmVyc2lvbi5DTUlTXzFfMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gY3JlYXRlUGFyc2VyKHhtbCk7Ci0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlc3VsdCA9IFhNTENvbnZlcnRlci5jb252ZXJ0UmVwb3NpdG9yeUluZm8ocGFyc2VyKTsKLSAgICAgICAgY2xvc2VQYXJzZXIocGFyc2VyKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJSZXBvc2l0b3J5SW5mbyIsIHJlcEluZm8sIHJlc3VsdCwgY21pczEwaWdub3JlTWV0aG9kcyk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0V3NSZXBvc2l0b3J5SW5mbzEwKFJlcG9zaXRvcnlJbmZvIHJlcEluZm8pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbWlzUmVwb3NpdG9yeUluZm9UeXBlIHdzID0gV1NDb252ZXJ0ZXIuY29udmVydChyZXBJbmZvLCBDbWlzVmVyc2lvbi5DTUlTXzFfMCk7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVzdWx0ID0gV1NDb252ZXJ0ZXIuY29udmVydCh3cyk7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIENNSVMgMS4xIGZlYXR1cmVzCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvSW1wbCByZXBJbmZvMiA9IG5ldyBSZXBvc2l0b3J5SW5mb0ltcGwocmVwSW5mbyk7Ci0gICAgICAgIHJlcEluZm8yLnNldEV4dGVuc2lvbkZlYXR1cmUobnVsbCk7Ci0gICAgICAgIGlmIChyZXBJbmZvLmdldENhcGFiaWxpdGllcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsIGNhcGFiaWxpdGllcyA9IG5ldyBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbChyZXBJbmZvLmdldENhcGFiaWxpdGllcygpKTsKLSAgICAgICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5T3JkZXJCeShudWxsKTsKLSAgICAgICAgICAgIGNhcGFiaWxpdGllcy5zZXRDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKG51bGwpOwotICAgICAgICAgICAgY2FwYWJpbGl0aWVzLnNldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMobnVsbCk7Ci0gICAgICAgICAgICByZXBJbmZvMi5zZXRDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlJlcG9zaXRvcnlJbmZvIiwgcmVwSW5mbzIsIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVwb3NpdG9yeUluZm8xMShSZXBvc2l0b3J5SW5mbyByZXBJbmZvLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0WG1sUmVwb3NpdG9yeUluZm8xMShyZXBJbmZvLCB2YWxpZGF0ZSk7Ci0gICAgICAgIGFzc2VydFdzUmVwb3NpdG9yeUluZm8xMShyZXBJbmZvKTsKLSAgICAgICAgYXNzZXJ0SnNvblJlcG9zaXRvcnlJbmZvMTEocmVwSW5mbyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0WG1sUmVwb3NpdG9yeUluZm8xMShSZXBvc2l0b3J5SW5mbyByZXBJbmZvLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZVJlcG9zaXRvcnlJbmZvKHdyaXRlciwgQ21pc1ZlcnNpb24uQ01JU18xXzEsIFRFU1RfTkFNRVNQQUNFLCByZXBJbmZvKTsKLSAgICAgICAgY2xvc2VXcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBieXRlW10geG1sID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSh4bWwsIENtaXNWZXJzaW9uLkNNSVNfMV8xKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBjcmVhdGVQYXJzZXIoeG1sKTsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVzdWx0ID0gWE1MQ29udmVydGVyLmNvbnZlcnRSZXBvc2l0b3J5SW5mbyhwYXJzZXIpOwotICAgICAgICBjbG9zZVBhcnNlcihwYXJzZXIpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlJlcG9zaXRvcnlJbmZvIiwgcmVwSW5mbywgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRXc1JlcG9zaXRvcnlJbmZvMTEoUmVwb3NpdG9yeUluZm8gcmVwSW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNSZXBvc2l0b3J5SW5mb1R5cGUgd3MgPSBXU0NvbnZlcnRlci5jb252ZXJ0KHJlcEluZm8sIENtaXNWZXJzaW9uLkNNSVNfMV8xKTsKLQotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXN1bHQgPSBXU0NvbnZlcnRlci5jb252ZXJ0KHdzKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJSZXBvc2l0b3J5SW5mbyIsIHJlcEluZm8sIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SnNvblJlcG9zaXRvcnlJbmZvMTEoUmVwb3NpdG9yeUluZm8gcmVwSW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICBKU09OQ29udmVydGVyLmNvbnZlcnQocmVwSW5mbywgbnVsbCwgbnVsbCwgZmFsc2UpLndyaXRlSlNPTlN0cmluZyhzdyk7Ci0KLSAgICAgICAgT2JqZWN0IGpzb24gPSAobmV3IEpTT05QYXJzZXIoKSkucGFyc2Uoc3cudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoanNvbiBpbnN0YW5jZW9mIE1hcDw/LCA/Pik7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXN1bHQgPSBKU09OQ29udmVydGVyLmNvbnZlcnRSZXBvc2l0b3J5SW5mbygoTWFwPFN0cmluZywgT2JqZWN0PikganNvbik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiUmVwb3NpdG9yeUluZm8iLCByZXBJbmZvLCByZXN1bHQsIG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXRFeHRlbnNpb25zKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwveG1sL1R5cGVEZWZpbml0aW9uQ29udmVydGVyVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvVHlwZURlZmluaXRpb25Db252ZXJ0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2YwMWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NvbW1vbnMvaW1wbC94bWwvVHlwZURlZmluaXRpb25Db252ZXJ0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC54bWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ29udGVudFN0cmVhbUFsbG93ZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRlY2ltYWxQcmVjaXNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DaG9pY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRm9sZGVyVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5JdGVtVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5TZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZURlZmluaXRpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZU11dGFiaWxpdHlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNUeXBlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNUeXBlRGVmaW5pdGlvbkxpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNUeXBlRGVmaW5pdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyLkpTT05QYXJzZXI7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlRGVmaW5pdGlvbkNvbnZlcnRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFhNTENvbnZlcnRlclRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gY21pczEwaWdub3JlTWV0aG9kcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBjbWlzMTBpZ25vcmVNZXRob2RzLmFkZCgiZ2V0VHlwZU11dGFiaWxpdHkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REb2N1bWVudFR5cGVEZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBhIGZldyB0aW1lcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsIHR5cGVEZWYgPSBuZXcgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGZpbGxUeXBlRGVmaW50aW9uKHR5cGVEZWYsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCk7Ci0gICAgICAgICAgICB0eXBlRGVmLnNldElzVmVyc2lvbmFibGUocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuc2V0Q29udGVudFN0cmVhbUFsbG93ZWQocmFuZG9tRW51bShDb250ZW50U3RyZWFtQWxsb3dlZC5jbGFzcykpOwotCi0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuQk9PTEVBTikpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkRBVEVUSU1FKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuREVDSU1BTCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkhUTUwpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5JRCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLklOVEVHRVIpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5TVFJJTkcpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5VUkkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb24xMCh0eXBlRGVmLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydFR5cGVEZWZpbml0aW9uMTEodHlwZURlZiwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb2xkZXJUeXBlRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwgdHlwZURlZiA9IG5ldyBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGZpbGxUeXBlRGVmaW50aW9uKHR5cGVEZWYsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIpOwotCi0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuQk9PTEVBTikpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkRBVEVUSU1FKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuREVDSU1BTCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkhUTUwpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5JRCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLklOVEVHRVIpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5TVFJJTkcpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5VUkkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb24xMCh0eXBlRGVmLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydFR5cGVEZWZpbml0aW9uMTEodHlwZURlZiwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwgdHlwZURlZiA9IG5ldyBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGZpbGxUeXBlRGVmaW50aW9uKHR5cGVEZWYsIEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVApOwotICAgICAgICAgICAgdHlwZURlZi5zZXRBbGxvd2VkU291cmNlVHlwZXMoQXJyYXlzLmFzTGlzdChyYW5kb21TdHJpbmcoKSwgcmFuZG9tU3RyaW5nKCksIHJhbmRvbVN0cmluZygpKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLnNldEFsbG93ZWRUYXJnZXRUeXBlcyhBcnJheXMuYXNMaXN0KHJhbmRvbVN0cmluZygpLCByYW5kb21TdHJpbmcoKSwgcmFuZG9tU3RyaW5nKCksIHJhbmRvbVN0cmluZygpKSk7Ci0KLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5CT09MRUFOKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuREFURVRJTUUpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5ERUNJTUFMKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSFRNTCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLklEKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSU5URUdFUikpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLlNUUklORykpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLlVSSSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUeXBlRGVmaW5pdGlvbjEwKHR5cGVEZWYsIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb24xMSh0eXBlRGVmLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBvbGljeVR5cGVEZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBhIGZldyB0aW1lcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIFBvbGljeVR5cGVEZWZpbml0aW9uSW1wbCB0eXBlRGVmID0gbmV3IFBvbGljeVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgZmlsbFR5cGVEZWZpbnRpb24odHlwZURlZiwgQmFzZVR5cGVJZC5DTUlTX1BPTElDWSk7Ci0KLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5CT09MRUFOKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuREFURVRJTUUpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5ERUNJTUFMKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSFRNTCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLklEKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSU5URUdFUikpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLlNUUklORykpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLlVSSSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUeXBlRGVmaW5pdGlvbjEwKHR5cGVEZWYsIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb24xMSh0eXBlRGVmLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEl0ZW1UeXBlRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBydW4gdGhlIHRlc3QgYSBmZXcgdGltZXMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBJdGVtVHlwZURlZmluaXRpb25JbXBsIHR5cGVEZWYgPSBuZXcgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgZmlsbFR5cGVEZWZpbnRpb24odHlwZURlZiwgQmFzZVR5cGVJZC5DTUlTX0lURU0pOwotCi0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuQk9PTEVBTikpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkRBVEVUSU1FKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuREVDSU1BTCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkhUTUwpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5JRCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLklOVEVHRVIpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5TVFJJTkcpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5VUkkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb24xMSh0eXBlRGVmLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlY29uZGFyeVR5cGVEZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBhIGZldyB0aW1lcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbCB0eXBlRGVmID0gbmV3IFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgZmlsbFR5cGVEZWZpbnRpb24odHlwZURlZiwgQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWSk7Ci0KLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5CT09MRUFOKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuREFURVRJTUUpKTsKLSAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5ERUNJTUFMKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSFRNTCkpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLklEKSk7Ci0gICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSU5URUdFUikpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLlNUUklORykpOwotICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLlVSSSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUeXBlRGVmaW5pdGlvbjExKHR5cGVEZWYsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZURlZmluaXRpb25MaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBhIGZldyB0aW1lcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJhbmRvbUludCg1KTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgdHlwZURlZiA9IG5ldyBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgICAgIGZpbGxUeXBlRGVmaW50aW9uKHR5cGVEZWYsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCk7Ci0gICAgICAgICAgICAgICAgdHlwZURlZi5zZXRJc1ZlcnNpb25hYmxlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICAgICAgdHlwZURlZi5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChyYW5kb21FbnVtKENvbnRlbnRTdHJlYW1BbGxvd2VkLmNsYXNzKSk7Ci0KLSAgICAgICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuQk9PTEVBTikpOwotICAgICAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5EQVRFVElNRSkpOwotICAgICAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5ERUNJTUFMKSk7Ci0gICAgICAgICAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkhUTUwpKTsKLSAgICAgICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSUQpKTsKLSAgICAgICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuSU5URUdFUikpOwotICAgICAgICAgICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5TVFJJTkcpKTsKLSAgICAgICAgICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuVVJJKSk7Ci0KLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh0eXBlRGVmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdHlwZSBkZWZpbml0aW9uIGxpc3QKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdEltcGwgdHlwZURlZkxpc3QgPSBuZXcgVHlwZURlZmluaXRpb25MaXN0SW1wbCgpOwotICAgICAgICAgICAgdHlwZURlZkxpc3Quc2V0TGlzdChsaXN0KTsKLSAgICAgICAgICAgIGlmIChyYW5kb21Cb29sZWFuKCkpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVmTGlzdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2YobGlzdC5zaXplKCkpKTsKLSAgICAgICAgICAgICAgICB0eXBlRGVmTGlzdC5zZXRIYXNNb3JlSXRlbXMoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVmTGlzdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2YobGlzdC5zaXplKCkgKyAxICsgcmFuZG9tSW50KDk5KSkpOwotICAgICAgICAgICAgICAgIHR5cGVEZWZMaXN0LnNldEhhc01vcmVJdGVtcyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb25MaXN0KHR5cGVEZWZMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFR5cGVEZWZpbml0aW9uQ29udGFpbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBhIGZldyB0aW1lcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWZDb250YWludGVyID0gY3JlYXRlVHlwZURlZmluaXRpb25Db250YWluZXIocmFuZG9tSW50KDcpICsgMik7Ci0gICAgICAgICAgICBhc3NlcnRUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcih0eXBlRGVmQ29udGFpbnRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGNyZWF0ZVR5cGVEZWZpbml0aW9uQ29udGFpbmVyKGludCBsZXZlbCkgewotICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCB0eXBlRGVmID0gbmV3IERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIGZpbGxUeXBlRGVmaW50aW9uKHR5cGVEZWYsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNWZXJzaW9uYWJsZShyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICB0eXBlRGVmLnNldENvbnRlbnRTdHJlYW1BbGxvd2VkKHJhbmRvbUVudW0oQ29udGVudFN0cmVhbUFsbG93ZWQuY2xhc3MpKTsKLQotICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuQk9PTEVBTikpOwotICAgICAgICB0eXBlRGVmLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUuREFURVRJTUUpKTsKLSAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkRFQ0lNQUwpKTsKLSAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLkhUTUwpKTsKLSAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLklEKSk7Ci0gICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5JTlRFR0VSKSk7Ci0gICAgICAgIHR5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5VHlwZS5TVFJJTkcpKTsKLSAgICAgICAgdHlwZURlZi5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlUeXBlLlVSSSkpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCByZXN1bHQgPSBuZXcgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlRGVmKTsKLQotICAgICAgICBpZiAobGV2ZWwgPiAwKSB7Ci0gICAgICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmRvbUludCgzKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGNyZWF0ZVR5cGVEZWZpbml0aW9uQ29udGFpbmVyKGxldmVsIC0gMSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQuc2V0Q2hpbGRyZW4oY2hpbGRyZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsVHlwZURlZmludGlvbihBYnN0cmFjdFR5cGVEZWZpbml0aW9uIHR5cGVEZWYsIEJhc2VUeXBlSWQgYmFzZVR5cGVJZCkgewotICAgICAgICB0eXBlRGVmLnNldEJhc2VUeXBlSWQoYmFzZVR5cGVJZCk7Ci0gICAgICAgIHR5cGVEZWYuc2V0RGVzY3JpcHRpb24ocmFuZG9tU3RyaW5nKCkpOwotICAgICAgICB0eXBlRGVmLnNldERpc3BsYXlOYW1lKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgdHlwZURlZi5zZXRJZChyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNDb250cm9sbGFibGVBY2wocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgdHlwZURlZi5zZXRJc0NvbnRyb2xsYWJsZVBvbGljeShyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICB0eXBlRGVmLnNldElzQ3JlYXRhYmxlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNGaWxlYWJsZShyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICB0eXBlRGVmLnNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNGdWxsdGV4dEluZGV4ZWQocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgdHlwZURlZi5zZXRJc1F1ZXJ5YWJsZShyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICB0eXBlRGVmLnNldExvY2FsTmFtZShyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0TG9jYWxOYW1lc3BhY2UocmFuZG9tVXJpKCkpOwotICAgICAgICB0eXBlRGVmLnNldFBhcmVudFR5cGVJZChyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0UXVlcnlOYW1lKHJhbmRvbVN0cmluZygpKTsKLQotICAgICAgICBUeXBlTXV0YWJpbGl0eUltcGwgdG0gPSBuZXcgVHlwZU11dGFiaWxpdHlJbXBsKCk7Ci0gICAgICAgIHRtLnNldENhbkNyZWF0ZShyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICB0bS5zZXRDYW5EZWxldGUocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgdG0uc2V0Q2FuVXBkYXRlKHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0VHlwZU11dGFiaWxpdHkodG0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiBjcmVhdGVQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlKSB7Ci0gICAgICAgIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5ID0gcmFuZG9tRW51bShDYXJkaW5hbGl0eS5jbGFzcyk7Ci0KLSAgICAgICAgc3dpdGNoIChwcm9wZXJ0eVR5cGUpIHsKLSAgICAgICAgY2FzZSBCT09MRUFOOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldERlZmF1bHRWYWx1ZShBcnJheXMuYXNMaXN0KHJhbmRvbUJvb2xlYW4oKSkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDaG9pY2VzKGNyZWF0ZUNob2ljZUxpc3QoQm9vbGVhbi5jbGFzcywgY2FyZGluYWxpdHkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERBVEVUSU1FOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0RGVmYXVsdFZhbHVlKEFycmF5cy5hc0xpc3QocmFuZG9tRGF0ZVRpbWUoKSkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldENob2ljZXMoY3JlYXRlQ2hvaWNlTGlzdChHcmVnb3JpYW5DYWxlbmRhci5jbGFzcywgY2FyZGluYWxpdHkpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldERhdGVUaW1lUmVzb2x1dGlvbihyYW5kb21FbnVtKERhdGVUaW1lUmVzb2x1dGlvbi5jbGFzcykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREZWZhdWx0VmFsdWUoQXJyYXlzLmFzTGlzdChyYW5kb21EZWNpbWFsKCkpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0Q2hvaWNlcyhjcmVhdGVDaG9pY2VMaXN0KEJpZ0RlY2ltYWwuY2xhc3MsIGNhcmRpbmFsaXR5KSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldE1heFZhbHVlKHJhbmRvbURlY2ltYWwoKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldE1pblZhbHVlKHJhbmRvbURlY2ltYWwoKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldFByZWNpc2lvbihyYW5kb21FbnVtKERlY2ltYWxQcmVjaXNpb24uY2xhc3MpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0RGVmYXVsdFZhbHVlKEFycmF5cy5hc0xpc3QocmFuZG9tU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0Q2hvaWNlcyhjcmVhdGVDaG9pY2VMaXN0KFN0cmluZy5jbGFzcywgY2FyZGluYWxpdHkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElEOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0RGVmYXVsdFZhbHVlKEFycmF5cy5hc0xpc3QocmFuZG9tU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlJZERlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldENob2ljZXMoY3JlYXRlQ2hvaWNlTGlzdChTdHJpbmcuY2xhc3MsIGNhcmRpbmFsaXR5KSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlRFR0VSOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldERlZmF1bHRWYWx1ZShBcnJheXMuYXNMaXN0KHJhbmRvbUludGVnZXIoKSkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDaG9pY2VzKGNyZWF0ZUNob2ljZUxpc3QoQmlnSW50ZWdlci5jbGFzcywgY2FyZGluYWxpdHkpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0TWF4VmFsdWUocmFuZG9tSW50ZWdlcigpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0TWluVmFsdWUocmFuZG9tSW50ZWdlcigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkuc2V0RGVmYXVsdFZhbHVlKEFycmF5cy5hc0xpc3QocmFuZG9tU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRDaG9pY2VzKGNyZWF0ZUNob2ljZUxpc3QoU3RyaW5nLmNsYXNzLCBjYXJkaW5hbGl0eSkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldE1heExlbmd0aChyYW5kb21JbnRlZ2VyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXREZWZhdWx0VmFsdWUoQXJyYXlzLmFzTGlzdChyYW5kb21VcmkoKSkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldENob2ljZXMoY3JlYXRlQ2hvaWNlTGlzdChTdHJpbmcuY2xhc3MsIGNhcmRpbmFsaXR5KSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldElkKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LnNldFByb3BlcnR5VHlwZShwcm9wZXJ0eVR5cGUpOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lKHJhbmRvbVN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZXNwYWNlKHJhbmRvbVVyaSgpKTsKLSAgICAgICAgcmVzdWx0LnNldENhcmRpbmFsaXR5KGNhcmRpbmFsaXR5KTsKLSAgICAgICAgcmVzdWx0LnNldFVwZGF0YWJpbGl0eShyYW5kb21FbnVtKFVwZGF0YWJpbGl0eS5jbGFzcykpOwotICAgICAgICByZXN1bHQuc2V0SXNRdWVyeWFibGUocmFuZG9tQm9vbGVhbigpKTsKLSAgICAgICAgcmVzdWx0LnNldFF1ZXJ5TmFtZShyYW5kb21TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0luaGVyaXRlZChyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICByZXN1bHQuc2V0SXNSZXF1aXJlZChyYW5kb21Cb29sZWFuKCkpOwotICAgICAgICByZXN1bHQuc2V0SXNPcmRlcmFibGUocmFuZG9tQm9vbGVhbigpKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCA8VD4gTGlzdDxDaG9pY2U8VD4+IGNyZWF0ZUNob2ljZUxpc3QoQ2xhc3M8VD4gY2xhenosIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5KSB7Ci0gICAgICAgIExpc3Q8Q2hvaWNlPFQ+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENob2ljZTxUPj4oKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhbmRvbUludCgxMCk7IGkrKykgewotICAgICAgICAgICAgQ2hvaWNlSW1wbDxUPiBjaG9pY2UgPSBuZXcgQ2hvaWNlSW1wbDxUPigpOwotICAgICAgICAgICAgY2hvaWNlLnNldERpc3BsYXlOYW1lKHJhbmRvbVN0cmluZygpKTsKLQotICAgICAgICAgICAgTGlzdDxUPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0gICAgICAgICAgICBjaG9pY2Uuc2V0VmFsdWUodmFsdWVzKTsKLQotICAgICAgICAgICAgaW50IHZhbHVlQ291bnQgPSAoY2FyZGluYWxpdHkgPT0gQ2FyZGluYWxpdHkuU0lOR0xFID8gMSA6IHJhbmRvbUludCg1KSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChjbGF6eiA9PSBCb29sZWFuLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoKFQpIHJhbmRvbUJvb2xlYW4oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgoVCkgcmFuZG9tVXJpKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gQmlnSW50ZWdlci5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKChUKSByYW5kb21JbnRlZ2VyKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gQmlnRGVjaW1hbC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKChUKSByYW5kb21EZWNpbWFsKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgoVCkgcmFuZG9tRGF0ZVRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LmFkZChjaG9pY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyAtLS0gYXNzZXJ0cyAtLS0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFR5cGVEZWZpbml0aW9uMTAoVHlwZURlZmluaXRpb24gdHlwZURlZiwgYm9vbGVhbiB2YWxpZGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFhtbFR5cGVEZWZpbml0aW9uMTAodHlwZURlZiwgdmFsaWRhdGUpOwotICAgICAgICBhc3NlcnRXc1R5cGVEZWZpbml0aW9uMTAodHlwZURlZik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0WG1sVHlwZURlZmluaXRpb24xMChUeXBlRGVmaW5pdGlvbiB0eXBlRGVmLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZVR5cGVEZWZpbml0aW9uKHdyaXRlciwgQ21pc1ZlcnNpb24uQ01JU18xXzAsIFRFU1RfTkFNRVNQQUNFLCB0eXBlRGVmKTsKLSAgICAgICAgY2xvc2VXcml0ZXIod3JpdGVyKTsKLQotICAgICAgICBieXRlW10geG1sID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgaWYgKHZhbGlkYXRlKSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZSh4bWwsIENtaXNWZXJzaW9uLkNNSVNfMV8wKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPSBjcmVhdGVQYXJzZXIoeG1sKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gWE1MQ29udmVydGVyLmNvbnZlcnRUeXBlRGVmaW5pdGlvbihwYXJzZXIpOwotICAgICAgICBjbG9zZVBhcnNlcihwYXJzZXIpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlR5cGVEZWZpbml0aW9uIiwgdHlwZURlZiwgcmVzdWx0LCBjbWlzMTBpZ25vcmVNZXRob2RzKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRXc1R5cGVEZWZpbml0aW9uMTAoVHlwZURlZmluaXRpb24gdHlwZURlZikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNUeXBlRGVmaW5pdGlvblR5cGUgd3MgPSBXU0NvbnZlcnRlci5jb252ZXJ0KHR5cGVEZWYpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IFdTQ29udmVydGVyLmNvbnZlcnQod3MpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlR5cGVEZWZpbml0aW9uIiwgdHlwZURlZiwgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRUeXBlRGVmaW5pdGlvbjExKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRYbWxUeXBlRGVmaW5pdGlvbjExKHR5cGVEZWYsIHZhbGlkYXRlKTsKLSAgICAgICAgYXNzZXJ0V3NUeXBlRGVmaW5pdGlvbjExKHR5cGVEZWYpOwotICAgICAgICBhc3NlcnRKc29uVHlwZURlZmluaXRpb24xMSh0eXBlRGVmKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRYbWxUeXBlRGVmaW5pdGlvbjExKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBjcmVhdGVXcml0ZXIob3V0KTsKLSAgICAgICAgWE1MQ29udmVydGVyLndyaXRlVHlwZURlZmluaXRpb24od3JpdGVyLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSwgVEVTVF9OQU1FU1BBQ0UsIHR5cGVEZWYpOwotICAgICAgICBjbG9zZVdyaXRlcih3cml0ZXIpOwotCi0gICAgICAgIGJ5dGVbXSB4bWwgPSBvdXQudG9CeXRlQXJyYXkoKTsKLQotICAgICAgICBpZiAodmFsaWRhdGUpIHsKLSAgICAgICAgICAgIHZhbGlkYXRlKHhtbCwgQ21pc1ZlcnNpb24uQ01JU18xXzEpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IGNyZWF0ZVBhcnNlcih4bWwpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiByZXN1bHQgPSBYTUxDb252ZXJ0ZXIuY29udmVydFR5cGVEZWZpbml0aW9uKHBhcnNlcik7Ci0gICAgICAgIGNsb3NlUGFyc2VyKHBhcnNlcik7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiVHlwZURlZmluaXRpb24iLCB0eXBlRGVmLCByZXN1bHQsIG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXRFeHRlbnNpb25zKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFdzVHlwZURlZmluaXRpb24xMShUeXBlRGVmaW5pdGlvbiB0eXBlRGVmKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1R5cGVEZWZpbml0aW9uVHlwZSB3cyA9IFdTQ29udmVydGVyLmNvbnZlcnQodHlwZURlZik7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gcmVzdWx0ID0gV1NDb252ZXJ0ZXIuY29udmVydCh3cyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiVHlwZURlZmluaXRpb24iLCB0eXBlRGVmLCByZXN1bHQsIG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXRFeHRlbnNpb25zKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEpzb25UeXBlRGVmaW5pdGlvbjExKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgSlNPTkNvbnZlcnRlci5jb252ZXJ0KHR5cGVEZWYsIERhdGVUaW1lRm9ybWF0LlNJTVBMRSkud3JpdGVKU09OU3RyaW5nKHN3KTsKLQotICAgICAgICBPYmplY3QganNvbiA9IChuZXcgSlNPTlBhcnNlcigpKS5wYXJzZShzdy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uIGluc3RhbmNlb2YgTWFwPD8sID8+KTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydFR5cGVEZWZpbml0aW9uKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJUeXBlRGVmaW5pdGlvbiIsIHR5cGVEZWYsIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VHlwZURlZmluaXRpb25MaXN0KFR5cGVEZWZpbml0aW9uTGlzdCB0eXBlRGVmTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFdzVHlwZURlZmluaXRpb25MaXN0KHR5cGVEZWZMaXN0KTsKLSAgICAgICAgYXNzZXJ0SnNvblR5cGVEZWZpbml0aW9uTGlzdCh0eXBlRGVmTGlzdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0V3NUeXBlRGVmaW5pdGlvbkxpc3QoVHlwZURlZmluaXRpb25MaXN0IHR5cGVEZWZMaXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1R5cGVEZWZpbml0aW9uTGlzdFR5cGUgd3MgPSBXU0NvbnZlcnRlci5jb252ZXJ0KHR5cGVEZWZMaXN0KTsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3QgcmVzdWx0ID0gV1NDb252ZXJ0ZXIuY29udmVydCh3cyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnREYXRhT2JqZWN0c0VxdWFscygiVHlwZURlZmluaXRpb25MaXN0IiwgdHlwZURlZkxpc3QsIHJlc3VsdCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SnNvblR5cGVEZWZpbml0aW9uTGlzdChUeXBlRGVmaW5pdGlvbkxpc3QgdHlwZURlZkxpc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgSlNPTkNvbnZlcnRlci5jb252ZXJ0KHR5cGVEZWZMaXN0LCBEYXRlVGltZUZvcm1hdC5TSU1QTEUpLndyaXRlSlNPTlN0cmluZyhzdyk7Ci0KLSAgICAgICAgT2JqZWN0IGpzb24gPSAobmV3IEpTT05QYXJzZXIoKSkucGFyc2Uoc3cudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoanNvbiBpbnN0YW5jZW9mIE1hcDw/LCA/Pik7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3QgcmVzdWx0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0VHlwZUNoaWxkcmVuKChNYXA8U3RyaW5nLCBPYmplY3Q+KSBqc29uKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJUeXBlRGVmaW5pdGlvbkxpc3QiLCB0eXBlRGVmTGlzdCwgcmVzdWx0LCBudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXN1bHQuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcihUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0eXBlRGVmQ29udGFpbmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0V3NUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcih0eXBlRGVmQ29udGFpbmVyKTsKLSAgICAgICAgYXNzZXJ0SnNvblR5cGVEZWZpbml0aW9uQ29udGFpbmVyKHR5cGVEZWZDb250YWluZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFdzVHlwZURlZmluaXRpb25Db250YWluZXIoVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZURlZkNvbnRhaW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8Q21pc1R5cGVDb250YWluZXI+IHRhcmdldCA9IG5ldyBBcnJheUxpc3Q8Q21pc1R5cGVDb250YWluZXI+KCk7Ci0gICAgICAgIFdTQ29udmVydGVyLmNvbnZlcnRUeXBlQ29udGFpbmVyTGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHR5cGVEZWZDb250YWluZXIpLCB0YXJnZXQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCB0YXJnZXQuc2l6ZSgpKTsKLQotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiByZXN1bHQgPSBXU0NvbnZlcnRlci5jb252ZXJ0VHlwZUNvbnRhaW5lckxpc3QodGFyZ2V0KTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RGF0YU9iamVjdHNFcXVhbHMoIlR5cGVEZWZpbml0aW9uQ29udGFpbmVyIiwgdHlwZURlZkNvbnRhaW5lciwgcmVzdWx0LmdldCgwKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SnNvblR5cGVEZWZpbml0aW9uQ29udGFpbmVyKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWZDb250YWluZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgSlNPTkNvbnZlcnRlci5jb252ZXJ0KHR5cGVEZWZDb250YWluZXIsIERhdGVUaW1lRm9ybWF0LlNJTVBMRSkud3JpdGVKU09OU3RyaW5nKHN3KTsKLQotICAgICAgICBPYmplY3QganNvbiA9IChuZXcgSlNPTlBhcnNlcigpKS5wYXJzZShzdy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqc29uIGluc3RhbmNlb2YgTWFwPD8sID8+KTsKLQotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiByZXN1bHQgPSBKU09OQ29udmVydGVyLmNvbnZlcnRUeXBlRGVzY2VuZGFudHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChqc29uKSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIGFzc2VydERhdGFPYmplY3RzRXF1YWxzKCJUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciIsIHR5cGVEZWZDb250YWluZXIsIHJlc3VsdC5nZXQoMCksIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvcmVzb3VyY2VzL3NjaGVtYS9jbWlzMTAvQ01JUy1Db3JlLnhzZCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvcmVzb3VyY2VzL3NjaGVtYS9jbWlzMTAvQ01JUy1Db3JlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0MjdiMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsL3NyYy90ZXN0L3Jlc291cmNlcy9zY2hlbWEvY21pczEwL0NNSVMtQ29yZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLQk8IS0tCi0JCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLQkJbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkKLQkJb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLQkJYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotCQlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotCQlDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yCi0JCXRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotCQlMaWNlbnNlLgotCS0tPgotCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHhtbG5zOnhqYz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiCi0JamF4YjpleHRlbnNpb25CaW5kaW5nUHJlZml4ZXM9InhqYyIgamF4Yjp2ZXJzaW9uPSIyLjEiCi0JeG1sbnM6Y21pcz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iIHZlcnNpb249IjEuMCI+Ci0KLQk8IS0tICBlbnVtcyAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtRGVjaW1hbFByZWNpc2lvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMzIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjY0IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1Db250ZW50U3RyZWFtQWxsb3dlZCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub3RhbGxvd2VkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbGxvd2VkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXF1aXJlZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcmRpbmFsaXR5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNpbmdsZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibXVsdGkiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1VcGRhdGFiaWxpdHkiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVhZG9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlYWR3cml0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0id2hlbmNoZWNrZWRvdXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9uY3JlYXRlIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtRGF0ZVRpbWVSZXNvbHV0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InllYXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRhdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRpbWUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1Qcm9wZXJ0eVR5cGUiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm9vbGVhbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImludGVnZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRhdGV0aW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWNpbWFsIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJodG1sIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVyaSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUJhc2VPYmplY3RUeXBlSWRzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6ZG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Zm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnJlbGF0aW9uc2hpcCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpwb2xpY3kiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5UXVlcnkiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWV0YWRhdGFvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsdGV4dG9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGhzZXBhcmF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90aGNvbWJpbmVkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUpvaW4iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW5uZXJvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lcmFuZG91dGVyIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFueXRpbWUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InB3Y29ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVZlcnNpb25pbmdTdGF0ZSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVja2Vkb3V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtaW5vciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFqb3IiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVuZmlsZU9iamVjdCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmZpbGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZXNpbmdsZWZpbGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1SZWxhdGlvbnNoaXBEaXJlY3Rpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0YXJnZXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVpdGhlciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3RoIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gIHByb3BlcnRpZXMgaW4gQ01JUyAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0Jhc2UiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpuYW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm9iamVjdElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm9iamVjdFR5cGVJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpiYXNlVHlwZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNyZWF0ZWRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjcmVhdGlvbkRhdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6bGFzdE1vZGlmaWVkQnkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6bGFzdE1vZGlmaWNhdGlvbkRhdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y2hhbmdlVG9rZW4iIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNEb2N1bWVudCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzSW1tdXRhYmxlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTGF0ZXN0VmVyc2lvbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczppc01ham9yVmVyc2lvbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczppc0xhdGVzdE1ham9yVmVyc2lvbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uTGFiZWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6dmVyc2lvblNlcmllc0lkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzVmVyc2lvblNlcmllc0NoZWNrZWRPdXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNoZWNraW5Db21tZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbU1pbWVUeXBlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1GaWxlTmFtZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjb250ZW50U3RyZWFtSWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNGb2xkZXIiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpwYXJlbnRJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczphbGxvd2VkQ2hpbGRPYmplY3RUeXBlSWRzIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBhdGgiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNSZWxhdGlvbnNoaXAiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpzb3VyY2VJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp0YXJnZXRJZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNQb2xpY3kiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpwb2xpY3lUZXh0IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJjbWlzVW5kZWZpbmVkQXR0cmlidXRlIj4KLQkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLQk8IS0tICBtYWluIGNtaXMgb2JqZWN0IC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0iY21pczpjbWlzQWxsb3dhYmxlQWN0aW9uc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8IS0tICBpZiBjaGFuZ2UgbG9nIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlRXZlbnRJbmZvIiB0eXBlPSJjbWlzOmNtaXNDaGFuZ2VFdmVudFR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gIEFDTCAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImFjbCIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJleGFjdEFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBBcHBsaWVkIFBvbGljeSBJRHMgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY3lJZHMiIHR5cGU9ImNtaXM6Y21pc0xpc3RPZklkc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gIFJlbmRpdGlvbiAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbiIgdHlwZT0iY21pczpjbWlzUmVuZGl0aW9uVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb25zIC0tPgotCQkJPHhzOmFueSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIKLQkJCQluYW1lc3BhY2U9IiMjb3RoZXIiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIHByb3BlcnR5IGJhZyAtLT4KLQk8eHM6YXR0cmlidXRlIG5hbWU9ImtleSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCTx4czphdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHR5cGU9InhzOmludGVnZXIiIC8+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnRpZXNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmFwcGluZm8+Ci0JCQkJCQk8amF4Yjpwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eSIgLz4KLQkJCQkJPC94czphcHBpbmZvPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUJvb2xlYW4iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5Qm9vbGVhbiIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJZCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJZCIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJbnRlZ2VyIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXIiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGF0ZVRpbWUiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGF0ZVRpbWUiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGVjaW1hbCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUh0bWwiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbCIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlTdHJpbmciIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVVyaSIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmkiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gc3RhcnQgdGhlIHByb3AgZGVmaW5pdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eSI+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvcGVydHlEZWZpbml0aW9uSWQiIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIHByb3BlcnR5IGRlZmluaXRpb24gaWQgZm9yIHRoaXMKLQkJCQkJcHJvcGVydHkgaW5zdGFuY2UuIFRoaXMgaXMKLQkJCQkJbm90IHJlcXVpcmVkIHRvIGJlIHNldCB3aGVuIHVzZWQgYXMgYQotCQkJCQlkZWZhdWx0IHZhbHVlLiBUaGlzIGlzCi0JCQkJCXJlcXVpcmVkIHRvIGJlIHNldCB3aGVuIHVzZWQgZm9yIHF1ZXJ5IHJlc3VsdAotCQkJCQlzZXQgb3IgcmV0dXJuaW5nCi0JCQkJCXByb3BlcnRpZXMgb24gYW4gb2JqZWN0LgotCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2FsTmFtZSIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgbG9jYWxuYW1lIGFzIGRlZmluZWQgYnkgdGhlIHByb3BlcnR5Ci0JCQkJCWRlZmluaXRpb24KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB1c2U9Im9wdGlvbmFsIj4KLQkJCTx4czphbm5vdGF0aW9uPgotCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQlUaGlzIGlzIHRoZSBkaXNwbGF5bmFtZSBhcyBkZWZpbmVkIGJ5IHRoZSBwcm9wZXJ0eQotCQkJCQlkZWZpbml0aW9uCi0JCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJPC94czphbm5vdGF0aW9uPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeU5hbWUiIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIHF1ZXJ5TmFtZS4gVGhpcyBtdXN0IGJlIHNwZWNpZmllZCBpZgotCQkJCQl0aGlzIGlzIHRoZSByZXN1bHQgb2YgYSBxdWVyeS4gSWYgYWxpYXNlcyBhcmUgdXNlZCwgdGhlIGFsaWFzIGlzIHRvCi0JCQkJCWJlIHNwZWNpZmllZCBoZXJlIGluc3RlYWQgb2YgdGhlIHF1ZXJ5TmFtZS4KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5Qm9vbGVhbiI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpib29sZWFuIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlJZCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUludGVnZXIiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6aW50ZWdlciIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGF0ZVRpbWUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURlY2ltYWwiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGVjaW1hbCIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SHRtbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlTdHJpbmciPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlVcmkiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6YW55VVJJIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIGNtaXMgY2hvaWNlIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlIj4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNwbGF5TmFtZSIgdXNlPSJyZXF1aXJlZCIgLz4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VCb29sZWFuIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpib29sZWFuIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VCb29sZWFuIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlSWQiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VJbnRlZ2VyIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czppbnRlZ2VyIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJbnRlZ2VyIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlRGF0ZVRpbWUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmRhdGVUaW1lIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEYXRlVGltZSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZURlY2ltYWwiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmRlY2ltYWwiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZURlY2ltYWwiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VIdG1sIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUh0bWwiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZVN0cmluZyI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VTdHJpbmciIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VVcmkiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmFueVVSSSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlVXJpIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gIGFsbG93YWJsZSBhY3Rpb25zIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQWxsb3dhYmxlQWN0aW9uc1R5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5EZWxldGVPYmplY3QiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5VcGRhdGVQcm9wZXJ0aWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Rm9sZGVyVHJlZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldFByb3BlcnRpZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRPYmplY3RSZWxhdGlvbnNoaXBzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0T2JqZWN0UGFyZW50cyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEZvbGRlclBhcmVudCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldERlc2NlbmRhbnRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuTW92ZU9iamVjdCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZUNvbnRlbnRTdHJlYW0iIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DaGVja091dCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNhbmNlbENoZWNrT3V0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ2hlY2tJbiIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhblNldENvbnRlbnRTdHJlYW0iIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRBbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkFkZE9iamVjdFRvRm9sZGVyIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuUmVtb3ZlT2JqZWN0RnJvbUZvbGRlciIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldENvbnRlbnRTdHJlYW0iIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5BcHBseVBvbGljeSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEFwcGxpZWRQb2xpY2llcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhblJlbW92ZVBvbGljeSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldENoaWxkcmVuIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlRG9jdW1lbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DcmVhdGVGb2xkZXIiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5EZWxldGVUcmVlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIHJlbmRpdGlvbnMgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRSZW5kaXRpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIEFDTCAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkFwcGx5QUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzTGlzdE9mSWRzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQotCQkJPCEtLSAgZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIFByb3BlcnR5IEF0dHJpYnV0ZXMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVR5cGUiIHR5cGU9ImNtaXM6ZW51bVByb3BlcnR5VHlwZSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcmRpbmFsaXR5IiB0eXBlPSJjbWlzOmVudW1DYXJkaW5hbGl0eSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InVwZGF0YWJpbGl0eSIgdHlwZT0iY21pczplbnVtVXBkYXRhYmlsaXR5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIGZsYWdzIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGVkIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlcmFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9Im9wZW5DaG9pY2UiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTwhLS0gIHR5cGUgc3BlY2lmaWMgZGVmaW5pdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlCb29sZWFuIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VCb29sZWFuIiAvPgotCi0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUlkRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SWQiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUlkIiAvPgotCi0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlJbnRlZ2VyIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhWYWx1ZSIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtaW5WYWx1ZSIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJbnRlZ2VyIiAvPgotCi0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGF0ZVRpbWUiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXNvbHV0aW9uIgotCQkJCQkJdHlwZT0iY21pczplbnVtRGF0ZVRpbWVSZXNvbHV0aW9uIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEYXRlVGltZSIgLz4KLQotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGVjaW1hbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4VmFsdWUiIHR5cGU9InhzOmRlY2ltYWwiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWluVmFsdWUiIHR5cGU9InhzOmRlY2ltYWwiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJjbWlzOmVudW1EZWNpbWFsUHJlY2lzaW9uIgotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZURlY2ltYWwiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SHRtbERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUh0bWwiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUh0bWwiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhMZW5ndGgiIHR5cGU9InhzOmludGVnZXIiCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlU3RyaW5nIiAvPgotCi0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVVyaURlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVVyaSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlVXJpIiAvPgotCi0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gdHlwZSBkZWZpbml0aW9uIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPCEtLSAgcHJpbWFyeSBpZGVudGlmeWluZyBhdHRyaWJ1dGUgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gIGJhc2UgdHlwZSAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImJhc2VJZCIgdHlwZT0iY21pczplbnVtQmFzZU9iamVjdFR5cGVJZHMiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcGFyZW50IC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGFyZW50SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJVGhpcyBpcyB0aGUgaWQgZm9yIHRoZSBwYXJlbnQgdHlwZSBkZWZpbml0aW9uLiBJZgotCQkJCQkJdGhpcyBpcyBhIGJhc2UgdHlwZSwKLQkJCQkJCXRoaXMgaXMgbm90IHByZXNlbnQuCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8IS0tIGZsYWdzIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsZWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmdWxsdGV4dEluZGV4ZWQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIGRlZmF1bHQ9InRydWUiIC8+Ci0KLQkJCTwhLS0gY29udHJvbGxhYmxlIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udHJvbGxhYmxlUG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udHJvbGxhYmxlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIHByb3BlcnR5IGRlZmluaXRpb25zIC0tPgotCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmFwcGluZm8+Ci0JCQkJCQk8amF4Yjpwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eURlZmluaXRpb24iIC8+Ci0JCQkJCTwveHM6YXBwaW5mbz4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlEYXRlVGltZURlZmluaXRpb24iCi0JCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUlkRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJZERlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SW50ZWdlckRlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SW50ZWdlckRlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SHRtbERlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbERlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVVyaURlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5VXJpRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQk8L3hzOmNob2ljZT4KLQotCQkJPCEtLSBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gdHlwZSBzcGVjaWZpYyB0eXBlZGVmcyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0idmVyc2lvbmFibGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udGVudFN0cmVhbUFsbG93ZWQiIHR5cGU9ImNtaXM6ZW51bUNvbnRlbnRTdHJlYW1BbGxvd2VkIgotCQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRm9sZGVyRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZVJlbGF0aW9uc2hpcERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWxsb3dlZFNvdXJjZVR5cGVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2VkVGFyZ2V0VHlwZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlUG9saWN5RGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPCEtLSAgcXVlcnkgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNRdWVyeVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJzdGF0ZW1lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InNlYXJjaEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmFueSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lc3BhY2U9IiMjb3RoZXIiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQotCTwhLS0gIHJlcG9zaXRvcnkgaW5mbyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1JlcG9zaXRvcnlJbmZvVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeURlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZW5kb3JOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9kdWN0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvZHVjdFZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJvb3RGb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibGF0ZXN0Q2hhbmdlTG9nVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXRpZXMiIHR5cGU9ImNtaXM6Y21pc1JlcG9zaXRvcnlDYXBhYmlsaXRpZXNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWNsQ2FwYWJpbGl0eSIgdHlwZT0iY21pczpjbWlzQUNMQ2FwYWJpbGl0eVR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjbWlzVmVyc2lvblN1cHBvcnRlZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idGhpbkNsaWVudFVSSSIgdHlwZT0ieHM6YW55VVJJIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlc0luY29tcGxldGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VzT25UeXBlIiB0eXBlPSJjbWlzOmVudW1CYXNlT2JqZWN0VHlwZUlkcyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxBbm9ueW1vdXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJSWYgc2V0LCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBwcmluY2lwYWwgd2hvIGlzCi0JCQkJCQl1c2VkIGZvciBhbm9ueW1vdXMKLQkJCQkJCWFjY2Vzcy4gVGhpcyBwcmluY2lwYWwgY2FuIHRoZW4gYmUgcGFzc2VkIHRvIHRoZQotCQkJCQkJQUNMIHNlcnZpY2VzIHRvCi0JCQkJCQlzcGVjaWZ5IHdoYXQgcGVybWlzc2lvbnMgYW5vbnltb3VzIHVzZXJzIHNob3VsZAotCQkJCQkJaGF2ZQotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxBbnlvbmUiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJSWYgc2V0LCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBwcmluY2lwYWwgd2hvIGlzCi0JCQkJCQl1c2VkIGZvciBldmVyeW9uZSdzIGFjY2Vzcy4gVGhpcyBwcmluY2lwYWwgY2FuIHRoZW4gYmUgcGFzc2VkIHRvCi0JCQkJCQl0aGUKLQkJCQkJCUFDTCBzZXJ2aWNlcyB0bwotCQkJCQkJc3BlY2lmeSB3aGF0IHBlcm1pc3Npb25zIGV2ZXJ5b25lIHNob3VsZAotCQkJCQkJaGF2ZQotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1JlcG9zaXRvcnlDYXBhYmlsaXRpZXNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUFDTCIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eUFDTCIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlBbGxWZXJzaW9uc1NlYXJjaGFibGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5Q2hhbmdlcyIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eUNoYW5nZXMiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRhYmlsaXR5IgotCQkJCXR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlHZXREZXNjZW5kYW50cyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlHZXRGb2xkZXJUcmVlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5TXVsdGlmaWxpbmciIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5UFdDU2VhcmNoYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlQV0NVcGRhdGFibGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5UXVlcnkiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlRdWVyeSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlSZW5kaXRpb25zIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5UmVuZGl0aW9uIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVVuZmlsaW5nIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVZlcnNpb25TcGVjaWZpY0ZpbGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlKb2luIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5Sm9pbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJza2lwIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPCEtLSBVbmlmaWVkIFNlYXJjaCAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVHlwZU9mQ2hhbmdlcyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPCEtLSBjb250ZW50IHdpdGggYSBuZXcgSUQgaGFzIGJlZW4gY3JlYXRlZCAtLT4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY3JlYXRlZCIgLz4KLQkJCTwhLS0gY29udGVudCB3aXRoIGFuIGV4aXN0aW5nIElEIGhhcyBiZWVuIG1vZGlmaWVkIC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGVkIiAvPgotCQkJPCEtLSBjb250ZW50IHdpdGggYW4gZXhpc3RpbmcgSUQgaGFzIGJlZW4gZGVsZXRlZCAtLT4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlZCIgLz4KLQkJCTwhLS0gY29udGVudCB3aXRoIGFuIGV4aXN0aW5nIElEIGhhcyBoYWQgaXRzIHNlY3VyaXR5IHBvbGljeSBjaGFuZ2VkLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNlY3VyaXR5IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5Q2hhbmdlcyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvYmplY3RpZHNvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcm9wZXJ0aWVzIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hhbmdlRXZlbnRUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVHlwZSIgdHlwZT0iY21pczplbnVtVHlwZU9mQ2hhbmdlcyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPCEtLSBBQ0wgLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUFDTFByb3BhZ2F0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcG9zaXRvcnlkZXRlcm1pbmVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvYmplY3Rvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcm9wYWdhdGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlBQ0wiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGlzY292ZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbmFnZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQmFzaWNQZXJtaXNzaW9ucyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnJlYWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6d3JpdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6YWxsIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUGVybWlzc2lvbkRlZmluaXRpb24iPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUGVybWlzc2lvbk1hcHBpbmciPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJrZXkiIHR5cGU9ImNtaXM6ZW51bUFsbG93YWJsZUFjdGlvbnNLZXkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJTXVsdGlwbGUgZW50cmllcyBhcmUgT1InZWQgdG9nZXRoZXIuIEFueQotCQkJCQkJcGVybWlzc2lvbiB0aGF0IHNwZWNpZmllZCBpcwotCQkJCQkJc3VmZmljaWVudCB0byBwcm92aWRlIHJpZ2h0cyByZXF1aXJlZAotCQkJCQkJaW4ga2V5Ci0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQWxsb3dhYmxlQWN0aW9uc0tleSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXREZXNjZW5kZW50cy5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldENoaWxkcmVuLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0UGFyZW50cy5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEZvbGRlclBhcmVudC5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNyZWF0ZURvY3VtZW50LkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlRm9sZGVyLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlUmVsYXRpb25zaGlwLlNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlUmVsYXRpb25zaGlwLlRhcmdldCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0UHJvcGVydGllcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblZpZXdDb250ZW50Lk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuVXBkYXRlUHJvcGVydGllcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbk1vdmUuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5Nb3ZlLlRhcmdldCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuTW92ZS5Tb3VyY2UiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZVRyZWUuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5TZXRDb250ZW50LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5EZWxldGVDb250ZW50LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BZGRUb0ZvbGRlci5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFRvRm9sZGVyLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuUmVtb3ZlRnJvbUZvbGRlci5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZUZyb21Gb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DaGVja291dC5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ2FuY2VsQ2hlY2tvdXQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNoZWNraW4uRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFsbFZlcnNpb25zLlZlcnNpb25TZXJpZXMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldE9iamVjdFJlbGF0aW9uc2hpcHMuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BZGRQb2xpY3kuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BZGRQb2xpY3kuUG9saWN5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVQb2xpY3kuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVQb2xpY3kuUG9saWN5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRBcHBsaWVkUG9saWNpZXMuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRBQ0wuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BcHBseUFDTC5PYmplY3QiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVzZXJzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6dXNlciI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJVGhpcyB1c2VyIGNhbiBiZSB1c2VkIG9uIHNldHRpbmcgQUNMcyB0byBzcGVjaWZ5Ci0JCQkJCQl0aGUgcGVybWlzc2lvbiB0aGlzCi0JCQkJCQl1c2VyIGNvbnRleHQgc2hvdWxkIGhhdmUuCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbnVtZXJhdGlvbj4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tIEFDTCBvbiBvYmplY3RzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQWNjZXNzQ29udHJvbFByaW5jaXBhbFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxJZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sRW50cnlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJpbmNpcGFsIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sUHJpbmNpcGFsVHlwZSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlyZWN0IiB0eXBlPSJ4czpib29sZWFuIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sRW50cnlUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FDTENhcGFiaWxpdHlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkUGVybWlzc2lvbnMiIHR5cGU9ImNtaXM6ZW51bVN1cHBvcnRlZFBlcm1pc3Npb25zIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGFnYXRpb24iIHR5cGU9ImNtaXM6ZW51bUFDTFByb3BhZ2F0aW9uIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbnMiIHR5cGU9ImNtaXM6Y21pc1Blcm1pc3Npb25EZWZpbml0aW9uIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXBwaW5nIiB0eXBlPSJjbWlzOmNtaXNQZXJtaXNzaW9uTWFwcGluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtU3VwcG9ydGVkUGVybWlzc2lvbnMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYmFzaWMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcG9zaXRvcnkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGgiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPCEtLSByZW5kaXRpb25zIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5UmVuZGl0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlYWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVJlbmRpdGlvbktpbmQiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp0aHVtYm5haWwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZW5kaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWFtSWQiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJraW5kIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJoZWlnaHQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9IndpZHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25Eb2N1bWVudElkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIGVsZW1lbnRzIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIEFsbG93YWJsZUFjdGlvbnMKLQkJCQlEb2N1bWVudCBUeXBlCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0iY21pczpjbWlzUXVlcnlUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIFF1ZXJ5IERvY3VtZW50IFR5cGUKLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhY2wiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJVGhpcyBpcyB0aGUgcm9vdCB0YWcgZm9yIGEgQ01JUyBBQ0wgRG9jdW1lbnQgVHlwZQotCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JPC94czplbGVtZW50PgotPC94czpzY2hlbWE+Ci0JPCEtLSBFT0YgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9yZXNvdXJjZXMvc2NoZW1hL2NtaXMxMS9DTUlTLUNvcmUueHNkIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC9zcmMvdGVzdC9yZXNvdXJjZXMvc2NoZW1hL2NtaXMxMS9DTUlTLUNvcmUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE0NmI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwvc3JjL3Rlc3QvcmVzb3VyY2VzL3NjaGVtYS9jbWlzMTEvQ01JUy1Db3JlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQk8IS0tCi0JCUNNSVMgMS4xIENvcmUgU2NoZW1hCi0JLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHhtbG5zOnhqYz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4Yi94amMiCi0JamF4YjpleHRlbnNpb25CaW5kaW5nUHJlZml4ZXM9InhqYyIgamF4Yjp2ZXJzaW9uPSIyLjEiCi0JeG1sbnM6Y21pcz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iIHZlcnNpb249IjEuMCI+Ci0KLQk8IS0tICBlbnVtcyAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtRGVjaW1hbFByZWNpc2lvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnRlZ2VyIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMzIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjY0IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ29udGVudFN0cmVhbUFsbG93ZWQiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90YWxsb3dlZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsb3dlZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVxdWlyZWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXJkaW5hbGl0eSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzaW5nbGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im11bHRpIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVXBkYXRhYmlsaXR5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlYWRvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZWFkd3JpdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IndoZW5jaGVja2Vkb3V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvbmNyZWF0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bURhdGVUaW1lUmVzb2x1dGlvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ5ZWFyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkYXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0aW1lIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydHlUeXBlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvb2xlYW4iIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlZ2VyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkYXRldGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVjaW1hbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaHRtbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cmkiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1CYXNlT2JqZWN0VHlwZUlkcyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpyZWxhdGlvbnNoaXAiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cG9saWN5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOml0ZW0iIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6c2Vjb25kYXJ5IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eVF1ZXJ5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1ldGFkYXRhb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbHRleHRvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3Roc2VwYXJhdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGhjb21iaW5lZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlKb2luIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW5uZXJhbmRvdXRlciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJhbnl0aW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwd2Nvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVmVyc2lvbmluZ1N0YXRlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrZWRvdXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1pbm9yIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYWpvciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVuZmlsZU9iamVjdCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmZpbGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZXNpbmdsZWZpbGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1SZWxhdGlvbnNoaXBEaXJlY3Rpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0YXJnZXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImVpdGhlciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3RoIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gIHByb3BlcnRpZXMgaW4gQ01JUyAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0Jhc2UiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpuYW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmRlc2NyaXB0aW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm9iamVjdElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm9iamVjdFR5cGVJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpiYXNlVHlwZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnNlY29uZGFyeU9iamVjdFR5cGVJZHMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y3JlYXRlZEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNyZWF0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpZWRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjaGFuZ2VUb2tlbiIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0RvY3VtZW50Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNJbW11dGFibGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNMYXRlc3RWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTGF0ZXN0TWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzUHJpdmF0ZVdvcmtpbmdDb3B5IiAvPgkJCQotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25MYWJlbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzSWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y2hlY2tpbkNvbW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjb250ZW50U3RyZWFtTWltZVR5cGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUZpbGVOYW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1JZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0ZvbGRlciI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBhcmVudElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cGF0aCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1JlbGF0aW9uc2hpcCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnNvdXJjZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnRhcmdldElkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQkKLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1BvbGljeSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBvbGljeVRleHQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiPgotCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czphdHRyaWJ1dGVHcm91cD4KLQotCTwhLS0gIG1haW4gY21pcyBvYmplY3QgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXAiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQotCQkJPCEtLSAgaWYgY2hhbmdlIGxvZyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZUV2ZW50SW5mbyIgdHlwZT0iY21pczpjbWlzQ2hhbmdlRXZlbnRUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tICBBQ0wgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhY2wiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXhhY3RBQ0wiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gQXBwbGllZCBQb2xpY3kgSURzIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWN5SWRzIiB0eXBlPSJjbWlzOmNtaXNMaXN0T2ZJZHNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tICBSZW5kaXRpb24gLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb24iIHR5cGU9ImNtaXM6Y21pc1JlbmRpdGlvblR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQotCQkJPCEtLSAgZXh0ZW5zaW9ucyAtLT4KLQkJCTx4czphbnkgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0JCQkJbmFtZXNwYWNlPSIjI290aGVyIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSBwcm9wZXJ0eSBiYWcgLS0+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnRpZXNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmFwcGluZm8+Ci0JCQkJCQk8amF4Yjpwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eSIgLz4KLQkJCQkJPC94czphcHBpbmZvPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUJvb2xlYW4iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5Qm9vbGVhbiIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJZCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJZCIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJbnRlZ2VyIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXIiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGF0ZVRpbWUiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGF0ZVRpbWUiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGVjaW1hbCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUh0bWwiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbCIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlTdHJpbmciIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVVyaSIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmkiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJPC94czpjaG9pY2U+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gc3RhcnQgdGhlIHByb3AgZGVmaW5pdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eSI+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvcGVydHlEZWZpbml0aW9uSWQiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpZCBmb3IgdGhpcwotCQkJCQlwcm9wZXJ0eSBpbnN0YW5jZS4gVGhpcyBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZAotCQkJCQlhcyBhIGRlZmF1bHQgdmFsdWUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZCBmb3IgCi0JCQkJCXF1ZXJ5IHJlc3VsdCBzZXQgb3IgcmV0dXJuaW5nIHByb3BlcnRpZXMgb24gYW4gb2JqZWN0LgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIGxvY2FsbmFtZSBhcyBkZWZpbmVkIGJ5IHRoZSBwcm9wZXJ0eQotCQkJCQlkZWZpbml0aW9uLgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgZGlzcGxheW5hbWUgYXMgZGVmaW5lZCBieSB0aGUgcHJvcGVydHkKLQkJCQkJZGVmaW5pdGlvbi4KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIj4KLQkJCTx4czphbm5vdGF0aW9uPgotCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQlUaGlzIGlzIHRoZSBxdWVyeU5hbWUuIFRoaXMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLQkJCQkJdGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgcXVlcnkuIElmIGFsaWFzZXMgYXJlIHVzZWQsIHRoZSBhbGlhcyBpcyB0bwotCQkJCQliZSBzcGVjaWZpZWQgaGVyZSBpbnN0ZWFkIG9mIHRoZSBxdWVyeU5hbWUuCi0JCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJPC94czphbm5vdGF0aW9uPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUJvb2xlYW4iPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6Ym9vbGVhbiIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SWQiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlJbnRlZ2VyIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURhdGVUaW1lIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmRhdGVUaW1lIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEZWNpbWFsIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmRlY2ltYWwiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUh0bWwiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVN0cmluZyI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVVyaSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gY21pcyBjaG9pY2UgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2UiPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlQm9vbGVhbiI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6Ym9vbGVhbiIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlQm9vbGVhbiIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUlkIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUlkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlSW50ZWdlciI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6aW50ZWdlciIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSW50ZWdlciIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZURhdGVUaW1lIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkYXRlVGltZSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGF0ZVRpbWUiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VEZWNpbWFsIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkZWNpbWFsIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEZWNpbWFsIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlSHRtbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VIdG1sIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VTdHJpbmciPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlU3RyaW5nIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlVXJpIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVVyaSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCi0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tICBhbGxvd2FibGUgYWN0aW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuRGVsZXRlT2JqZWN0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuVXBkYXRlUHJvcGVydGllcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEZvbGRlclRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRQcm9wZXJ0aWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldE9iamVjdFBhcmVudHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRGb2xkZXJQYXJlbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXREZXNjZW5kYW50cyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbk1vdmVPYmplY3QiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5EZWxldGVDb250ZW50U3RyZWFtIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ2hlY2tPdXQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DYW5jZWxDaGVja091dCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNoZWNrSW4iIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5TZXRDb250ZW50U3RyZWFtIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QWxsVmVyc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5BZGRPYmplY3RUb0ZvbGRlciIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhblJlbW92ZU9iamVjdEZyb21Gb2xkZXIiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRDb250ZW50U3RyZWFtIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQXBwbHlQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRBcHBsaWVkUG9saWNpZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5SZW1vdmVQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRDaGlsZHJlbiIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZURvY3VtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlRm9sZGVyIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlUmVsYXRpb25zaGlwIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlSXRlbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZVRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcmVuZGl0aW9ucyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldFJlbmRpdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gQUNMIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QUNMIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQXBwbHlBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNMaXN0T2ZJZHNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIGJ1bGtVcGRhdGVQcm9wZXJ0aWVzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SWRBbmRDaGFuZ2VUb2tlblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibmV3SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQnVsa1VwZGF0ZVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZEFuZENoYW5nZVRva2VuIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRTZWNvbmRhcnlUeXBlSWRzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZVNlY29uZGFyeVR5cGVJZHMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCQotCQkJPCEtLSAgZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIFByb3BlcnR5IEF0dHJpYnV0ZXMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVR5cGUiIHR5cGU9ImNtaXM6ZW51bVByb3BlcnR5VHlwZSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcmRpbmFsaXR5IiB0eXBlPSJjbWlzOmVudW1DYXJkaW5hbGl0eSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InVwZGF0YWJpbGl0eSIgdHlwZT0iY21pczplbnVtVXBkYXRhYmlsaXR5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIGZsYWdzIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGVkIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlcmFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9Im9wZW5DaG9pY2UiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTwhLS0gIHR5cGUgc3BlY2lmaWMgZGVmaW5pdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlCb29sZWFuIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VCb29sZWFuIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlJZERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUlkIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SW50ZWdlckRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXIiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heFZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1pblZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUludGVnZXIiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGF0ZVRpbWUiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXNvbHV0aW9uIgotCQkJCQkJdHlwZT0iY21pczplbnVtRGF0ZVRpbWVSZXNvbHV0aW9uIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEYXRlVGltZSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURlY2ltYWwiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heFZhbHVlIiB0eXBlPSJ4czpkZWNpbWFsIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1pblZhbHVlIiB0eXBlPSJ4czpkZWNpbWFsIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InByZWNpc2lvbiIgdHlwZT0iY21pczplbnVtRGVjaW1hbFByZWNpc2lvbiIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VEZWNpbWFsIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSHRtbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhMZW5ndGgiIHR5cGU9InhzOmludGVnZXIiCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlU3RyaW5nIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlVcmlEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmkiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVVyaSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSB0eXBlIGRlZmluaXRpb24gLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8IS0tICBwcmltYXJ5IGlkZW50aWZ5aW5nIGF0dHJpYnV0ZSAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgYmFzZSB0eXBlIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYmFzZUlkIiB0eXBlPSJjbWlzOmVudW1CYXNlT2JqZWN0VHlwZUlkcyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBwYXJlbnQgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJlbnRJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIGlzIHRoZSBpZCBmb3IgdGhlIHBhcmVudCB0eXBlIGRlZmluaXRpb24uCi0JCQkJCQlJZiB0aGlzIGlzIGEgYmFzZSB0eXBlLCB0aGlzIGlzIE1VU1QgTk9UIGJlIHByZXNlbnQuCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwhLS0gZmxhZ3MgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWxlYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImZ1bGx0ZXh0SW5kZXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgZGVmYXVsdD0idHJ1ZSIgLz4KLQotCQkJPCEtLSBjb250cm9sbGFibGUgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCi0JCQk8IS0tIHR5cGUgbXV0YWJpbGl0eS0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZU11dGFiaWxpdHkiIHR5cGU9ImNtaXM6Y21pc1R5cGVNdXRhYmlsaXR5Q2FwYWJpbGl0aWVzVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBwcm9wZXJ0eSBkZWZpbml0aW9ucyAtLT4KLQkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czphcHBpbmZvPgotCQkJCQkJPGpheGI6cHJvcGVydHkgbmFtZT0icHJvcGVydHlEZWZpbml0aW9uIiAvPgotCQkJCQk8L3hzOmFwcGluZm8+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJZERlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SWREZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUh0bWxEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUh0bWxEZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlVcmlEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVVyaURlZmluaXRpb25UeXBlIiAvPgotCQkJPC94czpjaG9pY2U+Ci0KLQkJCTwhLS0gZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIHR5cGUgc3BlY2lmaWMgdHlwZWRlZnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InZlcnNpb25hYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW1BbGxvd2VkIiB0eXBlPSJjbWlzOmVudW1Db250ZW50U3RyZWFtQWxsb3dlZCIKLQkJCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZUZvbGRlckRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVSZWxhdGlvbnNoaXBEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93ZWRTb3VyY2VUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWxsb3dlZFRhcmdldFR5cGVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZVBvbGljeURlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVJdGVtRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZVNlY29uZGFyeURlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4JCi0KLQk8IS0tICBxdWVyeSAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1F1ZXJ5VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InN0YXRlbWVudCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2VhcmNoQWxsVmVyc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6YW55IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWVzcGFjZT0iIyNvdGhlciIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCi0JPCEtLSAgcmVwb3NpdG9yeSBpbmZvIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVwb3NpdG9yeUluZm9UeXBlIj4KLQkJPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMSI+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlOYW1lIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5RGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InZlbmRvck5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb2R1Y3ROYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9kdWN0VmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icm9vdEZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxhdGVzdENoYW5nZUxvZ1Rva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXRpZXMiIHR5cGU9ImNtaXM6Y21pc1JlcG9zaXRvcnlDYXBhYmlsaXRpZXNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWNsQ2FwYWJpbGl0eSIgdHlwZT0iY21pczpjbWlzQUNMQ2FwYWJpbGl0eVR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjbWlzVmVyc2lvblN1cHBvcnRlZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idGhpbkNsaWVudFVSSSIgdHlwZT0ieHM6YW55VVJJIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlc0luY29tcGxldGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VzT25UeXBlIiB0eXBlPSJjbWlzOmVudW1CYXNlT2JqZWN0VHlwZUlkcyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxBbm9ueW1vdXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJSWYgc2V0LCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBwcmluY2lwYWwgd2hvIGlzCi0JCQkJCQl1c2VkIGZvciBhbm9ueW1vdXMgYWNjZXNzLiBUaGlzIHByaW5jaXBhbCBjYW4gdGhlbiBiZSAKLQkJCQkJCXBhc3NlZCB0byB0aGUgQUNMIHNlcnZpY2VzIHRvIHNwZWNpZnkgd2hhdCBwZXJtaXNzaW9ucwotCQkJCQkJYW5vbnltb3VzIHVzZXJzIHNob3VsZCBoYXZlLgotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxBbnlvbmUiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJSWYgc2V0LCB0aGlzIGZpZWxkIGhvbGRzIHRoZSBwcmluY2lwYWwgd2hvIGlzCi0JCQkJCQl1c2VkIGZvciBldmVyeW9uZSdzIGFjY2Vzcy4gVGhpcyBwcmluY2lwYWwgY2FuIHRoZW4gYmUgCi0JCQkJCQlwYXNzZWQgdG8gdGhlIEFDTCBzZXJ2aWNlcyB0byBzcGVjaWZ5IHdoYXQgcGVybWlzc2lvbnMKLQkJCQkJCWV2ZXJ5b25lIHNob3VsZCBoYXZlLgotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbmRlZEZlYXR1cmVzIgotCQkJCXR5cGU9ImNtaXM6Y21pc0V4dGVuc2lvbkZlYXR1cmVUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlBQ0wiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlBQ0wiCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5QWxsVmVyc2lvbnNTZWFyY2hhYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUNoYW5nZXMiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlDaGFuZ2VzIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0YWJpbGl0eSIKLQkJCQl0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMiIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5R2V0RGVzY2VuZGFudHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5R2V0Rm9sZGVyVHJlZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlPcmRlckJ5IiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5T3JkZXJCeSIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eU11bHRpZmlsaW5nIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVBXQ1NlYXJjaGFibGUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5UFdDVXBkYXRhYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVF1ZXJ5IiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5UXVlcnkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5UmVuZGl0aW9ucyIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eVJlbmRpdGlvbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlVbmZpbGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlWZXJzaW9uU3BlY2lmaWNGaWxpbmciIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5Sm9pbiIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eUpvaW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlDcmVhdGFibGVQcm9wZXJ0eVR5cGVzIgotCQkJCXR5cGU9ImNtaXM6Y21pc0NyZWF0YWJsZVByb3BlcnR5VHlwZXNUeXBlIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyIKLQkJCQl0eXBlPSJjbWlzOmNtaXNOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwhLS0gZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTwhLS0gVW5pZmllZCBTZWFyY2ggLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVR5cGVPZkNoYW5nZXMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTwhLS0gY29udGVudCB3aXRoIGEgbmV3IElEIGhhcyBiZWVuIGNyZWF0ZWQgLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNyZWF0ZWQiIC8+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhbiBleGlzdGluZyBJRCBoYXMgYmVlbiBtb2RpZmllZCAtLT4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlZCIgLz4KLQkJCTwhLS0gY29udGVudCB3aXRoIGFuIGV4aXN0aW5nIElEIGhhcyBiZWVuIGRlbGV0ZWQgLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZWQiIC8+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhbiBleGlzdGluZyBJRCBoYXMgaGFkIGl0cyBzZWN1cml0eSBwb2xpY3kgY2hhbmdlZC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzZWN1cml0eSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUNoYW5nZXMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib2JqZWN0aWRzb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHJvcGVydGllcyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQkKLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eU9yZGVyQnkiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29tbW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjdXN0b20iIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaGFuZ2VFdmVudFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUeXBlIiB0eXBlPSJjbWlzOmVudW1UeXBlT2ZDaGFuZ2VzIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIEFDTCAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQUNMUHJvcGFnYXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwb3NpdG9yeWRldGVybWluZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdG9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb3BhZ2F0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUFDTCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkaXNjb3ZlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFuYWdlIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1CYXNpY1Blcm1pc3Npb25zIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cmVhZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp3cml0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczphbGwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uRGVmaW5pdGlvbiI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBwcm9jZXNzQ29udGVudHM9ImxheCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uTWFwcGluZyI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0iY21pczplbnVtQWxsb3dhYmxlQWN0aW9uc0tleSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlNdWx0aXBsZSBlbnRyaWVzIGFyZSBPUidlZCB0b2dldGhlci4gQW55Ci0JCQkJCQlwZXJtaXNzaW9uIHRoYXQgc3BlY2lmaWVkIGlzIHN1ZmZpY2llbnQgdG8gCi0JCQkJCQlwcm92aWRlIHJpZ2h0cyByZXF1aXJlZCBpbiBrZXkKLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCTwveHM6ZWxlbWVudD4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1BbGxvd2FibGVBY3Rpb25zS2V5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldERlc2NlbmRlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Q2hpbGRyZW4uRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQYXJlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Rm9sZGVyUGFyZW50Lk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlRG9jdW1lbnQuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVGb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuU291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuVmlld0NvbnRlbnQuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5VcGRhdGVQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuTW92ZS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbk1vdmUuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5Nb3ZlLlNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlVHJlZS5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblNldENvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZUNvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFRvRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQWRkVG9Gb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVGcm9tRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuUmVtb3ZlRnJvbUZvbGRlci5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNoZWNrb3V0LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DYW5jZWxDaGVja291dC5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ2hlY2tpbi5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0QWxsVmVyc2lvbnMuVmVyc2lvblNlcmllcyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFwcGxpZWRQb2xpY2llcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFDTC5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFwcGx5QUNMLk9iamVjdCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVXNlcnMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp1c2VyIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIHVzZXIgY2FuIGJlIHVzZWQgb24gc2V0dGluZyBBQ0xzIHRvIHNwZWNpZnkKLQkJCQkJCXRoZSBwZXJtaXNzaW9uIHRoaXMKLQkJCQkJCXVzZXIgY29udGV4dCBzaG91bGQgaGF2ZS4KLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVudW1lcmF0aW9uPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gQUNMIG9uIG9iamVjdHMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sUHJpbmNpcGFsVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbElkIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWwiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xQcmluY2lwYWxUeXBlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkaXJlY3QiIHR5cGU9InhzOmJvb2xlYW4iIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FDTENhcGFiaWxpdHlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkUGVybWlzc2lvbnMiIHR5cGU9ImNtaXM6ZW51bVN1cHBvcnRlZFBlcm1pc3Npb25zIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGFnYXRpb24iIHR5cGU9ImNtaXM6ZW51bUFDTFByb3BhZ2F0aW9uIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbnMiIHR5cGU9ImNtaXM6Y21pc1Blcm1pc3Npb25EZWZpbml0aW9uIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXBwaW5nIiB0eXBlPSJjbWlzOmNtaXNQZXJtaXNzaW9uTWFwcGluZyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtU3VwcG9ydGVkUGVybWlzc2lvbnMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYmFzaWMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcG9zaXRvcnkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGgiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPCEtLSByZW5kaXRpb25zIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5UmVuZGl0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlYWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVJlbmRpdGlvbktpbmQiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp0aHVtYm5haWwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZW5kaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWFtSWQiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im1pbWV0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJraW5kIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJoZWlnaHQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9IndpZHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25Eb2N1bWVudElkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIGVsZW1lbnRzIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIEFsbG93YWJsZUFjdGlvbnMKLQkJCQlEb2N1bWVudCBUeXBlCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0iY21pczpjbWlzUXVlcnlUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIFF1ZXJ5IERvY3VtZW50IFR5cGUKLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhY2wiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJVGhpcyBpcyB0aGUgcm9vdCB0YWcgZm9yIGEgQ01JUyBBQ0wgRG9jdW1lbnQgVHlwZQotCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gdHlwZSBtdXRhYmlsaXR5IC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZU11dGFiaWxpdHlDYXBhYmlsaXRpZXNUeXBlIj4gCi0JCTx4czpzZXF1ZW5jZT4gCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4gCi0JPC94czpjb21wbGV4VHlwZT4gCi0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0NyZWF0YWJsZVByb3BlcnR5VHlwZXNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ3JlYXRlIiB0eXBlPSJjbWlzOmVudW1Qcm9wZXJ0eVR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc05ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lc3BhY2UiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkaXNwbGF5TmFtZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImZpbGVhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmdWxsdGV4dEluZGV4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udHJvbGxhYmxlUG9saWN5IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRyb2xsYWJsZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTwhLS0gZmVhdHVyZSBleHRlbnNpb25zIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzRXh0ZW5zaW9uRmVhdHVyZUtleVZhbHVlUGFpciI+CQotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ia2V5IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPiAKLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzRXh0ZW5zaW9uRmVhdHVyZVR5cGUiPgkKLQkJPHhzOnNlcXVlbmNlPgotCQkJPCEtLSBpZCBpcyB0aGUgb25seSBtYW5kYXRvcnkgZmllbGQgLSB0eXBpY2FsbHkgd2lsbCBiZSBhIFVSTi0tPgotCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlkIiB0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQk8IS0tIG9wdGlvbmFsIHVybCBmb3IgYSBzaXRlIGRlc2NyaWJpbmcgdGhlIGV4dGVuc2lvbiAtLT4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ1cmwiIHR5cGU9InhzOmFueVVSSSIgLz4KLQkJCTwhLS0gb3B0aW9uYWwgc2hvcnQgbmFtZSBmb3Igc3RhbmRhcmQgaS5lLiBGb29TdGFuZGFyZCAtLT4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjb21tb25OYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8IS0tIG9wdGlvbmFsIHZlcnNpb24gbGFiZWwtLT4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ2ZXJzaW9uTGFiZWwiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmVhdHVyZURhdGEiIHR5cGU9ImNtaXM6Y21pc0V4dGVuc2lvbkZlYXR1cmVLZXlWYWx1ZVBhaXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4gCi0JCi08L3hzOnNjaGVtYT4KLQk8IS0tIEVPRiAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3Zjc5MS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi88L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1kaXN0PC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIEFzc2VtYmxpZXMgRGlzdHJpYnV0aW9uPC9uYW1lPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDwhLS0gVGhlc2UgZGVwZW5kZW5jaWVzIGFyZSB1c2VkIHRvIGJlIGFkZGVkIGluIHRoZSBhc3NhbWJseSAtLT4KLSAgICA8ZGVwZW5kZW5jaWVzPgotCi0gICAgICAgIDwhLS0gVXNlZCBmb3IgY2xpZW50LWFzc2VtYmx5LnhtbCAtLT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8IS0tIFVzZWQgZm9yIHNlcnZlci1hc3NlbWJseS54bWwgLS0+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gVXNlZCBmb3Igc2VydmVyLXdlYmFwcHMtYXNzZW1ibHkueG1sIC0tPgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gCi0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1vc2dpLWNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgRXh0ZW5kaW5nIHRoZSBkZWZhdWx0IC1QYXBhY2hlLXJlbGVhc2UgcHJvZmlsZSB1c2VkICpvbmx5KgotICAgICAgICAgICAgZHVyaW5nIHJlbGVhc2VzCi0gICAgICAgIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cGFja2FnZS1hc3NlbWJsaWVzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0YWNoPnRydWU8L2F0dGFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL21haW4vYXNzZW1ibHkvc2VydmVyLXdlYmFwcHMtYXNzZW1ibHkueG1sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvcmVsZWFzZS1zY3JpcHRzL2RlcGxveS1kaXN0LnNoIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvcmVsZWFzZS1zY3JpcHRzL2RlcGxveS1kaXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ODliZTE5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0L3JlbGVhc2Utc2NyaXB0cy9kZXBsb3ktZGlzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBVcGxvYWRzIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0gY2hlbWlzdHJ5IGNvbW1vZGl0eSBwYWNrYWdlcyBmb3IgYXBhY2hlLm9yZy9kaXN0IHJlbGVhc2Ugdm90ZQotCi0jIFZlcnNpb24gdG8gcmVsZWFzZQotVkVSU0lPTj0kMQotIyBFeGFtcGxlIG9mIHJlbGF0aXZlIGZvbGRlciBjaGVtaXN0cnktMDEzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzCi1TVEFHSU5HX0ZPTERFUj0kMgotU1RBR0lOR19SRVBPPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzCi0KLQotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLSR7VkVSU0lPTn0tc291cmNlLXJlbGVhc2UuemlwCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtJHtWRVJTSU9OfS1zb3VyY2UtcmVsZWFzZS56aXAuYXNjCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtJHtWRVJTSU9OfS1zb3VyY2UtcmVsZWFzZS56aXAubWQ1Ci0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtJHtWRVJTSU9OfS1zb3VyY2UtcmVsZWFzZS56aXAuc2hhMQotCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQtJHtWRVJTSU9OfS1wYWNrLnppcAotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50LyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWFuZHJvaWQtY2xpZW50LSR7VkVSU0lPTn0tcGFjay56aXAuYXNjCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtYW5kcm9pZC1jbGllbnQtJHtWRVJTSU9OfS1wYWNrLnppcC5tZDUKLSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJHtTVEFHSU5HX1JFUE99LyR7U1RBR0lOR19GT0xERVJ9L2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC8ke1ZFUlNJT059L2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudC0ke1ZFUlNJT059LXBhY2suemlwLnNoYTEKLQotCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlLyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS0ke1ZFUlNJT059LndhcgotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS8ke1ZFUlNJT059L2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UtJHtWRVJTSU9OfS53YXIuYXNjCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlLyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZS0ke1ZFUlNJT059Lndhci5tZDUKLSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJHtTVEFHSU5HX1JFUE99LyR7U1RBR0lOR19GT0xERVJ9L2NoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtYnJpZGdlLSR7VkVSU0lPTn0ud2FyLnNoYTEKLQotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsLyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsLSR7VkVSU0lPTn0td2l0aC1kZXBlbmRlbmNpZXMuemlwCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwtJHtWRVJTSU9OfS13aXRoLWRlcGVuZGVuY2llcy56aXAuYXNjCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwtJHtWRVJTSU9OfS13aXRoLWRlcGVuZGVuY2llcy56aXAubWQ1Ci0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwtJHtWRVJTSU9OfS13aXRoLWRlcGVuZGVuY2llcy56aXAuc2hhMQotCi0KLSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJHtTVEFHSU5HX1JFUE99LyR7U1RBR0lOR19GT0xERVJ9L2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0LyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QtJHtWRVJTSU9OfS1kb2NzLnppcAotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC0ke1ZFUlNJT059LWRvY3MuemlwLmFzYwotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC0ke1ZFUlNJT059LWRvY3MuemlwLm1kNQotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC0ke1ZFUlNJT059LWRvY3MuemlwLnNoYTEKLQotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC0ke1ZFUlNJT059LXNlcnZlci13ZWJhcHBzLnppcAotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC0ke1ZFUlNJT059LXNlcnZlci13ZWJhcHBzLnppcC5hc2MKLSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJHtTVEFHSU5HX1JFUE99LyR7U1RBR0lOR19GT0xERVJ9L2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0LyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QtJHtWRVJTSU9OfS1zZXJ2ZXItd2ViYXBwcy56aXAubWQ1Ci0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC8ke1ZFUlNJT059L2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0LSR7VkVSU0lPTn0tc2VydmVyLXdlYmFwcHMuemlwLnNoYTEKLQotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLW9zZ2ktY2xpZW50LyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLW9zZ2ktY2xpZW50LSR7VkVSU0lPTn0uamFyCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQtJHtWRVJTSU9OfS5qYXIuYXNjCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQtJHtWRVJTSU9OfS5qYXIubWQ1Ci0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQtJHtWRVJTSU9OfS5qYXIuc2hhMQotCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci8ke1ZFUlNJT059L2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyLSR7VkVSU0lPTn0ud2FyCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci8ke1ZFUlNJT059L2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyLSR7VkVSU0lPTn0ud2FyLmFzYwotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci0ke1ZFUlNJT059Lndhci5tZDUKLSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJHtTVEFHSU5HX1JFUE99LyR7U1RBR0lOR19GT0xERVJ9L2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyLyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXItJHtWRVJTSU9OfS53YXIuc2hhMQotCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoLyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC0ke1ZFUlNJT059LWZ1bGwuemlwCi0gd2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICR7U1RBR0lOR19SRVBPfS8ke1NUQUdJTkdfRk9MREVSfS9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoLyR7VkVSU0lPTn0vY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC0ke1ZFUlNJT059LWZ1bGwuemlwLmFzYwotIHdnZXQgLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAke1NUQUdJTkdfUkVQT30vJHtTVEFHSU5HX0ZPTERFUn0vY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC8ke1ZFUlNJT059L2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gtJHtWRVJTSU9OfS1mdWxsLnppcC5tZDUKLSB3Z2V0IC0tbm8tY2hlY2stY2VydGlmaWNhdGUgJHtTVEFHSU5HX1JFUE99LyR7U1RBR0lOR19GT0xERVJ9L2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvJHtWRVJTSU9OfS9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoLSR7VkVSU0lPTn0tZnVsbC56aXAuc2hhMQotCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9yZWxlYXNlLXNjcmlwdHMvcHVibGlzaC1yZWxlYXNlLnNoIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3QvcmVsZWFzZS1zY3JpcHRzL3B1Ymxpc2gtcmVsZWFzZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmI5N2VjNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9yZWxlYXNlLXNjcmlwdHMvcHVibGlzaC1yZWxlYXNlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSNQdWJsaXNoZXMgZGlzdCBhcnRpZmFjdHMgYW5kIHN0YWdlcyBDTVMgc2l0ZSB0byBwcm9kdWN0aW9uCi0KLSMgVmVyc2lvbiB0byByZWxlYXNlCi1WRVJTSU9OPSQxCi1UQVJHRVRfRElTVF9ESVI9L3d3dy93d3cuYXBhY2hlLm9yZy9kaXN0L2NoZW1pc3RyeS9vcGVuY21pcy8ke1ZFUlNJT059Ci0KLSMgRGVwbG95cyBkaXN0IHBhY2thZ2VzCi1lY2hvICJEZXBsb3lpbmcgZGlzdCBwYWNrYWdlcyIKLW1rZGlyICR7VEFSR0VUX0RJU1RfRElSfSAKLWNwIH4vcHVibGljX2h0bWwvY2hlbWlzdHJ5L29wZW5jbWlzLyR7VkVSU0lPTn0vZGlzdC8qICR7VEFSR0VUX0RJU1RfRElSfQotCi1lY2hvICJQdWJsaXNoaW5nIHNpdGUgd2l0aCBDTVMiCi1wdWJsaXNoLnBsIGNoZW1pc3RyeSAke1VTRVJ9Ci0KLWVjaG8gIlJlbGVhc2UgcHVzaGVkIgotCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9zcmMvbWFpbi9hc3NlbWJseS9zZXJ2ZXItd2ViYXBwcy1hc3NlbWJseS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtZGlzdC9zcmMvbWFpbi9hc3NlbWJseS9zZXJ2ZXItd2ViYXBwcy1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNjBiNDIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3Qvc3JjL21haW4vYXNzZW1ibHkvc2VydmVyLXdlYmFwcHMtYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSAgICA8IS0tCi0gICAgICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IKLSAgICAgICAgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICAgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nCi0gICAgICAgIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIHlvdSB1bmRlciB0aGUKLSAgICAgICAgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlCi0gICAgICAgIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgotICAgICAgICBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0gICAgICAgIGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZAotICAgICAgICB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gICAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gICAgICAgIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAtLT4KLTxhc3NlbWJseQotICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjEgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4xLnhzZCI+Ci0gICAgPCEtLSBUbyBidWlsZCB0aGlzLCBydW4gIm12biBwYWNrYWdlIGFzc2VtYmx5OmFzc2VtYmx5IiAtLT4KLSAgICA8aWQ+c2VydmVyLXdlYmFwcHM8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM6Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHA8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM6Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmU8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM6Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczpjaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1zZXJ2ZXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgIDwvZGVwZW5kZW5jeVNldHM+Ci0gICAgPGZpbGVTZXRzPgotICAgICAgICA8IS0tIGxpY2Vuc2UsIHJlYWRtZSwgZXRjLiBjYWxjdWxhdGVkIGF0IGJ1aWxkIHRpbWUgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMvTUVUQS1JTkY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPkRFUEVOREVOQ0lFUzwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5OT1RJQ0U8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5ERVBFTkRFTkNJRVM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3Qvc3JjL21haW4vcmVzb3VyY2VzL0RFUEVOREVOQ0lFUyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0L3NyYy9tYWluL3Jlc291cmNlcy9ERVBFTkRFTkNJRVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Y2EzZDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3Qvc3JjL21haW4vcmVzb3VyY2VzL0RFUEVOREVOQ0lFUworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotQ2hlbWlzdHJ5IE9wZW5DTUlTIGRpc3RyaWJ1dGlvbiBwYWNrYWdlCi0KLUZvciBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGRlcGVuZGVuY2llcyB1c2VkIGJ5IEpBUnMvV0FScyBjb250YWluZWQgaW4gdGhpcyBwYWNrYWdlLCAKLXBsZWFzZSByZWZlciB0byB0aGUgTUVUQS1JTkYvREVQRU5ERU5DSUVTIGZpbGUgY29udGFpbmVkIGluIGVhY2ggT3BlbkNNSVMgYXJ0aWZhY3QgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3Qvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1kaXN0L3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMmZiNDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLWRpc3Qvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUNoZW1pc3RyeSBPcGVuQ01JUyBkaXN0cmlidXRpb24gcGFja2FnZQotCi1Gb3IgYSBjb21wbGV0ZSBsaXN0aW5nIG9mIExpY2Vuc2UgTm90aWNlcyBmb3IgM3JkIHBhcnR5IGxpYnJhcmllcyBzaGlwcGVkIGJ5IEpBUnMvV0FScyBjb250YWluZWQgaW4gdGhpcyBwYWNrYWdlLAotcGxlYXNlIHJlZmVyIHRvIHRoZSBNRVRBLUlORi9OT1RJQ0UgZmlsZSBjb250YWluZWQgaW4gZWFjaCBPcGVuQ01JUyBhcnRpZmFjdC4KLQotCi1PcGVuQ01JUyBjb250YWlucyBjb2RlIGZyb20gdGhlIGZvbGxvd2luZyBPcGVuIFNvdXJjZSBwcm9qZWN0czoKLQotLSBCYXNlNjQgCi0gIENvcHlyaWdodCAoYykgMjAxMCBSb2JlcnQgSGFyZGVyCi0gIFB1YmxpYyBEb21haW4sIDxodHRwOi8vaWhhcmRlci5uZXQvYmFzZTY0PgotCi0tIEpTT04uc2ltcGxlCi0gIENvcHlyaWdodCAoYykgMjAxMiBZaWRvbmcgRmFuZwotICBBcGFjaGUgTGljZW5zZSAyLjAsIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPgotICAKLSAgCi1PcGVuQ01JUyBjb250YWlucyBPQVNJUyBDTUlTIDEuMCBhbmQgQ01JUyAxLjEgc2NoZW1hIGFuZCBXU0RMIGZpbGVzLgotQ29weXJpZ2h0IChjKSAyMDEwIGFuZCAyMDEzIE9BU0lTIE9wZW4KLTxodHRwczovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2NtaXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLW9zZ2kvY2hlbWlzdHJ5LW9wZW5jbWlzLW9zZ2ktY2xpZW50L3BvbS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4OTRhMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLW9zZ2ktY2xpZW50PC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIE9TR2kgQ2xpZW50IFdyYXBwZXI8L25hbWU+Ci0KLSAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtmZWxpeC5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxFbWJlZC1EZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICo7c2NvcGU9Y29tcGlsZSxydW50aW1lO2lubGluZT1mYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgPC9FbWJlZC1EZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPEVtYmVkLVRyYW5zaXRpdmU+ZmFsc2U8L0VtYmVkLVRyYW5zaXRpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RW1iZWQtRGlyZWN0b3J5PmxpYjwvRW1iZWQtRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5zbGY0ajtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuc2xmNGouaW1wbDtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC53cy4qO3ZlcnNpb249IlsyLjEuNywzLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC5pbnRlcm5hbC4qO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY3hmLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi4qO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvSW1wb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8X2V4cG9ydGNvbnRlbnRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudDt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuKjt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuKjt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufTstbm9pbXBvcnQ6PXRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259Oy1ub2ltcG9ydDo9dHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnhtbC53cy4qO3ZlcnNpb249IlsyLjEuNywzLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgPC9fZXhwb3J0Y29udGVudHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLURvY1VSTD4ke3Byb2plY3QudXJsfTwvQnVuZGxlLURvY1VSTD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtQWN0aXZhdG9yPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5vc2dpLkFjdGl2YXRvcjwvQnVuZGxlLUFjdGl2YXRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtQWN0aXZhdGlvblBvbGljeT5sYXp5PC9CdW5kbGUtQWN0aXZhdGlvblBvbGljeT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMmM0NWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLW9zZ2kvY2hlbWlzdHJ5LW9wZW5jbWlzLW9zZ2ktY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIFhNTCBSZXNvbHZlciBsaWJyYXJ5Ci0gIExpY2Vuc2U6IEFwYWNoZSAyICAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCkKLQotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBXb29kc3RveCAoaHR0cDovL3dvb2RzdG94LmNvZGVoYXVzLm9yZykKLSAgTGljZW5zZTogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQpCi0KLQotVGhpcyBjb3B5IG9mIFdvb2RzdG94IFhNTCBwcm9jZXNzb3IgaXMgbGljZW5zZWQgdW5kZXIgdGhlCi1BcGFjaGUgKFNvZnR3YXJlKSBMaWNlbnNlLCB2ZXJzaW9uIDIuMCAoInRoZSBMaWNlbnNlIikuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIGRldGFpbHMgYWJvdXQgZGlzdHJpYnV0aW9uIHJpZ2h0cywgYW5kIHRoZQotc3BlY2lmaWMgcmlnaHRzIHJlZ2FyZGluZyBkZXJpdmF0ZSB3b3Jrcy4KLQotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLUEgY29weSBpcyBhbHNvIGluY2x1ZGVkIHdpdGggYm90aCB0aGUgdGhlIGRvd25sb2FkYWJsZSBzb3VyY2UgY29kZSBwYWNrYWdlCi1hbmQgamFyIHRoYXQgY29udGFpbnMgY2xhc3MgYnl0ZWNvZGVzLCBhcyBmaWxlICJBU0wgMi4wIi4gSW4gYm90aCBjYXNlcywKLXRoYXQgZmlsZSBzaG91bGQgYmUgbG9jYXRlZCBuZXh0IHRvIHRoaXMgZmlsZTogaW4gc291cmNlIGRpc3RyaWJ1dGlvbgotdGhlIGxvY2F0aW9uIHNob3VsZCBiZSAicmVsZWFzZS1ub3Rlcy9hc2wiOyBhbmQgaW4gamFyICJNRVRBLUlORi8iCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gU3RheDIgQVBJIChodHRwOi8vd29vZHN0b3guY29kZWhhdXMub3JnL1N0QVgyKQotICBMaWNlbnNlOiBUaGUgQlNEIExpY2Vuc2UgIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKLQotCi1Db3B5cmlnaHQgKGMpIDIwMDQtMjAxMCwgV29vZHN0b3ggUHJvamVjdCAoaHR0cDovL3dvb2RzdG94LmNvZGVoYXVzLm9yZy8pCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0xLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0zLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBXb29kc3RveCBYTUwgUHJvY2Vzc29yIG5vciB0aGUgbmFtZXMKLSAgIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi1BTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi1MSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi1JTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLUFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBTdHJlYW1pbmcgQVBJIGZvciBYTUwgKGh0dHA6Ly9zdGF4LmNvZGVoYXVzLm9yZykKLSAgTGljZW5zZTogRHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyICAoaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sKQotLSBTdEFYLUV4IFByb2plY3QgKGh0dHBzOi8vc3RheC1leC5kZXYuamF2YS5uZXQvc3RheC1leCkKLSAgTGljZW5zZTogQ29tbW9uIERldmVsb3BtZW50IEFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgIChodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpCi0tIFN1biBKQVhCIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBSdW50aW1lIChodHRwczovL2pheGIuZGV2LmphdmEubmV0LykKLSAgTGljZW5zZTogRHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyICAoaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sKQotLSBTdW4gU0FBSiBTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbiAoaHR0cHM6Ly9zYWFqLmRldi5qYXZhLm5ldC8pCi0gIExpY2Vuc2U6IER1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MiAgKGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCkKLS0gWE1MIFN0cmVhbSBCdWZmZXIgUHJvamVjdCAoaHR0cHM6Ly94bWxzdHJlYW1idWZmZXIuZGV2LmphdmEubmV0LykKLSAgTGljZW5zZTogRHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyICAoaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sKQotLSBKQVgtV1MgKEpTUi0yMjQpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoaHR0cHM6Ly9qYXgtd3MuZGV2LmphdmEubmV0Ly8pIAotICBMaWNlbnNlOiBEdWFsIGxpY2Vuc2UgY29uc2lzdGluZyBvZiB0aGUgQ0RETCB2MS4wIGFuZCBHUEwgdjIgIChodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwpCi0tIEphdmFCZWFucyhUTSkgQWN0aXZhdGlvbiBGcmFtZXdvcmsgU3BlY2lmaWNhdGlvbiAoaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamFmMTEtMTM5ODE1Lmh0bWwpCi0gIExpY2Vuc2U6IENvbW1vbiBEZXZlbG9wbWVudCBBbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wICAoaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKQotLSBKYXZhIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcgKGh0dHBzOi8vamF4Yi5kZXYuamF2YS5uZXQvKQotICBMaWNlbnNlOiBDb21tb24gRGV2ZWxvcG1lbnQgQW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAgKGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCkKLS0gU0FBSiBBUEkgKGh0dHBzOi8vc2Fhai5kZXYuamF2YS5uZXQvKQotICBMaWNlbnNlOiBEdWFsIGxpY2Vuc2UgY29uc2lzdGluZyBvZiB0aGUgQ0RETCB2MS4wIGFuZCBHUEwgdjIgIChodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwpCi0tIEpBWC1XUyAoSlNSLTIyNCkgQVBJIChodHRwczovL2pheC13cy5kZXYuamF2YS5uZXQvKSAKLSAgTGljZW5zZTogRHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyICAoaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sKQotLSBtaW1lcHVsbCAoaHR0cHM6Ly9taW1lcHVsbC5kZXYuamF2YS5uZXQpCi0gIExpY2Vuc2U6IENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jZGRsMS5waHApCi0gIExpY2Vuc2U6IEdQTHYyIHdpdGggY2xhc3NwYXRoIGV4Y2VwdGlvbiAgKGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sKQotCi0KLSAgICAgIENPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpCi0KLSAgICAgIDEuIERlZmluaXRpb25zLgotICAgICAgICAgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdAotICAgICAgICAgICAgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4KLSAgICAgICAgICAgIDEuMi4gIkNvbnRyaWJ1dG9yIFZlcnNpb24iIG1lYW5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUKLSAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQotICAgICAgICAgICAgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICAgIHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCi0gICAgICAgICAgICAxLjMuICJDb3ZlcmVkIFNvZnR3YXJlIiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvcgotICAgICAgICAgICAgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMKLSAgICAgICAgICAgIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nCi0gICAgICAgICAgICBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuCi0gICAgICAgICAgICAxLjQuICJFeGVjdXRhYmxlIiBtZWFucyB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBhbnkgZm9ybQotICAgICAgICAgICAgb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4gCi0gICAgICAgICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5Ci0gICAgICAgICAgICB0aGF0IGZpcnN0IG1ha2VzIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGlzCi0gICAgICAgICAgICBMaWNlbnNlLiAKLSAgICAgICAgICAgIDEuNi4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZAotICAgICAgICAgICAgU29mdHdhcmUgb3IgcG9ydGlvbnMgdGhlcmVvZiB3aXRoIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZQotICAgICAgICAgICAgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotICAgICAgICAgICAgMS43LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4KLSAgICAgICAgICAgIDEuOC4gIkxpY2Vuc2FibGUiIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZQotICAgICAgICAgICAgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwKLSAgICAgICAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cwotICAgICAgICAgICAgY29udmV5ZWQgaGVyZWluLgotICAgICAgICAgICAgMS45LiAiTW9kaWZpY2F0aW9ucyIgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlCi0gICAgICAgICAgICBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgICAgICAgIEEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLAotICAgICAgICAgICAgICAgICAgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEKLSAgICAgICAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cwotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uczsgCi0gICAgICAgICAgICAgICAgICBCLiBBbnkgbmV3IGZpbGUgdGhhdCBjb250YWlucyBhbnkgcGFydCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgCi0gICAgICAgICAgICAgICAgICBDLiBBbnkgbmV3IGZpbGUgdGhhdCBpcyBjb250cmlidXRlZCBvciBvdGhlcndpc2UgbWFkZQotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0gICAgICAgICAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQKLSAgICAgICAgICAgIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMKLSAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAKLSAgICAgICAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQKLSAgICAgICAgICAgIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwKLSAgICAgICAgICAgIG1ldGhvZCwgcHJvY2VzcywgYW5kIGFwcGFyYXR1cyBjbGFpbXMsIGluIGFueSBwYXRlbnQKLSAgICAgICAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gCi0gICAgICAgICAgICAxLjEyLiAiU291cmNlIENvZGUiIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIKLSAgICAgICAgICAgIHNvZnR3YXJlIGNvZGUgaW4gd2hpY2ggbW9kaWZpY2F0aW9ucyBhcmUgbWFkZSBhbmQgKGIpCi0gICAgICAgICAgICBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0gICAgICAgICAgICAxLjEzLiAiWW91IiAob3IgIllvdXIiKSBtZWFucyBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwKLSAgICAgICAgICAgIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZgotICAgICAgICAgICAgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSIKLSAgICAgICAgICAgIGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzCi0gICAgICAgICAgICB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMKLSAgICAgICAgICAgIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IKLSAgICAgICAgICAgIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaAotICAgICAgICAgICAgZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yIG90aGVyd2lzZSwgb3IgKGIpIG93bmVyc2hpcAotICAgICAgICAgICAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcwotICAgICAgICAgICAgb3IgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0gICAgICAyLiBMaWNlbnNlIEdyYW50cy4gCi0gICAgICAgICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4KLSAgICAgICAgICAgIENvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kCi0gICAgICAgICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZQotICAgICAgICAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLAotICAgICAgICAgICAgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6IAotICAgICAgICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsCi0gICAgICAgICAgICAgICAgICB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLAotICAgICAgICAgICAgICAgICAgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsCi0gICAgICAgICAgICAgICAgICBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgCi0gICAgICAgICAgICAgICAgICAoYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywKLSAgICAgICAgICAgICAgICAgIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUKLSAgICAgICAgICAgICAgICAgIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yCi0gICAgICAgICAgICAgICAgICBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKS4gCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4xKGEpIGFuZCAoYikKLSAgICAgICAgICAgICAgICAgIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QKLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICBMaWNlbnNlLiAKLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudAotICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGNvZGUgdGhhdCBZb3UgZGVsZXRlIGZyb20KLSAgICAgICAgICAgICAgICAgIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIpIGZvciBpbmZyaW5nZW1lbnRzCi0gICAgICAgICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgICAgICAgU29mdHdhcmUsIG9yIChpaSkgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbAotICAgICAgICAgICAgICAgICAgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLiAKLSAgICAgICAgICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAotICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoCi0gICAgICAgICAgICBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwKLSAgICAgICAgICAgIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLSAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCi0gICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvCi0gICAgICAgICAgICAgICAgICB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlCi0gICAgICAgICAgICAgICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTW9kaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHN1Y2gKLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuCi0gICAgICAgICAgICAgICAgICB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzCi0gICAgICAgICAgICAgICAgICBDb3ZlcmVkIFNvZnR3YXJlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsCi0gICAgICAgICAgICAgICAgICB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdAotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgICBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaAotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLAotICAgICAgICAgICAgICAgICAgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zCi0gICAgICAgICAgICAgICAgICB0aGVyZW9mKTsgYW5kICgyKSB0aGUgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24KLSAgICAgICAgICAgICAgICAgIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4gCi0gICAgICAgICAgICAgICAgICAoYykgVGhlIGxpY2Vuc2VzIGdyYW50ZWQgaW4gU2VjdGlvbnMgMi4yKGEpIGFuZAotICAgICAgICAgICAgICAgICAgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QKLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuIAotICAgICAgICAgICAgICAgICAgKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9uIDIuMihiKSBhYm92ZSwgbm8gcGF0ZW50Ci0gICAgICAgICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvcgotICAgICAgICAgICAgICAgICAgaGFzIGRlbGV0ZWQgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjsgKDIpIGZvcgotICAgICAgICAgICAgICAgICAgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKSB0aGlyZCBwYXJ0eQotICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZQotICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAgIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyCi0gICAgICAgICAgICAgICAgICBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZQotICAgICAgICAgICAgICAgICAgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4gCi0gICAgICAzLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0gICAgICAgICAgICAzLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLSAgICAgICAgICAgIEFueSBDb3ZlcmVkIFNvZnR3YXJlIHRoYXQgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UKLSAgICAgICAgICAgIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZQotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLiBZb3UgbXVzdAotICAgICAgICAgICAgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUKLSAgICAgICAgICAgIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3IKLSAgICAgICAgICAgIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZS4gWW91IG11c3QgaW5mb3JtIHJlY2lwaWVudHMgb2YgYW55Ci0gICAgICAgICAgICBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbgotICAgICAgICAgICAgb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEKLSAgICAgICAgICAgIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZAotICAgICAgICAgICAgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotICAgICAgICAgICAgMy4yLiBNb2RpZmljYXRpb25zLgotICAgICAgICAgICAgVGhlIE1vZGlmaWNhdGlvbnMgdGhhdCBZb3UgY3JlYXRlIG9yIHRvIHdoaWNoIFlvdQotICAgICAgICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91Ci0gICAgICAgICAgICByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIKLSAgICAgICAgICAgIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBZb3UgaGF2ZSBzdWZmaWNpZW50IHJpZ2h0cyB0bwotICAgICAgICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0gICAgICAgICAgICAzLjMuIFJlcXVpcmVkIE5vdGljZXMuCi0gICAgICAgICAgICBZb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zCi0gICAgICAgICAgICB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLgotICAgICAgICAgICAgWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvcgotICAgICAgICAgICAgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IKLSAgICAgICAgICAgIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcKLSAgICAgICAgICAgIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0gICAgICAgICAgICAzLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi0gICAgICAgICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkCi0gICAgICAgICAgICBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgYWx0ZXJzIG9yIHJlc3RyaWN0cyB0aGUKLSAgICAgICAgICAgIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMnCi0gICAgICAgICAgICByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhCi0gICAgICAgICAgICBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eQotICAgICAgICAgICAgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLgotICAgICAgICAgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbgotICAgICAgICAgICAgYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdQotICAgICAgICAgICAgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwKLSAgICAgICAgICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5Ci0gICAgICAgICAgICBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbAotICAgICAgICAgICAgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZAotICAgICAgICAgICAgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YKLSAgICAgICAgICAgIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLSAgICAgICAgICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCi0gICAgICAgICAgICBZb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZAotICAgICAgICAgICAgU29mdHdhcmUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBvciB1bmRlciB0aGUgdGVybXMKLSAgICAgICAgICAgIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMKLSAgICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluCi0gICAgICAgICAgICBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUKLSAgICAgICAgICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdAotICAgICAgICAgICAgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudCdzIHJpZ2h0cyBpbiB0aGUgU291cmNlIENvZGUgZm9ybQotICAgICAgICAgICAgZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdQotICAgICAgICAgICAgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYQotICAgICAgICAgICAgZGlmZmVyZW50IGxpY2Vuc2UsIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0Ci0gICAgICAgICAgICBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdQotICAgICAgICAgICAgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdQotICAgICAgICAgICAgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5Ci0gICAgICAgICAgICBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbAotICAgICAgICAgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMKLSAgICAgICAgICAgIFlvdSBvZmZlci4KLSAgICAgICAgICAgIDMuNi4gTGFyZ2VyIFdvcmtzLgotICAgICAgICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgICAgICAgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICAgICAgICBhbmQgZGlzdHJpYnV0ZSB0aGUgTGFyZ2VyIFdvcmsgYXMgYSBzaW5nbGUgcHJvZHVjdC4gSW4gc3VjaAotICAgICAgICAgICAgYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UKLSAgICAgICAgICAgIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiAKLSAgICAgIDQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLiAKLSAgICAgICAgICAgIDQuMS4gTmV3IFZlcnNpb25zLgotICAgICAgICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpcyB0aGUgaW5pdGlhbCBsaWNlbnNlIHN0ZXdhcmQgYW5kCi0gICAgICAgICAgICBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICAgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQotICAgICAgICAgICAgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIEV4Y2VwdCBhcyBwcm92aWRlZCBpbgotICAgICAgICAgICAgU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZQotICAgICAgICAgICAgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4gCi0gICAgICAgICAgICA0LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0gICAgICAgICAgICBZb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkCi0gICAgICAgICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEKLSAgICAgICAgICAgIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZwotICAgICAgICAgICAgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueQotICAgICAgICAgICAgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZAotICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAotICAgICAgICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0bwotICAgICAgICAgICAgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlCi0gICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlCi0gICAgICAgICAgICBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLiAKLSAgICAgICAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuCi0gICAgICAgICAgICBXaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhCi0gICAgICAgICAgICBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kCi0gICAgICAgICAgICB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUKLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICBsaWNlbnNlIHN0ZXdhcmQgKGV4Y2VwdCB0byBub3RlIHRoYXQgdGhlIGxpY2Vuc2UgZGlmZmVycwotICAgICAgICAgICAgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQKLSAgICAgICAgICAgIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZS4KLSAgICAgIDUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiCi0gICAgICBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELAotICAgICAgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMgVEhBVCBUSEUgQ09WRVJFRAotICAgICAgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSCi0gICAgICBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5ECi0gICAgICBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRCBTT0ZUV0FSRSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWQotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRQotICAgICAgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YKLSAgICAgIEFOWSBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GCi0gICAgICBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRgotICAgICAgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMKLSAgICAgIERJU0NMQUlNRVIuIAotICAgICAgNi4gVEVSTUlOQVRJT04uIAotICAgICAgICAgICAgNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbAotICAgICAgICAgICAgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMKLSAgICAgICAgICAgIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mCi0gICAgICAgICAgICBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpcgotICAgICAgICAgICAgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZgotICAgICAgICAgICAgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuCi0gICAgICAgICAgICA2LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcKLSAgICAgICAgICAgIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IKLSAgICAgICAgICAgIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0Ci0gICAgICAgICAgICB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyAiUGFydGljaXBhbnQiKQotICAgICAgICAgICAgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlCi0gICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yCi0gICAgICAgICAgICBvciB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIHRoZQotICAgICAgICAgICAgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueQotICAgICAgICAgICAgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yCi0gICAgICAgICAgICBpbmRpcmVjdGx5IHRvIFlvdSBieSBzdWNoIFBhcnRpY2lwYW50LCB0aGUgSW5pdGlhbAotICAgICAgICAgICAgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkKLSAgICAgICAgICAgIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMKLSAgICAgICAgICAgIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudAotICAgICAgICAgICAgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24KLSAgICAgICAgICAgIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkKLSAgICAgICAgICAgIHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlCi0gICAgICAgICAgICBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyCi0gICAgICAgICAgICB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoCi0gICAgICAgICAgICBQYXJ0aWNpcGFudC4KLSAgICAgICAgICAgIDYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDYuMSBvciA2LjIKLSAgICAgICAgICAgIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkCi0gICAgICAgICAgICBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbgotICAgICAgICAgICAgKGV4Y2x1ZGluZyBsaWNlbnNlcyBncmFudGVkIHRvIFlvdSBieSBhbnkgZGlzdHJpYnV0b3IpCi0gICAgICAgICAgICBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotICAgICAgNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0gICAgICBVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVAotICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUKLSAgICAgIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRgotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSwgT1IgQU5ZIFNVUFBMSUVSIE9GIEFOWSBPRiBTVUNIIFBBUlRJRVMsIEJFCi0gICAgICBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUgotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUCi0gICAgICBMSU1JVEFUSU9OLCBEQU1BR0VTIEZPUiBMT1NUIFBST0ZJVFMsIExPU1MgT0YgR09PRFdJTEwsIFdPUksKLSAgICAgIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUgotICAgICAgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTgotICAgICAgSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GCi0gICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwKLSAgICAgIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZJ1MgTkVHTElHRU5DRSBUTyBUSEUgRVhURU5UCi0gICAgICBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8KLSAgICAgIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUgotICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBTTyBUSElTIEVYQ0xVU0lPTiBBTkQgTElNSVRBVElPTiBNQVkgTk9UCi0gICAgICBBUFBMWSBUTyBZT1UuCi0gICAgICA4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotICAgICAgVGhlIENvdmVyZWQgU29mdHdhcmUgaXMgYSAiY29tbWVyY2lhbCBpdGVtLCIgYXMgdGhhdCB0ZXJtIGlzCi0gICAgICBkZWZpbmVkIGluIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAiY29tbWVyY2lhbAotICAgICAgY29tcHV0ZXIgc29mdHdhcmUiIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gwqQKLSAgICAgIDI1Mi4yMjctNzAxNChhKSgxKSkgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlCi0gICAgICBkb2N1bWVudGF0aW9uIiBhcyBzdWNoIHRlcm1zIGFyZSB1c2VkIGluIDQ4IEMuRi5SLiAxMi4yMTIgKFNlcHQuCi0gICAgICAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xCi0gICAgICB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzCi0gICAgICBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLgotICAgICAgVGhpcyBVLlMuIEdvdmVybm1lbnQgUmlnaHRzIGNsYXVzZSBpcyBpbiBsaWV1IG9mLCBhbmQgc3VwZXJzZWRlcywKLSAgICAgIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMKLSAgICAgIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KLSAgICAgIDkuIE1JU0NFTExBTkVPVVMuCi0gICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdAotICAgICAgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZQotICAgICAgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUKLSAgICAgIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlCi0gICAgICBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlCi0gICAgICBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAoZXhjZXB0IHRvIHRoZSBleHRlbnQKLSAgICAgIGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoCi0gICAgICBqdXJpc2RpY3Rpb24ncyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gQW55IGxpdGlnYXRpb24KLSAgICAgIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YKLSAgICAgIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYQotICAgICAgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCB3aXRoIHRoZSBsb3NpbmcKLSAgICAgIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0Ci0gICAgICBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMnIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUKLSAgICAgIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlCi0gICAgICBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yCi0gICAgICByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwKLSAgICAgIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuCi0gICAgICBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlCi0gICAgICBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQKLSAgICAgIGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsCi0gICAgICBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KLSAgICAgIDEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLgotICAgICAgQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcwotICAgICAgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvcgotICAgICAgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlCi0gICAgICBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvCi0gICAgICBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nCi0gICAgICBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbgotICAgICAgb2YgbGlhYmlsaXR5LgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIFNMRjRKIEFQSSBNb2R1bGUgKGh0dHA6Ly93d3cuc2xmNGoub3JnKQotICBMaWNlbnNlOiBNSVQgTGljZW5zZSAgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQotCi0KLUNvcHlyaWdodCAoYykgMjAwNC0yMDEzIFFPUy5jaAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlICBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gYSAgY29weSAgb2YgdGhpcyAgc29mdHdhcmUgIGFuZCAgYXNzb2NpYXRlZCAgZG9jdW1lbnRhdGlvbiBmaWxlcyAgKHRoZQotICJTb2Z0d2FyZSIpLCB0byAgZGVhbCBpbiAgdGhlIFNvZnR3YXJlIHdpdGhvdXQgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSB3aXRob3V0IGxpbWl0YXRpb24gIHRoZSByaWdodHMgdG8gIHVzZSwgY29weSwgbW9kaWZ5LCAgbWVyZ2UsIHB1Ymxpc2gsCi0gZGlzdHJpYnV0ZSwgIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsICBjb3BpZXMgb2YgIHRoZSBTb2Z0d2FyZSwgIGFuZCB0bwotIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlICBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gCi0gVGhlICBhYm92ZSAgY29weXJpZ2h0ICBub3RpY2UgIGFuZCAgdGhpcyBwZXJtaXNzaW9uICBub3RpY2UgIHNoYWxsICBiZQotIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIAotIFRIRSAgU09GVFdBUkUgSVMgIFBST1ZJREVEICAiQVMgIElTIiwgV0lUSE9VVCAgV0FSUkFOVFkgIE9GIEFOWSAgS0lORCwKLSBFWFBSRVNTIE9SICBJTVBMSUVELCBJTkNMVURJTkcgIEJVVCBOT1QgTElNSVRFRCAgVE8gVEhFICBXQVJSQU5USUVTIE9GCi0gTUVSQ0hBTlRBQklMSVRZLCAgICBGSVRORVNTICAgIEZPUiAgICBBICAgUEFSVElDVUxBUiAgICBQVVJQT1NFICAgIEFORAotIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS9jaGVtaXN0cnktb3BlbmNtaXMtb3NnaS1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1vc2dpL2NoZW1pc3RyeS1vcGVuY21pcy1vc2dpLWNsaWVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTMxZDY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1vc2dpL2NoZW1pc3RyeS1vcGVuY21pcy1vc2dpLWNsaWVudC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi1PcGVuQ01JUyBPU0dpIENsaWVudCBXcmFwcGVyCi1Db3B5cmlnaHQgMjAwOS0yMDE1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0KLU9wZW5DTUlTIGNvbnRhaW5zIGNvZGUgZnJvbSB0aGUgZm9sbG93aW5nIE9wZW4gU291cmNlIHByb2plY3RzOgotCi0tIEJhc2U2NCAKLSAgQ29weXJpZ2h0IChjKSAyMDEwIFJvYmVydCBIYXJkZXIKLSAgUHVibGljIERvbWFpbiwgPGh0dHA6Ly9paGFyZGVyLm5ldC9iYXNlNjQ+Ci0KLS0gSlNPTi5zaW1wbGUKLSAgQ29weXJpZ2h0IChjKSAyMDEyIFlpZG9uZyBGYW5nCi0gIEFwYWNoZSBMaWNlbnNlIDIuMCwgPGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc29uLXNpbXBsZS8+Ci0gIAotICAKLU9wZW5DTUlTIGNvbnRhaW5zIE9BU0lTIENNSVMgMS4wIGFuZCBDTUlTIDEuMSBzY2hlbWEgYW5kIFdTREwgZmlsZXMuCi1Db3B5cmlnaHQgKGMpIDIwMTAgYW5kIDIwMTMgT0FTSVMgT3BlbgotPGh0dHBzOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvY21pcz4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1nZXR0aW5nLXN0YXJ0ZWQvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1nZXR0aW5nLXN0YXJ0ZWQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwMTVmZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtZ2V0dGluZy1zdGFydGVkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi0gICAgPCEtLQotICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0gICAgICAgIGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZAotICAgICAgICB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gICAgICAgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gICAgICAgIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj5MQVRFU1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPCEtLSBQcm9qZWN0IEluZm9ybWF0aW9uIC0tPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWdldHRpbmdzdGFydGVkPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBDaGVtaXN0cnkgT3BlbkNNSVMgR2V0dGluZyBTdGFydGVkIEV4YW1wbGU8L25hbWU+Ci0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KLSAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC91cmw+Ci0gICAgPC9vcmdhbml6YXRpb24+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3Q8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXZhPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZG9jLkdldHRpbmdTdGFydGVkPC9tYWluQ2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj5MQVRFU1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1nZXR0aW5nLXN0YXJ0ZWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9kb2MvR2V0dGluZ1N0YXJ0ZWQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1nZXR0aW5nLXN0YXJ0ZWQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9kb2MvR2V0dGluZ1N0YXJ0ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3MjQ2Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtZ2V0dGluZy1zdGFydGVkL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZG9jL0dldHRpbmdTdGFydGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5kb2M7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZpbGVhYmxlQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVsYXRpb25zaGlwVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlbmRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLk9wZXJhdGlvbkNvbnRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLlNlc3Npb25GYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2xDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBlcm1pc3Npb25NYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UmVuZGl0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotCi1wdWJsaWMgY2xhc3MgR2V0dGluZ1N0YXJ0ZWQgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgU3RhcnRlZC4uLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIFNlc3Npb25GYWN0b3J5IGFuZCBzZXQgdXAgdGhlIFNlc3Npb25QYXJhbWV0ZXIgbWFwCi0gICAgICAgIFNlc3Npb25GYWN0b3J5IHNlc3Npb25GYWN0b3J5ID0gU2Vzc2lvbkZhY3RvcnlJbXBsLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgLy8gdXNlciBjcmVkZW50aWFscyAtIHVzaW5nIHRoZSBzdGFuZGFyZCBhZG1pbi9hZG1pbgotCi0gICAgICAgIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSLCAiYWRtaW4iKTsKLSAgICAgICAgcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCAiYWRtaW4iKTsKLQotICAgICAgICAvLyBjb25uZWN0aW9uIHNldHRpbmdzIC0gd2UncmUgY29ubmVjdGluZyB0byBhIHB1YmxpYyBjbWlzIHJlcG8sCi0gICAgICAgIC8vIHVzaW5nIHRoZSBBdG9tUFVCIGJpbmRpbmcsIGJ1dCB0aGVyZSBhcmUgb3RoZXIgb3B0aW9ucyBoZXJlLAotICAgICAgICAvLyBvciB5b3UgY2FuIHN1YnN0aXR1dGUgeW91ciBvd24gVVJMCi0gICAgICAgIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCwgCi0gICAgICAgICJodHRwOi8vcmVwby5vcGVuY21pcy5vcmcvaW5tZW1vcnkvYXRvbS8iKTsKLSAgICAgICAgLy8gImh0dHA6Ly9jbWlzLmFsZnJlc2NvLmNvbS9jbWlzYXRvbSIpOwotICAgICAgICAvLyAiaHR0cDovL2NtaXMuYWxmcmVzY28uY29tL3NlcnZpY2UvY21pcyIpOwotICAgICAgICAvLyAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2FsZnJlc2NvL3NlcnZpY2UvYXBpL2NtaXMiKTsKLSAgICAgICAgcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQVRPTVBVQi52YWx1ZSgpKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFjY2Vzc2luZyBBVE9NUFVCX1VSTDogIiArIHBhcmFtZXRlci5nZXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCkKLSAgICAgICAgICAgICAgICArICIgdXNlcmlkOiAiICsgcGFyYW1ldGVyLmdldChTZXNzaW9uUGFyYW1ldGVyLlVTRVIpICsgIiBwYXNzd29yZDogIgotICAgICAgICAgICAgICAgICsgcGFyYW1ldGVyLmdldChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JEKSk7Ci0KLSAgICAgICAgLy8gZmluZCBhbGwgdGhlIHJlcG9zaXRvcmllcyBhdCB0aGlzIFVSTCAtIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZS4KLSAgICAgICAgTGlzdDxSZXBvc2l0b3J5PiByZXBvc2l0b3JpZXMgPSBuZXcgQXJyYXlMaXN0PFJlcG9zaXRvcnk+KCk7Ci0gICAgICAgIHJlcG9zaXRvcmllcyA9IHNlc3Npb25GYWN0b3J5LmdldFJlcG9zaXRvcmllcyhwYXJhbWV0ZXIpOwotICAgICAgICBmb3IgKFJlcG9zaXRvcnkgciA6IHJlcG9zaXRvcmllcykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCByZXBvc2l0b3J5OiAiICsgci5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHNlc3Npb24gd2l0aCB0aGUgZmlyc3QgKGFuZCBvbmx5KSByZXBvc2l0b3J5Ci0gICAgICAgIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IHJlcG9zaXRvcmllcy5nZXQoMCk7Ci0gICAgICAgIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5SRVBPU0lUT1JZX0lELCByZXBvc2l0b3J5LmdldElkKCkpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzZXNzaW9uRmFjdG9yeS5jcmVhdGVTZXNzaW9uKHBhcmFtZXRlcik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgYSBjb25uZWN0aW9uIHRvIHJlcG9zaXRvcnk6ICIgKyByZXBvc2l0b3J5LmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIiwgd2l0aCBpZDogIiArIHJlcG9zaXRvcnkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgLy8gLy8gQW4gZXhhbXBsZSBvZiBjcmVhdGluZyBhIHNlc3Npb24gd2l0aCBhIGtub3duIHJlcG9zaXRvcnkgaWQuCi0gICAgICAgIC8vIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5SRVBPU0lUT1JZX0lELCAiQTEiKTsKLSAgICAgICAgLy8gU2Vzc2lvbiBzZXNzaW9uID0gc2Vzc2lvbkZhY3RvcnkuY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXIpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbnl0aGluZyB0aGF0IHdhcyBjcmVhdGVkIGJ5IGEgcHJldmlvdXMgcnVuIG9mIHRoaXMgcHJvZ3JhbQotICAgICAgICBjbGVhbnVwKHNlc3Npb24pOwotCi0gICAgICAgIC8vIEdldCBldmVyeXRoaW5nIGluIHRoZSByb290IGZvbGRlciBhbmQgcHJpbnQgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzCi0gICAgICAgIEZvbGRlciByb290ID0gc2Vzc2lvbi5nZXRSb290Rm9sZGVyKCk7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCB0aGUgZm9sbG93aW5nIG9iamVjdHMgaW4gdGhlIHJvb3QgZm9sZGVyOi0iKTsKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0IG8gOiBjaGlsZHJlbikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0TmFtZSgpICsgIiB3aGljaCBpcyBvZiB0eXBlICIgKyBvLmdldFR5cGUoKS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5GaWxlIGFuZCBGb2xkZXJzLi4uIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIC8vIEFkZCBhIG5ldyBmb2xkZXIgdG8gdGhlIHJvb3QgZm9sZGVyCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgJ0FER05ld0ZvbGRlcicgaW4gdGhlIHJvb3QgZm9sZGVyIik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbmV3Rm9sZGVyUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpmb2xkZXIiKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk5BTUUsICJBREdOZXdGb2xkZXIiKTsKLSAgICAgICAgRm9sZGVyIG5ld0ZvbGRlciA9IHJvb3QuY3JlYXRlRm9sZGVyKG5ld0ZvbGRlclByb3BzKTsKLQotICAgICAgICAvLyBEaWQgaXQgd29yaz8KLSAgICAgICAgY2hpbGRyZW4gPSByb290LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm93IGZpbmRpbmcgdGhlIGZvbGxvd2luZyBvYmplY3RzIGluIHRoZSByb290IGZvbGRlcjotIik7Ci0gICAgICAgIGZvciAoQ21pc09iamVjdCBvIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgYSBzaW1wbGUgdGV4dCBkb2N1bWVudCBpbiB0aGUgbmV3IGZvbGRlcgotICAgICAgICAvLyBGaXJzdCwgY3JlYXRlIHRoZSBjb250ZW50IHN0cmVhbQotICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dEZpbGVOYW1lID0gInRlc3QudHh0IjsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGluZyBhIHNpbXBsZSB0ZXh0IGRvY3VtZW50LCAiICsgdGV4dEZpbGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIG1pbWV0eXBlID0gInRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgiOwotICAgICAgICBTdHJpbmcgY29udGVudCA9ICJUaGlzIGlzIHNvbWUgdGVzdCBjb250ZW50LiI7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHRleHRGaWxlTmFtZTsKLQotICAgICAgICBieXRlW10gYnVmID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1ZiA9IGNvbnRlbnQuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWYpOwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBzZXNzaW9uLmdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVDb250ZW50U3RyZWFtKGZpbGVuYW1lLAotICAgICAgICAgICAgICAgIGJ1Zi5sZW5ndGgsIG1pbWV0eXBlLCBpbnB1dCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBEb2N1bWVudCBPYmplY3QKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpkb2N1bWVudCIpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBmaWxlbmFtZSk7Ci0gICAgICAgIE9iamVjdElkIGlkID0gbmV3Rm9sZGVyLmNyZWF0ZURvY3VtZW50KHByb3BlcnRpZXMsIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZS5OT05FKTsKLQotICAgICAgICAvLyBEaWQgaXQgd29yaz8KLSAgICAgICAgLy8gR2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgYnkgaWQKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KSBzZXNzaW9uLmdldE9iamVjdChpZCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudEFzU3RyaW5nKGRvYy5nZXRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgYnkgcGF0aAotICAgICAgICBTdHJpbmcgcGF0aCA9IG5ld0ZvbGRlci5nZXRQYXRoKCkgKyAiLyIgKyB0ZXh0RmlsZU5hbWU7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2V0dGluZyBvYmplY3QgYnkgcGF0aCAiICsgcGF0aCk7Ci0gICAgICAgIGRvYyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3RCeVBhdGgocGF0aCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudEFzU3RyaW5nKGRvYy5nZXRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50cyBvZiAiICsgZG9jLmdldE5hbWUoKSArICIgYXJlOiAiICsgY29udGVudCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIERvY3VtZW50IE9iamVjdCB3aXRoIG5vIGNvbnRlbnQgc3RyZWFtCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRpbmcgYSBkb2N1bWVudCAgY2FsbGVkIHRlc3ROb0NvbnRlbnQgd2l0aCBubyBDb250ZW50U3RyZWFtIik7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpkb2N1bWVudCIpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAidGVzdE5vQ29udGVudCIpOwotICAgICAgICBuZXdGb2xkZXIuY3JlYXRlRG9jdW1lbnQocHJvcGVydGllcywgbnVsbCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBkb2N1bWVudCBhbmQgdGhlbiB1cGRhdGUgaXRzIG5hbWUKLSAgICAgICAgZmluYWwgU3RyaW5nIHRleHRGaWxlTmFtZTIgPSAidGVzdDIudHh0IjsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGluZyBhIHNpbXBsZSB0ZXh0IGRvY3VtZW50LCAiICsgdGV4dEZpbGVOYW1lMik7Ci0gICAgICAgIG1pbWV0eXBlID0gInRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgiOwotICAgICAgICBjb250ZW50ID0gIlRoaXMgaXMgc29tZSB0ZXN0IGNvbnRlbnQgZm9yIG91ciBzZWNvbmQgZG9jdW1lbnQuIjsKLSAgICAgICAgZmlsZW5hbWUgPSB0ZXh0RmlsZU5hbWUyOwotCi0gICAgICAgIGJ1ZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWYgPSBjb250ZW50LmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmKTsKLSAgICAgICAgY29udGVudFN0cmVhbSA9IHNlc3Npb24uZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUNvbnRlbnRTdHJlYW0oZmlsZW5hbWUsIGJ1Zi5sZW5ndGgsCi0gICAgICAgICAgICAgICAgbWltZXR5cGUsIGlucHV0KTsKLSAgICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgImNtaXM6ZG9jdW1lbnQiKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgZmlsZW5hbWUpOwotICAgICAgICBPYmplY3RJZCBpZDIgPSBuZXdGb2xkZXIuY3JlYXRlRG9jdW1lbnQocHJvcGVydGllcywgY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlLk5PTkUpOwotCi0gICAgICAgIERvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KGlkMik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVuYW1pbmcgIiArIGRvYzIuZ2V0TmFtZSgpICsgIiB0byB0ZXN0My50eHQiKTsKLSAgICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAidGVzdDMudHh0Iik7Ci0gICAgICAgIGlkMiA9IGRvYzIudXBkYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZW5hbWVkIHRvICIgKyBkb2MyLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBjb250ZW50IHN0cmVhbQotICAgICAgICBpZiAoIXNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRDb250ZW50U3RyZWFtVXBkYXRlc0NhcGFiaWxpdHkoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLkFOWVRJTUUpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVwZGF0ZSB3aXRob3V0IGNoZWNrb3V0IG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyByZXBvc2l0b3J5Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVwZGF0aW5nIGNvbnRlbnQgc3RyZWFtIik7Ci0gICAgICAgICAgICBjb250ZW50ID0gIlRoaXMgaXMgc29tZSB1cGRhdGVkIHRlc3QgY29udGVudCBmb3Igb3VyIHJlbmFtZWQgc2Vjb25kIGRvY3VtZW50LiI7Ci0gICAgICAgICAgICBidWYgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBidWYgPSBjb250ZW50LmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1Zik7Ci0gICAgICAgICAgICBjb250ZW50U3RyZWFtID0gc2Vzc2lvbi5nZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlQ29udGVudFN0cmVhbSgidGVzdDMudHh0IiwgYnVmLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgbWltZXR5cGUsIGlucHV0KTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpkb2N1bWVudCIpOwotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgInRlc3QzLnR4dCIpOwotICAgICAgICAgICAgZG9jMi5zZXRDb250ZW50U3RyZWFtKGNvbnRlbnRTdHJlYW0sIHRydWUpOwotCi0gICAgICAgICAgICAvLyBkaWQgaXQgd29yaz8KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29udGVudCA9IGdldENvbnRlbnRBc1N0cmluZyhkb2MyLmdldENvbnRlbnRTdHJlYW0oKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudHMgb2YgIiArIGRvYzIuZ2V0TmFtZSgpICsgIiBhcmU6ICIgKyBjb250ZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZvcmNlIGFuZCBoYW5kbGUgYSBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbgotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuRXhjZXB0aW9ucy4uLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3JjaW5nIGFuZCBoYW5kbGluZyBhIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24iKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvYzIuc2V0Q29udGVudFN0cmVhbShudWxsLCBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2F1Z2h0IGFuICIgKyBlMS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgZXhjZXB0aW9uIHdpdGggbWVzc2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICsgZTEuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlbGV0ZSBhIGRvY3VtZW50Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Nb3JlIGZpbGVzIGFuZCBmb2xkZXJzLi4uIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBjaGlsZHJlbiA9IG5ld0ZvbGRlci5nZXRDaGlsZHJlbigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdyBmaW5kaW5nIHRoZSBmb2xsb3dpbmcgb2JqZWN0cyBpbiBvdXIgZm9sZGVyOi0iKTsKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0IG8gOiBjaGlsZHJlbikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlbGV0aW5nIGRvY3VtZW50ICIgKyBkb2MyLmdldE5hbWUoKSk7Ci0gICAgICAgIGRvYzIuZGVsZXRlKHRydWUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vdyBmaW5kaW5nIHRoZSBmb2xsb3dpbmcgb2JqZWN0cyBpbiBvdXIgZm9sZGVyOi0iKTsKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0IG8gOiBjaGlsZHJlbikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBmb2xkZXIgdHJlZSwgYW5kIGRlbGV0ZSBpdAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nICdBREdGb2xkZXIxJyBpbiB0aGUgcm9vdCBmb2xkZXIiKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpmb2xkZXIiKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk5BTUUsICJBREdGb2xkZXIxIik7Ci0gICAgICAgIEZvbGRlciBmb2xkZXIxID0gcm9vdC5jcmVhdGVGb2xkZXIobmV3Rm9sZGVyUHJvcHMpOwotICAgICAgICBuZXdGb2xkZXJQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZvbGRlcjExIik7Ci0gICAgICAgIEZvbGRlciBmb2xkZXIxMSA9IGZvbGRlcjEuY3JlYXRlRm9sZGVyKG5ld0ZvbGRlclByb3BzKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk5BTUUsICJBREdGb2xkZXIxMiIpOwotICAgICAgICBGb2xkZXIgZm9sZGVyMTIgPSBmb2xkZXIxLmNyZWF0ZUZvbGRlcihuZXdGb2xkZXJQcm9wcyk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZGVsZXRlIHRoZSAnQURHRm9sZGVyMScgdHJlZSIpOwotICAgICAgICBmb2xkZXIxLmRlbGV0ZVRyZWUodHJ1ZSwgVW5maWxlT2JqZWN0LkRFTEVURSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgZm9sZGVyIHRyZWUgdG8gbmF2aWdhdGUgdGhyb3VnaAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIGZvbGRlciB0cmVlIGZvciBuYXZpZ2F0aW9uIik7Ci0gICAgICAgIG5ld0ZvbGRlclByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld0ZpbGVQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIG5ld0ZvbGRlclByb3BzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgImNtaXM6Zm9sZGVyIik7Ci0gICAgICAgIG5ld0ZvbGRlclByb3BzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiQURHRm9sZGVyMSIpOwotICAgICAgICBmb2xkZXIxID0gcm9vdC5jcmVhdGVGb2xkZXIobmV3Rm9sZGVyUHJvcHMpOwotCi0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsICJjbWlzOmRvY3VtZW50Iik7Ci0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZpbGUxZjEiKTsKLSAgICAgICAgZm9sZGVyMS5jcmVhdGVEb2N1bWVudChuZXdGaWxlUHJvcHMsIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZS5OT05FKTsKLQotICAgICAgICBuZXdGb2xkZXJQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZvbGRlcjExIik7Ci0gICAgICAgIGZvbGRlcjExID0gZm9sZGVyMS5jcmVhdGVGb2xkZXIobmV3Rm9sZGVyUHJvcHMpOwotCi0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsICJjbWlzOmRvY3VtZW50Iik7Ci0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZpbGUxMWYxIik7Ci0gICAgICAgIGZvbGRlcjExLmNyZWF0ZURvY3VtZW50KG5ld0ZpbGVQcm9wcywgY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlLk5PTkUpOwotCi0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsICJjbWlzOmRvY3VtZW50Iik7Ci0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZpbGUxMWYyIik7Ci0gICAgICAgIGZvbGRlcjExLmNyZWF0ZURvY3VtZW50KG5ld0ZpbGVQcm9wcywgY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlLk5PTkUpOwotCi0gICAgICAgIG5ld0ZvbGRlclByb3BzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiQURHRm9sZGVyMTExIik7Ci0gICAgICAgIGZvbGRlcjExLmNyZWF0ZUZvbGRlcihuZXdGb2xkZXJQcm9wcyk7Ci0KLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk5BTUUsICJBREdGb2xkZXIxMTIiKTsKLSAgICAgICAgZm9sZGVyMTEuY3JlYXRlRm9sZGVyKG5ld0ZvbGRlclByb3BzKTsKLQotICAgICAgICBuZXdGb2xkZXJQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZvbGRlcjEyIik7Ci0gICAgICAgIGZvbGRlcjEyID0gZm9sZGVyMS5jcmVhdGVGb2xkZXIobmV3Rm9sZGVyUHJvcHMpOwotCi0gICAgICAgIG5ld0ZvbGRlclByb3BzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiQURHRm9sZGVyMTIxIik7Ci0gICAgICAgIEZvbGRlciBmb2xkZXIxMjEgPSBmb2xkZXIxMi5jcmVhdGVGb2xkZXIobmV3Rm9sZGVyUHJvcHMpOwotCi0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsICJjbWlzOmRvY3VtZW50Iik7Ci0gICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZpbGUxMjFmMSIpOwotICAgICAgICBmb2xkZXIxMjEuY3JlYXRlRG9jdW1lbnQobmV3RmlsZVByb3BzLCBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUuTk9ORSk7Ci0KLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk5BTUUsICJBREdGb2xkZXIxMjIiKTsKLSAgICAgICAgZm9sZGVyMTIuY3JlYXRlRm9sZGVyKG5ld0ZvbGRlclByb3BzKTsKLQotICAgICAgICAvLyBOYXZpZ2F0aW5nIHRoZSBvYmplY3QgdHJlZQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuTmF2aWdhdGluZyB0aGUgb2JqZWN0IHRyZWUuLi4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIC8vIEdldCB0aGUgY2hpbGRyZW4gb2YgZm9sZGVyMQotICAgICAgICBjaGlsZHJlbiA9IGZvbGRlcjEuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGlsZHJlbiBvZiAiICsgZm9sZGVyMS5nZXROYW1lKCkgKyAiOi0iKTsKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0IG8gOiBjaGlsZHJlbikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgZGVzY2VuZGFudHMgb2YgZm9sZGVyMQotICAgICAgICBpZiAoIXNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5pc0dldERlc2NlbmRhbnRzU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RGVzY2VuZGFudHMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHJlcG9zaXRvcnkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY2VuZGFudHMgb2YgIiArIGZvbGRlcjEuZ2V0TmFtZSgpICsgIjotIik7Ci0gICAgICAgICAgICBmb3IgKFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0PiB0IDogZm9sZGVyMS5nZXREZXNjZW5kYW50cygtMSkpIHsKLSAgICAgICAgICAgICAgICBwcmludFRyZWUodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIGZvbGRlcnRyZWUgb2YgZm9sZGVyMQotICAgICAgICBpZiAoIXNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5pc0dldEZvbGRlclRyZWVTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRGb2xkZXJUcmVlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyByZXBvc2l0b3J5Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvbGRlcnRyZWUgZm9yICIgKyBmb2xkZXIxLmdldE5hbWUoKSArICI6LSIpOwotICAgICAgICAgICAgZm9yIChUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4gdCA6IGZvbGRlcjEuZ2V0Rm9sZGVyVHJlZSgtMSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEZvbGRlclRyZWUodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQYWdpbmcKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblBhZ2luZy4uLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgZm9sZGVycyBmb3IgcGFnaW5nIGV4YW1wbGUiKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpmb2xkZXIiKTsKLSAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk5BTUUsICJBREdGb2xkZXJQYWdpbmciKTsKLSAgICAgICAgRm9sZGVyIGZvbGRlclBhZ2luZyA9IHJvb3QuY3JlYXRlRm9sZGVyKG5ld0ZvbGRlclByb3BzKTsKLSAgICAgICAgY3JlYXRlRm9sZGVycyhmb2xkZXJQYWdpbmcsIDEwKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgcGFnZSBvZiBsZW5ndGggMyBmcm9tIGl0ZW0gNSIpOwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQgPSBuZXcgT3BlcmF0aW9uQ29udGV4dEltcGwoKTsKLSAgICAgICAgb3BlcmF0aW9uQ29udGV4dC5zZXRNYXhJdGVtc1BlclBhZ2UoMyk7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBjaGlsZHJlbjEgPSBmb2xkZXJQYWdpbmcuZ2V0Q2hpbGRyZW4ob3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoQ21pc09iamVjdCBjaGlsZCA6IGNoaWxkcmVuMS5za2lwVG8oNSkuZ2V0UGFnZSgpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm9iamVjdCAiICsgY291bnQgKyAiIGluIHBhZ2Ugb2YgIiArIGNoaWxkcmVuMS5nZXRQYWdlTnVtSXRlbXMoKQotICAgICAgICAgICAgICAgICAgICArICIgaXMgIiArIGNoaWxkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZXR0aW5nIGNvbXBsZXRlIHJlc3VsdCBzZXQgaW4gcGFnZXMgb2YgMyIpOwotICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKCk7Ci0gICAgICAgIG9wZXJhdGlvbkNvbnRleHQuc2V0TWF4SXRlbXNQZXJQYWdlKDMpOwotICAgICAgICBjaGlsZHJlbjEgPSBmb2xkZXJQYWdpbmcuZ2V0Q2hpbGRyZW4ob3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIGludCBwYWdlTnVtYmVyID0gMDsKLSAgICAgICAgYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICBjb3VudD0gMDsKLSAgICAgICAgd2hpbGUgKCFmaW5pc2hlZCkgewotICAgICAgICAgICAgSXRlbUl0ZXJhYmxlPENtaXNPYmplY3Q+IGN1cnJlbnRQYWdlID0gY2hpbGRyZW4xLnNraXBUbyhjb3VudCkuZ2V0UGFnZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYWdlICIgKyBwYWdlTnVtYmVyICsgIiBoYXMgIiArIGN1cnJlbnRQYWdlLmdldFBhZ2VOdW1JdGVtcygpICsgIiBpdGVtcyIpOwotICAgICAgICAgICAgZm9yIChDbWlzT2JqZWN0IGl0ZW0gOiBjdXJyZW50UGFnZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib2JqZWN0ICIgKyBjb3VudCArICAiIGlzICIgKyBpdGVtLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhZ2VOdW1iZXIrKzsKLSAgICAgICAgICAgIGlmICghY3VycmVudFBhZ2UuZ2V0SGFzTW9yZUl0ZW1zKCkpCi0gICAgICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHlwZXMKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblR5cGVzLi4uIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0iKTsKLSAgICAgICAgLy8gTG9vayBhdCB0aGUgdHlwZSBkZWZpbml0aW9uCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2V0dGluZyB0eXBlIGRlZmluaXRpb24gZm9yIGRvYyIpOwotICAgICAgICBPYmplY3RUeXBlIG9iamVjdFR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKGRvYy5nZXRUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9jIGlzIG9mIHR5cGUgIiArIG9iamVjdFR5cGUuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaXNCYXNlVHlwZSgpIHJldHVybnMgIiArIChvYmplY3RUeXBlLmlzQmFzZVR5cGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKLSAgICAgICAgT2JqZWN0VHlwZSBiYXNlVHlwZSA9IG9iamVjdFR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICAgICAgaWYgKGJhc2VUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0QmFzZVR5cGUoKSByZXR1cm5zIG51bGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0QmFzZVR5cGUoKSByZXR1cm5zICIgKyBiYXNlVHlwZS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3RUeXBlIHBhcmVudFR5cGUgPSBvYmplY3RUeXBlLmdldFBhcmVudFR5cGUoKTsKLSAgICAgICAgaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRQYXJlbnRUeXBlKCkgcmV0dXJucyBudWxsIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFBhcmVudFR5cGUoKSByZXR1cm5zICIgKyBwYXJlbnRUeXBlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGlzdGluZyBjaGlsZCB0eXBlcyBvZiAiICsgb2JqZWN0VHlwZS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgZm9yIChPYmplY3RUeXBlIG8gOiBvYmplY3RUeXBlLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgby5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgaW1tZWRpYXRlIGRlc2NlbmRhbnQgdHlwZXMgb2YgIiArIG9iamVjdFR5cGUuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIGZvciAoVHJlZTxPYmplY3RUeXBlPiBvIDogb2JqZWN0VHlwZS5nZXREZXNjZW5kYW50cygxKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBvLmdldEl0ZW0oKS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Qcm9wZXJ0aWVzLi4uIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAvLyBMb29rIGF0IGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgZG9jdW1lbnQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRvYy5nZXROYW1lKCkgKyAiIHByb3BlcnRpZXMgc3RhcnQiKTsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eTw/Pj4gcHJvcHMgPSBkb2MuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBmb3IgKFByb3BlcnR5PD8+IHAgOiBwcm9wcykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHAuZ2V0RGVmaW5pdGlvbigpLmdldERpc3BsYXlOYW1lKCkgKyAiPSIgKyBwLmdldFZhbHVlc0FzU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkb2MuZ2V0TmFtZSgpICsgIiBwcm9wZXJ0aWVzIGVuZCIpOwotCi0gICAgICAgIC8vIEdldCBzb21lIGRvY3VtZW50IHByb3BlcnRpZXMgZXhwbGljaXRseQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlcnNpb25MYWJlbCBwcm9wZXJ0eSBvbiAiICsgZG9jLmdldE5hbWUoKSArICIgaXMgIgotICAgICAgICAgICAgICAgICsgZG9jLmdldFZlcnNpb25MYWJlbCgpKTsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJJcyB0aGlzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiAiICsgZG9jLmdldE5hbWUoKSArCi0gICAgICAgIC8vICIgPzogICIKLSAgICAgICAgLy8gKyAoZG9jLmlzTGF0ZXN0VmVyc2lvbigpID8gInllcyIgOiAibm8iKSk7Ci0KLSAgICAgICAgLy8gZ2V0IGEgcHJvcGVydHkgYnkgaWQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXQgcHJvcGVydHkgYnkgcHJvcGVydHkgaWQiKTsKLSAgICAgICAgUHJvcGVydHk8Pz4gc29tZVByb3BlcnR5ID0gcHJvcHMuZ2V0KDApOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc29tZVByb3BlcnR5LmdldERpc3BsYXlOYW1lKCkgKyAiIHByb3BlcnR5IG9uICIgKyBkb2MuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiIChieSBnZXRQcm9wZXJ0VmFsdWUoKSkgaXMgIiArIGRvYy5nZXRQcm9wZXJ0eVZhbHVlKHNvbWVQcm9wZXJ0eS5nZXRJZCgpKSk7Ci0KLSAgICAgICAgLy8gZ2V0IGEgcHJvcGVydHkgYnkgcXVlcnkgbmFtZQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldCBwcm9wZXJ0eSBieSBxdWVyeSBuYW1lIik7Ci0gICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0UXVlcnlDYXBhYmlsaXR5KCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKENhcGFiaWxpdHlRdWVyeS5NRVRBREFUQU9OTFkpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bGwgc2VhcmNoIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgY21pczpuYW1lID0gJ3Rlc3QudHh0JyI7Ci0gICAgICAgICAgICBJdGVtSXRlcmFibGU8UXVlcnlSZXN1bHQ+IHF1ZXJ5UmVzdWx0ID0gc2Vzc2lvbi5xdWVyeShxdWVyeSwgZmFsc2UpOwotICAgICAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBpdGVtIDogcXVlcnlSZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByb3BlcnR5IGNtaXM6Y3JlYXRlZEJ5IG9uIHRlc3QudHh0IGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaXRlbS5nZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKCJjbWlzOmNyZWF0ZWRCeSIpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWxlbmRhciA9IGRvYy5nZXRDcmVhdGlvbkRhdGUoKTsKLSAgICAgICAgU3RyaW5nIERBVEVfRk9STUFUID0gInl5eXlNTWRkIjsKLSAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChEQVRFX0ZPUk1BVCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpb24gZGF0ZSBvZiAiICsgZG9jLmdldE5hbWUoKSArICIgaXMgICIKLSAgICAgICAgICAgICAgICArIHNkZi5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblF1ZXJ5Li4uIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0iKTsKLSAgICAgICAgLy8gUXVlcnkgMSAtIG5lZWQgZnVsbCBxdWVyeSBjYXBhYmlsaXR5IGZvciB0aGlzCi0gICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0UXVlcnlDYXBhYmlsaXR5KCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKENhcGFiaWxpdHlRdWVyeS5NRVRBREFUQU9OTFkpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bGwgc2VhcmNoIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgY21pczpuYW1lIExJS0UgJ3Rlc3QlJyI7Ci0gICAgICAgICAgICBJdGVtSXRlcmFibGU8UXVlcnlSZXN1bHQ+IHEgPSBzZXNzaW9uLnF1ZXJ5KHF1ZXJ5LCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIERpZCBpdCB3b3JrPwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKipyZXN1bHRzIGZyb20gcXVlcnkgIiArIHF1ZXJ5KTsKLQotICAgICAgICAgICAgaW50IGkgPSAxOwotICAgICAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxciA6IHEpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICsgaSArICIgLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUoImNtaXM6b2JqZWN0VHlwZUlkIikuZ2V0Rmlyc3RWYWx1ZSgpICsgIiAsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcXIuZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiY21pczpuYW1lIikuZ2V0Rmlyc3RWYWx1ZSgpICsgIiAsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcXIuZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiY21pczpjcmVhdGVkQnkiKS5nZXRGaXJzdFZhbHVlKCkgKyAiICwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBxci5nZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKCJjbWlzOm9iamVjdElkIikuZ2V0Rmlyc3RWYWx1ZSgpICsgIiAsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcXIuZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiY21pczpjb250ZW50U3RyZWFtRmlsZU5hbWUiKS5nZXRGaXJzdFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcXIuZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiY21pczpjb250ZW50U3RyZWFtTWltZVR5cGUiKS5nZXRGaXJzdFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcXIuZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiY21pczpjb250ZW50U3RyZWFtTGVuZ3RoIikuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFF1ZXJ5IDIKLSAgICAgICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBjbWlzOm5hbWUgTElLRSAndGVzdCUudHh0JyBBTkQgQ09OVEFJTlMoJ3Rlc3QnKSI7Ci0gICAgICAgICAgICBxID0gc2Vzc2lvbi5xdWVyeShxdWVyeSwgZmFsc2UpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKnJlc3VsdHMgZnJvbSBxdWVyeSAiICsgcXVlcnkpOwotCi0gICAgICAgICAgICBpID0gMTsKLSAgICAgICAgICAgIGZvciAoUXVlcnlSZXN1bHQgcXIgOiBxKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiArIGkgKyAiICwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBxci5nZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKCJjbWlzOm9iamVjdFR5cGVJZCIpLmdldEZpcnN0VmFsdWUoKSArICIgLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUoImNtaXM6bmFtZSIpLmdldEZpcnN0VmFsdWUoKSArICIgLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUoImNtaXM6Y3JlYXRlZEJ5IikuZ2V0Rmlyc3RWYWx1ZSgpICsgIiAsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcXIuZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiY21pczpvYmplY3RJZCIpLmdldEZpcnN0VmFsdWUoKSArICIgLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUoImNtaXM6Y29udGVudFN0cmVhbUZpbGVOYW1lIikuZ2V0Rmlyc3RWYWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUoImNtaXM6Y29udGVudFN0cmVhbU1pbWVUeXBlIikuZ2V0Rmlyc3RWYWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUoImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCIpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWR2YW5jZWQgdXNlIG9mIHR5cGVzCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5BZHZhbmNlZCB1c2Ugb2YgdHlwZXMuLi4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluZGluZyBhbiBleGlzdGluZyBkb2N1bWVudCBvZiBhbiBhZHZhbmNlZCB0eXBlIik7Ci0gICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0UXVlcnlDYXBhYmlsaXR5KCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKENhcGFiaWxpdHlRdWVyeS5NRVRBREFUQU9OTFkpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bGwgc2VhcmNoIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NIGlhOmNhbGVuZGFyRXZlbnQiOwotICAgICAgICAgICAgSXRlbUl0ZXJhYmxlPFF1ZXJ5UmVzdWx0PiBxdWVyeVJlc3VsdCA9IHNlc3Npb24ucXVlcnkocXVlcnksIGZhbHNlKTsKLSAgICAgICAgICAgIGZvciAoUXVlcnlSZXN1bHQgaXRlbSA6IHF1ZXJ5UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGl0ZW0uZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiY21pczpuYW1lIikuZ2V0Rmlyc3RWYWx1ZSgpICsgIiBvZiB0eXBlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaXRlbS5nZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKCJjbWlzOm9iamVjdFR5cGVJZCIpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwcm9wZXJ0eSBpYTpkZXNjcmlwdGlvbkV2ZW50IGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaXRlbS5nZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKCJpYTpkZXNjcmlwdGlvbkV2ZW50IikuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByb3BlcnR5IGlhOnRvRGF0ZSBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGl0ZW0uZ2V0UHJvcGVydHlCeVF1ZXJ5TmFtZSgiaWE6dG9EYXRlIikuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInByb3BlcnR5IGlhOmZyb21EYXRlIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaXRlbS5nZXRQcm9wZXJ0eUJ5UXVlcnlOYW1lKCJpYTpmcm9tRGF0ZSIpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYXBhYmlsaXRpZXMKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNhcGFiaWxpdGllcy4uLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAvLyBDaGVjayB3aGF0IGNhcGFiaWxpdGllcyBvdXIgcmVwb3NpdG9yeSBzdXBwb3J0cwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50aW5nIHJlcG9zaXRvcnkgY2FwYWJpbGl0aWVzLi4uIik7Ci0gICAgICAgIGZpbmFsIFJlcG9zaXRvcnlJbmZvIHJlcEluZm8gPSBzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCk7Ci0gICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgY2FwID0gcmVwSW5mby5nZXRDYXBhYmlsaXRpZXMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbk5hdmlnYXRpb24gQ2FwYWJpbGl0aWVzIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZXQgZGVzY2VuZGFudHMgc3VwcG9ydGVkOiAiCi0gICAgICAgICAgICAgICAgKyAoY2FwLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZXQgZm9sZGVyIHRyZWUgc3VwcG9ydGVkOiAiCi0gICAgICAgICAgICAgICAgKyAoY2FwLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpID8gInRydWUiIDogImZhbHNlIikpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuT2JqZWN0IENhcGFiaWxpdGllcyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudCBTdHJlYW06ICIgKyBjYXAuZ2V0Q29udGVudFN0cmVhbVVwZGF0ZXNDYXBhYmlsaXR5KCkudmFsdWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hhbmdlczogIiArIGNhcC5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpLnZhbHVlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlbmRpdGlvbnM6ICIgKyBjYXAuZ2V0UmVuZGl0aW9uc0NhcGFiaWxpdHkoKS52YWx1ZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkZpbGluZyBDYXBhYmlsaXRpZXMiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpZmlsaW5nIHN1cHBvcnRlZDogIgotICAgICAgICAgICAgICAgICsgKGNhcC5pc011bHRpZmlsaW5nU3VwcG9ydGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5maWxpbmcgc3VwcG9ydGVkOiAiICsgKGNhcC5pc1VuZmlsaW5nU3VwcG9ydGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmVyc2lvbiBzcGVjaWZpYyBmaWxpbmcgc3VwcG9ydGVkOiAiCi0gICAgICAgICAgICAgICAgKyAoY2FwLmlzVmVyc2lvblNwZWNpZmljRmlsaW5nU3VwcG9ydGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5WZXJzaW9uaW5nIENhcGFiaWxpdGllcyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAucHJpbnRsbigiUFdDIHNlYXJjaGFibGU6ICIgKyAoY2FwLmlzUHdjU2VhcmNoYWJsZVN1cHBvcnRlZCgpID8gInRydWUiIDogImZhbHNlIikpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBXQyBVcGRhdGFibGU6ICIgKyAoY2FwLmlzUHdjVXBkYXRhYmxlU3VwcG9ydGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsIHZlcnNpb25zIHNlYXJjaGFibGU6ICIKLSAgICAgICAgICAgICAgICArIChjYXAuaXNBbGxWZXJzaW9uc1NlYXJjaGFibGVTdXBwb3J0ZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblF1ZXJ5IENhcGFiaWxpdGllcyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUXVlcnk6ICIgKyBjYXAuZ2V0UXVlcnlDYXBhYmlsaXR5KCkudmFsdWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSm9pbjogIiArIGNhcC5nZXRKb2luQ2FwYWJpbGl0eSgpLnZhbHVlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQUNMIENhcGFiaWxpdGllcyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQUNMOiAiICsgY2FwLmdldEFjbENhcGFiaWxpdHkoKS52YWx1ZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmQgb2YgIHJlcG9zaXRvcnkgY2FwYWJpbGl0aWVzIik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkFsbG93YWJsZSBhY3Rpb25zLi4uIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgLy8gZmluZCB0aGUgY3VycmVudCBhbGxvd2FibGUgYWN0aW9ucyBmb3IgdGhlIHRlc3QudHh0IGRvY3VtZW50Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2V0dGluZyB0aGUgY3VycmVudCBhbGxvd2FibGUgYWN0aW9ucyBmb3IgdGhlICIgKyBkb2MuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiIGRvY3VtZW50IG9iamVjdC4uLiIpOwotICAgICAgICBmb3IgKEFjdGlvbiBhIDogZG9jLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgYS52YWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgb3V0IGlmIHdlIGNhbiBjdXJyZW50bHkgY2hlY2sgb3V0IHRlc3QudHh0Ci0gICAgICAgIGlmIChkb2MuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhBY3Rpb24uQ0FOX0NIRUNLX09VVCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FuIGNoZWNrIG91dCAiICsgZG9jLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbiBub3QgY2hlY2sgb3V0ICIgKyBkb2MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5NdWx0aWZpbGluZyBhbmQgVW5maWxpbmcuLi4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgLy8gVHJ5IG91dCBtdWx0aWZpbGluZyBpZiBpdCBpcyBzdXBwb3J0ZWQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcnlpbmcgb3V0IG11bHRpZmlsaW5nIik7Ci0gICAgICAgIEZvbGRlciBuZXdGb2xkZXIyID0gbnVsbDsKLSAgICAgICAgaWYgKCEoY2FwLmlzTXVsdGlmaWxpbmdTdXBwb3J0ZWQoKSkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlmaWxpbmcgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlcG9zaXRvcnkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEFkZCBhIG5ldyBmb2xkZXIgdG8gdGhlIHJvb3QgZm9sZGVyCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nICdBREdOZXdGb2xkZXIgMicgaW4gdGhlIHJvb3QgZm9sZGVyIik7Ci0gICAgICAgICAgICBuZXdGb2xkZXJQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpmb2xkZXIiKTsKLSAgICAgICAgICAgIG5ld0ZvbGRlclByb3BzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiQURHTmV3Rm9sZGVyIDIiKTsKLSAgICAgICAgICAgIG5ld0ZvbGRlcjIgPSByb290LmNyZWF0ZUZvbGRlcihuZXdGb2xkZXJQcm9wcywgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXREZWZhdWx0Q29udGV4dCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyB0ZXh0RmlsZU5hbWUgKyAidG8gJ0FER05ld0ZvbGRlciAyJyBpbiB0aGUgcm9vdCBmb2xkZXIiKTsKLSAgICAgICAgICAgIGRvYy5hZGRUb0ZvbGRlcihuZXdGb2xkZXIyLCB0cnVlKTsKLQotICAgICAgICAgICAgLy8gRGlkIGl0IHdvcms/Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ld0ZvbGRlci5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3cgZmluZGluZyB0aGUgZm9sbG93aW5nIG9iamVjdHMgaW4gdGhlICdBREdOZXdGb2xkZXInIGZvbGRlcjotIik7Ci0gICAgICAgICAgICBmb3IgKENtaXNPYmplY3QgbyA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3Rm9sZGVyMi5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiTm93IGZpbmRpbmcgdGhlIGZvbGxvd2luZyBvYmplY3RzIGluIHRoZSAnQURHTmV3Rm9sZGVyIDInIGZvbGRlcjotIik7Ci0gICAgICAgICAgICBmb3IgKENtaXNPYmplY3QgbyA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyeSBvdXQgdW5maWxpbmcgaWYgaXQgaXMgc3VwcG9ydGVkCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5aW5nIG91dCB1bmZpbGluZyIpOwotICAgICAgICBpZiAoIShjYXAuaXNVbmZpbGluZ1N1cHBvcnRlZCgpKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmZpbGluZyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcmVwb3NpdG9yeSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmVtb3ZlIG91ciBkb2N1bWVudCBmcm9tIGJvdGggZm9sZGVycwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZW1vdmluZzogIiArIGRvYy5nZXROYW1lKCkgKyAiIGZyb20gJ0FER05ld0ZvbGRlcic6LSIpOwotICAgICAgICAgICAgZG9jLnJlbW92ZUZyb21Gb2xkZXIobmV3Rm9sZGVyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVtb3Zpbmc6ICIgKyBkb2MuZ2V0TmFtZSgpICsgIiBmcm9tICdBREdOZXdGb2xkZXIgMic6LSIpOwotICAgICAgICAgICAgZG9jLnJlbW92ZUZyb21Gb2xkZXIobmV3Rm9sZGVyMik7Ci0gICAgICAgICAgICAvLyBEaWQgaXQgd29yaz8KLSAgICAgICAgICAgIERvY3VtZW50IGRvY1Rlc3QgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KGlkKTsKLSAgICAgICAgICAgIGlmIChkb2NUZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZG9jVGVzdC5nZXROYW1lKCkgKyAiIHN0aWxsIGV4aXN0cyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuUmVsYXRpb25zaGlwcy4uLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tIik7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlcG8gc3VwcG9ydHMgcmVsYXRpb25zaGlwcwotICAgICAgICBPYmplY3RUeXBlIHJlbGF0aW9uc2hpcFR5cGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVsYXRpb25zaGlwVHlwZSA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24oImNtaXM6cmVsYXRpb25zaGlwIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVwb3NpdG9yeSBkb2VzIG5vdCBzdXBwb3J0IGNtaXM6cmVsYXRpb25zaGlwIG9iamVjdHMiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9iamVjdFR5cGUgY21pc2N1c3RvbVJlbGF0aW9uc2hpcFR5cGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbWlzY3VzdG9tUmVsYXRpb25zaGlwVHlwZSA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24oIlI6Y21pc2N1c3RvbTphc3NvYyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBjbWlzY3VzdG9tUmVsYXRpb25zaGlwVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY21pc2N1c3RvbVJlbGF0aW9uc2hpcFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVwb3NpdG9yeSBkb2VzIG5vdCBzdXBwb3J0IFI6Y21pc2N1c3RvbTphc3NvYyBvYmplY3RzIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBmb2xkZXJzIGZvciByZWxhdGlvbnNoaXBzIGV4YW1wbGUiKTsKLQotICAgICAgICAgICAgICAgIG5ld0ZvbGRlclByb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpmb2xkZXIiKTsKLSAgICAgICAgICAgICAgICBuZXdGb2xkZXJQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZvbGRlckFzc29jaWF0aW9ucyIpOwotICAgICAgICAgICAgICAgIEZvbGRlciBmb2xkZXJBc3NvY2lhdGlvbnMgPSByb290LmNyZWF0ZUZvbGRlcihuZXdGb2xkZXJQcm9wcyk7Ci0KLSAgICAgICAgICAgICAgICBuZXdGaWxlUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBuZXdGaWxlUHJvcHMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiRDpjbWlzY3VzdG9tOmRvY3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgbmV3RmlsZVByb3BzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiQURHRmlsZVNvdXJjZSIpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IHNvdXJjZURvYyA9IGZvbGRlckFzc29jaWF0aW9ucy5jcmVhdGVEb2N1bWVudChuZXdGaWxlUHJvcHMsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUuTUFKT1IpOwotICAgICAgICAgICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsICJjbWlzOmRvY3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgbmV3RmlsZVByb3BzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiQURHRmlsZVRhcmdldCIpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IHRhcmdldERvYyA9IGZvbGRlckFzc29jaWF0aW9ucy5jcmVhdGVEb2N1bWVudChuZXdGaWxlUHJvcHMsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUuTUFKT1IpOwotCi0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZWxQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgICAgIHJlbFByb3BzLnB1dCgiY21pczpzb3VyY2VJZCIsIHNvdXJjZURvYy5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICByZWxQcm9wcy5wdXQoImNtaXM6dGFyZ2V0SWQiLCB0YXJnZXREb2MuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcmVsUHJvcHMucHV0KCJjbWlzOm9iamVjdFR5cGVJZCIsICJSOmNtaXNjdXN0b206YXNzb2MiKTsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmNyZWF0ZVJlbGF0aW9uc2hpcChyZWxQcm9wcywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGVkIHJlbGF0aW9uc2hpcCIpOwotCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dCA9IG5ldyBPcGVyYXRpb25Db250ZXh0SW1wbCgpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQuc2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0VHlwZSB0eXBlRGVmaW5pdGlvbiA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24oIlI6Y21pc2N1c3RvbTphc3NvYyIpOwotICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbiBkaXJlY3Rpb24gPSBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uRUlUSEVSOwotICAgICAgICAgICAgICAgIEl0ZW1JdGVyYWJsZTxSZWxhdGlvbnNoaXA+IHJlbGF0aW9uc2hpcHMgPSBzZXNzaW9uLmdldFJlbGF0aW9uc2hpcHMoc291cmNlRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZGlyZWN0aW9uLCB0eXBlRGVmaW5pdGlvbiwgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaW50IHJlbGF0aW9uc2hpcENvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiByZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcmVsYXRpb25zaGlwICIgKyByZWxhdGlvbnNoaXBDb3VudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTG9vayBhdCBhbGxvd2FibGUgc291cmNlIGFuZCB0YXJnZXQgdHlwZQotICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlIHJlbFR5cGUgPSAoUmVsYXRpb25zaGlwVHlwZSkgcmVsYXRpb25zaGlwLmdldFR5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVsVHlwZS5nZXREaXNwbGF5TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyB0aGUgZm9sbG93aW5nIGFsbG93ZWQgc291cmNlIHR5cGVzOiIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdFR5cGUgb2JqZWN0VHlwZTEgOiByZWxUeXBlLmdldEFsbG93ZWRTb3VyY2VUeXBlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIG9iamVjdFR5cGUxLmdldERpc3BsYXlOYW1lKCkgKyAiIHdpdGggUXVlcnlOYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmplY3RUeXBlMS5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVsVHlwZS5nZXREaXNwbGF5TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyB0aGUgZm9sbG93aW5nIGFsbG93ZWQgdGFyZ2V0IHR5cGVzOiIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdFR5cGUgb2JqZWN0VHlwZTEgOiByZWxUeXBlLmdldEFsbG93ZWRUYXJnZXRUeXBlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIG9iamVjdFR5cGUxLmdldERpc3BsYXlOYW1lKCkgKyAiIHdpdGggUXVlcnlOYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmplY3RUeXBlMS5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRBY2Nlc3MgQ29udHJvbC4uLiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tIik7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlcG8gc3VwcG9ydHMgQUNMcwotICAgICAgICBpZiAoIXNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRBY2xDYXBhYmlsaXR5KCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKENhcGFiaWxpdHlBY2wuTUFOQUdFKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXBvc2l0b3J5IGRvZXMgbm90IGFsbG93IEFDTCBtYW5hZ2VtZW50Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcG9zaXRvcnkgYWxsb3dzIEFDTCBtYW5hZ2VtZW50Iik7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgZm9sZGVycyBmb3IgcGVybWlzc2lvbnMgZXhhbXBsZSIpOwotCi0gICAgICAgICAgICBuZXdGb2xkZXJQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgbmV3Rm9sZGVyUHJvcHMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpmb2xkZXIiKTsKLSAgICAgICAgICAgIG5ld0ZvbGRlclByb3BzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiQURHRm9sZGVyUGVybWlzc2lvbnMiKTsKLSAgICAgICAgICAgIEZvbGRlciBmb2xkZXJBc3NvY2lhdGlvbnMgPSBzZXNzaW9uLmdldFJvb3RGb2xkZXIoKS5jcmVhdGVGb2xkZXIobmV3Rm9sZGVyUHJvcHMpOwotCi0gICAgICAgICAgICBuZXdGaWxlUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBuZXcgQ29udGVudFN0cmVhbUltcGwoInBlcm1pc3Npb25zLnR4dCIsIG51bGwsICJwbGFpbi90ZXh0IiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJzb21lIGNvbnRlbnQiLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIG5ld0ZpbGVQcm9wcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsICJjbWlzOmRvY3VtZW50Iik7Ci0gICAgICAgICAgICBuZXdGaWxlUHJvcHMucHV0KFByb3BlcnR5SWRzLk5BTUUsICJBREdGaWxlUGVybWlzc2lvbnMiKTsKLSAgICAgICAgICAgIERvY3VtZW50IHRlc3REb2MgPSBmb2xkZXJBc3NvY2lhdGlvbnMuY3JlYXRlRG9jdW1lbnQobmV3RmlsZVByb3BzLCBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUuTUFKT1IpOwotCi0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKCk7Ci0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0LnNldEluY2x1ZGVBY2xzKHRydWUpOwotICAgICAgICAgICAgdGVzdERvYyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QodGVzdERvYywgb3BlcmF0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQUNMIGJlZm9yZSBhZGRpbmcgYW4gYWNlLi4uIik7Ci0gICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiB0ZXN0RG9jLmdldEFjbCgpLmdldEFjZXMoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgYWNlOiAiICsgYWNlLmdldFByaW5jaXBhbElkKCkgKyAiIHRvU3RyaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgYWNlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIHBlcm1pc3Npb25zLmFkZCgiY21pczp3cml0ZSIpOwotICAgICAgICAgICAgU3RyaW5nIHByaW5jaXBhbCA9ICJhZG1pbiI7Ci0gICAgICAgICAgICBBY2UgYWNlSW4gPSBzZXNzaW9uLmdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVBY2UocHJpbmNpcGFsLCBwZXJtaXNzaW9ucyk7Ci0gICAgICAgICAgICBMaXN0PEFjZT4gYWNlTGlzdEluID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0gICAgICAgICAgICBhY2VMaXN0SW4uYWRkKGFjZUluKTsKLSAgICAgICAgICAgIHRlc3REb2MuYWRkQWNsKGFjZUxpc3RJbiwgQWNsUHJvcGFnYXRpb24uUkVQT1NJVE9SWURFVEVSTUlORUQpOwotICAgICAgICAgICAgdGVzdERvYyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QodGVzdERvYywgb3BlcmF0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQUNMIGFmdGVyIGFkZGluZyBhbiBhY2UuLi4iKTsKLSAgICAgICAgICAgIGZvciAoQWNlIGFjZSA6IHRlc3REb2MuZ2V0QWNsKCkuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCBhY2U6ICIgKyBhY2UuZ2V0UHJpbmNpcGFsSWQoKSArICIgdG9TdHJpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBhY2UudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0dGluZyBBQ0wgY2FwYWJpbGl0aWVzIik7Ci0gICAgICAgICAgICBBY2xDYXBhYmlsaXRpZXMgYWNsQ2FwYWJpbGl0aWVzID0gc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldEFjbENhcGFiaWxpdGllcygpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb3BvZ2F0aW9uIGZvciB0aGlzIHJlcG9zaXRvcnkgaXMgIgotICAgICAgICAgICAgICAgICAgICArIGFjbENhcGFiaWxpdGllcy5nZXRBY2xQcm9wYWdhdGlvbigpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBlcm1pc3Npb25zIGZvciB0aGlzIHJlcG9zaXRvcnkgYXJlOiAiKTsKLSAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbkRlZmluaXRpb24gZGVmaW5pdGlvbiA6IGFjbENhcGFiaWxpdGllcy5nZXRQZXJtaXNzaW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlZmluaXRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5wZXJtaXNzaW9uIG1hcHBpbmdzIGZvciB0aGlzIHJlcG9zaXRvcnkgYXJlOiAiKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFBlcm1pc3Npb25NYXBwaW5nPiByZXBvTWFwcGluZyA9IGFjbENhcGFiaWxpdGllcy5nZXRQZXJtaXNzaW9uTWFwcGluZygpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogcmVwb01hcHBpbmcua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oa2V5ICsgIiBtYXBzIHRvICIgKyByZXBvTWFwcGluZy5nZXQoa2V5KS5nZXRQZXJtaXNzaW9ucygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFZlcnNpb25pbmcKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblZlcnNpb25pbmcuLi4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBkb2N1bWVudCBpcyB2ZXJzaW9uYWJsZQotICAgICAgICBib29sZWFuIHZlcnNpb25hYmxlID0gZmFsc2U7Ci0gICAgICAgIGlmICgoKERvY3VtZW50VHlwZSkgKGRvYy5nZXRUeXBlKCkpKS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkb2MuZ2V0TmFtZSgpICsgIiBpcyB2ZXJzaW9uYWJsZSIpOwotICAgICAgICAgICAgdmVyc2lvbmFibGUgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRvYy5nZXROYW1lKCkgKyAiIGlzIE5PVCB2ZXJzaW9uYWJsZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0ZXN0LnR4dCwgbWFrZSBzb21lIGNoYW5nZXMgdG8gdGhlCi0gICAgICAgIC8vIFBXQywgYW5kCi0gICAgICAgIC8vIGNoZWNrIGluIHRoZSBuZXcgdmVyc2lvbgotICAgICAgICBpZiAodmVyc2lvbmFibGUpIHsKLSAgICAgICAgICAgIERvY3VtZW50IHB3YyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QoZG9jLmNoZWNrT3V0KCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb250ZW50ID0gZ2V0Q29udGVudEFzU3RyaW5nKHB3Yy5nZXRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdXBkYXRlZENvbnRlbnRzID0gY29udGVudCArICJcbkxpbmUgYWRkZWQgaW4gbmV3IHZlcnNpb24iOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1ZiA9IHVwZGF0ZWRDb250ZW50cy5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZW50U3RyZWFtID0gc2Vzc2lvbi5nZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlQ29udGVudFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgZG9jLmdldENvbnRlbnRTdHJlYW0oKS5nZXRGaWxlTmFtZSgpLCBidWYubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICBkb2MuZ2V0Q29udGVudFN0cmVhbSgpLmdldE1pbWVUeXBlKCksIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWYpKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaW4gdGhlIHB3YwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwd2MuY2hlY2tJbihmYWxzZSwgbnVsbCwgY29udGVudFN0cmVhbSwgIm1pbm9yIHZlcnNpb24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW4gZmFpbGVkLCB0cnlpbmcgdG8gY2FuY2VsIHRoZSBjaGVja291dCIpOwotICAgICAgICAgICAgICAgIHB3Yy5jYW5jZWxDaGVja091dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50IHZlcnNpb24gaGlzdG9yeSIpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3Q8RG9jdW1lbnQ+IHZlcnNpb25zID0gZG9jLmdldEFsbFZlcnNpb25zKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChEb2N1bWVudCB2ZXJzaW9uIDogdmVyc2lvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdG5hbWU6ICIgKyB2ZXJzaW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHR2ZXJzaW9uIGxhYmVsOiAiICsgdmVyc2lvbi5nZXRWZXJzaW9uTGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHR2ZXJzaW9uIHNlcmllcyBpZDogIiArIHZlcnNpb24uZ2V0VmVyc2lvblNlcmllc0lkKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0Y2hlY2tlZCBvdXQgYnk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZlcnNpb24uZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRCeSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdGNoZWNrZWQgb3V0IGlkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2ZXJzaW9uLmdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRtYWpvciB2ZXJzaW9uOiAiICsgdmVyc2lvbi5pc01ham9yVmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdGxhdGVzdCB2ZXJzaW9uOiAiICsgdmVyc2lvbi5pc0xhdGVzdFZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRsYXRlc3QgbWFqb3IgdmVyc2lvbjogIiArIHZlcnNpb24uaXNMYXRlc3RNYWpvclZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRjaGVja2luIGNvbW1lbnQ6ICIgKyB2ZXJzaW9uLmdldENoZWNraW5Db21tZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0Y29udGVudCBsZW5ndGg6ICIgKyB2ZXJzaW9uLmdldENvbnRlbnRTdHJlYW1MZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblJlbmRpdGlvbnMuLi4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tIik7Ci0KLSAgICAgICAgLy8gUmVuZGl0aW9ucyAtIGZpbmQgYWxsIG9iamVjdHMgYW5kIGNoZWNrIGZvciByZW5kaXRpb25zCi0gICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0UmVuZGl0aW9uc0NhcGFiaWxpdHkoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoQ2FwYWJpbGl0eVJlbmRpdGlvbnMuTk9ORSkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVwb3NpdG9yeSBkb2VzIG5vdCBzdXBwb3J0IHJlbmRpdGlvbnMiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIkZpbmRpbmcgZmlyc3Qgb2JqZWN0IGluIHJlcG9zaXRvcnkgd2l0aCB0aHVtYm5haWwgcmVuZGl0aW9ucyAtIHN0YXJ0Iik7Ci0gICAgICAgICAgICBGb2xkZXIgbm9kZSA9IHJvb3Q7Ci0gICAgICAgICAgICBTdGFjazxGb2xkZXI+IHN0YWNrID0gbmV3IFN0YWNrPEZvbGRlcj4oKTsKLSAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKENtaXNPYmplY3QgbyA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoby5nZXRUeXBlKCkuaXNCYXNlVHlwZSgpICYmIG8uZ2V0VHlwZSgpLmdldElkKCkuZXF1YWxzKCJjbWlzOmZvbGRlciIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG8uZ2V0QmFzZVR5cGUoKS5nZXRJZCgpLmVxdWFscygiY21pczpmb2xkZXIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCgoRm9sZGVyKSBvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQgPSBzZXNzaW9uLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQuc2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCJjbWlzOnRodW1ibmFpbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ21pc09iamVjdCBvbyA9IHNlc3Npb24uZ2V0T2JqZWN0KG8uZ2V0SWQoKSwgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFJlbmRpdGlvbj4gcmwgPSBvby5nZXRSZW5kaXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgICIgKyBvLmdldE5hbWUoKSArICIgb2YgdHlwZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG8uZ2V0VHlwZSgpLmdldERpc3BsYXlOYW1lKCkgKyAidGhhdCBoYXMgcmVuZGl0aW9ucy4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVuZGl0aW9uIHJlbmRpdGlvbiA6IHJsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoImtpbmQ6ICIgKyByZW5kaXRpb24uZ2V0S2luZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiXHRtaW1ldHlwZTogIiArIHJlbmRpdGlvbi5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiXHR3aWR0aDogIiArIHJlbmRpdGlvbi5nZXRXaWR0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiXHRoZWlnaHQ6ICIgKyByZW5kaXRpb24uZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0c3RyZWFtIGlkOiAiICsgcmVuZGl0aW9uLmdldFN0cmVhbUlkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gSnVzdCBzaG93IHRoZSBmaXJzdCBvYmplY3Qgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kaXRpb25zLiBSZW1vdmUgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayB0byBzaG93IHRoZW0gYWxsCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSAoRm9sZGVyKSBzdGFjay5wb3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCJGaW5kaW5nIGZpcnN0IG9iamVjdCBpbiByZXBvc2l0b3J5IHdpdGggdGh1bWJuYWlsIHJlbmRpdGlvbnMgLSBlbmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2V0dGluZyBTdGFydGVkLi4uZW5kIG9mIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvbGRlcgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRUcmVlKFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0PiB0cmVlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY2VuZGFudCAiICsgdHJlZS5nZXRJdGVtKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZm9yIChUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4gdCA6IHRyZWUuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgcHJpbnRUcmVlKHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvbGRlcgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRGb2xkZXJUcmVlKFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0PiB0cmVlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9sZGVyICIgKyB0cmVlLmdldEl0ZW0oKS5nZXROYW1lKCkpOwotICAgICAgICBmb3IgKFRyZWU8RmlsZWFibGVDbWlzT2JqZWN0PiB0IDogdHJlZS5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBwcmludEZvbGRlclRyZWUodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhbnMgdXAgYW55IG9iamVjdHMgd2UgY3JlYXRlZCBpbiBhIHByZXZpb3VzIHJ1biBvZiB0aGlzIHByb2dyYW0gb24gdGhlCi0gICAgICogc3VwcGxpZWQgc2Vzc2lvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBhbiBhY3RpdmUgY21pcyBzZXNzaW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbGVhbnVwKFNlc3Npb24gcykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIGNsZWFuaW5nIHVwIHJlcG9zaXRvcnkiKTsKLSAgICAgICAgU3RyaW5nW10gZm9sZGVycyA9IHsgIkFER05ld0ZvbGRlciIsICJBREdOZXdGb2xkZXIgMiIsICJBREdGb2xkZXIxIiwgIkFER0ZvbGRlclBhZ2luZyIsCi0gICAgICAgICAgICAgICAgIkFER0ZvbGRlckFzc29jaWF0aW9ucyIsICJBREdGb2xkZXJQZXJtaXNzaW9ucyIgfTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb2xkZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICIvIiArIGZvbGRlcnNbaV07Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmluZGluZyBhbmQgZGVsZXRpbmcgZm9sZGVyIHRyZWUgIiArIHBhdGgpOwotICAgICAgICAgICAgQ21pc09iamVjdCBvID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbyA9IHMuZ2V0T2JqZWN0QnlQYXRoKHBhdGgpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAoKEZvbGRlcikgbykuZGVsZXRlVHJlZSh0cnVlLCBVbmZpbGVPYmplY3QuREVMRVRFLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYW55IGZhaWx1cmVzCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCBjbGVhbmluZyB1cCByZXBvc2l0b3J5Iik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgY29udGVudHMgb2YgYSBzdHJlYW0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RyZWFtCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudEFzU3RyaW5nKENvbnRlbnRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpbjIgPSBzdHJlYW0uZ2V0U3RyZWFtKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYnVmID0gbnVsbDsKLSAgICAgICAgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoaW4yLmF2YWlsYWJsZSgpKTsKLSAgICAgICAgaW50IGNvdW50OwotICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlWzEwMF07Ci0gICAgICAgIHdoaWxlICgoY291bnQgPSBpbjIucmVhZChidWYyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHNidWYuYXBwZW5kKChjaGFyKSBidWYyW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbjIuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuIHNidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHNpemUgZm9sZGVycyB1bmRlciByb290IHdpdGggbmFtZXMgQURHRm9sZGVyMCwgQURHRm9sZGVyMSwuLi4sCi0gICAgICogCi0gICAgICogQHBhcmFtIHJvb3QKLSAgICAgKiAgICAgICAgICAgIC0gcGFyZW50IGZvbGRlcgotICAgICAqIEBwYXJhbSBzaXplCi0gICAgICogICAgICAgICAgICAtIG51bWJlciBvZiBmb2xkZXJzIHRvIGNyZWF0ZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlRm9sZGVycyhGb2xkZXIgcm9vdCwgaW50IHNpemUpIHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbmV3Rm9sZGVyUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICBuZXdGb2xkZXJQcm9wcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsICJjbWlzOmZvbGRlciIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBuZXdGb2xkZXJQcm9wcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIkFER0ZvbGRlciIgKyBpKTsKLSAgICAgICAgICAgIHJvb3QuY3JlYXRlRm9sZGVyKG5ld0ZvbGRlclByb3BzKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1oZWxsby9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLWhlbGxvL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzZmOGQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLWhlbGxvL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgCi0gbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIAotIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIAotIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCAKLSB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgCi0gT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciAKLSB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0geHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj5MQVRFU1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPCEtLSBQcm9qZWN0IEluZm9ybWF0aW9uIC0tPgotCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWhlbGxvPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBDaGVtaXN0cnkgT3BlbkNNSVMgSGVsbG8gV29ybGQgRXhhbXBsZTwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphdmE8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5kb2MuSGVsbG88L21haW5DbGFzcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPkxBVEVTVDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtaGVsbG8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9kb2MvSGVsbG8uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1oZWxsby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2RvYy9IZWxsby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjdkNGMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1oZWxsby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2RvYy9IZWxsby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmRvYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuU2Vzc2lvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotCi1wdWJsaWMgY2xhc3MgSGVsbG8gewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihIZWxsby5jbGFzcy5nZXROYW1lKCkgKyAiIHN0YXJ0ZWQiKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBTZXNzaW9uRmFjdG9yeSBhbmQgc2V0IHVwIHRoZSBTZXNzaW9uUGFyYW1ldGVyIG1hcAotICAgICAgICBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSA9IFNlc3Npb25GYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlciA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIC8vIGNvbm5lY3Rpb24gc2V0dGluZ3MgLSB3ZSBhcmUgY29ubmVjdGluZyB0byBhIHB1YmxpYyBjbWlzIHJlcG8sCi0gICAgICAgIC8vIHVzaW5nIHRoZSBBdG9tUFVCIGJpbmRpbmcKLSAgICAgICAgcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFUT01QVUJfVVJMLCAiIGh0dHA6Ly9yZXBvLm9wZW5jbWlzLm9yZy9pbm1lbW9yeS9hdG9tLyIpOwotICAgICAgICBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFLCBCaW5kaW5nVHlwZS5BVE9NUFVCLnZhbHVlKCkpOwotCi0gICAgICAgIC8vIGZpbmQgYWxsIHRoZSByZXBvc2l0b3JpZXMgYXQgdGhpcyBVUkwgLSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUuCi0gICAgICAgIExpc3Q8UmVwb3NpdG9yeT4gcmVwb3NpdG9yaWVzID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5PigpOwotICAgICAgICByZXBvc2l0b3JpZXMgPSBzZXNzaW9uRmFjdG9yeS5nZXRSZXBvc2l0b3JpZXMocGFyYW1ldGVyKTsKLSAgICAgICAgZm9yIChSZXBvc2l0b3J5IHIgOiByZXBvc2l0b3JpZXMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgcmVwb3NpdG9yeTogIiArIHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBzZXNzaW9uIHdpdGggdGhlIGZpcnN0IChhbmQgb25seSkgcmVwb3NpdG9yeQotICAgICAgICBSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSByZXBvc2l0b3JpZXMuZ2V0KDApOwotICAgICAgICBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9JRCwgcmVwb3NpdG9yeS5nZXRJZCgpKTsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gc2Vzc2lvbkZhY3RvcnkuY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IGEgY29ubmVjdGlvbiB0byByZXBvc2l0b3J5OiAiICsgcmVwb3NpdG9yeS5nZXROYW1lKCkgKyAiLCB3aXRoIGlkOiAiCi0gICAgICAgICAgICAgICAgKyByZXBvc2l0b3J5LmdldElkKCkpOwotCi0gICAgICAgIC8vIEdldCBldmVyeXRoaW5nIGluIHRoZSByb290IGZvbGRlciBhbmQgcHJpbnQgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzCi0gICAgICAgIEZvbGRlciByb290ID0gc2Vzc2lvbi5nZXRSb290Rm9sZGVyKCk7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCB0aGUgZm9sbG93aW5nIG9iamVjdHMgaW4gdGhlIHJvb3QgZm9sZGVyOi0iKTsKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0IG8gOiBjaGlsZHJlbikgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG8uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEhlbGxvLmNsYXNzLmdldE5hbWUoKSArICIgZW5kZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtaGVsbG8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9kb2MvUXVlcnlUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtaGVsbG8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9kb2MvUXVlcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTliODQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLWhlbGxvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZG9jL1F1ZXJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5kb2M7DQotDQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5RdWVyeVJlc3VsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5SZXBvc2l0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLlNlc3Npb25GYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBRdWVyeVRlc3Qgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU19FTkRQT0lOVF9URVNUX1NFUlZFUiA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvaW5tZW1vcnkvYXRvbSI7DQotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOw0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIGdldENtaXNDbGllbnRTZXNzaW9uKCl7DQotICAgICAgICAvLyBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24NCi0gICAgICAgIFNlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSBTZXNzaW9uRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgLy8gdXNlciBjcmVkZW50aWFscw0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSLCAiZHVtbXl1c2VyIik7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCAiZHVtbXlzZWNyZXQiKTsNCi0gICAgICAgIC8vIGNvbm5lY3Rpb24gc2V0dGluZ3MNCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkwsIA0KLSAgICAgICAgICAgICAgICBDTUlTX0VORFBPSU5UX1RFU1RfU0VSVkVSICk7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQVRPTVBVQiANCi0gICAgICAgICAgICAgICAgLnZhbHVlKCkpOw0KLSAgICAgICAgLy8gY3JlYXRlIHNlc3Npb24NCi0gICAgICAgIHNlc3Npb24gPSAgZmFjdG9yeS5nZXRSZXBvc2l0b3JpZXMocGFyYW1ldGVycykuZ2V0KDApLmNyZWF0ZVNlc3Npb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVUZXN0QXJlYSgpDQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgICAgICAgIHsNCi0NCi0gICAgICAgIC8vY3JlYXRpbmcgYSBuZXcgZm9sZGVyDQotICAgICAgICBGb2xkZXIgcm9vdCA9IHNlc3Npb24uZ2V0Um9vdEZvbGRlcigpOw0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBmb2xkZXJQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICBmb2xkZXJQcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgImNtaXM6Zm9sZGVyIik7DQotICAgICAgICBmb2xkZXJQcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAidGVzdGRhdGEiKTsNCi0NCi0gICAgICAgIEZvbGRlciBuZXdGb2xkZXIgPSByb290LmNyZWF0ZUZvbGRlcihmb2xkZXJQcm9wZXJ0aWVzKTsNCi0gICAgICAgIC8vY3JlYXRlIGEgbmV3IGNvbnRlbnQgaW4gdGhlIGZvbGRlcg0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAidGVzdGRhdGExLnR4dCI7DQotICAgICAgICAvLyBwcm9wZXJ0aWVzDQotICAgICAgICAvLyAobWluaW1hbCBzZXQ6IG5hbWUgYW5kIG9iamVjdCB0eXBlIGlkKQ0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZW50UHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgY29udGVudFByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpkb2N1bWVudCIpOw0KLSAgICAgICAgY29udGVudFByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpOw0KLQ0KLSAgICAgICAgLy8gY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSAiQ01JUyBUZXN0ZGF0YSBPbmUiLmdldEJ5dGVzKCk7DQotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudCk7DQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBuZXcgQ29udGVudFN0cmVhbUltcGwobmFtZSwgbmV3IEJpZ0ludGVnZXIoY29udGVudCksICJ0ZXh0L3BsYWluIiwgc3RyZWFtKTsNCi0NCi0gICAgICAgIC8vIGNyZWF0ZSBhIG1ham9yIHZlcnNpb24NCi0gICAgICAgIERvY3VtZW50IG5ld0NvbnRlbnQxID0gIG5ld0ZvbGRlci5jcmVhdGVEb2N1bWVudChjb250ZW50UHJvcGVydGllcywgY29udGVudFN0cmVhbSwgbnVsbCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50IGNyZWF0ZWQ6ICIgKyBuZXdDb250ZW50MS5nZXRJZCgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgZG9RdWVyeSgpIHsNCi0gICAgICAgIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcmVzdWx0cyA9IHNlc3Npb24ucXVlcnkoIlNFTEVDVCAqIEZST00gY21pczpmb2xkZXIgV0hFUkUgY21pczpuYW1lPSd0ZXN0ZGF0YSciLCBmYWxzZSk7DQotICAgICAgICBmb3IgKFF1ZXJ5UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsNCi0gICAgICAgICAgICBTdHJpbmcgaWQgPSByZXN1bHQuZ2V0UHJvcGVydHlWYWx1ZUJ5SWQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvUXVlcnkoKSBmb3VuZCBpZDogIiArIGlkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgew0KLSAgICAgICAgUXVlcnlUZXN0IG8gPSBuZXcgUXVlcnlUZXN0KCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG8uZ2V0Q21pc0NsaWVudFNlc3Npb24oKTsNCi0gICAgICAgICAgICBvLmNyZWF0ZVRlc3RBcmVhKCk7DQotICAgICAgICAgICAgby5kb1F1ZXJ5KCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB4bWFpbihTdHJpbmcgYXJnc1tdKSB7DQotICAgICAgICANCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihIZWxsby5jbGFzcy5nZXROYW1lKCkgKyAiIHN0YXJ0ZWQiKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSBhIFNlc3Npb25GYWN0b3J5IGFuZCBzZXQgdXAgdGhlIFNlc3Npb25QYXJhbWV0ZXIgbWFwDQotICAgICAgICBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSA9IFNlc3Npb25GYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0gICAgICAgIC8vIGNvbm5lY3Rpb24gc2V0dGluZ3MgLSB3ZSdyZSBjb25uZWN0aW5nIHRvIGEgcHVibGljIGNtaXMgcmVwbywNCi0gICAgICAgIC8vIHVzaW5nIHRoZSBBdG9tUFVCIGJpbmRpbmcNCi0gICAgICAgIHBhcmFtZXRlci5wdXQoU2Vzc2lvblBhcmFtZXRlci5BVE9NUFVCX1VSTCwgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbm1lbW9yeS9hdG9tLyIpOw0KLSAgICAgICAgcGFyYW1ldGVyLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQVRPTVBVQi52YWx1ZSgpKTsNCi0NCi0gICAgICAgIC8vIGZpbmQgYWxsIHRoZSByZXBvc2l0b3JpZXMgYXQgdGhpcyBVUkwgLSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUuDQotICAgICAgICBMaXN0PFJlcG9zaXRvcnk+IHJlcG9zaXRvcmllcyA9IG5ldyBBcnJheUxpc3Q8UmVwb3NpdG9yeT4oKTsNCi0gICAgICAgIHJlcG9zaXRvcmllcyA9IHNlc3Npb25GYWN0b3J5LmdldFJlcG9zaXRvcmllcyhwYXJhbWV0ZXIpOw0KLSAgICAgICAgZm9yIChSZXBvc2l0b3J5IHIgOiByZXBvc2l0b3JpZXMpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIHJlcG9zaXRvcnk6ICIgKyByLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBjcmVhdGUgc2Vzc2lvbiB3aXRoIHRoZSBmaXJzdCAoYW5kIG9ubHkpIHJlcG9zaXRvcnkNCi0gICAgICAgIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IHJlcG9zaXRvcmllcy5nZXQoMCk7DQotICAgICAgICBwYXJhbWV0ZXIucHV0KFNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9JRCwgcmVwb3NpdG9yeS5nZXRJZCgpKTsNCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHNlc3Npb25GYWN0b3J5LmNyZWF0ZVNlc3Npb24ocGFyYW1ldGVyKTsNCi0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IGEgY29ubmVjdGlvbiB0byByZXBvc2l0b3J5OiAiICsgcmVwb3NpdG9yeS5nZXROYW1lKCkgKyAiLCB3aXRoIGlkOiAiDQotICAgICAgICAgICAgICAgICsgcmVwb3NpdG9yeS5nZXRJZCgpKTsNCi0NCi0vLyAgICAgICAgLy8gR2V0IGV2ZXJ5dGhpbmcgaW4gdGhlIHJvb3QgZm9sZGVyIGFuZCBwcmludCB0aGUgbmFtZXMgb2YgdGhlIG9iamVjdHMNCi0vLyAgICAgICAgRm9sZGVyIHJvb3QgPSBzZXNzaW9uLmdldFJvb3RGb2xkZXIoKTsNCi0vLyAgICAgICAgSXRlbUl0ZXJhYmxlPENtaXNPYmplY3Q+IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZHJlbigpOw0KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIHRoZSBmb2xsb3dpbmcgb2JqZWN0cyBpbiB0aGUgcm9vdCBmb2xkZXI6LSIpOw0KLS8vICAgICAgICBmb3IgKENtaXNPYmplY3QgbyA6IGNoaWxkcmVuKSB7DQotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oby5nZXROYW1lKCkpOw0KLS8vICAgICAgICB9DQotLy8gICAgICAgIA0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFF1ZXJ5VGVzdC5jbGFzcy5nZXROYW1lKCkgKyAiIGVuZGVkIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyL3BvbS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0MzFmOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSAKLSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gCi0gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgCi0gcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIAotIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyAKLSBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIAotIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotICAgIDwhLS0gUHJvamVjdCBJbmZvcm1hdGlvbiAtLT4KLQotICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1xdWVyeXBhcnNlci1leGFtcGxlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBDaGVtaXN0cnkgT3BlbkNNSVMgUXVlcnkgUGFyc2VyIEV4YW1wbGU8L25hbWU+Ci0gICAgCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICAKLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLSAgICAKLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotCi0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyL3JlYWRtZS50eHQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3OGNmYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLVJlYWRtZS50eHQgY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyLWV4YW1wbGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9qZWN0IGlzIGFuIGV4YW1wbGUgaG93IHRvIGJ1aWxkIGEgcXVlcnkgcGFyc2VyIHVzaW5nIHRoZSBPcGVuQ01JUyBxdWVyeSBmcmFtZXdvcmsuCi0KLVRoZSBleGFtcGxlIGlzIHN0YW5kYWxvbmUgcHJvZ3JhbSB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgQW50TFIgYmFzZWQgcXVlcnkgcGFyc2VyLiBJdCAKLXBhcnNlcyBhIENNSVMgcXVlcnkgc3RyaW5nIGFuZCBjcmVhdGVzIGFmdGVyIHRyYXZlcnNpbmcgdGhlIHN5bnRheCB0cmVlIGEgbmV3IHN0YXRlbWVudCBpbgotQ01JUyBxdWVyeSBsYW5ndWFnZS4gV2hpbGUgdGhpcyBzb3VuZHMgcHJldHR5IHVzZWxlc3MgdGhpcyBzYW1wbGUgc3RpbGwgaGFzIHZhbHVlOgotIC0gaXQgaXMgbm90IGRlcGVuZGVudCBvbiBhbnkgcXVlcnkgbGFuZ3VhZ2Ugb2YgYSBiYWNrZW5kIChsaWtlIGEgZGF0YWJhc2UpIG9yIGEgCi0gICBzcGVjaWZpYyBkYXRhYmFzZSBzY2hlbWUuCi0gLSBpdCBjYW4gYmUgZWFzaWx5IGFkYXB0ZWQgdG8gZ2VuZXJhdGUgb3V0cHV0IGluIGRpZmZlcmVudCBmb3JtYXQgKFNRTCwgWE1MLCBKU09OKQotIC0gaXQgc2VwYXJhdGVzIGNsYXNzZXMgdGhhdCBjYW4gYmUgcmV1c2VkIGZyb20gdGhvc2UgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIG91dHB1dAotICAgbGFuZ3VhZ2UKLSAtIGl0IHByb3ZpZGVzIHVuaXQgdGVzdHMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBvdGhlciB0YXJnZXQgbGFuZ3VhZ2VzLgotCi1UaGUgc2FtcGxlIHByb3ZpZGVzIGNvZGUgZm9yIHRoZSBmdWxsIGN5Y2xlIHRvIHBhcnNlIGFuZCBwcm9jZXNzIGEgcXVlcnkuIFRoZSBlbnRyeSBwb2ludAotaXMgYSBzdGF0aWMgbWFpbigpIG1ldGhvZCBzbyB0aGF0IGl0IHJ1bnMgc3RhbmRhbG9uZSB3aXRob3V0IGFueSBzZXJ2ZXIuIFVzdWFsbHkgdGhpcyBjb2RlCi13aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBDTUlTIERpc2NvdmVyeSBzZXJ2aWNlIGluIGEgcmVhbCBDTUlTIHNlcnZlci4KLQotVGhlIGNvZGUgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgotCi1FeGFtcGxlUXVlcnlQcm9jZXNzb3IuamF2YToKLVRoaXMgaXMgdGhlIG1haW4gY2xhc3MuIEl0IHRha2VzIGEgcXVlcnkgYW5kIHBhcnNlcyBpdC4gSXQgdHJhdmVyc2VzIHRoZSBnZW5lcmF0ZWQgdHJlZQotYW5kIGZpbmFsbHkgYnVpbGRzIHRoZSBvdXRwdXQuCi0KLUV4YW1wbGVRdWVyeVdhbGtlci5qYXZhOgotQSB3YWxrZXIgdGhhdCB0cmF2ZXJzZXMgdGhlIHN5bnRheCB0cmVlIGFuZCBnZW5lcmF0ZXMgdGhlIENNSVNRTCBvdXRwdXQuIEZvciBlYWNoIG5vZGUgaW4KLXRoZSB0cmVlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgcHJvY2Vzc2luZyBhIHNwZWNpZmljIHRva2VuLgotCi1FeGFtcGxlVHlwZU1hbmFnZXIuamF2YToKLUFuIE9wZW5DTUlTIHBhcnNlciBwcm9jZXNzZXMgdGhlIHF1ZXJ5IGFuZCBkb2VzIGNlcnRhaW4gY2hlY2tzIGZvciB2YWxpZGl0eS4gVG8gZG8gdGhpcwotaXQgbmVlZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF2YWlsYWJsZSB0eXBlcyBhbmQgcHJvcGVydGllcyBpbiB0aGUgYmFja2VuZC4gVGhpcyAKLWluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJ5IHRoZSBpbnRlcmZhY2UgVHlwZU1hbmFnZXIuIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG1pbmltYWwgCi10eXBlIHN5c3RlbSB0byBnZXQgYSBydW5uaW5nIHNhbXBsZS4gSXQgaGFzIG9ubHkgb25lIHR5cGUgaW1wbGVtZW50ZWQ6IGNtaXM6ZG9jdW1lbnQKLShub3RlIHRoYXQgdGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgYSByZWFsIHNlcnZlciBhY2NvcmRpbmcgdG8gdGhlIENNSVMgc3BlYykuCi0KLUV4dGVuZGVkQWJzdHJhY3RQcmVkaWNhdGVXYWxrZXIuamF2YQotVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBwcmVkZWZpbmVkIHdhbGtlciBmcm9tIHRoZSBzZXJ2ZXIgc3VwcG9ydCBwYWNrYWdlLiBJdCBwcm92aWRlcwotbW9yZSBmaW5lIGdyYWluZWQgY29udHJvbCBhbmQgbW9yZSBob29rcyB0byBwbHVnaW4gd2hpbGUgdHJhdmVyc2luZyB0aGUgdHJlZS4gVGhpcyBwYXJ0Ci1pcyBpbmRlcGVuZGVudCBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBhbmQgdGhlcmVmb3JlIHNlcGFyYXRlZCBpbiBpdHMgb3duIGNsYXNzLiBJdCBtYXkKLWJlIHJldXNlZCBmb3Igb3RoZXIgcHJvamVjdHMuCi0KLUV4YW1wbGVRdWVyeVByb2Nlc3NvclRlc3QuamF2YQotQSBKdW5pdCB0ZXN0IHRoYXQgZmVlZHMgdGhlIHBhcnNlciB3aXRoIENNSVNRTCBxdWVyaWVzIGFuZCBjb21wYXJlcyB0aGUgZ2VuZXJhdGVkIG91dHB1dAotYWdhaW5zdCBhbiBleHBlY3RlZCByZXN1bHQuIFdoaWxlIHRoZSB0ZXN0cyBhcmUgc3BlY2lmaWMgdG8gdGhlIG91dHB1dCBsYW5ndWFnZSB0aGUgYmFzaWMKLXByaW5jaXBsZXMgYW5kIGRlc2lnbiBvZiB0aGUgdW5pdCB0ZXN0IGNhbiBiZSBkb25lIGluIHRoZSBzYW1lIHdheSBmb3Igb3RoZXIgcGFyc2Vycy4KLQotCi0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1xdWVyeXBhcnNlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3F1ZXJ5L2V4YW1wbGUvRXhhbXBsZVF1ZXJ5UHJvY2Vzc29yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9xdWVyeS9leGFtcGxlL0V4YW1wbGVRdWVyeVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEyODIxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1xdWVyeXBhcnNlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3F1ZXJ5L2V4YW1wbGUvRXhhbXBsZVF1ZXJ5UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnF1ZXJ5LmV4YW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1NlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkZ1bmN0aW9uUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5T2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5T2JqZWN0LlNvcnRTcGVjOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5VXRpbFN0cmljdDsKLQotLyoqCi0gKiBNYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGFyc2VyIGV4YW1wbGUuIEl0IHRha2VzIGEgQ01JU1FMIHF1ZXJ5IGFzIGlucHV0LAotICogcGFyc2VzIGl0IGFuZCBnZW5lcmF0ZXMgYWdhaW4gQ01JU1FMIGFzIG91dHB1dCB3aGVuIHRyYXZlcnNpbmcgdGhlIHRyZWUuCi0gKiBSdW5zIHN0YW5kYWxvbmUgd2l0aG91dCBhIHNlcnZlci4gVXN1YWxseSB0aGlzIGNvZGUgd291bGQgYmUgY2FsbGVkIGZyb20KLSAqIHRoZSBDTUlTIERpc2NvdmVyeSBTZXJ2aWNlIGluIGEgQ01JUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVF1ZXJ5UHJvY2Vzc29yIHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgY21pczpuYW1lIEFTIG5hbWUsIGNtaXM6b2JqZWN0VHlwZUlkLCBTQ09SRSgpIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBjbWlzOm5hbWUgTElLRSAnTXklJyI7Ci0gICAgICAgIEV4YW1wbGVRdWVyeVByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgRXhhbXBsZVF1ZXJ5UHJvY2Vzc29yKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3JpZ2luYWwgQ01JU1FMIHF1ZXJ5OiAiICsgcXVlcnkpOwotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGVkIENNSVNRTCBxdWVyeTogIiArICByZXNwb25zZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgcGFyc2VRdWVyeShTdHJpbmcgcXVlcnlTdHJpbmcpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGdlbmVyYXRlZFJlc3BvbnNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAKLSAgICAgICAgLy8gSW5zdGFudGlhdGUgYSB3YWxrZXIgdHJhdmVyc2luZyB0aGUgV0hFUkUgY2xhdXNlIGFuZCBnZW5lcmF0aW5nIHRoZSBvdXRwdXQgc3RyaW5nCi0gICAgICAgIEV4YW1wbGVRdWVyeVdhbGtlciB3YWxrZXIgPSBuZXcgRXhhbXBsZVF1ZXJ5V2Fsa2VyKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHR5cGUgZGVmaW5pdGlvbnMsIGZvciB0aGlzIGV4YW1wbGUgd2UganVzdCBjcmVhdGUgY21pczpkb2N1bWVudAotICAgICAgICBUeXBlTWFuYWdlciB0eXBlTWFuYWdlciA9IEV4YW1wbGVUeXBlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcGFyc2VyIGhlbHBlciBjbGFzcyB3aXRoIHR5cGUgbWFuYWdlciBhbmQgd2Fsa2VyCi0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWw9IG5ldyBRdWVyeVV0aWxTdHJpY3QocXVlcnlTdHJpbmcsIHR5cGVNYW5hZ2VyLCB3YWxrZXIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHN0YXRlbWVudCwgdGhlbiB0cmF2ZXJzZSBpdCB1c2luZyBvdXQgcXVlcnkgd2Fsa2VyCi0gICAgICAgICAgICBxdWVyeVV0aWwucHJvY2Vzc1N0YXRlbWVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBRdWVyeU9iamVjdCBxbyA9IHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGUgU0VMRUNUIGFuZCBGUk9NIHBhcnQgaXMgaGFuZGxlZCBpbiB0aGUgUXVlcnlPYmplY3QsIHdlIGp1c3QgbmVlZCB0byByZXRyaWV2ZQotICAgICAgICAgICAgLy8gdGhlIHJlc3VsdHMsIGFuZCBnZW5lcnRlIHRoZSBTRUxFQ1Qgc3RyaW5nCi0gICAgICAgICAgICBTdHJpbmcgc2VsRnJvbVBhcnQgPSBnZXRTZWxlY3RGcm9tU3RyaW5nKHFvKTsKLSAgICAgICAgICAgIGdlbmVyYXRlZFJlc3BvbnNlLmFwcGVuZChzZWxGcm9tUGFydCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGdldCB0aGUgZ2VuZXJhdGVkIHN0cmluZyBmcm9tIG91ciBxdWVyeSB3YWxrZXIgYW5kIGFwcGVuZCBpdAotICAgICAgICAgICAgU3RyaW5nIHdoZXJlQ2xhdXNlID0gd2Fsa2VyLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgZ2VuZXJhdGVkUmVzcG9uc2UuYXBwZW5kKHdoZXJlQ2xhdXNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIE9SREVSIEJZIHBhcnQgaXMgaGFuZGxlZCBpbiB0aGUgUXVlcnlPYmplY3QsIHdlIGp1c3QgbmVlZCB0byByZXRyaWV2ZQotICAgICAgICAgICAgLy8gdGhlIHJlc3VsdHMsIGFuZCBnZW5lcnRlIHRoZSBPUkRFUiBCWSBzdHJpbmcKLSAgICAgICAgICAgIGdlbmVyYXRlZFJlc3BvbnNlLmFwcGVuZChnZXRPcmRlckJ5KHFvKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEZpbmFsbHkgd2UgaGF2ZSB0aGUgZnVsbCBzdGF0ZW1lbnQgYW5kIHJldHVybiBpcyBhcyByZXN1bHQKLSAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRSZXNwb25zZS50b1N0cmluZygpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlN5bnRheCBlcnJvciBpbiBxdWVyeTogIiArIHF1ZXJ5VXRpbC5nZXRFcnJvck1lc3NhZ2UoZSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlbGVjdEZyb21TdHJpbmcoUXVlcnlPYmplY3QgcW8pIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiU0VMRUNUIik7Ci0gICAgICAgIExpc3Q8Q21pc1NlbGVjdG9yPiBzZWxzID0gcW8uZ2V0U2VsZWN0UmVmZXJlbmNlcygpOwotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igc2VsIDogc2VscykgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICB9IGVsc2UgCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsKLQotICAgICAgICAgICAgYXBwZW5kU2VsZWN0b3IocmVzdWx0LCBzZWwpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZST00iKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBmcm9tcyA9IHFvLmdldFR5cGVzKCk7Ci0gICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yKFN0cmluZyBmcm9tIDogZnJvbXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOwotICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGZyb20pOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiAiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBlbmRTZWxlY3RvcihTdHJpbmdCdWZmZXIgcmVzdWx0LCBDbWlzU2VsZWN0b3Igc2VsKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBGdW5jdGlvblJlZmVyZW5jZSkKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIigpIik7Ci0gICAgICAgIAotICAgICAgICBpZiAobnVsbCAhPSBzZWwuZ2V0QWxpYXNOYW1lKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBBUyAiKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsLmdldEFsaWFzTmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRPcmRlckJ5KFF1ZXJ5T2JqZWN0IHFvKSB7Ci0gICAgICAgIExpc3Q8U29ydFNwZWM+IG9yZGVyQnlzID0gcW8uZ2V0T3JkZXJCeXMoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gb3JkZXJCeXMgfHwgb3JkZXJCeXMuc2l6ZSgpID09IDApIAotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE9SREVSIEJZIik7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKFNvcnRTcGVjIHNwIDogb3JkZXJCeXMpIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOwotICAgICAgICAgICAgfSBlbHNlIAotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7Ci0KLSAgICAgICAgICAgIENtaXNTZWxlY3RvciBzZWwgPSBzcC5nZXRTZWxlY3RvcigpOwotICAgICAgICAgICAgYXBwZW5kU2VsZWN0b3IocmVzdWx0LCBzZWwpOwotICAgICAgICAgICAgaWYgKCFzcC5hc2NlbmRpbmcpCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIERFU0MiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvcXVlcnkvZXhhbXBsZS9FeGFtcGxlUXVlcnlXYWxrZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1xdWVyeXBhcnNlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3F1ZXJ5L2V4YW1wbGUvRXhhbXBsZVF1ZXJ5V2Fsa2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1N2UyNjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvcXVlcnkvZXhhbXBsZS9FeGFtcGxlUXVlcnlXYWxrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucXVlcnkuZXhhbXBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5UZXh0U2VhcmNoTGV4ZXI7Ci0KLS8qKgotICogQSBjbGFzcyBleHRlbmRpbmcgdGhlIHtAbGluayBFeHRlbmRlZEFic3RyYWN0UHJlZGljYXRlV2Fsa2VyfSBjbGFzcyBhbmQgZ2VuZXJhdGluZwotICogQ01JU1FMIHN0cmluZ3MgYXMgb3V0cHV0IHdoaWxlIHRyYXZlcnNpbmcgdGhlIHRyZWVzLiBPbiBlYWNoIGhpdCBvZiBhIGNlcnRhaW4KLSAqIG5vZGUgb3IgdG9rZW4gdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IG9mIENNSVNRTCBpcyBhcHBlbmRlZCB0byBhIHN0cmluZwotICogYnVmZmVyLgotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVF1ZXJ5V2Fsa2VyIGV4dGVuZHMgRXh0ZW5kZWRBYnN0cmFjdFByZWRpY2F0ZVdhbGtlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrUHJlZGljYXRlKFRyZWUgd2hlcmVOb2RlKSB7Ci0gICAgICAgIGlmIChudWxsICE9IHdoZXJlTm9kZSkgewotICAgICAgICAgICAgb25TdGFydFByb2Nlc3Npbmcod2hlcmVOb2RlKTsKLSAgICAgICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUod2hlcmVOb2RlKTsKLSAgICAgICAgICAgIG9uU3RvcFByb2Nlc3NpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsgLy8gdW51c2VkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa05vdChUcmVlIG9wTm9kZSwgVHJlZSBub2RlKSB7Ci0gICAgICAgIG9uTm90KG9wTm9kZSwgbm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUobm9kZSk7Ci0gICAgICAgIG9uUG9zdE5vdChvcE5vZGUsIG5vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa0FuZChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgb25QcmVBbmQob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShsZWZ0Tm9kZSk7Ci0gICAgICAgIG9uQW5kKG9wTm9kZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUocmlnaHROb2RlKTsKLSAgICAgICAgb25Qb3N0QW5kKG9wTm9kZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrT3IoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIG9uUHJlT3Iob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShsZWZ0Tm9kZSk7Ci0gICAgICAgIG9uT3Iob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShyaWdodE5vZGUpOwotICAgICAgICBvblBvc3RPcihvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa0VxdWFscyhUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgb25QcmVFcXVhbHMob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShsZWZ0Tm9kZSk7Ci0gICAgICAgIG9uRXF1YWxzKG9wTm9kZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUocmlnaHROb2RlKTsKLSAgICAgICAgb25Qb3N0RXF1YWxzKG9wTm9kZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTm90RXF1YWxzKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICBvblByZU5vdEVxdWFscyhvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGxlZnROb2RlKTsKLSAgICAgICAgb25Ob3RFcXVhbHMob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShyaWdodE5vZGUpOwotICAgICAgICBvblBvc3ROb3RFcXVhbHMob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtHcmVhdGVyVGhhbihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgb25QcmVHcmVhdGVyVGhhbihvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGxlZnROb2RlKTsKLSAgICAgICAgb25HcmVhdGVyVGhhbihvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKHJpZ2h0Tm9kZSk7Ci0gICAgICAgIG9uUG9zdEdyZWF0ZXJUaGFuKG9wTm9kZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrR3JlYXRlck9yRXF1YWxzKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICBvblByZUdyZWF0ZXJPckVxdWFscyhvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGxlZnROb2RlKTsKLSAgICAgICAgb25HcmVhdGVyT3JFcXVhbHMob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShyaWdodE5vZGUpOwotICAgICAgICBvblBvc3RHcmVhdGVyT3JFcXVhbHMob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtMZXNzVGhhbihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgb25QcmVMZXNzVGhhbihvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGxlZnROb2RlKTsKLSAgICAgICAgb25MZXNzVGhhbihvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKHJpZ2h0Tm9kZSk7Ci0gICAgICAgIG9uUG9zdExlc3NUaGFuKG9wTm9kZSwgbGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTGVzc09yRXF1YWxzKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICBvblByZUxlc3NPckVxdWFscyhvcE5vZGUsIGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGxlZnROb2RlKTsKLSAgICAgICAgb25MZXNzT3JFcXVhbHMob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShyaWdodE5vZGUpOwotICAgICAgICBvblBvc3RMZXNzT3JFcXVhbHMob3BOb2RlLCBsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJbihUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgIG9uUHJlSW4ob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUoY29sTm9kZSk7Ci0gICAgICAgIG9uSW4ob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUobGlzdE5vZGUpOwotICAgICAgICBvblBvc3RJbihvcE5vZGUsIGNvbE5vZGUsIGxpc3ROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtOb3RJbihUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgIG9uUHJlTm90SW4ob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUoY29sTm9kZSk7Ci0gICAgICAgIG9uTm90SW4ob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUobGlzdE5vZGUpOwotICAgICAgICBvblBvc3ROb3RJbihvcE5vZGUsIGNvbE5vZGUsIGxpc3ROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJbkFueShUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgIG9uUHJlSW5Bbnkob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUoY29sTm9kZSk7Ci0gICAgICAgIG9uSW5Bbnkob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUobGlzdE5vZGUpOwotICAgICAgICBvblBvc3RJbkFueShvcE5vZGUsIGNvbE5vZGUsIGxpc3ROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtOb3RJbkFueShUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgIG9uUHJlTm90SW5Bbnkob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUoY29sTm9kZSk7Ci0gICAgICAgIG9uTm90SW5Bbnkob3BOb2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUobGlzdE5vZGUpOwotICAgICAgICBvblBvc3ROb3RJbkFueShvcE5vZGUsIGNvbE5vZGUsIGxpc3ROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtFcUFueShUcmVlIG9wTm9kZSwgVHJlZSBsaXRlcmFsTm9kZSwgVHJlZSBjb2xOb2RlKSB7Ci0gICAgICAgIG9uUHJlRXFBbnkob3BOb2RlLCBsaXRlcmFsTm9kZSwgY29sTm9kZSk7Ci0gICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUobGl0ZXJhbE5vZGUpOwotICAgICAgICBvbkVxQW55KG9wTm9kZSwgbGl0ZXJhbE5vZGUsIGNvbE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGNvbE5vZGUpOwotICAgICAgICBvblBvc3RFcUFueShvcE5vZGUsIGxpdGVyYWxOb2RlLCBjb2xOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJc051bGwoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgICAgICBvbklzTnVsbChvcE5vZGUsIGNvbE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGNvbE5vZGUpOwotICAgICAgICBvblBvc3RJc051bGwob3BOb2RlLCBjb2xOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJc05vdE51bGwoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgICAgICBvbklzTm90TnVsbChvcE5vZGUsIGNvbE5vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGNvbE5vZGUpOwotICAgICAgICBvblBvc3RJc05vdE51bGwob3BOb2RlLCBjb2xOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtMaWtlKFRyZWUgb3BOb2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSkgewotICAgICAgICBvblByZUlzTGlrZShvcE5vZGUsIGNvbE5vZGUsIHN0cmluZ05vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGNvbE5vZGUpOwotICAgICAgICBvbklzTGlrZShvcE5vZGUsIGNvbE5vZGUsIHN0cmluZ05vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKHN0cmluZ05vZGUpOwotICAgICAgICBvblBvc3RJc0xpa2Uob3BOb2RlLCBjb2xOb2RlLCBzdHJpbmdOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtOb3RMaWtlKFRyZWUgb3BOb2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSkgewotICAgICAgICBvblByZUlzTm90TGlrZShvcE5vZGUsIGNvbE5vZGUsIHN0cmluZ05vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKGNvbE5vZGUpOwotICAgICAgICBvbklzTm90TGlrZShvcE5vZGUsIGNvbE5vZGUsIHN0cmluZ05vZGUpOwotICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKHN0cmluZ05vZGUpOwotICAgICAgICBvblBvc3RJc05vdExpa2Uob3BOb2RlLCBjb2xOb2RlLCBzdHJpbmdOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtDb250YWlucyhUcmVlIG9wTm9kZSwgVHJlZSB0eXBlTm9kZSwgVHJlZSB0ZXh0U2VhcmNoTm9kZSkgewotCi0gICAgICAgIG9uUHJlQ29udGFpbnMob3BOb2RlLCB0eXBlTm9kZSwgdGV4dFNlYXJjaE5vZGUpOwotICAgICAgICBpZiAob3BOb2RlLmdldENoaWxkQ291bnQoKSA+IDEpIHsKLSAgICAgICAgICAgIHN1cGVyLndhbGtQcmVkaWNhdGUodHlwZU5vZGUpOwotICAgICAgICAgICAgb25CZXR3ZWVuQ29udGFpbnMob3BOb2RlLCB0eXBlTm9kZSwgdGV4dFNlYXJjaE5vZGUpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiciKTsKLSAgICAgICAgc3VwZXIud2Fsa1NlYXJjaEV4cHIodGV4dFNlYXJjaE5vZGUpOwotICAgICAgICBvbkNvbnRhaW5zKG9wTm9kZSwgdHlwZU5vZGUsIHRleHRTZWFyY2hOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrSW5Gb2xkZXIoVHJlZSBvcE5vZGUsIFRyZWUgdHlwZU5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgIGlmIChvcE5vZGUuZ2V0Q2hpbGRDb3VudCgpID09IDEpIHsKLSAgICAgICAgICAgIG9uSW5Gb2xkZXIob3BOb2RlLCBwYXJhbU5vZGUsIG51bGwpOwotICAgICAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShwYXJhbU5vZGUpOwotICAgICAgICAgICAgb25Qb3N0SW5Gb2xkZXIob3BOb2RlLCBwYXJhbU5vZGUsIG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb25JbkZvbGRlcihvcE5vZGUsIHR5cGVOb2RlLCBwYXJhbU5vZGUpOwotICAgICAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZSh0eXBlTm9kZSk7Ci0gICAgICAgICAgICBvbkJldHdlZW5JbkZvbGRlcihvcE5vZGUsIHR5cGVOb2RlLCBwYXJhbU5vZGUpOwotICAgICAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShwYXJhbU5vZGUpOwotICAgICAgICAgICAgb25Qb3N0SW5Gb2xkZXIob3BOb2RlLCB0eXBlTm9kZSwgcGFyYW1Ob2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa0luVHJlZShUcmVlIG9wTm9kZSwgVHJlZSB0eXBlTm9kZSwgVHJlZSBwYXJhbU5vZGUpIHsKLSAgICAgICAgaWYgKG9wTm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgb25JblRyZWUob3BOb2RlLCBwYXJhbU5vZGUsIG51bGwpOwotICAgICAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShwYXJhbU5vZGUpOwotICAgICAgICAgICAgb25Qb3N0SW5UcmVlKG9wTm9kZSwgcGFyYW1Ob2RlLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9uSW5UcmVlKG9wTm9kZSwgdHlwZU5vZGUsIHBhcmFtTm9kZSk7Ci0gICAgICAgICAgICBzdXBlci53YWxrUHJlZGljYXRlKHR5cGVOb2RlKTsKLSAgICAgICAgICAgIG9uQmV0d2VlbkluVHJlZShvcE5vZGUsIHR5cGVOb2RlLCBwYXJhbU5vZGUpOwotICAgICAgICAgICAgc3VwZXIud2Fsa1ByZWRpY2F0ZShwYXJhbU5vZGUpOwotICAgICAgICAgICAgb25Qb3N0SW5UcmVlKG9wTm9kZSwgdHlwZU5vZGUsIHBhcmFtTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3Qgd2Fsa0NvbChUcmVlIG5vZGUpIHsKLSAgICAgICAgb25Db2xOb2RlKG5vZGUpOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHdhbGtJZChUcmVlIG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIG9uSWQobm9kZSk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtTY29yZShUcmVlIG5vZGUpIHsKLSAgICAgICAgb25TY29yZShub2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiB3YWxrVGV4dEFuZChUcmVlIG5vZGUpIHsKLSAgICAgICAgTGlzdDxUcmVlPiBjaGlsZHJlbiA9IGdldENoaWxkcmVuQXNMaXN0KG5vZGUpOwotICAgICAgICBvblByZVRleHRBbmQobm9kZSwgY2hpbGRyZW4pOwotICAgICAgICBpbnQgaT0wOwotICAgICAgICBmb3IgKFRyZWUgY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgd2Fsa1NlYXJjaEV4cHIoY2hpbGQpOwotICAgICAgICAgICAgb25UZXh0QW5kKG5vZGUsIGNoaWxkcmVuLCBpKyspOwotICAgICAgICB9Ci0gICAgICAgIG9uUG9zdFRleHRBbmQobm9kZSwgY2hpbGRyZW4pOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBCb29sZWFuIHdhbGtUZXh0T3IoVHJlZSBub2RlKSB7Ci0gICAgICAgIExpc3Q8VHJlZT4gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkFzTGlzdChub2RlKTsKLSAgICAgICAgb25QcmVUZXh0T3Iobm9kZSwgY2hpbGRyZW4pOwotICAgICAgICBpbnQgaj0wOwotICAgICAgICBmb3IgKFRyZWUgY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgd2Fsa1NlYXJjaEV4cHIoY2hpbGQpOwotICAgICAgICAgICAgb25UZXh0T3Iobm9kZSwgY2hpbGRyZW4sIGorKyk7Ci0gICAgICAgIH0KLSAgICAgICAgb25Qb3N0VGV4dE9yKG5vZGUsIGNoaWxkcmVuKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiB3YWxrVGV4dE1pbnVzKFRyZWUgbm9kZSkgewotICAgICAgICBvblRleHRNaW51cyhub2RlLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgd2Fsa1NlYXJjaEV4cHIobm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgIG9uUG9zdFRleHRNaW51cyhub2RlLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiB3YWxrVGV4dFdvcmQoVHJlZSBub2RlKSB7Ci0gICAgICAgIG9uVGV4dFdvcmQob25UZXh0TGl0ZXJhbChub2RlKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gd2Fsa1RleHRQaHJhc2UoVHJlZSBub2RlKSB7Ci0gICAgICAgIG9uVGV4dFBocmFzZShvblRleHRMaXRlcmFsKG5vZGUpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHdhbGtCb29sZWFuKFRyZWUgbm9kZSkgewotICAgICAgICBPYmplY3Qgb2JqID0gc3VwZXIud2Fsa051bWJlcihub2RlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChvYmopOwotICAgICAgICByZXR1cm4gb2JqOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3Qgd2Fsa051bWJlcihUcmVlIG5vZGUpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHN1cGVyLndhbGtOdW1iZXIobm9kZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQob2JqKTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHdhbGtTdHJpbmcoVHJlZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyB2YWwgPSAgIiciICsgc3VwZXIud2Fsa1N0cmluZyhub2RlKSArICInIjsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWwpOwotICAgICAgICByZXR1cm4gdmFsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3Qgd2Fsa1RpbWVzdGFtcChUcmVlIG5vZGUpIHsKLSAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSBzdXBlci53YWxrVGltZXN0YW1wKG5vZGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHMpOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHdhbGtMaXN0KFRyZWUgbm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIoIik7Ci0gICAgICAgIGludCBuID0gbm9kZS5nZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICBMaXN0PE9iamVjdD4gcmVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KG4pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBub2RlLmdldENoaWxkKGkpOwotICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoby50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKSIpOwotCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBlbmRTdWJFeHByKCkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIpIik7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRTdWJFeHByKCkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIoIik7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblN0YXJ0UHJvY2Vzc2luZyhUcmVlIHdoZXJlTm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJXSEVSRSAiKTsgICAgICAgIAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcFByb2Nlc3NpbmcoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVFcXVhbHMoVHJlZSBlcU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIHN0YXJ0U3ViRXhwcigpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkVxdWFscyhUcmVlIGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiID0gIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXF1YWxzKFRyZWUgZXFOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICBlbmRTdWJFeHByKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Ob3RFcXVhbHMoVHJlZSBuZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiA8PiAiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkdyZWF0ZXJUaGFuKFRyZWUgZ3ROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgPiAiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkdyZWF0ZXJPckVxdWFscyhUcmVlIGdlTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiID49ICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTGVzc1RoYW4oVHJlZSBsdE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiA8ICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTGVzc09yRXF1YWxzKFRyZWUgbGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIDw9ICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTm90KFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk5PVCAoIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0Tm90KFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlKSB7Ci0gICAgICAgIGVuZFN1YkV4cHIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUFuZChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgc3RhcnRTdWJFeHByKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQW5kKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgQU5EICIpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RBbmQoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIGVuZFN1YkV4cHIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZU9yKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICBzdGFydFN1YkV4cHIoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25PcihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE9SICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdE9yKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICBlbmRTdWJFeHByKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uSW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIElOICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTm90SW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE5PVCBJTiAiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUluQW55KFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIkFOWSAiKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25JbkFueShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgSU4gIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVOb3RJbkFueShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJBTlkgIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Ob3RJbkFueShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgTk9UIElOICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRXFBbnkoVHJlZSBub2RlLCBUcmVlIGxpdGVyYWxOb2RlLCBUcmVlIGNvbE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiID0gQU5ZICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uSXNOdWxsKFRyZWUgbnVsbE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdElzTnVsbChUcmVlIG51bGxOb2RlLCBUcmVlIGNvbE5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIElTIE5VTEwiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbklzTm90TnVsbChUcmVlIG5vdE51bGxOb2RlLCBUcmVlIGNvbE5vZGUpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RJc05vdE51bGwoVHJlZSBub3ROdWxsTm9kZSwgVHJlZSBjb2xOb2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBJUyBOT1QgTlVMTCIpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUlzTGlrZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBzdHJpbmdOb2RlKSB7Ci0gICAgICAgIHN0YXJ0U3ViRXhwcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uSXNMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIExJS0UgIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SXNMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICAgICAgZW5kU3ViRXhwcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uSXNOb3RMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE5PVCBMSUtFICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uSW5Gb2xkZXIoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIklOX0ZPTERFUigiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb25CZXR3ZWVuSW5Gb2xkZXIoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SW5Gb2xkZXIoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIikiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkluVHJlZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBwYXJhbU5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiSU5fVFJFRSgiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkJldHdlZW5JblRyZWUoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEluVHJlZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBwYXJhbU5vZGUpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiKSIpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblNjb3JlKFRyZWUgbm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJTQ09SRSgpIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Db2xOb2RlKFRyZWUgbm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKG5vZGUuZ2V0Q2hpbGQoMCkuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUNvbnRhaW5zKFRyZWUgbm9kZSwgVHJlZSB0eXBlTm9kZSwgVHJlZSBzZWFyY2hFeHByTm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJDT05UQUlOUygiKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25CZXR3ZWVuQ29udGFpbnMoVHJlZSBub2RlLCBUcmVlIHR5cGVOb2RlLCBUcmVlIHNlYXJjaEV4cHJOb2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgJyIpOwotICAgIH0KLSAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ29udGFpbnMoVHJlZSBub2RlLCBUcmVlIHR5cGVOb2RlLCBUcmVlIHNlYXJjaEV4cHJOb2RlKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIicpIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25UZXh0QW5kKFRyZWUgbm9kZSwgTGlzdDxUcmVlPiBjb25qdW5jdGlvbk5vZGVzLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGluZGV4IDwgY29uanVuY3Rpb25Ob2Rlcy5zaXplKCktMSkKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAiKTsgICAgICAgIAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uVGV4dE9yKFRyZWUgbm9kZSwgTGlzdDxUcmVlPiB0ZXJtTm9kZXMsIGludCBpbmRleCkgewotICAgICAgICBpZiAoaW5kZXggPCB0ZXJtTm9kZXMuc2l6ZSgpLTEpCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgT1IgIik7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblRleHRNaW51cyhUcmVlIG5vZGUsIFRyZWUgbm90Tm9kZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCItIik7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblRleHRXb3JkKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQod29yZCk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblRleHRQaHJhc2UoU3RyaW5nIHBocmFzZSkgewotICAgICAgIHJlc3VsdC5hcHBlbmQoIlxcJyIgKyBwaHJhc2UgKyAiXFwnIik7Ci0gICAgfSAKLQotICAgIHByaXZhdGUgU3RyaW5nIG9uSWQoVHJlZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IG5vZGUuZ2V0VGV4dCgpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGlkKTsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3Q8VHJlZT4gZ2V0Q2hpbGRyZW5Bc0xpc3QoVHJlZSBub2RlKSB7Ci0gICAgICAgIExpc3Q8VHJlZT4gcmVzID0gbmV3IEFycmF5TGlzdDxUcmVlPihub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxub2RlLmdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlIGNoaWxkTm5vZGUgPSAgbm9kZS5nZXRDaGlsZChpKTsKLSAgICAgICAgICAgIHJlcy5hZGQoY2hpbGRObm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBvblRleHRMaXRlcmFsKFRyZWUgbm9kZSkgewotICAgICAgICBpbnQgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0VGV4dCgpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfUEhSQVNFX1NUUklOR19MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbC51bmVzY2FwZSh0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpLTEpLCBudWxsKTsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfV09SRF9MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbC51bmVzY2FwZSh0ZXh0LCBudWxsKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHRleHQgbGl0ZXJhbC4gIiArIG5vZGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1xdWVyeXBhcnNlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3F1ZXJ5L2V4YW1wbGUvRXhhbXBsZVR5cGVNYW5hZ2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9xdWVyeS9leGFtcGxlL0V4YW1wbGVUeXBlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y4Yzk2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1xdWVyeXBhcnNlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3F1ZXJ5L2V4YW1wbGUvRXhhbXBsZVR5cGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnF1ZXJ5LmV4YW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SWREZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZU11dGFiaWxpdHlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIG1pbm1pbWFsIHR5cGUgc3lzdGVtIGZvciB0aGUgZXhhbXBsZSBwYXJzZXIKLSAqIGNvbnNpc3Rpbmcgb2YgYSBzaW5nbGUgdHlwZSBjbWlzOmRvY3VtZW50LiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGludGVyZmFjZSBUeXBlTWFuYWdlciBtdXN0IGJlIHByb3ZpZGVkIHRvIHVzZSB0aGUgcGFyc2VyIGZyYW1ld29yay4KLSAqIAotICogQHNlZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5UeXBlTWFuYWdlcgotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVR5cGVNYW5hZ2VyIGltcGxlbWVudHMgVHlwZU1hbmFnZXIgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEV4YW1wbGVUeXBlTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBFeGFtcGxlVHlwZU1hbmFnZXIoKTsKLSAgICAKLSAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNEb2N1bWVudFR5cGU7Ci0gICAgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsIGNtaXNEb2N1bWVudFR5cGVDb250YWluZXI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUeXBlTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIElOU1RBTkNFOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEV4YW1wbGVUeXBlTWFuYWdlcigpIHsKLSAgICAgICAgY21pc0RvY3VtZW50VHlwZSA9IGNyZWF0ZURvY3VtZW50VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgY21pc0RvY3VtZW50VHlwZUNvbnRhaW5lciA9IG5ldyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwoY21pc0RvY3VtZW50VHlwZSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGdldFR5cGVCeUlkKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgaWYgKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpLmVxdWFscyh0eXBlSWQpKQotICAgICAgICAgICAgcmV0dXJuIGNtaXNEb2N1bWVudFR5cGVDb250YWluZXI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlQnlRdWVyeU5hbWUoU3RyaW5nIHR5cGVRdWVyeU5hbWUpIHsKLSAgICAgICAgaWYgKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpLmVxdWFscyh0eXBlUXVlcnlOYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBjbWlzRG9jdW1lbnRUeXBlQ29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVmaW5pdGlvbkxpc3QoKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHRkYyA9IGNtaXNEb2N1bWVudFR5cGVDb250YWluZXI7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRkYyk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0Um9vdFR5cGVzKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0ZGMgPSBjbWlzRG9jdW1lbnRUeXBlQ29udGFpbmVyOwotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0ZGMpOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUlkRm9yUXVlcnlOYW1lKFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uLCBTdHJpbmcgcHJvcFF1ZXJ5TmFtZSkgewotICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZCA6IHR5cGVEZWZpbml0aW9uLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKHBkLmdldFF1ZXJ5TmFtZSgpLmVxdWFscyhwcm9wUXVlcnlOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwZC5nZXRJZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50VHlwZURlZmluaXRpb24gY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbigpIHsKLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsIHR5cGVEZWYgPSBuZXcgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgdHlwZURlZi5zZXRCYXNlVHlwZUlkKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SWQoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCkpOwotICAgICAgICB0eXBlRGVmLnNldERpc3BsYXlOYW1lKCJDTUlTIERvY3VtZW50Iik7Ci0gICAgICAgIC8vIGNyZWF0ZSBzb21lIHN1aXRhYmxlIGRlZmF1bHRzIGZvciBjb252ZW5pZW5jZQotICAgICAgICB0eXBlRGVmLnNldERlc2NyaXB0aW9uKCJEZXNjcmlwdGlvbiBvZiBDTUlTIERvY3VtZW50IFR5cGUiKTsKLSAgICAgICAgdHlwZURlZi5zZXRMb2NhbE5hbWUodHlwZURlZi5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgdHlwZURlZi5zZXRMb2NhbE5hbWVzcGFjZSgibG9jYWwiKTsKLSAgICAgICAgdHlwZURlZi5zZXRRdWVyeU5hbWUodHlwZURlZi5nZXRJZCgpKTsKLSAgICAgICAgdHlwZURlZi5zZXRJc0NvbnRyb2xsYWJsZUFjbCh0cnVlKTsKLSAgICAgICAgdHlwZURlZi5zZXRJc0NvbnRyb2xsYWJsZVBvbGljeShmYWxzZSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNDcmVhdGFibGUodHJ1ZSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNGaWxlYWJsZSh0cnVlKTsKLSAgICAgICAgdHlwZURlZi5zZXRJc0Z1bGx0ZXh0SW5kZXhlZChmYWxzZSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkodHJ1ZSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0SXNRdWVyeWFibGUodHJ1ZSk7Ci0KLSAgICAgICAgVHlwZU11dGFiaWxpdHlJbXBsIHR5cGVNdXRhYmlsaXR5ID0gbmV3IFR5cGVNdXRhYmlsaXR5SW1wbCgpOwotICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5DcmVhdGUodHJ1ZSk7Ci0gICAgICAgIHR5cGVNdXRhYmlsaXR5LnNldENhbkRlbGV0ZShmYWxzZSk7Ci0gICAgICAgIHR5cGVNdXRhYmlsaXR5LnNldENhblVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIHR5cGVEZWYuc2V0VHlwZU11dGFiaWxpdHkgKHR5cGVNdXRhYmlsaXR5KTsKLQotCi0gICAgICAgIC8vIGRvY3VtZW50IHNwZWNpZmljczoKLSAgICAgICAgdHlwZURlZi5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChDb250ZW50U3RyZWFtQWxsb3dlZC5BTExPV0VEKTsKLSAgICAgICAgdHlwZURlZi5zZXRJc1ZlcnNpb25hYmxlKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4oKTsKLSAgICAgICAgc2V0QmFzaWNEb2N1bWVudFByb3BlcnR5RGVmaW5pdGlvbnMocHJvcHMpOwotICAgICAgICB0eXBlRGVmLnNldFByb3BlcnR5RGVmaW5pdGlvbnMocHJvcHMpOyAvLyBzZXQgaW5pdGlhbCBlbXB0eSBzZXQgb2YgcHJvcGVydGllcwotCi0gICAgICAgIHJldHVybiB0eXBlRGVmOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRCYXNpY0RvY3VtZW50UHJvcGVydHlEZWZpbml0aW9ucyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLSAgICAgICAgCi0gICAgICAgIHNldEJhc2ljUHJvcGVydHlEZWZpbml0aW9ucyhwcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwgcHJvcEIgPSBjcmVhdGVCb29sZWFuRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUsCi0gICAgICAgICAgICAgICAgIkltbXV0YWJsZSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BCLmdldElkKCksIHByb3BCKTsKLQotICAgICAgICBwcm9wQiA9IGNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICJJcyBMYXRlc3QgVmVyc2lvbiIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BCLmdldElkKCksIHByb3BCKTsKLQotICAgICAgICBwcm9wQiA9IGNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgIklzIE1ham9yIFZlcnNpb24iLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wQi5nZXRJZCgpLCBwcm9wQik7Ci0KLSAgICAgICAgcHJvcEIgPSBjcmVhdGVCb29sZWFuRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAiSXMgTGF0ZXN0IE1ham9yIFZlcnNpb24iLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wQi5nZXRJZCgpLCBwcm9wQik7Ci0KLSAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wUyA9IGNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCwKLSAgICAgICAgICAgICAgICAiVmVyc2lvbiBMYWJlbCIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwgcHJvcElkID0gY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0lELAotICAgICAgICAgICAgICAgICJWZXJzaW9uIFNlcmllcyBJZCIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BJZC5zZXRJc1F1ZXJ5YWJsZShmYWxzZSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BJZC5nZXRJZCgpLCBwcm9wSWQpOwotCi0gICAgICAgIHByb3BCID0gY3JlYXRlQm9vbGVhbkRlZmluaXRpb24oUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsCi0gICAgICAgICAgICAgICAgIkNoZWNrZWQgT3V0IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcEIuZ2V0SWQoKSwgcHJvcEIpOwotCi0gICAgICAgIHByb3BTID0gY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwKLSAgICAgICAgICAgICAgICAiQ2hlY2tlZCBPdXQgQnkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0KLSAgICAgICAgcHJvcElkID0gY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lELAotICAgICAgICAgICAgICAgICJDaGVja2VkIE91dCBJZCIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BJZC5nZXRJZCgpLCBwcm9wSWQpOwotCi0gICAgICAgIHByb3BTID0gY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQsCi0gICAgICAgICAgICAgICAgIkNoZWNraW4gQ29tbWVudCIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIC8vIHJlYWQtb25seSwgYmVjYXVzZQotICAgICAgICAvLyBub3Qgc2V0IGFzIHByb3BlcnR5Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wSSA9IGNyZWF0ZUludGVnZXJEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwgIkNvbnRlbnQgTGVuZ3RoIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcEkuZ2V0SWQoKSwgcHJvcEkpOwotCi0gICAgICAgIHByb3BTID0gY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUsCi0gICAgICAgICAgICAgICAgIk1pbWUgVHlwZSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICBwcm9wUyA9IGNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FLAotICAgICAgICAgICAgICAgICJGaWxlIE5hbWUiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0KLSAgICAgICAgcHJvcElkID0gY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0lELCAiU3RyZWFtIElkIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcElkLmdldElkKCksIHByb3BJZCk7Ci0KLSAgICAgICAgLy8gQ01JUyAxLjE6Ci0gICAgICAgIHByb3BCID0gY3JlYXRlQm9vbGVhbkRlZmluaXRpb24oUHJvcGVydHlJZHMuSVNfUFJJVkFURV9XT1JLSU5HX0NPUFksICJQcml2YXRlIFdvcmtpbmcgQ29weSIsIAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BCLmdldElkKCksIHByb3BCKTsKLQotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyB2b2lkIHNldEJhc2ljUHJvcGVydHlEZWZpbml0aW9ucyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLQotICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3BTID0gY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5OQU1FLAotICAgICAgICAgICAgICAgICJOYW1lIiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIHByb3BTLnNldElzUmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwgcHJvcElkID0gY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLk9CSkVDVF9JRCwKLSAgICAgICAgICAgICAgICAiT2JqZWN0IElkIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcElkLmdldElkKCksIHByb3BJZCk7Ci0KLSAgICAgICAgcHJvcElkID0gY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiVHlwZS1JZCIsIFVwZGF0YWJpbGl0eS5PTkNSRUFURSk7Ci0gICAgICAgIHByb3BJZC5zZXRJc1JlcXVpcmVkKHRydWUpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wSWQuZ2V0SWQoKSwgcHJvcElkKTsKLQotICAgICAgICBwcm9wSWQgPSBjcmVhdGVJZERlZmluaXRpb24oUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lELCAiQmFzZS1UeXBlLUlkIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcElkLmdldElkKCksIHByb3BJZCk7Ci0KLSAgICAgICAgcHJvcFMgPSBjcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNSRUFURURfQlksICJDcmVhdGVkIEJ5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcFMuZ2V0SWQoKSwgcHJvcFMpOwotCi0gICAgICAgIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCBwcm9wRCA9IGNyZWF0ZURhdGVUaW1lRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLCAiQ3JlYXRpb24gRGF0ZSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BELmdldElkKCksIHByb3BEKTsKLQotICAgICAgICBwcm9wUyA9IGNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWSwKLSAgICAgICAgICAgICAgICAiTW9kaWZpZWQgQnkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0KLSAgICAgICAgcHJvcEQgPSBjcmVhdGVEYXRlVGltZURlZmluaXRpb24oUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURSwKLSAgICAgICAgICAgICAgICAiTW9kaWZpY2F0aW9uIERhdGUiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wRC5nZXRJZCgpLCBwcm9wRCk7Ci0KLSAgICAgICAgcHJvcFMgPSBjcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTiwgIkNoYW5nZSBUb2tlbiIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICAvLyBDTUlTIDEuMToKLSAgICAgICAgcHJvcFMgPSBjcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLkRFU0NSSVBUSU9OLCAiRGVzY3JpcHRpb24iLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcFMuZ2V0SWQoKSwgcHJvcFMpOwotCi0gICAgICAgIHByb3BJZCA9IGNyZWF0ZUlkTXVsdGlEZWZpbml0aW9uKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsICJTZWNvbmRhcnkgVHlwZSBJZHMiLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wSWQuZ2V0SWQoKSwgcHJvcElkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNyZWF0ZVN0YW5kYXJkRGVmaW5pdGlvbihBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wLCBTdHJpbmcgaWQsIFByb3BlcnR5VHlwZSBwcm9wVHlwZSwKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkgY2FyZCwgVXBkYXRhYmlsaXR5IHVwZCkgewotCi0gICAgICAgICAgICBwcm9wLnNldElkKGlkKTsKLSAgICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3Auc2V0RGlzcGxheU5hbWUoIlNhbXBsZSAiICsgcHJvcC5nZXRJZCgpICsgIiBib29sZWFuIHByb3BlcnR5Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9wLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBwcm9wLnNldERlc2NyaXB0aW9uKCJUaGlzIGlzIGEgIiArIHByb3AuZ2V0RGlzcGxheU5hbWUoKSArICIgcHJvcGVydHkuIik7Ci0gICAgICAgIHByb3Auc2V0TG9jYWxOYW1lKGlkKTsKLSAgICAgICAgcHJvcC5zZXRMb2NhbE5hbWVzcGFjZSgibG9jYWwiKTsKLSAgICAgICAgcHJvcC5zZXRRdWVyeU5hbWUoaWQpOwotICAgICAgICBwcm9wLnNldElzSW5oZXJpdGVkKGZhbHNlKTsKLSAgICAgICAgcHJvcC5zZXRDYXJkaW5hbGl0eShjYXJkKTsKLSAgICAgICAgcHJvcC5zZXRJc09wZW5DaG9pY2UoZmFsc2UpOwotICAgICAgICBwcm9wLnNldElzUXVlcnlhYmxlKHRydWUpOwotICAgICAgICBwcm9wLnNldElzUmVxdWlyZWQoZmFsc2UpOwotICAgICAgICBwcm9wLnNldElzT3JkZXJhYmxlKHRydWUpOwotICAgICAgICBwcm9wLnNldFByb3BlcnR5VHlwZShwcm9wVHlwZSk7Ci0gICAgICAgIHByb3Auc2V0VXBkYXRhYmlsaXR5KHVwZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwgY3JlYXRlQm9vbGVhbkRlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsIFVwZGF0YWJpbGl0eSB1cGQpIHsKLSAgICAgICAgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5CT09MRUFOLCBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkuU0lOR0xFLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwgY3JlYXRlRGF0ZVRpbWVEZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLAotICAgICAgICAgICAgVXBkYXRhYmlsaXR5IHVwZCkgewotICAgICAgICBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuREFURVRJTUUsIGRpc3BsYXlOYW1lLCBDYXJkaW5hbGl0eS5TSU5HTEUsIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCBjcmVhdGVJZERlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsIFVwZGF0YWJpbGl0eSB1cGQpIHsKLSAgICAgICAgUHJvcGVydHlJZERlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlJZERlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIGNyZWF0ZVN0YW5kYXJkRGVmaW5pdGlvbihwcm9wLCBpZCwgUHJvcGVydHlUeXBlLklELCBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkuU0lOR0xFLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCBjcmVhdGVJZE11bHRpRGVmaW5pdGlvbihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgVXBkYXRhYmlsaXR5IHVwZCkgewotICAgICAgICBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuSUQsIGRpc3BsYXlOYW1lLCBDYXJkaW5hbGl0eS5NVUxUSSwgdXBkKTsKLSAgICAgICAgcmV0dXJuIHByb3A7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBjcmVhdGVJbnRlZ2VyRGVmaW5pdGlvbihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgVXBkYXRhYmlsaXR5IHVwZCkgewotICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wID0gbmV3IFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIGNyZWF0ZVN0YW5kYXJkRGVmaW5pdGlvbihwcm9wLCBpZCwgUHJvcGVydHlUeXBlLklOVEVHRVIsIGRpc3BsYXlOYW1lLCBDYXJkaW5hbGl0eS5TSU5HTEUsIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgVXBkYXRhYmlsaXR5IHVwZCkgewotICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5TVFJJTkcsIGRpc3BsYXlOYW1lLCBDYXJkaW5hbGl0eS5TSU5HTEUsIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvcXVlcnkvZXhhbXBsZS9FeHRlbmRlZEFic3RyYWN0UHJlZGljYXRlV2Fsa2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9xdWVyeS9leGFtcGxlL0V4dGVuZGVkQWJzdHJhY3RQcmVkaWNhdGVXYWxrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1NjQ5ZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2FtcGxlcy9jaGVtaXN0cnktb3BlbmNtaXMtcXVlcnlwYXJzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9xdWVyeS9leGFtcGxlL0V4dGVuZGVkQWJzdHJhY3RQcmVkaWNhdGVXYWxrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucXVlcnkuZXhhbXBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkFic3RyYWN0UHJlZGljYXRlV2Fsa2VyOwotCi0vKioKLSAqIEFuIGV4dGVuZGVkIHdhbGtlciBhcHByb2FjaCB3aXRoIG1vcmUgZmluZSBncmFpbmVkIGNvbnRyb2wgYW5kIG1vcmUgY2FsbGJhY2sKLSAqIGhvb2tzLiBUaGlzIGNsYXNzIGlzIGluZGVwZW5kZW50IG9mIHRoZSB0YXJnZXQgb3V0cHV0LgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVuZGVkQWJzdHJhY3RQcmVkaWNhdGVXYWxrZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWRpY2F0ZVdhbGtlciB7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblN0YXJ0UHJvY2Vzc2luZyhUcmVlIHdoZXJlTm9kZSk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25TdG9wUHJvY2Vzc2luZygpOwotCi0gICAgLy8gQ29tcGFyZSBvcGVyYXRvcnMKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUVxdWFscyhUcmVlIGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsgICAgICAgIAotICAgIH0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkVxdWFscyhUcmVlIGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEVxdWFscyhUcmVlIGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsgICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlTm90RXF1YWxzKFRyZWUgbmVOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgeyAgICAgICAgCi0gICAgfQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uTm90RXF1YWxzKFRyZWUgbmVOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0Tm90RXF1YWxzKFRyZWUgbmVOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgeyAgICAgICAgCi0gICAgfQotIAotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlR3JlYXRlclRoYW4oVHJlZSBndE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25HcmVhdGVyVGhhbihUcmVlIGd0Tm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEdyZWF0ZXJUaGFuKFRyZWUgZ3ROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgeyAgICAgICAgCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVHcmVhdGVyT3JFcXVhbHMoVHJlZSBnZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25HcmVhdGVyT3JFcXVhbHMoVHJlZSBnZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RHcmVhdGVyT3JFcXVhbHMoVHJlZSBnZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUxlc3NUaGFuKFRyZWUgbHROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgIHsgICAgICAgIAotICAgIH0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkxlc3NUaGFuKFRyZWUgbHROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0TGVzc1RoYW4oVHJlZSBsdE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUxlc3NPckVxdWFscyhUcmVlIGxlcU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25MZXNzT3JFcXVhbHMoVHJlZSBsZXFOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0TGVzc09yRXF1YWxzKFRyZWUgbGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsgICAgICAgIAotICAgIH0KLQotICAgIC8vIEJvb2xlYW4gb3BlcmF0b3JzCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Ob3QoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUpOwotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdE5vdChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSkgewotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUFuZChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25BbmQoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RBbmQoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlT3IoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uT3IoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RPcihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICB9Ci0KLSAgICAvLyBNdWx0aS12YWx1ZToKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUluKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25JbihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsgICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlTm90SW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsgICAgICAgIAotICAgIH0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbk5vdEluKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3ROb3RJbihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgeyAgICAgICAgCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVJbkFueShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgeyAgICAgICAgCi0gICAgfQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOwotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEluQW55KFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZU5vdEluQW55KFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7ICAgICAgICAKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Ob3RJbkFueShUcmVlIG5vZGUsIFRyZWUgbGl0ZXJhbE5vZGUsIFRyZWUgY29sTm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0Tm90SW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUVxQW55KFRyZWUgbm9kZSwgVHJlZSBsaXRlcmFsTm9kZSwgVHJlZSBjb2xOb2RlKSB7Ci0gICAgfQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uRXFBbnkoVHJlZSBub2RlLCBUcmVlIGxpdGVyYWxOb2RlLCBUcmVlIGNvbE5vZGUpOwotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEVxQW55KFRyZWUgbm9kZSwgVHJlZSBsaXRlcmFsTm9kZSwgVHJlZSBjb2xOb2RlKSB7ICAgICAgICAKLSAgICB9Ci0KLSAgICAvLyBOdWxsIGNvbXBhcmlzb25zOgotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSXNOdWxsKFRyZWUgbnVsbE5vZGUsIFRyZWUgY29sTm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SXNOdWxsKFRyZWUgbnVsbE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSXNOb3ROdWxsKFRyZWUgbm90TnVsbE5vZGUsIFRyZWUgY29sTm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SXNOb3ROdWxsKFRyZWUgbm90TnVsbE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgIH0KLSAgICAKLSAgICAvLyBTdHJpbmcgbWF0Y2hpbmc6Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVJc0xpa2UoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSkgewotICAgIH0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbklzTGlrZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBzdHJpbmdOb2RlKTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RJc0xpa2UoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlSXNOb3RMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Jc05vdExpa2UoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SXNOb3RMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkluRm9sZGVyKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHBhcmFtTm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25CZXR3ZWVuSW5Gb2xkZXIoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEluRm9sZGVyKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHBhcmFtTm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSW5UcmVlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHBhcmFtTm9kZSk7Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25CZXR3ZWVuSW5UcmVlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHBhcmFtTm9kZSkgewotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RJblRyZWUoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uU2NvcmUoVHJlZSBub2RlKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkNvbE5vZGUoVHJlZSBub2RlKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZVRleHRBbmQoVHJlZSBub2RlLCBMaXN0PFRyZWU+IGNvbmp1bmN0aW9uTm9kZXMpIHsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25UZXh0QW5kKFRyZWUgbm9kZSwgTGlzdDxUcmVlPiBjb25qdW5jdGlvbk5vZGVzLCBpbnQgaW5kZXgpOwotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdFRleHRBbmQoVHJlZSBub2RlLCBMaXN0PFRyZWU+IGNvbmp1bmN0aW9uTm9kZXMpIHsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVUZXh0T3IoVHJlZSBub2RlLCBMaXN0PFRyZWU+IHRlcm1Ob2RlcykgewotICAgIH0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblRleHRPcihUcmVlIG5vZGUsIExpc3Q8VHJlZT4gdGVybU5vZGVzLCBpbnQgaW5kZXgpOwotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdFRleHRPcihUcmVlIG5vZGUsIExpc3Q8VHJlZT4gdGVybU5vZGVzKSB7Ci0gICAgfQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uVGV4dE1pbnVzKFRyZWUgbm9kZSwgVHJlZSBub3ROb2RlKTsKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RUZXh0TWludXMoVHJlZSBub2RlLCBUcmVlIG5vdE5vZGUpIHsgICAgICAgIAotICAgIH0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblRleHRXb3JkKFN0cmluZyB3b3JkKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblRleHRQaHJhc2UoU3RyaW5nIHBocmFzZSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVDb250YWlucyhUcmVlIG5vZGUsIFRyZWUgdHlwZU5vZGUsIFRyZWUgc2VhcmNoRXhwck5vZGUpIHsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkNvbnRhaW5zKFRyZWUgbm9kZSwgVHJlZSB0eXBlTm9kZSwgVHJlZSBzZWFyY2hFeHByTm9kZSk7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgb25CZXR3ZWVuQ29udGFpbnMoVHJlZSBub2RlLCBUcmVlIHR5cGVOb2RlLCBUcmVlIHNlYXJjaEV4cHJOb2RlKSB7ICAgICAgICAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zYW1wbGVzL2NoZW1pc3RyeS1vcGVuY21pcy1xdWVyeXBhcnNlci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3F1ZXJ5L2V4YW1wbGUvRXhhbXBsZVF1ZXJ5UHJvY2Vzc29yVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvcXVlcnkvZXhhbXBsZS9FeGFtcGxlUXVlcnlQcm9jZXNzb3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDAxN2YuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNhbXBsZXMvY2hlbWlzdHJ5LW9wZW5jbWlzLXF1ZXJ5cGFyc2VyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvcXVlcnkvZXhhbXBsZS9FeGFtcGxlUXVlcnlQcm9jZXNzb3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnF1ZXJ5LmV4YW1wbGU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHRoZSBzYW1wbGUgcGFyc2VyLiBDYWxscyB0aGUgbWFpbiBlbnRyeSBwb2ludCBhbmQgY29tcGFyZXMgb3V0cHV0Ci0gKiBhZ2FpbnN0IHRoZSBleHBlY3RlZCByZXN1bHQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVF1ZXJ5UHJvY2Vzc29yVGVzdCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBFeGFtcGxlUXVlcnlQcm9jZXNzb3IgcXVlcnlQcm9jZXNzb3I7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlQcmVmaXggPSAiU0VMRUNUIGNtaXM6bmFtZSwgY21pczpvYmplY3RJZCBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgIjsKLSAgICBwcml2YXRlIFN0cmluZyBleHBlY3RlZFByZWZpeCA9ICJTRUxFQ1QgY21pczpuYW1lLCBjbWlzOm9iamVjdElkIEZST00gY21pczpkb2N1bWVudCBXSEVSRSAiOwotICAgIAotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgcXVlcnlQcm9jZXNzb3IgPSBuZXcgRXhhbXBsZVF1ZXJ5UHJvY2Vzc29yKCk7Ci0gICAgfQotICAgIAotICAgIEBUZXN0IAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgImNtaXM6bmFtZSA9ICdNeURvY3VtZW50JyI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICIoY21pczpuYW1lID0gJ015RG9jdW1lbnQnKSI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOwotICAgICAgICAKLSAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVByZWZpeCArICJTQ09SRSgpID0gMTAwIjsKLSAgICAgICAgcmVzcG9uc2UgPSBxdWVyeVByb2Nlc3Nvci5wYXJzZVF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICIoU0NPUkUoKSA9IDEwMCkiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsKLSAgICB9Ci0gICAgCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxzKCkgewotICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBxdWVyeVByZWZpeCArICJjbWlzOm5hbWUgPD4gJ015RG9jdW1lbnQnIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgImNtaXM6bmFtZSA8PiAnTXlEb2N1bWVudCciOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMZXNzVGhhbigpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiY21pczpjb250ZW50U3RyZWFtTGVuZ3RoIDwgMTA0ODU3NiI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGggPCAxMDQ4NTc2IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyVGhhbigpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiY21pczpjb250ZW50U3RyZWFtTGVuZ3RoID4gMTA0ODU3NiI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGggPiAxMDQ4NTc2IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMZXNzT3JFcXVhbHMoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCA8PSAxMDQ4NTc2IjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCA8PSAxMDQ4NTc2IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyT3JFcXVhbHMoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCA+PSAxMDQ4NTc2IjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCA+PSAxMDQ4NTc2IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbigpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiY21pczpuYW1lIElOICgnTXlEb2N1bWVudCcsICdZb3VyRG9jdW1lbnQnKSI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJjbWlzOm5hbWUgSU4gKCdNeURvY3VtZW50JywgJ1lvdXJEb2N1bWVudCcpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90SW4oKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgImNtaXM6bmFtZSBOT1QgSU4gKCdNeURvY3VtZW50JywgJ1lvdXJEb2N1bWVudCcpIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgImNtaXM6bmFtZSBOT1QgSU4gKCdNeURvY3VtZW50JywgJ1lvdXJEb2N1bWVudCcpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlJbigpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiQU5ZIGNtaXM6c2Vjb25kYXJ5T2JqZWN0VHlwZUlkcyBJTiAoJ015U2Vjb25kYXJ5VHlwZScsICdZb3VyU2Vjb25kYXJ5VHlwZScpIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgIkFOWSBjbWlzOnNlY29uZGFyeU9iamVjdFR5cGVJZHMgSU4gKCdNeVNlY29uZGFyeVR5cGUnLCAnWW91clNlY29uZGFyeVR5cGUnKSI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOyAgICAgICAgCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55Tm90SW4oKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIkFOWSBjbWlzOnNlY29uZGFyeU9iamVjdFR5cGVJZHMgTk9UIElOICgnTXlTZWNvbmRhcnlUeXBlJywgJ1lvdXJTZWNvbmRhcnlUeXBlJykiOwotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBxdWVyeVByb2Nlc3Nvci5wYXJzZVF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gZXhwZWN0ZWRQcmVmaXggKyAiQU5ZIGNtaXM6c2Vjb25kYXJ5T2JqZWN0VHlwZUlkcyBOT1QgSU4gKCdNeVNlY29uZGFyeVR5cGUnLCAnWW91clNlY29uZGFyeVR5cGUnKSI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOyAgICAgICAgCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXFBbnkoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIidNeVNlY29uZGFyeVR5cGUnID0gQU5ZIGNtaXM6c2Vjb25kYXJ5T2JqZWN0VHlwZUlkcyI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICInTXlTZWNvbmRhcnlUeXBlJyA9IEFOWSBjbWlzOnNlY29uZGFyeU9iamVjdFR5cGVJZHMiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsgICAgICAgIAotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElzTnVsbCgpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiY21pczpkZXNjcmlwdGlvbiBJUyBOVUxMIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgImNtaXM6ZGVzY3JpcHRpb24gSVMgTlVMTCI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOyAgICAgICAgCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNOb3ROdWxsKCkgewotICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBxdWVyeVByZWZpeCArICJjbWlzOmRlc2NyaXB0aW9uIElTIE5PVCBOVUxMIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgImNtaXM6ZGVzY3JpcHRpb24gSVMgTk9UIE5VTEwiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBAVGVzdCAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlrZSgpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gIlNFTEVDVCBjbWlzOm5hbWUgQVMgbmFtZSwgY21pczpvYmplY3RUeXBlSWQsIFNDT1JFKCkgRlJPTSBjbWlzOmRvY3VtZW50IFdIRVJFIGNtaXM6bmFtZSBMSUtFICdNeSUnIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJTRUxFQ1QgY21pczpuYW1lIEFTIG5hbWUsIGNtaXM6b2JqZWN0VHlwZUlkLCBTQ09SRSgpIEZST00gY21pczpkb2N1bWVudCBXSEVSRSAoY21pczpuYW1lIExJS0UgJ015JScpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TGlrZSgpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiY21pczpuYW1lIE5PVCBMSUtFICdNeSUnIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgImNtaXM6bmFtZSBOT1QgTElLRSAnTXklJyI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOyAgICAgICAgCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5Gb2xkZXIoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIklOX0ZPTERFUignMTAwJykiOwotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBxdWVyeVByb2Nlc3Nvci5wYXJzZVF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gZXhwZWN0ZWRQcmVmaXggKyAiSU5fRk9MREVSKCcxMDAnKSI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOyAgICAgICAgCi0KLSAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVByZWZpeCArICJJTl9GT0xERVIoY21pczpkb2N1bWVudCwgJzEwMCcpIjsKLSAgICAgICAgcmVzcG9uc2UgPSBxdWVyeVByb2Nlc3Nvci5wYXJzZVF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJJTl9GT0xERVIoY21pczpkb2N1bWVudCwgJzEwMCcpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJblRyZWUoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIklOX1RSRUUoJzEwMCcpIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgIklOX1RSRUUoJzEwMCcpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLQotICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIklOX1RSRUUoY21pczpkb2N1bWVudCwgJzEwMCcpIjsKLSAgICAgICAgcmVzcG9uc2UgPSBxdWVyeVByb2Nlc3Nvci5wYXJzZVF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJJTl9UUkVFKGNtaXM6ZG9jdW1lbnQsICcxMDAnKSI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOyAgICAgICAgCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW5kKCkgewotICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBxdWVyeVByZWZpeCArICJjbWlzOm5hbWUgTk9UIExJS0UgJ015KicgQU5EIGNtaXM6ZGVzY3JpcHRpb24gSVMgTlVMTCI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICIoY21pczpuYW1lIE5PVCBMSUtFICdNeSonIEFORCBjbWlzOmRlc2NyaXB0aW9uIElTIE5VTEwpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcigpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiY21pczpuYW1lIE5PVCBMSUtFICdNeSonIE9SIGNtaXM6ZGVzY3JpcHRpb24gSVMgTlVMTCI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICIoY21pczpuYW1lIE5PVCBMSUtFICdNeSonIE9SIGNtaXM6ZGVzY3JpcHRpb24gSVMgTlVMTCkiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsgICAgICAgIAotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdCgpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiTk9UIElOX0ZPTERFUignMTAwJykiOwotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBxdWVyeVByb2Nlc3Nvci5wYXJzZVF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gZXhwZWN0ZWRQcmVmaXggKyAiTk9UIChJTl9GT0xERVIoJzEwMCcpKSI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UpOyAgICAgICAgCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIkNPTlRBSU5TKCdGb28nKSI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJDT05UQUlOUygnRm9vJykiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsKLSAgICAgICAgCi0gICAgICAgIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiQ09OVEFJTlMoY21pczpkb2N1bWVudCwgJ0ZvbycpIjsKLSAgICAgICAgcmVzcG9uc2UgPSBxdWVyeVByb2Nlc3Nvci5wYXJzZVF1ZXJ5KHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJDT05UQUlOUyhjbWlzOmRvY3VtZW50LCAnRm9vJykiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0QW5kKCkgewotICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBxdWVyeVByZWZpeCArICJDT05UQUlOUygnYWJjIGRlZicpIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgIkNPTlRBSU5TKCdhYmMgZGVmJykiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsgICAgICAgIAotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRleHRPcigpIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcXVlcnlQcmVmaXggKyAiQ09OVEFJTlMoJ2FiYyBPUiBkZWYnKSI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJDT05UQUlOUygnYWJjIE9SIGRlZicpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0TWludXMoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIkNPTlRBSU5TKCdhYmMgLWRlZicpIjsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcXVlcnlQcm9jZXNzb3IucGFyc2VRdWVyeShxdWVyeVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgIkNPTlRBSU5TKCdhYmMgLWRlZicpIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2UoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIkNPTlRBSU5TKCdcXCdhYmNcXCcnKSI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJDT05UQUlOUygnXFwnYWJjXFwnJykiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsgICAgICAgIAotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdvcmQoKSB7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgIkNPTlRBSU5TKCdGb28nKSI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICJDT05UQUlOUygnRm9vJykiOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlKTsgICAgICAgIAotICAgIH0KLQotICAgIEBUZXN0IAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlckJ5KCkgewotICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSBxdWVyeVByZWZpeCArICJjbWlzOm5hbWUgPSAnTXlEb2N1bWVudCcgT1JERVIgQlkgY21pczpvYmplY3RJZCI7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBleHBlY3RlZFByZWZpeCArICIoY21pczpuYW1lID0gJ015RG9jdW1lbnQnKSBPUkRFUiBCWSBjbWlzOm9iamVjdElkIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7Ci0gICAgICAgIAotICAgICAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5UHJlZml4ICsgImNtaXM6bmFtZSA9ICdNeURvY3VtZW50JyBPUkRFUiBCWSBjbWlzOm5hbWUgQVNDLCBjbWlzOm9iamVjdElkIERFU0MiOwotICAgICAgICByZXNwb25zZSA9IHF1ZXJ5UHJvY2Vzc29yLnBhcnNlUXVlcnkocXVlcnlTdHJpbmcpOwotICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkUHJlZml4ICsgIihjbWlzOm5hbWUgPSAnTXlEb2N1bWVudCcpIE9SREVSIEJZIGNtaXM6bmFtZSwgY21pczpvYmplY3RJZCBERVNDIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTUxM2RmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1hcmNoZXR5cGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLSAgICAgICAgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi0gICAgICAgIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAgICAgICAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAgICAgICAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZcO8IExpY2Vuc2UuCi0gICAgLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZTwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5PcGVuQ01JUyBTZXJ2ZXIgQXJjaGV0eXBlPC9uYW1lPgotICAgIDxwYWNrYWdpbmc+bWF2ZW4tYXJjaGV0eXBlPC9wYWNrYWdpbmc+Ci0gICAgPGRlc2NyaXB0aW9uPk9wZW5DTUlTIFNlcnZlciBGcmFtZXdvcmsgYXJjaGV0eXBlPC9kZXNjcmlwdGlvbj4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8cGFyZW50QmFzZWRpcj4uLi8uLi88L3BhcmVudEJhc2VkaXI+Ci0gICAgICAgIDxvcGVuY21pc1ZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9vcGVuY21pc1ZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPiAgIAotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWw8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDxleHRlbnNpb25zPgotICAgICAgICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmFyY2hldHlwZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hcmNoZXR5cGUtcGFja2FnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICA8L2V4dGVuc2lvbnM+Ci0KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoZXR5cGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmludGVncmF0aW9uLXRlc3Q8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmludGVncmF0aW9uLXRlc3Q8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotCi0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgIDxlc2NhcGVTdHJpbmc+XDwvZXNjYXBlU3RyaW5nPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLSAgICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmYzk4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotICAgIDwhLS0KLSAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICAgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MKLSAgICAgICAgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAgIC0tPgotCi08YXJjaGV0eXBlLWRlc2NyaXB0b3IgbmFtZT0iT3BlbkNNSVMgU2VydmVyIEZyYW1ld29yayI+Ci0KLSAgICA8ZmlsZVNldHM+Ci0gICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyouamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3dlYmFwcDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLndzZGw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyouanNwPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci0KLSAgICA8cmVxdWlyZWRQcm9wZXJ0aWVzPgotICAgICAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9InByb2plY3RQcmVmaXgiLz4KLSAgICA8L3JlcXVpcmVkUHJvcGVydGllcz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MTdhYWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxncm91cElkPlwke2dyb3VwSWR9PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPlwke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPlwke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPG9wZW5jbWlzLnZlcnNpb24+JHtvcGVuY21pc1ZlcnNpb259PC9vcGVuY21pcy52ZXJzaW9uPgotICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8bmFtZT5Zb3VyIE9wZW5DTUlTIFNlcnZlcjwvbmFtZT4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS42PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPG92ZXJsYXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJsYXk+PC9vdmVybGF5PgotICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJsYXk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGV4Y2x1ZGUgZXZlcnl0aGluZyB5b3UgZG9uJ3QgbmVlZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+aW5kZXguaHRtbDwvZXhjbHVkZT4gPCEtLSBkZWZhdWx0IGluZGV4IHBhZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmNzcy8qKjwvZXhjbHVkZT4gPCEtLSBDU1MgZm9yIHRoZSBkZWZhdWx0IGluZGV4IHBhZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmltYWdlcy8qKjwvZXhjbHVkZT4gPCEtLSBpbWFnZXMgZm9yIHRoZSBkZWZhdWx0IGluZGV4IHBhZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPndlYi8qKjwvZXhjbHVkZT4gPCEtLSBzYW1wbGUgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+V0VCLUlORi9jbGFzc2VzL3NhbXBsZS1yZXBvc2l0b3J5LnByb3BlcnRpZXM8L2V4Y2x1ZGU+IDwhLS0gc2FtcGxlIHNlcnZlciBwcm9wZXJ0aWVzIGZpbGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPldFQi1JTkYvdG9rZW4vKio8L2V4Y2x1ZGU+IDwhLS0gc2FtcGxlIEJyb3dzZXIgQmluZGluZyB0b2tlbiBpbXBsZW1lbnRhdGlvbiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GL1RISVJELVBBUlRZLUxJQ0VOU0VTPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L292ZXJsYXk+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3ZlcmxheXM+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RGlzYWJsZUlCTUpBWFdTRW5naW5lPnRydWU8L0Rpc2FibGVJQk1KQVhXU0VuZ2luZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lY2xpcHNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjk8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx3dHB2ZXJzaW9uPjIuMDwvd3RwdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHd0cENvbnRleHROYW1lPlwke2FydGlmYWN0SWR9PC93dHBDb250ZXh0TmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGRvd25sb2FkU291cmNlcz50cnVlPC9kb3dubG9hZFNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkb3dubG9hZEphdmFkb2NzPnRydWU8L2Rvd25sb2FkSmF2YWRvY3M+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rZWRSZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGlua2VkUmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3VuLWpheHdzLnhtbDwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT4xPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NhdGlvbj5QUk9KRUNUX0xPQy90YXJnZXQvXCR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9L1dFQi1JTkYvc3VuLWpheHdzLnhtbDwvbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWw8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+MTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9jYXRpb24+UFJPSkVDVF9MT0MvdGFyZ2V0L1wke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS9XRUItSU5GL3dlYi54bWw8L2xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTA8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+MjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9jYXRpb24+UFJPSkVDVF9MT0MvdGFyZ2V0L1wke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS9XRUItSU5GL2NtaXMxMDwvbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NtaXMxMTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT4yPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NhdGlvbj5QUk9KRUNUX0xPQy90YXJnZXQvXCR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9L1dFQi1JTkYvY21pczExPC9sb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlua2VkUmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvbGlua2VkUmVzb3VyY2VzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPlwke29wZW5jbWlzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj5cJHtvcGVuY21pcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIFVuY29tbWVudCBmb3IgQ09SUyBzdXBwb3J0IAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS50aGV0cmFuc2FjdGlvbmNvbXBhbnk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb3JzLWZpbHRlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4yPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT48IS0tIGZvciBkZXZlbG9wbWVudCBvbmx5IC0tPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+XCR7b3BlbmNtaXMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PjwhLS0gZm9yIGRldmVsb3BtZW50IG9ubHkgLS0+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9fX3Byb2plY3RQcmVmaXhfX0NtaXNTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvX19wcm9qZWN0UHJlZml4X19DbWlzU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhmNjlkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9fX3Byb2plY3RQcmVmaXhfX0NtaXNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotI3NldCggJHN5bWJvbF9wb3VuZCA9ICcjJyApCi0jc2V0KCAkc3ltYm9sX2RvbGxhciA9ICckJyApCi0jc2V0KCAkc3ltYm9sX2VzY2FwZSA9ICdcJyApCi1wYWNrYWdlICR7cGFja2FnZX07Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q2hhbmdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlKb2luOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVJlbmRpdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLkFic3RyYWN0Q21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQud3JhcHBlci5DYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2U7Ci0KLS8qKgotICogQ01JUyBTZXJ2aWNlIEltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgJHtwcm9qZWN0UHJlZml4fUNtaXNTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZSBpbXBsZW1lbnRzIENhbGxDb250ZXh0QXdhcmVDbWlzU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIENhbGxDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICAvLyAtLS0gQ2FsbCBDb250ZXh0IC0tLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2FsbCBjb250ZXh0LgotICAgICAqIAotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgc2VydmljZSBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbGxDb250ZXh0KENhbGxDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjYWxsIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIENhbGxDb250ZXh0IGdldENhbGxDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvLyAtLS0gQ01JUyBPcGVyYXRpb25zIC0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gdmVyeSBiYXNpYyByZXBvc2l0b3J5IGluZm8gc2V0IHVwCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvSW1wbCByZXBvc2l0b3J5SW5mbyA9IG5ldyBSZXBvc2l0b3J5SW5mb0ltcGwoKTsKLQotICAgICAgICByZXBvc2l0b3J5SW5mby5zZXRJZCgicmVwb3NpdG9yeTEiKTsKLSAgICAgICAgcmVwb3NpdG9yeUluZm8uc2V0TmFtZSgiJHtwcm9qZWN0UHJlZml4fSIpOwotICAgICAgICByZXBvc2l0b3J5SW5mby5zZXREZXNjcmlwdGlvbigiVGhpcyBpcyBteSBmaXJzdCByZXBvc2l0b3J5ISIpOwotCi0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldENtaXNWZXJzaW9uU3VwcG9ydGVkKCIxLjAiKTsKLQotICAgICAgICByZXBvc2l0b3J5SW5mby5zZXRQcm9kdWN0TmFtZSgiTXkgRG9jdW1lbnQgTWFuYWdlbWVudCBTeXN0ZW0iKTsKLSAgICAgICAgcmVwb3NpdG9yeUluZm8uc2V0UHJvZHVjdFZlcnNpb24oIjAuMSIpOwotICAgICAgICByZXBvc2l0b3J5SW5mby5zZXRWZW5kb3JOYW1lKCJNeSBDb21wYW55Iik7Ci0KLSAgICAgICAgcmVwb3NpdG9yeUluZm8uc2V0Um9vdEZvbGRlcigiMTIzNDU2Nzg5MCIpOwotCi0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldFRoaW5DbGllbnRVcmkoIiIpOwotCi0gICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsIGNhcGFiaWxpdGllcyA9IG5ldyBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCgpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q2FwYWJpbGl0eUFjbChDYXBhYmlsaXR5QWNsLk5PTkUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0QWxsVmVyc2lvbnNTZWFyY2hhYmxlKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldENhcGFiaWxpdHlKb2luKENhcGFiaWxpdHlKb2luLk5PTkUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0U3VwcG9ydHNNdWx0aWZpbGluZyhmYWxzZSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRTdXBwb3J0c1VuZmlsaW5nKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldElzUHdjU2VhcmNoYWJsZShmYWxzZSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRJc1B3Y1VwZGF0YWJsZShmYWxzZSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5UXVlcnkoQ2FwYWJpbGl0eVF1ZXJ5Lk5PTkUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q2FwYWJpbGl0eUNoYW5nZXMoQ2FwYWJpbGl0eUNoYW5nZXMuTk9ORSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMoQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLkFOWVRJTUUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0U3VwcG9ydHNHZXREZXNjZW5kYW50cyh0cnVlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldFN1cHBvcnRzR2V0Rm9sZGVyVHJlZSh0cnVlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldENhcGFiaWxpdHlSZW5kaXRpb24oQ2FwYWJpbGl0eVJlbmRpdGlvbnMuTk9ORSk7Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoKFJlcG9zaXRvcnlJbmZvKSByZXBvc2l0b3J5SW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBUT0RPIGltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0SW5Gb2xkZXJMaXN0IGdldENoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAvLyBUT0RPIGltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9fX3Byb2plY3RQcmVmaXhfX0NtaXNTZXJ2aWNlRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL19fcHJvamVjdFByZWZpeF9fQ21pc1NlcnZpY2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWUzNDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL19fcHJvamVjdFByZWZpeF9fQ21pc1NlcnZpY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLXBhY2thZ2UgJHtwYWNrYWdlfTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLkFic3RyYWN0U2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQud3JhcHBlci5Db25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlcjsKLQotLyoqCi0gKiBDTUlTIFNlcnZpY2UgRmFjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzICR7cHJvamVjdFByZWZpeH1DbWlzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VGYWN0b3J5IHsKLQotICAgIC8qKiBEZWZhdWx0IG1heEl0ZW1zIHZhbHVlIGZvciBnZXRUeXBlQ2hpbGRyZW4oKX0uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX01BWF9JVEVNU19UWVBFUyA9IEJpZ0ludGVnZXIudmFsdWVPZigxMDAwKTsKLQotICAgIC8qKiBEZWZhdWx0IGRlcHRoIHZhbHVlIGZvciBnZXRUeXBlRGVzY2VuZGFudHMoKS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfREVQVEhfVFlQRVMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBtYXhJdGVtcyB2YWx1ZSBmb3IgZ2V0Q2hpbGRyZW4oKSBhbmQgb3RoZXIgbWV0aG9kcyByZXR1cm5pbmcKLSAgICAgKiBsaXN0cyBvZiBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9NQVhfSVRFTVNfT0JKRUNUUyA9IEJpZ0ludGVnZXIudmFsdWVPZigxMDAwMDApOwotCi0gICAgLyoqIERlZmF1bHQgZGVwdGggdmFsdWUgZm9yIGdldERlc2NlbmRhbnRzKCkuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX0RFUFRIX09CSkVDVFMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTApOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzU2VydmljZSBnZXRTZXJ2aWNlKENhbGxDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2FuIGdvIGhlcmUKLSAgICAgICAgU3RyaW5nIHVzZXIgPSBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGNvbnRleHQuZ2V0UGFzc3dvcmQoKTsKLQotICAgICAgICAvLyBpZiB0aGUgYXV0aGVudGljYXRpb24gZmFpbHMsIHRocm93IGEgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24KLQotICAgICAgICAvLyBjcmVhdGUgYSBuZXcgc2VydmljZSBvYmplY3QKLSAgICAgICAgLy8gKGNhbiBhbHNvIGJlIHBvb2xlZCBvciBzdG9yZWQgaW4gYSBUaHJlYWRMb2NhbCkKLSAgICAgICAgJHtwcm9qZWN0UHJlZml4fUNtaXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgJHtwcm9qZWN0UHJlZml4fUNtaXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBjb25mb3JtYW5jZSBDTUlTIHNlcnZpY2Ugd3JhcHBlcgotICAgICAgICAvLyAoVGhlIHdyYXBwZXIgY2F0Y2hlcyBpbnZhbGlkIENNSVMgcmVxdWVzdHMgYW5kIHNldHMgZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgLy8gZm9yIHBhcmFtZXRlcnMgdGhhdCBoYXZlIG5vdCBiZWVuIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQuKQotICAgICAgICBDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlciB3cmFwcGVyU2VydmljZSA9IAotICAgICAgICAgICAgICAgIG5ldyBDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlcihzZXJ2aWNlLCBERUZBVUxUX01BWF9JVEVNU19UWVBFUywgREVGQVVMVF9ERVBUSF9UWVBFUywgCi0gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9JVEVNU19PQkpFQ1RTLCBERUZBVUxUX0RFUFRIX09CSkVDVFMpOwotCi0gICAgICAgIC8vIGhhbmQgb3ZlciB0aGUgY2FsbCBjb250ZXh0IHRvIHRoZSBzZXJ2aWNlIG9iamVjdAotICAgICAgICB3cmFwcGVyU2VydmljZS5zZXRDYWxsQ29udGV4dChjb250ZXh0KTsKLQotICAgICAgICByZXR1cm4gd3JhcHBlclNlcnZpY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3JlcG9zaXRvcnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhNmRhNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY2xhc3M9JHtwYWNrYWdlfS4ke3Byb2plY3RQcmVmaXh9Q21pc1NlcnZpY2VGYWN0b3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODI5MDNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiCi0gICAgcGFnZUVuY29kaW5nPSJJU08tODg1OS0xIiU+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9vcGVuY21pcy5jc3MiPgotICA8dGl0bGU+JHthcnRpZmFjdElkfSBTZXJ2ZXI8L3RpdGxlPgotICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICA8IS0tCi0gIGJvZHkgewotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLSAgICBjb2xvcjogYmxhY2s7Ci0gICAgZm9udC1zaXplOiAxMnB4OwotICB9Ci0KLSAgaDEgewotICAgIGZvbnQtc2l6ZTogMjRweDsKLSAgICBsaW5lLWhlaWdodDogbm9ybWFsOwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Ci0gICAgY29sb3I6ICMwMDMzNjY7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzYzc4YjU7Ci0gICAgcGFkZGluZzogMnB4OwotICAgIG1hcmdpbjogNHB4IDBweCA0cHggMHB4OwotICB9Ci0KLSAgaDIgewotICAgIGZvbnQtc2l6ZTogMThweDsKLSAgICBsaW5lLWhlaWdodDogbm9ybWFsOwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Ci0gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzYzc4YjU7Ci0gICAgcGFkZGluZzogMnB4OwotICAgIG1hcmdpbjogNHB4IDBweCA0cHggMHB4OwotICB9Ci0KLSAgaHIgewotICAgIGNvbG9yOiAzYzc4YjU7Ci0gICAgaGVpZ2h0OiAxOwotICB9Ci0gIC0tPgotICA8L3N0eWxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxoMT4ke2FydGlmYWN0SWR9IFNlcnZlcjwvaDE+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+WW91ciBzZXJ2ZXIgaXMgdXAgYW5kIHJ1bm5pbmcuPC9wPgotPHA+VGhlICR7YXJ0aWZhY3RJZH0gc2VydmVyIGlzIGEgQ01JUyBzZXJ2ZXIgYmFzZWQgb24gQXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUy48L3A+Ci08cD5Zb3UgbmVlZCBhIENNSVMgY2xpZW50IHRvIGFjY2VzcyB0aGlzIHNlcnZlci4gRG93bmxvYWQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9qYXZhL2RldmVsb3BpbmcvdG9vbHMvZGV2LXRvb2xzLXdvcmtiZW5jaC5odG1sIj5DTUlTIFdvcmtiZW5jaDwvYT4uPC9wPgotCi08aDI+QWNjZXNzIEluZm9ybWF0aW9uPC9oMj4KLQotPGgzPkNNSVMgMS4xPC9oMz4KLQotPHA+V2ViIFNlcnZpY2VzIEJpbmRpbmc6IDxhIGhyZWY9InNlcnZpY2VzMTEvY21pcz93c2RsIj5XU0RMPC9hPjwvcD4KLTxwPkF0b21QdWIgQmluZGluZzogPGEgaHJlZj0iYXRvbTExIj5TZXJ2aWNlIERvY3VtZW50PC9hPjwvcD4KLTxwPkJyb3dzZXIgQmluZGluZzogPGEgaHJlZj0iYnJvd3NlciI+U2VydmljZSBEb2N1bWVudDwvYT48L3A+Ci0KLTxoMz5DTUlTIDEuMDwvaDM+Ci0KLTxwPldlYiBTZXJ2aWNlcyBCaW5kaW5nOiA8YSBocmVmPSJzZXJ2aWNlcy9jbWlzP3dzZGwiPldTREw8L2E+PC9wPgotPHA+QXRvbVB1YiBCaW5kaW5nOiA8YSBocmVmPSJhdG9tIj5TZXJ2aWNlIERvY3VtZW50PC9hPjwvcD4KLQotPGgzPkF1dGhlbnRpY2F0aW9uPC9oMz4KLQotPHA+Tm8gYXV0aGVudGljYXRpb24gcmVxdWlyZWQuPC9wPgotCi0KLTxoMj5Nb3JlIEluZm9ybWF0aW9uPC9oMj4KLQotPHA+PGEgaHJlZj0iaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnIj5BcGFjaGUgQ2hlbWlzdHJ5IHdlYiBzaXRlPC9hPjwvcD4KLTxwPjxhIGhyZWY9Imh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9jbWlzIj5DTUlTIFRlY2huaWNhbCBDb21taXR0ZWVzIGF0IE9BU0lTPC9hPjwvcD4KLQotPGhyLz4KLVRoaXMgc29mdHdhcmUgaXMgcG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmcvIj5BcGFjaGUgQ2hlbWlzdHJ5PC9hPi4KLTxici8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9zZXJ2ZXIvYXJjaGV0eXBlLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYXJjaGV0eXBlL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9zZXJ2ZXIvYXJjaGV0eXBlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMDU0ZjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvamVjdHMvc2VydmVyL2FyY2hldHlwZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1ncm91cElkPW9yZy50ZXN0LmNtaXMKLWFydGlmYWN0SWQ9dGVzdC1jbWlzLXNlcnZlcgotdmVyc2lvbj0xLjAtU05BUFNIT1QKLXBhY2thZ2U9b3JnLnRlc3QuY21pcy5zZXJ2ZXIKLXByb2plY3RQcmVmaXg9VGVzdApkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvamVjdHMvc2VydmVyL2dvYWwudHh0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWFyY2hldHlwZS9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvamVjdHMvc2VydmVyL2dvYWwudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjk3MDIzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1hcmNoZXR5cGUvc3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2plY3RzL3NlcnZlci9nb2FsLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNsZWFuIGluc3RhbGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3BvbS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZDE1NjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotICAgIDwhLS0KLSAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICAgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MKLSAgICAgICAgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAgIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhcjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5PcGVuQ01JUyBTZXJ2ZXIgSW1wbGVtZW50YXRpb24gV0FSIHBhY2thZ2luZzwvbmFtZT4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPCEtLSBVbmNvbW1lbnQgZm9yIENPUlMgc3VwcG9ydCAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20udGhldHJhbnNhY3Rpb25jb21wYW55PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29ycy1maWx0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjEuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9OT1RJQ0UgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Mzk0NGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi1PcGVuQ01JUyBTZXJ2ZXIgSW1wbGVtZW50YXRpb24KLUNvcHlyaWdodCAyMDA5LTIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQotT3BlbkNNSVMgY29udGFpbnMgY29kZSBmcm9tIHRoZSBmb2xsb3dpbmcgT3BlbiBTb3VyY2UgcHJvamVjdHM6Ci0KLS0gQmFzZTY0IAotICBDb3B5cmlnaHQgKGMpIDIwMTAgUm9iZXJ0IEhhcmRlcgotICBQdWJsaWMgRG9tYWluLCA8aHR0cDovL2loYXJkZXIubmV0L2Jhc2U2ND4KLQotLSBKU09OLnNpbXBsZQotICBDb3B5cmlnaHQgKGMpIDIwMTIgWWlkb25nIEZhbmcKLSAgQXBhY2hlIExpY2Vuc2UgMi4wLCA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2ltcGxlLz4KLSAgCi0gIAotT3BlbkNNSVMgY29udGFpbnMgT0FTSVMgQ01JUyAxLjAgYW5kIENNSVMgMS4xIHNjaGVtYSBhbmQgV1NETCBmaWxlcy4KLUNvcHlyaWdodCAoYykgMjAxMCBhbmQgMjAxMyBPQVNJUyBPcGVuCi08aHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9jbWlzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvVEhJUkQtUEFSVFktTElDRU5TRVMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9USElSRC1QQVJUWS1MSUNFTlNFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmZTdkOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9USElSRC1QQVJUWS1MSUNFTlNFUworKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBBcGFjaGUgQ29tbW9ucyBMYW5nIChodHRwOi8vY29tbW9ucy5hcGFjaGUub3JnL2xhbmcvKQotICBMaWNlbnNlOiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wICAoaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCkKLS0gQXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUyAoaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnLykKLSAgTGljZW5zZTogQXBhY2hlIDIgIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0KQotLSBYTUwgUmVzb2x2ZXIgbGlicmFyeQotICBMaWNlbnNlOiBBcGFjaGUgMiAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQpCi0KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gV29vZHN0b3ggKGh0dHA6Ly93b29kc3RveC5jb2RlaGF1cy5vcmcpCi0gIExpY2Vuc2U6IFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAgIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0KQotCi0KLVRoaXMgY29weSBvZiBXb29kc3RveCBYTUwgcHJvY2Vzc29yIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQotQXBhY2hlIChTb2Z0d2FyZSkgTGljZW5zZSwgdmVyc2lvbiAyLjAgKCJ0aGUgTGljZW5zZSIpLgotU2VlIHRoZSBMaWNlbnNlIGZvciBkZXRhaWxzIGFib3V0IGRpc3RyaWJ1dGlvbiByaWdodHMsIGFuZCB0aGUKLXNwZWNpZmljIHJpZ2h0cyByZWdhcmRpbmcgZGVyaXZhdGUgd29ya3MuCi0KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi1BIGNvcHkgaXMgYWxzbyBpbmNsdWRlZCB3aXRoIGJvdGggdGhlIHRoZSBkb3dubG9hZGFibGUgc291cmNlIGNvZGUgcGFja2FnZQotYW5kIGphciB0aGF0IGNvbnRhaW5zIGNsYXNzIGJ5dGVjb2RlcywgYXMgZmlsZSAiQVNMIDIuMCIuIEluIGJvdGggY2FzZXMsCi10aGF0IGZpbGUgc2hvdWxkIGJlIGxvY2F0ZWQgbmV4dCB0byB0aGlzIGZpbGU6IGluIHNvdXJjZSBkaXN0cmlidXRpb24KLXRoZSBsb2NhdGlvbiBzaG91bGQgYmUgInJlbGVhc2Utbm90ZXMvYXNsIjsgYW5kIGluIGphciAiTUVUQS1JTkYvIgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIFN0YXgyIEFQSSAoaHR0cDovL3dvb2RzdG94LmNvZGVoYXVzLm9yZy9TdEFYMikKLSAgTGljZW5zZTogVGhlIEJTRCBMaWNlbnNlICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHApCi0KLQotQ29weXJpZ2h0IChjKSAyMDA0LTIwMTAsIFdvb2RzdG94IFByb2plY3QgKGh0dHA6Ly93b29kc3RveC5jb2RlaGF1cy5vcmcvKQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV29vZHN0b3ggWE1MIFByb2Nlc3NvciBub3IgdGhlIG5hbWVzCi0gICBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLUFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLUNPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi1BUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gYW50bHIgKGh0dHA6Ly93d3cuYW50bHIub3JnL2FudGxyKSBhbnRscjphbnRscjpqYXI6Mi43Ljc6Y29tcGlsZQotICBMaWNlbnNlOiBCU0QgTGljZW5zZSAgKGh0dHA6Ly93d3cuYW50bHIub3JnL2xpY2Vuc2UuaHRtbCkKLS0gYW50bHItcnVudGltZSAoaHR0cDovL3d3dy5hbnRsci5vcmcvYW50bHItcnVudGltZSkgb3JnLmFudGxyOmFudGxyLXJ1bnRpbWU6amFyOjMuNTpjb21waWxlCi0gIExpY2Vuc2U6IEJTRCBsaWNlbmNlICAoaHR0cDovL2FudGxyLm9yZy9saWNlbnNlLmh0bWwpCi0tIHN0cmluZ3RlbXBsYXRlIChodHRwOi8vd3d3LnN0cmluZ3RlbXBsYXRlLm9yZy9zdHJpbmd0ZW1wbGF0ZSkgb3JnLmFudGxyOnN0cmluZ3RlbXBsYXRlOmphcjozLjIuMTpjb21waWxlCi0gIExpY2Vuc2U6IEJTRCBsaWNlbmNlICAoaHR0cDovL2FudGxyLm9yZy9saWNlbnNlLmh0bWwpCi0KLQotQ29weXJpZ2h0IChjKSAyMDEwIFRlcmVuY2UgUGFycgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV29vZHN0b3ggWE1MIFByb2Nlc3NvciBub3IgdGhlIG5hbWVzCi0gICBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLUFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLUNPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi1BUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gU3RyZWFtaW5nIEFQSSBmb3IgWE1MIChodHRwOi8vc3RheC5jb2RlaGF1cy5vcmcpCi0gIExpY2Vuc2U6IER1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MiAgKGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCkKLS0gU3RBWC1FeCBQcm9qZWN0IChodHRwczovL3N0YXgtZXguZGV2LmphdmEubmV0L3N0YXgtZXgpCi0gIExpY2Vuc2U6IENvbW1vbiBEZXZlbG9wbWVudCBBbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wICAoaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKQotLSBTdW4gSkFYQiBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gUnVudGltZSAoaHR0cHM6Ly9qYXhiLmRldi5qYXZhLm5ldC8pCi0gIExpY2Vuc2U6IER1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MiAgKGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCkKLS0gU3VuIFNBQUogU3RhbmRhcmQgSW1wbGVtZW50YXRpb24gKGh0dHBzOi8vc2Fhai5kZXYuamF2YS5uZXQvKQotICBMaWNlbnNlOiBEdWFsIGxpY2Vuc2UgY29uc2lzdGluZyBvZiB0aGUgQ0RETCB2MS4wIGFuZCBHUEwgdjIgIChodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWwpCi0tIFhNTCBTdHJlYW0gQnVmZmVyIFByb2plY3QgKGh0dHBzOi8veG1sc3RyZWFtYnVmZmVyLmRldi5qYXZhLm5ldC8pCi0gIExpY2Vuc2U6IER1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MiAgKGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCkKLS0gSkFYLVdTIChKU1ItMjI0KSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKGh0dHBzOi8vamF4LXdzLmRldi5qYXZhLm5ldC8vKSAKLSAgTGljZW5zZTogRHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyICAoaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sKQotLSBKYXZhQmVhbnMoVE0pIEFjdGl2YXRpb24gRnJhbWV3b3JrIFNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2phZjExLTEzOTgxNS5odG1sKQotICBMaWNlbnNlOiBDb21tb24gRGV2ZWxvcG1lbnQgQW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAgKGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCkKLS0gSmF2YSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nIChodHRwczovL2pheGIuZGV2LmphdmEubmV0LykKLSAgTGljZW5zZTogQ29tbW9uIERldmVsb3BtZW50IEFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgIChodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpCi0tIFNBQUogQVBJIChodHRwczovL3NhYWouZGV2LmphdmEubmV0LykKLSAgTGljZW5zZTogRHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyICAoaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sKQotLSBKQVgtV1MgKEpTUi0yMjQpIEFQSSAoaHR0cHM6Ly9qYXgtd3MuZGV2LmphdmEubmV0LykgCi0gIExpY2Vuc2U6IER1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MiAgKGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCkKLS0gbWltZXB1bGwgKGh0dHBzOi8vbWltZXB1bGwuZGV2LmphdmEubmV0KQotICBMaWNlbnNlOiBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKSBWZXJzaW9uIDEuMCAgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvY2RkbDEucGhwKQotICBMaWNlbnNlOiBHUEx2MiB3aXRoIGNsYXNzcGF0aCBleGNlcHRpb24gIChodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbCkKLQotCi0gICAgICBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotCi0gICAgICAxLiBEZWZpbml0aW9ucy4KLSAgICAgICAgICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQKLSAgICAgICAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0gICAgICAgICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlCi0gICAgICAgICAgICBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEKLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0Ci0gICAgICAgICAgICBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotICAgICAgICAgICAgMS4zLiAiQ292ZXJlZCBTb2Z0d2FyZSIgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IKLSAgICAgICAgICAgIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzCi0gICAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZwotICAgICAgICAgICAgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotICAgICAgICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0KLSAgICAgICAgICAgIG90aGVyIHRoYW4gU291cmNlIENvZGUuIAotICAgICAgICAgICAgMS41LiAiSW5pdGlhbCBEZXZlbG9wZXIiIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eQotICAgICAgICAgICAgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcwotICAgICAgICAgICAgTGljZW5zZS4gCi0gICAgICAgICAgICAxLjYuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQKLSAgICAgICAgICAgIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUKLSAgICAgICAgICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLSAgICAgICAgICAgIDEuNy4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0gICAgICAgICAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUKLSAgICAgICAgICAgIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsCi0gICAgICAgICAgICBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMKLSAgICAgICAgICAgIGNvbnZleWVkIGhlcmVpbi4KLSAgICAgICAgICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZQotICAgICAgICAgICAgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywKLSAgICAgICAgICAgICAgICAgIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhCi0gICAgICAgICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMKLSAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IAotICAgICAgICAgICAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yIAotICAgICAgICAgICAgICAgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotICAgICAgICAgICAgMS4xMC4gIk9yaWdpbmFsIFNvZnR3YXJlIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kCi0gICAgICAgICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzCi0gICAgICAgICAgICBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gCi0gICAgICAgICAgICAxLjExLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkCi0gICAgICAgICAgICBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sCi0gICAgICAgICAgICBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50Ci0gICAgICAgICAgICBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuIAotICAgICAgICAgICAgMS4xMi4gIlNvdXJjZSBDb2RlIiBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyCi0gICAgICAgICAgICBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKQotICAgICAgICAgICAgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotICAgICAgICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsCi0gICAgICAgICAgICBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YKLSAgICAgICAgICAgIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiCi0gICAgICAgICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcwotICAgICAgICAgICAgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzCi0gICAgICAgICAgICBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yCi0gICAgICAgICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKLSAgICAgICAgICAgIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAKLSAgICAgICAgICAgIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMKLSAgICAgICAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotICAgICAgMi4gTGljZW5zZSBHcmFudHMuIAotICAgICAgICAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAotICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUKLSAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKLSAgICAgICAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiAKLSAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCi0gICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLAotICAgICAgICAgICAgICAgICAgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwKLSAgICAgICAgICAgICAgICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcgotICAgICAgICAgICAgICAgICAgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLAotICAgICAgICAgICAgICAgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kIAotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsCi0gICAgICAgICAgICAgICAgICB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlCi0gICAgICAgICAgICAgICAgICBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vcgotICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcgotICAgICAgICAgICAgICAgICAgcG9ydGlvbnMgdGhlcmVvZikuIAotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpCi0gICAgICAgICAgICAgICAgICBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0Ci0gICAgICAgICAgICAgICAgICBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgTGljZW5zZS4gCi0gICAgICAgICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQKLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tCi0gICAgICAgICAgICAgICAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cwotICAgICAgICAgICAgICAgICAgY2F1c2VkIGJ5OiAoaSkgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4gCi0gICAgICAgICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotICAgICAgICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQKLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaAotICAgICAgICAgICAgQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsCi0gICAgICAgICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbgotICAgICAgICAgICAgICAgICAgcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0bwotICAgICAgICAgICAgICAgICAgdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZQotICAgICAgICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbgotICAgICAgICAgICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcwotICAgICAgICAgICAgICAgICAgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLSAgICAgICAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLAotICAgICAgICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aAotICAgICAgICAgICAgICAgICAgaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwKLSAgICAgICAgICAgICAgICAgIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkKLSAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucwotICAgICAgICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uCi0gICAgICAgICAgICAgICAgICAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuIAotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQKLSAgICAgICAgICAgICAgICAgIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0Ci0gICAgICAgICAgICAgICAgICBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LiAKLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudAotICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAgIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3IKLSAgICAgICAgICAgICAgICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkKLSAgICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKSB0aGUKLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yCi0gICAgICAgICAgICAgICAgICB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKSB1bmRlcgotICAgICAgICAgICAgICAgICAgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuIAotICAgICAgMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotICAgICAgICAgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0gICAgICAgICAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlCi0gICAgICAgICAgICBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbgotICAgICAgICAgICAgU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUKLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QKLSAgICAgICAgICAgIGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yCi0gICAgICAgICAgICBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueQotICAgICAgICAgICAgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4KLSAgICAgICAgICAgIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhCi0gICAgICAgICAgICByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQKLSAgICAgICAgICAgIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLSAgICAgICAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4KLSAgICAgICAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UKLSAgICAgICAgICAgIGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdQotICAgICAgICAgICAgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyCi0gICAgICAgICAgICBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8KLSAgICAgICAgICAgIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgotICAgICAgICAgICAgMy4zLiBSZXF1aXJlZCBOb3RpY2VzLgotICAgICAgICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IKLSAgICAgICAgICAgIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yCi0gICAgICAgICAgICBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nCi0gICAgICAgICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotICAgICAgICAgICAgMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLgotICAgICAgICAgICAgWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZAotICAgICAgICAgICAgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlCi0gICAgICAgICAgICBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJwotICAgICAgICAgICAgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYQotICAgICAgICAgICAgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKLSAgICAgICAgICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4KLSAgICAgICAgICAgIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24KLSAgICAgICAgICAgIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UKLSAgICAgICAgICAgIG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksCi0gICAgICAgICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieQotICAgICAgICAgICAgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwKLSAgICAgICAgICAgIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQKLSAgICAgICAgICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mCi0gICAgICAgICAgICB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0gICAgICAgICAgICAzLjUuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotICAgICAgICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQKLSAgICAgICAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zCi0gICAgICAgICAgICBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zCi0gICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbgotICAgICAgICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlCi0gICAgICAgICAgICBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQKLSAgICAgICAgICAgIG9yIGFsdGVyIHRoZSByZWNpcGllbnQncyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0KLSAgICAgICAgICAgIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UKLSAgICAgICAgICAgIGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEKLSAgICAgICAgICAgIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdAotICAgICAgICAgICAgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UKLSAgICAgICAgICAgIGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UKLSAgICAgICAgICAgIGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeQotICAgICAgICAgICAgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwKLSAgICAgICAgICAgIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zCi0gICAgICAgICAgICBZb3Ugb2ZmZXIuCi0gICAgICAgICAgICAzLjYuIExhcmdlciBXb3Jrcy4KLSAgICAgICAgICAgIFlvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUKLSAgICAgICAgICAgIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQotICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2gKLSAgICAgICAgICAgIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICAgICAgICBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gCi0gICAgICA0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4gCi0gICAgICAgICAgICA0LjEuIE5ldyBWZXJzaW9ucy4KLSAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZAotICAgICAgICAgICAgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZQotICAgICAgICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEKLSAgICAgICAgICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4KLSAgICAgICAgICAgIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUKLSAgICAgICAgICAgIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuIAotICAgICAgICAgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotICAgICAgICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQotICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAotICAgICAgICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhCi0gICAgICAgICAgICBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcKLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkKLSAgICAgICAgICAgIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQKLSAgICAgICAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQKLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8KLSAgICAgICAgICAgIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZQotICAgICAgICAgICAgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gCi0gICAgICAgICAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotICAgICAgICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYQotICAgICAgICAgICAgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZAotICAgICAgICAgICAgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSkgcmVuYW1lCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMKLSAgICAgICAgICAgIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKSBvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0Ci0gICAgICAgICAgICB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0gICAgICA1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIgotICAgICAgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwKLSAgICAgIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQKLSAgICAgIFNPRlRXQVJFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUgotICAgICAgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAotICAgICAgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkKLSAgICAgIENPVkVSRUQgU09GVFdBUkUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUKLSAgICAgIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GCi0gICAgICBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRgotICAgICAgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YKLSAgICAgIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTCi0gICAgICBESVNDTEFJTUVSLiAKLSAgICAgIDYuIFRFUk1JTkFUSU9OLiAKLSAgICAgICAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwKLSAgICAgICAgICAgIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zCi0gICAgICAgICAgICBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZgotICAgICAgICAgICAgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIKLSAgICAgICAgICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YKLSAgICAgICAgICAgIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotICAgICAgICAgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nCi0gICAgICAgICAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yCi0gICAgICAgICAgICBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdAotICAgICAgICAgICAgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikKLSAgICAgICAgICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZQotICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvcgotICAgICAgICAgICAgb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUKLSAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkKLSAgICAgICAgICAgIHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvcgotICAgICAgICAgICAgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwKLSAgICAgICAgICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpCi0gICAgICAgICAgICBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBvZiB0aGlzCi0gICAgICAgICAgICBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQKLSAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uCi0gICAgICAgICAgICBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5Ci0gICAgICAgICAgICBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAgICAgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlcgotICAgICAgICAgICAgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aAotICAgICAgICAgICAgUGFydGljaXBhbnQuCi0gICAgICAgICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yCi0gICAgICAgICAgICBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZAotICAgICAgICAgICAgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24KLSAgICAgICAgICAgIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKQotICAgICAgICAgICAgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLSAgICAgIDcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotICAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKLSAgICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFCi0gICAgICBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YKLSAgICAgIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRQotICAgICAgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IKLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVAotICAgICAgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLCi0gICAgICBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKLSAgICAgIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4KLSAgICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRgotICAgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMCi0gICAgICBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWSdTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVAotICAgICAgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPCi0gICAgICBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IKLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVAotICAgICAgQVBQTFkgVE8gWU9VLgotICAgICAgOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KLSAgICAgIFRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcwotICAgICAgZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwKLSAgICAgIGNvbXB1dGVyIHNvZnR3YXJlIiAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuIMKkCi0gICAgICAyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZQotICAgICAgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LgotICAgICAgMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQotICAgICAgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycwotICAgICAgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KLSAgICAgIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsCi0gICAgICBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzCi0gICAgICBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0gICAgICA5LiBNSVNDRUxMQU5FT1VTLgotICAgICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QKLSAgICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUKLSAgICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlCi0gICAgICBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZQotICAgICAgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZQotICAgICAgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50Ci0gICAgICBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaAotICAgICAganVyaXNkaWN0aW9uJ3MgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uCi0gICAgICByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mCi0gICAgICB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEKLSAgICAgIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nCi0gICAgICBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydAotICAgICAgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlCi0gICAgICBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQotICAgICAgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcgotICAgICAgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsCi0gICAgICBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLgotICAgICAgWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQotICAgICAgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0Ci0gICAgICBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLAotICAgICAgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0gICAgICAxMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLSAgICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMKLSAgICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IKLSAgICAgIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZQotICAgICAgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0bwotICAgICAgZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZwotICAgICAgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24KLSAgICAgIG9mIGxpYWJpbGl0eS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gU0xGNEogQVBJIE1vZHVsZSAoaHR0cDovL3d3dy5zbGY0ai5vcmcpCi0gIExpY2Vuc2U6IE1JVCBMaWNlbnNlICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApCi0KLQotQ29weXJpZ2h0IChjKSAyMDA0LTIwMTMgUU9TLmNoCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSBhICBjb3B5ICBvZiB0aGlzICBzb2Z0d2FyZSAgYW5kICBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICAodGhlCi0gIlNvZnR3YXJlIiksIHRvICBkZWFsIGluICB0aGUgU29mdHdhcmUgd2l0aG91dCAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotIHdpdGhvdXQgbGltaXRhdGlvbiAgdGhlIHJpZ2h0cyB0byAgdXNlLCBjb3B5LCBtb2RpZnksICBtZXJnZSwgcHVibGlzaCwKLSBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgIGNvcGllcyBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKLSBUaGUgIGFib3ZlICBjb3B5cmlnaHQgIG5vdGljZSAgYW5kICB0aGlzIHBlcm1pc3Npb24gIG5vdGljZSAgc2hhbGwgIGJlCi0gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFICBTT0ZUV0FSRSBJUyAgUFJPVklERUQgICJBUyAgSVMiLCBXSVRIT1VUICBXQVJSQU5UWSAgT0YgQU5ZICBLSU5ELAotIEVYUFJFU1MgT1IgIElNUExJRUQsIElOQ0xVRElORyAgQlVUIE5PVCBMSU1JVEVEICBUTyBUSEUgIFdBUlJBTlRJRVMgT0YKLSBNRVJDSEFOVEFCSUxJVFksICAgIEZJVE5FU1MgICAgRk9SICAgIEEgICBQQVJUSUNVTEFSICAgIFBVUlBPU0UgICAgQU5ECi0gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9zYW1wbGUtcmVwb3NpdG9yeS5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3NhbXBsZS1yZXBvc2l0b3J5LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NGQ3MTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3NhbXBsZS1yZXBvc2l0b3J5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWNsYXNzPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmR1bW15LkR1bW15U2VydmljZXNGYWN0b3J5Ci0KLXJlcG9zaXRvcnkuaWQ9ZHVtbXktcmVwCi1yZXBvc2l0b3J5Lm5hbWU9RHVtbXkgUmVwb3NpdG9yeQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTAvQ01JUy1Db3JlLnhzZC50ZW1wbGF0ZSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczEwL0NNSVMtQ29yZS54c2QudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDI3YjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTAvQ01JUy1Db3JlLnhzZC50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCTwhLS0KLQkJTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdQotCQltYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heQotCQlvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLQkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieQotCQlhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0JCUxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi0JCUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IKLQkJdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0JCUxpY2Vuc2UuCi0JLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmF0b209Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgeG1sbnM6eGpjPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiL3hqYyIKLQlqYXhiOmV4dGVuc2lvbkJpbmRpbmdQcmVmaXhlcz0ieGpjIiBqYXhiOnZlcnNpb249IjIuMSIKLQl4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIgdmVyc2lvbj0iMS4wIj4KLQotCTwhLS0gIGVudW1zIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1EZWNpbWFsUHJlY2lzaW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmludGVnZXIiPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIzMiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iNjQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNvbnRlbnRTdHJlYW1BbGxvd2VkIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vdGFsbG93ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbG93ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FyZGluYWxpdHkiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2luZ2xlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtdWx0aSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVwZGF0YWJpbGl0eSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZWFkb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVhZHdyaXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ3aGVuY2hlY2tlZG91dCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib25jcmVhdGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1EYXRlVGltZVJlc29sdXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVhciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGltZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnR5VHlwZSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib29sZWFuIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW50ZWdlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGF0ZXRpbWUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlY2ltYWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0bWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXJpIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQmFzZU9iamVjdFR5cGVJZHMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpkb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpmb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cmVsYXRpb25zaGlwIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBvbGljeSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlRdWVyeSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtZXRhZGF0YW9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGx0ZXh0b25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90aHNlcGFyYXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3RoY29tYmluZWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5Sm9pbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lcm9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyYW5kb3V0ZXIiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW55dGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHdjb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVmVyc2lvbmluZ1N0YXRlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrZWRvdXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1pbm9yIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtYWpvciIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVW5maWxlT2JqZWN0Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVuZmlsZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlc2luZ2xlZmlsZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlbGV0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVJlbGF0aW9uc2hpcERpcmVjdGlvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzb3VyY2UiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRhcmdldCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZWl0aGVyIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ0YXJnZXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJvdGgiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPCEtLSAgcHJvcGVydGllcyBpbiBDTUlTIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1Qcm9wZXJ0aWVzQmFzZSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOm5hbWUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6b2JqZWN0SWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6b2JqZWN0VHlwZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmJhc2VUeXBlSWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y3JlYXRlZEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNyZWF0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpZWRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjaGFuZ2VUb2tlbiIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0RvY3VtZW50Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNJbW11dGFibGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNMYXRlc3RWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTGF0ZXN0TWFqb3JWZXJzaW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25MYWJlbCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzSWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y2hlY2tpbkNvbW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjb250ZW50U3RyZWFtTWltZVR5cGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbUZpbGVOYW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1JZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc0ZvbGRlciI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBhcmVudElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cGF0aCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1JlbGF0aW9uc2hpcCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnNvdXJjZUlkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnRhcmdldElkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUHJvcGVydGllc1BvbGljeSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBvbGljeVRleHQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiPgotCQk8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czphdHRyaWJ1dGVHcm91cD4KLQotCTwhLS0gIG1haW4gY21pcyBvYmplY3QgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJjbWlzOmNtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTwhLS0gIGlmIGNoYW5nZSBsb2cgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VFdmVudEluZm8iIHR5cGU9ImNtaXM6Y21pc0NoYW5nZUV2ZW50VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgQUNMIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWNsIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImV4YWN0QUNMIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIEFwcGxpZWQgUG9saWN5IElEcyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljeUlkcyIgdHlwZT0iY21pczpjbWlzTGlzdE9mSWRzVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgUmVuZGl0aW9uIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uIiB0eXBlPSJjbWlzOmNtaXNSZW5kaXRpb25UeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbnMgLS0+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IgotCQkJCW5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gcHJvcGVydHkgYmFnIC0tPgotCTx4czphdHRyaWJ1dGUgbmFtZT0ia2V5IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdHlwZT0ieHM6aW50ZWdlciIgLz4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydGllc1R5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQk8eHM6YXBwaW5mbz4KLQkJCQkJCTxqYXhiOnByb3BlcnR5IG5hbWU9InByb3BlcnR5IiAvPgotCQkJCQk8L3hzOmFwcGluZm8+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5Qm9vbGVhbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlCb29sZWFuIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUlkIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUlkIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUludGVnZXIiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SW50ZWdlciIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlEYXRlVGltZSIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEYXRlVGltZSIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlEZWNpbWFsIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURlY2ltYWwiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SHRtbCIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlIdG1sIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eVN0cmluZyIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlTdHJpbmciCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5VXJpIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVVyaSIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQk8L3hzOmNob2ljZT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSBzdGFydCB0aGUgcHJvcCBkZWZpbml0aW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5Ij4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eURlZmluaXRpb25JZCIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpZCBmb3IgdGhpcwotCQkJCQlwcm9wZXJ0eSBpbnN0YW5jZS4gVGhpcyBpcwotCQkJCQlub3QgcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZCBhcyBhCi0JCQkJCWRlZmF1bHQgdmFsdWUuIFRoaXMgaXMKLQkJCQkJcmVxdWlyZWQgdG8gYmUgc2V0IHdoZW4gdXNlZCBmb3IgcXVlcnkgcmVzdWx0Ci0JCQkJCXNldCBvciByZXR1cm5pbmcKLQkJCQkJcHJvcGVydGllcyBvbiBhbiBvYmplY3QuCi0JCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYWxOYW1lIiB1c2U9Im9wdGlvbmFsIj4KLQkJCTx4czphbm5vdGF0aW9uPgotCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQlUaGlzIGlzIHRoZSBsb2NhbG5hbWUgYXMgZGVmaW5lZCBieSB0aGUgcHJvcGVydHkKLQkJCQkJZGVmaW5pdGlvbgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0iZGlzcGxheU5hbWUiIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIGRpc3BsYXluYW1lIGFzIGRlZmluZWQgYnkgdGhlIHByb3BlcnR5Ci0JCQkJCWRlZmluaXRpb24KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InF1ZXJ5TmFtZSIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgcXVlcnlOYW1lLiBUaGlzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JCQkJCXRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5LiBJZiBhbGlhc2VzIGFyZSB1c2VkLCB0aGUgYWxpYXMgaXMgdG8KLQkJCQkJYmUgc3BlY2lmaWVkIGhlcmUgaW5zdGVhZCBvZiB0aGUgcXVlcnlOYW1lLgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlCb29sZWFuIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmJvb2xlYW4iIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUlkIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SW50ZWdlciI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czppbnRlZ2VyIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEYXRlVGltZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkYXRlVGltZSIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGVjaW1hbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkZWNpbWFsIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlIdG1sIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVN0cmluZyI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVVyaSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gY21pcyBjaG9pY2UgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2UiPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB1c2U9InJlcXVpcmVkIiAvPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUJvb2xlYW4iPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmJvb2xlYW4iIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUJvb2xlYW4iIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VJZCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUludGVnZXIiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUludGVnZXIiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VEYXRlVGltZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZURhdGVUaW1lIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlRGVjaW1hbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGVjaW1hbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGVjaW1hbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUh0bWwiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSHRtbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlU3RyaW5nIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVN0cmluZyIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZVVyaSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6YW55VVJJIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VVcmkiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSAgYWxsb3dhYmxlIGFjdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZU9iamVjdCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhblVwZGF0ZVByb3BlcnRpZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRGb2xkZXJUcmVlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0UHJvcGVydGllcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldE9iamVjdFJlbGF0aW9uc2hpcHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRPYmplY3RQYXJlbnRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Rm9sZGVyUGFyZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0RGVzY2VuZGFudHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5Nb3ZlT2JqZWN0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuRGVsZXRlQ29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNoZWNrT3V0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ2FuY2VsQ2hlY2tPdXQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DaGVja0luIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuU2V0Q29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQWRkT2JqZWN0VG9Gb2xkZXIiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5SZW1vdmVPYmplY3RGcm9tRm9sZGVyIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Q29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkFwcGx5UG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QXBwbGllZFBvbGljaWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuUmVtb3ZlUG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Q2hpbGRyZW4iIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DcmVhdGVEb2N1bWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZUZvbGRlciIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZVJlbGF0aW9uc2hpcCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZVRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcmVuZGl0aW9ucyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldFJlbmRpdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gQUNMIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QUNMIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQXBwbHlBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNMaXN0T2ZJZHNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gUHJvcGVydHkgQXR0cmlidXRlcyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5VHlwZSIgdHlwZT0iY21pczplbnVtUHJvcGVydHlUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FyZGluYWxpdHkiIHR5cGU9ImNtaXM6ZW51bUNhcmRpbmFsaXR5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRhYmlsaXR5IiB0eXBlPSJjbWlzOmVudW1VcGRhdGFiaWxpdHkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gZmxhZ3MgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmhlcml0ZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im9yZGVyYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3BlbkNob2ljZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPCEtLSAgdHlwZSBzcGVjaWZpYyBkZWZpbml0aW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUJvb2xlYW4iIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUJvb2xlYW4iIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SWREZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlJZCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSWQiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SW50ZWdlckRlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUludGVnZXIiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heFZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1pblZhbHVlIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUludGVnZXIiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlEYXRlVGltZSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc29sdXRpb24iCi0JCQkJCQl0eXBlPSJjbWlzOmVudW1EYXRlVGltZVJlc29sdXRpb24iIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZURhdGVUaW1lIiAvPgotCi0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhWYWx1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtaW5WYWx1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9ImNtaXM6ZW51bURlY2ltYWxQcmVjaXNpb24iCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGVjaW1hbCIgLz4KLQotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SHRtbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSHRtbCIgLz4KLQotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlTdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Im1heExlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VTdHJpbmciIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5VXJpRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5VXJpIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VVcmkiIC8+Ci0KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSB0eXBlIGRlZmluaXRpb24gLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8IS0tICBwcmltYXJ5IGlkZW50aWZ5aW5nIGF0dHJpYnV0ZSAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgYmFzZSB0eXBlIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYmFzZUlkIiB0eXBlPSJjbWlzOmVudW1CYXNlT2JqZWN0VHlwZUlkcyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBwYXJlbnQgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJlbnRJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIGlzIHRoZSBpZCBmb3IgdGhlIHBhcmVudCB0eXBlIGRlZmluaXRpb24uIElmCi0JCQkJCQl0aGlzIGlzIGEgYmFzZSB0eXBlLAotCQkJCQkJdGhpcyBpcyBub3QgcHJlc2VudC4KLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwhLS0gZmxhZ3MgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWxlYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImZ1bGx0ZXh0SW5kZXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgZGVmYXVsdD0idHJ1ZSIgLz4KLQotCQkJPCEtLSBjb250cm9sbGFibGUgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVQb2xpY3kiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbnMgLS0+Ci0JCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQk8eHM6YXBwaW5mbz4KLQkJCQkJCTxqYXhiOnByb3BlcnR5IG5hbWU9InByb3BlcnR5RGVmaW5pdGlvbiIgLz4KLQkJCQkJPC94czphcHBpbmZvPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbiIKLQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGVjaW1hbERlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SWREZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUlkRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlIdG1sRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5VXJpRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmlEZWZpbml0aW9uVHlwZSIgLz4KLQkJCTwveHM6Y2hvaWNlPgotCi0JCQk8IS0tIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSB0eXBlIHNwZWNpZmljIHR5cGVkZWZzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtQWxsb3dlZCIgdHlwZT0iY21pczplbnVtQ29udGVudFN0cmVhbUFsbG93ZWQiCi0JCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVGb2xkZXJEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlUmVsYXRpb25zaGlwRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2VkU291cmNlVHlwZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93ZWRUYXJnZXRUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVQb2xpY3lEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tICBxdWVyeSAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1F1ZXJ5VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InN0YXRlbWVudCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2VhcmNoQWxsVmVyc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6YW55IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWVzcGFjZT0iIyNvdGhlciIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCi0JPCEtLSAgcmVwb3NpdG9yeSBpbmZvIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVwb3NpdG9yeUluZm9UeXBlIj4KLQkJPHhzOnNlcXVlbmNlIG1pbk9jY3Vycz0iMSI+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlOYW1lIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5RGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InZlbmRvck5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb2R1Y3ROYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9kdWN0VmVyc2lvbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icm9vdEZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsYXRlc3RDaGFuZ2VMb2dUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdGllcyIgdHlwZT0iY21pczpjbWlzUmVwb3NpdG9yeUNhcGFiaWxpdGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhY2xDYXBhYmlsaXR5IiB0eXBlPSJjbWlzOmNtaXNBQ0xDYXBhYmlsaXR5VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNtaXNWZXJzaW9uU3VwcG9ydGVkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0aGluQ2xpZW50VVJJIiB0eXBlPSJ4czphbnlVUkkiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VzSW5jb21wbGV0ZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZXNPblR5cGUiIHR5cGU9ImNtaXM6ZW51bUJhc2VPYmplY3RUeXBlSWRzIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbEFub255bW91cyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlJZiBzZXQsIHRoaXMgZmllbGQgaG9sZHMgdGhlIHByaW5jaXBhbCB3aG8gaXMKLQkJCQkJCXVzZWQgZm9yIGFub255bW91cwotCQkJCQkJYWNjZXNzLiBUaGlzIHByaW5jaXBhbCBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gdGhlCi0JCQkJCQlBQ0wgc2VydmljZXMgdG8KLQkJCQkJCXNwZWNpZnkgd2hhdCBwZXJtaXNzaW9ucyBhbm9ueW1vdXMgdXNlcnMgc2hvdWxkCi0JCQkJCQloYXZlCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbEFueW9uZSIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlJZiBzZXQsIHRoaXMgZmllbGQgaG9sZHMgdGhlIHByaW5jaXBhbCB3aG8gaXMKLQkJCQkJCXVzZWQgZm9yIGV2ZXJ5b25lJ3MgYWNjZXNzLiBUaGlzIHByaW5jaXBhbCBjYW4gdGhlbiBiZSBwYXNzZWQgdG8KLQkJCQkJCXRoZQotCQkJCQkJQUNMIHNlcnZpY2VzIHRvCi0JCQkJCQlzcGVjaWZ5IHdoYXQgcGVybWlzc2lvbnMgZXZlcnlvbmUgc2hvdWxkCi0JCQkJCQloYXZlCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVwb3NpdG9yeUNhcGFiaWxpdGllc1R5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5QUNMIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5QUNMIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUFsbFZlcnNpb25zU2VhcmNoYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlDaGFuZ2VzIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5Q2hhbmdlcyIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGFiaWxpdHkiCi0JCQkJdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUdldERlc2NlbmRhbnRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUdldEZvbGRlclRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlNdWx0aWZpbGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlQV0NTZWFyY2hhYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVBXQ1VwZGF0YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlRdWVyeSIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eVF1ZXJ5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVJlbmRpdGlvbnMiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlSZW5kaXRpb24iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5VW5maWxpbmciIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5VmVyc2lvblNwZWNpZmljRmlsaW5nIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUpvaW4iIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlKb2luIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIFVuaWZpZWQgU2VhcmNoIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1UeXBlT2ZDaGFuZ2VzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhIG5ldyBJRCBoYXMgYmVlbiBjcmVhdGVkIC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjcmVhdGVkIiAvPgotCQkJPCEtLSBjb250ZW50IHdpdGggYW4gZXhpc3RpbmcgSUQgaGFzIGJlZW4gbW9kaWZpZWQgLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZWQiIC8+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhbiBleGlzdGluZyBJRCBoYXMgYmVlbiBkZWxldGVkIC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGVkIiAvPgotCQkJPCEtLSBjb250ZW50IHdpdGggYW4gZXhpc3RpbmcgSUQgaGFzIGhhZCBpdHMgc2VjdXJpdHkgcG9saWN5IGNoYW5nZWQtLT4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2VjdXJpdHkiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlDaGFuZ2VzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdGlkc29ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb3BlcnRpZXMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaGFuZ2VFdmVudFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUeXBlIiB0eXBlPSJjbWlzOmVudW1UeXBlT2ZDaGFuZ2VzIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIEFDTCAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQUNMUHJvcGFnYXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwb3NpdG9yeWRldGVybWluZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdG9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb3BhZ2F0ZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eUFDTCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkaXNjb3ZlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFuYWdlIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1CYXNpY1Blcm1pc3Npb25zIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cmVhZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp3cml0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczphbGwiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uRGVmaW5pdGlvbiI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBwcm9jZXNzQ29udGVudHM9ImxheCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQZXJtaXNzaW9uTWFwcGluZyI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImtleSIgdHlwZT0iY21pczplbnVtQWxsb3dhYmxlQWN0aW9uc0tleSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlNdWx0aXBsZSBlbnRyaWVzIGFyZSBPUidlZCB0b2dldGhlci4gQW55Ci0JCQkJCQlwZXJtaXNzaW9uIHRoYXQgc3BlY2lmaWVkIGlzCi0JCQkJCQlzdWZmaWNpZW50IHRvIHByb3ZpZGUgcmlnaHRzIHJlcXVpcmVkCi0JCQkJCQlpbiBrZXkKLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCTwveHM6ZWxlbWVudD4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1BbGxvd2FibGVBY3Rpb25zS2V5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldERlc2NlbmRlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Q2hpbGRyZW4uRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQYXJlbnRzLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0Rm9sZGVyUGFyZW50Lk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlRG9jdW1lbnQuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVGb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuU291cmNlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DcmVhdGVSZWxhdGlvbnNoaXAuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuVmlld0NvbnRlbnQuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5VcGRhdGVQcm9wZXJ0aWVzLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuTW92ZS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbk1vdmUuVGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5Nb3ZlLlNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuRGVsZXRlVHJlZS5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblNldENvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZUNvbnRlbnQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFRvRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQWRkVG9Gb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVGcm9tRm9sZGVyLk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuUmVtb3ZlRnJvbUZvbGRlci5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNoZWNrb3V0LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DYW5jZWxDaGVja291dC5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ2hlY2tpbi5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0QWxsVmVyc2lvbnMuVmVyc2lvblNlcmllcyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0T2JqZWN0UmVsYXRpb25zaGlwcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZVBvbGljeS5Qb2xpY3kiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFwcGxpZWRQb2xpY2llcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFDTC5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFwcGx5QUNMLk9iamVjdCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtVXNlcnMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp1c2VyIj4KLQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQlUaGlzIHVzZXIgY2FuIGJlIHVzZWQgb24gc2V0dGluZyBBQ0xzIHRvIHNwZWNpZnkKLQkJCQkJCXRoZSBwZXJtaXNzaW9uIHRoaXMKLQkJCQkJCXVzZXIgY29udGV4dCBzaG91bGQgaGF2ZS4KLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVudW1lcmF0aW9uPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gQUNMIG9uIG9iamVjdHMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sUHJpbmNpcGFsVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InByaW5jaXBhbElkIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWwiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xQcmluY2lwYWxUeXBlIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGVybWlzc2lvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkaXJlY3QiIHR5cGU9InhzOmJvb2xlYW4iIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xFbnRyeVR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQUNMQ2FwYWJpbGl0eVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJzdXBwb3J0ZWRQZXJtaXNzaW9ucyIgdHlwZT0iY21pczplbnVtU3VwcG9ydGVkUGVybWlzc2lvbnMiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wYWdhdGlvbiIgdHlwZT0iY21pczplbnVtQUNMUHJvcGFnYXRpb24iIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9ucyIgdHlwZT0iY21pczpjbWlzUGVybWlzc2lvbkRlZmluaXRpb24iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im1hcHBpbmciIHR5cGU9ImNtaXM6Y21pc1Blcm1pc3Npb25NYXBwaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1TdXBwb3J0ZWRQZXJtaXNzaW9ucyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJiYXNpYyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVwb3NpdG9yeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90aCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tIHJlbmRpdGlvbnMgLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlSZW5kaXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVhZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUmVuZGl0aW9uS2luZCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnRodW1ibmFpbCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1JlbmRpdGlvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJzdHJlYW1JZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWltZXR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImtpbmQiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InRpdGxlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImhlaWdodCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0id2lkdGgiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkRvY3VtZW50SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjAiIC8+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gZWxlbWVudHMgLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0iY21pczpjbWlzQWxsb3dhYmxlQWN0aW9uc1R5cGUiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCVRoaXMgaXMgdGhlIHJvb3QgdGFnIGZvciBhIENNSVMgQWxsb3dhYmxlQWN0aW9ucwotCQkJCURvY3VtZW50IFR5cGUKLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCTwveHM6ZWxlbWVudD4KLQotCTx4czplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJjbWlzOmNtaXNRdWVyeVR5cGUiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCVRoaXMgaXMgdGhlIHJvb3QgdGFnIGZvciBhIENNSVMgUXVlcnkgRG9jdW1lbnQgVHlwZQotCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImFjbCIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQlUaGlzIGlzIHRoZSByb290IHRhZyBmb3IgYSBDTUlTIEFDTCBEb2N1bWVudCBUeXBlCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KLQk8IS0tIEVPRiAtLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NtaXMxMC9DTUlTLU1lc3NhZ2luZy54c2QudGVtcGxhdGUgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NtaXMxMC9DTUlTLU1lc3NhZ2luZy54c2QudGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODkxNjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTAvQ01JUy1NZXNzYWdpbmcueHNkLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsMjA3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi0JPCEtLQotCQlMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91Ci0JCW1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5Ci0JCW9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotCQlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzIHJlcXVpcmVkIGJ5Ci0JCWFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUKLQkJTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKLQkJQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvcgotCQl0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUKLQkJTGljZW5zZS4KLQktLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvIgotCXhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmNtaXNtPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvIgotCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiIHZlcnNpb249IjEuMCIKLQl4bWxuczp4amM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIveGpjIgotCWpheGI6ZXh0ZW5zaW9uQmluZGluZ1ByZWZpeGVzPSJ4amMiIGpheGI6dmVyc2lvbj0iMi4xIgotCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotCTx4czppbXBvcnQgc2NoZW1hTG9jYXRpb249IjwlY21pc2NvcmUlPiIKLQkJbmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIgLz4KLQotCTwhLS0gZXhjZXB0aW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0ZhdWx0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXNtOmVudW1TZXJ2aWNlRXhjZXB0aW9uIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29kZSIgdHlwZT0ieHM6aW50ZWdlciIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czphbnkgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZXNwYWNlPSIjI290aGVyIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6ZWxlbWVudCBuYW1lPSJjbWlzRmF1bHQiIHR5cGU9ImNtaXNtOmNtaXNGYXVsdFR5cGUiIC8+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVNlcnZpY2VFeGNlcHRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY29uc3RyYWludCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibmFtZUNvbnN0cmFpbnRWaW9sYXRpb24iIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRlbnRBbHJlYWR5RXhpc3RzIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJmaWx0ZXJOb3RWYWxpZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW52YWxpZEFyZ3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub3RTdXBwb3J0ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdE5vdEZvdW5kIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwZXJtaXNzaW9uRGVuaWVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJydW50aW1lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdG9yYWdlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJlYW1Ob3RTdXBwb3J0ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZUNvbmZsaWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ2ZXJzaW9uaW5nIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gZXh0ZW5zaW9uIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzRXh0ZW5zaW9uVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czphbnkgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZXNwYWNlPSIjI290aGVyIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSB0eXBlcyBmb3IgV1MgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlQ29udGFpbmVyIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIiAKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoaWxkcmVuIiB0eXBlPSJjbWlzbTpjbWlzVHlwZUNvbnRhaW5lciIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlRGVmaW5pdGlvbkxpc3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZXMiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaGFzTW9yZUl0ZW1zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibnVtSXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RJbkZvbGRlckNvbnRhaW5lclR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJbkZvbGRlciIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyVHlwZSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoaWxkcmVuIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgkKLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RMaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Imhhc01vcmVJdGVtcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im51bUl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4JCQotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RJbkZvbGRlclR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiIAotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXRoU2VnbWVudCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4JCQotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc09iamVjdFBhcmVudHNUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0IiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIiAKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVsYXRpdmVQYXRoU2VnbWVudCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4gCi0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc09iamVjdEluRm9sZGVyTGlzdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0SW5Gb2xkZXJUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJoYXNNb3JlSXRlbXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJudW1JdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1JlcG9zaXRvcnlFbnRyeVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0NvbnRlbnRTdHJlYW1UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtaW1lVHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWxlbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJzdHJlYW0iIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIKLQkJCQl4bWltZTpleHBlY3RlZENvbnRlbnRUeXBlcz0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiB4bWxuczp4bWltZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBQ0xUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iQUNMIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJleGFjdCIgdHlwZT0ieHM6Ym9vbGVhbiIgCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS0gW1JlcG9zaXRvcnkgU2VydmljZXNdIC0tPgotCQotCTwhLS0gZ2V0UmVwb3NpdG9yaWVzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRSZXBvc2l0b3JpZXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRSZXBvc2l0b3JpZXNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3JpZXMiIHR5cGU9ImNtaXNtOmNtaXNSZXBvc2l0b3J5RW50cnlUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0KLQk8IS0tIGdldFJlcG9zaXRvcnlJbmZvIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mbyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFJlcG9zaXRvcnlJbmZvUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUluZm8iIHR5cGU9ImNtaXM6Y21pc1JlcG9zaXRvcnlJbmZvVHlwZSIgCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0VHlwZUNoaWxkcmVuIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlQ2hpbGRyZW4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVzIiB0eXBlPSJjbWlzbTpjbWlzVHlwZURlZmluaXRpb25MaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0VHlwZURlc2NlbmRhbnRzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVwdGgiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVEZXNjZW5kYW50c1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVzIiB0eXBlPSJjbWlzbTpjbWlzVHlwZUNvbnRhaW5lciIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRUeXBlRGVmaW5pdGlvbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZURlZmluaXRpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZURlZmluaXRpb25SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtOYXZpZ2F0aW9uIFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIGdldERlc2NlbmRhbnRzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXREZXNjZW5kYW50cyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVwdGgiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUGF0aFNlZ21lbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXREZXNjZW5kYW50c1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RJbkZvbGRlckNvbnRhaW5lclR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0RGVzY2VuZGFudHMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclRyZWUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImRlcHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQYXRoU2VnbWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclRyZWVSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENoaWxkcmVuIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGlsZHJlbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlckJ5IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUGF0aFNlZ21lbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENoaWxkcmVuUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldEZvbGRlclBhcmVudCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0IiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRPYmplY3RQYXJlbnRzIE9wZXJhdGlvbi0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFBhcmVudHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0UGFyZW50c1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBhcmVudHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RQYXJlbnRzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRSZW5kaXRpb25zIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRSZW5kaXRpb25zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVuZGl0aW9uc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbnMiIHR5cGU9ImNtaXM6Y21pc1JlbmRpdGlvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0Q2hlY2tlZG91dERvY3MgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldENoZWNrZWRPdXREb2NzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9yZGVyQnkiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENoZWNrZWRPdXREb2NzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtPYmplY3QgU2VydmljZXNdIC0tPgotCQotCTwhLS0gY3JlYXRlRG9jdW1lbnQgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZURvY3VtZW50Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InZlcnNpb25pbmdTdGF0ZSIgdHlwZT0iY21pczplbnVtVmVyc2lvbmluZ1N0YXRlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWNpZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWRkQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlRG9jdW1lbnRSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNvdXJjZUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uaW5nU3RhdGUiIHR5cGU9ImNtaXM6ZW51bVZlcnNpb25pbmdTdGF0ZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNyZWF0ZUZvbGRlciBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlRm9sZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWNpZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWRkQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlRm9sZGVyUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNyZWF0ZVJlbGF0aW9uc2hpcCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXBSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNyZWF0ZVBvbGljeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlUG9saWN5Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZVBvbGljeVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQkKLQk8IS0tIGdldEFsbG93YWJsZUFjdGlvbnMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFsbG93YWJsZUFjdGlvbnMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0iY21pczpjbWlzQWxsb3dhYmxlQWN0aW9uc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldFByb3BlcnRpZXMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldFByb3BlcnRpZXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFByb3BlcnRpZXNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0T2JqZWN0IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIAotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQb2xpY3lJZHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0T2JqZWN0QnlQYXRoIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RCeVBhdGgiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBhdGgiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBvbGljeUlkcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBQ0wiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdEJ5UGF0aFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0Q29udGVudFN0cmVhbSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Q29udGVudFN0cmVhbSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWFtSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9mZnNldCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Q29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gdXBkYXRlUHJvcGVydGllcyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlUHJvcGVydGllcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPCEtLQotCQkJCQlpZiBvYmplY3RJZCBpcyBwcmVzZW50IGluIHRoZSBwcm9wZXJ0aWVzIHRoZSB2YWx1ZSBtdXN0IG1hdGNoIHRoaXMKLQkJCQkJb2JqZWN0SWQKLQkJCQktLT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBtb3ZlT2JqZWN0IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJtb3ZlT2JqZWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0YXJnZXRGb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzb3VyY2VGb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ibW92ZU9iamVjdFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZGVsZXRlT2JqZWN0IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVPYmplY3QiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImRlbGV0ZU9iamVjdFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGRlbGV0ZVRyZWUgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImRlbGV0ZVRyZWUiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idW5maWxlT2JqZWN0cyIgdHlwZT0iY21pczplbnVtVW5maWxlT2JqZWN0IgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udGludWVPbkZhaWx1cmUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlVHJlZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZhaWxlZFRvRGVsZXRlIj4KLQkJCQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIHNldENvbnRlbnRTdHJlYW0gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9InNldENvbnRlbnRTdHJlYW0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im92ZXJ3cml0ZUZsYWciIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udGVudFN0cmVhbSIgdHlwZT0iY21pc206Y21pc0NvbnRlbnRTdHJlYW1UeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ic2V0Q29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBkZWxldGVDb250ZW50U3RyZWFtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVDb250ZW50U3RyZWFtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tW011bHRpLWZpbGluZyBTZXJ2aWNlc10tLT4KLQotCTwhLS0gYWRkT2JqZWN0VG9Gb2xkZXIgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSByZW1vdmVPYmplY3RGcm9tRm9sZGVyIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbRGlzY292ZXJ5IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIHF1ZXJ5IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RhdGVtZW50IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNlYXJjaEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icXVlcnlSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0TGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENvbnRlbnRDaGFuZ2VzIG9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDb250ZW50Q2hhbmdlcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlTG9nVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQcm9wZXJ0aWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUG9saWN5SWRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRDaGFuZ2VzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VMb2dUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtWZXJzaW9uaW5nIFNlcnZpY2VzXSAtLT4KLQotCTwhLS0gY2hlY2tPdXQgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNoZWNrT3V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tPdXRSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50Q29waWVkIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNhbmNlbENoZWNrT3V0IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5jZWxDaGVja091dCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNhbmNlbENoZWNrT3V0UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gY2hlY2tJbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tJbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWFqb3IiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoZWNraW5Db21tZW50IiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjaGVja0luUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1ham9yIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYWpvciIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIAotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQb2xpY3lJZHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0QWxsVmVyc2lvbnMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFsbFZlcnNpb25zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QWxsVmVyc2lvbnNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS1bUmVsYXRpb25zaGlwIFNlcnZpY2VzXS0tPgotCi0JPCEtLSBnZXRSZWxhdGlvbnNoaXBzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcERpcmVjdGlvbiIgdHlwZT0iY21pczplbnVtUmVsYXRpb25zaGlwRGlyZWN0aW9uIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0TGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS1bUG9saWN5IFNlcnZpY2VzXS0tPgotCi0JPCEtLSBhcHBseVBvbGljeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlQb2xpY3kiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhcHBseVBvbGljeVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIHJlbW92ZVBvbGljeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlUG9saWN5Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY3lJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlUG9saWN5UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRBcHBsaWVkUG9saWNpZXMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRBQ0wgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFDTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib25seUJhc2ljUGVybWlzc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QUNMUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQUNMIiB0eXBlPSJjbWlzbTpjbWlzQUNMVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgkKLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSBhcHBseUFDTCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlBQ0wiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0xQcm9wYWdhdGlvbiIgdHlwZT0iY21pczplbnVtQUNMUHJvcGFnYXRpb24iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhcHBseUFDTFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFDTCIgdHlwZT0iY21pc206Y21pc0FDTFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczEwL0NNSVNXUy1TZXJ2aWNlLndzZGwudGVtcGxhdGUgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NtaXMxMC9DTUlTV1MtU2VydmljZS53c2RsLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNjZGYwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczEwL0NNSVNXUy1TZXJ2aWNlLndzZGwudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMTczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLQk8IS0tCi0JCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLQkJbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkKLQkJb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLQkJYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotCQlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotCQlDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yCi0JCXRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotCQlMaWNlbnNlLgotCS0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6Y21pcz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iCi0JeG1sbnM6Y21pc209Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC8iCi0JeG1sbnM6Y21pc3c9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6bnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyIKLQl4bWxuczpqYXh3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4d3MiIG5hbWU9IkNNSVNXZWJTZXJ2aWNlcyI+Ci0JPHR5cGVzPgotCQk8eHNkOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvIj4KLQkJCTx4c2Q6aW1wb3J0IHNjaGVtYUxvY2F0aW9uPSI8JWNtaXNjb3JlJT4iCi0JCQkJbmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIgLz4KLQkJCTx4c2Q6aW1wb3J0IHNjaGVtYUxvY2F0aW9uPSI8JWNtaXNtc2clPiIKLQkJCQluYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC8iIC8+Ci0JCTwveHNkOnNjaGVtYT4KLQk8L3R5cGVzPgotCi0JPG1lc3NhZ2UgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCTxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJjbWlzbTpjbWlzRmF1bHQiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0QUNMUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFDTCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QUNMUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBQ0xSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJhcHBseUFDTFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphcHBseUFDTCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYXBwbHlBQ0xSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGx5QUNMUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0icXVlcnlSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206cXVlcnkiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InF1ZXJ5UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpxdWVyeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDb250ZW50Q2hhbmdlc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDb250ZW50Q2hhbmdlcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q29udGVudENoYW5nZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRDaGFuZ2VzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iYWRkT2JqZWN0VG9Gb2xkZXJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YWRkT2JqZWN0VG9Gb2xkZXIiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphZGRPYmplY3RUb0ZvbGRlclJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZU9iamVjdEZyb21Gb2xkZXIiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXREZXNjZW5kYW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXREZXNjZW5kYW50cyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0RGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldERlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENoaWxkcmVuUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENoaWxkcmVuIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q2hpbGRyZW5SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEZvbGRlclBhcmVudCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRGb2xkZXJQYXJlbnRSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UGFyZW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RQYXJlbnRzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RQYXJlbnRzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RQYXJlbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFJlbmRpdGlvbnNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVuZGl0aW9ucyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVuZGl0aW9uc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVuZGl0aW9uc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDaGVja2VkT3V0RG9jc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDaGVja2VkT3V0RG9jcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q2hlY2tlZE91dERvY3NSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENoZWNrZWRPdXREb2NzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iY3JlYXRlRG9jdW1lbnRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRG9jdW1lbnQiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZURvY3VtZW50UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVEb2N1bWVudFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVGb2xkZXJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRm9sZGVyIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVGb2xkZXJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZUZvbGRlclJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUmVsYXRpb25zaGlwIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXBSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVJlbGF0aW9uc2hpcFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVQb2xpY3lSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUG9saWN5IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVQb2xpY3lSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVBvbGljeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFsbG93YWJsZUFjdGlvbnMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFsbG93YWJsZUFjdGlvbnNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFsbG93YWJsZUFjdGlvbnNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UHJvcGVydGllc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRQcm9wZXJ0aWVzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0QnlQYXRoUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdEJ5UGF0aCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0QnlQYXRoUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RCeVBhdGhSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRDb250ZW50U3RyZWFtUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRTdHJlYW0iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0idXBkYXRlUHJvcGVydGllc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTp1cGRhdGVQcm9wZXJ0aWVzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJ1cGRhdGVQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTp1cGRhdGVQcm9wZXJ0aWVzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9Im1vdmVPYmplY3RSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206bW92ZU9iamVjdCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ibW92ZU9iamVjdFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206bW92ZU9iamVjdFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVPYmplY3RSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlT2JqZWN0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVPYmplY3RSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZU9iamVjdFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVUcmVlUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZVRyZWUiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZVRyZWVSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZVRyZWVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ic2V0Q29udGVudFN0cmVhbVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpzZXRDb250ZW50U3RyZWFtIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZUNvbnRlbnRTdHJlYW1SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlQ29udGVudFN0cmVhbSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImFwcGx5UG9saWN5UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGx5UG9saWN5IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJhcHBseVBvbGljeVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YXBwbHlQb2xpY3lSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icmVtb3ZlUG9saWN5UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZVBvbGljeSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icmVtb3ZlUG9saWN5UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpyZW1vdmVQb2xpY3lSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFwcGxpZWRQb2xpY2llcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBcHBsaWVkUG9saWNpZXNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdFJlbGF0aW9uc2hpcHMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZXBvc2l0b3JpZXNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVwb3NpdG9yaWVzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZXBvc2l0b3JpZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFJlcG9zaXRvcmllc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mb1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRSZXBvc2l0b3J5SW5mbyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm9SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFJlcG9zaXRvcnlJbmZvUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVDaGlsZHJlblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlQ2hpbGRyZW4iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZUNoaWxkcmVuUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlRGVzY2VuZGFudHMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50c1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZURlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVEZWZpbml0aW9uUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFR5cGVEZWZpbml0aW9uIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRUeXBlRGVmaW5pdGlvblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZURlZmluaXRpb25SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJjaGVja091dFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjaGVja091dCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY2hlY2tPdXRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNoZWNrT3V0UmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNhbmNlbENoZWNrT3V0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNhbmNlbENoZWNrT3V0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjYW5jZWxDaGVja091dFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y2FuY2VsQ2hlY2tPdXRSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY2hlY2tJblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjaGVja0luIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjaGVja0luUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjaGVja0luUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgkKLQk8bWVzc2FnZSBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QWxsVmVyc2lvbnNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QWxsVmVyc2lvbnMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFsbFZlcnNpb25zUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBbGxWZXJzaW9uc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImdldEZvbGRlclRyZWVSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Rm9sZGVyVHJlZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyVHJlZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Rm9sZGVyVHJlZVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJEaXNjb3ZlcnlTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0icXVlcnkiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnF1ZXJ5UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6cXVlcnlSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRDb250ZW50Q2hhbmdlcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q29udGVudENoYW5nZXNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDb250ZW50Q2hhbmdlc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYWRkT2JqZWN0VG9Gb2xkZXIiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmFkZE9iamVjdFRvRm9sZGVyUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6YWRkT2JqZWN0VG9Gb2xkZXJSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpyZW1vdmVPYmplY3RGcm9tRm9sZGVyUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6cmVtb3ZlT2JqZWN0RnJvbUZvbGRlclJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9Ik5hdmlnYXRpb25TZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0RGVzY2VuZGFudHMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldERlc2NlbmRhbnRzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0RGVzY2VuZGFudHNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRDaGlsZHJlbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q2hpbGRyZW5SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDaGlsZHJlblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Rm9sZGVyUGFyZW50UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0Rm9sZGVyUGFyZW50UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Rm9sZGVyVHJlZSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Rm9sZGVyVHJlZVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEZvbGRlclRyZWVSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RQYXJlbnRzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRPYmplY3RQYXJlbnRzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UGFyZW50c1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENoZWNrZWRPdXREb2NzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDaGVja2VkT3V0RG9jc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldENoZWNrZWRPdXREb2NzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iT2JqZWN0U2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVEb2N1bWVudFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZURvY3VtZW50UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVGb2xkZXIiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZUZvbGRlclJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZUZvbGRlclJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlUmVsYXRpb25zaGlwUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlUG9saWN5Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVQb2xpY3lSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVQb2xpY3lSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBbGxvd2FibGVBY3Rpb25zUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UHJvcGVydGllcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UHJvcGVydGllc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFByb3BlcnRpZXNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZW5kaXRpb25zIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRSZW5kaXRpb25zUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVuZGl0aW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdEJ5UGF0aCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0QnlQYXRoUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0QnlQYXRoUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudFN0cmVhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q29udGVudFN0cmVhbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGVQcm9wZXJ0aWVzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzp1cGRhdGVQcm9wZXJ0aWVzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6dXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9Im1vdmVPYmplY3QiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3Om1vdmVPYmplY3RSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzptb3ZlT2JqZWN0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlT2JqZWN0Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVPYmplY3RSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVPYmplY3RSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVUcmVlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVUcmVlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6ZGVsZXRlVHJlZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InNldENvbnRlbnRTdHJlYW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnNldENvbnRlbnRTdHJlYW1SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6ZGVsZXRlQ29udGVudFN0cmVhbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmRlbGV0ZUNvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJQb2xpY3lTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwbHlQb2xpY3kiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmFwcGx5UG9saWN5UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6YXBwbHlQb2xpY3lSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJyZW1vdmVQb2xpY3kiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnJlbW92ZVBvbGljeVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OnJlbW92ZVBvbGljeVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0QXBwbGllZFBvbGljaWVzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVsYXRpb25zaGlwc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJSZXBvc2l0b3J5U2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFJlcG9zaXRvcmllcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVwb3NpdG9yaWVzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVwb3NpdG9yaWVzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm8iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFJlcG9zaXRvcnlJbmZvUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVwb3NpdG9yeUluZm9SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlQ2hpbGRyZW4iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVDaGlsZHJlblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVDaGlsZHJlblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50cyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZURlc2NlbmRhbnRzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZURlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZURlZmluaXRpb24iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFR5cGVEZWZpbml0aW9uUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZURlZmluaXRpb25SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJWZXJzaW9uaW5nU2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrT3V0Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjaGVja091dFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNoZWNrT3V0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY2FuY2VsQ2hlY2tPdXQiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNhbmNlbENoZWNrT3V0UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y2FuY2VsQ2hlY2tPdXRSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0luIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjaGVja0luUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y2hlY2tJblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxWZXJzaW9ucyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0QWxsVmVyc2lvbnNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBbGxWZXJzaW9uc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9IkFDTFNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBQ0wiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFDTFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFDTFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFwcGx5QUNMIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzphcHBseUFDTFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmFwcGx5QUNMUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQotCi0JPGJpbmRpbmcgbmFtZT0iRGlzY292ZXJ5U2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpEaXNjb3ZlcnlTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0icXVlcnkiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29udGVudENoYW5nZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9Ik11bHRpRmlsaW5nU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpNdWx0aUZpbGluZ1NlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGRPYmplY3RUb0ZvbGRlciI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpOYXZpZ2F0aW9uU2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldERlc2NlbmRhbnRzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENoaWxkcmVuIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRGb2xkZXJUcmVlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdFBhcmVudHMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q2hlY2tlZE91dERvY3MiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9Ik9iamVjdFNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6T2JqZWN0U2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVGb2xkZXIiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVBvbGljeSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRQcm9wZXJ0aWVzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFJlbmRpdGlvbnMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0QnlQYXRoIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0idXBkYXRlUHJvcGVydGllcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJtb3ZlT2JqZWN0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZU9iamVjdCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVUcmVlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InNldENvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iUG9saWN5U2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpQb2xpY3lTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwbHlQb2xpY3kiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0icmVtb3ZlUG9saWN5Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iUmVwb3NpdG9yeVNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6UmVwb3NpdG9yeVNlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZXBvc2l0b3JpZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm8iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZUNoaWxkcmVuIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVEZXNjZW5kYW50cyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlRGVmaW5pdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iVmVyc2lvbmluZ1NlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6VmVyc2lvbmluZ1NlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja091dCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjYW5jZWxDaGVja091dCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja0luIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFsbFZlcnNpb25zIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJBQ0xTZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3OkFDTFNlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBQ0wiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwbHlBQ0wiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCi0KLQk8c2VydmljZSBuYW1lPSJEaXNjb3ZlcnlTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iRGlzY292ZXJ5U2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3OkRpc2NvdmVyeVNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249IjwlY21pc2Jhc2UlPi9EaXNjb3ZlcnlTZXJ2aWNlIiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9Ik11bHRpRmlsaW5nU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9Ik11bHRpRmlsaW5nU2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3Ok11bHRpRmlsaW5nU2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iPCVjbWlzYmFzZSU+L011bHRpRmlsaW5nU2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9Ik5hdmlnYXRpb25TZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6TmF2aWdhdGlvblNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249IjwlY21pc2Jhc2UlPi9OYXZpZ2F0aW9uU2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJPYmplY3RTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iT2JqZWN0U2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3Ok9iamVjdFNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSI8JWNtaXNiYXNlJT4vT2JqZWN0U2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJQb2xpY3lTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iUG9saWN5U2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3OlBvbGljeVNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSI8JWNtaXNiYXNlJT4vUG9saWN5U2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJSZWxhdGlvbnNoaXBTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3OlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249IjwlY21pc2Jhc2UlPi9SZWxhdGlvbnNoaXBTZXJ2aWNlIiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlJlcG9zaXRvcnlTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iUmVwb3NpdG9yeVNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpSZXBvc2l0b3J5U2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iPCVjbWlzYmFzZSU+L1JlcG9zaXRvcnlTZXJ2aWNlIiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IlZlcnNpb25pbmdTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iVmVyc2lvbmluZ1NlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpWZXJzaW9uaW5nU2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iPCVjbWlzYmFzZSU+L1ZlcnNpb25pbmdTZXJ2aWNlIiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IkFDTFNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJBQ0xTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6QUNMU2VydmljZVBvcnRCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249IjwlY21pc2Jhc2UlPi9BQ0xTZXJ2aWNlIiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczExL0NNSVMtQ29yZS54c2QudGVtcGxhdGUgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NtaXMxMS9DTUlTLUNvcmUueHNkLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFkMDFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczExL0NNSVMtQ29yZS54c2QudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLQk8IS0tCi0JCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLQkJbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkKLQkJb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLQkJYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotCQlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotCQlDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yCi0JCXRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotCQlMaWNlbnNlLgotCS0tPgotCQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iCi0JeG1sbnM6YXRvbT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB4bWxuczp4aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQl4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiB4bWxuczp4amM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIveGpjIgotCWpheGI6ZXh0ZW5zaW9uQmluZGluZ1ByZWZpeGVzPSJ4amMiIGpheGI6dmVyc2lvbj0iMi4xIgotCXhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIiB2ZXJzaW9uPSIxLjAiPgotCi0JPCEtLSAgZW51bXMgLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bURlY2ltYWxQcmVjaXNpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjMyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSI2NCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNvbnRlbnRTdHJlYW1BbGxvd2VkIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vdGFsbG93ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbG93ZWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FyZGluYWxpdHkiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2luZ2xlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtdWx0aSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVwZGF0YWJpbGl0eSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZWFkb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icmVhZHdyaXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ3aGVuY2hlY2tlZG91dCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ib25jcmVhdGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1EYXRlVGltZVJlc29sdXRpb24iPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ieWVhciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGF0ZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGltZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnR5VHlwZSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib29sZWFuIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iaW50ZWdlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGF0ZXRpbWUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlY2ltYWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0bWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idXJpIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQmFzZU9iamVjdFR5cGVJZHMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpkb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpmb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6cmVsYXRpb25zaGlwIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBvbGljeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczppdGVtIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnNlY29uZGFyeSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlRdWVyeSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtZXRhZGF0YW9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGx0ZXh0b25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90aHNlcGFyYXRlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3RoY29tYmluZWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5Sm9pbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lcm9ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyYW5kb3V0ZXIiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYW55dGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icHdjb25seSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVZlcnNpb25pbmdTdGF0ZSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVja2Vkb3V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJtaW5vciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibWFqb3IiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1VbmZpbGVPYmplY3QiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idW5maWxlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGVzaW5nbGVmaWxlZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGVsZXRlIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtUmVsYXRpb25zaGlwRGlyZWN0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGFyZ2V0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJlaXRoZXIiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzb3VyY2UiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InRhcmdldCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iYm90aCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tICBwcm9wZXJ0aWVzIGluIENNSVMgLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNCYXNlIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6bmFtZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpkZXNjcmlwdGlvbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpvYmplY3RJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpvYmplY3RUeXBlSWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6YmFzZVR5cGVJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpzZWNvbmRhcnlPYmplY3RUeXBlSWRzIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNyZWF0ZWRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjcmVhdGlvbkRhdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6bGFzdE1vZGlmaWVkQnkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6bGFzdE1vZGlmaWNhdGlvbkRhdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y2hhbmdlVG9rZW4iIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNEb2N1bWVudCI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzSW1tdXRhYmxlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzTGF0ZXN0VmVyc2lvbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczppc01ham9yVmVyc2lvbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczppc0xhdGVzdE1ham9yVmVyc2lvbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczppc1ByaXZhdGVXb3JraW5nQ29weSIgLz4JCQkKLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uTGFiZWwiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6dmVyc2lvblNlcmllc0lkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmlzVmVyc2lvblNlcmllc0NoZWNrZWRPdXQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRCeSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNoZWNraW5Db21tZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6Y29udGVudFN0cmVhbU1pbWVUeXBlIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOmNvbnRlbnRTdHJlYW1GaWxlTmFtZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpjb250ZW50U3RyZWFtSWQiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNGb2xkZXIiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpwYXJlbnRJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczphbGxvd2VkQ2hpbGRPYmplY3RUeXBlSWRzIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnBhdGgiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNSZWxhdGlvbnNoaXAiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpzb3VyY2VJZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczp0YXJnZXRJZCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVByb3BlcnRpZXNQb2xpY3kiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY21pczpwb2xpY3lUZXh0IiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJjbWlzVW5kZWZpbmVkQXR0cmlidXRlIj4KLQkJPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCTwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLQk8IS0tICBtYWluIGNtaXMgb2JqZWN0IC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJjbWlzOmNtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVsYXRpb25zaGlwIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTwhLS0gIGlmIGNoYW5nZSBsb2cgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VFdmVudEluZm8iIHR5cGU9ImNtaXM6Y21pc0NoYW5nZUV2ZW50VHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgQUNMIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWNsIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImV4YWN0QUNMIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIEFwcGxpZWQgUG9saWN5IElEcyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljeUlkcyIgdHlwZT0iY21pczpjbWlzTGlzdE9mSWRzVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSAgUmVuZGl0aW9uIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uIiB0eXBlPSJjbWlzOmNtaXNSZW5kaXRpb25UeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0KLQkJCTwhLS0gIGV4dGVuc2lvbnMgLS0+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4IgotCQkJCW5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gcHJvcGVydHkgYmFnIC0tPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0aWVzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czphcHBpbmZvPgotCQkJCQkJPGpheGI6cHJvcGVydHkgbmFtZT0icHJvcGVydHkiIC8+Ci0JCQkJCTwveHM6YXBwaW5mbz4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlCb29sZWFuIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUJvb2xlYW4iCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SWQiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5SWQiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SW50ZWdlciIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJbnRlZ2VyIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eURhdGVUaW1lIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURhdGVUaW1lIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eURlY2ltYWwiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGVjaW1hbCIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlIdG1sIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUh0bWwiCi0JCQkJCW5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5U3RyaW5nIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVN0cmluZyIKLQkJCQkJbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlVcmkiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5VXJpIgotCQkJCQluaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCTwveHM6Y2hvaWNlPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIHN0YXJ0IHRoZSBwcm9wIGRlZmluaXRpb25zIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHkiPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InByb3BlcnR5RGVmaW5pdGlvbklkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIHByb3BlcnR5IGRlZmluaXRpb24gaWQgZm9yIHRoaXMKLQkJCQkJcHJvcGVydHkgaW5zdGFuY2UuIFRoaXMgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHNldCB3aGVuIHVzZWQKLQkJCQkJYXMgYSBkZWZhdWx0IHZhbHVlLiBUaGlzIGlzIHJlcXVpcmVkIHRvIGJlIHNldCB3aGVuIHVzZWQgZm9yIAotCQkJCQlxdWVyeSByZXN1bHQgc2V0IG9yIHJldHVybmluZyBwcm9wZXJ0aWVzIG9uIGFuIG9iamVjdC4KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2FsTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIj4KLQkJCTx4czphbm5vdGF0aW9uPgotCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQlUaGlzIGlzIHRoZSBsb2NhbG5hbWUgYXMgZGVmaW5lZCBieSB0aGUgcHJvcGVydHkKLQkJCQkJZGVmaW5pdGlvbi4KLQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQk8L3hzOmFubm90YXRpb24+Ci0JCTwveHM6YXR0cmlidXRlPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiPgotCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCVRoaXMgaXMgdGhlIGRpc3BsYXluYW1lIGFzIGRlZmluZWQgYnkgdGhlIHByb3BlcnR5Ci0JCQkJCWRlZmluaXRpb24uCi0JCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJPC94czphbm5vdGF0aW9uPgotCQk8L3hzOmF0dHJpYnV0ZT4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCI+Ci0JCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJVGhpcyBpcyB0aGUgcXVlcnlOYW1lLiBUaGlzIG11c3QgYmUgc3BlY2lmaWVkIGlmCi0JCQkJCXRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5LiBJZiBhbGlhc2VzIGFyZSB1c2VkLCB0aGUgYWxpYXMgaXMgdG8KLQkJCQkJYmUgc3BlY2lmaWVkIGhlcmUgaW5zdGVhZCBvZiB0aGUgcXVlcnlOYW1lLgotCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJPC94czphdHRyaWJ1dGU+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlCb29sZWFuIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmJvb2xlYW4iIC8+Ci0JCQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUlkIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SW50ZWdlciI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czppbnRlZ2VyIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEYXRlVGltZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkYXRlVGltZSIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQkKLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5RGVjaW1hbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHkiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpkZWNpbWFsIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlIdG1sIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlTdHJpbmciPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlVcmkiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5Ij4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6YW55VVJJIiAvPgotCQkJCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8IS0tIGNtaXMgY2hvaWNlIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlIj4KLQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJkaXNwbGF5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUJvb2xlYW4iPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmJvb2xlYW4iIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUJvb2xlYW4iIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VJZCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUludGVnZXIiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUludGVnZXIiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDaG9pY2VEYXRlVGltZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZURhdGVUaW1lIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlRGVjaW1hbCI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6ZGVjaW1hbCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGVjaW1hbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZUh0bWwiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc0Nob2ljZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ2YWx1ZSIKLQkJCQkJCXR5cGU9InhzOnN0cmluZyIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSHRtbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hvaWNlU3RyaW5nIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNDaG9pY2UiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idmFsdWUiCi0JCQkJCQl0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVN0cmluZyIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0Nob2ljZVVyaSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzQ2hvaWNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InZhbHVlIgotCQkJCQkJdHlwZT0ieHM6YW55VVJJIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VVcmkiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSAgYWxsb3dhYmxlIGFjdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkRlbGV0ZU9iamVjdCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhblVwZGF0ZVByb3BlcnRpZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRGb2xkZXJUcmVlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0UHJvcGVydGllcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldE9iamVjdFJlbGF0aW9uc2hpcHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRPYmplY3RQYXJlbnRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Rm9sZGVyUGFyZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0RGVzY2VuZGFudHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5Nb3ZlT2JqZWN0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuRGVsZXRlQ29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNoZWNrT3V0IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQ2FuY2VsQ2hlY2tPdXQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DaGVja0luIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuU2V0Q29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuQWRkT2JqZWN0VG9Gb2xkZXIiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5SZW1vdmVPYmplY3RGcm9tRm9sZGVyIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Q29udGVudFN0cmVhbSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkFwcGx5UG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0QXBwbGllZFBvbGljaWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuUmVtb3ZlUG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FuR2V0Q2hpbGRyZW4iIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5DcmVhdGVEb2N1bWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZUZvbGRlciIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZVJlbGF0aW9uc2hpcCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZUl0ZW0iIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5EZWxldGVUcmVlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIHJlbmRpdGlvbnMgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5HZXRSZW5kaXRpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tIEFDTCAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkdldEFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkFwcGx5QUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzTGlzdE9mSWRzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQotCQkJPCEtLSAgZXh0ZW5zaW9uIC0tPgotCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPCEtLSBidWxrVXBkYXRlUHJvcGVydGllcyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im5ld0lkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0J1bGtVcGRhdGVUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiIgdHlwZT0iY21pczpjbWlzT2JqZWN0SWRBbmRDaGFuZ2VUb2tlblR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWRkU2Vjb25kYXJ5VHlwZUlkcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVTZWNvbmRhcnlUeXBlSWRzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQkKLQkJCTwhLS0gIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSBQcm9wZXJ0eSBBdHRyaWJ1dGVzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkaXNwbGF5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icXVlcnlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlUeXBlIiB0eXBlPSJjbWlzOmVudW1Qcm9wZXJ0eVR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXJkaW5hbGl0eSIgdHlwZT0iY21pczplbnVtQ2FyZGluYWxpdHkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ1cGRhdGFiaWxpdHkiIHR5cGU9ImNtaXM6ZW51bVVwZGF0YWJpbGl0eSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJPCEtLSBmbGFncyAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluaGVyaXRlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icXVlcnlhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3JkZXJhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvcGVuQ2hvaWNlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tICB0eXBlIHNwZWNpZmljIGRlZmluaXRpb25zIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5Qm9vbGVhbiIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlQm9vbGVhbiIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SWREZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlJZCIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlSWQiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlJbnRlZ2VyIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhWYWx1ZSIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtaW5WYWx1ZSIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VJbnRlZ2VyIiAvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJPC94czpjb21wbGV4Q29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eURhdGVUaW1lIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzb2x1dGlvbiIKLQkJCQkJCXR5cGU9ImNtaXM6ZW51bURhdGVUaW1lUmVzb2x1dGlvbiIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGF0ZVRpbWUiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzUHJvcGVydHlEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdFZhbHVlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzUHJvcGVydHlEZWNpbWFsIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhWYWx1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtaW5WYWx1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIgbWluT2NjdXJzPSIwIgotCQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9ImNtaXM6ZW51bURlY2ltYWxQcmVjaXNpb24iCi0JCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2hvaWNlIgotCQkJCQkJdHlwZT0iY21pczpjbWlzQ2hvaWNlRGVjaW1hbCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5SHRtbERlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUh0bWwiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZUh0bWwiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNQcm9wZXJ0eURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0VmFsdWUiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVN0cmluZyIgLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4TGVuZ3RoIiB0eXBlPSJ4czppbnRlZ2VyIgotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNob2ljZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc0Nob2ljZVN0cmluZyIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1Byb3BlcnR5VXJpRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1Byb3BlcnR5RGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHRWYWx1ZSIKLQkJCQkJCXR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5VXJpIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjaG9pY2UiCi0JCQkJCQl0eXBlPSJjbWlzOmNtaXNDaG9pY2VVcmkiIC8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQotCTwhLS0gdHlwZSBkZWZpbml0aW9uIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPCEtLSAgcHJpbWFyeSBpZGVudGlmeWluZyBhdHRyaWJ1dGUgLS0+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsb2NhbE5hbWVzcGFjZSIgdHlwZT0ieHM6YW55VVJJIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRpc3BsYXlOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gIGJhc2UgdHlwZSAtLT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImJhc2VJZCIgdHlwZT0iY21pczplbnVtQmFzZU9iamVjdFR5cGVJZHMiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcGFyZW50IC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGFyZW50SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJVGhpcyBpcyB0aGUgaWQgZm9yIHRoZSBwYXJlbnQgdHlwZSBkZWZpbml0aW9uLgotCQkJCQkJSWYgdGhpcyBpcyBhIGJhc2UgdHlwZSwgdGhpcyBpcyBNVVNUIE5PVCBiZSBwcmVzZW50LgotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8IS0tIGZsYWdzIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsZWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmdWxsdGV4dEluZGV4ZWQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIGRlZmF1bHQ9InRydWUiIC8+Ci0KLQkJCTwhLS0gY29udHJvbGxhYmxlIC0tPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udHJvbGxhYmxlUG9saWN5IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udHJvbGxhYmxlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQotCQkJPCEtLSB0eXBlIG11dGFiaWxpdHktLT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVNdXRhYmlsaXR5IiB0eXBlPSJjbWlzOmNtaXNUeXBlTXV0YWJpbGl0eUNhcGFiaWxpdGllc1R5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbnMgLS0+Ci0JCQk8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQk8eHM6YXBwaW5mbz4KLQkJCQkJCTxqYXhiOnByb3BlcnR5IG5hbWU9InByb3BlcnR5RGVmaW5pdGlvbiIgLz4KLQkJCQkJPC94czphcHBpbmZvPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uVHlwZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5RGVjaW1hbERlZmluaXRpb24iIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5SWREZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eUlkRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlIdG1sRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlIdG1sRGVmaW5pdGlvblR5cGUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25UeXBlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnR5VXJpRGVmaW5pdGlvbiIgdHlwZT0iY21pczpjbWlzUHJvcGVydHlVcmlEZWZpbml0aW9uVHlwZSIgLz4KLQkJCTwveHM6Y2hvaWNlPgotCi0JCQk8IS0tIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSB0eXBlIHNwZWNpZmljIHR5cGVkZWZzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtQWxsb3dlZCIgdHlwZT0iY21pczplbnVtQ29udGVudFN0cmVhbUFsbG93ZWQiCi0JCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVGb2xkZXJEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlUmVsYXRpb25zaGlwRGVmaW5pdGlvblR5cGUiPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2VkU291cmNlVHlwZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93ZWRUYXJnZXRUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVQb2xpY3lEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNUeXBlSXRlbURlZmluaXRpb25UeXBlIj4KLQkJPHhzOmNvbXBsZXhDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiPgotCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6Y29tcGxleENvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVTZWNvbmRhcnlEZWZpbml0aW9uVHlwZSI+Ci0JCTx4czpjb21wbGV4Q29udGVudD4KLQkJCTx4czpleHRlbnNpb24gYmFzZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+CQotCi0JPCEtLSAgcXVlcnkgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNRdWVyeVR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJzdGF0ZW1lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InNlYXJjaEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJPHhzOmFueSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lc3BhY2U9IiMjb3RoZXIiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQotCTwhLS0gIHJlcG9zaXRvcnkgaW5mbyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1JlcG9zaXRvcnlJbmZvVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZSBtaW5PY2N1cnM9IjEiPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeURlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZW5kb3JOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9kdWN0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvZHVjdFZlcnNpb24iIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJvb3RGb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIi8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJsYXRlc3RDaGFuZ2VMb2dUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0aWVzIiB0eXBlPSJjbWlzOmNtaXNSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzVHlwZSIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImFjbENhcGFiaWxpdHkiIHR5cGU9ImNtaXM6Y21pc0FDTENhcGFiaWxpdHlUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY21pc1ZlcnNpb25TdXBwb3J0ZWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InRoaW5DbGllbnRVUkkiIHR5cGU9InhzOmFueVVSSSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZXNJbmNvbXBsZXRlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlc09uVHlwZSIgdHlwZT0iY21pczplbnVtQmFzZU9iamVjdFR5cGVJZHMiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJpbmNpcGFsQW5vbnltb3VzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCUlmIHNldCwgdGhpcyBmaWVsZCBob2xkcyB0aGUgcHJpbmNpcGFsIHdobyBpcwotCQkJCQkJdXNlZCBmb3IgYW5vbnltb3VzIGFjY2Vzcy4gVGhpcyBwcmluY2lwYWwgY2FuIHRoZW4gYmUgCi0JCQkJCQlwYXNzZWQgdG8gdGhlIEFDTCBzZXJ2aWNlcyB0byBzcGVjaWZ5IHdoYXQgcGVybWlzc2lvbnMKLQkJCQkJCWFub255bW91cyB1c2VycyBzaG91bGQgaGF2ZS4KLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJpbmNpcGFsQW55b25lIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCUlmIHNldCwgdGhpcyBmaWVsZCBob2xkcyB0aGUgcHJpbmNpcGFsIHdobyBpcwotCQkJCQkJdXNlZCBmb3IgZXZlcnlvbmUncyBhY2Nlc3MuIFRoaXMgcHJpbmNpcGFsIGNhbiB0aGVuIGJlIAotCQkJCQkJcGFzc2VkIHRvIHRoZSBBQ0wgc2VydmljZXMgdG8gc3BlY2lmeSB3aGF0IHBlcm1pc3Npb25zCi0JCQkJCQlldmVyeW9uZSBzaG91bGQgaGF2ZS4KLQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5kZWRGZWF0dXJlcyIKLQkJCQl0eXBlPSJjbWlzOmNtaXNFeHRlbnNpb25GZWF0dXJlVHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVwb3NpdG9yeUNhcGFiaWxpdGllc1R5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5QUNMIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5QUNMIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUFsbFZlcnNpb25zU2VhcmNoYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlDaGFuZ2VzIiB0eXBlPSJjbWlzOmVudW1DYXBhYmlsaXR5Q2hhbmdlcyIgLz4KLQotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGFiaWxpdHkiCi0JCQkJdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUdldERlc2NlbmRhbnRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUdldEZvbGRlclRyZWUiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5T3JkZXJCeSIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eU9yZGVyQnkiCi0JCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIC8+Ci0KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlNdWx0aWZpbGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlQV0NTZWFyY2hhYmxlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVBXQ1VwZGF0YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhcGFiaWxpdHlRdWVyeSIgdHlwZT0iY21pczplbnVtQ2FwYWJpbGl0eVF1ZXJ5IgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eVJlbmRpdGlvbnMiIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlSZW5kaXRpb24iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5VW5maWxpbmciIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5VmVyc2lvblNwZWNpZmljRmlsaW5nIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eUpvaW4iIHR5cGU9ImNtaXM6ZW51bUNhcGFiaWxpdHlKb2luIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjYXBhYmlsaXR5Q3JlYXRhYmxlUHJvcGVydHlUeXBlcyIKLQkJCQl0eXBlPSJjbWlzOmNtaXNDcmVhdGFibGVQcm9wZXJ0eVR5cGVzVHlwZSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotCQkJPC94czplbGVtZW50PgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2FwYWJpbGl0eU5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMiCi0JCQkJdHlwZT0iY21pczpjbWlzTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotCQkJPC94czplbGVtZW50PgotCi0JCQk8IS0tIGV4dGVuc2lvbiAtLT4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9InNraXAiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIFVuaWZpZWQgU2VhcmNoIC0tPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1UeXBlT2ZDaGFuZ2VzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhIG5ldyBJRCBoYXMgYmVlbiBjcmVhdGVkIC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjcmVhdGVkIiAvPgotCQkJPCEtLSBjb250ZW50IHdpdGggYW4gZXhpc3RpbmcgSUQgaGFzIGJlZW4gbW9kaWZpZWQgLS0+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZWQiIC8+Ci0JCQk8IS0tIGNvbnRlbnQgd2l0aCBhbiBleGlzdGluZyBJRCBoYXMgYmVlbiBkZWxldGVkIC0tPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJkZWxldGVkIiAvPgotCQkJPCEtLSBjb250ZW50IHdpdGggYW4gZXhpc3RpbmcgSUQgaGFzIGhhZCBpdHMgc2VjdXJpdHkgcG9saWN5IGNoYW5nZWQtLT4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic2VjdXJpdHkiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlDaGFuZ2VzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im9iamVjdGlkc29ubHkiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByb3BlcnRpZXMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0JCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlPcmRlckJ5Ij4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbW1vbiIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY3VzdG9tIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQ2hhbmdlRXZlbnRUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVHlwZSIgdHlwZT0iY21pczplbnVtVHlwZU9mQ2hhbmdlcyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiAvPgotCi0JCQk8IS0tICBleHRlbnNpb24gLS0+Ci0JCQk8eHM6YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPCEtLSBBQ0wgLS0+Ci0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUFDTFByb3BhZ2F0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9InJlcG9zaXRvcnlkZXRlcm1pbmVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvYmplY3Rvbmx5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJwcm9wYWdhdGUiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bUNhcGFiaWxpdHlBQ0wiPgotCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZGlzY292ZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hbmFnZSIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQmFzaWNQZXJtaXNzaW9ucyI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjbWlzOnJlYWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6d3JpdGUiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6YWxsIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUGVybWlzc2lvbkRlZmluaXRpb24iPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUGVybWlzc2lvbk1hcHBpbmciPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJrZXkiIHR5cGU9ImNtaXM6ZW51bUFsbG93YWJsZUFjdGlvbnNLZXkiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJTXVsdGlwbGUgZW50cmllcyBhcmUgT1InZWQgdG9nZXRoZXIuIEFueQotCQkJCQkJcGVybWlzc2lvbiB0aGF0IHNwZWNpZmllZCBpcyBzdWZmaWNpZW50IHRvIAotCQkJCQkJcHJvdmlkZSByaWdodHMgcmVxdWlyZWQgaW4ga2V5Ci0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQWxsb3dhYmxlQWN0aW9uc0tleSI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXREZXNjZW5kZW50cy5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldENoaWxkcmVuLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0UGFyZW50cy5Gb2xkZXIiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEZvbGRlclBhcmVudC5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNyZWF0ZURvY3VtZW50LkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlRm9sZGVyLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlUmVsYXRpb25zaGlwLlNvdXJjZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ3JlYXRlUmVsYXRpb25zaGlwLlRhcmdldCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuR2V0UHJvcGVydGllcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblZpZXdDb250ZW50Lk9iamVjdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuVXBkYXRlUHJvcGVydGllcy5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbk1vdmUuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5Nb3ZlLlRhcmdldCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuTW92ZS5Tb3VyY2UiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZS5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkRlbGV0ZVRyZWUuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5TZXRDb250ZW50LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5EZWxldGVDb250ZW50LkRvY3VtZW50IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BZGRUb0ZvbGRlci5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkFkZFRvRm9sZGVyLkZvbGRlciIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuUmVtb3ZlRnJvbUZvbGRlci5PYmplY3QiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhblJlbW92ZUZyb21Gb2xkZXIuRm9sZGVyIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5DaGVja291dC5Eb2N1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iY2FuQ2FuY2VsQ2hlY2tvdXQuRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkNoZWNraW4uRG9jdW1lbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldEFsbFZlcnNpb25zLlZlcnNpb25TZXJpZXMiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNhbkdldE9iamVjdFJlbGF0aW9uc2hpcHMuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BZGRQb2xpY3kuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BZGRQb2xpY3kuUG9saWN5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVQb2xpY3kuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5SZW1vdmVQb2xpY3kuUG9saWN5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRBcHBsaWVkUG9saWNpZXMuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5HZXRBQ0wuT2JqZWN0IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjYW5BcHBseUFDTC5PYmplY3QiIC8+Ci0JCTwveHM6cmVzdHJpY3Rpb24+Ci0JPC94czpzaW1wbGVUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVVzZXJzIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6dXNlciI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJVGhpcyB1c2VyIGNhbiBiZSB1c2VkIG9uIHNldHRpbmcgQUNMcyB0byBzcGVjaWZ5Ci0JCQkJCQl0aGUgcGVybWlzc2lvbiB0aGlzCi0JCQkJCQl1c2VyIGNvbnRleHQgc2hvdWxkIGhhdmUuCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJPC94czphbm5vdGF0aW9uPgotCQkJPC94czplbnVtZXJhdGlvbj4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tIEFDTCBvbiBvYmplY3RzIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQWNjZXNzQ29udHJvbFByaW5jaXBhbFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcmluY2lwYWxJZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sRW50cnlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJpbmNpcGFsIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sUHJpbmNpcGFsVHlwZSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlyZWN0IiB0eXBlPSJ4czpib29sZWFuIiAvPgotCi0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJtaXNzaW9uIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sRW50cnlUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQlwcm9jZXNzQ29udGVudHM9ImxheCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNBQ0xDYXBhYmlsaXR5VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InN1cHBvcnRlZFBlcm1pc3Npb25zIiB0eXBlPSJjbWlzOmVudW1TdXBwb3J0ZWRQZXJtaXNzaW9ucyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InByb3BhZ2F0aW9uIiB0eXBlPSJjbWlzOmVudW1BQ0xQcm9wYWdhdGlvbiIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InBlcm1pc3Npb25zIiB0eXBlPSJjbWlzOmNtaXNQZXJtaXNzaW9uRGVmaW5pdGlvbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWFwcGluZyIgdHlwZT0iY21pczpjbWlzUGVybWlzc2lvbk1hcHBpbmciCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW51bVN1cHBvcnRlZFBlcm1pc3Npb25zIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImJhc2ljIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBvc2l0b3J5IiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJib3RoIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTwhLS0gcmVuZGl0aW9ucyAtLT4KLQk8eHM6c2ltcGxlVHlwZSBuYW1lPSJlbnVtQ2FwYWJpbGl0eVJlbmRpdGlvbiI+Ci0JCTx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJyZWFkIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1SZW5kaXRpb25LaW5kIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNtaXM6dGh1bWJuYWlsIiAvPgotCQk8L3hzOnJlc3RyaWN0aW9uPgotCTwveHM6c2ltcGxlVHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzUmVuZGl0aW9uVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InN0cmVhbUlkIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtaW1ldHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4czppbnRlZ2VyIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ia2luZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0idGl0bGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaGVpZ2h0IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ3aWR0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRG9jdW1lbnRJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCW1pbk9jY3Vycz0iMCIgLz4KLQotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCi0JPCEtLSBlbGVtZW50cyAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJjbWlzOmNtaXNBbGxvd2FibGVBY3Rpb25zVHlwZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJVGhpcyBpcyB0aGUgcm9vdCB0YWcgZm9yIGEgQ01JUyBBbGxvd2FibGVBY3Rpb25zCi0JCQkJRG9jdW1lbnQgVHlwZQotCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JPC94czplbGVtZW50PgotCi0JPHhzOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9ImNtaXM6Y21pc1F1ZXJ5VHlwZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJVGhpcyBpcyB0aGUgcm9vdCB0YWcgZm9yIGEgQ01JUyBRdWVyeSBEb2N1bWVudCBUeXBlCi0JCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYWNsIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCVRoaXMgaXMgdGhlIHJvb3QgdGFnIGZvciBhIENNSVMgQUNMIERvY3VtZW50IFR5cGUKLQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCTwveHM6ZWxlbWVudD4KLQkKLQk8IS0tIHR5cGUgbXV0YWJpbGl0eSAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc1R5cGVNdXRhYmlsaXR5Q2FwYWJpbGl0aWVzVHlwZSI+IAotCQk8eHM6c2VxdWVuY2U+IAotCQkJPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlbGV0ZSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+IAotCTwveHM6Y29tcGxleFR5cGU+IAotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDcmVhdGFibGVQcm9wZXJ0eVR5cGVzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNhbkNyZWF0ZSIgdHlwZT0iY21pczplbnVtUHJvcGVydHlUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotCQkJCXByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibG9jYWxOYW1lIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImxvY2FsTmFtZXNwYWNlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icXVlcnlOYW1lIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNyZWF0YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWxlYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeWFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZnVsbHRleHRJbmRleGVkIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRyb2xsYWJsZVBvbGljeSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250cm9sbGFibGVBQ0wiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIGZlYXR1cmUgZXh0ZW5zaW9ucyAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0V4dGVuc2lvbkZlYXR1cmVLZXlWYWx1ZVBhaXIiPgkKLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImtleSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4gCi0KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0V4dGVuc2lvbkZlYXR1cmVUeXBlIj4JCi0JCTx4czpzZXF1ZW5jZT4KLQkJCTwhLS0gaWQgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IGZpZWxkIC0gdHlwaWNhbGx5IHdpbGwgYmUgYSBVUk4tLT4KLQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJpZCIgdHlwZT0ieHM6YW55VVJJIiAvPgotCQkJPCEtLSBvcHRpb25hbCB1cmwgZm9yIGEgc2l0ZSBkZXNjcmliaW5nIHRoZSBleHRlbnNpb24gLS0+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0idXJsIiB0eXBlPSJ4czphbnlVUkkiIC8+Ci0JCQk8IS0tIG9wdGlvbmFsIHNob3J0IG5hbWUgZm9yIHN0YW5kYXJkIGkuZS4gRm9vU3RhbmRhcmQgLS0+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iY29tbW9uTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQkJPCEtLSBvcHRpb25hbCB2ZXJzaW9uIGxhYmVsLS0+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0idmVyc2lvbkxhYmVsIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImZlYXR1cmVEYXRhIiB0eXBlPSJjbWlzOmNtaXNFeHRlbnNpb25GZWF0dXJlS2V5VmFsdWVQYWlyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmFueSBwcm9jZXNzQ29udGVudHM9ImxheCIgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCTwveHM6Y29tcGxleFR5cGU+IAotCQotPC94czpzY2hlbWE+Ci0JPCEtLSBFT0YgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTEvQ01JUy1NZXNzYWdpbmcueHNkLnRlbXBsYXRlIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTEvQ01JUy1NZXNzYWdpbmcueHNkLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzMwOTE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczExL0NNSVMtTWVzc2FnaW5nLnhzZC50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDIzMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotCTwhLS0KLQkJTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdQotCQltYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heQotCQlvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLQkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieQotCQlhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCi0JCUxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCi0JCUNPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IKLQkJdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0JCUxpY2Vuc2UuCi0JLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9tZXNzYWdpbmcvMjAwOTA4LyIKLQl4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczpjbWlzbT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9tZXNzYWdpbmcvMjAwOTA4LyIKLQl4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eGpjPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiL3hqYyIKLQlqYXhiOmV4dGVuc2lvbkJpbmRpbmdQcmVmaXhlcz0ieGpjIiBqYXhiOnZlcnNpb249IjIuMSIKLQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLQk8eHM6aW1wb3J0IHNjaGVtYUxvY2F0aW9uPSI8JWNtaXNjb3JlJT4iCi0JCW5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iIC8+Ci0KLQk8IS0tIGV4Y2VwdGlvbnMgLS0+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNGYXVsdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJjbWlzbTplbnVtU2VydmljZUV4Y2VwdGlvbiIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9ImNvZGUiIHR5cGU9InhzOmludGVnZXIiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmVsZW1lbnQgbmFtZT0iY21pc0ZhdWx0IiB0eXBlPSJjbWlzbTpjbWlzRmF1bHRUeXBlIiAvPgotCTx4czpzaW1wbGVUeXBlIG5hbWU9ImVudW1TZXJ2aWNlRXhjZXB0aW9uIj4KLQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnN0cmFpbnQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im5hbWVDb25zdHJhaW50VmlvbGF0aW9uIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJjb250ZW50QWxyZWFkeUV4aXN0cyIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0iZmlsdGVyTm90VmFsaWQiIC8+Ci0JCQk8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRBcmd1bWVudCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ibm90U3VwcG9ydGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJvYmplY3ROb3RGb3VuZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icGVybWlzc2lvbkRlbmllZCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0icnVudGltZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RvcmFnZSIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyZWFtTm90U3VwcG9ydGVkIiAvPgotCQkJPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGVDb25mbGljdCIgLz4KLQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0idmVyc2lvbmluZyIgLz4KLQkJPC94czpyZXN0cmljdGlvbj4KLQk8L3hzOnNpbXBsZVR5cGU+Ci0KLQk8IS0tIGV4dGVuc2lvbiAtLT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iY21pc0V4dGVuc2lvblR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWVzcGFjZT0iIyNvdGhlciIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTwhLS0gdHlwZXMgZm9yIFdTIC0tPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZUNvbnRhaW5lciI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIgCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGlsZHJlbiIgdHlwZT0iY21pc206Y21pc1R5cGVDb250YWluZXIiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzVHlwZURlZmluaXRpb25MaXN0VHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InR5cGVzIiB0eXBlPSJjbWlzOmNtaXNUeXBlRGVmaW5pdGlvblR5cGUiCi0JCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Imhhc01vcmVJdGVtcyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im51bUl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SW5Gb2xkZXIiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RJbkZvbGRlclR5cGUiCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGlsZHJlbiIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCi0JCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4JCi0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0TGlzdFR5cGUiPgotCQk8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJoYXNNb3JlSXRlbXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJudW1JdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+CQkKLQk8L3hzOmNvbXBsZXhUeXBlPgotCQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzT2JqZWN0SW5Gb2xkZXJUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0IiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIiAKLQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icGF0aFNlZ21lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+CQkKLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RQYXJlbnRzVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIgCi0JCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLQkJCTx4czplbGVtZW50IG5hbWU9InJlbGF0aXZlUGF0aFNlZ21lbnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+IAotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyVHlwZSIKLQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iaGFzTW9yZUl0ZW1zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibnVtSXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNSZXBvc2l0b3J5RW50cnlUeXBlIj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0JCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNtaXNDb250ZW50U3RyZWFtVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9Imxlbmd0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWltZVR5cGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsZW5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWFtIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiCi0JCQkJeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIgLz4KLQkJCTx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgotCQkJCW1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQk8L3hzOnNlcXVlbmNlPgotCQk8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJjbWlzOmNtaXNVbmRlZmluZWRBdHRyaWJ1dGUiIC8+Ci0JPC94czpjb21wbGV4VHlwZT4KLQotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJjbWlzQUNMVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9IkFDTCIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXhhY3QiIHR5cGU9InhzOmJvb2xlYW4iIAotCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKLQkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJPC94czpzZXF1ZW5jZT4KLQkJPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0iY21pczpjbWlzVW5kZWZpbmVkQXR0cmlidXRlIiAvPgotCTwveHM6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtSZXBvc2l0b3J5IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIGdldFJlcG9zaXRvcmllcyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yaWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yaWVzIiB0eXBlPSJjbWlzbTpjbWlzUmVwb3NpdG9yeUVudHJ5VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCi0JPCEtLSBnZXRSZXBvc2l0b3J5SW5mbyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVwb3NpdG9yeUluZm8iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mb1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJbmZvIiB0eXBlPSJjbWlzOmNtaXNSZXBvc2l0b3J5SW5mb1R5cGUiIAotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldFR5cGVDaGlsZHJlbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZUNoaWxkcmVuIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlQ2hpbGRyZW5SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlcyIgdHlwZT0iY21pc206Y21pc1R5cGVEZWZpbml0aW9uTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldFR5cGVEZXNjZW5kYW50cyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VHlwZURlc2NlbmRhbnRzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImRlcHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlcyIgdHlwZT0iY21pc206Y21pc1R5cGVDb250YWluZXIiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0VHlwZURlZmluaXRpb24gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVEZWZpbml0aW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ0eXBlSWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFR5cGVEZWZpbml0aW9uUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gY3JlYXRlVHlwZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlVHlwZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlVHlwZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gdXBkYXRlVHlwZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlVHlwZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0iY21pczpjbWlzVHlwZURlZmluaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0idXBkYXRlVHlwZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9ImNtaXM6Y21pc1R5cGVEZWZpbml0aW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZGVsZXRlVHlwZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlVHlwZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlVHlwZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbTmF2aWdhdGlvbiBTZXJ2aWNlc10gLS0+Ci0JCi0JPCEtLSBnZXREZXNjZW5kYW50cyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0RGVzY2VuZGFudHMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImRlcHRoIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0RGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldERlc2NlbmRhbnRzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRGb2xkZXJUcmVlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJkZXB0aCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUGF0aFNlZ21lbnQiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRGb2xkZXJUcmVlUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRDaGlsZHJlbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0Q2hpbGRyZW4iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3JkZXJCeSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRGb2xkZXJQYXJlbnQgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclBhcmVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldEZvbGRlclBhcmVudFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0T2JqZWN0UGFyZW50cyBPcGVyYXRpb24tLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RQYXJlbnRzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50IiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFBhcmVudHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJlbnRzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0UGFyZW50c1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0UmVuZGl0aW9ucyBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UmVuZGl0aW9ucyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXhJdGVtcyIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNraXBDb3VudCIgdHlwZT0ieHM6aW50ZWdlciIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldFJlbmRpdGlvbnNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25zIiB0eXBlPSJjbWlzOmNtaXNSZW5kaXRpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENoZWNrZWRvdXREb2NzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGVja2VkT3V0RG9jcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlckJ5IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDaGVja2VkT3V0RG9jc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdHMiIHR5cGU9ImNtaXNtOmNtaXNPYmplY3RMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbT2JqZWN0IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIGNyZWF0ZURvY3VtZW50IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVEb2N1bWVudCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtIiB0eXBlPSJjbWlzbTpjbWlzQ29udGVudFN0cmVhbVR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uaW5nU3RhdGUiIHR5cGU9ImNtaXM6ZW51bVZlcnNpb25pbmdTdGF0ZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZURvY3VtZW50UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzb3VyY2VJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+CQkJCQkKLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idmVyc2lvbmluZ1N0YXRlIiB0eXBlPSJjbWlzOmVudW1WZXJzaW9uaW5nU3RhdGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVGb2xkZXIgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZUZvbGRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZUZvbGRlclJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVSZWxhdGlvbnNoaXAgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icG9saWNpZXMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iYWRkQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBjcmVhdGVQb2xpY3kgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNyZWF0ZVBvbGljeSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImZvbGRlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY2llcyIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVBQ0VzIiB0eXBlPSJjbWlzOmNtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVQb2xpY3lSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSBjcmVhdGVJdGVtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjcmVhdGVJdGVtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY3JlYXRlSXRlbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JCi0JPCEtLSBnZXRBbGxvd2FibGVBY3Rpb25zIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFsbG93YWJsZUFjdGlvbnMiIHR5cGU9ImNtaXM6Y21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRQcm9wZXJ0aWVzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiAKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZVJlbGF0aW9uc2hpcHMiIHR5cGU9ImNtaXM6ZW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVuZGl0aW9uRmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUG9saWN5SWRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdEJ5UGF0aCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0QnlQYXRoIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXRoIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIAotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQb2xpY3lJZHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RCeVBhdGhSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3QiIHR5cGU9ImNtaXM6Y21pc09iamVjdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENvbnRlbnRTdHJlYW0gT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRTdHJlYW0iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InN0cmVhbUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvZmZzZXQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50U3RyZWFtIiB0eXBlPSJjbWlzbTpjbWlzQ29udGVudFN0cmVhbVR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIHVwZGF0ZVByb3BlcnRpZXMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZVByb3BlcnRpZXMiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTwhLS0KLQkJCQkJaWYgb2JqZWN0SWQgaXMgcHJlc2VudCBpbiB0aGUgcHJvcGVydGllcyB0aGUgdmFsdWUgbXVzdCBtYXRjaCB0aGlzCi0JCQkJCW9iamVjdElkCi0JCQkJLS0+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9ImNtaXM6Y21pc1Byb3BlcnRpZXNUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQkJCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InVwZGF0ZVByb3BlcnRpZXNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQkKLQk8IS0tIGJ1bGtVcGRhdGVQcm9wZXJ0aWVzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJidWxrVXBkYXRlUHJvcGVydGllcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImJ1bGtVcGRhdGVEYXRhIiB0eXBlPSJjbWlzOmNtaXNCdWxrVXBkYXRlVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJidWxrVXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkQW5kQ2hhbmdlVG9rZW4iIHR5cGU9ImNtaXM6Y21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gbW92ZU9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ibW92ZU9iamVjdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idGFyZ2V0Rm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic291cmNlRm9sZGVySWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Im1vdmVPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGRlbGV0ZU9iamVjdCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlT2JqZWN0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVPYmplY3RSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBkZWxldGVUcmVlIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVUcmVlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InVuZmlsZU9iamVjdHMiIHR5cGU9ImNtaXM6ZW51bVVuZmlsZU9iamVjdCIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRpbnVlT25GYWlsdXJlIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImRlbGV0ZVRyZWVSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmYWlsZWRUb0RlbGV0ZSI+Ci0JCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZHMiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCQkJCQk8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLQkJCQkJCQkJcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBzZXRDb250ZW50U3RyZWFtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXRDb250ZW50U3RyZWFtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvdmVyd3JpdGVGbGFnIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InNldENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCi0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gYXBwZW5kQ29udGVudFN0cmVhbSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwZW5kQ29udGVudFN0cmVhbSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaXNMYXN0Q2h1bmsiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY29udGVudFN0cmVhbSIgdHlwZT0iY21pc206Y21pc0NvbnRlbnRTdHJlYW1UeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwZW5kQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBkZWxldGVDb250ZW50U3RyZWFtIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJkZWxldGVDb250ZW50U3RyZWFtIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZVRva2VuIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tW011bHRpLWZpbGluZyBTZXJ2aWNlc10tLT4KLQotCTwhLS0gYWRkT2JqZWN0VG9Gb2xkZXIgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhbGxWZXJzaW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSByZW1vdmVPYmplY3RGcm9tRm9sZGVyIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmb2xkZXJJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCQotCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBbRGlzY292ZXJ5IFNlcnZpY2VzXSAtLT4KLQkKLQk8IS0tIHF1ZXJ5IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJxdWVyeSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3RhdGVtZW50IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNlYXJjaEFsbFZlcnNpb25zIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVSZWxhdGlvbnNoaXBzIiB0eXBlPSJjbWlzOmVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbmRpdGlvbkZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWF4SXRlbXMiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InhzOmludGVnZXIiIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGVHcm91cCByZWY9ImNtaXM6Y21pc1VuZGVmaW5lZEF0dHJpYnV0ZSIgLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icXVlcnlSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0TGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldENvbnRlbnRDaGFuZ2VzIG9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRDb250ZW50Q2hhbmdlcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlTG9nVG9rZW4iIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQcm9wZXJ0aWVzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUG9saWN5SWRzIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFDTCIgdHlwZT0ieHM6Ym9vbGVhbiIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldENvbnRlbnRDaGFuZ2VzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pc206Y21pc09iamVjdExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaGFuZ2VMb2dUb2tlbiIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KLQk8IS0tIFtWZXJzaW9uaW5nIFNlcnZpY2VzXSAtLT4KLQotCTwhLS0gY2hlY2tPdXQgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImNoZWNrT3V0Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tPdXRSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjb250ZW50Q29waWVkIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGNhbmNlbENoZWNrT3V0IE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjYW5jZWxDaGVja091dCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImNhbmNlbENoZWNrT3V0UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gY2hlY2tJbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tJbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWFqb3IiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJjbWlzOmNtaXNQcm9wZXJ0aWVzVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNvbnRlbnRTdHJlYW0iIHR5cGU9ImNtaXNtOmNtaXNDb250ZW50U3RyZWFtVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImNoZWNraW5Db21tZW50IiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljaWVzIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbW92ZUFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJjaGVja0luUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1ham9yIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iY21pczpjbWlzUHJvcGVydGllc1R5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYWpvciIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIAotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlUmVsYXRpb25zaGlwcyIgdHlwZT0iY21pczplbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZW5kaXRpb25GaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImluY2x1ZGVQb2xpY3lJZHMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlQUNMIiB0eXBlPSJ4czpib29sZWFuIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdE9mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdCIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCTwhLS0gZ2V0QWxsVmVyc2lvbnMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFsbFZlcnNpb25zIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImZpbHRlciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QWxsVmVyc2lvbnNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzOmNtaXNPYmplY3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS1bUmVsYXRpb25zaGlwIFNlcnZpY2VzXS0tPgotCi0JPCEtLSBnZXRSZWxhdGlvbnNoaXBzIE9wZXJhdGlvbiAtLT4KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcERpcmVjdGlvbiIgdHlwZT0iY21pczplbnVtUmVsYXRpb25zaGlwRGlyZWN0aW9uIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idHlwZUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJmaWx0ZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIgotCQkJCQltYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2tpcENvdW50IiB0eXBlPSJ4czppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiCi0JCQkJCW1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+Ci0KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImNtaXNtOmNtaXNFeHRlbnNpb25UeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiPgotCQkJCQk8eHM6YW5ub3RhdGlvbj4KLQkJCQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJCQkJCVRoaXMgaXMgYW4gZXh0ZW5zaW9uIGVsZW1lbnQgdG8gaG9sZCBhbnkKLQkJCQkJCQlyZXBvc2l0b3J5IG9yCi0JCQkJCQkJdmVuZG9yLXNwZWNpZmljIGV4dGVuc2lvbnMKLQkJCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94czphbm5vdGF0aW9uPgotCQkJCTwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXNwb25zZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RzIiB0eXBlPSJjbWlzbTpjbWlzT2JqZWN0TGlzdFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS1bUG9saWN5IFNlcnZpY2VzXS0tPgotCi0JPCEtLSBhcHBseVBvbGljeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlQb2xpY3kiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBvbGljeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCi0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhcHBseVBvbGljeVJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLQk8IS0tIHJlbW92ZVBvbGljeSBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlUG9saWN5Ij4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9InJlcG9zaXRvcnlJZCIgdHlwZT0ieHM6c3RyaW5nIgotCQkJCQltaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwb2xpY3lJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RJZCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjEiCi0JCQkJCW1heE9jY3Vycz0iMSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlUG9saWN5UmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJjbWlzbTpjbWlzRXh0ZW5zaW9uVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5pbGxhYmxlPSJ0cnVlIj4KLQkJCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCQlUaGlzIGlzIGFuIGV4dGVuc2lvbiBlbGVtZW50IHRvIGhvbGQgYW55Ci0JCQkJCQkJcmVwb3NpdG9yeSBvcgotCQkJCQkJCXZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zCi0JCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRBcHBsaWVkUG9saWNpZXMgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFwcGxpZWRQb2xpY2llcyI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmlsdGVyIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIKLQkJCQkJbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0cyIgdHlwZT0iY21pczpjbWlzT2JqZWN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCi0JPCEtLSBnZXRBQ0wgT3BlcmF0aW9uIC0tPgotCTx4czplbGVtZW50IG5hbWU9ImdldEFDTCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXBvc2l0b3J5SWQiIHR5cGU9InhzOnN0cmluZyIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0SWQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIgotCQkJCQltYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib25seUJhc2ljUGVybWlzc2lvbnMiIHR5cGU9InhzOmJvb2xlYW4iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQkJPC94czpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQkJPC94czplbGVtZW50PgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iZ2V0QUNMUmVzcG9uc2UiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iQUNMIiB0eXBlPSJjbWlzbTpjbWlzQUNMVHlwZSIKLQkJCQkJbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgkKLQk8L3hzOmVsZW1lbnQ+Ci0JCi0JPCEtLSBhcHBseUFDTCBPcGVyYXRpb24gLS0+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iYXBwbHlBQ0wiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVwb3NpdG9yeUlkIiB0eXBlPSJ4czpzdHJpbmciCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9iamVjdElkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIKLQkJCQkJbWF4T2NjdXJzPSIxIiAvPgotCQkJCTx4czplbGVtZW50IG5hbWU9ImFkZEFDRXMiIHR5cGU9ImNtaXM6Y21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSIKLQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icmVtb3ZlQUNFcyIgdHlwZT0iY21pczpjbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIgotCQkJCQltaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBQ0xQcm9wYWdhdGlvbiIgdHlwZT0iY21pczplbnVtQUNMUHJvcGFnYXRpb24iCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLQotCQkJCTx4czplbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0iY21pc206Y21pc0V4dGVuc2lvblR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuaWxsYWJsZT0idHJ1ZSI+Ci0JCQkJCTx4czphbm5vdGF0aW9uPgotCQkJCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQkJCQkJVGhpcyBpcyBhbiBleHRlbnNpb24gZWxlbWVudCB0byBob2xkIGFueQotCQkJCQkJCXJlcG9zaXRvcnkgb3IKLQkJCQkJCQl2ZW5kb3Itc3BlY2lmaWMgZXh0ZW5zaW9ucwotCQkJCQk8L3hzOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHM6YW5ub3RhdGlvbj4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhcHBseUFDTFJlc3BvbnNlIj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9IkFDTCIgdHlwZT0iY21pc206Y21pc0FDTFR5cGUiCi0JCQkJCW1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczExL0NNSVNXUy1TZXJ2aWNlLndzZGwudGVtcGxhdGUgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NtaXMxMS9DTUlTV1MtU2VydmljZS53c2RsLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDA0OWEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczExL0NNSVNXUy1TZXJ2aWNlLndzZGwudGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLQk8IS0tCi0JCUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UKLQkJbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkKLQkJb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0JCWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLQkJYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQotCQlMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgotCQlDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yCi0JCXRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZQotCQlMaWNlbnNlLgotCS0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6Y21pcz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iCi0JeG1sbnM6Y21pc209Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC8iCi0JeG1sbnM6Y21pc3c9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6bnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyIKLQl4bWxuczpqYXh3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4d3MiIG5hbWU9IkNNSVNXZWJTZXJ2aWNlcyI+Ci0JPHR5cGVzPgotCQk8eHNkOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvIj4KLQkJCTx4c2Q6aW1wb3J0IHNjaGVtYUxvY2F0aW9uPSI8JWNtaXNjb3JlJT4iCi0JCQkJbmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIgLz4KLQkJCTx4c2Q6aW1wb3J0IHNjaGVtYUxvY2F0aW9uPSI8JWNtaXNtc2clPiIKLQkJCQluYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC8iIC8+Ci0JCTwveHNkOnNjaGVtYT4KLQk8L3R5cGVzPgotCi0JPG1lc3NhZ2UgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCTxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJjbWlzbTpjbWlzRmF1bHQiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0QUNMUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFDTCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QUNMUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBQ0xSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJhcHBseUFDTFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphcHBseUFDTCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYXBwbHlBQ0xSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGx5QUNMUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0icXVlcnlSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206cXVlcnkiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InF1ZXJ5UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpxdWVyeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDb250ZW50Q2hhbmdlc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDb250ZW50Q2hhbmdlcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q29udGVudENoYW5nZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENvbnRlbnRDaGFuZ2VzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iYWRkT2JqZWN0VG9Gb2xkZXJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YWRkT2JqZWN0VG9Gb2xkZXIiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFkZE9iamVjdFRvRm9sZGVyUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphZGRPYmplY3RUb0ZvbGRlclJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJyZW1vdmVPYmplY3RGcm9tRm9sZGVyUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZU9iamVjdEZyb21Gb2xkZXIiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXREZXNjZW5kYW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXREZXNjZW5kYW50cyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0RGVzY2VuZGFudHNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldERlc2NlbmRhbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldENoaWxkcmVuUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENoaWxkcmVuIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDaGlsZHJlblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q2hpbGRyZW5SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEZvbGRlclBhcmVudCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyUGFyZW50UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRGb2xkZXJQYXJlbnRSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UGFyZW50c1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RQYXJlbnRzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RQYXJlbnRzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RQYXJlbnRzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFJlbmRpdGlvbnNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVuZGl0aW9ucyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UmVuZGl0aW9uc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVuZGl0aW9uc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRDaGVja2VkT3V0RG9jc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRDaGVja2VkT3V0RG9jcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q2hlY2tlZE91dERvY3NSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldENoZWNrZWRPdXREb2NzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iY3JlYXRlRG9jdW1lbnRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRG9jdW1lbnQiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZURvY3VtZW50UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVEb2N1bWVudFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2VSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVGb2xkZXJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlRm9sZGVyIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVGb2xkZXJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZUZvbGRlclJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUmVsYXRpb25zaGlwIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVSZWxhdGlvbnNoaXBSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVJlbGF0aW9uc2hpcFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVQb2xpY3lSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y3JlYXRlUG9saWN5IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVQb2xpY3lSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVBvbGljeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQkJPG1lc3NhZ2UgbmFtZT0iY3JlYXRlSXRlbVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVJdGVtIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVJdGVtUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjcmVhdGVJdGVtUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldEFsbG93YWJsZUFjdGlvbnNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QWxsb3dhYmxlQWN0aW9ucyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QWxsb3dhYmxlQWN0aW9uc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRQcm9wZXJ0aWVzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFByb3BlcnRpZXMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFByb3BlcnRpZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFByb3BlcnRpZXNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RCeVBhdGhSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0QnlQYXRoIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRPYmplY3RCeVBhdGhSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdEJ5UGF0aFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImdldENvbnRlbnRTdHJlYW1SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q29udGVudFN0cmVhbSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0Q29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0Q29udGVudFN0cmVhbVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJ1cGRhdGVQcm9wZXJ0aWVzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnVwZGF0ZVByb3BlcnRpZXMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InVwZGF0ZVByb3BlcnRpZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnVwZGF0ZVByb3BlcnRpZXNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYnVsa1VwZGF0ZVByb3BlcnRpZXNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YnVsa1VwZGF0ZVByb3BlcnRpZXMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImJ1bGtVcGRhdGVQcm9wZXJ0aWVzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpidWxrVXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJtb3ZlT2JqZWN0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOm1vdmVPYmplY3QiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9Im1vdmVPYmplY3RSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOm1vdmVPYmplY3RSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlT2JqZWN0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmRlbGV0ZU9iamVjdCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlT2JqZWN0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpkZWxldGVPYmplY3RSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlVHJlZVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpkZWxldGVUcmVlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVUcmVlUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpkZWxldGVUcmVlUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9InNldENvbnRlbnRTdHJlYW1SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206c2V0Q29udGVudFN0cmVhbSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ic2V0Q29udGVudFN0cmVhbVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206c2V0Q29udGVudFN0cmVhbVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJhcHBlbmRDb250ZW50U3RyZWFtUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGVuZENvbnRlbnRTdHJlYW0iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFwcGVuZENvbnRlbnRTdHJlYW1SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmFwcGVuZENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlQ29udGVudFN0cmVhbVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpkZWxldGVDb250ZW50U3RyZWFtIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJkZWxldGVDb250ZW50U3RyZWFtUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpkZWxldGVDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iYXBwbHlQb2xpY3lSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206YXBwbHlQb2xpY3kiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFwcGx5UG9saWN5UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTphcHBseVBvbGljeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJyZW1vdmVQb2xpY3lSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206cmVtb3ZlUG9saWN5IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJyZW1vdmVQb2xpY3lSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOnJlbW92ZVBvbGljeVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBcHBsaWVkUG9saWNpZXNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0QXBwbGllZFBvbGljaWVzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBcHBsaWVkUG9saWNpZXNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFwcGxpZWRQb2xpY2llc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHNSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0UmVsYXRpb25zaGlwcyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0UmVsYXRpb25zaGlwc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0T2JqZWN0UmVsYXRpb25zaGlwc1Jlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImdldFJlcG9zaXRvcmllc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRSZXBvc2l0b3JpZXMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFJlcG9zaXRvcmllc1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVwb3NpdG9yaWVzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFJlcG9zaXRvcnlJbmZvUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFJlcG9zaXRvcnlJbmZvIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mb1Jlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UmVwb3NpdG9yeUluZm9SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0VHlwZUNoaWxkcmVuUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFR5cGVDaGlsZHJlbiIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0VHlwZUNoaWxkcmVuUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlQ2hpbGRyZW5SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0VHlwZURlc2NlbmRhbnRzUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldFR5cGVEZXNjZW5kYW50cyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0VHlwZURlc2NlbmRhbnRzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlRGVzY2VuZGFudHNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0VHlwZURlZmluaXRpb25SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0VHlwZURlZmluaXRpb24iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFR5cGVEZWZpbml0aW9uUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRUeXBlRGVmaW5pdGlvblJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjcmVhdGVUeXBlUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVR5cGUiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNyZWF0ZVR5cGVSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNyZWF0ZVR5cGVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0idXBkYXRlVHlwZVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTp1cGRhdGVUeXBlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJ1cGRhdGVUeXBlUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTp1cGRhdGVUeXBlUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImRlbGV0ZVR5cGVSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlVHlwZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZGVsZXRlVHlwZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206ZGVsZXRlVHlwZVJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImNoZWNrT3V0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNoZWNrT3V0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjaGVja091dFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y2hlY2tPdXRSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iY2FuY2VsQ2hlY2tPdXRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Y2FuY2VsQ2hlY2tPdXQiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNhbmNlbENoZWNrT3V0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpjYW5jZWxDaGVja091dFJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJjaGVja0luUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNoZWNrSW4iIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImNoZWNrSW5SZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmNoZWNrSW5SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbiIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRPYmplY3RPZkxhdGVzdFZlcnNpb25SZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+CQotCTxtZXNzYWdlIG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb25SZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbiIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iY21pc206Z2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRBbGxWZXJzaW9uc1JlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRBbGxWZXJzaW9ucyIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZ2V0QWxsVmVyc2lvbnNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImNtaXNtOmdldEFsbFZlcnNpb25zUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0Rm9sZGVyVHJlZVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRGb2xkZXJUcmVlIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJnZXRGb2xkZXJUcmVlUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJjbWlzbTpnZXRGb2xkZXJUcmVlUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCi0JPHBvcnRUeXBlIG5hbWU9IkRpc2NvdmVyeVNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJxdWVyeSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6cXVlcnlSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpxdWVyeVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENvbnRlbnRDaGFuZ2VzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDb250ZW50Q2hhbmdlc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldENvbnRlbnRDaGFuZ2VzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJNdWx0aUZpbGluZ1NlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGRPYmplY3RUb0ZvbGRlciI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6YWRkT2JqZWN0VG9Gb2xkZXJSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzphZGRPYmplY3RUb0ZvbGRlclJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXIiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnJlbW92ZU9iamVjdEZyb21Gb2xkZXJSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpyZW1vdmVPYmplY3RGcm9tRm9sZGVyUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iTmF2aWdhdGlvblNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXREZXNjZW5kYW50cyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0RGVzY2VuZGFudHNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXREZXNjZW5kYW50c1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENoaWxkcmVuIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDaGlsZHJlblJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldENoaWxkcmVuUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Rm9sZGVyUGFyZW50Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRGb2xkZXJQYXJlbnRSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRGb2xkZXJQYXJlbnRSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRGb2xkZXJUcmVlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRGb2xkZXJUcmVlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0Rm9sZGVyVHJlZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdFBhcmVudHMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdFBhcmVudHNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRPYmplY3RQYXJlbnRzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q2hlY2tlZE91dERvY3MiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldENoZWNrZWRPdXREb2NzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0Q2hlY2tlZE91dERvY3NSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxwb3J0VHlwZSBuYW1lPSJPYmplY3RTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlRG9jdW1lbnQiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZURvY3VtZW50UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlRG9jdW1lbnRSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZUZvbGRlciI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlRm9sZGVyUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlRm9sZGVyUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlUmVsYXRpb25zaGlwIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVSZWxhdGlvbnNoaXBSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVQb2xpY3kiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZVBvbGljeVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZVBvbGljeVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZUl0ZW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNyZWF0ZUl0ZW1SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVJdGVtUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0QWxsb3dhYmxlQWN0aW9ucyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0QWxsb3dhYmxlQWN0aW9uc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFsbG93YWJsZUFjdGlvbnNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3QiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFByb3BlcnRpZXMiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldFByb3BlcnRpZXNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRQcm9wZXJ0aWVzUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVuZGl0aW9ucyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVuZGl0aW9uc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldFJlbmRpdGlvbnNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RCeVBhdGgiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdEJ5UGF0aFJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldE9iamVjdEJ5UGF0aFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENvbnRlbnRTdHJlYW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmdldENvbnRlbnRTdHJlYW1SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0idXBkYXRlUHJvcGVydGllcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6dXBkYXRlUHJvcGVydGllc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OnVwZGF0ZVByb3BlcnRpZXNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJidWxrVXBkYXRlUHJvcGVydGllcyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6YnVsa1VwZGF0ZVByb3BlcnRpZXNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpidWxrVXBkYXRlUHJvcGVydGllc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9Im1vdmVPYmplY3QiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3Om1vdmVPYmplY3RSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzptb3ZlT2JqZWN0UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlT2JqZWN0Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVPYmplY3RSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVPYmplY3RSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVUcmVlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVUcmVlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6ZGVsZXRlVHJlZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InNldENvbnRlbnRTdHJlYW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OnNldENvbnRlbnRTdHJlYW1SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpzZXRDb250ZW50U3RyZWFtUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwZW5kQ29udGVudFN0cmVhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6YXBwZW5kQ29udGVudFN0cmVhbVJlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmFwcGVuZENvbnRlbnRTdHJlYW1SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVDb250ZW50U3RyZWFtIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVDb250ZW50U3RyZWFtUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6ZGVsZXRlQ29udGVudFN0cmVhbVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9IlBvbGljeVNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhcHBseVBvbGljeSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6YXBwbHlQb2xpY3lSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzphcHBseVBvbGljeVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InJlbW92ZVBvbGljeSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6cmVtb3ZlUG9saWN5UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6cmVtb3ZlUG9saWN5UmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0QXBwbGllZFBvbGljaWVzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBcHBsaWVkUG9saWNpZXNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBcHBsaWVkUG9saWNpZXNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCi0JPHBvcnRUeXBlIG5hbWU9IlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0Ij4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3RSZWxhdGlvbnNoaXBzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRPYmplY3RSZWxhdGlvbnNoaXBzUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0T2JqZWN0UmVsYXRpb25zaGlwc1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9IlJlcG9zaXRvcnlTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVwb3NpdG9yaWVzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRSZXBvc2l0b3JpZXNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRSZXBvc2l0b3JpZXNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mbyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0UmVwb3NpdG9yeUluZm9SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRSZXBvc2l0b3J5SW5mb1Jlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVDaGlsZHJlbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZUNoaWxkcmVuUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZUNoaWxkcmVuUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZURlc2NlbmRhbnRzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRUeXBlRGVzY2VuZGFudHNSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRUeXBlRGVzY2VuZGFudHNSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlRGVmaW5pdGlvbiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0VHlwZURlZmluaXRpb25SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRUeXBlRGVmaW5pdGlvblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCSAJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVUeXBlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpjcmVhdGVUeXBlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y3JlYXRlVHlwZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCSAJPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGVUeXBlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzp1cGRhdGVUeXBlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6dXBkYXRlVHlwZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCSAJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVUeXBlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpkZWxldGVUeXBlUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6ZGVsZXRlVHlwZVJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPHBvcnRUeXBlIG5hbWU9IlZlcnNpb25pbmdTZXJ2aWNlUG9ydCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY2hlY2tPdXQiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNoZWNrT3V0UmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Y2hlY2tPdXRSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjYW5jZWxDaGVja091dCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Y2FuY2VsQ2hlY2tPdXRSZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjYW5jZWxDaGVja091dFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNoZWNrSW4iPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmNoZWNrSW5SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpjaGVja0luUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRPYmplY3RPZkxhdGVzdFZlcnNpb25SZXF1ZXN0IiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJjbWlzdzpnZXRPYmplY3RPZkxhdGVzdFZlcnNpb25SZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvblJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG1lc3NhZ2U9ImNtaXN3OmNtaXNFeGNlcHRpb24iIG5hbWU9ImNtaXNFeGNlcHRpb24iIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFsbFZlcnNpb25zIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJjbWlzdzpnZXRBbGxWZXJzaW9uc1JlcXVlc3QiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9ImNtaXN3OmdldEFsbFZlcnNpb25zUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iQUNMU2VydmljZVBvcnQiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFDTCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0iY21pc3c6Z2V0QUNMUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6Z2V0QUNMUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbWVzc2FnZT0iY21pc3c6Y21pc0V4Y2VwdGlvbiIgbmFtZT0iY21pc0V4Y2VwdGlvbiIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYXBwbHlBQ0wiPgotCQkJPGlucHV0IG1lc3NhZ2U9ImNtaXN3OmFwcGx5QUNMUmVxdWVzdCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0iY21pc3c6YXBwbHlBQ0xSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBtZXNzYWdlPSJjbWlzdzpjbWlzRXhjZXB0aW9uIiBuYW1lPSJjbWlzRXhjZXB0aW9uIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCi0KLQk8YmluZGluZyBuYW1lPSJEaXNjb3ZlcnlTZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3OkRpc2NvdmVyeVNlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJxdWVyeSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0icXVlcnkiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENvbnRlbnRDaGFuZ2VzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRDb250ZW50Q2hhbmdlcyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9Ik11bHRpRmlsaW5nU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpNdWx0aUZpbGluZ1NlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGRPYmplY3RUb0ZvbGRlciI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iYWRkT2JqZWN0VG9Gb2xkZXIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InJlbW92ZU9iamVjdEZyb21Gb2xkZXIiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InJlbW92ZU9iamVjdEZyb21Gb2xkZXIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpOYXZpZ2F0aW9uU2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldERlc2NlbmRhbnRzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXREZXNjZW5kYW50cyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q2hpbGRyZW4iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldENoaWxkcmVuIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRGb2xkZXJQYXJlbnQiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldEZvbGRlclBhcmVudCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Rm9sZGVyVHJlZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0Rm9sZGVyVHJlZSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0UGFyZW50cyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0T2JqZWN0UGFyZW50cyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q2hlY2tlZE91dERvY3MiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldENoZWNrZWRPdXREb2NzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iT2JqZWN0U2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpPYmplY3RTZXJ2aWNlUG9ydCI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlRG9jdW1lbnQiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImNyZWF0ZURvY3VtZW50IiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlRm9sZGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJjcmVhdGVGb2xkZXIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNyZWF0ZVJlbGF0aW9uc2hpcCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iY3JlYXRlUmVsYXRpb25zaGlwIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVQb2xpY3kiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImNyZWF0ZVBvbGljeSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY3JlYXRlSXRlbSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBbGxvd2FibGVBY3Rpb25zIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRBbGxvd2FibGVBY3Rpb25zIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRPYmplY3QiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldE9iamVjdCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UHJvcGVydGllcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0UHJvcGVydGllcyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0UmVuZGl0aW9ucyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0UmVuZGl0aW9ucyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0QnlQYXRoIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRPYmplY3RCeVBhdGgiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldENvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldENvbnRlbnRTdHJlYW0iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZVByb3BlcnRpZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVwZGF0ZVByb3BlcnRpZXMiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImJ1bGtVcGRhdGVQcm9wZXJ0aWVzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJidWxrVXBkYXRlUHJvcGVydGllcyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0ibW92ZU9iamVjdCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ibW92ZU9iamVjdCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZGVsZXRlT2JqZWN0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJkZWxldGVPYmplY3QiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZVRyZWUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImRlbGV0ZVRyZWUiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InNldENvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InNldENvbnRlbnRTdHJlYW0iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFwcGVuZENvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImFwcGVuZENvbnRlbnRTdHJlYW0iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImRlbGV0ZUNvbnRlbnRTdHJlYW0iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImRlbGV0ZUNvbnRlbnRTdHJlYW0iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJQb2xpY3lTZXJ2aWNlUG9ydEJpbmRpbmciIHR5cGU9ImNtaXN3OlBvbGljeVNlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhcHBseVBvbGljeSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iYXBwbHlQb2xpY3kiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9InJlbW92ZVBvbGljeSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0icmVtb3ZlUG9saWN5IiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRBcHBsaWVkUG9saWNpZXMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldEFwcGxpZWRQb2xpY2llcyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9IlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6UmVsYXRpb25zaGlwU2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldE9iamVjdFJlbGF0aW9uc2hpcHMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldE9iamVjdFJlbGF0aW9uc2hpcHMiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJSZXBvc2l0b3J5U2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJjbWlzdzpSZXBvc2l0b3J5U2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFJlcG9zaXRvcmllcyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0UmVwb3NpdG9yaWVzIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRSZXBvc2l0b3J5SW5mbyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0UmVwb3NpdG9yeUluZm8iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVDaGlsZHJlbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0VHlwZUNoaWxkcmVuIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlRGVzY2VuZGFudHMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldFR5cGVEZXNjZW5kYW50cyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0VHlwZURlZmluaXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldFR5cGVEZWZpbml0aW9uIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGVUeXBlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJjcmVhdGVUeXBlIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGVUeXBlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cGRhdGVUeXBlIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJkZWxldGVUeXBlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJkZWxldGVUeXBlIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPGJpbmRpbmcgbmFtZT0iVmVyc2lvbmluZ1NlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6VmVyc2lvbmluZ1NlcnZpY2VQb3J0Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJjaGVja091dCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iY2hlY2tPdXQiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImNhbmNlbENoZWNrT3V0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJjYW5jZWxDaGVja091dCIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iY2hlY2tJbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iY2hlY2tJbiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFsbFZlcnNpb25zIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJnZXRBbGxWZXJzaW9ucyIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iY21pc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9IkFDTFNlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0iY21pc3c6QUNMU2VydmljZVBvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEFDTCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ2V0QUNMIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIj4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJjbWlzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhcHBseUFDTCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iYXBwbHlBQ0wiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImNtaXNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQotCi0JPHNlcnZpY2UgbmFtZT0iRGlzY292ZXJ5U2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IkRpc2NvdmVyeVNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpEaXNjb3ZlcnlTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSI8JWNtaXNiYXNlJT4vRGlzY292ZXJ5U2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJNdWx0aUZpbGluZ1NlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJNdWx0aUZpbGluZ1NlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpNdWx0aUZpbGluZ1NlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249IjwlY21pc2Jhc2UlPi9NdWx0aUZpbGluZ1NlcnZpY2UiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iTmF2aWdhdGlvblNlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3Ok5hdmlnYXRpb25TZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSI8JWNtaXNiYXNlJT4vTmF2aWdhdGlvblNlcnZpY2UiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iT2JqZWN0U2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9Ik9iamVjdFNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpPYmplY3RTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iPCVjbWlzYmFzZSU+L09iamVjdFNlcnZpY2UiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iUG9saWN5U2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IlBvbGljeVNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpQb2xpY3lTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iPCVjbWlzYmFzZSU+L1BvbGljeVNlcnZpY2UiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci0JPHNlcnZpY2UgbmFtZT0iUmVsYXRpb25zaGlwU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IiBiaW5kaW5nPSJjbWlzdzpSZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSI8JWNtaXNiYXNlJT4vUmVsYXRpb25zaGlwU2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJSZXBvc2l0b3J5U2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IlJlcG9zaXRvcnlTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6UmVwb3NpdG9yeVNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249IjwlY21pc2Jhc2UlPi9SZXBvc2l0b3J5U2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJWZXJzaW9uaW5nU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IlZlcnNpb25pbmdTZXJ2aWNlUG9ydCIgYmluZGluZz0iY21pc3c6VmVyc2lvbmluZ1NlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249IjwlY21pc2Jhc2UlPi9WZXJzaW9uaW5nU2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQk8c2VydmljZSBuYW1lPSJBQ0xTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iQUNMU2VydmljZVBvcnQiIGJpbmRpbmc9ImNtaXN3OkFDTFNlcnZpY2VQb3J0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSI8JWNtaXNiYXNlJT4vQUNMU2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N1bi1qYXh3cy54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N1bi1qYXh3cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzgzMDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdW4tamF4d3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAKLS0tPgotPGVuZHBvaW50cyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4LXdzL3JpL3J1bnRpbWUiIHZlcnNpb249IjIuMCI+Ci0KLSAgICA8IS0tIENNSVMgMS4wIGVuZHBvaW50cyAtLT4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJSZXBvc2l0b3J5U2VydmljZSIKLSAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLlJlcG9zaXRvcnlTZXJ2aWNlMTAiCi0gICAgICAgIHNlcnZpY2U9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99UmVwb3NpdG9yeVNlcnZpY2UiCi0gICAgICAgIHBvcnQ9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99UmVwb3NpdG9yeVNlcnZpY2VQb3J0IgotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJOYXZpZ2F0aW9uU2VydmljZSIKLSAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLk5hdmlnYXRpb25TZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU5hdmlnYXRpb25TZXJ2aWNlIgotICAgICAgICBwb3J0PSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU5hdmlnYXRpb25TZXJ2aWNlUG9ydCIKLSAgICAgICAgdXJsLXBhdHRlcm49Ii9zZXJ2aWNlcy9OYXZpZ2F0aW9uU2VydmljZSIgZW5hYmxlLW10b209InRydWUiPgotICAgICAgICA8aGFuZGxlci1jaGFpbnMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+Ci0gICAgICAgICAgICA8aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICA8aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuQXV0aEhhbmRsZXI8L2hhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyLWNoYWluPgotICAgICAgICA8L2hhbmRsZXItY2hhaW5zPgotICAgIDwvZW5kcG9pbnQ+Ci0KLSAgICA8ZW5kcG9pbnQgbmFtZT0iT2JqZWN0U2VydmljZSIKLSAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLk9iamVjdFNlcnZpY2UxMCIKLSAgICAgICAgc2VydmljZT0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31PYmplY3RTZXJ2aWNlIgotICAgICAgICBwb3J0PSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU9iamVjdFNlcnZpY2VQb3J0IgotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzL09iamVjdFNlcnZpY2UiIGVuYWJsZS1tdG9tPSJ0cnVlIj4KLSAgICAgICAgPGhhbmRsZXItY2hhaW5zIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPgotICAgICAgICAgICAgPGhhbmRsZXItY2hhaW4+Ci0gICAgICAgICAgICAgICAgPGhhbmRsZXI+Ci0gICAgICAgICAgICAgICAgICAgIDxoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkF1dGhIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPgotICAgICAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlci1jaGFpbj4KLSAgICAgICAgPC9oYW5kbGVyLWNoYWlucz4KLSAgICA8L2VuZHBvaW50PgotCi0gICAgPGVuZHBvaW50IG5hbWU9IlZlcnNpb25pbmdTZXJ2aWNlIgotICAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuVmVyc2lvbmluZ1NlcnZpY2UiCi0gICAgICAgIHNlcnZpY2U9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99VmVyc2lvbmluZ1NlcnZpY2UiCi0gICAgICAgIHBvcnQ9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99VmVyc2lvbmluZ1NlcnZpY2VQb3J0IgotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzL1ZlcnNpb25pbmdTZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJSZWxhdGlvbnNoaXBTZXJ2aWNlIgotICAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuUmVsYXRpb25zaGlwU2VydmljZSIKLSAgICAgICAgc2VydmljZT0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31SZWxhdGlvbnNoaXBTZXJ2aWNlIgotICAgICAgICBwb3J0PSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfVJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IiAgICAgICAgCi0gICAgICAgIHVybC1wYXR0ZXJuPSIvc2VydmljZXMvUmVsYXRpb25zaGlwU2VydmljZSIgZW5hYmxlLW10b209InRydWUiPgotICAgICAgICA8aGFuZGxlci1jaGFpbnMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+Ci0gICAgICAgICAgICA8aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICA8aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuQXV0aEhhbmRsZXI8L2hhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyLWNoYWluPgotICAgICAgICA8L2hhbmRsZXItY2hhaW5zPgotICAgIDwvZW5kcG9pbnQ+Ci0gICAgCi0gICAgPGVuZHBvaW50IG5hbWU9IkRpc2NvdmVyeVNlcnZpY2UiCi0gICAgICAgIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5EaXNjb3ZlcnlTZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfURpc2NvdmVyeVNlcnZpY2UiCi0gICAgICAgIHBvcnQ9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99RGlzY292ZXJ5U2VydmljZVBvcnQiCi0gICAgICAgIHVybC1wYXR0ZXJuPSIvc2VydmljZXMvRGlzY292ZXJ5U2VydmljZSIgZW5hYmxlLW10b209InRydWUiPgotICAgICAgICA8aGFuZGxlci1jaGFpbnMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+Ci0gICAgICAgICAgICA8aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICA8aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuQXV0aEhhbmRsZXI8L2hhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyLWNoYWluPgotICAgICAgICA8L2hhbmRsZXItY2hhaW5zPgotICAgIDwvZW5kcG9pbnQ+Ci0KLSAgICA8ZW5kcG9pbnQgbmFtZT0iTXVsdGlGaWxpbmdTZXJ2aWNlIgotICAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuTXVsdGlGaWxpbmdTZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU11bHRpRmlsaW5nU2VydmljZSIKLSAgICAgICAgcG9ydD0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31NdWx0aUZpbGluZ1NlcnZpY2VQb3J0IgotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzL011bHRpRmlsaW5nU2VydmljZSIgZW5hYmxlLW10b209InRydWUiPgotICAgICAgICA8aGFuZGxlci1jaGFpbnMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+Ci0gICAgICAgICAgICA8aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICA8aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuQXV0aEhhbmRsZXI8L2hhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyLWNoYWluPgotICAgICAgICA8L2hhbmRsZXItY2hhaW5zPgotICAgIDwvZW5kcG9pbnQ+Ci0KLSAgICA8ZW5kcG9pbnQgbmFtZT0iQUNMU2VydmljZSIKLSAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkFjbFNlcnZpY2UiCi0gICAgICAgIHNlcnZpY2U9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99QUNMU2VydmljZSIKLSAgICAgICAgcG9ydD0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31BQ0xTZXJ2aWNlUG9ydCIKLSAgICAgICAgdXJsLXBhdHRlcm49Ii9zZXJ2aWNlcy9BQ0xTZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJQb2xpY3lTZXJ2aWNlIgotICAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuUG9saWN5U2VydmljZSIKLSAgICAgICAgc2VydmljZT0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31Qb2xpY3lTZXJ2aWNlIgotICAgICAgICBwb3J0PSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfVBvbGljeVNlcnZpY2VQb3J0IgotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzL1BvbGljeVNlcnZpY2UiIGVuYWJsZS1tdG9tPSJ0cnVlIj4KLSAgICAgICAgPGhhbmRsZXItY2hhaW5zIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPgotICAgICAgICAgICAgPGhhbmRsZXItY2hhaW4+Ci0gICAgICAgICAgICAgICAgPGhhbmRsZXI+Ci0gICAgICAgICAgICAgICAgICAgIDxoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkF1dGhIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPgotICAgICAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlci1jaGFpbj4KLSAgICAgICAgPC9oYW5kbGVyLWNoYWlucz4KLSAgICA8L2VuZHBvaW50PgotICAgIAotICAgIDwhLS0gQ01JUyAxLjEgZW5kcG9pbnRzIC0tPgotCi0gICAgPGVuZHBvaW50IG5hbWU9IlJlcG9zaXRvcnlTZXJ2aWNlMTEiCi0gICAgICAgIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5SZXBvc2l0b3J5U2VydmljZSIKLSAgICAgICAgc2VydmljZT0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31SZXBvc2l0b3J5U2VydmljZSIKLSAgICAgICAgcG9ydD0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31SZXBvc2l0b3J5U2VydmljZVBvcnQiCi0gICAgICAgIHVybC1wYXR0ZXJuPSIvc2VydmljZXMxMS9SZXBvc2l0b3J5U2VydmljZSIgZW5hYmxlLW10b209InRydWUiPgotICAgICAgICA8aGFuZGxlci1jaGFpbnMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+Ci0gICAgICAgICAgICA8aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICA8aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuQXV0aEhhbmRsZXI8L2hhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyLWNoYWluPgotICAgICAgICA8L2hhbmRsZXItY2hhaW5zPgotICAgIDwvZW5kcG9pbnQ+Ci0KLSAgICA8ZW5kcG9pbnQgbmFtZT0iTmF2aWdhdGlvblNlcnZpY2UxMSIKLSAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLk5hdmlnYXRpb25TZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU5hdmlnYXRpb25TZXJ2aWNlIgotICAgICAgICBwb3J0PSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU5hdmlnYXRpb25TZXJ2aWNlUG9ydCIKLSAgICAgICAgdXJsLXBhdHRlcm49Ii9zZXJ2aWNlczExL05hdmlnYXRpb25TZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJPYmplY3RTZXJ2aWNlMTEiCi0gICAgICAgIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5PYmplY3RTZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU9iamVjdFNlcnZpY2UiCi0gICAgICAgIHBvcnQ9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99T2JqZWN0U2VydmljZVBvcnQiCi0gICAgICAgIHVybC1wYXR0ZXJuPSIvc2VydmljZXMxMS9PYmplY3RTZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJWZXJzaW9uaW5nU2VydmljZTExIgotICAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuVmVyc2lvbmluZ1NlcnZpY2UiCi0gICAgICAgIHNlcnZpY2U9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99VmVyc2lvbmluZ1NlcnZpY2UiCi0gICAgICAgIHBvcnQ9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99VmVyc2lvbmluZ1NlcnZpY2VQb3J0IgotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzMTEvVmVyc2lvbmluZ1NlcnZpY2UiIGVuYWJsZS1tdG9tPSJ0cnVlIj4KLSAgICAgICAgPGhhbmRsZXItY2hhaW5zIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPgotICAgICAgICAgICAgPGhhbmRsZXItY2hhaW4+Ci0gICAgICAgICAgICAgICAgPGhhbmRsZXI+Ci0gICAgICAgICAgICAgICAgICAgIDxoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkF1dGhIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPgotICAgICAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlci1jaGFpbj4KLSAgICAgICAgPC9oYW5kbGVyLWNoYWlucz4KLSAgICA8L2VuZHBvaW50PgotCi0gICAgPGVuZHBvaW50IG5hbWU9IlJlbGF0aW9uc2hpcFNlcnZpY2UxMSIKLSAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLlJlbGF0aW9uc2hpcFNlcnZpY2UiCi0gICAgICAgIHNlcnZpY2U9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99UmVsYXRpb25zaGlwU2VydmljZSIKLSAgICAgICAgcG9ydD0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31SZWxhdGlvbnNoaXBTZXJ2aWNlUG9ydCIgICAgICAgIAotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzMTEvUmVsYXRpb25zaGlwU2VydmljZSIgZW5hYmxlLW10b209InRydWUiPgotICAgICAgICA8aGFuZGxlci1jaGFpbnMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+Ci0gICAgICAgICAgICA8aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICA8aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgPGhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuQXV0aEhhbmRsZXI8L2hhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyLWNoYWluPgotICAgICAgICA8L2hhbmRsZXItY2hhaW5zPgotICAgIDwvZW5kcG9pbnQ+Ci0gICAgCi0gICAgPGVuZHBvaW50IG5hbWU9IkRpc2NvdmVyeVNlcnZpY2UxMSIKLSAgICAgICAgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2UiCi0gICAgICAgIHNlcnZpY2U9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99RGlzY292ZXJ5U2VydmljZSIKLSAgICAgICAgcG9ydD0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31EaXNjb3ZlcnlTZXJ2aWNlUG9ydCIKLSAgICAgICAgdXJsLXBhdHRlcm49Ii9zZXJ2aWNlczExL0Rpc2NvdmVyeVNlcnZpY2UiIGVuYWJsZS1tdG9tPSJ0cnVlIj4KLSAgICAgICAgPGhhbmRsZXItY2hhaW5zIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPgotICAgICAgICAgICAgPGhhbmRsZXItY2hhaW4+Ci0gICAgICAgICAgICAgICAgPGhhbmRsZXI+Ci0gICAgICAgICAgICAgICAgICAgIDxoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkF1dGhIYW5kbGVyPC9oYW5kbGVyLWNsYXNzPgotICAgICAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlci1jaGFpbj4KLSAgICAgICAgPC9oYW5kbGVyLWNoYWlucz4KLSAgICA8L2VuZHBvaW50PgotCi0gICAgPGVuZHBvaW50IG5hbWU9Ik11bHRpRmlsaW5nU2VydmljZTExIgotICAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuTXVsdGlGaWxpbmdTZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfU11bHRpRmlsaW5nU2VydmljZSIKLSAgICAgICAgcG9ydD0ie2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4L31NdWx0aUZpbGluZ1NlcnZpY2VQb3J0IgotICAgICAgICB1cmwtcGF0dGVybj0iL3NlcnZpY2VzMTEvTXVsdGlGaWxpbmdTZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJBQ0xTZXJ2aWNlMTEiCi0gICAgICAgIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BY2xTZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfUFDTFNlcnZpY2UiCi0gICAgICAgIHBvcnQ9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99QUNMU2VydmljZVBvcnQiCi0gICAgICAgIHVybC1wYXR0ZXJuPSIvc2VydmljZXMxMS9BQ0xTZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotICAgIDxlbmRwb2ludCBuYW1lPSJQb2xpY3lTZXJ2aWNlMTEiCi0gICAgICAgIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5Qb2xpY3lTZXJ2aWNlIgotICAgICAgICBzZXJ2aWNlPSJ7aHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy93cy8yMDA5MDgvfVBvbGljeVNlcnZpY2UiCi0gICAgICAgIHBvcnQ9IntodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC99UG9saWN5U2VydmljZVBvcnQiCi0gICAgICAgIHVybC1wYXR0ZXJuPSIvc2VydmljZXMxMS9Qb2xpY3lTZXJ2aWNlIiBlbmFibGUtbXRvbT0idHJ1ZSI+Ci0gICAgICAgIDxoYW5kbGVyLWNoYWlucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICA8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5BdXRoSGFuZGxlcjwvaGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXItY2hhaW4+Ci0gICAgICAgIDwvaGFuZGxlci1jaGFpbnM+Ci0gICAgPC9lbmRwb2ludD4KLQotPC9lbmRwb2ludHM+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3Rva2VuL2NtaXMuanMuanNwIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi90b2tlbi9jbWlzLmpzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMDk5NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3Rva2VuL2NtaXMuanMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLTwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCIgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWZ1bmN0aW9uIE9wZW5DTUlTQ29ubmVjdG9yKCkgIHsKLQl0aGlzLnJlcG9zaXRvcnlEb21haW4gID0gJzwlPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZG9tYWluIikgJT4nOwotCXRoaXMuc2VydmljZVVybCAgICAgICAgPSAnPCU9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2aWNlVXJsIikgJT4nOwotCXRoaXMuaWZyYW1lVXJsICAgICAgICAgPSAnPCU9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pZnJhbWVVcmwiKSAlPic7Ci0JdGhpcy5hcHBsaWNhdGlvbkRvbWFpbiA9ICcnOwotCXRoaXMuaWZyYW1lICAgPSBudWxsOwotCXRoaXMuaW5pdCAgICAgPSBmYWxzZTsKLQl0aGlzLmFwcEtleSAgID0gJyc7Ci0JdGhpcy5sb2dpbktleSA9ICcnOwotCXRoaXMubG9naW5DYWxsYmFjayAgPSBudWxsOwotCXRoaXMubG9nb3V0Q2FsbGJhY2sgPSBudWxsOwotCXRoaXMudG9rZW5DYWxsYmFja3MgPSBuZXcgQXJyYXkoKTsKLX0KLQotT3BlbkNNSVNDb25uZWN0b3IucHJvdG90eXBlLmNtaXNJbml0ID0gZnVuY3Rpb24oKSB7Ci0JLy8gZ2V0IGxvZ2luIGtleSBjb29raWUKLQl2YXIgY2EgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKLQlmb3IgKHZhciBpID0gMDsgaSA8IGNhLmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBjID0gY2FbaV0ucmVwbGFjZSgvXlxzXHMqLywgJycpLnJlcGxhY2UoL1xzXHMqJC8sICcnKTsKLQkJaWYgKGMuaW5kZXhPZignb3BlbmNtaXNfbG9naW5rZXk9JykgPT0gMCkgewotCQkJdGhpcy5sb2dpbktleSA9IHVuZXNjYXBlKGMuc3Vic3RyaW5nKDE4KSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmICh0aGlzLmxvZ2luS2V5ICE9ICcnKSB7Ci0JCS8vIHJlbW92ZSB0aGUgY29va2llCi0JCWRvY3VtZW50LmNvb2tpZSA9ICdvcGVuY21pc19sb2dpbmtleT1fOyBNYXgtQWdlPTA7IGV4cGlyZXM9VGh1LCAwMS1KYW4tNzAgMDA6MDA6MDEgR01UOyBWZXJzaW9uPSIxIic7Ci0JfQotCi0JLy8gYXBwIGRvbWFpbiBhbmQgcGF0aAotCXRoaXMuYXBwbGljYXRpb25Eb21haW4gPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3Q7Ci0JdmFyIGFwcERvbWFpbkVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5hcHBsaWNhdGlvbkRvbWFpbik7Ci0JdmFyIGFwcFBhdGhFbmNvZGVkID0gZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwotCi0JdmFyIHNlbGYgPSB0aGlzOwotCi0JLy8gcmVnaXN0ZXIgbWVzc2FnZSBldmVudCBsaXN0ZW5lcgotCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZXZlbnQpIHsgc2VsZi5jbWlzUmVjZWl2ZXIoZXZlbnQpIH0sIGZhbHNlKTsKLQotCS8vIHNldCB1cCBpZnJhbWUKLQl2YXIgcmVwb3NpdG9yeUlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwotCXJlcG9zaXRvcnlJZnJhbWUuc3JjID0gdGhpcy5pZnJhbWVVcmwgKyAodGhpcy5pZnJhbWVVcmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnKSArICdkb21haW49JyArIGFwcERvbWFpbkVuY29kZWQgKyAnJnBhdGg9JyArIGFwcFBhdGhFbmNvZGVkOwotCXJlcG9zaXRvcnlJZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQotCS8vdmFyIGZyYW1lTG9naW5LZXkgPSB0aGlzLmxvZ2luS2V5OwotCS8vdmFyIGZyYW1lUmVwb3NpdG9yeURvbWFpbiA9IHRoaXMucmVwb3NpdG9yeURvbWFpbjsKLQlyZXBvc2l0b3J5SWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uKCkgeyBzZWxmLnNlbmRMb2dpbk1lc3NhZ2UoKTsgfTsKLQotCXRoaXMuaWZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKS5pdGVtKDApLmFwcGVuZENoaWxkKHJlcG9zaXRvcnlJZnJhbWUpOwotCi0JdGhpcy5pbml0ID0gdHJ1ZTsKLX07Ci0KLU9wZW5DTUlTQ29ubmVjdG9yLnByb3RvdHlwZS5jbWlzUmVjZWl2ZXIgPSBmdW5jdGlvbihlKSB7Ci0JaWYgKGUub3JpZ2luICE9IHRoaXMucmVwb3NpdG9yeURvbWFpbikgewotCQkvLyBpZ25vcmUgbWVzc2FnZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHNlbnQgZnJvbSB0aGUgcmVwb3NpdG9yeSBkb21haW4KLQkJcmV0dXJuOwotCX0KLQotCWlmIChlLmRhdGEuc3Vic3RyaW5nKDAsIDYpID09ICd0b2tlbjonKSB7Ci0JCS8vIHJlc3BvbnNlIG9mIGEgdG9rZW4gcmVxdWVzdCwgcmVwb3NpdG9yeSBzZW5kcyB0b2tlbgotCi0JCWlmICh0aGlzLnRva2VuQ2FsbGJhY2tzLmxlbmd0aCA+IDApIHsKLQkJCS8vIGF0IGxlYXN0IG9uZSBjYWxsYmFjayBpcyB3YWl0aW5nIGZvciBhIHRva2VuCi0KLQkJCS8vIGV4dHJhY3QgdG9rZW4KLQkJCXZhciB0b2tlbiA9IGUuZGF0YS5zdWJzdHJpbmcoNik7Ci0KLQkJCS8vIHRyaWdnZXIgY2FsbGJhY2sKLQkJCXRoaXMudG9rZW5DYWxsYmFja3MucG9wKCkodG9rZW4pOwotCQl9Ci0JfSBlbHNlIGlmIChlLmRhdGEuc3Vic3RyaW5nKDAsIDcpID09ICdhcHBrZXk6JykgewotCQlpZiAodGhpcy5sb2dpbkNhbGxiYWNrICE9IG51bGwpIHsKLQkJCXZhciBjYWxsYmFjayA9IHRoaXMubG9naW5DYWxsYmFjazsKLQkJCXRoaXMubG9naW5DYWxsYmFjayA9IG51bGw7Ci0KLQkJCXRoaXMuYXBwS2V5ID0gZS5kYXRhLnN1YnN0cmluZyg3LCA2Nyk7Ci0JCQl0aGlzLmxvZ2luS2V5ID0gJyc7Ci0KLQkJCWNhbGxiYWNrKHRydWUpOwotCQl9Ci0JfSBlbHNlIGlmIChlLmRhdGEuc3Vic3RyaW5nKDAsIDkpID09ICdsb2dpbmtleTonKSB7Ci0JCWlmICh0aGlzLmxvZ2luQ2FsbGJhY2sgIT0gbnVsbCkgewotCQkJdmFyIGNhbGxiYWNrID0gdGhpcy5sb2dpbkNhbGxiYWNrOwotCQkJdGhpcy5sb2dpbkNhbGxiYWNrID0gbnVsbDsKLQotCQkJdGhpcy5sb2dpbktleSA9IGUuZGF0YS5zdWJzdHJpbmcoOSwgNjkpOwotCi0JCQl2YXIgbG9naW5VcmwgPSBlLmRhdGEuc3Vic3RyaW5nKDcwKTsKLQotCQkJdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotCQkJZXhwaXJlcy5zZXRUaW1lKGV4cGlyZXMuZ2V0VGltZSgpICsgMzYwMCk7Ci0KLQkJCWRvY3VtZW50LmNvb2tpZSA9ICdvcGVuY21pc19sb2dpbmtleT0nICsgZXNjYXBlKHRoaXMubG9naW5LZXkpCi0JCQkrICc7IE1heC1BZ2U9MzYwMDsgZXhwaXJlcz0nICsgZXhwaXJlcy50b0dNVFN0cmluZygpCi0JCQkrICc7IFZlcnNpb249IjEiOyBEaXNjYXJkJzsKLQotCQkJd2luZG93LmxvY2F0aW9uLmhyZWYgPSBsb2dpblVybDsKLQkJfQotCX0gZWxzZSBpZiAoZS5kYXRhLnN1YnN0cmluZygwLCA3KSA9PSAnbG9nb3V0OicpIHsKLQkJaWYgKHRoaXMubG9nb3V0Q2FsbGJhY2sgIT0gbnVsbCkgewotCQkJdmFyIGNhbGxiYWNrID0gdGhpcy5sb2dvdXRDYWxsYmFjazsKLQkJCXRoaXMubG9nb3V0Q2FsbGJhY2sgPSBudWxsOwotCi0JCQl2YXIgc3VjY2VzcyA9ICgnb2snID09IGUuZGF0YS5zdWJzdHJpbmcoNykpOwotCi0JCQljYWxsYmFjayhzdWNjZXNzKTsKLQkJfQotCX0KLX07Ci0KLU9wZW5DTUlTQ29ubmVjdG9yLnByb3RvdHlwZS5zZW5kTG9naW5NZXNzYWdlID0gZnVuY3Rpb24oKSB7Ci0JdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnbG9naW46JyArIHRoaXMubG9naW5LZXksIHRoaXMucmVwb3NpdG9yeURvbWFpbik7Ci19OwotCi1PcGVuQ01JU0Nvbm5lY3Rvci5wcm90b3R5cGUuY21pc1NlcnZpY2VVUkwgPSBmdW5jdGlvbigpIHsKLQlyZXR1cm4gdGhpcy5zZXJ2aWNlVXJsOwotfTsKLQotT3BlbkNNSVNDb25uZWN0b3IucHJvdG90eXBlLmNtaXNMb2dpbiA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7Ci0JaWYgKHRoaXMubG9naW5DYWxsYmFjayAhPSBudWxsKSB7Ci0JCS8vIHRoZXJlIGlzIGFscmVhZHkgYSBsb2dpbiBpbiBwcm9ncmVzcwotCQljYWxsYmFjayhmYWxzZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0aGlzLmxvZ2luQ2FsbGJhY2sgPSBjYWxsYmFjazsKLQotCWlmICghdGhpcy5pbml0KSB7Ci0JCXRoaXMuY21pc0luaXQoKTsKLQl9IGVsc2UgewotCQlzZW5kTG9naW5NZXNzYWdlKCk7Ci0JfQotfTsKLQotT3BlbkNNSVNDb25uZWN0b3IucHJvdG90eXBlLmNtaXNMb2dvdXQgPSBmdW5jdGlvbihjYWxsYmFjaykgewotCWlmICh0aGlzLmxvZ291dENhbGxiYWNrICE9IG51bGwpIHsKLQkJLy8gdGhlcmUgaXMgYWxyZWFkeSBhIGxvZ291dCBpbiBwcm9ncmVzcwotCQljYWxsYmFjayhmYWxzZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXRoaXMuaW5pdCkgewotCQkvLyB0aGVyZSBoYXNuJ3QgYmVlbiBhIGxvZ2luIGJlZm9yZQotCQljYWxsYmFjayhmYWxzZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0aGlzLmxvZ291dENhbGxiYWNrID0gY2FsbGJhY2s7Ci0JdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnbG9nb3V0OicgKyB0aGlzLmFwcEtleSwgdGhpcy5yZXBvc2l0b3J5RG9tYWluKTsKLX07Ci0KLU9wZW5DTUlTQ29ubmVjdG9yLnByb3RvdHlwZS5jbWlzTmV4dFRva2VuID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKLQlpZiAoIXRoaXMuaW5pdCkgewotCQkvLyBub3QgbG9nZ2VkIGluCi0JCWNhbGxiYWNrKCcnKTsKLQkJcmV0dXJuOwotCX0KLQotCXRoaXMudG9rZW5DYWxsYmFja3MudW5zaGlmdChjYWxsYmFjayk7Ci0JdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgndG9rZW46JyArIHRoaXMuYXBwS2V5LCB0aGlzLnJlcG9zaXRvcnlEb21haW4pOwotfTsKLQotdmFyIG9wZW5DTUlTQ29ubmVjdG9yID0gbmV3IE9wZW5DTUlTQ29ubmVjdG9yKCk7Ci0KLQotLy8gRnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIENNSVMgMS4xIHNwZWNpZmljYXRpb24KLQotZnVuY3Rpb24gY21pc1NlcnZpY2VVUkwoKSB7Ci0JcmV0dXJuIG9wZW5DTUlTQ29ubmVjdG9yLmNtaXNTZXJ2aWNlVVJMKCk7Ci19Ci0KLWZ1bmN0aW9uIGNtaXNMb2dpbihjYWxsYmFjaykgewotCW9wZW5DTUlTQ29ubmVjdG9yLmNtaXNMb2dpbihjYWxsYmFjayk7Ci19Ci0KLWZ1bmN0aW9uIGNtaXNMb2dvdXQoY2FsbGJhY2spIHsKLQlvcGVuQ01JU0Nvbm5lY3Rvci5jbWlzTG9nb3V0KGNhbGxiYWNrKTsKLX0KLQotZnVuY3Rpb24gY21pc05leHRUb2tlbihjYWxsYmFjaykgewotCW9wZW5DTUlTQ29ubmVjdG9yLmNtaXNOZXh0VG9rZW4oY2FsbGJhY2spOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvdG9rZW4vbG9naW4uanNwIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi90b2tlbi9sb2dpbi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZjE2ZWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi90b2tlbi9sb2dpbi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgotPCFET0NUWVBFIGh0bWw+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBjaGFyc2V0PSJVVEYtOCI+Ci08dGl0bGU+TG9naW48L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLWJvZHkgewotICBmb250LWZhbWlseTogVmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0gIGNvbG9yOiBibGFjazsKLSAgZm9udC1zaXplOiAxMnB4OwotfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotPGJvZHk+Ci0JPGgxPk9wZW5DTUlTIFJlcG9zaXRvcnkgTG9naW48L2gxPgotCi0JPGRpdj4KLQk8cD5QbGVhc2UgcHJvdmlkZSB5b3VyIGNyZWRlbnRpYWxzIGZvciB0aGlzIENNSVMgcmVwb3NpdG9yeS48L3A+Ci0JPHA+Ci0JCTwlIGlmIChyZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZXJyb3IiKSAhPSBudWxsKSB7ICU+Ci0JCTxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj48JT0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmVycm9yIikgJT48L3NwYW4+Ci0JCTwlIH0gJT4KLQk8L3A+Ci0JPC9kaXY+Ci0KLQk8ZGl2PgotCTxmb3JtIG1ldGhvZD0iUE9TVCI+Ci0JCTx0YWJsZT4KLQkJCTx0cj4KLQkJCQk8dGQ+VXNlcm5hbWU6PC90ZD4KLQkJCQk8dGQ+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InVzZXIiIHNpemU9IjIwIj48L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQ+UGFzc3dvcmQ6PC90ZD4KLQkJCQk8dGQ+PGlucHV0IHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCIgc2l6ZT0iMjAiIGF1dG9jb21wbGV0ZT0ib2ZmIi8+PC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkPjwvdGQ+Ci0JCQkJPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idHJ1c3RhcHAiIHZhbHVlPSIxIj4KLQkJCQkgICAgSSdtIHRydXN0aW5nIHRoaXMgYXBwbGljYXRpb246PGJyPgotCQkJCSAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjwlPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYXBwdXJsIikgJT48L3NwYW4+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkPjwvdGQ+Ci0JCQkJPHRkPjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiI+IDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJDYW5jZWwiIG9uQ2xpY2s9IndpbmRvdy5oaXN0b3J5LmJhY2soKSI+PC90ZD4KLQkJCTwvdHI+Ci0KLQkJPC90YWJsZT4KLQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ia2V5IiB2YWx1ZT0iPCU9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5mb3Jta2V5IikgJT4iPgotCTwvZm9ybT4KLQk8L2Rpdj4KLQkKLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3Rva2VuL3JlcG9zaXRvcnkuanNwIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi90b2tlbi9yZXBvc2l0b3J5LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzOTEyMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3Rva2VuL3JlcG9zaXRvcnkuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBwYWdlRW5jb2Rpbmc9IlVURi04IiU+Ci08IURPQ1RZUEUgaHRtbD4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KLTx0aXRsZT5SZXBvc2l0b3J5PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCTxzY3JpcHQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjcuMi5taW4uanMiPjwvc2NyaXB0PgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJdmFyIGFwcEluZm8gPSBnZXRBcHBJbmZvKCk7Ci0JCXZhciBhcHBEb21haW4gPSBhcHBJbmZvWzBdOwotCQl2YXIgYXBwUGF0aCA9IGFwcEluZm9bMV0KLQotCQkvLyB0b2tlbnMgaW4gc3RvY2ssIGluaXRpYWxseSBlbXB0eQotCQl2YXIgdG9rZW5zID0gbmV3IEFycmF5KCk7Ci0KLQkJaWYgKHdpbmRvdy50b3AgIT0gd2luZG93LnNlbGYgJiYgYXBwRG9tYWluICE9IG51bGwgJiYgYXBwUGF0aCAhPSBudWxsKSB7Ci0JCQkvLyBhZGQgbWVzc2FnZSBldmVudCBsaXN0ZW5lcgotCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByZWNlaXZlciwgZmFsc2UpOwotCQl9Ci0KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBFdmVudCBsaXN0ZW5lciBjYWxsYmFjay4KLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQlmdW5jdGlvbiByZWNlaXZlcihlKSB7Ci0JCQlpZiAoZS5vcmlnaW4gIT0gYXBwRG9tYWluKSB7Ci0JCQkJLy8gaWdub3JlIG1lc3NhZ2VzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZW50IGZyb20gdGhlIGFwcGxpY2F0aW9uIGRvbWFpbgotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGUuZGF0YS5zdWJzdHJpbmcoMCwgNSkgPT0gJ3Rva2VuJykgewotCQkJCXZhciBhcHBLZXkgPSBlLmRhdGEuc3Vic3RyaW5nKDYpOwotCi0JCQkJaWYgKHRva2Vucy5sZW5ndGggPiAwKSB7Ci0JCQkJCS8vIHdlIGhhdmUgYSBsZWFzdCBvbmUgdG9rZW4gaW4gc3RvY2sgLT4gcmVtb3ZlIG9uZSBhbmQgc2VuZCBpdAotCQkJCQllLnNvdXJjZS5wb3N0TWVzc2FnZSgndG9rZW46JyArIHRva2Vucy5wb3AoKSwgZS5vcmlnaW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIGFyZSBvdXQgb2YgdG9rZW5zIC0+IGFzayB0aGUgc2VydmVyIGZvciBhbm90aGVyIGJhdGNoCi0JCQkJCXJlcXVlc3RUb2tlbnMoZSwgYXBwS2V5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUuZGF0YS5zdWJzdHJpbmcoMCwgNSkgPT0gJ2xvZ2luJykgewotCQkJCXZhciBsb2dpbktleSA9IGUuZGF0YS5zdWJzdHJpbmcoNik7Ci0JCQkJbG9naW4oZSwgbG9naW5LZXkpOwotCQkJfSBlbHNlIGlmIChlLmRhdGEuc3Vic3RyaW5nKDAsIDYpID09ICdsb2dvdXQnKSB7Ci0JCQkJdmFyIGFwcEtleSA9IGUuZGF0YS5zdWJzdHJpbmcoNyk7Ci0JCQkJbG9nb3V0KGUsIGFwcEtleSk7Ci0JCQl9Ci0JCX0KLQotCQlmdW5jdGlvbiBsb2dpbihlLCBsb2dpbktleSkgewotCQkJJC5hamF4KHsKLQkJCQl1cmwgOiAnPCU9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5sb2dpblVybCIpICU+bG9naW4nLAotCQkJCXR5cGUgOiAnUE9TVCcsCi0JCQkJZGF0YSA6IHsKLQkJCQkJdXJsIDogYXBwRG9tYWluICsgYXBwUGF0aCwKLQkJCQkJa2V5IDogbG9naW5LZXkKLQkJCQl9LAotCQkJCXN1Y2Nlc3MgOiBmdW5jdGlvbihkYXRhKSB7Ci0JCQkJCWlmIChkYXRhLm9rID09IDEpIHsKLQkJCQkJCWUuc291cmNlLnBvc3RNZXNzYWdlKCdhcHBrZXk6JyArIGRhdGEua2V5LCBlLm9yaWdpbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllLnNvdXJjZS5wb3N0TWVzc2FnZSgnbG9naW5rZXk6JyArIGRhdGEua2V5ICsgIjoiCi0JCQkJCQkJCSsgZGF0YS51cmwsIGUub3JpZ2luKTsKLQkJCQkJfQotCQkJCX0sCi0JCQkJZXJyb3IgOiBmdW5jdGlvbihtc2cpIHsKLQkJCQkJYWxlcnQoIkVycm9yOiAiICsgbXNnKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWZ1bmN0aW9uIGxvZ291dChlLCBhcHBLZXkpIHsKLQkJCSQuYWpheCh7Ci0JCQkJdXJsIDogJzwlPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMubG9naW5VcmwiKSAlPmxvZ291dCcsCi0JCQkJdHlwZSA6ICdQT1NUJywKLQkJCQlkYXRhIDogewotCQkJCQlrZXkgOiBhcHBLZXkKLQkJCQl9LAotCQkJCXN1Y2Nlc3MgOiBmdW5jdGlvbihkYXRhKSB7Ci0JCQkJCWlmIChkYXRhLm9rID09IDEpIHsKLQkJCQkJCWUuc291cmNlLnBvc3RNZXNzYWdlKCdsb2dvdXQ6b2snLCBlLm9yaWdpbik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllLnNvdXJjZS5wb3N0TWVzc2FnZSgnbG9nb3V0OmZhaWx1cmUnLCBlLm9yaWdpbik7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCWVycm9yIDogZnVuY3Rpb24obXNnKSB7Ci0JCQkJCWFsZXJ0KCJFcnJvcjogIiArIG1zZyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIFJlcXVlc3RzIG5ldyB0b2tlbnMgZnJvbSB0aGUgc2VydmVyLgotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCWZ1bmN0aW9uIHJlcXVlc3RUb2tlbnMoZSwgYXBwS2V5KSB7Ci0JCQkkLmFqYXgoewotCQkJCXVybCA6ICc8JT0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmxvZ2luVXJsIikgJT50b2tlbicsCi0JCQkJdHlwZSA6ICdQT1NUJywKLQkJCQlkYXRhIDogewotCQkJCQlrZXkgOiBhcHBLZXkKLQkJCQl9LAotCQkJCXN1Y2Nlc3MgOiBmdW5jdGlvbihkYXRhKSB7Ci0KLQkJCQkJLy8gc2FuaXR5IGNoZWNrOiB3ZSBleHBlY3QgYW4gYXJyYXkKLQkJCQkJaWYgKCQuaXNBcnJheShkYXRhKSkgewotCi0JCQkJCQkvLyBpZiB3ZSByZWNlaXZlZCBtb3JlIHRoYW4gb25lIHRva2VuLCBwdXQgdGhlbSBpbiBzdG9jayBleGNlcHQgZm9yIHRoZSBmaXJzdCBvbmUKLQkJCQkJCWlmIChkYXRhLmxlbmd0aCA+IDEpIHsKLQkJCQkJCQlmb3IgKCB2YXIgaSA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXZhciB0b2tlbiA9IGRhdGFbaV07Ci0JCQkJCQkJCXRva2Vucy5wdXNoKHRva2VuKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGlmIHRoZSBhcnJheSB3YXNuJ3QgZW1wdHksIHNlbmQgdGhlIGZpcnN0IHRva2VuIHRvIHRoZSBhcHBsaWN0YWlvbgotCQkJCQkJaWYgKGRhdGEubGVuZ3RoID4gMCkgewotCQkJCQkJCWUuc291cmNlLnBvc3RNZXNzYWdlKCd0b2tlbjonICsgZGF0YVswXSwgZS5vcmlnaW4pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlmdW5jdGlvbiBnZXRBcHBJbmZvKCkgewotCQkJdmFyIGRvbWFpbiA9IG51bGw7Ci0JCQl2YXIgcGF0aCA9IG51bGw7Ci0JCQl2YXIgZnJhbWVIcmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7Ci0KLQkJCXZhciBwYXJhbXMgPSBmcmFtZUhyZWYuc2xpY2UoZnJhbWVIcmVmLmluZGV4T2YoJz8nKSArIDEpLnNwbGl0KCcmJyk7Ci0JCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIga2V5VmFsdWUgPSBwYXJhbXNbaV0uc3BsaXQoJz0nKTsKLQkJCQlpZiAoa2V5VmFsdWVbMF0gPT0gJ2RvbWFpbicpIHsKLQkJCQkJZG9tYWluID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleVZhbHVlWzFdKTsKLQkJCQl9IGVsc2UgaWYgKGtleVZhbHVlWzBdID09ICdwYXRoJykgewotCQkJCQlwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGtleVZhbHVlWzFdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBbIGRvbWFpbiwgcGF0aCBdOwotCQl9Ci0JPC9zY3JpcHQ+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmQ3ZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAgCi0tLT4KLTx3ZWItYXBwIHZlcnNpb249IjIuNCIKLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiPgotCi0gICAgPGRpc3BsYXktbmFtZT5PcGVuQ01JUyBTZXJ2ZXI8L2Rpc3BsYXktbmFtZT4KLQotICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLkNtaXNSZXBvc2l0b3J5Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIAotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmNvbS5zdW4ueG1sLndzLnRyYW5zcG9ydC5odHRwLnNlcnZsZXQuV1NTZXJ2bGV0Q29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIAotICAgIDwhLS0gCi0gICAgICAgICBBIHNlcnZsZXQgZmlsdGVyIHRoYXQgbG9ncyBhbGwgcmVxdWVzdHMgaW4gZmlsZXMuIFVzZWZ1bCBmb3IgbW9uaXRvcmluZyBhbmQgZGVidWdnaW5nLgotICAgICAgICAgVXNlIGl0IHdpdGggY2FyZSEgSXQgY2FuIGdlbmVyYXRlIGEgaHVnZSBhbW91bnQgb2YgZmlsZXMgYW5kIHdpbGwgc2xvdyBkb3duIHBlcmZvcm1hbmNlCi0gICAgICAgICBzaWduaWZpY2FudGx5LgotICAgIC0tPgotICAgIDwhLS0gLSAtPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgICAgIDxmaWx0ZXItbmFtZT5Mb2dnaW5nRmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LmZpbHRlci5Mb2dnaW5nRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgICA8cGFyYW0tbmFtZT5Mb2dEaXI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICAgIDxwYXJhbS12YWx1ZT48L3BhcmFtLXZhbHVlPgotICAgICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgICA8cGFyYW0tbmFtZT5QcmV0dHlQcmludDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgICA8cGFyYW0tbmFtZT5Mb2dIZWFkZXI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgICAgPHBhcmFtLW5hbWU+SW5kZW50PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgICA8cGFyYW0tdmFsdWU+NDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICAKLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgICAgIDxmaWx0ZXItbmFtZT5Mb2dnaW5nRmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzYXRvbTEwPC9zZXJ2bGV0LW5hbWU+IAotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICAgICA8ZmlsdGVyLW5hbWU+TG9nZ2luZ0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICAgIDxzZXJ2bGV0LW5hbWU+Y21pc2F0b20xMTwvc2VydmxldC1uYW1lPiAKLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgICAgPGZpbHRlci1uYW1lPkxvZ2dpbmdGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICAgICA8c2VydmxldC1uYW1lPmNtaXN3czEwPC9zZXJ2bGV0LW5hbWU+IAotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICAgICA8ZmlsdGVyLW5hbWU+TG9nZ2luZ0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICAgIDxzZXJ2bGV0LW5hbWU+Y21pc3dzMTE8L3NlcnZsZXQtbmFtZT4gCi0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgICAgIDxmaWx0ZXItbmFtZT5Mb2dnaW5nRmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzYnJvd3Nlcjwvc2VydmxldC1uYW1lPiAKLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDwhLSAtICAgLS0+Ci0KLSAgICA8IS0tCi0gICAgICAgIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGZpbHRlciBpZiB0aGUgT3BlbkNNSVMgc2VydmVyIHJ1bnMgYmVoaW5kIGEgcHJveHkgc2VydmVyIG9yIGEgbG9hZCBiYWxhbmNlci4KLSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSAndHJ1c3RlZFByb3hpZXMnIHBhcmFtZXRlciBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSXQgbXVzdCBtYXRjaCB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgcHJveHkgb3IgbG9hZCBiYWxhbmNlci4KLSAgICAtLT4KLSAgICA8IS0tCi0gICAgPGZpbHRlcj4KLSAgICAgICAgICAgPGZpbHRlci1uYW1lPlByb3h5RmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5maWx0ZXIuUHJveHlGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT50cnVzdGVkUHJveGllczwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4xMFwuXGR7MSwzfVwuXGR7MSwzfVwuXGR7MSwzfXwxOTJcLjE2OFwuXGR7MSwzfVwuXGR7MSwzfXwxNjlcLjI1NFwuXGR7MSwzfVwuXGR7MSwzfXwxMjdcLlxkezEsM31cLlxkezEsM31cLlxkezEsM308L3BhcmFtLXZhbHVlPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgICAgIDxmaWx0ZXItbmFtZT5Qcm94eUZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICAgIDxzZXJ2bGV0LW5hbWU+Y21pc2F0b20xMDwvc2VydmxldC1uYW1lPiAKLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgICAgPGZpbHRlci1uYW1lPlByb3h5RmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzYXRvbTExPC9zZXJ2bGV0LW5hbWU+IAotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICAgICA8ZmlsdGVyLW5hbWU+UHJveHlGaWx0ZXI8L2ZpbHRlci1uYW1lPgotICAgICAgICAgICA8c2VydmxldC1uYW1lPmNtaXNicm93c2VyPC9zZXJ2bGV0LW5hbWU+IAotICAgIDwvZmlsdGVyLW1hcHBpbmc+ICAgIAotICAgIC0tPgotCi0gICAgPCEtLQotICAgICAgICBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBmaWx0ZXIgdG8gZW5hYmxlIENPUlMgc3VwcG9ydCBmb3IgdGhlIGJyb3dzZXIgYmluZGluZy4KLSAgICAgICAgU2VlIGh0dHA6Ly9zb2Z0d2FyZS5kemh1dmlub3YuY29tL2NvcnMtZmlsdGVyLmh0bWwgZm9yIGRldGFpbHMuCi0gICAgICAgIFB1dCB0aGUgQ09SUyBsaWJyYXJpZXMgaW50byB0aGUgV0VCLUlORi9saWIgZGlyZWN0b3J5IG9yIHVuY29tbWVudCB0aGUgQ09SUyBkZXBlbmVkZW5jeSBpbiB0aGUgcG9tLnhtbC4KLSAgICAtLT4KLSAgICA8IS0tCi0gICAgPGZpbHRlcj4KLSAgICAgICAgPGZpbHRlci1uYW1lPkNPUlM8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmNvbS50aGV0cmFuc2FjdGlvbmNvbXBhbnkuY29ycy5DT1JTRmlsdGVyPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+Y29ycy5hbGxvd0dlbmVyaWNIdHRwUmVxdWVzdHM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5jb3JzLmFsbG93T3JpZ2luPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPio8L3BhcmFtLXZhbHVlPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+Y29ycy5hbGxvd1N1YmRvbWFpbnM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+Y29ycy5zdXBwb3J0ZWRNZXRob2RzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPkdFVCwgUE9TVDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5jb3JzLnN1cHBvcnRlZEhlYWRlcnM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+KjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5jb3JzLmV4cG9zZWRIZWFkZXJzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5jb3JzLnN1cHBvcnRzQ3JlZGVudGlhbHM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5jb3JzLm1heEFnZTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4zNjAwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPmNvcnMudGFnUmVxdWVzdHM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5DT1JTPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzYnJvd3Nlcjwvc2VydmxldC1uYW1lPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgLS0+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzd3MxMDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlcy5DbWlzV2ViU2VydmljZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPmNtaXNWZXJzaW9uPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjEuMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotICAgIAotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPmNtaXN3czExPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLkNtaXNXZWJTZXJ2aWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+Y21pc1ZlcnNpb248L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+MS4xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICA8L3NlcnZsZXQ+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzYXRvbTEwPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQ21pc0F0b21QdWJTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPmNhbGxDb250ZXh0SGFuZGxlcjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkJhc2ljQXV0aENhbGxDb250ZXh0SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5jbWlzVmVyc2lvbjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4xLjA8L3BhcmFtLXZhbHVlPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgotICAgIDwvc2VydmxldD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPmNtaXNhdG9tMTE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5DbWlzQXRvbVB1YlNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+Y2FsbENvbnRleHRIYW5kbGVyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuQmFzaWNBdXRoQ2FsbENvbnRleHRIYW5kbGVyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPmNtaXNWZXJzaW9uPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPjEuMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4yPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotICAgIAotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPmNtaXNicm93c2VyPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXIuQ21pc0Jyb3dzZXJCaW5kaW5nU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5jYWxsQ29udGV4dEhhbmRsZXI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3Nlci50b2tlbi5Ub2tlbkNhbGxDb250ZXh0SGFuZGxlcjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4yPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzd3MxMDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZpY2VzLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5jbWlzd3MxMTwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L3NlcnZpY2VzMTEvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPmNtaXNhdG9tMTA8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hdG9tLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgIAotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Y21pc2F0b20xMTwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2F0b20xMS8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+Y21pc2Jyb3dzZXI8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9icm93c2VyLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvY3NzL29wZW5jbWlzLmNzcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL2Nzcy9vcGVuY21pcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZGE5MmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvY3NzL29wZW5jbWlzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLUBDSEFSU0VUICJVVEYtOCI7Ci0KLWJvZHkgewotICBmb250LWZhbWlseTogVmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0gIGNvbG9yOiBibGFjazsKLSAgZm9udC1zaXplOiAxMnB4OwotfQotCi1oMSB7Ci0gIGZvbnQtc2l6ZTogMjRweDsKLSAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Ci0gIGNvbG9yOiAjMDAzMzY2OwotICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzYzc4YjU7Ci0gIHBhZGRpbmc6IDJweDsKLSAgbWFyZ2luOiA0cHggMHB4IDRweCAwcHg7Ci19Ci0KLWgyIHsKLSAgZm9udC1zaXplOiAxOHB4OwotICBsaW5lLWhlaWdodDogbm9ybWFsOwotICBmb250LXdlaWdodDogYm9sZDsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKLSAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjM2M3OGI1OwotICBwYWRkaW5nOiAycHg7Ci0gIG1hcmdpbjogNHB4IDBweCA0cHggMHB4OwotfQotCi1oMyB7Ci0gIGZvbnQtc2l6ZTogMTRweDsKLSAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gIGJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7Ci0gIHBhZGRpbmc6IDJweDsKLSAgbWFyZ2luOiA0cHggMHB4IDRweCAwcHg7Ci19Ci0KLWg0IHsKLSAgZm9udC1zaXplOiAxMnB4OwotICBsaW5lLWhlaWdodDogbm9ybWFsOwotICBmb250LXdlaWdodDogYm9sZDsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKLSAgcGFkZGluZzogMnB4OwotICBtYXJnaW46IDRweCAwcHggNHB4IDBweDsKLX0KLQotSFIgewotICBjb2xvcjogM2M3OGI1OwotICBoZWlnaHQ6IDE7Ci19Ci0KLXRoICB7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKLSAgICBwYWRkaW5nOiAycHggNHB4IDJweCA0cHg7Ci0gICAgYmFja2dyb3VuZDogI2YwZjBmMDsKLSAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLXRkICB7Ci0gICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKLSAgICBwYWRkaW5nOiAzcHggNHB4IDNweCA0cHg7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9pbWFnZXMvYXNmX2xvZ28ucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzL2FzZl9sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjMzRmMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9pbWFnZXMvYXNmX2xvZ28ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzL2NoZW1pc3RyeV9sb2dvX3NtYWxsLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL2ltYWdlcy9jaGVtaXN0cnlfbG9nb19zbWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmIzNWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzL2NoZW1pc3RyeV9sb2dvX3NtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL2ltYWdlcy9wYi1jaGVtaXN0cnktMTUweDE1MC5qcGcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9pbWFnZXMvcGItY2hlbWlzdHJ5LTE1MHgxNTAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzA5NmQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL2ltYWdlcy9wYi1jaGVtaXN0cnktMTUweDE1MC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3YTNjNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0tLT4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+T3BlbkNNSVMgQnJvd3NlciBCaW5kaW5nPC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9vcGVuY21pcy5jc3MiLz4KLTwvaGVhZD4KLTxib2R5PgotPGEgaHJlZj0iaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnIj48aW1nIGFsdD0iQXBhY2hlIENoZW1pc3RyeSBMb2dvIiB0aXRsZT0iQXBhY2hlIENoZW1pc3RyeSBMb2dvIiBzcmM9ImltYWdlcy9jaGVtaXN0cnlfbG9nb19zbWFsbC5wbmciIC8+PC9hPgotPGgxPkFwYWNoZSBDaGVtaXN0cnkgT3BlbkNNSVM8L2gxPgotCi08YnIvPgotPGgyPkF0b21QdWIgYmluZGluZzwvaDI+Ci08ZGl2PjxhIGhyZWY9ImF0b20iPkF0b21QdWIgc2VydmljZSBkb2N1bWVudDwvYT48L2Rpdj4KLQotPGJyLz4KLTxoMj5XZWIgU2VydmljZXMgYmluZGluZzwvaDI+Ci08ZGl2PjxhIGhyZWY9InNlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlIj5XZWIgU2VydmljZXMgb3ZlcnZpZXc8L2E+PC9kaXY+Ci0KLTxici8+Ci08aDI+QnJvd3NlciBiaW5kaW5nPC9oMj4KLTxkaXY+PGEgaHJlZj0iYnJvd3NlciI+QnJvd3NlciBiaW5kaW5nIHNlcnZpY2UgVVJMPC9hPjwvZGl2PgotCi08YnIvPgotPGgyPldlYiBpbnRlcmZhY2U8L2gyPgotPGRpdj48YSBocmVmPSJ3ZWIiPk9wZW5DTUlTIHdlYiBpbnRlcmZhY2U8L2E+PC9kaXY+Ci0KLTxici8+Ci08aDI+TGljZW5zZTwvaDI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciPjxpbWcgYWx0PSJBU0YgTG9nbyIgdGl0bGU9IkFTRiBMb2dvIiBzcmM9ImltYWdlcy9hc2ZfbG9nby5wbmciIGFsaWduPSJyaWdodCIvPjwvYT4KLTxkaXY+VGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPkFwYWNoZSAyLjAgTGljZW5zZTwvYT4uPC9kaXY+Ci08YnIvPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvd2ViL2luZGV4Lmh0bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC93ZWIvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2NWVlNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC93ZWIvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KLTx0aXRsZT5PcGVuQ01JUyBCcm93c2VyIEJpbmRpbmc8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vY3NzL29wZW5jbWlzLmNzcyIvPgotPHNjcmlwdCBzcmM9Ii4uL2Jyb3dzZXI/bG9naW49c2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotdmFyIHJlcG9zaXRvcnlVcmw7Ci12YXIgcm9vdEZvbGRlclVybDsKLXZhciByb290Rm9sZGVySWQ7Ci12YXIgcm9vdEZvbGRlciA9ICIvIjsKLXZhciBsYXN0VG9rZW47Ci12YXIgY3VycmVudEZvbGRlcklkOwotCi0vLyBsb2dpbiBhbmQgbG9nb3V0Ci0KLWZ1bmN0aW9uIGxvZ2luKCkgewotCWNtaXNMb2dpbihmdW5jdGlvbihzdWNjZXNzKSB7Ci0JCWlmIChzdWNjZXNzKSB7Ci0JCQljbWlzTmV4dFRva2VuKGZ1bmN0aW9uKHRva2VuKSB7Ci0JCQkJdmFyIHNjcmlwdDAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKLQkJCQlzY3JpcHQwLnNldEF0dHJpYnV0ZSgnc3JjJywgY21pc1NlcnZpY2VVUkwoKSArICc/Y2FsbGJhY2s9cHJpbnRSZXBvc2l0b3J5SW5mb3MmdG9rZW49JyArIHRva2VuKTsKLQkJCQlzY3JpcHQwLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTsKLQkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdDApOwotCQkJfSk7Ci0JCX0KLQl9KTsKLX0KLQotZnVuY3Rpb24gbG9nb3V0KCkgewotCWNtaXNMb2dvdXQoZnVuY3Rpb24oc3VjY2VzcykgewotCQlpZiAoc3VjY2VzcykgewotCQkJLy8gbG9naW4gYWdhaW4KLQkJCWxvZ2luKCk7Ci0JCX0KLQl9KTsKLX0KLQotLy8gaGVscGVycwotCi1mdW5jdGlvbiBwZXJmb3JtSnNvbnBSZXF1ZXN0KHVybCwgY2FsbGJhY2ssIHBhcmFtcykgewotCXZhciBjYWxsVXJsID0gdXJsOwotCi0JaWYgKHBhcmFtcykgewotCQlmb3IgKHZhciBrZXkgaW4gcGFyYW1zKSB7Ci0JCQljYWxsVXJsID0gY2FsbFVybCArICcmJyArIGtleSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXNba2V5XSk7Ci0JCX0KLQl9Ci0KLQljbWlzTmV4dFRva2VuKGZ1bmN0aW9uKHRva2VuKSB7Ci0JCWNhbGxVcmwgPSBjYWxsVXJsICsgCi0JCScmY2FsbGJhY2s9JyArIGNhbGxiYWNrICsgCi0JCScmdG9rZW49JyArIGVuY29kZVVSSUNvbXBvbmVudCh0b2tlbikgKwotCQknJnN1cHByZXNzUmVzcG9uc2VDb2Rlcz10cnVlJwotCi0JCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKLQkJc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgY2FsbFVybCk7Ci0JCXNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7Ci0JCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKLQl9KTsKLX0KLQotZnVuY3Rpb24gbG9hZENtaXNEYXRhQnlJZChpZCwgc2VsZWN0b3IsIGNhbGxiYWNrLCBwYXJhbXMpIHsKLQlwZXJmb3JtSnNvbnBSZXF1ZXN0KHJvb3RGb2xkZXJVcmwgKyAnP2NtaXNzZWxlY3Rvcj0nICsgc2VsZWN0b3IgKyAnJm9iamVjdElkPScgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpLCBjYWxsYmFjaywgcGFyYW1zKTsKLX0KLQotZnVuY3Rpb24gbG9hZENtaXNEYXRhQnlQYXRoKHBhdGgsIHNlbGVjdG9yLCBjYWxsYmFjaywgcGFyYW1zKSB7Ci0JcGVyZm9ybUpzb25wUmVxdWVzdChyb290Rm9sZGVyVXJsICsgcGF0aCArICc/Y21pc3NlbGVjdG9yPScgKyBzZWxlY3RvciwgY2FsbGJhY2ssIHBhcmFtcyk7Ci19Ci0KLWZ1bmN0aW9uIGxvYWRDbWlzUmVwb3NpdG9yeURhdGEoc2VsZWN0b3IsIGNhbGxiYWNrLCBwYXJhbXMpIHsKLQlwZXJmb3JtSnNvbnBSZXF1ZXN0KHJlcG9zaXRvcnlVcmwgKyAnP2NtaXNzZWxlY3Rvcj0nICsgc2VsZWN0b3IsIGNhbGxiYWNrLCBwYXJhbXMpOwotfQotCi1mdW5jdGlvbiBsb2FkQ21pc0xhc3RSZXN1bHQodG9rZW4sIGNhbGxiYWNrKSB7Ci0JdmFyIHVybCA9IHJlcG9zaXRvcnlVcmwgKyAnP2NtaXNzZWxlY3Rvcj1sYXN0UmVzdWx0JyArCi0JJyZjYWxsYmFjaz0nICsgY2FsbGJhY2sgKwotCScmdG9rZW49JyArIGVuY29kZVVSSUNvbXBvbmVudCh0b2tlbik7Ci0KLQl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7Ci0Jc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTsKLQlzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpOwotCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKLX0KLQotZnVuY3Rpb24gb3BlbkNvbnRlbnRJbk5ld1dpbmRvdyhpZCkgewotCWNtaXNOZXh0VG9rZW4oZnVuY3Rpb24odG9rZW4pIHsKLQkJdmFyIHVybCA9IHJvb3RGb2xkZXJVcmwgKyAKLQkJJz9jbWlzc2VsZWN0b3I9Y29udGVudCcgKwotCQknJm9iamVjdElkPScgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpICsgCi0JCScmdG9rZW49JyArIGVuY29kZVVSSUNvbXBvbmVudCh0b2tlbik7Ci0JCXdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpOwotCX0pOwotfQotCi1mdW5jdGlvbiBjcmVhdGVBbmRTdWJtaXREZWxldGVGb3JtKHJvb3RGb2xkZXJVcmwsIGlkLCBjbWlzYWN0aW9uLCBjYWxsYmFjaykgewotCWNtaXNOZXh0VG9rZW4oZnVuY3Rpb24odG9rZW4pIHsKLQkJdmFyIHRhcmdldEZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7Ci0JCXRhcmdldEZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCXRhcmdldEZyYW1lLm5hbWUgPSAnY21pcy1mcmFtZS0nICsgY21pc2FjdGlvbiArICctJyArIGlkOwotCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhcmdldEZyYW1lKTsKLQotCQl0YXJnZXRGcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywKLQkJZnVuY3Rpb24oKSB7Ci0JCQljYWxsYmFjaygpOwotCQkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YXJnZXRGcmFtZSk7Ci0JCX0sCi0JCWZhbHNlKTsKLQotCQl2YXIgZnJhbWVCb2R5ID0gdGFyZ2V0RnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7Ci0JCXRhcmdldEZyYW1lLmFwcGVuZENoaWxkKGZyYW1lQm9keSk7Ci0KLQkJdmFyIGNtaXNGb3JtID0gdGFyZ2V0RnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7Ci0JCWNtaXNGb3JtLmFjdGlvbiA9IHJvb3RGb2xkZXJVcmwgKyAnP29iamVjdElkPScgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpOwotCQljbWlzRm9ybS5tZXRob2QgPSAnUE9TVCc7Ci0JCWNtaXNGb3JtLnRhcmdldCA9IHRhcmdldEZyYW1lLm5hbWU7Ci0JCWZyYW1lQm9keS5hcHBlbmRDaGlsZChjbWlzRm9ybSk7Ci0KLQkJdmFyIGNtaXNBY3Rpb25JbnB1dCA9IHRhcmdldEZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKLQkJY21pc0FjdGlvbklucHV0Lm5hbWUgPSAnY21pc2FjdGlvbic7Ci0JCWNtaXNBY3Rpb25JbnB1dC50eXBlID0gJ3RleHQnOwotCQljbWlzQWN0aW9uSW5wdXQudmFsdWUgPSBjbWlzYWN0aW9uOwotCQljbWlzRm9ybS5hcHBlbmRDaGlsZChjbWlzQWN0aW9uSW5wdXQpOwotCi0JCXZhciBjbWlzQWxsVmVyc2lvbnNJbnB1dCA9IHRhcmdldEZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKLQkJY21pc0FsbFZlcnNpb25zSW5wdXQubmFtZSA9ICdhbGxWZXJzaW9ucyc7Ci0JCWNtaXNBbGxWZXJzaW9uc0lucHV0LnR5cGUgPSAndGV4dCc7Ci0JCWNtaXNBbGxWZXJzaW9uc0lucHV0LnZhbHVlID0gJ3RydWUnOwotCQljbWlzRm9ybS5hcHBlbmRDaGlsZChjbWlzQWxsVmVyc2lvbnNJbnB1dCk7Ci0KLQkJdmFyIGNtaXNUb2tlbklucHV0ID0gdGFyZ2V0RnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwotCQljbWlzVG9rZW5JbnB1dC5uYW1lID0gJ3Rva2VuJzsKLQkJY21pc1Rva2VuSW5wdXQudHlwZSA9ICd0ZXh0JzsKLQkJY21pc1Rva2VuSW5wdXQudmFsdWUgPSB0b2tlbjsKLQkJY21pc0Zvcm0uYXBwZW5kQ2hpbGQoY21pc1Rva2VuSW5wdXQpOwotCi0JCWNtaXNGb3JtLnN1Ym1pdCgpOwotCX0pOwotfQotCi0vLyBwcmludCBjYWxsYmFja3MKLQotZnVuY3Rpb24gcHJpbnRSZXBvc2l0b3J5SW5mb3MoaW5mb3MpIHsKLQlmb3IocmVwSWQgaW4gaW5mb3MpIHsKLQkJdmFyIHJpID0gaW5mb3NbcmVwSWRdOwkJCi0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXBvc2l0b3J5SW5mbycpLmlubmVySFRNTCA9Ci0JCQknPGgyPlJlcHNvc2l0b3J5ICInICsgcmkucmVwb3NpdG9yeU5hbWUgKyAnIiAoJyArIHJpLnJlcG9zaXRvcnlJZCArICcpPC9oMj4nICsKLQkJCSc8dGFibGU+JyArCi0JCQknPHRyPjx0ZD5JZDo8L3RkPjx0ZD4nICsgcmkucmVwb3NpdG9yeUlkICsgJzwvdGQ+PC90cj4nICsKLQkJCSc8dHI+PHRkPk5hbWU6PC90ZD48dGQ+JyArIHJpLnJlcG9zaXRvcnlOYW1lICsgJzwvdGQ+PC90cj4nICsKLQkJCSc8dHI+PHRkPkRlc2NyaXB0aW9uOjwvdGQ+PHRkPicgKyByaS5yZXBvc2l0b3J5RGVzY3JpcHRpb24gKyAnPC90ZD48L3RyPicgKwotCQkJJzx0cj48dGQ+UHJvZHVjdDo8L3RkPjx0ZD4nICsgcmkudmVuZG9yTmFtZSArICcgJyArIHJpLnByb2R1Y3ROYW1lICsgJyAnICsgcmkucHJvZHVjdFZlcnNpb24gKyAnPC90ZD48L3RyPicgKwotCQkJJzx0cj48dGQ+Um9vdCBmb2xkZXIgaWQ6PC90ZD48dGQ+JyArIHJpLnJvb3RGb2xkZXJJZCArICc8L3RkPjwvdHI+JyArCi0JCQknPHRyPjx0ZD5SZXBvc2l0b3J5IFVSTDo8L3RkPjx0ZD4nICsgcmkucmVwb3NpdG9yeVVybCArICc8L3RkPjwvdHI+JyArCi0JCQknPHRyPjx0ZD5Sb290IGZvbGRlciBVUkw6PC90ZD48dGQ+JyArIHJpLnJvb3RGb2xkZXJVcmwgKyAnPC90ZD48L3RyPicgKwotCQkJJzwvdGFibGU+JzsKLQotCQkvLyB0aGUgSW5NZW1vcnkgcmVwb3NpdG9yeSBoYXMgb25seSBvbmUgcmVwb3NpdG9yeQotCQlyZXBvc2l0b3J5VXJsID0gcmkucmVwb3NpdG9yeVVybDsKLQkJcm9vdEZvbGRlclVybCA9IHJpLnJvb3RGb2xkZXJVcmw7Ci0JCXJvb3RGb2xkZXJJZCA9IHJpLnJvb3RGb2xkZXJJZDsKLQl9Ci0KLQljdXJyZW50Rm9sZGVySWQgPSByb290Rm9sZGVySWQ7Ci0KLQlsb2FkQ21pc0RhdGFCeVBhdGgocm9vdEZvbGRlciwgJ29iamVjdCcsICdwcmludE9iamVjdCcsIHt9KTsKLQlyZWxvYWRDaGlsZHJlbigpOwotCWxvYWRDbWlzUmVwb3NpdG9yeURhdGEoJ3R5cGVDaGlsZHJlbicsICdwcmludFR5cGVzJywge30pOwotfQotCi1mdW5jdGlvbiBwcmludE9iamVjdChvYmopIHsKLQl2YXIgaWQgPSBvYmoucHJvcGVydGllc1siY21pczpvYmplY3RJZCJdLnZhbHVlOwotCXZhciBuYW1lID0gb2JqLnByb3BlcnRpZXNbImNtaXM6bmFtZSJdLnZhbHVlOwotCi0JdmFyIHMgPSAnPGgyPk9iamVjdCAiJyArIG5hbWUgKyAnIiAoJyArIGlkICsgJyk8L2gyPic7Ci0KLQlzID0gcyArICc8aDM+UHJvcGVydGllczwvaDM+JzsKLQlzID0gcyArICc8dGFibGU+JzsKLQotCWZvcihwcm9wZXJ0eUlkIGluIG9iai5wcm9wZXJ0aWVzKSB7Ci0JCXZhciBwcm9wZXJ0eSA9IG9iai5wcm9wZXJ0aWVzW3Byb3BlcnR5SWRdOwotCQlzID0gcyArICc8dHI+PHRkPicgKyBwcm9wZXJ0eUlkICsgJzwvdGQ+JzsKLQkJcyA9IHMgKyAnPHRkPicgKyBwcm9wZXJ0eS5kaXNwbGF5TmFtZSArICc8L3RkPic7Ci0JCXMgPSBzICsgJzx0ZD4nICsgcHJvcGVydHkudHlwZSArICc8L3RkPic7Ci0JCXMgPSBzICsgJzx0ZD4nICsgcHJvcGVydHkuY2FyZGluYWxpdHkgKyAnPC90ZD4nOwotCi0JCWlmKHByb3BlcnR5LnR5cGUgPT0gJ2RhdGV0aW1lJykgewotCQkJcyA9IHMgKyAnPHRkPicgKyAobmV3IERhdGUocHJvcGVydHkudmFsdWUpKSArICc8L3RkPjwvdHI+JzsKLQkJfSBlbHNlIHsKLQkJCXMgPSBzICsgJzx0ZD4nICsgcHJvcGVydHkudmFsdWUgKyAnPC90ZD48L3RyPic7Ci0JCX0KLQl9Ci0KLQlzID0gcyArICc8L3RhYmxlPic7Ci0KLQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb2JqZWN0SW5mbycpLmlubmVySFRNTCA9IHM7Ci19Ci0KLWZ1bmN0aW9uIHByaW50Q2hpbGRyZW4oY2hpbGRyZW4pIHsKLQl2YXIgcyA9ICc8aDI+Q2hpbGRyZW48L2gyPic7Ci0KLQlzID0gcyArICc8aDM+UHJvcGVydGllczwvaDM+JzsKLQotCXMgPSBzICsgJzxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJSZWxvYWQgZm9sZGVyIiBvbkNsaWNrPSJyZWxvYWRDaGlsZHJlbigpIj4nOwotCi0JcyA9IHMgKyAnPHRhYmxlPjx0cj48dGg+TmFtZTwvdGg+PHRoPlR5cGU8L3RoPjx0aD5NSU1FIFR5cGU8L3RoPjx0aD5TaXplPC90aD4nICsKLQknPHRoPkNyZWF0ZWQgQnk8L3RoPjx0aD5DcmVhdGVkIEF0PC90aD48dGg+SWQ8L3RoPjx0aD48L3RoPjwvdHI+JzsKLQotCWZvcih2YXIgaW5kZXggaW4gY2hpbGRyZW4ub2JqZWN0cykgewotCQl2YXIgb2JqZWN0ID0gY2hpbGRyZW4ub2JqZWN0c1tpbmRleF0ub2JqZWN0OwotCi0JCXZhciBuYW1lID0gb2JqZWN0LnByb3BlcnRpZXNbImNtaXM6bmFtZSJdLnZhbHVlOwotCQl2YXIgdHlwZSA9IG9iamVjdC5wcm9wZXJ0aWVzWyJjbWlzOm9iamVjdFR5cGVJZCJdLnZhbHVlOwotCQl2YXIgbWltZXR5cGUgPSAiIjsKLQkJdmFyIHNpemUgPSAiIjsKLQkJdmFyIGNyZWF0ZWRCeSA9IG9iamVjdC5wcm9wZXJ0aWVzWyJjbWlzOmNyZWF0ZWRCeSJdLnZhbHVlOwotCQl2YXIgY3JlYXRpb25EYXRlID0gbmV3IERhdGUob2JqZWN0LnByb3BlcnRpZXNbImNtaXM6Y3JlYXRpb25EYXRlIl0udmFsdWUpOwotCQl2YXIgaWQgPSBvYmplY3QucHJvcGVydGllc1siY21pczpvYmplY3RJZCJdLnZhbHVlOwotCQl2YXIgbGluayA9IDA7IC8vIDAgLSBubyBsaW5rLCAxIC0gY29udGVudCBsaW5rLCAyIC0gZm9sZGVyIGxpbmsKLQkJdmFyIGRlbGV0ZUxpbmsgPSAiZGVsZXRlT2JqZWN0KCciICsgaWQgKyAiJykiOwotCi0JCWlmKG9iamVjdC5wcm9wZXJ0aWVzWyJjbWlzOmJhc2VUeXBlSWQiXS52YWx1ZSA9PSAiY21pczpmb2xkZXIiKSB7Ci0JCQlkZWxldGVMaW5rID0gImRlbGV0ZUZvbGRlcignIiArIGlkICsgIicpIjsKLQkJCWxpbmsgPSAyOwotCQl9Ci0KLQkJaWYob2JqZWN0LnByb3BlcnRpZXNbImNtaXM6YmFzZVR5cGVJZCJdLnZhbHVlID09ICJjbWlzOmRvY3VtZW50IikgewotCQkJaWYob2JqZWN0LnByb3BlcnRpZXNbImNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCJdKSB7Ci0JCQkJc2l6ZSA9IG9iamVjdC5wcm9wZXJ0aWVzWyJjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgiXS52YWx1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2l6ZSA9ICIiOwotCQkJfQotCi0JCQlpZihvYmplY3QucHJvcGVydGllc1siY21pczpjb250ZW50U3RyZWFtTWltZVR5cGUiXSkgewotCQkJCW1pbWV0eXBlID0gb2JqZWN0LnByb3BlcnRpZXNbImNtaXM6Y29udGVudFN0cmVhbU1pbWVUeXBlIl0udmFsdWU7Ci0JCQkJbGluayA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCW1pbWV0eXBlID0gIiI7Ci0JCQkJbGluayA9ICIiOwotCQkJfQotCQl9Ci0KLQkJcyA9IHMgKyAnPHRyPjx0ZD4nOwotCQlpZihsaW5rID09IDEpIHsKLQkJCXMgPSBzICsgIjxhIGhyZWY9XCJqYXZhc2NyaXB0Om9wZW5Db250ZW50SW5OZXdXaW5kb3coJyIgKyBpZCArICInKVwiPiIgKyBuYW1lICsgIjwvYT4iOwotCQl9IGVsc2UgaWYobGluayA9PSAyKSB7Ci0JCQlzID0gcyArICI8YSBocmVmPVwiamF2YXNjcmlwdDpuYXZpZ2F0ZURvd24oJyIgKyBpZCArICInKVwiPiIgKyBuYW1lICsgIjwvYT4iOwotCQl9IGVsc2UgewotCQkJcyA9IHMgKyBuYW1lOwotCQl9Ci0KLQkJcyA9IHMgKyAnPC90ZD48dGQ+JyArIHR5cGUgKyAnPC90ZD48dGQ+JyArIG1pbWV0eXBlICsgJzwvdGQ+PHRkIHN0eWxlPSJyZXh0LWFsaWduOnJpZ2h0Ij4nICsgc2l6ZSArCi0JCSc8L3RkPjx0ZD4nICsgY3JlYXRlZEJ5ICsgJzwvdGQ+PHRkPicgKyBjcmVhdGlvbkRhdGUgKyAnPC90ZD48dGQ+JyArIGlkICsgJzwvdGQ+PHRkPjxidXR0b24gb25DbGljaz0iJyArIGRlbGV0ZUxpbmsgKyAnIj5kZWxldGU8L2J1dHRvbj48L3RkPjwvdHI+JzsKLQl9Ci0KLQlzID0gcyArICc8L3RhYmxlPic7Ci0KLQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVySW5mbycpLmlubmVySFRNTCA9IHM7Ci19Ci0KLWZ1bmN0aW9uIHByaW50VHlwZXModHlwZXMpIHsKLQl2YXIgcyA9ICc8aDI+QmFzZSBUeXBlczwvaDI+JzsKLQotCWZvcih2YXIgaW5kZXggaW4gdHlwZXMudHlwZXMpIHsKLQkJdmFyIHR5cGUgPSB0eXBlcy50eXBlc1tpbmRleF07Ci0KLQkJcyA9IHMgKyAnPGgzPicgKyB0eXBlLmlkICsgJzwvaDM+JzsKLQkJcyA9IHMgKyAnPHVsPic7Ci0KLQkJZm9yKHZhciBwcm9wSWQgaW4gdHlwZS5wcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0JCQl2YXIgcHJvcFR5cGUgPSB0eXBlLnByb3BlcnR5RGVmaW5pdGlvbnNbcHJvcElkXTsKLQkJCXMgPSBzICsgJzxsaT4nICsgcHJvcFR5cGUuaWQgKyAnPC9saT4nOwotCQl9Ci0KLQkJcyA9IHMgKyAnPC91bD4nOwotCX0KLQotCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0eXBlSW5mbycpLmlubmVySFRNTCA9IHM7Ci19Ci0KLS8vIG5hdmlnYXRlCi0KLWZ1bmN0aW9uIHJlbG9hZENoaWxkcmVuKCkgewotCXZhciBwYXJhbXMgPSB7fTsKLQotCXBhcmFtcy5maWx0ZXIgPSAnY21pczpuYW1lLGNtaXM6b2JqZWN0SWQsY21pczpvYmplY3RUeXBlSWQsY21pczpiYXNlVHlwZUlkLCcgKwotCSdjbWlzOmNvbnRlbnRTdHJlYW1NaW1lVHlwZSxjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgsJyArIAotCSdjbWlzOmNyZWF0aW9uRGF0ZSxjbWlzOmNyZWF0ZWRCeScKLQlwYXJhbXMuaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSAnZmFsc2UnOwkKLQlwYXJhbXMuaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSAnbm9uZSc7CQotCXBhcmFtcy5yZW5kaXRpb25GaWx0ZXIgPSAnY21pczpub25lJzsKLQlwYXJhbXMubWF4SXRlbXMgPSAnMTAwJzsJCi0JcGFyYW1zLm9yZGVyQnkgPSAnY21pczpuYW1lJzsKLQotCWxvYWRDbWlzRGF0YUJ5SWQoY3VycmVudEZvbGRlcklkLCAnY2hpbGRyZW4nLCAncHJpbnRDaGlsZHJlbicsIHBhcmFtcyk7Ci19Ci0KLWZ1bmN0aW9uIG5hdmlnYXRlRG93bihmb2xkZXJJZCkgewotCWN1cnJlbnRGb2xkZXJJZCA9IGZvbGRlcklkOwotCWxvYWRDbWlzRGF0YUJ5SWQoY3VycmVudEZvbGRlcklkLCAnY2hpbGRyZW4nLCAncHJpbnRDaGlsZHJlbicsIHt9KTsKLX0KLQotLy8gZGVsZXRlCi0KLWZ1bmN0aW9uIGRlbGV0ZU9iamVjdChpZCkgewotCWNyZWF0ZUFuZFN1Ym1pdERlbGV0ZUZvcm0ocm9vdEZvbGRlclVybCwgaWQsICdkZWxldGUnLCByZWxvYWRDaGlsZHJlbik7Ci19Ci0KLWZ1bmN0aW9uIGRlbGV0ZUZvbGRlcihpZCkgewotCWNyZWF0ZUFuZFN1Ym1pdERlbGV0ZUZvcm0ocm9vdEZvbGRlclVybCwgaWQsICdkZWxldGVUcmVlJywgcmVsb2FkQ2hpbGRyZW4pOwotfQotCi0KLS8vIHF1ZXJ5Ci0KLWZ1bmN0aW9uIHF1ZXJ5U3VibWl0KCkgewotCXZhciBxdWVyeUZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVlcnlGb3JtJyk7CQotCXF1ZXJ5Rm9ybS5hY3Rpb24gPSByZXBvc2l0b3J5VXJsOwotCi0JdmFyIHF1ZXJ5UGFyYW1zID0ge307Ci0JcXVlcnlQYXJhbXMucSA9IHF1ZXJ5Rm9ybS5xLnZhbHVlOwotCXF1ZXJ5UGFyYW1zLm1heEl0ZW1zID0gcXVlcnlGb3JtLm1heEl0ZW1zLnZhbHVlOwotCXF1ZXJ5UGFyYW1zLnNraXBDb3VudCA9IHF1ZXJ5Rm9ybS5za2lwQ291bnQudmFsdWU7Ci0KLQlsb2FkQ21pc1JlcG9zaXRvcnlEYXRhKCdxdWVyeScsICdxdWVyeUNhbGxiYWNrJywgcXVlcnlQYXJhbXMpOwotfQotCi1mdW5jdGlvbiBxdWVyeUNhbGxiYWNrKHJlc3VsdCkgewotCWlmICghKHR5cGVvZiByZXN1bHQuZXhjZXB0aW9uID09PSAndW5kZWZpbmVkJykpIHsKLQkJYWxlcnQoJ0V4Y2VwdGlvbjogJyArIHJlc3VsdC5leGNlcHRpb24gKyAnXG5cbkVycm9yOlxuJyArIHJlc3VsdC5tZXNzYWdlKTsKLQkJcmV0dXJuOwotCX0KLQotCXZhciBjb2xzID0ge307Ci0JdmFyIGNvbENvdW50ID0gMDsKLQl2YXIgdGFibGUgPSBbXTsKLQotCWZvcih2YXIgaSA9IDA7IGkgPCByZXN1bHQucmVzdWx0cy5sZW5ndGg7IGkrKykgewotCQl2YXIgcHJvcHMgPSByZXN1bHQucmVzdWx0c1tpXS5wcm9wZXJ0aWVzOwotCQl2YXIgcm93ID0gW107Ci0JCWZvcih2YXIgcXVlcnlOYW1lIGluIHByb3BzKSB7Ci0JCQl2YXIgcG9zOwotCQkJaWYgKHR5cGVvZiBjb2xzW3F1ZXJ5TmFtZV0gPT09ICd1bmRlZmluZWQnKSB7Ci0JCQkJcG9zID0gY29sc1txdWVyeU5hbWVdID0gY29sQ291bnQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJcG9zID0gY29sc1txdWVyeU5hbWVdOwotCQkJfQotCi0JCQl3aGlsZShyb3cubGVuZ3RoIDwgcG9zIC0gMSkgewotCQkJCXJvdy5wdXNoKCcnKTsKLQkJCX0KLQotCQkJaWYocHJvcHNbcXVlcnlOYW1lXS50eXBlID09ICdkYXRldGltZScpIHsKLQkJCQlyb3dbcG9zXSA9IG5ldyBEYXRlKHByb3BzW3F1ZXJ5TmFtZV0udmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyb3dbcG9zXSA9IHByb3BzW3F1ZXJ5TmFtZV0udmFsdWU7Ci0JCQl9Ci0JCX0KLQkJdGFibGUucHVzaChyb3cpOwotCX0KLQotCXZhciBzID0gJzxoMz5RdWVyeSBSZXN1bHRzPC9oMz4nOwotCi0JcyA9IHMgKyAnPHRhYmxlPjx0cj4nOwotCWZvcih2YXIgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7Ci0JCWZvcih2YXIgY29sTmFtZSBpbiBjb2xzKSB7Ci0JCQlpZihjb2xzW2NvbE5hbWVdID09IGkpIHsKLQkJCQlzID0gcyArICc8dGg+JyArIGNvbE5hbWUgKyAnPC90aD4nOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXMgPSBzICsgJzwvdHI+JzsKLQotCWZvcih2YXIgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IHRhYmxlLmxlbmd0aDsgcm93SW5kZXgrKykgewotCQlzID0gcyArICc8dHI+JzsKLQkJZm9yKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY29sQ291bnQ7IGNvbEluZGV4KyspIHsKLQkJCXMgPSBzICsgJzx0ZD4nOwotCQkJaWYoY29sSW5kZXggPCB0YWJsZVtyb3dJbmRleF0ubGVuZ3RoKSB7Ci0JCQkJcyA9IHMgKyB0YWJsZVtyb3dJbmRleF1bY29sSW5kZXhdOwotCQkJfQotCQkJcyA9IHMgKyAnPC90ZD4nOwotCQl9Ci0JCXMgPSBzICsgJzwvdHI+JzsKLQl9Ci0KLQlzID0gcyArICc8L3RhYmxlPic7Ci0KLQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncXVlcnlSZXN1bHQnKS5pbm5lckhUTUwgPSBzOwotfQotCi0vLyBjcmVhdGUgRm9sZGVyCi0KLWZ1bmN0aW9uIGNyZWF0ZUZvbGRlclN1Ym1pdCgpIHsKLQl2YXIgY3JlYXRlRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcmVhdGVGb2xkZXJGb3JtJyk7Ci0JY3JlYXRlRm9ybS5hY3Rpb24gPSByb290Rm9sZGVyVXJsICsgY3JlYXRlRm9ybS5mb2xkZXIudmFsdWU7Ci0KLQljbWlzTmV4dFRva2VuKGZ1bmN0aW9uKHRva2VuKSB7Ci0JCWxhc3RUb2tlbiA9IHRva2VuOwotCQljcmVhdGVGb3JtLnRva2VuLnZhbHVlID0gdG9rZW47Ci0JCWNyZWF0ZUZvcm0uc3VibWl0KCk7Ci0JfSk7Ci19Ci0KLS8vIGNyZWF0ZSBkb2N1bWVudAotCi1mdW5jdGlvbiBjcmVhdGVEb2N1bWVudFN1Ym1pdCgpIHsKLQl2YXIgY3JlYXRlRm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcmVhdGVEb2N1bWVudEZvcm0nKTsKLQljcmVhdGVGb3JtLmFjdGlvbiA9IHJvb3RGb2xkZXJVcmwgKyBjcmVhdGVGb3JtLmZvbGRlci52YWx1ZTsKLQotCWNtaXNOZXh0VG9rZW4oZnVuY3Rpb24odG9rZW4pIHsKLQkJbGFzdFRva2VuID0gdG9rZW47Ci0JCWNyZWF0ZUZvcm0udG9rZW4udmFsdWUgPSB0b2tlbjsKLQkJY3JlYXRlRm9ybS5zdWJtaXQoKTsKLQl9KTsKLX0KLQotLy8gY3JlYXRlIGhlbHBlcnMKLQotZnVuY3Rpb24gY3JlYXRlQ2FsbGJhY2soKSB7Ci0JaWYobGFzdFRva2VuKSB7Ci0JCWxvYWRDbWlzTGFzdFJlc3VsdChsYXN0VG9rZW4sICdzaG93TmV3SWQnKTsKLQl9Ci19Ci0KLWZ1bmN0aW9uIHNob3dOZXdJZChyZXN1bHQpIHsKLQlpZihyZXN1bHQub2JqZWN0SWQpIHsKLQkJYWxlcnQoJ05ldyBvYmplY3QgaWQ6ICcgKyByZXN1bHQub2JqZWN0SWQgKyAnXG5cbkNvZGU6ICcgKyByZXN1bHQuY29kZSk7Ci0JfSBlbHNlIHsKLQkJYWxlcnQoJ0V4Y2VwdGlvbjogJyArIHJlc3VsdC5leGNlcHRpb24gKyAnXG5cbkVycm9yOlxuJyArIHJlc3VsdC5tZXNzYWdlICsgJ1xuXG5Db2RlOiAnICsgcmVzdWx0LmNvZGUpOwotCX0KLX0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgb25Mb2FkPSJsb2dpbigpIj4KLQotPGgxPk9wZW5DTUlTIFdlYiBJbnRlcmZhY2U8L2gxPgotCi08aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iTG9nb3V0IiBvbkNsaWNrPSJsb2dvdXQoKSI+Ci0KLTxiciAvPgotPGRpdiBpZD0icmVwb3NpdG9yeUluZm8iIGNsYXNzPSJib3giPnJlcG9zaXRvcnlJbmZvPC9kaXY+Ci08YnIgLz4KLTxkaXYgaWQ9Im9iamVjdEluZm8iIGNsYXNzPSJib3giPm9iamVjdEluZm88L2Rpdj4KLTxiciAvPgotPGRpdiBpZD0iZm9sZGVySW5mbyIgY2xhc3M9ImJveCI+Zm9sZGVySW5mbzwvZGl2PgotPGJyIC8+Ci08ZGl2IGlkPSJ0eXBlSW5mbyIgY2xhc3M9ImJveCI+dHlwZUluZm88L2Rpdj4KLTxiciAvPgotCi08ZGl2IGlkPSJxdWVyeSIgY2xhc3M9ImJveCI+Ci08aDI+UXVlcnk8L2gyPgotPGZvcm0gaWQ9InF1ZXJ5Rm9ybSIgYWN0aW9uPSIiIG1ldGhvZD0iR0VUIiB0YXJnZXQ9Il9ibGFuayI+Ci0JPGlucHV0IG5hbWU9ImNtaXNhY3Rpb24iIHR5cGU9ImhpZGRlbiIgdmFsdWU9InF1ZXJ5IiAvPgotCTxpbnB1dCBuYW1lPSJ0b2tlbiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iIiAvPgotCTx0YWJsZT4KLQkJPHRyPjx0ZD5RdWVyeTo8L3RkPjx0ZD48aW5wdXQgbmFtZT0icSIgdHlwZT0idGV4dCIgc2l6ZT0iMTAwIiBtYXhsZW5ndGg9IjEwMDAiIHZhbHVlPSJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQiPjwvdGQ+PC90cj4KLQkJPHRyPjx0ZD5NYXggSXRlbXM6PC90ZD48dGQ+PGlucHV0IG5hbWU9Im1heEl0ZW1zIiB0eXBlPSJ0ZXh0IiBzaXplPSI0IiBtYXhsZW5ndGg9IjgiIHZhbHVlPSIxMDAiPjwvdGQ+PC90cj4KLQkJPHRyPjx0ZD5Ta2lwIENvdW50OjwvdGQ+PHRkPjxpbnB1dCBuYW1lPSJza2lwQ291bnQiIHR5cGU9InRleHQiIHNpemU9IjQiIG1heGxlbmd0aD0iOCIgdmFsdWU9IjAiPjwvdGQ+PC90cj4KLQkJPHRyPjx0ZD48L3RkPjx0ZD48aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iR28iIG9uQ2xpY2s9InF1ZXJ5U3VibWl0KCkiLz48L3RkPjwvdHI+Ci0JPC90YWJsZT4KLTwvZm9ybT4KLTwvZGl2PgotPGRpdiBpZD0icXVlcnlSZXN1bHQiIGNsYXNzPSJib3giPjwvZGl2PgotPGJyIC8+Ci0KLTxkaXYgaWQ9ImZvbGRlciIgY2xhc3M9ImJveCI+Ci08aDI+Q3JlYXRlIEZvbGRlcjwvaDI+Ci08Zm9ybSBpZD0iY3JlYXRlRm9sZGVyRm9ybSIgYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCIgdGFyZ2V0PSJjcmVhdGVSZXN1bHQiPgotCTxpbnB1dCBuYW1lPSJfY2hhcnNldF8iIHR5cGU9ImhpZGRlbiIgLz4KLQk8aW5wdXQgbmFtZT0iY21pc2FjdGlvbiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iY3JlYXRlRm9sZGVyIiAvPgotCTxpbnB1dCBuYW1lPSJ0b2tlbiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iIiAvPgotCTx0YWJsZT4KLQk8dHI+Ci0JCTx0ZD5QYXJlbnQgRm9sZGVyOjwvdGQ+Ci0JCTx0ZD48aW5wdXQgbmFtZT0iZm9sZGVyIiB0eXBlPSJ0ZXh0IiBzaXplPSIxMDAiIG1heGxlbmd0aD0iMTAwMCIgdmFsdWU9Ii8iPjwvdGQ+Ci0JPC90cj4KLQk8dHI+Ci0JCTx0ZD5Gb2xkZXIgTmFtZTo8L3RkPgotCQk8dGQ+PGlucHV0IGlkPSJkb2NuYW1lIiBuYW1lPSJwcm9wZXJ0eVZhbHVlWzBdIiB0eXBlPSJ0ZXh0IiBzaXplPSIxMDAiIG1heGxlbmd0aD0iMTAwIiB2YWx1ZT0iZm9sZGVyIj48aW5wdXQgbmFtZT0icHJvcGVydHlJZFswXSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iY21pczpuYW1lIiAvPjwvdGQ+Ci0JPC90cj4KLQk8dHI+Ci0JCTx0ZD5PYmplY3QgVHlwZTo8L3RkPgotCQk8dGQ+PGlucHV0IG5hbWU9InByb3BlcnR5VmFsdWVbMV0iIHR5cGU9InRleHQiIHNpemU9IjEwMCIgbWF4bGVuZ3RoPSIxMDAiIHZhbHVlPSJjbWlzOmZvbGRlciI+PGlucHV0IG5hbWU9InByb3BlcnR5SWRbMV0iIHR5cGU9ImhpZGRlbiIgdmFsdWU9ImNtaXM6b2JqZWN0VHlwZUlkIiAvPjwvdGQ+Ci0JPC90cj4KLQk8dHI+Ci0JCTx0ZD48L3RkPgotCQk8dGQ+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNyZWF0ZSIgb25DbGljaz0iY3JlYXRlRm9sZGVyU3VibWl0KCkiLz48L3RkPgotCTwvdHI+Ci0JPC90YWJsZT4KLTwvZm9ybT4KLTwvZGl2PgotPGJyIC8+Ci0KLTxkaXYgaWQ9ImRvY3VtZW50IiBjbGFzcz0iYm94Ij4KLTxoMj5DcmVhdGUgRG9jdW1lbnQ8L2gyPgotCi0KLQotPGZvcm0gaWQ9ImNyZWF0ZURvY3VtZW50Rm9ybSIgYWN0aW9uPSIiIG1ldGhvZD0iUE9TVCIgdGFyZ2V0PSJjcmVhdGVSZXN1bHQiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotCTxpbnB1dCBuYW1lPSJfY2hhcnNldF8iIHR5cGU9ImhpZGRlbiIgLz4KLQk8aW5wdXQgbmFtZT0iY21pc2FjdGlvbiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iY3JlYXRlRG9jdW1lbnQiIC8+Ci0JPGlucHV0IG5hbWU9InRva2VuIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiIC8+Ci0JPHRhYmxlPgotCTx0cj4KLQkJPHRkPlBhcmVudCBGb2xkZXI6PC90ZD4KLQkJPHRkPjxpbnB1dCBuYW1lPSJmb2xkZXIiIHR5cGU9InRleHQiIHNpemU9IjEwMCIgbWF4bGVuZ3RoPSIxMDAwIiB2YWx1ZT0iLyI+PC90ZD4KLQk8L3RyPgotCTx0cj4KLQkJPHRkPkRvY3VtZW50IE5hbWU6PC90ZD4KLQkJPHRkPjxpbnB1dCBpZD0iZG9jbmFtZSIgbmFtZT0icHJvcGVydHlWYWx1ZVswXSIgdHlwZT0idGV4dCIgc2l6ZT0iMTAwIiBtYXhsZW5ndGg9IjEwMCIgdmFsdWU9ImRvY3VtZW50Ij48aW5wdXQgbmFtZT0icHJvcGVydHlJZFswXSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iY21pczpuYW1lIiAvPjwvdGQ+Ci0JPC90cj4KLQk8dHI+Ci0JCTx0ZD5PYmplY3QgVHlwZTo8L3RkPgotCQk8dGQ+PGlucHV0IG5hbWU9InByb3BlcnR5VmFsdWVbMV0iIHR5cGU9InRleHQiIHNpemU9IjEwMCIgbWF4bGVuZ3RoPSIxMDAiIHZhbHVlPSJjbWlzOmRvY3VtZW50Ij48aW5wdXQgbmFtZT0icHJvcGVydHlJZFsxXSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iY21pczpvYmplY3RUeXBlSWQiIC8+PC90ZD4gIAotCTwvdHI+Ci0JPHRyPgotCQk8dGQ+RmlsZSBuYW1lOjwvdGQ+Ci0JCTx0ZD48aW5wdXQgbmFtZT0iZmlsZW5hbWUiIHR5cGU9InRleHQiIHNpemU9IjMwIiBtYXhsZW5ndGg9IjMwIiB2YWx1ZT0iIj4gKGlmIGxlZnQgYmxhbmssIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgaXMgdXNlZCk8L3RkPgotCTwvdHI+Ci0JPHRyPgotCQk8dGQ+Q29udGVudCB0eXBlOjwvdGQ+Ci0JCTx0ZD48aW5wdXQgbmFtZT0iY29udGVudFR5cGUiIHR5cGU9InRleHQiIHNpemU9IjMwIiBtYXhsZW5ndGg9IjMwIiB2YWx1ZT0iIj4gKGlmIGxlZnQgYmxhbmssIHRoZSBjb250ZW50IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYnJvd3Nlcik8L3RkPgotCTwvdHI+Ci0JPHRyPgotCQk8dGQ+RmlsZTo8L3RkPgotCQk8dGQ+PGlucHV0IG5hbWU9ImNvbnRlbnQiIHR5cGU9ImZpbGUiPjwvdGQ+Ci0JPC90cj4KLQk8dHI+Ci0JCTx0ZD48L3RkPgotCQk8dGQ+PGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNyZWF0ZSIgb25DbGljaz0iY3JlYXRlRG9jdW1lbnRTdWJtaXQoKSIvPjwvdGQ+Ci0JPC90cj4KLQk8L3RhYmxlPgotPC9mb3JtPgotCi08L2Rpdj4KLTxiciAvPgotCi08aWZyYW1lIG5hbWU9ImNyZWF0ZVJlc3VsdCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIG9ubG9hZD0iY3JlYXRlQ2FsbGJhY2soKSI+PC9pZnJhbWU+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3MvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDIwMDk3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIFNlcnZlciBJbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQubWltZXB1bGw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5taW1lcHVsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWltZXB1bGwudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4gCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwud3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXh3cy1ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4d3MtcnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPiA8IS0tIGluY2x1ZGVkIGluIEphdmEgNiBhbmQgYWJvdmUgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5zdHJlYW08L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+IDwhLS0gaW5jbHVkZWQgaW4gSmF2YSA2IGFuZCBhYm92ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMud29vZHN0b3g8L2dyb3VwSWQ+CSAKLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3N0eC1hc2w8L2FydGlmYWN0SWQ+CSAKLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CSAKLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CSAKLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CSAKLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CSAKLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp2bmV0PC9ncm91cElkPgkgCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1pbWVwdWxsPC9hcnRpZmFjdElkPgkgCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CSAKLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIHNlcnZlci1zdXBwb3J0IGlzIG5vdCBhICpydW50aW1lKiBkZXBlbmRlbmN5IGJ1dCBpdCdzIGFkZGVkIGZvciBjb21tb2RpdHkgaW4gdGhlIFdBUiAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuOS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvZmlsdGVyL1Byb3h5RmlsdGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvZmlsdGVyL1Byb3h5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNjcyOTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ZpbHRlci9Qcm94eUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5maWx0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7Ci1pbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgY29ycmVjdHMgc2VydmVyIG5hbWUsIHNlcnZlciBwb3J0IGFuZCBzY2hlbWUgaWYgT3BlbkNNSVMgaXMKLSAqIHJ1bm5pbmcgYmVoaW5kIGEgcHJveHkgb3IgbG9hZCBiYWxhbmNlci4KLSAqLwotcHVibGljIGNsYXNzIFByb3h5RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0JBU0VfUEFUSCA9ICJiYXNlUGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVFJVU1RFRF9QUk9YSUVTID0gInRydXN0ZWRQcm94aWVzIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGJhc2VQYXRoOwotICAgIHByaXZhdGUgUGF0dGVybiB0cnVzdGVkUHJveGllczsKLQotICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBiYXNlUGF0aCA9IGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKFBBUkFNX0JBU0VfUEFUSCk7Ci0KLSAgICAgICAgdHJ1c3RlZFByb3hpZXMgPSBudWxsOwotICAgICAgICBTdHJpbmcgdHJ1c3RlZFByb3hpZXNTdHJpbmcgPSBmaWx0ZXJDb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9UUlVTVEVEX1BST1hJRVMpOwotICAgICAgICBpZiAodHJ1c3RlZFByb3hpZXNTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0cnVzdGVkUHJveGllcyA9IFBhdHRlcm4uY29tcGlsZSh0cnVzdGVkUHJveGllc1N0cmluZyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJDb3VsZCBub3QgY29tcGlsZSB0cnVzdGVkUHJveGllcyBwYXJhbWV0ZXI6ICIgKyBlLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgRmlsdGVyQ2hhaW4gY2hhaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNlcnZsZXRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGNoZWNrIGZvciB0cnVzdGVkIHByb3h5Ci0gICAgICAgIGlmICh0cnVzdGVkUHJveGllcyAhPSBudWxsICYmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KQotICAgICAgICAgICAgICAgICYmIHRydXN0ZWRQcm94aWVzLm1hdGNoZXIocmVxdWVzdC5nZXRSZW1vdGVBZGRyKCkpLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdCwgYmFzZVBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FsbCBuZXh0Ci0gICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9maWx0ZXIvUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvZmlsdGVyL1Byb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2IyOTlkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9maWx0ZXIvUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5maWx0ZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyOwotCi1wdWJsaWMgY2xhc3MgUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJERURfSE9TVF9IRUFERVIgPSAiWC1Gb3J3YXJkZWQtSG9zdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSREVEX1BST1RPX0hFQURFUiA9ICJYLUZvcndhcmRlZC1Qcm90byI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfU0NIRU1FID0gImh0dHBzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1NDSEVNRSA9ICJodHRwIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtZTsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJOYW1lOwotICAgIHByaXZhdGUgaW50IHNlcnZlclBvcnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGV4dFBhdGg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VydmxldFBhdGg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVxdWVzdFVSSTsKLQotICAgIHB1YmxpYyBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBiYXNlUGF0aCkgewotICAgICAgICBzdXBlcihyZXF1ZXN0KTsKLQotICAgICAgICBzY2hlbWUgPSByZXF1ZXN0LmdldEhlYWRlcihGT1JXQVJERURfUFJPVE9fSEVBREVSKTsKLQotICAgICAgICBpZiAoIUhUVFBfU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSAmJiAhSFRUUFNfU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSkgewotICAgICAgICAgICAgc2NoZW1lID0gcmVxdWVzdC5nZXRTY2hlbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlcnZlck5hbWUgPSByZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKLSAgICAgICAgc2VydmVyUG9ydCA9IHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOwotCi0gICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRIZWFkZXIoRk9SV0FSREVEX0hPU1RfSEVBREVSKTsKLSAgICAgICAgaWYgKChob3N0ICE9IG51bGwpICYmIChob3N0Lmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGhvc3QuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIHNlcnZlck5hbWUgPSBob3N0OwotICAgICAgICAgICAgICAgIHNlcnZlclBvcnQgPSBnZXREZWZhdWx0UG9ydChzY2hlbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gaG9zdC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGhvc3Quc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlclBvcnQgPSBnZXREZWZhdWx0UG9ydChzY2hlbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNlcnZsZXRQYXRoID0gcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpOwotCi0gICAgICAgIGlmIChiYXNlUGF0aCAhPSBudWxsICYmIGJhc2VQYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKS5zdWJzdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKS5sZW5ndGgoKSArIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKS5sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIGNvbnRleHRQYXRoID0gKGJhc2VQYXRoLmNoYXJBdCgwKSA9PSAnLycgPyBiYXNlUGF0aCA6ICIvIiArIGJhc2VQYXRoKTsKLSAgICAgICAgICAgIHJlcXVlc3RVUkkgPSBjb250ZXh0UGF0aCArIHNlcnZsZXRQYXRoICsgcGF0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOwotICAgICAgICAgICAgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0RGVmYXVsdFBvcnQoU3RyaW5nIHNjaGVtZSkgewotICAgICAgICBpZiAoSFRUUFNfU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIDQ0MzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiA4MDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlclBvcnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHRQYXRoOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2bGV0UGF0aDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0VVJJOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQoc2NoZW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKCI6Ly8iKTsKLSAgICAgICAgc2IuYXBwZW5kKHNlcnZlck5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoJzonKTsKLSAgICAgICAgc2IuYXBwZW5kKHNlcnZlclBvcnQpOwotICAgICAgICBzYi5hcHBlbmQoZ2V0UmVxdWVzdFVSSSgpKTsKLQotICAgICAgICByZXR1cm4gc2I7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvQ2FsbENvbnRleHRJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9DYWxsQ29udGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4YTM0Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9DYWxsQ29udGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuTXV0YWJsZUNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIENhbGxDb250ZXh0fSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsQ29udGV4dEltcGwgaW1wbGVtZW50cyBNdXRhYmxlQ2FsbENvbnRleHQgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gb2JqZWN0SW5mb1JlcXVpcmVkOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHB1YmxpYyBDYWxsQ29udGV4dEltcGwoU3RyaW5nIGJpbmRpbmcsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwKLSAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSkgewotICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgICAgICB0aGlzLm9iamVjdEluZm9SZXF1aXJlZCA9IEJJTkRJTkdfQVRPTVBVQi5lcXVhbHMoYmluZGluZyk7Ci0gICAgICAgIHB1dChSRVBPU0lUT1JZX0lELCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIC8vIENNSVMgdmVyc2lvbgotICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ01JUyB2ZXJzaW9uIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIHB1dChDYWxsQ29udGV4dC5DTUlTX1ZFUlNJT04sIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICAvLyBzZXJ2bGV0IGNvbnRleHQgYW5kIEhUVFAgc2VydmxldCByZXF1ZXN0IGFuZCByZXNwb25zZQotICAgICAgICBwdXQoQ2FsbENvbnRleHQuU0VSVkxFVF9DT05URVhULCBzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgIHB1dChDYWxsQ29udGV4dC5IVFRQX1NFUlZMRVRfUkVRVUVTVCwgcmVxdWVzdCk7Ci0gICAgICAgIHB1dChDYWxsQ29udGV4dC5IVFRQX1NFUlZMRVRfUkVTUE9OU0UsIHJlc3BvbnNlKTsKLQotICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwdXQoVEVNUF9ESVIsIGZhY3RvcnkuZ2V0VGVtcERpcmVjdG9yeSgpKTsKLSAgICAgICAgICAgIHB1dChNRU1PUllfVEhSRVNIT0xELCBmYWN0b3J5LmdldE1lbW9yeVRocmVzaG9sZCgpKTsKLSAgICAgICAgICAgIHB1dChNQVhfQ09OVEVOVF9TSVpFLCBmYWN0b3J5LmdldE1heENvbnRlbnRTaXplKCkpOwotICAgICAgICAgICAgcHV0KEVOQ1JZUFRfVEVNUF9GSUxFLCBmYWN0b3J5LmVuY3J5cHRUZW1wRmlsZXMoKSk7Ci0gICAgICAgICAgICBwdXQoU1RSRUFNX0ZBQ1RPUlksIHN0cmVhbUZhY3RvcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmFuZ2UoU3RyaW5nIHJhbmdlSGVhZGVyKSB7Ci0gICAgICAgIGlmIChyYW5nZUhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICByZW1vdmUoT0ZGU0VUKTsKLSAgICAgICAgcmVtb3ZlKExFTkdUSCk7Ci0KLSAgICAgICAgcmFuZ2VIZWFkZXIgPSByYW5nZUhlYWRlci5yZXBsYWNlQWxsKCJcXHMiLCAiIikudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCi0gICAgICAgIGlmIChyYW5nZUhlYWRlci5sZW5ndGgoKSA+IDYgJiYgcmFuZ2VIZWFkZXIuc3RhcnRzV2l0aCgiYnl0ZXM9IikgJiYgcmFuZ2VIZWFkZXIuaW5kZXhPZignLCcpID09IC0xCi0gICAgICAgICAgICAgICAgJiYgcmFuZ2VIZWFkZXIuY2hhckF0KDYpICE9ICctJykgewotICAgICAgICAgICAgQmlnSW50ZWdlciBvZmZzZXQgPSBudWxsOwotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGggPSBudWxsOwotCi0gICAgICAgICAgICBpbnQgZHMgPSByYW5nZUhlYWRlci5pbmRleE9mKCctJyk7Ci0gICAgICAgICAgICBpZiAoZHMgPiA2KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpcnN0Qnl0ZVBvc1N0ciA9IHJhbmdlSGVhZGVyLnN1YnN0cmluZyg2LCBkcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEJ5dGVQb3NTdHIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBuZXcgQmlnSW50ZWdlcihmaXJzdEJ5dGVQb3NTdHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyYW5nZUhlYWRlci5lbmRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdEJ5dGVQb3NTdHIgPSByYW5nZUhlYWRlci5zdWJzdHJpbmcoZHMgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IChuZXcgQmlnSW50ZWdlcihsYXN0Qnl0ZVBvc1N0cikpLmFkZChCaWdJbnRlZ2VyLk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IChuZXcgQmlnSW50ZWdlcihsYXN0Qnl0ZVBvc1N0cikpLnN1YnRyYWN0KG9mZnNldCkuYWRkKEJpZ0ludGVnZXIuT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHV0KE9GRlNFVCwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1dChMRU5HVEgsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIFJhbmdlIGhlYWRlciBtdXN0IGJlIGlnbm9yZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlcHRMYW5ndWFnZShTdHJpbmcgYWNjZXB0TGFuZ3VhZ2VIZWFkZXIpIHsKLSAgICAgICAgaWYgKGFjY2VwdExhbmd1YWdlSGVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbW92ZShMT0NBTEVfSVNPNjM5X0xBTkdVQUdFKTsKLSAgICAgICAgcmVtb3ZlKExPQ0FMRV9JU08zMTY2X0NPVU5UUlkpOwotICAgICAgICByZW1vdmUoTE9DQUxFKTsKLQotICAgICAgICBkb3VibGUgbGFzdFEgPSAwOwotICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgY291bnRyeSA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nW10gbGFuZ3VhZ2VIZWFkZXIgPSBhY2NlcHRMYW5ndWFnZUhlYWRlci5zcGxpdCgiLCIpOwotICAgICAgICBmb3IgKFN0cmluZyBsYW5ndWFnZVJhbmdlIDogbGFuZ3VhZ2VIZWFkZXIpIHsKLSAgICAgICAgICAgIFN0cmluZyBsYW5nUmFuZ2UgPSBsYW5ndWFnZVJhbmdlLnRyaW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBjdXJyZW50USA9IDA7Ci0KLSAgICAgICAgICAgIGludCB4ID0gbGFuZ1JhbmdlLmluZGV4T2YoJzsnKTsKLSAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcVN0ciA9IGxhbmdSYW5nZS5zdWJzdHJpbmcoeCArIDEpLnJlcGxhY2VBbGwoIlxccyIsICIiKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFxU3RyLnN0YXJ0c1dpdGgoInE9IikgJiYgcVN0ci5sZW5ndGgoKSA8IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cnJlbnRRID0gRG91YmxlLnBhcnNlRG91YmxlKHFTdHIuc3Vic3RyaW5nKDIpKTsKLSAgICAgICAgICAgICAgICBsYW5nUmFuZ2UgPSBsYW5nUmFuZ2Uuc3Vic3RyaW5nKDAsIHgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50USA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjdXJyZW50USA8PSBsYXN0USkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsYXN0USA9IGN1cnJlbnRROwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdbXSBsb2NhbGUgPSBsYW5nUmFuZ2Uuc3BsaXQoIi0iKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbDAgPSBsb2NhbGVbMF0udHJpbSgpOwotCi0gICAgICAgICAgICBsYW5ndWFnZSA9IG51bGw7Ci0gICAgICAgICAgICBjb3VudHJ5ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKCFsb2NhbGUuZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgICAgICBsYW5ndWFnZSA9IGxvY2FsMDsKLSAgICAgICAgICAgICAgICBpZiAobG9jYWxlLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsMSA9IGxvY2FsZVsxXS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWwxLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gbG9jYWwxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3VycmVudFEgPj0gMSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHB1dChMT0NBTEVfSVNPNjM5X0xBTkdVQUdFLCBsYW5ndWFnZSk7Ci0gICAgICAgICAgICBwdXQoTE9DQUxFLCBsYW5ndWFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwdXQoTE9DQUxFX0lTTzMxNjZfQ09VTlRSWSwgY291bnRyeSk7Ci0gICAgICAgICAgICBwdXQoTE9DQUxFLCBsYW5ndWFnZSArICItIiArIGNvdW50cnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdEluZm9SZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdEluZm9SZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXIuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNWZXJzaW9uIGdldENtaXNWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gKENtaXNWZXJzaW9uKSBnZXQoQ01JU19WRVJTSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChSRVBPU0lUT1JZX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0KFVTRVJOQU1FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0KFBBU1NXT1JEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChMT0NBTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIChCaWdJbnRlZ2VyKSBnZXQoT0ZGU0VUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoQmlnSW50ZWdlcikgZ2V0KExFTkdUSCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0VGVtcERpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIChGaWxlKSBnZXQoVEVNUF9ESVIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVuY3J5cHRUZW1wRmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKGdldChFTkNSWVBUX1RFTVBfRklMRSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5VGhyZXNob2xkKCkgewotICAgICAgICByZXR1cm4gKEludGVnZXIpIGdldChNRU1PUllfVEhSRVNIT0xEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhDb250ZW50U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIChMb25nKSBnZXQoTUFYX0NPTlRFTlRfU0laRSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBwYXJhbWV0ZXIucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgcmVtb3ZlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlci5yZW1vdmUoa2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9DbWlzUmVwb3NpdG9yeUNvbnRleHRMaXN0ZW5lci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvQ21pc1JlcG9zaXRvcnlDb250ZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjMmYzMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9DbWlzUmVwb3NpdG9yeUNvbnRleHRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRFdmVudDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ2xhc3NMb2FkZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIENNSVMgY29udGV4dCBsaXN0ZW5lci4KLSAqLwotcHVibGljIGNsYXNzIENtaXNSZXBvc2l0b3J5Q29udGV4dExpc3RlbmVyIGltcGxlbWVudHMgU2VydmxldENvbnRleHRMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFU19GQUNUT1JZID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZpY2VzZmFjdG9yeSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ21pc1JlcG9zaXRvcnlDb250ZXh0TGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfSU5JVF9QQVJBTSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5SRVBPU0lUT1JZX0NPTkZJR19GSUxFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0ZJTEVOQU1FID0gIi9yZXBvc2l0b3J5LnByb3BlcnRpZXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9DTEFTUyA9ICJjbGFzcyI7Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBzY2UpIHsKLSAgICAgICAgLy8gZ2V0IGNvbmZpZyBmaWxlIG5hbWUgb3IgdXNlIGRlZmF1bHQKLSAgICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGVuYW1lID0gc2NlLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0SW5pdFBhcmFtZXRlcihDT05GSUdfSU5JVF9QQVJBTSk7Ci0gICAgICAgIGlmIChjb25maWdGaWxlbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdGaWxlbmFtZSA9IENPTkZJR19GSUxFTkFNRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBzZXJ2aWNlcyBmYWN0b3J5Ci0gICAgICAgIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBjcmVhdGVTZXJ2aWNlRmFjdG9yeShjb25maWdGaWxlbmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIlNlcnZpY2UgZmFjdG9yeSBjb3VsZG4ndCBiZSBjcmVhdGVkOiAiICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0aGUgc2VydmljZXMgZmFjdG9yeSBpbnRvIHRoZSBzZXJ2bGV0IGNvbnRleHQKLSAgICAgICAgc2NlLmdldFNlcnZsZXRDb250ZXh0KCkuc2V0QXR0cmlidXRlKFNFUlZJQ0VTX0ZBQ1RPUlksIGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBzY2UpIHsKLSAgICAgICAgLy8gZGVzdHJveSBzZXJ2aWNlcyBmYWN0b3J5Ci0gICAgICAgIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5ID0gKENtaXNTZXJ2aWNlRmFjdG9yeSkgc2NlLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKFNFUlZJQ0VTX0ZBQ1RPUlkpOwotICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZhY3RvcnkuZGVzdHJveSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIlNlcnZpY2UgZmFjdG9yeSBjb3VsZG4ndCBiZSBkZXN0cm95ZWQ6ICIgKyBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzZXJ2aWNlIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbWlzU2VydmljZUZhY3RvcnkgY3JlYXRlU2VydmljZUZhY3RvcnkoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIC8vIGxvYWQgcHJvcGVydGllcwotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlbmFtZSk7Ci0KLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMT0cud2FybigiQ2Fubm90IGZpbmQgY29uZmlndXJhdGlvbiEiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9wcy5sb2FkKHN0cmVhbSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy53YXJuKCJDYW5ub3QgbG9hZCBjb25maWd1cmF0aW9uOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgJ2NsYXNzJyBwcm9wZXJ0eQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUEVSVFlfQ0xBU1MpOwotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIExPRy53YXJuKCJDb25maWd1cmF0aW9uIGRvZXNuJ3QgY29udGFpbiB0aGUgcHJvcGVydHkgJ2NsYXNzJyEiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZmFjdG9yeSBpbnN0YW5jZQotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9iamVjdCA9IENsYXNzTG9hZGVyVXRpbC5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLndhcm4oIkNvdWxkIG5vdCBjcmVhdGUgYSBzZXJ2aWNlcyBmYWN0b3J5IGluc3RhbmNlOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIENtaXNTZXJ2aWNlRmFjdG9yeSkpIHsKLSAgICAgICAgICAgIExPRy53YXJuKCJUaGUgcHJvdmlkZWQgY2xhc3MgaXMgbm90IGFuIGluc3RhbmNlIG9mIENtaXNTZXJ2aWNlRmFjdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5ID0gKENtaXNTZXJ2aWNlRmFjdG9yeSkgb2JqZWN0OwotCi0gICAgICAgIC8vIGluaXRpYWxpemUgZmFjdG9yeSBpbnN0YW5jZQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICBmb3IgKEVudW1lcmF0aW9uPD8+IGUgPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmFjdG9yeS5pbml0KHBhcmFtZXRlcnMpOwotCi0gICAgICAgIExPRy5pbmZvKCJJbml0aWFsaXplZCBTZXJ2aWNlcyBGYWN0b3J5OiAiICsgZmFjdG9yeS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvU2VydmVyVmVyc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvU2VydmVyVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODZkZjFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL1NlcnZlclZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFNlcnZlclZlcnNpb24gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkNNSVNfVkVSU0lPTjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOQ01JU19TRVJWRVI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBQYWNrYWdlIHAgPSBQYWNrYWdlLmdldFBhY2thZ2UoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsIik7Ci0gICAgICAgIGlmIChwID09IG51bGwpIHsKLSAgICAgICAgICAgIE9QRU5DTUlTX1ZFUlNJT04gPSAiPyI7Ci0gICAgICAgICAgICBPUEVOQ01JU19TRVJWRVIgPSAiQXBhY2hlLUNoZW1pc3RyeS1PcGVuQ01JUyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPUEVOQ01JU19WRVJTSU9OID0gcC5nZXRJbXBsZW1lbnRhdGlvblZlcnNpb24oKTsKLSAgICAgICAgICAgIE9QRU5DTUlTX1NFUlZFUiA9ICJBcGFjaGUtQ2hlbWlzdHJ5LU9wZW5DTUlTLyIgKyAoT1BFTkNNSVNfVkVSU0lPTiA9PSBudWxsID8gIj8iIDogT1BFTkNNSVNfVkVSU0lPTik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZlclZlcnNpb24oKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjU3NmE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIEZsb3JpYW4gTXVlbGxlcgotICogICAgIEZsb3JlbnQgR3VpbGxhdW1lLCBOdXhlbwotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTm90RW1wdHk7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5SZXR1cm5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkxpbmtJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk5hbWVzcGFjZURlZmluaXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuUmVuZGl0aW9uSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkFic3RyYWN0U2VydmljZUNhbGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5EaXNwYXRjaGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VDYWxsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0NISUxEUkVOID0gImNoaWxkcmVuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9ERVNDRU5EQU5UUyA9ICJkZXNjZW5kYW50cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSVFJFRSA9ICJmb2xkZXJ0cmVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9UWVBFID0gInR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1RZUEVTID0gInR5cGVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9UWVBFU0RFU0MgPSAidHlwZWRlc2MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0VOVFJZID0gImVudHJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9QQVJFTlQgPSAicGFyZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9QQVJFTlRTID0gInBhcmVudHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1ZFUlNJT05TID0gInZlcnNpb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9BTExPV0FCTEVBQ0lPTlMgPSAiYWxsb3dhYmxlYWN0aW9ucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQUNMID0gImFjbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfUE9MSUNJRVMgPSAicG9saWNpZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1JFTEFUSU9OU0hJUFMgPSAicmVsYXRpb25zaGlwcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfT0JKRUNUQllJRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfT0JKRUNUQllQQVRIID0gInBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1FVRVJZID0gInF1ZXJ5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9DSEVDS0VET1VUID0gImNoZWNrZWRvdXQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1VORklMRUQgPSAidW5maWxlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQ0hBTkdFUyA9ICJjaGFuZ2VzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9DT05URU5UID0gImNvbnRlbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0JVTEtfVVBEQVRFID0gInVwZGF0ZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX1BMQUNFSE9MREVSID0gIntyZXBvc2l0b3J5SWR9IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQQUdFX1NJWkUgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQVVUSE9SID0gInVua25vd24iOwotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZXMgdGhlIGJhc2UgVVJMIGZvciBsaW5rcywgY29sbGVjdGlvbnMgYW5kIHRlbXBsYXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsQnVpbGRlciBjb21waWxlQmFzZVVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBTdHJpbmcgYmFzZVVybCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKERpc3BhdGNoZXIuQkFTRV9VUkxfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGJhc2VVcmwgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHJlcElkUG9zID0gYmFzZVVybC5pbmRleE9mKFJFUE9TSVRPUllfUExBQ0VIT0xERVIpOwotICAgICAgICAgICAgaWYgKHJlcElkUG9zIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVXJsQnVpbGRlcihiYXNlVXJsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmxCdWlsZGVyKGJhc2VVcmwuc3Vic3RyaW5nKDAsIHJlcElkUG9zKSArIHJlcG9zaXRvcnlJZAotICAgICAgICAgICAgICAgICAgICAgICAgKyBiYXNlVXJsLnN1YnN0cmluZyhyZXBJZFBvcyArIFJFUE9TSVRPUllfUExBQ0VIT0xERVIubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIocmVxdWVzdC5nZXRTY2hlbWUoKSwgcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCksIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpLCBudWxsKTsKLQotICAgICAgICB1cmwuYWRkUGF0aChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpOwotICAgICAgICB1cmwuYWRkUGF0aChyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOwotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5SWQgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJsLmFkZFBhdGhTZWdtZW50KHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGEgVVJMIGZvciBsaW5rcywgY29sbGVjdGlvbnMgYW5kIHRlbXBsYXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbXBpbGVVcmwoVXJsQnVpbGRlciBiYXNlVXJsLCBTdHJpbmcgcmVzb3VyY2UsIFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgcmVzb3VyY2UsIGlkKS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGEgVVJMIGZvciBsaW5rcywgY29sbGVjdGlvbnMgYW5kIHRlbXBsYXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsQnVpbGRlciBjb21waWxlVXJsQnVpbGRlcihVcmxCdWlsZGVyIGJhc2VVcmwsIFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIoYmFzZVVybCk7Ci0gICAgICAgIHVybC5hZGRQYXRoU2VnbWVudChyZXNvdXJjZSk7Ci0KLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVybC5hZGRQYXJhbWV0ZXIoImlkIiwgaWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tIG5hbWVzcGFjZXMgLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TmFtZXNwYWNlcyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBOYW1lc3BhY2VEZWZpbml0aW9ucykgewotICAgICAgICAgICAgcmV0dXJuICgoTmFtZXNwYWNlRGVmaW5pdGlvbnMpIG9iaikuZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIC0tLSBlbnRyeSBidWlsZGVyIC0tLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgYSBvYmplY3QgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVPYmplY3RFbnRyeShDbWlzU2VydmljZSBzZXJ2aWNlLCBBdG9tRW50cnkgZW50cnksIE9iamVjdERhdGEgb2JqZWN0LAotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gY2hpbGRyZW4sIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwYXRoU2VnbWVudCwKLSAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGhTZWdtZW50LCBVcmxCdWlsZGVyIGJhc2VVcmwsIGJvb2xlYW4gaXNSb290LCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RJbmZvIGluZm8gPSBzZXJ2aWNlLmdldE9iamVjdEluZm8ocmVwb3NpdG9yeUlkLCBvYmplY3QuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IEluZm8gbm90IGZvdW5kIGZvcjogIiArIG9iamVjdC5nZXRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0YXJ0Ci0gICAgICAgIGVudHJ5LnN0YXJ0RW50cnkoaXNSb290KTsKLQotICAgICAgICAvLyB3cml0ZSBvYmplY3QKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRTcmMgPSBudWxsOwotCi0gICAgICAgIGlmIChpbmZvLmhhc0NvbnRlbnQoKSkgewotICAgICAgICAgICAgVXJsQnVpbGRlciBjb250ZW50U3JjQnVpbGRlciA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX0NPTlRFTlQsIGluZm8uZ2V0SWQoKSk7Ci0gICAgICAgICAgICBpZiAoaW5mby5nZXRGaWxlTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50U3JjQnVpbGRlci5hZGRQYXRoU2VnbWVudChpbmZvLmdldEZpbGVOYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250ZW50U3JjID0gY29udGVudFNyY0J1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVudHJ5LndyaXRlT2JqZWN0KG9iamVjdCwgaW5mbywgY29udGVudFNyYywgaW5mby5nZXRDb250ZW50VHlwZSgpLCBwYXRoU2VnbWVudCwgcmVsYXRpdmVQYXRoU2VnbWVudCwKLSAgICAgICAgICAgICAgICBjbWlzVmVyc2lvbik7Ci0KLSAgICAgICAgLy8gd3JpdGUgbGlua3MKLSAgICAgICAgZW50cnkud3JpdGVTZXJ2aWNlTGluayhiYXNlVXJsLnRvU3RyaW5nKCksIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgZW50cnkud3JpdGVTZWxmTGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0VOVFJZLCBpbmZvLmdldElkKCkpLCBpbmZvLmdldElkKCkpOwotICAgICAgICBlbnRyeS53cml0ZUVuY2xvc3VyZUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgaW5mby5nZXRJZCgpKSk7Ci0gICAgICAgIGVudHJ5LndyaXRlRWRpdExpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgaW5mby5nZXRJZCgpKSk7Ci0gICAgICAgIGVudHJ5LndyaXRlRGVzY3JpYmVkQnlMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgaW5mby5nZXRUeXBlSWQoKSkpOwotICAgICAgICBlbnRyeS53cml0ZUFsbG93YWJsZUFjdGlvbnNMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfQUxMT1dBQkxFQUNJT05TLCBpbmZvLmdldElkKCkpKTsKLQotICAgICAgICBpZiAoaW5mby5oYXNQYXJlbnQoKSkgewotICAgICAgICAgICAgaWYgKGluZm8uZ2V0QmFzZVR5cGUoKSA9PSBCYXNlVHlwZUlkLkNNSVNfRk9MREVSKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkud3JpdGVVcExpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9QQVJFTlQsIGluZm8uZ2V0SWQoKSksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbnRyeS53cml0ZVVwTGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1BBUkVOVFMsIGluZm8uZ2V0SWQoKSksIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5mby5nZXRCYXNlVHlwZSgpID09IEJhc2VUeXBlSWQuQ01JU19GT0xERVIpIHsKLSAgICAgICAgICAgIGVudHJ5LndyaXRlRG93bkxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9DSElMRFJFTiwgaW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgaWYgKGluZm8uc3VwcG9ydHNEZXNjZW5kYW50cygpKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkud3JpdGVEb3duTGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0RFU0NFTkRBTlRTLCBpbmZvLmdldElkKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbmZvLnN1cHBvcnRzRm9sZGVyVHJlZSgpKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkud3JpdGVGb2xkZXJUcmVlTGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0ZPTERFUlRSRUUsIGluZm8uZ2V0SWQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZm8uZ2V0VmVyc2lvblNlcmllc0lkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgVXJsQnVpbGRlciB2c1VybCA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1ZFUlNJT05TLCBpbmZvLmdldElkKCkpOwotICAgICAgICAgICAgdnNVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9WRVJTSU9OX1NFUklFU19JRCwgaW5mby5nZXRWZXJzaW9uU2VyaWVzSWQoKSk7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZVZlcnNpb25IaXN0b3J5TGluayh2c1VybC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaW5mby5pc0N1cnJlbnRWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgY3ZVcmwgPSBjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgaW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgIGN2VXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVUVVJOX1ZFUlNJT04sIFJldHVyblZlcnNpb24uTEFURVNUKTsKLSAgICAgICAgICAgIGVudHJ5LndyaXRlRWRpdExpbmsoY3ZVcmwudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5mby5nZXRCYXNlVHlwZSgpID09IEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCkgewotICAgICAgICAgICAgZW50cnkud3JpdGVFZGl0TWVkaWFMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfQ09OVEVOVCwgaW5mby5nZXRJZCgpKSwgaW5mby5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZvLmdldFdvcmtpbmdDb3B5SWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZVdvcmtpbmdDb3B5TGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0VOVFJZLCBpbmZvLmdldFdvcmtpbmdDb3B5SWQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZm8uZ2V0V29ya2luZ0NvcHlPcmlnaW5hbElkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnkud3JpdGVWaWFMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRU5UUlksIGluZm8uZ2V0V29ya2luZ0NvcHlPcmlnaW5hbElkKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZvLmdldFJlbmRpdGlvbkluZm9zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChSZW5kaXRpb25JbmZvIHJpIDogaW5mby5nZXRSZW5kaXRpb25JbmZvcygpKSB7Ci0gICAgICAgICAgICAgICAgVXJsQnVpbGRlciBydXJsID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfQ09OVEVOVCwgaW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBydXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1RSRUFNX0lELCByaS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBlbnRyeS53cml0ZUFsdGVybmF0ZUxpbmsocnVybC50b1N0cmluZygpLCByaS5nZXRDb250ZW5UeXBlKCksIHJpLmdldEtpbmQoKSwgcmkuZ2V0VGl0bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJpLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZvLmhhc0FjbCgpKSB7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZUFjbExpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9BQ0wsIGluZm8uZ2V0SWQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZm8uc3VwcG9ydHNQb2xpY2llcygpKSB7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZVBvbGljaWVzTGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1BPTElDSUVTLCBpbmZvLmdldElkKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZvLnN1cHBvcnRzUmVsYXRpb25zaGlwcygpKSB7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZVJlbGF0aW9uc2hpcHNMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfUkVMQVRJT05TSElQUywgaW5mby5nZXRJZCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5mby5nZXRSZWxhdGlvbnNoaXBTb3VyY2VJZHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGluZm8uZ2V0UmVsYXRpb25zaGlwU291cmNlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICBlbnRyeS53cml0ZVJlbGF0aW9uc2hpcFNvdXJjZUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgaWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZvLmdldFJlbGF0aW9uc2hpcFRhcmdldElkcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogaW5mby5nZXRSZWxhdGlvbnNoaXBUYXJnZXRJZHMoKSkgewotICAgICAgICAgICAgICAgIGVudHJ5LndyaXRlUmVsYXRpb25zaGlwVGFyZ2V0TGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0VOVFJZLCBpZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZm8uZ2V0QWRkaXRpb25hbExpbmtzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChMaW5rSW5mbyBsaW5rSW5mbyA6IGluZm8uZ2V0QWRkaXRpb25hbExpbmtzKCkpIHsKLSAgICAgICAgICAgICAgICBlbnRyeS53cml0ZUxpbmsobGlua0luZm8uZ2V0UmVsKCksIGxpbmtJbmZvLmdldEhyZWYoKSwgbGlua0luZm8uZ2V0VHlwZSgpLCBsaW5rSW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdyaXRlIGNoaWxkcmVuCi0gICAgICAgIGlmIChpc05vdEVtcHR5KGNoaWxkcmVuKSkgewotICAgICAgICAgICAgd3JpdGVPYmplY3RDaGlsZHJlbihzZXJ2aWNlLCBlbnRyeSwgaW5mbywgY2hpbGRyZW4sIHJlcG9zaXRvcnlJZCwgYmFzZVVybCwgY21pc1ZlcnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UgYXJlIGRvbmUKLSAgICAgICAgZW50cnkuZW5kRW50cnkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGEgb2JqZWN0IGVudHJ5IGluIGEgY29udGVudCBjaGFuZ2VzIGxpc3QuCi0gICAgICogCi0gICAgICogQ29udGVudCBjaGFuZ2VzIG9iamVjdHMgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCBiZWNhdXNlIHNvbWUgb2YgdGhlbSBjb3VsZAotICAgICAqIGhhdmUgYmVlbiBkZWxldGVkIGFuZCBhbiBvYmplY3QgaW5mbyBjYW5ub3QgYmUgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29udGVudENoYW5nZXNPYmplY3RFbnRyeShDbWlzU2VydmljZSBzZXJ2aWNlLCBBdG9tRW50cnkgZW50cnksIE9iamVjdERhdGEgb2JqZWN0LAotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gY2hpbGRyZW4sIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwYXRoU2VnbWVudCwKLSAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGhTZWdtZW50LCBVcmxCdWlsZGVyIGJhc2VVcmwsIGJvb2xlYW4gaXNSb290LCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RJbmZvIGluZm8gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIG9iamVjdC5nZXRJZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBhbGwgZXhjZXB0aW9ucwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVPYmplY3RFbnRyeShzZXJ2aWNlLCBlbnRyeSwgb2JqZWN0LCBjaGlsZHJlbiwgcmVwb3NpdG9yeUlkLCBwYXRoU2VnbWVudCwgcmVsYXRpdmVQYXRoU2VnbWVudCwgYmFzZVVybCwKLSAgICAgICAgICAgICAgICAgICAgaXNSb290LCBjbWlzVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdGFydCBkZWxldGUgb2JqZWN0IGVudHJ5Ci0gICAgICAgIGVudHJ5LnN0YXJ0RW50cnkoaXNSb290KTsKLQotICAgICAgICAvLyB3cml0ZSBvYmplY3QKLSAgICAgICAgZW50cnkud3JpdGVEZWxldGVkT2JqZWN0KG9iamVjdCwgY21pc1ZlcnNpb24pOwotCi0gICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgIGVudHJ5LndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIC8vIHdlIGFyZSBkb25lCi0gICAgICAgIGVudHJ5LmVuZEVudHJ5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIG9iamVjdHMgZW50cnkgY2hpbGRyZW4gZmVlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdENoaWxkcmVuKENtaXNTZXJ2aWNlIHNlcnZpY2UsIEF0b21FbnRyeSBlbnRyeSwgT2JqZWN0SW5mbyBmb2xkZXJJbmZvLAotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gY2hpbGRyZW4sIFN0cmluZyByZXBvc2l0b3J5SWQsIFVybEJ1aWxkZXIgYmFzZVVybCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBzdGFydAotICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKGVudHJ5LmdldFdyaXRlcigpKTsKLSAgICAgICAgZmVlZC5zdGFydENoaWxkcmVuKCk7Ci0gICAgICAgIGZlZWQuc3RhcnRGZWVkKGZhbHNlKTsKLQotICAgICAgICAvLyB3cml0ZSBiYXNpYyBBdG9tIGZlZWQgZWxlbWVudHMKLSAgICAgICAgZmVlZC53cml0ZUZlZWRFbGVtZW50cyhmb2xkZXJJbmZvLmdldElkKCksIGZvbGRlckluZm8uZ2V0QXRvbUlkKCksIGZvbGRlckluZm8uZ2V0Q3JlYXRlZEJ5KCksCi0gICAgICAgICAgICAgICAgZm9sZGVySW5mby5nZXROYW1lKCksIGZvbGRlckluZm8uZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gd3JpdGUgbGlua3MKLSAgICAgICAgZmVlZC53cml0ZVNlcnZpY2VMaW5rKGJhc2VVcmwudG9TdHJpbmcoKSwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICBmZWVkLndyaXRlU2VsZkxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9ERVNDRU5EQU5UUywgZm9sZGVySW5mby5nZXRJZCgpKSwgbnVsbCk7Ci0KLSAgICAgICAgZmVlZC53cml0ZVZpYUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgZm9sZGVySW5mby5nZXRJZCgpKSk7Ci0KLSAgICAgICAgZmVlZC53cml0ZURvd25MaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfQ0hJTERSRU4sIGZvbGRlckluZm8uZ2V0SWQoKSksIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0KLSAgICAgICAgZmVlZC53cml0ZURvd25MaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRk9MREVSVFJFRSwgZm9sZGVySW5mby5nZXRJZCgpKSwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLQotICAgICAgICBmZWVkLndyaXRlVXBMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfUEFSRU5UUywgZm9sZGVySW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIGNvbnRhaW5lciA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBpZiAoKGNvbnRhaW5lciAhPSBudWxsKSAmJiAoY29udGFpbmVyLmdldE9iamVjdCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVPYmplY3RFbnRyeShzZXJ2aWNlLCBlbnRyeSwgY29udGFpbmVyLmdldE9iamVjdCgpLmdldE9iamVjdCgpLCBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJZCwgY29udGFpbmVyLmdldE9iamVjdCgpLmdldFBhdGhTZWdtZW50KCksIG51bGwsIGJhc2VVcmwsIGZhbHNlLCBjbWlzVmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICBmZWVkLmVuZEZlZWQoKTsKLSAgICAgICAgZmVlZC5lbmRDaGlsZHJlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgYSB0eXBlIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVHlwZUVudHJ5KEF0b21FbnRyeSBlbnRyeSwgVHlwZURlZmluaXRpb24gdHlwZSwgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gY2hpbGRyZW4sCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkLCBVcmxCdWlsZGVyIGJhc2VVcmwsIGJvb2xlYW4gaXNSb290LCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gc3RhcnQKLSAgICAgICAgZW50cnkuc3RhcnRFbnRyeShpc1Jvb3QpOwotCi0gICAgICAgIC8vIHdyaXRlIHR5cGUKLSAgICAgICAgZW50cnkud3JpdGVUeXBlKHR5cGUsIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICAvLyB3cml0ZSBsaW5rcwotICAgICAgICBlbnRyeS53cml0ZVNlcnZpY2VMaW5rKGJhc2VVcmwudG9TdHJpbmcoKSwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICBlbnRyeS53cml0ZVNlbGZMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgdHlwZS5nZXRJZCgpKSwgdHlwZS5nZXRJZCgpKTsKLSAgICAgICAgZW50cnkud3JpdGVFbmNsb3N1cmVMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgdHlwZS5nZXRJZCgpKSk7Ci0gICAgICAgIGlmICh0eXBlLmdldFBhcmVudFR5cGVJZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVudHJ5LndyaXRlVXBMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgdHlwZS5nZXRQYXJlbnRUeXBlSWQoKSksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICB9Ci0gICAgICAgIFVybEJ1aWxkZXIgZG93bkxpbmsgPSBjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9UWVBFUywgbnVsbCk7Ci0gICAgICAgIGRvd25MaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZS5nZXRJZCgpKTsKLSAgICAgICAgZW50cnkud3JpdGVEb3duTGluayhkb3duTGluay50b1N0cmluZygpLCBDb25zdGFudHMuTUVESUFUWVBFX0NISUxEUkVOKTsKLSAgICAgICAgVXJsQnVpbGRlciBkb3duTGluazIgPSBjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9UWVBFU0RFU0MsIG51bGwpOwotICAgICAgICBkb3duTGluazIuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9UWVBFX0lELCB0eXBlLmdldElkKCkpOwotICAgICAgICBlbnRyeS53cml0ZURvd25MaW5rKGRvd25MaW5rMi50b1N0cmluZygpLCBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgZW50cnkud3JpdGVEZXNjcmliZWRCeUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9UWVBFLCB0eXBlLmdldEJhc2VUeXBlSWQoKS52YWx1ZSgpKSk7Ci0KLSAgICAgICAgLy8gd3JpdGUgY2hpbGRyZW4KLSAgICAgICAgaWYgKGlzTm90RW1wdHkoY2hpbGRyZW4pKSB7Ci0gICAgICAgICAgICB3cml0ZVR5cGVDaGlsZHJlbihlbnRyeSwgdHlwZSwgY2hpbGRyZW4sIHJlcG9zaXRvcnlJZCwgYmFzZVVybCwgY21pc1ZlcnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UgYXJlIGRvbmUKLSAgICAgICAgZW50cnkuZW5kRW50cnkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGEgdHlwZSBlbnRyeSBjaGlsZHJlbiBmZWVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVR5cGVDaGlsZHJlbihBdG9tRW50cnkgZW50cnksIFR5cGVEZWZpbml0aW9uIHR5cGUsIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGNoaWxkcmVuLAotICAgICAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCwgVXJsQnVpbGRlciBiYXNlVXJsLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gc3RhcnQKLSAgICAgICAgQXRvbUZlZWQgZmVlZCA9IG5ldyBBdG9tRmVlZChlbnRyeS5nZXRXcml0ZXIoKSk7Ci0gICAgICAgIGZlZWQuc3RhcnRDaGlsZHJlbigpOwotICAgICAgICBmZWVkLnN0YXJ0RmVlZChmYWxzZSk7Ci0KLSAgICAgICAgLy8gd3JpdGUgYmFzaWMgQXRvbSBmZWVkIGVsZW1lbnRzCi0gICAgICAgIGZlZWQud3JpdGVGZWVkRWxlbWVudHModHlwZS5nZXRJZCgpLCBudWxsLCBUWVBFX0FVVEhPUiwgdHlwZS5nZXREaXNwbGF5TmFtZSgpLCBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIFVybEJ1aWxkZXIgc2VsZkxpbmsgPSBjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9UWVBFU0RFU0MsIG51bGwpOwotICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgIGZlZWQud3JpdGVTZWxmTGluayhzZWxmTGluay50b1N0cmluZygpLCB0eXBlLmdldElkKCkpOwotCi0gICAgICAgIGZlZWQud3JpdGVWaWFMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgdHlwZS5nZXRJZCgpKSk7Ci0KLSAgICAgICAgVXJsQnVpbGRlciBkb3duTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTLCBudWxsKTsKLSAgICAgICAgZG93bkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9UWVBFX0lELCB0eXBlLmdldElkKCkpOwotICAgICAgICBmZWVkLndyaXRlRG93bkxpbmsoZG93bkxpbmsudG9TdHJpbmcoKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICBpZiAodHlwZS5nZXRQYXJlbnRUeXBlSWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmZWVkLndyaXRlVXBMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgdHlwZS5nZXRQYXJlbnRUeXBlSWQoKSksIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd3JpdGUgdHJlZQotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBpZiAoKGNvbnRhaW5lciAhPSBudWxsKSAmJiAoY29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVR5cGVFbnRyeShlbnRyeSwgY29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCksIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLCByZXBvc2l0b3J5SWQsIGJhc2VVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgY21pc1ZlcnNpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd3JpdGUgZXh0ZW5zaW9ucwotICAgICAgICBmZWVkLndyaXRlRXh0ZW5zaW9ucyh0eXBlKTsKLQotICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICBmZWVkLmVuZEZlZWQoKTsKLSAgICAgICAgZmVlZC5lbmRDaGlsZHJlbigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvQWNsU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BY2xTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWI1OTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BY2xTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotLyoqCi0gKiBBQ0wgU2VydmljZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgQWNsU2VydmljZSB7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFjbFNlcnZpY2VDYWxsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUFjbFhNTChBY2wgYWNsLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MVXRpbHMuY3JlYXRlV3JpdGVyKG91dCk7Ci0gICAgICAgICAgICBYTUxVdGlscy5zdGFydFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgICAgICBYTUxDb252ZXJ0ZXIud3JpdGVBY2wod3JpdGVyLCBjbWlzVmVyc2lvbiwgdHJ1ZSwgYWNsKTsKLSAgICAgICAgICAgIFhNTFV0aWxzLmVuZFhtbERvY3VtZW50KHdyaXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgQUNMLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0QWNsIGV4dGVuZHMgQWNsU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0gICAgICAgICAgICBCb29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fT05MWV9CQVNJQ19QRVJNSVNTSU9OUyk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWNsIGFjbCA9IHNlcnZpY2UuZ2V0QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG9ubHlCYXNpY1Blcm1pc3Npb25zLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhY2wgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQUNMIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0FDTCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgd3JpdGVBY2xYTUwoYWNsLCBjb250ZXh0LmdldENtaXNWZXJzaW9uKCksIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGx5IEFDTC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGx5QWNsIGV4dGVuZHMgQWNsU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24gPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BQ0xfUFJPUEFHQVRJT04sCi0gICAgICAgICAgICAgICAgICAgIEFjbFByb3BhZ2F0aW9uLmNsYXNzKTsKLQotICAgICAgICAgICAgQWNsIGFjZXMgPSBudWxsOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcnNlciA9IFhNTFV0aWxzLmNyZWF0ZVBhcnNlcihyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIFhNTFV0aWxzLmZpbmROZXh0U3RhcnRFbGVtZW5ldChwYXJzZXIpOwotICAgICAgICAgICAgICAgIGFjZXMgPSBYTUxDb252ZXJ0ZXIuY29udmVydEFjbChwYXJzZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByZXF1ZXN0ISIsIGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjbCBhY2wgPSBzZXJ2aWNlLmFwcGx5QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFjZXMsIGFjbFByb3BhZ2F0aW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhY2wgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQUNMIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfQUNMKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICB3cml0ZUFjbFhNTChhY2wsIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSwgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BdG9tRG9jdW1lbnRCYXNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL0F0b21Eb2N1bWVudEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExNDQzNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL0F0b21Eb2N1bWVudEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLQotLyoqCi0gKiBBdG9tIGJhc2UgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdG9tRG9jdW1lbnRCYXNlIGV4dGVuZHMgWE1MRG9jdW1lbnRCYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9QUkVGSVggPSAiaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0RVTU1ZID0gImh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9uby1pZCI7Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSB2YWxpZCBBdG9tIGlkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdG9tSWQoU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSURfRFVNTVk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSURfUFJFRklYICsgQmFzZTY0LmVuY29kZUJ5dGVzKElPVXRpbHMudG9VVEY4Qnl0ZXMoaW5wdXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gQXRvbSBpZCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVJZChTdHJpbmcgaWQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxVdGlscy53cml0ZShnZXRXcml0ZXIoKSwgWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sICJpZCIsIGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gQXRvbSB0aXRsZSB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVUaXRsZShTdHJpbmcgdGl0bGUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxVdGlscy53cml0ZShnZXRXcml0ZXIoKSwgWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sICJ0aXRsZSIsIHRpdGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gQXRvbSBhdXRob3IgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXV0aG9yKFN0cmluZyBhdXRob3IpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeHN3ID0gZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgeHN3LndyaXRlU3RhcnRFbGVtZW50KFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgImF1dGhvciIsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHhzdywgWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sICJuYW1lIiwgYXV0aG9yKTsKLSAgICAgICAgeHN3LndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBBdG9tIHVwZGF0ZWQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVXBkYXRlZChHcmVnb3JpYW5DYWxlbmRhciB1cGRhdGVkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUoZ2V0V3JpdGVyKCksIFhNTENvbnN0YW50cy5QUkVGSVhfQVBQLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQUCwgImVkaXRlZCIsIHVwZGF0ZWQpOwotICAgICAgICBYTUxVdGlscy53cml0ZShnZXRXcml0ZXIoKSwgWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00sICJ1cGRhdGVkIiwgdXBkYXRlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIEF0b20gdXBkYXRlZCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVVcGRhdGVkKGxvbmcgdXBkYXRlZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB1cGRhdGVkU3RyID0gRGF0ZVRpbWVIZWxwZXIuZm9ybWF0SHR0cERhdGVUaW1lKHVwZGF0ZWQpOwotICAgICAgICBYTUxVdGlscy53cml0ZShnZXRXcml0ZXIoKSwgWE1MQ29uc3RhbnRzLlBSRUZJWF9BUFAsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBQLCAiZWRpdGVkIiwgdXBkYXRlZFN0cik7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKGdldFdyaXRlcigpLCBYTUxDb25zdGFudHMuUFJFRklYX0FUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSwgInVwZGF0ZWQiLCB1cGRhdGVkU3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gQXRvbSBwdWJsaXNoZWQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHVibGlzaGVkKEdyZWdvcmlhbkNhbGVuZGFyIHB1Ymxpc2hlZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKGdldFdyaXRlcigpLCBYTUxDb25zdGFudHMuUFJFRklYX0FUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSwgInB1Ymxpc2hlZCIsIHB1Ymxpc2hlZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIEF0b20gcHVibGlzaGVkIHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVB1Ymxpc2hlZChsb25nIHB1Ymxpc2hlZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKGdldFdyaXRlcigpLCBYTUxDb25zdGFudHMuUFJFRklYX0FUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSwgInB1Ymxpc2hlZCIsCi0gICAgICAgICAgICAgICAgRGF0ZVRpbWVIZWxwZXIuZm9ybWF0SHR0cERhdGVUaW1lKHB1Ymxpc2hlZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIENNSVMgcGF0aFNlZ21lbnQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlUGF0aFNlZ21lbnQoU3RyaW5nIHBhdGhTZWdtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUoZ2V0V3JpdGVyKCksIFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sICJwYXRoU2VnbWVudCIsCi0gICAgICAgICAgICAgICAgcGF0aFNlZ21lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIENNSVMgcmVsYXRpdmVQYXRoU2VnbWVudCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVSZWxhdGl2ZVBhdGhTZWdtZW50KFN0cmluZyByZWxhdGl2ZVBhdGhTZWdtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUoZ2V0V3JpdGVyKCksIFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sCi0gICAgICAgICAgICAgICAgInJlbGF0aXZlUGF0aFNlZ21lbnQiLCByZWxhdGl2ZVBhdGhTZWdtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gQXRvbSBjb2xsZWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29sbGVjdGlvbihTdHJpbmcgaHJlZiwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlLCBTdHJpbmcgdGV4dCwgU3RyaW5nLi4uIGFjY2VwdCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeHN3ID0gZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgeHN3LndyaXRlU3RhcnRFbGVtZW50KFhNTENvbnN0YW50cy5QUkVGSVhfQVBQLCAiY29sbGVjdGlvbiIsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBQKTsKLSAgICAgICAgeHN3LndyaXRlQXR0cmlidXRlKCJocmVmIiwgaHJlZik7Ci0KLSAgICAgICAgaWYgKGNvbGxlY3Rpb25UeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhNTFV0aWxzLndyaXRlKHhzdywgWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSwgImNvbGxlY3Rpb25UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvblR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgeHN3LndyaXRlU3RhcnRFbGVtZW50KFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgInRpdGxlIiwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NKTsKLSAgICAgICAgeHN3LndyaXRlQXR0cmlidXRlKCJ0eXBlIiwgInRleHQiKTsKLSAgICAgICAgeHN3LndyaXRlQ2hhcmFjdGVycyh0ZXh0KTsKLSAgICAgICAgeHN3LndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGN0IDogYWNjZXB0KSB7Ci0gICAgICAgICAgICBYTUxVdGlscy53cml0ZSh4c3csIFhNTENvbnN0YW50cy5QUkVGSVhfQVBQLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQUCwgImFjY2VwdCIsIGN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHhzdy53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBsaW5rLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlTGluayhTdHJpbmcgcmVsLCBTdHJpbmcgaHJlZiwgU3RyaW5nIHR5cGUsIFN0cmluZyBpZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4c3cgPSBnZXRXcml0ZXIoKTsKLQotICAgICAgICB4c3cud3JpdGVTdGFydEVsZW1lbnQoWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCAibGluayIsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7Ci0KLSAgICAgICAgeHN3LndyaXRlQXR0cmlidXRlKCJyZWwiLCByZWwpOwotICAgICAgICB4c3cud3JpdGVBdHRyaWJ1dGUoImhyZWYiLCBocmVmKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgeHN3LndyaXRlQXR0cmlidXRlKCJ0eXBlIiwgdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhzdy53cml0ZUF0dHJpYnV0ZShYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCAiaWQiLCBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICB4c3cud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTZXJ2aWNlTGluayhTdHJpbmcgaHJlZiwgU3RyaW5nIHJlcG9zaXRvcnlJZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlTGluayhDb25zdGFudHMuUkVMX1NFUlZJQ0UsIGhyZWYgKyAiP3JlcG9zaXRvcnlJZD0iICsgSU9VdGlscy5lbmNvZGVVUkwocmVwb3NpdG9yeUlkKSwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX1NFUlZJQ0UsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU2VsZkxpbmsoU3RyaW5nIGhyZWYsIFN0cmluZyB0eXBlLCBTdHJpbmcgaWQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUxpbmsoQ29uc3RhbnRzLlJFTF9TRUxGLCBocmVmLCB0eXBlLCBpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmNsb3N1cmVMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfRU5DTE9TVVJFLCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVkaXRMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfRURJVCwgaHJlZiwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBbHRlcm5hdGVMaW5rKFN0cmluZyBocmVmLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGtpbmQsIFN0cmluZyB0aXRsZSwgQmlnSW50ZWdlciBsZW5ndGgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhzdyA9IGdldFdyaXRlcigpOwotCi0gICAgICAgIHhzdy53cml0ZVN0YXJ0RWxlbWVudChYTUxDb25zdGFudHMuUFJFRklYX0FUT00sICJsaW5rIiwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NKTsKLQotICAgICAgICB4c3cud3JpdGVBdHRyaWJ1dGUoInJlbCIsIENvbnN0YW50cy5SRUxfQUxURVJOQVRFKTsKLSAgICAgICAgeHN3LndyaXRlQXR0cmlidXRlKCJocmVmIiwgaHJlZik7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhzdy53cml0ZUF0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChraW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhzdy53cml0ZUF0dHJpYnV0ZShYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCAicmVuZGl0aW9uS2luZCIsIGtpbmQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4c3cud3JpdGVBdHRyaWJ1dGUoInRpdGxlIiwgdGl0bGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW5ndGggIT0gbnVsbCkgewotICAgICAgICAgICAgeHN3LndyaXRlQXR0cmlidXRlKCJsZW5ndGgiLCBsZW5ndGgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB4c3cud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVXb3JraW5nQ29weUxpbmsoU3RyaW5nIGhyZWYpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUxpbmsoQ29uc3RhbnRzLlJFTF9XT1JLSU5HQ09QWSwgaHJlZiwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVVcExpbmsoU3RyaW5nIGhyZWYsIFN0cmluZyB0eXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfVVAsIGhyZWYsIHR5cGUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRG93bkxpbmsoU3RyaW5nIGhyZWYsIFN0cmluZyB0eXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfRE9XTiwgaHJlZiwgdHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVWZXJzaW9uSGlzdG9yeUxpbmsoU3RyaW5nIGhyZWYpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUxpbmsoQ29uc3RhbnRzLlJFTF9WRVJTSU9OSElTVE9SWSwgaHJlZiwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVELCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUN1cnJlbnRWZXJpb25zTGluayhTdHJpbmcgaHJlZikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlTGluayhDb25zdGFudHMuUkVMX0NVUlJFTlRWRVJTSU9OLCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVkaXRNZWRpYUxpbmsoU3RyaW5nIGhyZWYsIFN0cmluZyB0eXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfRURJVE1FRElBLCBocmVmLCB0eXBlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZURlc2NyaWJlZEJ5TGluayhTdHJpbmcgaHJlZikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlTGluayhDb25zdGFudHMuUkVMX0RFU0NSSUJFREJZLCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUFsbG93YWJsZUFjdGlvbnNMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfQUxMT1dBQkxFQUNUSU9OUywgaHJlZiwgQ29uc3RhbnRzLk1FRElBVFlQRV9BTExPV0FCTEVBQ1RJT04sIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQWNsTGluayhTdHJpbmcgaHJlZikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlTGluayhDb25zdGFudHMuUkVMX0FDTCwgaHJlZiwgQ29uc3RhbnRzLk1FRElBVFlQRV9BQ0wsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUG9saWNpZXNMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfUE9MSUNJRVMsIGhyZWYsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVSZWxhdGlvbnNoaXBzTGluayhTdHJpbmcgaHJlZikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlTGluayhDb25zdGFudHMuUkVMX1JFTEFUSU9OU0hJUFMsIGhyZWYsIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVSZWxhdGlvbnNoaXBTb3VyY2VMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfU09VUkNFLCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJlbGF0aW9uc2hpcFRhcmdldExpbmsoU3RyaW5nIGhyZWYpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUxpbmsoQ29uc3RhbnRzLlJFTF9UQVJHRVQsIGhyZWYsIENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRm9sZGVyVHJlZUxpbmsoU3RyaW5nIGhyZWYpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUxpbmsoQ29uc3RhbnRzLlJFTF9GT0xERVJUUkVFLCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVHlwZVVwTGluayhTdHJpbmcgaHJlZiwgU3RyaW5nIHR5cGUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUxpbmsoQ29uc3RhbnRzLlJFTF9VUCwgaHJlZiwgdHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVUeXBlRG93bkxpbmsoU3RyaW5nIGhyZWYsIFN0cmluZyB0eXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfRE9XTiwgaHJlZiwgdHlwZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVWaWFMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfVklBLCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZpcnN0TGluayhTdHJpbmcgaHJlZikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlTGluayhDb25zdGFudHMuUkVMX0ZJUlNULCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTGFzdExpbmsoU3RyaW5nIGhyZWYpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUxpbmsoQ29uc3RhbnRzLlJFTF9MQVNULCBocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJldmlvdXNMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfUFJFViwgaHJlZiwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVELCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZU5leHRMaW5rKFN0cmluZyBocmVmKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVMaW5rKENvbnN0YW50cy5SRUxfTkVYVCwgaHJlZiwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVELCBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL0F0b21FbnRyeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BdG9tRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhMzAxNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL0F0b21FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mbzsKLQotLyoqCi0gKiBBdG9tIEVudHJ5IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgQXRvbUVudHJ5IGV4dGVuZHMgQXRvbURvY3VtZW50QmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BVVRIT1IgPSAidW5rbm93biI7Ci0KLSAgICAvLyBwcml2YXRlIGJvb2xlYW4gY29udGVudFRhZ0FkZGVkOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBBdG9tIGVudHJ5IGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBBdG9tRW50cnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBBdG9tIGVudHJ5IHRoYXQgaXMgZW1iZWRkZWQgc29tZXdoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBBdG9tRW50cnkoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgewotICAgICAgICBzZXRXcml0ZXIod3JpdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyB0aGUgZW50cnkgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50cnkoYm9vbGVhbiBpc1Jvb3QpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeHN3ID0gZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgeHN3LndyaXRlU3RhcnRFbGVtZW50KFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgImVudHJ5IiwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NKTsKLQotICAgICAgICBpZiAoaXNSb290KSB7Ci0gICAgICAgICAgICB4c3cud3JpdGVOYW1lc3BhY2UoWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FUT00pOwotICAgICAgICAgICAgeHN3LndyaXRlTmFtZXNwYWNlKFhNTENvbnN0YW50cy5QUkVGSVhfQ01JUywgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgICAgIHhzdy53cml0ZU5hbWVzcGFjZShYTUxDb25zdGFudHMuUFJFRklYX1JFU1RBVE9NLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NKTsKLSAgICAgICAgICAgIHhzdy53cml0ZU5hbWVzcGFjZShYTUxDb25zdGFudHMuUFJFRklYX0FQUCwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BUFApOwotCi0gICAgICAgICAgICB3cml0ZUFsbEN1c3RvbU5hbWVzcGFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29udGVudFRhZ0FkZGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBlbnRyeSB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRW50cnkoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaWYgKCFjb250ZW50VGFnQWRkZWQpIHsKLSAgICAgICAgLy8gd3JpdGVFbXB0eUNvbnRlbnQoKTsKLSAgICAgICAgLy8gfQotCi0gICAgICAgIGdldFdyaXRlcigpLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBlbnRyeSBzZWxmIGxpbmsuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVTZWxmTGluayhTdHJpbmcgaHJlZiwgU3RyaW5nIGlkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVTZWxmTGluayhocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLCBpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGFuIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZU9iamVjdChPYmplY3REYXRhIG9iamVjdCwgT2JqZWN0SW5mbyBpbmZvLCBTdHJpbmcgY29udGVudFNyYywgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHBhdGhTZWdtZW50LCBTdHJpbmcgcmVsYXRpdmVQYXRoU2VnbWVudCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlQXV0aG9yKGluZm8uZ2V0Q3JlYXRlZEJ5KCkpOwotICAgICAgICB3cml0ZUlkKGluZm8uZ2V0QXRvbUlkKCkgPT0gbnVsbCA/IGdlbmVyYXRlQXRvbUlkKGluZm8uZ2V0SWQoKSkgOiBpbmZvLmdldEF0b21JZCgpKTsKLSAgICAgICAgd3JpdGVQdWJsaXNoZWQoaW5mby5nZXRDcmVhdGlvbkRhdGUoKSk7Ci0gICAgICAgIHdyaXRlVGl0bGUoaW5mby5nZXROYW1lKCkpOwotICAgICAgICB3cml0ZVVwZGF0ZWQoaW5mby5nZXRMYXN0TW9kaWZpY2F0aW9uRGF0ZSgpKTsKLQotICAgICAgICB3cml0ZUNvbnRlbnQoY29udGVudFNyYywgY29udGVudFR5cGUpOwotCi0gICAgICAgIFhNTENvbnZlcnRlci53cml0ZU9iamVjdChnZXRXcml0ZXIoKSwgY21pc1ZlcnNpb24sIGZhbHNlLCBYTUxDb25zdGFudHMuVEFHX09CSkVDVCwKLSAgICAgICAgICAgICAgICBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCBvYmplY3QpOwotCi0gICAgICAgIHdyaXRlUGF0aFNlZ21lbnQocGF0aFNlZ21lbnQpOwotICAgICAgICB3cml0ZVJlbGF0aXZlUGF0aFNlZ21lbnQocmVsYXRpdmVQYXRoU2VnbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgZGVsZXRlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZURlbGV0ZWRPYmplY3QoT2JqZWN0RGF0YSBvYmplY3QsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIHdyaXRlQXV0aG9yKERFRkFVTFRfQVVUSE9SKTsKLSAgICAgICAgd3JpdGVJZChnZW5lcmF0ZUF0b21JZChvYmplY3QuZ2V0SWQoKSkpOwotICAgICAgICB3cml0ZVB1Ymxpc2hlZChub3cpOwotICAgICAgICB3cml0ZVRpdGxlKG9iamVjdC5nZXRJZCgpKTsKLSAgICAgICAgd3JpdGVVcGRhdGVkKG5vdyk7Ci0KLSAgICAgICAgWE1MQ29udmVydGVyLndyaXRlT2JqZWN0KGdldFdyaXRlcigpLCBjbWlzVmVyc2lvbiwgZmFsc2UsIFhNTENvbnN0YW50cy5UQUdfT0JKRUNULAotICAgICAgICAgICAgICAgIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sIG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVR5cGUoVHlwZURlZmluaXRpb24gdHlwZSwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIHdyaXRlQXV0aG9yKERFRkFVTFRfQVVUSE9SKTsKLSAgICAgICAgd3JpdGVJZChnZW5lcmF0ZUF0b21JZCh0eXBlLmdldElkKCkpKTsKLSAgICAgICAgd3JpdGVUaXRsZSh0eXBlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICB3cml0ZVVwZGF0ZWQobm93KTsKLQotICAgICAgICBYTUxDb252ZXJ0ZXIud3JpdGVUeXBlRGVmaW5pdGlvbihnZXRXcml0ZXIoKSwgY21pc1ZlcnNpb24sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sIHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGNvbnRlbnQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29udGVudChTdHJpbmcgc3JjLCBTdHJpbmcgdHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhzdyA9IGdldFdyaXRlcigpOwotICAgICAgICB4c3cud3JpdGVTdGFydEVsZW1lbnQoWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCAiY29udGVudCIsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7Ci0KLSAgICAgICAgeHN3LndyaXRlQXR0cmlidXRlKCJzcmMiLCBzcmMpOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4c3cud3JpdGVBdHRyaWJ1dGUoInR5cGUiLCB0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhzdy53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICAvLyBjb250ZW50VGFnQWRkZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhbiBlbXB0eSBjb250ZW50IHRhZyBmb3IgQXRvbSBzcGVjIGNvbXBsaWFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUNvbnRlbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhzdyA9IGdldFdyaXRlcigpOwotICAgICAgICB4c3cud3JpdGVTdGFydEVsZW1lbnQoWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCAiY29udGVudCIsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7Ci0gICAgICAgIHhzdy53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICAvLyBjb250ZW50VGFnQWRkZWQgPSB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvQXRvbUVudHJ5UGFyc2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL0F0b21FbnRyeVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JhZmUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvQXRvbUVudHJ5UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnN0cmFpbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuVGVtcFN0b3JlT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuQ2FwcGVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5UZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5OwotCi0vKioKLSAqIFBhcnNlciBmb3IgQXRvbSBFbnRyaWVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXRvbUVudHJ5UGFyc2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX1NUUkVBTV9MRU5HVEggPSAxMCAqIDEwMjQgKiAxMDI0OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19FTlRSWSA9ICJlbnRyeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19USVRMRSA9ICJ0aXRsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19PQkpFQ1QgPSAib2JqZWN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NPTlRFTlQgPSAiY29udGVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19CQVNFNjQgPSAiYmFzZTY0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX01FRElBVFlQRSA9ICJtZWRpYXR5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfRklMRU5BTUUgPSAiZmlsZW5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVFlQRSA9ICJ0eXBlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0JVTEtfVVBEQVRFID0gImJ1bGtVcGRhdGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1JDID0gInNyYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVBdG9tQ29udGVudFNyYzsKLQotICAgIHByaXZhdGUgQ2FwcGVkSW5wdXRTdHJlYW0gY2FwcGVkU3RyZWFtOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3Rvcnk7Ci0KLSAgICBwcml2YXRlIE9iamVjdERhdGEgb2JqZWN0OwotICAgIHByaXZhdGUgQ29udGVudFN0cmVhbUltcGwgYXRvbUNvbnRlbnRTdHJlYW07Ci0gICAgcHJpdmF0ZSBDb250ZW50U3RyZWFtSW1wbCBjbWlzQ29udGVudFN0cmVhbTsKLSAgICBwcml2YXRlIFR5cGVEZWZpbml0aW9uIHR5cGVEZWY7Ci0gICAgcHJpdmF0ZSBCdWxrVXBkYXRlSW1wbCBidWxrVXBkYXRlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIEF0b21FbnRyeVBhcnNlcihUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3RvcnkpIHsKLSAgICAgICAgdGhpcy5zdHJlYW1GYWN0b3J5ID0gc3RyZWFtRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGltbWVkaWF0ZWx5IHBhcnNlcyB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBBdG9tRW50cnlQYXJzZXIoSW5wdXRTdHJlYW0gc3RyZWFtLCBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3RvcnkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMoc3RyZWFtRmFjdG9yeSk7Ci0gICAgICAgIHBhcnNlKHN0cmVhbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmxhZyBjb250cm9sbGluZyB3aGV0aGVyIGF0b20gY29udGVudCBzcmMgKGV4dGVybmFsIGNvbnRlbnQpIGlzCi0gICAgICogaWdub3JlZC4gVGhpcyBmbGFnIGlzIGZhbHNlIGJ5IGRlZmF1bHQgKG5vdCBpZ25vcmVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVBdG9tQ29udGVudFNyYyhib29sZWFuIGlnbm9yZUF0b21Db250ZW50U3JjKSB7Ci0gICAgICAgIHRoaXMuaWdub3JlQXRvbUNvbnRlbnRTcmMgPSBpZ25vcmVBdG9tQ29udGVudFNyYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0KCkgewotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gKG9iamVjdCA9PSBudWxsID8gbnVsbCA6IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElkIG9mIHRoZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcygpOwotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllc01hcCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBpZiAocHJvcGVydGllc01hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA9IHByb3BlcnRpZXNNYXAuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFByb3BlcnR5SWQpIHByb3BlcnR5KS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBBQ0wgb2YgdGhlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQWNsIGdldEFjbCgpIHsKLSAgICAgICAgcmV0dXJuIChvYmplY3QgPT0gbnVsbCA/IG51bGwgOiBvYmplY3QuZ2V0QWNsKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvbGljeSBpZCBsaXN0IG9mIHRoZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQb2xpY3lJZHMoKSB7Ci0gICAgICAgIGlmICgob2JqZWN0ID09IG51bGwpIHx8IChvYmplY3QuZ2V0UG9saWN5SWRzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRQb2xpY3lJZHMoKS5nZXRQb2xpY3lJZHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gKGNtaXNDb250ZW50U3RyZWFtID09IG51bGwgPyBhdG9tQ29udGVudFN0cmVhbSA6IGNtaXNDb250ZW50U3RyZWFtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gdHlwZURlZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBidWxrIHVwZGF0ZSBkYXRhLgotICAgICAqLwotICAgIHB1YmxpYyBCdWxrVXBkYXRlSW1wbCBnZXRCdWxrVXBkYXRlKCkgewotICAgICAgICByZXR1cm4gYnVsa1VwZGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmVsZWFzZSgpOwotCi0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FwcGVkU3RyZWFtID0gbmV3IENhcHBlZElucHV0U3RyZWFtKHN0cmVhbSwgTUFYX1NUUkVBTV9MRU5HVEgpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gWE1MVXRpbHMuY3JlYXRlUGFyc2VyKGNhcHBlZFN0cmVhbSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGV2ZW50ID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChUQUdfRU5UUlkuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VFbnRyeShwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiWE1MIGlzIG5vdCBhbiBBdG9tIGVudHJ5ISIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24geHNlKSB7Ci0gICAgICAgICAgICByZWxlYXNlKCk7Ci0gICAgICAgICAgICB0aHJvdyB4c2U7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgcmVsZWFzZSgpOwotICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICByZWxlYXNlKCk7Ci0gICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBhcnNlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBvYmplY3QgPSBudWxsOwotICAgICAgICB0eXBlRGVmID0gbnVsbDsKLSAgICAgICAgYnVsa1VwZGF0ZSA9IG51bGw7Ci0gICAgICAgIGNsb3NlQXRvbUNvbnRlbnRTdHJlYW0oKTsKLSAgICAgICAgY2xvc2VDbWlzQ29udGVudFN0cmVhbSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgQXRvbSBjb250ZW50IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VBdG9tQ29udGVudFN0cmVhbSgpIHsKLSAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYXRvbUNvbnRlbnRTdHJlYW0pOwotICAgICAgICBhdG9tQ29udGVudFN0cmVhbSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBDTUlTIGNvbnRlbnQgc3RyZWFtLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbG9zZUNtaXNDb250ZW50U3RyZWFtKCkgewotICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShjbWlzQ29udGVudFN0cmVhbSk7Ci0gICAgICAgIGNtaXNDb250ZW50U3RyZWFtID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYW4gQXRvbSBlbnRyeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VFbnRyeShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhdG9tVGl0bGUgPSBudWxsOwotCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsKLQotICAgICAgICAvLyB3YWxrIHRocm91Z2ggYWxsIHRhZ3MgaW4gZW50cnkKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00uZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUQUdfT0JKRUNULmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VPYmplY3QocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfVFlQRS5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlVHlwZURlZmluaXRpb24ocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfQlVMS19VUERBVEUuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUJ1bGtVcGRhdGUocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfQ09OVEVOVC5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlQ21pc0NvbnRlbnQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLmVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX0NPTlRFTlQuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUF0b21Db250ZW50KHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1RJVExFLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXRvbVRpdGxlID0gWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3ZlcndyaXRlIGNtaXM6bmFtZSB3aXRoIEF0b20gdGl0bGUKLSAgICAgICAgaWYgKChvYmplY3QgIT0gbnVsbCkgJiYgKG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCkgJiYgKGF0b21UaXRsZSAhPSBudWxsKSAmJiAoYXRvbVRpdGxlLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nIG5hbWVQcm9wZXJ0eSA9IG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoUHJvcGVydHlJZHMuTkFNRSwgYXRvbVRpdGxlKTsKLSAgICAgICAgICAgICgoUHJvcGVydGllc0ltcGwpIG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkpLnJlcGxhY2VQcm9wZXJ0eShuYW1lUHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgQ01JUyBvYmplY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlT2JqZWN0KFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBvYmplY3QgPSBYTUxDb252ZXJ0ZXIuY29udmVydE9iamVjdChwYXJzZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIENNSVMgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VUeXBlRGVmaW5pdGlvbihYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdHlwZURlZiA9IFhNTENvbnZlcnRlci5jb252ZXJ0VHlwZURlZmluaXRpb24ocGFyc2VyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBibHVrIHVwZGF0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VCdWxrVXBkYXRlKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBidWxrVXBkYXRlID0gWE1MQ29udmVydGVyLmNvbnZlcnRCdWxrVXBkYXRlKHBhcnNlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCB0aGUgY29udGVudCBzdHJlYW0uCi0gICAgICogCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlQXRvbUNvbnRlbnQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoYXRvbUNvbnRlbnRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgY2xvc2VBdG9tQ29udGVudFN0cmVhbSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk1vcmUgdGhhbiBvbmUgY29udGVudCBwcm92aWRlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbWlzQ29udGVudFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDTUlTIGNvbnRlbnQgdGFrZXMgcHJlY2VkZW5jZSAoc2VlIENNSVMgc3BlYykKLSAgICAgICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGF0b21Db250ZW50U3RyZWFtID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0KLSAgICAgICAgLy8gcmVhZCBhdHRyaWJ1dGVzCi0gICAgICAgIFN0cmluZyB0eXBlID0gInRleHQiOwotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSAidGV4dC9wbGFpbiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgYXR0ck5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgICAgIGlmIChBVFRSX1RZUEUuZXF1YWxzKGF0dHJOYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpLnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChBVFRSX1NSQy5lcXVhbHMoYXR0ck5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlnbm9yZUF0b21Db250ZW50U3JjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0b21Db250ZW50U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2tpcChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJFeHRlcm5hbCBjb250ZW50IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gdHNvcyA9IG51bGw7Ci0gICAgICAgIGlmICh0eXBlLmVxdWFscygidGV4dCIpKSB7Ci0gICAgICAgICAgICBtaW1lVHlwZSA9ICJ0ZXh0L3BsYWluIjsKLSAgICAgICAgICAgIHRzb3MgPSByZWFkQ29udGVudEJ5dGVzKHBhcnNlciwgbWltZVR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJodG1sIikpIHsKLSAgICAgICAgICAgIG1pbWVUeXBlID0gInRleHQvaHRtbCI7Ci0gICAgICAgICAgICB0c29zID0gcmVhZENvbnRlbnRCeXRlcyhwYXJzZXIsIG1pbWVUeXBlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscygieGh0bWwiKSkgewotICAgICAgICAgICAgbWltZVR5cGUgPSAiYXBwbGljYXRpb24veGh0bWwreG1sIjsKLSAgICAgICAgICAgIHRzb3MgPSBjb3B5KHBhcnNlciwgbWltZVR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZW5kc1dpdGgoIi94bWwiKSB8fCB0eXBlLmVuZHNXaXRoKCIreG1sIikpIHsKLSAgICAgICAgICAgIG1pbWVUeXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRzb3MgPSBjb3B5KHBhcnNlciwgbWltZVR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUuc3RhcnRzV2l0aCgidGV4dC8iKSkgewotICAgICAgICAgICAgbWltZVR5cGUgPSB0eXBlOwotICAgICAgICAgICAgdHNvcyA9IHJlYWRDb250ZW50Qnl0ZXMocGFyc2VyLCBtaW1lVHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtaW1lVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0c29zID0gcmVhZEJhc2U2NChwYXJzZXIsIG1pbWVUeXBlLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF0b21Db250ZW50U3RyZWFtLnNldE1pbWVUeXBlKG1pbWVUeXBlKTsKLQotICAgICAgICBpZiAodHNvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGF0b21Db250ZW50U3RyZWFtLnNldFN0cmVhbSh0c29zLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGF0b21Db250ZW50U3RyZWFtLnNldExlbmd0aChCaWdJbnRlZ2VyLnZhbHVlT2YodHNvcy5nZXRMZW5ndGgoKSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRzb3MuZGVzdHJveShlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCB0aGUgY29udGVudCBzdHJlYW0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlQ21pc0NvbnRlbnQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBjbG9zZUF0b21Db250ZW50U3RyZWFtKCk7Ci0gICAgICAgIGlmIChjbWlzQ29udGVudFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbG9zZUNtaXNDb250ZW50U3RyZWFtKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTW9yZSB0aGFuIG9uZSBjb250ZW50IHByb3ZpZGVkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY21pc0NvbnRlbnRTdHJlYW0gPSBuZXcgQ29udGVudFN0cmVhbUltcGwoKTsKLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCB0YWdzIGluIGNvbnRlbnQKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00uZXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUQUdfTUVESUFUWVBFLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY21pc0NvbnRlbnRTdHJlYW0uc2V0TWltZVR5cGUoWE1MVXRpbHMucmVhZFRleHQocGFyc2VyLCBYTUxDb25zdHJhaW50cy5NQVhfU1RSSU5HX0xFTkdUSCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19CQVNFNjQuZXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gdHNvcyA9IHJlYWRCYXNlNjQocGFyc2VyLCBjbWlzQ29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWlzQ29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21pc0NvbnRlbnRTdHJlYW0uc2V0U3RyZWFtKHRzb3MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21pc0NvbnRlbnRTdHJlYW0uc2V0TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZih0c29zLmdldExlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvcy5kZXN0cm95KGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5za2lwKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBBQ0hFX0NIRU1JU1RSWS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRBR19GSUxFTkFNRS5lcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtaXNDb250ZW50U3RyZWFtLnNldEZpbGVOYW1lKFhNTFV0aWxzLnJlYWRUZXh0KHBhcnNlciwgWE1MQ29uc3RyYWludHMuTUFYX1NUUklOR19MRU5HVEgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnNraXAocGFyc2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIVhNTFV0aWxzLm5leHQocGFyc2VyKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgdGFnIHRoYXQgY29udGFpbnMgY29udGVudCBieXRlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFRlbXBTdG9yZU91dHB1dFN0cmVhbSByZWFkQ29udGVudEJ5dGVzKFhNTFN0cmVhbVJlYWRlciBwYXJzZXIsIFN0cmluZyBtaW1lVHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtIGJ1ZmZlclN0cmVhbSA9IHN0cmVhbUZhY3RvcnkubmV3T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGJ1ZmZlclN0cmVhbS5zZXRNaW1lVHlwZShtaW1lVHlwZSk7Ci0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBwYXJzZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3RyZWFtLndyaXRlKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHBlZFN0cmVhbS5kZWR1Y3RCeXRlcyhieXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXJTdHJlYW0uZGVzdHJveShudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGFnOiAiICsgcGFyc2VyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24geHNlKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgdGVtcCBmaWxlCi0gICAgICAgICAgICBidWZmZXJTdHJlYW0uZGVzdHJveSh4c2UpOwotICAgICAgICAgICAgdGhyb3cgeHNlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSB0ZW1wIGZpbGUKLSAgICAgICAgICAgIGJ1ZmZlclN0cmVhbS5kZXN0cm95KGlvZSk7Ci0gICAgICAgICAgICB0aHJvdyBpb2U7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlclN0cmVhbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSB0YWcgdGhhdCBjb250YWlucyBiYXNlNjQgZW5jb2RlZCBjb250ZW50LgotICAgICAqLwotICAgIHByaXZhdGUgVGVtcFN0b3JlT3V0cHV0U3RyZWFtIHJlYWRCYXNlNjQoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgU3RyaW5nIG1pbWVUeXBlLCBTdHJpbmcgZmlsZW5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbSBidWZmZXJTdHJlYW0gPSBzdHJlYW1GYWN0b3J5Lm5ld091dHB1dFN0cmVhbSgpOwotICAgICAgICBidWZmZXJTdHJlYW0uc2V0TWltZVR5cGUobWltZVR5cGUpOwotICAgICAgICBidWZmZXJTdHJlYW0uc2V0RmlsZU5hbWUoZmlsZW5hbWUpOwotICAgICAgICBCYXNlNjQuT3V0cHV0U3RyZWFtIGI2NHN0cmVhbSA9IG5ldyBCYXNlNjQuT3V0cHV0U3RyZWFtKGJ1ZmZlclN0cmVhbSwgQmFzZTY0LkRFQ09ERSk7Ci0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGludCBldmVudCA9IHBhcnNlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHBhcnNlci5nZXRUZXh0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBwYXJzZXIuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBwYXJzZXIuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBiYXNlNjQvQVNDSUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiNjRzdHJlYW0ud3JpdGUoY2hhcnNbb2Zmc2V0ICsgaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FwcGVkU3RyZWFtLmRlZHVjdEJ5dGVzKGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGI2NHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBidWZmZXJTdHJlYW0uZGVzdHJveShudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGFnOiAiICsgcGFyc2VyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiNjRzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIHhzZSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIHRlbXAgZmlsZQotICAgICAgICAgICAgYnVmZmVyU3RyZWFtLmRlc3Ryb3koeHNlKTsKLSAgICAgICAgICAgIHRocm93IHhzZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgdGVtcCBmaWxlCi0gICAgICAgICAgICBidWZmZXJTdHJlYW0uZGVzdHJveShpb2UpOwotICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MVXRpbHMubmV4dChwYXJzZXIpOwotCi0gICAgICAgIHJldHVybiBidWZmZXJTdHJlYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIGEgc3VidHJlZSBpbnRvIGEgc3RyZWFtLgotICAgICAqLwotICAgIHByaXZhdGUgVGVtcFN0b3JlT3V0cHV0U3RyZWFtIGNvcHkoWE1MU3RyZWFtUmVhZGVyIHBhcnNlciwgU3RyaW5nIG1pbWVUeXBlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIHdyaXRlcgotICAgICAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gYnVmZmVyU3RyZWFtID0gc3RyZWFtRmFjdG9yeS5uZXdPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgYnVmZmVyU3RyZWFtLnNldE1pbWVUeXBlKG1pbWVUeXBlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihidWZmZXJTdHJlYW0pOwotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIGNvcHkgc3VidHJlZQotICAgICAgICAgICAgaW50IGxldmVsID0gMTsKLSAgICAgICAgICAgIHdoaWxlIChYTUxVdGlscy5uZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlTdGFydEVsZW1lbnQocGFyc2VyLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgICAgICBsZXZlbCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwYXJzZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DT01NRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNvbW1lbnQocGFyc2VyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0RBVEEpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ0RhdGEocGFyc2VyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWwtLTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICAgICAgYnVmZmVyU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiB4c2UpIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSB0ZW1wIGZpbGUKLSAgICAgICAgICAgIGJ1ZmZlclN0cmVhbS5kZXN0cm95KHhzZSk7Ci0gICAgICAgICAgICB0aHJvdyB4c2U7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIHRlbXAgZmlsZQotICAgICAgICAgICAgYnVmZmVyU3RyZWFtLmRlc3Ryb3koaW9lKTsKLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTFV0aWxzLm5leHQocGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gYnVmZmVyU3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyBhIFhNTCBzdGFydCBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weVN0YXJ0RWxlbWVudChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHBhcnNlci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHBhcnNlci5nZXRQcmVmaXgoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHBhcnNlci5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICAvLyB3cml0ZSBzdGFydCBlbGVtZW50Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBuYW1lc3BhY2VzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyLmdldE5hbWVzcGFjZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkTmFtZXNwYWNlKHdyaXRlciwgcGFyc2VyLmdldE5hbWVzcGFjZVByZWZpeChpKSwgcGFyc2VyLmdldE5hbWVzcGFjZVVSSShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkTmFtZXNwYWNlSWZNaXNzaW5nKHdyaXRlciwgcHJlZml4LCBuYW1lc3BhY2VVcmkpOwotCi0gICAgICAgIC8vIHdyaXRlIGF0dHJpYnV0ZXMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWVzcGFjZVVyaSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0clByZWZpeCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpOwotICAgICAgICAgICAgU3RyaW5nIGF0dHJWYWx1ZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLQotICAgICAgICAgICAgaWYgKChhdHRyTmFtZXNwYWNlVXJpID09IG51bGwpIHx8IChhdHRyTmFtZXNwYWNlVXJpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGF0dHJQcmVmaXggPT0gbnVsbCkgfHwgKGF0dHJQcmVmaXgudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dHJOYW1lc3BhY2VVcmksIGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGROYW1lc3BhY2VJZk1pc3Npbmcod3JpdGVyLCBhdHRyUHJlZml4LCBhdHRyTmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0clByZWZpeCwgYXR0ck5hbWVzcGFjZVVyaSwgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHByZWZpeCBpcyBhc3NpZ25lZCB0byB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTmFtZXNwYWNlSWZNaXNzaW5nKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVcmkpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChuYW1lc3BhY2VVcmkgPT0gbnVsbCkgfHwgKG5hbWVzcGFjZVVyaS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSB3cml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldFByZWZpeGVzKG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgIGlmIChpdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHAgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICgocCAhPSBudWxsKSAmJiAocC5lcXVhbHMocHJlZml4KSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGROYW1lc3BhY2Uod3JpdGVyLCBwcmVmaXgsIG5hbWVzcGFjZVVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5hbWVzcGFjZSB0byBhIFhNTCBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTmFtZXNwYWNlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVcmkpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHdyaXRlci5zZXREZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BdG9tRmVlZC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9BdG9tRmVlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNmNDQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvQXRvbUZlZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLQotLyoqCi0gKiBBdG9tIEZlZWQgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdG9tRmVlZCBleHRlbmRzIEF0b21Eb2N1bWVudEJhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfUEFHRV9TSVpFID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIEF0b20gZmVlZCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXRvbUZlZWQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBBdG9tIGZlZWQgdGhhdCBpcyBlbWJlZGRlZCBzb21ld2hlcmUuCi0gICAgICovCi0gICAgcHVibGljIEF0b21GZWVkKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgc2V0V3JpdGVyKHdyaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3BlbnMgdGhlIGZlZWQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RmVlZChib29sZWFuIGlzUm9vdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4c3cgPSBnZXRXcml0ZXIoKTsKLQotICAgICAgICB4c3cud3JpdGVTdGFydEVsZW1lbnQoWE1MQ29uc3RhbnRzLlBSRUZJWF9BVE9NLCAiZmVlZCIsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7Ci0KLSAgICAgICAgaWYgKGlzUm9vdCkgewotICAgICAgICAgICAgeHN3LndyaXRlTmFtZXNwYWNlKFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NKTsKLSAgICAgICAgICAgIHhzdy53cml0ZU5hbWVzcGFjZShYTUxDb25zdGFudHMuUFJFRklYX0NNSVMsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQ01JUyk7Ci0gICAgICAgICAgICB4c3cud3JpdGVOYW1lc3BhY2UoWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSk7Ci0gICAgICAgICAgICB4c3cud3JpdGVOYW1lc3BhY2UoWE1MQ29uc3RhbnRzLlBSRUZJWF9BUFAsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBQKTsKLQotICAgICAgICAgICAgd3JpdGVBbGxDdXN0b21OYW1lc3BhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9wZW5zIHRoZSBjaGlsZHJlbiB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRDaGlsZHJlbigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gZ2V0V3JpdGVyKCk7Ci0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChYTUxDb25zdGFudHMuUFJFRklYX1JFU1RBVE9NLCAiY2hpbGRyZW4iLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIGZlZWQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZENoaWxkcmVuKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFdyaXRlcigpLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgZmVlZCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRmVlZCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBnZXRXcml0ZXIoKS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYW4gZmVlZCBzZWxmIGxpbmsuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVTZWxmTGluayhTdHJpbmcgaHJlZiwgU3RyaW5nIGlkKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVTZWxmTGluayhocmVmLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQsIGlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGZlZWQgZWxlbWVudHMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgQXRvbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZlZWRFbGVtZW50cyhTdHJpbmcgaWQsIFN0cmluZyBhdG9tSWQsIFN0cmluZyBhdXRob3IsIFN0cmluZyB0aXRsZSwgR3JlZ29yaWFuQ2FsZW5kYXIgdXBkYXRlZCwKLSAgICAgICAgICAgIFN0cmluZyBwYXRoU2VnbWVudCwgQmlnSW50ZWdlciBudW1JdGVtcykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQXV0aG9yKGF1dGhvcik7Ci0gICAgICAgIHdyaXRlSWQoYXRvbUlkID09IG51bGwgPyBnZW5lcmF0ZUF0b21JZChpZCkgOiBhdG9tSWQpOwotICAgICAgICB3cml0ZVRpdGxlKHRpdGxlKTsKLSAgICAgICAgd3JpdGVVcGRhdGVkKHVwZGF0ZWQpOwotICAgICAgICB3cml0ZVBhdGhTZWdtZW50KHBhdGhTZWdtZW50KTsKLSAgICAgICAgd3JpdGVOdW1JdGVtcyhudW1JdGVtcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgQ01JUyBudW1JdGVtcyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVOdW1JdGVtcyhCaWdJbnRlZ2VyIG51bUl0ZW1zKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MVXRpbHMud3JpdGUoZ2V0V3JpdGVyKCksIFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sICJudW1JdGVtcyIsIG51bUl0ZW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgcGFnaW5nIGxpbmtzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlUGFnaW5nTGlua3MoVXJsQnVpbGRlciBwYWdpbmdVcmwsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBCaWdJbnRlZ2VyIG51bUl0ZW1zLAotICAgICAgICAgICAgQm9vbGVhbiBoYXNNb3JlSXRlbXMsIEJpZ0ludGVnZXIgcGFnZVNpemUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGlmICgoc2tpcENvdW50ID09IG51bGwpIHx8IChza2lwQ291bnQuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPT0gLTEpKSB7Ci0gICAgICAgICAgICBza2lwQ291bnQgPSBCaWdJbnRlZ2VyLlpFUk87Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG1heEl0ZW1zID09IG51bGwpIHx8IChtYXhJdGVtcy5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA9PSAtMSkpIHsKLSAgICAgICAgICAgIGlmICgocGFnZVNpemUgPT0gbnVsbCkgfHwgKHBhZ2VTaXplLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID09IC0xKSkgewotICAgICAgICAgICAgICAgIG1heEl0ZW1zID0gREVGQVVMVF9QQUdFX1NJWkU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1heEl0ZW1zID0gcGFnZVNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBub3QgZmlyc3QgcGFnZSAtPiBhZGQgImZpcnN0IiBhbmQgInByZXZpb3VzIiBsaW5rCi0gICAgICAgIGlmIChza2lwQ291bnQuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPT0gMSkgewotICAgICAgICAgICAgLy8gZmlyc3QgbGluawotICAgICAgICAgICAgVXJsQnVpbGRlciBmaXJzdExpbmsgPSBuZXcgVXJsQnVpbGRlcihwYWdpbmdVcmwpOwotICAgICAgICAgICAgZmlyc3RMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgIjAiKTsKLSAgICAgICAgICAgIGZpcnN0TGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICAgICAgd3JpdGVGaXJzdExpbmsoZmlyc3RMaW5rLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyBwcmV2aW91cyBsaW5rCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHByZXZpb3VzTGluayA9IG5ldyBVcmxCdWlsZGVyKHBhZ2luZ1VybCk7Ci0gICAgICAgICAgICBwcmV2aW91c0xpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCBza2lwQ291bnQuc3VidHJhY3QobWF4SXRlbXMpLm1heChCaWdJbnRlZ2VyLlpFUk8pKTsKLSAgICAgICAgICAgIHByZXZpb3VzTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICAgICAgd3JpdGVQcmV2aW91c0xpbmsocHJldmlvdXNMaW5rLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgaGFzIG1vcmUgLT4gYWRkICJuZXh0IiBsaW5rCi0gICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGhhc01vcmVJdGVtcykpIHsKLSAgICAgICAgICAgIC8vIG5leHQgbGluawotICAgICAgICAgICAgVXJsQnVpbGRlciBuZXh0TGluayA9IG5ldyBVcmxCdWlsZGVyKHBhZ2luZ1VybCk7Ci0gICAgICAgICAgICBuZXh0TGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudC5hZGQobWF4SXRlbXMpKTsKLSAgICAgICAgICAgIG5leHRMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgICAgICB3cml0ZU5leHRMaW5rKG5leHRMaW5rLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm90IGxhc3QgcGFnZSAtPiBhZGQgImxhc3QiIGxpbmsKLSAgICAgICAgaWYgKChudW1JdGVtcyAhPSBudWxsKSAmJiAobnVtSXRlbXMuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPT0gMSkpIHsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbGFzdFNraXAgPSBudW1JdGVtcy5zdWJ0cmFjdChtYXhJdGVtcykubWF4KEJpZ0ludGVnZXIuWkVSTyk7Ci0gICAgICAgICAgICBpZiAobGFzdFNraXAuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPT0gMSkgewotICAgICAgICAgICAgICAgIC8vIGxhc3QgbGluawotICAgICAgICAgICAgICAgIFVybEJ1aWxkZXIgbGFzdExpbmsgPSBuZXcgVXJsQnVpbGRlcihwYWdpbmdVcmwpOwotICAgICAgICAgICAgICAgIGxhc3RMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgbGFzdFNraXApOwotICAgICAgICAgICAgICAgIGxhc3RMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgICAgICAgICAgd3JpdGVMYXN0TGluayhsYXN0TGluay50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBleHRlbnNpb25zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlRXh0ZW5zaW9ucyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb25zKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MQ29udmVydGVyLndyaXRlRXh0ZW5zaW9ucyhnZXRXcml0ZXIoKSwgZXh0ZW5zaW9ucyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9DbWlzQXRvbVB1YlNlcnZsZXQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvQ21pc0F0b21QdWJTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzhiNjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9DbWlzQXRvbVB1YlNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsLlJFU09VUkNFX0FDTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5SRVNPVVJDRV9BTExPV0FCTEVBQ0lPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfQlVMS19VUERBVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfQ0hBTkdFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5SRVNPVVJDRV9DSEVDS0VET1VUOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsLlJFU09VUkNFX0NISUxEUkVOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsLlJFU09VUkNFX0NPTlRFTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfREVTQ0VOREFOVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfRU5UUlk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfRk9MREVSVFJFRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5SRVNPVVJDRV9PQkpFQ1RCWUlEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsLlJFU09VUkNFX09CSkVDVEJZUEFUSDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5SRVNPVVJDRV9QQVJFTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfUEFSRU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5SRVNPVVJDRV9QT0xJQ0lFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5SRVNPVVJDRV9RVUVSWTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1Yi5BYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbC5SRVNPVVJDRV9SRUxBVElPTlNISVBTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsLlJFU09VUkNFX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfVFlQRVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfVFlQRVNERVNDOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsLlJFU09VUkNFX1VORklMRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwuUkVTT1VSQ0VfVkVSU0lPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuRGlzcGF0Y2hlci5NRVRIT0RfREVMRVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkRpc3BhdGNoZXIuTUVUSE9EX0dFVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5EaXNwYXRjaGVyLk1FVEhPRF9IRUFEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkRpc3BhdGNoZXIuTUVUSE9EX1BPU1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuRGlzcGF0Y2hlci5NRVRIT0RfUFVUOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNGaWx0ZXJOb3RWYWxpZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1NlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1ZlcnNpb25pbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuU2VydmVyVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkFic3RyYWN0Q21pc0h0dHBTZXJ2bGV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkV4Y2VwdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkhFQURIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuSHR0cFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuTm9Cb2R5SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5RdWVyeVN0cmluZ0h0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5TZXJ2aWNlQ2FsbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nRXNjYXBlVXRpbHM7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBDTUlTIEF0b21QdWIgc2VydmxldC4KLSAqLwotcHVibGljIGNsYXNzIENtaXNBdG9tUHViU2VydmxldCBleHRlbmRzIEFic3RyYWN0Q21pc0h0dHBTZXJ2bGV0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDbWlzQXRvbVB1YlNlcnZsZXQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGJpbmRpbmcKLSAgICAgICAgc2V0QmluZGluZyhDYWxsQ29udGV4dC5CSU5ESU5HX0FUT01QVUIpOwotCi0gICAgICAgIC8vIGdldCBhbmQgQ01JUyB2ZXJzaW9uCi0gICAgICAgIFN0cmluZyBjbWlzVmVyc2lvblN0ciA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKFBBUkFNX0NNSVNfVkVSU0lPTik7Ci0gICAgICAgIGlmIChjbWlzVmVyc2lvblN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldENtaXNWZXJzaW9uKENtaXNWZXJzaW9uLmZyb21WYWx1ZShjbWlzVmVyc2lvblN0cikpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiQ01JUyB2ZXJzaW9uIGlzIGludmFsaWQhIFNldHRpbmcgaXQgdG8gQ01JUyAxLjAuIik7Ci0gICAgICAgICAgICAgICAgc2V0Q21pc1ZlcnNpb24oQ21pc1ZlcnNpb24uQ01JU18xXzApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HLndhcm4oIkNNSVMgdmVyc2lvbiBpcyBub3QgZGVmaW5lZCEgU2V0dGluZyBpdCB0byBDTUlTIDEuMC4iKTsKLSAgICAgICAgICAgIHNldENtaXNWZXJzaW9uKENtaXNWZXJzaW9uLkNNSVNfMV8wKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2VzCi0gICAgICAgIGFkZFJlc291cmNlKCIiLCBNRVRIT0RfR0VULCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuR2V0UmVwb3NpdG9yaWVzKCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9UWVBFUywgTUVUSE9EX0dFVCwgbmV3IFJlcG9zaXRvcnlTZXJ2aWNlLkdldFR5cGVDaGlsZHJlbigpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfVFlQRVMsIE1FVEhPRF9QT1NULCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuQ3JlYXRlVHlwZSgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfVFlQRVNERVNDLCBNRVRIT0RfR0VULCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuR2V0VHlwZURlc2NlbmRhbnRzKCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9UWVBFLCBNRVRIT0RfR0VULCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuR2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX1RZUEUsIE1FVEhPRF9QVVQsIG5ldyBSZXBvc2l0b3J5U2VydmljZS5VcGRhdGVUeXBlKCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9UWVBFLCBNRVRIT0RfREVMRVRFLCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuRGVsZXRlVHlwZSgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfQ0hJTERSRU4sIE1FVEhPRF9HRVQsIG5ldyBOYXZpZ2F0aW9uU2VydmljZS5HZXRDaGlsZHJlbigpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfREVTQ0VOREFOVFMsIE1FVEhPRF9HRVQsIG5ldyBOYXZpZ2F0aW9uU2VydmljZS5HZXREZXNjZW5kYW50cygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfRk9MREVSVFJFRSwgTUVUSE9EX0dFVCwgbmV3IE5hdmlnYXRpb25TZXJ2aWNlLkdldEZvbGRlclRyZWUoKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX1BBUkVOVCwgTUVUSE9EX0dFVCwgbmV3IE5hdmlnYXRpb25TZXJ2aWNlLkdldEZvbGRlclBhcmVudCgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfUEFSRU5UUywgTUVUSE9EX0dFVCwgbmV3IE5hdmlnYXRpb25TZXJ2aWNlLkdldE9iamVjdFBhcmVudHMoKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX0NIRUNLRURPVVQsIE1FVEhPRF9HRVQsIG5ldyBOYXZpZ2F0aW9uU2VydmljZS5HZXRDaGVja2VkT3V0RG9jcygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfRU5UUlksIE1FVEhPRF9HRVQsIG5ldyBPYmplY3RTZXJ2aWNlLkdldE9iamVjdCgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfT0JKRUNUQllJRCwgTUVUSE9EX0dFVCwgbmV3IE9iamVjdFNlcnZpY2UuR2V0T2JqZWN0KCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9PQkpFQ1RCWVBBVEgsIE1FVEhPRF9HRVQsIG5ldyBPYmplY3RTZXJ2aWNlLkdldE9iamVjdEJ5UGF0aCgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfQUxMT1dBQkxFQUNJT05TLCBNRVRIT0RfR0VULCBuZXcgT2JqZWN0U2VydmljZS5HZXRBbGxvd2FibGVBY3Rpb25zKCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9DT05URU5ULCBNRVRIT0RfR0VULCBuZXcgT2JqZWN0U2VydmljZS5HZXRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9DT05URU5ULCBNRVRIT0RfUFVULCBuZXcgT2JqZWN0U2VydmljZS5TZXRPckFwcGVuZENvbnRlbnRTdHJlYW0oKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX0NPTlRFTlQsIE1FVEhPRF9ERUxFVEUsIG5ldyBPYmplY3RTZXJ2aWNlLkRlbGV0ZUNvbnRlbnRTdHJlYW0oKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX0NISUxEUkVOLCBNRVRIT0RfUE9TVCwgbmV3IE9iamVjdFNlcnZpY2UuQ3JlYXRlKCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9SRUxBVElPTlNISVBTLCBNRVRIT0RfUE9TVCwgbmV3IE9iamVjdFNlcnZpY2UuQ3JlYXRlUmVsYXRpb25zaGlwKCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9FTlRSWSwgTUVUSE9EX1BVVCwgbmV3IE9iamVjdFNlcnZpY2UuVXBkYXRlUHJvcGVydGllcygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfRU5UUlksIE1FVEhPRF9ERUxFVEUsIG5ldyBPYmplY3RTZXJ2aWNlLkRlbGV0ZU9iamVjdCgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfQ0hJTERSRU4sIE1FVEhPRF9ERUxFVEUsIG5ldyBPYmplY3RTZXJ2aWNlLkRlbGV0ZVRyZWUoKSk7IC8vIDEuMQotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9ERVNDRU5EQU5UUywgTUVUSE9EX0RFTEVURSwgbmV3IE9iamVjdFNlcnZpY2UuRGVsZXRlVHJlZSgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfRk9MREVSVFJFRSwgTUVUSE9EX0RFTEVURSwgbmV3IE9iamVjdFNlcnZpY2UuRGVsZXRlVHJlZSgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfQlVMS19VUERBVEUsIE1FVEhPRF9QT1NULCBuZXcgT2JqZWN0U2VydmljZS5CdWxrVXBkYXRlUHJvcGVydGllcygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfQ0hFQ0tFRE9VVCwgTUVUSE9EX1BPU1QsIG5ldyBWZXJzaW9uaW5nU2VydmljZS5DaGVja091dCgpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfVkVSU0lPTlMsIE1FVEhPRF9HRVQsIG5ldyBWZXJzaW9uaW5nU2VydmljZS5HZXRBbGxWZXJzaW9ucygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfVkVSU0lPTlMsIE1FVEhPRF9ERUxFVEUsIG5ldyBWZXJzaW9uaW5nU2VydmljZS5EZWxldGVBbGxWZXJzaW9ucygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfUVVFUlksIE1FVEhPRF9HRVQsIG5ldyBEaXNjb3ZlcnlTZXJ2aWNlLlF1ZXJ5KCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9RVUVSWSwgTUVUSE9EX1BPU1QsIG5ldyBEaXNjb3ZlcnlTZXJ2aWNlLlF1ZXJ5KCkpOwotICAgICAgICBhZGRSZXNvdXJjZShSRVNPVVJDRV9DSEFOR0VTLCBNRVRIT0RfR0VULCBuZXcgRGlzY292ZXJ5U2VydmljZS5HZXRDb250ZW50Q2hhbmdlcygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfUkVMQVRJT05TSElQUywgTUVUSE9EX0dFVCwgbmV3IFJlbGF0aW9uc2hpcFNlcnZpY2UuR2V0T2JqZWN0UmVsYXRpb25zaGlwcygpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfVU5GSUxFRCwgTUVUSE9EX1BPU1QsIG5ldyBNdWx0aUZpbGluZ1NlcnZpY2UuUmVtb3ZlT2JqZWN0RnJvbUZvbGRlcigpKTsKLSAgICAgICAgYWRkUmVzb3VyY2UoUkVTT1VSQ0VfQUNMLCBNRVRIT0RfR0VULCBuZXcgQWNsU2VydmljZS5HZXRBY2woKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX0FDTCwgTUVUSE9EX1BVVCwgbmV3IEFjbFNlcnZpY2UuQXBwbHlBY2woKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX1BPTElDSUVTLCBNRVRIT0RfR0VULCBuZXcgUG9saWN5U2VydmljZS5HZXRBcHBsaWVkUG9saWNpZXMoKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX1BPTElDSUVTLCBNRVRIT0RfUE9TVCwgbmV3IFBvbGljeVNlcnZpY2UuQXBwbHlQb2xpY3koKSk7Ci0gICAgICAgIGFkZFJlc291cmNlKFJFU09VUkNFX1BPTElDSUVTLCBNRVRIT0RfREVMRVRFLCBuZXcgUG9saWN5U2VydmljZS5SZW1vdmVQb2xpY3koKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ2FsbENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzcGxpdCBwYXRoCi0gICAgICAgICAgICBTdHJpbmdbXSBwYXRoRnJhZ21lbnRzID0gSHR0cFV0aWxzLnNwbGl0UGF0aChyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIHN0cmVhbSBmYWN0b3J5Ci0gICAgICAgICAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3RveSA9IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UoZ2V0U2VydmljZUZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgcGF0aEZyYWdtZW50cy5sZW5ndGggPiAwID8gcGF0aEZyYWdtZW50c1swXSA6IG51bGwpOwotCi0gICAgICAgICAgICAvLyB0cmVhdCBIRUFEIHJlcXVlc3RzCi0gICAgICAgICAgICBpZiAoTUVUSE9EX0hFQUQuZXF1YWxzKHJlcXVlc3QuZ2V0TWV0aG9kKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBIRUFESHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IG5ldyBOb0JvZHlIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcihyZXNwb25zZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgUXVlcnlTdHJpbmdIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAicHJpdmF0ZSwgbWF4LWFnZT0wIik7Ci0gICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIlNlcnZlciIsIFNlcnZlclZlcnNpb24uT1BFTkNNSVNfU0VSVkVSKTsKLQotICAgICAgICAgICAgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQoZ2V0U2VydmxldENvbnRleHQoKSwgcmVxdWVzdCwgcmVzcG9uc2UsIHN0cmVhbUZhY3RveSk7Ci0gICAgICAgICAgICBkaXNwYXRjaChjb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSwgcGF0aEZyYWdtZW50cyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIENtaXNVbmF1dGhvcml6ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAiQmFzaWMgcmVhbG09XCJDTUlTXCIsIGNoYXJzZXQ9XCJVVEYtOFwiIik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVELCAiQXV0aG9yaXphdGlvbiBSZXF1aXJlZCIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbnRleHQgPT0gbnVsbCkgfHwgKGNvbnRleHQuZ2V0VXNlcm5hbWUoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAiQmFzaWMgcmVhbG09XCJDTUlTXCIsIGNoYXJzZXQ9XCJVVEYtOFwiIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRCwgIkF1dGhvcml6YXRpb24gUmVxdWlyZWQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoZ2V0RXJyb3JDb2RlKChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbikgZSksIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZSwgcmVzcG9uc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gd2UgYXJlIGRvbmUuCi0gICAgICAgICAgICByZXNwb25zZS5mbHVzaEJ1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbmV3IHJlc291cmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGh0dHBNZXRob2QsIFNlcnZpY2VDYWxsIHNlcnZpY2VDYWxsKSB7Ci0gICAgICAgIGRpc3BhdGNoZXIuYWRkUmVzb3VyY2UocmVzb3VyY2UsIGh0dHBNZXRob2QsIHNlcnZpY2VDYWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNwYXRjaGVzIHRvIGZlZWQsIGVudHJ5IG9yIHdoYXRldmVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNwYXRjaChDYWxsQ29udGV4dCBjb250ZXh0LCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhdGhGcmFnbWVudHMpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZUZhY3RvcnkoKS5nZXRTZXJ2aWNlKGNvbnRleHQpOwotCi0gICAgICAgICAgICAvLyBhbmFseXplIHRoZSBwYXRoCi0gICAgICAgICAgICBpZiAocGF0aEZyYWdtZW50cy5sZW5ndGggPCAyKSB7Ci0gICAgICAgICAgICAgICAgLy8gcm9vdCAtPiBzZXJ2aWNlIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hlci5kaXNwYXRjaCgiIiwgTUVUSE9EX0dFVCwgY29udGV4dCwgc2VydmljZSwgbnVsbCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gcGF0aEZyYWdtZW50c1swXTsKLSAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZSA9IHBhdGhGcmFnbWVudHNbMV07Ci0KLSAgICAgICAgICAgIC8vIGRpc3BhdGNoCi0gICAgICAgICAgICBib29sZWFuIGNhbGxTZXJ2aWNlRm91bmQgPSBkaXNwYXRjaGVyLmRpc3BhdGNoKHJlc291cmNlLCBtZXRob2QsIGNvbnRleHQsIHNlcnZpY2UsIHJlcG9zaXRvcnlJZCwgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgZGlzcGF0Y2hlciBjb3VsZG4ndCBmaW5kIGEgbWF0Y2hpbmcgc2VydmljZQotICAgICAgICAgICAgLy8gLT4gcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgIGlmICghY2FsbFNlcnZpY2VGb3VuZCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX01FVEhPRF9OT1RfQUxMT1dFRCwgIlVua25vd24gb3BlcmF0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyBhbiBleGNlcHRpb24gaW4gYW4gYXBwcm9wcmlhdGUgSFRUUCBlcnJvciBjb2RlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0RXJyb3JDb2RlKENtaXNCYXNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gNDA5OwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gNDA5OwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gNDAwOwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIDQwMDsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIDQwOTsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiA0MDU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiA0MDQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIDQwMzsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNTdG9yYWdlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gNTAwOwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIDQwMzsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIDQwOTsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gNDA5OwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1NlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIDUwMzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiA1MDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIHRoZSBlcnJvciBIVE1MIHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRFcnJvcihFeGNlcHRpb24gZXgsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgaW50IHN0YXR1c0NvZGUgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk5hbWUgPSAicnVudGltZSI7Ci0KLSAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1J1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIExPRy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNTdG9yYWdlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICBzdGF0dXNDb2RlID0gZ2V0RXJyb3JDb2RlKChDbWlzU3RvcmFnZUV4Y2VwdGlvbikgZXgpOwotICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9ICgoQ21pc1N0b3JhZ2VFeGNlcHRpb24pIGV4KS5nZXRFeGNlcHRpb25OYW1lKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzQmFzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgc3RhdHVzQ29kZSA9IGdldEVycm9yQ29kZSgoQ21pc0Jhc2VFeGNlcHRpb24pIGV4KTsKLSAgICAgICAgICAgIGV4Y2VwdGlvbk5hbWUgPSAoKENtaXNCYXNlRXhjZXB0aW9uKSBleCkuZ2V0RXhjZXB0aW9uTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikgewotICAgICAgICAgICAgICAgIExPRy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBMT0cud2FybihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXNwb25zZS5pc0NvbW1pdHRlZCgpKSB7Ci0gICAgICAgICAgICBMT0cud2FybigiRmFpbGVkIHRvIHNlbmQgZXJyb3IgbWVzc2FnZSB0byBjbGllbnQuIFJlc3BvbnNlIGlzIGFscmVhZHkgY29tbWl0dGVkLiIsIGV4KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIENtaXNCYXNlRXhjZXB0aW9uKSkgewotICAgICAgICAgICAgbWVzc2FnZSA9ICJBbiBlcnJvciBvY2N1cnJlZCEiOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3BvbnNlLnJlc2V0QnVmZmVyKCk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoc3RhdHVzQ29kZSk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhJT1V0aWxzLlVURjgpOwotCi0gICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotCi0gICAgICAgICAgICBwdy5wcmludCgiPGh0bWw+PGhlYWQ+PHRpdGxlPkFwYWNoZSBDaGVtaXN0cnkgT3BlbkNNSVMgLSAiCi0gICAgICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uTmFtZQotICAgICAgICAgICAgICAgICAgICArICIgZXJyb3I8L3RpdGxlPiIKLSAgICAgICAgICAgICAgICAgICAgKyAiPHN0eWxlPjwhLS1IMSB7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7YmFja2dyb3VuZC1jb2xvcjojZjBmMGYwO2NvbG9yOiMwMDMzNjY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzNjNzhiNTtwYWRkaW5nOjJweDt9ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiQk9EWSB7Zm9udC1mYW1pbHk6VmVyZGFuYSxhcmlhbCxzYW5zLXNlcmlmO2NvbG9yOmJsYWNrO2ZvbnQtc2l6ZToxNHB4O30gIgotICAgICAgICAgICAgICAgICAgICArICJIUiB7Y29sb3I6IzNjNzhiNTtoZWlnaHQ6MXB4O30tLT48L3N0eWxlPjwvaGVhZD48Ym9keT4iKTsKLSAgICAgICAgICAgIHB3LnByaW50KCI8aDE+SFRUUCBTdGF0dXMgIiArIHN0YXR1c0NvZGUgKyAiIC0gPCEtLWV4Y2VwdGlvbi0tPiIgKyBleGNlcHRpb25OYW1lICsgIjwhLS0vZXhjZXB0aW9uLS0+PC9oMT4iKTsKLSAgICAgICAgICAgIHB3LnByaW50KCI8cD48IS0tbWVzc2FnZS0tPiIgKyBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVIdG1sKG1lc3NhZ2UpICsgIjwhLS0vbWVzc2FnZS0tPjwvcD4iKTsKLQotICAgICAgICAgICAgU3RyaW5nIHN0ID0gRXhjZXB0aW9uSGVscGVyLmdldFN0YWNrdHJhY2VBc1N0cmluZyhleCk7Ci0gICAgICAgICAgICBpZiAoc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB3LnByaW50KCI8aHIgbm9zaGFkZT0nbm9zaGFkZScvPjwhLS1zdGFja3RyYWNlLS0+PHByZT5cbiIgKyBzdAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG48L3ByZT48IS0tL3N0YWNrdHJhY2UtLT48aHIgbm9zaGFkZT0nbm9zaGFkZScvPiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdy5wcmludCgiPC9ib2R5PjwvaHRtbD4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihzdGF0dXNDb2RlLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlbikgewotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvRGlzY292ZXJ5U2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9EaXNjb3ZlcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2U4NjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9EaXNjb3ZlcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlF1ZXJ5VHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuRGlzcGF0Y2hlcjsKLQotLyoqCi0gKiBEaXNjb3ZlcnkgU2VydmljZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgRGlzY292ZXJ5U2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zID0gbnVsbDsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBudWxsOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9IG51bGw7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zID0gbnVsbDsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgc2tpcENvdW50ID0gbnVsbDsKLQotICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSAwOwotCi0gICAgICAgICAgICBpZiAoRGlzcGF0Y2hlci5NRVRIT0RfUE9TVC5lcXVhbHMocmVxdWVzdC5nZXRNZXRob2QoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBQT1NUIC0+IHJlYWQgZnJvbSBzdHJlYW0KLQotICAgICAgICAgICAgICAgIFF1ZXJ5VHlwZUltcGwgcXVlcnlUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBYTUxVdGlscy5jcmVhdGVQYXJzZXIocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuZmluZE5leHRTdGFydEVsZW1lbmV0KHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VHlwZSA9IFhNTENvbnZlcnRlci5jb252ZXJ0UXVlcnkocGFyc2VyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBxdWVyeSByZXF1ZXN0ISIsIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3RhdGVtZW50ID0gcXVlcnlUeXBlLmdldFN0YXRlbWVudCgpOwotICAgICAgICAgICAgICAgIHNlYXJjaEFsbFZlcnNpb25zID0gcXVlcnlUeXBlLmdldFNlYXJjaEFsbFZlcnNpb25zKCk7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBxdWVyeVR5cGUuZ2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcyA9IHF1ZXJ5VHlwZS5nZXRJbmNsdWRlUmVsYXRpb25zaGlwcygpOwotICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciA9IHF1ZXJ5VHlwZS5nZXRSZW5kaXRpb25GaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICBtYXhJdGVtcyA9IHF1ZXJ5VHlwZS5nZXRNYXhJdGVtcygpOwotICAgICAgICAgICAgICAgIHNraXBDb3VudCA9IHF1ZXJ5VHlwZS5nZXRTa2lwQ291bnQoKTsKLQotICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKERpc3BhdGNoZXIuTUVUSE9EX0dFVC5lcXVhbHMocmVxdWVzdC5nZXRNZXRob2QoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBHRVQgLT4gcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUSk7Ci0gICAgICAgICAgICAgICAgc2VhcmNoQWxsVmVyc2lvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TRUFSQ0hfQUxMX1ZFUlNJT05TKTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TKTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcyA9IGdldEVudW1QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgLy8gc2luY2UgQ01JUyAxLjEKLSAgICAgICAgICAgICAgICByZW5kaXRpb25GaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIpOwotICAgICAgICAgICAgICAgIG1heEl0ZW1zID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TKTsKLSAgICAgICAgICAgICAgICBza2lwQ291bnQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5UKTsKLQotICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgSFRUUCBtZXRob2QhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0TGlzdCByZXN1bHRzID0gc2VydmljZS5xdWVyeShyZXBvc2l0b3J5SWQsIHN0YXRlbWVudCwgc2VhcmNoQWxsVmVyc2lvbnMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlJlc3VsdHMgYXJlIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHBhZ2luZ1VybCA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1FVRVJZLCBudWxsKTsKLSAgICAgICAgICAgIHBhZ2luZ1VybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1EsIHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TRUFSQ0hfQUxMX1ZFUlNJT05TLCBzZWFyY2hBbGxWZXJzaW9ucyk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICAgICAgcGFnaW5nVXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGxvY2F0aW9uID0gbmV3IFVybEJ1aWxkZXIocGFnaW5nVXJsKTsKLSAgICAgICAgICAgIGxvY2F0aW9uLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgICAgICBsb2NhdGlvbi5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhzdGF0dXNDb2RlKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBDb250ZW50LUxvY2F0aW9uIGhlYWRlciBpcyBvcHRpb25hbCAoQ01JUyBzcGVjaWZpY2F0aW9uCi0gICAgICAgICAgICAvLyAzLjcuMi4xKS4KLSAgICAgICAgICAgIC8vIFNpbmNlIGl0IGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIGxvbmcgcXVlcnkgc3RhdGVtZW50cyBpdCBpcwotICAgICAgICAgICAgLy8gZGVhY3RpdmF0ZWQuCi0gICAgICAgICAgICAvLyByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtTG9jYXRpb24iLCBsb2NhdGlvbi50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gVGhlIExvY2F0aW9uIGhlYWRlciBpcyBub3Qgb3B0aW9uYWwgKENNSVMgc3BlY2lmaWNhdGlvbiAzLjcuMi4xKS4KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiTG9jYXRpb24iLCBsb2NhdGlvbi50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgZmVlZC5zdGFydEZlZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGJhc2ljIEF0b20gZmVlZCBlbGVtZW50cwotICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbm93ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlRmVlZEVsZW1lbnRzKCJxdWVyeSIsIG51bGwsICIiLCAiUXVlcnkiLCBub3csIG51bGwsIHJlc3VsdHMuZ2V0TnVtSXRlbXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlUGFnaW5nTGlua3MocGFnaW5nVXJsLCBtYXhJdGVtcywgc2tpcENvdW50LCByZXN1bHRzLmdldE51bUl0ZW1zKCksIHJlc3VsdHMuaGFzTW9yZUl0ZW1zKCksCi0gICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRSk7Ci0KLSAgICAgICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gY29udGV4dC5nZXRDbWlzVmVyc2lvbigpOwotICAgICAgICAgICAgaWYgKHJlc3VsdHMuZ2V0T2JqZWN0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KGZlZWQuZ2V0V3JpdGVyKCkpOwotICAgICAgICAgICAgICAgIGludCBpZENvdW50ZXIgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0RGF0YSByZXN1bHQgOiByZXN1bHRzLmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlkQ291bnRlcisrOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVF1ZXJ5UmVzdWx0RW50cnkoZW50cnksIHJlc3VsdCwgImlkLSIgKyBpZENvdW50ZXIsIG5vdywgY21pc1ZlcnNpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgZXh0ZW5zaW9ucwotICAgICAgICAgICAgZmVlZC53cml0ZUV4dGVuc2lvbnMocmVzdWx0cyk7Ci0KLSAgICAgICAgICAgIC8vIHdlIGFyZSBkb25lCi0gICAgICAgICAgICBmZWVkLmVuZEZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVF1ZXJ5UmVzdWx0RW50cnkoQXRvbUVudHJ5IGVudHJ5LCBPYmplY3REYXRhIHJlc3VsdCwgU3RyaW5nIGlkLCBHcmVnb3JpYW5DYWxlbmRhciBub3csCi0gICAgICAgICAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzdGFydAotICAgICAgICAgICAgZW50cnkuc3RhcnRFbnRyeShmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIEF0b20gYmFzZSB0YWdzCi0gICAgICAgICAgICBlbnRyeS53cml0ZUF1dGhvcigiIik7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZUlkKGVudHJ5LmdlbmVyYXRlQXRvbUlkKGlkKSk7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZVB1Ymxpc2hlZChub3cpOwotICAgICAgICAgICAgZW50cnkud3JpdGVUaXRsZSgiUXVlcnkgUmVzdWx0ICIgKyBpZCk7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZVVwZGF0ZWQobm93KTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgcXVlcnkgcmVzdWx0IG9iamVjdAotICAgICAgICAgICAgWE1MQ29udmVydGVyLndyaXRlT2JqZWN0KGVudHJ5LmdldFdyaXRlcigpLCBjbWlzVmVyc2lvbiwgZmFsc2UsIFhNTENvbnN0YW50cy5UQUdfT0JKRUNULAotICAgICAgICAgICAgICAgICAgICBYTUxDb25zdGFudHMuTkFNRVNQQUNFX1JFU1RBVE9NLCByZXN1bHQpOwotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZW50cnkuZW5kRW50cnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBjb250ZW50IGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRDb250ZW50Q2hhbmdlcyBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VMb2dUb2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQ0hBTkdFX0xPR19UT0tFTik7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUFJPUEVSVElFUyk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUE9MSUNZX0lEUyk7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBY2wgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BQ0wpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcyA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUyk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlTG9nVG9rZW5Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlTG9nVG9rZW4pOwotICAgICAgICAgICAgT2JqZWN0TGlzdCBjaGFuZ2VzID0gc2VydmljZS5nZXRDb250ZW50Q2hhbmdlcyhyZXBvc2l0b3J5SWQsIGNoYW5nZUxvZ1Rva2VuSG9sZGVyLCBpbmNsdWRlUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBtYXhJdGVtcywgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hhbmdlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDaGFuZ2VzIGFyZSBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgZmVlZC5zdGFydEZlZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGJhc2ljIEF0b20gZmVlZCBlbGVtZW50cwotICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbm93ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlRmVlZEVsZW1lbnRzKCJjb250ZW50Q2hhbmdlcyIsIG51bGwsICIiLCAiQ29udGVudCBDaGFuZ2UiLCBub3csIG51bGwsIGNoYW5nZXMuZ2V0TnVtSXRlbXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHNlbGZMaW5rID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfQ0hBTkdFUywgbnVsbCk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0NIQU5HRV9MT0dfVE9LRU4sIGNoYW5nZUxvZ1Rva2VuKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUFJPUEVSVElFUywgaW5jbHVkZVByb3BlcnRpZXMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMsIGluY2x1ZGVQb2xpY3lJZHMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BQ0wsIGluY2x1ZGVBY2wpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMsIG1heEl0ZW1zKTsKLSAgICAgICAgICAgIGZlZWQud3JpdGVTZWxmTGluayhzZWxmTGluay50b1N0cmluZygpLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKGNoYW5nZUxvZ1Rva2VuSG9sZGVyLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNoYW5nZXMuaGFzTW9yZUl0ZW1zKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVybEJ1aWxkZXIgbmV4dExpbmsgPSBjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9DSEFOR0VTLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DSEFOR0VfTE9HX1RPS0VOLCBjaGFuZ2VMb2dUb2tlbkhvbGRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dExpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QUk9QRVJUSUVTLCBpbmNsdWRlUHJvcGVydGllcyk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICAgICAgICAgICAgICBuZXh0TGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMsIGluY2x1ZGVQb2xpY3lJZHMpOwotICAgICAgICAgICAgICAgICAgICBuZXh0TGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FDTCwgaW5jbHVkZUFjbCk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZlZWQud3JpdGVOZXh0TGluayhuZXh0TGluay50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgQ01JUyBzcGVjIHNheXMgdGhhdCB0aGUgQXRvbVB1YiBiaW5kaW5nIGRvZXNuJ3QgcHJvdmlkZQotICAgICAgICAgICAgICAgIC8vIHRoZSBjaGFuZ2UgbG9nIHRva2VuLiBXZSBhcmUgZG9pbmcgaXQgYW55d2F5LgotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBmZWVkLmdldFdyaXRlcigpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChYTUxDb25zdGFudHMuUFJFRklYX0FQQUNIRV9DSEVNSVNUWSwgImNoYW5nZUxvZ1Rva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBBQ0hFX0NIRU1JU1RSWSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKFhNTENvbnN0YW50cy5QUkVGSVhfQVBBQ0hFX0NIRU1JU1RZLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQQUNIRV9DSEVNSVNUUlkpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoY2hhbmdlTG9nVG9rZW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBlbnRyaWVzCi0gICAgICAgICAgICBpZiAoY2hhbmdlcy5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IG5ldyBBdG9tRW50cnkoZmVlZC5nZXRXcml0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IGNoYW5nZXMuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVDb250ZW50Q2hhbmdlc09iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3QsIG51bGwsIHJlcG9zaXRvcnlJZCwgbnVsbCwgbnVsbCwgYmFzZVVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGV4dGVuc2lvbnMKLSAgICAgICAgICAgIGZlZWQud3JpdGVFeHRlbnNpb25zKGNoYW5nZXMpOwotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZmVlZC5lbmRGZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL011bHRpRmlsaW5nU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9NdWx0aUZpbGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZmQ0NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL011bHRpRmlsaW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5UZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5OwotCi0vKioKLSAqIE11bHRpRmlsaW5nIFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsaW5nU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgb2JqZWN0IGZyb20gZm9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVtb3ZlT2JqZWN0RnJvbUZvbGRlciBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyByZW1vdmVGcm9tID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRU1PVkVfRlJPTSk7Ci0KLSAgICAgICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IChUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5KSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ2FsbENvbnRleHQuU1RSRUFNX0ZBQ1RPUlkpOwotICAgICAgICAgICAgQXRvbUVudHJ5UGFyc2VyIHBhcnNlciA9IG5ldyBBdG9tRW50cnlQYXJzZXIoc3RyZWFtRmFjdG9yeSk7Ci0gICAgICAgICAgICBwYXJzZXIuc2V0SWdub3JlQXRvbUNvbnRlbnRTcmModHJ1ZSk7IC8vIG5lZWRlZCBmb3Igc29tZSBjbGllbnRzCi0gICAgICAgICAgICBwYXJzZXIucGFyc2UocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gcGFyc2VyLmdldElkKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwgJiYgcmVtb3ZlRnJvbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVVuZmlsZWRPYmplY3QoY29udGV4dCwgc2VydmljZSwgcmVwb3NpdG9yeUlkLCByZXF1ZXN0LCByZXNwb25zZSwgcGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNlcnZpY2UucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCByZW1vdmVGcm9tLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHBhcnNlci5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gb2JqZWN0SW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBJbmZvIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gb2JqZWN0SW5mby5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgSWQgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgYmFzZVVybCA9IGNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxvY2F0aW9uIiwgY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgb2JqZWN0LmdldElkKCkpKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KCk7Ci0gICAgICAgICAgICBlbnRyeS5zdGFydERvY3VtZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXROYW1lc3BhY2VzKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIHdyaXRlT2JqZWN0RW50cnkoc2VydmljZSwgZW50cnksIG9iamVjdCwgbnVsbCwgcmVwb3NpdG9yeUlkLCBudWxsLCBudWxsLCBiYXNlVXJsLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgZW50cnkuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgdW5maWxlZCBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlVW5maWxlZE9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBBdG9tRW50cnlQYXJzZXIgcGFyc2VyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIGdldCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9WRVJTSU9OSUdfU1RBVEUsCi0gICAgICAgICAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZQotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gcGFyc2VyLmdldENvbnRlbnRTdHJlYW0oKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IHNlcnZpY2UuY3JlYXRlKHJlcG9zaXRvcnlJZCwgcGFyc2VyLmdldFByb3BlcnRpZXMoKSwgbnVsbCwgY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlLCBwYXJzZXIuZ2V0UG9saWN5SWRzKCksIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0SW5mbyBvYmplY3RJbmZvID0gc2VydmljZS5nZXRPYmplY3RJbmZvKHJlcG9zaXRvcnlJZCwgbmV3T2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdEluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IEluZm8gaXMgbWlzc2luZyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBvYmplY3RJbmZvLmdldE9iamVjdCgpOwotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgYmFzZVVybCA9IGNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxvY2F0aW9uIiwgY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgbmV3T2JqZWN0SWQpKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KCk7Ci0gICAgICAgICAgICBlbnRyeS5zdGFydERvY3VtZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXROYW1lc3BhY2VzKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIHdyaXRlT2JqZWN0RW50cnkoc2VydmljZSwgZW50cnksIG9iamVjdCwgbnVsbCwgcmVwb3NpdG9yeUlkLCBudWxsLCBudWxsLCBiYXNlVXJsLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgZW50cnkuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvTmF2aWdhdGlvblNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvTmF2aWdhdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2MjFjZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL05hdmlnYXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuT2JqZWN0SW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5SZW5kaXRpb25JbmZvOwotCi0vKioKLSAqIE5hdmlnYXRpb24gU2VydmljZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgTmF2aWdhdGlvblNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ2hpbGRyZW4gQ29sbGVjdGlvbiBHRVQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRDaGlsZHJlbiBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIFN0cmluZyBvcmRlckJ5ID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9PUkRFUl9CWSk7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUEFUSF9TRUdNRU5UKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5UKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgY2hpbGRyZW4gPSBzZXJ2aWNlLmdldENoaWxkcmVuKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgICAgIHNraXBDb3VudCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2hpbGRyZW4gYXJlIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gZm9sZGVySW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkKTsKLSAgICAgICAgICAgIGlmIChmb2xkZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkZvbGRlciBPYmplY3QgSW5mbyBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgZmVlZC5zdGFydEZlZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGJhc2ljIEF0b20gZmVlZCBlbGVtZW50cwotICAgICAgICAgICAgZmVlZC53cml0ZUZlZWRFbGVtZW50cyhmb2xkZXJJbmZvLmdldElkKCksIGZvbGRlckluZm8uZ2V0QXRvbUlkKCksIGZvbGRlckluZm8uZ2V0Q3JlYXRlZEJ5KCksCi0gICAgICAgICAgICAgICAgICAgIGZvbGRlckluZm8uZ2V0TmFtZSgpLCBmb2xkZXJJbmZvLmdldExhc3RNb2RpZmljYXRpb25EYXRlKCksIG51bGwsIGNoaWxkcmVuLmdldE51bUl0ZW1zKCkpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBsaW5rcwotICAgICAgICAgICAgVXJsQnVpbGRlciBiYXNlVXJsID0gY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZVNlcnZpY2VMaW5rKGJhc2VVcmwudG9TdHJpbmcoKSwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBzZWxmTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX0NISUxEUkVOLCBmb2xkZXJJbmZvLmdldElkKCkpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09SREVSX0JZLCBvcmRlckJ5KTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQsIGluY2x1ZGVQYXRoU2VnbWVudCk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUywgbWF4SXRlbXMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5ULCBza2lwQ291bnQpOwotICAgICAgICAgICAgZmVlZC53cml0ZVNlbGZMaW5rKHNlbGZMaW5rLnRvU3RyaW5nKCksIG51bGwpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlRGVzY3JpYmVkQnlMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgZm9sZGVySW5mby5nZXRUeXBlSWQoKSkpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlQWxsb3dhYmxlQWN0aW9uc0xpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9BTExPV0FCTEVBQ0lPTlMsIGZvbGRlckluZm8uZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlRG93bkxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9DSElMRFJFTiwgZm9sZGVySW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uc3VwcG9ydHNEZXNjZW5kYW50cygpKSB7Ci0gICAgICAgICAgICAgICAgZmVlZC53cml0ZURvd25MaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfREVTQ0VOREFOVFMsIGZvbGRlckluZm8uZ2V0SWQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uc3VwcG9ydHNGb2xkZXJUcmVlKCkpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlRm9sZGVyVHJlZUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9GT0xERVJUUkVFLCBmb2xkZXJJbmZvLmdldElkKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uaGFzUGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlVXBMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfUEFSRU5UUywgZm9sZGVySW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uZ2V0UmVuZGl0aW9uSW5mb3MoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSZW5kaXRpb25JbmZvIHJpIDogZm9sZGVySW5mby5nZXRSZW5kaXRpb25JbmZvcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZlZWQud3JpdGVBbHRlcm5hdGVMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfQ09OVEVOVCwgcmkuZ2V0SWQoKSksIHJpLmdldENvbnRlblR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByaS5nZXRLaW5kKCksIHJpLmdldFRpdGxlKCksIHJpLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb2xkZXJJbmZvLmhhc0FjbCgpKSB7Ci0gICAgICAgICAgICAgICAgZmVlZC53cml0ZUFjbExpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9BQ0wsIGZvbGRlckluZm8uZ2V0SWQoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm9sZGVySW5mby5zdXBwb3J0c1BvbGljaWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlQWNsTGluayhjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1BPTElDSUVTLCBmb2xkZXJJbmZvLmdldElkKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uc3VwcG9ydHNSZWxhdGlvbnNoaXBzKCkpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlUmVsYXRpb25zaGlwc0xpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9SRUxBVElPTlNISVBTLCBmb2xkZXJJbmZvLmdldElkKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVXJsQnVpbGRlciBwYWdpbmdVcmwgPSBuZXcgVXJsQnVpbGRlcihjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9DSElMRFJFTiwgZm9sZGVySW5mby5nZXRJZCgpKSk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9PUkRFUl9CWSwgb3JkZXJCeSk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICAgICAgcGFnaW5nVXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgICAgcGFnaW5nVXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUiwgcmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgICAgIHBhZ2luZ1VybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BBVEhfU0VHTUVOVCwgaW5jbHVkZVBhdGhTZWdtZW50KTsKLSAgICAgICAgICAgIGZlZWQud3JpdGVQYWdpbmdMaW5rcyhwYWdpbmdVcmwsIG1heEl0ZW1zLCBza2lwQ291bnQsIGNoaWxkcmVuLmdldE51bUl0ZW1zKCksIGNoaWxkcmVuLmhhc01vcmVJdGVtcygpLAotICAgICAgICAgICAgICAgICAgICBQQUdFX1NJWkUpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBjb2xsZWN0aW9uCi0gICAgICAgICAgICBmZWVkLndyaXRlQ29sbGVjdGlvbihjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0NISUxEUkVOLCBmb2xkZXJJbmZvLmdldElkKCkpLCBudWxsLCAiRm9sZGVyIGNvbGxlY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0NNSVNBVE9NKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgZW50cmllcwotICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmdldE9iamVjdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeShmZWVkLmdldFdyaXRlcigpKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBvYmplY3QgOiBjaGlsZHJlbi5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChvYmplY3QgPT0gbnVsbCkgfHwgKG9iamVjdC5nZXRPYmplY3QoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPYmplY3RFbnRyeShzZXJ2aWNlLCBlbnRyeSwgb2JqZWN0LmdldE9iamVjdCgpLCBudWxsLCByZXBvc2l0b3J5SWQsIG9iamVjdC5nZXRQYXRoU2VnbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGJhc2VVcmwsIGZhbHNlLCBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgZXh0ZW5zaW9ucwotICAgICAgICAgICAgZmVlZC53cml0ZUV4dGVuc2lvbnMoY2hpbGRyZW4pOwotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZmVlZC5lbmRGZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjZW5kYW50cyBmZWVkIEdFVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldERlc2NlbmRhbnRzIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGRlcHRoID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fREVQVEgpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUyk7Ci0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcyA9IGdldEVudW1QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGRlc2NlbmRhbnRzID0gc2VydmljZS5nZXREZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBkZXB0aCwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZXNjZW5kYW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJEZXNjZW5kYW50cyBhcmUgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0SW5mbyBmb2xkZXJJbmZvID0gc2VydmljZS5nZXRPYmplY3RJbmZvKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOwotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRm9sZGVyIE9iamVjdCBJbmZvIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIEF0b21GZWVkIGZlZWQgPSBuZXcgQXRvbUZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RmVlZCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgYmFzaWMgQXRvbSBmZWVkIGVsZW1lbnRzCi0gICAgICAgICAgICBmZWVkLndyaXRlRmVlZEVsZW1lbnRzKGZvbGRlckluZm8uZ2V0SWQoKSwgZm9sZGVySW5mby5nZXRBdG9tSWQoKSwgZm9sZGVySW5mby5nZXRDcmVhdGVkQnkoKSwKLSAgICAgICAgICAgICAgICAgICAgZm9sZGVySW5mby5nZXROYW1lKCksIGZvbGRlckluZm8uZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHNlbGZMaW5rID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfREVTQ0VOREFOVFMsIGZvbGRlckluZm8uZ2V0SWQoKSk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQsIGluY2x1ZGVQYXRoU2VnbWVudCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlU2VsZkxpbmsoc2VsZkxpbmsudG9TdHJpbmcoKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGZlZWQud3JpdGVWaWFMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRU5UUlksIGZvbGRlckluZm8uZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlRG93bkxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9DSElMRFJFTiwgZm9sZGVySW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uc3VwcG9ydHNGb2xkZXJUcmVlKCkpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlRm9sZGVyVHJlZUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9GT0xERVJUUkVFLCBmb2xkZXJJbmZvLmdldElkKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uaGFzUGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlVXBMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfUEFSRU5UUywgZm9sZGVySW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgZW50cmllcwotICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeShmZWVkLmdldFdyaXRlcigpKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgY29udGFpbmVyIDogZGVzY2VuZGFudHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbnRhaW5lciA9PSBudWxsKSB8fCAoY29udGFpbmVyLmdldE9iamVjdCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoY29udGFpbmVyLmdldE9iamVjdCgpLmdldE9iamVjdCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZU9iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBjb250YWluZXIuZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCksIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeUlkLCBjb250YWluZXIuZ2V0T2JqZWN0KCkuZ2V0UGF0aFNlZ21lbnQoKSwgbnVsbCwgYmFzZVVybCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZmVlZC5lbmRGZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb2xkZXIgdHJlZSBmZWVkIEdFVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldEZvbGRlclRyZWUgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0lEKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgZGVwdGggPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9ERVBUSCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TKTsKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywKLSAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MpOwotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUkVORElUSU9OX0ZJTFRFUik7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1BBVEhfU0VHTUVOVCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZm9sZGVyVHJlZSA9IHNlcnZpY2UuZ2V0Rm9sZGVyVHJlZShyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBkZXB0aCwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb2xkZXJUcmVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkZvbGRlciB0cmVlIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gZm9sZGVySW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkKTsKLSAgICAgICAgICAgIGlmIChmb2xkZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkZvbGRlciBPYmplY3QgSW5mbyBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgZmVlZC5zdGFydEZlZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGJhc2ljIEF0b20gZmVlZCBlbGVtZW50cwotICAgICAgICAgICAgZmVlZC53cml0ZUZlZWRFbGVtZW50cyhmb2xkZXJJbmZvLmdldElkKCksIGZvbGRlckluZm8uZ2V0QXRvbUlkKCksIGZvbGRlckluZm8uZ2V0Q3JlYXRlZEJ5KCksCi0gICAgICAgICAgICAgICAgICAgIGZvbGRlckluZm8uZ2V0TmFtZSgpLCBmb2xkZXJJbmZvLmdldExhc3RNb2RpZmljYXRpb25EYXRlKCksIG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBsaW5rcwotICAgICAgICAgICAgVXJsQnVpbGRlciBiYXNlVXJsID0gY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZVNlcnZpY2VMaW5rKGJhc2VVcmwudG9TdHJpbmcoKSwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBzZWxmTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX0ZPTERFUlRSRUUsIGZvbGRlckluZm8uZ2V0SWQoKSk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QQVRIX1NFR01FTlQsIGluY2x1ZGVQYXRoU2VnbWVudCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlU2VsZkxpbmsoc2VsZkxpbmsudG9TdHJpbmcoKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGZlZWQud3JpdGVWaWFMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRU5UUlksIGZvbGRlckluZm8uZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlRG93bkxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9DSElMRFJFTiwgZm9sZGVySW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uc3VwcG9ydHNEZXNjZW5kYW50cygpKSB7Ci0gICAgICAgICAgICAgICAgZmVlZC53cml0ZURvd25MaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfREVTQ0VOREFOVFMsIGZvbGRlckluZm8uZ2V0SWQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvbGRlckluZm8uaGFzUGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlVXBMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfUEFSRU5UUywgZm9sZGVySW5mby5nZXRJZCgpKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgZW50cmllcwotICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeShmZWVkLmdldFdyaXRlcigpKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgY29udGFpbmVyIDogZm9sZGVyVHJlZSkgewotICAgICAgICAgICAgICAgIGlmICgoY29udGFpbmVyID09IG51bGwpIHx8IChjb250YWluZXIuZ2V0T2JqZWN0KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjb250YWluZXIuZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyaXRlT2JqZWN0RW50cnkoc2VydmljZSwgZW50cnksIGNvbnRhaW5lci5nZXRPYmplY3QoKS5nZXRPYmplY3QoKSwgY29udGFpbmVyLmdldENoaWxkcmVuKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5SWQsIGNvbnRhaW5lci5nZXRPYmplY3QoKS5nZXRQYXRoU2VnbWVudCgpLCBudWxsLCBiYXNlVXJsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGFyZSBkb25lCi0gICAgICAgICAgICBmZWVkLmVuZEZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9iamVjdCBwYXJlbnRzIGZlZWQgR0VULgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0Rm9sZGVyUGFyZW50IGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9GSUxURVIpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gc2VydmljZS5nZXRGb2xkZXJQYXJlbnQocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gb2JqZWN0SW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBJbmZvIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KCk7Ci0gICAgICAgICAgICBlbnRyeS5zdGFydERvY3VtZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXROYW1lc3BhY2VzKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIHdyaXRlT2JqZWN0RW50cnkoc2VydmljZSwgZW50cnksIG9iamVjdCwgbnVsbCwgcmVwb3NpdG9yeUlkLCBudWxsLCBudWxsLCBiYXNlVXJsLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgZW50cnkuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9iamVjdCBwYXJlbnRzIGZlZWQgR0VULgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0T2JqZWN0UGFyZW50cyBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUyk7Ci0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcyA9IGdldEVudW1QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBwYXJlbnRzID0gc2VydmljZS5nZXRPYmplY3RQYXJlbnRzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlBhcmVudHMgYXJlIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gb2JqZWN0SW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBJbmZvIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIEF0b21GZWVkIGZlZWQgPSBuZXcgQXRvbUZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RmVlZCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgYmFzaWMgQXRvbSBmZWVkIGVsZW1lbnRzCi0gICAgICAgICAgICBmZWVkLndyaXRlRmVlZEVsZW1lbnRzKG9iamVjdEluZm8uZ2V0SWQoKSwgb2JqZWN0SW5mby5nZXRBdG9tSWQoKSwgb2JqZWN0SW5mby5nZXRDcmVhdGVkQnkoKSwKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5mby5nZXROYW1lKCksIG9iamVjdEluZm8uZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHNlbGZMaW5rID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfUEFSRU5UUywgb2JqZWN0SW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVIsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSVZFX1BBVEhfU0VHTUVOVCwgaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQpOwotICAgICAgICAgICAgZmVlZC53cml0ZVNlbGZMaW5rKHNlbGZMaW5rLnRvU3RyaW5nKCksIG51bGwpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBlbnRyaWVzCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KGZlZWQuZ2V0V3JpdGVyKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3RQYXJlbnREYXRhIG9iamVjdCA6IHBhcmVudHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG9iamVjdCA9PSBudWxsKSB8fCAob2JqZWN0LmdldE9iamVjdCgpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZU9iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3QuZ2V0T2JqZWN0KCksIG51bGwsIHJlcG9zaXRvcnlJZCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5nZXRSZWxhdGl2ZVBhdGhTZWdtZW50KCksIGJhc2VVcmwsIGZhbHNlLCBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZmVlZC5lbmRGZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja2VkIE91dCBDb2xsZWN0aW9uIEdFVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldENoZWNrZWRPdXREb2NzIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9GT0xERVJfSUQpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIFN0cmluZyBvcmRlckJ5ID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9PUkRFUl9CWSk7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5UKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RMaXN0IGNoZWNrZWRPdXQgPSBzZXJ2aWNlLmdldENoZWNrZWRPdXREb2NzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoZWNrZWRPdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2hlY2tlZCBPdXQgbGlzdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RJbmZvIGZvbGRlckluZm8gPSBudWxsOwotICAgICAgICAgICAgaWYgKGZvbGRlcklkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb2xkZXJJbmZvID0gc2VydmljZS5nZXRPYmplY3RJbmZvKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOwotICAgICAgICAgICAgICAgIGlmIChmb2xkZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJGb2xkZXIgT2JqZWN0IEluZm8gaXMgbWlzc2luZyEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvbGRlckluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBub3cgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLQotICAgICAgICAgICAgICAgICgoT2JqZWN0SW5mb0ltcGwpIGZvbGRlckluZm8pLnNldElkKCJ1cmk6eC1jaGVja2Vkb3V0Iik7Ci0gICAgICAgICAgICAgICAgKChPYmplY3RJbmZvSW1wbCkgZm9sZGVySW5mbykuc2V0TmFtZSgiQ2hlY2tlZCBPdXQiKTsKLSAgICAgICAgICAgICAgICAoKE9iamVjdEluZm9JbXBsKSBmb2xkZXJJbmZvKS5zZXRDcmVhdGVkQnkoIiIpOwotICAgICAgICAgICAgICAgICgoT2JqZWN0SW5mb0ltcGwpIGZvbGRlckluZm8pLnNldENyZWF0aW9uRGF0ZShub3cpOwotICAgICAgICAgICAgICAgICgoT2JqZWN0SW5mb0ltcGwpIGZvbGRlckluZm8pLnNldExhc3RNb2RpZmljYXRpb25EYXRlKG5vdyk7Ci0gICAgICAgICAgICAgICAgKChPYmplY3RJbmZvSW1wbCkgZm9sZGVySW5mbykuc2V0SGFzUGFyZW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAoKE9iamVjdEluZm9JbXBsKSBmb2xkZXJJbmZvKS5zZXRTdXBwb3J0c0Rlc2NlbmRhbnRzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAoKE9iamVjdEluZm9JbXBsKSBmb2xkZXJJbmZvKS5zZXRTdXBwb3J0c0ZvbGRlclRyZWUoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgZmVlZC5zdGFydEZlZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGJhc2ljIEF0b20gZmVlZCBlbGVtZW50cwotICAgICAgICAgICAgZmVlZC53cml0ZUZlZWRFbGVtZW50cyhmb2xkZXJJbmZvLmdldElkKCksIGZvbGRlckluZm8uZ2V0QXRvbUlkKCksIGZvbGRlckluZm8uZ2V0Q3JlYXRlZEJ5KCksCi0gICAgICAgICAgICAgICAgICAgIGZvbGRlckluZm8uZ2V0TmFtZSgpLCBmb2xkZXJJbmZvLmdldExhc3RNb2RpZmljYXRpb25EYXRlKCksIG51bGwsIGNoZWNrZWRPdXQuZ2V0TnVtSXRlbXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHNlbGZMaW5rID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfQ0hFQ0tFRE9VVCwgZm9sZGVySW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9PUkRFUl9CWSwgb3JkZXJCeSk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1JFTEFUSU9OU0hJUFMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlU2VsZkxpbmsoc2VsZkxpbmsudG9TdHJpbmcoKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIFVybEJ1aWxkZXIgcGFnaW5nVXJsID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfQ0hFQ0tFRE9VVCwgZm9sZGVySW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHBhZ2luZ1VybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgICAgIHBhZ2luZ1VybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09SREVSX0JZLCBvcmRlckJ5KTsKLSAgICAgICAgICAgIHBhZ2luZ1VybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLCBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSLCByZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICAgICAgZmVlZC53cml0ZVBhZ2luZ0xpbmtzKHBhZ2luZ1VybCwgbWF4SXRlbXMsIHNraXBDb3VudCwgY2hlY2tlZE91dC5nZXROdW1JdGVtcygpLCBjaGVja2VkT3V0Lmhhc01vcmVJdGVtcygpLAotICAgICAgICAgICAgICAgICAgICBQQUdFX1NJWkUpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBlbnRyaWVzCi0gICAgICAgICAgICBpZiAoY2hlY2tlZE91dC5nZXRPYmplY3RzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IG5ldyBBdG9tRW50cnkoZmVlZC5nZXRXcml0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IGNoZWNrZWRPdXQuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPYmplY3RFbnRyeShzZXJ2aWNlLCBlbnRyeSwgb2JqZWN0LCBudWxsLCByZXBvc2l0b3J5SWQsIG51bGwsIG51bGwsIGJhc2VVcmwsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBleHRlbnNpb25zCi0gICAgICAgICAgICBmZWVkLndyaXRlRXh0ZW5zaW9ucyhjaGVja2VkT3V0KTsKLQotICAgICAgICAgICAgLy8gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGZlZWQuZW5kRmVlZCgpOwotICAgICAgICAgICAgZmVlZC5lbmREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9PYmplY3RTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL09iamVjdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhZmZiYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL09iamVjdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5NaW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5SZXR1cm5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnk7Ci0KLS8qKgotICogT2JqZWN0IFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNjQgKiAxMDI0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3JlYXRlIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0gICAgICAgICAgICBTdHJpbmcgc291cmNlRm9sZGVySWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NPVVJDRV9GT0xERVJfSUQpOwotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSA9IGdldEVudW1QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1ZFUlNJT05JR19TVEFURSwKLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlLmNsYXNzKTsKLQotICAgICAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5ID0gKFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkpIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldChDYWxsQ29udGV4dC5TVFJFQU1fRkFDVE9SWSk7Ci0gICAgICAgICAgICBBdG9tRW50cnlQYXJzZXIgcGFyc2VyID0gbmV3IEF0b21FbnRyeVBhcnNlcihzdHJlYW1GYWN0b3J5KTsKLSAgICAgICAgICAgIHBhcnNlci5zZXRJZ25vcmVBdG9tQ29udGVudFNyYyh0cnVlKTsgLy8gbmVlZGVkIGZvciBzb21lIGNsaWVudHMKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gcGFyc2VyLmdldElkKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlCi0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IHBhcnNlci5nZXRDb250ZW50U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld09iamVjdElkID0gc2VydmljZS5jcmVhdGUocmVwb3NpdG9yeUlkLCBwYXJzZXIuZ2V0UHJvcGVydGllcygpLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIHBhcnNlci5nZXRQb2xpY3lJZHMoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZvbGRlcklkID09IG51bGwgfHwgc291cmNlRm9sZGVySWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZE9iamVjdFRvRm9sZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE9iamVjdFRvRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdElkID0gb2JqZWN0SWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLm1vdmVPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZEhvbGRlciwgZm9sZGVySWQsIHNvdXJjZUZvbGRlcklkLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld09iamVjdElkID0gb2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHBhcnNlci5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gb2JqZWN0SW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBJbmZvIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gb2JqZWN0SW5mby5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRU5UUlksIG5ld09iamVjdElkKSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeSgpOwotICAgICAgICAgICAgZW50cnkuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICB3cml0ZU9iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3QsIG51bGwsIHJlcG9zaXRvcnlJZCwgbnVsbCwgbnVsbCwgYmFzZVVybCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgIGVudHJ5LmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgcmVsYXRpb25zaGlwLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3JlYXRlUmVsYXRpb25zaGlwIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5ID0gKFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkpIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldChDYWxsQ29udGV4dC5TVFJFQU1fRkFDVE9SWSk7Ci0gICAgICAgICAgICBBdG9tRW50cnlQYXJzZXIgcGFyc2VyID0gbmV3IEF0b21FbnRyeVBhcnNlcihyZXF1ZXN0LmdldElucHV0U3RyZWFtKCksIHN0cmVhbUZhY3RvcnkpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5ld09iamVjdElkID0gc2VydmljZS5jcmVhdGVSZWxhdGlvbnNoaXAocmVwb3NpdG9yeUlkLCBwYXJzZXIuZ2V0UHJvcGVydGllcygpLCBwYXJzZXIuZ2V0UG9saWN5SWRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHBhcnNlci5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gb2JqZWN0SW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBJbmZvIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gb2JqZWN0SW5mby5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRU5UUlksIG5ld09iamVjdElkKSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeSgpOwotICAgICAgICAgICAgZW50cnkuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICB3cml0ZU9iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3QsIG51bGwsIHJlcG9zaXRvcnlJZCwgbnVsbCwgbnVsbCwgYmFzZVVybCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgIGVudHJ5LmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGUgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVsZXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0gICAgICAgICAgICBCb29sZWFuIGFsbFZlcnNpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUxMX1ZFUlNJT05TKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmRlbGV0ZU9iamVjdE9yQ2FuY2VsQ2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWxsVmVyc2lvbnMsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PX0NPTlRFTlQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlIGNvbnRlbnQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVsZXRlQ29udGVudFN0cmVhbSBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgU3RyaW5nIGNoYW5nZVRva2VuID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9DSEFOR0VfVE9LRU4pOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlQ29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCksIGNoYW5nZVRva2VuID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogbmV3IEhvbGRlcjxTdHJpbmc+KGNoYW5nZVRva2VuKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9fQ09OVEVOVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgb3IgYXBwZW5kIGNvbnRlbnQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2V0T3JBcHBlbmRDb250ZW50U3RyZWFtIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhbmdlVG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0NIQU5HRV9UT0tFTik7Ci0gICAgICAgICAgICBCb29sZWFuIGFwcGVuZEZsYWcgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BUFBFTkQpOwotICAgICAgICAgICAgQm9vbGVhbiBvdmVyd3JpdGVGbGFnID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fT1ZFUldSSVRFX0ZMQUcpOwotICAgICAgICAgICAgQm9vbGVhbiBpc0xhc3RDaHVuayA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0lTX0xBU1RfQ0hVTkspOwotCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtSW1wbCBjb250ZW50U3RyZWFtID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0gICAgICAgICAgICBjb250ZW50U3RyZWFtLnNldFN0cmVhbShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgY29udGVudFN0cmVhbS5zZXRNaW1lVHlwZShyZXF1ZXN0LmdldEhlYWRlcigiQ29udGVudC1UeXBlIikpOwotICAgICAgICAgICAgU3RyaW5nIGxlbmd0aFN0ciA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJDb250ZW50LUxlbmd0aCIpOwotICAgICAgICAgICAgaWYgKGxlbmd0aFN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbS5zZXRMZW5ndGgobmV3IEJpZ0ludGVnZXIobGVuZ3RoU3RyKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBjb250ZW50IGxlbmd0aCAtPiBpZ25vcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uID0gcmVxdWVzdC5nZXRIZWFkZXIoTWltZUhlbHBlci5DT05URU5UX0RJU1BPU0lUSU9OKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50RGlzcG9zaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uc2V0RmlsZU5hbWUoTWltZUhlbHBlci5kZWNvZGVDb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZShjb250ZW50RGlzcG9zaXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhhcHBlbmRGbGFnKSkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UuYXBwZW5kQ29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkSG9sZGVyLCBjaGFuZ2VUb2tlbiA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pLCBjb250ZW50U3RyZWFtLCAoQm9vbGVhbi5UUlVFLmVxdWFscyhpc0xhc3RDaHVuaykgPyB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlKSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkSG9sZGVyLCBvdmVyd3JpdGVGbGFnLCBjaGFuZ2VUb2tlbiA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pLCBjb250ZW50U3RyZWFtLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSAob2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gb2JqZWN0SWQgOiBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50TG9jYXRpb24gPSBjb21waWxlVXJsKGNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCksIFJFU09VUkNFX0NPTlRFTlQsIG5ld09iamVjdElkKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGNvbXBpbGVVcmwoY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKSwgUkVTT1VSQ0VfT0JKRUNUQllJRCwgbmV3T2JqZWN0SWQpOwotCi0gICAgICAgICAgICAvLyBzZXQgc3RhdHVzCi0gICAgICAgICAgICBpZiAobmV3T2JqZWN0SWQuZXF1YWxzKG9iamVjdElkKSkgewotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGFwcGVuZEZsYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBzdHJlYW06IG5vIG5ldyB2ZXJzaW9uIC0+IE9LCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aCgwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoIUJvb2xlYW4uRkFMU0UuZXF1YWxzKG92ZXJ3cml0ZUZsYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc3RyZWFtOiBubyBuZXcgdmVyc2lvbiBhbmQgb3ZlcndyaXRlIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPSzogaWYgdGhlIGRvY3VtZW50IGhhZCBhIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENSRUFURUQ6IGlmIHRoZSBkb2N1bWVudCBoYWQgbm8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi4gYnV0IHdlIGRvbid0IGtub3csIC4uLiBPSyBpcyBtb3JlIGxpa2VseSAuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgoMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc3RyZWFtOiBubyBuZXcgdmVyc2lvbiBhbmQgbm90IG92ZXJ3cml0ZSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1JFQVRFRCAodGhlIGRvY3VtZW50IGhhc24ndCBoYWQgYSBzdHJlYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbmV3IHZlcnNpb24gY3JlYXRlZCAtPiBDUkVBVEVECi0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtTG9jYXRpb24iLCBjb250ZW50TG9jYXRpb24pOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSB0cmVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVsZXRlVHJlZSBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgQm9vbGVhbiBhbGxWZXJzaW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0FMTF9WRVJTSU9OUyk7Ci0gICAgICAgICAgICBVbmZpbGVPYmplY3QgdW5maWxlT2JqZWN0cyA9IGdldEVudW1QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1VORklMRV9PQkpFQ1RTLCBVbmZpbGVPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgQm9vbGVhbiBjb250aW51ZU9uRmFpbHVyZSA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0NPTlRJTlVFX09OX0ZBSUxVUkUpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZhaWxlZFRvRGVsZXRlRGF0YSBmdGQgPSBzZXJ2aWNlLmRlbGV0ZVRyZWUocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgYWxsVmVyc2lvbnMsIHVuZmlsZU9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlT25GYWlsdXJlLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmdGQgIT0gbnVsbCAmJiBpc05vdEVtcHR5KGZ0ZC5nZXRJZHMoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBwcmludCBpZHMgdGhhdCBjb3VsZCBub3QgYmUgZGVsZXRlZAotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKLQotICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIHB3ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJGYWlsZWQgdG8gZGVsZXRlIHRoZSBmb2xsb3dpbmcgb2JqZWN0czoiKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGZ0ZC5nZXRJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGlkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdy5mbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9fQ09OVEVOVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0lEKTsKLSAgICAgICAgICAgIFJldHVyblZlcnNpb24gcmV0dXJuVmVyc2lvbiA9IGdldEVudW1QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1JFVFVSTl9WRVJTSU9OLCBSZXR1cm5WZXJzaW9uLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUik7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUNMKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVmVyc2lvbiA9PSBSZXR1cm5WZXJzaW9uLkxBVEVTVCB8fCByZXR1cm5WZXJzaW9uID09IFJldHVyblZlcnNpb24uTEFTVEVTVE1BSk9SKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gc2VydmljZS5nZXRPYmplY3RPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZlcnNpb24gPT0gUmV0dXJuVmVyc2lvbi5MQVNURVNUTUFKT1IsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gc2VydmljZS5nZXRPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBY2wsIG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0SW5mbyBvYmplY3RJbmZvID0gc2VydmljZS5nZXRPYmplY3RJbmZvKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdEluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IEluZm8gaXMgbWlzc2luZyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgYmFzZVVybCA9IGNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IG5ldyBBdG9tRW50cnkoKTsKLSAgICAgICAgICAgIGVudHJ5LnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgd3JpdGVPYmplY3RFbnRyeShzZXJ2aWNlLCBlbnRyeSwgb2JqZWN0LCBudWxsLCByZXBvc2l0b3J5SWQsIG51bGwsIG51bGwsIGJhc2VVcmwsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSk7Ci0gICAgICAgICAgICBlbnRyeS5lbmREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogb2JqZWN0QnlQYXRoIFVSSSB0ZW1wbGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldE9iamVjdEJ5UGF0aCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9QQVRIKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUik7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFMpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUNMKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IHNlcnZpY2UuZ2V0T2JqZWN0QnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RJbmZvIG9iamVjdEluZm8gPSBzZXJ2aWNlLmdldE9iamVjdEluZm8ocmVwb3NpdG9yeUlkLCBvYmplY3QuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgSW5mbyBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgVXJsQnVpbGRlciBiYXNlVXJsID0gY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeSgpOwotICAgICAgICAgICAgZW50cnkuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICB3cml0ZU9iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3QsIG51bGwsIHJlcG9zaXRvcnlJZCwgbnVsbCwgbnVsbCwgYmFzZVVybCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgIGVudHJ5LmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd2FibGUgQWN0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldEFsbG93YWJsZUFjdGlvbnMgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0lEKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMgPSBzZXJ2aWNlLmdldEFsbG93YWJsZUFjdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYWxsb3dhYmxlQWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJBbGxvd2FibGUgQWN0aW9ucyBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9BTExPV0FCTEVBQ1RJT04pOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxVdGlscy5jcmVhdGVXcml0ZXIocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgWE1MVXRpbHMuc3RhcnRYbWxEb2N1bWVudCh3cml0ZXIpOwotICAgICAgICAgICAgWE1MQ29udmVydGVyLndyaXRlQWxsb3dhYmxlQWN0aW9ucyh3cml0ZXIsIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSwgdHJ1ZSwgYWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgICAgICBYTUxVdGlscy5lbmRYbWxEb2N1bWVudCh3cml0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0Q29udGVudFN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldENvbnRlbnRTdHJlYW0gZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0lEKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHJlYW1JZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fU1RSRUFNX0lEKTsKLQotICAgICAgICAgICAgQmlnSW50ZWdlciBvZmZzZXQgPSBjb250ZXh0LmdldE9mZnNldCgpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGggPSBjb250ZXh0LmdldExlbmd0aCgpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudCA9IHNlcnZpY2UuZ2V0Q29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBzdHJlYW1JZCwgb2Zmc2V0LCBsZW5ndGgsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCB8fCBjb250ZW50LmdldFN0cmVhbSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNvbnRlbnQgc3RyZWFtIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBIVFRQIGhlYWRlcnMsIGlmIHJlcXVlc3RlZCBieSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICBpZiAoc2VuZENvbnRlbnRTdHJlYW1IZWFkZXJzKGNvbnRlbnQsIHJlcXVlc3QsIHJlc3BvbnNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29udGVudC5nZXRNaW1lVHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IENvbnN0YW50cy5NRURJQVRZUEVfT0NURVRTVFJFQU07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBpZiAoKG9mZnNldCA9PSBudWxsIHx8IG9mZnNldC5zaWdudW0oKSA9PSAwKSAmJiAobGVuZ3RoID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QQVJUSUFMX0NPTlRFTlQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuZ2V0QmlnTGVuZ3RoKCkgIT0gbnVsbCAmJiBjb250ZW50LmdldEJpZ0xlbmd0aCgpLnNpZ251bSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBmaXJzdEJ5dGVQb3MgPSAob2Zmc2V0ID09IG51bGwgPyBCaWdJbnRlZ2VyLlpFUk8gOiBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGxhc3RCeXRlUG9zID0gZmlyc3RCeXRlUG9zLmFkZChjb250ZW50LmdldEJpZ0xlbmd0aCgpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJDb250ZW50LVJhbmdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgIiArIGZpcnN0Qnl0ZVBvcy50b1N0cmluZygpICsgIi0iICsgbGFzdEJ5dGVQb3MudG9TdHJpbmcoKSArICIvKiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQotICAgICAgICAgICAgaWYgKGNvbnRlbnQuZ2V0RmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKE1pbWVIZWxwZXIuQ09OVEVOVF9ESVNQT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1pbWVIZWxwZXIuZW5jb2RlQ29udGVudERpc3Bvc2l0aW9uKE1pbWVIZWxwZXIuRElTUE9TSVRJT05fQVRUQUNITUVOVCwgY29udGVudC5nZXRGaWxlTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNlbmQgY29udGVudAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjb250ZW50LmdldFN0cmVhbSgpOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJT1V0aWxzLmNvcHkoaW4sIG91dCwgQlVGRkVSX1NJWkUpOwotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlUHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVwZGF0ZVByb3BlcnRpZXMgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0lEKTsKLSAgICAgICAgICAgIEJvb2xlYW4gY2hlY2tpbiA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0NIRUNLX0lOKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGVja2luQ29tbWVudCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQ0hFQ0tJTl9DT01NRU5UKTsKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9NQUpPUik7Ci0KLSAgICAgICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IChUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5KSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ2FsbENvbnRleHQuU1RSRUFNX0ZBQ1RPUlkpOwotICAgICAgICAgICAgQXRvbUVudHJ5UGFyc2VyIHBhcnNlciA9IG5ldyBBdG9tRW50cnlQYXJzZXIocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLCBzdHJlYW1GYWN0b3J5KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4ob2JqZWN0SWQpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICgoY2hlY2tpbiAhPSBudWxsKSAmJiAoY2hlY2tpbi5ib29sZWFuVmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBwYXJzZXIuZ2V0Q29udGVudFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmNoZWNrSW4ocmVwb3NpdG9yeUlkLCBvYmplY3RJZEhvbGRlciwgbWFqb3IsIHBhcnNlci5nZXRQcm9wZXJ0aWVzKCksIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tpbkNvbW1lbnQsIHBhcnNlci5nZXRQb2xpY3lJZHMoKSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IHBhcnNlci5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRva2VuID0gZXh0cmFjdENoYW5nZVRva2VuKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZVRva2VuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNJbXBsKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUHJvcGVydGllc0ltcGwpIHByb3BlcnRpZXMpLnJlbW92ZVByb3BlcnR5KFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHJlcXVpcmVkIGJ5IHRoZSBDTUlTIHNwZWNpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0+IGtlZXAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZW5DTUlTCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUb2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQ0hBTkdFX1RPS0VOKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS51cGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRIb2xkZXIsIGNoYW5nZVRva2VuID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pLCBwcm9wZXJ0aWVzLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBwYXJzZXIucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RJbmZvIG9iamVjdEluZm8gPSBzZXJ2aWNlLmdldE9iamVjdEluZm8ocmVwb3NpdG9yeUlkLCBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBJbmZvIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gb2JqZWN0SW5mby5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgb2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtTG9jYXRpb24iLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxvY2F0aW9uIiwgbG9jYXRpb24pOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IG5ldyBBdG9tRW50cnkoKTsKLSAgICAgICAgICAgIGVudHJ5LnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgd3JpdGVPYmplY3RFbnRyeShzZXJ2aWNlLCBlbnRyeSwgb2JqZWN0LCBudWxsLCByZXBvc2l0b3J5SWQsIG51bGwsIG51bGwsIGJhc2VVcmwsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSk7Ci0gICAgICAgICAgICBlbnRyeS5lbmREb2N1bWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGNoYW5nZSB0b2tlbiBmcm9tIGEgcHJvcGVydHkgc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdENoYW5nZVRva2VuKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXNNYXAgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IGNoYW5nZVRva2VuUHJvcGVydHkgPSBwcm9wZXJ0aWVzTWFwLmdldChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pOwotICAgICAgICAgICAgaWYgKCEoY2hhbmdlVG9rZW5Qcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKChQcm9wZXJ0eVN0cmluZykgY2hhbmdlVG9rZW5Qcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVsa1VwZGF0ZVByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWxrVXBkYXRlUHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5ID0gKFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkpIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldChDYWxsQ29udGV4dC5TVFJFQU1fRkFDVE9SWSk7Ci0gICAgICAgICAgICBBdG9tRW50cnlQYXJzZXIgcGFyc2VyID0gbmV3IEF0b21FbnRyeVBhcnNlcihzdHJlYW1GYWN0b3J5KTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCdWxrVXBkYXRlSW1wbCBidWxrVXBkYXRlID0gcGFyc2VyLmdldEJ1bGtVcGRhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVsa1VwZGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJCdWxrIHVwZGF0ZSBkYXRhIGlzIG1pc3NpbmchIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzZXJ2aWNlLmJ1bGtVcGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgYnVsa1VwZGF0ZS5nZXRPYmplY3RJZEFuZENoYW5nZVRva2VuKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBidWxrVXBkYXRlLmdldFByb3BlcnRpZXMoKSwgYnVsa1VwZGF0ZS5nZXRBZGRTZWNvbmRhcnlUeXBlSWRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBidWxrVXBkYXRlLmdldFJlbW92ZVNlY29uZGFyeVR5cGVJZHMoKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBwYXJzZXIucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgQXRvbUZlZWQgZmVlZCA9IG5ldyBBdG9tRmVlZCgpOwotICAgICAgICAgICAgZmVlZC5zdGFydERvY3VtZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXROYW1lc3BhY2VzKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIGZlZWQuc3RhcnRGZWVkKHRydWUpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBiYXNpYyBBdG9tIGZlZWQgZWxlbWVudHMKLSAgICAgICAgICAgIGZlZWQud3JpdGVGZWVkRWxlbWVudHMobnVsbCwgbnVsbCwgbnVsbCwgIkJ1bGsgVXBkYXRlIFByb3BlcnRpZXMiLAotICAgICAgICAgICAgICAgICAgICBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgKHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IEJpZ0ludGVnZXIudmFsdWVPZihyZXN1bHQuc2l6ZSgpKSkpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBsaW5rcwotICAgICAgICAgICAgVXJsQnVpbGRlciBiYXNlVXJsID0gY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZVNlcnZpY2VMaW5rKGJhc2VVcmwudG9TdHJpbmcoKSwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBzZWxmTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX0JVTEtfVVBEQVRFLCBudWxsKTsKLSAgICAgICAgICAgIGZlZWQud3JpdGVTZWxmTGluayhzZWxmTGluay50b1N0cmluZygpLCBudWxsKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgZW50cmllcwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeShmZWVkLmdldFdyaXRlcigpKTsKLSAgICAgICAgICAgICAgICBmb3IgKEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuIGlkQW5kVG9rZW4gOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChpZEFuZFRva2VuID09IG51bGwpIHx8IChpZEFuZFRva2VuLmdldElkKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YUltcGwgb2JqZWN0ID0gbmV3IE9iamVjdERhdGFJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXNJbXBsIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlJZEltcGwoUHJvcGVydHlJZHMuT0JKRUNUX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQW5kVG9rZW4uZ2V0TmV3SWQoKSAhPSBudWxsID8gaWRBbmRUb2tlbi5nZXROZXdJZCgpIDogaWRBbmRUb2tlbi5nZXRJZCgpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkQW5kVG9rZW4uZ2V0Q2hhbmdlVG9rZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOLCBpZEFuZFRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGFuZ2VUb2tlbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB3cml0ZU9iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3QsIG51bGwsIHJlcG9zaXRvcnlJZCwgbnVsbCwgbnVsbCwgYmFzZVVybCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGFyZSBkb25lCi0gICAgICAgICAgICBmZWVkLmVuZEZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9Qb2xpY3lTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL1BvbGljeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2NGU3YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL1BvbGljeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnk7Ci0KLS8qKgotICogUG9saWN5IFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFBvbGljeVNlcnZpY2UgewotCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdFBvbGljaWVzU2VydmljZUNhbGwgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZXMgYW4gZW50cnkgdGhhdCBpcyBhdHRhY2hlZCB0byBhbiBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVBvbGljeUVudHJ5KENtaXNTZXJ2aWNlIHNlcnZpY2UsIEF0b21FbnRyeSBlbnRyeSwgU3RyaW5nIG9iamVjdElkLCBPYmplY3REYXRhIHBvbGljeSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkLCBVcmxCdWlsZGVyIGJhc2VVcmwsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIE9iamVjdEluZm8gaW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIHBvbGljeS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGlmIChpbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBJbmZvIG5vdCBmb3VuZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3RhcnQKLSAgICAgICAgICAgIGVudHJ5LnN0YXJ0RW50cnkoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICAgICBlbnRyeS53cml0ZU9iamVjdChwb2xpY3ksIGluZm8sIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgbGlua3MKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgc2VsZkxpbmsgPSBjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9QT0xJQ0lFUywgb2JqZWN0SWQpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QT0xJQ1lfSUQsIGluZm8uZ2V0SWQoKSk7Ci0gICAgICAgICAgICBlbnRyeS53cml0ZVNlbGZMaW5rKHNlbGZMaW5rLnRvU3RyaW5nKCksIG51bGwpOwotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZW50cnkuZW5kRW50cnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhcHBsaWVkIHBvbGljaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0QXBwbGllZFBvbGljaWVzIGV4dGVuZHMgQWJzdHJhY3RQb2xpY2llc1NlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fRklMVEVSKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PE9iamVjdERhdGE+IHBvbGljaWVzID0gc2VydmljZS5nZXRBcHBsaWVkUG9saWNpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY2llcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQb2xpY2llcyBhcmUgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0SW5mbyBvYmplY3RJbmZvID0gc2VydmljZS5nZXRPYmplY3RJbmZvKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdEluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IEluZm8gaXMgbWlzc2luZyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgQXRvbUZlZWQgZmVlZCA9IG5ldyBBdG9tRmVlZCgpOwotICAgICAgICAgICAgZmVlZC5zdGFydERvY3VtZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXROYW1lc3BhY2VzKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIGZlZWQuc3RhcnRGZWVkKHRydWUpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBiYXNpYyBBdG9tIGZlZWQgZWxlbWVudHMKLSAgICAgICAgICAgIGZlZWQud3JpdGVGZWVkRWxlbWVudHMob2JqZWN0SW5mby5nZXRJZCgpLCBvYmplY3RJbmZvLmdldEF0b21JZCgpLCBvYmplY3RJbmZvLmdldENyZWF0ZWRCeSgpLAotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLmdldE5hbWUoKSwgb2JqZWN0SW5mby5nZXRMYXN0TW9kaWZpY2F0aW9uRGF0ZSgpLCBudWxsLCBudWxsKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgbGlua3MKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgYmFzZVVybCA9IGNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIGZlZWQud3JpdGVTZXJ2aWNlTGluayhiYXNlVXJsLnRvU3RyaW5nKCksIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIFVybEJ1aWxkZXIgc2VsZkxpbmsgPSBjb21waWxlVXJsQnVpbGRlcihiYXNlVXJsLCBSRVNPVVJDRV9QT0xJQ0lFUywgb2JqZWN0SW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICAgICAgZmVlZC53cml0ZVNlbGZMaW5rKHNlbGZMaW5rLnRvU3RyaW5nKCksIG51bGwpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBlbnRyaWVzCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KGZlZWQuZ2V0V3JpdGVyKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIHBvbGljeSA6IHBvbGljaWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZVBvbGljeUVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3RJbmZvLmdldElkKCksIHBvbGljeSwgcmVwb3NpdG9yeUlkLCBiYXNlVXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGZlZWQuZW5kRmVlZCgpOwotICAgICAgICAgICAgZmVlZC5lbmREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbHkgcG9saWN5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwbHlQb2xpY3kgZXh0ZW5kcyBBYnN0cmFjdFBvbGljaWVzU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0KLSAgICAgICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IChUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5KSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ2FsbENvbnRleHQuU1RSRUFNX0ZBQ1RPUlkpOwotICAgICAgICAgICAgQXRvbUVudHJ5UGFyc2VyIHBhcnNlciA9IG5ldyBBdG9tRW50cnlQYXJzZXIocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLCBzdHJlYW1GYWN0b3J5KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNlcnZpY2UuYXBwbHlQb2xpY3kocmVwb3NpdG9yeUlkLCBwYXJzZXIuZ2V0SWQoKSwgb2JqZWN0SWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0SW5mbyBvYmplY3RJbmZvID0gc2VydmljZS5nZXRPYmplY3RJbmZvKHJlcG9zaXRvcnlJZCwgcGFyc2VyLmdldElkKCkpOwotICAgICAgICAgICAgaWYgKG9iamVjdEluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IEluZm8gaXMgbWlzc2luZyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBwb2xpY3kgPSBvYmplY3RJbmZvLmdldE9iamVjdCgpOwotICAgICAgICAgICAgaWYgKHBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQb2xpY3kgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgYmFzZVVybCA9IGNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBVcmxCdWlsZGVyIGxvY2F0aW9uID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfUE9MSUNJRVMsIG9iamVjdElkKTsKLSAgICAgICAgICAgIGxvY2F0aW9uLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUE9MSUNZX0lELCBwb2xpY3kuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtTG9jYXRpb24iLCBsb2NhdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiTG9jYXRpb24iLCBsb2NhdGlvbi50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KCk7Ci0gICAgICAgICAgICBlbnRyeS5zdGFydERvY3VtZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXROYW1lc3BhY2VzKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIHdyaXRlUG9saWN5RW50cnkoc2VydmljZSwgZW50cnksIG9iamVjdElkLCBwb2xpY3ksIHJlcG9zaXRvcnlJZCwgYmFzZVVybCwgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgIGVudHJ5LmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgcG9saWN5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVtb3ZlUG9saWN5IGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0gICAgICAgICAgICBTdHJpbmcgcG9saWN5SWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5yZW1vdmVQb2xpY3kocmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PX0NPTlRFTlQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9SZWxhdGlvbnNoaXBTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL1JlbGF0aW9uc2hpcFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwMzk5My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL1JlbGF0aW9uc2hpcFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm87Ci0KLS8qKgotICogUmVsYXRpb25zaGlwIFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogR2V0IG9iamVjdCByZWxhdGlvbnNoaXBzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0T2JqZWN0UmVsYXRpb25zaGlwcyBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TVUJfUkVMQVRJT05TSElQX1RZUEVTKTsKLSAgICAgICAgICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbiByZWxhdGlvbnNoaXBEaXJlY3Rpb24gPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBfRElSRUNUSU9OLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uY2xhc3MpOwotICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fVFlQRV9JRCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5UKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RMaXN0IHJlbGF0aW9uc2hpcHMgPSBzZXJ2aWNlLmdldE9iamVjdFJlbGF0aW9uc2hpcHMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLCByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIHR5cGVJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJSZWxhdGlvbnNoaXBzIGFyZSBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RJbmZvIG9iamVjdEluZm8gPSBzZXJ2aWNlLmdldE9iamVjdEluZm8ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgSW5mbyBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVEKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgZmVlZC5zdGFydEZlZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGJhc2ljIEF0b20gZmVlZCBlbGVtZW50cwotICAgICAgICAgICAgZmVlZC53cml0ZUZlZWRFbGVtZW50cyhvYmplY3RJbmZvLmdldElkKCksIG9iamVjdEluZm8uZ2V0QXRvbUlkKCksIG9iamVjdEluZm8uZ2V0Q3JlYXRlZEJ5KCksCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8uZ2V0TmFtZSgpLCBvYmplY3RJbmZvLmdldExhc3RNb2RpZmljYXRpb25EYXRlKCksIG51bGwsIHJlbGF0aW9uc2hpcHMuZ2V0TnVtSXRlbXMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHNlbGZMaW5rID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfUkVMQVRJT05TSElQUywgb2JqZWN0SW5mby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU1VCX1JFTEFUSU9OU0hJUF9UWVBFUywgaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQX0RJUkVDVElPTiwgcmVsYXRpb25zaGlwRGlyZWN0aW9uKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZUlkKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fRklMVEVSLCBmaWx0ZXIpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICAgICAgc2VsZkxpbmsuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMsIG1heEl0ZW1zKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVCwgc2tpcENvdW50KTsKLSAgICAgICAgICAgIGZlZWQud3JpdGVTZWxmTGluayhzZWxmTGluay50b1N0cmluZygpLCBudWxsKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBwYWdpbmdVcmwgPSBuZXcgVXJsQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfUkVMQVRJT05TSElQUywgb2JqZWN0SW5mby5nZXRJZCgpKSk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9TVUJfUkVMQVRJT05TSElQX1RZUEVTLCBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMpOwotICAgICAgICAgICAgcGFnaW5nVXJsLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQX0RJUkVDVElPTiwgcmVsYXRpb25zaGlwRGlyZWN0aW9uKTsKLSAgICAgICAgICAgIHBhZ2luZ1VybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICAgICAgZmVlZC53cml0ZVBhZ2luZ0xpbmtzKHBhZ2luZ1VybCwgbWF4SXRlbXMsIHNraXBDb3VudCwgcmVsYXRpb25zaGlwcy5nZXROdW1JdGVtcygpLAotICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBzLmhhc01vcmVJdGVtcygpLCBQQUdFX1NJWkUpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBlbnRyaWVzCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KGZlZWQuZ2V0V3JpdGVyKCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IHJlbGF0aW9uc2hpcHMuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZU9iamVjdEVudHJ5KHNlcnZpY2UsIGVudHJ5LCBvYmplY3QsIG51bGwsIHJlcG9zaXRvcnlJZCwgbnVsbCwgbnVsbCwgYmFzZVVybCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBleHRlbnNpb25zCi0gICAgICAgICAgICBmZWVkLndyaXRlRXh0ZW5zaW9ucyhyZWxhdGlvbnNoaXBzKTsKLQotICAgICAgICAgICAgLy8gd2UgYXJlIGRvbmUKLSAgICAgICAgICAgIGZlZWQuZW5kRmVlZCgpOwotICAgICAgICAgICAgZmVlZC5lbmREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9SZXBvc2l0b3J5U2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9SZXBvc2l0b3J5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZjZjMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvUmVwb3NpdG9yeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDaGFuZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVXJsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5DYWxsQ29udGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5UZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5OwotCi0vKioKLSAqIFJlcG9zaXRvcnkgU2VydmljZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogUmVuZGVycyB0aGUgc2VydmljZSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldFJlcG9zaXRvcmllcyBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHJlcG9zaXRvcnlJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUkVQT1NJVE9SWV9JRCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IGluZm9EYXRhTGlzdCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnlJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5mb0RhdGFMaXN0ID0gc2VydmljZS5nZXRSZXBvc2l0b3J5SW5mb3MobnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZm9EYXRhTGlzdCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc2VydmljZS5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5SWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIENhbGxDb250ZXh0SW1wbCkgewotICAgICAgICAgICAgICAgICAgICAoKENhbGxDb250ZXh0SW1wbCkgY29udGV4dCkucHV0KENhbGxDb250ZXh0LlJFUE9TSVRPUllfSUQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfU0VSVklDRSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgU2VydmljZURvY3VtZW50IHNlcnZpY2VEb2MgPSBuZXcgU2VydmljZURvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIHNlcnZpY2VEb2Muc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICBzZXJ2aWNlRG9jLnN0YXJ0U2VydmljZURvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbmZvRGF0YUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gY29udGV4dC5nZXRDbWlzVmVyc2lvbigpOwotICAgICAgICAgICAgICAgIGZvciAoUmVwb3NpdG9yeUluZm8gaW5mb0RhdGEgOiBpbmZvRGF0YUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9EYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcElkID0gaW5mb0RhdGEuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgVXJsQnVpbGRlciBiYXNlVXJsID0gY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwSWQpOwotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNRdWVyeSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRzVW5GaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0c011bHRpZmlsaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNGb2xkZXJUcmVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VwcG9ydHNSb290RGVzY2VuZGFudHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0c0NoYW5nZXMgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb0RhdGEuZ2V0Q2FwYWJpbGl0aWVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBjYXAgPSBpbmZvRGF0YS5nZXRDYXBhYmlsaXRpZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhcC5nZXRRdWVyeUNhcGFiaWxpdHkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNRdWVyeSA9IChjYXAuZ2V0UXVlcnlDYXBhYmlsaXR5KCkgIT0gQ2FwYWJpbGl0eVF1ZXJ5Lk5PTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLmlzVW5maWxpbmdTdXBwb3J0ZWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNVbkZpbGluZyA9IGNhcC5pc1VuZmlsaW5nU3VwcG9ydGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXAuaXNNdWx0aWZpbGluZ1N1cHBvcnRlZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c011bHRpZmlsaW5nID0gY2FwLmlzTXVsdGlmaWxpbmdTdXBwb3J0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhcC5pc0dldEZvbGRlclRyZWVTdXBwb3J0ZWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNGb2xkZXJUcmVlID0gY2FwLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNSb290RGVzY2VuZGFudHMgPSBjYXAuaXNHZXREZXNjZW5kYW50c1N1cHBvcnRlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FwLmdldENoYW5nZXNDYXBhYmlsaXR5KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzQ2hhbmdlcyA9IChjYXAuZ2V0Q2hhbmdlc0NhcGFiaWxpdHkoKSAhPSBDYXBhYmlsaXR5Q2hhbmdlcy5OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEb2Muc3RhcnRXb3Jrc3BhY2UoaW5mb0RhdGEuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGNvbGxlY3Rpb25zCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gLSByb290IGNvbGxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZURvYy53cml0ZUNvbGxlY3Rpb24oY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9DSElMRFJFTiwgaW5mb0RhdGEuZ2V0Um9vdEZvbGRlcklkKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5DT0xMRUNUSU9OX1JPT1QsICJSb290IENvbGxlY3Rpb24iLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5NRURJQVRZUEVfQ01JU0FUT00pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIC0gdHlwZXMgY29sbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlQ29sbGVjdGlvbihjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTLCBudWxsKSwgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR5cGVzIENvbGxlY3Rpb24iLCAiIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gLSBxdWVyeSBjb2xsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c1F1ZXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlQ29sbGVjdGlvbihjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1FVRVJZLCBudWxsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkNPTExFQ1RJT05fUVVFUlksICJRdWVyeSBDb2xsZWN0aW9uIiwgQ29uc3RhbnRzLk1FRElBVFlQRV9RVUVSWSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyAtIGNoZWNrZWQgb3V0IGNvbGxlY3Rpb24gY29sbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlQ29sbGVjdGlvbihjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0NIRUNLRURPVVQsIG51bGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5DT0xMRUNUSU9OX0NIRUNLRURPVVQsICJDaGVja2VkIE91dCBDb2xsZWN0aW9uIiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DTUlTQVRPTSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gLSB1bmZpbGVkIGNvbGxlY3Rpb24gY29sbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNVbkZpbGluZyB8fCBzdXBwb3J0c011bHRpZmlsaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlQ29sbGVjdGlvbihjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1VORklMRUQsIG51bGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQ09MTEVDVElPTl9VTkZJTEVELCAiVW5maWxlZCBDb2xsZWN0aW9uIiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DTUlTQVRPTSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyAtIGJ1bGsgdXBkYXRlIGNvbGxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZURvYy53cml0ZUNvbGxlY3Rpb24oY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9CVUxLX1VQREFURSwgbnVsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkNPTExFQ1RJT05fQlVMS19VUERBVEUsICJCdWxrIFVwZGF0ZSBDb2xsZWN0aW9uIiwgQ29uc3RhbnRzLk1FRElBVFlQRV9DTUlTQVRPTSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHJlcG9zaXRvcnkgaW5mbwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlUmVwb3NpdG9yeUluZm8oaW5mb0RhdGEsIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbGlua3MKLQotICAgICAgICAgICAgICAgICAgICAvLyAtIHR5cGVzIGRlc2NlbmRhbnRzCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEb2Mud3JpdGVMaW5rKENvbnN0YW50cy5SRVBfUkVMX1RZUEVERVNDLCBjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTREVTQywgbnVsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLk1FRElBVFlQRV9GRUVELCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyAtIGZvbGRlciB0cmVlCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c0ZvbGRlclRyZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEb2Mud3JpdGVMaW5rKENvbnN0YW50cy5SRVBfUkVMX0ZPTERFUlRSRUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRk9MREVSVFJFRSwgaW5mb0RhdGEuZ2V0Um9vdEZvbGRlcklkKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0RFU0NFTkRBTlRTLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIC0gcm9vdCBkZXNjZW5kYW50cwotICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNSb290RGVzY2VuZGFudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEb2Mud3JpdGVMaW5rKENvbnN0YW50cy5SRVBfUkVMX1JPT1RERVNDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0RFU0NFTkRBTlRTLCBpbmZvRGF0YS5nZXRSb290Rm9sZGVySWQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5NRURJQVRZUEVfREVTQ0VOREFOVFMsIGluZm9EYXRhLmdldFJvb3RGb2xkZXJJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIC0gY2hhbmdlcwotICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNDaGFuZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlTGluayhDb25zdGFudHMuUkVQX1JFTF9DSEFOR0VTLCBjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX0NIQU5HRVMsIG51bGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIFVSSSB0ZW1wbGF0ZXMKLQotICAgICAgICAgICAgICAgICAgICAvLyAtIG9iamVjdCBieSBpZAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9PQkpFQ1RCWUlELCBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIj9pZD17aWR9JmZpbHRlcj17ZmlsdGVyfSZpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucz17aW5jbHVkZUFsbG93YWJsZUFjdGlvbnN9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiZpbmNsdWRlQUNMPXtpbmNsdWRlQUNMfSZpbmNsdWRlUG9saWN5SWRzPXtpbmNsdWRlUG9saWN5SWRzfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICImaW5jbHVkZVJlbGF0aW9uc2hpcHM9e2luY2x1ZGVSZWxhdGlvbnNoaXBzfSZyZW5kaXRpb25GaWx0ZXI9e3JlbmRpdGlvbkZpbHRlcn0iOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlVXJpVGVtcGxhdGUodXJsLCBDb25zdGFudHMuVEVNUExBVEVfT0JKRUNUX0JZX0lELCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyAtIG9iamVjdCBieSBwYXRoCi0gICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfT0JKRUNUQllQQVRILCBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIj9wYXRoPXtwYXRofSZmaWx0ZXI9e2ZpbHRlcn0maW5jbHVkZUFsbG93YWJsZUFjdGlvbnM9e2luY2x1ZGVBbGxvd2FibGVBY3Rpb25zfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICImaW5jbHVkZUFDTD17aW5jbHVkZUFDTH0maW5jbHVkZVBvbGljeUlkcz17aW5jbHVkZVBvbGljeUlkc30iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJmluY2x1ZGVSZWxhdGlvbnNoaXBzPXtpbmNsdWRlUmVsYXRpb25zaGlwc30mcmVuZGl0aW9uRmlsdGVyPXtyZW5kaXRpb25GaWx0ZXJ9IjsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZURvYy53cml0ZVVyaVRlbXBsYXRlKHVybCwgQ29uc3RhbnRzLlRFTVBMQVRFX09CSkVDVF9CWV9QQVRILCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyAtIHR5cGUgYnkgaWQKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9UWVBFLCBudWxsKSArICI/aWQ9e2lkfSI7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEb2Mud3JpdGVVcmlUZW1wbGF0ZSh1cmwsIENvbnN0YW50cy5URU1QTEFURV9UWVBFX0JZX0lELCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyAtIHF1ZXJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c1F1ZXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1FVRVJZLCBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI/cT17cX0mc2VhcmNoQWxsVmVyc2lvbnM9e3NlYXJjaEFsbFZlcnNpb25zfSZpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucz17aW5jbHVkZUFsbG93YWJsZUFjdGlvbnN9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICImaW5jbHVkZVJlbGF0aW9uc2hpcHM9e2luY2x1ZGVSZWxhdGlvbnNoaXBzfSZtYXhJdGVtcz17bWF4SXRlbXN9JnNraXBDb3VudD17c2tpcENvdW50fSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLndyaXRlVXJpVGVtcGxhdGUodXJsLCBDb25zdGFudHMuVEVNUExBVEVfUVVFUlksIENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRG9jLmVuZFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZURvYy5lbmRTZXJ2aWNlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIHNlcnZpY2VEb2MuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbmRlcnMgYSB0eXBlIGNoaWxkcmVuIGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRUeXBlQ2hpbGRyZW4gZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9UWVBFX0lEKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9QUk9QRVJUWV9ERUZJTklUSU9OUywKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcyA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUyk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIHNraXBDb3VudCA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdCB0eXBlTGlzdCA9IHNlcnZpY2UuZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG51bUl0ZW1zID0gKHR5cGVMaXN0ID09IG51bGwgPyBudWxsIDogdHlwZUxpc3QuZ2V0TnVtSXRlbXMoKSk7Ci0gICAgICAgICAgICBCb29sZWFuIGhhc01vcmVJdGVtcyA9ICh0eXBlTGlzdCA9PSBudWxsID8gbnVsbCA6IHR5cGVMaXN0Lmhhc01vcmVJdGVtcygpKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhcmVudFR5cGVJZCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAiVHlwZSBDaGlsZHJlbiI7Ci0KLSAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGdldCB0aGUgcGFyZW50IHR5cGUsIHdlIG5lZWQgdGhlIHR5cGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAgICAgLy8gdGhpcyB0eXBlIGFzIHdlbGwKLSAgICAgICAgICAgIGlmICh0eXBlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uID0gc2VydmljZS5nZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBwYXJlbnRUeXBlSWQgPSAodHlwZURlZmluaXRpb24gPT0gbnVsbCA/IG51bGwgOiB0eXBlRGVmaW5pdGlvbi5nZXRQYXJlbnRUeXBlSWQoKSk7Ci0gICAgICAgICAgICAgICAgdHlwZU5hbWUgPSAodHlwZURlZmluaXRpb24gPT0gbnVsbCA/IHR5cGVJZCA6IHR5cGVEZWZpbml0aW9uLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRkVFRCk7Ci0KLSAgICAgICAgICAgIEF0b21GZWVkIGZlZWQgPSBuZXcgQXRvbUZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RmVlZCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgYmFzaWMgQXRvbSBmZWVkIGVsZW1lbnRzCi0gICAgICAgICAgICBmZWVkLndyaXRlRmVlZEVsZW1lbnRzKHR5cGVJZCwgbnVsbCwgVFlQRV9BVVRIT1IsIHR5cGVOYW1lLCBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKSwgbnVsbCwgbnVtSXRlbXMpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBsaW5rcwotICAgICAgICAgICAgVXJsQnVpbGRlciBiYXNlVXJsID0gY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZVNlcnZpY2VMaW5rKGJhc2VVcmwudG9TdHJpbmcoKSwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBzZWxmTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTLCBudWxsKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZUlkKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fUFJPUEVSVFlfREVGSU5JVElPTlMsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgICAgIHNlbGZMaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fTUFYX0lURU1TLCBtYXhJdGVtcyk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQsIHNraXBDb3VudCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlU2VsZkxpbmsoc2VsZkxpbmsudG9TdHJpbmcoKSwgdHlwZUlkKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZVZpYUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9UWVBFLCB0eXBlSWQpKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBkb3duTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTREVTQywgbnVsbCk7Ci0gICAgICAgICAgICBkb3duTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlRG93bkxpbmsoZG93bkxpbmsudG9TdHJpbmcoKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9ERVNDRU5EQU5UUyk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnRUeXBlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZlZWQud3JpdGVVcExpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9UWVBFLCBwYXJlbnRUeXBlSWQpLCBDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgcGFnaW5nIGxpbmtzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIHBhZ2luZ1VybCA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTLCBudWxsKTsKLSAgICAgICAgICAgIHBhZ2luZ1VybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgICAgICBwYWdpbmdVcmwuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9QUk9QRVJUWV9ERUZJTklUSU9OUywgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpOwotICAgICAgICAgICAgZmVlZC53cml0ZVBhZ2luZ0xpbmtzKHBhZ2luZ1VybCwgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVtSXRlbXMsIGhhc01vcmVJdGVtcywgUEFHRV9TSVpFKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgY29sbGVjdGlvbgotICAgICAgICAgICAgVXJsQnVpbGRlciBjb2xsZWN0aW9uVXJsID0gY29tcGlsZVVybEJ1aWxkZXIoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRVMsIG51bGwpOwotICAgICAgICAgICAgY29sbGVjdGlvblVybC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlQ29sbGVjdGlvbihjb2xsZWN0aW9uVXJsLnRvU3RyaW5nKCksIG51bGwsICJUeXBlcyBDb2xsZWN0aW9uIiwgIiIpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSB0eXBlIGVudHJpZXMKLSAgICAgICAgICAgIGlmICgodHlwZUxpc3QgIT0gbnVsbCkgJiYgKHR5cGVMaXN0LmdldExpc3QoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IG5ldyBBdG9tRW50cnkoZmVlZC5nZXRXcml0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0eXBlIDogdHlwZUxpc3QuZ2V0TGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZUVudHJ5KGVudHJ5LCB0eXBlLCBudWxsLCByZXBvc2l0b3J5SWQsIGJhc2VVcmwsIGZhbHNlLCBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgZXh0ZW5zaW9ucwotICAgICAgICAgICAgZmVlZC53cml0ZUV4dGVuc2lvbnModHlwZUxpc3QpOwotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZmVlZC5lbmRGZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5kZXJzIGEgdHlwZSBkZXNjZW5kYW50cyBmZWVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0VHlwZURlc2NlbmRhbnRzIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fVFlQRV9JRCk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGRlcHRoID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fREVQVEgpOwotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1BST1BFUlRZX0RFRklOSVRJT05TLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gdHlwZVRyZWUgPSBzZXJ2aWNlLmdldFR5cGVEZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYXJlbnRUeXBlSWQgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gIlR5cGUgQ2hpbGRyZW4iOwotCi0gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBnZXQgdGhlIHBhcmVudCB0eXBlLCB3ZSBuZWVkIHRoZSB0eXBlIGRlZmluaXRpb24gb2YKLSAgICAgICAgICAgIC8vIHRoaXMgdHlwZSBhcyB3ZWxsCi0gICAgICAgICAgICBpZiAodHlwZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IHNlcnZpY2UuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgcGFyZW50VHlwZUlkID0gKHR5cGVEZWZpbml0aW9uID09IG51bGwgPyBudWxsIDogdHlwZURlZmluaXRpb24uZ2V0UGFyZW50VHlwZUlkKCkpOwotICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gKHR5cGVEZWZpbml0aW9uID09IG51bGwgPyB0eXBlSWQgOiB0eXBlRGVmaW5pdGlvbi5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgICAgICBBdG9tRmVlZCBmZWVkID0gbmV3IEF0b21GZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgZmVlZC5zdGFydEZlZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGJhc2ljIEF0b20gZmVlZCBlbGVtZW50cwotICAgICAgICAgICAgZmVlZC53cml0ZUZlZWRFbGVtZW50cyh0eXBlSWQsIG51bGwsIFRZUEVfQVVUSE9SLCB0eXBlTmFtZSwgbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCksIG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBsaW5rcwotICAgICAgICAgICAgVXJsQnVpbGRlciBiYXNlVXJsID0gY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZVNlcnZpY2VMaW5rKGJhc2VVcmwudG9TdHJpbmcoKSwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBzZWxmTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTREVTQywgbnVsbCk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX0RFUFRILCBkZXB0aCk7Ci0gICAgICAgICAgICBzZWxmTGluay5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1BST1BFUlRZX0RFRklOSVRJT05TLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyk7Ci0gICAgICAgICAgICBmZWVkLndyaXRlU2VsZkxpbmsoc2VsZkxpbmsudG9TdHJpbmcoKSwgdHlwZUlkKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZVZpYUxpbmsoY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9UWVBFLCB0eXBlSWQpKTsKLQotICAgICAgICAgICAgVXJsQnVpbGRlciBkb3duTGluayA9IGNvbXBpbGVVcmxCdWlsZGVyKGJhc2VVcmwsIFJFU09VUkNFX1RZUEVTLCBudWxsKTsKLSAgICAgICAgICAgIGRvd25MaW5rLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZUlkKTsKLSAgICAgICAgICAgIGZlZWQud3JpdGVEb3duTGluayhkb3duTGluay50b1N0cmluZygpLCBDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgICAgICBpZiAocGFyZW50VHlwZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmZWVkLndyaXRlVXBMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgcGFyZW50VHlwZUlkKSwgQ29uc3RhbnRzLk1FRElBVFlQRV9FTlRSWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIHRyZWUKLSAgICAgICAgICAgIGlmICh0eXBlVHJlZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeShmZWVkLmdldFdyaXRlcigpKTsKLQotICAgICAgICAgICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgY29udGFpbmVyIDogdHlwZVRyZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb250YWluZXIgIT0gbnVsbCkgJiYgKGNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGVFbnRyeShlbnRyeSwgY29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCksIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLCByZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVcmwsIGZhbHNlLCBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZQotICAgICAgICAgICAgZmVlZC5lbmRGZWVkKCk7Ci0gICAgICAgICAgICBmZWVkLmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW5kZXJzIGEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0VHlwZURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHNlcnZpY2UuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLQotICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeSgpOwotICAgICAgICAgICAgZW50cnkuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGVFbnRyeShlbnRyeSwgdHlwZSwgbnVsbCwgcmVwb3NpdG9yeUlkLCBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgZW50cnkuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3JlYXRlVHlwZSBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gcGFyc2UgZW50cnkKLSAgICAgICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IChUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5KSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ2FsbENvbnRleHQuU1RSRUFNX0ZBQ1RPUlkpOwotICAgICAgICAgICAgQXRvbUVudHJ5UGFyc2VyIHBhcnNlciA9IG5ldyBBdG9tRW50cnlQYXJzZXIoc3RyZWFtRmFjdG9yeSk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gbmV3VHlwZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbmV3VHlwZSA9IHNlcnZpY2UuY3JlYXRlVHlwZShyZXBvc2l0b3J5SWQsIHBhcnNlci5nZXRUeXBlRGVmaW5pdGlvbigpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHBhcnNlci5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfVFlQRSwgbmV3VHlwZS5nZXRJZCgpKSk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIFhNTAotICAgICAgICAgICAgQXRvbUVudHJ5IGVudHJ5ID0gbmV3IEF0b21FbnRyeSgpOwotICAgICAgICAgICAgZW50cnkuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICB3cml0ZVR5cGVFbnRyeShlbnRyeSwgbmV3VHlwZSwgbnVsbCwgcmVwb3NpdG9yeUlkLCBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgZW50cnkuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgYSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVXBkYXRlVHlwZSBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gcGFyc2UgZW50cnkKLSAgICAgICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IChUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5KSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXQoQ2FsbENvbnRleHQuU1RSRUFNX0ZBQ1RPUlkpOwotICAgICAgICAgICAgQXRvbUVudHJ5UGFyc2VyIHBhcnNlciA9IG5ldyBBdG9tRW50cnlQYXJzZXIoc3RyZWFtRmFjdG9yeSk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gbmV3VHlwZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbmV3VHlwZSA9IHNlcnZpY2UudXBkYXRlVHlwZShyZXBvc2l0b3J5SWQsIHBhcnNlci5nZXRUeXBlRGVmaW5pdGlvbigpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHBhcnNlci5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0VOVFJZKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiTG9jYXRpb24iLCBjb21waWxlVXJsKGJhc2VVcmwsIFJFU09VUkNFX1RZUEUsIG5ld1R5cGUuZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IG5ldyBBdG9tRW50cnkoKTsKLSAgICAgICAgICAgIGVudHJ5LnN0YXJ0RG9jdW1lbnQocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldE5hbWVzcGFjZXMoc2VydmljZSkpOwotICAgICAgICAgICAgd3JpdGVUeXBlRW50cnkoZW50cnksIG5ld1R5cGUsIG51bGwsIHJlcG9zaXRvcnlJZCwgY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICAgICAgICAgIGVudHJ5LmVuZERvY3VtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGEgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlbGV0ZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9JRCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT19DT05URU5UKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvU2VydmljZURvY3VtZW50LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL1NlcnZpY2VEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFmZDUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvU2VydmljZURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLQotLyoqCi0gKiBTZXJ2aWNlIGRvY3VtZW50IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZURvY3VtZW50IGV4dGVuZHMgQXRvbURvY3VtZW50QmFzZSB7Ci0KLSAgICBwdWJsaWMgU2VydmljZURvY3VtZW50KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmljZURvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4c3cgPSBnZXRXcml0ZXIoKTsKLSAgICAgICAgCi0gICAgICAgIHhzdy53cml0ZVN0YXJ0RWxlbWVudChYTUxDb25zdGFudHMuUFJFRklYX0FQUCwgInNlcnZpY2UiLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQUCk7Ci0KLSAgICAgICAgeHN3LndyaXRlTmFtZXNwYWNlKFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NKTsKLSAgICAgICAgeHN3LndyaXRlTmFtZXNwYWNlKFhNTENvbnN0YW50cy5QUkVGSVhfQ01JUywgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9DTUlTKTsKLSAgICAgICAgeHN3LndyaXRlTmFtZXNwYWNlKFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00pOwotICAgICAgICB4c3cud3JpdGVOYW1lc3BhY2UoWE1MQ29uc3RhbnRzLlBSRUZJWF9BUFAsIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVBQKTsKLQotICAgICAgICB3cml0ZUFsbEN1c3RvbU5hbWVzcGFjZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZFNlcnZpY2VEb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBnZXRXcml0ZXIoKS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydFdvcmtzcGFjZShTdHJpbmcgdGl0bGUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeHN3ID0gZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgeHN3LndyaXRlU3RhcnRFbGVtZW50KFhNTENvbnN0YW50cy5QUkVGSVhfQVBQLCAid29ya3NwYWNlIiwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BUFApOwotICAgICAgICBYTUxVdGlscy53cml0ZSh4c3csIFhNTENvbnN0YW50cy5QUkVGSVhfQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9BVE9NLCAidGl0bGUiLCB0aXRsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kV29ya3NwYWNlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFdyaXRlcigpLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUmVwb3NpdG9yeUluZm8oUmVwb3NpdG9yeUluZm8gcmVwSW5mbywgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxDb252ZXJ0ZXIud3JpdGVSZXBvc2l0b3J5SW5mbyhnZXRXcml0ZXIoKSwgY21pc1ZlcnNpb24sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sIHJlcEluZm8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVXJpVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIG1lZGlhdHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4c3cgPSBnZXRXcml0ZXIoKTsKLQotICAgICAgICB4c3cud3JpdGVTdGFydEVsZW1lbnQoWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgInVyaXRlbXBsYXRlIiwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHhzdywgWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSwgInRlbXBsYXRlIiwgdGVtcGxhdGUpOwotICAgICAgICBYTUxVdGlscy53cml0ZSh4c3csIFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sICJ0eXBlIiwgdHlwZSk7Ci0gICAgICAgIFhNTFV0aWxzLndyaXRlKHhzdywgWE1MQ29uc3RhbnRzLlBSRUZJWF9SRVNUQVRPTSwgWE1MQ29uc3RhbnRzLk5BTUVTUEFDRV9SRVNUQVRPTSwgIm1lZGlhdHlwZSIsIG1lZGlhdHlwZSk7Ci0gICAgICAgIHhzdy53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL1ZlcnNpb25pbmdTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9hdG9tcHViL1ZlcnNpb25pbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDEwYzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9WZXJzaW9uaW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db2xsZWN0aW9uc0hlbHBlci5pc051bGxPckVtcHR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlVybEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5UZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5OwotCi0vKioKLSAqIFZlcnNpb25pbmcgU2VydmljZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvbmluZ1NlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgT3V0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hlY2tPdXQgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3RvcnkgPSAoVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSkgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0KENhbGxDb250ZXh0LlNUUkVBTV9GQUNUT1JZKTsKLSAgICAgICAgICAgIEF0b21FbnRyeVBhcnNlciBwYXJzZXIgPSBuZXcgQXRvbUVudHJ5UGFyc2VyKHN0cmVhbUZhY3RvcnkpOwotICAgICAgICAgICAgcGFyc2VyLnNldElnbm9yZUF0b21Db250ZW50U3JjKHRydWUpOyAvLyBuZWVkZWQgZm9yIHNvbWUgY2xpZW50cwotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoZWNrT3V0SWQgPSBuZXcgSG9sZGVyPFN0cmluZz4ocGFyc2VyLmdldElkKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNlcnZpY2UuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBjaGVja091dElkLCBudWxsLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHBhcnNlci5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluZm8gb2JqZWN0SW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIGNoZWNrT3V0SWQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgSW5mbyBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IG9iamVjdEluZm8uZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2JqZWN0LmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IElkIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gY29tcGlsZVVybChiYXNlVXJsLCBSRVNPVVJDRV9FTlRSWSwgb2JqZWN0LmdldElkKCkpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKENvbnN0YW50cy5NRURJQVRZUEVfRU5UUlkpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJDb250ZW50LUxvY2F0aW9uIiwgbG9jYXRpb24pOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGxvY2F0aW9uKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgWE1MCi0gICAgICAgICAgICBBdG9tRW50cnkgZW50cnkgPSBuZXcgQXRvbUVudHJ5KCk7Ci0gICAgICAgICAgICBlbnRyeS5zdGFydERvY3VtZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXROYW1lc3BhY2VzKHNlcnZpY2UpKTsKLSAgICAgICAgICAgIHdyaXRlT2JqZWN0RW50cnkoc2VydmljZSwgZW50cnksIG9iamVjdCwgbnVsbCwgcmVwb3NpdG9yeUlkLCBudWxsLCBudWxsLCBiYXNlVXJsLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldENtaXNWZXJzaW9uKCkpOwotICAgICAgICAgICAgZW50cnkuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgdmVyc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRBbGxWZXJzaW9ucyBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fVkVSU0lPTl9TRVJJRVNfSUQpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUyk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxPYmplY3REYXRhPiB2ZXJzaW9ucyA9IHNlcnZpY2UuZ2V0QWxsVmVyc2lvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHZlcnNpb25zKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVmVyc2lvbiBsaXN0IGlzIG51bGwgb3IgZW1wdHkhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShDb25zdGFudHMuTUVESUFUWVBFX0ZFRUQpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBYTUwKLSAgICAgICAgICAgIEF0b21GZWVkIGZlZWQgPSBuZXcgQXRvbUZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuc3RhcnREb2N1bWVudChyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgZ2V0TmFtZXNwYWNlcyhzZXJ2aWNlKSk7Ci0gICAgICAgICAgICBmZWVkLnN0YXJ0RmVlZCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgYmFzaWMgQXRvbSBmZWVkIGVsZW1lbnRzCi0gICAgICAgICAgICBPYmplY3RJbmZvIGxhdGVzdE9iamVjdEluZm8gPSBzZXJ2aWNlLmdldE9iamVjdEluZm8ocmVwb3NpdG9yeUlkLCB2ZXJzaW9ucy5nZXQoMCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBPYmplY3RJbmZvIGZpcnN0T2JqZWN0SW5mbyA9IHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIHZlcnNpb25zLmdldCh2ZXJzaW9ucy5zaXplKCkgLSAxKS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgZmVlZC53cml0ZUZlZWRFbGVtZW50cyh2ZXJzaW9uU2VyaWVzSWQsIG51bGwsIGZpcnN0T2JqZWN0SW5mby5nZXRDcmVhdGVkQnkoKSwgbGF0ZXN0T2JqZWN0SW5mby5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGxhdGVzdE9iamVjdEluZm8uZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGxpbmtzCi0gICAgICAgICAgICBVcmxCdWlsZGVyIGJhc2VVcmwgPSBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBmZWVkLndyaXRlU2VydmljZUxpbmsoYmFzZVVybC50b1N0cmluZygpLCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBpZiAob2JqZWN0SWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZlZWQud3JpdGVWaWFMaW5rKGNvbXBpbGVVcmwoYmFzZVVybCwgUkVTT1VSQ0VfRU5UUlksIG9iamVjdElkKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIGVudHJpZXMKLSAgICAgICAgICAgIEF0b21FbnRyeSBlbnRyeSA9IG5ldyBBdG9tRW50cnkoZmVlZC5nZXRXcml0ZXIoKSk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0IDogdmVyc2lvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyaXRlT2JqZWN0RW50cnkoc2VydmljZSwgZW50cnksIG9iamVjdCwgbnVsbCwgcmVwb3NpdG9yeUlkLCBudWxsLCBudWxsLCBiYXNlVXJsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGFyZSBkb25lCi0gICAgICAgICAgICBmZWVkLmVuZEZlZWQoKTsKLSAgICAgICAgICAgIGZlZWQuZW5kRG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWxldGVBbGxWZXJzaW9ucyBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fSUQpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlT2JqZWN0T3JDYW5jZWxDaGVja091dChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBCb29sZWFuLlRSVUUsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PX0NPTlRFTlQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9YTUxEb2N1bWVudEJhc2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2F0b21wdWIvWE1MRG9jdW1lbnRCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjQ0YjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYXRvbXB1Yi9YTUxEb2N1bWVudEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYXRvbXB1YjsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFhNTCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxEb2N1bWVudEJhc2UgewotCi0gICAgcHJpdmF0ZSBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VzOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmFtZXNwYWNlcyBmb3IgdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZXMoTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VzKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVyLnNldFByZWZpeChYTUxDb25zdGFudHMuUFJFRklYX0FUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfQVRPTSk7Ci0gICAgICAgIHdyaXRlci5zZXRQcmVmaXgoWE1MQ29uc3RhbnRzLlBSRUZJWF9DTUlTLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMpOwotICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFhNTENvbnN0YW50cy5QUkVGSVhfUkVTVEFUT00sIFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00pOwotICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFhNTENvbnN0YW50cy5QUkVGSVhfQVBQLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0FQUCk7Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlczsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBucyA6IG5hbWVzcGFjZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgobnMuZ2V0S2V5KCksIG5zLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGN1c3RvbSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gdG8gdGhlIGN1cnJlbnQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQWxsQ3VzdG9tTmFtZXNwYWNlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBucyA6IG5hbWVzcGFjZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShucy5nZXRLZXkoKSwgbnMuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgdGhlIGRvY3VtZW50IGFuZCBzZXRzIHRoZSBuYW1lc3BhY2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoT3V0cHV0U3RyZWFtIG91dCwgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VzKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgd3JpdGVyCi0gICAgICAgIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihvdXQpOwotCi0gICAgICAgIC8vIHN0YXJ0IHRoZSBkb2N1bWVudAotICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KElPVXRpbHMuVVRGOCwgIjEuMCIpOwotICAgICAgICBzZXROYW1lc3BhY2VzKG5hbWVzcGFjZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmlzaGVzIHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAod3JpdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVuZCB0aGUgZG9jdW1lbnQKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLQotICAgICAgICAvLyB3ZSBhcmUgZG9uZS4KLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgd3JpdGVyIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtV3JpdGVyIGdldFdyaXRlcigpIHsKLSAgICAgICAgcmV0dXJuIHdyaXRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3cml0ZXIgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFdyaXRlcihYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5OWE3Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0Fic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLio7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVHlwZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUJvb2xlYW5JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEZWNpbWFsSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTlN0cmVhbUF3YXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuQWJzdHJhY3RTZXJ2aWNlQ2FsbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkRpc3BhdGNoZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCBleHRlbmRzIEFic3RyYWN0U2VydmljZUNhbGwgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9NSU1FX1RZUEUgPSAiYXBwbGljYXRpb24vanNvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9NSU1FX1RZUEUgPSAidGV4dC9odG1sIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9GUkFHTUVOVCA9ICJyb290IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfUExBQ0VIT0xERVIgPSAie3JlcG9zaXRvcnlJZH0iOwotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZXMgdGhlIGJhc2UgVVJMIGZvciBsaW5rcywgY29sbGVjdGlvbnMgYW5kIHRlbXBsYXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVXJsQnVpbGRlciBjb21waWxlQmFzZVVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBTdHJpbmcgYmFzZVVybCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKERpc3BhdGNoZXIuQkFTRV9VUkxfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGJhc2VVcmwgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHJlcElkUG9zID0gYmFzZVVybC5pbmRleE9mKFJFUE9TSVRPUllfUExBQ0VIT0xERVIpOwotICAgICAgICAgICAgaWYgKHJlcElkUG9zIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVXJsQnVpbGRlcihiYXNlVXJsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmxCdWlsZGVyKGJhc2VVcmwuc3Vic3RyaW5nKDAsIHJlcElkUG9zKSArIHJlcG9zaXRvcnlJZAotICAgICAgICAgICAgICAgICAgICAgICAgKyBiYXNlVXJsLnN1YnN0cmluZyhyZXBJZFBvcyArIFJFUE9TSVRPUllfUExBQ0VIT0xERVIubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFVybEJ1aWxkZXIgdXJsID0gbmV3IFVybEJ1aWxkZXIocmVxdWVzdC5nZXRTY2hlbWUoKSwgcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCksIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpLCBudWxsKTsKLQotICAgICAgICB1cmwuYWRkUGF0aChyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpOwotICAgICAgICB1cmwuYWRkUGF0aChyZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkpOwotICAgICAgICB1cmwuYWRkUGF0aFNlZ21lbnQocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBVcmxCdWlsZGVyIGNvbXBpbGVSZXBvc2l0b3J5VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIHJldHVybiBjb21waWxlQmFzZVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBVcmxCdWlsZGVyIGNvbXBpbGVSb290VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIHJldHVybiBjb21waWxlUmVwb3NpdG9yeVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpLmFkZFBhdGhTZWdtZW50KFJPT1RfUEFUSF9GUkFHTUVOVCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlT2JqZWN0TG9jYXRpb25VcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICByZXR1cm4gY29tcGlsZVJvb3RVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX09CSkVDVF9JRCwgb2JqZWN0SWQpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb21waWxlVHlwZUxvY2F0aW9uVXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0gICAgICAgIHJldHVybiBjb21waWxlUmVwb3NpdG9yeVVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQpLmFkZFBhcmFtZXRlcihDb25zdGFudHMuUEFSQU1fVFlQRV9JRCwgdHlwZUlkKS50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBKU09OIHRvIHRoZSBzZXJ2bGV0IHJlc3BvbnNlIGFuZCBhZGRzIGEgY2FsbGJhY2sgd3JhcHBlciBpZgotICAgICAqIHJlcXVlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUpTT04oSlNPTlN0cmVhbUF3YXJlIGpzb24sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRva2VuID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9UT0tFTik7Ci0KLSAgICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgIlBPU1QiLmVxdWFscyhyZXF1ZXN0LmdldE1ldGhvZCgpKSkgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoSFRNTF9NSU1FX1RZUEUpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKEpTT05fTUlNRV9UWVBFKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldENoYXJhY3RlckVuY29kaW5nKElPVXRpbHMuVVRGOCk7Ci0KLSAgICAgICAgICAgIFByaW50V3JpdGVyIHB3ID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjYWxsYmFjayA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQ0FMTEJBQ0spOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrLm1hdGNoZXMoIltBLVphLXowLTkuX1xcW1xcXV0qIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY2FsbGJhY2sgbmFtZSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoY2FsbGJhY2sgKyAiKCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBqc29uLndyaXRlSlNPTlN0cmluZyhwdyk7Ci0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoIik7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKDApOwotICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShIVE1MX01JTUVfVFlQRSk7Ci0gICAgICAgIHJlc3BvbnNlLmdldFdyaXRlcigpLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0U2ltcGxlT2JqZWN0KENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgbnVsbCwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsICJjbWlzOm5vbmUiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZ2l2ZW4gSFRUUCBzdGF0dXMgY29kZSBpZiB0aGUgc3VycGVzc1Jlc3BvbnNlQ29kZXMgcGFyYW1ldGVyIGlzCi0gICAgICogbm90IHNldCB0byB0cnVlOyBvdGhlcndpc2Ugc2V0cyBIVFRQIHN0YXR1cyBjb2RlIDIwMCAoT0spLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgaW50IHN0YXR1c0NvZGUpIHsKLSAgICAgICAgaWYgKGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NVUFBSRVNTX1JFU1BPTlNFX0NPREVTLCBmYWxzZSkpIHsKLSAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKHN0YXR1c0NvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zZm9ybXMgdGhlIHRyYW5zYWN0aW9uIGludG8gYSBjb29raWUgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZU5hbWUoU3RyaW5nIHRva2VuKSB7Ci0gICAgICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAiY21pcyUiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICJjbWlzXyIgKyBCYXNlNjQuZW5jb2RlQnl0ZXMoSU9VdGlscy50b1VURjhCeXRlcyh0b2tlbikpLnJlcGxhY2UoJz0nLCAnJScpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSB0cmFuc2FjdGlvbiBjb29raWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29va2llKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdG9rZW4sCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgc2V0Q29va2llKHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQsIHRva2VuLCB2YWx1ZSwgMzYwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlcyBhIHRyYW5zYWN0aW9uIGNvb2tpZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVDb29raWUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0b2tlbikgewotICAgICAgICBzZXRDb29raWUocmVxdWVzdCwgcmVzcG9uc2UsIHJlcG9zaXRvcnlJZCwgdG9rZW4sICIiLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgdHJhbnNhY3Rpb24gY29va2llLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHRva2VuLAotICAgICAgICAgICAgU3RyaW5nIHZhbHVlLCBpbnQgZXhwaXJ5KSB7Ci0gICAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmIHRva2VuLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIGNvb2tpZVZhbHVlID0gSU9VdGlscy5lbmNvZGVVUkwodmFsdWUpOwotCi0gICAgICAgICAgICBDb29raWUgdHJhbnNhY3Rpb25Db29raWUgPSBuZXcgQ29va2llKGdldENvb2tpZU5hbWUodG9rZW4pLCBjb29raWVWYWx1ZSk7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbkNvb2tpZS5zZXRNYXhBZ2UoZXhwaXJ5KTsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uQ29va2llLnNldFBhdGgocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpICsgcmVxdWVzdC5nZXRTZXJ2bGV0UGF0aCgpICsgIi8iICsgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uQ29va2llLnNldFNlY3VyZShyZXF1ZXN0LmlzU2VjdXJlKCkpOwotCi0gICAgICAgICAgICByZXNwb25zZS5hZGRDb29raWUodHJhbnNhY3Rpb25Db29raWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVDb29raWVWYWx1ZShpbnQgY29kZSwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZXgsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLQotICAgICAgICByZXN1bHQucHV0KCJjb2RlIiwgY29kZSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoIm9iamVjdElkIiwgb2JqZWN0SWQgPT0gbnVsbCA/ICIiIDogb2JqZWN0SWQpOwotICAgICAgICByZXN1bHQucHV0KCJleGNlcHRpb24iLCBleCA9PSBudWxsID8gIiIgOiBleCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoIm1lc3NhZ2UiLCBtZXNzYWdlID09IG51bGwgPyAiIiA6IG1lc3NhZ2UpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9KU09OU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgY3JlYXRlTmV3UHJvcGVydGllcyhDb250cm9sUGFyc2VyIGNvbnRyb2xQYXJzZXIsIFR5cGVDYWNoZSB0eXBlQ2FjaGUpIHsKLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBwcm9wZXJ0aWVzID0gY29udHJvbFBhcnNlci5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9hZCBwcmltYXJ5IHR5cGUKLSAgICAgICAgTGlzdDxTdHJpbmc+IG9iamVjdFR5cGVJZHNWYWx1ZXMgPSBwcm9wZXJ0aWVzLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgIGlmIChpc05vdEVtcHR5KG9iamVjdFR5cGVJZHNWYWx1ZXMpKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gdHlwZUNhY2hlLmdldFR5cGVEZWZpbml0aW9uKG9iamVjdFR5cGVJZHNWYWx1ZXMuZ2V0KDApKTsKLSAgICAgICAgICAgIGlmICh0eXBlRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlOiAiICsgb2JqZWN0VHlwZUlkc1ZhbHVlcy5nZXQoMCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9hZCBzZWNvbmRhcnkgdHlwZXMKLSAgICAgICAgTGlzdDxTdHJpbmc+IHNlY29uZGFyeU9iamVjdFR5cGVJZHNWYWx1ZXMgPSBwcm9wZXJ0aWVzLmdldChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKTsKLSAgICAgICAgaWYgKGlzTm90RW1wdHkoc2Vjb25kYXJ5T2JqZWN0VHlwZUlkc1ZhbHVlcykpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHNlY1R5cGVJZCA6IHNlY29uZGFyeU9iamVjdFR5cGVJZHNWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gdHlwZUNhY2hlLmdldFR5cGVEZWZpbml0aW9uKHNlY1R5cGVJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVEZWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlOiAiICsgc2VjVHlwZUlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0aWVzSW1wbCByZXN1bHQgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHByb3BlcnR5IDogcHJvcGVydGllcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IHR5cGVDYWNoZS5nZXRQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgaWYgKHByb3BEZWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHByb3BlcnR5LmdldEtleSgpICsgIiBpcyB1bmtub3duISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQuYWRkUHJvcGVydHkoY3JlYXRlUHJvcGVydHlEYXRhKHByb3BEZWYsIHByb3BlcnR5LmdldFZhbHVlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgY3JlYXRlVXBkYXRlUHJvcGVydGllcyhDb250cm9sUGFyc2VyIGNvbnRyb2xQYXJzZXIsIFN0cmluZyB0eXBlSWQsIExpc3Q8U3RyaW5nPiBzZWNvbmRhcnlUeXBlSWRzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG9iamVjdElkcywgVHlwZUNhY2hlIHR5cGVDYWNoZSkgewotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHByb3BlcnRpZXMgPSBjb250cm9sUGFyc2VyLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb2FkIHByaW1hcnkgdHlwZQotICAgICAgICBpZiAodHlwZUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB0eXBlQ2FjaGUuZ2V0VHlwZURlZmluaXRpb24odHlwZUlkKTsKLSAgICAgICAgICAgIGlmICh0eXBlRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlOiAiICsgdHlwZUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvYWQgc2Vjb25kYXJ5IHR5cGVzCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzZWNvbmRhcnlPYmplY3RUeXBlSWRzVmFsdWVzID0gcHJvcGVydGllcy5nZXQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUyk7Ci0gICAgICAgIGlmIChpc05vdEVtcHR5KHNlY29uZGFyeU9iamVjdFR5cGVJZHNWYWx1ZXMpKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBzZWNUeXBlSWQgOiBzZWNvbmRhcnlPYmplY3RUeXBlSWRzVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHR5cGVDYWNoZS5nZXRUeXBlRGVmaW5pdGlvbihzZWNUeXBlSWQpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZTogIiArIHNlY1R5cGVJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlY29uZGFyeVR5cGVJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgc2VjVHlwZUlkIDogc2Vjb25kYXJ5VHlwZUlkcykgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB0eXBlQ2FjaGUuZ2V0VHlwZURlZmluaXRpb24oc2VjVHlwZUlkKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZURlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNlY29uZGFyeSB0eXBlOiAiICsgc2VjVHlwZUlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0aWVzSW1wbCByZXN1bHQgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHByb3BlcnR5IDogcHJvcGVydGllcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IHR5cGVDYWNoZS5nZXRQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgaWYgKHByb3BEZWYgPT0gbnVsbCAmJiBvYmplY3RJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG9iamVjdElkIDogb2JqZWN0SWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVDYWNoZS5nZXRUeXBlRGVmaW5pdGlvbkZvck9iamVjdChvYmplY3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BEZWYgPSB0eXBlQ2FjaGUuZ2V0UHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvcERlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ocHJvcGVydHkuZ2V0S2V5KCkgKyAiIGlzIHVua25vd24hIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hZGRQcm9wZXJ0eShjcmVhdGVQcm9wZXJ0eURhdGEocHJvcERlZiwgcHJvcGVydHkuZ2V0VmFsdWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIFByb3BlcnR5RGF0YTw/PiBjcmVhdGVQcm9wZXJ0eURhdGEoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYsIE9iamVjdCB2YWx1ZSkgewotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzdHJWYWx1ZXM7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdHJWYWx1ZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgc3RyVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBzdHJWYWx1ZXMuYWRkKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0clZhbHVlcyA9IChMaXN0PFN0cmluZz4pIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5RGF0YSA9IG51bGw7Ci0gICAgICAgIHN3aXRjaCAocHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSkgewotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwocHJvcERlZi5nZXRJZCgpLCBzdHJWYWx1ZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUQ6Ci0gICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBuZXcgUHJvcGVydHlJZEltcGwocHJvcERlZi5nZXRJZCgpLCBzdHJWYWx1ZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgIExpc3Q8Qm9vbGVhbj4gYm9vbFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8Qm9vbGVhbj4oc3RyVmFsdWVzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogc3RyVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgYm9vbFZhbHVlcy5hZGQoQm9vbGVhbi52YWx1ZU9mKHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IG5ldyBQcm9wZXJ0eUJvb2xlYW5JbXBsKHByb3BEZWYuZ2V0SWQoKSwgYm9vbFZhbHVlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlRFR0VSOgotICAgICAgICAgICAgTGlzdDxCaWdJbnRlZ2VyPiBpbnRWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEJpZ0ludGVnZXI+KHN0clZhbHVlcy5zaXplKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogc3RyVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludFZhbHVlcy5hZGQobmV3IEJpZ0ludGVnZXIocykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ocHJvcERlZi5nZXRJZCgpICsgIiB2YWx1ZSBpcyBub3QgYW4gaW50ZWdlciB2YWx1ZSEiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IG5ldyBQcm9wZXJ0eUludGVnZXJJbXBsKHByb3BEZWYuZ2V0SWQoKSwgaW50VmFsdWVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFQ0lNQUw6Ci0gICAgICAgICAgICBMaXN0PEJpZ0RlY2ltYWw+IGRlY1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8QmlnRGVjaW1hbD4oc3RyVmFsdWVzLnNpemUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBzdHJWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVjVmFsdWVzLmFkZChuZXcgQmlnRGVjaW1hbChzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihwcm9wRGVmLmdldElkKCkgKyAiIHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyIHZhbHVlISIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gbmV3IFByb3BlcnR5RGVjaW1hbEltcGwocHJvcERlZi5nZXRJZCgpLCBkZWNWYWx1ZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICBMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPiBjYWxWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPihzdHJWYWx1ZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBzdHJWYWx1ZXMpIHsKLSAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAgPSBMb25nLnBhcnNlTG9uZyhzKTsKLSAgICAgICAgICAgICAgICAgICAgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbC5zZXRUaW1lSW5NaWxsaXModGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBjYWwgPSBEYXRlVGltZUhlbHBlci5wYXJzZVhtbERhdGVUaW1lKHMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihwcm9wRGVmLmdldElkKCkgKyAiIHZhbHVlIGlzIG5vdCBhbiBkYXRldGltZSB2YWx1ZSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYWxWYWx1ZXMuYWRkKGNhbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lSW1wbChwcm9wRGVmLmdldElkKCksIGNhbFZhbHVlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBIVE1MOgotICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gbmV3IFByb3BlcnR5SHRtbEltcGwocHJvcERlZi5nZXRJZCgpLCBzdHJWYWx1ZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gbmV3IFByb3BlcnR5VXJpSW1wbChwcm9wRGVmLmdldElkKCksIHN0clZhbHVlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eURhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBjcmVhdGVQb2xpY2llcyhDb250cm9sUGFyc2VyIGNvbnRyb2xQYXJzZXIpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xQYXJzZXIuZ2V0VmFsdWVzKENvbnN0YW50cy5DT05UUk9MX1BPTElDWSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBjcmVhdGVBZGRBY2woQ29udHJvbFBhcnNlciBjb250cm9sUGFyc2VyKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcmluY2lwYWxzID0gY29udHJvbFBhcnNlci5nZXRWYWx1ZXMoQ29uc3RhbnRzLkNPTlRST0xfQUREX0FDRV9QUklOQ0lQQUwpOwotICAgICAgICBpZiAocHJpbmNpcGFscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8QWNlPiBhY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBwcmluY2lwYWxJZCA6IHByaW5jaXBhbHMpIHsKLSAgICAgICAgICAgIGFjZXMuYWRkKG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwocHJpbmNpcGFsSWQpLCBjb250cm9sUGFyc2VyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZXMoQ29uc3RhbnRzLkNPTlRST0xfQUREX0FDRV9QRVJNSVNTSU9OLCBpKSkpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoYWNlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBjcmVhdGVSZW1vdmVBY2woQ29udHJvbFBhcnNlciBjb250cm9sUGFyc2VyKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcmluY2lwYWxzID0gY29udHJvbFBhcnNlci5nZXRWYWx1ZXMoQ29uc3RhbnRzLkNPTlRST0xfUkVNT1ZFX0FDRV9QUklOQ0lQQUwpOwotICAgICAgICBpZiAocHJpbmNpcGFscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8QWNlPiBhY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBwcmluY2lwYWxJZCA6IHByaW5jaXBhbHMpIHsKLSAgICAgICAgICAgIGFjZXMuYWRkKG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwocHJpbmNpcGFsSWQpLCBjb250cm9sUGFyc2VyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZXMoQ29uc3RhbnRzLkNPTlRST0xfUkVNT1ZFX0FDRV9QRVJNSVNTSU9OLCBpKSkpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoYWNlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudFN0cmVhbShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBDb250ZW50U3RyZWFtSW1wbCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIHsKLSAgICAgICAgICAgIFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHBvc3QgPSAoUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIHJlcXVlc3Q7Ci0gICAgICAgICAgICBpZiAocG9zdC5nZXRTdHJlYW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKHBvc3QuZ2V0RmlsZW5hbWUoKSwgcG9zdC5nZXRTaXplKCksIHBvc3QuZ2V0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QuZ2V0U3RyZWFtKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0FjbFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvQWNsU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWQ2NGNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvQWNsU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5icm93c2VyOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci0KLS8qKgotICogQUNMIFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEFjbFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogZ2V0QUNMLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0QUNMIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX09OTFlfQkFTSUNfUEVSTUlTU0lPTlMpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjbCBhY2wgPSBzZXJ2aWNlLmdldEFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXR1cm4gQUNMCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0KLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChhY2wpOwotICAgICAgICAgICAgaWYgKGpzb25PYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGpzb25PYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZUpTT04oanNvbk9iamVjdCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYXBwbHlBQ0wuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcHBseUFDTCBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUNMX1BST1BBR0FUSU9OLAotICAgICAgICAgICAgICAgICAgICBBY2xQcm9wYWdhdGlvbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIENvbnRyb2xQYXJzZXIgY3AgPSBuZXcgQ29udHJvbFBhcnNlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBY2wgYWNsID0gc2VydmljZS5hcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjcmVhdGVBZGRBY2woY3ApLCBjcmVhdGVSZW1vdmVBY2woY3ApLCBhY2xQcm9wYWdhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXR1cm4gQUNMCi0gICAgICAgICAgICBzZXRTdGF0dXMocmVxdWVzdCwgcmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0KLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChhY2wpOwotICAgICAgICAgICAgaWYgKGpzb25PYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGpzb25PYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZUpTT04oanNvbk9iamVjdCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9Ccm93c2VyQ2FsbENvbnRleHRJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0Jyb3dzZXJDYWxsQ29udGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmMWZmYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0Jyb3dzZXJDYWxsQ29udGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLkNhbGxDb250ZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnk7Ci0KLS8qKgotICogQSB7QGxpbmsgQ2FsbENvbnRleHR9IGltcGxlbWVudGF0aW9uIHRoYXQgaG9sZHMgYnJvd3NlciBiaW5kaW5nIHNwZWNpZmljCi0gKiB2YWx1ZXMKLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZXJDYWxsQ29udGV4dEltcGwgZXh0ZW5kcyBDYWxsQ29udGV4dEltcGwgewotCi0gICAgcHJpdmF0ZSBDbWlzU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdElkOwotICAgIHByaXZhdGUgU3RyaW5nW10gcGF0aEZyYWdtZW50czsKLSAgICBwcml2YXRlIFN0cmluZyB0eXBlSWQ7Ci0gICAgcHJpdmF0ZSBCYXNlVHlwZUlkIGJhc2VUeXBlSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdG9rZW47Ci0KLSAgICBwdWJsaWMgQnJvd3NlckNhbGxDb250ZXh0SW1wbChTdHJpbmcgYmluZGluZywgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIFN0cmluZyByZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgICAgICBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSwgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKGJpbmRpbmcsIGNtaXNWZXJzaW9uLCByZXBvc2l0b3J5SWQsIHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSwgZmFjdG9yeSwgc3RyZWFtRmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbmVjZXNzYXJ5IGRldGFpbHMgdG8gcmV0cmlldmUgdGhlIG9iamVjdCBpZCwgdHlwZSBpZCwgYW5kIHRva2VuCi0gICAgICogaWYgcmVxdWVzdGVkLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuQXJyYXlJc1N0b3JlZERpcmVjdGx5IikKLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsRGV0YWlscyhDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZ1tdIHBhdGhGcmFnbWVudHMsIFN0cmluZyB0b2tlbikgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgICAgICB0aGlzLm9iamVjdElkID0gb2JqZWN0SWQ7Ci0gICAgICAgIHRoaXMucGF0aEZyYWdtZW50cyA9IHBhdGhGcmFnbWVudHM7Ci0gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0b2tlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKCkgewotICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb2JqZWN0IGlkIG9mIHRoZSBjdXJyZW50IG9iamVjdC4gSWYgdGhlIG9iamVjdCBpcyB1bmtub3duLAotICAgICAqIHRoYXQgaXMgdGhlIG9iamVjdCBoYXMgYmVlbiBhZGRyZXNzZWQgYnkgcGF0aCwgdGhlIG9iamVjdCBpcyBsb2FkZWQgdG8KLSAgICAgKiBnZXQgdGhlIG9iamVjdCBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9iamVjdElkKCkgewotICAgICAgICBpZiAob2JqZWN0SWQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdElkOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZE9iamVjdCgpOwotCi0gICAgICAgIHJldHVybiBvYmplY3RJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIGlkIG9mIHRoZSBjdXJyZW50IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIHR5cGUgaWQgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LiBJZiB0aGUgYmFzZSB0eXBlIGlzCi0gICAgICogdW5rbm93biwgdGhlIG9iamVjdCBpcyBsb2FkZWQgdG8gZ2V0IHRoZSBiYXNlIHR5cGUgaWQuCi0gICAgICovCi0gICAgcHVibGljIEJhc2VUeXBlSWQgZ2V0QmFzZVR5cGVJZCgpIHsKLSAgICAgICAgaWYgKGJhc2VUeXBlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGJhc2VUeXBlSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2FkT2JqZWN0KCk7Ci0KLSAgICAgICAgcmV0dXJuIGJhc2VUeXBlSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZE9iamVjdCgpIHsKLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBudWxsOwotCi0gICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvYmplY3QgPSBzZXJ2aWNlLmdldE9iamVjdChnZXRSZXBvc2l0b3J5SWQoKSwgb2JqZWN0SWQsICJjbWlzOm9iamVjdElkLGNtaXM6b2JqZWN0VHlwZUlkLGNtaXM6YmFzZVR5cGVJZCIsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCAiY21pczpub25lIiwgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXRoRnJhZ21lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9iamVjdCA9IHNlcnZpY2UuZ2V0T2JqZWN0QnlQYXRoKGdldFJlcG9zaXRvcnlJZCgpLCBnZXRQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICJjbWlzOm9iamVjdElkLGNtaXM6b2JqZWN0VHlwZUlkLGNtaXM6YmFzZVR5cGVJZCIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCAiY21pczpub25lIiwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYSByZXBvc2l0b3J5IFVSTCBjYWxsIHdpdGhvdXQgb2JqZWN0IGlkCi0gICAgICAgICAgICAvLyAtPiB0aGVyZSBpcyBub3RoaW5nIHRvIGxvYWQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG9iamVjdElkID0gb2JqZWN0LmdldElkKCk7Ci0gICAgICAgIHR5cGVJZCA9IGdldFN0cmluZ1Byb3BlcnR5VmFsdWUob2JqZWN0LCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgIGJhc2VUeXBlSWQgPSBCYXNlVHlwZUlkLmZyb21WYWx1ZShnZXRTdHJpbmdQcm9wZXJ0eVZhbHVlKG9iamVjdCwgUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lEKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIHRoZSBvYmplY3QgcGF0aC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYXRoKCkgewotICAgICAgICBpZiAocGF0aEZyYWdtZW50cy5sZW5ndGggPCAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXRoRnJhZ21lbnRzLmxlbmd0aCA9PSAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gIi8iOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgcGF0aEZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHBhdGhGcmFnbWVudHNbaV0ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoRnJhZ21lbnRzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIGEgcHJvcGVydHkgZnJvbSBhbiBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdQcm9wZXJ0eVZhbHVlKE9iamVjdERhdGEgb2JqZWN0LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wRGF0YSA9IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmIChwcm9wRGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IHByb3BEYXRhLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gcHJvcGVydHkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvQ21pc0Jyb3dzZXJCaW5kaW5nU2VydmxldC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9DbWlzQnJvd3NlckJpbmRpbmdTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzIzNjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9DbWlzQnJvd3NlckJpbmRpbmdTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0FERF9PQkpFQ1RfVE9fRk9MREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLkNNSVNBQ1RJT05fQVBQRU5EX0NPTlRFTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9BUFBMWV9BQ0w7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9BUFBMWV9QT0xJQ1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9CVUxLX1VQREFURTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0NBTkNFTF9DSEVDS19PVVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9DSEVDS19JTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0NIRUNLX09VVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0NSRUFURV9ET0NVTUVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0NSRUFURV9ET0NVTUVOVF9GUk9NX1NPVVJDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0NSRUFURV9GT0xERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9DUkVBVEVfSVRFTTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0NSRUFURV9QT0xJQ1k7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9DUkVBVEVfUkVMQVRJT05TSElQOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLkNNSVNBQ1RJT05fQ1JFQVRFX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9ERUxFVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9ERUxFVEVfQ09OVEVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX0RFTEVURV9UUkVFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLkNNSVNBQ1RJT05fREVMRVRFX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9NT1ZFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLkNNSVNBQ1RJT05fUVVFUlk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLkNNSVNBQ1RJT05fUkVNT1ZFX1BPTElDWTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DTUlTQUNUSU9OX1NFVF9DT05URU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLkNNSVNBQ1RJT05fVVBEQVRFX1BST1BFUlRJRVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ01JU0FDVElPTl9VUERBVEVfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9PQkpFQ1RfSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfQUNMOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlNFTEVDVE9SX0FMTE9XQUJMRUFDVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfQ0hFQ0tFRE9VVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9DSElMRFJFTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9DT05URU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlNFTEVDVE9SX0NPTlRFTlRfQ0hBTkdFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9ERVNDRU5EQU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9GT0xERVJfVFJFRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9MQVNUX1JFU1VMVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9PQkpFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfUEFSRU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlNFTEVDVE9SX1BBUkVOVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfUE9MSUNJRVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfUFJPUEVSVElFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9RVUVSWTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5TRUxFQ1RPUl9SRUxBVElPTlNISVBTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlNFTEVDVE9SX1JFTkRJVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfUkVQT1NJVE9SWV9JTkZPOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlNFTEVDVE9SX1RZUEVfQ0hJTERSRU47Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfVFlQRV9ERUZJTklUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlNFTEVDVE9SX1RZUEVfREVTQ0VOREFOVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuU0VMRUNUT1JfVkVSU0lPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29uc3RhbnRzLkVSUk9SX0VYQ0VQVElPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db25zdGFudHMuRVJST1JfTUVTU0FHRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db25zdGFudHMuRVJST1JfU1RBQ0tUUkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5EaXNwYXRjaGVyLk1FVEhPRF9HRVQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuRGlzcGF0Y2hlci5NRVRIT0RfSEVBRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5EaXNwYXRjaGVyLk1FVEhPRF9QT1NUOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNTdG9yYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVW5hdXRob3JpemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNWZXJzaW9uaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5TZXJ2ZXJWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXIudG9rZW4uVG9rZW5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuQWJzdHJhY3RDbWlzSHR0cFNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuRXhjZXB0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuSEVBREh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5IdHRwVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5Ob0JvZHlIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlF1ZXJ5U3RyaW5nSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlNlcnZpY2VDYWxsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ21pc0Jyb3dzZXJCaW5kaW5nU2VydmxldCBleHRlbmRzIEFic3RyYWN0Q21pc0h0dHBTZXJ2bGV0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENtaXNCcm93c2VyQmluZGluZ1NlcnZsZXQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEaXNwYXRjaGVyIHJlcG9zaXRvcnlEaXNwYXRjaGVyID0gbmV3IERpc3BhdGNoZXIoZmFsc2UpOwotICAgIHByaXZhdGUgZmluYWwgRGlzcGF0Y2hlciByb290RGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGZhbHNlKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFcnJvclNlcnZpY2VDYWxsIEVSUk9SX1NFUlRWSUNFX0NBTEwgPSBuZXcgRXJyb3JTZXJ2aWNlQ2FsbCgpOwotCi0gICAgcHVibGljIGVudW0gQ2FsbFVybCB7Ci0gICAgICAgIFNFUlZJQ0UsIFJFUE9TSVRPUlksIFJPT1QKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKLQotICAgICAgICAvLyBzZXQgdGhlIGJpbmRpbmcKLSAgICAgICAgc2V0QmluZGluZyhDYWxsQ29udGV4dC5CSU5ESU5HX0JST1dTRVIpOwotCi0gICAgICAgIC8vIHNldCBDTUlTIHZlcnNpb24gLT4gY2FuIG9ubHkgYmUgMS4xCi0gICAgICAgIHNldENtaXNWZXJzaW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xKTsKLQotICAgICAgICAvLyBpbml0aWFsaXplIHJlcG9zaXRvcnkgcmVzb3VyY2VzCi0gICAgICAgIGFkZFJlcG9zaXRvcnlSZXNvdXJjZSgiIiwgTUVUSE9EX0dFVCwgbmV3IFJlcG9zaXRvcnlTZXJ2aWNlLkdldFJlcG9zaXRvcmllcygpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKFNFTEVDVE9SX1JFUE9TSVRPUllfSU5GTywgTUVUSE9EX0dFVCwgbmV3IFJlcG9zaXRvcnlTZXJ2aWNlLkdldFJlcG9zaXRvcnlJbmZvKCkpOwotICAgICAgICBhZGRSZXBvc2l0b3J5UmVzb3VyY2UoU0VMRUNUT1JfTEFTVF9SRVNVTFQsIE1FVEhPRF9HRVQsIG5ldyBSZXBvc2l0b3J5U2VydmljZS5HZXRMYXN0UmVzdWx0KCkpOwotICAgICAgICBhZGRSZXBvc2l0b3J5UmVzb3VyY2UoU0VMRUNUT1JfVFlQRV9DSElMRFJFTiwgTUVUSE9EX0dFVCwgbmV3IFJlcG9zaXRvcnlTZXJ2aWNlLkdldFR5cGVDaGlsZHJlbigpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKFNFTEVDVE9SX1RZUEVfREVTQ0VOREFOVFMsIE1FVEhPRF9HRVQsIG5ldyBSZXBvc2l0b3J5U2VydmljZS5HZXRUeXBlRGVzY2VuZGFudHMoKSk7Ci0gICAgICAgIGFkZFJlcG9zaXRvcnlSZXNvdXJjZShTRUxFQ1RPUl9UWVBFX0RFRklOSVRJT04sIE1FVEhPRF9HRVQsIG5ldyBSZXBvc2l0b3J5U2VydmljZS5HZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKENNSVNBQ1RJT05fQ1JFQVRFX1RZUEUsIE1FVEhPRF9QT1NULCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuQ3JlYXRlVHlwZSgpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKENNSVNBQ1RJT05fVVBEQVRFX1RZUEUsIE1FVEhPRF9QT1NULCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuVXBkYXRlVHlwZSgpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKENNSVNBQ1RJT05fREVMRVRFX1RZUEUsIE1FVEhPRF9QT1NULCBuZXcgUmVwb3NpdG9yeVNlcnZpY2UuRGVsZXRlVHlwZSgpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKFNFTEVDVE9SX1FVRVJZLCBNRVRIT0RfR0VULCBuZXcgRGlzY292ZXJ5U2VydmljZS5RdWVyeSgpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKFNFTEVDVE9SX0NIRUNLRURPVVQsIE1FVEhPRF9HRVQsIG5ldyBOYXZpZ2F0aW9uU2VydmljZS5HZXRDaGVja2VkT3V0RG9jcygpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKFNFTEVDVE9SX0NPTlRFTlRfQ0hBTkdFUywgTUVUSE9EX0dFVCwgbmV3IERpc2NvdmVyeVNlcnZpY2UuR2V0Q29udGVudENoYW5nZXMoKSk7Ci0KLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKENNSVNBQ1RJT05fUVVFUlksIE1FVEhPRF9QT1NULCBuZXcgRGlzY292ZXJ5U2VydmljZS5RdWVyeSgpKTsKLSAgICAgICAgYWRkUmVwb3NpdG9yeVJlc291cmNlKENNSVNBQ1RJT05fQ1JFQVRFX0RPQ1VNRU5ULCBNRVRIT0RfUE9TVCwgbmV3IE9iamVjdFNlcnZpY2UuQ3JlYXRlRG9jdW1lbnQoKSk7Ci0gICAgICAgIGFkZFJlcG9zaXRvcnlSZXNvdXJjZShDTUlTQUNUSU9OX0NSRUFURV9ET0NVTUVOVF9GUk9NX1NPVVJDRSwgTUVUSE9EX1BPU1QsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFNlcnZpY2UuQ3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKCkpOwotICAgICAgICBhZGRSZXBvc2l0b3J5UmVzb3VyY2UoQ01JU0FDVElPTl9DUkVBVEVfUE9MSUNZLCBNRVRIT0RfUE9TVCwgbmV3IE9iamVjdFNlcnZpY2UuQ3JlYXRlUG9saWN5KCkpOwotICAgICAgICBhZGRSZXBvc2l0b3J5UmVzb3VyY2UoQ01JU0FDVElPTl9DUkVBVEVfSVRFTSwgTUVUSE9EX1BPU1QsIG5ldyBPYmplY3RTZXJ2aWNlLkNyZWF0ZUl0ZW0oKSk7Ci0gICAgICAgIGFkZFJlcG9zaXRvcnlSZXNvdXJjZShDTUlTQUNUSU9OX0NSRUFURV9SRUxBVElPTlNISVAsIE1FVEhPRF9QT1NULCBuZXcgT2JqZWN0U2VydmljZS5DcmVhdGVSZWxhdGlvbnNoaXAoKSk7Ci0gICAgICAgIGFkZFJlcG9zaXRvcnlSZXNvdXJjZShDTUlTQUNUSU9OX0JVTEtfVVBEQVRFLCBNRVRIT0RfUE9TVCwgbmV3IE9iamVjdFNlcnZpY2UuQnVsa1VwZGF0ZVByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByb290IHJlc291cmNlcwotICAgICAgICBhZGRSb290UmVzb3VyY2UoU0VMRUNUT1JfT0JKRUNULCBNRVRIT0RfR0VULCBuZXcgT2JqZWN0U2VydmljZS5HZXRPYmplY3QoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShTRUxFQ1RPUl9QUk9QRVJUSUVTLCBNRVRIT0RfR0VULCBuZXcgT2JqZWN0U2VydmljZS5HZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoU0VMRUNUT1JfQUxMT1dBQkxFQUNUSU9OUywgTUVUSE9EX0dFVCwgbmV3IE9iamVjdFNlcnZpY2UuR2V0QWxsb3dhYmxlQWN0aW9ucygpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKFNFTEVDVE9SX1JFTkRJVElPTlMsIE1FVEhPRF9HRVQsIG5ldyBPYmplY3RTZXJ2aWNlLkdldFJlbmRpdGlvbnMoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShTRUxFQ1RPUl9DT05URU5ULCBNRVRIT0RfR0VULCBuZXcgT2JqZWN0U2VydmljZS5HZXRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoU0VMRUNUT1JfQ0hJTERSRU4sIE1FVEhPRF9HRVQsIG5ldyBOYXZpZ2F0aW9uU2VydmljZS5HZXRDaGlsZHJlbigpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKFNFTEVDVE9SX0RFU0NFTkRBTlRTLCBNRVRIT0RfR0VULCBuZXcgTmF2aWdhdGlvblNlcnZpY2UuR2V0RGVzY2VuZGFudHMoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShTRUxFQ1RPUl9GT0xERVJfVFJFRSwgTUVUSE9EX0dFVCwgbmV3IE5hdmlnYXRpb25TZXJ2aWNlLkdldEZvbGRlclRyZWUoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShTRUxFQ1RPUl9QQVJFTlQsIE1FVEhPRF9HRVQsIG5ldyBOYXZpZ2F0aW9uU2VydmljZS5HZXRGb2xkZXJQYXJlbnQoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShTRUxFQ1RPUl9QQVJFTlRTLCBNRVRIT0RfR0VULCBuZXcgTmF2aWdhdGlvblNlcnZpY2UuR2V0T2JqZWN0UGFyZW50cygpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKFNFTEVDVE9SX1ZFUlNJT05TLCBNRVRIT0RfR0VULCBuZXcgVmVyc2lvbmluZ1NlcnZpY2UuR2V0QWxsVmVyc2lvbnMoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShTRUxFQ1RPUl9SRUxBVElPTlNISVBTLCBNRVRIT0RfR0VULCBuZXcgUmVsYXRpb25zaGlwU2VydmljZS5HZXRPYmplY3RSZWxhdGlvbnNoaXBzKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoU0VMRUNUT1JfQ0hFQ0tFRE9VVCwgTUVUSE9EX0dFVCwgbmV3IE5hdmlnYXRpb25TZXJ2aWNlLkdldENoZWNrZWRPdXREb2NzKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoU0VMRUNUT1JfUE9MSUNJRVMsIE1FVEhPRF9HRVQsIG5ldyBQb2xpY3lTZXJ2aWNlLkdldEFwcGxpZWRQb2xpY2llcygpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKFNFTEVDVE9SX0FDTCwgTUVUSE9EX0dFVCwgbmV3IEFjbFNlcnZpY2UuR2V0QUNMKCkpOwotCi0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShDTUlTQUNUSU9OX0NSRUFURV9ET0NVTUVOVCwgTUVUSE9EX1BPU1QsIG5ldyBPYmplY3RTZXJ2aWNlLkNyZWF0ZURvY3VtZW50KCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoQ01JU0FDVElPTl9DUkVBVEVfRE9DVU1FTlRfRlJPTV9TT1VSQ0UsIE1FVEhPRF9QT1NULAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RTZXJ2aWNlLkNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSgpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQ1JFQVRFX0ZPTERFUiwgTUVUSE9EX1BPU1QsIG5ldyBPYmplY3RTZXJ2aWNlLkNyZWF0ZUZvbGRlcigpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQ1JFQVRFX1BPTElDWSwgTUVUSE9EX1BPU1QsIG5ldyBPYmplY3RTZXJ2aWNlLkNyZWF0ZVBvbGljeSgpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQ1JFQVRFX0lURU0sIE1FVEhPRF9QT1NULCBuZXcgT2JqZWN0U2VydmljZS5DcmVhdGVJdGVtKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoQ01JU0FDVElPTl9VUERBVEVfUFJPUEVSVElFUywgTUVUSE9EX1BPU1QsIG5ldyBPYmplY3RTZXJ2aWNlLlVwZGF0ZVByb3BlcnRpZXMoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShDTUlTQUNUSU9OX1NFVF9DT05URU5ULCBNRVRIT0RfUE9TVCwgbmV3IE9iamVjdFNlcnZpY2UuU2V0Q29udGVudFN0cmVhbSgpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQVBQRU5EX0NPTlRFTlQsIE1FVEhPRF9QT1NULCBuZXcgT2JqZWN0U2VydmljZS5BcHBlbmRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoQ01JU0FDVElPTl9ERUxFVEVfQ09OVEVOVCwgTUVUSE9EX1BPU1QsIG5ldyBPYmplY3RTZXJ2aWNlLkRlbGV0ZUNvbnRlbnRTdHJlYW0oKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShDTUlTQUNUSU9OX0RFTEVURSwgTUVUSE9EX1BPU1QsIG5ldyBPYmplY3RTZXJ2aWNlLkRlbGV0ZU9iamVjdCgpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fREVMRVRFX1RSRUUsIE1FVEhPRF9QT1NULCBuZXcgT2JqZWN0U2VydmljZS5EZWxldGVUcmVlKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoQ01JU0FDVElPTl9NT1ZFLCBNRVRIT0RfUE9TVCwgbmV3IE9iamVjdFNlcnZpY2UuTW92ZU9iamVjdCgpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQUREX09CSkVDVF9UT19GT0xERVIsIE1FVEhPRF9QT1NULCBuZXcgTXVsdGlGaWxpbmdTZXJ2aWNlLkFkZE9iamVjdFRvRm9sZGVyKCkpOwotICAgICAgICBhZGRSb290UmVzb3VyY2UoQ01JU0FDVElPTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSLCBNRVRIT0RfUE9TVCwKLSAgICAgICAgICAgICAgICBuZXcgTXVsdGlGaWxpbmdTZXJ2aWNlLlJlbW92ZU9iamVjdEZyb21Gb2xkZXIoKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShDTUlTQUNUSU9OX0NIRUNLX09VVCwgTUVUSE9EX1BPU1QsIG5ldyBWZXJzaW9uaW5nU2VydmljZS5DaGVja091dCgpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQ0FOQ0VMX0NIRUNLX09VVCwgTUVUSE9EX1BPU1QsIG5ldyBWZXJzaW9uaW5nU2VydmljZS5DYW5jZWxDaGVja091dCgpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQ0hFQ0tfSU4sIE1FVEhPRF9QT1NULCBuZXcgVmVyc2lvbmluZ1NlcnZpY2UuQ2hlY2tJbigpKTsKLSAgICAgICAgYWRkUm9vdFJlc291cmNlKENNSVNBQ1RJT05fQVBQTFlfUE9MSUNZLCBNRVRIT0RfUE9TVCwgbmV3IFBvbGljeVNlcnZpY2UuQXBwbHlQb2xpY3koKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShDTUlTQUNUSU9OX1JFTU9WRV9QT0xJQ1ksIE1FVEhPRF9QT1NULCBuZXcgUG9saWN5U2VydmljZS5SZW1vdmVQb2xpY3koKSk7Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZShDTUlTQUNUSU9OX0FQUExZX0FDTCwgTUVUSE9EX1BPU1QsIG5ldyBBY2xTZXJ2aWNlLkFwcGx5QUNMKCkpOwotCi0gICAgICAgIC8vIG9sZCBPcGVuQ01JUyBjbGllbnQgc2VuZCBpbnZhbGlkIHNlbGVjdG9yLCBzdXBwb3J0IHRoZW0gYW55d2F5Ci0gICAgICAgIGFkZFJvb3RSZXNvdXJjZSgiZm9sZGVyIiwgTUVUSE9EX0dFVCwgbmV3IE5hdmlnYXRpb25TZXJ2aWNlLkdldEZvbGRlclRyZWUoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sCi0gICAgICAgICAgICBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIENhbGxDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBoZWFkZXJzCi0gICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAicHJpdmF0ZSwgbWF4LWFnZT0wIik7Ci0gICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIoIlNlcnZlciIsIFNlcnZlclZlcnNpb24uT1BFTkNNSVNfU0VSVkVSKTsKLQotICAgICAgICAgICAgLy8gc3BsaXQgcGF0aAotICAgICAgICAgICAgU3RyaW5nW10gcGF0aEZyYWdtZW50cyA9IEh0dHBVdGlscy5zcGxpdFBhdGgocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBzdHJlYW0gZmFjdG9yeQotICAgICAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3kgPSBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKGdldFNlcnZpY2VGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgIHBhdGhGcmFnbWVudHMubGVuZ3RoID4gMCA/IHBhdGhGcmFnbWVudHNbMF0gOiBudWxsKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgSFRUUCBtZXRob2QKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOwotCi0gICAgICAgICAgICBpZiAoTUVUSE9EX0dFVC5lcXVhbHMobWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgUXVlcnlTdHJpbmdIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChNRVRIT0RfUE9TVC5lcXVhbHMobWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgc3RyZWFtRmFjdG95KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoTUVUSE9EX0hFQUQuZXF1YWxzKG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0ID0gbmV3IEhFQURIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gbmV3IE5vQm9keUh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIG1ldGhvZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpbnZva2UgdG9rZW4gaGFuZGxlciwgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoImxvZ2luIikgIT0gbnVsbCAmJiBnZXRDYWxsQ29udGV4dEhhbmRsZXIoKSBpbnN0YW5jZW9mIFRva2VuSGFuZGxlcikgewotICAgICAgICAgICAgICAgICgoVG9rZW5IYW5kbGVyKSBnZXRDYWxsQ29udGV4dEhhbmRsZXIoKSkuc2VydmljZShnZXRTZXJ2bGV0Q29udGV4dCgpLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250ZXh0ID0gY3JlYXRlQ29udGV4dChnZXRTZXJ2bGV0Q29udGV4dCgpLCByZXF1ZXN0LCByZXNwb25zZSwgc3RyZWFtRmFjdG95KTsKLSAgICAgICAgICAgIGRpc3BhdGNoKGNvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBwYXRoRnJhZ21lbnRzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ21pc1VuYXV0aG9yaXplZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIkNNSVNcIiwgY2hhcnNldD1cIlVURi04XCIiKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQsICJBdXRob3JpemF0aW9uIFJlcXVpcmVkIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwgfHwgY29udGV4dC5nZXRVc2VybmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiQ01JU1wiLCBjaGFyc2V0PVwiVVRGLThcIiIpOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQsICJBdXRob3JpemF0aW9uIFJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihjb250ZXh0LCBlLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKGNvbnRleHQsIGUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIGluIGFueSBjYXNlIGNsb3NlIHRoZSBjb250ZW50IHN0cmVhbSBpZiBvbmUgaGFzIGJlZW4gcHJvdmlkZWQKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSAoKFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKSByZXF1ZXN0KS5nZXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkNvdWxkIG5vdCBjbG9zZSBQT1NUIHN0cmVhbToge30iLCBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3ZSBhcmUgZG9uZS4KLSAgICAgICAgICAgIHJlc3BvbnNlLmZsdXNoQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbmV3IHJlcG9zaXRvcnkgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmVwb3NpdG9yeVJlc291cmNlKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGh0dHBNZXRob2QsIFNlcnZpY2VDYWxsIHNlcnZpY2VDYWxsKSB7Ci0gICAgICAgIHJlcG9zaXRvcnlEaXNwYXRjaGVyLmFkZFJlc291cmNlKHJlc291cmNlLCBodHRwTWV0aG9kLCBzZXJ2aWNlQ2FsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbmV3IHJvb3QgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUm9vdFJlc291cmNlKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGh0dHBNZXRob2QsIFNlcnZpY2VDYWxsIHNlcnZpY2VDYWxsKSB7Ci0gICAgICAgIHJvb3REaXNwYXRjaGVyLmFkZFJlc291cmNlKHJlc291cmNlLCBodHRwTWV0aG9kLCBzZXJ2aWNlQ2FsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoKENhbGxDb250ZXh0IGNvbnRleHQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICAgICAgU3RyaW5nW10gcGF0aEZyYWdtZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEJyb3dzZXJDYWxsQ29udGV4dEltcGwgYnJvd3NlckNvbnRleHQgPSAoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dDsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlRmFjdG9yeSgpLmdldFNlcnZpY2UoY29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIGFuYWx5emUgdGhlIHBhdGgKLSAgICAgICAgICAgIGlmIChwYXRoRnJhZ21lbnRzLmxlbmd0aCA8IDEpIHsKLSAgICAgICAgICAgICAgICAvLyByb290IC0+IHJlcG9zaXRvcnkgaW5mb3MKLSAgICAgICAgICAgICAgICByZXBvc2l0b3J5RGlzcGF0Y2hlci5kaXNwYXRjaCgiIiwgTUVUSE9EX0dFVCwgY29udGV4dCwgc2VydmljZSwgbnVsbCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2VsZWN0IGRpc3BhdGNoZXIKLSAgICAgICAgICAgIENhbGxVcmwgY2FsbFVybCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocGF0aEZyYWdtZW50cy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIGNhbGxVcmwgPSBDYWxsVXJsLlJFUE9TSVRPUlk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsLlJPT1RfUEFUSF9GUkFHTUVOVC5lcXVhbHMocGF0aEZyYWdtZW50c1sxXSkpIHsKLSAgICAgICAgICAgICAgICBjYWxsVXJsID0gQ2FsbFVybC5ST09UOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2FsbFVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOwotICAgICAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IHBhdGhGcmFnbWVudHNbMF07Ci0gICAgICAgICAgICBib29sZWFuIGNhbGxTZXJ2aWNlRm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKE1FVEhPRF9HRVQuZXF1YWxzKG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0b3IgPSBIdHRwVXRpbHMuZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TRUxFQ1RPUik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gSHR0cFV0aWxzLmdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9PQkpFQ1RfSUQpOwotCi0gICAgICAgICAgICAgICAgLy8gZGlzcGF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoY2FsbFVybCA9PSBDYWxsVXJsLlJFUE9TSVRPUlkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc2VsZWN0b3IubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vIHNlbGVjdG9yIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicm93c2VyQ29udGV4dC5zZXRDYWxsRGV0YWlscyhzZXJ2aWNlLCBvYmplY3RJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxTZXJ2aWNlRm91bmQgPSByZXBvc2l0b3J5RGlzcGF0Y2hlci5kaXNwYXRjaChzZWxlY3RvciwgbWV0aG9kLCBicm93c2VyQ29udGV4dCwgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5SWQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxVcmwgPT0gQ2FsbFVybC5ST09UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0LnNldENhbGxEZXRhaWxzKHNlcnZpY2UsIG9iamVjdElkLCBwYXRoRnJhZ21lbnRzLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBtZXRob2QgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VUeXBlSWQgYmFzZXR5cGUgPSBicm93c2VyQ29udGV4dC5nZXRCYXNlVHlwZUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChiYXNldHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01JU19ET0NVTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSBTRUxFQ1RPUl9DT05URU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENNSVNfRk9MREVSOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IFNFTEVDVE9SX0NISUxEUkVOOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IFNFTEVDVE9SX09CSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9IFNFTEVDVE9SX09CSkVDVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhbGxTZXJ2aWNlRm91bmQgPSByb290RGlzcGF0Y2hlci5kaXNwYXRjaChzZWxlY3RvciwgbWV0aG9kLCBicm93c2VyQ29udGV4dCwgc2VydmljZSwgcmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKE1FVEhPRF9QT1NULmVxdWFscyhtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNtaXNhY3Rpb24gPSBIdHRwVXRpbHMuZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX0NNSVNBQ1RJT04pOwotICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IEh0dHBVdGlscy5nZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLkNPTlRST0xfT0JKRUNUX0lEKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBIdHRwVXRpbHMuZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX1RPS0VOKTsKLQotICAgICAgICAgICAgICAgIGlmIChjbWlzYWN0aW9uID09IG51bGwgfHwgY21pc2FjdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJVbmtub3duIGFjdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoCi0gICAgICAgICAgICAgICAgaWYgKGNhbGxVcmwgPT0gQ2FsbFVybC5SRVBPU0lUT1JZKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyb3dzZXJDb250ZXh0LnNldENhbGxEZXRhaWxzKHNlcnZpY2UsIG9iamVjdElkLCBudWxsLCB0b2tlbik7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxTZXJ2aWNlRm91bmQgPSByZXBvc2l0b3J5RGlzcGF0Y2hlci5kaXNwYXRjaChjbWlzYWN0aW9uLCBtZXRob2QsIGJyb3dzZXJDb250ZXh0LCBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJZCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FsbFVybCA9PSBDYWxsVXJsLlJPT1QpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJvd3NlckNvbnRleHQuc2V0Q2FsbERldGFpbHMoc2VydmljZSwgb2JqZWN0SWQsIHBhdGhGcmFnbWVudHMsIHRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgY2FsbFNlcnZpY2VGb3VuZCA9IHJvb3REaXNwYXRjaGVyLmRpc3BhdGNoKGNtaXNhY3Rpb24sIG1ldGhvZCwgYnJvd3NlckNvbnRleHQsIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeUlkLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpZiB0aGUgZGlzcGF0Y2hlciBjb3VsZG4ndCBmaW5kIGEgbWF0Y2hpbmcgc2VydmljZSBjYWxsCi0gICAgICAgICAgICAvLyAtPiByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZQotICAgICAgICAgICAgaWYgKCFjYWxsU2VydmljZUZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNsYXRlcyBhbiBleGNlcHRpb24gaW4gYW4gYXBwcm9wcmlhdGUgSFRUUCBlcnJvciBjb2RlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0RXJyb3JDb2RlKENtaXNCYXNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9TRVJUVklDRV9DQUxMLmdldEVycm9yQ29kZShleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGFuIGVycm9yIGFzIEpTT04uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRFcnJvcihDYWxsQ29udGV4dCBjb250ZXh0LCBFeGNlcHRpb24gZXgsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgewotICAgICAgICBFUlJPUl9TRVJUVklDRV9DQUxMLnByaW50RXJyb3IoY29udGV4dCwgZXgsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgRXJyb3JTZXJ2aWNlQ2FsbCBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIG5vIGltcGxlbWVudGF0aW9uCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEVycm9yQ29kZShDbWlzQmFzZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNDA5OwotICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiA0MDk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDQwMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDQwMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNDA5OwotICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNDA1OwotICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiA0MDQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNDAzOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNTdG9yYWdlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDUwMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzU3RyZWFtTm90U3VwcG9ydGVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDQwMzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNDA5OwotICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNWZXJzaW9uaW5nRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDQwOTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDUwMzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIDUwMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHByaW50RXJyb3IoQ2FsbENvbnRleHQgY29udGV4dCwgRXhjZXB0aW9uIGV4LCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk5hbWUgPSBDbWlzUnVudGltZUV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRTsKLQotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1J1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1N0b3JhZ2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzQ29kZSA9IGdldEVycm9yQ29kZSgoQ21pc1N0b3JhZ2VFeGNlcHRpb24pIGV4KTsKLSAgICAgICAgICAgICAgICBleGNlcHRpb25OYW1lID0gKChDbWlzU3RvcmFnZUV4Y2VwdGlvbikgZXgpLmdldEV4Y2VwdGlvbk5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzQmFzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBnZXRFcnJvckNvZGUoKENtaXNCYXNlRXhjZXB0aW9uKSBleCk7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9ICgoQ21pc0Jhc2VFeGNlcHRpb24pIGV4KS5nZXRFeGNlcHRpb25OYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPRy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiRmFpbGVkIHRvIHNlbmQgZXJyb3IgbWVzc2FnZSB0byBjbGllbnQuIFJlc3BvbnNlIGlzIGFscmVhZHkgY29tbWl0dGVkLiIsIGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IChjb250ZXh0IGluc3RhbmNlb2YgQnJvd3NlckNhbGxDb250ZXh0SW1wbCA/ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0VG9rZW4oKQotICAgICAgICAgICAgICAgICAgICA6IG51bGwpOwotCi0gICAgICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc2V0QnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgc2V0U3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlLCBzdGF0dXNDb2RlKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgQ21pc0Jhc2VFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiQW4gZXJyb3Igb2NjdXJyZWQhIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBKU09OT2JqZWN0IGpzb25SZXNwb25zZSA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAganNvblJlc3BvbnNlLnB1dChFUlJPUl9FWENFUFRJT04sIGV4Y2VwdGlvbk5hbWUpOwotICAgICAgICAgICAgICAgIGpzb25SZXNwb25zZS5wdXQoRVJST1JfTUVTU0FHRSwgbWVzc2FnZSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc3QgPSBFeGNlcHRpb25IZWxwZXIuZ2V0U3RhY2t0cmFjZUFzU3RyaW5nKGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqc29uUmVzcG9uc2UucHV0KEVSUk9SX1NUQUNLVFJBQ0UsIHN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZUpTT04oanNvblJlc3BvbnNlLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihzdGF0dXNDb2RlLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBub3RoaW5nIGVsc2Ugd2UgY2FuIGRvCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFN0YXR1cyhyZXF1ZXN0LCByZXNwb25zZSwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoSFRNTF9NSU1FX1RZUEUpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgoMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvb2tpZShyZXF1ZXN0LCByZXNwb25zZSwgY29udGV4dC5nZXRSZXBvc2l0b3J5SWQoKSwgdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29va2llVmFsdWUoc3RhdHVzQ29kZSwgbnVsbCwgZXhjZXB0aW9uTmFtZSwgZXguZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9Db250cm9sUGFyc2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0NvbnRyb2xQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0Zjg3My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0NvbnRyb2xQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotCi0vKioKLSAqIFBhcnNlcyBIVE1MIGZvcm0gY29udHJvbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sUGFyc2VyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xfUFJPUF9JRF9MT1dFUiA9ICJwcm9wZXJ0eWlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9QUk9QX1ZBTFVFX0xPV0VSID0gInByb3BlcnR5dmFsdWUiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB6ZXJvRGltID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBNYXA8SW50ZWdlciwgU3RyaW5nPj4gb25lRGltID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8SW50ZWdlciwgU3RyaW5nPj4oKTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE1hcDxJbnRlZ2VyLCBNYXA8SW50ZWdlciwgU3RyaW5nPj4+IHR3b0RpbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPEludGVnZXIsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+Pj4oKTsKLQotICAgIHB1YmxpYyBDb250cm9sUGFyc2VyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIHBhcnNlKCk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkgewotICAgICAgICAvLyBnYXRoZXIgYWxsIGNvbnRyb2xzCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjb250cm9scyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTWFwKCk7Ci0gICAgICAgIGlmIChjb250cm9scyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZ1tdPiBjb250cm9sIDogY29udHJvbHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRyb2xOYW1lID0gY29udHJvbC5nZXRLZXkoKS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCi0gICAgICAgICAgICBpbnQgZmlyc3RJbmRleCA9IGdldEZpcnN0SW5kZXgoY29udHJvbE5hbWUpOwotCi0gICAgICAgICAgICBpZiAoZmlyc3RJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIHplcm9EaW0ucHV0KGNvbnRyb2xOYW1lLCBjb250cm9sLmdldFZhbHVlKClbMF0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaXBwZWRDb250cm9sTmFtZSA9IGNvbnRyb2xOYW1lLnN1YnN0cmluZygwLCBjb250cm9sTmFtZS5pbmRleE9mKCdbJykpOwotICAgICAgICAgICAgICAgIGludCBzZWNvbmRJbmRleCA9IGdldFNlY29uZEluZGV4KGNvbnRyb2xOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZWNvbmRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgU3RyaW5nPiB2YWx1ZXMgPSBvbmVEaW0uZ2V0KHN0cmlwcGVkQ29udHJvbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uZURpbS5wdXQoc3RyaXBwZWRDb250cm9sTmFtZSwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoZmlyc3RJbmRleCwgY29udHJvbC5nZXRWYWx1ZSgpWzBdKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIFN0cmluZz4+IHZhbHVlcyA9IHR3b0RpbS5nZXQoc3RyaXBwZWRDb250cm9sTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIFN0cmluZz4+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0d29EaW0ucHV0KHN0cmlwcGVkQ29udHJvbE5hbWUsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgU3RyaW5nPiBsaXN0ID0gdmFsdWVzLmdldChmaXJzdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoZmlyc3RJbmRleCwgbGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBsaXN0LnB1dChzZWNvbmRJbmRleCwgY29udHJvbC5nZXRWYWx1ZSgpWzBdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0Rmlyc3RJbmRleChTdHJpbmcgY29udHJvbE5hbWUpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IC0xOwotCi0gICAgICAgIGludCBvcGVuID0gY29udHJvbE5hbWUuaW5kZXhPZignWycpOwotICAgICAgICBpbnQgY2xvc2UgPSBjb250cm9sTmFtZS5pbmRleE9mKCddJyk7Ci0KLSAgICAgICAgaWYgKG9wZW4gPT0gLTEgfHwgY2xvc2UgPT0gLTEgfHwgY2xvc2UgPCBvcGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGluZGV4U3RyID0gY29udHJvbE5hbWUuc3Vic3RyaW5nKG9wZW4gKyAxLCBjbG9zZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBJbnRlZ2VyLnBhcnNlSW50KGluZGV4U3RyKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyByZXR1cm4gZGVmYXVsdCB2YWx1ZSAoLTEpCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRTZWNvbmRJbmRleChTdHJpbmcgY29udHJvbE5hbWUpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IC0xOwotCi0gICAgICAgIGludCBvcGVuID0gY29udHJvbE5hbWUuaW5kZXhPZigiXVsiKTsKLSAgICAgICAgaW50IGNsb3NlID0gY29udHJvbE5hbWUubGFzdEluZGV4T2YoJ10nKTsKLQotICAgICAgICBpZiAob3BlbiA9PSAtMSB8fCBjbG9zZSA9PSAtMSB8fCBjbG9zZSA8IG9wZW4pIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaW5kZXhTdHIgPSBjb250cm9sTmFtZS5zdWJzdHJpbmcob3BlbiArIDIsIGNsb3NlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEludGVnZXIucGFyc2VJbnQoaW5kZXhTdHIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHJldHVybiBkZWZhdWx0IHZhbHVlICgtMSkKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnZlcnRUb0xpc3QoU3RyaW5nIGNvbnRyb2xOYW1lLCBNYXA8SW50ZWdlciwgU3RyaW5nPiBtYXApIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBjb3VudCA9IG1hcC5zaXplKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oY291bnQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbWFwLmdldChpKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oY29udHJvbE5hbWUgKyAiIGhhcyBnYXBzISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIGNvbnRyb2xOYW1lKSB7Ci0gICAgICAgIGlmIChjb250cm9sTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sTmFtZSBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHplcm9EaW0uZ2V0KGNvbnRyb2xOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZXMoU3RyaW5nIGNvbnRyb2xOYW1lKSB7Ci0gICAgICAgIGlmIChjb250cm9sTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sTmFtZSBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0xpc3QoY29udHJvbE5hbWUsIG9uZURpbS5nZXQoY29udHJvbE5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWYWx1ZXMoU3RyaW5nIGNvbnRyb2xOYW1lLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xOYW1lIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIFN0cmluZz4+IG1hcCA9IHR3b0RpbS5nZXQoY29udHJvbE5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0VG9MaXN0KGNvbnRyb2xOYW1lLCBtYXAuZ2V0KGluZGV4KSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGdldE9uZURpbU1hcChTdHJpbmcgY29udHJvbE5hbWUpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xOYW1lIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb25lRGltLmdldChjb250cm9sTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIFN0cmluZz4+IGdldFR3b0RpbU1hcChTdHJpbmcgY29udHJvbE5hbWUpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xOYW1lIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHdvRGltLmdldChjb250cm9sTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHByb3BlcnR5SWRzID0gb25lRGltLmdldChDT05UUk9MX1BST1BfSURfTE9XRVIpOwotICAgICAgICBpZiAocHJvcGVydHlJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8SW50ZWdlciwgU3RyaW5nPiBvbmVEaW1Qcm9wVmFsdWVzID0gb25lRGltLmdldChDT05UUk9MX1BST1BfVkFMVUVfTE9XRVIpOwotICAgICAgICBNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIFN0cmluZz4+IHR3b0RpbVByb3BWYWx1ZXMgPSB0d29EaW0uZ2V0KENPTlRST0xfUFJPUF9WQUxVRV9MT1dFUik7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gcHJvcGVydHlJZHMuc2l6ZSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5SWQgPSBwcm9wZXJ0eUlkcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oQ29uc3RhbnRzLkNPTlRST0xfUFJPUF9JRCArICIgaGFzIGdhcHMhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBudWxsOwotICAgICAgICAgICAgaWYgKG9uZURpbVByb3BWYWx1ZXMgIT0gbnVsbCAmJiBvbmVEaW1Qcm9wVmFsdWVzLmNvbnRhaW5zS2V5KGkpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvbmVEaW1Qcm9wVmFsdWVzLmdldChpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR3b0RpbVByb3BWYWx1ZXMgIT0gbnVsbCAmJiB0d29EaW1Qcm9wVmFsdWVzLmNvbnRhaW5zS2V5KGkpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgU3RyaW5nPiB2YWx1ZXNNYXAgPSB0d29EaW1Qcm9wVmFsdWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlQ291bnQgPSB2YWx1ZXNNYXAuc2l6ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdmFsdWVDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB2YWx1ZXNNYXAuZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihDb25zdGFudHMuQ09OVFJPTF9QUk9QX1ZBTFVFICsgIlsiICsgaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBoYXMgZ2FwcyEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQocHJvcGVydHlJZCwgdmFsdWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9EaXNjb3ZlcnlTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0Rpc2NvdmVyeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJkM2UwOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL0Rpc2NvdmVyeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3NlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX0FDTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9DSEFOR0VfTE9HX1RPS0VOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9QT0xJQ1lfSURTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1BST1BFUlRJRVM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlR5cGVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLQotLyoqCi0gKiBEaXNjb3ZlcnkgU2VydmljZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgRGlzY292ZXJ5U2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBxdWVyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fU1RBVEVNRU5UKTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgPT0gbnVsbCB8fCBzdGF0ZW1lbnQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fUSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fU0VBUkNIX0FMTF9WRVJTSU9OUyk7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5UKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RMaXN0IHJlc3VsdHMgPSBzZXJ2aWNlLnF1ZXJ5KHJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiUmVzdWx0cyBhcmUgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25SZXN1bHRzID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KHJlc3VsdHMsIHR5cGVDYWNoZSwgSlNPTkNvbnZlcnRlci5Qcm9wZXJ0eU1vZGUuUVVFUlksCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uUmVzdWx0cywgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0Q29udGVudENoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRDb250ZW50Q2hhbmdlcyBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VMb2dUb2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9DSEFOR0VfTE9HX1RPS0VOKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnRpZXMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1BST1BFUlRJRVMpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9QT0xJQ1lfSURTKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fQUNMKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGNoYW5nZUxvZ1Rva2VuKTsKLSAgICAgICAgICAgIE9iamVjdExpc3QgY2hhbmdlcyA9IHNlcnZpY2UuZ2V0Q29udGVudENoYW5nZXMocmVwb3NpdG9yeUlkLCBjaGFuZ2VMb2dUb2tlbkhvbGRlciwgaW5jbHVkZVByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgbWF4SXRlbXMsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25DaGFuZ2VzID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KGNoYW5nZXMsIHR5cGVDYWNoZSwgSlNPTkNvbnZlcnRlci5Qcm9wZXJ0eU1vZGUuQ0hBTkdFLAotICAgICAgICAgICAgICAgICAgICBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpOwotICAgICAgICAgICAganNvbkNoYW5nZXMucHV0KEpTT05Db25zdGFudHMuSlNPTl9PQkpFQ1RMSVNUX0NIQU5HRV9MT0dfVE9LRU4sIGNoYW5nZUxvZ1Rva2VuSG9sZGVyLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUpTT04oanNvbkNoYW5nZXMsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvTXVsdGlGaWxpbmdTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL011bHRpRmlsaW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTgzMjA2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvTXVsdGlGaWxpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9GT0xERVJfSUQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSlNPTkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVHlwZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOwotCi0vKioKLSAqIE11bHRpRmlsaW5nIFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsaW5nU2VydmljZSB7Ci0KLSAgICAvKgotICAgICAqIGFkZE9iamVjdFRvRm9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkT2JqZWN0VG9Gb2xkZXIgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fRk9MREVSX0lEKTsKLSAgICAgICAgICAgIEJvb2xlYW4gYWxsVmVyc2lvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BTExfVkVSU0lPTlMpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KG9iamVjdElkKTsKLSAgICAgICAgICAgIHNlcnZpY2UuYWRkT2JqZWN0VG9Gb2xkZXIocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IChvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBvYmplY3RJZCA6IG9iamVjdElkSG9sZGVyLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldFNpbXBsZU9iamVjdChzZXJ2aWNlLCByZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBzZXRTdGF0dXMocmVxdWVzdCwgcmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxvY2F0aW9uIiwgY29tcGlsZU9iamVjdExvY2F0aW9uVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCwgbmV3T2JqZWN0SWQpKTsKLQotICAgICAgICAgICAgLy8gcmV0dXJuIG9iamVjdAotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQob2JqZWN0LCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLk9CSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogcmVtb3ZlT2JqZWN0RnJvbUZvbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlbW92ZU9iamVjdEZyb21Gb2xkZXIgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fRk9MREVSX0lEKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KG9iamVjdElkKTsKLSAgICAgICAgICAgIHNlcnZpY2UucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSAob2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gb2JqZWN0SWQgOiBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgc2V0U3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlLCBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGNvbXBpbGVPYmplY3RMb2NhdGlvblVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKSk7Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9iamVjdCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL011bHRpcGFydFBhcnNlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9NdWx0aXBhcnRQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5MjgwYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL011bHRpcGFydFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5icm93c2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLk1pbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuVGVtcFN0b3JlT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeTsKLQotLyoqCi0gKiBTaW1wbGUgbXVsdGktcGFydCBwYXJzZXIsIGZvbGxvd2luZyBhbGwgbmVjZXNzYXJ5IHN0YW5kYXJkcyBmb3IgdGhlIENNSVMKLSAqIGJyb3dzZXIgYmluZGluZy4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpcGFydFBhcnNlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlQgPSAibXVsdGlwYXJ0LyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVF9GSUVMRCA9ICJfY2hhcnNldF8iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9GSUVMRF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMjU2ICogMTAyNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ1IgPSAweDBEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAweDBBOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgREFTSCA9IDB4MkQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEJPVU5EQVJZX1BSRUZJWCA9IHsgQ1IsIExGLCBEQVNILCBEQVNIIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotICAgIHByaXZhdGUgZmluYWwgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5OwotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gcmVxdWVzdFN0cmVhbTsKLQotICAgIHByaXZhdGUgYnl0ZVtdIGJvdW5kYXJ5OwotICAgIHByaXZhdGUgaW50W10gYmFkQ2hhcmFjdGVyczsKLSAgICBwcml2YXRlIGludFtdIGdvb2RTdWZmaXhlczsKLQotICAgIHByaXZhdGUgYnl0ZVtdIGJ1ZmZlcjsKLSAgICBwcml2YXRlIGJ5dGVbXSBidWZmZXIyOwotICAgIHByaXZhdGUgaW50IGJ1ZmZlclBvc2l0aW9uOwotICAgIHByaXZhdGUgaW50IGJ1ZmZlckNvdW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBlb2Y7Ci0KLSAgICBwcml2YXRlIGludCBmaWVsZEJ5dGVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDb250ZW50OwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnM7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZTsKLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgY29udGVudFNpemU7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gZmllbGRzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgYnl0ZVtdW10+IHJhd0ZpZWxkczsKLSAgICBwcml2YXRlIFN0cmluZyBjaGFyc2V0ID0gSU9VdGlscy5JU09fODg1OV8xOwotCi0gICAgcHVibGljIE11bHRpcGFydFBhcnNlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICB0aGlzLnN0cmVhbUZhY3RvcnkgPSBzdHJlYW1GYWN0b3J5OwotICAgICAgICB0aGlzLnJlcXVlc3RTdHJlYW0gPSByZXF1ZXN0LmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgZXh0cmFjdEJvdW5kYXJ5KCk7Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkUgKyBib3VuZGFyeS5sZW5ndGhdOwotICAgICAgICBidWZmZXIyID0gbmV3IGJ5dGVbYnVmZmVyLmxlbmd0aF07Ci0gICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gMDsKLSAgICAgICAgYnVmZmVyQ291bnQgPSAwOwotICAgICAgICBlb2YgPSBmYWxzZTsKLQotICAgICAgICBoYXNDb250ZW50ID0gZmFsc2U7Ci0gICAgICAgIGZpZWxkQnl0ZXMgPSAwOwotCi0gICAgICAgIGZpZWxkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7Ci0gICAgICAgIHJhd0ZpZWxkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgYnl0ZVtdW10+KCk7Ci0KLSAgICAgICAgc2tpcFByZWFtYmxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEZpZWxkKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gZmllbGRzLmdldChuYW1lKTsKLQotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGZpZWxkcy5wdXQobmFtZSwgbmV3IFN0cmluZ1tdIHsgdmFsdWUgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdWYWx1ZXMgPSBuZXcgU3RyaW5nW3ZhbHVlcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdWYWx1ZXMsIDAsIHZhbHVlcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3VmFsdWVzW25ld1ZhbHVlcy5sZW5ndGggLSAxXSA9IHZhbHVlOwotICAgICAgICAgICAgZmllbGRzLnB1dChuYW1lLCBuZXdWYWx1ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJhd0ZpZWxkKFN0cmluZyBuYW1lLCBieXRlW10gdmFsdWUpIHsKLSAgICAgICAgYnl0ZVtdW10gdmFsdWVzID0gcmF3RmllbGRzLmdldChuYW1lKTsKLQotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGJ5dGVbXVtdIG5ld1ZhbHVlID0gbmV3IGJ5dGVbXVtdIHsgdmFsdWUgfTsKLSAgICAgICAgICAgIHJhd0ZpZWxkcy5wdXQobmFtZSwgbmV3VmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnl0ZVtdW10gbmV3VmFsdWVzID0gbmV3IGJ5dGVbdmFsdWVzLmxlbmd0aCArIDFdW107Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlcywgMCwgbmV3VmFsdWVzLCAwLCB2YWx1ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld1ZhbHVlc1tuZXdWYWx1ZXMubGVuZ3RoIC0gMV0gPSB2YWx1ZTsKLSAgICAgICAgICAgIHJhd0ZpZWxkcy5wdXQobmFtZSwgbmV3VmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0Qm91bmRhcnkoKSB7Ci0gICAgICAgIFN0cmluZyByZXF1ZXN0Q29udGVudFR5cGUgPSByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7Ci0KLSAgICAgICAgLy8gcGFyc2UgY29udGVudCB0eXBlIGFuZCBleHRyYWN0IGJvdW5kYXJ5Ci0gICAgICAgIGJ5dGVbXSBleHRyYWN0ZWRCb3VuZGFyeSA9IE1pbWVIZWxwZXIuZ2V0Qm91bmRhcnlGcm9tTXVsdGlQYXJ0KHJlcXVlc3RDb250ZW50VHlwZSk7Ci0gICAgICAgIGlmIChleHRyYWN0ZWRCb3VuZGFyeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBtdWx0aXBhcnQgcmVxdWVzdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvdW5kYXJ5ID0gbmV3IGJ5dGVbQk9VTkRBUllfUFJFRklYLmxlbmd0aCArIGV4dHJhY3RlZEJvdW5kYXJ5Lmxlbmd0aF07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoQk9VTkRBUllfUFJFRklYLCAwLCBib3VuZGFyeSwgMCwgQk9VTkRBUllfUFJFRklYLmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZXh0cmFjdGVkQm91bmRhcnksIDAsIGJvdW5kYXJ5LCBCT1VOREFSWV9QUkVGSVgubGVuZ3RoLCBleHRyYWN0ZWRCb3VuZGFyeS5sZW5ndGgpOwotCi0gICAgICAgIC8vIHByZXBhcmUgYm91bmRhcnkgc2VhcmNoCi0KLSAgICAgICAgaW50IG0gPSBib3VuZGFyeS5sZW5ndGg7Ci0KLSAgICAgICAgYmFkQ2hhcmFjdGVycyA9IG5ldyBpbnRbMjU2XTsKLSAgICAgICAgQXJyYXlzLmZpbGwoYmFkQ2hhcmFjdGVycywgLTEpOwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbTsgaisrKSB7Ci0gICAgICAgICAgICBiYWRDaGFyYWN0ZXJzW2JvdW5kYXJ5W2pdICYgMHhmZl0gPSBqOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50W10gZiA9IG5ldyBpbnRbbSArIDFdOwotICAgICAgICBnb29kU3VmZml4ZXMgPSBuZXcgaW50W20gKyAxXTsKLSAgICAgICAgaW50IGkgPSBtOwotICAgICAgICBpbnQgaiA9IG0gKyAxOwotICAgICAgICBmW2ldID0gajsKLSAgICAgICAgd2hpbGUgKGkgPiAwKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaiA8PSBtICYmIGJvdW5kYXJ5W2kgLSAxXSAhPSBib3VuZGFyeVtqIC0gMV0pIHsKLSAgICAgICAgICAgICAgICBpZiAoZ29vZFN1ZmZpeGVzW2pdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZ29vZFN1ZmZpeGVzW2pdID0gaiAtIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGogPSBmW2pdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgai0tOwotICAgICAgICAgICAgZltpXSA9IGo7Ci0gICAgICAgIH0KLQotICAgICAgICBqID0gZlswXTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChnb29kU3VmZml4ZXNbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIGdvb2RTdWZmaXhlc1tpXSA9IGo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpID09IGopIHsKLSAgICAgICAgICAgICAgICBqID0gZltqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRCb3VuZGFyeSgpIHsKLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50IDwgYm91bmRhcnkubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG0gPSBib3VuZGFyeS5sZW5ndGg7Ci0KLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaSA8PSBidWZmZXJDb3VudCAtIG0pIHsKLSAgICAgICAgICAgIGludCBqID0gbSAtIDE7Ci0gICAgICAgICAgICB3aGlsZSAoaiA+PSAwICYmIGJvdW5kYXJ5W2pdID09IGJ1ZmZlcltpICsgal0pIHsKLSAgICAgICAgICAgICAgICBqLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpICs9IE1hdGgubWF4KGdvb2RTdWZmaXhlc1tqICsgMV0sIGogLSBiYWRDaGFyYWN0ZXJzW2J1ZmZlcltpICsgal0gJiAweGZmXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoYnVmZmVyUG9zaXRpb24gPCBidWZmZXJDb3VudCkgewotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclBvc2l0aW9uLCBidWZmZXIyLCAwLCBidWZmZXJDb3VudCAtIGJ1ZmZlclBvc2l0aW9uKTsKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQgLSBidWZmZXJQb3NpdGlvbjsKLQotICAgICAgICAgICAgYnl0ZVtdIHRtcEJ1ZmZlciA9IGJ1ZmZlcjI7Ci0gICAgICAgICAgICBidWZmZXIyID0gYnVmZmVyOwotICAgICAgICAgICAgYnVmZmVyID0gdG1wQnVmZmVyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyUG9zaXRpb24gPSAwOwotCi0gICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpbnQgciA9IHJlcXVlc3RTdHJlYW0ucmVhZChidWZmZXIsIGJ1ZmZlckNvdW50LCBidWZmZXIubGVuZ3RoIC0gYnVmZmVyQ291bnQpOwotICAgICAgICAgICAgaWYgKHIgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBlb2YgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZmZXJDb3VudCArPSByOwotICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gYnVmZmVyQ291bnQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IG5leHRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWRCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEJ5dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChidWZmZXJDb3VudCA+IGJ1ZmZlclBvc2l0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyW2J1ZmZlclBvc2l0aW9uKytdICYgMHhmZjsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYWRCdWZmZXIoKTsKLSAgICAgICAgcmV0dXJuIG5leHRCeXRlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBpbnQgcjsKLSAgICAgICAgd2hpbGUgKChyID0gbmV4dEJ5dGUoKSkgPiAtMSkgewotICAgICAgICAgICAgaWYgKHIgPT0gQ1IpIHsKLSAgICAgICAgICAgICAgICBpZiAobmV4dEJ5dGUoKSAhPSBMRikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBtdWx0aXBhcnQgcmVxdWVzdCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgcik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZEhlYWRlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgYiA9IG5leHRCeXRlKCk7Ci0gICAgICAgIGlmIChiID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGIgPT0gREFTSCkgewotICAgICAgICAgICAgYiA9IG5leHRCeXRlKCk7Ci0gICAgICAgICAgICBpZiAoYiA9PSBEQVNIKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbQotICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBudWxsOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChiID09IENSKSB7Ci0gICAgICAgICAgICBiID0gbmV4dEJ5dGUoKTsKLSAgICAgICAgICAgIGlmIChiID09IExGKSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VIZWFkZXJzKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbXVsdGlwYXJ0IHJlcXVlc3QhIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlSGVhZGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IGxpbmUgLT4gZW5kIG9mIGhlYWRlcnMKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHggPSBsaW5lLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmICh4ID4gMCkgewotICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KGxpbmUuc3Vic3RyaW5nKDAsIHgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS50cmltKCksIGxpbmUuc3Vic3RyaW5nKHggKyAxKS50cmltKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gcmVhZEJvZHlCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRCdWZmZXIoKTsKLQotICAgICAgICBpbnQgYm91bmRhcnlQb3NpdGlvbiA9IGZpbmRCb3VuZGFyeSgpOwotCi0gICAgICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID4gLTEpIHsKLSAgICAgICAgICAgIC8vIHRoZSBib2R5IGJ5dGVzIGFyZSBjb21wbGV0ZWx5IGluIHRoZSBidWZmZXIKLSAgICAgICAgICAgIGludCBsZW4gPSBib3VuZGFyeVBvc2l0aW9uIC0gYnVmZmVyUG9zaXRpb247Ci0gICAgICAgICAgICBhZGRGaWVsZEJ5dGVzKGxlbik7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBib2R5ID0gbmV3IGJ5dGVbbGVuXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZmZXJQb3NpdGlvbiwgYm9keSwgMCwgbGVuKTsKLSAgICAgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gYm91bmRhcnlQb3NpdGlvbiArIGJvdW5kYXJ5Lmxlbmd0aDsKLSAgICAgICAgICAgIHJldHVybiBib2R5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGJvZHkgYnl0ZXMgYXJlIG5vdCBjb21wbGV0ZWx5IGluIHRoZSBidWZmZXIKLSAgICAgICAgLy8gcmVhZCBhbGwgYXZhaWxhYmxlIGJ5dGVzCi0gICAgICAgIGludCBsZW4gPSBNYXRoLm1pbihCVUZGRVJfU0laRSwgYnVmZmVyQ291bnQpIC0gYnVmZmVyUG9zaXRpb247Ci0gICAgICAgIGFkZEZpZWxkQnl0ZXMobGVuKTsKLQotICAgICAgICBieXRlW10gYm9keUJ5dGVzID0gbmV3IGJ5dGVbbGVuICsgQlVGRkVSX1NJWkVdOwotICAgICAgICBpbnQgYm9keUJ5dGVzUG9zID0gbGVuOwotCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZmZXJQb3NpdGlvbiwgYm9keUJ5dGVzLCAwLCBsZW4pOwotICAgICAgICBidWZmZXJQb3NpdGlvbiA9IGJ1ZmZlclBvc2l0aW9uICsgbGVuOwotCi0gICAgICAgIC8vIHJlYWQgbmV4dCBjaHVuawotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgcmVhZEJ1ZmZlcigpOwotCi0gICAgICAgICAgICBib3VuZGFyeVBvc2l0aW9uID0gZmluZEJvdW5kYXJ5KCk7Ci0KLSAgICAgICAgICAgIGlmIChib3VuZGFyeVBvc2l0aW9uID4gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBsYXN0IGNodW5rCi0gICAgICAgICAgICAgICAgbGVuID0gYm91bmRhcnlQb3NpdGlvbiAtIGJ1ZmZlclBvc2l0aW9uOwotICAgICAgICAgICAgICAgIGFkZEZpZWxkQnl0ZXMobGVuKTsKLQotICAgICAgICAgICAgICAgIGlmIChib2R5Qnl0ZXNQb3MgKyBsZW4gPj0gYm9keUJ5dGVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBieXRlW10gbmV3Qm9keUJ5dGVzID0gbmV3IGJ5dGVbYm9keUJ5dGVzUG9zICsgbGVuXTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShib2R5Qnl0ZXMsIDAsIG5ld0JvZHlCeXRlcywgMCwgYm9keUJ5dGVzUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgYm9keUJ5dGVzID0gbmV3Qm9keUJ5dGVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVyUG9zaXRpb24sIGJvZHlCeXRlcywgYm9keUJ5dGVzUG9zLCBsZW4pOwotICAgICAgICAgICAgICAgIGJvZHlCeXRlc1BvcyArPSBsZW47Ci0KLSAgICAgICAgICAgICAgICBidWZmZXJQb3NpdGlvbiA9IGJvdW5kYXJ5UG9zaXRpb24gKyBib3VuZGFyeS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG5vdCB0aGUgbGFzdCBjaHVuawotICAgICAgICAgICAgICAgIGxlbiA9IE1hdGgubWluKEJVRkZFUl9TSVpFLCBidWZmZXJDb3VudCkgLSBidWZmZXJQb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBhZGRGaWVsZEJ5dGVzKGxlbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYm9keUJ5dGVzUG9zICsgbGVuID49IGJvZHlCeXRlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld1NpemUgPSBib2R5Qnl0ZXMubGVuZ3RoIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTaXplIDwgMCB8fCBuZXdTaXplID4gTUFYX0ZJRUxEX0JZVEVTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplID0gTUFYX0ZJRUxEX0JZVEVTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTaXplIDwgYm9keUJ5dGVzUG9zICsgbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdTaXplID0gYm9keUJ5dGVzUG9zICsgQlVGRkVSX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBieXRlW10gbmV3Qm9keUJ5dGVzID0gbmV3IGJ5dGVbbmV3U2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYm9keUJ5dGVzLCAwLCBuZXdCb2R5Qnl0ZXMsIDAsIGJvZHlCeXRlc1Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlCeXRlcyA9IG5ld0JvZHlCeXRlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclBvc2l0aW9uLCBib2R5Qnl0ZXMsIGJvZHlCeXRlc1BvcywgbGVuKTsKLSAgICAgICAgICAgICAgICBib2R5Qnl0ZXNQb3MgKz0gbGVuOwotCi0gICAgICAgICAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBidWZmZXJQb3NpdGlvbiArIGxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChib2R5Qnl0ZXMubGVuZ3RoID09IGJvZHlCeXRlc1BvcykgewotICAgICAgICAgICAgcmV0dXJuIGJvZHlCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSByZXR1cm5CeXRlcyA9IG5ldyBieXRlW2JvZHlCeXRlc1Bvc107Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYm9keUJ5dGVzLCAwLCByZXR1cm5CeXRlcywgMCwgcmV0dXJuQnl0ZXMubGVuZ3RoKTsKLQotICAgICAgICByZXR1cm4gcmV0dXJuQnl0ZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEZpZWxkQnl0ZXMoaW50IGxlbikgewotICAgICAgICBmaWVsZEJ5dGVzICs9IGxlbjsKLSAgICAgICAgaWYgKGZpZWxkQnl0ZXMgPiBNQVhfRklFTERfQllURVMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJMaW1pdCBleGNlZWRlZCEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkQm9keUFzU3RyZWFtKFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gc3RyZWFtID0gc3RyZWFtRmFjdG9yeS5uZXdPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgc3RyZWFtLnNldE1pbWVUeXBlKGNvbnRlbnRUeXBlKTsKLSAgICAgICAgc3RyZWFtLnNldEZpbGVOYW1lKGZpbGVuYW1lKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICByZWFkQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgYm91bmRhcnlQb3NpdGlvbiA9IGZpbmRCb3VuZGFyeSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24gPiAtMSkgewotICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoYnVmZmVyLCBidWZmZXJQb3NpdGlvbiwgYm91bmRhcnlQb3NpdGlvbiAtIGJ1ZmZlclBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBib3VuZGFyeVBvc2l0aW9uICsgYm91bmRhcnkubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gTWF0aC5taW4oQlVGRkVSX1NJWkUsIGJ1ZmZlckNvdW50KSAtIGJ1ZmZlclBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoYnVmZmVyLCBidWZmZXJQb3NpdGlvbiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBidWZmZXJQb3NpdGlvbiArIGxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICBjb250ZW50U2l6ZSA9IEJpZ0ludGVnZXIudmFsdWVPZihzdHJlYW0uZ2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IHN0cmVhbS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZywgbWFrZSBzdXJlIHRoZSB0ZW1wIGZpbGUgd2lsbAotICAgICAgICAgICAgLy8gYmUgZGVsZXRlZAotICAgICAgICAgICAgc3RyZWFtLmRlc3Ryb3koZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRCb2R5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnREaXNwb3NpdGlvbiA9IGhlYWRlcnMuZ2V0KCJjb250ZW50LWRpc3Bvc2l0aW9uIik7Ci0KLSAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBtdWx0aXBhcnQgcmVxdWVzdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIE1pbWVIZWxwZXIuZGVjb2RlQ29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbiwgcGFyYW1zKTsKLSAgICAgICAgYm9vbGVhbiBpc0NvbnRlbnQgPSBwYXJhbXMuY29udGFpbnNLZXkoTWltZUhlbHBlci5ESVNQT1NJVElPTl9GSUxFTkFNRSk7Ci0KLSAgICAgICAgaWYgKGlzQ29udGVudCkgewotICAgICAgICAgICAgaWYgKGhhc0NvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT25seSBvbmUgY29udGVudCBleHBlY3RlZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGZpbGVuYW1lID0gcGFyYW1zLmdldChNaW1lSGVscGVyLkRJU1BPU0lUSU9OX0ZJTEVOQU1FKTsKLQotICAgICAgICAgICAgaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYnJvd3NlciBzZW50IHRoZSBmdWxsIHBhdGgsCi0gICAgICAgICAgICAgICAgLy8gZXh0cmFjdCB0aGUgZmlsZW5hbWUgc2VnbWVudAotICAgICAgICAgICAgICAgIGludCBwYXRoc2VwID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aHNlcCA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKHBhdGhzZXAgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0aHNlcCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCdcXCcpOwotICAgICAgICAgICAgICAgIGlmIChwYXRoc2VwID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcocGF0aHNlcCArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUudHJpbSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250ZW50VHlwZSA9IGhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBDb25zdGFudHMuTUVESUFUWVBFX09DVEVUU1RSRUFNOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWFkQm9keUFzU3RyZWFtKGNvbnRlbnRUeXBlLCBmaWxlbmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXQoTWltZUhlbHBlci5ESVNQT1NJVElPTl9OQU1FKTsKLSAgICAgICAgICAgIGJ5dGVbXSByYXdWYWx1ZSA9IHJlYWRCb2R5Qnl0ZXMoKTsKLQotICAgICAgICAgICAgaWYgKENIQVJTRVRfRklFTEQuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBuZXcgU3RyaW5nKHJhd1ZhbHVlLCBJT1V0aWxzLklTT184ODU5XzEpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGZpZWxkQ29udGVudFR5cGUgPSBoZWFkZXJzLmdldCgiY29udGVudC10eXBlIik7Ci0gICAgICAgICAgICBpZiAoZmllbGRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpZWxkQ2hhcnNldCA9IE1pbWVIZWxwZXIuZ2V0Q2hhcnNldEZyb21Db250ZW50VHlwZShmaWVsZENvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGRDaGFyc2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkRmllbGQobmFtZSwgbmV3IFN0cmluZyhyYXdWYWx1ZSwgZmllbGRDaGFyc2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFJhd0ZpZWxkKG5hbWUsIHJhd1ZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBza2lwUHJlYW1ibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZWFkQnVmZmVyKCk7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlckNvdW50IDwgYm91bmRhcnkubGVuZ3RoIC0gMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbXVsdGlwYXJ0IHJlcXVlc3QhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IGJvdW5kYXJ5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYm91bmRhcnlbaV0gIT0gYnVmZmVyW2kgLSAyXSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSA9PSBib3VuZGFyeS5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBib3VuZGFyeS5sZW5ndGggLSAyOwotICAgICAgICAgICAgICAgIHJlYWRCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgaW50IGJvdW5kYXJ5UG9zaXRpb24gPSBmaW5kQm91bmRhcnkoKTsKLQotICAgICAgICAgICAgaWYgKGJvdW5kYXJ5UG9zaXRpb24gPiAtMSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gYm91bmRhcnlQb3NpdGlvbiArIGJvdW5kYXJ5Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICByZWFkQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gQlVGRkVSX1NJWkUgKyAxOwotICAgICAgICAgICAgcmVhZEJ1ZmZlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNraXBFcGlsb2d1ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHJlYWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGJ1dCBtYXggMSBNQgotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGJ5dGVbXSB0bXBCdWYgPSBuZXcgYnl0ZVs0MDk2XTsKLSAgICAgICAgICAgIGludCBiOwotICAgICAgICAgICAgd2hpbGUgKChiID0gcmVxdWVzdFN0cmVhbS5yZWFkKHRtcEJ1ZikpID4gLTEpIHsKLSAgICAgICAgICAgICAgICBjb3VudCArPSBiOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSAxMDI0ICogMTAyNCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlYWROZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRIZWFkZXJzKCk7Ci0KLSAgICAgICAgICAgIC8vIG5vIGhlYWRlcnMgLT4gZW5kIG9mIHJlcXVlc3QKLSAgICAgICAgICAgIGlmIChoZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBza2lwRXBpbG9ndWUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlYWRCb2R5KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShjb250ZW50U3RyZWFtKTsKLQotICAgICAgICAgICAgc2tpcEVwaWxvZ3VlKCk7Ci0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHdoaWxlIChyZWFkTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCBqdXN0IHJlYWQKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXBwbHkgY2hhcnNldAotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBieXRlW11bXT4gZSA6IHJhd0ZpZWxkcy5lbnRyeVNldCgpKSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBvdGhlclZhbHVlcyA9IGZpZWxkcy5nZXQoZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gKG90aGVyVmFsdWVzICE9IG51bGwgPyBvdGhlclZhbHVlcy5sZW5ndGggOiAwKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbZS5nZXRWYWx1ZSgpLmxlbmd0aCArIGluZGV4XTsKLQotICAgICAgICAgICAgICAgIGlmIChvdGhlclZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3RoZXJWYWx1ZXMsIDAsIHZhbHVlcywgMCwgb3RoZXJWYWx1ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGJ5dGVbXSByYXdWYWx1ZSA6IGUuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXgrK10gPSBuZXcgU3RyaW5nKHJhd1ZhbHVlLCBjaGFyc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaWVsZHMucHV0KGUuZ2V0S2V5KCksIHZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoY29udGVudFN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNraXBFcGlsb2d1ZSgpOwotCi0gICAgICAgICAgICBmaWVsZHMgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiRW5jb2Rpbmcgbm90IHN1cHBvcnRlZCEiLCBlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENtaXNCYXNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKENtaXNCYXNlRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByYXdGaWVsZHMgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRTaXplKCkgewotICAgICAgICByZXR1cm4gY29udGVudFNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBnZXRGaWVsZHMoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgcmVxdWVzdCBpcyBhIG11bHRpLXBhcnQgcmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc011bHRpcGFydENvbnRlbnQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpOwotCi0gICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsICYmIGNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5zdGFydHNXaXRoKE1VTFRJUEFSVCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvTmF2aWdhdGlvblNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvTmF2aWdhdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1ZDQwOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL05hdmlnYXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9ERVBUSDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9GSUxURVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fTUFYX0lURU1TOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX09SREVSX0JZOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1BBVEhfU0VHTUVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1JFTEFUSVZFX1BBVEhfU0VHTUVOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1NLSVBfQ09VTlQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlR5cGVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OQXJyYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotLyoqCi0gKiBOYXZpZ2F0aW9uIFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIE5hdmlnYXRpb25TZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIGdldENoaWxkcmVuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0Q2hpbGRyZW4gZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX0ZJTFRFUik7Ci0gICAgICAgICAgICBTdHJpbmcgb3JkZXJCeSA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9PUkRFUl9CWSk7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9BTExPV0FCTEVfQUNUSU9OUyk7Ci0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcyA9IGdldEVudW1QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fUkVMQVRJT05TSElQUywKLSAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MpOwotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9SRU5ESVRJT05fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9QQVRIX1NFR01FTlQpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcyA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fTUFYX0lURU1TKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgc2tpcENvdW50ID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9TS0lQX0NPVU5UKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgY2hpbGRyZW4gPSBzZXJ2aWNlLmdldENoaWxkcmVuKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgICAgIHNraXBDb3VudCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2hpbGRyZW4gYXJlIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uQ2hpbGRyZW4gPSBKU09OQ29udmVydGVyLmNvbnZlcnQoY2hpbGRyZW4sIHR5cGVDYWNoZSwgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25DaGlsZHJlbiwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0RGVzY2VuZGFudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXREZXNjZW5kYW50cyBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgZGVwdGggPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX0RFUFRIKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TKTsKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1JFTkRJVElPTl9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1BBVEhfU0VHTUVOVCk7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fU1VDQ0lOQ1QsIGZhbHNlKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZGVzY2VuZGFudHMgPSBzZXJ2aWNlLmdldERlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRlc2NlbmRhbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkRlc2NlbmRhbnRzIGFyZSBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEpTT05BcnJheSBqc29uRGVzY2VuZGFudHMgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIGRlc2NlbmRhbnQgOiBkZXNjZW5kYW50cykgewotICAgICAgICAgICAgICAgIGpzb25EZXNjZW5kYW50cy5hZGQoSlNPTkNvbnZlcnRlci5jb252ZXJ0KGRlc2NlbmRhbnQsIHR5cGVDYWNoZSwgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uRGVzY2VuZGFudHMsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldEZvbGRlclRyZWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRGb2xkZXJUcmVlIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBkZXB0aCA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fREVQVEgpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1JFTEFUSU9OU0hJUFMsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fUkVORElUSU9OX0ZJTFRFUik7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fUEFUSF9TRUdNRU5UKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBmb2xkZXJUcmVlID0gc2VydmljZS5nZXRGb2xkZXJUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZvbGRlclRyZWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRm9sZGVyIFRyZWUgYXJlIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTkFycmF5IGpzb25EZXNjZW5kYW50cyA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgZGVzY2VuZGFudCA6IGZvbGRlclRyZWUpIHsKLSAgICAgICAgICAgICAgICBqc29uRGVzY2VuZGFudHMuYWRkKEpTT05Db252ZXJ0ZXIuY29udmVydChkZXNjZW5kYW50LCB0eXBlQ2FjaGUsIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUpTT04oanNvbkRlc2NlbmRhbnRzLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRGb2xkZXJQYXJlbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRGb2xkZXJQYXJlbnQgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX0ZJTFRFUik7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fU1VDQ0lOQ1QsIGZhbHNlKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBwYXJlbnQgPSBzZXJ2aWNlLmdldEZvbGRlclBhcmVudChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQYXJlbnQgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQocGFyZW50LCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLk9CSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldE9iamVjdFBhcmVudHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRPYmplY3RQYXJlbnRzIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1JFTEFUSU9OU0hJUFMsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fUkVORElUSU9OX0ZJTFRFUik7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9SRUxBVElWRV9QQVRIX1NFR01FTlQpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcGFyZW50cyA9IHNlcnZpY2UuZ2V0T2JqZWN0UGFyZW50cyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQYXJlbnRzIGFyZSBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEpTT05BcnJheSBqc29uUGFyZW50cyA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0UGFyZW50RGF0YSBwYXJlbnQgOiBwYXJlbnRzKSB7Ci0gICAgICAgICAgICAgICAganNvblBhcmVudHMuYWRkKEpTT05Db252ZXJ0ZXIuY29udmVydChwYXJlbnQsIHR5cGVDYWNoZSwgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uUGFyZW50cywgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0Q2hlY2tlZE91dERvY3MuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRDaGVja2VkT3V0RG9jcyBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIFN0cmluZyBvcmRlckJ5ID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX09SREVSX0JZKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TKTsKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1JFTkRJVElPTl9GSUxURVIpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcyA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fTUFYX0lURU1TKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgc2tpcENvdW50ID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9TS0lQX0NPVU5UKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RMaXN0IGNoZWNrZWRvdXQgPSBzZXJ2aWNlLmdldENoZWNrZWRPdXREb2NzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoZWNrZWRvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2hlY2tlZCBvdXQgbGlzdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbkNoZWNrZWRPdXQgPSBKU09OQ29udmVydGVyLmNvbnZlcnQoY2hlY2tlZG91dCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uQ2hlY2tlZE91dCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9PYmplY3RTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL09iamVjdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmNDg0OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL09iamVjdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTm90RW1wdHk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db2xsZWN0aW9uc0hlbHBlci5pc051bGxPckVtcHR5OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLk1FRElBVFlQRV9PQ1RFVFNUUkVBTTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9BQ0w7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fQUxMT1dBQkxFX0FDVElPTlM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fRE9XTkxPQUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1BPTElDWV9JRFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fUkVMQVRJT05TSElQUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9SRU5ESVRJT05fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1JFVFVSTl9WRVJTSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1NPVVJDRV9GT0xERVJfSUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fU09VUkNFX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1NUUkVBTV9JRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9UQVJHRVRfRk9MREVSX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1RPS0VOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1ZFUlNJT05JR19TVEFURTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5EYXRlVGltZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5NaW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5SZXR1cm5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5UeXBlQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OQXJyYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci0KLS8qKgotICogT2JqZWN0IFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNjQgKiAxMDI0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3JlYXRlRG9jdW1lbnQgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9WRVJTSU9OSUdfU1RBVEUsIFZlcnNpb25pbmdTdGF0ZS5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fVE9LRU4pOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLkNPTlRST0xfU1VDQ0lOQ1QsIGZhbHNlKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIENvbnRyb2xQYXJzZXIgY3AgPSBuZXcgQ29udHJvbFBhcnNlcihyZXF1ZXN0KTsKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjcmVhdGVDb250ZW50U3RyZWFtKHJlcXVlc3QpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IHNlcnZpY2UuY3JlYXRlRG9jdW1lbnQocmVwb3NpdG9yeUlkLCBjcmVhdGVOZXdQcm9wZXJ0aWVzKGNwLCB0eXBlQ2FjaGUpLCBmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLCBjcmVhdGVQb2xpY2llcyhjcCksIGNyZWF0ZUFkZEFjbChjcCksIGNyZWF0ZVJlbW92ZUFjbChjcCksIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5ldyBkb2N1bWVudCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXR1cm4gb2JqZWN0Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQob2JqZWN0LCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLk9CSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgc2V0U3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlLCBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgc2V0Q29va2llKHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQsIHRva2VuLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb29raWVWYWx1ZShIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQsIG9iamVjdC5nZXRJZCgpLCBudWxsLCBudWxsKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgZG9jdW1lbnQgZnJvbSBzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc291cmNlSWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fU09VUkNFX0lEKTsKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1ZFUlNJT05JR19TVEFURSwgVmVyc2lvbmluZ1N0YXRlLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9UT0tFTik7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuQ09OVFJPTF9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgQ29udHJvbFBhcnNlciBjcCA9IG5ldyBDb250cm9sUGFyc2VyKHJlcXVlc3QpOwotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgc291cmNlRG9jID0gZ2V0U2ltcGxlT2JqZWN0KHNlcnZpY2UsIHJlcG9zaXRvcnlJZCwgc291cmNlSWQpOwotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IHNvdXJjZVR5cGVJZCA9IHNvdXJjZURvYy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgICAgICBpZiAoc291cmNlVHlwZUlkID09IG51bGwgfHwgc291cmNlVHlwZUlkLmdldEZpcnN0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJTb3VyY2Ugb2JqZWN0IGhhcyBubyB0eXBlIT8hIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG5ld09iamVjdElkID0gc2VydmljZS5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgICAgICAgICAgc291cmNlSWQsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVVwZGF0ZVByb3BlcnRpZXMoY3AsIHNvdXJjZVR5cGVJZC5nZXRGaXJzdFZhbHVlKCkudG9TdHJpbmcoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNvdXJjZUlkKSwgdHlwZUNhY2hlKSwgZm9sZGVySWQsIHZlcnNpb25pbmdTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlUG9saWNpZXMoY3ApLCBjcmVhdGVBZGRBY2woY3ApLCBjcmVhdGVSZW1vdmVBY2woY3ApLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0U2ltcGxlT2JqZWN0KHNlcnZpY2UsIHJlcG9zaXRvcnlJZCwgbmV3T2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJOZXcgZG9jdW1lbnQgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmV0dXJuIG9iamVjdAotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9iamVjdCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHNldFN0YXR1cyhyZXF1ZXN0LCByZXNwb25zZSwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHNldENvb2tpZShyZXF1ZXN0LCByZXNwb25zZSwgcmVwb3NpdG9yeUlkLCB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29va2llVmFsdWUoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVELCBvYmplY3QuZ2V0SWQoKSwgbnVsbCwgbnVsbCkpOwotCi0gICAgICAgICAgICB3cml0ZUpTT04oanNvbk9iamVjdCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGZvbGRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENyZWF0ZUZvbGRlciBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9UT0tFTik7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuQ09OVFJPTF9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgQ29udHJvbFBhcnNlciBjcCA9IG5ldyBDb250cm9sUGFyc2VyKHJlcXVlc3QpOwotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG5ld09iamVjdElkID0gc2VydmljZS5jcmVhdGVGb2xkZXIocmVwb3NpdG9yeUlkLCBjcmVhdGVOZXdQcm9wZXJ0aWVzKGNwLCB0eXBlQ2FjaGUpLCBmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlUG9saWNpZXMoY3ApLCBjcmVhdGVBZGRBY2woY3ApLCBjcmVhdGVSZW1vdmVBY2woY3ApLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0U2ltcGxlT2JqZWN0KHNlcnZpY2UsIHJlcG9zaXRvcnlJZCwgbmV3T2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJOZXcgZm9sZGVyIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChvYmplY3QsIHR5cGVDYWNoZSwgSlNPTkNvbnZlcnRlci5Qcm9wZXJ0eU1vZGUuT0JKRUNULAotICAgICAgICAgICAgICAgICAgICBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICBzZXRTdGF0dXMocmVxdWVzdCwgcmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0gICAgICAgICAgICBzZXRDb29raWUocmVxdWVzdCwgcmVzcG9uc2UsIHJlcG9zaXRvcnlJZCwgdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvb2tpZVZhbHVlKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCwgb2JqZWN0LmdldElkKCksIG51bGwsIG51bGwpKTsKLQotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBwb2xpY3kuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDcmVhdGVQb2xpY3kgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fVE9LRU4pOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLkNPTlRST0xfU1VDQ0lOQ1QsIGZhbHNlKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIENvbnRyb2xQYXJzZXIgY3AgPSBuZXcgQ29udHJvbFBhcnNlcihyZXF1ZXN0KTsKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IHNlcnZpY2UuY3JlYXRlUG9saWN5KHJlcG9zaXRvcnlJZCwgY3JlYXRlTmV3UHJvcGVydGllcyhjcCwgdHlwZUNhY2hlKSwgZm9sZGVySWQsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVBvbGljaWVzKGNwKSwgY3JlYXRlQWRkQWNsKGNwKSwgY3JlYXRlUmVtb3ZlQWNsKGNwKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldFNpbXBsZU9iamVjdChzZXJ2aWNlLCByZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTmV3IHBvbGljeSBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXR1cm4gb2JqZWN0Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQob2JqZWN0LCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLk9CSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgc2V0U3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlLCBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgc2V0Q29va2llKHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQsIHRva2VuLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb29raWVWYWx1ZShIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQsIG9iamVjdC5nZXRJZCgpLCBudWxsLCBudWxsKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgSXRlbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENyZWF0ZUl0ZW0gZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fVE9LRU4pOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLkNPTlRST0xfU1VDQ0lOQ1QsIGZhbHNlKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIENvbnRyb2xQYXJzZXIgY3AgPSBuZXcgQ29udHJvbFBhcnNlcihyZXF1ZXN0KTsKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IHNlcnZpY2UuY3JlYXRlSXRlbShyZXBvc2l0b3J5SWQsIGNyZWF0ZU5ld1Byb3BlcnRpZXMoY3AsIHR5cGVDYWNoZSksIGZvbGRlcklkLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVQb2xpY2llcyhjcCksIGNyZWF0ZUFkZEFjbChjcCksIGNyZWF0ZVJlbW92ZUFjbChjcCksIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5ldyBpdGVtIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChvYmplY3QsIHR5cGVDYWNoZSwgSlNPTkNvbnZlcnRlci5Qcm9wZXJ0eU1vZGUuT0JKRUNULAotICAgICAgICAgICAgICAgICAgICBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICBzZXRTdGF0dXMocmVxdWVzdCwgcmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0gICAgICAgICAgICBzZXRDb29raWUocmVxdWVzdCwgcmVzcG9uc2UsIHJlcG9zaXRvcnlJZCwgdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvb2tpZVZhbHVlKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCwgb2JqZWN0LmdldElkKCksIG51bGwsIG51bGwpKTsKLQotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSByZWxhdGlvbnNoaXAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDcmVhdGVSZWxhdGlvbnNoaXAgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fVE9LRU4pOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLkNPTlRST0xfU1VDQ0lOQ1QsIGZhbHNlKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIENvbnRyb2xQYXJzZXIgY3AgPSBuZXcgQ29udHJvbFBhcnNlcihyZXF1ZXN0KTsKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IHNlcnZpY2UuY3JlYXRlUmVsYXRpb25zaGlwKHJlcG9zaXRvcnlJZCwgY3JlYXRlTmV3UHJvcGVydGllcyhjcCwgdHlwZUNhY2hlKSwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlUG9saWNpZXMoY3ApLCBjcmVhdGVBZGRBY2woY3ApLCBjcmVhdGVSZW1vdmVBY2woY3ApLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0U2ltcGxlT2JqZWN0KHNlcnZpY2UsIHJlcG9zaXRvcnlJZCwgbmV3T2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJOZXcgcmVsYXRpb25zaGlwIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChvYmplY3QsIHR5cGVDYWNoZSwgSlNPTkNvbnZlcnRlci5Qcm9wZXJ0eU1vZGUuT0JKRUNULAotICAgICAgICAgICAgICAgICAgICBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICBzZXRTdGF0dXMocmVxdWVzdCwgcmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0gICAgICAgICAgICBzZXRDb29raWUocmVxdWVzdCwgcmVzcG9uc2UsIHJlcG9zaXRvcnlJZCwgdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvb2tpZVZhbHVlKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCwgb2JqZWN0LmdldElkKCksIG51bGwsIG51bGwpKTsKLQotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHVwZGF0ZVByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBVcGRhdGVQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0VHlwZUlkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhbmdlVG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLkNPTlRST0xfQ0hBTkdFX1RPS0VOKTsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9UT0tFTik7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuQ09OVFJPTF9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgQ29udHJvbFBhcnNlciBjcCA9IG5ldyBDb250cm9sUGFyc2VyKHJlcXVlc3QpOwotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCk7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbkhvbGRlciA9IChjaGFuZ2VUb2tlbiA9PSBudWxsID8gbnVsbCA6IG5ldyBIb2xkZXI8U3RyaW5nPihjaGFuZ2VUb2tlbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UudXBkYXRlUHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkSG9sZGVyLCBjaGFuZ2VUb2tlbkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlVXBkYXRlUHJvcGVydGllcyhjcCwgdHlwZUlkLCBudWxsLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iamVjdElkKSwgdHlwZUNhY2hlKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSAob2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gb2JqZWN0SWQgOiBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXR1cm4gb2JqZWN0Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQob2JqZWN0LCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLk9CSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgaW50IHN0YXR1cyA9IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0s7Ci0gICAgICAgICAgICBpZiAoIW9iamVjdElkLmVxdWFscyhuZXdPYmplY3RJZCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFN0YXR1cyhyZXF1ZXN0LCByZXNwb25zZSwgc3RhdHVzKTsKLSAgICAgICAgICAgIHNldENvb2tpZShyZXF1ZXN0LCByZXNwb25zZSwgcmVwb3NpdG9yeUlkLCB0b2tlbiwgY3JlYXRlQ29va2llVmFsdWUoc3RhdHVzLCBvYmplY3QuZ2V0SWQoKSwgbnVsbCwgbnVsbCkpOwotCi0gICAgICAgICAgICB3cml0ZUpTT04oanNvbk9iamVjdCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYnVsa1VwZGF0ZVByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWxrVXBkYXRlUHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgQ29udHJvbFBhcnNlciBjcCA9IG5ldyBDb250cm9sUGFyc2VyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBnZXQgb2JqZWN0IGlkcyBhbmQgY2hhbmdlIHRva2VucwotICAgICAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiA9IG5ldyBBcnJheUxpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+KCk7Ci0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBvYmplY3RJZHMgPSBjcC5nZXRWYWx1ZXMoQ29uc3RhbnRzLkNPTlRST0xfT0JKRUNUX0lEKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGFuZ2VUb2tlbnMgPSBjcC5nZXRWYWx1ZXMoQ29uc3RhbnRzLkNPTlRST0xfQ0hBTkdFX1RPS0VOKTsKLQotICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkob2JqZWN0SWRzKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJObyBvYmplY3QgaWRzIHByb3ZpZGVkISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgbiA9IG9iamVjdElkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IG9iamVjdElkcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNoYW5nZVRva2VuID0gKGNoYW5nZVRva2VucyAhPSBudWxsICYmIGNoYW5nZVRva2Vucy5zaXplKCkgPiBpID8gY2hhbmdlVG9rZW5zLmdldChpKSA6IG51bGwpOwotICAgICAgICAgICAgICAgIG9iamVjdElkQW5kQ2hhbmdlVG9rZW4uYWRkKG5ldyBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwoaWQsIGNoYW5nZVRva2VuKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCBzZWNvbmRhcnkgdHlwZSBpZHMKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlcyA9IGNwLmdldFZhbHVlcyhDb25zdGFudHMuQ09OVFJPTF9BRERfU0VDT05EQVJZX1RZUEUpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlbW92ZVNlY29uZGFyeVR5cGVzID0gY3AuZ2V0VmFsdWVzKENvbnN0YW50cy5DT05UUk9MX1JFTU9WRV9TRUNPTkRBUllfVFlQRSk7Ci0KLSAgICAgICAgICAgIC8vIGNvbXBpbGUgcHJvcGVydGllcwotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IGNyZWF0ZVVwZGF0ZVByb3BlcnRpZXMoY3AsIG51bGwsIGFkZFNlY29uZGFyeVR5cGVzLCBvYmplY3RJZHMsIHR5cGVDYWNoZSk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gcmVzdWx0ID0gc2VydmljZS5idWxrVXBkYXRlUHJvcGVydGllcyhyZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIHByb3BlcnRpZXMsIGFkZFNlY29uZGFyeVR5cGVzLCByZW1vdmVTZWNvbmRhcnlUeXBlcywgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXR1cm4gcmVzdWx0Ci0gICAgICAgICAgICBKU09OQXJyYXkganNvbkxpc3QgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuIG9jIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqc29uTGlzdC5hZGQoSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9jKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uTGlzdCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0UHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldFByb3BlcnRpZXMgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBSZXR1cm5WZXJzaW9uIHJldHVyblZlcnNpb24gPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1JFVFVSTl9WRVJTSU9OLCBSZXR1cm5WZXJzaW9uLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXR1cm5WZXJzaW9uID09IFJldHVyblZlcnNpb24uTEFURVNUIHx8IHJldHVyblZlcnNpb24gPT0gUmV0dXJuVmVyc2lvbi5MQVNURVNUTUFKT1IpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gc2VydmljZS5nZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WZXJzaW9uID09IFJldHVyblZlcnNpb24uTEFTVEVTVE1BSk9SLCBmaWx0ZXIsIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gc2VydmljZS5nZXRQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQcm9wZXJ0aWVzIGFyZSBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZXR1cm4gb2JqZWN0Ci0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChwcm9wZXJ0aWVzLCBvYmplY3RJZCwgdHlwZUNhY2hlLAotICAgICAgICAgICAgICAgICAgICBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBSZXR1cm5WZXJzaW9uIHJldHVyblZlcnNpb24gPSBnZXRFbnVtUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1JFVFVSTl9WRVJTSU9OLCBSZXR1cm5WZXJzaW9uLmNsYXNzKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fRklMVEVSKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TKTsKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1JFTkRJVElPTl9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9QT0xJQ1lfSURTKTsKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fQUNMKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3Q7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJldHVyblZlcnNpb24gPT0gUmV0dXJuVmVyc2lvbi5MQVRFU1QgfHwgcmV0dXJuVmVyc2lvbiA9PSBSZXR1cm5WZXJzaW9uLkxBU1RFU1RNQUpPUikgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IHNlcnZpY2UuZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WZXJzaW9uID09IFJldHVyblZlcnNpb24uTEFTVEVTVE1BSk9SLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IHNlcnZpY2UuZ2V0T2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9iamVjdCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBbGxvd2FibGVBY3Rpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0QWxsb3dhYmxlQWN0aW9ucyBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMgPSBzZXJ2aWNlLmdldEFsbG93YWJsZUFjdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25BbGxvd2FibGVBY3Rpb25zID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KGFsbG93YWJsZUFjdGlvbnMpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUpTT04oanNvbkFsbG93YWJsZUFjdGlvbnMsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldFJlbmRpdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRSZW5kaXRpb25zIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9SRU5ESVRJT05fRklMVEVSKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9NQVhfSVRFTVMpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5UKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IHJlbmRpdGlvbnMgPSBzZXJ2aWNlLmdldFJlbmRpdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywKLSAgICAgICAgICAgICAgICAgICAgc2tpcENvdW50LCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEpTT05BcnJheSBqc29uUmVuZGl0aW9ucyA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgIGlmIChyZW5kaXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFJlbmRpdGlvbkRhdGEgcmVuZGl0aW9uIDogcmVuZGl0aW9ucykgewotICAgICAgICAgICAgICAgICAgICBqc29uUmVuZGl0aW9ucy5hZGQoSlNPTkNvbnZlcnRlci5jb252ZXJ0KHJlbmRpdGlvbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25SZW5kaXRpb25zLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRDb250ZW50U3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0Q29udGVudFN0cmVhbSBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHJlYW1JZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9TVFJFQU1fSUQpOwotCi0gICAgICAgICAgICBib29sZWFuIGRvd25sb2FkID0gZmFsc2U7Ci0gICAgICAgICAgICBTdHJpbmcgZG93bmxvYWRQYXJhbSA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9ET1dOTE9BRCk7Ci0gICAgICAgICAgICBpZiAoZG93bmxvYWRQYXJhbSAhPSBudWxsICYmIGRvd25sb2FkUGFyYW0ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRvd25sb2FkUGFyYW1Mb3dlciA9IGRvd25sb2FkUGFyYW0udHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgICAgICBpZiAoImF0dGFjaG1lbnQiLmVxdWFscyhkb3dubG9hZFBhcmFtTG93ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJpbmxpbmUiLmVxdWFscyhkb3dubG9hZFBhcmFtTG93ZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvd25sb2FkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZG93bmxvYWQgcGFyYW1ldGVyIHZhbHVlISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQmlnSW50ZWdlciBvZmZzZXQgPSBjb250ZXh0LmdldE9mZnNldCgpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGggPSBjb250ZXh0LmdldExlbmd0aCgpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudCA9IHNlcnZpY2UuZ2V0Q29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBzdHJlYW1JZCwgb2Zmc2V0LCBsZW5ndGgsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCB8fCBjb250ZW50LmdldFN0cmVhbSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNvbnRlbnQgc3RyZWFtIGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldCBIVFRQIGhlYWRlcnMsIGlmIHJlcXVlc3RlZCBieSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICBpZiAoc2VuZENvbnRlbnRTdHJlYW1IZWFkZXJzKGNvbnRlbnQsIHJlcXVlc3QsIHJlc3BvbnNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gY29udGVudC5nZXRNaW1lVHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IE1FRElBVFlQRV9PQ1RFVFNUUkVBTTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIGlmICgob2Zmc2V0ID09IG51bGwgfHwgb2Zmc2V0LnNpZ251bSgpID09IDApICYmIGxlbmd0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRTdGF0dXMocmVxdWVzdCwgcmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfUEFSVElBTF9DT05URU5UKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmdldEJpZ0xlbmd0aCgpICE9IG51bGwgJiYgY29udGVudC5nZXRCaWdMZW5ndGgoKS5zaWdudW0oKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgZmlyc3RCeXRlUG9zID0gKG9mZnNldCA9PSBudWxsID8gQmlnSW50ZWdlci5aRVJPIDogb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlciBsYXN0Qnl0ZVBvcyA9IGZpcnN0Qnl0ZVBvcy5hZGQoY29udGVudC5nZXRCaWdMZW5ndGgoKS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpOwotCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ29udGVudC1SYW5nZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzICIgKyBmaXJzdEJ5dGVQb3MudG9TdHJpbmcoKSArICItIiArIGxhc3RCeXRlUG9zLnRvU3RyaW5nKCkgKyAiLyoiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50RmlsZW5hbWUgPSBjb250ZW50LmdldEZpbGVOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudEZpbGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50RmlsZW5hbWUgPSAiY29udGVudCI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkb3dubG9hZCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihNaW1lSGVscGVyLkNPTlRFTlRfRElTUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBNaW1lSGVscGVyLmVuY29kZUNvbnRlbnREaXNwb3NpdGlvbihNaW1lSGVscGVyLkRJU1BPU0lUSU9OX0FUVEFDSE1FTlQsIGNvbnRlbnRGaWxlbmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoTWltZUhlbHBlci5DT05URU5UX0RJU1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgTWltZUhlbHBlci5lbmNvZGVDb250ZW50RGlzcG9zaXRpb24oTWltZUhlbHBlci5ESVNQT1NJVElPTl9JTkxJTkUsIGNvbnRlbnRGaWxlbmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZW5kIGNvbnRlbnQKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gY29udGVudC5nZXRTdHJlYW0oKTsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KGluLCBvdXQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRlbGV0ZU9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlbGV0ZU9iamVjdCBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIEJvb2xlYW4gYWxsVmVyc2lvbnMgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9BTExfVkVSU0lPTlMpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlRW1wdHkocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZGVsZXRlVHJlZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlbGV0ZVRyZWUgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBCb29sZWFuIGFsbFZlcnNpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQUxMX1ZFUlNJT05TKTsKLSAgICAgICAgICAgIFVuZmlsZU9iamVjdCB1bmZpbGVPYmplY3RzID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fVU5GSUxFX09CSkVDVFMsIFVuZmlsZU9iamVjdC5jbGFzcyk7Ci0gICAgICAgICAgICBCb29sZWFuIGNvbnRpbnVlT25GYWlsdXJlID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQ09OVElOVUVfT05fRkFJTFVSRSk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmFpbGVkVG9EZWxldGVEYXRhIGZ0ZCA9IHNlcnZpY2UuZGVsZXRlVHJlZShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgdW5maWxlT2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgY29udGludWVPbkZhaWx1cmUsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotCi0gICAgICAgICAgICBpZiAoZnRkICE9IG51bGwgJiYgaXNOb3RFbXB0eShmdGQuZ2V0SWRzKCkpKSB7Ci0gICAgICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KGZ0ZCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlRW1wdHkocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlIGNvbnRlbnQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVsZXRlQ29udGVudFN0cmVhbSBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQ0hBTkdFX1RPS0VOKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCk7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbkhvbGRlciA9IChjaGFuZ2VUb2tlbiA9PSBudWxsID8gbnVsbCA6IG5ldyBIb2xkZXI8U3RyaW5nPihjaGFuZ2VUb2tlbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlQ29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkSG9sZGVyLCBjaGFuZ2VUb2tlbkhvbGRlciwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSAob2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gb2JqZWN0SWQgOiBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9iamVjdCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRDb250ZW50U3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2V0Q29udGVudFN0cmVhbSBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuUEFSQU1fQ0hBTkdFX1RPS0VOKTsKLSAgICAgICAgICAgIEJvb2xlYW4gb3ZlcndyaXRlRmxhZyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX09WRVJXUklURV9GTEFHKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCk7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbkhvbGRlciA9IChjaGFuZ2VUb2tlbiA9PSBudWxsID8gbnVsbCA6IG5ldyBIb2xkZXI8U3RyaW5nPihjaGFuZ2VUb2tlbikpOwotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gY3JlYXRlQ29udGVudFN0cmVhbShyZXF1ZXN0KTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLnNldENvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZEhvbGRlciwgb3ZlcndyaXRlRmxhZywgY2hhbmdlVG9rZW5Ib2xkZXIsIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIG5ld09iamVjdElkID0gKG9iamVjdElkSG9sZGVyLmdldFZhbHVlKCkgPT0gbnVsbCA/IG9iamVjdElkIDogb2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0U2ltcGxlT2JqZWN0KHNlcnZpY2UsIHJlcG9zaXRvcnlJZCwgbmV3T2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHNldFN0YXR1cyhyZXF1ZXN0LCByZXNwb25zZSwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiTG9jYXRpb24iLCBjb21waWxlT2JqZWN0TG9jYXRpb25VcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCkpOwotCi0gICAgICAgICAgICAvLyByZXR1cm4gb2JqZWN0Ci0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChvYmplY3QsIHR5cGVDYWNoZSwgSlNPTkNvbnZlcnRlci5Qcm9wZXJ0eU1vZGUuT0JKRUNULAotICAgICAgICAgICAgICAgICAgICBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICB3cml0ZUpTT04oanNvbk9iamVjdCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYXBwZW5kQ29udGVudFN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGVuZENvbnRlbnRTdHJlYW0gZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzTGFzdENodW5rID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuQ09OVFJPTF9JU19MQVNUX0NIVU5LLCBmYWxzZSk7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhbmdlVG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX0NIQU5HRV9UT0tFTik7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuQ09OVFJPTF9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4ob2JqZWN0SWQpOwotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW5Ib2xkZXIgPSAoY2hhbmdlVG9rZW4gPT0gbnVsbCA/IG51bGwgOiBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pKTsKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGNyZWF0ZUNvbnRlbnRTdHJlYW0ocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5hcHBlbmRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLCBjb250ZW50U3RyZWFtLCBpc0xhc3RDaHVuaywKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSAob2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gb2JqZWN0SWQgOiBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgc2V0U3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlLCBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGNvbXBpbGVPYmplY3RMb2NhdGlvblVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKSk7Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9iamVjdCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtb3ZlT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW92ZU9iamVjdCBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9ICgoQnJvd3NlckNhbGxDb250ZXh0SW1wbCkgY29udGV4dCkuZ2V0T2JqZWN0SWQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXRGb2xkZXJJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9UQVJHRVRfRk9MREVSX0lEKTsKLSAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGb2xkZXJJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9TT1VSQ0VfRk9MREVSX0lEKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmplY3RJZCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5tb3ZlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRIb2xkZXIsIHRhcmdldEZvbGRlcklkLCBzb3VyY2VGb2xkZXJJZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbmV3T2JqZWN0SWQgPSAob2JqZWN0SWRIb2xkZXIuZ2V0VmFsdWUoKSA9PSBudWxsID8gb2JqZWN0SWQgOiBvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBuZXdPYmplY3RJZCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgc2V0U3RhdHVzKHJlcXVlc3QsIHJlc3BvbnNlLCBIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIGNvbXBpbGVPYmplY3RMb2NhdGlvblVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKSk7Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9iamVjdCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL1BPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL1BPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NWEwMzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9QT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5icm93c2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkh0dHBVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlF1ZXJ5U3RyaW5nSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBleHRlbmRzIFF1ZXJ5U3RyaW5nSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1VSTEVOQ09ERUQgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTlRFTlRfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDY0ICogMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUlNFVF9GSUVMRCA9ICJfY2hhcnNldF8iOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZW5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudFR5cGU7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHNpemU7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdHJlYW07Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHJlcXVlc3QpOwotCi0gICAgICAgIGlmIChNdWx0aXBhcnRQYXJzZXIuaXNNdWx0aXBhcnRDb250ZW50KHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICAvLyBtdWx0aXBhcnQgcHJvY2Vzc2luZwotICAgICAgICAgICAgTXVsdGlwYXJ0UGFyc2VyIHBhcnNlciA9IG5ldyBNdWx0aXBhcnRQYXJzZXIocmVxdWVzdCwgc3RyZWFtRmFjdG9yeSk7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UoKTsKLQotICAgICAgICAgICAgaWYgKHBhcnNlci5oYXNDb250ZW50KCkpIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHBhcnNlci5nZXRGaWxlbmFtZSgpOwotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gcGFyc2VyLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IHBhcnNlci5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gcGFyc2VyLmdldFN0cmVhbSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZ1tdPiBlIDogcGFyc2VyLmdldEZpZWxkcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lQ29udHJvbCA9IEh0dHBVdGlscy5nZXRTdHJpbmdQYXJhbWV0ZXIodGhpcywgQ29uc3RhbnRzLkNPTlRST0xfRklMRU5BTUUpOwotICAgICAgICAgICAgaWYgKChmaWxlbmFtZUNvbnRyb2wpICE9IG51bGwgJiYgKGZpbGVuYW1lQ29udHJvbC50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVDb250cm9sOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGVDb250cm9sID0gSHR0cFV0aWxzLmdldFN0cmluZ1BhcmFtZXRlcih0aGlzLCBDb25zdGFudHMuQ09OVFJPTF9DT05URU5UX1RZUEUpOwotICAgICAgICAgICAgaWYgKChjb250ZW50VHlwZUNvbnRyb2wgIT0gbnVsbCkgJiYgKGNvbnRlbnRUeXBlQ29udHJvbC50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVDb250cm9sOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGlzRm9ybVVybGVuY29kZWRDb250ZW50KHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICAvLyBmb3JtIGRhdGEgcHJvY2Vzc2luZwotICAgICAgICAgICAgaWYgKCFwYXJzZUZvcm1VcmxFbmNvZGVkRGF0YShyZXF1ZXN0KSkgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0QWxsKHJlcXVlc3QuZ2V0UGFyYW1ldGVyTWFwKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc3BlYyBpbmNvbXBsaWFudCBmb3JtIGVuY29kaW5nCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmb3JtIGVuY29kaW5nISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRTaXplKCkgewotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyBhIGZvcm0gZGF0YSByZXF1ZXN0Ci0gICAgICogCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0Ci0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGJvZHkgY29udGFpbmVkIGRhdGEsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VGb3JtVXJsRW5jb2RlZERhdGEoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGUgZGF0YVtdID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICBpbnQgZGF0YVBvcyA9IDA7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICBpbnQgYjsKLSAgICAgICAgYnl0ZSBidWZmZXJbXSA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLQotICAgICAgICAvLyByZWFkIHN0cmVhbQotICAgICAgICB3aGlsZSAoKGIgPSBzdHJlYW0ucmVhZChidWZmZXIpKSAhPSAtMSkgewotICAgICAgICAgICAgaWYgKGRhdGFQb3MgKyBiID4gTUFYX0NPTlRFTlRfQllURVMpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTGltaXQgZXhjZWVkZWQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCAtIGRhdGFQb3MgPCBiKSB7Ci0gICAgICAgICAgICAgICAgLy8gZXhwYW5kIGJ1ZmZlcgotICAgICAgICAgICAgICAgIGludCBuZXdTaXplID0gKChkYXRhLmxlbmd0aCArIGIpICogMiA8IE1BWF9DT05URU5UX0JZVEVTID8gKGRhdGEubGVuZ3RoICsgYiAqIDIpIDogTUFYX0NPTlRFTlRfQllURVMpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBuZXdidWYgPSBuZXcgYnl0ZVtuZXdTaXplXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld2J1ZiwgMCwgZGF0YVBvcyk7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG5ld2J1ZjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGRhdGEsIGRhdGFQb3MsIGIpOwotICAgICAgICAgICAgZGF0YVBvcyArPSBiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGFQb3MgPT0gMCkgewotICAgICAgICAgICAgLy8gZW1wdHkgc3RyZWFtCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJzZSBwYXJhbWV0ZXJzCi0gICAgICAgIGJvb2xlYW4gcGFyc2VOYW1lID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiBwYXJzZUNoYXJzZXQgPSBmYWxzZTsKLSAgICAgICAgaW50IHN0YXJ0UG9zID0gMDsKLQotICAgICAgICBMaXN0PFN0cmluZ1tdPiByYXdQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmdbXT4oKTsKLSAgICAgICAgU3RyaW5nIHJhd05hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcmF3VmFsdWUgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFQb3M7IGkrKykgewotICAgICAgICAgICAgc3dpdGNoIChkYXRhW2ldKSB7Ci0gICAgICAgICAgICBjYXNlICc9JzoKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3MgPCBpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhd05hbWUgPSBuZXcgU3RyaW5nKGRhdGEsIHN0YXJ0UG9zLCBpIC0gc3RhcnRQb3MsIElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDSEFSU0VUX0ZJRUxELmVxdWFsc0lnbm9yZUNhc2UocmF3TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlQ2hhcnNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXJzZU5hbWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdGFydFBvcyA9IGkgKyAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlICcmJzoKLSAgICAgICAgICAgICAgICBpZiAocGFyc2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBvcyA8IGkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhd05hbWUgPSBuZXcgU3RyaW5nKGRhdGEsIHN0YXJ0UG9zLCBpIC0gc3RhcnRQb3MsIElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYXdQYXJhbWV0ZXJzLmFkZChuZXcgU3RyaW5nW10geyByYXdOYW1lLCBudWxsIH0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWUgPSBuZXcgU3RyaW5nKGRhdGEsIHN0YXJ0UG9zLCBpIC0gc3RhcnRQb3MsIElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYXdQYXJhbWV0ZXJzLmFkZChuZXcgU3RyaW5nW10geyByYXdOYW1lLCByYXdWYWx1ZSB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUNoYXJzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gcmF3VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByYXdOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICByYXdWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBwYXJzZU5hbWUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHBhcnNlQ2hhcnNldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhcnRQb3MgPCBkYXRhUG9zKSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBhIGZpbmFsIHBhcmFtZXRlciBhZnRlciB0aGUgbGFzdCAnJicKLSAgICAgICAgICAgIGlmIChwYXJzZU5hbWUpIHsKLSAgICAgICAgICAgICAgICByYXdOYW1lID0gbmV3IFN0cmluZyhkYXRhLCBzdGFydFBvcywgZGF0YVBvcyAtIHN0YXJ0UG9zLCBJT1V0aWxzLklTT184ODU5XzEpOwotICAgICAgICAgICAgICAgIHJhd1BhcmFtZXRlcnMuYWRkKG5ldyBTdHJpbmdbXSB7IHJhd05hbWUsIG51bGwgfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyYXdOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWUgPSBuZXcgU3RyaW5nKGRhdGEsIHN0YXJ0UG9zLCBkYXRhUG9zIC0gc3RhcnRQb3MsIElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJhd1BhcmFtZXRlcnMuYWRkKG5ldyBTdHJpbmdbXSB7IHJhd05hbWUsIHJhd1ZhbHVlIH0pOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VDaGFyc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gcmF3VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBhcnNlTmFtZSkgewotICAgICAgICAgICAgLy8gdGhlIHN0cmVhbSBlbmRlZCB3aXRoICc9JwotICAgICAgICAgICAgcmF3UGFyYW1ldGVycy5hZGQobmV3IFN0cmluZ1tdIHsgcmF3TmFtZSwgIiIgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkYXRhID0gbnVsbDsKLQotICAgICAgICAvLyBmaW5kIGNoYXJzZXQKLSAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY2hlY2sgY2hhcnNldCBpbiBjb250ZW50IHR5cGUKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBjb250ZW50VHlwZS5zcGxpdCgiOyIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnQgPSBwYXJ0c1tpXS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKCJjaGFyc2V0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gcGFydC5pbmRleE9mKCc9Jyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gcGFydC5zdWJzdHJpbmcoeCArIDEpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgY2hhcnNldAotICAgICAgICAgICAgY2hhcnNldCA9IElPVXRpbHMuVVRGODsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlY29kZSBwYXJhbWV0ZXJzCi0gICAgICAgIGZvciAoU3RyaW5nW10gcmF3UGFyYW1ldGVyIDogcmF3UGFyYW1ldGVycykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBVUkxEZWNvZGVyLmRlY29kZShyYXdQYXJhbWV0ZXJbMF0sIGNoYXJzZXQpOwotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgaWYgKHJhd1BhcmFtZXRlclsxXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBVUkxEZWNvZGVyLmRlY29kZShyYXdQYXJhbWV0ZXJbMV0sIGNoYXJzZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRQYXJhbWV0ZXIobmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgcmVxdWVzdCBpcyBhIGZvcm0tdXJsZW5jb2RlZCByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0Zvcm1VcmxlbmNvZGVkQ29udGVudChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwgJiYgY29udGVudFR5cGUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLnN0YXJ0c1dpdGgoRk9STV9VUkxFTkNPREVEKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9Qb2xpY3lTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL1BvbGljeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5NmNmYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL1BvbGljeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3NlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX0ZJTFRFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9QT0xJQ1lfSUQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5UeXBlQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTkFycmF5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci0KLS8qKgotICogUG9saWN5IFNlcnZpY2Ugb3BlcmF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFBvbGljeVNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogZ2V0QXBwbGllZFBvbGljaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0QXBwbGllZFBvbGljaWVzIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gcG9saWNpZXMgPSBzZXJ2aWNlLmdldEFwcGxpZWRQb2xpY2llcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSlNPTkFycmF5IGpzb25Qb2xpY2llcyA9IG5ldyBKU09OQXJyYXkoKTsKLSAgICAgICAgICAgIGlmIChwb2xpY2llcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIHBvbGljeSA6IHBvbGljaWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpzb25Qb2xpY2llcy5hZGQoSlNPTkNvbnZlcnRlci5jb252ZXJ0KHBvbGljeSwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUpTT04oanNvblBvbGljaWVzLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhcHBseVBvbGljeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGx5UG9saWN5IGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIHBvbGljeUlkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1BPTElDWV9JRCk7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuQ09OVFJPTF9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmFwcGx5UG9saWN5KHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0U2ltcGxlT2JqZWN0KHNlcnZpY2UsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOwotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJPYmplY3QgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmV0dXJuIG9iamVjdAotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotCi0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydChvYmplY3QsIHR5cGVDYWNoZSwgSlNPTkNvbnZlcnRlci5Qcm9wZXJ0eU1vZGUuT0JKRUNULAotICAgICAgICAgICAgICAgICAgICBzdWNjaW5jdCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICB3cml0ZUpTT04oanNvbk9iamVjdCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlUG9saWN5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVtb3ZlUG9saWN5IGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIHBvbGljeUlkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1BPTElDWV9JRCk7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2NpbmN0ID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBDb25zdGFudHMuQ09OVFJPTF9TVUNDSU5DVCwgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgc2VydmljZS5yZW1vdmVQb2xpY3kocmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIG51bGwpOwotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldFNpbXBsZU9iamVjdChzZXJ2aWNlLCByZXBvc2l0b3J5SWQsIG9iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiT2JqZWN0IGlzIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJldHVybiBvYmplY3QKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLQotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQob2JqZWN0LCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLk9CSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvUmVsYXRpb25zaGlwU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9SZWxhdGlvbnNoaXBTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTk4NTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9SZWxhdGlvbnNoaXBTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3NlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX0FMTE9XQUJMRV9BQ1RJT05TOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9SRUxBVElPTlNISVBfRElSRUNUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1JFTkRJVElPTl9GSUxURVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fU0tJUF9DT1VOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9TVUJfUkVMQVRJT05TSElQX1RZUEVTOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5KU09OQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5UeXBlQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcFNlcnZpY2UgewotCi0gICAgLyoqCi0gICAgICogZ2V0T2JqZWN0UmVsYXRpb25zaGlwcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldE9iamVjdFJlbGF0aW9uc2hpcHMgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fU1VCX1JFTEFUSU9OU0hJUF9UWVBFUyk7Ci0gICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uID0gZ2V0RW51bVBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9SRUxBVElPTlNISVBfRElSRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uY2xhc3MpOwotICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9UWVBFX0lEKTsKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fUkVORElUSU9OX0ZJTFRFUik7Ci0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9BTExPV0FCTEVfQUNUSU9OUyk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9NQVhfSVRFTVMpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1NLSVBfQ09VTlQpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdExpc3QgcmVsYXRpb25zaGlwcyA9IHNlcnZpY2UuZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgdHlwZUlkLCByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBtYXhJdGVtcywgc2tpcENvdW50LCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXBzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlJlbGF0aW9uc2hpcHMgYXJlIG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVDYWNoZSB0eXBlQ2FjaGUgPSBuZXcgU2VydmVyVHlwZUNhY2hlSW1wbChyZXBvc2l0b3J5SWQsIHNlcnZpY2UpOwotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uQ2hpbGRyZW4gPSBKU09OQ29udmVydGVyLmNvbnZlcnQocmVsYXRpb25zaGlwcywgdHlwZUNhY2hlLAotICAgICAgICAgICAgICAgICAgICBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uQ2hpbGRyZW4sIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvUmVwb3NpdG9yeVNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvUmVwb3NpdG9yeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiOTY1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL1JlcG9zaXRvcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5DT05UUk9MX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuQ09OVFJPTF9UWVBFX0lEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX0RFUFRIOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX01BWF9JVEVNUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9QUk9QRVJUWV9ERUZJTklUSU9OUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9TS0lQX0NPVU5UOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1RPS0VOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1RZUEVfSUQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkRhdGVUaW1lRm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSlNPTkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OQXJyYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OVmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyLkpTT05QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBTZXJ2aWNlIG9wZXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBnZXRSZXBvc2l0b3JpZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRSZXBvc2l0b3JpZXMgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gaW5mb0RhdGFMaXN0ID0gc2VydmljZS5nZXRSZXBvc2l0b3J5SW5mb3MobnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgICAgICBmb3IgKFJlcG9zaXRvcnlJbmZvIHJpIDogaW5mb0RhdGFMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlVcmwgPSBjb21waWxlUmVwb3NpdG9yeVVybChyZXF1ZXN0LCByaS5nZXRJZCgpKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIFN0cmluZyByb290VXJsID0gY29tcGlsZVJvb3RVcmwocmVxdWVzdCwgcmkuZ2V0SWQoKSkudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQocmkuZ2V0SWQoKSwgSlNPTkNvbnZlcnRlci5jb252ZXJ0KHJpLCByZXBvc2l0b3J5VXJsLCByb290VXJsLCB0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihyZXN1bHQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldFJlcG9zaXRvcnlJbmZvLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2V0UmVwb3NpdG9yeUluZm8gZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUmVwb3NpdG9yeUluZm8gcmkgPSBzZXJ2aWNlLmdldFJlcG9zaXRvcnlJbmZvKHJlcG9zaXRvcnlJZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeVVybCA9IGNvbXBpbGVSZXBvc2l0b3J5VXJsKHJlcXVlc3QsIHJpLmdldElkKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcm9vdFVybCA9IGNvbXBpbGVSb290VXJsKHJlcXVlc3QsIHJpLmdldElkKCkpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQocmkuZ2V0SWQoKSwgSlNPTkNvbnZlcnRlci5jb252ZXJ0KHJpLCByZXBvc2l0b3J5VXJsLCByb290VXJsLCB0cnVlKSk7Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlSlNPTihyZXN1bHQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldExhc3RSZXN1bHQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRMYXN0UmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fVE9LRU4pOwotICAgICAgICAgICAgU3RyaW5nIGNvb2tpZU5hbWUgPSBnZXRDb29raWVOYW1lKHRva2VuKTsKLSAgICAgICAgICAgIFN0cmluZyBjb29raWVWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldENvb2tpZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDb29raWUgY29va2llIDogcmVxdWVzdC5nZXRDb29raWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZU5hbWUuZXF1YWxzKGNvb2tpZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb29raWVWYWx1ZSA9IElPVXRpbHMuZGVjb2RlVVJMKGNvb2tpZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChjb29raWVWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvb2tpZVZhbHVlID0gY3JlYXRlQ29va2llVmFsdWUoMCwgbnVsbCwgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5FWENFUFRJT05fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biB0cmFuc2FjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBKU09OVmFsdWUucGFyc2UoY29va2llVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBwZSkgewotICAgICAgICAgICAgICAgIGNvb2tpZVZhbHVlID0gY3JlYXRlQ29va2llVmFsdWUoMCwgbnVsbCwgQ21pc1J1bnRpbWVFeGNlcHRpb24uRVhDRVBUSU9OX05BTUUsICJDb29raWUgcGFzcmluZyBlcnJvciEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVsZXRlQ29va2llKHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQsIHRva2VuKTsKLQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgd3JpdGVKU09OKChKU09OT2JqZWN0KSBKU09OVmFsdWUucGFyc2UoY29va2llVmFsdWUpLCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRUeXBlQ2hpbGRyZW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRUeXBlQ2hpbGRyZW4gZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1RZUEVfSUQpOwotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fUFJPUEVSVFlfREVGSU5JVElPTlMsIGZhbHNlKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX01BWF9JVEVNUyk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIHNraXBDb3VudCA9IGdldEJpZ0ludGVnZXJQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fU0tJUF9DT1VOVCk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdCB0eXBlTGlzdCA9IHNlcnZpY2UuZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25UeXBlTGlzdCA9IEpTT05Db252ZXJ0ZXIuY29udmVydCh0eXBlTGlzdCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUpTT04oanNvblR5cGVMaXN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldFR5cGVEZXNjZW5kYW50cyBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyB0eXBlSWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fVFlQRV9JRCk7Ci0gICAgICAgICAgICBCaWdJbnRlZ2VyIGRlcHRoID0gZ2V0QmlnSW50ZWdlclBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9ERVBUSCk7Ci0gICAgICAgICAgICBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID0gZ2V0Qm9vbGVhblBhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9QUk9QRVJUWV9ERUZJTklUSU9OUywgZmFsc2UpOwotICAgICAgICAgICAgRGF0ZVRpbWVGb3JtYXQgZGF0ZVRpbWVGb3JtYXQgPSBnZXREYXRlVGltZUZvcm1hdFBhcmFtZXRlcihyZXF1ZXN0KTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlVHJlZSA9IHNlcnZpY2UuZ2V0VHlwZURlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGVUcmVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlR5cGUgdHJlZSBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBKU09OQXJyYXkganNvblR5cGVUcmVlID0gbmV3IEpTT05BcnJheSgpOwotICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBjb250YWluZXIgOiB0eXBlVHJlZSkgewotICAgICAgICAgICAgICAgIGpzb25UeXBlVHJlZS5hZGQoSlNPTkNvbnZlcnRlci5jb252ZXJ0KGNvbnRhaW5lciwgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25UeXBlVHJlZSwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0VHlwZURlZmluaXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZXRUeXBlRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0QnJvd3NlclNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBhc3NlcnQgY29udGV4dCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHNlcnZpY2UgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXBvc2l0b3J5SWQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXF1ZXN0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVzcG9uc2UgIT0gbnVsbDsKLQotICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFN0cmluZyB0eXBlSWQgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fVFlQRV9JRCk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSBzZXJ2aWNlLmdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEpTT05PYmplY3QganNvblR5cGUgPSBKU09OQ29udmVydGVyLmNvbnZlcnQodHlwZSwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUpTT04oanNvblR5cGUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZVR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDcmVhdGVUeXBlIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIHR5cGVTdHIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ09OVFJPTF9UWVBFKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlU3RyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBkZWZpbml0aW9uIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbnZlcnQgdHlwZSBkZWZpbml0aW9uCi0gICAgICAgICAgICBKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7Ci0gICAgICAgICAgICBPYmplY3QgdHlwZUpzb24gPSBwYXJzZXIucGFyc2UodHlwZVN0cik7Ci0gICAgICAgICAgICBpZiAoISh0eXBlSnNvbiBpbnN0YW5jZW9mIE1hcCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIGRlZmluaXRpb24hIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZUluID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0VHlwZURlZmluaXRpb24oKE1hcDxTdHJpbmcsIE9iamVjdD4pIHR5cGVKc29uKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlT3V0ID0gc2VydmljZS5jcmVhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUluLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEpTT05PYmplY3QganNvblR5cGUgPSBKU09OQ29udmVydGVyLmNvbnZlcnQodHlwZU91dCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICAvLyBzZXQgaGVhZGVycwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxvY2F0aW9uIiwgY29tcGlsZVR5cGVMb2NhdGlvblVybChyZXF1ZXN0LCByZXBvc2l0b3J5SWQsIHR5cGVPdXQuZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICB3cml0ZUpTT04oanNvblR5cGUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHVwZGF0ZVR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBVcGRhdGVUeXBlIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIHR5cGVTdHIgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgQ09OVFJPTF9UWVBFKTsKLSAgICAgICAgICAgIERhdGVUaW1lRm9ybWF0IGRhdGVUaW1lRm9ybWF0ID0gZ2V0RGF0ZVRpbWVGb3JtYXRQYXJhbWV0ZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIGlmICh0eXBlU3RyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBkZWZpbml0aW9uIG1pc3NpbmchIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvbnZlcnQgdHlwZSBkZWZpbml0aW9uCi0gICAgICAgICAgICBKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7Ci0gICAgICAgICAgICBPYmplY3QgdHlwZUpzb24gPSBwYXJzZXIucGFyc2UodHlwZVN0cik7Ci0gICAgICAgICAgICBpZiAoISh0eXBlSnNvbiBpbnN0YW5jZW9mIE1hcCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIGRlZmluaXRpb24hIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZUluID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0VHlwZURlZmluaXRpb24oKE1hcDxTdHJpbmcsIE9iamVjdD4pIHR5cGVKc29uKTsKLQotICAgICAgICAgICAgLy8gZXhlY3V0ZQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlT3V0ID0gc2VydmljZS51cGRhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUluLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEpTT05PYmplY3QganNvblR5cGUgPSBKU09OQ29udmVydGVyLmNvbnZlcnQodHlwZU91dCwgZGF0ZVRpbWVGb3JtYXQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUpTT04oanNvblR5cGUsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGRlbGV0ZVR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWxldGVUeXBlIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBDT05UUk9MX1RZUEVfSUQpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVJZCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgICAgICB3cml0ZUVtcHR5KHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvU2VydmVyVHlwZUNhY2hlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9TZXJ2ZXJUeXBlQ2FjaGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2Q0YmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci9TZXJ2ZXJUeXBlQ2FjaGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuVHlwZUNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotCi0vKioKLSAqIFRlbXBvcmFyeSB0eXBlIGNhY2hlIHVzZWQgZm9yIG9uZSBjYWxsLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyVHlwZUNhY2hlSW1wbCBpbXBsZW1lbnRzIFR5cGVDYWNoZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXBvc2l0b3J5SWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbWlzU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVHlwZURlZmluaXRpb24+IHR5cGVEZWZpbml0aW9uczsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGVEZWZpbml0aW9uPiBvYmplY3RUb1R5cGVEZWZpbml0aW9uczsKLQotICAgIHB1YmxpYyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKFN0cmluZyByZXBvc2l0b3J5SWQsIENtaXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5yZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5SWQ7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIHR5cGVEZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHlwZURlZmluaXRpb24+KCk7Ci0gICAgICAgIG9iamVjdFRvVHlwZURlZmluaXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUeXBlRGVmaW5pdGlvbj4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gdHlwZURlZmluaXRpb25zLmdldCh0eXBlSWQpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gc2VydmljZS5nZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHlwZURlZmluaXRpb25zLnB1dCh0eXBlLmdldElkKCksIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIHJlbG9hZFR5cGVEZWZpbml0aW9uKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHNlcnZpY2UuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIG51bGwpOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlRGVmaW5pdGlvbnMucHV0KHR5cGUuZ2V0SWQoKSwgdHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb25Gb3JPYmplY3QoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSBvYmplY3RUb1R5cGVEZWZpbml0aW9ucy5nZXQob2JqZWN0SWQpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3REYXRhIG9iaiA9IHNlcnZpY2UuZ2V0T2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsCi0gICAgICAgICAgICAgICAgICAgICJjbWlzOm9iamVjdElkLGNtaXM6b2JqZWN0VHlwZUlkLGNtaXM6YmFzZVR5cGVJZCxjbWlzOnNlY29uZGFyeU9iamVjdFR5cGVJZHMiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgImNtaXM6bm9uZSIsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCAmJiBvYmouZ2V0UHJvcGVydGllcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gdHlwZVByb3AgPSBvYmouZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlUHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5SWQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9ICgoUHJvcGVydHlJZCkgdHlwZVByb3ApLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0VHlwZURlZmluaXRpb24odHlwZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBzZWNUeXBlUHJvcCA9IG9iai5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMpOwotICAgICAgICAgICAgICAgIGlmICgoc2VjVHlwZVByb3AgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkKSAmJiAoc2VjVHlwZVByb3AuZ2V0VmFsdWVzKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc2VjVHlwZUlkIDogKChQcm9wZXJ0eUlkKSBzZWNUeXBlUHJvcCkuZ2V0VmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNUeXBlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVEZWZpbml0aW9uKHNlY1R5cGVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9iamVjdFRvVHlwZURlZmluaXRpb25zLnB1dChvYmplY3RJZCwgdHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlEZWZpbml0aW9uPD8+IGdldFByb3BlcnR5RGVmaW5pdGlvbihTdHJpbmcgcHJvcElkKSB7Ci0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZURlZiA6IHR5cGVEZWZpbml0aW9ucy52YWx1ZXMoKSkgewotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgPSB0eXBlRGVmLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcElkKTsKLSAgICAgICAgICAgIGlmIChwcm9wRGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvcERlZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvVmVyc2lvbmluZ1NlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvVmVyc2lvbmluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3NTE0MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL1ZlcnNpb25pbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9BTExPV0FCTEVfQUNUSU9OUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50cy5QQVJBTV9DSEVDS0lOX0NPTU1FTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHMuUEFSQU1fRklMVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX01BSk9SOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29uc3RhbnRzLlBBUkFNX1RPS0VOOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGF0ZVRpbWVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkpTT05Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlR5cGVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OQXJyYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24uSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci0KLS8qKgotICogVmVyc2lvbmluZyBTZXJ2aWNlIG9wZXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uaW5nU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBjaGVja091dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrT3V0IGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1RPS0VOKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoZWNrT3V0SWQgPSBuZXcgSG9sZGVyPFN0cmluZz4ob2JqZWN0SWQpOwotICAgICAgICAgICAgc2VydmljZS5jaGVja091dChyZXBvc2l0b3J5SWQsIGNoZWNrT3V0SWQsIG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3QgPSBnZXRTaW1wbGVPYmplY3Qoc2VydmljZSwgcmVwb3NpdG9yeUlkLCBjaGVja091dElkLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJQV0MgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmV0dXJuIG9iamVjdAotICAgICAgICAgICAgVHlwZUNhY2hlIHR5cGVDYWNoZSA9IG5ldyBTZXJ2ZXJUeXBlQ2FjaGVJbXBsKHJlcG9zaXRvcnlJZCwgc2VydmljZSk7Ci0gICAgICAgICAgICBKU09OT2JqZWN0IGpzb25PYmplY3QgPSBKU09OQ29udmVydGVyLmNvbnZlcnQob2JqZWN0LCB0eXBlQ2FjaGUsIEpTT05Db252ZXJ0ZXIuUHJvcGVydHlNb2RlLk9CSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgc3VjY2luY3QsIGRhdGVUaW1lRm9ybWF0KTsKLQotICAgICAgICAgICAgLy8gc2V0IGhlYWRlcnMKLSAgICAgICAgICAgIHNldFN0YXR1cyhyZXF1ZXN0LCByZXNwb25zZSwgSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiTG9jYXRpb24iLCBjb21waWxlT2JqZWN0TG9jYXRpb25VcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkLCBvYmplY3QuZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICBzZXRDb29raWUocmVxdWVzdCwgcmVzcG9uc2UsIHJlcG9zaXRvcnlJZCwgdG9rZW4sCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvb2tpZVZhbHVlKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCwgb2JqZWN0LmdldElkKCksIG51bGwsIG51bGwpKTsKLQotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25PYmplY3QsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrT3V0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FuY2VsQ2hlY2tPdXQgZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWN1dGUKLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5jYW5jZWxDaGVja091dChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKLSAgICAgICAgICAgIHdyaXRlRW1wdHkocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2hlY2tJbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrSW4gZXh0ZW5kcyBBYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbCB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgYXNzZXJ0IGNvbnRleHQgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCBzZXJ2aWNlICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVwb3NpdG9yeUlkICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGdldCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSAoKEJyb3dzZXJDYWxsQ29udGV4dEltcGwpIGNvbnRleHQpLmdldE9iamVjdElkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRUeXBlSWQoKTsKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX01BSk9SKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGVja2luQ29tbWVudCA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9DSEVDS0lOX0NPTU1FTlQpOwotICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIFBBUkFNX1RPS0VOKTsKLSAgICAgICAgICAgIGJvb2xlYW4gc3VjY2luY3QgPSBnZXRCb29sZWFuUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5DT05UUk9MX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBDb250cm9sUGFyc2VyIGNwID0gbmV3IENvbnRyb2xQYXJzZXIocmVxdWVzdCk7Ci0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KG9iamVjdElkKTsKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGNyZWF0ZUNvbnRlbnRTdHJlYW0ocmVxdWVzdCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5jaGVja0luKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRIb2xkZXIsIG1ham9yLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVVcGRhdGVQcm9wZXJ0aWVzKGNwLCB0eXBlSWQsIG51bGwsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JqZWN0SWQpLCB0eXBlQ2FjaGUpLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLCBjaGVja2luQ29tbWVudCwgY3JlYXRlUG9saWNpZXMoY3ApLCBjcmVhdGVBZGRBY2woY3ApLCBjcmVhdGVSZW1vdmVBY2woY3ApLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuZXdPYmplY3RJZCA9IChvYmplY3RJZEhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBvYmplY3RJZCA6IG9iamVjdElkSG9sZGVyLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldFNpbXBsZU9iamVjdChzZXJ2aWNlLCByZXBvc2l0b3J5SWQsIG5ld09iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTmV3IHZlcnNpb24gaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmV0dXJuIG9iamVjdAotICAgICAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqZWN0ID0gSlNPTkNvbnZlcnRlci5jb252ZXJ0KG9iamVjdCwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsCi0gICAgICAgICAgICAgICAgICAgIHN1Y2NpbmN0LCBkYXRlVGltZUZvcm1hdCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCBoZWFkZXJzCi0gICAgICAgICAgICBzZXRTdGF0dXMocmVxdWVzdCwgcmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRCk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxvY2F0aW9uIiwgY29tcGlsZU9iamVjdExvY2F0aW9uVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCwgb2JqZWN0LmdldElkKCkpKTsKLQotICAgICAgICAgICAgc2V0Q29va2llKHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQsIHRva2VuLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVDb29raWVWYWx1ZShIdHRwU2VydmxldFJlc3BvbnNlLlNDX0NSRUFURUQsIG9iamVjdC5nZXRJZCgpLCBudWxsLCBudWxsKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlSlNPTihqc29uT2JqZWN0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBbGxWZXJzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdldEFsbFZlcnNpb25zIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGFzc2VydCBjb250ZXh0ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgc2VydmljZSAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcG9zaXRvcnlJZCAhPSBudWxsOwotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydCByZXNwb25zZSAhPSBudWxsOwotCi0gICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVycwotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKChCcm93c2VyQ2FsbENvbnRleHRJbXBsKSBjb250ZXh0KS5nZXRPYmplY3RJZCgpOwotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciA9IGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBQQVJBTV9GSUxURVIpOwotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgUEFSQU1fQUxMT1dBQkxFX0FDVElPTlMpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjaW5jdCA9IGdldEJvb2xlYW5QYXJhbWV0ZXIocmVxdWVzdCwgQ29uc3RhbnRzLlBBUkFNX1NVQ0NJTkNULCBmYWxzZSk7Ci0gICAgICAgICAgICBEYXRlVGltZUZvcm1hdCBkYXRlVGltZUZvcm1hdCA9IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKHJlcXVlc3QpOwotCi0gICAgICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gdmVyc2lvbnMgPSBzZXJ2aWNlLmdldEFsbFZlcnNpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG51bGwsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZlcnNpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlZlcnNpb25zIGFyZSBudWxsISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlQ2FjaGUgdHlwZUNhY2hlID0gbmV3IFNlcnZlclR5cGVDYWNoZUltcGwocmVwb3NpdG9yeUlkLCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIEpTT05BcnJheSBqc29uVmVyc2lvbnMgPSBuZXcgSlNPTkFycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgdmVyc2lvbiA6IHZlcnNpb25zKSB7Ci0gICAgICAgICAgICAgICAganNvblZlcnNpb25zLmFkZChKU09OQ29udmVydGVyLmNvbnZlcnQodmVyc2lvbiwgdHlwZUNhY2hlLCBKU09OQ29udmVydGVyLlByb3BlcnR5TW9kZS5PQkpFQ1QsIHN1Y2NpbmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVRpbWVGb3JtYXQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICAgICAgd3JpdGVKU09OKGpzb25WZXJzaW9ucywgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci90b2tlbi9BYnN0cmFjdFNpbXBsZVRva2VuSGFuZGxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci90b2tlbi9BYnN0cmFjdFNpbXBsZVRva2VuSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDRkYzhlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvdG9rZW4vQWJzdHJhY3RTaW1wbGVUb2tlbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3Nlci50b2tlbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05BcnJheTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuanNvbi5KU09OT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLkpTT05TdHJlYW1Bd2FyZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuQ21pc1JlcG9zaXRvcnlDb250ZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3Nlci5BYnN0cmFjdEJyb3dzZXJTZXJ2aWNlQ2FsbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2ltcGxlVG9rZW5IYW5kbGVyIGltcGxlbWVudHMgVG9rZW5IYW5kbGVyLCBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvLyByZXR1cm4gMTAgdG9rZW5zIHBlciBiYXRjaAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUT0tFTl9CQVRDSF9TSVpFID0gMTA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QUkVGSVggPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUEFUSCA9ICIvV0VCLUlORi90b2tlbi8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUID0gImNtaXMuanMuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0lGUkFNRSA9ICJyZXBvc2l0b3J5LmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9MT0dJTiA9ICJsb2dpbi5qc3AiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0xPR0lOID0gImxvZ2luIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dJTl9TQ1JJUFQgPSAic2NyaXB0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HSU5fQ09OVFJPTExFUiA9ICJjb250cm9sbGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HSU5fTE9HSU4gPSAibG9naW4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dJTl9MT0dPVVQgPSAibG9nb3V0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HSU5fVE9LRU4gPSAidG9rZW4iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJsU2VydmljZUNhbGwgVVJMX1NFUlZJQ0VfQ0FMTCA9IG5ldyBVcmxTZXJ2aWNlQ2FsbCgpOwotCi0gICAgcHVibGljIHZvaWQgc2VydmljZShTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLQotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gbnVsbDsgLy8gVE9ETzogZGV0ZXJtaW5lIHJlcG9zaXRvcnkgaWQKLSAgICAgICAgU3RyaW5nIGxvZ2luID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoUEFSQU1fTE9HSU4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKExPR0lOX1RPS0VOLmVxdWFscyhsb2dpbikpIHsKLSAgICAgICAgICAgICAgICBzZW5kVG9rZW5zKHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKExPR0lOX1NDUklQVC5lcXVhbHMobG9naW4pKSB7Ci0gICAgICAgICAgICAgICAgc2VuZEphdmFTY3JpcHQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChMT0dJTl9DT05UUk9MTEVSLmVxdWFscyhsb2dpbikpIHsKLSAgICAgICAgICAgICAgICBzZW5kQ29udHJvbGxlckNvbnRlbnQoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChMT0dJTl9MT0dJTi5lcXVhbHMobG9naW4pKSB7Ci0gICAgICAgICAgICAgICAgbG9naW4oc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChMT0dJTl9MT0dPVVQuZXF1YWxzKGxvZ2luKSkgewotICAgICAgICAgICAgICAgIGxvZ291dChzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIENtaXNCYXNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKENtaXNCYXNlRXhjZXB0aW9uKSBlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yISIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBiYXRjaCBvZiBuZXcgdG9rZW5zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRUb2tlbnMoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSlNPTkFycmF5IHJlc3VsdCA9IG5ldyBKU09OQXJyYXkoKTsKLQotICAgICAgICBpZiAoIVNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuY2hlY2tBcHBsaWNhdGlvbktleShyZXF1ZXN0KSkgewotICAgICAgICAgICAgLy8gUEFSQU5PSUE6IHJlbW92ZSB0aGUgYXBwbGljYXRpb24ga2V5IGlmIHRoZSBwcmVzZW50ZWQga2V5IGlzCi0gICAgICAgICAgICAvLyB3cm9uZywgZG9uJ3QgYWxsb3cgYSBzZWNvbmQgYXR0ZW1wdAotICAgICAgICAgICAgU3RyaW5nIGFwcElkID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZXRBcHBsaWNhdGlvbklkRnJvbUtleShTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRLZXkocmVxdWVzdCkpOwotICAgICAgICAgICAgaWYgKGFwcElkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLnJlbW92ZUFwcGxpY2F0aW9uS2V5KHJlcXVlc3QsIGFwcElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGdlbmVyYXRlIGEgYmF0Y2ggb2YgdG9rZW5zCi0gICAgICAgICAgICBTdHJpbmcgYXBwSWQgPSBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLmdldEFwcGxpY2F0aW9uSWRGcm9tS2V5KFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldEtleShyZXF1ZXN0KSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVE9LRU5fQkFUQ0hfU0laRTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRva2VuCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZW5lcmF0ZUtleShhcHBJZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBwdXQgdG9rZW4gaW50byBzZXNzaW9uIGFuZCBpdCB0byB0aGUgcmVzcG9uc2UKLSAgICAgICAgICAgICAgICBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLmFkZFRva2VuKHJlcXVlc3QsIHRva2VuKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaW50SlNPTihyZXNwb25zZSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyB0aGUgSmF2YVNjcmlwdCBmaWxlIGZvciB3ZWIgY2xpZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZW5kSmF2YVNjcmlwdChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFVybEJ1aWxkZXIgYmFzZVVybCA9IFVSTF9TRVJWSUNFX0NBTEwuY29tcGlsZUJhc2VVcmwocmVxdWVzdCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoYmFzZVVybC50b1N0cmluZygpKTsKLQotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSX1BSRUZJWCArICJkb21haW4iLCBlbmNvZGVKYXZhU2NyaXB0U3RyaW5nKHVybC5nZXRQcm90b2NvbCgpICsgIjovLyIgKyB1cmwuZ2V0SG9zdCgpCi0gICAgICAgICAgICAgICAgKyAodXJsLmdldFBvcnQoKSA+IC0xID8gIjoiICsgdXJsLmdldFBvcnQoKSA6ICIiKSkpOwotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSX1BSRUZJWCArICJzZXJ2aWNlVXJsIiwgZW5jb2RlSmF2YVNjcmlwdFN0cmluZyhiYXNlVXJsLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQVRUUl9QUkVGSVggKyAiaWZyYW1lVXJsIiwKLSAgICAgICAgICAgICAgICBlbmNvZGVKYXZhU2NyaXB0U3RyaW5nKGJhc2VVcmwuYWRkUGFyYW1ldGVyKFBBUkFNX0xPR0lOLCBMT0dJTl9DT05UUk9MTEVSKS50b1N0cmluZygpKSk7Ci0KLSAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiKTsKLQotICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gc2VydmxldENvbnRleHQuZ2V0UmVxdWVzdERpc3BhdGNoZXIoSlNQX1BBVEggKyBKU1BfU0NSSVBUKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRpc3BhdGNoZXIuaW5jbHVkZShyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yISIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgdGhlIElGcmFtZSBjb250ZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNlbmRDb250cm9sbGVyQ29udGVudChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiKTsKLQotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBBVFRSX1BSRUZJWCArICJsb2dpblVybCIsCi0gICAgICAgICAgICAgICAgZW5jb2RlSmF2YVNjcmlwdFN0cmluZyhVUkxfU0VSVklDRV9DQUxMLmNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoUEFSQU1fTE9HSU4sICIiKS50b1N0cmluZygpKSk7Ci0KLSAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IHNlcnZsZXRDb250ZXh0LmdldFJlcXVlc3REaXNwYXRjaGVyKEpTUF9QQVRIICsgSlNQX0lGUkFNRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkaXNwYXRjaGVyLmluY2x1ZGUocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgbG9naW5zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvZ2luKFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgiR0VUIi5lcXVhbHMocmVxdWVzdC5nZXRNZXRob2QoKSkpIHsKLSAgICAgICAgICAgIHNob3dMb2dpbkZvcm0oc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmICgiUE9TVCIuZXF1YWxzKHJlcXVlc3QuZ2V0TWV0aG9kKCkpKSB7Ci0gICAgICAgICAgICBhdXRoZW50aWNhdGUoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCByZXBvc2l0b3J5SWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd0xvZ2luRm9ybShTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBmb3JtS2V5ID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZXRLZXkocmVxdWVzdCk7Ci0gICAgICAgIFN0cmluZyBhcHBJZCA9IFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuZ2V0QXBwbGljYXRpb25JZEZyb21LZXkoZm9ybUtleSk7Ci0gICAgICAgIFVSTCBhcHBVcmwgPSBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLmdldEFwcGxpY2F0aW9uVVJMKHJlcXVlc3QsIGFwcElkKTsKLQotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShBVFRSX1BSRUZJWCArICJmb3Jta2V5IiwgZm9ybUtleSk7Ci0gICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKEFUVFJfUFJFRklYICsgImVycm9yIiwgZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQVRUUl9QUkVGSVggKyAiYXBwdXJsIiwgZW5jb2RlSFRNTFN0cmluZyhhcHBVcmwudG9TdHJpbmcoKSkpOwotCi0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiKTsKLQotICAgICAgICBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gc2VydmxldENvbnRleHQuZ2V0UmVxdWVzdERpc3BhdGNoZXIoSlNQX1BBVEggKyBKU1BfTE9HSU4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGlzcGF0Y2hlci5pbmNsdWRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IhIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhdXRoZW50aWNhdGUoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuY2hlY2tGb3JtS2V5KHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICAvLyBsb2dpbiBmb3JtIHJldHVybnMKLQotICAgICAgICAgICAgU3RyaW5nIHRydXN0YXBwID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5QQVJBTV9UUlVTVEFQUCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlciA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuUEFSQU1fVVNFUik7Ci0gICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLlBBUkFNX1BBU1NXT1JEKTsKLQotICAgICAgICAgICAgaWYgKCEiMSIuZXF1YWxzKHRydXN0YXBwKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICJQbGVhc2UgY29uZmlybSB0aGF0IHlvdSB0cnVzdCB0aGUgYXBwbGljYXRpb24hIjsKLSAgICAgICAgICAgICAgICBzaG93TG9naW5Gb3JtKHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSwgZXJyb3IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFhdXRoZW50aWNhdGUoc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCB1c2VyLCBwYXNzd29yZCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSAiSW52YWxpZCBjcmVkZW50aWFscyEiOwotICAgICAgICAgICAgICAgIHNob3dMb2dpbkZvcm0oc2VydmxldENvbnRleHQsIHJlcXVlc3QsIHJlc3BvbnNlLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzdWNjZXNzZnVsIC0+IGNyZWF0ZSBhcHBsaWNhdGlvbiBrZXkgYW5kCi0gICAgICAgICAgICAvLyBmb3J3YXJkIHRvIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBTdHJpbmcgYXBwSWQgPSBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLmdldEFwcGxpY2F0aW9uSWRGcm9tS2V5KFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldEtleShyZXF1ZXN0KSk7Ci0gICAgICAgICAgICBTdHJpbmcgYXBwS2V5ID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZW5lcmF0ZUtleShhcHBJZCk7Ci0gICAgICAgICAgICBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLnNldEFwcGxpY2F0aW9uS2V5KHJlcXVlc3QsIGFwcEtleSk7Ci0gICAgICAgICAgICBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLnNldFVzZXIocmVxdWVzdCwgYXBwSWQsIHVzZXIpOwotICAgICAgICAgICAgU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5yZW1vdmVGb3JtS2V5KHJlcXVlc3QsIGFwcElkKTsKLQotICAgICAgICAgICAgVVJMIGFwcFVSTCA9IFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuZ2V0QXBwbGljYXRpb25VUkwocmVxdWVzdCwgYXBwSWQpOwotCi0gICAgICAgICAgICByZXNwb25zZS5zZW5kUmVkaXJlY3QocmVzcG9uc2UuZW5jb2RlUmVkaXJlY3RVUkwoYXBwVVJMLnRvU3RyaW5nKCkpKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgVVJMCi0gICAgICAgIFN0cmluZyB1cmwgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLlBBUkFNX1VSTCk7Ci0KLSAgICAgICAgaWYgKHVybCA9PSBudWxsIHx8IHVybC50cmltKCkubGVuZ3RoKCkgPCA4IHx8ICF1cmwudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLnN0YXJ0c1dpdGgoImh0dHAiKSkgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVVJMIGFwcFVSTCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhcHBVUkwgPSBuZXcgVVJMKHVybCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBsb2dpbiBrZXkKLSAgICAgICAgU3RyaW5nIGxvZ2luS2V5ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5QQVJBTV9LRVkpOwotCi0gICAgICAgIGlmIChsb2dpbktleSA9PSBudWxsIHx8IGxvZ2luS2V5LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBubyBsb2dpbiBrZXkgc2V0IC0+IGdlbmVyYXRlIG9uZSBhbmQgcmV0dXJuIGl0Ci0KLSAgICAgICAgICAgIFN0cmluZyBhcHBJZCA9IFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuZ2VuZXJhdGVBcHBJZCgpOwotICAgICAgICAgICAgbG9naW5LZXkgPSBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLmdlbmVyYXRlS2V5KGFwcElkKTsKLSAgICAgICAgICAgIFN0cmluZyBmb3JtS2V5ID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZW5lcmF0ZUtleShhcHBJZCk7Ci0KLSAgICAgICAgICAgIFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuc2V0TG9naW5LZXkocmVxdWVzdCwgbG9naW5LZXksIGZvcm1LZXksIGFwcFVSTCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBmb3JtVVJMID0gZW5jb2RlSmF2YVNjcmlwdFN0cmluZyhVUkxfU0VSVklDRV9DQUxMLmNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlcG9zaXRvcnlJZCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFBhcmFtZXRlcihQQVJBTV9MT0dJTiwgTE9HSU5fTE9HSU4pCi0gICAgICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5QQVJBTV9LRVksIGZvcm1LZXkpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgICAgICByZXN1bHQucHV0KCJvayIsIDApOwotICAgICAgICAgICAgcmVzdWx0LnB1dCgia2V5IiwgbG9naW5LZXkpOwotICAgICAgICAgICAgcmVzdWx0LnB1dCgidXJsIiwgZm9ybVVSTCk7Ci0KLSAgICAgICAgICAgIHByaW50SlNPTihyZXNwb25zZSwgcmVzdWx0KTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFwcElkID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZXRBcHBsaWNhdGlvbklkRnJvbUtleShTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyCi0gICAgICAgICAgICAgICAgLmdldEtleShyZXF1ZXN0KSk7Ci0gICAgICAgIFN0cmluZyBhcHBLZXkgPSBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLmdldEFwcGxpY2F0aW9uS2V5KHJlcXVlc3QsIGFwcElkKTsKLQotICAgICAgICAvLyBjaGVjayBpZiBsb2dpbiBrZXkgZml0cwotICAgICAgICBpZiAoYXBwS2V5ID09IG51bGwgfHwgIVNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuY2hlY2tMb2dpbktleShyZXF1ZXN0KSkgewotICAgICAgICAgICAgLy8gUEFSQU5PSUE6IHJlbW92ZSBrZXlzLCBkb24ndCBhbGxvdyBhIHNlY29uZCBhdHRlbXB0Ci0gICAgICAgICAgICBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLnJlbW92ZUxvZ2luS2V5KHJlcXVlc3QsIGFwcElkKTsKLSAgICAgICAgICAgIFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIucmVtb3ZlQXBwbGljYXRpb25LZXkocmVxdWVzdCwgYXBwSWQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKDQwMCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgbG9naW4ga2V5IC0gaXQgc2hvdWxkIG5vdCBiZSByZXVzZWQKLSAgICAgICAgU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5yZW1vdmVMb2dpbktleShyZXF1ZXN0LCBhcHBJZCk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIGFwcGxpY2F0aW9uIGtleQotICAgICAgICBKU09OT2JqZWN0IHJlc3VsdCA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgIHJlc3VsdC5wdXQoIm9rIiwgMSk7Ci0gICAgICAgIHJlc3VsdC5wdXQoImtleSIsIGFwcEtleSk7Ci0KLSAgICAgICAgcHJpbnRKU09OKHJlc3BvbnNlLCByZXN1bHQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGF1dGhlbnRpY2F0ZShmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgdXNlciwgU3RyaW5nIHBhc3N3b3JkKTsKLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgbG9nb3V0cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2dvdXQoZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGFwcElkID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZXRBcHBsaWNhdGlvbklkRnJvbUtleShTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyCi0gICAgICAgICAgICAgICAgLmdldEtleShyZXF1ZXN0KSk7Ci0gICAgICAgIGlmIChhcHBJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLnJlbW92ZUFwcGxpY2F0aW9uS2V5KHJlcXVlc3QsIGFwcElkKTsKLSAgICAgICAgfQotCi0gICAgICAgIEpTT05PYmplY3QgcmVzdWx0ID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgcmVzdWx0LnB1dCgib2siLCAxKTsKLQotICAgICAgICBwcmludEpTT04ocmVzcG9uc2UsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNTZXJ2aWNlRmFjdG9yeSBnZXRDbWlzU2VydmljZUZhY3RvcnkoZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHsKLSAgICAgICAgQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3RvcnkgPSAoQ21pc1NlcnZpY2VGYWN0b3J5KSBzZXJ2bGV0Q29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUoQ21pc1JlcG9zaXRvcnlDb250ZXh0TGlzdGVuZXIuU0VSVklDRVNfRkFDVE9SWSk7Ci0KLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJTZXJ2aWNlIGZhY3Rvcnkgbm90IGF2YWlsYWJsZSEgQ29uZmlndXJhdGlvbiBwcm9ibGVtPyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRKU09OKGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIEpTT05TdHJlYW1Bd2FyZSBqc29uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04Iik7Ci0gICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJwcml2YXRlLCBtYXgtYWdlPTAiKTsKLQotICAgICAgICBQcmludFdyaXRlciBwdyA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotICAgICAgICBqc29uLndyaXRlSlNPTlN0cmluZyhwdyk7Ci0gICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGVKYXZhU2NyaXB0U3RyaW5nKGZpbmFsIFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGMgPT0gJ1wnJykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXFwnIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZW5jb2RlSFRNTFN0cmluZyhmaW5hbCBTdHJpbmcgcykgewotICAgICAgICBpZiAocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1x0JyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotICAgICAgICAgICAgICAgICAgICB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJyAnIHx8IGMgPT0gJy4nIHx8IGMgPT0gJywnIHx8IGMgPT0gJy0nIHx8IGMgPT0gJ18nKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjIDw9IDB4MWYgfHwgKGMgPj0gMHg3ZiAmJiBjIDw9IDB4OWYpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyYnKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImYW1wOyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJnF1b3Q7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImbHQ7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImZ3Q7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJiN4IiArIEludGVnZXIudG9IZXhTdHJpbmcoYykgKyAiOyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFVybFNlcnZpY2VDYWxsIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIG5vIGltcGxlbWVudGF0aW9uCi0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvdG9rZW4vU2ltcGxlVG9rZW5IYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL3Rva2VuL1NpbXBsZVRva2VuSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDlkN2EwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvdG9rZW4vU2ltcGxlVG9rZW5IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuYnJvd3Nlci50b2tlbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLkNhbGxDb250ZXh0SW1wbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVRva2VuSGFuZGxlciBleHRlbmRzIEFic3RyYWN0U2ltcGxlVG9rZW5IYW5kbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXV0aGVudGljYXRlKGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIFN0cmluZyB1c2VyLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQpIHsKLQotICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgZmFjdG9yeQotICAgICAgICBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSA9IGdldENtaXNTZXJ2aWNlRmFjdG9yeShzZXJ2bGV0Q29udGV4dCk7Ci0KLSAgICAgICAgLy8gYnVpbGQgYSBjYWxsIGNvbnRleHQKLSAgICAgICAgQ2FsbENvbnRleHRJbXBsIGNvbnRleHQgPSBuZXcgQ2FsbENvbnRleHRJbXBsKENhbGxDb250ZXh0LkJJTkRJTkdfQlJPV1NFUiwgQ21pc1ZlcnNpb24uQ01JU18xXzEsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGNvbnRleHQucHV0KENhbGxDb250ZXh0LlVTRVJOQU1FLCB1c2VyKTsKLSAgICAgICAgY29udGV4dC5wdXQoQ2FsbENvbnRleHQuUEFTU1dPUkQsIHBhc3N3b3JkKTsKLQotICAgICAgICAvLyBjYWxsIGdldFJlcG9zaXRvcnlJbmZvcygpIG1ldGhvZAotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgc2VydmljZQotICAgICAgICAgICAgc2VydmljZSA9IGZhY3RvcnkuZ2V0U2VydmljZShjb250ZXh0KTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFJlcG9zaXRvcnlJbmZvcyhudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaW50ZXJwcmV0IGFsbCBleGNlcHRpb25zIGFzIGEgbG9naW4gZmFpbHVyZQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL3Rva2VuL1NpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvdG9rZW4vU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU4YmM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvdG9rZW4vU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5icm93c2VyLnRva2VuOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ01JU19VU0VSID0gImNtaXMtdG9rZW4udXNlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTUlTX0FVVEhfVElNRVNUQU1QID0gImNtaXMtdG9rZW4udGltZXN0YW1wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NNSVNfVE9LRU4gPSAiY21pcy10b2tlbi50b2tlbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTUlTX0xPR0lOX0tFWSA9ICJjbWlzLXRva2VuLnRva2VuLmxvZ2lua2V5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NNSVNfRk9STV9LRVkgPSAiY21pcy10b2tlbi5mb3Jta2V5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NNSVNfQVBQX1VSTCA9ICJjbWlzLXRva2VuLmFwcHVybCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DTUlTX0FQUF9LRVkgPSAiY21pcy10b2tlbi5hcHBrZXkiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVBBUkFUT1IgPSAiXG4iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fS0VZID0gImtleSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVE9LRU4gPSAidG9rZW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VSTCA9ICJ1cmwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VTRVIgPSAidXNlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEFTU1dPUkQgPSAicGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1RSVVNUQVBQID0gInRydXN0YXBwIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9JRF9CWVRFUyA9IDEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9JRF9MRU5HVEggPSBBUFBfSURfQllURVMgKiAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWV9CWVRFUyA9IDIwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWV9MRU5HVEggPSBLRVlfQllURVMgKiAyOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb25JZEZyb21LZXkoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5Lmxlbmd0aCgpICE9IEFQUF9JRF9MRU5HVEggKyBLRVlfTEVOR1RIKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBrZXkuc3Vic3RyaW5nKDAsIEFQUF9JRF9MRU5HVEgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvZ2luS2V5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgYXBwSWQpIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHMgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICBpZiAoaHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFN0cmluZykgaHMuZ2V0QXR0cmlidXRlKEFUVFJfQ01JU19MT0dJTl9LRVkgKyBhcHBJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvZ2luS2V5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgbG9naW5LZXksIFN0cmluZyBmb3JtS2V5LCBVUkwgYXBwVVJMKSB7Ci0gICAgICAgIEh0dHBTZXNzaW9uIGhzID0gcmVxdWVzdC5nZXRTZXNzaW9uKCk7Ci0KLSAgICAgICAgU3RyaW5nIGFwcElkID0gZ2V0QXBwbGljYXRpb25JZEZyb21LZXkobG9naW5LZXkpOwotCi0gICAgICAgIGhzLnNldEF0dHJpYnV0ZShBVFRSX0NNSVNfTE9HSU5fS0VZICsgYXBwSWQsIGxvZ2luS2V5KTsKLSAgICAgICAgaHMuc2V0QXR0cmlidXRlKEFUVFJfQ01JU19GT1JNX0tFWSArIGFwcElkLCBmb3JtS2V5KTsKLSAgICAgICAgaHMuc2V0QXR0cmlidXRlKEFUVFJfQ01JU19BUFBfVVJMICsgYXBwSWQsIGFwcFVSTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrTG9naW5LZXkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHMgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICBpZiAoaHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IGdldEtleShyZXF1ZXN0KTsKLQotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBhcHBJZCA9IGdldEFwcGxpY2F0aW9uSWRGcm9tS2V5KGtleSk7Ci0gICAgICAgIGlmIChhcHBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2V5LmVxdWFscyhocy5nZXRBdHRyaWJ1dGUoQVRUUl9DTUlTX0xPR0lOX0tFWSArIGFwcElkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxvZ2luS2V5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgYXBwSWQpIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHMgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICBpZiAoaHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaHMucmVtb3ZlQXR0cmlidXRlKEFUVFJfQ01JU19MT0dJTl9LRVkgKyBhcHBJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRm9ybUtleShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBIdHRwU2Vzc2lvbiBocyA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0gICAgICAgIGlmIChocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZm9ybUtleSA9IGdldEtleShyZXF1ZXN0KTsKLQotICAgICAgICBpZiAoZm9ybUtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXBwSWQgPSBnZXRBcHBsaWNhdGlvbklkRnJvbUtleShmb3JtS2V5KTsKLSAgICAgICAgaWYgKGFwcElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmb3JtS2V5LmVxdWFscyhocy5nZXRBdHRyaWJ1dGUoQVRUUl9DTUlTX0ZPUk1fS0VZICsgYXBwSWQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRm9ybUtleShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGFwcElkKSB7Ci0gICAgICAgIEh0dHBTZXNzaW9uIGhzID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgaWYgKGhzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGhzLnJlbW92ZUF0dHJpYnV0ZShBVFRSX0NNSVNfRk9STV9LRVkgKyBhcHBJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGFwcElkKSB7Ci0gICAgICAgIEh0dHBTZXNzaW9uIGhzID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgaWYgKGhzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGhzLmdldEF0dHJpYnV0ZShBVFRSX0NNSVNfVVNFUiArIGFwcElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGFwcElkLCBTdHJpbmcgdXNlcikgewotICAgICAgICBIdHRwU2Vzc2lvbiBocyA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0gICAgICAgIGlmIChocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBocy5zZXRBdHRyaWJ1dGUoQVRUUl9DTUlTX1VTRVIgKyBhcHBJZCwgdXNlcik7Ci0gICAgICAgIGhzLnNldEF0dHJpYnV0ZShBVFRSX0NNSVNfQVVUSF9USU1FU1RBTVAgKyBhcHBJZCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uS2V5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgYXBwSWQpIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHMgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICBpZiAoaHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFN0cmluZykgaHMuZ2V0QXR0cmlidXRlKEFUVFJfQ01JU19BUFBfS0VZICsgYXBwSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBcHBsaWNhdGlvbktleShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGtleSkgewotICAgICAgICBIdHRwU2Vzc2lvbiBocyA9IHJlcXVlc3QuZ2V0U2Vzc2lvbigpOwotCi0gICAgICAgIFN0cmluZyBhcHBJZCA9IGdldEFwcGxpY2F0aW9uSWRGcm9tS2V5KGtleSk7Ci0KLSAgICAgICAgaHMuc2V0QXR0cmlidXRlKEFUVFJfQ01JU19BUFBfS0VZICsgYXBwSWQsIGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQXBwbGljYXRpb25LZXkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHMgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICBpZiAoaHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IGdldEtleShyZXF1ZXN0KTsKLQotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBhcHBJZCA9IGdldEFwcGxpY2F0aW9uSWRGcm9tS2V5KGtleSk7Ci0gICAgICAgIGlmIChhcHBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2V5LmVxdWFscyhocy5nZXRBdHRyaWJ1dGUoQVRUUl9DTUlTX0FQUF9LRVkgKyBhcHBJZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBcHBsaWNhdGlvbktleShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGFwcElkKSB7Ci0gICAgICAgIEh0dHBTZXNzaW9uIGhzID0gcmVxdWVzdC5nZXRTZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgaWYgKGhzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGhzLnJlbW92ZUF0dHJpYnV0ZShBVFRSX0NNSVNfQVBQX0tFWSArIGFwcElkKTsKLSAgICAgICAgaHMucmVtb3ZlQXR0cmlidXRlKEFUVFJfQ01JU19BUFBfVVJMICsgYXBwSWQpOwotICAgICAgICBocy5yZW1vdmVBdHRyaWJ1dGUoQVRUUl9DTUlTX1VTRVIgKyBhcHBJZCk7Ci0gICAgICAgIGhzLnJlbW92ZUF0dHJpYnV0ZShBVFRSX0NNSVNfQVVUSF9USU1FU1RBTVAgKyBhcHBJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBVUkwgZ2V0QXBwbGljYXRpb25VUkwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBhcHBJZCkgewotICAgICAgICBIdHRwU2Vzc2lvbiBocyA9IHJlcXVlc3QuZ2V0U2Vzc2lvbihmYWxzZSk7Ci0gICAgICAgIGlmIChocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoVVJMKSBocy5nZXRBdHRyaWJ1dGUoQVRUUl9DTUlTX0FQUF9VUkwgKyBhcHBJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSB0b2tlbiBmcm9tIHRoZSByZXF1ZXN0cyBhbmQgdGVzdHMgaWYgdGhpcyB0b2tlbiBiZWxvbmdzIHRvCi0gICAgICogdGhlIGN1cnJlbnQgc2Vzc2lvbi4gSWYgdGhlIHRva2VuIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbiwgdGhlCi0gICAgICogdG9rZW4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHNlc3Npb24gYW5kIGNhbm5vdCBiZSByZXVzZWQgYWdhaW4uCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVxdWVzdCBjb250YWlucyBhIHRva2VuIGFuZCB0aGlzIHRva2VuCi0gICAgICogICAgICAgICBiZWxvbmdzIHRvIHRoZSBzZXNzaW9uLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHRlc3RBbmRJbnZhbGlkYXRlVG9rZW4oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHMgPSByZXF1ZXN0LmdldFNlc3Npb24oZmFsc2UpOwotICAgICAgICBpZiAoaHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRva2VuID0gZ2V0VG9rZW4ocmVxdWVzdCk7Ci0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0b2tlbktleSA9IEFUVFJfQ01JU19UT0tFTiArIHRva2VuOwotCi0gICAgICAgIExvbmcgdG9rZW5DcmVhdGlvblRpbWVzdGFtcCA9IChMb25nKSBocy5nZXRBdHRyaWJ1dGUodG9rZW5LZXkpOwotICAgICAgICBpZiAodG9rZW5DcmVhdGlvblRpbWVzdGFtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgdG9rZW4gZXhpc3RzLCByZW1vdmUgaXQKLSAgICAgICAgICAgIGhzLnJlbW92ZUF0dHJpYnV0ZSh0b2tlbktleSk7Ci0KLSAgICAgICAgICAgIC8vIFBBUkFOT0lBOiBkb24ndCBhY2NlcHQgdG9rZW5zIHRoYXQgYXJlIG9sZGVyIHRoYW4gOCBob3VycwotICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdG9rZW5DcmVhdGlvblRpbWVzdGFtcCA8IDggKiA2MCAqIDYwICogMTAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgdG9rZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFRva2VuKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgdG9rZW4pIHsKLSAgICAgICAgSHR0cFNlc3Npb24gaHMgPSByZXF1ZXN0LmdldFNlc3Npb24oKTsKLQotICAgICAgICBTdHJpbmcgdG9rZW5LZXkgPSBBVFRSX0NNSVNfVE9LRU4gKyB0b2tlbjsKLQotICAgICAgICAvLyBzZXQgdGhlIHRva2VuIGFuZCByZXRhaW4gY3JlYXRpb24gdGltZXN0YW1wCi0gICAgICAgIGhzLnNldEF0dHJpYnV0ZSh0b2tlbktleSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGtleSBwYXJhbWV0ZXIgZnJvbSB0aGUgcmVxdWVzdCBhbmQgY2hlY2tzIGl0cyB2YWxpZGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRLZXkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFBBUkFNX0tFWSk7Ci0gICAgICAgIHJldHVybiBub3JtYWxpemVLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkb21haW4gcGFyYW1ldGVyIGZyb20gdGhlIHJlcXVlc3QgYW5kIGNoZWNrcyBpdHMgdmFsaWRpdHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9rZW4oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgU3RyaW5nIHRva2VuID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoUEFSQU1fVE9LRU4pOwotICAgICAgICByZXR1cm4gbm9ybWFsaXplS2V5KHRva2VuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVLZXkoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAga2V5ID0ga2V5LnRyaW0oKTsKLQotICAgICAgICBpZiAoa2V5Lmxlbmd0aCgpICE9IEFQUF9JRF9MRU5HVEggKyBLRVlfTEVOR1RIIHx8ICFrZXkubWF0Y2hlcygiXlswLTlhLWZdKyQiKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlQXBwSWQoKSB7Ci0gICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbQVBQX0lEX0JZVEVTXTsKLSAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhieXRlcyk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgZm9yIChieXRlIGIgOiBieXRlcykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGIgJiAweGZmKTsKLSAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpIDwgMikgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnMCcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVLZXkoU3RyaW5nIGFwcElkKSB7Ci0gICAgICAgIFNlY3VyZVJhbmRvbSByYW5kb20gPSBuZXcgU2VjdXJlUmFuZG9tKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbS0VZX0JZVEVTXTsKLSAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhieXRlcyk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGFwcElkKTsKLQotICAgICAgICBmb3IgKGJ5dGUgYiA6IGJ5dGVzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IEludGVnZXIudG9IZXhTdHJpbmcoYiAmIDB4ZmYpOwotICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgPCAyKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcwJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQocyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL3Rva2VuL1Rva2VuQ2FsbENvbnRleHRIYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9icm93c2VyL3Rva2VuL1Rva2VuQ2FsbENvbnRleHRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDQwNmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci90b2tlbi9Ub2tlbkNhbGxDb250ZXh0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXIudG9rZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5CYXNpY0F1dGhDYWxsQ29udGV4dEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5IdHRwVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBUb2tlbkNhbGxDb250ZXh0SGFuZGxlciBleHRlbmRzIEJhc2ljQXV0aENhbGxDb250ZXh0SGFuZGxlciBpbXBsZW1lbnRzIFRva2VuSGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgVG9rZW5IYW5kbGVyIHRva2VuSGFuZGxlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBUb2tlbkNhbGxDb250ZXh0SGFuZGxlcigpIHsKLSAgICAgICAgdG9rZW5IYW5kbGVyID0gbmV3IFNpbXBsZVRva2VuSGFuZGxlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldENhbGxDb250ZXh0TWFwKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBiYXNpY0F1dGhNYXAgPSBzdXBlci5nZXRDYWxsQ29udGV4dE1hcChyZXF1ZXN0KTsKLSAgICAgICAgaWYgKGJhc2ljQXV0aE1hcCAhPSBudWxsICYmICFiYXNpY0F1dGhNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0QWxsKGJhc2ljQXV0aE1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsYXN0UmVzdWx0IG11c3QgYWx3YXlzIHByb3ZpZGUgYW4gb2xkIHRva2VuCi0gICAgICAgIC8vIC0+IGRvbid0IGNoZWNrIHRoZSB0b2tlbgotICAgICAgICBib29sZWFuIGlzTGFzdFJlc3VsdFJlcXVlc3QgPSAibGFzdHJlc3VsdCIuZXF1YWxzSWdub3JlQ2FzZShIdHRwVXRpbHMuZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlBBUkFNX1NFTEVDVE9SKSk7Ci0KLSAgICAgICAgaWYgKCFpc0xhc3RSZXN1bHRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICAvLyBpZiBhIHRva2VuIGlzIHByb3ZpZGVkLCBjaGVjayBpdAotICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9UT0tFTikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChTaW1wbGVUb2tlbkhhbmRsZXJTZXNzaW9uSGVscGVyLnRlc3RBbmRJbnZhbGlkYXRlVG9rZW4ocmVxdWVzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZXRUb2tlbihyZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFwcElkID0gU2ltcGxlVG9rZW5IYW5kbGVyU2Vzc2lvbkhlbHBlci5nZXRBcHBsaWNhdGlvbklkRnJvbUtleSh0b2tlbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoQ2FsbENvbnRleHQuVVNFUk5BTUUsIFNpbXBsZVRva2VuSGFuZGxlclNlc3Npb25IZWxwZXIuZ2V0VXNlcihyZXF1ZXN0LCBhcHBJZCkpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KENhbGxDb250ZXh0LlBBU1NXT1JELCBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oIkludmFsaWQgdG9rZW4hIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJlc3VsdC5jb250YWluc0tleShDYWxsQ29udGV4dC5VU0VSTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAvLyBuZWl0aGVyIGJhc2ljIGF1dGhlbnRpY2F0aW9uIG5vciB0b2tlbiBhdXRoZW50aWNhdGlvbiBoYXZlCi0gICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYSB1c2VybmFtZSAtPiByZWplY3QgcmVxdWVzdAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbigiTm8gYXV0aGVudGljYXRpb24hIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRva2VuSGFuZGxlci5zZXJ2aWNlKHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci90b2tlbi9Ub2tlbkhhbmRsZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvdG9rZW4vVG9rZW5IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDk3NGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci90b2tlbi9Ub2tlbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5icm93c2VyLnRva2VuOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRva2VuSGFuZGxlciB7Ci0KLSAgICB2b2lkIHNlcnZpY2UoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2Jyb3dzZXIvdG9rZW4vcGFja2FnZS5odG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci90b2tlbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2E4NDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvYnJvd3Nlci90b2tlbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IS0tIAotCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSAtLT4KLTxodG1sPgotPGhlYWQ+Ci08IS0tCi0gSmF2YURvYyBwYWNrYWdlLmh0bWwKLS0tPgotPC9oZWFkPgotPGJvZHk+Ci1DTUlTIDEuMSBCcm93c2VyIEJpbmRpbmcgVG9rZW4gU2FtcGxlIEltcGxlbWVudGF0aW9uLgotCi08cD4KLVRoaXMgcGFja2FnZSBjb250YWlucyBhIHNhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdG9rZW4gaGFuZGxpbmcKLWRlc2NyaWJlZCBpbiB0aGUgQ01JUyAxLjEgc3BlY2lmaWNhdGlvbi4gVGhpcyBpcyBzYW1wbGUgY29kZSBhbmQgbm90Ci1pbmRlbnRlZCBmb3IgcHJvZHVjdGl2ZSB1c2UuIEl0IGhhcyB0byBiZSBhZGFwdGVkIG9yIHRvIGJlIHJlcGxhY2VkCi1ieSByZXBvc2l0b3J5IHNwZWNpZmljIGNvZGUuCi08L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9kdW1teS9EdW1teVNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2R1bW15L0R1bW15U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmMzNjM0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL2R1bW15L0R1bW15U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5kdW1teTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuQWJzdHJhY3RDbWlzU2VydmljZTsKLQotLyoqCi0gKiBTaW1wbGVzdCBSZXBvc2l0b3J5IFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teVNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdENtaXNTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeUluZm9JbXBsIGZSZXBJbmZvOwotCi0gICAgcHVibGljIER1bW15U2VydmljZShTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZSZXBJbmZvID0gbmV3IFJlcG9zaXRvcnlJbmZvSW1wbCgpOwotCi0gICAgICAgIGZSZXBJbmZvLnNldElkKGlkKTsKLSAgICAgICAgZlJlcEluZm8uc2V0TmFtZShuYW1lKTsKLSAgICAgICAgZlJlcEluZm8uc2V0RGVzY3JpcHRpb24obmFtZSk7Ci0gICAgICAgIGZSZXBJbmZvLnNldENtaXNWZXJzaW9uU3VwcG9ydGVkKCIxLjAiKTsKLSAgICAgICAgZlJlcEluZm8uc2V0Um9vdEZvbGRlcigicm9vdCIpOwotCi0gICAgICAgIGZSZXBJbmZvLnNldFZlbmRvck5hbWUoIk9wZW5DTUlTIik7Ci0gICAgICAgIGZSZXBJbmZvLnNldFByb2R1Y3ROYW1lKCJPcGVuQ01JUyBTZXJ2ZXIiKTsKLSAgICAgICAgZlJlcEluZm8uc2V0UHJvZHVjdFZlcnNpb24oIjEuMCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGlmICghZlJlcEluZm8uZ2V0SWQoKS5lcXVhbHMocmVwb3NpdG9yeUlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkEgcmVwb3NpdG9yeSB3aXRoIHJlcG9zaXRvcnkgaWQgJyIgKyByZXBvc2l0b3J5SWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZSZXBJbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFJlcG9zaXRvcnlJbmZvPiBnZXRSZXBvc2l0b3J5SW5mb3MoRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KChSZXBvc2l0b3J5SW5mbykgZlJlcEluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckxpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBCaWdJbnRlZ2VyIG1heEl0ZW1zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFjbCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIFN0cmluZyB0eXBlSWQsIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9kdW1teS9EdW1teVNlcnZpY2VzRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvZHVtbXkvRHVtbXlTZXJ2aWNlc0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0ZGUzYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9kdW1teS9EdW1teVNlcnZpY2VzRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmR1bW15OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuQWJzdHJhY3RTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIGEgcmVwb3NpdG9yeSBmYWN0b3J5IHdpdGhvdXQgYmFjay1lbmQgZm9yIHRlc3QgcHVycG9zZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEdW1teVNlcnZpY2VzRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2VydmljZUZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAicmVwb3NpdG9yeS5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSURfREVGQVVMVCA9ICJ0ZXN0LXJlcCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9OQU1FID0gInJlcG9zaXRvcnkubmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfTkFNRV9ERUZBVUxUID0gIlRlc3QgUmVwb3NpdG9yeSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRHVtbXlTZXJ2aWNlc0ZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHByaXZhdGUgRHVtbXlTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIC8vIGdldCB0aGUgaWQKLSAgICAgICAgaWQgPSBwYXJhbWV0ZXJzLmdldChSRVBPU0lUT1JZX0lEKTsKLSAgICAgICAgaWYgKChpZCA9PSBudWxsKSB8fCAoaWQudHJpbSgpLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICBpZCA9IFJFUE9TSVRPUllfSURfREVGQVVMVDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbmFtZQotICAgICAgICBuYW1lID0gcGFyYW1ldGVycy5nZXQoUkVQT1NJVE9SWV9OQU1FKTsKLSAgICAgICAgaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgbmFtZSA9IFJFUE9TSVRPUllfTkFNRV9ERUZBVUxUOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgcmVwb3NpdG9yeSBzZXJ2aWNlCi0gICAgICAgIHNlcnZpY2UgPSBuZXcgRHVtbXlTZXJ2aWNlKGlkLCBuYW1lKTsKLQotICAgICAgICBMT0cuaW5mbygiSW5pdGlhbGl6ZWQgZHVtbXkgcmVwb3NpdG9yeSAnIiArIG5hbWUgKyAiJyAoIiArIGlkICsgIikiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBMT0cuaW5mbygiRGVzdHJveWVkIGR1bW15IHJlcG9zaXRvcnkgJyIgKyBuYW1lICsgIicgKCIgKyBpZCArICIpIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNTZXJ2aWNlIGdldFNlcnZpY2UoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9BYnN0cmFjdFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0Fic3RyYWN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU3YTlkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0Fic3RyYWN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQmFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnN0cmFpbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ZpbHRlck5vdFZhbGlkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RvcmFnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVmVyc2lvbmluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNGYXVsdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bVNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlLlByb2dyZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLkNhbGxDb250ZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5DbWlzUmVwb3NpdG9yeUNvbnRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5TZXJ2ZXJWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuRXhjZXB0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBvcGVyYXRpb25zIHVzZWQgYnkgYWxsIHNlcnZpY2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYnN0cmFjdFNlcnZpY2UuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTF9DT05URVhUX01BUCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jYWxsY29udGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlcyBmYWN0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbWlzU2VydmljZUZhY3RvcnkgZ2V0U2VydmljZUZhY3RvcnkoV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0KSB7Ci0gICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gKFNlcnZsZXRDb250ZXh0KSB3c0NvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoCi0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuU0VSVkxFVF9DT05URVhUKTsKLQotICAgICAgICAvLyBnZXQgc2VydmljZXMgZmFjdG9yeQotICAgICAgICBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSA9IChDbWlzU2VydmljZUZhY3RvcnkpIHNlcnZsZXRDb250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShDbWlzUmVwb3NpdG9yeUNvbnRleHRMaXN0ZW5lci5TRVJWSUNFU19GQUNUT1JZKTsKLQotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlNlcnZpY2UgZmFjdG9yeSBub3QgYXZhaWxhYmxlISBDb25maWd1cmF0aW9uIHByb2JsZW0/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBSZXNwID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHdzQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLmdldCgKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5TRVJWTEVUX1JFU1BPTlNFKTsKLSAgICAgICAgaHR0cFJlc3Auc2V0SGVhZGVyKCJTZXJ2ZXIiLCBTZXJ2ZXJWZXJzaW9uLk9QRU5DTUlTX1NFUlZFUik7Ci0KLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIENhbGxDb250ZXh0IG9iamVjdCBmb3IgdGhlIFdlYiBTZXJ2aWNlIGNvbnRleHQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIENhbGxDb250ZXh0IGNyZWF0ZUNvbnRleHQoV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0LCBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IChTZXJ2bGV0Q29udGV4dCkgd3NDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkuZ2V0KAotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfQ09OVEVYVCk7Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gKEh0dHBTZXJ2bGV0UmVxdWVzdCkgd3NDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkuZ2V0KAotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVRVUVTVCk7Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSkgd3NDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCkuZ2V0KAotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVTUE9OU0UpOwotCi0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gKENtaXNWZXJzaW9uKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShDbWlzV2ViU2VydmljZXNTZXJ2bGV0LkNNSVNfVkVSU0lPTik7Ci0gICAgICAgIGlmIChjbWlzVmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlNlcnZlciBjb25maWd1cmF0aW9uIGlzc3VlLiBDTUlTIHZlcnNpb24gbm90IHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG95ID0gVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZShmYWN0b3J5LCByZXBvc2l0b3J5SWQpOwotICAgICAgICBDYWxsQ29udGV4dEltcGwgY29udGV4dCA9IG5ldyBDYWxsQ29udGV4dEltcGwoQ2FsbENvbnRleHQuQklORElOR19XRUJTRVJWSUNFUywgY21pc1ZlcnNpb24sIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgICAgICBzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsIGZhY3RvcnksIHN0cmVhbUZhY3RveSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4pIHdzQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLmdldCgKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUyk7Ci0gICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoIkFjY2VwdC1MYW5ndWFnZSIpICYmIGhlYWRlci5nZXRWYWx1ZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFoZWFkZXIuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRBY2NlcHRMYW5ndWFnZShoZWFkZXIuZ2V0VmFsdWUoKS5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IHdzQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNhbGxDb250ZXh0TWFwID0gKE1hcDxTdHJpbmcsIFN0cmluZz4pIG1jLmdldChDQUxMX0NPTlRFWFRfTUFQKTsKLSAgICAgICAgaWYgKGNhbGxDb250ZXh0TWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogY2FsbENvbnRleHRNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQucHV0KGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDTUlTIHZlcnNpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENtaXNWZXJzaW9uIGdldENtaXNWZXJzaW9uKFdlYlNlcnZpY2VDb250ZXh0IHdzQ29udGV4dCkgewotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIHdzQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLmdldCgKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5TRVJWTEVUX1JFUVVFU1QpOwotICAgICAgICByZXR1cm4gKENtaXNWZXJzaW9uKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShDbWlzV2ViU2VydmljZXNTZXJ2bGV0LkNNSVNfVkVSU0lPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIENtaXNTZXJ2aWNlfSBvYmplY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENtaXNTZXJ2aWNlIGdldFNlcnZpY2UoV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5ID0gZ2V0U2VydmljZUZhY3Rvcnkod3NDb250ZXh0KTsKLSAgICAgICAgQ2FsbENvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQod3NDb250ZXh0LCBmYWN0b3J5LCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRTZXJ2aWNlKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb2Nlc3Npbmcgc2hvdWxkIGJlIHN0b3BwZWQgYmVmb3JlIHRoZSBzZXJ2aWNlIG1ldGhvZAotICAgICAqIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcHJvY2Vzc2luZyBzaG91bGQgYmUgc3RvcHBlZCwge0Bjb2RlIGZhbHNlfQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcEJlZm9yZVNlcnZpY2UoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBpZiAoIShzZXJ2aWNlIGluc3RhbmNlb2YgUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKChQcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZSkgc2VydmljZSkuYmVmb3JlU2VydmljZUNhbGwoKSA9PSBQcm9ncmVzcy5TVE9QOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIHByb2Nlc3Npbmcgc2hvdWxkIGJlIHN0b3BwZWQgYWZ0ZXIgdGhlIHNlcnZpY2UgbWV0aG9kCi0gICAgICogaXMgY2FsbGVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwcm9jZXNzaW5nIHNob3VsZCBiZSBzdG9wcGVkLCB7QGNvZGUgZmFsc2V9Ci0gICAgICogICAgICAgICBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wQWZ0ZXJTZXJ2aWNlKENtaXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgaWYgKCEoc2VydmljZSBpbnN0YW5jZW9mIFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICgoUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UpIHNlcnZpY2UpLmFmdGVyU2VydmljZUNhbGwoKSA9PSBQcm9ncmVzcy5TVE9QOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGUgc2VydmljZSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZVNlcnZpY2UoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIENNSVMgZXhjZXB0aW9uIHRvIHRoZSBhcHByb3ByaWF0ZSBXZWIgU2VydmljZSBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENtaXNFeGNlcHRpb24gY29udmVydEV4Y2VwdGlvbihFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgQ21pc0ZhdWx0VHlwZSBmYXVsdCA9IG5ldyBDbWlzRmF1bHRUeXBlKCk7Ci0gICAgICAgIGZhdWx0LnNldE1lc3NhZ2UoIlVua25vd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIGZhdWx0LnNldENvZGUoQmlnSW50ZWdlci5aRVJPKTsKLSAgICAgICAgZmF1bHQuc2V0VHlwZShFbnVtU2VydmljZUV4Y2VwdGlvbi5SVU5USU1FKTsKLQotICAgICAgICBpZiAoZXggIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0Jhc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5zZXRDb2RlKCgoQ21pc0Jhc2VFeGNlcHRpb24pIGV4KS5nZXRDb2RlKCkpOwotICAgICAgICAgICAgICAgIGZhdWx0LnNldE1lc3NhZ2UoZXguZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0LnNldFR5cGUoRW51bVNlcnZpY2VFeGNlcHRpb24uQ09OU1RSQUlOVCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5zZXRUeXBlKEVudW1TZXJ2aWNlRXhjZXB0aW9uLkNPTlRFTlRfQUxSRUFEWV9FWElTVFMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzRmlsdGVyTm90VmFsaWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuc2V0VHlwZShFbnVtU2VydmljZUV4Y2VwdGlvbi5GSUxURVJfTk9UX1ZBTElEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5zZXRUeXBlKEVudW1TZXJ2aWNlRXhjZXB0aW9uLklOVkFMSURfQVJHVU1FTlQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuc2V0VHlwZShFbnVtU2VydmljZUV4Y2VwdGlvbi5OQU1FX0NPTlNUUkFJTlRfVklPTEFUSU9OKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5zZXRUeXBlKEVudW1TZXJ2aWNlRXhjZXB0aW9uLk5PVF9TVVBQT1JURUQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuc2V0VHlwZShFbnVtU2VydmljZUV4Y2VwdGlvbi5PQkpFQ1RfTk9UX0ZPVU5EKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuc2V0VHlwZShFbnVtU2VydmljZUV4Y2VwdGlvbi5QRVJNSVNTSU9OX0RFTklFRCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIENtaXNTdG9yYWdlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuc2V0VHlwZShFbnVtU2VydmljZUV4Y2VwdGlvbi5TVE9SQUdFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5zZXRUeXBlKEVudW1TZXJ2aWNlRXhjZXB0aW9uLlNUUkVBTV9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0LnNldFR5cGUoRW51bVNlcnZpY2VFeGNlcHRpb24uVVBEQVRFX0NPTkZMSUNUKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgQ21pc1ZlcnNpb25pbmdFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuc2V0VHlwZShFbnVtU2VydmljZUV4Y2VwdGlvbi5WRVJTSU9OSU5HKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5zZXRNZXNzYWdlKCJBbiBlcnJvciBvY2N1cnJlZCEiKTsKLQotICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy53YXJuKGV4LmdldE1lc3NhZ2UoKSwgZXgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IEV4Y2VwdGlvbkhlbHBlci5nZXRTdGFja3RyYWNlQXNOb2RlKGV4KTsKLSAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRBbnkoKS5hZGQobm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IENtaXNFeGNlcHRpb24oZmF1bHQuZ2V0TWVzc2FnZSgpLCBmYXVsdCwgZXgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0Fic3RyYWN0VXNlcm5hbWVUb2tlbkF1dGhIYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9BYnN0cmFjdFVzZXJuYW1lVG9rZW5BdXRoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGU0Njg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0Fic3RyYWN0VXNlcm5hbWVUb2tlbkF1dGhIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFic3RyYWN0VXNlcm5hbWVUb2tlbkF1dGhIYW5kbGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgSkFYQkNvbnRleHQgV1NTRV9DT05URVhUOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEpBWEJDb250ZXh0IGpjID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGpjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoT2JqZWN0RmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBXU1NFX0NPTlRFWFQgPSBqYzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXU1NFX05TID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBXU1NFX1NFQ1VSSVRZID0gbmV3IFFOYW1lKFdTU0VfTlMsICJTZWN1cml0eSIpOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgV1NTRV9VU0VSTkFNRV9UT0tFTiA9IG5ldyBRTmFtZShXU1NFX05TLCAiVXNlcm5hbWVUb2tlbiIpOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgV1NTRV9QQVNTV09SRCA9IG5ldyBRTmFtZShXU1NFX05TLCAiUGFzc3dvcmQiKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2V0PFFOYW1lPiBIRUFERVJTID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgSEVBREVSUy5hZGQoV1NTRV9TRUNVUklUWSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZXh0cmFjdFVzZXJuYW1lUGFzc3dvcmQoSkFYQkVsZW1lbnQ8U2VjdXJpdHlIZWFkZXJUeXBlPiBzaHQpIHsKLSAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKLQotICAgICAgICBmb3IgKE9iamVjdCB1bm8gOiBzaHQuZ2V0VmFsdWUoKS5nZXRBbnkoKSkgewotICAgICAgICAgICAgaWYgKCh1bm8gaW5zdGFuY2VvZiBKQVhCRWxlbWVudCkgJiYgKChKQVhCRWxlbWVudDw/PikgdW5vKS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgVXNlcm5hbWVUb2tlblR5cGUpIHsKLSAgICAgICAgICAgICAgICBVc2VybmFtZVRva2VuVHlwZSB1dHQgPSAoKEpBWEJFbGVtZW50PFVzZXJuYW1lVG9rZW5UeXBlPikgdW5vKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHVzZXJuYW1lID0gdXR0LmdldFVzZXJuYW1lKCkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHBvIDogdXR0LmdldEFueSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocG8gaW5zdGFuY2VvZiBKQVhCRWxlbWVudCkgJiYgKChKQVhCRWxlbWVudDw/PikgcG8pLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBQYXNzd29yZFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSAoKEpBWEJFbGVtZW50PFBhc3N3b3JkU3RyaW5nPikgcG8pLmdldFZhbHVlKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHVzZXJuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgcmVzdWx0LnB1dChDYWxsQ29udGV4dC5VU0VSTkFNRSwgdXNlcm5hbWUpOwotICAgICAgICAgICAgcmVzdWx0LnB1dChDYWxsQ29udGV4dC5QQVNTV09SRCwgcGFzc3dvcmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyAtLS0gSkFYQiBjbGFzc2VzIC0tLQotCi0gICAgQFhtbFJlZ2lzdHJ5Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLQotICAgICAgICBwdWJsaWMgT2JqZWN0RmFjdG9yeSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZWN1cml0eUhlYWRlclR5cGUgY3JlYXRlU2VjdXJpdHlIZWFkZXJUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWN1cml0eUhlYWRlclR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBVc2VybmFtZVRva2VuVHlwZSBjcmVhdGVVc2VybmFtZVRva2VuVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVXNlcm5hbWVUb2tlblR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQYXNzd29yZFN0cmluZyBjcmVhdGVQYXNzd29yZFN0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGFzc3dvcmRTdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVkU3RyaW5nIGNyZWF0ZUF0dHJpYnV0ZWRTdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZWRTdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIiwgbmFtZSA9ICJTZWN1cml0eSIpCi0gICAgICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTZWN1cml0eUhlYWRlclR5cGU+IGNyZWF0ZVNlY3VyaXR5KFNlY3VyaXR5SGVhZGVyVHlwZSB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTZWN1cml0eUhlYWRlclR5cGU+KFdTU0VfU0VDVVJJVFksIFNlY3VyaXR5SGVhZGVyVHlwZS5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiLCBuYW1lID0gIlVzZXJuYW1lVG9rZW4iKQotICAgICAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8VXNlcm5hbWVUb2tlblR5cGU+IGNyZWF0ZVVzZXJuYW1lVG9rZW4oVXNlcm5hbWVUb2tlblR5cGUgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8VXNlcm5hbWVUb2tlblR5cGU+KFdTU0VfVVNFUk5BTUVfVE9LRU4sIFVzZXJuYW1lVG9rZW5UeXBlLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCIsIG5hbWUgPSAiUGFzc3dvcmQiKQotICAgICAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8UGFzc3dvcmRTdHJpbmc+IGNyZWF0ZVBhc3N3b3JkKFBhc3N3b3JkU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PFBhc3N3b3JkU3RyaW5nPihXU1NFX1BBU1NXT1JELCBQYXNzd29yZFN0cmluZy5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi0gICAgQFhtbFR5cGUobmFtZSA9ICJTZWN1cml0eUhlYWRlclR5cGUiLCBwcm9wT3JkZXIgPSB7ICJhbnkiIH0pCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWN1cml0eUhlYWRlclR5cGUgewotCi0gICAgICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpCi0gICAgICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OwotICAgICAgICBAWG1sQW55QXR0cmlidXRlCi0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFFOYW1lLCBTdHJpbmc+IG90aGVyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7Ci0gICAgICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbnkgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmFueTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG90aGVyQXR0cmlidXRlczsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotICAgIEBYbWxUeXBlKG5hbWUgPSAiVXNlcm5hbWVUb2tlblR5cGUiLCBwcm9wT3JkZXIgPSB7ICJ1c2VybmFtZSIsICJhbnkiIH0pCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBVc2VybmFtZVRva2VuVHlwZSB7Ci0KLSAgICAgICAgQFhtbEVsZW1lbnQobmFtZSA9ICJVc2VybmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMC54c2QiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVkU3RyaW5nIHVzZXJuYW1lOwotICAgICAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQotICAgICAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGFueTsKLSAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gIklkIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiKQotICAgICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgICAgIEBYbWxJRAotICAgICAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gIklEIikKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBpZDsKLSAgICAgICAgQFhtbEFueUF0dHJpYnV0ZQotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOwotCi0gICAgICAgIHB1YmxpYyBBdHRyaWJ1dGVkU3RyaW5nIGdldFVzZXJuYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoQXR0cmlidXRlZFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7Ci0gICAgICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbnkgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzLmFueTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG90aGVyQXR0cmlidXRlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLSAgICBAWG1sVHlwZShuYW1lID0gIlBhc3N3b3JkU3RyaW5nIikKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhc3N3b3JkU3RyaW5nIGV4dGVuZHMgQXR0cmlidXRlZFN0cmluZyB7Ci0KLSAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gIlR5cGUiKQotICAgICAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gImFueVVSSSIpCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLSAgICBAWG1sVHlwZShuYW1lID0gIkF0dHJpYnV0ZWRTdHJpbmciLCBwcm9wT3JkZXIgPSB7ICJ2YWx1ZSIgfSkKLSAgICBAWG1sU2VlQWxzbyh7IFBhc3N3b3JkU3RyaW5nLmNsYXNzIH0pCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVkU3RyaW5nIHsKLQotICAgICAgICBAWG1sVmFsdWUKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gIklkIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiKQotICAgICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgICAgIEBYbWxJRAotICAgICAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gIklEIikKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBpZDsKLSAgICAgICAgQFhtbEFueUF0dHJpYnV0ZQotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG90aGVyQXR0cmlidXRlczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0FjbFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0FjbFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkM2RiZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9BY2xTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0OwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5BQ0xTZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQUNMVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4dGVuc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUFDTFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotCi0vKioKLSAqIENNSVMgQUNMIFNlcnZpY2UuCi0gKi8KLUBNVE9NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5BQ0xTZXJ2aWNlUG9ydCIpCi1wdWJsaWMgY2xhc3MgQWNsU2VydmljZSBleHRlbmRzIEFic3RyYWN0U2VydmljZSBpbXBsZW1lbnRzIEFDTFNlcnZpY2VQb3J0IHsKLSAgICBAUmVzb3VyY2UKLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0OwotCi0gICAgcHVibGljIENtaXNBQ0xUeXBlIGFwcGx5QUNMKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSBhZGRBY2VzLAotICAgICAgICAgICAgQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSByZW1vdmVBY2VzLCBFbnVtQUNMUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikKLSAgICAgICAgICAgIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBY2wgYWNsID0gc2VydmljZS5hcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjb252ZXJ0KGFkZEFjZXMsIG51bGwpLCBjb252ZXJ0KHJlbW92ZUFjZXMsIG51bGwpLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KEFjbFByb3BhZ2F0aW9uLmNsYXNzLCBhY2xQcm9wYWdhdGlvbiksIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhY2wgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbWlzQUNMVHlwZSByZXN1bHQgPSBuZXcgQ21pc0FDTFR5cGUoKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRBQ0woY29udmVydChhY2wpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRFeGFjdChhY2wuaXNFeGFjdCgpKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc0FDTFR5cGUgZ2V0QUNMKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucywKLSAgICAgICAgICAgIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjbCBhY2wgPSBzZXJ2aWNlLmdldEFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFjbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENtaXNBQ0xUeXBlIHJlc3VsdCA9IG5ldyBDbWlzQUNMVHlwZSgpOwotICAgICAgICAgICAgcmVzdWx0LnNldEFDTChjb252ZXJ0KGFjbCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldEV4YWN0KGFjbC5pc0V4YWN0KCkpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0F1dGhIYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9BdXRoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTcyOTI5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0F1dGhIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotCi1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLmhhbmRsZXIuTWVzc2FnZUhhbmRsZXI7Ci1pbXBvcnQgY29tLnN1bi54bWwud3MuYXBpLmhhbmRsZXIuTWVzc2FnZUhhbmRsZXJDb250ZXh0OwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5tZXNzYWdlLkhlYWRlcjsKLWltcG9ydCBjb20uc3VuLnhtbC53cy5hcGkubWVzc2FnZS5IZWFkZXJMaXN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5tZXNzYWdlLk1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB0cmllcyB0byBleHRyYWN0IGEgdXNlciBuYW1lIGFuZCBhIHBhc3N3b3JkIGZyb20gYSBVc2VybmFtZVRva2VuLgotICovCi1wdWJsaWMgY2xhc3MgQXV0aEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdFVzZXJuYW1lVG9rZW5BdXRoSGFuZGxlciBpbXBsZW1lbnRzIE1lc3NhZ2VIYW5kbGVyPE1lc3NhZ2VIYW5kbGVyQ29udGV4dD4gewotCi0gICAgcHVibGljIFNldDxRTmFtZT4gZ2V0SGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIEhFQURFUlM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgY29udGV4dCkgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KE1lc3NhZ2VIYW5kbGVyQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZUhhbmRsZXJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZFByb3BlcnR5ID0gKEJvb2xlYW4pIGNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOwotICAgICAgICBpZiAob3V0Ym91bmRQcm9wZXJ0eS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgLy8gd2UgYXJlIG9ubHkgbG9va2luZyBhdCBpbmJvdW5kIG1lc3NhZ2VzCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY2FsbENvbnRleHRNYXAgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyByZWFkIHRoZSBoZWFkZXIKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gY29udGV4dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBIZWFkZXJMaXN0IGhsID0gbXNnLmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgIEhlYWRlciBzZWN1cml0eUhlYWRlciA9IGhsLmdldChXU1NFX1NFQ1VSSVRZLCB0cnVlKTsKLQotICAgICAgICAgICAgSkFYQkVsZW1lbnQ8U2VjdXJpdHlIZWFkZXJUeXBlPiBzaHQgPSBzZWN1cml0eUhlYWRlci5yZWFkQXNKQVhCKFdTU0VfQ09OVEVYVC5jcmVhdGVVbm1hcnNoYWxsZXIoKSk7Ci0KLSAgICAgICAgICAgIGNhbGxDb250ZXh0TWFwID0gZXh0cmFjdFVzZXJuYW1lUGFzc3dvcmQoc2h0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nLCBlLmcuIGEgcGFydCBvZiB0aGUgU09BUCBoZWFkZXIgd2Fzbid0IHNldAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHVzZXIgYW5kIHBhc3N3b3JkIHRvIGNvbnRleHQKLSAgICAgICAgaWYgKGNhbGxDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGNhbGxDb250ZXh0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LnB1dChBYnN0cmFjdFNlcnZpY2UuQ0FMTF9DT05URVhUX01BUCwgY2FsbENvbnRleHRNYXApOwotICAgICAgICBjb250ZXh0LnNldFNjb3BlKEFic3RyYWN0U2VydmljZS5DQUxMX0NPTlRFWFRfTUFQLCBTY29wZS5BUFBMSUNBVElPTik7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvd2Vic2VydmljZXMvQ21pc1dlYlNlcnZpY2VzU2VydmxldC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvd2Vic2VydmljZXMvQ21pc1dlYlNlcnZpY2VzU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJjZGQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL0NtaXNXZWJTZXJ2aWNlc1NlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5VcmxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5DbWlzUmVwb3NpdG9yeUNvbnRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nRXNjYXBlVXRpbHM7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmFwaS5XU0ZlYXR1cmVMaXN0OwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmRldmVsb3Blci5TdHJlYW1pbmdBdHRhY2htZW50RmVhdHVyZTsKLWltcG9ydCBjb20uc3VuLnhtbC53cy50cmFuc3BvcnQuaHR0cC5zZXJ2bGV0LlNlcnZsZXRBZGFwdGVyOwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLnRyYW5zcG9ydC5odHRwLnNlcnZsZXQuV1NTZXJ2bGV0OwotaW1wb3J0IGNvbS5zdW4ueG1sLndzLnRyYW5zcG9ydC5odHRwLnNlcnZsZXQuV1NTZXJ2bGV0RGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBDbWlzV2ViU2VydmljZXNTZXJ2bGV0IGV4dGVuZHMgV1NTZXJ2bGV0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NNSVNfVkVSU0lPTiA9ICJjbWlzVmVyc2lvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU19WRVJTSU9OID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNtaXNWZXJzaW9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENtaXNXZWJTZXJ2aWNlc1NlcnZsZXQuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfU09BUF9TSVpFID0gMTAgKiAxMDI0ICogMTAyNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTMTBfUEFUSCA9ICIvV0VCLUlORi9jbWlzMTAvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JUzExX1BBVEggPSAiL1dFQi1JTkYvY21pczExLyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEJBU0VfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiPCVjbWlzYmFzZSU+Iik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBDT1JFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIjwlY21pc2NvcmUlPiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTVNHX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIjwlY21pc21zZyU+Iik7Ci0KLSAgICBwcml2YXRlIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGRvY3M7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZ2V0IENNSVMgdmVyc2lvbgotICAgICAgICBTdHJpbmcgY21pc1ZlcnNpb25TdHIgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9DTUlTX1ZFUlNJT04pOwotICAgICAgICBpZiAoY21pc1ZlcnNpb25TdHIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbWlzVmVyc2lvbiA9IENtaXNWZXJzaW9uLmZyb21WYWx1ZShjbWlzVmVyc2lvblN0cik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJDTUlTIHZlcnNpb24gaXMgaW52YWxpZCEgU2V0dGluZyBpdCB0byBDTUlTIDEuMC4iKTsKLSAgICAgICAgICAgICAgICBjbWlzVmVyc2lvbiA9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HLndhcm4oIkNNSVMgdmVyc2lvbiBpcyBub3QgZGVmaW5lZCEgU2V0dGluZyBpdCB0byBDTUlTIDEuMC4iKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gQ21pc1ZlcnNpb24uQ01JU18xXzA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdXAgV1NETCBhbmQgWFNEIGRvY3VtZW50cwotICAgICAgICBkb2NzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgU3RyaW5nIHBhdGggPSAoY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzAgPyBDTUlTMTBfUEFUSCA6IENNSVMxMV9QQVRIKTsKLQotICAgICAgICBkb2NzLnB1dCgid3NkbCIsIHJlYWRGaWxlKGNvbmZpZywgcGF0aCArICJDTUlTV1MtU2VydmljZS53c2RsLnRlbXBsYXRlIikpOwotICAgICAgICBkb2NzLnB1dCgiY29yZSIsIHJlYWRGaWxlKGNvbmZpZywgcGF0aCArICJDTUlTLUNvcmUueHNkLnRlbXBsYXRlIikpOwotICAgICAgICBkb2NzLnB1dCgibXNnIiwgcmVhZEZpbGUoY29uZmlnLCBwYXRoICsgIkNNSVMtTWVzc2FnaW5nLnhzZC50ZW1wbGF0ZSIpKTsKLQotICAgICAgICBzdXBlci5pbml0KGNvbmZpZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZEZpbGUoU2VydmxldENvbmZpZyBjb25maWcsIFN0cmluZyBwYXRoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGZpbGUgJyIgKyBwYXRoICsgIichIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIElPVXRpbHMucmVhZEFsbExpbmVzKHN0cmVhbSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJDYW5ub3QgcmVhZCBmaWxlICciICsgcGF0aCArICInOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2V0IENNSVMgdmVyc2lvbgotICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShDTUlTX1ZFUlNJT04sIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICAvLyBoYW5kbGUgR0VUIHJlcXVlc3RzCi0gICAgICAgIGlmIChyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiR0VUIikpIHsKLSAgICAgICAgICAgIFVybEJ1aWxkZXIgYmFzZVVybCA9IGNvbXBpbGVCYXNlVXJsKHJlcXVlc3QsIHJlc3BvbnNlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZG9jID0gZG9jcy5nZXQocXVlcnlTdHJpbmcudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRYbWwocmVxdWVzdCwgcmVzcG9uc2UsIGRvYywgYmFzZVVybCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaW50UGFnZShyZXF1ZXN0LCByZXNwb25zZSwgYmFzZVVybCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgb3RoZXIgbm9uLVBPU1QgcmVxdWVzdHMKLSAgICAgICAgaWYgKCFyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiUE9TVCIpKSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKHJlcXVlc3QsIHJlc3BvbnNlLCAiTm90IGEgSFRUUCBQT1NUIHJlcXVlc3QuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoYW5kbGUgUE9TVCByZXF1ZXN0cwotICAgICAgICBQcm90ZWN0aW9uUmVxdWVzdFdyYXBwZXIgcmVxdWVzdFdyYXBwZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXIgPSBuZXcgUHJvdGVjdGlvblJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIE1BWF9TT0FQX1NJWkUpOwotICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IocmVxdWVzdCwgcmVzcG9uc2UsICJUaGUgcmVxdWVzdCBpcyBub3QgTVRPTSBlbmNvZGVkLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuc2VydmljZShyZXF1ZXN0V3JhcHBlciwgcmVzcG9uc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludFhtbChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGRvYywgVXJsQnVpbGRlciBiYXNlVXJsKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoSU9VdGlscy5VVEY4KTsKLQotICAgICAgICBTdHJpbmcgcmVzcERvYyA9IGRvYzsKLSAgICAgICAgcmVzcERvYyA9IEJBU0VfUEFUVEVSTi5tYXRjaGVyKHJlc3BEb2MpLnJlcGxhY2VBbGwoYmFzZVVybC50b1N0cmluZygpKTsKLSAgICAgICAgcmVzcERvYyA9IENPUkVfUEFUVEVSTi5tYXRjaGVyKHJlc3BEb2MpLnJlcGxhY2VBbGwoCi0gICAgICAgICAgICAgICAgKG5ldyBVcmxCdWlsZGVyKGJhc2VVcmwpKS5hZGRQYXRoKCJjbWlzIikuYWRkUGFyYW1ldGVyKCJjb3JlIikudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJlc3BEb2MgPSBNU0dfUEFUVEVSTi5tYXRjaGVyKHJlc3BEb2MpLnJlcGxhY2VBbGwoCi0gICAgICAgICAgICAgICAgKG5ldyBVcmxCdWlsZGVyKGJhc2VVcmwpKS5hZGRQYXRoKCJjbWlzIikuYWRkUGFyYW1ldGVyKCJtc2ciKS50b1N0cmluZygpKTsKLQotICAgICAgICBQcmludFdyaXRlciBwdyA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotICAgICAgICBwdy5wcmludChyZXNwRG9jKTsKLSAgICAgICAgcHcuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRQYWdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBVcmxCdWlsZGVyIGJhc2VVcmwpCi0gICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7Ci0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoSU9VdGlscy5VVEY4KTsKLQotICAgICAgICBTdHJpbmcgdXJsRXNjYXBlZCA9IFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZUh0bWwoKG5ldyBVcmxCdWlsZGVyKGJhc2VVcmwpKS5hZGRQYXRoKCJjbWlzIikuYWRkUGFyYW1ldGVyKCJ3c2RsIikKLSAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKLQotICAgICAgICBwdy5wcmludCgiPGh0bWw+PGhlYWQ+PHRpdGxlPkFwYWNoZSBDaGVtaXN0cnkgT3BlbkNNSVMgLSBDTUlTICIKLSAgICAgICAgICAgICAgICArIGNtaXNWZXJzaW9uLnZhbHVlKCkKLSAgICAgICAgICAgICAgICArICIgV2ViIFNlcnZpY2VzPC90aXRsZT4iCi0gICAgICAgICAgICAgICAgKyAiPHN0eWxlPjwhLS1IMSB7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6bm9ybWFsO2ZvbnQtd2VpZ2h0OmJvbGQ7YmFja2dyb3VuZC1jb2xvcjojZjBmMGYwO2NvbG9yOiMwMDMzNjY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzNjNzhiNTtwYWRkaW5nOjJweDt9ICIKLSAgICAgICAgICAgICAgICArICJCT0RZIHtmb250LWZhbWlseTpWZXJkYW5hLGFyaWFsLHNhbnMtc2VyaWY7Y29sb3I6YmxhY2s7Zm9udC1zaXplOjE0cHg7fSAiCi0gICAgICAgICAgICAgICAgKyAiSFIge2NvbG9yOiMzYzc4YjU7aGVpZ2h0OjFweDt9LS0+PC9zdHlsZT48L2hlYWQ+PGJvZHk+Iik7Ci0gICAgICAgIHB3LnByaW50KCI8aDE+Q01JUyAiICsgY21pc1ZlcnNpb24udmFsdWUoKSArICIgV2ViIFNlcnZpY2VzPC9oMT4iKTsKLSAgICAgICAgcHcucHJpbnQoIjxwPkNNSVMgV1NETCBmb3IgYWxsIHNlcnZpY2VzOiA8YSBocmVmPVwiIiArIHVybEVzY2FwZWQgKyAiXCI+IiArIHVybEVzY2FwZWQgKyAiPC9hPjwvcD4iKTsKLQotICAgICAgICBwdy5wcmludCgiPC9odG1sPjwvYm9keT4iKTsKLSAgICAgICAgcHcuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRFcnJvcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoSU9VdGlscy5VVEY4KTsKLQotICAgICAgICBQcmludFdyaXRlciBwdyA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlRXNjYXBlZCA9IFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZVhtbChtZXNzYWdlKTsKLQotICAgICAgICBwdy5wcmludGxuKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PiIpOwotICAgICAgICBwdy5wcmludGxuKCI8UzpFbnZlbG9wZSB4bWxuczpTPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPFM6Qm9keT4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPFM6RmF1bHQ+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjxmYXVsdGNvZGU+UzpDbGllbnQ8L2ZhdWx0Y29kZT4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPGZhdWx0c3RyaW5nPiIgKyBtZXNzYWdlRXNjYXBlZCArICI8L2ZhdWx0c3RyaW5nPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8ZGV0YWlsPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8Y21pc0ZhdWx0IHhtbG5zPVwiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9tZXNzYWdpbmcvMjAwOTA4L1wiPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8dHlwZT5ydW50aW1lPC90eXBlPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8Y29kZT4wPC9jb2RlPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8bWVzc2FnZT4iICsgbWVzc2FnZUVzY2FwZWQgKyAiPC9tZXNzYWdlPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8L2NtaXNGYXVsdD4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPC9kZXRhaWw+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjwvUzpGYXVsdD4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPC9TOkJvZHk+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjwvUzpFbnZlbG9wZT4iKTsKLQotICAgICAgICBwdy5mbHVzaCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgVXJsQnVpbGRlciBjb21waWxlQmFzZVVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgewotICAgICAgICBVcmxCdWlsZGVyIHJlc3VsdDsKLQotICAgICAgICBTdHJpbmcgYmFzZVVybCA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKERpc3BhdGNoZXIuQkFTRV9VUkxfQVRUUklCVVRFKTsKLSAgICAgICAgaWYgKGJhc2VVcmwgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFVybEJ1aWxkZXIoYmFzZVVybCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgVXJsQnVpbGRlcihyZXF1ZXN0LmdldFNjaGVtZSgpLCByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSwgcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCksIG51bGwpOwotICAgICAgICAgICAgcmVzdWx0LmFkZFBhdGgocmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRQYXRoKHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBXU1NlcnZsZXREZWxlZ2F0ZSBnZXREZWxlZ2F0ZShTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWcpIHsKLSAgICAgICAgV1NTZXJ2bGV0RGVsZWdhdGUgZGVsZWdhdGUgPSBzdXBlci5nZXREZWxlZ2F0ZShzZXJ2bGV0Q29uZmlnKTsKLQotICAgICAgICAvLyBzZXQgdGVtcCBkaXJlY3RvcnkgYW5kIHRoZSB0aHJlc2hvbGQgZm9yIGFsbCBzZXJ2aWNlcyB3aXRoIGEKLSAgICAgICAgLy8gU3RyZWFtaW5nQXR0YWNobWVudCBhbm5vdGF0aW9uCi0gICAgICAgIGlmIChkZWxlZ2F0ZS5hZGFwdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIENtaXNTZXJ2aWNlIGZhY3RvcnkKLSAgICAgICAgICAgIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5ID0gKENtaXNTZXJ2aWNlRmFjdG9yeSkgZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIENtaXNSZXBvc2l0b3J5Q29udGV4dExpc3RlbmVyLlNFUlZJQ0VTX0ZBQ1RPUlkpOwotCi0gICAgICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJTZXJ2aWNlIGZhY3Rvcnkgbm90IGF2YWlsYWJsZSEgQ29uZmlndXJhdGlvbiBwcm9ibGVtPyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBpdGVyYXRlIG9mIGFsbCBhZGFwdGVycwotICAgICAgICAgICAgZm9yIChTZXJ2bGV0QWRhcHRlciBhZGFwdGVyIDogZGVsZWdhdGUuYWRhcHRlcnMpIHsKLSAgICAgICAgICAgICAgICBXU0ZlYXR1cmVMaXN0IHdzZmwgPSBhZGFwdGVyLmdldEVuZHBvaW50KCkuZ2V0QmluZGluZygpLmdldEZlYXR1cmVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChXZWJTZXJ2aWNlRmVhdHVyZSBmdCA6IHdzZmwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ0IGluc3RhbmNlb2YgU3RyZWFtaW5nQXR0YWNobWVudEZlYXR1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyZWFtaW5nQXR0YWNobWVudEZlYXR1cmUpIGZ0KS5zZXREaXIoZmFjdG9yeS5nZXRUZW1wRGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWVtb3J5VGhyZXNob2xkKGZhY3RvcnksIChTdHJlYW1pbmdBdHRhY2htZW50RmVhdHVyZSkgZnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRNZW1vcnlUaHJlc2hvbGQoQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3RvcnksIFN0cmVhbWluZ0F0dGFjaG1lbnRGZWF0dXJlIGZ0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBKQVgtV1MgUkkgMi4xCi0gICAgICAgICAgICBmdC5zZXRNZW1vcnlUaHJlc2hvbGQoZmFjdG9yeS5nZXRNZW1vcnlUaHJlc2hvbGQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGUpIHsKLSAgICAgICAgICAgIC8vIEpBWC1XUyBSSSAyLjIKLSAgICAgICAgICAgIC8vIHNlZSBDTUlTLTYyNgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXRob2QgbSA9IGZ0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRNZW1vcnlUaHJlc2hvbGQiLCBsb25nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBtLmludm9rZShmdCwgKGxvbmcpIGZhY3RvcnkuZ2V0TWVtb3J5VGhyZXNob2xkKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oIkNvdWxkIG5vdCBzZXQgbWVtb3J5IHRocmVzaG9sZCBmb3Igc3RyZWFtaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9EaXNjb3ZlcnlTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9EaXNjb3ZlcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OGU1NDYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvd2Vic2VydmljZXMvRGlzY292ZXJ5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnRIb2xkZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5zZXRIb2xkZXJWYWx1ZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4dGVuc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc09iamVjdExpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkRpc2NvdmVyeVNlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotLyoqCi0gKiBDTUlTIERpc2NvdmVyeSBTZXJ2aWNlLgotICovCi1ATVRPTQotQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRGlzY292ZXJ5U2VydmljZVBvcnQiKQotcHVibGljIGNsYXNzIERpc2NvdmVyeVNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UgaW1wbGVtZW50cyBEaXNjb3ZlcnlTZXJ2aWNlUG9ydCB7Ci0gICAgQFJlc291cmNlCi0gICAgcHVibGljIFdlYlNlcnZpY2VDb250ZXh0IHdzQ29udGV4dDsKLQotICAgIHB1YmxpYyB2b2lkIGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEJpZ0ludGVnZXIgbWF4SXRlbXMsCi0gICAgICAgICAgICBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24sIEhvbGRlcjxDbWlzT2JqZWN0TGlzdFR5cGU+IG9iamVjdHMpIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24od3NDb250ZXh0KTsKLQotICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyPFN0cmluZz4gY2hhbmdlTG9nVG9rZW5Ib2xkZXIgPSBjb252ZXJ0SG9sZGVyKGNoYW5nZUxvZ1Rva2VuKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RMaXN0IGNoYW5nZXNMaXN0ID0gc2VydmljZS5nZXRDb250ZW50Q2hhbmdlcyhyZXBvc2l0b3J5SWQsIGNoYW5nZUxvZ1Rva2VuSG9sZGVyLCBpbmNsdWRlUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBtYXhJdGVtcywgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvYmplY3RzLnZhbHVlID0gY29udmVydChjaGFuZ2VzTGlzdCwgY21pc1ZlcnNpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRIb2xkZXJWYWx1ZShjaGFuZ2VMb2dUb2tlbkhvbGRlciwgY2hhbmdlTG9nVG9rZW4pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0TGlzdFR5cGUgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24od3NDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdExpc3Qgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UucXVlcnkocmVwb3NpdG9yeUlkLCBzdGF0ZW1lbnQsIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgY29udmVydChJbmNsdWRlUmVsYXRpb25zaGlwcy5jbGFzcywgaW5jbHVkZVJlbGF0aW9uc2hpcHMpLAotICAgICAgICAgICAgICAgICAgICByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHNlcnZpY2VSZXN1bHQsIGNtaXNWZXJzaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9NdWx0aUZpbGluZ1NlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL011bHRpRmlsaW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RkZGY5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL011bHRpRmlsaW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0RXh0ZW5zaW9uSG9sZGVyOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuc2V0RXh0ZW5zaW9uVmFsdWVzOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4dGVuc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuTXVsdGlGaWxpbmdTZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotLyoqCi0gKiBDTUlTIE11bHRpRmlsaW5nIFNlcnZpY2UuCi0gKi8KLUBNVE9NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5NdWx0aUZpbGluZ1NlcnZpY2VQb3J0IikKLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGluZ1NlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UgaW1wbGVtZW50cyBNdWx0aUZpbGluZ1NlcnZpY2VQb3J0IHsKLSAgICBAUmVzb3VyY2UKLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0OwotCi0gICAgcHVibGljIHZvaWQgYWRkT2JqZWN0VG9Gb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBIb2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IGV4dGVuc2lvbikgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmFkZE9iamVjdFRvRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBhbGxWZXJzaW9ucywgZXh0RGF0YSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMoZXh0RGF0YSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RGcm9tRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dERhdGEgPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhleHREYXRhLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9OYXZpZ2F0aW9uU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmEzOWFhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL05hdmlnYXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXh0ZW5zaW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RMaXN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0UGFyZW50c1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc09iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk5hdmlnYXRpb25TZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotLyoqCi0gKiBDTUlTIE5hdmlnYXRpb24gU2VydmljZS4KLSAqLwotQE1UT00KLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk5hdmlnYXRpb25TZXJ2aWNlUG9ydCIpCi1wdWJsaWMgY2xhc3MgTmF2aWdhdGlvblNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UgaW1wbGVtZW50cyBOYXZpZ2F0aW9uU2VydmljZVBvcnQgewotICAgIEBSZXNvdXJjZQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdExpc3RUeXBlIGdldENoZWNrZWRPdXREb2NzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHdzQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RMaXN0IHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldENoZWNrZWRPdXREb2NzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGNvbnZlcnQoSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKSwKLSAgICAgICAgICAgICAgICAgICAgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChzZXJ2aWNlUmVzdWx0LCBjbWlzVmVyc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3RJbkZvbGRlckxpc3RUeXBlIGdldENoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikKLSAgICAgICAgICAgIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24od3NDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRDaGlsZHJlbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIG9yZGVyQnksCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBjb252ZXJ0KEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksCi0gICAgICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBtYXhJdGVtcywgc2tpcENvdW50LCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChzZXJ2aWNlUmVzdWx0LCBjbWlzVmVyc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZT4gZ2V0RGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgY21pc1ZlcnNpb24gPSBnZXRDbWlzVmVyc2lvbih3c0NvbnRleHQpOwotCi0gICAgICAgICAgICBMaXN0PENtaXNPYmplY3RJbkZvbGRlckNvbnRhaW5lclR5cGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q21pc09iamVjdEluRm9sZGVyQ29udGFpbmVyVHlwZT4oKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldERlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBjb252ZXJ0KEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksCi0gICAgICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2VydmljZVJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckNvbnRhaW5lciBjb250YWluZXIgOiBzZXJ2aWNlUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udmVydChjb250YWluZXIsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0VHlwZSBnZXRGb2xkZXJQYXJlbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHdzQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldEZvbGRlclBhcmVudChyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHNlcnZpY2VSZXN1bHQsIGNtaXNWZXJzaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlPiBnZXRGb2xkZXJUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24od3NDb250ZXh0KTsKLQotICAgICAgICAgICAgTGlzdDxDbWlzT2JqZWN0SW5Gb2xkZXJDb250YWluZXJUeXBlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENtaXNPYmplY3RJbkZvbGRlckNvbnRhaW5lclR5cGU+KCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRGb2xkZXJUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBjb252ZXJ0KEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksCi0gICAgICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2VydmljZVJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckNvbnRhaW5lciBjb250YWluZXIgOiBzZXJ2aWNlUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udmVydChjb250YWluZXIsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNPYmplY3RQYXJlbnRzVHlwZT4gZ2V0T2JqZWN0UGFyZW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24od3NDb250ZXh0KTsKLQotICAgICAgICAgICAgTGlzdDxDbWlzT2JqZWN0UGFyZW50c1R5cGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q21pc09iamVjdFBhcmVudHNUeXBlPigpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRPYmplY3RQYXJlbnRzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGNvbnZlcnQoSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKSwKLSAgICAgICAgICAgICAgICAgICAgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlcnZpY2VSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0UGFyZW50RGF0YSBwYXJlbnQgOiBzZXJ2aWNlUmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY29udmVydChwYXJlbnQsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL09iamVjdFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL09iamVjdFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiOTQyNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9PYmplY3RTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jbG9zZVN0cmVhbTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0RXh0ZW5zaW9uSG9sZGVyOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEV4dGVuc2lvblZhbHVlczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEhvbGRlclZhbHVlOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQWxsb3dhYmxlQWN0aW9uc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0J1bGtVcGRhdGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNDb250ZW50U3RyZWFtVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeHRlbnNpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydGllc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1JlbmRpdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRGVsZXRlVHJlZVJlc3BvbnNlLkZhaWxlZFRvRGVsZXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuT2JqZWN0U2VydmljZVBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC53cy5kZXZlbG9wZXIuU3RyZWFtaW5nQXR0YWNobWVudDsKLQotLyoqCi0gKiBDTUlTIE9iamVjdCBTZXJ2aWNlLgotICovCi1ATVRPTQotQFN0cmVhbWluZ0F0dGFjaG1lbnQocGFyc2VFYWdlcmx5ID0gZmFsc2UsIG1lbW9yeVRocmVzaG9sZCA9IDQgKiAxMDI0ICogMTIwNCkKLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk9iamVjdFNlcnZpY2VQb3J0IikKLXB1YmxpYyBjbGFzcyBPYmplY3RTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlIGltcGxlbWVudHMgT2JqZWN0U2VydmljZVBvcnQgewotICAgIEBSZXNvdXJjZQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVEb2N1bWVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBDbWlzUHJvcGVydGllc1R5cGUgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ21pc0NvbnRlbnRTdHJlYW1UeXBlIGNvbnRlbnRTdHJlYW0sIEVudW1WZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBDbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIGFkZEFjZXMsIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCkgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgaWQgPSBzZXJ2aWNlLmNyZWF0ZURvY3VtZW50KHJlcG9zaXRvcnlJZCwgY29udmVydChwcm9wZXJ0aWVzKSwgZm9sZGVySWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoY29udGVudFN0cmVhbSwgZmFsc2UpLCBjb252ZXJ0KFZlcnNpb25pbmdTdGF0ZS5jbGFzcywgdmVyc2lvbmluZ1N0YXRlKSwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoYWRkQWNlcywgbnVsbCksIGNvbnZlcnQocmVtb3ZlQWNlcywgbnVsbCksIGV4dERhdGEpOwotCi0gICAgICAgICAgICBjbG9zZVN0cmVhbShjb250ZW50U3RyZWFtKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SWQudmFsdWUgPSBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBzb3VyY2VJZCwgQ21pc1Byb3BlcnRpZXNUeXBlIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIEVudW1WZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBDbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIGFkZEFjZXMsIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCkgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgaWQgPSBzZXJ2aWNlLmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShyZXBvc2l0b3J5SWQsIHNvdXJjZUlkLCBjb252ZXJ0KHByb3BlcnRpZXMpLCBmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChWZXJzaW9uaW5nU3RhdGUuY2xhc3MsIHZlcnNpb25pbmdTdGF0ZSksIHBvbGljaWVzLCBjb252ZXJ0KGFkZEFjZXMsIG51bGwpLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KHJlbW92ZUFjZXMsIG51bGwpLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SWQudmFsdWUgPSBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIENtaXNQcm9wZXJ0aWVzVHlwZSBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMsIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgYWRkQWNlcywgQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSByZW1vdmVBY2VzLAotICAgICAgICAgICAgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24sIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHREYXRhID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBpZCA9IHNlcnZpY2UuY3JlYXRlRm9sZGVyKHJlcG9zaXRvcnlJZCwgY29udmVydChwcm9wZXJ0aWVzKSwgZm9sZGVySWQsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KGFkZEFjZXMsIG51bGwpLCBjb252ZXJ0KHJlbW92ZUFjZXMsIG51bGwpLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SWQudmFsdWUgPSBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIENtaXNQcm9wZXJ0aWVzVHlwZSBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMsIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgYWRkQWNlcywgQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSByZW1vdmVBY2VzLAotICAgICAgICAgICAgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24sIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHREYXRhID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBpZCA9IHNlcnZpY2UuY3JlYXRlUG9saWN5KHJlcG9zaXRvcnlJZCwgY29udmVydChwcm9wZXJ0aWVzKSwgZm9sZGVySWQsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KGFkZEFjZXMsIG51bGwpLCBjb252ZXJ0KHJlbW92ZUFjZXMsIG51bGwpLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SWQudmFsdWUgPSBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUmVsYXRpb25zaGlwKFN0cmluZyByZXBvc2l0b3J5SWQsIENtaXNQcm9wZXJ0aWVzVHlwZSBwcm9wZXJ0aWVzLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBDbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIGFkZEFjZXMsIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCkgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgaWQgPSBzZXJ2aWNlLmNyZWF0ZVJlbGF0aW9uc2hpcChyZXBvc2l0b3J5SWQsIGNvbnZlcnQocHJvcGVydGllcyksIHBvbGljaWVzLCBjb252ZXJ0KGFkZEFjZXMsIG51bGwpLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KHJlbW92ZUFjZXMsIG51bGwpLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SWQudmFsdWUgPSBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlSXRlbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBDbWlzUHJvcGVydGllc1R5cGUgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSBhZGRBY2VzLCBDbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBIb2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IGV4dGVuc2lvbiwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQpIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dERhdGEgPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGlkID0gc2VydmljZS5jcmVhdGVJdGVtKHJlcG9zaXRvcnlJZCwgY29udmVydChwcm9wZXJ0aWVzKSwgZm9sZGVySWQsIG51bGwsIGNvbnZlcnQoYWRkQWNlcywgbnVsbCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQocmVtb3ZlQWNlcywgbnVsbCksIGV4dERhdGEpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9iamVjdElkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvYmplY3RJZC52YWx1ZSA9IGlkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMoZXh0RGF0YSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IGNvbnZlcnRIb2xkZXIob2JqZWN0SWQpOwotICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW5Ib2xkZXIgPSBjb252ZXJ0SG9sZGVyKGNoYW5nZVRva2VuKTsKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dERhdGEgPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5kZWxldGVDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKG9iamVjdElkSG9sZGVyLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICBzZXRIb2xkZXJWYWx1ZShjaGFuZ2VUb2tlbkhvbGRlciwgY2hhbmdlVG9rZW4pOwotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHREYXRhID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UuZGVsZXRlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhleHREYXRhLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBGYWlsZWRUb0RlbGV0ZSBkZWxldGVUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEVudW1VbmZpbGVPYmplY3QgdW5maWxlT2JqZWN0cywgQm9vbGVhbiBjb250aW51ZU9uRmFpbHVyZSwgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZhaWxlZFRvRGVsZXRlRGF0YSBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5kZWxldGVUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KFVuZmlsZU9iamVjdC5jbGFzcywgdW5maWxlT2JqZWN0cyksIGNvbnRpbnVlT25GYWlsdXJlLCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChzZXJ2aWNlUmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc0FsbG93YWJsZUFjdGlvbnNUeXBlIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLAotICAgICAgICAgICAgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHdzQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbGxvd2FibGVBY3Rpb25zIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldEFsbG93YWJsZUFjdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoc2VydmljZVJlc3VsdCwgY21pc1ZlcnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzQ29udGVudFN0cmVhbVR5cGUgZ2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgb2Zmc2V0LCBCaWdJbnRlZ2VyIGxlbmd0aCwgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHN0cmVhbUlkLCBvZmZzZXQsIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoc2VydmljZVJlc3VsdCwgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3RUeXBlIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFjbCwgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHdzQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldE9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0KEluY2x1ZGVSZWxhdGlvbnNoaXBzLmNsYXNzLCBpbmNsdWRlUmVsYXRpb25zaGlwcyksIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFjbCwgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoc2VydmljZVJlc3VsdCwgY21pc1ZlcnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0VHlwZSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFbnVtSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFjbCwgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHdzQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldE9iamVjdEJ5UGF0aChyZXBvc2l0b3J5SWQsIHBhdGgsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnQoSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKSwgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWNsLCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChzZXJ2aWNlUmVzdWx0LCBjbWlzVmVyc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNQcm9wZXJ0aWVzVHlwZSBnZXRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFByb3BlcnRpZXMgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0UHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHNlcnZpY2VSZXN1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNSZW5kaXRpb25UeXBlPiBnZXRSZW5kaXRpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIExpc3Q8Q21pc1JlbmRpdGlvblR5cGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q21pc1JlbmRpdGlvblR5cGU+KCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IHJlbmRpdGlvbkxpc3QgPSBzZXJ2aWNlLmdldFJlbmRpdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgICAgICAgICBtYXhJdGVtcywgc2tpcENvdW50LCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVuZGl0aW9uTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSZW5kaXRpb25EYXRhIHJlbmRpdGlvbiA6IHJlbmRpdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjb252ZXJ0KHJlbmRpdGlvbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBTdHJpbmcgdGFyZ2V0Rm9sZGVySWQsIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IGNvbnZlcnRIb2xkZXIob2JqZWN0SWQpOwotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLm1vdmVPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZEhvbGRlciwgdGFyZ2V0Rm9sZGVySWQsIHNvdXJjZUZvbGRlcklkLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKG9iamVjdElkSG9sZGVyLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMoZXh0RGF0YSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ21pc0NvbnRlbnRTdHJlYW1UeXBlIGNvbnRlbnRTdHJlYW0sIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyPFN0cmluZz4gb2JqZWN0SWRIb2xkZXIgPSBjb252ZXJ0SG9sZGVyKG9iamVjdElkKTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuSG9sZGVyID0gY29udmVydEhvbGRlcihjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHREYXRhID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkSG9sZGVyLCBvdmVyd3JpdGVGbGFnLCBjaGFuZ2VUb2tlbkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydChjb250ZW50U3RyZWFtLCBmYWxzZSksIGV4dERhdGEpOwotCi0gICAgICAgICAgICBjbG9zZVN0cmVhbShjb250ZW50U3RyZWFtKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKG9iamVjdElkSG9sZGVyLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICBzZXRIb2xkZXJWYWx1ZShjaGFuZ2VUb2tlbkhvbGRlciwgY2hhbmdlVG9rZW4pOwotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBpc0xhc3RDaHVuaywKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDbWlzQ29udGVudFN0cmVhbVR5cGUgY29udGVudFN0cmVhbSwgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IGNvbnZlcnRIb2xkZXIob2JqZWN0SWQpOwotICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW5Ib2xkZXIgPSBjb252ZXJ0SG9sZGVyKGNoYW5nZVRva2VuKTsKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dERhdGEgPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5hcHBlbmRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLCBjb252ZXJ0KGNvbnRlbnRTdHJlYW0sIHRydWUpLAotICAgICAgICAgICAgICAgICAgICBpc0xhc3RDaHVuaywgZXh0RGF0YSk7Ci0KLSAgICAgICAgICAgIGNsb3NlU3RyZWFtKGNvbnRlbnRTdHJlYW0pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUob2JqZWN0SWRIb2xkZXIsIG9iamVjdElkKTsKLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKGNoYW5nZVRva2VuSG9sZGVyLCBjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMoZXh0RGF0YSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIENtaXNQcm9wZXJ0aWVzVHlwZSBwcm9wZXJ0aWVzLCBIb2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IGV4dGVuc2lvbikgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyPFN0cmluZz4gb2JqZWN0SWRIb2xkZXIgPSBjb252ZXJ0SG9sZGVyKG9iamVjdElkKTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuSG9sZGVyID0gY29udmVydEhvbGRlcihjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHREYXRhID0gY29udmVydEV4dGVuc2lvbkhvbGRlcihleHRlbnNpb24pOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcnZpY2UudXBkYXRlUHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkSG9sZGVyLCBjaGFuZ2VUb2tlbkhvbGRlciwgY29udmVydChwcm9wZXJ0aWVzKSwgZXh0RGF0YSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRIb2xkZXJWYWx1ZShvYmplY3RJZEhvbGRlciwgb2JqZWN0SWQpOwotICAgICAgICAgICAgc2V0SG9sZGVyVmFsdWUoY2hhbmdlVG9rZW5Ib2xkZXIsIGNoYW5nZVRva2VuKTsKLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhleHREYXRhLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1bGtVcGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIENtaXNCdWxrVXBkYXRlVHlwZSBidWxrVXBkYXRlRGF0YSwKLSAgICAgICAgICAgIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uLCBIb2xkZXI8Q21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlPiBvYmplY3RJZEFuZENoYW5nZVRva2VuKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gb2JqZWN0SWRzQW5kQ2hhbmdlVG9rZW5zID0gbnVsbDsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG51bGw7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYWRkU2Vjb25kYXJ5VHlwZUlkcyA9IG51bGw7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYnVsa1VwZGF0ZURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghYnVsa1VwZGF0ZURhdGEuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RJZHNBbmRDaGFuZ2VUb2tlbnMgPSBuZXcgQXJyYXlMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZSBpZEFuZFRva2VuIDogYnVsa1VwZGF0ZURhdGEuZ2V0T2JqZWN0SWRBbmRDaGFuZ2VUb2tlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RJZHNBbmRDaGFuZ2VUb2tlbnMuYWRkKGNvbnZlcnQoaWRBbmRUb2tlbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBjb252ZXJ0KGJ1bGtVcGRhdGVEYXRhLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFidWxrVXBkYXRlRGF0YS5nZXRBZGRTZWNvbmRhcnlUeXBlSWRzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFNlY29uZGFyeVR5cGVJZHMgPSBidWxrVXBkYXRlRGF0YS5nZXRBZGRTZWNvbmRhcnlUeXBlSWRzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghYnVsa1VwZGF0ZURhdGEuZ2V0UmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVTZWNvbmRhcnlUeXBlSWRzID0gYnVsa1VwZGF0ZURhdGEuZ2V0UmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiByZXN1bHQgPSBzZXJ2aWNlLmJ1bGtVcGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWRzQW5kQ2hhbmdlVG9rZW5zLCBwcm9wZXJ0aWVzLCBhZGRTZWNvbmRhcnlUeXBlSWRzLCByZW1vdmVTZWNvbmRhcnlUeXBlSWRzLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmplY3RJZEFuZENoYW5nZVRva2VuICE9IG51bGwgJiYgcmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgd29ya2Fyb3VuZAotICAgICAgICAgICAgICAgIC8vIHNlZTogaHR0cHM6Ly90b29scy5vYXNpcy1vcGVuLm9yZy9pc3N1ZXMvYnJvd3NlL0NNSVMtNzU0Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhleHREYXRhLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL09iamVjdFNlcnZpY2UxMC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvd2Vic2VydmljZXMvT2JqZWN0U2VydmljZTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWJjY2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvd2Vic2VydmljZXMvT2JqZWN0U2VydmljZTEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOwotCi1pbXBvcnQgY29tLnN1bi54bWwud3MuZGV2ZWxvcGVyLlN0cmVhbWluZ0F0dGFjaG1lbnQ7Ci0KLS8qKgotICogQ01JUyAxLjAgT2JqZWN0IFNlcnZpY2UuIEV4Y2x1ZGVzIENNSVMgMS4xIG9wZXJhdGlvbnMuCi0gKi8KLUBNVE9NCi1AU3RyZWFtaW5nQXR0YWNobWVudChwYXJzZUVhZ2VybHkgPSBmYWxzZSwgbWVtb3J5VGhyZXNob2xkID0gNCAqIDEwMjQgKiAxMjA0KQotQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXMuT2JqZWN0U2VydmljZVBvcnQxMCIpCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VydmljZTEwIGV4dGVuZHMgT2JqZWN0U2VydmljZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL09iamVjdFNlcnZpY2VQb3J0MTAuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL09iamVjdFNlcnZpY2VQb3J0MTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4N2M2ZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9PYmplY3RTZXJ2aWNlUG9ydDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQnVsa1VwZGF0ZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0NvbnRlbnRTdHJlYW1UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4dGVuc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc09iamVjdElkQW5kQ2hhbmdlVG9rZW5UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNQcm9wZXJ0aWVzVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk9iamVjdFNlcnZpY2VQb3J0OwotCi1AV2ViU2VydmljZShuYW1lID0gIk9iamVjdFNlcnZpY2VQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvd3MvMjAwOTA4LyIpCi1AWG1sU2VlQWxzbyh7IE9iamVjdEZhY3RvcnkuY2xhc3MgfSkKLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0U2VydmljZVBvcnQxMCBleHRlbmRzIE9iamVjdFNlcnZpY2VQb3J0IHsKLQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImNyZWF0ZUl0ZW0iLCBleGNsdWRlID0gdHJ1ZSkKLSAgICB2b2lkIGNyZWF0ZUl0ZW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgQ21pc1Byb3BlcnRpZXNUeXBlIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgYWRkQUNFcywgQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZSByZW1vdmVBQ0VzLAotICAgICAgICAgICAgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24sIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbjsKLQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImJ1bGtVcGRhdGVQcm9wZXJ0aWVzIiwgZXhjbHVkZSA9IHRydWUpCi0gICAgdm9pZCBidWxrVXBkYXRlUHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBDbWlzQnVsa1VwZGF0ZVR5cGUgYnVsa1VwZGF0ZURhdGEsCi0gICAgICAgICAgICBIb2xkZXI8Q21pc0V4dGVuc2lvblR5cGU+IGV4dGVuc2lvbiwgSG9sZGVyPENtaXNPYmplY3RJZEFuZENoYW5nZVRva2VuVHlwZT4gb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbikKLSAgICAgICAgICAgIHRocm93cyBDbWlzRXhjZXB0aW9uOwotCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiYXBwZW5kQ29udGVudFN0cmVhbSIsIGV4Y2x1ZGUgPSB0cnVlKQotICAgIHZvaWQgYXBwZW5kQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBpc0xhc3RDaHVuaywKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDbWlzQ29udGVudFN0cmVhbVR5cGUgY29udGVudFN0cmVhbSwgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ21pc0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1BvbGljeVNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1BvbGljeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhhZTA5OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9Qb2xpY3lTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEV4dGVuc2lvbkhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEV4dGVuc2lvblZhbHVlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeHRlbnNpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNPYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLlBvbGljeVNlcnZpY2VQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotCi0vKioKLSAqIENNSVMgUG9saWN5IFNlcnZpY2UuCi0gKi8KLUBNVE9NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5Qb2xpY3lTZXJ2aWNlUG9ydCIpCi1wdWJsaWMgY2xhc3MgUG9saWN5U2VydmljZSBleHRlbmRzIEFic3RyYWN0U2VydmljZSBpbXBsZW1lbnRzIFBvbGljeVNlcnZpY2VQb3J0IHsKLSAgICBAUmVzb3VyY2UKLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0OwotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmFwcGx5UG9saWN5KHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhleHREYXRhLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNPYmplY3RUeXBlPiBnZXRBcHBsaWVkUG9saWNpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHdzQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PE9iamVjdERhdGE+IHBvbGljaWVzID0gc2VydmljZS5nZXRBcHBsaWVkUG9saWNpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocG9saWNpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PENtaXNPYmplY3RUeXBlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PENtaXNPYmplY3RUeXBlPigpOwotICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IHBvbGljaWVzKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjb252ZXJ0KG9iamVjdCwgY21pc1ZlcnNpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLnJlbW92ZVBvbGljeShyZXBvc2l0b3J5SWQsIHBvbGljeUlkLCBvYmplY3RJZCwgZXh0RGF0YSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMoZXh0RGF0YSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9Qcm90ZWN0aW9uUmVxdWVzdFdyYXBwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1Byb3RlY3Rpb25SZXF1ZXN0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQyNjNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1Byb3RlY3Rpb25SZXF1ZXN0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldElucHV0U3RyZWFtOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZUhlbHBlcjsKLQotLyoqCi0gKiBUaGlzIHJlcXVlc3Qgd3JhcHBlciBjaGVja3MgaWYgdGhlIHJlcXVlc3QgaXMgYSBtdWx0aXBhcnQgcmVxdWVzdCAocmVxdWlyZWQKLSAqIGJ5IE1UT00pIGFuZCBjaGVja3MgaWYgdGhlIGZpcnN0IHBhcnQgaXMgbm90IGJpZ2dlciB0aGFuIHRoZSBwcm92aWRlIG1heAotICogc2l6ZS4gVGhpcyBwcm90ZWN0cyB0aGUgV2ViIFNlcnZpY2VzIGVuZHBvaW50IGZyb20gb3ZlcnNpemVkIFhNTCBhdHRhY2tzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvdGVjdGlvblJlcXVlc3RXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQQVJUID0gIm11bHRpcGFydC8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ1IgPSAweDBEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAweDBBOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgREFTSCA9IDB4MkQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtZXNzYWdlTWF4OwotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gb3JnU3RyZWFtOwotICAgIHByaXZhdGUgZmluYWwgU2VydmxldElucHV0U3RyZWFtIGNoZWNrZWRTdHJlYW07Ci0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYm91bmRhcnk7Ci0KLSAgICBwdWJsaWMgUHJvdGVjdGlvblJlcXVlc3RXcmFwcGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBpbnQgbWF4KSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHJlcXVlc3QpOwotCi0gICAgICAgIC8vIGNoZWNrIG11bHRpcGFydAotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8ICFjb250ZW50VHlwZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkuc3RhcnRzV2l0aChNVUxUSVBBUlQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiSW52YWxpZCBtdWx0aXBhcnQgcmVxdWVzdCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCBib3VuZGFyeQotICAgICAgICBib3VuZGFyeSA9IE1pbWVIZWxwZXIuZ2V0Qm91bmRhcnlGcm9tTXVsdGlQYXJ0KGNvbnRlbnRUeXBlKTsKLSAgICAgICAgaWYgKGJvdW5kYXJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJJbnZhbGlkIG11bHRpcGFydCByZXF1ZXN0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHVwIGNoZWNrZWQgc3RyZWFtCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXNzYWdlTWF4ID0gbWF4OwotICAgICAgICAgICAgb3JnU3RyZWFtID0gc3VwZXIuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGNoZWNrZWRTdHJlYW0gPSBuZXcgQ2hlY2tTZXJ2bGV0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNoZWNrZWRTdHJlYW07Ci0gICAgfQotCi0gICAgY2xhc3MgQ2hlY2tTZXJ2bGV0SW5wdXRTdHJlYW0gZXh0ZW5kcyBTZXJ2bGV0SW5wdXRTdHJlYW0gewotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IHN0cmVhbU1heDsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gbGluZWJ1ZmZlcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9zOwotICAgICAgICBwcml2YXRlIGludCBjb3VudDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYm91bmRhcmllc0ZvdW5kOwotCi0gICAgICAgIHB1YmxpYyBDaGVja1NlcnZsZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHN0cmVhbU1heCA9IG1lc3NhZ2VNYXggKyAyICogKGJvdW5kYXJ5Lmxlbmd0aCArIDYpOwotICAgICAgICAgICAgbGluZWJ1ZmZlciA9IG5ldyBieXRlWzMyICogMTAyNF07Ci0gICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgYm91bmRhcmllc0ZvdW5kID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBvcmdTdHJlYW0uYXZhaWxhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGludCBiID0gb3JnU3RyZWFtLnJlYWQoKTsKLQotICAgICAgICAgICAgaWYgKGJvdW5kYXJpZXNGb3VuZCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFRvTGluZUJ1ZmZlcigoYnl0ZSkgYik7Ci0KLSAgICAgICAgICAgIHJldHVybiBiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiByZWFkKGIsIDAsIGIubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHIgPSBvcmdTdHJlYW0ucmVhZChiLCBvZmYsIGxlbik7Ci0KLSAgICAgICAgICAgIGlmIChib3VuZGFyaWVzRm91bmQgPT0gMikgewotICAgICAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRUb0xpbmVCdWZmZXIoYiwgb2ZmLCByKTsKLQotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZWFkKG5ldyBieXRlWyhuID4gOCAqIDEwMjQgPyA4ICogMTAyNCA6IChpbnQpIG4pXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgb3JnU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tCb3VuZGFyeShpbnQgc3RhcnRQb3MpIHsKLSAgICAgICAgICAgIGludCBsYXN0TGluZUZlZWQgPSAtMTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydFBvczsgaSA8IHBvczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVidWZmZXJbaV0gPT0gTEYpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50Qm91bmRhcmllcyhpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lRmVlZCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGFzdExpbmVGZWVkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+IGJvdW5kYXJ5Lmxlbmd0aCArIDMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIGlzIGJpZ2dlciB0aGFuIHRoZSBib3VuZGFyeSBhbmQgZG9lc24ndCBjb250YWluIGEKLSAgICAgICAgICAgICAgICAgICAgLy8gTEYgLT4gb25seSBrZWVwIHRoZSBsZW5ndGggb2YgdGhlIGJvdW5kYXJ5IHBsdXMgdGhyZWUKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hhcmFjdGVycyAodHdvIGRhc2hlcyBhbmQgYSBDUikKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShsaW5lYnVmZmVyLCBwb3MgLSAoYm91bmRhcnkubGVuZ3RoICsgMyksIGxpbmVidWZmZXIsIDAsIGJvdW5kYXJ5Lmxlbmd0aCArIDMpOwotICAgICAgICAgICAgICAgICAgICBwb3MgPSBib3VuZGFyeS5sZW5ndGggKyAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RMaW5lRmVlZCA9PSBwb3MgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGxhc3QgYnl0ZSBpcyBhIExGIC0+IGRpc2NhcmQgdGhlIHdob2xlIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICBwb3MgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkga2VlcCBieXRlcyBhZnRlciB0aGUgbGFzdCBMRgotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGxpbmVidWZmZXIsIGxhc3RMaW5lRmVlZCArIDEsIGxpbmVidWZmZXIsIDAsIHBvcyAtIChsYXN0TGluZUZlZWQgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IHBvcyAtIChsYXN0TGluZUZlZWQgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gY291bnRCb3VuZGFyaWVzKGludCBsaW5lRmVlZFBvcykgewotICAgICAgICAgICAgaWYgKGlzQm91bmRhcnkobGluZUZlZWRQb3MpKSB7Ci0gICAgICAgICAgICAgICAgYm91bmRhcmllc0ZvdW5kKys7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYm91bmRhcmllc0ZvdW5kID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYm91bmRhcnkgYSBzZWNvbmQgdGltZSB3aXRoaW4gdGhlIHNpemUKLSAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgLT4gcmVxdWVzdCBpcyBvaywgbm8gbW9yZSBjaGVja3MgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVidWZmZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJpZXNGb3VuZCA+IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCb3VuZGFyeShpbnQgbGluZUZlZWRQb3MpIHsKLSAgICAgICAgICAgIC8vIGEgYm91bmRhcnkgY29uc2lzdHMgb2YgdHdvIGRhc2hlcywgdGhlIGJvdW5kYXJ5IGFuZCBhIENSCi0gICAgICAgICAgICAvLyAtPiBib3VuZGFyeSBsaW5lIGxlbmd0aCA9PSBib3VuZGFyeSBsZW5ndGggKyB0aHJlZSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBpbnQgc3RhcnRQb3MgPSBsaW5lRmVlZFBvcyAtIChib3VuZGFyeS5sZW5ndGggKyAzKTsKLQotICAgICAgICAgICAgaWYgKHN0YXJ0UG9zID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZWJ1ZmZlcltzdGFydFBvc10gPT0gREFTSCAmJiBsaW5lYnVmZmVyW3N0YXJ0UG9zICsgMV0gPT0gREFTSAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGluZWJ1ZmZlcltsaW5lRmVlZFBvcyAtIDFdID09IENSKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZGFyeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVidWZmZXJbc3RhcnRQb3MgKyBpICsgMl0gIT0gYm91bmRhcnlbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgYnl0ZSB0byB0aGUgbGluZSBidWZmZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgYWRkVG9MaW5lQnVmZmVyKGJ5dGUgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChwb3MgPT0gbGluZWJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBleHBhbmRCdWZmZXIoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxpbmVidWZmZXJbcG9zKytdID0gKGJ5dGUpIGI7Ci0KLSAgICAgICAgICAgIGlmIChiID09IExGKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tCb3VuZGFyeShwb3MgLSAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJvdW5kYXJpZXNGb3VuZCA8IDIpIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IHN0cmVhbU1heCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNPQVAgbWVzc2FnZSB0b28gYmlnISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgYnVmZmVyIHRvIHRoZSBsaW5lIGJ1ZmZlci4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRUb0xpbmVCdWZmZXIoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobGVuIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gPj0gbGluZWJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBleHBhbmRCdWZmZXIobGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGxpbmVidWZmZXIsIHBvcywgbGVuKTsKLSAgICAgICAgICAgIHBvcyArPSBsZW47Ci0KLSAgICAgICAgICAgIGNoZWNrQm91bmRhcnkocG9zIC0gbGVuKTsKLQotICAgICAgICAgICAgaWYgKGJvdW5kYXJpZXNGb3VuZCA8IDIpIHsKLSAgICAgICAgICAgICAgICBjb3VudCArPSBsZW47Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gc3RyZWFtTWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU09BUCBtZXNzYWdlIHRvbyBiaWchIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEV4cGFuZCB0aGUgbGluZSBidWZmZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgZXhwYW5kQnVmZmVyKGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAocG9zICsgbGVuID4gc3RyZWFtTWF4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTT0FQIG1lc3NhZ2UgdG9vIGJpZyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGV4cGFuZCA9IChsZW4gPCAzMiAqIDEwMjQgPyAzMiAqIDEwMjQgOiBsZW4pOwotICAgICAgICAgICAgYnl0ZVtdIG5ld0J1ZmZlciA9IG5ldyBieXRlW2xpbmVidWZmZXIubGVuZ3RoICsgZXhwYW5kXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGluZWJ1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCBwb3MpOwotICAgICAgICAgICAgbGluZWJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1JlbGF0aW9uc2hpcFNlcnZpY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1JlbGF0aW9uc2hpcFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjYWVkNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9SZWxhdGlvbnNoaXBTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4dGVuc2lvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc09iamVjdExpc3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1SZWxhdGlvbnNoaXBEaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuUmVsYXRpb25zaGlwU2VydmljZVBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci0KLS8qKgotICogQ01JUyBSZWxhdGlvbnNoaXAgU2VydmljZS4KLSAqLwotQE1UT00KLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLlJlbGF0aW9uc2hpcFNlcnZpY2VQb3J0IikKLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlIGltcGxlbWVudHMgUmVsYXRpb25zaGlwU2VydmljZVBvcnQgewotICAgIEBSZXNvdXJjZQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgQ21pc09iamVjdExpc3RUeXBlIGdldE9iamVjdFJlbGF0aW9uc2hpcHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsIEVudW1SZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uLCBTdHJpbmcgdHlwZUlkLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsCi0gICAgICAgICAgICBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24od3NDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdExpc3Qgc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsIGNvbnZlcnQoUmVsYXRpb25zaGlwRGlyZWN0aW9uLmNsYXNzLCByZWxhdGlvbnNoaXBEaXJlY3Rpb24pLCB0eXBlSWQsCi0gICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIG1heEl0ZW1zLCBza2lwQ291bnQsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHNlcnZpY2VSZXN1bHQsIGNtaXNWZXJzaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9SZXBvc2l0b3J5U2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvd2Vic2VydmljZXMvUmVwb3NpdG9yeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2ZmEwMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9SZXBvc2l0b3J5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnRFeHRlbnNpb25Ib2xkZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0VHlwZUNvbnRhaW5lckxpc3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5zZXRFeHRlbnNpb25WYWx1ZXM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNFeHRlbnNpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNSZXBvc2l0b3J5RW50cnlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkNtaXNSZXBvc2l0b3J5SW5mb1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVEZWZpbml0aW9uTGlzdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVEZWZpbml0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5SZXBvc2l0b3J5U2VydmljZVBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci0KLS8qKgotICogQ01JUyBSZXBvc2l0b3J5IFNlcnZpY2UuCi0gKi8KLUBNVE9NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5SZXBvc2l0b3J5U2VydmljZVBvcnQiKQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlIGltcGxlbWVudHMgUmVwb3NpdG9yeVNlcnZpY2VQb3J0IHsKLSAgICBAUmVzb3VyY2UKLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0OwotCi0gICAgcHVibGljIExpc3Q8Q21pc1JlcG9zaXRvcnlFbnRyeVR5cGU+IGdldFJlcG9zaXRvcmllcyhDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIG51bGwpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gaW5mb0RhdGFMaXN0ID0gc2VydmljZS5nZXRSZXBvc2l0b3J5SW5mb3MoY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGluZm9EYXRhTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8Q21pc1JlcG9zaXRvcnlFbnRyeVR5cGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q21pc1JlcG9zaXRvcnlFbnRyeVR5cGU+KCk7Ci0gICAgICAgICAgICBmb3IgKFJlcG9zaXRvcnlJbmZvIGluZm9EYXRhIDogaW5mb0RhdGFMaXN0KSB7Ci0gICAgICAgICAgICAgICAgQ21pc1JlcG9zaXRvcnlFbnRyeVR5cGUgZW50cnkgPSBuZXcgQ21pc1JlcG9zaXRvcnlFbnRyeVR5cGUoKTsKLSAgICAgICAgICAgICAgICBlbnRyeS5zZXRSZXBvc2l0b3J5SWQoaW5mb0RhdGEuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZW50cnkuc2V0UmVwb3NpdG9yeU5hbWUoaW5mb0RhdGEuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZW50cnkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzUmVwb3NpdG9yeUluZm9UeXBlIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikKLSAgICAgICAgICAgIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uID0gZ2V0Q21pc1ZlcnNpb24od3NDb250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFJlcG9zaXRvcnlJbmZvIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFJlcG9zaXRvcnlJbmZvKHJlcG9zaXRvcnlJZCwgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoc2VydmljZVJlc3VsdCwgY21pc1ZlcnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzVHlwZURlZmluaXRpb25MaXN0VHlwZSBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIG1heEl0ZW1zLCBza2lwQ291bnQsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHNlcnZpY2VSZXN1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzVHlwZURlZmluaXRpb25UeXBlIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikKLSAgICAgICAgICAgIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS5nZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoc2VydmljZVJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Q21pc1R5cGVDb250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gc2VydmljZVJlc3VsdCA9IHNlcnZpY2UuZ2V0VHlwZURlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8Q21pc1R5cGVDb250YWluZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q21pc1R5cGVDb250YWluZXI+KCk7Ci0gICAgICAgICAgICBjb252ZXJ0VHlwZUNvbnRhaW5lckxpc3Qoc2VydmljZVJlc3VsdCwgcmVzdWx0KTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxDbWlzVHlwZURlZmluaXRpb25UeXBlPiB0eXBlLCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCBjb252ZXJ0KHR5cGUudmFsdWUpLCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHlwZS52YWx1ZSA9IGNvbnZlcnQoc2VydmljZVJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8Q21pc1R5cGVEZWZpbml0aW9uVHlwZT4gdHlwZSwgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBzZXJ2aWNlUmVzdWx0ID0gc2VydmljZS51cGRhdGVUeXBlKHJlcG9zaXRvcnlJZCwgY29udmVydCh0eXBlLnZhbHVlKSwgY29udmVydChleHRlbnNpb24pKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHR5cGUudmFsdWUgPSBjb252ZXJ0KHNlcnZpY2VSZXN1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dERhdGEgPSBjb252ZXJ0RXh0ZW5zaW9uSG9sZGVyKGV4dGVuc2lvbik7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VydmljZS5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHREYXRhKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEV4dGVuc2lvblZhbHVlcyhleHREYXRhLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlMTAuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1MzE4Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9SZXBvc2l0b3J5U2VydmljZTEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOwotCi0vKioKLSAqIENNSVMgMS4wIFJlcG9zaXRvcnkgU2VydmljZS4gRXhjbHVkZXMgQ01JUyAxLjEgb3BlcmF0aW9ucy4KLSAqLwotQE1UT00KLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLlJlcG9zaXRvcnlTZXJ2aWNlUG9ydDEwIikKLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5U2VydmljZTEwIGV4dGVuZHMgUmVwb3NpdG9yeVNlcnZpY2UgaW1wbGVtZW50cyBSZXBvc2l0b3J5U2VydmljZVBvcnQxMCB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlUG9ydDEwLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9SZXBvc2l0b3J5U2VydmljZVBvcnQxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU1ZjdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlUG9ydDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwud2Vic2VydmljZXM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXh0ZW5zaW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzVHlwZURlZmluaXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLk9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuUmVwb3NpdG9yeVNlcnZpY2VQb3J0OwotCi1AV2ViU2VydmljZShuYW1lID0gIlJlcG9zaXRvcnlTZXJ2aWNlUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3dzLzIwMDkwOC8iKQotQFhtbFNlZUFsc28oeyBPYmplY3RGYWN0b3J5LmNsYXNzIH0pCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9zaXRvcnlTZXJ2aWNlUG9ydDEwIGV4dGVuZHMgUmVwb3NpdG9yeVNlcnZpY2VQb3J0IHsKLQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImNyZWF0ZVR5cGUiLCBleGNsdWRlID0gdHJ1ZSkKLSAgICB2b2lkIGNyZWF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPENtaXNUeXBlRGVmaW5pdGlvblR5cGU+IHR5cGUsIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikKLSAgICAgICAgICAgIHRocm93cyBDbWlzRXhjZXB0aW9uOwotCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAidXBkYXRlVHlwZSIsIGV4Y2x1ZGUgPSB0cnVlKQotICAgIHZvaWQgdXBkYXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8Q21pc1R5cGVEZWZpbml0aW9uVHlwZT4gdHlwZSwgQ21pc0V4dGVuc2lvblR5cGUgZXh0ZW5zaW9uKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb247Ci0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJkZWxldGVUeXBlIiwgZXhjbHVkZSA9IHRydWUpCi0gICAgdm9pZCBkZWxldGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKSB0aHJvd3MgQ21pc0V4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1ZlcnNpb25pbmdTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9WZXJzaW9uaW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ2MjMyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL3dlYnNlcnZpY2VzL1ZlcnNpb25pbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jbG9zZVN0cmVhbTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLmNvbnZlcnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlci5jb252ZXJ0RXh0ZW5zaW9uSG9sZGVyOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuV1NDb252ZXJ0ZXIuY29udmVydEhvbGRlcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEV4dGVuc2lvblZhbHVlczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLldTQ29udmVydGVyLnNldEhvbGRlclZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0FjY2Vzc0NvbnRyb2xMaXN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzQ29udGVudFN0cmVhbVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzRXh0ZW5zaW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5DbWlzUHJvcGVydGllc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLlZlcnNpb25pbmdTZXJ2aWNlUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLndzLmRldmVsb3Blci5TdHJlYW1pbmdBdHRhY2htZW50OwotCi0vKioKLSAqIENNSVMgVmVyc2lvbmluZyBTZXJ2aWNlLgotICovCi1ATVRPTQotQFN0cmVhbWluZ0F0dGFjaG1lbnQocGFyc2VFYWdlcmx5ID0gZmFsc2UsIG1lbW9yeVRocmVzaG9sZCA9IDQgKiAxMDI0ICogMTIwNCkKLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLlZlcnNpb25pbmdTZXJ2aWNlUG9ydCIpCi1wdWJsaWMgY2xhc3MgVmVyc2lvbmluZ1NlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2UgaW1wbGVtZW50cyBWZXJzaW9uaW5nU2VydmljZVBvcnQgewotICAgIEBSZXNvdXJjZQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEhvbGRlcjxDbWlzRXh0ZW5zaW9uVHlwZT4gZXh0ZW5zaW9uKQotICAgICAgICAgICAgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmNhbmNlbENoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dERhdGEpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RXh0ZW5zaW9uVmFsdWVzKGV4dERhdGEsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tJbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBtYWpvciwgQ21pc1Byb3BlcnRpZXNUeXBlIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDbWlzQ29udGVudFN0cmVhbVR5cGUgY29udGVudFN0cmVhbSwgU3RyaW5nIGNoZWNraW5Db21tZW50LCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBDbWlzQWNjZXNzQ29udHJvbExpc3RUeXBlIGFkZEFjZXMsIENtaXNBY2Nlc3NDb250cm9sTGlzdFR5cGUgcmVtb3ZlQWNlcywgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI8U3RyaW5nPiBvYmplY3RJZEhvbGRlciA9IGNvbnZlcnRIb2xkZXIob2JqZWN0SWQpOwotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmNoZWNrSW4ocmVwb3NpdG9yeUlkLCBvYmplY3RJZEhvbGRlciwgbWFqb3IsIGNvbnZlcnQocHJvcGVydGllcyksIGNvbnZlcnQoY29udGVudFN0cmVhbSwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICBjaGVja2luQ29tbWVudCwgcG9saWNpZXMsIGNvbnZlcnQoYWRkQWNlcywgbnVsbCksIGNvbnZlcnQocmVtb3ZlQWNlcywgbnVsbCksIGV4dERhdGEpOwotCi0gICAgICAgICAgICBjbG9zZVN0cmVhbShjb250ZW50U3RyZWFtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN0b3BBZnRlclNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKG9iamVjdElkSG9sZGVyLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMoZXh0RGF0YSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPENtaXNFeHRlbnNpb25UeXBlPiBleHRlbnNpb24sCi0gICAgICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCkgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHdzQ29udGV4dCwgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAgICAgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyPFN0cmluZz4gb2JqZWN0SWRIb2xkZXIgPSBjb252ZXJ0SG9sZGVyKG9iamVjdElkKTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkSG9sZGVyID0gbmV3IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjxCb29sZWFuPigpOwotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0RGF0YSA9IGNvbnZlcnRFeHRlbnNpb25Ib2xkZXIoZXh0ZW5zaW9uKTsKLQotICAgICAgICAgICAgaWYgKHN0b3BCZWZvcmVTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXJ2aWNlLmNoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRIb2xkZXIsIGV4dERhdGEsIGNvbnRlbnRDb3BpZWRIb2xkZXIpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbnRlbnRDb3BpZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRDb3BpZWQudmFsdWUgPSBjb250ZW50Q29waWVkSG9sZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldEhvbGRlclZhbHVlKG9iamVjdElkSG9sZGVyLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICBzZXRFeHRlbnNpb25WYWx1ZXMoZXh0RGF0YSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDbWlzT2JqZWN0VHlwZT4gZ2V0QWxsVmVyc2lvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIENtaXNFeHRlbnNpb25UeXBlIGV4dGVuc2lvbikgdGhyb3dzIENtaXNFeGNlcHRpb24gewotICAgICAgICBDbWlzU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IGdldFNlcnZpY2Uod3NDb250ZXh0LCByZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgY21pc1ZlcnNpb24gPSBnZXRDbWlzVmVyc2lvbih3c0NvbnRleHQpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEJlZm9yZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxPYmplY3REYXRhPiB2ZXJzaW9ucyA9IHNlcnZpY2UuZ2V0QWxsVmVyc2lvbnMocmVwb3NpdG9yeUlkLCBudWxsLCB2ZXJzaW9uU2VyaWVzSWQsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2ZXJzaW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdFR5cGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q21pc09iamVjdFR5cGU+KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0IDogdmVyc2lvbnMpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGNvbnZlcnQob2JqZWN0LCBjbWlzVmVyc2lvbikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0VHlwZSBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgQm9vbGVhbiBtYWpvciwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEVudW1JbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ21pc0V4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbiA9IGdldENtaXNWZXJzaW9uKHdzQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3REYXRhIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihyZXBvc2l0b3J5SWQsIG51bGwsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGNvbnZlcnQoSW5jbHVkZVJlbGF0aW9uc2hpcHMuY2xhc3MsIGluY2x1ZGVSZWxhdGlvbnNoaXBzKSwKLSAgICAgICAgICAgICAgICAgICAgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBjb252ZXJ0KGV4dGVuc2lvbikpOwotCi0gICAgICAgICAgICBpZiAoc3RvcEFmdGVyU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY29udmVydChzZXJ2aWNlUmVzdWx0LCBjbWlzVmVyc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgY2xvc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNQcm9wZXJ0aWVzVHlwZSBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIEJvb2xlYW4gbWFqb3IsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBDbWlzRXh0ZW5zaW9uVHlwZSBleHRlbnNpb24pIHRocm93cyBDbWlzRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gZ2V0U2VydmljZSh3c0NvbnRleHQsIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQmVmb3JlU2VydmljZShzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHNlcnZpY2VSZXN1bHQgPSBzZXJ2aWNlLmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBudWxsLCB2ZXJzaW9uU2VyaWVzSWQsIG1ham9yLAotICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGNvbnZlcnQoZXh0ZW5zaW9uKSk7Ci0KLSAgICAgICAgICAgIGlmIChzdG9wQWZ0ZXJTZXJ2aWNlKHNlcnZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KHNlcnZpY2VSZXN1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY29udmVydEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9XZWJTcGhlcmVBdXRoSGFuZGxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvd2Vic2VydmljZXMvV2ViU3BoZXJlQXV0aEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMWI3ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC93ZWJzZXJ2aWNlcy9XZWJTcGhlcmVBdXRoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC53ZWJzZXJ2aWNlczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTcGhlcmVBdXRoSGFuZGxlciBleHRlbmRzIEFic3RyYWN0VXNlcm5hbWVUb2tlbkF1dGhIYW5kbGVyIGltcGxlbWVudHMgU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7Ci0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gSEVBREVSUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShTT0FQTWVzc2FnZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBCb29sZWFuIG91dGJvdW5kUHJvcGVydHkgPSAoQm9vbGVhbikgY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7Ci0gICAgICAgIGlmIChvdXRib3VuZFByb3BlcnR5LmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAvLyB3ZSBhcmUgb25seSBsb29raW5nIGF0IGluYm91bmQgbWVzc2FnZXMKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBjYWxsQ29udGV4dE1hcCA9IG51bGw7Ci0KLSAgICAgICAgTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+IHJlcXVlc3RIZWFkZXJzID0gKE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PikgY29udGV4dAotICAgICAgICAgICAgICAgIC5nZXQoImpheHdzLmJpbmRpbmcuc29hcC5oZWFkZXJzLmluYm91bmQiKTsKLQotICAgICAgICBpZiAocmVxdWVzdEhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNlY0hlYWRlcnMgPSByZXF1ZXN0SGVhZGVycy5nZXQoV1NTRV9TRUNVUklUWSk7Ci0gICAgICAgICAgICBpZiAoaXNOb3RFbXB0eShzZWNIZWFkZXJzKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBXU1NFX0NPTlRFWFQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaCA6IHNlY0hlYWRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYQkVsZW1lbnQ8U2VjdXJpdHlIZWFkZXJUeXBlPiBzaHQgPSAoSkFYQkVsZW1lbnQ8U2VjdXJpdHlIZWFkZXJUeXBlPikgdW5tYXJzaGFsbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudW5tYXJzaGFsKG5ldyBTdHJpbmdSZWFkZXIoaCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbENvbnRleHRNYXAgPSBleHRyYWN0VXNlcm5hbWVQYXNzd29yZChzaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsQ29udGV4dE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bm1hcnNoYWxsaW5nIGZhaWxlZCwgbWF5YmUgYW5vdGhlciBoZWFkZXIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSkFYQiBwcm9ibGVtIC0gaWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHVzZXIgYW5kIHBhc3N3b3JkIHRvIGNvbnRleHQKLSAgICAgICAgaWYgKGNhbGxDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGNhbGxDb250ZXh0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LnB1dChBYnN0cmFjdFNlcnZpY2UuQ0FMTF9DT05URVhUX01BUCwgY2FsbENvbnRleHRNYXApOwotICAgICAgICBjb250ZXh0LnNldFNjb3BlKEFic3RyYWN0U2VydmljZS5DQUxMX0NPTlRFWFRfTUFQLCBTY29wZS5BUFBMSUNBVElPTik7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9BYnN0cmFjdENtaXNIdHRwU2VydmxldC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9BYnN0cmFjdENtaXNIdHRwU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzcwY2UyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvQWJzdHJhY3RDbWlzSHR0cFNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5DbGFzc0xvYWRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGwuQ2FsbENvbnRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLkNtaXNSZXBvc2l0b3J5Q29udGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXIuQnJvd3NlckNhbGxDb250ZXh0SW1wbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q21pc0h0dHBTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQ0FMTF9DT05URVhUX0hBTkRMRVIgPSAiY2FsbENvbnRleHRIYW5kbGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DTUlTX1ZFUlNJT04gPSAiY21pc1ZlcnNpb24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIENtaXNTZXJ2aWNlRmFjdG9yeSBmYWN0b3J5OwotICAgIHByaXZhdGUgU3RyaW5nIGJpbmRpbmc7Ci0gICAgcHJpdmF0ZSBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbjsKLSAgICBwcml2YXRlIENhbGxDb250ZXh0SGFuZGxlciBjYWxsQ29udGV4dEhhbmRsZXI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKLQotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjYWxsIGNvbnRleHQgaGFuZGxlcgotICAgICAgICBjYWxsQ29udGV4dEhhbmRsZXIgPSBudWxsOwotICAgICAgICBTdHJpbmcgY2FsbENvbnRleHRIYW5kbGVyQ2xhc3MgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9DQUxMX0NPTlRFWFRfSEFORExFUik7Ci0gICAgICAgIGlmIChjYWxsQ29udGV4dEhhbmRsZXJDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNhbGxDb250ZXh0SGFuZGxlciA9IChDYWxsQ29udGV4dEhhbmRsZXIpIENsYXNzTG9hZGVyVXRpbC5sb2FkQ2xhc3MoY2FsbENvbnRleHRIYW5kbGVyQ2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGNhbGwgY29udGV4dCBoYW5kbGVyOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgc2VydmljZSBmYWN0b3J5Ci0gICAgICAgIGZhY3RvcnkgPSAoQ21pc1NlcnZpY2VGYWN0b3J5KSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgQ21pc1JlcG9zaXRvcnlDb250ZXh0TGlzdGVuZXIuU0VSVklDRVNfRkFDVE9SWSk7Ci0KLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIlNlcnZpY2UgZmFjdG9yeSBub3QgYXZhaWxhYmxlISBDb25maWd1cmF0aW9uIHByb2JsZW0/Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBiaW5kaW5nLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJpbmRpbmcoU3RyaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDTUlTIHZlcnNpb24gY29uZmlndXJlZCBmb3IgdGhpcyBzZXJ2bGV0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGNtaXNWZXJzaW9uOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldENtaXNWZXJzaW9uKENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMuY21pc1ZlcnNpb24gPSBjbWlzVmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ21pc1NlcnZpY2VGYWN0b3J5fS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ21pc1NlcnZpY2VGYWN0b3J5IGdldFNlcnZpY2VGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBDYWxsQ29udGV4dEhhbmRsZXJ9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENhbGxDb250ZXh0SGFuZGxlciBnZXRDYWxsQ29udGV4dEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBjYWxsQ29udGV4dEhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBDYWxsQ29udGV4dH0gb2JqZWN0IGZyb20gYSBzZXJ2bGV0IHJlcXVlc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENhbGxDb250ZXh0IGNyZWF0ZUNvbnRleHQoU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZ1tdIHBhdGhGcmFnbWVudHMgPSBIdHRwVXRpbHMuc3BsaXRQYXRoKHJlcXVlc3QpOwotCi0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBudWxsOwotICAgICAgICBpZiAocGF0aEZyYWdtZW50cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICByZXBvc2l0b3J5SWQgPSBwYXRoRnJhZ21lbnRzWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnlJZCA9PSBudWxsICYmIENhbGxDb250ZXh0LkJJTkRJTkdfQVRPTVBVQi5lcXVhbHMoYmluZGluZykpIHsKLSAgICAgICAgICAgIC8vIGl0J3MgYSBnZXRSZXBvc2l0b3JpZXMgb3IgZ2V0UmVwb3NpdG9yeUluZm8gY2FsbAotICAgICAgICAgICAgLy8gZ2V0UmVwb3NpdG9yeUluZm8gaGFzIHRoZSByZXBvc2l0b3J5IElEIGluIHRoZSBxdWVyeSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICByZXBvc2l0b3J5SWQgPSBIdHRwVXRpbHMuZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9SRVBPU0lUT1JZX0lEKTsKLSAgICAgICAgfQotCi0gICAgICAgIENhbGxDb250ZXh0SW1wbCBjb250ZXh0ID0gbnVsbDsKLQotICAgICAgICBpZiAoQ2FsbENvbnRleHQuQklORElOR19CUk9XU0VSLmVxdWFscyhiaW5kaW5nKSkgewotICAgICAgICAgICAgY29udGV4dCA9IG5ldyBCcm93c2VyQ2FsbENvbnRleHRJbXBsKGJpbmRpbmcsIGNtaXNWZXJzaW9uLCByZXBvc2l0b3J5SWQsIHNlcnZsZXRDb250ZXh0LCByZXF1ZXN0LCByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSwgc3RyZWFtRmFjdG9yeSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENhbGxDb250ZXh0SW1wbChiaW5kaW5nLCBjbWlzVmVyc2lvbiwgcmVwb3NpdG9yeUlkLCBzZXJ2bGV0Q29udGV4dCwgcmVxdWVzdCwgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnksIHN0cmVhbUZhY3RvcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVjb2RlIHJhbmdlCi0gICAgICAgIGNvbnRleHQuc2V0UmFuZ2UocmVxdWVzdC5nZXRIZWFkZXIoIlJhbmdlIikpOwotCi0gICAgICAgIC8vIGdldCBsb2NhbGUKLSAgICAgICAgY29udGV4dC5zZXRBY2NlcHRMYW5ndWFnZShyZXF1ZXN0LmdldEhlYWRlcigiQWNjZXB0LUxhbmd1YWdlIikpOwotCi0gICAgICAgIC8vIGNhbGwgY2FsbCBjb250ZXh0IGhhbmRsZXIKLSAgICAgICAgaWYgKGNhbGxDb250ZXh0SGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNhbGxDb250ZXh0TWFwID0gY2FsbENvbnRleHRIYW5kbGVyLmdldENhbGxDb250ZXh0TWFwKHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKGNhbGxDb250ZXh0TWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGNhbGxDb250ZXh0TWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL0Fic3RyYWN0U2VydmljZUNhbGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvQWJzdHJhY3RTZXJ2aWNlQ2FsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI5ZDI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvQWJzdHJhY3RTZXJ2aWNlQ2FsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ2FjaGVIZWFkZXJDb250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50TGVuZ3RoQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTGFzdE1vZGlmaWVkQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVkaXJlY3RpbmdDb250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuRGF0ZVRpbWVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNtaXNFbnVtSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkRhdGVUaW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlLlByb2dyZXNzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlQ2FsbCBpbXBsZW1lbnRzIFNlcnZpY2VDYWxsIHsKLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIGEgc3RyaW5nIHBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ1BhcmFtZXRlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEh0dHBVdGlscy5nZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgYSBib29sZWFuIHBhcmFtZXRlciAod2l0aCBkZWZhdWx0KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUGFyYW1ldGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWYpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIG5hbWUpOwotICAgICAgICBpZiAoKHZhbHVlID09IG51bGwpIHx8ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIGEgYm9vbGVhbiBwYXJhbWV0ZXIuCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0Qm9vbGVhblBhcmFtZXRlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIG5hbWUpOwotICAgICAgICBpZiAoKHZhbHVlID09IG51bGwpIHx8ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhbiBpbnRlZ2VyIHBhcmFtZXRlciAod2l0aCBkZWZhdWx0KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgbmFtZSwgbG9uZyBkZWYpIHsKLSAgICAgICAgQmlnSW50ZWdlciByZXN1bHQgPSBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKHJlcXVlc3QsIG5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEJpZ0ludGVnZXIudmFsdWVPZihkZWYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhbiBpbnRlZ2VyIHBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyUGFyYW1ldGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmdQYXJhbWV0ZXIocmVxdWVzdCwgbmFtZSk7Ci0gICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCkgfHwgKHZhbHVlLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIodmFsdWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgcGFyYW1ldGVyICciICsgbmFtZSArICInISIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIERhdGVUaW1lRm9ybWF0IGdldERhdGVUaW1lRm9ybWF0UGFyYW1ldGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIFN0cmluZyBzID0gZ2V0U3RyaW5nUGFyYW1ldGVyKHJlcXVlc3QsIENvbnN0YW50cy5QQVJBTV9EQVRFVElNRV9GT1JNQVQpOwotCi0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBEYXRlVGltZUZvcm1hdC5TSU1QTEU7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lRm9ybWF0LmZyb21WYWx1ZShzLnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdmFsdWUgZm9yIHBhcmFtZXRlciAiICsgQ29uc3RhbnRzLlBBUkFNX0RBVEVUSU1FX0ZPUk1BVAotICAgICAgICAgICAgICAgICAgICArICIhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhbiBlbnVtIHBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBUIGdldEVudW1QYXJhbWV0ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFN0cmluZyBuYW1lLCBDbGFzczxUPiBjbGF6eikgewotICAgICAgICByZXR1cm4gQ21pc0VudW1IZWxwZXIuZnJvbVZhbHVlKGdldFN0cmluZ1BhcmFtZXRlcihyZXF1ZXN0LCBuYW1lKSwgY2xhenopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgY2VydGFpbiBIVFRQIGhlYWRlcnMgaWYgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbiByZXF1ZXN0ZWQgdGhlbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZXJ2ZWQgYnkgdGhpcyBtZXRob2QgKGZvcgotICAgICAqICAgICAgICAgZXhhbXBsZSBzdGF0dXMgY29kZSAzMDQgd2FzIHNlbmQpLCB7QGNvZGUgZmFsc2V9IGlmIHRoZSBjb250ZW50Ci0gICAgICogICAgICAgICBzaG91bGQgYmUgc2VydmVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlbmRDb250ZW50U3RyZWFtSGVhZGVycyhDb250ZW50U3RyZWFtIGNvbnRlbnQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHJlc3BvbnNlICE9IG51bGw7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgTGFzdC1Nb2RpZmllZCBoZWFkZXIgc2hvdWxkIGJlIHNldAotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIExhc3RNb2RpZmllZENvbnRlbnRTdHJlYW0pIHsKLSAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGxhc3RNb2RpZmllZCA9ICgoTGFzdE1vZGlmaWVkQ29udGVudFN0cmVhbSkgY29udGVudCkuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb25nIGxhc3RNb2RpZmllZFNlY3MgPSAobG9uZykgTWF0aC5mbG9vcigoZG91YmxlKSBsYXN0TW9kaWZpZWQuZ2V0VGltZUluTWlsbGlzKCkgLyAxMDAwKTsKLQotICAgICAgICAgICAgICAgIERhdGUgbW9kaWZpZWRTaW5jZSA9IERhdGVUaW1lSGVscGVyLnBhcnNlSHR0cERhdGVUaW1lKHJlcXVlc3QuZ2V0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIpKTsKLSAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWRTaW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgbW9kaWZpZWRTaW5jZVNlY3MgPSAobG9uZykgTWF0aC5mbG9vcigoZG91YmxlKSBtb2RpZmllZFNpbmNlLmdldFRpbWUoKSAvIDEwMDApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllZFNpbmNlU2VjcyA+PSBsYXN0TW9kaWZpZWRTZWNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZ2V0U3RyZWFtKCkuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBub3QgbW9kaWZpZWQgc3RhdHVzIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9NT0RJRklFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxhc3QtTW9kaWZpZWQiLCBEYXRlVGltZUhlbHBlci5mb3JtYXRIdHRwRGF0ZVRpbWUobGFzdE1vZGlmaWVkU2VjcyAqIDEwMDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIHJlZGlyZWN0aW9uIGlzIG5lZWRlZAotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFJlZGlyZWN0aW5nQ29udGVudFN0cmVhbSkgewotICAgICAgICAgICAgUmVkaXJlY3RpbmdDb250ZW50U3RyZWFtIHJjcyA9IChSZWRpcmVjdGluZ0NvbnRlbnRTdHJlYW0pIGNvbnRlbnQ7Ci0gICAgICAgICAgICAvLyBjbG9zZSBzdHJlYW0KLSAgICAgICAgICAgIGlmIChjb250ZW50LmdldFN0cmVhbSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50LmdldFN0cmVhbSgpLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyY3MuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJMb2NhdGlvbiIsIHJjcy5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHN0YXR1cyA9IHJjcy5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID49IDQwMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVEVNUE9SQVJZX1JFRElSRUNUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoc3RhdHVzKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiBjYWNoZSBoZWFkZXJzIHNob3VsZCBiZSBzZXQKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDYWNoZUhlYWRlckNvbnRlbnRTdHJlYW0pIHsKLSAgICAgICAgICAgIENhY2hlSGVhZGVyQ29udGVudFN0cmVhbSBjaGNzID0gKENhY2hlSGVhZGVyQ29udGVudFN0cmVhbSkgY29udGVudDsKLQotICAgICAgICAgICAgaWYgKGNoY3MuZ2V0RVRhZygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXRhZyA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIik7Ci0gICAgICAgICAgICAgICAgaWYgKGV0YWcgIT0gbnVsbCAmJiAhZXRhZy5lcXVhbHMoIioiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXRhZy5sZW5ndGgoKSA+IDIgJiYgZXRhZy5jaGFyQXQoMCkgPT0gJyInICYmIGV0YWcuZW5kc1dpdGgoIlwiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV0YWcgPSBldGFnLnN1YnN0cmluZygxLCBldGFnLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hjcy5nZXRFVGFnKCkuZXF1YWxzKGV0YWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZ2V0U3RyZWFtKCkuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBub3QgbW9kaWZpZWQgc3RhdHVzIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9NT0RJRklFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkVUYWciLCAiXCIiICsgY2hjcy5nZXRFVGFnKCkgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoY3MuZ2V0Q2FjaGVDb250cm9sKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsIGNoY3MuZ2V0Q2FjaGVDb250cm9sKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hjcy5nZXRFeHBpcmVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiRXhwaXJlcyIsIERhdGVUaW1lSGVscGVyLmZvcm1hdEh0dHBEYXRlVGltZShjaGNzLmdldEV4cGlyZXMoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgQ29udGVudC1MZW5ndGggaGVhZGVyIHNob3VsZCBiZSBzZXQKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDb250ZW50TGVuZ3RoQ29udGVudFN0cmVhbSkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnQuZ2V0QmlnTGVuZ3RoKCkgIT0gbnVsbCAmJiBjb250ZW50LmdldEJpZ0xlbmd0aCgpLnNpZ251bSgpID49IDApIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgY29udGVudC5nZXRCaWdMZW5ndGgoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzaW5nIHNob3VsZCBiZSBzdG9wcGVkIGJlZm9yZSB0aGUgc2VydmljZSBtZXRob2QKLSAgICAgKiBpcyBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHByb2Nlc3Npbmcgc2hvdWxkIGJlIHN0b3BwZWQsIHtAY29kZSBmYWxzZX0KLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3BCZWZvcmVTZXJ2aWNlKENtaXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgaWYgKCEoc2VydmljZSBpbnN0YW5jZW9mIFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICgoUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UpIHNlcnZpY2UpLmJlZm9yZVNlcnZpY2VDYWxsKCkgPT0gUHJvZ3Jlc3MuU1RPUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBwcm9jZXNzaW5nIHNob3VsZCBiZSBzdG9wcGVkIGFmdGVyIHRoZSBzZXJ2aWNlIG1ldGhvZAotICAgICAqIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcHJvY2Vzc2luZyBzaG91bGQgYmUgc3RvcHBlZCwge0Bjb2RlIGZhbHNlfQotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcEFmdGVyU2VydmljZShDbWlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmICghKHNlcnZpY2UgaW5zdGFuY2VvZiBQcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoKFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlKSBzZXJ2aWNlKS5hZnRlclNlcnZpY2VDYWxsKCkgPT0gUHJvZ3Jlc3MuU1RPUDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL0Jhc2ljQXV0aENhbGxDb250ZXh0SGFuZGxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9CYXNpY0F1dGhDYWxsQ29udGV4dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxZDI4YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL0Jhc2ljQXV0aENhbGxDb250ZXh0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLQotLyoqCi0gKiBDYWxsIENvbnRleHQgaGFuZGxlciB0aGF0IGhhbmRsZXMgYmFzaWMgYXV0aGVudGljYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY0F1dGhDYWxsQ29udGV4dEhhbmRsZXIgaW1wbGVtZW50cyBDYWxsQ29udGV4dEhhbmRsZXIsIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBCYXNpY0F1dGhDYWxsQ29udGV4dEhhbmRsZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q2FsbENvbnRleHRNYXAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGF1dGhIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcigiQXV0aG9yaXphdGlvbiIpOwotICAgICAgICBpZiAoKGF1dGhIZWFkZXIgIT0gbnVsbCkgJiYgKGF1dGhIZWFkZXIudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5zdGFydHNXaXRoKCJiYXNpYyAiKSkpIHsKLSAgICAgICAgICAgIGludCB4ID0gYXV0aEhlYWRlci5sYXN0SW5kZXhPZignICcpOwotICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgY3JlZGVudGlhbHMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZShhdXRoSGVhZGVyLnN1YnN0cmluZyh4ICsgMSkuZ2V0Qnl0ZXMoSU9VdGlscy5JU09fODg1OV8xKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBJT1V0aWxzLlVURjgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4ID0gY3JlZGVudGlhbHMuaW5kZXhPZignOicpOwotICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBleHRyYWN0IHVzZXIgYW5kIHBhc3N3b3JkIGFuZCBhZGQgdGhlbSB0byBtYXAKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgcmVzdWx0LnB1dChDYWxsQ29udGV4dC5VU0VSTkFNRSwgY3JlZGVudGlhbHMuc3Vic3RyaW5nKDAsIHgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoQ2FsbENvbnRleHQuUEFTU1dPUkQsIGNyZWRlbnRpYWxzLnN1YnN0cmluZyh4ICsgMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL0NhbGxDb250ZXh0SGFuZGxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9DYWxsQ29udGV4dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMzNzZjNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL0NhbGxDb250ZXh0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotCi0vKioKLSAqIENhbGwgQ29udGV4dCBoYW5kbGVyIGludGVyZmFjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxsQ29udGV4dEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBrZXktdmFsdWUgcGFpcnMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB7QGxpbmsgQ2FsbENvbnRleHR9LgotICAgICAqLwotICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q2FsbENvbnRleHRNYXAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9DYXBwZWRJbnB1dFN0cmVhbS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9DYXBwZWRJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjYxNzNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvQ2FwcGVkSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHN0cmVhbSB0aGF0IGNvdW50cyBieXRlcyBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbWF4aW11bSBpcwotICogcmVhY2hlZC4gQ291bnRlZCBieXRlcyBjYW4gYmUgZGVkdWN0ZWQgdG8gZXhjbHVkZXMgcGFydHMgb2Ygc3RyZWFtIGZyb20gdGhlCi0gKiBsZW5ndGggbGltaXRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIENhcHBlZElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdHJlYW07Ci0gICAgcHJpdmF0ZSBsb25nIG1heDsKLSAgICBwcml2YXRlIGxvbmcgY291bnRlcjsKLQotICAgIHB1YmxpYyBDYXBwZWRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0sIGxvbmcgbWF4KSB7Ci0gICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwotICAgICAgICB0aGlzLm1heCA9IG1heDsKLSAgICAgICAgdGhpcy5jb3VudGVyID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3VudGVyLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvdW50ZXIoKSB7Ci0gICAgICAgIHJldHVybiBjb3VudGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZHVjdHMgdGhlIGJ5dGUgY291bnRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWR1Y3RCeXRlcyhpbnQgYnl0ZUNvdW50KSB7Ci0gICAgICAgIGNvdW50ZXIgLT0gYnl0ZUNvdW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZHVjdHMgdGhlIGJ5dGUgY291bnRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWR1Y3RTdHJpbmcoU3RyaW5nIHMsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgY291bnRlciAtPSBzLmdldEJ5dGVzKCJVVEYtOCIpLmxlbmd0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvdW50ZXIgLT0gcy5nZXRCeXRlcyhlbmNvZGluZykubGVuZ3RoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTGVuZ3RoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvdW50ZXIgPiBtYXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJMaW1pdCBleGNlZWRlZCEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN0cmVhbS5hdmFpbGFibGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tMZW5ndGgoKTsKLQotICAgICAgICBpbnQgYiA9IHN0cmVhbS5yZWFkKCk7Ci0gICAgICAgIGlmIChiID4gLTEpIHsKLSAgICAgICAgICAgIGNvdW50ZXIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tMZW5ndGgoKTsKLQotICAgICAgICBpbnQgbCA9IHN0cmVhbS5yZWFkKGIsIG9mZiwgbGVuKTsKLSAgICAgICAgY291bnRlciArPSBsOwotCi0gICAgICAgIHJldHVybiBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tMZW5ndGgoKTsKLQotICAgICAgICBpbnQgbCA9IHN0cmVhbS5yZWFkKGIpOwotICAgICAgICBjb3VudGVyICs9IGw7Ci0KLSAgICAgICAgcmV0dXJuIGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTGVuZ3RoKCk7Ci0KLSAgICAgICAgbG9uZyBsID0gc3RyZWFtLnNraXAobik7Ci0gICAgICAgIGNvdW50ZXIgKz0gbDsKLQotICAgICAgICByZXR1cm4gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvRGlzcGF0Y2hlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzAzODcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQmFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpzb24ucGFyc2VyLkpTT05QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIERpc3BhdGNoZXIgZm9yIHRoZSBBdG9tUHViIGFuZCBCcm93c2VyIGJpbmRpbmcgc2VydmxldC4KLSAqLwotcHVibGljIGNsYXNzIERpc3BhdGNoZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1VSTF9BVFRSSUJVVEUgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmFzZXVybCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfR0VUID0gIkdFVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0hFQUQgPSAiSEVBRCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BPU1QgPSAiUE9TVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BVVCA9ICJQVVQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9ERUxFVEUgPSAiREVMRVRFIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEaXNwYXRjaGVyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFNlcnZpY2VDYWxsPiBzZXJ2aWNlQ2FsbE1hcDsKLQotICAgIHB1YmxpYyBEaXNwYXRjaGVyKCkgewotICAgICAgICB0aGlzKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEaXNwYXRjaGVyKGJvb2xlYW4gY2FzZVNlbnNpdGl2ZSkgewotICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlOwotICAgICAgICBzZXJ2aWNlQ2FsbE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNhbGw+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdHMgYSByZXNvdXJjZSBhbmQgSFRUUCBtZXRob2Qgd2l0aCBhbiBvYmplY3QgdGhhdCBoYW5kbGVzIHRoZSBjYWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGh0dHBNZXRob2QsIFNlcnZpY2VDYWxsIHNlcnZpY2VDYWxsKSB7Ci0gICAgICAgIHNlcnZpY2VDYWxsTWFwLnB1dChnZXRLZXkocmVzb3VyY2UsIGh0dHBNZXRob2QpLCBzZXJ2aWNlQ2FsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB0aGUgYSBjYWxsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gb2JqZWN0IHdhcyBmb3VuZCB0aGF0IGNhbiBoYW5kbGUgdGhlCi0gICAgICogICAgICAgICByZXF1ZXN0LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGh0dHBNZXRob2QsIENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgewotICAgICAgICBTZXJ2aWNlQ2FsbCBzZXJ2aWNlQ2FsbCA9IHNlcnZpY2VDYWxsTWFwLmdldChnZXRLZXkocmVzb3VyY2UsIGh0dHBNZXRob2QpKTsKLSAgICAgICAgaWYgKHNlcnZpY2VDYWxsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKHJlcG9zaXRvcnlJZCArICIgLyAiICsgcmVzb3VyY2UgKyAiLCAiICsgaHR0cE1ldGhvZCArICIgLT4gIiArIHNlcnZpY2VDYWxsLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ2FsbC5zZXJ2ZShjb250ZXh0LCBzZXJ2aWNlLCByZXBvc2l0b3J5SWQsIHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHRocm93IGNlOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24geHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBYTUwhIiwgeHNlKTsKLSAgICAgICAgfSBjYXRjaCAoSlNPTlBhcnNlRXhjZXB0aW9uIGpwZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSlNPTiEiLCBqcGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhIG1hcCBrZXkgZnJvbSBhIHJlc291cmNlIGFuZCBhbiBIVFRQIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRLZXkoU3RyaW5nIHJlc291cmNlLCBTdHJpbmcgaHR0cE1ldGhvZCkgewotICAgICAgICBTdHJpbmcgcyA9IHJlc291cmNlICsgIi8iICsgaHR0cE1ldGhvZDsKLSAgICAgICAgcmV0dXJuIChjYXNlU2Vuc2l0aXZlID8gcyA6IHMudG9VcHBlckNhc2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9FeGNlcHRpb25IZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvRXhjZXB0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGVmNTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9FeGNlcHRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeGNlcHRpb25IZWxwZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBQ0tfVFJBQ0VfUFJPUEVSVFkgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc3RhY2t0cmFjZS5kaXNhYmxlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0VORF9TVEFDS19UUkFDRTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFNFTkRfU1RBQ0tfVFJBQ0UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1RBQ0tfVFJBQ0VfUFJPUEVSVFkpID09IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFeGNlcHRpb25IZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3RhY2sgdHJhY2UgYXMgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0YWNrdHJhY2VBc1N0cmluZyhUaHJvd2FibGUgdCkgewotICAgICAgICBpZiAoIVNFTkRfU1RBQ0tfVFJBQ0UgfHwgdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB3KTsKLQotICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGFjayB0cmFjZSBhcyBET00gbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5vZGUgZ2V0U3RhY2t0cmFjZUFzTm9kZShUaHJvd2FibGUgdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHN0ID0gZ2V0U3RhY2t0cmFjZUFzU3RyaW5nKHQpOwotICAgICAgICAgICAgaWYgKHN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5uZXdEb21Eb2N1bWVudCgpOwotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnL29wZW5jbWlzL2V4Y2VwdGlvbiIsICJzdGFja3RyYWNlIik7Ci0gICAgICAgICAgICAgICAgZG9jLmFwcGVuZENoaWxkKG5vZGUpOwotCi0gICAgICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoc3QpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9IRUFESHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9IRUFESHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDEyNjAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvSEVBREh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIRUFESHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBleHRlbmRzIFF1ZXJ5U3RyaW5nSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7Ci0KLSAgICBwdWJsaWMgSEVBREh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHJlcXVlc3QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgewotICAgICAgICByZXR1cm4gRGlzcGF0Y2hlci5NRVRIT0RfR0VUOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvSHR0cFV0aWxzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL0h0dHBVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjY5ODdiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvSHR0cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBIdHRwVXRpbHMgewotCi0gICAgcHJpdmF0ZSBIdHRwVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXh0cmFjdHMgYSBzdHJpbmcgcGFyYW1ldGVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ1BhcmFtZXRlcihmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgYXNzZXJ0IHJlcXVlc3QgIT0gbnVsbDsKLQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1ldGVycyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTWFwKCk7Ci0KLSAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1ldGVyIDogcGFyYW1ldGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShwYXJhbWV0ZXIuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyLmdldFZhbHVlKClbMF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIHRoZSBwYXRoIGludG8gaXRzIGZyYWdtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0UGF0aChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBhc3NlcnQgcmVxdWVzdCAhPSBudWxsOwotCi0gICAgICAgIGludCBwcmVmaXhMZW5ndGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkubGVuZ3RoKCkgKyByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkubGVuZ3RoKCk7Ci0gICAgICAgIFN0cmluZyBwID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuc3Vic3RyaW5nKHByZWZpeExlbmd0aCk7Ci0KLSAgICAgICAgaWYgKHAubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBwLnN1YnN0cmluZygxKS5zcGxpdCgiLyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gSU9VdGlscy5kZWNvZGVVUkwocmVzdWx0W2ldKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG1hbGljaW91cyBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdFtpXS5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gcmVzdWx0W2ldLmNoYXJBdChqKTsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcYicgfHwgYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHBhdGghIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL05vQm9keUh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL05vQm9keUh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNGQzMGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9Ob0JvZHlIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIE5vQm9keUh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBOb0JvZHlPdXRwdXRTdHJlYW0gbm9Cb2R5U3RyZWFtOwotICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpdGVyOwotCi0gICAgcHVibGljIE5vQm9keUh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKLSAgICAgICAgbm9Cb2R5U3RyZWFtID0gbmV3IE5vQm9keU91dHB1dFN0cmVhbSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBub0JvZHlTdHJlYW07Ci0gICAgfQotCi0gICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihub0JvZHlTdHJlYW0sIGdldENoYXJhY3RlckVuY29kaW5nKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3cml0ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9Cb2R5T3V0cHV0U3RyZWFtIGV4dGVuZHMgU2VydmxldE91dHB1dFN0cmVhbSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvUXVlcnlTdHJpbmdIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL1F1ZXJ5U3RyaW5nSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzI4MjY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvUXVlcnlTdHJpbmdIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLQotLyoqCi0gKiBIdHRwU2VydmxldFJlcXVlc3Qgd3JhcHBlciB0aGF0IHJlYWRzIHRoZSBxdWVyeSBzdHJpbmcgaW4gY29udGFpbmVyCi0gKiBpbmRlcGVuZGVudCB3YXkgYW5kIGRlY29kZXMgdGhlIHBhcmFtZXRlciB2YWx1ZXMgd2l0aCBVVEYtOC4KLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5U3RyaW5nSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgewotCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBwYXJhbWV0ZXJzOwotCi0gICAgcHVibGljIFF1ZXJ5U3RyaW5nSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIocmVxdWVzdCk7Ci0KLSAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KCk7Ci0KLSAgICAgICAgLy8gcGFyc2UgcXVlcnkgc3RyaW5nCi0gICAgICAgIHBhcnNlRm9ybURhdGEocmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgdGhlIHF1ZXJ5IHN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwYXJzZUZvcm1EYXRhKFN0cmluZyBxdWVyeVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nID09IG51bGwgfHwgcXVlcnlTdHJpbmcubGVuZ3RoKCkgPCAzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBuYW1lVmFsdWVQYWlycyA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCImIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIG5hbWVWYWx1ZVBhaXIgOiBuYW1lVmFsdWVQYWlycykgewotICAgICAgICAgICAgaW50IHggPSBuYW1lVmFsdWVQYWlyLmluZGV4T2YoJz0nKTsKLSAgICAgICAgICAgIGlmICh4ID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gSU9VdGlscy5kZWNvZGVVUkwobmFtZVZhbHVlUGFpci5zdWJzdHJpbmcoMCwgeCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICh4ID09IG5hbWVWYWx1ZVBhaXIubGVuZ3RoKCkgLSAxID8gIiIgOiBJT1V0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZGVjb2RlVVJMKG5hbWVWYWx1ZVBhaXIuc3Vic3RyaW5nKHggKyAxKSkpOwotICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gSU9VdGlscy5kZWNvZGVVUkwobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIChTdHJpbmcpIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHZhbHVlIHRvIGEgcGFyYW1ldGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotCi0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQobmFtZSwgbmV3IFN0cmluZ1tdIHsgdmFsdWUgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdWYWx1ZXMgPSBuZXcgU3RyaW5nW3ZhbHVlcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdWYWx1ZXMsIDAsIHZhbHVlcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3VmFsdWVzW25ld1ZhbHVlcy5sZW5ndGggLSAxXSA9IHZhbHVlOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQobmFtZSwgbmV3VmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIGEgcGFyYW1ldGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nW10gYWRkaXRpb25hbFZhbHVlcykgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBwYXJhbWV0ZXJzLmdldChuYW1lKTsKLQotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KG5hbWUsIGFkZGl0aW9uYWxWYWx1ZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nW10gbmV3VmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoICsgYWRkaXRpb25hbFZhbHVlcy5sZW5ndGhdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZXMsIDAsIG5ld1ZhbHVlcywgMCwgdmFsdWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFkZGl0aW9uYWxWYWx1ZXMsIDAsIG5ld1ZhbHVlcywgdmFsdWVzLmxlbmd0aCwgYWRkaXRpb25hbFZhbHVlcy5sZW5ndGgpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQobmFtZSwgbmV3VmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAoKHZhbHVlcyA9PSBudWxsKSB8fCAodmFsdWVzLmxlbmd0aCA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWVzWzBdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gZ2V0UGFyYW1ldGVyTWFwKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgRW51bWVyYXRpb248U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHBhcmFtZXRlcnMua2V5U2V0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvU2VydmljZUNhbGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvU2VydmljZUNhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3YWEzNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL1NlcnZpY2VDYWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlQ2FsbCB7Ci0KLSAgICAvKioKLSAgICAgKiBTZXJ2ZXMgYW4gQXRvbVB1YiBvciBCcm93c2VyIGJpbmRpbmcgY2FsbC4KLSAgICAgKi8KLSAgICB2b2lkIHNlcnZlKENhbGxDb250ZXh0IGNvbnRleHQsIENtaXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyByZXBvc2l0b3J5SWQsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9UZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5M2ZlYmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9UZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuVGVtcFN0b3JlT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3Ige0BsaW5rIFRlbXBTdG9yZU91dHB1dFN0cmVhbX0gb2JqZWN0cy4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5SWQ7Ci0KLSAgICBwcml2YXRlIEZpbGUgdGVtcERpcjsKLSAgICBwcml2YXRlIGludCBtZW1vcnlUaHJlc2hvbGQ7Ci0gICAgcHJpdmF0ZSBsb25nIG1heENvbnRlbnRTaXplOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbmNyeXB0OwotCi0gICAgcHJvdGVjdGVkIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkoQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3RvcnksIFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgdGhpcy5yZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5SWQ7Ci0gICAgICAgIHRoaXMudGVtcERpciA9IGZhY3RvcnkuZ2V0VGVtcERpcmVjdG9yeSgpOwotICAgICAgICB0aGlzLm1lbW9yeVRocmVzaG9sZCA9IGZhY3RvcnkuZ2V0TWVtb3J5VGhyZXNob2xkKCk7Ci0gICAgICAgIHRoaXMubWF4Q29udGVudFNpemUgPSBmYWN0b3J5LmdldE1heENvbnRlbnRTaXplKCk7Ci0gICAgICAgIHRoaXMuZW5jcnlwdCA9IGZhY3RvcnkuZW5jcnlwdFRlbXBGaWxlcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5KEZpbGUgdGVtcERpciwgaW50IG1lbW9yeVRocmVzaG9sZCwgbG9uZyBtYXhDb250ZW50U2l6ZSwgYm9vbGVhbiBlbmNyeXB0KSB7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRoaXMucmVwb3NpdG9yeUlkID0gbnVsbDsKLSAgICAgICAgdGhpcy50ZW1wRGlyID0gdGVtcERpcjsKLSAgICAgICAgdGhpcy5tZW1vcnlUaHJlc2hvbGQgPSBtZW1vcnlUaHJlc2hvbGQ7Ci0gICAgICAgIHRoaXMubWF4Q29udGVudFNpemUgPSBtYXhDb250ZW50U2l6ZTsKLSAgICAgICAgdGhpcy5lbmNyeXB0ID0gZW5jcnlwdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZhY3RvcnkuIFRoZSBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNyZWF0ZSBuZXcKLSAgICAgKiB7QGxpbmsgVGVtcFN0b3JlT3V0cHV0U3RyZWFtfSBvYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogICAgICAgICAgICB0aGUgQ21pc1NlcnZpY2Ugb2JqZWN0IGZhY3RvcnkKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSBJRAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBuZXdJbnN0YW5jZShDbWlzU2VydmljZUZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICByZXR1cm4gbmV3IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkoZmFjdG9yeSwgcmVwb3NpdG9yeUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGZhY3RvcnkuIFRoZSBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNyZWF0ZSBuZXcKLSAgICAgKiB7QGxpbmsgVGVtcFN0b3JlT3V0cHV0U3RyZWFtfSBvYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZW1wRGlyCi0gICAgICogICAgICAgICAgICB0ZW1wIGRpcmVjdG9yeSBvciB7QGNvZGUgbnVsbH0gZm9yIHRoZSBkZWZhdWx0IHRlbXAgZGlyZWN0b3J5Ci0gICAgICogQHBhcmFtIG1lbW9yeVRocmVzaG9sZAotICAgICAqICAgICAgICAgICAgbWVtb3J5IHRocmVzaG9sZCBpbiBieXRlcwotICAgICAqIEBwYXJhbSBtYXhDb250ZW50U2l6ZQotICAgICAqICAgICAgICAgICAgbWF4IHNpemUgb2YgdGhlIGNvbnRlbnQgaW4gYnl0ZXMgKC0xIHRvIGRpc2FibGUgdGhlIGNoZWNrKQotICAgICAqIEBwYXJhbSBlbmNyeXB0Ci0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgaWYgdGVtcG9yYXJ5IGZpbGVzIG11c3QgYmUgZW5jcnlwdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5IG5ld0luc3RhbmNlKEZpbGUgdGVtcERpciwgaW50IG1lbW9yeVRocmVzaG9sZCwgbG9uZyBtYXhDb250ZW50U2l6ZSwKLSAgICAgICAgICAgIGJvb2xlYW4gZW5jcnlwdCkgewotICAgICAgICByZXR1cm4gbmV3IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkodGVtcERpciwgbWVtb3J5VGhyZXNob2xkLCBtYXhDb250ZW50U2l6ZSwgZW5jcnlwdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVtcFN0b3JlT3V0cHV0U3RyZWFtfSBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFRlbXBTdG9yZU91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCi0gICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmVhbSA9IGZhY3RvcnkuZ2V0VGVtcEZpbGVPdXRwdXRTdHJlYW0ocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgc3RyZWFtID0gbmV3IFRocmVzaG9sZE91dHB1dFN0cmVhbSh0ZW1wRGlyLCBtZW1vcnlUaHJlc2hvbGQsIG1heENvbnRlbnRTaXplLCBlbmNyeXB0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHJlYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGVtcCBkaXJlY3Rvcnkgb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUgZGVmYXVsdCB0ZW1wCi0gICAgICogZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldFRlbXBEaXIoKSB7Ci0gICAgICAgIHJldHVybiB0ZW1wRGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lbW9yeSB0aHJlc2hvbGQgaW4gYnl0ZXMuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNZW1vcnlUaHJlc2hvbGQoKSB7Ci0gICAgICAgIHJldHVybiBtZW1vcnlUaHJlc2hvbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWF4IGNvbnRlbnQgc2l6ZSBpbiBieXRlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhDb250ZW50U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1heENvbnRlbnRTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0ZW1wb3JhcnkgZmlsZXMgYXJlIGVuY3J5cHRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuY3J5cHRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGVuY3J5cHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9UaHJlc2hvbGRPdXRwdXRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvVGhyZXNob2xkT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjEzNGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC9UaHJlc2hvbGRPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OwotCi1pbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKLWltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlck91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yOwotaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5UZW1wU3RvcmVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBBbiBPdXRwdXRTdHJlYW0gdGhhdCBzdG9yZXMgdGhlIGRhdGEgaW4gbWFpbiBtZW1vcnkgdW50aWwgaXQgcmVhY2hlcyBhCi0gKiB0aHJlc2hvbGQuIElmIHRoZSB0aHJlc2hvbGQgaXMgcGFzc2VkIHRoZSBkYXRhIGlzIHdyaXR0ZW4gdG8gYSB0ZW1wb3JhcnkKLSAqIGZpbGUuCi0gKiAKLSAqIEl0IGl0IGlzIGltcG9ydGFudCB0byBjbG9zZSB0aGlzIE91dHB1dFN0cmVhbSBiZWZvcmUKLSAqIHtAbGluayAjZ2V0SW5wdXRTdHJlYW0oKX0gaXMgY2FsbGVkIG9yIGNhbGwge0BsaW5rICNkZXN0cm95KCl9IGlmIHRoZQotICogSW5wdXRTdHJlYW0gaXNuJ3QgcmVxdWlyZWQhCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlc2hvbGRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBUZW1wU3RvcmVPdXRwdXRTdHJlYW0gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRocmVzaG9sZE91dHB1dFN0cmVhbS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0dST1cgPSAxMCAqIDEwMjQgKiAxMDI0OyAvLyAxMCBNaUIKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9USFJFU0hPTEQgPSA0ICogMTAyNCAqIDEwMjQ7IC8vIDQgTWlCCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxHT1JJVEhNID0gIkFFUyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREUgPSAiQ1RSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFERElORyA9ICJQS0NTNVBhZGRpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0ZPUk1BVElPTiA9IEFMR09SSVRITSArICcvJyArIE1PREUgKyAnLycgKyBQQURESU5HOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlfU0laRSA9IDEyODsKLQotICAgIHByaXZhdGUgZmluYWwgRmlsZSB0ZW1wRGlyOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1lbW9yeVRocmVzaG9sZDsKLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgbWF4Q29udGVudFNpemU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVuY3J5cHQ7Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBidWYgPSBudWxsOwotICAgIHByaXZhdGUgaW50IGJ1ZlNpemUgPSAwOwotICAgIHByaXZhdGUgbG9uZyBsZW5ndGggPSAwOwotICAgIHByaXZhdGUgRmlsZSB0ZW1wRmlsZTsKLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSB0bXBTdHJlYW07Ci0gICAgcHJpdmF0ZSBLZXkga2V5OwotICAgIHByaXZhdGUgYnl0ZVtdIGl2OwotICAgIHByaXZhdGUgU3RyaW5nIG1pbWVUeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRlbXBEaXIKLSAgICAgKiAgICAgICAgICAgIHRlbXAgZGlyZWN0b3J5IG9yIHtAY29kZSBudWxsfSBmb3IgdGhlIGRlZmF1bHQgdGVtcCBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gbWVtb3J5VGhyZXNob2xkCi0gICAgICogICAgICAgICAgICBtZW1vcnkgdGhyZXNob2xkIGluIGJ5dGVzCi0gICAgICogQHBhcmFtIG1heENvbnRlbnRTaXplCi0gICAgICogICAgICAgICAgICBtYXggc2l6ZSBvZiB0aGUgY29udGVudCBpbiBieXRlcyAoLTEgdG8gZGlzYWJsZSB0aGUgY2hlY2spCi0gICAgICovCi0gICAgcHVibGljIFRocmVzaG9sZE91dHB1dFN0cmVhbShGaWxlIHRlbXBEaXIsIGludCBtZW1vcnlUaHJlc2hvbGQsIGxvbmcgbWF4Q29udGVudFNpemUpIHsKLSAgICAgICAgdGhpcyg2NCAqIDEwMjQsIHRlbXBEaXIsIG1lbW9yeVRocmVzaG9sZCwgbWF4Q29udGVudFNpemUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVtcERpcgotICAgICAqICAgICAgICAgICAgdGVtcCBkaXJlY3Rvcnkgb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUgZGVmYXVsdCB0ZW1wIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBtZW1vcnlUaHJlc2hvbGQKLSAgICAgKiAgICAgICAgICAgIG1lbW9yeSB0aHJlc2hvbGQgaW4gYnl0ZXMKLSAgICAgKiBAcGFyYW0gbWF4Q29udGVudFNpemUKLSAgICAgKiAgICAgICAgICAgIG1heCBzaXplIG9mIHRoZSBjb250ZW50IGluIGJ5dGVzICgtMSB0byBkaXNhYmxlIHRoZSBjaGVjaykKLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyZXNob2xkT3V0cHV0U3RyZWFtKEZpbGUgdGVtcERpciwgaW50IG1lbW9yeVRocmVzaG9sZCwgbG9uZyBtYXhDb250ZW50U2l6ZSwgYm9vbGVhbiBlbmNyeXB0KSB7Ci0gICAgICAgIHRoaXMoNjQgKiAxMDI0LCB0ZW1wRGlyLCBtZW1vcnlUaHJlc2hvbGQsIG1heENvbnRlbnRTaXplLCBlbmNyeXB0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5pdFNpemUKLSAgICAgKiAgICAgICAgICAgIGluaXRpYWwgaW50ZXJuYWwgYnVmZmVyIHNpemUKLSAgICAgKiBAcGFyYW0gdGVtcERpcgotICAgICAqICAgICAgICAgICAgdGVtcCBkaXJlY3Rvcnkgb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUgZGVmYXVsdCB0ZW1wIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBtZW1vcnlUaHJlc2hvbGQKLSAgICAgKiAgICAgICAgICAgIG1lbW9yeSB0aHJlc2hvbGQgaW4gYnl0ZXMKLSAgICAgKiBAcGFyYW0gbWF4Q29udGVudFNpemUKLSAgICAgKiAgICAgICAgICAgIG1heCBzaXplIG9mIHRoZSBjb250ZW50IGluIGJ5dGVzICgtMSB0byBkaXNhYmxlIHRoZSBjaGVjaykKLSAgICAgKiBAcGFyYW0gZW5jcnlwdAotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRlbXBvcmFyeSBmaWxlcyBtdXN0IGJlIGVuY3J5cHRlZAotICAgICAqLwotICAgIHB1YmxpYyBUaHJlc2hvbGRPdXRwdXRTdHJlYW0oaW50IGluaXRTaXplLCBGaWxlIHRlbXBEaXIsIGludCBtZW1vcnlUaHJlc2hvbGQsIGxvbmcgbWF4Q29udGVudFNpemUsIGJvb2xlYW4gZW5jcnlwdCkgewotICAgICAgICBpZiAoaW5pdFNpemUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWdhdGl2ZSBpbml0aWFsIHNpemU6ICIgKyBpbml0U2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnRlbXBEaXIgPSB0ZW1wRGlyOwotICAgICAgICB0aGlzLm1lbW9yeVRocmVzaG9sZCA9IChtZW1vcnlUaHJlc2hvbGQgPCAwID8gREVGQVVMVF9USFJFU0hPTEQgOiBtZW1vcnlUaHJlc2hvbGQpOwotICAgICAgICB0aGlzLm1heENvbnRlbnRTaXplID0gbWF4Q29udGVudFNpemU7Ci0gICAgICAgIHRoaXMuZW5jcnlwdCA9IGVuY3J5cHQ7Ci0KLSAgICAgICAgYnVmID0gbmV3IGJ5dGVbaW5pdFNpemVdOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmQoaW50IG5leHRCdWZmZXJTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoYnVmU2l6ZSArIG5leHRCdWZmZXJTaXplIDw9IGJ1Zi5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChidWZTaXplICsgbmV4dEJ1ZmZlclNpemUgPiBtZW1vcnlUaHJlc2hvbGQpIHsKLSAgICAgICAgICAgIGlmICh0bXBTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9wZW5UZW1wRmlsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG1wU3RyZWFtLndyaXRlKGJ1ZiwgMCwgYnVmU2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChidWYubGVuZ3RoICE9IG1lbW9yeVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIGJ1ZiA9IG5ldyBieXRlW21lbW9yeVRocmVzaG9sZF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZTaXplID0gMDsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5ld1NpemUgPSAoKGJ1ZlNpemUgKyBuZXh0QnVmZmVyU2l6ZSkgKiAyIDwgTUFYX0dST1cgPyAoYnVmU2l6ZSArIG5leHRCdWZmZXJTaXplKSAqIDIgOiBidWYubGVuZ3RoCi0gICAgICAgICAgICAgICAgKyBuZXh0QnVmZmVyU2l6ZSArIE1BWF9HUk9XKTsKLSAgICAgICAgYnl0ZVtdIG5ld2J1ZiA9IG5ldyBieXRlW25ld1NpemVdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgbmV3YnVmLCAwLCBidWZTaXplKTsKLSAgICAgICAgYnVmID0gbmV3YnVmOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvcGVuVGVtcEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm9wZW5jbWlzIiwgbnVsbCwgdGVtcERpcik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbmNyeXB0KSB7Ci0gICAgICAgICAgICAgICAgQ2lwaGVyIGNpcGhlcjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBLZXlHZW5lcmF0b3Iga2V5R2VuZXJhdG9yID0gS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKEFMR09SSVRITSk7Ci0gICAgICAgICAgICAgICAgICAgIGtleUdlbmVyYXRvci5pbml0KEtFWV9TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5R2VuZXJhdG9yLmdlbmVyYXRlS2V5KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKFRSQU5TRk9STUFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBpdiA9IGNpcGhlci5nZXRJVigpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKExPRy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkNhbm5vdCBpbml0aWFsaXplIGVuY3J5cHRpb24gY2lwaGVyOiB7fSIsIGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBpbml0aWFsaXplIGVuY3J5cHRpb24gY2lwaGVyISIsIGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRtcFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgQ2lwaGVyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSwgY2lwaGVyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRtcFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wRmlsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGlmICh0ZW1wRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGlmICghdGVtcEZpbGUuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPRy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIlRlbXAgZmlsZSB7fSBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLCB0ZW1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJDcmVhdGVkIHRlbXAgZmlsZToge30iLCB0ZW1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtaW1lVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGUoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKG1heENvbnRlbnRTaXplID4gLTEpICYmIChsZW5ndGggKyBsZW4gPiBtYXhDb250ZW50U2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBkZXN0cm95KG51bGwpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiQ29udGVudCB0b28gYmlnISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleHBhbmQobGVuKTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBvZmZzZXQsIGJ1ZiwgYnVmU2l6ZSwgbGVuKTsKLSAgICAgICAgICAgIGJ1ZlNpemUgKz0gbGVuOwotICAgICAgICAgICAgbGVuZ3RoICs9IGxlbjsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBkZXN0cm95KGlvZSk7Ci0KLSAgICAgICAgICAgIGlmIChMT0cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmICh0ZW1wRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiV3JpdGluZyB0byB0ZW1wIGZpbGUge30gZmFpbGVkOiB7fSIsIHRlbXBGaWxlLmdldEFic29sdXRlUGF0aCgpLCBpb2UudG9TdHJpbmcoKSwgaW9lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIldyaXRpbmcgdG8gdGVtcCBidWZmZXIgZmFpbGVkOiB7fSIsIGlvZS50b1N0cmluZygpLCBpb2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IG9uZUJ5dGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobWF4Q29udGVudFNpemUgPiAtMSAmJiBsZW5ndGggKyAxID4gbWF4Q29udGVudFNpemUpIHsKLSAgICAgICAgICAgICAgICBkZXN0cm95KG51bGwpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiQ29udGVudCB0b28gYmlnISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYnVmU2l6ZSA9PSBidWYubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgZXhwYW5kKDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZbYnVmU2l6ZSsrXSA9IChieXRlKSBvbmVCeXRlOwotICAgICAgICAgICAgbGVuZ3RoKys7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgZGVzdHJveShpb2UpOwotCi0gICAgICAgICAgICBpZiAoTE9HLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGVtcEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIldyaXRpbmcgdG8gdGVtcCBmaWxlIHt9IGZhaWxlZDoge30iLCB0ZW1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaW9lLnRvU3RyaW5nKCksIGlvZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJXcml0aW5nIHRvIHRlbXAgYnVmZmVyIGZhaWxlZDoge30iLCBpb2UudG9TdHJpbmcoKSwgaW9lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRtcFN0cmVhbSA9PSBudWxsICYmIG1lbW9yeVRocmVzaG9sZCA8IGJ1ZlNpemUpIHsKLSAgICAgICAgICAgIG9wZW5UZW1wRmlsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRtcFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChidWZTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXBTdHJlYW0ud3JpdGUoYnVmLCAwLCBidWZTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRtcFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgZGVzdHJveShpb2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKExPRy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiRmx1c2hpbmcgdGhlIHRlbXAgZmlsZSB7fSBmYWlsZWQ6IHt9IiwgdGVtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGlvZS50b1N0cmluZygpLCBpb2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmx1c2goKTsKLQotICAgICAgICBpZiAodG1wU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRtcFN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzdHJveXMgdGhlIG9iamVjdCBiZWZvcmUgaXQgaGFzIGJlZW4gcmVhZC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiVGhyZXNob2xkT3V0cHV0U3RyZWFtIGRlc3Ryb3llZC4iICsgKGNhdXNlID09IG51bGwgPyAiIiA6ICIgQ2F1c2U6ICIgKyBjYXVzZS50b1N0cmluZygpKSwgY2F1c2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRtcFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJGbHVzaGluZyB0aGUgdGVtcCBmaWxlIHt9IGZhaWxlZDoge30iLCB0ZW1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJDbG9zaW5nIHRoZSB0ZW1wIGZpbGUge30gZmFpbGVkOiB7fSIsIHRlbXBGaWxlLmdldEFic29sdXRlUGF0aCgpLCBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdG1wU3RyZWFtID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0ZW1wRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzRGVsZXRlZCA9IHRlbXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgaWYgKCFpc0RlbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJUZW1wIGZpbGUge30gY291bGQgbm90IGJlIGRlbGV0ZWQhIiwgdGVtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRGVsZXRlZCB0ZW1wIGZpbGU6IHt9IiwgdGVtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZiA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGF0YSBhcyBhbiBJbnB1dFN0cmVhbS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAodG1wU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICBidWYgPSBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3IEludGVybmFsVGVtcEZpbGVJbnB1dFN0cmVhbSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEJ1ZmZlcklucHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5wdXQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUaHJlc2hvbGRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyBpZiB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gbWVtb3J5LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGRhdGEgaXMgaW4gbWVtb3J5IGFuZCB7QGNvZGUgZmFsc2V9IGlmCi0gICAgICAgICAqICAgICAgICAgdGhlIGRhdGEgcmVzaWRlcyBpbiBhIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0luTWVtb3J5KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHRlbXBvcmFyeSBmaWxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgdGVtcG9yYXJ5IGZpbGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBkYXRhIGlzIHN0b3JlZCBpbgotICAgICAgICAgKiAgICAgICAgIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0VGVtcG9yYXJ5RmlsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGJ5dGUgYnVmZmVyLgotICAgICAgICAgKiAKLSAgICAgICAgICogVGhpcyB0aGUgdW5kZXJseWluZyBieXRlIGJ1ZmZlciBhbmQgbWlnaHQgYmUgYmlnZ2VyIHRoYW4gdGhlbiB0aGUKLSAgICAgICAgICogdG90YWwgbGVuZ3RoIG9mIHRoZSBzdHJlYW0uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGluIGEgYnl0ZSBhcnJheSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGRhdGEgaXMKLSAgICAgICAgICogICAgICAgICBzdG9yZWQgaW4gYSBmaWxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBzdHJlYW0uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBNSU1FIHR5cGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBNSU1FIHR5cGUgaXMgdW5rbm93bgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtaW1lVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHN0cmVhbS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGZpbGUgbmFtZSBpcyB1bmtub3duCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJlYW0gaW4gYnl0ZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBsb25nIGdldExlbmd0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV3aW5kcyB0aGUgc3RyZWFtIHNvIHRoYXQgaXQgY2FuIGJlIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgcmV3aW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElucHV0U3RyZWFtIGZvciBpbi1tZW1vcnkgZGF0YS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEludGVybmFsQnVmZmVySW5wdXRTdHJlYW0gZXh0ZW5kcyBUaHJlc2hvbGRJbnB1dFN0cmVhbSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbWFyayA9IC0xOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luTWVtb3J5KCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHsKLSAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXdpbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gaXMgYWxyZWFkeSBjbG9zZWQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBvcyA9IDA7Ci0gICAgICAgICAgICBtYXJrID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotICAgICAgICAgICAgaWYgKGJ1ZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFyayA9IHBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobWFyayA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlJlc2V0IG5vdCBwb3NzaWJsZS4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9zID0gbWFyazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHsKLSAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYnVmU2l6ZSAtIHBvczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHBvcyA8IGJ1ZlNpemUpICYmIChidWYgIT0gbnVsbCkgPyAoYnVmW3BvcysrXSAmIDB4ZmYpIDogLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHJlYWQoYiwgMCwgYi5sZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgewotICAgICAgICAgICAgaWYgKChwb3MgPj0gYnVmU2l6ZSkgfHwgKGJ1ZiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgocG9zICsgbGVuKSA+IGJ1ZlNpemUpIHsKLSAgICAgICAgICAgICAgICBsZW4gPSAoYnVmU2l6ZSAtIHBvcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCBwb3MsIGIsIG9mZiwgbGVuKTsKLSAgICAgICAgICAgIHBvcyArPSBsZW47Ci0KLSAgICAgICAgICAgIHJldHVybiBsZW47Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHsKLSAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKHBvcyArIG4pID4gYnVmU2l6ZSkgewotICAgICAgICAgICAgICAgIG4gPSBidWZTaXplIC0gcG9zOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb3MgKz0gbjsKLQotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgYnVmID0gbnVsbDsKLSAgICAgICAgICAgIG1hcmsgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElucHV0U3RyZWFtIGZvciB0ZW1wIGZpbGUgZGF0YS4KLSAgICAgKiAKLSAgICAgKiBDYWxsIHtAbGluayAjY2xvc2UoKX0gdG8gZGVsZXRlIHRoZSB0ZW1wIGZpbGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbFRlbXBGaWxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBUaHJlc2hvbGRJbnB1dFN0cmVhbSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaXBoZXIgY2lwaGVyOwotICAgICAgICBwcml2YXRlIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gc3RyZWFtOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWxldGVkID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZCA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyBJbnRlcm5hbFRlbXBGaWxlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAoZW5jcnlwdCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShUUkFOU0ZPUk1BVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIGNpcGhlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGtleSwgbmV3IEl2UGFyYW1ldGVyU3BlYyhpdikpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGNpcGhlcjoge30iLCBlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgaW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGNpcGhlciEiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNpcGhlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9wZW5TdHJlYW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPcGVucyB0aGUgdGVtcCBmaWxlIHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9wZW5TdHJlYW0oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gKG1lbW9yeVRocmVzaG9sZCA8IDQgKiAxMDI0ID8gNCAqIDEwMjQgOiBtZW1vcnlUaHJlc2hvbGQpOwotCi0gICAgICAgICAgICBpZiAoZW5jcnlwdCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBDaXBoZXJJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKSwgY2lwaGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKSwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJbk1lbW9yeSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRmlsZSBnZXRUZW1wb3JhcnlGaWxlKCkgewotICAgICAgICAgICAgaWYgKGlzRGVsZXRlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRlbXBvcmFyeSBmaWxlIGlzIGFscmVhZHkgZGVsZXRlZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRlbXBGaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJld2luZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIG9wZW5TdHJlYW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5hdmFpbGFibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5tYXJrU3VwcG9ydGVkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0gICAgICAgICAgICBpZiAoIWlzQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLm1hcmsocmVhZGxpbWl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyZWFtLnJlc2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHJlYW0uc2tpcChuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGlzQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5yZWFkKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiByZWFkKGIsIDAsIGIubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBuID0gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7Ci0KLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGRlbGV0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENsb3NlcyB0aGUgdGVtcCBmaWxlIHN0cmVhbSBhbmQgdGhlbiBkZWxldGVzIHRoZSB0ZW1wIGZpbGUuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGUoKSB7Ci0gICAgICAgICAgICBpZiAoIWlzQ2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQ2xvc2luZyB0aGUgdGVtcCBmaWxlIHt9IGZhaWxlZDoge30iLCB0ZW1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFpc0RlbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICBpc0RlbGV0ZWQgPSB0ZW1wRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRGVsZXRlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiVGVtcCBmaWxlIHt9IGNvdWxkIG5vdCBiZSBkZWxldGVkISIsIHRlbXBGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJEZWxldGVkIHRlbXAgZmlsZToge30iLCB0ZW1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc2hhcmVkL1RocmVzaG9sZE91dHB1dFN0cmVhbUZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvVGhyZXNob2xkT3V0cHV0U3RyZWFtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE0MTg3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zaGFyZWQvVGhyZXNob2xkT3V0cHV0U3RyZWFtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQSBmYWN0b3J5IGZvciB7QGxpbmsgVGhyZXNob2xkT3V0cHV0U3RyZWFtfSBvYmplY3RzLgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnl9Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUaHJlc2hvbGRPdXRwdXRTdHJlYW1GYWN0b3J5IGV4dGVuZHMgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFRocmVzaG9sZE91dHB1dFN0cmVhbUZhY3RvcnkoRmlsZSB0ZW1wRGlyLCBpbnQgbWVtb3J5VGhyZXNob2xkLCBsb25nIG1heENvbnRlbnRTaXplLCBib29sZWFuIGVuY3J5cHQpIHsKLSAgICAgICAgc3VwZXIodGVtcERpciwgbWVtb3J5VGhyZXNob2xkLCBtYXhDb250ZW50U2l6ZSwgZW5jcnlwdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBmYWN0b3J5LiBUaGUgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjcmVhdGUgbmV3Ci0gICAgICoge0BsaW5rIFRocmVzaG9sZE91dHB1dFN0cmVhbX0gb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVtcERpcgotICAgICAqICAgICAgICAgICAgdGVtcCBkaXJlY3Rvcnkgb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUgZGVmYXVsdCB0ZW1wIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBtZW1vcnlUaHJlc2hvbGQKLSAgICAgKiAgICAgICAgICAgIG1lbW9yeSB0aHJlc2hvbGQgaW4gYnl0ZXMKLSAgICAgKiBAcGFyYW0gbWF4Q29udGVudFNpemUKLSAgICAgKiAgICAgICAgICAgIG1heCBzaXplIG9mIHRoZSBjb250ZW50IGluIGJ5dGVzICgtMSB0byBkaXNhYmxlIHRoZSBjaGVjaykKLSAgICAgKiBAcGFyYW0gZW5jcnlwdAotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRlbXBvcmFyeSBmaWxlcyBtdXN0IGJlIGVuY3J5cHRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGhyZXNob2xkT3V0cHV0U3RyZWFtRmFjdG9yeSBuZXdJbnN0YW5jZShGaWxlIHRlbXBEaXIsIGludCBtZW1vcnlUaHJlc2hvbGQsIGxvbmcgbWF4Q29udGVudFNpemUsCi0gICAgICAgICAgICBib29sZWFuIGVuY3J5cHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaHJlc2hvbGRPdXRwdXRTdHJlYW1GYWN0b3J5KHRlbXBEaXIsIG1lbW9yeVRocmVzaG9sZCwgbWF4Q29udGVudFNpemUsIGVuY3J5cHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRocmVzaG9sZE91dHB1dFN0cmVhbX0gb2JqZWN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUaHJlc2hvbGRPdXRwdXRTdHJlYW0gbmV3T3V0cHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gbmV3IFRocmVzaG9sZE91dHB1dFN0cmVhbShnZXRUZW1wRGlyKCksIGdldE1lbW9yeVRocmVzaG9sZCgpLCBnZXRNYXhDb250ZW50U2l6ZSgpLCBpc0VuY3J5cHRlZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9BdG9tRW50cnlQYXJzZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9BdG9tRW50cnlQYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzcwZTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvQXRvbUVudHJ5UGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkF0b21FbnRyeVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5UaHJlc2hvbGRPdXRwdXRTdHJlYW0uVGhyZXNob2xkSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLS8qKgotICogQXRvbUVudHJ5UGFyc2VyIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdG9tRW50cnlQYXJzZXJUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJFU0hPTEQgPSA0ICogMTAyNCAqIDEwMjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TSVpFID0gLTE7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU19FTlRSWV9DT05URU5UID0gIlRoaXMgaXMgbXkgY29udGVudCEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTX0VOVFJZID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IgotICAgICAgICAgICAgKyAiPGF0b206ZW50cnkgeG1sbnM6YXRvbT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbVwiIHhtbG5zOmNtaXM9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4L1wiIHhtbG5zOmNtaXNyYT1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4L1wiPiIKLSAgICAgICAgICAgICsgIjxhdG9tOmF1dGhvcj48YXRvbTpuYW1lPnRlc3Q8L2F0b206bmFtZT48L2F0b206YXV0aG9yPiIgKyAiPGF0b206aWQ+aHR0cDovL3Rlc3QvaWQ8L2F0b206aWQ+IgotICAgICAgICAgICAgKyAiPGF0b206cHVibGlzaGVkPjIwMDktMTItMzFUMTI6NTM6MzdaPC9hdG9tOnB1Ymxpc2hlZD4iICsgIjxhdG9tOnRpdGxlPnRlc3QudHh0PC9hdG9tOnRpdGxlPiIKLSAgICAgICAgICAgICsgIjxhdG9tOnVwZGF0ZWQ+MjAxMC0wMS0wMVQwMDowMDowMFo8L2F0b206dXBkYXRlZD4iCi0gICAgICAgICAgICArICI8Y21pc3JhOm9iamVjdCB4bWxuczpuczM9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvXCI+IgotICAgICAgICAgICAgKyAiICA8Y21pczpwcm9wZXJ0aWVzPiIgKyAiICAgIDxjbWlzOnByb3BlcnR5SWQgcHJvcGVydHlEZWZpbml0aW9uSWQ9XCJjbWlzOm9iamVjdElkXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+aWQ8L2NtaXM6dmFsdWU+IiArICIgICAgPC9jbWlzOnByb3BlcnR5SWQ+IgotICAgICAgICAgICAgKyAiICAgIDxjbWlzOnByb3BlcnR5U3RyaW5nIHByb3BlcnR5RGVmaW5pdGlvbklkPVwiY21pczpuYW1lXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+dGVzdC50eHQ8L2NtaXM6dmFsdWU+IiArICIgICAgPC9jbWlzOnByb3BlcnR5U3RyaW5nPiIKLSAgICAgICAgICAgICsgIiAgICA8Y21pczpwcm9wZXJ0eUlkIHByb3BlcnR5RGVmaW5pdGlvbklkPVwiY21pczpvYmplY3RUeXBlSWRcIj4iCi0gICAgICAgICAgICArICIgICAgICA8Y21pczp2YWx1ZT5jbWlzOmRvY3VtZW50PC9jbWlzOnZhbHVlPiIgKyAiICAgIDwvY21pczpwcm9wZXJ0eUlkPiIgKyAiICA8L2NtaXM6cHJvcGVydGllcz4iCi0gICAgICAgICAgICArICI8L2NtaXNyYTpvYmplY3Q+IiArICI8Y21pc3JhOmNvbnRlbnQ+IiArICIgIDxjbWlzcmE6bWVkaWF0eXBlPnRleHQvcGxhaW48L2NtaXNyYTptZWRpYXR5cGU+IgotICAgICAgICAgICAgKyAiICA8Y21pc3JhOmJhc2U2ND4iICsgQmFzZTY0LmVuY29kZUJ5dGVzKENNSVNfRU5UUllfQ09OVEVOVC5nZXRCeXRlcygpKSArICI8L2NtaXNyYTpiYXNlNjQ+IgotICAgICAgICAgICAgKyAiPC9jbWlzcmE6Y29udGVudD4iICsgIjwvYXRvbTplbnRyeT4iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUT01fRU5UUllfVEVYVF9DT05URU5UID0gIlRoaXMgaXMgcGxhaW4gdGV4dCEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVE9NX0VOVFJZX1RFWFQgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iCi0gICAgICAgICAgICArICI8YXRvbTplbnRyeSB4bWxuczphdG9tPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tXCIgeG1sbnM6Y21pcz1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvXCIgeG1sbnM6Y21pc3JhPVwiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9yZXN0YXRvbS8yMDA5MDgvXCI+IgotICAgICAgICAgICAgKyAiPGF0b206YXV0aG9yPjxhdG9tOm5hbWU+dGVzdDwvYXRvbTpuYW1lPjwvYXRvbTphdXRob3I+IiArICI8YXRvbTppZD5odHRwOi8vdGVzdC9pZDwvYXRvbTppZD4iCi0gICAgICAgICAgICArICI8YXRvbTpwdWJsaXNoZWQ+MjAwOS0xMi0zMVQxMjo1MzozN1o8L2F0b206cHVibGlzaGVkPiIgKyAiPGF0b206dGl0bGU+dGVzdC50eHQ8L2F0b206dGl0bGU+IgotICAgICAgICAgICAgKyAiPGF0b206dXBkYXRlZD4yMDEwLTAxLTAxVDAwOjAwOjAwWjwvYXRvbTp1cGRhdGVkPiIKLSAgICAgICAgICAgICsgIjxjbWlzcmE6b2JqZWN0IHhtbG5zOm5zMz1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC9cIj4iCi0gICAgICAgICAgICArICIgIDxjbWlzOnByb3BlcnRpZXM+IiArICIgICAgPGNtaXM6cHJvcGVydHlJZCBwcm9wZXJ0eURlZmluaXRpb25JZD1cImNtaXM6b2JqZWN0SWRcIj4iCi0gICAgICAgICAgICArICIgICAgICA8Y21pczp2YWx1ZT5pZDwvY21pczp2YWx1ZT4iICsgIiAgICA8L2NtaXM6cHJvcGVydHlJZD4iCi0gICAgICAgICAgICArICIgICAgPGNtaXM6cHJvcGVydHlTdHJpbmcgcHJvcGVydHlEZWZpbml0aW9uSWQ9XCJjbWlzOm5hbWVcIj4iCi0gICAgICAgICAgICArICIgICAgICA8Y21pczp2YWx1ZT50ZXN0LnR4dDwvY21pczp2YWx1ZT4iICsgIiAgICA8L2NtaXM6cHJvcGVydHlTdHJpbmc+IgotICAgICAgICAgICAgKyAiICAgIDxjbWlzOnByb3BlcnR5SWQgcHJvcGVydHlEZWZpbml0aW9uSWQ9XCJjbWlzOm9iamVjdFR5cGVJZFwiPiIKLSAgICAgICAgICAgICsgIiAgICAgIDxjbWlzOnZhbHVlPmNtaXM6ZG9jdW1lbnQ8L2NtaXM6dmFsdWU+IiArICIgICAgPC9jbWlzOnByb3BlcnR5SWQ+IiArICIgIDwvY21pczpwcm9wZXJ0aWVzPiIKLSAgICAgICAgICAgICsgIjwvY21pc3JhOm9iamVjdD4iICsgIjxhdG9tOmNvbnRlbnQgdHlwZT1cInRleHRcIj4iICsgQVRPTV9FTlRSWV9URVhUX0NPTlRFTlQgKyAiPC9hdG9tOmNvbnRlbnQ+IgotICAgICAgICAgICAgKyAiPC9hdG9tOmVudHJ5PiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRPTV9FTlRSWV9YTUxfQ09OVEVOVCA9ICI8Zmlyc3QgeG1sbnM9XCJodHRwOi8vdGVzdC8xXCI+PHNlY29uZCBteWF0dHI9XCJDb29sLCBhIHZhbHVlIVwiPmhleSwgdGhpcyBpcyB0ZXh0PC9zZWNvbmQ+PG15bnM6dGhpcmQgeG1sbnM6bXlucz1cImh0dHA6Ly90ZXN0LzJcIj5ndWVzcyB3aGF0J3MgaGVyZSAuLi4gbW9yZSB0ZXh0PC9teW5zOnRoaXJkPjwvZmlyc3Q+IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRPTV9FTlRSWV9YTUwgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iCi0gICAgICAgICAgICArICI8YXRvbTplbnRyeSB4bWxuczphdG9tPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tXCIgeG1sbnM6Y21pcz1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvXCIgeG1sbnM6Y21pc3JhPVwiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9yZXN0YXRvbS8yMDA5MDgvXCI+IgotICAgICAgICAgICAgKyAiPGF0b206YXV0aG9yPjxhdG9tOm5hbWU+dGVzdDwvYXRvbTpuYW1lPjwvYXRvbTphdXRob3I+IiArICI8YXRvbTppZD5odHRwOi8vdGVzdC9pZDwvYXRvbTppZD4iCi0gICAgICAgICAgICArICI8YXRvbTpwdWJsaXNoZWQ+MjAwOS0xMi0zMVQxMjo1MzozN1o8L2F0b206cHVibGlzaGVkPiIgKyAiPGF0b206dGl0bGU+dGVzdC50eHQ8L2F0b206dGl0bGU+IgotICAgICAgICAgICAgKyAiPGF0b206dXBkYXRlZD4yMDEwLTAxLTAxVDAwOjAwOjAwWjwvYXRvbTp1cGRhdGVkPiIKLSAgICAgICAgICAgICsgIjxjbWlzcmE6b2JqZWN0IHhtbG5zOm5zMz1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbWVzc2FnaW5nLzIwMDkwOC9cIj4iCi0gICAgICAgICAgICArICIgIDxjbWlzOnByb3BlcnRpZXM+IiArICIgICAgPGNtaXM6cHJvcGVydHlJZCBwcm9wZXJ0eURlZmluaXRpb25JZD1cImNtaXM6b2JqZWN0SWRcIj4iCi0gICAgICAgICAgICArICIgICAgICA8Y21pczp2YWx1ZT5pZDwvY21pczp2YWx1ZT4iICsgIiAgICA8L2NtaXM6cHJvcGVydHlJZD4iCi0gICAgICAgICAgICArICIgICAgPGNtaXM6cHJvcGVydHlTdHJpbmcgcHJvcGVydHlEZWZpbml0aW9uSWQ9XCJjbWlzOm5hbWVcIj4iCi0gICAgICAgICAgICArICIgICAgICA8Y21pczp2YWx1ZT50ZXN0LnR4dDwvY21pczp2YWx1ZT4iICsgIiAgICA8L2NtaXM6cHJvcGVydHlTdHJpbmc+IgotICAgICAgICAgICAgKyAiICAgIDxjbWlzOnByb3BlcnR5SWQgcHJvcGVydHlEZWZpbml0aW9uSWQ9XCJjbWlzOm9iamVjdFR5cGVJZFwiPiIKLSAgICAgICAgICAgICsgIiAgICAgIDxjbWlzOnZhbHVlPmNtaXM6ZG9jdW1lbnQ8L2NtaXM6dmFsdWU+IiArICIgICAgPC9jbWlzOnByb3BlcnR5SWQ+IiArICIgIDwvY21pczpwcm9wZXJ0aWVzPiIKLSAgICAgICAgICAgICsgIjwvY21pc3JhOm9iamVjdD4iICsgIjxhdG9tOmNvbnRlbnQgdHlwZT1cInRleHQveG1sXCI+IiArIEFUT01fRU5UUllfWE1MX0NPTlRFTlQgKyAiPC9hdG9tOmNvbnRlbnQ+IgotICAgICAgICAgICAgKyAiPC9hdG9tOmVudHJ5PiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRPTV9FTlRSWV9YSFRNTF9DT05URU5UID0gIjxkaXYgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+VGhpcyBpcyA8Yj5YSFRNTDwvYj4gY29udGVudC48L2Rpdj4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVE9NX0VOVFJZX1hIVE1MID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IgotICAgICAgICAgICAgKyAiPGF0b206ZW50cnkgeG1sbnM6YXRvbT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbVwiIHhtbG5zOmNtaXM9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4L1wiIHhtbG5zOmNtaXNyYT1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4L1wiPiIKLSAgICAgICAgICAgICsgIjxhdG9tOmF1dGhvcj48YXRvbTpuYW1lPnRlc3Q8L2F0b206bmFtZT48L2F0b206YXV0aG9yPiIgKyAiPGF0b206aWQ+aHR0cDovL3Rlc3QvaWQ8L2F0b206aWQ+IgotICAgICAgICAgICAgKyAiPGF0b206cHVibGlzaGVkPjIwMDktMTItMzFUMTI6NTM6MzdaPC9hdG9tOnB1Ymxpc2hlZD4iICsgIjxhdG9tOnRpdGxlPnRlc3QudHh0PC9hdG9tOnRpdGxlPiIKLSAgICAgICAgICAgICsgIjxhdG9tOnVwZGF0ZWQ+MjAxMC0wMS0wMVQwMDowMDowMFo8L2F0b206dXBkYXRlZD4iCi0gICAgICAgICAgICArICI8Y21pc3JhOm9iamVjdCB4bWxuczpuczM9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvXCI+IgotICAgICAgICAgICAgKyAiICA8Y21pczpwcm9wZXJ0aWVzPiIgKyAiICAgIDxjbWlzOnByb3BlcnR5SWQgcHJvcGVydHlEZWZpbml0aW9uSWQ9XCJjbWlzOm9iamVjdElkXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+aWQ8L2NtaXM6dmFsdWU+IiArICIgICAgPC9jbWlzOnByb3BlcnR5SWQ+IgotICAgICAgICAgICAgKyAiICAgIDxjbWlzOnByb3BlcnR5U3RyaW5nIHByb3BlcnR5RGVmaW5pdGlvbklkPVwiY21pczpuYW1lXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+dGVzdC50eHQ8L2NtaXM6dmFsdWU+IiArICIgICAgPC9jbWlzOnByb3BlcnR5U3RyaW5nPiIKLSAgICAgICAgICAgICsgIiAgICA8Y21pczpwcm9wZXJ0eUlkIHByb3BlcnR5RGVmaW5pdGlvbklkPVwiY21pczpvYmplY3RUeXBlSWRcIj4iCi0gICAgICAgICAgICArICIgICAgICA8Y21pczp2YWx1ZT5jbWlzOmRvY3VtZW50PC9jbWlzOnZhbHVlPiIgKyAiICAgIDwvY21pczpwcm9wZXJ0eUlkPiIgKyAiICA8L2NtaXM6cHJvcGVydGllcz4iCi0gICAgICAgICAgICArICI8L2NtaXNyYTpvYmplY3Q+IiArICI8YXRvbTpjb250ZW50IHR5cGU9XCJ4aHRtbFwiPiIgKyBBVE9NX0VOVFJZX1hIVE1MX0NPTlRFTlQgKyAiPC9hdG9tOmNvbnRlbnQ+IgotICAgICAgICAgICAgKyAiPC9hdG9tOmVudHJ5PiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRPTV9FTlRSWV9CQVNFNjRfQ09OVEVOVCA9ICJUaGlzIGlzIGFub3RoZXIgY29udGVudCEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVE9NX0VOVFJZX0JBU0U2NCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIKLSAgICAgICAgICAgICsgIjxhdG9tOmVudHJ5IHhtbG5zOmF0b209XCJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b21cIiB4bWxuczpjbWlzPVwiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC9cIiB4bWxuczpjbWlzcmE9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3Jlc3RhdG9tLzIwMDkwOC9cIj4iCi0gICAgICAgICAgICArICI8YXRvbTphdXRob3I+PGF0b206bmFtZT50ZXN0PC9hdG9tOm5hbWU+PC9hdG9tOmF1dGhvcj4iICsgIjxhdG9tOmlkPmh0dHA6Ly90ZXN0L2lkPC9hdG9tOmlkPiIKLSAgICAgICAgICAgICsgIjxhdG9tOnB1Ymxpc2hlZD4yMDA5LTEyLTMxVDEyOjUzOjM3WjwvYXRvbTpwdWJsaXNoZWQ+IiArICI8YXRvbTp0aXRsZT50ZXN0LnR4dDwvYXRvbTp0aXRsZT4iCi0gICAgICAgICAgICArICI8YXRvbTp1cGRhdGVkPjIwMTAtMDEtMDFUMDA6MDA6MDBaPC9hdG9tOnVwZGF0ZWQ+IgotICAgICAgICAgICAgKyAiPGNtaXNyYTpvYmplY3QgeG1sbnM6bnMzPVwiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9tZXNzYWdpbmcvMjAwOTA4L1wiPiIKLSAgICAgICAgICAgICsgIiAgPGNtaXM6cHJvcGVydGllcz4iICsgIiAgICA8Y21pczpwcm9wZXJ0eUlkIHByb3BlcnR5RGVmaW5pdGlvbklkPVwiY21pczpvYmplY3RJZFwiPiIKLSAgICAgICAgICAgICsgIiAgICAgIDxjbWlzOnZhbHVlPmlkPC9jbWlzOnZhbHVlPiIgKyAiICAgIDwvY21pczpwcm9wZXJ0eUlkPiIKLSAgICAgICAgICAgICsgIiAgICA8Y21pczpwcm9wZXJ0eVN0cmluZyBwcm9wZXJ0eURlZmluaXRpb25JZD1cImNtaXM6bmFtZVwiPiIKLSAgICAgICAgICAgICsgIiAgICAgIDxjbWlzOnZhbHVlPnRlc3QudHh0PC9jbWlzOnZhbHVlPiIgKyAiICAgIDwvY21pczpwcm9wZXJ0eVN0cmluZz4iCi0gICAgICAgICAgICArICIgICAgPGNtaXM6cHJvcGVydHlJZCBwcm9wZXJ0eURlZmluaXRpb25JZD1cImNtaXM6b2JqZWN0VHlwZUlkXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+Y21pczpkb2N1bWVudDwvY21pczp2YWx1ZT4iICsgIiAgICA8L2NtaXM6cHJvcGVydHlJZD4iICsgIiAgPC9jbWlzOnByb3BlcnRpZXM+IgotICAgICAgICAgICAgKyAiPC9jbWlzcmE6b2JqZWN0PiIgKyAiPGF0b206Y29udGVudCB0eXBlPVwiYXBwbGljYXRpb24vc29tZXRoaW5nXCI+IgotICAgICAgICAgICAgKyBCYXNlNjQuZW5jb2RlQnl0ZXMoQVRPTV9FTlRSWV9CQVNFNjRfQ09OVEVOVC5nZXRCeXRlcygpKSArICI8L2F0b206Y29udGVudD4iICsgIjwvYXRvbTplbnRyeT4iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUT01fRU5UUllfTkFNRSA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIKLSAgICAgICAgICAgICsgIjxhdG9tOmVudHJ5IHhtbG5zOmF0b209XCJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b21cIiB4bWxuczpjbWlzPVwiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC9cIiB4bWxuczpjbWlzcmE9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3Jlc3RhdG9tLzIwMDkwOC9cIj4iCi0gICAgICAgICAgICArICI8YXRvbTphdXRob3I+PGF0b206bmFtZT50ZXN0PC9hdG9tOm5hbWU+PC9hdG9tOmF1dGhvcj4iICsgIjxhdG9tOmlkPmh0dHA6Ly90ZXN0L2lkPC9hdG9tOmlkPiIKLSAgICAgICAgICAgICsgIjxhdG9tOnB1Ymxpc2hlZD4yMDA5LTEyLTMxVDEyOjUzOjM3WjwvYXRvbTpwdWJsaXNoZWQ+IiArICI8YXRvbTp0aXRsZT5hdG9tLnRpdGxlPC9hdG9tOnRpdGxlPiIKLSAgICAgICAgICAgICsgIjxhdG9tOnVwZGF0ZWQ+MjAxMC0wMS0wMVQwMDowMDowMFo8L2F0b206dXBkYXRlZD4iCi0gICAgICAgICAgICArICI8Y21pc3JhOm9iamVjdCB4bWxuczpuczM9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL21lc3NhZ2luZy8yMDA5MDgvXCI+IgotICAgICAgICAgICAgKyAiICA8Y21pczpwcm9wZXJ0aWVzPiIgKyAiICAgIDxjbWlzOnByb3BlcnR5SWQgcHJvcGVydHlEZWZpbml0aW9uSWQ9XCJjbWlzOm9iamVjdElkXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+aWQ8L2NtaXM6dmFsdWU+IiArICIgICAgPC9jbWlzOnByb3BlcnR5SWQ+IgotICAgICAgICAgICAgKyAiICAgIDxjbWlzOnByb3BlcnR5U3RyaW5nIHByb3BlcnR5RGVmaW5pdGlvbklkPVwiY21pczpuYW1lXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+Y21pcy5uYW1lPC9jbWlzOnZhbHVlPiIgKyAiICAgIDwvY21pczpwcm9wZXJ0eVN0cmluZz4iCi0gICAgICAgICAgICArICIgICAgPGNtaXM6cHJvcGVydHlJZCBwcm9wZXJ0eURlZmluaXRpb25JZD1cImNtaXM6b2JqZWN0VHlwZUlkXCI+IgotICAgICAgICAgICAgKyAiICAgICAgPGNtaXM6dmFsdWU+Y21pczpkb2N1bWVudDwvY21pczp2YWx1ZT4iICsgIiAgICA8L2NtaXM6cHJvcGVydHlJZD4iICsgIiAgPC9jbWlzOnByb3BlcnRpZXM+IgotICAgICAgICAgICAgKyAiPC9jbWlzcmE6b2JqZWN0PiIgKyAiPC9hdG9tOmVudHJ5PiI7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDbWlzQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBieXRlW10gY29udGVudCA9IHBhcnNlKENNSVNfRU5UUlkuZ2V0Qnl0ZXMoKSwgInRleHQvcGxhaW4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENNSVNfRU5UUllfQ09OVEVOVCwgbmV3IFN0cmluZyhjb250ZW50KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXRvbUNvbnRlbnRUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50ID0gcGFyc2UoQVRPTV9FTlRSWV9URVhULmdldEJ5dGVzKCksICJ0ZXh0L3BsYWluIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBVE9NX0VOVFJZX1RFWFRfQ09OVEVOVCwgbmV3IFN0cmluZyhjb250ZW50KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXRvbUNvbnRlbnRYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBwYXJzZShBVE9NX0VOVFJZX1hNTC5nZXRCeXRlcygpLCAidGV4dC94bWwiKTsKLSAgICAgICAgU3RyaW5nIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nKGNvbnRlbnQpOwotICAgICAgICBhc3NlcnRUcnVlKHhtbENvbnRlbnQuaW5kZXhPZignPicpID4gLTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQVRPTV9FTlRSWV9YTUxfQ09OVEVOVCwgeG1sQ29udGVudC5zdWJzdHJpbmcoeG1sQ29udGVudC5pbmRleE9mKCc+JykgKyAxKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXRvbUNvbnRlbnRYSHRtbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBieXRlW10gY29udGVudCA9IHBhcnNlKEFUT01fRU5UUllfWEhUTUwuZ2V0Qnl0ZXMoKSwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIpOwotICAgICAgICBTdHJpbmcgeG1sQ29udGVudCA9IG5ldyBTdHJpbmcoY29udGVudCk7Ci0gICAgICAgIGFzc2VydFRydWUoeG1sQ29udGVudC5pbmRleE9mKCc+JykgPiAtMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBVE9NX0VOVFJZX1hIVE1MX0NPTlRFTlQsIHhtbENvbnRlbnQuc3Vic3RyaW5nKHhtbENvbnRlbnQuaW5kZXhPZignPicpICsgMSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEF0b21Db250ZW50QmFzZTY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50ID0gcGFyc2UoQVRPTV9FTlRSWV9CQVNFNjQuZ2V0Qnl0ZXMoKSwgImFwcGxpY2F0aW9uL3NvbWV0aGluZyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQVRPTV9FTlRSWV9CQVNFNjRfQ09OVEVOVCwgbmV3IFN0cmluZyhjb250ZW50KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXRvbVRpdGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UobnVsbCwgVEhSRVNIT0xELAotICAgICAgICAgICAgICAgIE1BWF9TSVpFLCBmYWxzZSk7Ci0gICAgICAgIEF0b21FbnRyeVBhcnNlciBhZXAgPSBuZXcgQXRvbUVudHJ5UGFyc2VyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShBVE9NX0VOVFJZX05BTUUuZ2V0Qnl0ZXMoKSksIHN0cmVhbUZhY3RvcnkpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoYWVwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZXAuZ2V0T2JqZWN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFlcC5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFlcC5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZXAuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSkgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZyk7Ci0KLSAgICAgICAgUHJvcGVydHlTdHJpbmcgbmFtZVByb3BlcnR5ID0gKFByb3BlcnR5U3RyaW5nKSBhZXAuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKQotICAgICAgICAgICAgICAgIC5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdG9tLnRpdGxlIiwgbmFtZVByb3BlcnR5LmdldEZpcnN0VmFsdWUoKSk7Ci0KLSAgICAgICAgYWVwLnJlbGVhc2UoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChhZXAuZ2V0Q29udGVudFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UobnVsbCwgVEhSRVNIT0xELAotICAgICAgICAgICAgICAgIE1BWF9TSVpFLCBmYWxzZSk7Ci0gICAgICAgIEF0b21FbnRyeVBhcnNlciBhZXAgPSBuZXcgQXRvbUVudHJ5UGFyc2VyKG51bGwsIHN0cmVhbUZhY3RvcnkpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoYWVwKTsKLSAgICAgICAgYXNzZXJ0TnVsbChhZXAuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoYWVwLmdldE9iamVjdCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChhZXAuZ2V0Q29udGVudFN0cmVhbSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChhZXAuZ2V0UHJvcGVydGllcygpKTsKLSAgICB9Ci0KLSAgICBAVGVzdChleHBlY3RlZCA9IFhNTFN0cmVhbUV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5ID0gVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZShudWxsLCBUSFJFU0hPTEQsCi0gICAgICAgICAgICAgICAgTUFYX1NJWkUsIGZhbHNlKTsKLSAgICAgICAgbmV3IEF0b21FbnRyeVBhcnNlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pLCBzdHJlYW1GYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGJlZ2luID0gSU9VdGlscwotICAgICAgICAgICAgICAgIC50b1VURjhCeXRlcygiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjxlbnRyeSB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbVwiIHhtbG5zOmFwcD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDcvYXBwXCIgeG1sbnM6Y21pc3JhPVwiaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9yZXN0YXRvbS8yMDA5MDgvXCI+IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGNtaXNyYTpjb250ZW50PjxjbWlzcmE6bWVkaWF0eXBlPnZpZGVvL3JhdzwvY21pc3JhOm1lZGlhdHlwZT48Y21pc3JhOmJhc2U2ND4iKTsKLSAgICAgICAgYnl0ZVtdIGVuZCA9IElPVXRpbHMKLSAgICAgICAgICAgICAgICAudG9VVEY4Qnl0ZXMoIjwvY21pc3JhOmJhc2U2ND48L2NtaXNyYTpjb250ZW50PjxjbWlzcmE6b2JqZWN0IHhtbG5zOmNtaXM9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4L1wiPiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjxjbWlzOnByb3BlcnRpZXM+PC9jbWlzOnByb3BlcnRpZXM+PC9jbWlzcmE6b2JqZWN0Pjx0aXRsZT5zb21lLmZpbGU8L3RpdGxlPjwvZW50cnk+Iik7Ci0KLSAgICAgICAgaW50IGNvbnRlblNpemUgPSA1MCAqIDEwMjQgKiAxMDI0OwotICAgICAgICBpbnQgYmFzZTY0U2l6ZSA9IDQgKiAoY29udGVuU2l6ZSArIDIgLSAoKGNvbnRlblNpemUgKyAyKSAlIDMpKSAvIDM7Ci0KLSAgICAgICAgYnl0ZVtdIGVudHJ5ID0gbmV3IGJ5dGVbYmVnaW4ubGVuZ3RoICsgYmFzZTY0U2l6ZSArIGVuZC5sZW5ndGhdOwotCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYmVnaW4sIDAsIGVudHJ5LCAwLCBiZWdpbi5sZW5ndGgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVuZCwgMCwgZW50cnksIGVudHJ5Lmxlbmd0aCAtIGVuZC5sZW5ndGgsIGVuZC5sZW5ndGgpOwotICAgICAgICBBcnJheXMuZmlsbChlbnRyeSwgYmVnaW4ubGVuZ3RoLCBlbnRyeS5sZW5ndGggLSBlbmQubGVuZ3RoLCAoYnl0ZSkgJ2EnKTsKLQotICAgICAgICBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3RvcnkgPSBUZW1wU3RvcmVPdXRwdXRTdHJlYW1GYWN0b3J5Lm5ld0luc3RhbmNlKG51bGwsIFRIUkVTSE9MRCwKLSAgICAgICAgICAgICAgICBNQVhfU0laRSwgZmFsc2UpOwotICAgICAgICBBdG9tRW50cnlQYXJzZXIgYWVwID0gbmV3IEF0b21FbnRyeVBhcnNlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW50cnkpLCBzdHJlYW1GYWN0b3J5KTsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gYWVwLmdldENvbnRlbnRTdHJlYW0oKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnRTdHJlYW0pOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpOwotCi0gICAgICAgIGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkuY2xvc2UoKTsKLQotICAgICAgICBhZXAucmVsZWFzZSgpOwotICAgICAgICBhc3NlcnROdWxsKGFlcC5nZXRDb250ZW50U3RyZWFtKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBwYXJzZShieXRlW10gZW50cnksIFN0cmluZyBtaW1lVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UobnVsbCwgVEhSRVNIT0xELAotICAgICAgICAgICAgICAgIE1BWF9TSVpFLCBmYWxzZSk7Ci0gICAgICAgIEF0b21FbnRyeVBhcnNlciBhZXAgPSBuZXcgQXRvbUVudHJ5UGFyc2VyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbnRyeSksIHN0cmVhbUZhY3RvcnkpOwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBhZXAuZ2V0Q29udGVudFN0cmVhbSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudFN0cmVhbSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbWVUeXBlLCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkpOwotICAgICAgICBpZiAoY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSBpbnN0YW5jZW9mIFRocmVzaG9sZElucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWltZVR5cGUsICgoVGhyZXNob2xkSW5wdXRTdHJlYW0pIGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpLmdldE1pbWVUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgSU9VdGlscy5jb3B5KGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCksIGJhb3MpOwotCi0gICAgICAgIGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkuY2xvc2UoKTsKLQotICAgICAgICBhZXAucmVsZWFzZSgpOwotICAgICAgICBhc3NlcnROdWxsKGFlcC5nZXRDb250ZW50U3RyZWFtKCkpOwotCi0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvQ2FsbENvbnRleHRJbXBsVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvQ2FsbENvbnRleHRJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTE3ZDhjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL0NhbGxDb250ZXh0SW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENhbGxDb250ZXh0SW1wbFRlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWwoKSB7Ci0gICAgICAgIENhbGxDb250ZXh0SW1wbCBjb250ZXh0ID0gbmV3IENhbGxDb250ZXh0SW1wbChudWxsLCBDbWlzVmVyc2lvbi5DTUlTXzFfMSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgY29udGV4dC5zZXRBY2NlcHRMYW5ndWFnZSgiIGVuIC0gdXMgIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBjb250ZXh0LmdldChDYWxsQ29udGV4dC5MT0NBTEVfSVNPNjM5X0xBTkdVQUdFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidXMiLCBjb250ZXh0LmdldChDYWxsQ29udGV4dC5MT0NBTEVfSVNPMzE2Nl9DT1VOVFJZKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZW4tdXMiLCBjb250ZXh0LmdldExvY2FsZSgpKTsKLQotICAgICAgICBjb250ZXh0LnNldEFjY2VwdExhbmd1YWdlKCJlbi11czsgcT0wLjggLCBkZS1jaCA7IFEgPSAwLjksIGFiYy0xMjM7IHE9MC4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZSIsIGNvbnRleHQuZ2V0KENhbGxDb250ZXh0LkxPQ0FMRV9JU082MzlfTEFOR1VBR0UpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaCIsIGNvbnRleHQuZ2V0KENhbGxDb250ZXh0LkxPQ0FMRV9JU08zMTY2X0NPVU5UUlkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZS1jaCIsIGNvbnRleHQuZ2V0TG9jYWxlKCkpOwotCi0gICAgICAgIGNvbnRleHQuc2V0QWNjZXB0TGFuZ3VhZ2UoImVuLXVzOyBxPTAuOCwgYWJjLTEyMzsgcT0xLjAsIGRlLWNoIDtRPSAwLjkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBjb250ZXh0LmdldChDYWxsQ29udGV4dC5MT0NBTEVfSVNPNjM5X0xBTkdVQUdFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMTIzIiwgY29udGV4dC5nZXQoQ2FsbENvbnRleHQuTE9DQUxFX0lTTzMxNjZfQ09VTlRSWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFiYy0xMjMiLCBjb250ZXh0LmdldExvY2FsZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZSgpIHsKLSAgICAgICAgQ2FsbENvbnRleHRJbXBsIGNvbnRleHQgPSBuZXcgQ2FsbENvbnRleHRJbXBsKG51bGwsIENtaXNWZXJzaW9uLkNNSVNfMV8xLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICBjb250ZXh0LnNldFJhbmdlKCJieXRlcz0xMDAtMjk5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMDBMLCBjb250ZXh0LmdldE9mZnNldCgpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMEwsIGNvbnRleHQuZ2V0TGVuZ3RoKCkubG9uZ1ZhbHVlKCkpOwotCi0gICAgICAgIGNvbnRleHQuc2V0UmFuZ2UoIiBieXRlcyAgPSAxIC0gMiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIGNvbnRleHQuZ2V0T2Zmc2V0KCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGNvbnRleHQuZ2V0TGVuZ3RoKCkubG9uZ1ZhbHVlKCkpOwotCi0gICAgICAgIGNvbnRleHQuc2V0UmFuZ2UoImJ5dGVzPTQ1Ni0iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQ1NkwsIGNvbnRleHQuZ2V0T2Zmc2V0KCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICBhc3NlcnROdWxsKGNvbnRleHQuZ2V0TGVuZ3RoKCkpOwotCi0gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgcmFuZ2VzCi0gICAgICAgIGNvbnRleHQuc2V0UmFuZ2UoImJ5dGVzPTEwLTIwLDMwLTQwIik7Ci0gICAgICAgIGFzc2VydE51bGwoY29udGV4dC5nZXRPZmZzZXQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoY29udGV4dC5nZXRMZW5ndGgoKSk7Ci0KLSAgICAgICAgY29udGV4dC5zZXRSYW5nZSgiYnl0ZXM9LTEyMyIpOwotICAgICAgICBhc3NlcnROdWxsKGNvbnRleHQuZ2V0T2Zmc2V0KCkpOwotICAgICAgICBhc3NlcnROdWxsKGNvbnRleHQuZ2V0TGVuZ3RoKCkpOwotCi0gICAgICAgIGNvbnRleHQuc2V0UmFuZ2UoImtiPTEwMC0yOTkiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChjb250ZXh0LmdldE9mZnNldCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChjb250ZXh0LmdldExlbmd0aCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9DYXBwZWRJbnB1dFN0cmVhbVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL0NhcHBlZElucHV0U3RyZWFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjE0YWQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL0NhcHBlZElucHV0U3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5DYXBwZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENhcHBlZElucHV0U3RyZWFtVGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW0xKCkgewotICAgICAgICBiYXNlVGVzdCg2NCAqIDEwMjQsIDEwICogMTAyNCwgMTAwMCwgNjAgKiAxMDI0LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW0yKCkgewotICAgICAgICBiYXNlVGVzdCg2NCAqIDEwMjQsIDEwICogMTAyNCwgMTAwMCwgMjAwMCwgZmFsc2UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTMoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDEwMCwgMjAsIDAsIDc5LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW00KCkgewotICAgICAgICBiYXNlVGVzdCgxMDAsIDIwLCAxMCwgODksIHRydWUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTUoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDEwMCwgMjAsIDAsIDMwLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtNigpIHsKLSAgICAgICAgYmFzZVRlc3QoMTAwLCAyMCwgMTksIDk5LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmFzZVRlc3QoaW50IGJ1ZmZlclNpemUsIGludCBtYXgsIGludCBnb29kQmVnaW4sIGludCBnb29kRW5kLCBib29sZWFuIHN1Y2Nlc3MpIHsKLSAgICAgICAgYnl0ZVtdIGJ5dGVCdWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlQnVmZmVyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBieXRlQnVmZmVyW2ldID0gKGJ5dGUpIChpID49IGdvb2RCZWdpbiAmJiBpIDw9IGdvb2RFbmQgPyAxIDogMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0ZXN0IHJlYWQgd2l0aCBidWZmZXIKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gb3JpZ2luU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVCdWZmZXIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDYXBwZWRJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQ2FwcGVkSW5wdXRTdHJlYW0ob3JpZ2luU3RyZWFtLCBtYXgpOwotCi0gICAgICAgICAgICBpbnQgYiA9IDA7Ci0gICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTBdOwotICAgICAgICAgICAgd2hpbGUgKChiID0gc3RyZWFtLnJlYWQoYnVmZmVyKSkgPiAtMSkgewotICAgICAgICAgICAgICAgIGludCBjb3VudGVyID0gMDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3RyZWFtLmRlZHVjdEJ5dGVzKGNvdW50ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGVzdCBzaW5nbGUgYnl0ZSByZWFkCi0gICAgICAgIG9yaWdpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQnVmZmVyKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2FwcGVkSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IENhcHBlZElucHV0U3RyZWFtKG9yaWdpblN0cmVhbSwgbWF4KTsKLQotICAgICAgICAgICAgaW50IGIgPSAwOwotICAgICAgICAgICAgd2hpbGUgKChiID0gc3RyZWFtLnJlYWQoKSkgPiAtMSkgewotICAgICAgICAgICAgICAgIGlmIChiID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmRlZHVjdEJ5dGVzKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL0NoZWNrU2VydmxldElucHV0U3RyZWFtVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvQ2hlY2tTZXJ2bGV0SW5wdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2VhY2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvQ2hlY2tTZXJ2bGV0SW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLndlYnNlcnZpY2VzLlByb3RlY3Rpb25SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENoZWNrU2VydmxldElucHV0U3RyZWFtVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9VTkRBUlkgPSAidGVzdC5ib3VuZHJheSI7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW0xKCkgewotICAgICAgICBiYXNlVGVzdCgyMDAsIDUwLCAyMCwgMTAsIHRydWUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTIoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDEwMCAqIDEwMjQsIDEwICogMTAyNCwgOCAqIDEwMjQsIDQgKiAxMDI0LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW0zKCkgewotICAgICAgICBiYXNlVGVzdCgxMDAgKiAxMDI0LCA4ICogMTAyNCwgMTAgKiAxMDI0LCA0ICogMTAyNCwgZmFsc2UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTQoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDEwMCAqIDEwMjQsIDEwLCA3LCA0ICogMTAyNCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtNSgpIHsKLSAgICAgICAgYmFzZVRlc3QoMTAwICogMTAyNCwgOTkgKiAxMDI0LCAyICogMTAyNCwgMTEsIHRydWUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTYoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDEwMCAqIDEwMjQsIDEwICogMTAyNCwgMTAgKiAxMDI0LCA4ICogMTAyNCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtNygpIHsKLSAgICAgICAgYmFzZVRlc3QoMTAwICogMTAyNCwgMTAgKiAxMDI0LCAxMCAqIDEwMjQgKyAxLCA4ICogMTAyNCwgZmFsc2UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTgoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDEwMCAqIDEwMjQsIDEwICogMTAyNCwgOCAqIDEwMjQsIDEyMCAqIDEwMjQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW05KCkgewotICAgICAgICBiYXNlVGVzdCgxMDAgKiAxMDI0LCA4MCAqIDEwMjQsIDc5ICogMTAyNCwgMTIzNCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtMTAoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDkwMCAqIDEwMjQsIDEgKiAxMDI0ICogMTAyNCwgOTAwICogMTAyNCwgOCAqIDEwMjQsIHRydWUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTExKCkgewotICAgICAgICBiYXNlVGVzdCg5MDAgKiAxMDI0LCA1MTIgKiAxMDI0LCA5MDAgKiAxMDI0LCA4ICogMTAyNCwgZmFsc2UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTEyKCkgewotICAgICAgICBiYXNlVGVzdCg5MDAgKiAxMDI0LCAxICogMTAyNCAqIDEwMjQsIDcwMCAqIDEwMjQsIDIzNDUsIHRydWUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbTEzKCkgewotICAgICAgICBiYXNlVGVzdCg5MDAgKiAxMDI0LCAxICogMTAyNCAqIDEwMjQsIDcwMCwgMjM0NSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtMTQoKSB7Ci0gICAgICAgIGJhc2VUZXN0KDkwMCAqIDEwMjQsIDEgKiAxMDI0ICogMTAyNCwgMjA0OCwgMjM0NSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtUmFuZG9tKCkgewotICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IDEgKiAxMDI0ICogMTAyNDsKLSAgICAgICAgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oMTIzNDU2Nzg5MCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgewotICAgICAgICAgICAgaW50IG1heCA9IHJuZC5uZXh0SW50KGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgaW50IHNvYXAgPSBybmQubmV4dEludChidWZmZXJTaXplKTsKLSAgICAgICAgICAgIGludCByZWFkQnVmZmVyU2l6ZSA9IHJuZC5uZXh0SW50KDY0ICogMTAyNCk7Ci0KLSAgICAgICAgICAgIGJhc2VUZXN0KGJ1ZmZlclNpemUsIG1heCwgc29hcCwgcmVhZEJ1ZmZlclNpemUsIHNvYXAgPD0gbWF4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBiYXNlVGVzdChpbnQgYnVmZmVyU2l6ZSwgaW50IG1heCwgaW50IHNvYXAsIGludCByZWFkQnVmZmVyU2l6ZSwgYm9vbGVhbiBzdWNjZXNzKSB7Ci0KLSAgICAgICAgYnl0ZVtdIGJvdW5kYXJ5Qnl0ZXMgPSAoIlxyXG4tLSIgKyBCT1VOREFSWSArICJcclxuIikuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICBieXRlW10gYnl0ZUJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemUgKyAoYm91bmRhcnlCeXRlcy5sZW5ndGgpICogMyArIDJdOwotCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYm91bmRhcnlCeXRlcywgMCwgYnl0ZUJ1ZmZlciwgMCwgYm91bmRhcnlCeXRlcy5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyU2l6ZTsgaSsrKSB7Ci0KLSAgICAgICAgICAgIGlmIChpID09IHNvYXApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJvdW5kYXJ5Qnl0ZXMsIDAsIGJ5dGVCdWZmZXIsIGkgKyBib3VuZGFyeUJ5dGVzLmxlbmd0aCwgYm91bmRhcnlCeXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPCBzb2FwKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZUJ1ZmZlcltpICsgYm91bmRhcnlCeXRlcy5sZW5ndGhdID0gKGJ5dGUpICdTJzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnl0ZUJ1ZmZlcltpICsgYm91bmRhcnlCeXRlcy5sZW5ndGggKiAyXSA9IChieXRlKSAnQyc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJvdW5kYXJ5Qnl0ZXMsIDAsIGJ5dGVCdWZmZXIsIGJ1ZmZlclNpemUgKyBib3VuZGFyeUJ5dGVzLmxlbmd0aCAqIDIsIGJvdW5kYXJ5Qnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgYnl0ZUJ1ZmZlcltieXRlQnVmZmVyLmxlbmd0aCAtIDRdID0gJy0nOwotICAgICAgICBieXRlQnVmZmVyW2J5dGVCdWZmZXIubGVuZ3RoIC0gM10gPSAnLSc7Ci0gICAgICAgIGJ5dGVCdWZmZXJbYnl0ZUJ1ZmZlci5sZW5ndGggLSAyXSA9ICdccic7Ci0gICAgICAgIGJ5dGVCdWZmZXJbYnl0ZUJ1ZmZlci5sZW5ndGggLSAxXSA9ICdcbic7Ci0KLSAgICAgICAgLy8gdGVzdCByZWFkIHdpdGggYnVmZmVyCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIG9yaWdpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQnVmZmVyKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvdGVjdGlvblJlcXVlc3RXcmFwcGVyIHBydyA9IG5ldyBQcm90ZWN0aW9uUmVxdWVzdFdyYXBwZXIoSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZU11bHRpcGFydFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgIEJPVU5EQVJZLCBvcmlnaW5TdHJlYW0pLCBtYXgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gcHJ3LmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudFMgPSAwOwotICAgICAgICAgICAgaW50IGNvdW50QyA9IDA7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtyZWFkQnVmZmVyU2l6ZV07Ci0gICAgICAgICAgICBpbnQgYjsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0cmVhbS5yZWFkKGJ5dGVCdWZmZXIsIDAsIDApKTsKLQotICAgICAgICAgICAgd2hpbGUgKChiID0gc3RyZWFtLnJlYWQoYnVmZmVyKSkgPiAtMSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJbaV0gPT0gJ1MnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudFMrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW2ldID09ICdDJykgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRDKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc29hcCwgY291bnRTKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWZmZXJTaXplIC0gc29hcCwgY291bnRDKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGVzdCBzaW5nbGUgYnl0ZSByZWFkCi0gICAgICAgIG9yaWdpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQnVmZmVyKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvdGVjdGlvblJlcXVlc3RXcmFwcGVyIHBydyA9IG5ldyBQcm90ZWN0aW9uUmVxdWVzdFdyYXBwZXIoSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZU11bHRpcGFydFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgIEJPVU5EQVJZLCBvcmlnaW5TdHJlYW0pLCBtYXgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gcHJ3LmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudFMgPSAwOwotICAgICAgICAgICAgaW50IGNvdW50QyA9IDA7Ci0KLSAgICAgICAgICAgIGludCBiOwotICAgICAgICAgICAgd2hpbGUgKChiID0gc3RyZWFtLnJlYWQoKSkgPiAtMSkgewotICAgICAgICAgICAgICAgIGlmIChiID09ICdTJykgewotICAgICAgICAgICAgICAgICAgICBjb3VudFMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGIgPT0gJ0MnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50QysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb2FwLCBjb3VudFMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1ZmZlclNpemUgLSBzb2FwLCBjb3VudEMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9IdHRwUmVxdWVzdEhlYWRNZXRob2RUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9IdHRwUmVxdWVzdEhlYWRNZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmQ4NzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvSHR0cFJlcXVlc3RIZWFkTWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ2FjaGVIZWFkZXJDb250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmF0b21wdWIuQ21pc0F0b21QdWJTZXJ2bGV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXIuQ21pc0Jyb3dzZXJCaW5kaW5nU2VydmxldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcubW9ja2l0by5Nb2NrOwotaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKLQotcHVibGljIGNsYXNzIEh0dHBSZXF1ZXN0SGVhZE1ldGhvZFRlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1BBVEggPSAiL2NvbnRleHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVE9NUFVCX1NFUlZMRVRfUEFUSCA9ICIvY21pc2F0b20iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VSX1NFUlZMRVRfUEFUSCA9ICIvY21pc2pzb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX0lEID0gIjIyZDI4ODBhLWJhZTUtNGNmYy1hNWE5LTNiMjYxOGU2ZTExYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBQ0tFTkRfU0VSVkVSX1BPUlQgPSA4MDgwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLRU5EX1NFUlZFUl9OQU1FID0gInd3dy5iYWNrZW5kLmJlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0VORF9TRVJWRVJfUFJPVE8gPSAiaHR0cCI7Ci0KLSAgICBATW9jawotICAgIHByaXZhdGUgQ21pc1NlcnZpY2VGYWN0b3J5IGNtaXNTZXJ2aWNlRmFjdG9yeTsKLQotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBDbWlzU2VydmljZSBjbWlzU2VydmljZTsKLQotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBDYWNoZUhlYWRlckNvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbTsKLQotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKLQotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKLQotICAgIEBNb2NrCi0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldFNjaGVtZSgpKS50aGVuUmV0dXJuKEJBQ0tFTkRfU0VSVkVSX1BST1RPKTsKLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKS50aGVuUmV0dXJuKEJBQ0tFTkRfU0VSVkVSX05BTUUpOwotICAgICAgICB3aGVuKHRoaXMucmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpLnRoZW5SZXR1cm4oQkFDS0VORF9TRVJWRVJfUE9SVCk7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpLnRoZW5SZXR1cm4oQ09OVEVYVF9QQVRIKTsKLSAgICAgICAgd2hlbih0aGlzLmNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpKS50aGVuUmV0dXJuKGNvbnRleHQpOwotICAgICAgICB3aGVuKHRoaXMuY29udGV4dC5nZXRBdHRyaWJ1dGUoQ21pc1JlcG9zaXRvcnlDb250ZXh0TGlzdGVuZXIuU0VSVklDRVNfRkFDVE9SWSkpLnRoZW5SZXR1cm4oY21pc1NlcnZpY2VGYWN0b3J5KTsKLSAgICAgICAgd2hlbihjbWlzU2VydmljZUZhY3RvcnkuZ2V0U2VydmljZSgoQ2FsbENvbnRleHQpIGFueSgpKSkudGhlblJldHVybihjbWlzU2VydmljZSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXRvbVB1YkhlYWRSZXF1ZXN0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IENPTlRFWFRfUEFUSCArIEFUT01QVUJfU0VSVkxFVF9QQVRIICsgIi8iICsgUkVQT1NJVE9SWV9JRCArICIvY29udGVudCI7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9ICJpZD0xMjMiOwotICAgICAgICBkb1Rlc3RIZWFkUmVxdWVzdChuZXcgQ21pc0F0b21QdWJTZXJ2bGV0KCksIEFUT01QVUJfU0VSVkxFVF9QQVRILCByZXF1ZXN0VVJJLCBxdWVyeVN0cmluZyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnJvd3NlckJpbmRpbmdIZWFkUmVxdWVzdCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSBDT05URVhUX1BBVEggKyBCUk9XU0VSX1NFUlZMRVRfUEFUSCArICIvIiArIFJFUE9TSVRPUllfSUQgKyAiL3Jvb3QiOwotICAgICAgICBTdHJpbmcgcXVlcnlTdHJpbmcgPSAiY21pc3NlbGVjdG9yPWNvbnRlbnQmb2JqZWN0SWQ9MTIzIjsKLSAgICAgICAgZG9UZXN0SGVhZFJlcXVlc3QobmV3IENtaXNCcm93c2VyQmluZGluZ1NlcnZsZXQoKSwgQlJPV1NFUl9TRVJWTEVUX1BBVEgsIHJlcXVlc3RVUkksIHF1ZXJ5U3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9UZXN0SGVhZFJlcXVlc3QoU2VydmxldCBzZXJ2bGV0LCBTdHJpbmcgc2VydmxldFBhdGgsIFN0cmluZyByZXF1ZXN0VVJJLCBTdHJpbmcgcXVlcnlTdHJpbmcpCi0gICAgICAgICAgICB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkudGhlblJldHVybihzZXJ2bGV0UGF0aCk7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSkudGhlblJldHVybihyZXF1ZXN0VVJJKTsKLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSkudGhlblJldHVybihxdWVyeVN0cmluZyk7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldE1ldGhvZCgpKS50aGVuUmV0dXJuKERpc3BhdGNoZXIuTUVUSE9EX0hFQUQpOwotCi0gICAgICAgIHdoZW4odGhpcy5jbWlzU2VydmljZS5nZXRDb250ZW50U3RyZWFtKFJFUE9TSVRPUllfSUQsICIxMjMiLCBudWxsLCBudWxsLCBudWxsLCBudWxsKSkudGhlblJldHVybihjb250ZW50U3RyZWFtKTsKLSAgICAgICAgd2hlbih0aGlzLmNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpLnRoZW5SZXR1cm4obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCI3ODkiLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgd2hlbih0aGlzLmNvbnRlbnRTdHJlYW0uZ2V0RVRhZygpKS50aGVuUmV0dXJuKCI0NTYiKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSA9IGdldE1vY2tSZXNwb25zZShiYW9zKTsKLSAgICAgICAgc2VydmxldC5pbml0KGNvbmZpZyk7Ci0gICAgICAgIHNlcnZsZXQuc2VydmljZShyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgIHZlcmlmeShyZXNwb25zZSkuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfT0spOwotICAgICAgICB2ZXJpZnkocmVzcG9uc2UpLnNldEhlYWRlcigiRVRhZyIsICJcIjQ1NlwiIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIGdldE1vY2tSZXNwb25zZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3AgPSBtb2NrKEh0dHBTZXJ2bGV0UmVzcG9uc2UuY2xhc3MpOwotICAgICAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIHNvcyA9IG5ldyBTdHViU2VydmxldE91dHB1dFN0cmVhbShvdXQpOwotICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzb3MpOwotICAgICAgICB3aGVuKHJlc3AuZ2V0T3V0cHV0U3RyZWFtKCkpLnRoZW5SZXR1cm4oc29zKTsKLSAgICAgICAgd2hlbihyZXNwLmdldFdyaXRlcigpKS50aGVuUmV0dXJuKHByaW50V3JpdGVyKTsKLSAgICAgICAgcmV0dXJuIHJlc3A7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFVybFNlcnZpY2VDYWxsIGV4dGVuZHMgQWJzdHJhY3RBdG9tUHViU2VydmljZUNhbGwgewotICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2ZShDYWxsQ29udGV4dCBjb250ZXh0LCBDbWlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIG5vIGltcGxlbWVudGF0aW9uCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgU3R1YlNlcnZsZXRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBTZXJ2bGV0T3V0cHV0U3RyZWFtIHsKLSAgICAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3M7Ci0KLSAgICAgICAgcHVibGljIFN0dWJTZXJ2bGV0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvcykgewotICAgICAgICAgICAgdGhpcy5vcyA9IG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBvcy53cml0ZShpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9IdHRwUmVxdWVzdE1vY2tIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL0h0dHBSZXF1ZXN0TW9ja0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2JkY2VmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL0h0dHBSZXF1ZXN0TW9ja0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKLQotcHVibGljIGNsYXNzIEh0dHBSZXF1ZXN0TW9ja0hlbHBlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2bGV0UmVxdWVzdCBjcmVhdGVNdWx0aXBhcnRSZXF1ZXN0KFN0cmluZyBib3VuZGFyeSwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZha2VTZXJ2bGV0SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZha2VTZXJ2bGV0SW5wdXRTdHJlYW0oY29udGVudCk7Ci0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBNb2NraXRvLm1vY2soSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKTsKLSAgICAgICAgTW9ja2l0by53aGVuKHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKSkudGhlblJldHVybigibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9XCIiICsgYm91bmRhcnkgKyAiXCIiKTsKLSAgICAgICAgTW9ja2l0by53aGVuKHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSkudGhlblJldHVybihzdHJlYW0pOwotCi0gICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZsZXRSZXF1ZXN0IGNyZWF0ZU11bHRpcGFydFJlcXVlc3QoU3RyaW5nIGJvdW5kYXJ5LCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZha2VTZXJ2bGV0SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZha2VTZXJ2bGV0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gTW9ja2l0by5tb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7Ci0gICAgICAgIE1vY2tpdG8ud2hlbihyZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpLnRoZW5SZXR1cm4oIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PVwiIiArIGJvdW5kYXJ5ICsgIlwiIik7Ci0gICAgICAgIE1vY2tpdG8ud2hlbihyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpLnRoZW5SZXR1cm4oc3RyZWFtKTsKLQotICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2bGV0UmVxdWVzdCBjcmVhdGVGb3JtUmVxdWVzdChTdHJpbmcgZW5jb2RpbmcsIGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGYWtlU2VydmxldElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGYWtlU2VydmxldElucHV0U3RyZWFtKGNvbnRlbnQpOwotCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gTW9ja2l0by5tb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7Ci0gICAgICAgIE1vY2tpdG8ud2hlbihyZXF1ZXN0LmdldENvbnRlbnRUeXBlKCkpLnRoZW5SZXR1cm4oCi0gICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgKyAoZW5jb2RpbmcgPT0gbnVsbCA/ICIiIDogIjtjaGFyc2V0PSIgKyBlbmNvZGluZykpOwotICAgICAgICBNb2NraXRvLndoZW4ocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKS50aGVuUmV0dXJuKHN0cmVhbSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFrZVNlcnZsZXRJbnB1dFN0cmVhbSBleHRlbmRzIFNlcnZsZXRJbnB1dFN0cmVhbSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBzdHJlYW07Ci0KLSAgICAgICAgcHVibGljIEZha2VTZXJ2bGV0SW5wdXRTdHJlYW0oYnl0ZVtdIGNvbnRlbnQpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZha2VTZXJ2bGV0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKGIsIG9mZiwgbGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWQoYik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9IdHRwVXRpbHNUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9IdHRwVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZTczZTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvSHR0cFV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnNoYXJlZC5IdHRwVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKLQotcHVibGljIGNsYXNzIEh0dHBVdGlsc1Rlc3QgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGZyYWdtZW50czsKLQotICAgICAgICBmcmFnbWVudHMgPSBIdHRwVXRpbHMuc3BsaXRQYXRoKGNyZWF0ZVJlcXVlc3QoImYxL2YyL2YzL2Y0IikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZyYWdtZW50cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBmcmFnbWVudHMubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmMSIsIGZyYWdtZW50c1swXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZjIiLCBmcmFnbWVudHNbMV0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImYzIiwgZnJhZ21lbnRzWzJdKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmNCIsIGZyYWdtZW50c1szXSk7Ci0KLSAgICAgICAgZnJhZ21lbnRzID0gSHR0cFV0aWxzLnNwbGl0UGF0aChjcmVhdGVSZXF1ZXN0KCJmMS8iICsgVVJMRW5jb2Rlci5lbmNvZGUoIiAhwqckJSYvKCk/QCIsICJVVEYtOCIpICsgIi9mMyIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmcmFnbWVudHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgZnJhZ21lbnRzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZjEiLCBmcmFnbWVudHNbMF0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiAhwqckJSYvKCk/QCIsIGZyYWdtZW50c1sxXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZjMiLCBmcmFnbWVudHNbMl0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIdHRwVXRpbHMuc3BsaXRQYXRoKGNyZWF0ZVJlcXVlc3QoImYxLyIgKyBVUkxFbmNvZGVyLmVuY29kZSgieHh4XG54eHgiLCAiVVRGLTgiKSArICIvZjMiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkISIpOwotICAgICAgICB9IGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIdHRwVXRpbHMuc3BsaXRQYXRoKGNyZWF0ZVJlcXVlc3QoImYxLyIgKyBVUkxFbmNvZGVyLmVuY29kZSgieHh4XHJ4eHgiLCAiVVRGLTgiKSArICIvZjMiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkISIpOwotICAgICAgICB9IGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIdHRwVXRpbHMuc3BsaXRQYXRoKGNyZWF0ZVJlcXVlc3QoImYxLyIgKyBVUkxFbmNvZGVyLmVuY29kZSgieHh4XGJ4eHgiLCAiVVRGLTgiKSArICIvZjMiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkISIpOwotICAgICAgICB9IGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIdHRwVXRpbHMuc3BsaXRQYXRoKGNyZWF0ZVJlcXVlc3QoImYxLyIgKyBVUkxFbmNvZGVyLmVuY29kZSgieHh4XHUwMDAweHh4IiwgIlVURi04IikgKyAiL2YzIikpOwotICAgICAgICAgICAgZmFpbCgiQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCEiKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCBjcmVhdGVSZXF1ZXN0KFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gTW9ja2l0by5tb2NrKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7Ci0KLSAgICAgICAgTW9ja2l0by53aGVuKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSkudGhlblJldHVybigiL2NvbnRleHQiKTsKLSAgICAgICAgTW9ja2l0by53aGVuKHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkudGhlblJldHVybigiL3NlcnZsZXQiKTsKLSAgICAgICAgTW9ja2l0by53aGVuKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKS50aGVuUmV0dXJuKCIvY29udGV4dC9zZXJ2bGV0LyIgKyBwYXRoKTsKLQotICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9NdWx0aXBhcnRQYXJzZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9NdWx0aXBhcnRQYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTQ0YTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvTXVsdGlwYXJ0UGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLmJyb3dzZXIuTXVsdGlwYXJ0UGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBUZXN0cyB0aGUgbXVsdGlwYXJ0IHBhcnNlci4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpcGFydFBhcnNlclRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUkVTSE9MRCA9IDQgKiAxMDI0ICogMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJWkUgPSAtMTsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGFydFBhcnNlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSAiLS0tLSBuZXh0IC0tLS0iOwotICAgICAgICBieXRlW10gY29udGVudCA9ICJUaGlzIGlzIGNvbnRlbnQhIi5nZXRCeXRlcygpOwotICAgICAgICBieXRlW10gZm9ybWRhdGEgPSAoIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIiArICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWVsZDFcIlxyXG4iCi0gICAgICAgICAgICAgICAgKyAiXHJcbiIgKyAidmFsdWUxXHJcbiIgKyAiLS0iICsgYm91bmRhcnkgKyAiXHJcbiIKLSAgICAgICAgICAgICAgICArICJjb250ZW50LWRpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWVsZDJcIlxyXG4iICsgIlxyXG4iICsgInZhbHVlMlxyXG4iICsgIi0tIiArIGJvdW5kYXJ5Ci0gICAgICAgICAgICAgICAgKyAiXHJcbiIgKyAiY29udGVudC1kaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmllbGQzXCJcclxuIiArICJcclxuIiArICJ2YWx1ZTNcclxuIiArICItLSIKLSAgICAgICAgICAgICAgICArIGJvdW5kYXJ5ICsgIlxyXG4iCi0gICAgICAgICAgICAgICAgKyAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiY29udGVudFwiOyBmaWxlbmFtZT10ZXN0LWZpbGVuYW1lLnR4dFxyXG4iCi0gICAgICAgICAgICAgICAgKyAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIgKyAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5XHJcbiIgKyAiXHJcbiIKLSAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcoY29udGVudCkgKyAiXHJcbiIgKyAiLS0iICsgYm91bmRhcnkgKyAiLS0iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpOwotCi0gICAgICAgIE11bHRpcGFydFBhcnNlciBwYXJzZXIgPSBwcmVwYXJlUGFyc2VyKGJvdW5kYXJ5LCBmb3JtZGF0YSk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgdmFsdWVzLnB1dCgiZmllbGQxIiwgInZhbHVlMSIpOwotICAgICAgICB2YWx1ZXMucHV0KCJmaWVsZDIiLCAidmFsdWUyIik7Ci0gICAgICAgIHZhbHVlcy5wdXQoImZpZWxkMyIsICJ2YWx1ZTMiKTsKLQotICAgICAgICBhc3NlcnRNdWx0aXBhcnRCYXNpY3MocGFyc2VyLCA0LCB2YWx1ZXMsIHRydWUsICJ0ZXN0LWZpbGVuYW1lLnR4dCIsICJ0ZXh0L3BsYWluIiwgY29udGVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwYXJ0UGFyc2VyMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0xMjk0OTE5MzIzMTk1IjsKLSAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSAiVGVzdCBjb250ZW50ISIuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKTsKLSAgICAgICAgYnl0ZVtdIGZvcm1kYXRhID0gKCJcclxuLS0iCi0gICAgICAgICAgICAgICAgKyBib3VuZGFyeQotICAgICAgICAgICAgICAgICsgIlxyXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWxlVXBsb2FkZXJcIjsgZmlsZW5hbWU9XCLDhC50eHRcIlxyXG5Db250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuXHJcbiIKLSAgICAgICAgICAgICAgICArIG5ldyBTdHJpbmcoY29udGVudCkgKyAiXHJcbi0tIiArIGJvdW5kYXJ5Ci0gICAgICAgICAgICAgICAgKyAiXHJcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpbGVVcGxvYWRlci1kYXRhXCJcclxuXHJcblxyXG4tLSIgKyBib3VuZGFyeQotICAgICAgICAgICAgICAgICsgIlxyXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJvYmplY3RpZFwiXHJcblxyXG5mNmJhZDU0YjQ2OTZiZjJhYzkyNDk4MDVcclxuLS0iCi0gICAgICAgICAgICAgICAgKyBib3VuZGFyeSArICJcclxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiY21pc2FjdGlvblwiXHJcblxyXG5jcmVhdGVEb2N1bWVudFxyXG4tLSIKLSAgICAgICAgICAgICAgICArIGJvdW5kYXJ5ICsgIlxyXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJwcm9wZXJ0eUlkWzBdXCJcclxuXHJcbmNtaXM6bmFtZVxyXG4tLSIKLSAgICAgICAgICAgICAgICArIGJvdW5kYXJ5ICsgIlxyXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJwcm9wZXJ0eVZhbHVlWzBdXCJcclxuXHJcbsOELnR4dFxyXG4tLSIKLSAgICAgICAgICAgICAgICArIGJvdW5kYXJ5Ci0gICAgICAgICAgICAgICAgKyAiXHJcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cInByb3BlcnR5SWRbMV1cIlxyXG5cclxuY21pczpvYmplY3RUeXBlSWRcclxuLS0iCi0gICAgICAgICAgICAgICAgKyBib3VuZGFyeSArICJcclxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwicHJvcGVydHlWYWx1ZVsxXVwiXHJcblxyXG5jbWlzOmRvY3VtZW50XHJcbi0tIgotICAgICAgICAgICAgICAgICsgYm91bmRhcnkKLSAgICAgICAgICAgICAgICArICJcclxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwidG9rZW5cIlxyXG5cclxuODU1NDc1ZDhhNjE2OWI1ZjU3MTExZjU5MjFmNTYxMzZcclxuLS0iCi0gICAgICAgICAgICAgICAgKyBib3VuZGFyeSArICItLSIpLmdldEJ5dGVzKCJJU08tODg1OS0xIik7Ci0KLSAgICAgICAgTXVsdGlwYXJ0UGFyc2VyIHBhcnNlciA9IHByZXBhcmVQYXJzZXIoYm91bmRhcnksIGZvcm1kYXRhKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICB2YWx1ZXMucHV0KCJmaWxlVXBsb2FkZXItZGF0YSIsICIiKTsKLSAgICAgICAgdmFsdWVzLnB1dCgib2JqZWN0aWQiLCAiZjZiYWQ1NGI0Njk2YmYyYWM5MjQ5ODA1Iik7Ci0gICAgICAgIHZhbHVlcy5wdXQoImNtaXNhY3Rpb24iLCAiY3JlYXRlRG9jdW1lbnQiKTsKLSAgICAgICAgdmFsdWVzLnB1dCgicHJvcGVydHlJZFswXSIsICJjbWlzOm5hbWUiKTsKLSAgICAgICAgdmFsdWVzLnB1dCgicHJvcGVydHlWYWx1ZVswXSIsICLDhC50eHQiKTsKLSAgICAgICAgdmFsdWVzLnB1dCgicHJvcGVydHlJZFsxXSIsICJjbWlzOm9iamVjdFR5cGVJZCIpOwotICAgICAgICB2YWx1ZXMucHV0KCJwcm9wZXJ0eVZhbHVlWzFdIiwgImNtaXM6ZG9jdW1lbnQiKTsKLSAgICAgICAgdmFsdWVzLnB1dCgidG9rZW4iLCAiODU1NDc1ZDhhNjE2OWI1ZjU3MTExZjU5MjFmNTYxMzYiKTsKLQotICAgICAgICBhc3NlcnRNdWx0aXBhcnRCYXNpY3MocGFyc2VyLCA5LCB2YWx1ZXMsIHRydWUsICLDhC50eHQiLCAidGV4dC9wbGFpbiIsIGNvbnRlbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vUHJlYW1ibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJvdW5kYXJ5ID0gIkJvVW5EYVJ5LS05ODc2NTQzMjAiOwotICAgICAgICBieXRlW10gZm9ybWRhdGEgPSAoIi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iICsgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpZWxkMVwiXHJcbiIgKyAiXHJcbiIKLSAgICAgICAgICAgICAgICArICJ2YWx1ZTFcclxuIiArICItLSIgKyBib3VuZGFyeSArICItLSIpLmdldEJ5dGVzKCk7Ci0KLSAgICAgICAgTXVsdGlwYXJ0UGFyc2VyIHBhcnNlciA9IHByZXBhcmVQYXJzZXIoYm91bmRhcnksIGZvcm1kYXRhKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICB2YWx1ZXMucHV0KCJmaWVsZDEiLCAidmFsdWUxIik7Ci0KLSAgICAgICAgYXNzZXJ0TXVsdGlwYXJ0QmFzaWNzKHBhcnNlciwgMSwgdmFsdWVzLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlYW1ibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJvdW5kYXJ5ID0gIkJvVW5EYVJ5LS05ODc2NTQzMjAiOwotICAgICAgICBieXRlW10gZm9ybWRhdGEgPSAoIlRoaXMgaXMgYSBwcmVhbWJsZS5cclxuLS0iICsgYm91bmRhcnkgKyAiXHJcbiIKLSAgICAgICAgICAgICAgICArICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWVsZDFcIlxyXG4iICsgIlxyXG4iICsgInZhbHVlMVxyXG4iICsgIi0tIiArIGJvdW5kYXJ5ICsgIi0tIikKLSAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICBNdWx0aXBhcnRQYXJzZXIgcGFyc2VyID0gcHJlcGFyZVBhcnNlcihib3VuZGFyeSwgZm9ybWRhdGEpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHZhbHVlcy5wdXQoImZpZWxkMSIsICJ2YWx1ZTEiKTsKLQotICAgICAgICBhc3NlcnRNdWx0aXBhcnRCYXNpY3MocGFyc2VyLCAxLCB2YWx1ZXMsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcGlsb2d1ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSAiQm9VbkRhUnktLTk4NzY1NDMyMCI7Ci0gICAgICAgIGJ5dGVbXSBmb3JtZGF0YSA9ICgiXHJcbi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iICsgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpZWxkMVwiXHJcbiIKLSAgICAgICAgICAgICAgICArICJcclxuIiArICJ2YWx1ZTFcclxuIiArICItLSIgKyBib3VuZGFyeSArICItLVRoaXMgaXMgYW4gZXBpbG9ndWUuIikuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICBNdWx0aXBhcnRQYXJzZXIgcGFyc2VyID0gcHJlcGFyZVBhcnNlcihib3VuZGFyeSwgZm9ybWRhdGEpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHZhbHVlcy5wdXQoImZpZWxkMSIsICJ2YWx1ZTEiKTsKLQotICAgICAgICBhc3NlcnRNdWx0aXBhcnRCYXNpY3MocGFyc2VyLCAxLCB2YWx1ZXMsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSAiQm9VbkRhUnktLTk4NzY1NDMyMCI7Ci0gICAgICAgIGJ5dGVbXSBmb3JtZGF0YSA9ICgiXHJcbi0tIiArIGJvdW5kYXJ5ICsgIi0tIikuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICBNdWx0aXBhcnRQYXJzZXIgcGFyc2VyID0gcHJlcGFyZVBhcnNlcihib3VuZGFyeSwgZm9ybWRhdGEpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgYXNzZXJ0TXVsdGlwYXJ0QmFzaWNzKHBhcnNlciwgMCwgdmFsdWVzLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJvdW5kYXJ5ID0gIkFCQ0QtMTIzNCI7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50ID0gImFiY8Okw7bDvCIuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgYnl0ZVtdIGZvcm1kYXRhID0gKCJcclxuLS0iICsgYm91bmRhcnkgKyAiXHJcbiIKLSAgICAgICAgICAgICAgICArICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJjb250ZW50XCI7IGZpbGVuYW1lPVwiYSBuZXcgZmlsZVwiXHJcbiIKLSAgICAgICAgICAgICAgICArICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3NvbWV0aGluZ1xyXG4iICsgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG4iICsgIlxyXG4iCi0gICAgICAgICAgICAgICAgKyBuZXcgU3RyaW5nKGNvbnRlbnQpICsgIlxyXG4iICsgIi0tIiArIGJvdW5kYXJ5ICsgIi0tIikuZ2V0Qnl0ZXMoKTsKLQotICAgICAgICBNdWx0aXBhcnRQYXJzZXIgcGFyc2VyID0gcHJlcGFyZVBhcnNlcihib3VuZGFyeSwgZm9ybWRhdGEpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgYXNzZXJ0TXVsdGlwYXJ0QmFzaWNzKHBhcnNlciwgMSwgdmFsdWVzLCB0cnVlLCAiYSBuZXcgZmlsZSIsICJhcHBsaWNhdGlvbi9zb21ldGhpbmciLCBjb250ZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBib3VuZGFyeSA9ICItLS0tIG5leHQgLS0tLSI7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbMiAqIDEwMjQgKiAxMDI0XTsKLQotICAgICAgICBSYW5kb20gcm5kID0gbmV3IFJhbmRvbSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnRlbnRbaV0gPSAoYnl0ZSkgKCdhJyArIHJuZC5uZXh0SW50KCd6JyAtICdhJykpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIGZvcm1kYXRhID0gKCJcclxuLS0iICsgYm91bmRhcnkgKyAiXHJcbiIgKyAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmllbGQxXCJcclxuIgotICAgICAgICAgICAgICAgICsgIlxyXG4iICsgInZhbHVlMVxyXG4iICsgIi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iCi0gICAgICAgICAgICAgICAgKyAiY29udGVudC1kaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmllbGQyXCJcclxuIiArICJcclxuIiArICJ2YWx1ZTJcclxuIiArICItLSIgKyBib3VuZGFyeQotICAgICAgICAgICAgICAgICsgIlxyXG4iICsgImNvbnRlbnQtZGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpZWxkM1wiXHJcbiIgKyAiXHJcbiIgKyAidmFsdWUzXHJcbiIgKyAiLS0iCi0gICAgICAgICAgICAgICAgKyBib3VuZGFyeSArICJcclxuIiArICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJjb250ZW50XCI7IGZpbGVuYW1lPWJpZ3Rlc3QudHh0XHJcbiIKLSAgICAgICAgICAgICAgICArICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIiArICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcclxuIiArICJcclxuIgotICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhjb250ZW50KSArICJcclxuIiArICItLSIgKyBib3VuZGFyeSArICItLSIpLmdldEJ5dGVzKCk7Ci0KLSAgICAgICAgTXVsdGlwYXJ0UGFyc2VyIHBhcnNlciA9IHByZXBhcmVQYXJzZXIoYm91bmRhcnksIGZvcm1kYXRhKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICB2YWx1ZXMucHV0KCJmaWVsZDEiLCAidmFsdWUxIik7Ci0gICAgICAgIHZhbHVlcy5wdXQoImZpZWxkMiIsICJ2YWx1ZTIiKTsKLSAgICAgICAgdmFsdWVzLnB1dCgiZmllbGQzIiwgInZhbHVlMyIpOwotCi0gICAgICAgIGFzc2VydE11bHRpcGFydEJhc2ljcyhwYXJzZXIsIDQsIHZhbHVlcywgdHJ1ZSwgImJpZ3Rlc3QudHh0IiwgInRleHQvcGxhaW4iLCBjb250ZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBib3VuZGFyeSA9ICI9PT09PT09PT09PT0iOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiXHJcbiIpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJmaWVsZCIgKyBpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gInZhbHVlICIgKyBpICogaTsKLQotICAgICAgICAgICAgdmFsdWVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiXHJcbi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iICsgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIiIgKyBuYW1lICsgIlwiXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgKyAiXHJcbiIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQoIlxyXG4iICsgIi0tIiArIGJvdW5kYXJ5ICsgIi0tIik7Ci0KLSAgICAgICAgTXVsdGlwYXJ0UGFyc2VyIHBhcnNlciA9IHByZXBhcmVQYXJzZXIoYm91bmRhcnksIHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoSU9VdGlscy5JU09fODg1OV8xKSk7Ci0KLSAgICAgICAgYXNzZXJ0TXVsdGlwYXJ0QmFzaWNzKHBhcnNlciwgdmFsdWVzLnNpemUoKSwgdmFsdWVzLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExhcmdlRmllbGRzKDY0ICogMTAyNCk7Ci0gICAgICAgIHRlc3RMYXJnZUZpZWxkcygxMjggKiAxMDI0KTsKLSAgICAgICAgdGVzdExhcmdlRmllbGRzKDI1NiAqIDEwMjQpOwotICAgICAgICB0ZXN0TGFyZ2VGaWVsZHMoNTEyICogMTAyNCk7Ci0gICAgICAgIHRlc3RMYXJnZUZpZWxkcygxMDI0ICogMTAyNCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RMYXJnZUZpZWxkcyhpbnQgc2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBib3VuZGFyeSA9ICI9PT09PT09PT09PT0iOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiXHJcbiIpOwotCi0gICAgICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gImZpZWxkIiArIGk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLSAgICAgICAgICAgICAgICB2YWx1ZUJ1ZmZlci5hcHBlbmQoKGNoYXIpICgnYScgKyBybmQubmV4dEludCgyNikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHZhbHVlQnVmZmVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHZhbHVlcy5wdXQobmFtZSwgdmFsdWUpOwotCi0gICAgICAgICAgICBzYi5hcHBlbmQoIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIiArICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCIiICsgbmFtZSArICJcIlxyXG5cclxuIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKCJcclxuIiArICItLSIgKyBib3VuZGFyeSArICItLSIpOwotCi0gICAgICAgIE11bHRpcGFydFBhcnNlciBwYXJzZXIgPSBwcmVwYXJlUGFyc2VyKGJvdW5kYXJ5LCBzYi50b1N0cmluZygpLmdldEJ5dGVzKElPVXRpbHMuSVNPXzg4NTlfMSkpOwotCi0gICAgICAgIGFzc2VydE11bHRpcGFydEJhc2ljcyhwYXJzZXIsIHZhbHVlcy5zaXplKCksIHZhbHVlcywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENoYXJzZXRzSW5Db250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBjaGFyc2V0cyA9IG5ldyBTdHJpbmdbXSB7ICJ1dGYtOCIsICJpc28tODg1OS0xIiwgInV0Zi0xNiIgfTsKLQotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSAibGRjaHFlcml1dm9xZWlyYnZ4aXB1ICBlY2txbnFrbHdqY25xd2tsY3F3bmNxZXdsY2lxZWNxd2VjZXZvaXBvb2VpIGNxd2NvZXdjcSI7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMjU1OyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgoY2hhcikgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICB2YWx1ZXMucHV0KCJmaWVsZDEiLCB2YWx1ZS50b1N0cmluZygpKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBjaGFyc2V0IDogY2hhcnNldHMpIHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoKCJcclxuLS0iICsgYm91bmRhcnkgKyAiXHJcbiIpLmdldEJ5dGVzKCJJU08tODg1OS0xIikpOwotICAgICAgICAgICAgYm9zLndyaXRlKCgiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZmllbGQxXCJcclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9IiArIGNoYXJzZXQgKyAiXHJcblxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSh2YWx1ZS50b1N0cmluZygpLmdldEJ5dGVzKGNoYXJzZXQpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlxyXG4tLSIgKyBib3VuZGFyeSArICItLVxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlRoaXMgaXMgYW4gZXBpbG9ndWUuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0KLSAgICAgICAgICAgIE11bHRpcGFydFBhcnNlciBwYXJzZXIgPSBwcmVwYXJlUGFyc2VyKGJvdW5kYXJ5LCBib3MudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE11bHRpcGFydEJhc2ljcyhwYXJzZXIsIDEsIHZhbHVlcywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldHNBc0V4dHJhRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gY2hhcnNldHMgPSBuZXcgU3RyaW5nW10geyAidXRmLTgiLCAiaXNvLTg4NTktMSIsICJ1dGYtMTYiIH07Ci0KLSAgICAgICAgU3RyaW5nIGJvdW5kYXJ5ID0gImxkY2hxZXJpdXZvcWVpcmJ2eGlwdSAgZWNrcW5xa2x3amNucXdrbGNxd25jcWV3bGNpcWVjcXdlY2V2b2lwb29laSBjcXdjb2V3Y3EiOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHZhbHVlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDI1NTsgaSsrKSB7Ci0gICAgICAgICAgICB2YWx1ZS5hcHBlbmQoKGNoYXIpIGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgdmFsdWVzLnB1dCgiZmllbGQxIiwgdmFsdWUudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgY2hhcnNldCA6IGNoYXJzZXRzKSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgYm9zLndyaXRlKCgiXHJcbi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpZWxkMVwiXHJcblxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSh2YWx1ZS50b1N0cmluZygpLmdldEJ5dGVzKGNoYXJzZXQpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJfY2hhcnNldF9cIlxyXG5cclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoY2hhcnNldC5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlxyXG4tLSIgKyBib3VuZGFyeSArICItLVxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlRoaXMgaXMgYW4gZXBpbG9ndWUuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0KLSAgICAgICAgICAgIE11bHRpcGFydFBhcnNlciBwYXJzZXIgPSBwcmVwYXJlUGFyc2VyKGJvdW5kYXJ5LCBib3MudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE11bHRpcGFydEJhc2ljcyhwYXJzZXIsIDEsIHZhbHVlcywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldHNNaXhlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBjaGFyc2V0cyA9IG5ldyBTdHJpbmdbXSB7ICJ1dGYtOCIsICJpc28tODg1OS0xIiwgInV0Zi0xNiIgfTsKLQotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSAibGRjaHFlcml1dm9xZWlyYnZ4aXB1ICBlY2txbnFrbHdqY25xd2tsY3F3bmNxZXdsY2lxZWNxd2VjZXZvaXBvb2VpIGNxd2NvZXdjcSI7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMjU1OyBpKyspIHsKLSAgICAgICAgICAgIHZhbHVlLmFwcGVuZCgoY2hhcikgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICB2YWx1ZXMucHV0KCJmaWVsZDEiLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgdmFsdWVzLnB1dCgiZmllbGQyIiwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHZhbHVlcy5wdXQoImZpZWxkMyIsIHZhbHVlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGNoYXJzZXQgOiBjaGFyc2V0cykgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWVsZDFcIlxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1cInV0Zi04XCJcclxuXHJcbiIpLmdldEJ5dGVzKCJJU08tODg1OS0xIikpOwotICAgICAgICAgICAgYm9zLndyaXRlKHZhbHVlLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoInV0Zi04IikpOwotICAgICAgICAgICAgYm9zLndyaXRlKCgiXHJcbi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpZWxkMlwiXHJcblxyXG4iKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSh2YWx1ZS50b1N0cmluZygpLmdldEJ5dGVzKGNoYXJzZXQpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJfY2hhcnNldF9cIlxyXG5cclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoY2hhcnNldC5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICAgICAgICAgIGJvcy53cml0ZSgoIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWVsZDNcIlxyXG5cclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUodmFsdWUudG9TdHJpbmcoKS5nZXRCeXRlcyhjaGFyc2V0KSk7Ci0gICAgICAgICAgICBib3Mud3JpdGUoKCJcclxuLS0iICsgYm91bmRhcnkgKyAiLS1cclxuIikuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0KLSAgICAgICAgICAgIE11bHRpcGFydFBhcnNlciBwYXJzZXIgPSBwcmVwYXJlUGFyc2VyKGJvdW5kYXJ5LCBib3MudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE11bHRpcGFydEJhc2ljcyhwYXJzZXIsIDMsIHZhbHVlcywgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0JvdW5kYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBib3VuZGFyeSA9ICIiOwotICAgICAgICBieXRlW10gZm9ybWRhdGEgPSAoIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIiArICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJmaWVsZDFcIlxyXG4iCi0gICAgICAgICAgICAgICAgKyAiXHJcbiIgKyAidmFsdWUxXHJcbiIgKyAiLS0iICsgYm91bmRhcnkgKyAiLS0iKS5nZXRCeXRlcygpOwotCi0gICAgICAgIHByZXBhcmVQYXJzZXIoYm91bmRhcnksIGZvcm1kYXRhKTsKLSAgICB9Ci0KLSAgICBAVGVzdChleHBlY3RlZCA9IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBib3VuZGFyeSA9ICIxNTk4MzQwOTU4MjM0MDU4MjM0MCI7Ci0gICAgICAgIGJ5dGVbXSBmb3JtZGF0YSA9ICgiXHJcbi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iICsgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpZWxkMVwiXHJcbiIKLSAgICAgICAgICAgICAgICArICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9eHl6XHJcbiIgKyAiXHJcbiIgKyAidmFsdWUxXHJcbiIgKyAiLS0iICsgYm91bmRhcnkgKyAiLS0iKQotICAgICAgICAgICAgICAgIC5nZXRCeXRlcygpOwotCi0gICAgICAgIE11bHRpcGFydFBhcnNlciBwYXJzZXIgPSBwcmVwYXJlUGFyc2VyKGJvdW5kYXJ5LCBmb3JtZGF0YSk7Ci0KLSAgICAgICAgYXNzZXJ0TXVsdGlwYXJ0QmFzaWNzKHBhcnNlciwgMSwgbnVsbCwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIEBUZXN0KGV4cGVjdGVkID0gQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvQ29udGVudFBhcnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBib3VuZGFyeSA9ICItPy0iOwotICAgICAgICBieXRlW10gY29udGVudCA9ICJhYmPvv73vv73vv73vv73vv73vv70iLmdldEJ5dGVzKCk7Ci0gICAgICAgIGJ5dGVbXSBmb3JtZGF0YSA9ICgiXHJcbi0tIiArIGJvdW5kYXJ5ICsgIlxyXG4iCi0gICAgICAgICAgICAgICAgKyAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiY29udGVudDFcIjsgZmlsZW5hbWU9XCJmaWxlMVwiXHJcbiIKLSAgICAgICAgICAgICAgICArICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3NvbWV0aGluZ1xyXG4iICsgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeVxyXG4iICsgIlxyXG4iCi0gICAgICAgICAgICAgICAgKyBuZXcgU3RyaW5nKGNvbnRlbnQpICsgIlxyXG4tLSIgKyBib3VuZGFyeSArICJcclxuIgotICAgICAgICAgICAgICAgICsgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImNvbnRlbnQyXCI7IGZpbGVuYW1lPVwiZmlsZTJcIlxyXG4iCi0gICAgICAgICAgICAgICAgKyAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zb21ldGhpbmdcclxuIiArICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcclxuIiArICJcclxuIgotICAgICAgICAgICAgICAgICsgbmV3IFN0cmluZyhjb250ZW50KSArICJcclxuIiArICItLSIgKyBib3VuZGFyeSArICItLSIpLmdldEJ5dGVzKCk7Ci0KLSAgICAgICAgTXVsdGlwYXJ0UGFyc2VyIHBhcnNlciA9IHByZXBhcmVQYXJzZXIoYm91bmRhcnksIGZvcm1kYXRhKTsKLQotICAgICAgICBhc3NlcnRNdWx0aXBhcnRCYXNpY3MocGFyc2VyLCAyLCBudWxsLCB0cnVlLCAiZmlsZTEiLCAiYXBwbGljYXRpb24vc29tZXRoaW5nIiwgY29udGVudCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLSBoZWxwZXJzIC0tLS0KLQotICAgIHByaXZhdGUgTXVsdGlwYXJ0UGFyc2VyIHByZXBhcmVQYXJzZXIoU3RyaW5nIGJvdW5kYXJ5LCBieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZU11bHRpcGFydFJlcXVlc3QoYm91bmRhcnksIGNvbnRlbnQpOwotCi0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UobnVsbCwgVEhSRVNIT0xELAotICAgICAgICAgICAgICAgIE1BWF9TSVpFLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlwYXJ0UGFyc2VyKHJlcXVlc3QsIHN0cmVhbUZhY3RvcnkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIHJlYWRCeXRlc0Zyb21TdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwotICAgICAgICBpbnQgYjsKLSAgICAgICAgd2hpbGUgKChiID0gaXMucmVhZChidWZmZXIpKSA+IC0xKSB7Ci0gICAgICAgICAgICBib3Mud3JpdGUoYnVmZmVyLCAwLCBiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzLmNsb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGJvcy50b0J5dGVBcnJheSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNdWx0aXBhcnRCYXNpY3MoTXVsdGlwYXJ0UGFyc2VyIHBhcnNlciwgaW50IGNvdW50LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlcywKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzQ29udGVudCwgU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgY29udGVudFR5cGUsIGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGNvdW50ZXIgPSAwOwotCi0gICAgICAgIHBhcnNlci5wYXJzZSgpOwotCi0gICAgICAgIGlmIChwYXJzZXIuaGFzQ29udGVudCgpKSB7Ci0gICAgICAgICAgICBjb3VudGVyKys7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGhhc0NvbnRlbnQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGVuYW1lLCBwYXJzZXIuZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudFR5cGUsIHBhcnNlci5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZW50Lmxlbmd0aCwgcGFyc2VyLmdldFNpemUoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGNvbnRlbnQsIHJlYWRCeXRlc0Zyb21TdHJlYW0ocGFyc2VyLmdldFN0cmVhbSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShoYXNDb250ZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBmaWVsZHMgPSBwYXJzZXIuZ2V0RmllbGRzKCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGUgOiBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGUuZ2V0VmFsdWUoKS5sZW5ndGgpOwotCi0gICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWVsZFZhbHVlID0gZS5nZXRWYWx1ZSgpWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmllbGRWYWx1ZSwgdmFsdWVzLmdldChmaWVsZE5hbWUpKTsKLQotICAgICAgICAgICAgY291bnRlcisrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LCBjb3VudGVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50ZXIgLSAoaGFzQ29udGVudCA/IDEgOiAwKSwgZmllbGRzLnNpemUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9QT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyYTM2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9QT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5icm93c2VyLlBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXJUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENIQVJTRVRTID0gbmV3IFN0cmluZ1tdIHsgInV0Zi04IiwgInV0Zi0xNiIsICJJU08tODg1OS0xIiwgIkNwMTI1MiIsICJVVEYtMTZCRSIsCi0gICAgICAgICAgICAiVVRGLTE2TEUiIH07Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJuYW1lMSIsICJ2YWx1ZTEiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm5hbWUyIiwgInZhbHVlMiIsIElPVXRpbHMuVVRGOCk7Ci0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBIdHRwUmVxdWVzdE1vY2tIZWxwZXIuY3JlYXRlRm9ybVJlcXVlc3QobnVsbCwgb3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwb3N0V3JhcHBlciA9IG5ldyBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LCBudWxsKTsKLQotICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuYW1lMSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgYXNzZXJ0UGFyYW1ldGVyKHBvc3RXcmFwcGVyLCAibmFtZTIiLCAidmFsdWUyIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZUZvcm1SZXF1ZXN0KG51bGwsIG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgcG9zdFdyYXBwZXIgPSBuZXcgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBvc3RXcmFwcGVyLmdldFBhcmFtZXRlck1hcCgpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibiIsICJ2IiwgSU9VdGlscy5VVEY4KTsKLQotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBIdHRwUmVxdWVzdE1vY2tIZWxwZXIuY3JlYXRlRm9ybVJlcXVlc3QobnVsbCwgb3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgcG9zdFdyYXBwZXIgPSBuZXcgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFBhcmFtZXRlcihwb3N0V3JhcHBlciwgIm4iLCAidiIpOwotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJhIiwgIjEiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAiYiIsICIyIiwgSU9VdGlscy5VVEY4KTsKLQotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBIdHRwUmVxdWVzdE1vY2tIZWxwZXIuY3JlYXRlRm9ybVJlcXVlc3QobnVsbCwgb3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgcG9zdFdyYXBwZXIgPSBuZXcgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFBhcmFtZXRlcihwb3N0V3JhcHBlciwgImEiLCAiMSIpOwotICAgICAgICAgICAgYXNzZXJ0UGFyYW1ldGVyKHBvc3RXcmFwcGVyLCAiYiIsICIyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGNvdW50ID0gMTAwMDAwOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJuYW1lIiArIGksICJ2w6RsanUiICsgaSwgSU9VdGlscy5VVEY4KTsKLSAgICAgICAgfQotCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZUZvcm1SZXF1ZXN0KElPVXRpbHMuVVRGOCwgb3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwb3N0V3JhcHBlciA9IG5ldyBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LCBudWxsKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQsIHBvc3RXcmFwcGVyLmdldFBhcmFtZXRlck1hcCgpLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuYW1lIiArIGksICJ2w6RsanUiICsgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVZhbHVlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm5hbWUxIiwgInZhbHVlMWEiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm5hbWUxIiwgInZhbHVlMWIiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm5hbWUxIiwgInZhbHVlMWMiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm5hbWUyIiwgInZhbHVlMiIsIElPVXRpbHMuVVRGOCk7Ci0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBIdHRwUmVxdWVzdE1vY2tIZWxwZXIuY3JlYXRlRm9ybVJlcXVlc3QobnVsbCwgb3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwb3N0V3JhcHBlciA9IG5ldyBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LCBudWxsKTsKLQotICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuYW1lMSIsICJ2YWx1ZTFhIiwgInZhbHVlMWIiLCAidmFsdWUxYyIpOwotICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuYW1lMiIsICJ2YWx1ZTIiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm5hbWUxIiwgInZhbHVlMSIsIElPVXRpbHMuVVRGOCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsIG51bGwsICJub2FtZSIsIElPVXRpbHMuVVRGOCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJub3ZhbHVlIiwgbnVsbCwgSU9VdGlscy5VVEY4KTsKLSAgICAgICAgICAgIG91dC53cml0ZSgnJicpOwotICAgICAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm5hbWUyIiwgInZhbHVlMiIsIElPVXRpbHMuVVRGOCk7Ci0KLSAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZUZvcm1SZXF1ZXN0KG51bGwsIG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHBvc3RXcmFwcGVyID0gbmV3IFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuYW1lMSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydFBhcmFtZXRlcihwb3N0V3JhcHBlciwgIm5hbWUyIiwgInZhbHVlMiIpOwotICAgICAgICAgICAgYXNzZXJ0UGFyYW1ldGVyKHBvc3RXcmFwcGVyLCAibm92YWx1ZSIsIChTdHJpbmdbXSkgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcG9zdFdyYXBwZXIuZ2V0UGFyYW1ldGVyTWFwKCkuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCBudWxsLCAibm9hbWUiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibm92YWx1ZSIsIG51bGwsIElPVXRpbHMuVVRGOCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJuYW1lMiIsICJ2YWx1ZTIiLCBJT1V0aWxzLlVURjgpOwotCi0gICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IEh0dHBSZXF1ZXN0TW9ja0hlbHBlci5jcmVhdGVGb3JtUmVxdWVzdChudWxsLCBvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwb3N0V3JhcHBlciA9IG5ldyBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LCBudWxsKTsKLQotICAgICAgICAgICAgYXNzZXJ0UGFyYW1ldGVyKHBvc3RXcmFwcGVyLCAibmFtZTIiLCAidmFsdWUyIik7Ci0gICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJub3ZhbHVlIiwgKFN0cmluZ1tdKSBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBwb3N0V3JhcHBlci5nZXRQYXJhbWV0ZXJNYXAoKS5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJuYW1lMSIsICJ2YWx1ZTEiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCBudWxsLCAibm9hbWUiLCBJT1V0aWxzLlVURjgpOwotICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibm92YWx1ZSIsIG51bGwsIElPVXRpbHMuVVRGOCk7Ci0KLSAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZUZvcm1SZXF1ZXN0KG51bGwsIG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHBvc3RXcmFwcGVyID0gbmV3IFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuYW1lMSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydFBhcmFtZXRlcihwb3N0V3JhcHBlciwgIm5vdmFsdWUiLCAoU3RyaW5nW10pIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBvc3RXcmFwcGVyLmdldFBhcmFtZXRlck1hcCgpLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVcmxFbmNvZGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibi9hJm0lZTEiLCAidsKnYSpsICAjdStlMSIsIElPVXRpbHMuVVRGOCk7Ci0gICAgICAgIG91dC53cml0ZSgnJicpOwotICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibi/DpCZtJWUyIiwgInbCp2EqbCN1K2UyIiwgSU9VdGlscy5VVEY4KTsKLQotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IEh0dHBSZXF1ZXN0TW9ja0hlbHBlci5jcmVhdGVGb3JtUmVxdWVzdChudWxsLCBvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHBvc3RXcmFwcGVyID0gbmV3IFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgIGFzc2VydFBhcmFtZXRlcihwb3N0V3JhcHBlciwgIm4vYSZtJWUxIiwgInbCp2EqbCAgI3UrZTEiKTsKLSAgICAgICAgYXNzZXJ0UGFyYW1ldGVyKHBvc3RXcmFwcGVyLCAibi/DpCZtJWUyIiwgInbCp2EqbCN1K2UyIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldEZpZWxkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChTdHJpbmcgY2hhcnNldCA6IENIQVJTRVRTKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJuL2EmbSVlMSIsICJ2wqdhKmwgICN1K2UxIiwgY2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIl9jaGFyc2V0XyIsIGNoYXJzZXQsIElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm4vw6QmbSVlMiIsICJ2wqdhKmwjdStlMiIsIGNoYXJzZXQpOwotCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSBIdHRwUmVxdWVzdE1vY2tIZWxwZXIuY3JlYXRlRm9ybVJlcXVlc3QobnVsbCwgb3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgIFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHBvc3RXcmFwcGVyID0gbmV3IFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0UGFyYW1ldGVyKHBvc3RXcmFwcGVyLCAibi9hJm0lZTEiLCAidsKnYSpsICAjdStlMSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFBhcmFtZXRlcihwb3N0V3JhcHBlciwgIm4vw6QmbSVlMiIsICJ2wqdhKmwjdStlMiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAiX2NoYXJzZXRfIiwgY2hhcnNldCwgSU9VdGlscy5JU09fODg1OV8xKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibi9hJm0lZTEiLCAidsKnYSpsICAjdStlMSIsIGNoYXJzZXQpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZSgnJicpOwotICAgICAgICAgICAgICAgIGFkZE5hbWVWYWx1ZShvdXQsICJuL8OkJm0lZTIiLCAidsKnYSpsI3UrZTIiLCBjaGFyc2V0KTsKLQotICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZUZvcm1SZXF1ZXN0KG51bGwsIG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwb3N0V3JhcHBlciA9IG5ldyBQT1NUSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydFBhcmFtZXRlcihwb3N0V3JhcHBlciwgIm4vYSZtJWUxIiwgInbCp2EqbCAgI3UrZTEiKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuL8OkJm0lZTIiLCAidsKnYSpsI3UrZTIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIm4vYSZtJWUxIiwgInbCp2EqbCAgI3UrZTEiLCBjaGFyc2V0KTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoJyYnKTsKLSAgICAgICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibi/DpCZtJWUyIiwgInbCp2EqbCN1K2UyIiwgY2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICAgICAgYWRkTmFtZVZhbHVlKG91dCwgIl9jaGFyc2V0XyIsIGNoYXJzZXQsIElPVXRpbHMuSVNPXzg4NTlfMSk7Ci0KLSAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IEh0dHBSZXF1ZXN0TW9ja0hlbHBlci5jcmVhdGVGb3JtUmVxdWVzdChudWxsLCBvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgcG9zdFdyYXBwZXIgPSBuZXcgUE9TVEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuL2EmbSVlMSIsICJ2wqdhKmwgICN1K2UxIik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0UGFyYW1ldGVyKHBvc3RXcmFwcGVyLCAibi/DpCZtJWUyIiwgInbCp2EqbCN1K2UyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyc2V0SGVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChTdHJpbmcgY2hhcnNldCA6IENIQVJTRVRTKSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibi9hJm0lZTEiLCAidsKnYSpsICAjdStlMSIsIGNoYXJzZXQpOwotICAgICAgICAgICAgb3V0LndyaXRlKCcmJyk7Ci0gICAgICAgICAgICBhZGROYW1lVmFsdWUob3V0LCAibi/DpCZtJWUyIiwgInbCp2EqbCN1K2UyIiwgY2hhcnNldCk7Ci0KLSAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3RNb2NrSGVscGVyLmNyZWF0ZUZvcm1SZXF1ZXN0KGNoYXJzZXQsIG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHBvc3RXcmFwcGVyID0gbmV3IFBPU1RIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuL2EmbSVlMSIsICJ2wqdhKmwgICN1K2UxIik7Ci0gICAgICAgICAgICBhc3NlcnRQYXJhbWV0ZXIocG9zdFdyYXBwZXIsICJuL8OkJm0lZTIiLCAidsKnYSpsI3UrZTIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZE5hbWVWYWx1ZShPdXRwdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZShVUkxFbmNvZGVyLmVuY29kZShuYW1lLCBlbmNvZGluZykuZ2V0Qnl0ZXMoSU9VdGlscy5JU09fODg1OV8xKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJlYW0ud3JpdGUoJz0nKTsKLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RyZWFtLndyaXRlKFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlLCBlbmNvZGluZykuZ2V0Qnl0ZXMoSU9VdGlscy5JU09fODg1OV8xKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQYXJhbWV0ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB3cmFwcGVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIHZhbHVlcykgewotICAgICAgICBTdHJpbmdbXSBwVmFsdWVzID0gd3JhcHBlci5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocFZhbHVlcyk7Ci0KLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcFZhbHVlcy5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwVmFsdWVzWzBdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXMubGVuZ3RoLCBwVmFsdWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXNbaV0sIHBWYWx1ZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvUHJveHlSZXF1ZXN0VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvUHJveHlSZXF1ZXN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2UwNzdlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9pbXBsL1Byb3h5UmVxdWVzdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmltcGw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuZmlsdGVyLlByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbC5hdG9tcHViLkFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9jazsKLWltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvQW5ub3RhdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBQcm94eVJlcXVlc3RUZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9SV0FSREVEX1NFUlZFUl9QT1JUID0gMjQ0MzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSREVEX1NFUlZFUl9OQU1FID0gInd3dy5mcm9udGVuZC5vcmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJERURfSE9TVCA9IEZPUldBUkRFRF9TRVJWRVJfTkFNRSArICI6IiArIEZPUldBUkRFRF9TRVJWRVJfUE9SVDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSREVEX0hUVFBTX1BST1RPID0gUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLkhUVFBTX1NDSEVNRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SV0FSREVEX0hUVFBfUFJPVE8gPSBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuSFRUUF9TQ0hFTUU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUEFUSCA9ICIvY29udGV4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfUEFUSCA9ICJjbWlzYXRvbSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAiMjJkMjg4MGEtIGJhZTUtNGNmYy1hNWE5LTNiMjYxOGU2ZTExYyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUEVDVEVEX1BBVEggPSBDT05URVhUX1BBVEggKyAiLyIgKyBTRVJWTEVUX1BBVEggKyAiLyIgKyBSRVBPU0lUT1JZX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCQUNLRU5EX1NFUlZFUl9QT1JUID0gODA4MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0VORF9TRVJWRVJfTkFNRSA9ICJ3d3cuYmFja2VuZC5iZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tFTkRfU0VSVkVSX1BST1RPID0gUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLkhUVFBfU0NIRU1FOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVXJsU2VyaXZjZUNhbGwgVVJMX1NFUlZJQ0VfQ0FMTCA9IG5ldyBVcmxTZXJpdmNlQ2FsbCgpOwotCi0gICAgQE1vY2sKLSAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldFNjaGVtZSgpKS50aGVuUmV0dXJuKEJBQ0tFTkRfU0VSVkVSX1BST1RPKTsKLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKS50aGVuUmV0dXJuKEJBQ0tFTkRfU0VSVkVSX05BTUUpOwotICAgICAgICB3aGVuKHRoaXMucmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCkpLnRoZW5SZXR1cm4oQkFDS0VORF9TRVJWRVJfUE9SVCk7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpLnRoZW5SZXR1cm4oQ09OVEVYVF9QQVRIKTsKLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSkudGhlblJldHVybihTRVJWTEVUX1BBVEgpOwotICAgICAgICB3aGVuKHRoaXMucmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpLnRoZW5SZXR1cm4oQ09OVEVYVF9QQVRIICsgIi8iICsgU0VSVkxFVF9QQVRIKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm94aWVkUHJvdG9CYXNlQWRkcmVzcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotICAgICAgICB3aGVuKHRoaXMucmVxdWVzdC5nZXRIZWFkZXIoUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLkZPUldBUkRFRF9QUk9UT19IRUFERVIpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIEZPUldBUkRFRF9IVFRQU19QUk9UTyk7Ci0KLSAgICAgICAgUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHByb3h5UmVxdWVzdCA9IG5ldyBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9IVFRQU19QUk9UTywgcHJveHlSZXF1ZXN0LmdldFNjaGVtZSgpKTsKLQotICAgICAgICBVUkkgYmFzZVVyaSA9IG5ldyBVUkkoVVJMX1NFUlZJQ0VfQ0FMTC5jb21waWxlQmFzZVVybChwcm94eVJlcXVlc3QsIFJFUE9TSVRPUllfSUQpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhGT1JXQVJERURfSFRUUFNfUFJPVE8sIGJhc2VVcmkuZ2V0U2NoZW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQkFDS0VORF9TRVJWRVJfTkFNRSwgYmFzZVVyaS5nZXRIb3N0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQkFDS0VORF9TRVJWRVJfUE9SVCwgYmFzZVVyaS5nZXRQb3J0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfUEFUSCwgYmFzZVVyaS5nZXRQYXRoKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFByb3hpZWRIb3N0QmFzZUFkZHJlc3NBbmRIdHRwc1Byb3RvKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldEhlYWRlcihQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuRk9SV0FSREVEX1BST1RPX0hFQURFUikpLnRoZW5SZXR1cm4oCi0gICAgICAgICAgICAgICAgRk9SV0FSREVEX0hUVFBTX1BST1RPKTsKLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0SGVhZGVyKFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5GT1JXQVJERURfSE9TVF9IRUFERVIpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIEZPUldBUkRFRF9TRVJWRVJfTkFNRSk7Ci0KLSAgICAgICAgUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHByb3h5UmVxdWVzdCA9IG5ldyBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgbnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9IVFRQU19QUk9UTywgcHJveHlSZXF1ZXN0LmdldFNjaGVtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9TRVJWRVJfTkFNRSwgcHJveHlSZXF1ZXN0LmdldFNlcnZlck5hbWUoKSk7Ci0KLSAgICAgICAgVVJJIGJhc2VVcmkgPSBuZXcgVVJJKFVSTF9TRVJWSUNFX0NBTEwuY29tcGlsZUJhc2VVcmwocHJveHlSZXF1ZXN0LCBSRVBPU0lUT1JZX0lEKS50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX0hUVFBTX1BST1RPLCBiYXNlVXJpLmdldFNjaGVtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9TRVJWRVJfTkFNRSwgYmFzZVVyaS5nZXRIb3N0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGJhc2VVcmkuZ2V0UG9ydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1BBVEgsIGJhc2VVcmkuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm94aWVkSG9zdEJhc2VBZGRyZXNzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldEhlYWRlcihQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuRk9SV0FSREVEX0hPU1RfSEVBREVSKSkudGhlblJldHVybigKLSAgICAgICAgICAgICAgICBGT1JXQVJERURfU0VSVkVSX05BTUUpOwotCi0gICAgICAgIFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwcm94eVJlcXVlc3QgPSBuZXcgUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhGT1JXQVJERURfU0VSVkVSX05BTUUsIHByb3h5UmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkpOwotCi0gICAgICAgIFVSSSBiYXNlVXJpID0gbmV3IFVSSShVUkxfU0VSVklDRV9DQUxMLmNvbXBpbGVCYXNlVXJsKHByb3h5UmVxdWVzdCwgUkVQT1NJVE9SWV9JRCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBQ0tFTkRfU0VSVkVSX1BST1RPLCBiYXNlVXJpLmdldFNjaGVtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9TRVJWRVJfTkFNRSwgYmFzZVVyaS5nZXRIb3N0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGJhc2VVcmkuZ2V0UG9ydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1BBVEgsIGJhc2VVcmkuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm94aWVkSG9zdEJhc2VBZGRyZXNzQW5kUGF0aCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGF0aCA9ICIvdGVzdCI7Ci0KLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0SGVhZGVyKFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5GT1JXQVJERURfSE9TVF9IRUFERVIpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIEZPUldBUkRFRF9TRVJWRVJfTkFNRSk7Ci0KLSAgICAgICAgUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHByb3h5UmVxdWVzdCA9IG5ldyBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgcGF0aCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9TRVJWRVJfTkFNRSwgcHJveHlSZXF1ZXN0LmdldFNlcnZlck5hbWUoKSk7Ci0KLSAgICAgICAgVVJJIGJhc2VVcmkgPSBuZXcgVVJJKFVSTF9TRVJWSUNFX0NBTEwuY29tcGlsZUJhc2VVcmwocHJveHlSZXF1ZXN0LCBSRVBPU0lUT1JZX0lEKS50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoQkFDS0VORF9TRVJWRVJfUFJPVE8sIGJhc2VVcmkuZ2V0U2NoZW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX1NFUlZFUl9OQU1FLCBiYXNlVXJpLmdldEhvc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygtMSwgYmFzZVVyaS5nZXRQb3J0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGF0aCArICIvIiArIFNFUlZMRVRfUEFUSCArICIvIiArIFJFUE9TSVRPUllfSUQsIGJhc2VVcmkuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm94aWVkSG9zdEFuZFBvcnRCYXNlQWRkcmVzcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotICAgICAgICB3aGVuKHRoaXMucmVxdWVzdC5nZXRIZWFkZXIoUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLkZPUldBUkRFRF9IT1NUX0hFQURFUikpLnRoZW5SZXR1cm4oRk9SV0FSREVEX0hPU1QpOwotCi0gICAgICAgIFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwcm94eVJlcXVlc3QgPSBuZXcgUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgIGFzc2VydFRydWUoRk9SV0FSREVEX0hPU1Quc3RhcnRzV2l0aChwcm94eVJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKSk7Ci0KLSAgICAgICAgVVJJIGJhc2VVcmkgPSBuZXcgVVJJKFVSTF9TRVJWSUNFX0NBTEwuY29tcGlsZUJhc2VVcmwocHJveHlSZXF1ZXN0LCBSRVBPU0lUT1JZX0lEKS50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoQkFDS0VORF9TRVJWRVJfUFJPVE8sIGJhc2VVcmkuZ2V0U2NoZW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX1NFUlZFUl9OQU1FLCBiYXNlVXJpLmdldEhvc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGT1JXQVJERURfU0VSVkVSX1BPUlQsIGJhc2VVcmkuZ2V0UG9ydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1BBVEgsIGJhc2VVcmkuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm94aWVkSG9zdFBvcnRBbmRQcm90b0Jhc2VBZGRyZXNzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldEhlYWRlcihQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuRk9SV0FSREVEX1BST1RPX0hFQURFUikpLnRoZW5SZXR1cm4oCi0gICAgICAgICAgICAgICAgRk9SV0FSREVEX0hUVFBTX1BST1RPKTsKLSAgICAgICAgd2hlbih0aGlzLnJlcXVlc3QuZ2V0SGVhZGVyKFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5GT1JXQVJERURfSE9TVF9IRUFERVIpKS50aGVuUmV0dXJuKEZPUldBUkRFRF9IT1NUKTsKLQotICAgICAgICBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgcHJveHlSZXF1ZXN0ID0gbmV3IFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LCBudWxsKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX0hUVFBTX1BST1RPLCBwcm94eVJlcXVlc3QuZ2V0U2NoZW1lKCkpOwotICAgICAgICBhc3NlcnRUcnVlKEZPUldBUkRFRF9IT1NULnN0YXJ0c1dpdGgocHJveHlSZXF1ZXN0LmdldFNlcnZlck5hbWUoKSkpOwotCi0gICAgICAgIFVSSSBiYXNlVXJpID0gbmV3IFVSSShVUkxfU0VSVklDRV9DQUxMLmNvbXBpbGVCYXNlVXJsKHByb3h5UmVxdWVzdCwgUkVQT1NJVE9SWV9JRCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9IVFRQU19QUk9UTywgYmFzZVVyaS5nZXRTY2hlbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGT1JXQVJERURfU0VSVkVSX05BTUUsIGJhc2VVcmkuZ2V0SG9zdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9TRVJWRVJfUE9SVCwgYmFzZVVyaS5nZXRQb3J0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfUEFUSCwgYmFzZVVyaS5nZXRQYXRoKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFByb3hpZWRIb3N0QmFkSHR0cFBvcnRBbmRQcm90b0Jhc2VBZGRyZXNzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldEhlYWRlcihQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuRk9SV0FSREVEX1BST1RPX0hFQURFUikpLnRoZW5SZXR1cm4oCi0gICAgICAgICAgICAgICAgRk9SV0FSREVEX0hUVFBfUFJPVE8pOwotICAgICAgICB3aGVuKHRoaXMucmVxdWVzdC5nZXRIZWFkZXIoUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLkZPUldBUkRFRF9IT1NUX0hFQURFUikpLnRoZW5SZXR1cm4oCi0gICAgICAgICAgICAgICAgRk9SV0FSREVEX1NFUlZFUl9OQU1FICsgIjpub3BvcnRudW1iZXIiKTsKLQotICAgICAgICBQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgcHJveHlSZXF1ZXN0ID0gbmV3IFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LCBudWxsKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX0hUVFBfUFJPVE8sIHByb3h5UmVxdWVzdC5nZXRTY2hlbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRk9SV0FSREVEX0hPU1Quc3RhcnRzV2l0aChwcm94eVJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKSk7Ci0KLSAgICAgICAgVVJJIGJhc2VVcmkgPSBuZXcgVVJJKFVSTF9TRVJWSUNFX0NBTEwuY29tcGlsZUJhc2VVcmwocHJveHlSZXF1ZXN0LCBSRVBPU0lUT1JZX0lEKS50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX0hUVFBfUFJPVE8sIGJhc2VVcmkuZ2V0U2NoZW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX1NFUlZFUl9OQU1FLCBiYXNlVXJpLmdldEhvc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygtMSwgYmFzZVVyaS5nZXRQb3J0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfUEFUSCwgYmFzZVVyaS5nZXRQYXRoKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFByb3hpZWRIb3N0QmFkSHR0cHNQb3J0QW5kUHJvdG9CYXNlQWRkcmVzcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotICAgICAgICB3aGVuKHRoaXMucmVxdWVzdC5nZXRIZWFkZXIoUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLkZPUldBUkRFRF9QUk9UT19IRUFERVIpKS50aGVuUmV0dXJuKAotICAgICAgICAgICAgICAgIEZPUldBUkRFRF9IVFRQU19QUk9UTyk7Ci0gICAgICAgIHdoZW4odGhpcy5yZXF1ZXN0LmdldEhlYWRlcihQcm94eUh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIuRk9SV0FSREVEX0hPU1RfSEVBREVSKSkudGhlblJldHVybigKLSAgICAgICAgICAgICAgICBGT1JXQVJERURfU0VSVkVSX05BTUUgKyAiOm5vcG9ydG51bWJlciIpOwotCi0gICAgICAgIFByb3h5SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciBwcm94eVJlcXVlc3QgPSBuZXcgUHJveHlIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhGT1JXQVJERURfSFRUUFNfUFJPVE8sIHByb3h5UmVxdWVzdC5nZXRTY2hlbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRk9SV0FSREVEX0hPU1Quc3RhcnRzV2l0aChwcm94eVJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpKSk7Ci0KLSAgICAgICAgVVJJIGJhc2VVcmkgPSBuZXcgVVJJKFVSTF9TRVJWSUNFX0NBTEwuY29tcGlsZUJhc2VVcmwocHJveHlSZXF1ZXN0LCBSRVBPU0lUT1JZX0lEKS50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoRk9SV0FSREVEX0hUVFBTX1BST1RPLCBiYXNlVXJpLmdldFNjaGVtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZPUldBUkRFRF9TRVJWRVJfTkFNRSwgYmFzZVVyaS5nZXRIb3N0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGJhc2VVcmkuZ2V0UG9ydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVYUEVDVEVEX1BBVEgsIGJhc2VVcmkuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxlQmFzZVVybCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotICAgICAgICBVUkkgYmFzZVVyaSA9IG5ldyBVUkkoVVJMX1NFUlZJQ0VfQ0FMTC5jb21waWxlQmFzZVVybChyZXF1ZXN0LCBSRVBPU0lUT1JZX0lEKS50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoQkFDS0VORF9TRVJWRVJfUFJPVE8sIGJhc2VVcmkuZ2V0U2NoZW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQkFDS0VORF9TRVJWRVJfTkFNRSwgYmFzZVVyaS5nZXRIb3N0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQkFDS0VORF9TRVJWRVJfUE9SVCwgYmFzZVVyaS5nZXRQb3J0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfUEFUSCwgYmFzZVVyaS5nZXRQYXRoKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBVcmxTZXJpdmNlQ2FsbCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlNlcnZpY2VDYWxsIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VydmUoQ2FsbENvbnRleHQgY29udGV4dCwgQ21pc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBubyBpbXBsZW1lbnRhdGlvbgotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9UaHJlc2hvbGRPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvaW1wbC9UaHJlc2hvbGRPdXRwdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWI1NTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvVGhyZXNob2xkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuVGVtcFN0b3JlT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zaGFyZWQuVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRocmVzaG9sZE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkLlRocmVzaG9sZE91dHB1dFN0cmVhbS5UaHJlc2hvbGRJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFRocmVzaG9sZE91dHB1dFN0cmVhbVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRV8xID0gInNvbWUvdHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRV8yID0gImFub3RoZXIvdHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRV8xID0gImZpbGUxLnR4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRV8yID0gInRoZV9vdGhlcl9maWxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gQ09OVEVOVCA9ICJIZWxsbyIuZ2V0Qnl0ZXMoKTsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEluTWVtb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3Rvcnkgc3RyZWFtRmFjdG9yeSA9IFRlbXBTdG9yZU91dHB1dFN0cmVhbUZhY3RvcnkubmV3SW5zdGFuY2UobnVsbCwgMTAyNCwgMTAyNCwgZmFsc2UpOwotCi0gICAgICAgIFRlbXBTdG9yZU91dHB1dFN0cmVhbSB0ZW1wU3RyZWFtID0gc3RyZWFtRmFjdG9yeS5uZXdPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgdGVtcFN0cmVhbS5zZXRNaW1lVHlwZShNSU1FX1RZUEVfMSk7Ci0gICAgICAgIHRlbXBTdHJlYW0uc2V0RmlsZU5hbWUoRklMRV9OQU1FXzEpOwotICAgICAgICBhc3NlcnRUcnVlKHRlbXBTdHJlYW0gaW5zdGFuY2VvZiBUaHJlc2hvbGRPdXRwdXRTdHJlYW0pOwotCi0gICAgICAgIC8vIHNldCBjb250ZW50Ci0gICAgICAgIFRocmVzaG9sZE91dHB1dFN0cmVhbSB0b3MgPSAoVGhyZXNob2xkT3V0cHV0U3RyZWFtKSB0ZW1wU3RyZWFtOwotICAgICAgICB0b3Mud3JpdGUoQ09OVEVOVCk7Ci0gICAgICAgIHRvcy5jbG9zZSgpOwotCi0gICAgICAgIC8vIGdldCBhbmQgY2hlY2sgaW5wdXQgc3RyZWFtCi0gICAgICAgIFRocmVzaG9sZElucHV0U3RyZWFtIHRpcyA9IChUaHJlc2hvbGRJbnB1dFN0cmVhbSkgdG9zLmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0aXMuaXNJbk1lbW9yeSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh0aXMuZ2V0VGVtcG9yYXJ5RmlsZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0aXMubWFya1N1cHBvcnRlZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRFTlQubGVuZ3RoLCB0aXMuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhDT05URU5ULCBnZXRCeXRlc0Zyb21BcnJheSh0aXMuZ2V0Qnl0ZXMoKSwgKGludCkgdGlzLmdldExlbmd0aCgpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNSU1FX1RZUEVfMSwgdGlzLmdldE1pbWVUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRklMRV9OQU1FXzEsIHRpcy5nZXRGaWxlTmFtZSgpKTsKLQotICAgICAgICAvLyByZWFkIHN0cmVhbQotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQ09OVEVOVC5sZW5ndGhdOwotICAgICAgICBpbnQgbGVuID0gdGlzLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRFTlQubGVuZ3RoLCBsZW4pOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhDT05URU5ULCBidWZmZXIpOwotCi0gICAgICAgIC8vIHJld2luZCBhbmQgcmVhZCBhZ2FpbgotICAgICAgICB0aXMucmV3aW5kKCk7Ci0gICAgICAgIGxlbiA9IHRpcy5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT05URU5ULmxlbmd0aCwgbGVuKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoQ09OVEVOVCwgYnVmZmVyKTsKLQotICAgICAgICAvLyBtYXJrIGFuZCByZXNldAotICAgICAgICB0aXMucmV3aW5kKCk7Ci0gICAgICAgIHRpcy5yZWFkKCk7Ci0gICAgICAgIHRpcy5tYXJrKDEwMjQpOwotICAgICAgICB0aXMucmVhZCgpOwotICAgICAgICB0aXMucmVhZCgpOwotICAgICAgICB0aXMucmVzZXQoKTsKLSAgICAgICAgbGVuID0gdGlzLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRFTlQubGVuZ3RoIC0gMSwgbGVuKTsKLQotICAgICAgICAvLyBjbG9zZSBhbmQgY2hlY2sKLSAgICAgICAgdGlzLmNsb3NlKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCB0aXMucmVhZCgpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGlzLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQhIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5ID0gVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZShudWxsLCAwLCAxMDI0LCBmYWxzZSk7Ci0KLSAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtIHRlbXBTdHJlYW0gPSBzdHJlYW1GYWN0b3J5Lm5ld091dHB1dFN0cmVhbSgpOwotICAgICAgICB0ZW1wU3RyZWFtLnNldE1pbWVUeXBlKE1JTUVfVFlQRV8yKTsKLSAgICAgICAgdGVtcFN0cmVhbS5zZXRGaWxlTmFtZShGSUxFX05BTUVfMik7Ci0gICAgICAgIGFzc2VydFRydWUodGVtcFN0cmVhbSBpbnN0YW5jZW9mIFRocmVzaG9sZE91dHB1dFN0cmVhbSk7Ci0KLSAgICAgICAgLy8gc2V0IGNvbnRlbnQKLSAgICAgICAgVGhyZXNob2xkT3V0cHV0U3RyZWFtIHRvcyA9IChUaHJlc2hvbGRPdXRwdXRTdHJlYW0pIHRlbXBTdHJlYW07Ci0gICAgICAgIHRvcy53cml0ZShDT05URU5UKTsKLSAgICAgICAgdG9zLmNsb3NlKCk7Ci0KLSAgICAgICAgLy8gZ2V0IGFuZCBjaGVjayBpbnB1dCBzdHJlYW0KLSAgICAgICAgVGhyZXNob2xkSW5wdXRTdHJlYW0gdGlzID0gKFRocmVzaG9sZElucHV0U3RyZWFtKSB0b3MuZ2V0SW5wdXRTdHJlYW0oKTsKLQotICAgICAgICBhc3NlcnRGYWxzZSh0aXMuaXNJbk1lbW9yeSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0aXMubWFya1N1cHBvcnRlZCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh0aXMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT05URU5ULmxlbmd0aCwgdGlzLmdldExlbmd0aCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1JTUVfVFlQRV8yLCB0aXMuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGSUxFX05BTUVfMiwgdGlzLmdldEZpbGVOYW1lKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUodGlzLmdldFRlbXBvcmFyeUZpbGUoKS5leGlzdHMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT05URU5ULmxlbmd0aCwgdGlzLmdldFRlbXBvcmFyeUZpbGUoKS5sZW5ndGgoKSk7Ci0KLSAgICAgICAgLy8gcmVhZCBzdHJlYW0KLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0NPTlRFTlQubGVuZ3RoXTsKLSAgICAgICAgaW50IGxlbiA9IHRpcy5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT05URU5ULmxlbmd0aCwgbGVuKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoQ09OVEVOVCwgYnVmZmVyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0aXMuZ2V0VGVtcG9yYXJ5RmlsZSgpLmV4aXN0cygpKTsKLQotICAgICAgICAvLyByZXdpbmQgYW5kIHJlYWQgYWdhaW4KLSAgICAgICAgdGlzLnJld2luZCgpOwotICAgICAgICBsZW4gPSB0aXMucmVhZChidWZmZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEVOVC5sZW5ndGgsIGxlbik7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKENPTlRFTlQsIGJ1ZmZlcik7Ci0gICAgICAgIGFzc2VydFRydWUodGlzLmdldFRlbXBvcmFyeUZpbGUoKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgLy8gbWFyayBhbmQgcmVzZXQKLSAgICAgICAgdGlzLnJld2luZCgpOwotICAgICAgICB0aXMucmVhZCgpOwotICAgICAgICB0aXMubWFyaygxMDI0KTsKLSAgICAgICAgdGlzLnJlYWQoKTsKLSAgICAgICAgdGlzLnJlYWQoKTsKLSAgICAgICAgdGlzLnJlc2V0KCk7Ci0gICAgICAgIGxlbiA9IHRpcy5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDT05URU5ULmxlbmd0aCAtIDEsIGxlbik7Ci0KLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IHRpcy5nZXRUZW1wb3JhcnlGaWxlKCk7Ci0KLSAgICAgICAgLy8gY2xvc2UgYW5kIGNoZWNrCi0gICAgICAgIHRpcy5jbG9zZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygtMSwgdGlzLnJlYWQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHRlbXBGaWxlLmV4aXN0cygpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGlzLmdldFRlbXBvcmFyeUZpbGUoKTsKLSAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCEiKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJlc2hvbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHRocmVzaG9sZCA9IDg7Ci0KLSAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeSBzdHJlYW1GYWN0b3J5ID0gVGVtcFN0b3JlT3V0cHV0U3RyZWFtRmFjdG9yeS5uZXdJbnN0YW5jZShudWxsLCB0aHJlc2hvbGQsIDEwMjQsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotICAgICAgICAgICAgVGVtcFN0b3JlT3V0cHV0U3RyZWFtIHRlbXBTdHJlYW0gPSBzdHJlYW1GYWN0b3J5Lm5ld091dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZW1wU3RyZWFtIGluc3RhbmNlb2YgVGhyZXNob2xkT3V0cHV0U3RyZWFtKTsKLQotICAgICAgICAgICAgVGhyZXNob2xkT3V0cHV0U3RyZWFtIHRvcyA9IChUaHJlc2hvbGRPdXRwdXRTdHJlYW0pIHRlbXBTdHJlYW07Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotICAgICAgICAgICAgICAgIHRvcy53cml0ZSgnMCcgKyBqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBUaHJlc2hvbGRJbnB1dFN0cmVhbSB0aXMgPSAoVGhyZXNob2xkSW5wdXRTdHJlYW0pIHRvcy5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKGkgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSh0aXMuaXNJbk1lbW9yeSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0aXMuaXNJbk1lbW9yeSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IHRpcy5nZXRUZW1wb3JhcnlGaWxlKCk7Ci0KLSAgICAgICAgICAgIHRpcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHRpcy5yZWFkKCkpOwotICAgICAgICAgICAgaWYgKHRpcy5pc0luTWVtb3J5KCkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROdWxsKHRlbXBGaWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZW1wRmlsZSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGVtcEZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gZ2V0Qnl0ZXNGcm9tQXJyYXkoYnl0ZVtdIGJ1ZmZlciwgaW50IGxlbikgewotICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuXTsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWV4dGVuc2lvbi1hcmNoZXR5cGUvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYWUwMTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWV4dGVuc2lvbi1hcmNoZXR5cGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MgcmVxdWlyZWQgYnkKLSAgICAgICAgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi0gICAgICAgIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAgICAgICAgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAgICAgICAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZcO8IExpY2Vuc2UuCi0gICAgLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWV4dGVuc2lvbi1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+T3BlbkNNSVMgU2VydmVyIEV4dGVuc2lvbiBBcmNoZXR5cGU8L25hbWU+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1hcmNoZXR5cGU8L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+T3BlbkNNSVMgU2VydmVyIEV4dGVuc2lvbiBhcmNoZXR5cGU8L2Rlc2NyaXB0aW9uPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICAgICAgPG9wZW5jbWlzVmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L29wZW5jbWlzVmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8YnVpbGQ+ICAgCi0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmFyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmFyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0KLSAgICAgICAgPGV4dGVuc2lvbnM+Ci0gICAgICAgICAgICA8ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uYXJjaGV0eXBlPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFyY2hldHlwZS1wYWNrYWdpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvZXh0ZW5zaW9ucz4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFyY2hldHlwZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+aW50ZWdyYXRpb24tdGVzdDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+aW50ZWdyYXRpb24tdGVzdDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPGVzY2FwZVN0cmluZz5cPC9lc2NhcGVTdHJpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWV4dGVuc2lvbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTMwOGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWV4dGVuc2lvbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi0gICAgPCEtLQotICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgICAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcwotICAgICAgICByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAgLS0+Ci0KLTxhcmNoZXR5cGUtZGVzY3JpcHRvciBuYW1lPSJPcGVuQ01JUyBTZXJ2ZXIgRXh0ZW5zaW9uIj4KLQotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci0KLSAgICA8cmVxdWlyZWRQcm9wZXJ0aWVzPgotICAgICAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9InByb2plY3RQcmVmaXgiLz4KLSAgICA8L3JlcXVpcmVkUHJvcGVydGllcz4KLQotPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZXh0ZW5zaW9uLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWV4dGVuc2lvbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1ZmQ4OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZXh0ZW5zaW9uLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPGdyb3VwSWQ+XCR7Z3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+XCR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+XCR7dmVyc2lvbn08L3ZlcnNpb24+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPG9wZW5jbWlzLnZlcnNpb24+JHtvcGVuY21pc1ZlcnNpb259PC9vcGVuY21pcy52ZXJzaW9uPgotICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8bmFtZT5Zb3VyIE9wZW5DTUlTIFNlcnZlciBFeHRlbnNpb248L25hbWU+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNjwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNjwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj5cJHtvcGVuY21pcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj5cJHtvcGVuY21pcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvX19wcm9qZWN0UHJlZml4X19DbWlzU2VydmljZVdyYXBwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvX19wcm9qZWN0UHJlZml4X19DbWlzU2VydmljZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0NTRmZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZXh0ZW5zaW9uLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL19fcHJvamVjdFByZWZpeF9fQ21pc1NlcnZpY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKLSNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKLSNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKLXBhY2thZ2UgJHtwYWNrYWdlfTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LndyYXBwZXIuQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXI7Ci0KLS8qKgotICogQ01JUyBTZXJ2aWNlIFdyYXBwZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyAke3Byb2plY3RQcmVmaXh9Q21pc1NlcnZpY2VXcmFwcGVyIGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIgewotCi0gICAgcHVibGljICR7cHJvamVjdFByZWZpeH1DbWlzU2VydmljZVdyYXBwZXIoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihzZXJ2aWNlKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQE92ZXJyaWRlCi0gICAgLy8gcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3RbXSBwYXJhbXMpIHsKLSAgICAvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9zZXJ2ZXIvYXJjaGV0eXBlLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZXh0ZW5zaW9uLWFyY2hldHlwZS9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvamVjdHMvc2VydmVyL2FyY2hldHlwZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ2Y2M4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9zZXJ2ZXIvYXJjaGV0eXBlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWdyb3VwSWQ9b3JnLnRlc3QuY21pcwotYXJ0aWZhY3RJZD10ZXN0LWNtaXMtc2VydmVyLWV4dGVuc2lvbgotdmVyc2lvbj0xLjAtU05BUFNIT1QKLXBhY2thZ2U9b3JnLnRlc3QuY21pcy5zZXJ2ZXIuZXh0ZW5zaW9uCi1wcm9qZWN0UHJlZml4PVRlc3RFeHQKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9zZXJ2ZXIvZ29hbC50eHQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZXh0ZW5zaW9uLWFyY2hldHlwZS9zcmMvdGVzdC9yZXNvdXJjZXMvcHJvamVjdHMvc2VydmVyL2dvYWwudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjk3MDIzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1leHRlbnNpb24tYXJjaGV0eXBlL3NyYy90ZXN0L3Jlc291cmNlcy9wcm9qZWN0cy9zZXJ2ZXIvZ29hbC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jbGVhbiBpbnN0YWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjNmNTEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmU8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+T3BlbkNNSVMgRmlsZVNoYXJlIFNlcnZlciBJbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8cGFyZW50QmFzZWRpcj4uLi8uLi88L3BhcmVudEJhc2VkaXI+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TR2kgQnVuZGxlIFN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLU5hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmZpbGVzaGFyZTwvQnVuZGxlLU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmZpbGVzaGFyZTwvQnVuZGxlLVN5bWJvbGljTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9CdW5kbGUtVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+amF2YXguc2VydmxldCxqYXZheC5zZXJ2bGV0Lmh0dHAsamF2YXguc2VydmxldC5yZXNvdXJjZXM8L0ltcG9ydC1QYWNrYWdlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtQ2xhc3NwYXRoPi48L0J1bmRsZS1DbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFdlYi1Db250ZXh0UGF0aD5maWxlc2hhcmU8L1dlYi1Db250ZXh0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDxvdmVybGF5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVybGF5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9vdmVybGF5PgotICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJsYXk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+aW5kZXguaHRtbDwvZXhjbHVkZT4gPCEtLSBkZWZhdWx0IGluZGV4IHBhZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmNzcy8qKjwvZXhjbHVkZT4gPCEtLSBDU1MgZm9yIHRoZSBkZWZhdWx0IGluZGV4IHBhZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmltYWdlcy8qKjwvZXhjbHVkZT4gPCEtLSBpbWFnZXMgZm9yIHRoZSBkZWZhdWx0IGluZGV4IHBhZ2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPndlYi8qKjwvZXhjbHVkZT4gPCEtLSBzYW1wbGUgSmF2YVNjcmlwdCBhcHBsaWNhdGlvbiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+V0VCLUlORi9jbGFzc2VzL3NhbXBsZS1yZXBvc2l0b3J5LnByb3BlcnRpZXM8L2V4Y2x1ZGU+IDwhLS0gc2FtcGxlIHNlcnZlciBwcm9wZXJ0aWVzIGZpbGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPldFQi1JTkYvdG9rZW4vKio8L2V4Y2x1ZGU+ICA8IS0tIHNhbXBsZSBCcm93c2VyIEJpbmRpbmcgdG9rZW4gaW1wbGVtZW50YXRpb24gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPldFQi1JTkYvd2Vic3BoZXJlLyoqPC9leGNsdWRlPiA8IS0tIFdlYlNwaGVyZSBzcGVjZmljIGZpbGVzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TUVUQS1JTkYvVEhJUkQtUEFSVFktTElDRU5TRVM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvb3ZlcmxheT4KLSAgICAgICAgICAgICAgICAgICAgPC9vdmVybGF5cz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2xmNGoudmVyc2lvbn08L3ZlcnNpb24+ICAgICAgICAgIAotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gVW5jb21tZW50IGZvciBDT1JTIHN1cHBvcnQgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnRoZXRyYW5zYWN0aW9uY29tcGFueTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvcnMtZmlsdGVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjI8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PjwhLS0gZm9yIGRldmVsb3BtZW50IG9ubHkgLS0+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT48IS0tIGZvciBkZXZlbG9wbWVudCBvbmx5IC0tPgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZmlsZXNoYXJlL0NvbnRlbnRSYW5nZUlucHV0U3RyZWFtLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZmlsZXNoYXJlL0NvbnRlbnRSYW5nZUlucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OTI1NmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9Db250ZW50UmFuZ2VJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maWxlc2hhcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIENvbnRlbnRSYW5nZUlucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKLQotICAgIHByaXZhdGUgbG9uZyBvZmZzZXQ7Ci0gICAgcHJpdmF0ZSBsb25nIGxlbmd0aDsKLSAgICBwcml2YXRlIGxvbmcgcmVtYWluaW5nOwotCi0gICAgcHVibGljIENvbnRlbnRSYW5nZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSwgQmlnSW50ZWdlciBvZmZzZXQsIEJpZ0ludGVnZXIgbGVuZ3RoKSB7Ci0gICAgICAgIHN1cGVyKHN0cmVhbSk7Ci0KLSAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQgIT0gbnVsbCA/IG9mZnNldC5sb25nVmFsdWUoKSA6IDA7Ci0gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoICE9IG51bGwgPyBsZW5ndGgubG9uZ1ZhbHVlKCkgOiBMb25nLk1BWF9WQUxVRTsKLQotICAgICAgICB0aGlzLnJlbWFpbmluZyA9IHRoaXMubGVuZ3RoOwotCi0gICAgICAgIGlmICh0aGlzLm9mZnNldCA+IDApIHsKLSAgICAgICAgICAgIHNraXBCeXRlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNraXBCeXRlcygpIHsKLSAgICAgICAgbG9uZyByZW1haW5pbmdTa2lwQnl0ZXMgPSBvZmZzZXQ7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlIChyZW1haW5pbmdTa2lwQnl0ZXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBza2lwcGVkID0gc3VwZXIuc2tpcChyZW1haW5pbmdTa2lwQnl0ZXMpOwotICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NraXBCeXRlcyAtPSBza2lwcGVkOwotCi0gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gbWlnaHQgbm90IHN1cHBvcnQgc2tpcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgc2tpcEJ5dGVzQnlSZWFkaW5nKHJlbWFpbmluZ1NraXBCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJTa2lwcGluZyB0aGUgc3RyZWFtIGZhaWxlZCEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBza2lwQnl0ZXNCeVJlYWRpbmcobG9uZyByZW1haW5pbmdTa2lwQnl0ZXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgICAgICB3aGlsZSAocmVtYWluaW5nU2tpcEJ5dGVzID4gMCkgewotICAgICAgICAgICAgICAgIGxvbmcgc2tpcHBlZCA9IHN1cGVyLnJlYWQoYnVmZmVyLCAwLCAoaW50KSBNYXRoLm1pbihidWZmZXIubGVuZ3RoLCByZW1haW5pbmdTa2lwQnl0ZXMpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZW1haW5pbmdTa2lwQnl0ZXMgLT0gc2tpcHBlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJSZWFkaW5nIHRoZSBzdHJlYW0gZmFpbGVkISIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBza2lwcGVkID0gc3VwZXIuc2tpcChuKTsKLSAgICAgICAgcmVtYWluaW5nIC09IHNraXBwZWQ7Ci0KLSAgICAgICAgcmV0dXJuIHNraXBwZWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGF2YWlsID0gc3VwZXIuYXZhaWxhYmxlKCk7Ci0KLSAgICAgICAgaWYgKHJlbWFpbmluZyA8IGF2YWlsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgcmVtYWluaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF2YWlsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVtYWluaW5nLS07Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlYWRCeXRlcyA9IHN1cGVyLnJlYWQoYiwgb2ZmLCAoaW50KSBNYXRoLm1pbihsZW4sIHJlbWFpbmluZykpOwotICAgICAgICBpZiAocmVhZEJ5dGVzID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICByZW1haW5pbmcgLT0gcmVhZEJ5dGVzOwotCi0gICAgICAgIHJldHVybiByZWFkQnl0ZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZChiLCAwLCBiLmxlbmd0aCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVDbWlzU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVDbWlzU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2RhZjE0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlQ21pc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZmlsZXNoYXJlOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0TGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlci5BYnN0cmFjdENtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyLkNhbGxDb250ZXh0QXdhcmVDbWlzU2VydmljZTsKLQotLyoqCi0gKiBGaWxlU2hhcmUgU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVTaGFyZUNtaXNTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZSBpbXBsZW1lbnRzIENhbGxDb250ZXh0QXdhcmVDbWlzU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZpbGVTaGFyZVJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9zaXRvcnlNYW5hZ2VyOwotICAgIHByaXZhdGUgQ2FsbENvbnRleHQgY29udGV4dDsKLQotICAgIHB1YmxpYyBGaWxlU2hhcmVDbWlzU2VydmljZShmaW5hbCBGaWxlU2hhcmVSZXBvc2l0b3J5TWFuYWdlciByZXBvc2l0b3J5TWFuYWdlcikgewotICAgICAgICB0aGlzLnJlcG9zaXRvcnlNYW5hZ2VyID0gcmVwb3NpdG9yeU1hbmFnZXI7Ci0gICAgfQotCi0gICAgLy8gLS0tIENhbGwgQ29udGV4dCAtLS0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNhbGwgY29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIHNlcnZpY2UgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsQ29udGV4dChDYWxsQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY2FsbCBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBDYWxsQ29udGV4dCBnZXRDYWxsQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGN1cnJlbnQgY2FsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVNoYXJlUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UmVwb3NpdG9yeShnZXRDYWxsQ29udGV4dCgpLmdldFJlcG9zaXRvcnlJZCgpKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gcmVwb3NpdG9yeSBzZXJ2aWNlIC0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBmb3IgKEZpbGVTaGFyZVJlcG9zaXRvcnkgZnNyIDogcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UmVwb3NpdG9yaWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChmc3IuZ2V0UmVwb3NpdG9yeUlkKCkuZXF1YWxzKHJlcG9zaXRvcnlJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnNyLmdldFJlcG9zaXRvcnlJbmZvKGdldENhbGxDb250ZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5ICciICsgcmVwb3NpdG9yeUlkICsgIichIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5SW5mbz4oKTsKLQotICAgICAgICBmb3IgKEZpbGVTaGFyZVJlcG9zaXRvcnkgZnNyIDogcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UmVwb3NpdG9yaWVzKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoZnNyLmdldFJlcG9zaXRvcnlJbmZvKGdldENhbGxDb250ZXh0KCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXRUeXBlQ2hpbGRyZW4oZ2V0Q2FsbENvbnRleHQoKSwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgc2tpcENvdW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3J5KCkuZ2V0VHlwZURlZmluaXRpb24oZ2V0Q2FsbENvbnRleHQoKSwgdHlwZUlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0VHlwZURlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXRUeXBlRGVzY2VuZGFudHMoZ2V0Q2FsbENvbnRleHQoKSwgdHlwZUlkLCBkZXB0aCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpOwotICAgIH0KLQotICAgIC8vIC0tLSBuYXZpZ2F0aW9uIHNlcnZpY2UgLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0SW5Gb2xkZXJMaXN0IGdldENoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3J5KCkuZ2V0Q2hpbGRyZW4oZ2V0Q2FsbENvbnRleHQoKSwgZm9sZGVySWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVBhdGhTZWdtZW50LCBtYXhJdGVtcywgc2tpcENvdW50LCB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3J5KCkuZ2V0RGVzY2VuZGFudHMoZ2V0Q2FsbENvbnRleHQoKSwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVQYXRoU2VnbWVudCwgdGhpcywgZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldEZvbGRlclBhcmVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeSgpLmdldEZvbGRlclBhcmVudChnZXRDYWxsQ29udGV4dCgpLCBmb2xkZXJJZCwgZmlsdGVyLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0Rm9sZGVyVHJlZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXREZXNjZW5kYW50cyhnZXRDYWxsQ29udGV4dCgpLCBmb2xkZXJJZCwgZGVwdGgsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVBhdGhTZWdtZW50LCB0aGlzLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBnZXRPYmplY3RQYXJlbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3J5KCkuZ2V0T2JqZWN0UGFyZW50cyhnZXRDYWxsQ29udGV4dCgpLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0Q2hlY2tlZE91dERvY3MoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhmYWxzZSk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLlpFUk8pOwotICAgICAgICBMaXN0PE9iamVjdERhdGE+IGVtcHR5TGlzdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICByZXN1bHQuc2V0T2JqZWN0cyhlbXB0eUxpc3QpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tIG9iamVjdCBzZXJ2aWNlIC0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0UmVwb3NpdG9yeSgpLmNyZWF0ZShnZXRDYWxsQ29udGV4dCgpLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBvYmplY3QuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeSgpLmNyZWF0ZURvY3VtZW50KGdldENhbGxDb250ZXh0KCksIHByb3BlcnRpZXMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBzb3VyY2VJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeSgpLmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShnZXRDYWxsQ29udGV4dCgpLCBzb3VyY2VJZCwgcHJvcGVydGllcywgZm9sZGVySWQsCi0gICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5jcmVhdGVGb2xkZXIoZ2V0Q2FsbENvbnRleHQoKSwgcHJvcGVydGllcywgZm9sZGVySWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdE9yQ2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGdldFJlcG9zaXRvcnkoKS5kZWxldGVPYmplY3QoZ2V0Q2FsbENvbnRleHQoKSwgb2JqZWN0SWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGYWlsZWRUb0RlbGV0ZURhdGEgZGVsZXRlVHJlZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBVbmZpbGVPYmplY3QgdW5maWxlT2JqZWN0cywgQm9vbGVhbiBjb250aW51ZU9uRmFpbHVyZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3J5KCkuZGVsZXRlVHJlZShnZXRDYWxsQ29udGV4dCgpLCBmb2xkZXJJZCwgY29udGludWVPbkZhaWx1cmUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXRBbGxvd2FibGVBY3Rpb25zKGdldENhbGxDb250ZXh0KCksIG9iamVjdElkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHN0cmVhbUlkLCBCaWdJbnRlZ2VyIG9mZnNldCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbGVuZ3RoLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXRDb250ZW50U3RyZWFtKGdldENhbGxDb250ZXh0KCksIG9iamVjdElkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZ2V0UmVwb3NpdG9yeSgpLmdldE9iamVjdChnZXRDYWxsQ29udGV4dCgpLCBvYmplY3RJZCwgbnVsbCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZUFjbCwKLSAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXRPYmplY3RCeVBhdGgoZ2V0Q2FsbENvbnRleHQoKSwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZUFjbCwKLSAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0UmVwb3NpdG9yeSgpLmdldE9iamVjdChnZXRDYWxsQ29udGV4dCgpLCBvYmplY3RJZCwgbnVsbCwgZmlsdGVyLCBmYWxzZSwgZmFsc2UsIHRoaXMpOwotICAgICAgICByZXR1cm4gb2JqZWN0LmdldFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxSZW5kaXRpb25EYXRhPiBnZXRSZW5kaXRpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1vdmVPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIFN0cmluZyB0YXJnZXRGb2xkZXJJZCwgU3RyaW5nIHNvdXJjZUZvbGRlcklkLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGdldFJlcG9zaXRvcnkoKS5tb3ZlT2JqZWN0KGdldENhbGxDb250ZXh0KCksIG9iamVjdElkLCB0YXJnZXRGb2xkZXJJZCwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBvdmVyd3JpdGVGbGFnLAotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGdldFJlcG9zaXRvcnkoKS5jaGFuZ2VDb250ZW50U3RyZWFtKGdldENhbGxDb250ZXh0KCksIG9iamVjdElkLCBvdmVyd3JpdGVGbGFnLCBjb250ZW50U3RyZWFtLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmssIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBnZXRSZXBvc2l0b3J5KCkuY2hhbmdlQ29udGVudFN0cmVhbShnZXRDYWxsQ29udGV4dCgpLCBvYmplY3RJZCwgdHJ1ZSwgY29udGVudFN0cmVhbSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZ2V0UmVwb3NpdG9yeSgpLmNoYW5nZUNvbnRlbnRTdHJlYW0oZ2V0Q2FsbENvbnRleHQoKSwgb2JqZWN0SWQsIHRydWUsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGdldFJlcG9zaXRvcnkoKS51cGRhdGVQcm9wZXJ0aWVzKGdldENhbGxDb250ZXh0KCksIG9iamVjdElkLCBwcm9wZXJ0aWVzLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhZGRTZWNvbmRhcnlUeXBlSWRzLCBMaXN0PFN0cmluZz4gcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBvc2l0b3J5KCkuYnVsa1VwZGF0ZVByb3BlcnRpZXMoZ2V0Q2FsbENvbnRleHQoKSwgb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiwgcHJvcGVydGllcywgdGhpcyk7Ci0gICAgfQotCi0gICAgLy8gLS0tIHZlcnNpb25pbmcgc2VydmljZSAtLS0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE9iamVjdERhdGE+IGdldEFsbFZlcnNpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3REYXRhIHRoZVZlcnNpb24gPSBnZXRSZXBvc2l0b3J5KCkuZ2V0T2JqZWN0KGdldENhbGxDb250ZXh0KCksIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsIGZpbHRlciwKLSAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgZmFsc2UsIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRoZVZlcnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXRPYmplY3QoZ2V0Q2FsbENvbnRleHQoKSwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlQWNsLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldFJlcG9zaXRvcnkoKS5nZXRPYmplY3QoZ2V0Q2FsbENvbnRleHQoKSwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgZmlsdGVyLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgfQotCi0gICAgLy8gLS0tIEFDTCBzZXJ2aWNlIC0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFjbCBnZXRBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnkoKS5nZXRBY2woZ2V0Q2FsbENvbnRleHQoKSwgb2JqZWN0SWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlQ21pc1NlcnZpY2VGYWN0b3J5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZmlsZXNoYXJlL0ZpbGVTaGFyZUNtaXNTZXJ2aWNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFjYjY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlQ21pc1NlcnZpY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpbGVzaGFyZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLkFic3RyYWN0U2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQud3JhcHBlci5DYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQud3JhcHBlci5DbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LndyYXBwZXIuQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBGaWxlU2hhcmUgU2VydmljZSBGYWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVNoYXJlQ21pc1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRmlsZVNoYXJlQ21pc1NlcnZpY2VGYWN0b3J5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfTE9HSU4gPSAibG9naW4uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1JFUE9TSVRPUlkgPSAicmVwb3NpdG9yeS4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfVFlQRSA9ICJ0eXBlLiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWF9SRUFEV1JJVEUgPSAiLnJlYWR3cml0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWF9SRUFET05MWSA9ICIucmVhZG9ubHkiOwotCi0gICAgLyoqIERlZmF1bHQgbWF4SXRlbXMgdmFsdWUgZm9yIGdldFR5cGVDaGlsZHJlbigpfS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfTUFYX0lURU1TX1RZUEVTID0gQmlnSW50ZWdlci52YWx1ZU9mKDUwKTsKLQotICAgIC8qKiBEZWZhdWx0IGRlcHRoIHZhbHVlIGZvciBnZXRUeXBlRGVzY2VuZGFudHMoKS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfREVQVEhfVFlQRVMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBtYXhJdGVtcyB2YWx1ZSBmb3IgZ2V0Q2hpbGRyZW4oKSBhbmQgb3RoZXIgbWV0aG9kcyByZXR1cm5pbmcKLSAgICAgKiBsaXN0cyBvZiBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9NQVhfSVRFTVNfT0JKRUNUUyA9IEJpZ0ludGVnZXIudmFsdWVPZigyMDApOwotCi0gICAgLyoqIERlZmF1bHQgZGVwdGggdmFsdWUgZm9yIGdldERlc2NlbmRhbnRzKCkuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX0RFUFRIX09CSkVDVFMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTApOwotCi0gICAgLyoqIEVhY2ggdGhyZWFkIGdldHMgaXRzIG93biB7QGxpbmsgRmlsZVNoYXJlQ21pc1NlcnZpY2V9IGluc3RhbmNlLiAqLwotICAgIHByaXZhdGUgVGhyZWFkTG9jYWw8Q2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlPiB0aHJlYWRMb2NhbFNlcnZpY2UgPSBuZXcgVGhyZWFkTG9jYWw8Q2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlPigpOwotCi0gICAgcHJpdmF0ZSBGaWxlU2hhcmVSZXBvc2l0b3J5TWFuYWdlciByZXBvc2l0b3J5TWFuYWdlcjsKLSAgICBwcml2YXRlIEZpbGVTaGFyZVVzZXJNYW5hZ2VyIHVzZXJNYW5hZ2VyOwotICAgIHByaXZhdGUgRmlsZVNoYXJlVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBDbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyIHdyYXBwZXJNYW5hZ2VyOwotCi0gICAgcHVibGljIEZpbGVTaGFyZVJlcG9zaXRvcnlNYW5hZ2VyIGdldFJlcG9zaXRvcnlNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeU1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGVTaGFyZVVzZXJNYW5hZ2VyIGdldFVzZXJNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdXNlck1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGVTaGFyZVR5cGVNYW5hZ2VyIGdldFR5cGVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdHlwZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgcmVwb3NpdG9yeU1hbmFnZXIgPSBuZXcgRmlsZVNoYXJlUmVwb3NpdG9yeU1hbmFnZXIoKTsKLSAgICAgICAgdXNlck1hbmFnZXIgPSBuZXcgRmlsZVNoYXJlVXNlck1hbmFnZXIoKTsKLSAgICAgICAgdHlwZU1hbmFnZXIgPSBuZXcgRmlsZVNoYXJlVHlwZU1hbmFnZXIoKTsKLQotICAgICAgICB3cmFwcGVyTWFuYWdlciA9IG5ldyBDbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyKCk7Ci0gICAgICAgIHdyYXBwZXJNYW5hZ2VyLmFkZFdyYXBwZXJzRnJvbVNlcnZpY2VGYWN0b3J5UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKLSAgICAgICAgd3JhcHBlck1hbmFnZXIuYWRkT3V0ZXJXcmFwcGVyKENvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyLmNsYXNzLCBERUZBVUxUX01BWF9JVEVNU19UWVBFUywKLSAgICAgICAgICAgICAgICBERUZBVUxUX0RFUFRIX1RZUEVTLCBERUZBVUxUX01BWF9JVEVNU19PQkpFQ1RTLCBERUZBVUxUX0RFUFRIX09CSkVDVFMpOwotCi0gICAgICAgIHJlYWRDb25maWd1cmF0aW9uKHBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIHRocmVhZExvY2FsU2VydmljZSA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNTZXJ2aWNlIGdldFNlcnZpY2UoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyBhdXRoZW50aWNhdGUgdGhlIHVzZXIKLSAgICAgICAgLy8gaWYgdGhlIGF1dGhlbnRpY2F0aW9uIGZhaWxzLCBhdXRoZW50aWNhdGUoKSB0aHJvd3MgYQotICAgICAgICAvLyBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbgotICAgICAgICB1c2VyTWFuYWdlci5hdXRoZW50aWNhdGUoY29udGV4dCk7Ci0KLSAgICAgICAgLy8gZ2V0IHNlcnZpY2Ugb2JqZWN0IGZvciB0aGlzIHRocmVhZAotICAgICAgICBDYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2Ugc2VydmljZSA9IHRocmVhZExvY2FsU2VydmljZS5nZXQoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gc2VydmljZSBvYmplY3QgZm9yIHRoaXMgdGhyZWFkIC0+IGNyZWF0ZSBvbmUKLSAgICAgICAgICAgIEZpbGVTaGFyZUNtaXNTZXJ2aWNlIGZpbGVTaGFyZVNlcnZpY2UgPSBuZXcgRmlsZVNoYXJlQ21pc1NlcnZpY2UocmVwb3NpdG9yeU1hbmFnZXIpOwotCi0gICAgICAgICAgICBzZXJ2aWNlID0gKENhbGxDb250ZXh0QXdhcmVDbWlzU2VydmljZSkgd3JhcHBlck1hbmFnZXIud3JhcChmaWxlU2hhcmVTZXJ2aWNlKTsKLQotICAgICAgICAgICAgdGhyZWFkTG9jYWxTZXJ2aWNlLnNldChzZXJ2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmQgb3ZlciB0aGUgY2FsbCBjb250ZXh0IHRvIHRoZSBzZXJ2aWNlIG9iamVjdAotICAgICAgICBzZXJ2aWNlLnNldENhbGxDb250ZXh0KGNvbnRleHQpOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIC8vIC0tLS0gaGVscGVycyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2V0cyB1cCB0aGUgcmVwb3NpdG9yaWVzLCBsb2dpbnMsIGFuZCB0eXBlCi0gICAgICogZGVmaW5pdGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRDb25maWd1cmF0aW9uKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBMaXN0PFN0cmluZz4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihwYXJhbWV0ZXJzLmtleVNldCgpKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChrZXlzKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBrZXlzKSB7Ci0gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoUFJFRklYX0xPR0lOKSkgewotICAgICAgICAgICAgICAgIC8vIGdldCBsb2dpbnMKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWVBbmRQYXNzd29yZCA9IHJlcGxhY2VTeXN0ZW1Qcm9wZXJ0aWVzKHBhcmFtZXRlcnMuZ2V0KGtleSkpOwotICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZUFuZFBhc3N3b3JkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gdXNlcm5hbWVBbmRQYXNzd29yZDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAiIjsKLQotICAgICAgICAgICAgICAgIGludCB4ID0gdXNlcm5hbWVBbmRQYXNzd29yZC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgaWYgKHggPiAtMSkgewotICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSA9IHVzZXJuYW1lQW5kUGFzc3dvcmQuc3Vic3RyaW5nKDAsIHgpOwotICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCA9IHVzZXJuYW1lQW5kUGFzc3dvcmQuc3Vic3RyaW5nKHggKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBMT0cuaW5mbygiQWRkaW5nIGxvZ2luICd7fScuIiwgdXNlcm5hbWUpOwotCi0gICAgICAgICAgICAgICAgdXNlck1hbmFnZXIuYWRkTG9naW4odXNlcm5hbWUsIHBhc3N3b3JkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoUFJFRklYX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9hZCB0eXBlIGRlZmluaXRpb24KLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZUZpbGUgPSByZXBsYWNlU3lzdGVtUHJvcGVydGllcyhwYXJhbWV0ZXJzLmdldChrZXkpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVGaWxlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTE9HLmluZm8oIkxvYWRpbmcgdHlwZSBkZWZpbml0aW9uOiB7fSIsIHR5cGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIGlmICh0eXBlRmlsZS5jaGFyQXQoMCkgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlTWFuYWdlci5sb2FkVHlwZURlZmluaXRpb25Gcm9tUmVzb3VyY2UodHlwZUZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNvdXJjZSBub3QgZm91bmQgLT4gdHJ5IGl0IGFzIGEgcmVndWxhciBmaWxlCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiQ291bGQgbm90IGxvYWQgdHlwZSBkZWZpbnRpb24gZnJvbSByZXNvdXJjZSAne30nOiB7fSIsIHR5cGVGaWxlLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVNYW5hZ2VyLmxvYWRUeXBlRGVmaW5pdGlvbkZyb21GaWxlKHR5cGVGaWxlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiQ291bGQgbm90IGxvYWQgdHlwZSBkZWZpbnRpb24gZnJvbSBmaWxlICd7fSc6IHt9IiwgdHlwZUZpbGUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5zdGFydHNXaXRoKFBSRUZJWF9SRVBPU0lUT1JZKSkgewotICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSByZXBvc2l0b3JpZXMKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0ga2V5LnN1YnN0cmluZyhQUkVGSVhfUkVQT1NJVE9SWS5sZW5ndGgoKSkudHJpbSgpOwotICAgICAgICAgICAgICAgIGludCB4ID0gcmVwb3NpdG9yeUlkLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgaWYgKHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlJZCA9IHJlcG9zaXRvcnlJZC5zdWJzdHJpbmcoMCwgeCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnlJZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHJlcG9zaXRvcnkgaWQhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aChTVUZGSVhfUkVBRFdSSVRFKSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZWFkLXdyaXRlIHVzZXJzCi0gICAgICAgICAgICAgICAgICAgIEZpbGVTaGFyZVJlcG9zaXRvcnkgZnNyID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UmVwb3NpdG9yeShyZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB1c2VyIDogc3BsaXQocGFyYW1ldGVycy5nZXQoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzci5zZXRVc2VyUmVhZFdyaXRlKHJlcGxhY2VTeXN0ZW1Qcm9wZXJ0aWVzKHVzZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFNVRkZJWF9SRUFET05MWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVhZC1vbmx5IHVzZXJzCi0gICAgICAgICAgICAgICAgICAgIEZpbGVTaGFyZVJlcG9zaXRvcnkgZnNyID0gcmVwb3NpdG9yeU1hbmFnZXIuZ2V0UmVwb3NpdG9yeShyZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB1c2VyIDogc3BsaXQocGFyYW1ldGVycy5nZXQoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzci5zZXRVc2VyUmVhZE9ubHkocmVwbGFjZVN5c3RlbVByb3BlcnRpZXModXNlcikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHJlcG9zaXRvcnkKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvb3QgPSByZXBsYWNlU3lzdGVtUHJvcGVydGllcyhwYXJhbWV0ZXJzLmdldChrZXkpKTsKLQotICAgICAgICAgICAgICAgICAgICBMT0cuaW5mbygiQWRkaW5nIHJlcG9zaXRvcnkgJ3t9Jzoge30iLCByZXBvc2l0b3J5SWQsIHJvb3QpOwotCi0gICAgICAgICAgICAgICAgICAgIEZpbGVTaGFyZVJlcG9zaXRvcnkgZnNyID0gbmV3IEZpbGVTaGFyZVJlcG9zaXRvcnkocmVwb3NpdG9yeUlkLCByb290LCB0eXBlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlNYW5hZ2VyLmFkZFJlcG9zaXRvcnkoZnNyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGxpdHMgYSBzdHJpbmcgYnkgY29tbWEuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3BsaXQoU3RyaW5nIGNzbCkgewotICAgICAgICBpZiAoY3NsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IGNzbC5zcGxpdCgiLCIpKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHMudHJpbSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYWxsIHN1YnN0cmluZ3MgaW4gY3VybHkgYnJhY2VzIGFuZCByZXBsYWNlcyB0aGVtIHdpdGggdGhlIHZhbHVlIG9mCi0gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgc3lzdGVtIHByb3BlcnR5LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VTeXN0ZW1Qcm9wZXJ0aWVzKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBpblByb3BlcnR5ID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotCi0gICAgICAgICAgICBpZiAoaW5Qcm9wZXJ0eSkgewotICAgICAgICAgICAgICAgIGlmIChjID09ICd9JykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZmlsZXNoYXJlL0ZpbGVTaGFyZVJlcG9zaXRvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmM5NWM0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZmlsZXNoYXJlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5CYXNpY1Blcm1pc3Npb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBlcm1pc3Npb25NYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5U3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q2hhbmdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlKb2luOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eU9yZGVyQnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UmVuZGl0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuU3VwcG9ydGVkUGVybWlzc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RvcmFnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLk1pbWVUeXBlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFsbG93YWJsZUFjdGlvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRmFpbGVkVG9EZWxldGVEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdFBhcmVudERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5QYXJ0aWFsQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUJvb2xlYW5JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEZWNpbWFsSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuT2JqZWN0SW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mb0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbXBsLlNlcnZlclZlcnNpb247Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGFsbCByZXBvc2l0b3J5IG9wZXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU2hhcmVSZXBvc2l0b3J5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaWxlU2hhcmVSZXBvc2l0b3J5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0lEID0gIkByb290QCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQURPV19FWFQgPSAiLmNtaXMueG1sIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBRE9XX0ZPTERFUiA9ICJjbWlzLnhtbCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9VTktOT1dOID0gIjx1bmtub3duPiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA2NCAqIDEwMjQ7Ci0KLSAgICAvKiogUmVwb3NpdG9yeSBpZC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXBvc2l0b3J5SWQ7Ci0gICAgLyoqIFJvb3QgZGlyZWN0b3J5LiAqLwotICAgIHByaXZhdGUgZmluYWwgRmlsZSByb290OwotICAgIC8qKiBUeXBlcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIEZpbGVTaGFyZVR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyOwotICAgIC8qKiBVc2Vycy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEJvb2xlYW4+IHJlYWRXcml0ZVVzZXJNYXA7Ci0KLSAgICAvKiogQ01JUyAxLjAgcmVwb3NpdG9yeSBpbmZvLiAqLwotICAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeUluZm8xMDsKLSAgICAvKiogQ01JUyAxLjEgcmVwb3NpdG9yeSBpbmZvLiAqLwotICAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeUluZm8xMTsKLQotICAgIHB1YmxpYyBGaWxlU2hhcmVSZXBvc2l0b3J5KGZpbmFsIFN0cmluZyByZXBvc2l0b3J5SWQsIGZpbmFsIFN0cmluZyByb290UGF0aCwgZmluYWwgRmlsZVNoYXJlVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIpIHsKLSAgICAgICAgLy8gY2hlY2sgcmVwb3NpdG9yeSBpZAotICAgICAgICBpZiAocmVwb3NpdG9yeUlkID09IG51bGwgfHwgcmVwb3NpdG9yeUlkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJlcG9zaXRvcnkgaWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnJlcG9zaXRvcnlJZCA9IHJlcG9zaXRvcnlJZDsKLQotICAgICAgICAvLyBjaGVjayByb290IGZvbGRlcgotICAgICAgICBpZiAocm9vdFBhdGggPT0gbnVsbCB8fCByb290UGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByb290IGZvbGRlciEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJvb3QgPSBuZXcgRmlsZShyb290UGF0aCk7Ci0gICAgICAgIGlmICghcm9vdC5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSb290IGlzIG5vdCBhIGRpcmVjdG9yeSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0eXBlIG1hbmFnZXIgb2JqZWN0cwotICAgICAgICB0aGlzLnR5cGVNYW5hZ2VyID0gdHlwZU1hbmFnZXI7Ci0KLSAgICAgICAgLy8gc2V0IHVwIHJlYWQtd3JpdGUgdXNlciBtYXAKLSAgICAgICAgcmVhZFdyaXRlVXNlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKLQotICAgICAgICAvLyBzZXQgdXAgcmVwb3NpdG9yeSBpbmZvcwotICAgICAgICByZXBvc2l0b3J5SW5mbzEwID0gY3JlYXRlUmVwb3NpdG9yeUluZm8oQ21pc1ZlcnNpb24uQ01JU18xXzApOwotICAgICAgICByZXBvc2l0b3J5SW5mbzExID0gY3JlYXRlUmVwb3NpdG9yeUluZm8oQ21pc1ZlcnNpb24uQ01JU18xXzEpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVwb3NpdG9yeUluZm8gY3JlYXRlUmVwb3NpdG9yeUluZm8oQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgYXNzZXJ0IGNtaXNWZXJzaW9uICE9IG51bGw7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUluZm9JbXBsIHJlcG9zaXRvcnlJbmZvID0gbmV3IFJlcG9zaXRvcnlJbmZvSW1wbCgpOwotCi0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldElkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldE5hbWUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmVwb3NpdG9yeUluZm8uc2V0RGVzY3JpcHRpb24ocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICByZXBvc2l0b3J5SW5mby5zZXRDbWlzVmVyc2lvblN1cHBvcnRlZChjbWlzVmVyc2lvbi52YWx1ZSgpKTsKLQotICAgICAgICByZXBvc2l0b3J5SW5mby5zZXRQcm9kdWN0TmFtZSgiT3BlbkNNSVMgRmlsZVNoYXJlIik7Ci0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldFByb2R1Y3RWZXJzaW9uKFNlcnZlclZlcnNpb24uT1BFTkNNSVNfVkVSU0lPTik7Ci0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldFZlbmRvck5hbWUoIk9wZW5DTUlTIik7Ci0KLSAgICAgICAgcmVwb3NpdG9yeUluZm8uc2V0Um9vdEZvbGRlcihST09UX0lEKTsKLQotICAgICAgICByZXBvc2l0b3J5SW5mby5zZXRUaGluQ2xpZW50VXJpKCIiKTsKLSAgICAgICAgcmVwb3NpdG9yeUluZm8uc2V0Q2hhbmdlc0luY29tcGxldGUodHJ1ZSk7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGwgY2FwYWJpbGl0aWVzID0gbmV3IFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsKCk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5QWNsKENhcGFiaWxpdHlBY2wuRElTQ09WRVIpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0QWxsVmVyc2lvbnNTZWFyY2hhYmxlKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldENhcGFiaWxpdHlKb2luKENhcGFiaWxpdHlKb2luLk5PTkUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0U3VwcG9ydHNNdWx0aWZpbGluZyhmYWxzZSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRTdXBwb3J0c1VuZmlsaW5nKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldElzUHdjU2VhcmNoYWJsZShmYWxzZSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRJc1B3Y1VwZGF0YWJsZShmYWxzZSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5UXVlcnkoQ2FwYWJpbGl0eVF1ZXJ5Lk5PTkUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q2FwYWJpbGl0eUNoYW5nZXMoQ2FwYWJpbGl0eUNoYW5nZXMuTk9ORSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMoQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLkFOWVRJTUUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0U3VwcG9ydHNHZXREZXNjZW5kYW50cyh0cnVlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldFN1cHBvcnRzR2V0Rm9sZGVyVHJlZSh0cnVlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldENhcGFiaWxpdHlSZW5kaXRpb24oQ2FwYWJpbGl0eVJlbmRpdGlvbnMuTk9ORSk7Ci0KLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q2FwYWJpbGl0eU9yZGVyQnkoQ2FwYWJpbGl0eU9yZGVyQnkuTk9ORSk7Ci0KLSAgICAgICAgICAgIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsIHR5cGVTZXRBdHRyaWJ1dGVzID0gbmV3IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgICAgICB0eXBlU2V0QXR0cmlidXRlcy5zZXRDYW5TZXRDb250cm9sbGFibGVBY2woZmFsc2UpOwotICAgICAgICAgICAgdHlwZVNldEF0dHJpYnV0ZXMuc2V0Q2FuU2V0Q29udHJvbGxhYmxlUG9saWN5KGZhbHNlKTsKLSAgICAgICAgICAgIHR5cGVTZXRBdHRyaWJ1dGVzLnNldENhblNldENyZWF0YWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlU2V0QXR0cmlidXRlcy5zZXRDYW5TZXREZXNjcmlwdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlU2V0QXR0cmlidXRlcy5zZXRDYW5TZXREaXNwbGF5TmFtZShmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlU2V0QXR0cmlidXRlcy5zZXRDYW5TZXRGaWxlYWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlU2V0QXR0cmlidXRlcy5zZXRDYW5TZXRGdWxsdGV4dEluZGV4ZWQoZmFsc2UpOwotICAgICAgICAgICAgdHlwZVNldEF0dHJpYnV0ZXMuc2V0Q2FuU2V0SWQoZmFsc2UpOwotICAgICAgICAgICAgdHlwZVNldEF0dHJpYnV0ZXMuc2V0Q2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KGZhbHNlKTsKLSAgICAgICAgICAgIHR5cGVTZXRBdHRyaWJ1dGVzLnNldENhblNldExvY2FsTmFtZShmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlU2V0QXR0cmlidXRlcy5zZXRDYW5TZXRMb2NhbE5hbWVzcGFjZShmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlU2V0QXR0cmlidXRlcy5zZXRDYW5TZXRRdWVyeWFibGUoZmFsc2UpOwotICAgICAgICAgICAgdHlwZVNldEF0dHJpYnV0ZXMuc2V0Q2FuU2V0UXVlcnlOYW1lKGZhbHNlKTsKLQotICAgICAgICAgICAgY2FwYWJpbGl0aWVzLnNldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXModHlwZVNldEF0dHJpYnV0ZXMpOwotCi0gICAgICAgICAgICBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbCBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzID0gbmV3IENyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsKCk7Ci0gICAgICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcyhjcmVhdGFibGVQcm9wZXJ0eVR5cGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpOwotCi0gICAgICAgIEFjbENhcGFiaWxpdGllc0RhdGFJbXBsIGFjbENhcGFiaWxpdHkgPSBuZXcgQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGwoKTsKLSAgICAgICAgYWNsQ2FwYWJpbGl0eS5zZXRTdXBwb3J0ZWRQZXJtaXNzaW9ucyhTdXBwb3J0ZWRQZXJtaXNzaW9ucy5CQVNJQyk7Ci0gICAgICAgIGFjbENhcGFiaWxpdHkuc2V0QWNsUHJvcGFnYXRpb24oQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSk7Ci0KLSAgICAgICAgLy8gcGVybWlzc2lvbnMKLSAgICAgICAgTGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4gcGVybWlzc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFBlcm1pc3Npb25EZWZpbml0aW9uPigpOwotICAgICAgICBwZXJtaXNzaW9ucy5hZGQoY3JlYXRlUGVybWlzc2lvbihCYXNpY1Blcm1pc3Npb25zLlJFQUQsICJSZWFkIikpOwotICAgICAgICBwZXJtaXNzaW9ucy5hZGQoY3JlYXRlUGVybWlzc2lvbihCYXNpY1Blcm1pc3Npb25zLldSSVRFLCAiV3JpdGUiKSk7Ci0gICAgICAgIHBlcm1pc3Npb25zLmFkZChjcmVhdGVQZXJtaXNzaW9uKEJhc2ljUGVybWlzc2lvbnMuQUxMLCAiQWxsIikpOwotICAgICAgICBhY2xDYXBhYmlsaXR5LnNldFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YShwZXJtaXNzaW9ucyk7Ci0KLSAgICAgICAgLy8gbWFwcGluZwotICAgICAgICBMaXN0PFBlcm1pc3Npb25NYXBwaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQZXJtaXNzaW9uTWFwcGluZz4oKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fQ1JFQVRFX0RPQ1VNRU5UX0ZPTERFUiwgQmFzaWNQZXJtaXNzaW9ucy5SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0NSRUFURV9GT0xERVJfRk9MREVSLCBCYXNpY1Blcm1pc3Npb25zLlJFQUQpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fREVMRVRFX0NPTlRFTlRfRE9DVU1FTlQsIEJhc2ljUGVybWlzc2lvbnMuV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fREVMRVRFX09CSkVDVCwgQmFzaWNQZXJtaXNzaW9ucy5BTEwpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fREVMRVRFX1RSRUVfRk9MREVSLCBCYXNpY1Blcm1pc3Npb25zLkFMTCkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9HRVRfQUNMX09CSkVDVCwgQmFzaWNQZXJtaXNzaW9ucy5SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9BTExfVkVSU0lPTlNfVkVSU0lPTl9TRVJJRVMsIEJhc2ljUGVybWlzc2lvbnMuUkVBRCkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9HRVRfQ0hJTERSRU5fRk9MREVSLCBCYXNpY1Blcm1pc3Npb25zLlJFQUQpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fR0VUX0RFU0NFTkRFTlRTX0ZPTERFUiwgQmFzaWNQZXJtaXNzaW9ucy5SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9GT0xERVJfUEFSRU5UX09CSkVDVCwgQmFzaWNQZXJtaXNzaW9ucy5SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9QQVJFTlRTX0ZPTERFUiwgQmFzaWNQZXJtaXNzaW9ucy5SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9QUk9QRVJUSUVTX09CSkVDVCwgQmFzaWNQZXJtaXNzaW9ucy5SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX01PVkVfT0JKRUNULCBCYXNpY1Blcm1pc3Npb25zLldSSVRFKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX01PVkVfU09VUkNFLCBCYXNpY1Blcm1pc3Npb25zLlJFQUQpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fTU9WRV9UQVJHRVQsIEJhc2ljUGVybWlzc2lvbnMuV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fU0VUX0NPTlRFTlRfRE9DVU1FTlQsIEJhc2ljUGVybWlzc2lvbnMuV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fVVBEQVRFX1BST1BFUlRJRVNfT0JKRUNULCBCYXNpY1Blcm1pc3Npb25zLldSSVRFKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX1ZJRVdfQ09OVEVOVF9PQkpFQ1QsIEJhc2ljUGVybWlzc2lvbnMuUkVBRCkpOwotICAgICAgICBNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4gbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4oKTsKLSAgICAgICAgZm9yIChQZXJtaXNzaW9uTWFwcGluZyBwbSA6IGxpc3QpIHsKLSAgICAgICAgICAgIG1hcC5wdXQocG0uZ2V0S2V5KCksIHBtKTsKLSAgICAgICAgfQotICAgICAgICBhY2xDYXBhYmlsaXR5LnNldFBlcm1pc3Npb25NYXBwaW5nRGF0YShtYXApOwotCi0gICAgICAgIHJlcG9zaXRvcnlJbmZvLnNldEFjbENhcGFiaWxpdGllcyhhY2xDYXBhYmlsaXR5KTsKLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeUluZm87Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQZXJtaXNzaW9uRGVmaW5pdGlvbiBjcmVhdGVQZXJtaXNzaW9uKFN0cmluZyBwZXJtaXNzaW9uLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbCBwZCA9IG5ldyBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsKCk7Ci0gICAgICAgIHBkLnNldElkKHBlcm1pc3Npb24pOwotICAgICAgICBwZC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIHBkOwotICAgIH0KLQotICAgIHByaXZhdGUgUGVybWlzc2lvbk1hcHBpbmcgY3JlYXRlTWFwcGluZyhTdHJpbmcga2V5LCBTdHJpbmcgcGVybWlzc2lvbikgewotICAgICAgICBQZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsIHBtID0gbmV3IFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwoKTsKLSAgICAgICAgcG0uc2V0S2V5KGtleSk7Ci0gICAgICAgIHBtLnNldFBlcm1pc3Npb25zKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocGVybWlzc2lvbikpOwotCi0gICAgICAgIHJldHVybiBwbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIHJlcG9zaXRvcnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5Ci0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0Um9vdERpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyByZWFkLW9ubHkgZmxhZyBmb3IgdGhlIGdpdmVuIHVzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlclJlYWRPbmx5KFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGlmICh1c2VyID09IG51bGwgfHwgdXNlci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICByZWFkV3JpdGVVc2VyTWFwLnB1dCh1c2VyLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHJlYWQtd3JpdGUgZmxhZyBmb3IgdGhlIGdpdmVuIHVzZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlclJlYWRXcml0ZShTdHJpbmcgdXNlcikgewotICAgICAgICBpZiAodXNlciA9PSBudWxsIHx8IHVzZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZFdyaXRlVXNlck1hcC5wdXQodXNlciwgZmFsc2UpOwotICAgIH0KLQotICAgIC8vIC0tLSBDTUlTIG9wZXJhdGlvbnMgLS0tCi0KLSAgICAvKioKLSAgICAgKiBDTUlTIGdldFJlcG9zaXRvcnlJbmZvLgotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhDYWxsQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGRlYnVnKCJnZXRSZXBvc2l0b3J5SW5mbyIpOwotCi0gICAgICAgIGNoZWNrVXNlcihjb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlJbmZvMTA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeUluZm8xMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENNSVMgZ2V0VHlwZXNDaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGdldFR5cGVDaGlsZHJlbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdHlwZUlkLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQpIHsKLSAgICAgICAgZGVidWcoImdldFR5cGVzQ2hpbGRyZW4iKTsKLSAgICAgICAgY2hlY2tVc2VyKGNvbnRleHQsIGZhbHNlKTsKLQotICAgICAgICByZXR1cm4gdHlwZU1hbmFnZXIuZ2V0VHlwZUNoaWxkcmVuKGNvbnRleHQsIHR5cGVJZCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIG1heEl0ZW1zLCBza2lwQ291bnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENNSVMgZ2V0VHlwZXNEZXNjZW5kYW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0VHlwZURlc2NlbmRhbnRzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyB0eXBlSWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0gICAgICAgIGRlYnVnKCJnZXRUeXBlc0Rlc2NlbmRhbnRzIik7Ci0gICAgICAgIGNoZWNrVXNlcihjb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgcmV0dXJuIHR5cGVNYW5hZ2VyLmdldFR5cGVEZXNjZW5kYW50cyhjb250ZXh0LCB0eXBlSWQsIGRlcHRoLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBnZXRUeXBlRGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBkZWJ1ZygiZ2V0VHlwZURlZmluaXRpb24iKTsKLSAgICAgICAgY2hlY2tVc2VyKGNvbnRleHQsIGZhbHNlKTsKLQotICAgICAgICByZXR1cm4gdHlwZU1hbmFnZXIuZ2V0VHlwZURlZmluaXRpb24oY29udGV4dCwgdHlwZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUqIGRpc3BhdGNoIGZvciBBdG9tUHViLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIGNyZWF0ZShDYWxsQ29udGV4dCBjb250ZXh0LCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLSAgICAgICAgZGVidWcoImNyZWF0ZSIpOwotICAgICAgICBib29sZWFuIHVzZXJSZWFkT25seSA9IGNoZWNrVXNlcihjb250ZXh0LCB0cnVlKTsKLQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gRmlsZVNoYXJlVXRpbHMuZ2V0T2JqZWN0VHlwZUlkKHByb3BlcnRpZXMpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gdHlwZU1hbmFnZXIuZ2V0SW50ZXJuYWxUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IG51bGw7Ci0gICAgICAgIGlmICh0eXBlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgIG9iamVjdElkID0gY3JlYXRlRG9jdW1lbnQoY29udGV4dCwgcHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0ZPTERFUikgewotICAgICAgICAgICAgb2JqZWN0SWQgPSBjcmVhdGVGb2xkZXIoY29udGV4dCwgcHJvcGVydGllcywgZm9sZGVySWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBvYmplY3Qgb2YgdHlwZSAnIiArIHR5cGVJZCArICInISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBpbGVPYmplY3REYXRhKGNvbnRleHQsIGdldEZpbGUob2JqZWN0SWQpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHVzZXJSZWFkT25seSwgb2JqZWN0SW5mb3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENNSVMgY3JlYXRlRG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudChDYWxsQ29udGV4dCBjb250ZXh0LCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSkgewotICAgICAgICBkZWJ1ZygiY3JlYXRlRG9jdW1lbnQiKTsKLSAgICAgICAgY2hlY2tVc2VyKGNvbnRleHQsIHRydWUpOwotCi0gICAgICAgIC8vIGNoZWNrIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydGllcyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHZlcnNpb25pbmcgc3RhdGUKLSAgICAgICAgaWYgKCEoVmVyc2lvbmluZ1N0YXRlLk5PTkUgPT0gdmVyc2lvbmluZ1N0YXRlIHx8IHZlcnNpb25pbmdTdGF0ZSA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJWZXJzaW9uaW5nIG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBGaWxlU2hhcmVVdGlscy5nZXRPYmplY3RUeXBlSWQocHJvcGVydGllcyk7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSB0eXBlTWFuYWdlci5nZXRJbnRlcm5hbFR5cGVEZWZpbml0aW9uKHR5cGVJZCk7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlR5cGUgJyIgKyB0eXBlSWQgKyAiJyBpcyB1bmtub3duISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlLmdldEJhc2VUeXBlSWQoKSAhPSBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIG11c3QgYmUgYSBkb2N1bWVudCB0eXBlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcGlsZSB0aGUgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0aWVzSW1wbCBwcm9wcyA9IGNvbXBpbGVXcml0ZVByb3BlcnRpZXModHlwZUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhlIG5hbWUKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBGaWxlU2hhcmVVdGlscy5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0aWVzLCBQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZShuYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiTmFtZSBpcyBub3QgdmFsaWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgcGFyZW50IEZpbGUKLSAgICAgICAgRmlsZSBwYXJlbnQgPSBnZXRGaWxlKGZvbGRlcklkKTsKLSAgICAgICAgaWYgKCFwYXJlbnQuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiUGFyZW50IGlzIG5vdCBhIGZvbGRlciEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBmaWxlCi0gICAgICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKHBhcmVudCwgbmFtZSk7Ci0gICAgICAgIGlmIChuZXdGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKCJEb2N1bWVudCBhbHJlYWR5IGV4aXN0cyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBmaWxlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd3JpdGUgY29udGVudCwgaWYgYXZhaWxhYmxlCi0gICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwgJiYgY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZUNvbnRlbnQobmV3RmlsZSwgY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgY3JlYXRpb24gZGF0ZQotICAgICAgICBhZGRQcm9wZXJ0eURhdGVUaW1lKHByb3BzLCB0eXBlSWQsIG51bGwsIFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUsCi0gICAgICAgICAgICAgICAgRmlsZVNoYXJlVXRpbHMubWlsbGlzVG9DYWxlbmRhcihuZXdGaWxlLmxhc3RNb2RpZmllZCgpKSk7Ci0KLSAgICAgICAgLy8gd3JpdGUgcHJvcGVydGllcwotICAgICAgICB3cml0ZVByb3BlcnRpZXNGaWxlKG5ld0ZpbGUsIHByb3BzKTsKLQotICAgICAgICByZXR1cm4gZ2V0SWQobmV3RmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNvdXJjZUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpIHsKLSAgICAgICAgZGVidWcoImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSIpOwotICAgICAgICBjaGVja1VzZXIoY29udGV4dCwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdmVyc2lvbmluZyBzdGF0ZQotICAgICAgICBpZiAoIShWZXJzaW9uaW5nU3RhdGUuTk9ORSA9PSB2ZXJzaW9uaW5nU3RhdGUgfHwgdmVyc2lvbmluZ1N0YXRlID09IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIlZlcnNpb25pbmcgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCBwYXJlbnQgRmlsZQotICAgICAgICBGaWxlIHBhcmVudCA9IGdldEZpbGUoZm9sZGVySWQpOwotICAgICAgICBpZiAoIXBhcmVudC5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJQYXJlbnQgaXMgbm90IGEgZm9sZGVyISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHNvdXJjZSBGaWxlCi0gICAgICAgIEZpbGUgc291cmNlID0gZ2V0RmlsZShzb3VyY2VJZCk7Ci0gICAgICAgIGlmICghc291cmNlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJTb3VyY2UgaXMgbm90IGEgZG9jdW1lbnQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaWxlIG5hbWUKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzb3VyY2UuZ2V0TmFtZSgpOwotCi0gICAgICAgIC8vIGdldCBwcm9wZXJ0aWVzCi0gICAgICAgIFByb3BlcnRpZXNJbXBsIHNvdXJjZVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgcmVhZEN1c3RvbVByb3BlcnRpZXMoc291cmNlLCBzb3VyY2VQcm9wZXJ0aWVzLCBudWxsLCBuZXcgT2JqZWN0SW5mb0ltcGwoKSk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIGlkCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBGaWxlU2hhcmVVdGlscy5nZXRJZFByb3BlcnR5KHNvdXJjZVByb3BlcnRpZXMsIFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgaWYgKHR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlSWQgPSBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvcHkgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0aWVzSW1wbCBuZXdQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0gICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3AgOiBzb3VyY2VQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKHByb3AuZ2V0SWQoKS5lcXVhbHMoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpIHx8IHByb3AuZ2V0SWQoKS5lcXVhbHMoUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSkKLSAgICAgICAgICAgICAgICAgICAgfHwgcHJvcC5nZXRJZCgpLmVxdWFscyhQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFKQotICAgICAgICAgICAgICAgICAgICB8fCBwcm9wLmdldElkKCkuZXF1YWxzKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuYWRkUHJvcGVydHkocHJvcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXBsYWNlIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZmluZCBuZXcgbmFtZQotICAgICAgICAgICAgU3RyaW5nIG5ld05hbWUgPSBGaWxlU2hhcmVVdGlscy5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0aWVzLCBQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgICAgIGlmIChuZXdOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKG5ld05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oIk5hbWUgaXMgbm90IHZhbGlkISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuYW1lID0gbmV3TmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucwotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHR5cGVNYW5hZ2VyLmdldEludGVybmFsVHlwZURlZmluaXRpb24odHlwZUlkKTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlLmdldEJhc2VUeXBlSWQoKSAhPSBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBtdXN0IGJlIGEgZG9jdW1lbnQgdHlwZSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmVwbGFjZSB3aXRoIG5ldyB2YWx1ZXMKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3AgOiBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wVHlwZSA9IHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChwcm9wLmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gZG8gd2Uga25vdyB0aGF0IHByb3BlcnR5PwotICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBpcyB1bmtub3duISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNhbiBpdCBiZSBzZXQ/Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BUeXBlLmdldFVwZGF0YWJpbGl0eSgpICE9IFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIHByb3AuZ2V0SWQoKSArICInIGNhbm5vdCBiZSB1cGRhdGVkISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGVtcHR5IHByb3BlcnRpZXMgYXJlIGludmFsaWQKLSAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eVByb3BlcnR5KHByb3ApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzLmFkZFByb3BlcnR5KHByb3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkUHJvcGVydHlJZChuZXdQcm9wZXJ0aWVzLCB0eXBlSWQsIG51bGwsIFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlSWQpOwotICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhuZXdQcm9wZXJ0aWVzLCB0eXBlSWQsIG51bGwsIFByb3BlcnR5SWRzLkNSRUFURURfQlksIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSk7Ci0gICAgICAgIGFkZFByb3BlcnR5RGF0ZVRpbWUobmV3UHJvcGVydGllcywgdHlwZUlkLCBudWxsLCBQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLAotICAgICAgICAgICAgICAgIEZpbGVTaGFyZVV0aWxzLm1pbGxpc1RvQ2FsZW5kYXIoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLSAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcobmV3UHJvcGVydGllcywgdHlwZUlkLCBudWxsLCBQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUVEX0JZLCBjb250ZXh0LmdldFVzZXJuYW1lKCkpOwotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBmaWxlCi0gICAgICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKHBhcmVudCwgbmFtZSk7Ci0gICAgICAgIGlmIChuZXdGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKCJEb2N1bWVudCBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBmaWxlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29weSBjb250ZW50Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3cml0ZUNvbnRlbnQobmV3RmlsZSwgbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNTdG9yYWdlRXhjZXB0aW9uKCJDb3VsZCBub3Qgcm9lYWQgb3Igd3JpdGUgY29udGVudDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdyaXRlIHByb3BlcnRpZXMKLSAgICAgICAgd3JpdGVQcm9wZXJ0aWVzRmlsZShuZXdGaWxlLCBuZXdQcm9wZXJ0aWVzKTsKLQotICAgICAgICByZXR1cm4gZ2V0SWQobmV3RmlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBjb250ZW50IHRvIGRpc2MuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ29udGVudChGaWxlIG5ld0ZpbGUsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ld0ZpbGUpOwotICAgICAgICAgICAgSU9VdGlscy5jb3B5KHN0cmVhbSwgb3V0LCBCVUZGRVJfU0laRSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGNvbnRlbnQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShvdXQpOwotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoc3RyZWFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENNSVMgY3JlYXRlRm9sZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRm9sZGVyKENhbGxDb250ZXh0IGNvbnRleHQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIGRlYnVnKCJjcmVhdGVGb2xkZXIiKTsKLSAgICAgICAgY2hlY2tVc2VyKGNvbnRleHQsIHRydWUpOwotCi0gICAgICAgIC8vIGNoZWNrIHByb3BlcnRpZXMKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydGllcyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHR5cGUKLSAgICAgICAgU3RyaW5nIHR5cGVJZCA9IEZpbGVTaGFyZVV0aWxzLmdldE9iamVjdFR5cGVJZChwcm9wZXJ0aWVzKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHR5cGVNYW5hZ2VyLmdldEludGVybmFsVHlwZURlZmluaXRpb24odHlwZUlkKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVHlwZSAnIiArIHR5cGVJZCArICInIGlzIHVua25vd24hIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpICE9IEJhc2VUeXBlSWQuQ01JU19GT0xERVIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIG11c3QgYmUgYSBmb2xkZXIgdHlwZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbXBpbGUgdGhlIHByb3BlcnRpZXMKLSAgICAgICAgUHJvcGVydGllc0ltcGwgcHJvcHMgPSBjb21waWxlV3JpdGVQcm9wZXJ0aWVzKHR5cGVJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBuYW1lCi0gICAgICAgIFN0cmluZyBuYW1lID0gRmlsZVNoYXJlVXRpbHMuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydGllcywgUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oIk5hbWUgaXMgbm90IHZhbGlkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHBhcmVudCBGaWxlCi0gICAgICAgIEZpbGUgcGFyZW50ID0gZ2V0RmlsZShmb2xkZXJJZCk7Ci0gICAgICAgIGlmICghcGFyZW50LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlBhcmVudCBpcyBub3QgYSBmb2xkZXIhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGZvbGRlcgotICAgICAgICBGaWxlIG5ld0ZvbGRlciA9IG5ldyBGaWxlKHBhcmVudCwgbmFtZSk7Ci0gICAgICAgIGlmICghbmV3Rm9sZGVyLm1rZGlyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBmb2xkZXIhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgY3JlYXRpb24gZGF0ZQotICAgICAgICBhZGRQcm9wZXJ0eURhdGVUaW1lKHByb3BzLCB0eXBlSWQsIG51bGwsIFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUsCi0gICAgICAgICAgICAgICAgRmlsZVNoYXJlVXRpbHMubWlsbGlzVG9DYWxlbmRhcihuZXdGb2xkZXIubGFzdE1vZGlmaWVkKCkpKTsKLQotICAgICAgICAvLyB3cml0ZSBwcm9wZXJ0aWVzCi0gICAgICAgIHdyaXRlUHJvcGVydGllc0ZpbGUobmV3Rm9sZGVyLCBwcm9wcyk7Ci0KLSAgICAgICAgcmV0dXJuIGdldElkKG5ld0ZvbGRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBtb3ZlT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIG1vdmVPYmplY3QoQ2FsbENvbnRleHQgY29udGV4dCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIFN0cmluZyB0YXJnZXRGb2xkZXJJZCwKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0gICAgICAgIGRlYnVnKCJtb3ZlT2JqZWN0Iik7Ci0gICAgICAgIGJvb2xlYW4gdXNlclJlYWRPbmx5ID0gY2hlY2tVc2VyKGNvbnRleHQsIHRydWUpOwotCi0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSWQgaXMgbm90IHZhbGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlIGFuZCBwYXJlbnQKLSAgICAgICAgRmlsZSBmaWxlID0gZ2V0RmlsZShvYmplY3RJZC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgRmlsZSBwYXJlbnQgPSBnZXRGaWxlKHRhcmdldEZvbGRlcklkKTsKLQotICAgICAgICAvLyBidWlsZCBuZXcgcGF0aAotICAgICAgICBGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShwYXJlbnQsIGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKG5ld0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbigiT2JqZWN0IGFscmVhZHkgZXhpc3RzISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbW92ZSBpdAotICAgICAgICBpZiAoIWZpbGUucmVuYW1lVG8obmV3RmlsZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbigiTW92ZSBmYWlsZWQhIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBzZXQgbmV3IGlkCi0gICAgICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShnZXRJZChuZXdGaWxlKSk7Ci0KLSAgICAgICAgICAgIC8vIGlmIGl0IGlzIGEgZmlsZSwgbW92ZSBwcm9wZXJ0aWVzIGZpbGUgdG9vCi0gICAgICAgICAgICBpZiAobmV3RmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgIEZpbGUgcHJvcEZpbGUgPSBnZXRQcm9wZXJ0aWVzRmlsZShmaWxlKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdQcm9wRmlsZSA9IG5ldyBGaWxlKHBhcmVudCwgcHJvcEZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvcEZpbGUucmVuYW1lVG8obmV3UHJvcEZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21waWxlT2JqZWN0RGF0YShjb250ZXh0LCBuZXdGaWxlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHVzZXJSZWFkT25seSwgb2JqZWN0SW5mb3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENNSVMgc2V0Q29udGVudFN0cmVhbSwgZGVsZXRlQ29udGVudFN0cmVhbSwgYW5kIGFwcGVuZENvbnRlbnRTdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2hhbmdlQ29udGVudFN0cmVhbShDYWxsQ29udGV4dCBjb250ZXh0LCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBvdmVyd3JpdGVGbGFnLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIGFwcGVuZCkgewotICAgICAgICBkZWJ1Zygic2V0Q29udGVudFN0cmVhbSBvciBkZWxldGVDb250ZW50U3RyZWFtIG9yIGFwcGVuZENvbnRlbnRTdHJlYW0iKTsKLSAgICAgICAgY2hlY2tVc2VyKGNvbnRleHQsIHRydWUpOwotCi0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSWQgaXMgbm90IHZhbGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlCi0gICAgICAgIEZpbGUgZmlsZSA9IGdldEZpbGUob2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGlmICghZmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNTdHJlYW1Ob3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBhIGZpbGUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBvdmVyd3JpdGUKLSAgICAgICAgYm9vbGVhbiBvd2YgPSBGaWxlU2hhcmVVdGlscy5nZXRCb29sZWFuUGFyYW1ldGVyKG92ZXJ3cml0ZUZsYWcsIHRydWUpOwotICAgICAgICBpZiAoIW93ZiAmJiBmaWxlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigiQ29udGVudCBhbHJlYWR5IGV4aXN0cyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCBhcHBlbmQpOwotCi0gICAgICAgICAgICBpZiAoY29udGVudFN0cmVhbSA9PSBudWxsIHx8IGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBjb250ZW50Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKG5ldyBieXRlWzBdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IGNvbnRlbnQKLSAgICAgICAgICAgICAgICBpbiA9IGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KGluLCBvdXQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGNvbnRlbnQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShvdXQpOwotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoaW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBkZWxldGVPYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVsZXRlT2JqZWN0KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBkZWJ1ZygiZGVsZXRlT2JqZWN0Iik7Ci0gICAgICAgIGNoZWNrVXNlcihjb250ZXh0LCB0cnVlKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGZpbGUgb3IgZm9sZGVyCi0gICAgICAgIEZpbGUgZmlsZSA9IGdldEZpbGUob2JqZWN0SWQpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIk9iamVjdCBub3QgZm91bmQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiBpdCBpcyBhIGZvbGRlciBhbmQgaWYgaXQgaXMgZW1wdHkKLSAgICAgICAgaWYgKCFpc0ZvbGRlckVtcHR5KGZpbGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIkZvbGRlciBpcyBub3QgZW1wdHkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWxldGUgcHJvcGVydGllcyBhbmQgYWN0dWFsIGZpbGUKLSAgICAgICAgZ2V0UHJvcGVydGllc0ZpbGUoZmlsZSkuZGVsZXRlKCk7Ci0gICAgICAgIGlmICghZmlsZS5kZWxldGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNTdG9yYWdlRXhjZXB0aW9uKCJEZWxldGlvbiBmYWlsZWQhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDTUlTIGRlbGV0ZVRyZWUuCi0gICAgICovCi0gICAgcHVibGljIEZhaWxlZFRvRGVsZXRlRGF0YSBkZWxldGVUcmVlKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBjb250aW51ZU9uRmFpbHVyZSkgewotICAgICAgICBkZWJ1ZygiZGVsZXRlVHJlZSIpOwotICAgICAgICBjaGVja1VzZXIoY29udGV4dCwgdHJ1ZSk7Ci0KLSAgICAgICAgYm9vbGVhbiBjb2YgPSBGaWxlU2hhcmVVdGlscy5nZXRCb29sZWFuUGFyYW1ldGVyKGNvbnRpbnVlT25GYWlsdXJlLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlIG9yIGZvbGRlcgotICAgICAgICBGaWxlIGZpbGUgPSBnZXRGaWxlKGZvbGRlcklkKTsKLQotICAgICAgICBGYWlsZWRUb0RlbGV0ZURhdGFJbXBsIHJlc3VsdCA9IG5ldyBGYWlsZWRUb0RlbGV0ZURhdGFJbXBsKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRJZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCi0gICAgICAgIC8vIGlmIGl0IGlzIGEgZm9sZGVyLCByZW1vdmUgaXQgcmVjdXJzaXZlbHkKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgZGVsZXRlRm9sZGVyKGZpbGUsIGNvZiwgcmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiT2JqZWN0IGlzIG5vdCBhIGZvbGRlciEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGZvbGRlciBhbmQgaXRzIGNvbnRlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZUZvbGRlcihGaWxlIGZvbGRlciwgYm9vbGVhbiBjb250aW51ZU9uRmFpbHVyZSwgRmFpbGVkVG9EZWxldGVEYXRhSW1wbCBmdGQpIHsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKLQotICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGZvbGRlci5saXN0RmlsZXMoKSkgewotICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGlmICghZGVsZXRlRm9sZGVyKGZpbGUsIGNvbnRpbnVlT25GYWlsdXJlLCBmdGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY29udGludWVPbkZhaWx1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZnRkLmdldElkcygpLmFkZChnZXRJZChmaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY29udGludWVPbkZhaWx1cmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFmb2xkZXIuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgIGZ0ZC5nZXRJZHMoKS5hZGQoZ2V0SWQoZm9sZGVyKSk7Ci0gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDTUlTIHVwZGF0ZVByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdERhdGEgdXBkYXRlUHJvcGVydGllcyhDYWxsQ29udGV4dCBjb250ZXh0LCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLSAgICAgICAgZGVidWcoInVwZGF0ZVByb3BlcnRpZXMiKTsKLSAgICAgICAgYm9vbGVhbiB1c2VyUmVhZE9ubHkgPSBjaGVja1VzZXIoY29udGV4dCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwgfHwgb2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSWQgaXMgbm90IHZhbGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlIG9yIGZvbGRlcgotICAgICAgICBGaWxlIGZpbGUgPSBnZXRGaWxlKG9iamVjdElkLmdldFZhbHVlKCkpOwotCi0gICAgICAgIC8vIGdldCBhbmQgY2hlY2sgdGhlIG5ldyBuYW1lCi0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gRmlsZVNoYXJlVXRpbHMuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydGllcywgUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIGJvb2xlYW4gaXNSZW5hbWUgPSAobmV3TmFtZSAhPSBudWxsKSAmJiAoIWZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuZXdOYW1lKSk7Ci0gICAgICAgIGlmIChpc1JlbmFtZSAmJiAhaXNWYWxpZE5hbWUobmV3TmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oIk5hbWUgaXMgbm90IHZhbGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IG9sZCBwcm9wZXJ0aWVzCi0gICAgICAgIFByb3BlcnRpZXNJbXBsIG9sZFByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwoKTsKLSAgICAgICAgcmVhZEN1c3RvbVByb3BlcnRpZXMoZmlsZSwgb2xkUHJvcGVydGllcywgbnVsbCwgbmV3IE9iamVjdEluZm9JbXBsKCkpOwotCi0gICAgICAgIC8vIGdldCB0aGUgdHlwZSBpZAotICAgICAgICBTdHJpbmcgdHlwZUlkID0gRmlsZVNoYXJlVXRpbHMuZ2V0SWRQcm9wZXJ0eShvbGRQcm9wZXJ0aWVzLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgIGlmICh0eXBlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZUlkID0gKGZpbGUuaXNEaXJlY3RvcnkoKSA/IEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSA6IEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgY3JlYXRvcgotICAgICAgICBTdHJpbmcgY3JlYXRvciA9IEZpbGVTaGFyZVV0aWxzLmdldFN0cmluZ1Byb3BlcnR5KG9sZFByb3BlcnRpZXMsIFByb3BlcnR5SWRzLkNSRUFURURfQlkpOwotICAgICAgICBpZiAoY3JlYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcmVhdG9yID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IGNyZWF0aW9uIGRhdGUKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY3JlYXRpb25EYXRlID0gRmlsZVNoYXJlVXRpbHMuZ2V0RGF0ZVRpbWVQcm9wZXJ0eShvbGRQcm9wZXJ0aWVzLCBQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFKTsKLSAgICAgICAgaWYgKGNyZWF0aW9uRGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcmVhdGlvbkRhdGUgPSBGaWxlU2hhcmVVdGlscy5taWxsaXNUb0NhbGVuZGFyKGZpbGUubGFzdE1vZGlmaWVkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcGlsZSB0aGUgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gdXBkYXRlUHJvcGVydGllcyh0eXBlSWQsIGNyZWF0b3IsIGNyZWF0aW9uRGF0ZSwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBvbGRQcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIHdyaXRlIHByb3BlcnRpZXMKLSAgICAgICAgd3JpdGVQcm9wZXJ0aWVzRmlsZShmaWxlLCBwcm9wcyk7Ci0KLSAgICAgICAgLy8gcmVuYW1lIGZpbGUgb3IgZm9sZGVyIGlmIG5lY2Vzc2FyeQotICAgICAgICBGaWxlIG5ld0ZpbGUgPSBmaWxlOwotICAgICAgICBpZiAoaXNSZW5hbWUpIHsKLSAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICBGaWxlIHByb3BGaWxlID0gZ2V0UHJvcGVydGllc0ZpbGUoZmlsZSk7Ci0gICAgICAgICAgICBuZXdGaWxlID0gbmV3IEZpbGUocGFyZW50LCBuZXdOYW1lKTsKLSAgICAgICAgICAgIGlmICghZmlsZS5yZW5hbWVUbyhuZXdGaWxlKSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKCJDb3VsZCBub3QgcmVuYW1lIG9iamVjdCEiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IG5ldyBpZAotICAgICAgICAgICAgICAgIG9iamVjdElkLnNldFZhbHVlKGdldElkKG5ld0ZpbGUpKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIGEgZmlsZSwgcmVuYW1lIHByb3BlcnRpZXMgZmlsZSB0b28KLSAgICAgICAgICAgICAgICBpZiAobmV3RmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgbmV3UHJvcEZpbGUgPSBuZXcgRmlsZShwYXJlbnQsIG5ld05hbWUgKyBTSEFET1dfRVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BGaWxlLnJlbmFtZVRvKG5ld1Byb3BGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21waWxlT2JqZWN0RGF0YShjb250ZXh0LCBuZXdGaWxlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHVzZXJSZWFkT25seSwgb2JqZWN0SW5mb3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBhbmQgdXBkYXRlcyBhIHByb3BlcnR5IHNldCB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIGRpc2MuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGNyZWF0b3IsIEdyZWdvcmlhbkNhbGVuZGFyIGNyZWF0aW9uRGF0ZSwgU3RyaW5nIG1vZGlmaWVyLAotICAgICAgICAgICAgUHJvcGVydGllcyBvbGRQcm9wZXJ0aWVzLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgUHJvcGVydGllc0ltcGwgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJObyBwcm9wZXJ0aWVzISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gdHlwZU1hbmFnZXIuZ2V0SW50ZXJuYWxUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvcHkgb2xkIHByb3BlcnRpZXMKLSAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcHJvcCA6IG9sZFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcFR5cGUgPSB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcC5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gZG8gd2Uga25vdyB0aGF0IHByb3BlcnR5PwotICAgICAgICAgICAgaWYgKHByb3BUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgcHJvcC5nZXRJZCgpICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gb25seSBhZGQgcmVhZC93cml0ZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBpZiAocHJvcFR5cGUuZ2V0VXBkYXRhYmlsaXR5KCkgIT0gVXBkYXRhYmlsaXR5LlJFQURXUklURSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQuYWRkUHJvcGVydHkocHJvcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgcHJvcGVydGllcwotICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wIDogcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wVHlwZSA9IHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChwcm9wLmdldElkKCkpOwotCi0gICAgICAgICAgICAvLyBkbyB3ZSBrbm93IHRoYXQgcHJvcGVydHk/Ci0gICAgICAgICAgICBpZiAocHJvcFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBpcyB1bmtub3duISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjYW4gaXQgYmUgc2V0PwotICAgICAgICAgICAgaWYgKHByb3BUeXBlLmdldFVwZGF0YWJpbGl0eSgpID09IFVwZGF0YWJpbGl0eS5SRUFET05MWSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBpcyByZWFkb25seSEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByb3BUeXBlLmdldFVwZGF0YWJpbGl0eSgpID09IFVwZGF0YWJpbGl0eS5PTkNSRUFURSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBjYW4gb25seSBiZSBzZXQgb24gY3JlYXRlISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkZWZhdWx0IG9yIHZhbHVlCi0gICAgICAgICAgICBpZiAoaXNFbXB0eVByb3BlcnR5KHByb3ApKSB7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlEZWZhdWx0KHJlc3VsdCwgcHJvcFR5cGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkUHJvcGVydHkocHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRQcm9wZXJ0eUlkKHJlc3VsdCwgdHlwZUlkLCBudWxsLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKTsKLSAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcocmVzdWx0LCB0eXBlSWQsIG51bGwsIFByb3BlcnR5SWRzLkNSRUFURURfQlksIGNyZWF0b3IpOwotICAgICAgICBhZGRQcm9wZXJ0eURhdGVUaW1lKHJlc3VsdCwgdHlwZUlkLCBudWxsLCBQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLCBjcmVhdGlvbkRhdGUpOwotICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhyZXN1bHQsIHR5cGVJZCwgbnVsbCwgUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWSwgbW9kaWZpZXIpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBidWxrVXBkYXRlUHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoQ2FsbENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkQW5kQ2hhbmdlVG9rZW4sIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0gICAgICAgIGRlYnVnKCJidWxrVXBkYXRlUHJvcGVydGllcyIpOwotICAgICAgICBjaGVja1VzZXIoY29udGV4dCwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKG9iamVjdElkQW5kQ2hhbmdlVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk5vIG9iamVjdCBpZHMgcHJvdmlkZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPigpOwotCi0gICAgICAgIGZvciAoQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4gb2lkIDogb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbikgewotICAgICAgICAgICAgaWYgKG9pZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGludmFsaWQgaWRzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IG9pZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihvaWQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvcGVydGllcyhjb250ZXh0LCBvaWRIb2xkZXIsIHByb3BlcnRpZXMsIG9iamVjdEluZm9zKTsKLQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbChvaWQuZ2V0SWQoKSwgb2lkSG9sZGVyLmdldFZhbHVlKCksIG51bGwpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXhjZXB0aW9ucyAtIHNlZSBzcGVjaWZpY2F0aW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENNSVMgZ2V0T2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VydmljZXNJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEJvb2xlYW4gaW5jbHVkZUFjbCwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLSAgICAgICAgZGVidWcoImdldE9iamVjdCIpOwotICAgICAgICBib29sZWFuIHVzZXJSZWFkT25seSA9IGNoZWNrVXNlcihjb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWQKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwgJiYgdmVyc2lvblNlcnZpY2VzSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJZCBtdXN0IGJlIHNldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHdvcmtzIG9ubHkgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdmVyc2lvbnMgaW4gYSBmaWxlIHN5c3RlbQotICAgICAgICAgICAgLy8gYW5kIHRoZSBvYmplY3QgaWQgYW5kIHZlcnNpb24gc2VyaWVzIGlkIGFyZSB0aGUgc2FtZQotICAgICAgICAgICAgb2JqZWN0SWQgPSB2ZXJzaW9uU2VydmljZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgZmlsZSBvciBmb2xkZXIKLSAgICAgICAgRmlsZSBmaWxlID0gZ2V0RmlsZShvYmplY3RJZCk7Ci0KLSAgICAgICAgLy8gc2V0IGRlZmF1bHRzIGlmIHZhbHVlcyBub3Qgc2V0Ci0gICAgICAgIGJvb2xlYW4gaWFhID0gRmlsZVNoYXJlVXRpbHMuZ2V0Qm9vbGVhblBhcmFtZXRlcihpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgZmFsc2UpOwotICAgICAgICBib29sZWFuIGlhY2wgPSBGaWxlU2hhcmVVdGlscy5nZXRCb29sZWFuUGFyYW1ldGVyKGluY2x1ZGVBY2wsIGZhbHNlKTsKLQotICAgICAgICAvLyBzcGxpdCBmaWx0ZXIKLSAgICAgICAgU2V0PFN0cmluZz4gZmlsdGVyQ29sbGVjdGlvbiA9IEZpbGVTaGFyZVV0aWxzLnNwbGl0RmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgLy8gZ2F0aGVyIHByb3BlcnRpZXMKLSAgICAgICAgcmV0dXJuIGNvbXBpbGVPYmplY3REYXRhKGNvbnRleHQsIGZpbGUsIGZpbHRlckNvbGxlY3Rpb24sIGlhYSwgaWFjbCwgdXNlclJlYWRPbmx5LCBvYmplY3RJbmZvcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBnZXRBbGxvd2FibGVBY3Rpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIGRlYnVnKCJnZXRBbGxvd2FibGVBY3Rpb25zIik7Ci0gICAgICAgIGJvb2xlYW4gdXNlclJlYWRPbmx5ID0gY2hlY2tVc2VyKGNvbnRleHQsIGZhbHNlKTsKLQotICAgICAgICBGaWxlIGZpbGUgPSBnZXRGaWxlKG9iamVjdElkKTsKLSAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJPYmplY3Qgbm90IGZvdW5kISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBpbGVBbGxvd2FibGVBY3Rpb25zKGZpbGUsIHVzZXJSZWFkT25seSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBnZXRBQ0wuCi0gICAgICovCi0gICAgcHVibGljIEFjbCBnZXRBY2woQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIGRlYnVnKCJnZXRBY2wiKTsKLSAgICAgICAgY2hlY2tVc2VyKGNvbnRleHQsIGZhbHNlKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGZpbGUgb3IgZm9sZGVyCi0gICAgICAgIEZpbGUgZmlsZSA9IGdldEZpbGUob2JqZWN0SWQpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIk9iamVjdCBub3QgZm91bmQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29tcGlsZUFjbChmaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDTUlTIGdldENvbnRlbnRTdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgb2JqZWN0SWQsIEJpZ0ludGVnZXIgb2Zmc2V0LCBCaWdJbnRlZ2VyIGxlbmd0aCkgewotICAgICAgICBkZWJ1ZygiZ2V0Q29udGVudFN0cmVhbSIpOwotICAgICAgICBjaGVja1VzZXIoY29udGV4dCwgZmFsc2UpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZmlsZQotICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBnZXRGaWxlKG9iamVjdElkKTsKLSAgICAgICAgaWYgKCFmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0cmVhbU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IGEgZmlsZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWxlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiRG9jdW1lbnQgaGFzIG5vIGNvbnRlbnQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgNjQgKiAxMDI0KTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gbnVsbCB8fCBsZW5ndGggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBDb250ZW50UmFuZ2VJbnB1dFN0cmVhbShzdHJlYW0sIG9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29tcGlsZSBkYXRhCi0gICAgICAgIENvbnRlbnRTdHJlYW1JbXBsIHJlc3VsdDsKLSAgICAgICAgaWYgKChvZmZzZXQgIT0gbnVsbCAmJiBvZmZzZXQubG9uZ1ZhbHVlKCkgPiAwKSB8fCBsZW5ndGggIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnRpYWxDb250ZW50U3RyZWFtSW1wbCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0RmlsZU5hbWUoZmlsZS5nZXROYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZihmaWxlLmxlbmd0aCgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRNaW1lVHlwZShNaW1lVHlwZXMuZ2V0TUlNRVR5cGUoZmlsZSkpOwotICAgICAgICByZXN1bHQuc2V0U3RyZWFtKHN0cmVhbSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDTUlTIGdldENoaWxkcmVuLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckxpc3QgZ2V0Q2hpbGRyZW4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLSAgICAgICAgZGVidWcoImdldENoaWxkcmVuIik7Ci0gICAgICAgIGJvb2xlYW4gdXNlclJlYWRPbmx5ID0gY2hlY2tVc2VyKGNvbnRleHQsIGZhbHNlKTsKLQotICAgICAgICAvLyBzcGxpdCBmaWx0ZXIKLSAgICAgICAgU2V0PFN0cmluZz4gZmlsdGVyQ29sbGVjdGlvbiA9IEZpbGVTaGFyZVV0aWxzLnNwbGl0RmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgLy8gc2V0IGRlZmF1bHRzIGlmIHZhbHVlcyBub3Qgc2V0Ci0gICAgICAgIGJvb2xlYW4gaWFhID0gRmlsZVNoYXJlVXRpbHMuZ2V0Qm9vbGVhblBhcmFtZXRlcihpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgZmFsc2UpOwotICAgICAgICBib29sZWFuIGlwcyA9IEZpbGVTaGFyZVV0aWxzLmdldEJvb2xlYW5QYXJhbWV0ZXIoaW5jbHVkZVBhdGhTZWdtZW50LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gc2tpcCBhbmQgbWF4Ci0gICAgICAgIGludCBza2lwID0gKHNraXBDb3VudCA9PSBudWxsID8gMCA6IHNraXBDb3VudC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKHNraXAgPCAwKSB7Ci0gICAgICAgICAgICBza2lwID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtYXggPSAobWF4SXRlbXMgPT0gbnVsbCA/IEludGVnZXIuTUFYX1ZBTFVFIDogbWF4SXRlbXMuaW50VmFsdWUoKSk7Ci0gICAgICAgIGlmIChtYXggPCAwKSB7Ci0gICAgICAgICAgICBtYXggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgZm9sZGVyCi0gICAgICAgIEZpbGUgZm9sZGVyID0gZ2V0RmlsZShmb2xkZXJJZCk7Ci0gICAgICAgIGlmICghZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIk5vdCBhIGZvbGRlciEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBvYmplY3QgaW5mbyBvZiB0aGUgdGhlIGZvbGRlcgotICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBjb21waWxlT2JqZWN0RGF0YShjb250ZXh0LCBmb2xkZXIsIG51bGwsIGZhbHNlLCBmYWxzZSwgdXNlclJlYWRPbmx5LCBvYmplY3RJbmZvcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcmVwYXJlIHJlc3VsdAotICAgICAgICBPYmplY3RJbkZvbGRlckxpc3RJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3RJbkZvbGRlckxpc3RJbXBsKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPigpKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhmYWxzZSk7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGNoaWxkcmVuCi0gICAgICAgIGZvciAoRmlsZSBjaGlsZCA6IGZvbGRlci5saXN0RmlsZXMoKSkgewotICAgICAgICAgICAgLy8gc2tpcCBoaWRkZW4gYW5kIHNoYWRvdyBmaWxlcwotICAgICAgICAgICAgaWYgKGNoaWxkLmlzSGlkZGVuKCkgfHwgY2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhTSEFET1dfRk9MREVSKSB8fCBjaGlsZC5nZXRQYXRoKCkuZW5kc1dpdGgoU0hBRE9XX0VYVCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgaWYgKHNraXAgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2tpcC0tOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVzdWx0LmdldE9iamVjdHMoKS5zaXplKCkgPj0gbWF4KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyh0cnVlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYnVpbGQgYW5kIGFkZCBjaGlsZCBvYmplY3QKLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyRGF0YUltcGwgb2JqZWN0SW5Gb2xkZXIgPSBuZXcgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCgpOwotICAgICAgICAgICAgb2JqZWN0SW5Gb2xkZXIuc2V0T2JqZWN0KGNvbXBpbGVPYmplY3REYXRhKGNvbnRleHQsIGNoaWxkLCBmaWx0ZXJDb2xsZWN0aW9uLCBpYWEsIGZhbHNlLCB1c2VyUmVhZE9ubHksCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm9zKSk7Ci0gICAgICAgICAgICBpZiAoaXBzKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SW5Gb2xkZXIuc2V0UGF0aFNlZ21lbnQoY2hpbGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQob2JqZWN0SW5Gb2xkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKEJpZ0ludGVnZXIudmFsdWVPZihjb3VudCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBnZXREZXNjZW5kYW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLAotICAgICAgICAgICAgYm9vbGVhbiBmb2xkZXJzT25seSkgewotICAgICAgICBkZWJ1ZygiZ2V0RGVzY2VuZGFudHMgb3IgZ2V0Rm9sZGVyVHJlZSIpOwotICAgICAgICBib29sZWFuIHVzZXJSZWFkT25seSA9IGNoZWNrVXNlcihjb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGVwdGgKLSAgICAgICAgaW50IGQgPSAoZGVwdGggPT0gbnVsbCA/IDIgOiBkZXB0aC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKGQgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkRlcHRoIG11c3Qgbm90IGJlIDAhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGQgPCAtMSkgewotICAgICAgICAgICAgZCA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3BsaXQgZmlsdGVyCi0gICAgICAgIFNldDxTdHJpbmc+IGZpbHRlckNvbGxlY3Rpb24gPSBGaWxlU2hhcmVVdGlscy5zcGxpdEZpbHRlcihmaWx0ZXIpOwotCi0gICAgICAgIC8vIHNldCBkZWZhdWx0cyBpZiB2YWx1ZXMgbm90IHNldAotICAgICAgICBib29sZWFuIGlhYSA9IEZpbGVTaGFyZVV0aWxzLmdldEJvb2xlYW5QYXJhbWV0ZXIoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGZhbHNlKTsKLSAgICAgICAgYm9vbGVhbiBpcHMgPSBGaWxlU2hhcmVVdGlscy5nZXRCb29sZWFuUGFyYW1ldGVyKGluY2x1ZGVQYXRoU2VnbWVudCwgZmFsc2UpOwotCi0gICAgICAgIC8vIGdldCB0aGUgZm9sZGVyCi0gICAgICAgIEZpbGUgZm9sZGVyID0gZ2V0RmlsZShmb2xkZXJJZCk7Ci0gICAgICAgIGlmICghZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIk5vdCBhIGZvbGRlciEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBvYmplY3QgaW5mbyBvZiB0aGUgdGhlIGZvbGRlcgotICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBjb21waWxlT2JqZWN0RGF0YShjb250ZXh0LCBmb2xkZXIsIG51bGwsIGZhbHNlLCBmYWxzZSwgdXNlclJlYWRPbmx5LCBvYmplY3RJbmZvcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHRyZWUKLSAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLSAgICAgICAgZ2F0aGVyRGVzY2VuZGFudHMoY29udGV4dCwgZm9sZGVyLCByZXN1bHQsIGZvbGRlcnNPbmx5LCBkLCBmaWx0ZXJDb2xsZWN0aW9uLCBpYWEsIGlwcywgdXNlclJlYWRPbmx5LAotICAgICAgICAgICAgICAgIG9iamVjdEluZm9zKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdhdGhlciB0aGUgY2hpbGRyZW4gb2YgYSBmb2xkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdhdGhlckRlc2NlbmRhbnRzKENhbGxDb250ZXh0IGNvbnRleHQsIEZpbGUgZm9sZGVyLCBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBsaXN0LAotICAgICAgICAgICAgYm9vbGVhbiBmb2xkZXJzT25seSwgaW50IGRlcHRoLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIGJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBib29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudHMsIGJvb2xlYW4gdXNlclJlYWRPbmx5LCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotICAgICAgICBhc3NlcnQgZm9sZGVyICE9IG51bGw7Ci0gICAgICAgIGFzc2VydCBsaXN0ICE9IG51bGw7Ci0KLSAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGNoaWxkcmVuCi0gICAgICAgIGZvciAoRmlsZSBjaGlsZCA6IGZvbGRlci5saXN0RmlsZXMoKSkgewotICAgICAgICAgICAgLy8gc2tpcCBoaWRkZW4gYW5kIHNoYWRvdyBmaWxlcwotICAgICAgICAgICAgaWYgKGNoaWxkLmlzSGlkZGVuKCkgfHwgY2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhTSEFET1dfRk9MREVSKSB8fCBjaGlsZC5nZXRQYXRoKCkuZW5kc1dpdGgoU0hBRE9XX0VYVCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZm9sZGVycyBvbmx5PwotICAgICAgICAgICAgaWYgKGZvbGRlcnNPbmx5ICYmICFjaGlsZC5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0byBsaXN0Ci0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckRhdGFJbXBsIG9iamVjdEluRm9sZGVyID0gbmV3IE9iamVjdEluRm9sZGVyRGF0YUltcGwoKTsKLSAgICAgICAgICAgIG9iamVjdEluRm9sZGVyLnNldE9iamVjdChjb21waWxlT2JqZWN0RGF0YShjb250ZXh0LCBjaGlsZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIHVzZXJSZWFkT25seSwgb2JqZWN0SW5mb3MpKTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlUGF0aFNlZ21lbnRzKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SW5Gb2xkZXIuc2V0UGF0aFNlZ21lbnQoY2hpbGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsIGNvbnRhaW5lciA9IG5ldyBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwoKTsKLSAgICAgICAgICAgIGNvbnRhaW5lci5zZXRPYmplY3Qob2JqZWN0SW5Gb2xkZXIpOwotCi0gICAgICAgICAgICBsaXN0LmFkZChjb250YWluZXIpOwotCi0gICAgICAgICAgICAvLyBtb3ZlIHRvIG5leHQgbGV2ZWwKLSAgICAgICAgICAgIGlmIChkZXB0aCAhPSAxICYmIGNoaWxkLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0Q2hpbGRyZW4obmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKSk7Ci0gICAgICAgICAgICAgICAgZ2F0aGVyRGVzY2VuZGFudHMoY29udGV4dCwgY2hpbGQsIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLCBmb2xkZXJzT25seSwgZGVwdGggLSAxLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVBhdGhTZWdtZW50cywgdXNlclJlYWRPbmx5LCBvYmplY3RJbmZvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDTUlTIGdldEZvbGRlclBhcmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRGb2xkZXJQYXJlbnQoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotICAgICAgICBMaXN0PE9iamVjdFBhcmVudERhdGE+IHBhcmVudHMgPSBnZXRPYmplY3RQYXJlbnRzKGNvbnRleHQsIGZvbGRlcklkLCBmaWx0ZXIsIGZhbHNlLCBmYWxzZSwgb2JqZWN0SW5mb3MpOwotCi0gICAgICAgIGlmIChwYXJlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlRoZSByb290IGZvbGRlciBoYXMgbm8gcGFyZW50ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmVudHMuZ2V0KDApLmdldE9iamVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENNSVMgZ2V0T2JqZWN0UGFyZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBnZXRPYmplY3RQYXJlbnRzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEJvb2xlYW4gaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0gICAgICAgIGRlYnVnKCJnZXRPYmplY3RQYXJlbnRzIik7Ci0gICAgICAgIGJvb2xlYW4gdXNlclJlYWRPbmx5ID0gY2hlY2tVc2VyKGNvbnRleHQsIGZhbHNlKTsKLQotICAgICAgICAvLyBzcGxpdCBmaWx0ZXIKLSAgICAgICAgU2V0PFN0cmluZz4gZmlsdGVyQ29sbGVjdGlvbiA9IEZpbGVTaGFyZVV0aWxzLnNwbGl0RmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgLy8gc2V0IGRlZmF1bHRzIGlmIHZhbHVlcyBub3Qgc2V0Ci0gICAgICAgIGJvb2xlYW4gaWFhID0gRmlsZVNoYXJlVXRpbHMuZ2V0Qm9vbGVhblBhcmFtZXRlcihpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgZmFsc2UpOwotICAgICAgICBib29sZWFuIGlycHMgPSBGaWxlU2hhcmVVdGlscy5nZXRCb29sZWFuUGFyYW1ldGVyKGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlIG9yIGZvbGRlcgotICAgICAgICBGaWxlIGZpbGUgPSBnZXRGaWxlKG9iamVjdElkKTsKLQotICAgICAgICAvLyBkb24ndCBjbGltYiBhYm92ZSB0aGUgcm9vdCBmb2xkZXIKLSAgICAgICAgaWYgKHJvb3QuZXF1YWxzKGZpbGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgb2JqZWN0IGluZm8gb2YgdGhlIHRoZSBvYmplY3QKLSAgICAgICAgaWYgKGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgY29tcGlsZU9iamVjdERhdGEoY29udGV4dCwgZmlsZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB1c2VyUmVhZE9ubHksIG9iamVjdEluZm9zKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCBwYXJlbnQgZm9sZGVyCi0gICAgICAgIEZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gY29tcGlsZU9iamVjdERhdGEoY29udGV4dCwgcGFyZW50LCBmaWx0ZXJDb2xsZWN0aW9uLCBpYWEsIGZhbHNlLCB1c2VyUmVhZE9ubHksIG9iamVjdEluZm9zKTsKLQotICAgICAgICBPYmplY3RQYXJlbnREYXRhSW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0UGFyZW50RGF0YUltcGwoKTsKLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChvYmplY3QpOwotICAgICAgICBpZiAoaXJwcykgewotICAgICAgICAgICAgcmVzdWx0LnNldFJlbGF0aXZlUGF0aFNlZ21lbnQoZmlsZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxPYmplY3RQYXJlbnREYXRhPiBzaW5nbGV0b25MaXN0KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ01JUyBnZXRPYmplY3RCeVBhdGguCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0QnlQYXRoKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmb2xkZXJQYXRoLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgYm9vbGVhbiBpbmNsdWRlQUNMLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotICAgICAgICBkZWJ1ZygiZ2V0T2JqZWN0QnlQYXRoIik7Ci0gICAgICAgIGJvb2xlYW4gdXNlclJlYWRPbmx5ID0gY2hlY2tVc2VyKGNvbnRleHQsIGZhbHNlKTsKLQotICAgICAgICAvLyBzcGxpdCBmaWx0ZXIKLSAgICAgICAgU2V0PFN0cmluZz4gZmlsdGVyQ29sbGVjdGlvbiA9IEZpbGVTaGFyZVV0aWxzLnNwbGl0RmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcGF0aAotICAgICAgICBpZiAoZm9sZGVyUGF0aCA9PSBudWxsIHx8IGZvbGRlclBhdGgubGVuZ3RoKCkgPT0gMCB8fCBmb2xkZXJQYXRoLmNoYXJBdCgwKSAhPSAnLycpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGZvbGRlciBwYXRoISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlIG9yIGZvbGRlcgotICAgICAgICBGaWxlIGZpbGUgPSBudWxsOwotICAgICAgICBpZiAoZm9sZGVyUGF0aC5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICBmaWxlID0gcm9vdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZm9sZGVyUGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUocm9vdCwgcGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlBhdGggZG9lc24ndCBleGlzdC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21waWxlT2JqZWN0RGF0YShjb250ZXh0LCBmaWxlLCBmaWx0ZXJDb2xsZWN0aW9uLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZUFDTCwgdXNlclJlYWRPbmx5LAotICAgICAgICAgICAgICAgIG9iamVjdEluZm9zKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gaGVscGVycyAtLS0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIGFuIG9iamVjdCB0eXBlIG9iamVjdCBmcm9tIGEgZmlsZSBvciBmb2xkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3REYXRhIGNvbXBpbGVPYmplY3REYXRhKENhbGxDb250ZXh0IGNvbnRleHQsIEZpbGUgZmlsZSwgU2V0PFN0cmluZz4gZmlsdGVyLAotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgYm9vbGVhbiBpbmNsdWRlQWNsLCBib29sZWFuIHVzZXJSZWFkT25seSwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLSAgICAgICAgT2JqZWN0RGF0YUltcGwgcmVzdWx0ID0gbmV3IE9iamVjdERhdGFJbXBsKCk7Ci0gICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLQotICAgICAgICByZXN1bHQuc2V0UHJvcGVydGllcyhjb21waWxlUHJvcGVydGllcyhjb250ZXh0LCBmaWxlLCBmaWx0ZXIsIG9iamVjdEluZm8pKTsKLQotICAgICAgICBpZiAoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRBbGxvd2FibGVBY3Rpb25zKGNvbXBpbGVBbGxvd2FibGVBY3Rpb25zKGZpbGUsIHVzZXJSZWFkT25seSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluY2x1ZGVBY2wpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRBY2woY29tcGlsZUFjbChmaWxlKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0SXNFeGFjdEFjbCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0T2JqZWN0KHJlc3VsdCk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXJzIGFsbCBiYXNlIHByb3BlcnRpZXMgb2YgYSBmaWxlIG9yIGZvbGRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgY29tcGlsZVByb3BlcnRpZXMoQ2FsbENvbnRleHQgY29udGV4dCwgRmlsZSBmaWxlLCBTZXQ8U3RyaW5nPiBvcmdmaWx0ZXIsCi0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvKSB7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgbXVzdCBub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdlIGNhbid0IGdhdGhlciBwcm9wZXJ0aWVzIGlmIHRoZSBmaWxlIG9yIGZvbGRlciBkb2Vzbid0IGV4aXN0Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiT2JqZWN0IG5vdCBmb3VuZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvcHkgZmlsdGVyCi0gICAgICAgIFNldDxTdHJpbmc+IGZpbHRlciA9IChvcmdmaWx0ZXIgPT0gbnVsbCA/IG51bGwgOiBuZXcgSGFzaFNldDxTdHJpbmc+KG9yZ2ZpbHRlcikpOwotCi0gICAgICAgIC8vIGZpbmQgYmFzZSB0eXBlCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBudWxsOwotCi0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHR5cGVJZCA9IEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0QmFzZVR5cGUoQmFzZVR5cGVJZC5DTUlTX0ZPTERFUik7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldFR5cGVJZCh0eXBlSWQpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRDb250ZW50VHlwZShudWxsKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0RmlsZU5hbWUobnVsbCk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldEhhc0FjbCh0cnVlKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0SGFzQ29udGVudChmYWxzZSk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldFZlcnNpb25TZXJpZXNJZChudWxsKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0SXNDdXJyZW50VmVyc2lvbih0cnVlKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0UmVsYXRpb25zaGlwU291cmNlSWRzKG51bGwpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRSZWxhdGlvbnNoaXBUYXJnZXRJZHMobnVsbCk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldFJlbmRpdGlvbkluZm9zKG51bGwpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRTdXBwb3J0c0Rlc2NlbmRhbnRzKHRydWUpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRTdXBwb3J0c0ZvbGRlclRyZWUodHJ1ZSk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldFN1cHBvcnRzUG9saWNpZXMoZmFsc2UpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRTdXBwb3J0c1JlbGF0aW9uc2hpcHMoZmFsc2UpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRXb3JraW5nQ29weUlkKG51bGwpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRXb3JraW5nQ29weU9yaWdpbmFsSWQobnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlSWQgPSBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0QmFzZVR5cGUoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0VHlwZUlkKHR5cGVJZCk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldEhhc0FjbCh0cnVlKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0SGFzQ29udGVudCh0cnVlKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0SGFzUGFyZW50KHRydWUpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRWZXJzaW9uU2VyaWVzSWQobnVsbCk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldElzQ3VycmVudFZlcnNpb24odHJ1ZSk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldFJlbGF0aW9uc2hpcFNvdXJjZUlkcyhudWxsKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0UmVsYXRpb25zaGlwVGFyZ2V0SWRzKG51bGwpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRSZW5kaXRpb25JbmZvcyhudWxsKTsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0U3VwcG9ydHNEZXNjZW5kYW50cyhmYWxzZSk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldFN1cHBvcnRzRm9sZGVyVHJlZShmYWxzZSk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldFN1cHBvcnRzUG9saWNpZXMoZmFsc2UpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRTdXBwb3J0c1JlbGF0aW9uc2hpcHMoZmFsc2UpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRXb3JraW5nQ29weUlkKG51bGwpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRXb3JraW5nQ29weU9yaWdpbmFsSWQobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsZXQncyBkbyBpdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvcGVydGllc0ltcGwgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0KLSAgICAgICAgICAgIC8vIGlkCi0gICAgICAgICAgICBTdHJpbmcgaWQgPSBmaWxlVG9JZChmaWxlKTsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5SWQocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuT0JKRUNUX0lELCBpZCk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldElkKGlkKTsKLQotICAgICAgICAgICAgLy8gbmFtZQotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXROYW1lKG5hbWUpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGVkIGFuZCBtb2RpZmllZCBieQotICAgICAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSwgVVNFUl9VTktOT1dOKTsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlksIFVTRVJfVU5LTk9XTik7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldENyZWF0ZWRCeShVU0VSX1VOS05PV04pOwotCi0gICAgICAgICAgICAvLyBjcmVhdGlvbiBhbmQgbW9kaWZpY2F0aW9uIGRhdGUKLSAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGxhc3RNb2RpZmllZCA9IEZpbGVTaGFyZVV0aWxzLm1pbGxpc1RvQ2FsZW5kYXIoZmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eURhdGVUaW1lKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUsIGxhc3RNb2RpZmllZCk7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eURhdGVUaW1lKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUsIGxhc3RNb2RpZmllZCk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvLnNldENyZWF0aW9uRGF0ZShsYXN0TW9kaWZpZWQpOwotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRMYXN0TW9kaWZpY2F0aW9uRGF0ZShsYXN0TW9kaWZpZWQpOwotCi0gICAgICAgICAgICAvLyBjaGFuZ2UgdG9rZW4gLSBhbHdheXMgbnVsbAotICAgICAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOLCBudWxsKTsKLQotICAgICAgICAgICAgLy8gQ01JUyAxLjEgcHJvcGVydGllcwotICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkRFU0NSSVBUSU9OLCBudWxsKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlkTGlzdChyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZGlyZWN0b3J5IG9yIGZpbGUKLSAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBiYXNlIHR5cGUgYW5kIHR5cGUgbmFtZQotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5SWQocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lELCBCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5SWQocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRSZXBvc2l0b3J5UGF0aChmaWxlKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5QQVRILCBwYXRoKTsKLQotICAgICAgICAgICAgICAgIC8vIGZvbGRlciBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgaWYgKCFyb290LmVxdWFscyhmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlkKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLlBBUkVOVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm9vdC5lcXVhbHMoZmlsZS5nZXRQYXJlbnRGaWxlKCkpID8gUk9PVF9JRCA6IGZpbGVUb0lkKGZpbGUuZ2V0UGFyZW50RmlsZSgpKSkpOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLnNldEhhc1BhcmVudCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlkKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLlBBUkVOVF9JRCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8uc2V0SGFzUGFyZW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlkTGlzdChyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5BTExPV0VEX0NISUxEX09CSkVDVF9UWVBFX0lEUywgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGJhc2UgdHlwZSBhbmQgdHlwZSBuYW1lCi0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJZChyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlkKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaWxlIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUJvb2xlYW4ocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuSVNfSU1NVVRBQkxFLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlCb29sZWFuKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUJvb2xlYW4ocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuSVNfTUFKT1JfVkVSU0lPTiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlCb29sZWFuKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCBmaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJZChyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCwgZmlsZVRvSWQoZmlsZSkpOwotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5Qm9vbGVhbihyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0JZLCBudWxsKTsKLSAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5ULCAiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUJvb2xlYW4ocmVzdWx0LCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuSVNfUFJJVkFURV9XT1JLSU5HX0NPUFksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5QmlnSW50ZWdlcihyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9MRU5HVEgsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUsIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8uc2V0SGFzQ29udGVudChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8uc2V0Q29udGVudFR5cGUobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8uc2V0RmlsZU5hbWUobnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJbnRlZ2VyKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwgZmlsZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHJlc3VsdCwgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW1lVHlwZXMuZ2V0TUlNRVR5cGUoZmlsZSkpOwotICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUsIGZpbGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLnNldEhhc0NvbnRlbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8uc2V0Q29udGVudFR5cGUoTWltZVR5cGVzLmdldE1JTUVUeXBlKGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRGaWxlTmFtZShmaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJZChyZXN1bHQsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9JRCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlYWQgY3VzdG9tIHByb3BlcnRpZXMKLSAgICAgICAgICAgIHJlYWRDdXN0b21Qcm9wZXJ0aWVzKGZpbGUsIHJlc3VsdCwgZmlsdGVyLCBvYmplY3RJbmZvKTsKLQotICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnKCJVbmtub3duIGZpbHRlciBwcm9wZXJ0aWVzOiAiICsgZmlsdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gY2JlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjYmU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYW5kIGFkZHMgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVhZEN1c3RvbVByb3BlcnRpZXMoRmlsZSBmaWxlLCBQcm9wZXJ0aWVzSW1wbCBwcm9wZXJ0aWVzLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsCi0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvKSB7Ci0gICAgICAgIEZpbGUgcHJvcEZpbGUgPSBnZXRQcm9wZXJ0aWVzRmlsZShmaWxlKTsKLQotICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0cywgaWdub3JlIGl0Ci0gICAgICAgIGlmICghcHJvcEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnNlIGl0Ci0gICAgICAgIE9iamVjdERhdGEgb2JqID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcEZpbGUpLCA2NCAqIDEwMjQpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IFhNTFV0aWxzLmNyZWF0ZVBhcnNlcihzdHJlYW0pOwotICAgICAgICAgICAgWE1MVXRpbHMuZmluZE5leHRTdGFydEVsZW1lbmV0KHBhcnNlcik7Ci0gICAgICAgICAgICBvYmogPSBYTUxDb252ZXJ0ZXIuY29udmVydE9iamVjdChwYXJzZXIpOwotICAgICAgICAgICAgcGFyc2VyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cud2FybigiVW52YWxpZCBDTUlTIHByb3BlcnRpZXM6IHt9IiwgcHJvcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmouZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBpdCB0byBwcm9wZXJ0aWVzCi0gICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3AgOiBvYmouZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5TGlzdCgpKSB7Ci0gICAgICAgICAgICAvLyBvdmVyd3JpdGUgb2JqZWN0IGluZm8KLSAgICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlyc3RWYWx1ZVN0ciA9ICgoUHJvcGVydHlTdHJpbmcpIHByb3ApLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoUHJvcGVydHlJZHMuTkFNRS5lcXVhbHMocHJvcC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLnNldE5hbWUoZmlyc3RWYWx1ZVN0cik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRC5lcXVhbHMocHJvcC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLnNldFR5cGVJZChmaXJzdFZhbHVlU3RyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFByb3BlcnR5SWRzLkNSRUFURURfQlkuZXF1YWxzKHByb3AuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRDcmVhdGVkQnkoZmlyc3RWYWx1ZVN0cik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUuZXF1YWxzKHByb3AuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRDb250ZW50VHlwZShmaXJzdFZhbHVlU3RyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRS5lcXVhbHMocHJvcC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLnNldEZpbGVOYW1lKGZpcnN0VmFsdWVTdHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lKSB7Ci0gICAgICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZmlyc3RWYWx1ZUNhbCA9ICgoUHJvcGVydHlEYXRlVGltZSkgcHJvcCkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLmVxdWFscyhwcm9wLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8uc2V0Q3JlYXRpb25EYXRlKGZpcnN0VmFsdWVDYWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURS5lcXVhbHMocHJvcC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLnNldExhc3RNb2RpZmljYXRpb25EYXRlKGZpcnN0VmFsdWVDYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZmlsdGVyCi0gICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpbHRlci5jb250YWlucyhwcm9wLmdldFF1ZXJ5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWx0ZXIucmVtb3ZlKHByb3AuZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZG9uJ3Qgb3ZlcndyaXRlIGlkCi0gICAgICAgICAgICBpZiAoUHJvcGVydHlJZHMuT0JKRUNUX0lELmVxdWFscyhwcm9wLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBiYXNlIHR5cGUKLSAgICAgICAgICAgIGlmIChQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQuZXF1YWxzKHByb3AuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIGl0Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlcGxhY2VQcm9wZXJ0eShwcm9wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBhbmQgY29tcGlsZXMgYSBwcm9wZXJ0eSBzZXQgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBkaXNjLgotICAgICAqLwotICAgIHByaXZhdGUgUHJvcGVydGllc0ltcGwgY29tcGlsZVdyaXRlUHJvcGVydGllcyhTdHJpbmcgdHlwZUlkLCBTdHJpbmcgY3JlYXRvciwgU3RyaW5nIG1vZGlmaWVyLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgUHJvcGVydGllc0ltcGwgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IGFkZGVkUHJvcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIk5vIHByb3BlcnRpZXMhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHByb3BlcnR5IGRlZmluaXRpb25zCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSB0eXBlTWFuYWdlci5nZXRJbnRlcm5hbFR5cGVEZWZpbml0aW9uKHR5cGVJZCk7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlR5cGUgJyIgKyB0eXBlSWQgKyAiJyBpcyB1bmtub3duISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgYWxsIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIHRoZXJlCi0gICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3AgOiBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BUeXBlID0gdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KHByb3AuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIC8vIGRvIHdlIGtub3cgdGhhdCBwcm9wZXJ0eT8KLSAgICAgICAgICAgIGlmIChwcm9wVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIHByb3AuZ2V0SWQoKSArICInIGlzIHVua25vd24hIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNhbiBpdCBiZSBzZXQ/Ci0gICAgICAgICAgICBpZiAocHJvcFR5cGUuZ2V0VXBkYXRhYmlsaXR5KCkgPT0gVXBkYXRhYmlsaXR5LlJFQURPTkxZKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIHByb3AuZ2V0SWQoKSArICInIGlzIHJlYWRvbmx5ISIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBlbXB0eSBwcm9wZXJ0aWVzIGFyZSBpbnZhbGlkCi0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjawotICAgICAgICAgICAgLy8gaWYgKGlzRW1wdHlQcm9wZXJ0eShwcm9wKSkgewotICAgICAgICAgICAgLy8gdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIHByb3AuZ2V0SWQoKSArCi0gICAgICAgICAgICAvLyAiJyBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgICAgIC8vIH0KLQotICAgICAgICAgICAgLy8gYWRkIGl0Ci0gICAgICAgICAgICByZXN1bHQuYWRkUHJvcGVydHkocHJvcCk7Ci0gICAgICAgICAgICBhZGRlZFByb3BzLmFkZChwcm9wLmdldElkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgcmVxdWlyZWQgcHJvcGVydGllcyBhcmUgbWlzc2luZwotICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmIDogdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGlmICghYWRkZWRQcm9wcy5jb250YWlucyhwcm9wRGVmLmdldElkKCkpICYmIHByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkgIT0gVXBkYXRhYmlsaXR5LlJFQURPTkxZKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhZGRQcm9wZXJ0eURlZmF1bHQocmVzdWx0LCBwcm9wRGVmKSAmJiBwcm9wRGVmLmlzUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgcHJvcERlZi5nZXRJZCgpICsgIicgaXMgcmVxdWlyZWQhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkUHJvcGVydHlJZChyZXN1bHQsIHR5cGVJZCwgbnVsbCwgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHR5cGVJZCk7Ci0gICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHJlc3VsdCwgdHlwZUlkLCBudWxsLCBQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZLCBjcmVhdG9yKTsKLSAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcocmVzdWx0LCB0eXBlSWQsIG51bGwsIFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlksIG1vZGlmaWVyKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgcHJvcGVydGllcyBmb3IgYSBkb2N1bWVudCBvciBmb2xkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUHJvcGVydGllc0ZpbGUoRmlsZSBmaWxlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgRmlsZSBwcm9wRmlsZSA9IGdldFByb3BlcnRpZXNGaWxlKGZpbGUpOwotCi0gICAgICAgIC8vIGlmIG5vIHByb3BlcnRpZXMgc2V0IGRlbGV0ZSB0aGUgcHJvcGVydGllcyBmaWxlCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcHJvcEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgb2JqZWN0Ci0gICAgICAgIE9iamVjdERhdGFJbXBsIG9iamVjdCA9IG5ldyBPYmplY3REYXRhSW1wbCgpOwotICAgICAgICBvYmplY3Quc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICBPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wRmlsZSkpOwotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTFV0aWxzLmNyZWF0ZVdyaXRlcihzdHJlYW0pOwotICAgICAgICAgICAgWE1MVXRpbHMuc3RhcnRYbWxEb2N1bWVudCh3cml0ZXIpOwotICAgICAgICAgICAgWE1MQ29udmVydGVyLndyaXRlT2JqZWN0KHdyaXRlciwgQ21pc1ZlcnNpb24uQ01JU18xXzEsIHRydWUsICJvYmplY3QiLCBYTUxDb25zdGFudHMuTkFNRVNQQUNFX0NNSVMsIG9iamVjdCk7Ci0gICAgICAgICAgICBYTUxVdGlscy5lbmRYbWxEb2N1bWVudCh3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24oIkNvdWxkbid0IHN0b3JlIHByb3BlcnRpZXMhIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlQcm9wZXJ0eShQcm9wZXJ0eURhdGE8Pz4gcHJvcCkgewotICAgICAgICBpZiAocHJvcCA9PSBudWxsIHx8IHByb3AuZ2V0VmFsdWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcC5nZXRWYWx1ZXMoKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5SWQoUHJvcGVydGllc0ltcGwgcHJvcHMsIFN0cmluZyB0eXBlSWQsIFNldDxTdHJpbmc+IGZpbHRlciwgU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFjaGVja0FkZFByb3BlcnR5KHByb3BzLCB0eXBlSWQsIGZpbHRlciwgaWQpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlJZEltcGwoaWQsIHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5SWRMaXN0KFByb3BlcnRpZXNJbXBsIHByb3BzLCBTdHJpbmcgdHlwZUlkLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSkgewotICAgICAgICBpZiAoIWNoZWNrQWRkUHJvcGVydHkocHJvcHMsIHR5cGVJZCwgZmlsdGVyLCBpZCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eUlkSW1wbChpZCwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlTdHJpbmcoUHJvcGVydGllc0ltcGwgcHJvcHMsIFN0cmluZyB0eXBlSWQsIFNldDxTdHJpbmc+IGZpbHRlciwgU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFjaGVja0FkZFByb3BlcnR5KHByb3BzLCB0eXBlSWQsIGZpbHRlciwgaWQpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlTdHJpbmdJbXBsKGlkLCB2YWx1ZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eUludGVnZXIoUHJvcGVydGllc0ltcGwgcHJvcHMsIFN0cmluZyB0eXBlSWQsIFNldDxTdHJpbmc+IGZpbHRlciwgU3RyaW5nIGlkLCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIGFkZFByb3BlcnR5QmlnSW50ZWdlcihwcm9wcywgdHlwZUlkLCBmaWx0ZXIsIGlkLCBCaWdJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlCaWdJbnRlZ2VyKFByb3BlcnRpZXNJbXBsIHByb3BzLCBTdHJpbmcgdHlwZUlkLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFjaGVja0FkZFByb3BlcnR5KHByb3BzLCB0eXBlSWQsIGZpbHRlciwgaWQpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlJbnRlZ2VySW1wbChpZCwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlCb29sZWFuKFByb3BlcnRpZXNJbXBsIHByb3BzLCBTdHJpbmcgdHlwZUlkLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBpZiAoIWNoZWNrQWRkUHJvcGVydHkocHJvcHMsIHR5cGVJZCwgZmlsdGVyLCBpZCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eUJvb2xlYW5JbXBsKGlkLCB2YWx1ZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eURhdGVUaW1lKFByb3BlcnRpZXNJbXBsIHByb3BzLCBTdHJpbmcgdHlwZUlkLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgIGlmICghY2hlY2tBZGRQcm9wZXJ0eShwcm9wcywgdHlwZUlkLCBmaWx0ZXIsIGlkKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcHMuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKGlkLCB2YWx1ZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0FkZFByb3BlcnR5KFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHR5cGVJZCwgU2V0PFN0cmluZz4gZmlsdGVyLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWQgbXVzdCBub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSB0eXBlTWFuYWdlci5nZXRJbnRlcm5hbFR5cGVEZWZpbml0aW9uKHR5cGVJZCk7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZTogIiArIHR5cGVJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5jb250YWluc0tleShpZCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHk6ICIgKyBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcXVlcnlOYW1lID0gdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KGlkKS5nZXRRdWVyeU5hbWUoKTsKLQotICAgICAgICBpZiAocXVlcnlOYW1lICE9IG51bGwgJiYgZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghZmlsdGVyLmNvbnRhaW5zKHF1ZXJ5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbHRlci5yZW1vdmUocXVlcnlOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcHJvcGVydHkgaWYgZGVmaW5lZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIGJvb2xlYW4gYWRkUHJvcGVydHlEZWZhdWx0KFByb3BlcnRpZXNJbXBsIHByb3BzLCBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZikgewotICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCB8fCBwcm9wcy5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvcHMgbXVzdCBub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Pz4gZGVmYXVsdFZhbHVlID0gcHJvcERlZi5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmICFkZWZhdWx0VmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlCb29sZWFuSW1wbChwcm9wRGVmLmdldElkKCksIChMaXN0PEJvb2xlYW4+KSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICAgICAgcHJvcHMuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKHByb3BEZWYuZ2V0SWQoKSwgKExpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+KSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlEZWNpbWFsSW1wbChwcm9wRGVmLmdldElkKCksIChMaXN0PEJpZ0RlY2ltYWw+KSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSFRNTDoKLSAgICAgICAgICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlIdG1sSW1wbChwcm9wRGVmLmdldElkKCksIChMaXN0PFN0cmluZz4pIGRlZmF1bHRWYWx1ZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJRDoKLSAgICAgICAgICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlJZEltcGwocHJvcERlZi5nZXRJZCgpLCAoTGlzdDxTdHJpbmc+KSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlJbnRlZ2VySW1wbChwcm9wRGVmLmdldElkKCksIChMaXN0PEJpZ0ludGVnZXI+KSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgICAgIHByb3BzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwocHJvcERlZi5nZXRJZCgpLCAoTGlzdDxTdHJpbmc+KSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgICAgIHByb3BzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eVVyaUltcGwocHJvcERlZi5nZXRJZCgpLCAoTGlzdDxTdHJpbmc+KSBkZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlcyB0aGUgYWxsb3dhYmxlIGFjdGlvbnMgZm9yIGEgZmlsZSBvciBmb2xkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBbGxvd2FibGVBY3Rpb25zIGNvbXBpbGVBbGxvd2FibGVBY3Rpb25zKEZpbGUgZmlsZSwgYm9vbGVhbiB1c2VyUmVhZE9ubHkpIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsZSBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UgY2FuJ3QgZ2F0aGVyIGFsbG93YWJsZSBhY3Rpb25zIGlmIHRoZSBmaWxlIG9yIGZvbGRlciBkb2Vzbid0IGV4aXN0Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiT2JqZWN0IG5vdCBmb3VuZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNSZWFkT25seSA9ICFmaWxlLmNhbldyaXRlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNGb2xkZXIgPSBmaWxlLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIGJvb2xlYW4gaXNSb290ID0gcm9vdC5lcXVhbHMoZmlsZSk7Ci0KLSAgICAgICAgU2V0PEFjdGlvbj4gYWFzID0gRW51bVNldC5ub25lT2YoQWN0aW9uLmNsYXNzKTsKLQotICAgICAgICBhZGRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0dFVF9PQkpFQ1RfUEFSRU5UUywgIWlzUm9vdCk7Ci0gICAgICAgIGFkZEFjdGlvbihhYXMsIEFjdGlvbi5DQU5fR0VUX1BST1BFUlRJRVMsIHRydWUpOwotICAgICAgICBhZGRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX1VQREFURV9QUk9QRVJUSUVTLCAhdXNlclJlYWRPbmx5ICYmICFpc1JlYWRPbmx5KTsKLSAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9NT1ZFX09CSkVDVCwgIXVzZXJSZWFkT25seSAmJiAhaXNSb290KTsKLSAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9ERUxFVEVfT0JKRUNULCAhdXNlclJlYWRPbmx5ICYmICFpc1JlYWRPbmx5ICYmICFpc1Jvb3QpOwotICAgICAgICBhZGRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0dFVF9BQ0wsIHRydWUpOwotCi0gICAgICAgIGlmIChpc0ZvbGRlcikgewotICAgICAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9HRVRfREVTQ0VOREFOVFMsIHRydWUpOwotICAgICAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9HRVRfQ0hJTERSRU4sIHRydWUpOwotICAgICAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9HRVRfRk9MREVSX1BBUkVOVCwgIWlzUm9vdCk7Ci0gICAgICAgICAgICBhZGRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0dFVF9GT0xERVJfVFJFRSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhZGRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0NSRUFURV9ET0NVTUVOVCwgIXVzZXJSZWFkT25seSk7Ci0gICAgICAgICAgICBhZGRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0NSRUFURV9GT0xERVIsICF1c2VyUmVhZE9ubHkpOwotICAgICAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9ERUxFVEVfVFJFRSwgIXVzZXJSZWFkT25seSAmJiAhaXNSZWFkT25seSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0dFVF9DT05URU5UX1NUUkVBTSwgZmlsZS5sZW5ndGgoKSA+IDApOwotICAgICAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9TRVRfQ09OVEVOVF9TVFJFQU0sICF1c2VyUmVhZE9ubHkgJiYgIWlzUmVhZE9ubHkpOwotICAgICAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0sICF1c2VyUmVhZE9ubHkgJiYgIWlzUmVhZE9ubHkpOwotICAgICAgICAgICAgYWRkQWN0aW9uKGFhcywgQWN0aW9uLkNBTl9HRVRfQUxMX1ZFUlNJT05TLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFsbG93YWJsZUFjdGlvbnNJbXBsIHJlc3VsdCA9IG5ldyBBbGxvd2FibGVBY3Rpb25zSW1wbCgpOwotICAgICAgICByZXN1bHQuc2V0QWxsb3dhYmxlQWN0aW9ucyhhYXMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEFjdGlvbihTZXQ8QWN0aW9uPiBhYXMsIEFjdGlvbiBhY3Rpb24sIGJvb2xlYW4gY29uZGl0aW9uKSB7Ci0gICAgICAgIGlmIChjb25kaXRpb24pIHsKLSAgICAgICAgICAgIGFhcy5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGVzIHRoZSBBQ0wgZm9yIGEgZmlsZSBvciBmb2xkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBY2wgY29tcGlsZUFjbChGaWxlIGZpbGUpIHsKLSAgICAgICAgQWNjZXNzQ29udHJvbExpc3RJbXBsIHJlc3VsdCA9IG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoKTsKLSAgICAgICAgcmVzdWx0LnNldEFjZXMobmV3IEFycmF5TGlzdDxBY2U+KCkpOwotCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQm9vbGVhbj4gdWUgOiByZWFkV3JpdGVVc2VyTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBwcmluY2lwYWwKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbCBwcmluY2lwYWwgPSBuZXcgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsKHVlLmdldEtleSgpKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIEFDRQotICAgICAgICAgICAgQWNjZXNzQ29udHJvbEVudHJ5SW1wbCBlbnRyeSA9IG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKCk7Ci0gICAgICAgICAgICBlbnRyeS5zZXRQcmluY2lwYWwocHJpbmNpcGFsKTsKLSAgICAgICAgICAgIGVudHJ5LnNldFBlcm1pc3Npb25zKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLSAgICAgICAgICAgIGVudHJ5LmdldFBlcm1pc3Npb25zKCkuYWRkKEJhc2ljUGVybWlzc2lvbnMuUkVBRCk7Ci0gICAgICAgICAgICBpZiAoIXVlLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCkgJiYgZmlsZS5jYW5Xcml0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkuZ2V0UGVybWlzc2lvbnMoKS5hZGQoQmFzaWNQZXJtaXNzaW9ucy5XUklURSk7Ci0gICAgICAgICAgICAgICAgZW50cnkuZ2V0UGVybWlzc2lvbnMoKS5hZGQoQmFzaWNQZXJtaXNzaW9ucy5BTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbnRyeS5zZXREaXJlY3QodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBBQ0UKLSAgICAgICAgICAgIHJlc3VsdC5nZXRBY2VzKCkuYWRkKGVudHJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGZvciBhIGZpbGUgc3lzdGVtLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSB0byBjaGVjawotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5hbWUgaXMgdmFsaWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IG5hbWUuaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpICE9IC0xCi0gICAgICAgICAgICAgICAgfHwgbmFtZS5pbmRleE9mKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgYSBmb2xkZXIgaXMgZW1wdHkuIEEgZm9sZGVyIGlzIGNvbnNpZGVyZWQgYXMgZW1wdHkgaWYgbm8gZmlsZXMKLSAgICAgKiBvciBvbmx5IHRoZSBzaGFkb3cgZmlsZSByZXNpZGUgaW4gdGhlIGZvbGRlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9sZGVyCi0gICAgICogICAgICAgICAgICB0aGUgZm9sZGVyCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZm9sZGVyIGlzIGVtcHR5LgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZvbGRlckVtcHR5KEZpbGUgZm9sZGVyKSB7Ci0gICAgICAgIGlmICghZm9sZGVyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gZmlsZU5hbWVzID0gZm9sZGVyLmxpc3QoKTsKLQotICAgICAgICBpZiAoZmlsZU5hbWVzID09IG51bGwgfHwgZmlsZU5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWxlTmFtZXMubGVuZ3RoID09IDEgJiYgZmlsZU5hbWVzWzBdLmVxdWFscyhTSEFET1dfRk9MREVSKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSB1c2VyIGluIHRoZSBnaXZlbiBjb250ZXh0IGlzIHZhbGlkIGZvciB0aGlzIHJlcG9zaXRvcnkgYW5kCi0gICAgICogaWYgdGhlIHVzZXIgaGFzIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tVc2VyKENhbGxDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gd3JpdGVSZXF1aXJlZCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oIk5vIHVzZXIgY29udGV4dCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJvb2xlYW4gcmVhZE9ubHkgPSByZWFkV3JpdGVVc2VyTWFwLmdldChjb250ZXh0LmdldFVzZXJuYW1lKCkpOwotICAgICAgICBpZiAocmVhZE9ubHkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKCJVbmtub3duIHVzZXIhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVhZE9ubHkuYm9vbGVhblZhbHVlKCkgJiYgd3JpdGVSZXF1aXJlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKCJObyB3cml0ZSBwZXJtaXNzaW9uISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlYWRPbmx5LmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByb3BlcnRpZXMgZmlsZSBvZiB0aGUgZ2l2ZW4gZmlsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2V0UHJvcGVydGllc0ZpbGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShmaWxlLCBTSEFET1dfRk9MREVSKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpICsgU0hBRE9XX0VYVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRmlsZSBvYmplY3QgYnkgaWQgb3IgdGhyb3dzIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2V0RmlsZShTdHJpbmcgaWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBpZFRvRmlsZShpZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIGlkIHRvIGEgRmlsZSBvYmplY3QuIEEgc2ltcGxlIGFuZCBpbnNlY3VyZSBpbXBsZW1lbnRhdGlvbiwKLSAgICAgKiBidXQgZ29vZCBlbm91Z2ggZm9yIG5vdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgaWRUb0ZpbGUoU3RyaW5nIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSWQgaXMgbm90IHZhbGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlkLmVxdWFscyhST09UX0lEKSkgewotICAgICAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEZpbGUocm9vdCwgKG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZShpZC5nZXRCeXRlcygiVVMtQVNDSUkiKSksICJVVEYtOCIpKS5yZXBsYWNlKCcvJywKLSAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBpZCBvZiBhIEZpbGUgb2JqZWN0IG9yIHRocm93cyBhbiBhcHByb3ByaWF0ZSBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SWQoRmlsZSBmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZVRvSWQoZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEZpbGUgb2JqZWN0IGZyb20gYW4gaWQuIEEgc2ltcGxlIGFuZCBpbnNlY3VyZSBpbXBsZW1lbnRhdGlvbiwKLSAgICAgKiBidXQgZ29vZCBlbm91Z2ggZm9yIG5vdy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaWxlVG9JZChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgaXMgbm90IHZhbGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJvb3QuZXF1YWxzKGZpbGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUk9PVF9JRDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVwb3NpdG9yeVBhdGgoZmlsZSk7Ci0KLSAgICAgICAgcmV0dXJuIEJhc2U2NC5lbmNvZGVCeXRlcyhwYXRoLmdldEJ5dGVzKCJVVEYtOCIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZXBvc2l0b3J5UGF0aChGaWxlIGZpbGUpIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhyb290LmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLSAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcGF0aCA9ICIvIjsKLSAgICAgICAgfSBlbHNlIGlmIChwYXRoLmNoYXJBdCgwKSAhPSAnLycpIHsKLSAgICAgICAgICAgIHBhdGggPSAiLyIgKyBwYXRoOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCI8e30+IHt9IiwgcmVwb3NpdG9yeUlkLCBtc2cpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVSZXBvc2l0b3J5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJmNjFjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlUmVwb3NpdG9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maWxlc2hhcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBNYW5hZ2VzIGFsbCByZXBvc2l0b3JpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU2hhcmVSZXBvc2l0b3J5TWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEZpbGVTaGFyZVJlcG9zaXRvcnk+IHJlcG9zaXRvcmllczsKLQotICAgIHB1YmxpYyBGaWxlU2hhcmVSZXBvc2l0b3J5TWFuYWdlcigpIHsKLSAgICAgICAgcmVwb3NpdG9yaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWxlU2hhcmVSZXBvc2l0b3J5PigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZXBvc2l0b3J5IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KEZpbGVTaGFyZVJlcG9zaXRvcnkgZnNyKSB7Ci0gICAgICAgIGlmIChmc3IgPT0gbnVsbCB8fCBmc3IuZ2V0UmVwb3NpdG9yeUlkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVwb3NpdG9yaWVzLnB1dChmc3IuZ2V0UmVwb3NpdG9yeUlkKCksIGZzcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHJlcG9zaXRvcnkgb2JqZWN0IGJ5IGlkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlU2hhcmVSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBGaWxlU2hhcmVSZXBvc2l0b3J5IHJlc3VsdCA9IHJlcG9zaXRvcmllcy5nZXQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkgJyIgKyByZXBvc2l0b3J5SWQgKyAiJyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgcmVwb3NpdG9yeSBvYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uPEZpbGVTaGFyZVJlcG9zaXRvcnk+IGdldFJlcG9zaXRvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcmllcy52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKEZpbGVTaGFyZVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA6IHJlcG9zaXRvcmllcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5SWQoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiAtPiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChyZXBvc2l0b3J5LmdldFJvb3REaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlVHlwZU1hbmFnZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlVHlwZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczYmFhMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZmlsZXNoYXJlL0ZpbGVTaGFyZVR5cGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpbGVzaGFyZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5UeXBlRGVmaW5pdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSB0eXBlIGRlZmluaXRpb25zIGZvciBhbGwgRmlsZVNoYXJlIHJlcG9zaXRvcmllcy4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVTaGFyZVR5cGVNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaWxlU2hhcmVUeXBlTWFuYWdlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9vcGVuY21pcy9maWxlc2hhcmUiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdHlwZURlZmluaXRpb25GYWN0b3J5OwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVHlwZURlZmluaXRpb24+IHR5cGVEZWZpbml0aW9uczsKLQotICAgIHB1YmxpYyBGaWxlU2hhcmVUeXBlTWFuYWdlcigpIHsKLSAgICAgICAgLy8gc2V0IHVwIFR5cGVEZWZpbml0aW9uRmFjdG9yeQotICAgICAgICB0eXBlRGVmaW5pdGlvbkZhY3RvcnkgPSBUeXBlRGVmaW5pdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgdHlwZURlZmluaXRpb25GYWN0b3J5LnNldERlZmF1bHROYW1lc3BhY2UoTkFNRVNQQUNFKTsKLSAgICAgICAgdHlwZURlZmluaXRpb25GYWN0b3J5LnNldERlZmF1bHRDb250cm9sbGFibGVBY2woZmFsc2UpOwotICAgICAgICB0eXBlRGVmaW5pdGlvbkZhY3Rvcnkuc2V0RGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeShmYWxzZSk7Ci0gICAgICAgIHR5cGVEZWZpbml0aW9uRmFjdG9yeS5zZXREZWZhdWx0UXVlcnlhYmxlKGZhbHNlKTsKLSAgICAgICAgdHlwZURlZmluaXRpb25GYWN0b3J5LnNldERlZmF1bHRGdWxsdGV4dEluZGV4ZWQoZmFsc2UpOwotICAgICAgICB0eXBlRGVmaW5pdGlvbkZhY3Rvcnkuc2V0RGVmYXVsdFR5cGVNdXRhYmlsaXR5KHR5cGVEZWZpbml0aW9uRmFjdG9yeS5jcmVhdGVUeXBlTXV0YWJpbGl0eShmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIGRlZmluaXRpb25zIG1hcAotICAgICAgICB0eXBlRGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgIC8vIGFkZCBiYXNlIGZvbGRlciB0eXBlCi0gICAgICAgIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBmb2xkZXJUeXBlID0gdHlwZURlZmluaXRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUJhc2VGb2xkZXJUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbi5DTUlTXzFfMSk7Ci0gICAgICAgIHJlbW92ZVF1ZXJ5YWJsZUFuZE9yZGVyYWJsZUZsYWdzKGZvbGRlclR5cGUpOwotICAgICAgICB0eXBlRGVmaW5pdGlvbnMucHV0KGZvbGRlclR5cGUuZ2V0SWQoKSwgZm9sZGVyVHlwZSk7Ci0KLSAgICAgICAgLy8gYWRkIGJhc2UgZG9jdW1lbnQgdHlwZQotICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2N1bWVudFR5cGUgPSB0eXBlRGVmaW5pdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQmFzZURvY3VtZW50VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEpOwotICAgICAgICByZW1vdmVRdWVyeWFibGVBbmRPcmRlcmFibGVGbGFncyhkb2N1bWVudFR5cGUpOwotICAgICAgICB0eXBlRGVmaW5pdGlvbnMucHV0KGRvY3VtZW50VHlwZS5nZXRJZCgpLCBkb2N1bWVudFR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlLmdldElkKCkgPT0gbnVsbCB8fCB0eXBlLmdldElkKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgbXVzdCBoYXZlIGEgdmFsaWQgaWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZS5nZXRQYXJlbnRUeXBlSWQoKSA9PSBudWxsIHx8IHR5cGUuZ2V0UGFyZW50VHlwZUlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgbXVzdCBoYXZlIGEgdmFsaWQgcGFyZW50IGlkISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gcGFyZW50VHlwZSA9IHR5cGVEZWZpbml0aW9ucy5nZXQodHlwZS5nZXRQYXJlbnRUeXBlSWQoKSk7Ci0gICAgICAgIGlmIChwYXJlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmVudCB0eXBlIGRvZXNuJ3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gbmV3VHlwZSA9IHR5cGVEZWZpbml0aW9uRmFjdG9yeS5jb3B5KHR5cGUsIHRydWUpOwotCi0gICAgICAgIC8vIGNvcHkgcGFyZW50IHR5cGUgcHJvcGVydHkgZGVmaW5pdGlvbnMgYW5kIG1hcmsgdGhlbSBhcyBpbmhlcml0ZWQKLSAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA6IHBhcmVudFR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPD8+IGJhc2VQcm9wRGVmID0gdHlwZURlZmluaXRpb25GYWN0b3J5LmNvcHkocHJvcERlZik7Ci0gICAgICAgICAgICBiYXNlUHJvcERlZi5zZXRJc0luaGVyaXRlZCh0cnVlKTsKLSAgICAgICAgICAgIG5ld1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGJhc2VQcm9wRGVmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGVEZWZpbml0aW9ucy5wdXQobmV3VHlwZS5nZXRJZCgpLCBuZXdUeXBlKTsKLQotICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQWRkZWQgdHlwZSAne30nLiIsIHR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBxdWVyeWFibGUgYW5kIG9yZGVyYWJsZSBmbGFncyBmcm9tIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucwotICAgICAqIG9mIGEgdHlwZSBkZWZpbml0aW9uIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbnMgZG9lcyBuZWl0aGVyIHN1cHBvcnQKLSAgICAgKiBxdWVyaWVzIG5vciBjYW4gb3JkZXIgb2JqZWN0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUXVlcnlhYmxlQW5kT3JkZXJhYmxlRmxhZ3MoTXV0YWJsZVR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA6IHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPD8+IG11dGFibGVQcm9wRGVmID0gKE11dGFibGVQcm9wZXJ0eURlZmluaXRpb248Pz4pIHByb3BEZWY7Ci0gICAgICAgICAgICBtdXRhYmxlUHJvcERlZi5zZXRJc1F1ZXJ5YWJsZShmYWxzZSk7Ci0gICAgICAgICAgICBtdXRhYmxlUHJvcERlZi5zZXRJc09yZGVyYWJsZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkVHlwZURlZmluaXRpb25Gcm9tRmlsZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgbG9hZFR5cGVEZWZpbml0aW9uRnJvbVN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKSwgNjQgKiAxMDI0KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZFR5cGVEZWZpbml0aW9uRnJvbVJlc291cmNlKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvYWRUeXBlRGVmaW5pdGlvbkZyb21TdHJlYW0odGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRUeXBlRGVmaW5pdGlvbkZyb21TdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gbnVsbDsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBhcnNlciA9IFhNTFV0aWxzLmNyZWF0ZVBhcnNlcihzdHJlYW0pOwotICAgICAgICAgICAgaWYgKCFYTUxVdGlscy5maW5kTmV4dFN0YXJ0RWxlbWVuZXQocGFyc2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHlwZSA9IFhNTENvbnZlcnRlci5jb252ZXJ0VHlwZURlZmluaXRpb24ocGFyc2VyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcnNlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZFR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGludGVybmFsIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFR5cGVEZWZpbml0aW9uIGdldEludGVybmFsVHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCkgewotICAgICAgICByZXR1cm4gdHlwZURlZmluaXRpb25zLmdldCh0eXBlSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIGludGVybmFsIHR5cGUgZGVmaW5pdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFR5cGVEZWZpbml0aW9uPiBnZXRJbnRlcm5hbFR5cGVEZWZpbml0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVEZWZpbml0aW9ucy52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gc2VydmljZSBtZXRob2RzIC0tLQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHR5cGVEZWZpbml0aW9ucy5nZXQodHlwZUlkKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVHlwZSAnIiArIHR5cGVJZCArICInIGlzIHVua25vd24hIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZURlZmluaXRpb25GYWN0b3J5LmNvcHkodHlwZSwgdHJ1ZSwgY29udGV4dC5nZXRDbWlzVmVyc2lvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGdldFR5cGVDaGlsZHJlbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdHlwZUlkLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVEZWZpbml0aW9uRmFjdG9yeS5jcmVhdGVUeXBlRGVmaW5pdGlvbkxpc3QodHlwZURlZmluaXRpb25zLCB0eXBlSWQsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgICAgIG1heEl0ZW1zLCBza2lwQ291bnQsIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucykgewotICAgICAgICByZXR1cm4gdHlwZURlZmluaXRpb25GYWN0b3J5LmNyZWF0ZVR5cGVEZXNjZW5kYW50cyh0eXBlRGVmaW5pdGlvbnMsIHR5cGVJZCwgZGVwdGgsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0eXBlIDogdHlwZURlZmluaXRpb25zLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ1snKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh0eXBlLmdldElkKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIgKCIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHR5cGUuZ2V0QmFzZVR5cGVJZCgpLnZhbHVlKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIpXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVVc2VyTWFuYWdlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVVc2VyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzk2ZGQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlVXNlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZmlsZXNoYXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIHVzZXJzIGZvciB0aGUgRmlsZVNoYXJlIHJlcG9zaXRvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU2hhcmVVc2VyTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9naW5zOwotCi0gICAgcHVibGljIEZpbGVTaGFyZVVzZXJNYW5hZ2VyKCkgewotICAgICAgICBsb2dpbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFsbCBsb2dpbnMuCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0TG9naW5zKCkgewotICAgICAgICByZXR1cm4gbG9naW5zLmtleVNldCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBsb2dpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTG9naW4oU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgcGFzc3dvcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9naW5zLnB1dCh1c2VybmFtZS50cmltKCksIHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyB1c2VyIGFuZCBwYXNzd29yZCBmcm9tIHRoZSBDYWxsQ29udGV4dCBhbmQgY2hlY2tzIHRoZW0uCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgYXV0aGVudGljYXRlKENhbGxDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gdHJ5IHRvIGdldCB0aGUgcmVtb3RlIHVzZXIgZmlyc3QKLSAgICAgICAgLy8gSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KQotICAgICAgICAvLyBjb250ZXh0LmdldChDYWxsQ29udGV4dC5IVFRQX1NFUlZMRVRfUkVRVUVTVCk7Ci0gICAgICAgIC8vIGlmIChyZXF1ZXN0ICE9IG51bGwgJiYgcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCkgIT0gbnVsbCkgewotICAgICAgICAvLyByZXR1cm4gcmVxdWVzdC5nZXRSZW1vdGVVc2VyKCk7Ci0gICAgICAgIC8vIH0KLQotICAgICAgICAvLyBjaGVjayB1c2VyIGFuZCBwYXNzd29yZAotICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZShjb250ZXh0LmdldFVzZXJuYW1lKCksIGNvbnRleHQuZ2V0UGFzc3dvcmQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbigiSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0aGVudGljYXRlcyBhIHVzZXIgYWdhaW5zdCB0aGUgY29uZmlndXJlZCBsb2dpbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgU3RyaW5nIHB3ZCA9IGxvZ2lucy5nZXQodXNlcm5hbWUpOwotICAgICAgICBpZiAocHdkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwd2QuZXF1YWxzKHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBmb3IgKFN0cmluZyB1c2VyIDogbG9naW5zLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ1snKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh1c2VyKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXScpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVVdGlscy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpbGVzaGFyZS9GaWxlU2hhcmVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTYzYWY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maWxlc2hhcmUvRmlsZVNoYXJlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZmlsZXNoYXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGVUaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVN0cmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVTaGFyZVV0aWxzIHsKLQotICAgIHByaXZhdGUgRmlsZVNoYXJlVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZ2l2ZW4gdmFsdWUgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlCi0gICAgICogZ2l2ZW4gdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW5QYXJhbWV0ZXIoQm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiBkZWYpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWY7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgbWlsbGlzZWNvbmRzIGludG8gYSB7QGxpbmsgR3JlZ29yaWFuQ2FsZW5kYXJ9IG9iamVjdCwgc2V0dGluZwotICAgICAqIHRoZSB0aW1lem9uZSB0byBHTVQgYW5kIGN1dHRpbmcgbWlsbGlzZWNvbmRzIG9mZi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEdyZWdvcmlhbkNhbGVuZGFyIG1pbGxpc1RvQ2FsZW5kYXIobG9uZyBtaWxsaXMpIHsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgcmVzdWx0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgIHJlc3VsdC5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICByZXN1bHQuc2V0VGltZUluTWlsbGlzKChsb25nKSAoTWF0aC5jZWlsKChkb3VibGUpIG1pbGxpcyAvIDEwMDApICogMTAwMCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BsaXRzIGEgZmlsdGVyIHN0YXRlbWVudCBpbnRvIGEgY29sbGVjdGlvbiBvZiBwcm9wZXJ0aWVzLiBJZgotICAgICAqIDxjb2RlPmZpbHRlcjwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5IG9yIG9uZSBvZiB0aGUgcHJvcGVydGllcwotICAgICAqIGlzICcqJyAsIGFuIGVtcHR5IGNvbGxlY3Rpb24gd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IHNwbGl0RmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLSAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWx0ZXIudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogZmlsdGVyLnNwbGl0KCIsIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChzLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBhIGZldyBiYXNlIHByb3BlcnRpZXMKLSAgICAgICAgLy8gcXVlcnkgbmFtZSA9PSBpZCAoZm9yIGJhc2UgdHlwZSBwcm9wZXJ0aWVzKQotICAgICAgICByZXN1bHQuYWRkKFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgIHJlc3VsdC5hZGQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICByZXN1bHQuYWRkKFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIGlkIGZyb20gYSBzZXQgb2YgcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPYmplY3RUeXBlSWQoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiB0eXBlUHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICBpZiAoISh0eXBlUHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgSWQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gKChQcm9wZXJ0eUlkKSB0eXBlUHJvcGVydHkpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgaWYgKHR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBJZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgdmFsdWUgb2YgYW4gaWQgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SWRQcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChuYW1lKTsKLSAgICAgICAgaWYgKCEocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKChQcm9wZXJ0eUlkKSBwcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHZhbHVlIG9mIGEgc3RyaW5nIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ1Byb3BlcnR5KFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5ID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KG5hbWUpOwotICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKChQcm9wZXJ0eVN0cmluZykgcHJvcGVydHkpLmdldEZpcnN0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB2YWx1ZSBvZiBhIGRhdGV0aW1lIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RGF0ZVRpbWVQcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChuYW1lKTsKLSAgICAgICAgaWYgKCEocHJvcGVydHkgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKChQcm9wZXJ0eURhdGVUaW1lKSBwcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGUtdHlwZS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3Jlc291cmNlcy9leGFtcGxlLXR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGNjMGFkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vcmVzb3VyY2VzL2V4YW1wbGUtdHlwZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gCi0tLT4KLTxjbWlzcmE6dHlwZSB4bWxuczpjbWlzcmE9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4LyIKLQl4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLQl4c2k6dHlwZT0iY21pczpjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotCTxjbWlzOmlkPm15VGVzdERvY3VtZW50VHlwZTwvY21pczppZD4KLQk8Y21pczpsb2NhbE5hbWU+bXlUZXN0RG9jdW1lbnRUeXBlPC9jbWlzOmxvY2FsTmFtZT4KLQk8Y21pczpsb2NhbE5hbWVzcGFjZT5odHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmcvb3BlbmNtaXMvZGVtby88L2NtaXM6bG9jYWxOYW1lc3BhY2U+Ci0JPGNtaXM6cGFyZW50SWQ+Y21pczpkb2N1bWVudDwvY21pczpwYXJlbnRJZD4KLQk8Y21pczpkaXNwbGF5TmFtZT5NeSBUZXN0IERvY3VtZW50IFR5cGU8L2NtaXM6ZGlzcGxheU5hbWU+Ci0JPGNtaXM6cXVlcnlOYW1lPlRFU1RET0NUWVBFPC9jbWlzOnF1ZXJ5TmFtZT4KLQk8Y21pczpkZXNjcmlwdGlvbj5NeSBUZXN0IERvY3VtZW50IFR5cGU8L2NtaXM6ZGVzY3JpcHRpb24+Ci0JPGNtaXM6YmFzZUlkPmNtaXM6ZG9jdW1lbnQ8L2NtaXM6YmFzZUlkPgotCTxjbWlzOmNyZWF0YWJsZT50cnVlPC9jbWlzOmNyZWF0YWJsZT4KLQk8Y21pczpmaWxlYWJsZT50cnVlPC9jbWlzOmZpbGVhYmxlPgotCTxjbWlzOnF1ZXJ5YWJsZT5mYWxzZTwvY21pczpxdWVyeWFibGU+Ci0JPGNtaXM6ZnVsbHRleHRJbmRleGVkPmZhbHNlPC9jbWlzOmZ1bGx0ZXh0SW5kZXhlZD4KLQk8Y21pczppbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+dHJ1ZTwvY21pczppbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+Ci0JPGNtaXM6Y29udHJvbGxhYmxlUG9saWN5PmZhbHNlPC9jbWlzOmNvbnRyb2xsYWJsZVBvbGljeT4KLQk8Y21pczpjb250cm9sbGFibGVBQ0w+ZmFsc2U8L2NtaXM6Y29udHJvbGxhYmxlQUNMPgotCTxjbWlzOnZlcnNpb25hYmxlPmZhbHNlPC9jbWlzOnZlcnNpb25hYmxlPgotCTxjbWlzOmNvbnRlbnRTdHJlYW1BbGxvd2VkPnJlcXVpcmVkPC9jbWlzOmNvbnRlbnRTdHJlYW1BbGxvd2VkPgotCTxjbWlzOnByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLQkJPGNtaXM6aWQ+dGVzdFByb3BlcnR5PC9jbWlzOmlkPgotCQk8Y21pczpsb2NhbE5hbWU+dGVzdFByb3BlcnR5PC9jbWlzOmxvY2FsTmFtZT4KLQkJPGNtaXM6ZGlzcGxheU5hbWU+QSB0ZXN0IHByb3BlcnR5PC9jbWlzOmRpc3BsYXlOYW1lPgotCQk8Y21pczpxdWVyeU5hbWU+dGVzdFByb3BlcnR5PC9jbWlzOnF1ZXJ5TmFtZT4KLQkJPGNtaXM6ZGVzY3JpcHRpb24+SnVzdCBhIHN0cmluZzwvY21pczpkZXNjcmlwdGlvbj4KLQkJPGNtaXM6cHJvcGVydHlUeXBlPnN0cmluZzwvY21pczpwcm9wZXJ0eVR5cGU+Ci0JCTxjbWlzOmNhcmRpbmFsaXR5PnNpbmdsZTwvY21pczpjYXJkaW5hbGl0eT4KLQkJPGNtaXM6dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvY21pczp1cGRhdGFiaWxpdHk+Ci0JCTxjbWlzOmluaGVyaXRlZD5mYWxzZTwvY21pczppbmhlcml0ZWQ+Ci0JCTxjbWlzOnJlcXVpcmVkPmZhbHNlPC9jbWlzOnJlcXVpcmVkPgotCQk8Y21pczpxdWVyeWFibGU+ZmFsc2U8L2NtaXM6cXVlcnlhYmxlPgotCQk8Y21pczpvcmRlcmFibGU+ZmFsc2U8L2NtaXM6b3JkZXJhYmxlPgotCTwvY21pczpwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0JPGNtaXM6cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotCQk8Y21pczppZD50ZXN0UHJvcGVydHkyPC9jbWlzOmlkPgotCQk8Y21pczpsb2NhbE5hbWU+dGVzdFByb3BlcnR5MjwvY21pczpsb2NhbE5hbWU+Ci0JCTxjbWlzOmRpc3BsYXlOYW1lPkFub3RoZXIgdGVzdCBwcm9wZXJ0eTwvY21pczpkaXNwbGF5TmFtZT4KLQkJPGNtaXM6cXVlcnlOYW1lPnRlc3RQcm9wZXJ0eTI8L2NtaXM6cXVlcnlOYW1lPgotCQk8Y21pczpkZXNjcmlwdGlvbj5Bbm90aGVyIHN0cmluZzwvY21pczpkZXNjcmlwdGlvbj4KLQkJPGNtaXM6cHJvcGVydHlUeXBlPnN0cmluZzwvY21pczpwcm9wZXJ0eVR5cGU+Ci0JCTxjbWlzOmNhcmRpbmFsaXR5PnNpbmdsZTwvY21pczpjYXJkaW5hbGl0eT4KLQkJPGNtaXM6dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvY21pczp1cGRhdGFiaWxpdHk+Ci0JCTxjbWlzOmluaGVyaXRlZD5mYWxzZTwvY21pczppbmhlcml0ZWQ+Ci0JCTxjbWlzOnJlcXVpcmVkPnRydWU8L2NtaXM6cmVxdWlyZWQ+Ci0JCTxjbWlzOnF1ZXJ5YWJsZT5mYWxzZTwvY21pczpxdWVyeWFibGU+Ci0JCTxjbWlzOm9yZGVyYWJsZT5mYWxzZTwvY21pczpvcmRlcmFibGU+Ci0JCTxjbWlzOmRlZmF1bHRWYWx1ZT4KLQkJCTxjbWlzOnZhbHVlPmRlZmF1bHQgdmFsdWU8L2NtaXM6dmFsdWU+Ci0JCTwvY21pczpkZWZhdWx0VmFsdWU+Ci0JPC9jbWlzOnByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4JCQkKLTwvY21pc3JhOnR5cGU+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg5ZThkNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSMgc2FtcGxlIGxvZzRqLnByb3BlcnRpZXMKLQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8KLQotIyBTdGRvdXQKLWxvZzRqLmFwcGVuZGVyLk89b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBGaWxlCi1sb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuUi5GaWxlPWxvZzRqLmxvZwotCi0jIENvbnRyb2wgdGhlIG1heGltdW0gbG9nIGZpbGUgc2l6ZQotbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT0xMDBLQgotCi0jIEFyY2hpdmUgbG9nIGZpbGVzIChvbmUgYmFja3VwIGZpbGUgaGVyZSkKLWxvZzRqLmFwcGVuZGVyLlIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5PLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgWyV0XSAlYzogJW0lbgotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuCi0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maWxlc2hhcmU9SU5GTwotIyBsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuZmlsdGVyPUlORk8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9MSUNFTlNFIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWZpbGVzaGFyZS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5MDM4OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVBsZWFzZSBzZWUgYWxzbyBUSFJJRC1QQVJUWS1MSUNFTlNFUy4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gU0xGNEogTE9HNEotMTIgQmluZGluZyAoaHR0cDovL3d3dy5zbGY0ai5vcmcpCi0gIExpY2Vuc2U6IE1JVCBMaWNlbnNlICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApCi0KLQotQ29weXJpZ2h0IChjKSAyMDA0LTIwMTMgUU9TLmNoCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSBhICBjb3B5ICBvZiB0aGlzICBzb2Z0d2FyZSAgYW5kICBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICAodGhlCi0gIlNvZnR3YXJlIiksIHRvICBkZWFsIGluICB0aGUgU29mdHdhcmUgd2l0aG91dCAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotIHdpdGhvdXQgbGltaXRhdGlvbiAgdGhlIHJpZ2h0cyB0byAgdXNlLCBjb3B5LCBtb2RpZnksICBtZXJnZSwgcHVibGlzaCwKLSBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgIGNvcGllcyBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKLSBUaGUgIGFib3ZlICBjb3B5cmlnaHQgIG5vdGljZSAgYW5kICB0aGlzIHBlcm1pc3Npb24gIG5vdGljZSAgc2hhbGwgIGJlCi0gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFICBTT0ZUV0FSRSBJUyAgUFJPVklERUQgICJBUyAgSVMiLCBXSVRIT1VUICBXQVJSQU5UWSAgT0YgQU5ZICBLSU5ELAotIEVYUFJFU1MgT1IgIElNUExJRUQsIElOQ0xVRElORyAgQlVUIE5PVCBMSU1JVEVEICBUTyBUSEUgIFdBUlJBTlRJRVMgT0YKLSBNRVJDSEFOVEFCSUxJVFksICAgIEZJVE5FU1MgICAgRk9SICAgIEEgICBQQVJUSUNVTEFSICAgIFBVUlBPU0UgICAgQU5ECi0gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL05PVElDRSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM3MDlmZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0KLU9wZW5DTUlTIEZpbGVTaGFyZSBSZXBvc2l0b3J5Ci1Db3B5cmlnaHQgMjAwOS0yMDE1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0KLU9wZW5DTUlTIGNvbnRhaW5zIGNvZGUgZnJvbSB0aGUgZm9sbG93aW5nIE9wZW4gU291cmNlIHByb2plY3RzOgotCi0tIEJhc2U2NCAKLSAgQ29weXJpZ2h0IChjKSAyMDEwIFJvYmVydCBIYXJkZXIKLSAgUHVibGljIERvbWFpbiwgPGh0dHA6Ly9paGFyZGVyLm5ldC9iYXNlNjQ+Ci0KLS0gSlNPTi5zaW1wbGUKLSAgQ29weXJpZ2h0IChjKSAyMDEyIFlpZG9uZyBGYW5nCi0gIEFwYWNoZSBMaWNlbnNlIDIuMCwgPGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc29uLXNpbXBsZS8+Ci0gIAotICAKLU9wZW5DTUlTIGNvbnRhaW5zIE9BU0lTIENNSVMgMS4wIGFuZCBDTUlTIDEuMSBzY2hlbWEgYW5kIFdTREwgZmlsZXMuCi1Db3B5cmlnaHQgKGMpIDIwMTAgYW5kIDIwMTMgT0FTSVMgT3BlbgotPGh0dHBzOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvY21pcz4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9yZXBvc2l0b3J5LnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQ0Zjk1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9yZXBvc2l0b3J5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWNsYXNzPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpbGVzaGFyZS5GaWxlU2hhcmVDbWlzU2VydmljZUZhY3RvcnkKLQotbG9naW4uMSA9IHRlc3Q6dGVzdAotbG9naW4uMiA9IGNtaXN1c2VyOnBhc3N3b3JkCi1sb2dpbi4zID0gcmVhZGVyOnJlYWRlcgotCi10eXBlLjEgPSAvZXhhbXBsZS10eXBlLnhtbAotI3R5cGUuMiA9IHt1c2VyLmhvbWV9e2ZpbGUuc2VwYXJhdG9yfXR5cGUxLnhtbAotI3R5cGUuMyA9IHt1c2VyLmhvbWV9e2ZpbGUuc2VwYXJhdG9yfXR5cGUyLnhtbAotCi1yZXBvc2l0b3J5LnRlc3QgPSB7dXNlci5ob21lfQotcmVwb3NpdG9yeS50ZXN0LnJlYWR3cml0ZSA9IHRlc3QsIGNtaXN1c2VyCi1yZXBvc2l0b3J5LnRlc3QucmVhZG9ubHkgPSByZWFkZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1maWxlc2hhcmUvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmYTM0MS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgcGFnZUVuY29kaW5nPSJJU08tODg1OS0xIiU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpbGVzaGFyZS4qIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLioiICU+Ci08JQotICAgRmlsZVNoYXJlQ21pc1NlcnZpY2VGYWN0b3J5IGZhY3RvcnkgPSAoRmlsZVNoYXJlQ21pc1NlcnZpY2VGYWN0b3J5KSBhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZpY2VzZmFjdG9yeSIpOwotJT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY3NzL29wZW5jbWlzLmNzcyI+Ci0gIDx0aXRsZT5PcGVuQ01JUyBGaWxlU2hhcmUgU2VydmVyPC90aXRsZT4KLSAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgPCEtLQotICBib2R5IHsKLSAgICBmb250LWZhbWlseTogVmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgY29sb3I6IGJsYWNrOwotICAgIGZvbnQtc2l6ZTogMTJweDsKLSAgfQotCi0gIGgxIHsKLSAgICBmb250LXNpemU6IDI0cHg7Ci0gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwotICAgIGNvbG9yOiAjMDAzMzY2OwotICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjM2M3OGI1OwotICAgIHBhZGRpbmc6IDJweDsKLSAgICBtYXJnaW46IDRweCAwcHggNHB4IDBweDsKLSAgfQotCi0gIGgyIHsKLSAgICBmb250LXNpemU6IDE4cHg7Ci0gICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwotICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjM2M3OGI1OwotICAgIHBhZGRpbmc6IDJweDsKLSAgICBtYXJnaW46IDRweCAwcHggNHB4IDBweDsKLSAgfQotCi0gIGhyIHsKLSAgICBjb2xvcjogM2M3OGI1OwotICAgIGhlaWdodDogMTsKLSAgfQotICAKLSAgdGQgewotICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGRkZGQ7IAotICAgIHBhZGRpbmc6IDJweDsKLSAgfQotICAtLT4KLSAgPC9zdHlsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDE+T3BlbkNNSVMgRmlsZVNoYXJlIFNlcnZlcjwvaDE+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+VGhlIE9wZW5DTUlTIEZpbGVTaGFyZSBzZXJ2ZXIgaXMgdXAgYW5kIHJ1bm5pbmcuPC9wPgotPHA+WW91IG5lZWQgYSBDTUlTIGNsaWVudCB0byBhY2Nlc3MgdGhpcyBzZXJ2ZXIuIERvd25sb2FkIHRoZSA8YSBocmVmPSJodHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmcvamF2YS9kZXZlbG9waW5nL3Rvb2xzL2Rldi10b29scy13b3JrYmVuY2guaHRtbCI+Q01JUyBXb3JrYmVuY2g8L2E+LjwvcD4KLQotPGgyPkFjY2VzcyBJbmZvcm1hdGlvbjwvaDI+Ci0KLTxoMz5DTUlTIDEuMTwvaDM+Ci0KLTxwPldlYiBTZXJ2aWNlcyBCaW5kaW5nOiA8YSBocmVmPSJzZXJ2aWNlczExL2NtaXM/d3NkbCI+V1NETDwvYT48L3A+Ci08cD5BdG9tUHViIEJpbmRpbmc6IDxhIGhyZWY9ImF0b20xMSI+U2VydmljZSBEb2N1bWVudDwvYT48L3A+Ci08cD5Ccm93c2VyIEJpbmRpbmc6IDxhIGhyZWY9ImJyb3dzZXIiPlNlcnZpY2UgRG9jdW1lbnQ8L2E+PC9wPgotCi08aDM+Q01JUyAxLjA8L2gzPgotCi08cD5XZWIgU2VydmljZXMgQmluZGluZzogPGEgaHJlZj0ic2VydmljZXMvY21pcz93c2RsIj5XU0RMPC9hPjwvcD4KLTxwPkF0b21QdWIgQmluZGluZzogPGEgaHJlZj0iYXRvbSI+U2VydmljZSBEb2N1bWVudDwvYT48L3A+Ci0KLQotPGgyPkNvbmZpZ3VyZWQgUmVwb3NpdG9yaWVzPC9oMj4KLQotPHRhYmxlPgotPHRyPjx0aD5SZXBvc2l0b3J5IElkPC90aD48dGg+Um9vdCBEaXJlY3Rvcnk8L3RoPjwvdHI+Ci08JSBmb3IgKEZpbGVTaGFyZVJlcG9zaXRvcnkgZnNyOiBmYWN0b3J5LmdldFJlcG9zaXRvcnlNYW5hZ2VyKCkuZ2V0UmVwb3NpdG9yaWVzKCkpIHsgJT4KLTx0cj48dGQ+PCU9IGZzci5nZXRSZXBvc2l0b3J5SWQoKSAlPjwvdGQ+PHRkPjwlPSBmc3IuZ2V0Um9vdERpcmVjdG9yeSgpICU+PC90ZD48L3RyPgotPCUgfSAlPgotPC90YWJsZT4KLQotCi08aDI+VXNlcnM8L2gyPgotCi08dGFibGU+Ci08dHI+PHRoPkxvZ2luPC90aD48L3RyPgotPCUgZm9yIChTdHJpbmcgbG9naW46IGZhY3RvcnkuZ2V0VXNlck1hbmFnZXIoKS5nZXRMb2dpbnMoKSkgeyAlPgotPHRyPjx0ZD48JT0gbG9naW4gJT48L3RkPjwvdHI+Ci08JSB9ICU+Ci08L3RhYmxlPgotCi0KLTxoMj5UeXBlczwvaDI+Ci0KLTx0YWJsZT4KLTx0cj48dGg+VHlwZSBJZDwvdGg+PHRoPk5hbWU8L3RoPjx0aD5CYXNlIFR5cGUgSWQ8L3RoPjwvdHI+Ci08JSBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGU6IGZhY3RvcnkuZ2V0VHlwZU1hbmFnZXIoKS5nZXRJbnRlcm5hbFR5cGVEZWZpbml0aW9ucygpKSB7ICU+Ci08dHI+PHRkPjwlPSB0eXBlLmdldElkKCkgJT48L3RkPjx0ZD48JT0gdHlwZS5nZXREaXNwbGF5TmFtZSgpICU+PC90ZD48dGQ+PCU9IHR5cGUuZ2V0QmFzZVR5cGVJZCgpLnZhbHVlKCkgJT48L3RkPjwvdHI+Ci08JSB9ICU+Ci08L3RhYmxlPgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvcG9tLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWEyNWI0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5PC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIEluTWVtb3J5IFNlcnZlciBXQVIgcGFja2FnaW5nPC9uYW1lPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1OYW1lPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5pbm1lbW9yeTwvQnVuZGxlLU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmlubWVtb3J5PC9CdW5kbGUtU3ltYm9saWNOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtVmVyc2lvbj4wLjAuMTwvQnVuZGxlLVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPmphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwLGphdmF4LnNlcnZsZXQucmVzb3VyY2VzPC9JbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLUNsYXNzcGF0aD4uPC9CdW5kbGUtQ2xhc3NwYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxXZWItQ29udGV4dFBhdGg+aW5tZW1vcnk8L1dlYi1Db250ZXh0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgIDxvdmVybGF5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVybGF5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9vdmVybGF5PgotICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJsYXk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GL1RISVJELVBBUlRZLUxJQ0VOU0VTPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L292ZXJsYXk+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3ZlcmxheXM+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlQ2xhc3Nlcz50cnVlPC9hcmNoaXZlQ2xhc3Nlcz4KLSAgICAgICAgICAgICAgICAgICAgPGF0dGFjaENsYXNzZXM+dHJ1ZTwvYXR0YWNoQ2xhc3Nlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVjbGlwc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHVzZVByb2plY3RSZWZlcmVuY2VzPnRydWU8L3VzZVByb2plY3RSZWZlcmVuY2VzPgotICAgICAgICAgICAgICAgICAgICA8d3RwdmVyc2lvbj4yLjA8L3d0cHZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx3dHBDb250ZXh0TmFtZT5pbm1lbW9yeTwvd3RwQ29udGV4dE5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxsaW5rZWRSZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGlua2VkUmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3VuLWpheHdzLnhtbDwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT4xPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NhdGlvbj5XT1JLU1BBQ0VfTE9DL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3VuLWpheHdzLnhtbDwvbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWw8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+MTwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9jYXRpb24+V09SS1NQQUNFX0xPQy9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWw8L2xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93c2RsPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPjI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2F0aW9uPldPUktTUEFDRV9MT0MvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93c2RsPC9sb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlua2VkUmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGlua2VkUmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY21pczEwPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPjI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2F0aW9uPldPUktTUEFDRV9MT0MvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTA8L2xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbWlzMTE8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+MjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9jYXRpb24+V09SS1NQQUNFX0xPQy9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NtaXMxMTwvbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPnNyYy9tYWluL3dlYmFwcC9jc3M8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+MjwvdHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9jYXRpb24+V09SS1NQQUNFX0xPQy9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyL3NyYy9tYWluL3dlYmFwcC9jc3M8L2xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rZWRSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPjI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2F0aW9uPldPUktTUEFDRV9MT0MvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhci9zcmMvbWFpbi93ZWJhcHAvaW1hZ2VzPC9sb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlua2VkUmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGlua2VkUmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+c3JjL21haW4vd2ViYXBwL3dlYjwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT4yPC90eXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NhdGlvbj5XT1JLU1BBQ0VfTE9DL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXIvc3JjL21haW4vd2ViYXBwL3dlYjwvbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtlZFJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8L2xpbmtlZFJlc291cmNlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5nczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIFVuY29tbWVudCBmb3IgQ09SUyBzdXBwb3J0IAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS50aGV0cmFuc2FjdGlvbmNvbXBhbnk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb3JzLWZpbHRlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4yPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzbGY0ai52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9Db25maWdDb25zdGFudHMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0NvbmZpZ0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjhiZjY0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0NvbmZpZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlnQ29uc3RhbnRzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX0lEID0gIkluTWVtb3J5U2VydmVyLlJlcG9zaXRvcnlJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9YTUwgPSAiSW5NZW1vcnlTZXJ2ZXIuVHlwZURlZmluaXRpb25zRmlsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9DUkVBVE9SX0NMQVNTID0gIkluTWVtb3J5U2VydmVyLlR5cGVzQ3JlYXRvckNsYXNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX0lORk9fQ1JFQVRPUl9DTEFTUyA9ICJJbk1lbW9yeVNlcnZlci5SZXBvc2l0b3J5SW5mb0NyZWF0b3JDbGFzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9DTEFTUyA9ICJJbk1lbW9yeVNlcnZlci5DbGFzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1ZFUlJJREVfQ0FMTF9DT05URVhUID0gIkluTWVtb3J5U2VydmVyLk92ZXJyaWRlQ2FsbENvbnRleHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTU9SWV9USFJFU0hPTEQgPSAiSW5NZW1vcnlTZXJ2ZXIuTWVtb3J5VGhyZXNob2xkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QX0RJUiA9ICJJbk1lbW9yeVNlcnZlci5UZW1wRGlyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfQ09OVEVOVF9TSVpFID0gIkluTWVtb3J5U2VydmVyLk1heENvbnRlbnRTaXplIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNSWVBUX1RFTVBfRklMRVMgPSAiSW5NZW1vcnlTZXJ2ZXIuRW5jcnlwdFRlbXBGaWxlcyI7Ci0KLSAgICAvLyBIZWxwZXIgY29uc3RhbnRzIHRoYXQgYWxsb3cgdG8gZmlsbCBhIHJlcG9zaXRvcnkgd2l0aCBkYXRhIG9uCi0gICAgLy8gaW5pdGlhbGl6YXRpb24KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfUkVQT1NJVE9SWV9GSUxFUiA9ICJSZXBvc2l0b3J5RmlsbGVyLkVuYWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMTEVSX0RPQ1VNRU5UX1RZUEVfSUQgPSAiUmVwb3NpdG9yeUZpbGxlci5Eb2N1bWVudFR5cGVJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMTEVSX0ZPTERFUl9UWVBFX0lEID0gIlJlcG9zaXRvcnlGaWxsZXIuRm9sZGVyVHlwZUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxMRVJfRE9DU19QRVJfRk9MREVSID0gIlJlcG9zaXRvcnlGaWxsZXIuRG9jc1BlckZvbGRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMTEVSX0ZPTERFUlNfUEVSX0ZPTERFUiA9ICJSZXBvc2l0b3J5RmlsbGVyLkZvbGRlclBlckZvbGRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMTEVSX0RFUFRIID0gIlJlcG9zaXRvcnlGaWxsZXIuRGVwdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTExFUl9DT05URU5UX1NJWkUgPSAiUmVwb3NpdG9yeUZpbGxlci5Db250ZW50U2l6ZUluS0IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTExFUl9ET0NVTUVOVF9QUk9QRVJUWSA9ICJSZXBvc2l0b3J5RmlsbGVyLkRvY3VtZW50UHJvcGVydHkuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxMRVJfRk9MREVSX1BST1BFUlRZID0gIlJlcG9zaXRvcnlGaWxsZXIuRm9sZGVyUHJvcGVydHkuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0tJTkQgPSAiUmVwb3NpdG9yeUZpbGxlci5Db250ZW50S2luZCI7Ci0KLSAgICAvLyBydW50aW1lIGNvbmZpZ3VyYXRpb24gdmFsdWVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0NPTlRFTlRfU0laRV9LQiA9ICJJbk1lbW9yeVNlcnZlci5NYXhDb250ZW50U2l6ZUtCIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTl9SRVBPU0lUT1JZX0lOVEVSVkFMID0gIkluTWVtb3J5U2VydmVyLkNsZWFuSW50ZXJ2YWxNaW51dGVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lNRU5UX1RJTUUgPSAiSW5NZW1vcnlTZXJ2ZXIuRGVwbG95bWVudFRpbWUiOwotCi0gICAgcHJpdmF0ZSBDb25maWdDb25zdGFudHMoKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9Db25maWd1cmF0aW9uU2V0dGluZ3MuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0NvbmZpZ3VyYXRpb25TZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGVkODk2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0NvbmZpZ3VyYXRpb25TZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlndXJhdGlvblNldHRpbmdzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb25maWd1cmF0aW9uU2V0dGluZ3MuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb25TZXR0aW5ncyBzaW5nbGVJbnN0YW5jZTsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uU2V0dGluZ3MoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvblZhbHVlSW50ZXJuKFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvblZhbHVlQXNTdHJpbmcoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAobnVsbCA9PSBzaW5nbGVJbnN0YW5jZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJDb25maWd1cmF0aW9uU2V0dGluZ3MgYXJlIG5vdCBpbml0aWFsaXplZC4gSW5pdGlhbGl6ZSBiZWZvcmUgcmVhZGluZyB2YWx1ZXMiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ29uZmlndXJhdGlvblNldHRpbmdzIGFyZSBub3QgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpbmdsZUluc3RhbmNlLmdldENvbmZpZ3VyYXRpb25WYWx1ZUludGVybihrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTG9uZyBnZXRDb25maWd1cmF0aW9uVmFsdWVBc0xvbmcoU3RyaW5nIGtleSkgewotICAgICAgICBTdHJpbmcgc3RyID0gZ2V0Q29uZmlndXJhdGlvblZhbHVlQXNTdHJpbmcoa2V5KTsKLSAgICAgICAgaWYgKG51bGwgIT0gc3RyKSB7Ci0gICAgICAgICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKHN0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzaW5nbGVJbnN0YW5jZSA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGluZ3MocGFyYW1ldGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBzaW5nbGVJbnN0YW5jZS5wYXJhbWV0ZXJzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0RhdGFPYmplY3RDcmVhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9EYXRhT2JqZWN0Q3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTZhM2JjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0RhdGFPYmplY3RDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5DaGFuZ2VFdmVudEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBvbGljeUlkTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5SZWxhdGlvbnNoaXBEaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWxsb3dhYmxlQWN0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNoYW5nZUV2ZW50SW5mb0RhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lJZExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5Jbk1lbW9yeVNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZpbGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5PYmplY3RTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlZE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5WZXJzaW9uZWREb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5Qcm9wZXJ0eUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotCi0vKioKLSAqIEEgY29sbGVjdGlvbiBvZiB1dGlsaXR5IGZ1bmN0aW9ucyB0byBmaWxsIHRoZSBkYXRhIG9iamVjdHMgdXNlZAotICogICAgICAgICBhcyByZXR1cm4gdmFsdWVzIGZvciB0aGUgc2VydmljZSBvYmplY3QgY2FsbHMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERhdGFPYmplY3RDcmVhdG9yIHsKLQotICAgIC8vIFV0aWxpdHkgY2xhc3MKLSAgICBwcml2YXRlIERhdGFPYmplY3RDcmVhdG9yKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQWxsb3dhYmxlQWN0aW9ucyBmaWxsQWxsb3dhYmxlQWN0aW9ucyhTdG9yZWRPYmplY3Qgc28sIFN0cmluZyB1c2VyKSB7Ci0KLSAgICAgICAgYm9vbGVhbiBpc0ZvbGRlciA9IHNvIGluc3RhbmNlb2YgRm9sZGVyOwotICAgICAgICBib29sZWFuIGlzRG9jdW1lbnQgPSBzbyBpbnN0YW5jZW9mIENvbnRlbnQ7Ci0gICAgICAgIGJvb2xlYW4gaXNJdGVtID0gc28gaW5zdGFuY2VvZiBJdGVtOwotICAgICAgICBib29sZWFuIGlzUmVsYXRpb25zaGlwID0gc28gaW5zdGFuY2VvZiBSZWxhdGlvbnNoaXA7Ci0gICAgICAgIGJvb2xlYW4gaXNGaWxlYWJsZSA9IGlzRm9sZGVyIHx8IGlzRG9jdW1lbnQgfHwgaXNJdGVtOwotICAgICAgICBib29sZWFuIGlzUG9saWN5ID0gc28gaW5zdGFuY2VvZiBQb2xpY3k7Ci0gICAgICAgIGJvb2xlYW4gaXNDaGVja2VkT3V0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY2FuQ2hlY2tPdXQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBjYW5DaGVja0luID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gaXNWZXJzaW9uZWQgPSBzbyBpbnN0YW5jZW9mIFZlcnNpb24gfHwgc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudDsKLSAgICAgICAgYm9vbGVhbiBoYXNDb250ZW50ID0gc28gaW5zdGFuY2VvZiBDb250ZW50ICYmICgoQ29udGVudCkgc28pLmhhc0NvbnRlbnQoKTsKLSAgICAgICAgYm9vbGVhbiBpc1Jvb3RGb2xkZXIgPSBpc0ZvbGRlciAmJiAoKEZvbGRlcikgc28pLmdldFBhcmVudElkKCkgPT0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBoYXNSZW5kaXRpb24gPSBzby5oYXNSZW5kaXRpb24odXNlcik7Ci0gICAgICAgIGJvb2xlYW4gY2FuR2V0QWNsID0gdXNlciAhPSBudWxsICYmIChpc0RvY3VtZW50IHx8IGlzRm9sZGVyIHx8IGlzSXRlbSk7Ci0gICAgICAgIGJvb2xlYW4gY2FuU2V0QWNsID0gY2FuR2V0QWNsOwotICAgICAgICBib29sZWFuIGNtaXMxMSA9IEluTWVtb3J5U2VydmljZUNvbnRleHQuZ2V0Q2FsbENvbnRleHQoKS5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotCi0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIFZlcnNpb24pIHsKLSAgICAgICAgICAgIGlzQ2hlY2tlZE91dCA9ICgoVmVyc2lvbikgc28pLmlzUHdjKCk7Ci0gICAgICAgICAgICBjYW5DaGVja0luID0gaXNDaGVja2VkT3V0ICYmICgoVmVyc2lvbikgc28pLmdldFBhcmVudERvY3VtZW50KCkuZ2V0Q2hlY2tlZE91dEJ5KCkuZXF1YWxzKHVzZXIpOwotICAgICAgICAgICAgY2FuQ2hlY2tPdXQgPSAhKChWZXJzaW9uKSBzbykuZ2V0UGFyZW50RG9jdW1lbnQoKS5pc0NoZWNrZWRPdXQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzbyBpbnN0YW5jZW9mIFZlcnNpb25lZERvY3VtZW50KSB7Ci0gICAgICAgICAgICBpc0NoZWNrZWRPdXQgPSAoKFZlcnNpb25lZERvY3VtZW50KSBzbykuaXNDaGVja2VkT3V0KCk7Ci0gICAgICAgICAgICBjYW5DaGVja091dCA9ICEoKFZlcnNpb25lZERvY3VtZW50KSBzbykuaXNDaGVja2VkT3V0KCk7Ci0gICAgICAgICAgICBjYW5DaGVja0luID0gaXNDaGVja2VkT3V0ICYmICgoVmVyc2lvbmVkRG9jdW1lbnQpIHNvKS5nZXRDaGVja2VkT3V0QnkoKS5lcXVhbHModXNlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBBbGxvd2FibGVBY3Rpb25zSW1wbCBhbGxvd2FibGVBY3Rpb25zID0gbmV3IEFsbG93YWJsZUFjdGlvbnNJbXBsKCk7Ci0gICAgICAgIFNldDxBY3Rpb24+IHNldCA9IGFsbG93YWJsZUFjdGlvbnMuZ2V0QWxsb3dhYmxlQWN0aW9ucygpOwotCi0gICAgICAgIGlmICghaXNSb290Rm9sZGVyKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fREVMRVRFX09CSkVDVCk7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fVVBEQVRFX1BST1BFUlRJRVMpOwotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0FQUExZX1BPTElDWSk7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX0FQUExJRURfUE9MSUNJRVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRm9sZGVyIHx8IGlzRG9jdW1lbnQgfHwgaXNJdGVtIHx8IGlzUmVsYXRpb25zaGlwIHx8IGlzUG9saWN5KSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX1BST1BFUlRJRVMpOwotICAgICAgICAgICAgaWYgKCFpc1Jvb3RGb2xkZXIgJiYgaXNGaWxlYWJsZSkgewotICAgICAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfT0JKRUNUX1BBUkVOVFMpOwotICAgICAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9NT1ZFX09CSkVDVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNGb2xkZXIpIHsKLSAgICAgICAgICAgIGlmICghaXNSb290Rm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0dFVF9GT0xERVJfUEFSRU5UKTsKLSAgICAgICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fREVMRVRFX1RSRUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0dFVF9GT0xERVJfVFJFRSk7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX0RFU0NFTkRBTlRTKTsKLQotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0NSRUFURV9ET0NVTUVOVCk7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fQ1JFQVRFX0ZPTERFUik7Ci0gICAgICAgICAgICBpZiAoY21pczExKSB7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0NSRUFURV9JVEVNKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfQ0hJTERSRU4pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc0NvbnRlbnQpIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0pOwotICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0dFVF9DT05URU5UX1NUUkVBTSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNWZXJzaW9uZWQpIHsKLSAgICAgICAgICAgIGlmIChjYW5DaGVja091dCkgewotICAgICAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9DSEVDS19PVVQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbkNoZWNrSW4pIHsKLSAgICAgICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fQ0FOQ0VMX0NIRUNLX09VVCk7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChBY3Rpb24uQ0FOX0NIRUNLX0lOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfQUxMX1ZFUlNJT05TKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0RvY3VtZW50IHx8IGlzSXRlbSkgewotICAgICAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRmlsaW5nICYmICgoRmlsaW5nKSBzbykuaGFzUGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fQUREX09CSkVDVF9UT19GT0xERVIpOwotICAgICAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0RvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzVmVyc2lvbmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYW5DaGVja0luKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fU0VUX0NPTlRFTlRfU1RSRUFNKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9TRVRfQ09OVEVOVF9TVFJFQU0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNSZW5kaXRpb24pIHsKLSAgICAgICAgICAgIHNldC5hZGQoQWN0aW9uLkNBTl9HRVRfUkVORElUSU9OUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FuU2V0QWNsKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fQVBQTFlfQUNMKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FuR2V0QWNsKSB7Ci0gICAgICAgICAgICBzZXQuYWRkKEFjdGlvbi5DQU5fR0VUX0FDTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhbGxvd2FibGVBY3Rpb25zLnNldEFsbG93YWJsZUFjdGlvbnMoc2V0KTsKLSAgICAgICAgcmV0dXJuIGFsbG93YWJsZUFjdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBY2wgZmlsbEFDTChTdG9yZWRPYmplY3Qgc28pIHsKLSAgICAgICAgQWNjZXNzQ29udHJvbExpc3RJbXBsIGFjbCA9IG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoKTsKLSAgICAgICAgTGlzdDxBY2U+IGFjZXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oKTsKLSAgICAgICAgYWNsLnNldEFjZXMoYWNlcyk7Ci0gICAgICAgIHJldHVybiBhY2w7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQb2xpY3lJZExpc3QgZmlsbFBvbGljeUlkcyhTdG9yZWRPYmplY3Qgc28pIHsKLSAgICAgICAgUG9saWN5SWRMaXN0SW1wbCBwb2xJZHMgPSBuZXcgUG9saWN5SWRMaXN0SW1wbCgpOwotICAgICAgICBMaXN0PFN0cmluZz4gcG9scyA9IHNvLmdldEFwcGxpZWRQb2xpY2llcygpOwotICAgICAgICBwb2xJZHMuc2V0UG9saWN5SWRzKHBvbHMpOwotICAgICAgICByZXR1cm4gcG9sSWRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3REYXRhPiBmaWxsUmVsYXRpb25zaGlwcyhUeXBlTWFuYWdlciB0bSwgT2JqZWN0U3RvcmUgb2JqU3RvcmUsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgdXNlcikgewotICAgICAgICByZXR1cm4gZ2V0UmVsYXRpb25zaGlwcyh0bSwgb2JqU3RvcmUsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBzbywgdXNlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDaGFuZ2VFdmVudEluZm8gZmlsbENoYW5nZUV2ZW50SW5mbyhTdG9yZWRPYmplY3Qgc28pIHsKLSAgICAgICAgLy8gVE9ETzogdG8gYmUgY29tcGxldGVkIGlmIGNoYW5nZSBpbmZvcm1hdGlvbiBpcyBpbXBsZW1lbnRlZAotICAgICAgICBDaGFuZ2VFdmVudEluZm8gY2hhbmdlRXZlbnRJbmZvID0gbmV3IENoYW5nZUV2ZW50SW5mb0RhdGFJbXBsKCk7Ci0gICAgICAgIHJldHVybiBjaGFuZ2VFdmVudEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdERhdGE+IGdldFJlbGF0aW9uc2hpcHMoVHlwZU1hbmFnZXIgdG0sIE9iamVjdFN0b3JlIG9ialN0b3JlLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0b3JlZE9iamVjdCBzcG8sIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlUmVsYXRpb25zaGlwcyAhPSBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FKSB7Ci0gICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uID0gUmVsYXRpb25zaGlwRGlyZWN0aW9uLlNPVVJDRTsKLSAgICAgICAgICAgIC8vIHNvdXJjZSBpcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAoaW5jbHVkZVJlbGF0aW9uc2hpcHMgPT0gSW5jbHVkZVJlbGF0aW9uc2hpcHMuVEFSR0VUKSB7Ci0gICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwRGlyZWN0aW9uID0gUmVsYXRpb25zaGlwRGlyZWN0aW9uLlRBUkdFVDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZVJlbGF0aW9uc2hpcHMgPT0gSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCkgewotICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcERpcmVjdGlvbiA9IFJlbGF0aW9uc2hpcERpcmVjdGlvbi5FSVRIRVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8U3RvcmVkT2JqZWN0PiByZWxhdGlvbnNoaXBzID0gb2JqU3RvcmUuZ2V0UmVsYXRpb25zaGlwcyhzcG8uZ2V0SWQoKSwgbnVsbCwgcmVsYXRpb25zaGlwRGlyZWN0aW9uKTsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gcmVzID0gbmV3IEFycmF5TGlzdDxPYmplY3REYXRhPihyZWxhdGlvbnNoaXBzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKFN0b3JlZE9iamVjdCBzbyA6IHJlbGF0aW9uc2hpcHMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIG9kID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5nZXRPYmplY3REYXRhKHRtLCBvYmpTdG9yZSwgc28sIG51bGwsIHVzZXIsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgICAgICAgICByZXMuYWRkKG9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvRHVtbXlDYWxsQ29udGV4dC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvRHVtbXlDYWxsQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFjOTdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0R1bW15Q2FsbENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRHVtbXlDYWxsQ29udGV4dCBpbXBsZW1lbnRzIENhbGxDb250ZXh0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9VUl9NID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9LQiA9IDEwMjQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGZQYXJhbWV0ZXIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHB1YmxpYyBEdW1teUNhbGxDb250ZXh0KCkgewotICAgICAgICBmUGFyYW1ldGVyLnB1dChVU0VSTkFNRSwgIkFkbWluIik7Ci0gICAgICAgIGZQYXJhbWV0ZXIucHV0KFBBU1NXT1JELCAic2VjcmV0Iik7Ci0gICAgICAgIGZQYXJhbWV0ZXIucHV0KExPQ0FMRSwgImVuIik7Ci0gICAgfQotCi0gICAgcHVibGljIER1bW15Q2FsbENvbnRleHQoU3RyaW5nIHByaW5jaXBhbElkKSB7Ci0gICAgICAgIGZQYXJhbWV0ZXIucHV0KFVTRVJOQU1FLCBwcmluY2lwYWxJZCk7Ci0gICAgICAgIGZQYXJhbWV0ZXIucHV0KFBBU1NXT1JELCAic2VjcmV0Iik7Ci0gICAgICAgIGZQYXJhbWV0ZXIucHV0KExPQ0FMRSwgImVuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNPYmplY3RJbmZvUmVxdWlyZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiBmUGFyYW1ldGVyLmdldChrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIEJJTkRJTkdfQVRPTVBVQjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBDbWlzVmVyc2lvbi5DTUlTXzFfMTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChSRVBPU0lUT1JZX0lEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChMT0NBTEUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIChCaWdJbnRlZ2VyKSBnZXQoT0ZGU0VUKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoQmlnSW50ZWdlcikgZ2V0KExFTkdUSCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChQQVNTV09SRCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldChVU0VSTkFNRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBmUGFyYW1ldGVyLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmlsZSBnZXRUZW1wRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlbmNyeXB0VGVtcEZpbGVzKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNZW1vcnlUaHJlc2hvbGQoKSB7Ci0gICAgICAgIHJldHVybiBGT1VSX00gKiBTSVpFX0tCICogU0laRV9LQjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhDb250ZW50U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIEZPVVJfTSAqIFNJWkVfS0IgKiBTSVpFX0tCICogU0laRV9LQjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9GaWx0ZXJQYXJzZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0ZpbHRlclBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTZmMzliLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0ZpbHRlclBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWx0ZXJQYXJzZXIgewotCi0gICAgLy8gVXRpbGl0eSBjbGFzcwotICAgIHByaXZhdGUgRmlsdGVyUGFyc2VyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEluRmlsdGVyKFN0cmluZyBwcm9wZXJ0eUlkLCBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0ZWRJZHMuY29udGFpbnMoIioiKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RlZElkcy5jb250YWlucyhwcm9wZXJ0eUlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRSZXF1ZXN0ZWRJZHNGcm9tRmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLSAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiKiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3RlZElkcyA9IEFycmF5cy5hc0xpc3QoZmlsdGVyLnNwbGl0KCIsXFxzKiIpKTsgLy8gY29tbWEKLSAgICAgICAgICAgIC8vIHBsdXMKLSAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UKLQotICAgICAgICAgICAgLy8gYWRkIG9iamVjdCBpZCBiZWNhdXNlIHRoaXMgaXMgYWx3YXlzIG5lZWRlZCBpbiBBdG9tUHViIGJpbmRpbmc6Ci0gICAgICAgICAgICBpZiAoIShyZXF1ZXN0ZWRJZHMuY29udGFpbnMoUHJvcGVydHlJZHMuT0JKRUNUX0lEKSkpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ocmVxdWVzdGVkSWRzKTsgLy8gY29weQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbW11dGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZElkcy5hZGQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlcXVlc3RlZElkcy5jb250YWlucygiKiIpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdGVkSWRzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiKiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RlZElkczsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvTmFtZVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvTmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjhhZmQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L05hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZVZhbGlkYXRvciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9JTExFR0FMX0lEID0gIklkIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycywgYWxsb3dlZCBhcmUgIgotICAgICAgICAgICAgKyAiJ2EnLi4neicsICdBJy4uJ1onLCAnMCcuLic5JywgJy0nLCAnXyciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lMTEVHQUxfTkFNRSA9ICJOYW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycywgbm90IGFsbG93ZWQgYXJlICIKLSAgICAgICAgICAgICsgIicvJywgJ1xcJywgJzonLCAnXCInLCAnKicuICc/JywgJzwnLCc+JywgJ3wnIjsKLQotICAgIC8vIFV0aWxpdHkgY2xhc3MKLSAgICBwcml2YXRlIE5hbWVWYWxpZGF0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2hlY2sgd2hldGhlciBpZCBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgQWxsb3dlZCBhcmUgJ2EnLi4neicsCi0gICAgICogJ0EnLi4nWicsICcwJy4uJzknLCAnLicsICctJywgJyAnLCAnXycuCi0gICAgICogCi0gICAgICogQHBhcmFtIHMKLSAgICAgKiAgICAgICAgICAgIHN0cmluZyB0byB2ZXJpZnkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsaWQgbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJZChTdHJpbmcgcykgewotICAgICAgICBpZiAobnVsbCA9PSBzIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKCEoKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnOicgfHwgYyA9PSAnLicKLSAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnLScgfHwgYyA9PSAnXycgfHwgYyA9PSAnICcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTG9jYWxOYW1lKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBpc1ZhbGlkSWQocyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2hlY2sgd2hldGhlciBpZCBjb250YWlucyBvbmx5IHZhbGlkIGNoYXJhY3RlcnMuIE5vdCBhbGxvd2VkIGFyZSAnLycsCi0gICAgICogJ1xcJywgJzonLCAnXCInLCAnKicuICc/JywgJzwnLCc+JywgJ3wnIgotICAgICAqIAotICAgICAqIEBwYXJhbSBzCi0gICAgICogICAgICAgICAgICBzdHJpbmcgdG8gdmVyaWZ5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHZhbGlkIG5hbWUsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgcykgewotICAgICAgICBpZiAobnVsbCA9PSBzIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID09ICdcXCcgfHwgYyA9PSAnLycgfHwgYyA9PSAnXCInIHx8IGMgPT0gJzonIHx8IGMgPT0gJyonIHx8IGMgPT0gJz8nIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nCi0gICAgICAgICAgICAgICAgICAgICYmIGMgPT0gJ3wnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZXNwYWNlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBpc1ZhbGlkSWQocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRRdWVyeU5hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIGlzVmFsaWRJZChzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L1JlcG9zaXRvcnlJbmZvQ3JlYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvUmVwb3NpdG9yeUluZm9DcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTNkYjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvUmVwb3NpdG9yeUluZm9DcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci0KLS8qKgotICogQSBzaW1wbGUgaW50ZXJmYWNlIHRvIGNyZWF0ZSB0aGUgcmVwb3NpdG9yeSBpbmZvLiBUaGlzIG5lZWRzIHRvIGJlCi0gKiBpbXBsZW1lbnRlZCBieSBhIGNsaWVudCAobGlrZSBhIHVuaXQgdGVzdCkgaW4gY2xhc3MgYW5kIHRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICogaXMgcGFzc2VkIHRvIHRoZSBzZXNzaW9uLiBUaGUgaW4tbWVtb3J5IHJlcG9zaXRvcnkgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZgotICogdGhpcyBjbGFzcyB0byBnZW5lcmF0ZSB0aGUgcmVwb3NpdG9yeSBpbmZvIGZvciBpdHMgaW5zdGFuY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVwb3NpdG9yeUluZm9DcmVhdG9yIHsKLSAgICBSZXBvc2l0b3J5SW5mbyBjcmVhdGVSZXBvc2l0b3J5SW5mbygpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVHlwZUNyZWF0b3IuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L1R5cGVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMTFhYmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVHlwZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBBIHNpbXBsZSBpbnRlcmZhY2UgdG8gY3JlYXRlIGEgdHlwZSBzeXN0ZW0uIFRoaXMgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYQotICogY2xpZW50IChsaWtlIGEgdW5pdCB0ZXN0KSBpbiBjbGFzcyBhbmQgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIHBhc3NlZCB0byB0aGUKLSAqIHNlc3Npb24uIFRoZSBpbi1tZW1vcnkgcmVwb3NpdG9yeSBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8KLSAqIGdlbmVyYXRlIHRoZSB0eXBlIHN5c3RlbSBmb3IgdGhpcyBpbnN0YW5jZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGVDcmVhdG9yIHsKLQotICAgIExpc3Q8VHlwZURlZmluaXRpb24+IGNyZWF0ZVR5cGVzTGlzdCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVHlwZU1hbmFnZXJJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9UeXBlTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlOGEyNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9UeXBlTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuVHlwZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBDbGFzcyB0aGF0IG1hbmFnZXMgYSB0eXBlIHN5c3RlbSBmb3IgYSByZXBvc2l0b3J5IHR5cGVzIGNhbiBiZSBhZGRlZCwgdGhlCi0gKiBpbmhlcml0YW5jZSBjYW4gYmUgbWFuYWdlZCBhbmQgdHlwZSBjYW4gYmUgcmV0cmlldmVkIGZvciBhIGdpdmVuIHR5cGUgaWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlTWFuYWdlckltcGwgaW1wbGVtZW50cyBUeXBlTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHlwZU1hbmFnZXJJbXBsLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgLyoqCi0gICAgICogbWFwIGZyb20gcmVwb3NpdG9yeSBpZCB0byBhIHR5cGVzIG1hcC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBmVHlwZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPigpOwotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlR5cGVNYW5hZ2VyI2dldFR5cGVCeUlkKGphdmEubGFuZwotICAgICAqIC5TdHJpbmcpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGdldFR5cGVCeUlkKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgcmV0dXJuIGZUeXBlc01hcC5nZXQodHlwZUlkKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZU1hbmFnZXIjZ2V0VHlwZUJ5UXVlcnlOYW1lCi0gICAgICogKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVCeVF1ZXJ5TmFtZShTdHJpbmcgdHlwZVF1ZXJ5TmFtZSkgewotICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgVHlwZURlZmluaXRpb25Db250YWluZXI+IGVudHJ5IDogZlR5cGVzTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UXVlcnlOYW1lKCkuZXF1YWxzKHR5cGVRdWVyeU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZU1hbmFnZXIjZ2V0VHlwZURlZmluaXRpb25MaXN0Ci0gICAgICogKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0VHlwZURlZmluaXRpb25MaXN0KCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihmVHlwZXNNYXAudmFsdWVzKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZU1hbmFnZXIjZ2V0Um9vdFR5cGVzKCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0Um9vdFR5cGVzKCkgewotICAgICAgICAvLyBqdXN0IHRha2UgZmlyc3QgcmVwb3NpdG9yeQotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiByb290VHlwZXMgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPigpOwotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZSA6IGZUeXBlc01hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKGlzUm9vdFR5cGUodHlwZSkpIHsKLSAgICAgICAgICAgICAgICByb290VHlwZXMuYWRkKHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJvb3RUeXBlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSB0eXBlIHN5c3RlbSB3aXRoIHRoZSBnaXZlbiB0eXBlcy4gVGhpcyBsaXN0IG11c3Qgbm90Ci0gICAgICogY29udGFpbiB0aGUgQ01JUyBkZWZhdWx0IHR5cGVzLiBUaGUgZGVmYXVsdCB0eXBlIGFyZSBhbHdheXMgY29udGFpbmVkIGJ5Ci0gICAgICogZGVmYXVsdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZXNMaXN0Ci0gICAgICogICAgICAgICAgICBsaXN0IG9mIHR5cGVzIHRvIGFkZCB0byB0aGUgcmVwb3NpdG9yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBjcmVhdGVDbWlzRGVmYXVsdFR5cGVzCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgaWYgQ01JUyBiYXNlIHR5cGVzIHNob3VsZCBiZSBhZGRlZCB0byBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdFR5cGVTeXN0ZW0oTGlzdDxUeXBlRGVmaW5pdGlvbj4gdHlwZXNMaXN0LCBib29sZWFuIGNyZWF0ZUNtaXNEZWZhdWx0VHlwZXMpIHsKLQotICAgICAgICBpZiAoY3JlYXRlQ21pc0RlZmF1bHRUeXBlcykgewotICAgICAgICAgICAgY3JlYXRlQ21pc0RlZmF1bHRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWVyZ2UgYWxsIHR5cGVzIGZyb20gdGhlIGxpc3QgYW5kIGJ1aWxkIHRoZSBjb3JyZWN0IGhpZXJhY2h5IHdpdGgKLSAgICAgICAgLy8gY2hpbGRyZW4gYW5kIHByb3BlcnR5IGxpc3RzCi0gICAgICAgIGlmIChudWxsICE9IHR5cGVzTGlzdCkgewotICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0eXBlRGVmIDogdHlwZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgYWRkVHlwZURlZmluaXRpb24odHlwZURlZiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUKLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlR5cGVNYW5hZ2VyQ3JlYXRhYmxlCi0gICAgICogI2FkZFR5cGVEZWZpbml0aW9uKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuCi0gICAgICogVHlwZURlZmluaXRpb24sIGJvb2xlYW4pCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gY21pc1R5cGUsIGJvb2xlYW4gYWRkSW5oZXJpdGVkUHJvcGVydGllcykgewotCi0gICAgICAgIExPRy5pbmZvKCJBZGRpbmcgdHlwZSBkZWZpbml0aW9uIHdpdGggbmFtZSAiICsgY21pc1R5cGUuZ2V0TG9jYWxOYW1lKCkgKyAiIGFuZCBpZCAiICsgY21pc1R5cGUuZ2V0SWQoKQotICAgICAgICAgICAgICAgICsgIiB0byByZXBvc2l0b3J5LiIpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgdHlwZUNvbnRhaW5lciA9IG5ldyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwoY21pc1R5cGUpOwotCi0gICAgICAgIGlmIChudWxsICE9IGNtaXNUeXBlLmdldFBhcmVudFR5cGVJZCgpKSB7Ci0gICAgICAgICAgICAvLyBhZGQgbmV3IHR5cGUgdG8gY2hpbGRyZW4gb2YgcGFyZW50IHR5cGVzCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBwYXJlbnRUeXBlQ29udGFpbmVyID0gZlR5cGVzTWFwLmdldChjbWlzVHlwZS5nZXRQYXJlbnRUeXBlSWQoKSk7Ci0gICAgICAgICAgICBwYXJlbnRUeXBlQ29udGFpbmVyLmdldENoaWxkcmVuKCkuYWRkKHR5cGVDb250YWluZXIpOwotCi0gICAgICAgICAgICBpZiAoYWRkSW5oZXJpdGVkUHJvcGVydGllcykgewotICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGFkZCBpbmhlcml0ZWQgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcERlZnMgPSB0eXBlQ29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgYWRkSW5oZXJpdGVkUHJvcGVydGllcyhwcm9wRGVmcywgcGFyZW50VHlwZUNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBhZGQgdHlwZSB0byB0eXBlIG1hcAotICAgICAgICBmVHlwZXNNYXAucHV0KGNtaXNUeXBlLmdldElkKCksIHR5cGVDb250YWluZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUKLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlR5cGVNYW5hZ2VyQ3JlYXRhYmxlCi0gICAgICogI3VwZGF0ZVR5cGVEZWZpbml0aW9uKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuCi0gICAgICogVHlwZURlZmluaXRpb24pCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oInVwZGF0aW5nIGEgdHlwZSBkZWZpbml0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuVHlwZU1hbmFnZXJDcmVhdGFibGUKLSAgICAgKiAjZGVsZXRlVHlwZURlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZUlkKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWYgPSBmVHlwZXNNYXAucmVtb3ZlKHR5cGVJZCk7Ci0gICAgICAgIC8vIHJlbW92ZSB0eXBlIGZyb20gY2hpbGRyZW4gb2YgcGFyZW50IHR5cGVzCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHBhcmVudFR5cGVDb250YWluZXIgPSBmVHlwZXNNYXAuZ2V0KHR5cGVEZWYuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRQYXJlbnRUeXBlSWQoKSk7Ci0gICAgICAgIHBhcmVudFR5cGVDb250YWluZXIuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUodHlwZURlZik7Ci0gICAgICAgIGZUeXBlc01hcC5yZW1vdmUodHlwZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYWxsIHR5cGVzIGZyb20gdGhlIHR5cGUgc3lzdGVtLiBBZnRlciB0aGlzIGNhbGwgb25seSB0aGUgZGVmYXVsdAotICAgICAqIENNSVMgdHlwZXMgYXJlIHByZXNlbnQgaW4gdGhlIHR5cGUgc3lzdGVtLiBVc2UgdGhpcyBtZXRob2Qgd2l0aCBjYXJlLCBpdHMKLSAgICAgKiBtYWlubHkgaW50ZW5kZWQgZm9yIHVuaXQgdGVzdHMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJUeXBlU3lzdGVtKCkgewotICAgICAgICBmVHlwZXNNYXAuY2xlYXIoKTsKLSAgICAgICAgY3JlYXRlQ21pc0RlZmF1bHRUeXBlcygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUKLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlTWFuYWdlciNnZXRQcm9wZXJ0eUlkRm9yUXVlcnlOYW1lCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb24sCi0gICAgICogamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5SWRGb3JRdWVyeU5hbWUoVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24sIFN0cmluZyBwcm9wUXVlcnlOYW1lKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkIDogdHlwZURlZmluaXRpb24uZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAocGQuZ2V0UXVlcnlOYW1lKCkuZXF1YWxzKHByb3BRdWVyeU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBkLmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEluaGVyaXRlZFByb3BlcnRpZXMoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmcywgVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pIHsKLQotICAgICAgICBpZiAobnVsbCA9PSB0eXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gdHlwZURlZmluaXRpb24uZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpKSB7Ci0gICAgICAgICAgICBhZGRJbmhlcml0ZWRQcm9wZXJ0eURlZmluaXRpb25zKHByb3BEZWZzLCB0eXBlRGVmaW5pdGlvbi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgcGFyZW50VHlwZUNvbnRhaW5lciA9IGZUeXBlc01hcC5nZXQodHlwZURlZmluaXRpb24uZ2V0UGFyZW50VHlwZUlkKCkpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiBwYXJlbnRUeXBlID0gKG51bGwgPT0gcGFyZW50VHlwZUNvbnRhaW5lciA/IG51bGwgOiBwYXJlbnRUeXBlQ29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgICBhZGRJbmhlcml0ZWRQcm9wZXJ0aWVzKHByb3BEZWZzLCBwYXJlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEluaGVyaXRlZFByb3BlcnR5RGVmaW5pdGlvbnMoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gc3VwZXJQcm9wRGVmcykgewotCi0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHN1cGVyUHJvcCA6IHN1cGVyUHJvcERlZnMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHN1cGVyUHJvcERlZiA9IHN1cGVyUHJvcC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IGNsb25lID0gY2xvbmVQcm9wZXJ0eURlZmluaXRpb24oc3VwZXJQcm9wRGVmKTsKLSAgICAgICAgICAgICgoQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248Pz4pIGNsb25lKS5zZXRJc0luaGVyaXRlZCh0cnVlKTsKLSAgICAgICAgICAgIHByb3BEZWZzLnB1dChzdXBlclByb3AuZ2V0S2V5KCksIGNsb25lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDbWlzRGVmYXVsdFR5cGVzKCkgewotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiB0eXBlc0xpc3QgPSBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5jcmVhdGVEZWZhdWx0VHlwZXMoKTsKLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0eXBlRGVmIDogdHlwZXNMaXN0KSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgdHlwZUNvbnRhaW5lciA9IG5ldyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwodHlwZURlZik7Ci0gICAgICAgICAgICBmVHlwZXNNYXAucHV0KHR5cGVEZWYuZ2V0SWQoKSwgdHlwZUNvbnRhaW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUm9vdFR5cGUoVHlwZURlZmluaXRpb25Db250YWluZXIgYykgewotICAgICAgICByZXR1cm4gKGMuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRJZCgpLmVxdWFscyhjLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0QmFzZVR5cGVJZCgpLnZhbHVlKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eURlZmluaXRpb248Pz4gY2xvbmVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlEZWZpbml0aW9uPD8+IHNyYykgewotICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gY2xvbmUgPSBUeXBlVXRpbC5jbG9uZVByb3BlcnR5RGVmaW5pdGlvbihzcmMpOwotICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9UeXBlVmFsaWRhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9UeXBlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MzVkZTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVHlwZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlVVSUQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Gb2xkZXJUeXBlRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5JdGVtVHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUG9saWN5VHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlNlY29uZGFyeVR5cGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RUeXBlRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xFbnRyeUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkZvbGRlclR5cGVEZWZpbml0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkl0ZW1UeXBlRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lUeXBlRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5TZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlTXV0YWJpbGl0eUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlR5cGVVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5UeXBlTWFuYWdlcjsNCi0NCi0vKioNCi0gKiBBIGhlbHBlciBjbGFzcyBkb2luZyBzb21lIGNvbnNpc3RlbmN5IGNoZWNrcyB3aGVuIG5ldyB0eXBlIGRlZmluaXRpb25zIGFyZQ0KLSAqIGFkZGVkIHRvIHRoZSBzeXN0ZW0uDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIFR5cGVWYWxpZGF0b3Igew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgQ01JU19VU0VSID0gImNtaXM6dXNlciI7DQotDQotICAgIHByaXZhdGUgVHlwZVZhbGlkYXRvcigpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tUeXBlKFR5cGVNYW5hZ2VyIHRtLCBUeXBlRGVmaW5pdGlvbiB0ZCkgew0KLQ0KLSAgICAgICAgaWYgKG51bGwgPT0gdGQpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGFkZCB0eXBlLCBiZWNhdXNlIHRoZSB0eXBlIGRlZmludGlvbiBpcyBudWxsLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG51bGwgPT0gdG0uZ2V0VHlwZUJ5SWQodGQuZ2V0UGFyZW50VHlwZUlkKCkpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBhZGQgdHlwZSwgYmVjYXVzZSBwYXJlbnQgd2l0aCBpZCAiICsgdGQuZ2V0UGFyZW50VHlwZUlkKCkNCi0gICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdC4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChudWxsICE9IHRtLmdldFR5cGVCeUlkKHRkLmdldElkKCkpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBhZGQgdHlwZSwgYmVjYXVzZSB0eXBlIHdpdGggaWQgIiArIHRkLmdldElkKCkNCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbHJlYWR5IGV4aXN0cy4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNoZWNrVHlwZUlkKHRtLCB0ZC5nZXRJZCgpKTsNCi0gICAgICAgIGNoZWNrVHlwZVF1ZXJ5TmFtZSh0bSwgdGQuZ2V0UXVlcnlOYW1lKCkpOw0KLSAgICAgICAgY2hlY2tUeXBlTG9jYWxOYW1lKHRtLCB0ZC5nZXRMb2NhbE5hbWUoKSk7DQotICAgICAgICBjaGVja0Jhc2VBbmRQYXJlbnRUeXBlKHRkKTsNCi0NCi0gICAgICAgIGlmIChudWxsICE9IHRkLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSkgew0KLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IuY2hlY2tQcm9wZXJ0aWVzKHRtLCB0ZC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RUeXBlRGVmaW5pdGlvbiBjb21wbGV0ZVR5cGUoVHlwZURlZmluaXRpb24gdHlwZSkgew0KLSAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlVHlwZURvYygoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZSk7DQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBGb2xkZXJUeXBlRGVmaW5pdGlvbikgew0KLSAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZVR5cGVGb2xkZXIoKEZvbGRlclR5cGVEZWZpbml0aW9uKSB0eXBlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFBvbGljeVR5cGVEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlVHlwZVBvbGljeSgoUG9saWN5VHlwZURlZmluaXRpb24pIHR5cGUpOw0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSXRlbVR5cGVEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlVHlwZUl0ZW0oKEl0ZW1UeXBlRGVmaW5pdGlvbikgdHlwZSk7DQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbikgew0KLSAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZVR5cGVSZWxhdGlvbnNoaXAoKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSB0eXBlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFNlY29uZGFyeVR5cGVEZWZpbml0aW9uKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlVHlwZVNlY29uZGFyeSgoU2Vjb25kYXJ5VHlwZURlZmluaXRpb24pIHR5cGUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRqdXN0VHlwZU5hbWVzQW5kSWQoQWJzdHJhY3RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmKSB7DQotICAgICAgICBpZiAobnVsbCA9PSB0eXBlRGVmLmdldElkKCkpIHsNCi0gICAgICAgICAgICB0eXBlRGVmLnNldElkKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZElkKHR5cGVEZWYuZ2V0SWQoKSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGlsbGVnYWwgY2hhcmFjdGVycyBhZGp1c3QgdGhlbQ0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV3SWQgPSByZXBsYWNlSW52YWxpZENoYXJhY3RlcnModHlwZURlZi5nZXRJZCgpKTsNCi0gICAgICAgICAgICAgICAgdHlwZURlZi5zZXRJZChuZXdJZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWRRdWVyeU5hbWUodHlwZURlZi5nZXRRdWVyeU5hbWUoKSkpIHsNCi0gICAgICAgICAgICB0eXBlRGVmLnNldFF1ZXJ5TmFtZSh0eXBlRGVmLmdldElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWRMb2NhbE5hbWUodHlwZURlZi5nZXRMb2NhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICB0eXBlRGVmLnNldExvY2FsTmFtZSh0eXBlRGVmLmdldElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29tcGxldGVBYnN0cmFjdFR5cGVEZWZpbml0aW9uKEFic3RyYWN0VHlwZURlZmluaXRpb24gdGQpIHsNCi0gICAgICAgIGlmICh0ZC5pc0NvbnRyb2xsYWJsZUFjbCgpID09IG51bGwpIHsNCi0gICAgICAgICAgICB0ZC5zZXRJc0NvbnRyb2xsYWJsZUFjbCh0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh0ZC5pc0NvbnRyb2xsYWJsZVBvbGljeSgpID09IG51bGwpIHsNCi0gICAgICAgICAgICB0ZC5zZXRJc0NvbnRyb2xsYWJsZVBvbGljeShmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAodGQuaXNDcmVhdGFibGUoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGQuc2V0SXNDcmVhdGFibGUodHJ1ZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAodGQuaXNGaWxlYWJsZSgpID09IG51bGwpIHsNCi0gICAgICAgICAgICB0ZC5zZXRJc0ZpbGVhYmxlKHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGQuc2V0SXNGdWxsdGV4dEluZGV4ZWQoZmFsc2UpOw0KLSAgICAgICAgdGQuc2V0SXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoZmFsc2UpOw0KLSAgICAgICAgaWYgKHRkLmlzUXVlcnlhYmxlKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRkLnNldElzUXVlcnlhYmxlKHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGQuc2V0UGFyZW50VHlwZUlkKHRkLmdldFBhcmVudFR5cGVJZCgpKTsNCi0gICAgICAgIFR5cGVNdXRhYmlsaXR5SW1wbCB0bSA9IG5ldyBUeXBlTXV0YWJpbGl0eUltcGwoKTsNCi0gICAgICAgIHRtLnNldENhbkNyZWF0ZSh0cnVlKTsNCi0gICAgICAgIHRtLnNldENhbkRlbGV0ZSh0cnVlKTsNCi0gICAgICAgIHRtLnNldENhblVwZGF0ZSh0cnVlKTsNCi0gICAgICAgIHRkLnNldFR5cGVNdXRhYmlsaXR5KHRtKTsNCi0gICAgICAgIHRkLnNldEV4dGVuc2lvbnModGQuZ2V0RXh0ZW5zaW9ucygpKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcERlZnNOZXcgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4oKTsNCi0gICAgICAgIGlmIChudWxsICE9IHRkLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSkgew0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcERlZnMgPSB0ZC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7DQotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcGQgOiBwcm9wRGVmcy52YWx1ZXMoKSkgew0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZE5ldyA9IGNvbXBsZXRlUHJvcGVydHlEZWYocGQpOw0KLSAgICAgICAgICAgICAgICBhZGp1c3RQcm9wZXJ0eU5hbWVzQW5kSWQocGROZXcpOw0KLSAgICAgICAgICAgICAgICBwcm9wRGVmc05ldy5wdXQocGROZXcuZ2V0SWQoKSwgcGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHRkLnNldFByb3BlcnR5RGVmaW5pdGlvbnMocHJvcERlZnNOZXcpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQcm9wZXJ0aWVzKFR5cGVNYW5hZ2VyIHRtLCBDb2xsZWN0aW9uPFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcGRzKSB7DQotDQotICAgICAgICBDb2xsZWN0aW9uPFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0ZGwgPSB0bS5nZXRUeXBlRGVmaW5pdGlvbkxpc3QoKTsNCi0gICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkMiA6IHBkcykgew0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlkIHN5bnRheA0KLSAgICAgICAgICAgIGlmIChudWxsID09IHBkMi5nZXRJZCgpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJwcm9wZXJ0eSBpZCBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWRJZChwZDIuZ2V0SWQoKSkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oTmFtZVZhbGlkYXRvci5FUlJPUl9JTExFR0FMX05BTUUpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBjaGVjayBxdWVyeSBuYW1lIHN5bnRheA0KLSAgICAgICAgICAgIGlmIChudWxsID09IHBkMi5nZXRRdWVyeU5hbWUoKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigicHJvcGVydHkgcXVlcnkgbmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWRRdWVyeU5hbWUocGQyLmdldFF1ZXJ5TmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihOYW1lVmFsaWRhdG9yLkVSUk9SX0lMTEVHQUxfTkFNRSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIGNoZWNrIGxvY2FsIG5hbWUgc3ludGF4DQotICAgICAgICAgICAgaWYgKG51bGwgPT0gcGQyLmdldExvY2FsTmFtZSgpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJwcm9wZXJ0eSBsb2NhbCBuYW1lIGNhbm5vdCBiZSBudWxsLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZExvY2FsTmFtZShwZDIuZ2V0TG9jYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKE5hbWVWYWxpZGF0b3IuRVJST1JfSUxMRUdBTF9OQU1FKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0ZGMgOiB0ZGwpIHsNCi0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdGQgPSB0ZGMuZ2V0VHlwZURlZmluaXRpb24oKTsNCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdGQuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZDEgOiB0ZC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpZCBpcyB1c2VkDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkMS5nZXRJZCgpLmVxdWFscyhwZDIuZ2V0SWQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQcm9wZXJ0eSBpZCAiICsgcGQyLmdldElkKCkgKyAiIGFscmVhZHkgaW4gdXNlIGluIHR5cGUgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGQuZ2V0SWQoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHF1ZXJ5IG5hbWUgaXMgdXNlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZDEuZ2V0UXVlcnlOYW1lKCkuZXF1YWxzKHBkMi5nZXRRdWVyeU5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQcm9wZXJ0eSBxdWVyeSBuYW1lICIgKyBwZDIuZ2V0UXVlcnlOYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWxyZWFkeSBpbiB1c2UgaW4gdHlwZSAiICsgdGQuZ2V0UXVlcnlOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBsb2NhbCBuYW1lIGlzIHVzZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQxLmdldExvY2FsTmFtZSgpLmVxdWFscyhwZDIuZ2V0TG9jYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgbG9jYWwgbmFtZSAiICsgcGQyLmdldExvY2FsTmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFscmVhZHkgaW4gdXNlIGluIHR5cGUgIiArIHRkLmdldElkKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkanVzdFByb3BlcnR5TmFtZXNBbmRJZChBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmKSB7DQotICAgICAgICBpZiAobnVsbCA9PSBwcm9wRGVmLmdldElkKCkpIHsNCi0gICAgICAgICAgICBwcm9wRGVmLnNldElkKFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZElkKHByb3BEZWYuZ2V0SWQoKSkpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0lkID0gcmVwbGFjZUludmFsaWRDaGFyYWN0ZXJzKHByb3BEZWYuZ2V0SWQoKSk7DQotICAgICAgICAgICAgICAgIHByb3BEZWYuc2V0SWQobmV3SWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkUXVlcnlOYW1lKHByb3BEZWYuZ2V0UXVlcnlOYW1lKCkpKSB7DQotICAgICAgICAgICAgcHJvcERlZi5zZXRRdWVyeU5hbWUocHJvcERlZi5nZXRJZCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkTG9jYWxOYW1lKHByb3BEZWYuZ2V0TG9jYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgcHJvcERlZi5zZXRMb2NhbE5hbWUocHJvcERlZi5nZXRJZCgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUludmFsaWRDaGFyYWN0ZXJzKFN0cmluZyBpZCkgew0KLSAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGlsbGVnYWwgY2hhcmFjdGVycyBhZGp1c3QgdGhlbQ0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkLmxlbmd0aCgpOyBpKyspIHsNCi0gICAgICAgICAgICBpZiAoTmFtZVZhbGlkYXRvci5pc1ZhbGlkSWQoaWQuc3Vic3RyaW5nKGksIGkgKyAxKSkpIHsNCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGlkLmNoYXJBdChpKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdfJyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgY29tcGxldGVUeXBlRG9jKERvY3VtZW50VHlwZURlZmluaXRpb24gdHlwZSkgew0KLSAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgdGQgPSBUeXBlVXRpbC5jbG9uZVR5cGVEb2ModHlwZSk7DQotICAgICAgICBjb21wbGV0ZUFic3RyYWN0VHlwZURlZmluaXRpb24odGQpOw0KLSAgICAgICAgdGQuc2V0SXNWZXJzaW9uYWJsZSh0eXBlLmlzVmVyc2lvbmFibGUoKSk7DQotICAgICAgICB0ZC5zZXRDb250ZW50U3RyZWFtQWxsb3dlZCh0eXBlLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkpOw0KLSAgICAgICAgaWYgKHRkLmlzVmVyc2lvbmFibGUoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGQuc2V0SXNWZXJzaW9uYWJsZShmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAodGQuZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGQuc2V0Q29udGVudFN0cmVhbUFsbG93ZWQoQ29udGVudFN0cmVhbUFsbG93ZWQuQUxMT1dFRCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRm9sZGVyVHlwZURlZmluaXRpb25JbXBsIGNvbXBsZXRlVHlwZUZvbGRlcihGb2xkZXJUeXBlRGVmaW5pdGlvbiB0eXBlKSB7DQotICAgICAgICBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwgdGQgPSBUeXBlVXRpbC5jbG9uZVR5cGVGb2xkZXIodHlwZSk7DQotICAgICAgICBjb21wbGV0ZUFic3RyYWN0VHlwZURlZmluaXRpb24odGQpOw0KLSAgICAgICAgcmV0dXJuIHRkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCBjb21wbGV0ZVR5cGVSZWxhdGlvbnNoaXAoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gdHlwZSkgew0KLSAgICAgICAgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsIHRkID0gVHlwZVV0aWwuY2xvbmVUeXBlUmVsYXRpb25zaGlwKHR5cGUpOw0KLSAgICAgICAgY29tcGxldGVBYnN0cmFjdFR5cGVEZWZpbml0aW9uKHRkKTsNCi0gICAgICAgIHRkLnNldEFsbG93ZWRTb3VyY2VUeXBlcyh0eXBlLmdldEFsbG93ZWRTb3VyY2VUeXBlSWRzKCkpOw0KLSAgICAgICAgdGQuc2V0QWxsb3dlZFRhcmdldFR5cGVzKHR5cGUuZ2V0QWxsb3dlZFRhcmdldFR5cGVJZHMoKSk7DQotICAgICAgICByZXR1cm4gdGQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCBjb21wbGV0ZVR5cGVJdGVtKEl0ZW1UeXBlRGVmaW5pdGlvbiB0eXBlKSB7DQotICAgICAgICBJdGVtVHlwZURlZmluaXRpb25JbXBsIHRkID0gVHlwZVV0aWwuY2xvbmVUeXBlSXRlbSh0eXBlKTsNCi0gICAgICAgIHRkLmluaXRpYWxpemUodHlwZSk7DQotICAgICAgICBjb21wbGV0ZUFic3RyYWN0VHlwZURlZmluaXRpb24odGQpOw0KLSAgICAgICAgcmV0dXJuIHRkOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbCBjb21wbGV0ZVR5cGVTZWNvbmRhcnkoU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gdHlwZSkgew0KLSAgICAgICAgU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsIHRkID0gVHlwZVV0aWwuY2xvbmVUeXBlU2Vjb25kYXJ5KHR5cGUpOw0KLSAgICAgICAgY29tcGxldGVBYnN0cmFjdFR5cGVEZWZpbml0aW9uKHRkKTsNCi0gICAgICAgIHJldHVybiB0ZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBQb2xpY3lUeXBlRGVmaW5pdGlvbkltcGwgY29tcGxldGVUeXBlUG9saWN5KFBvbGljeVR5cGVEZWZpbml0aW9uIHR5cGUpIHsNCi0gICAgICAgIFBvbGljeVR5cGVEZWZpbml0aW9uSW1wbCB0ZCA9IFR5cGVVdGlsLmNsb25lVHlwZVBvbGljeSh0eXBlKTsNCi0gICAgICAgIGNvbXBsZXRlQWJzdHJhY3RUeXBlRGVmaW5pdGlvbih0ZCk7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvLyBXaGVuIGNyZWF0aW5nIHR5cGVzIFByb3BlcnR5RGVmaW5pdGlvbnMgbWF5IG9ubHkgYmUgcGFydGlhbGx5IGZpbGxlZCwNCi0gICAgLy8gZmlsbCBhbGwgZmllbGRzDQotICAgIC8vIHRvIG1ha2UgYSBjb21wbGV0ZSBkZWZpbml0aW9uDQotICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IGNvbXBsZXRlUHJvcGVydHlEZWYoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkU3JjKSB7DQotICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiBuZXdQcm9wRGVmID0gVHlwZVV0aWwuY2xvbmVQcm9wZXJ0eURlZmluaXRpb24ocGRTcmMpOw0KLQ0KLSAgICAgICAgaWYgKG51bGwgPT0gbmV3UHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgcGRTcmMuZ2V0SWQoKSArICJoYXMgbm8gcHJvcGVydHkgdHlwZS4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChudWxsID09IG5ld1Byb3BEZWYuZ2V0SWQoKSkgew0KLSAgICAgICAgICAgIG5ld1Byb3BEZWYuc2V0SWQoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobnVsbCA9PSBuZXdQcm9wRGVmLmdldFF1ZXJ5TmFtZSgpKSB7DQotICAgICAgICAgICAgbmV3UHJvcERlZi5zZXRRdWVyeU5hbWUocGRTcmMuZ2V0SWQoKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobnVsbCA9PSBuZXdQcm9wRGVmLmdldExvY2FsTmFtZSgpKSB7DQotICAgICAgICAgICAgbmV3UHJvcERlZi5zZXRMb2NhbE5hbWUocGRTcmMuZ2V0SWQoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobnVsbCA9PSBuZXdQcm9wRGVmLmdldENhcmRpbmFsaXR5KCkpIHsNCi0gICAgICAgICAgICBuZXdQcm9wRGVmLnNldENhcmRpbmFsaXR5KENhcmRpbmFsaXR5LlNJTkdMRSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAobnVsbCA9PSBuZXdQcm9wRGVmLmlzT3JkZXJhYmxlKCkpIHsNCi0gICAgICAgICAgICBuZXdQcm9wRGVmLnNldElzT3JkZXJhYmxlKHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG51bGwgPT0gbmV3UHJvcERlZi5pc1F1ZXJ5YWJsZSgpKSB7DQotICAgICAgICAgICAgbmV3UHJvcERlZi5zZXRJc1F1ZXJ5YWJsZSh0cnVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChudWxsID09IG5ld1Byb3BEZWYuaXNSZXF1aXJlZCgpKSB7DQotICAgICAgICAgICAgbmV3UHJvcERlZi5zZXRJc1JlcXVpcmVkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChudWxsID09IG5ld1Byb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkpIHsNCi0gICAgICAgICAgICBuZXdQcm9wRGVmLnNldFVwZGF0YWJpbGl0eShVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXdQcm9wRGVmOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgQWNsIGV4cGFuZEFjbE1ha3JvcyhTdHJpbmcgdXNlciwgQWNsIGFjbCkgew0KLSAgICAgICAgYm9vbGVhbiBtdXN0Q29weSA9IGZhbHNlOw0KLQ0KLSAgICAgICAgaWYgKHVzZXIgPT0gbnVsbCB8fCBhY2wgPT0gbnVsbCB8fCBhY2wuZ2V0QWNlcygpID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYWNsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChBY2UgYWNlIDogYWNsLmdldEFjZXMoKSkgew0KLSAgICAgICAgICAgIFN0cmluZyBwcmluY2lwYWwgPSBhY2UuZ2V0UHJpbmNpcGFsSWQoKTsNCi0gICAgICAgICAgICBpZiAocHJpbmNpcGFsICE9IG51bGwgJiYgcHJpbmNpcGFsLmVxdWFscyhDTUlTX1VTRVIpKSB7DQotICAgICAgICAgICAgICAgIG11c3RDb3B5ID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobXVzdENvcHkpIHsNCi0gICAgICAgICAgICBBY2Nlc3NDb250cm9sTGlzdEltcGwgcmVzdWx0ID0gbmV3IEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCgpOw0KLSAgICAgICAgICAgIExpc3Q8QWNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxBY2U+KGFjbC5nZXRBY2VzKCkuc2l6ZSgpKTsNCi0gICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiBhY2wuZ2V0QWNlcygpKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBwcmluY2lwYWwgPSBhY2UuZ2V0UHJpbmNpcGFsSWQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHByaW5jaXBhbCAhPSBudWxsICYmIHByaW5jaXBhbC5lcXVhbHMoQ01JU19VU0VSKSkgew0KLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbEVudHJ5SW1wbCBhY2UyID0gbmV3IEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwoKTsNCi0gICAgICAgICAgICAgICAgICAgIGFjZTIuc2V0UGVybWlzc2lvbnMoYWNlLmdldFBlcm1pc3Npb25zKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYWNlMi5zZXRFeHRlbnNpb25zKGFjZS5nZXRFeHRlbnNpb25zKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYWNlMi5zZXRQcmluY2lwYWwobmV3IEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbCh1c2VyKSk7DQotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChhY2UyKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGFjZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0LnNldEFjZXMobGlzdCk7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIGFjbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVHlwZUlkKFR5cGVNYW5hZ2VyIHRtLCBTdHJpbmcgdHlwZUlkKSB7DQotDQotICAgICAgICBpZiAobnVsbCA9PSB0eXBlSWQpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBpZCBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGNoZWNrIG5hbWUgc3ludGF4DQotICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZElkKHR5cGVJZCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihOYW1lVmFsaWRhdG9yLkVSUk9SX0lMTEVHQUxfSUQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG51bGwgIT0gdG0uZ2V0VHlwZUJ5SWQodHlwZUlkKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJZb3UgY2Fubm90IGFkZCB0eXBlIHdpdGggaWQgIiArIHR5cGVJZA0KLSAgICAgICAgICAgICAgICAgICAgKyAiIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1R5cGVRdWVyeU5hbWUoVHlwZU1hbmFnZXIgdG0sIFN0cmluZyBxdWVyeU5hbWUpIHsNCi0NCi0gICAgICAgIGlmIChudWxsID09IHF1ZXJ5TmFtZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJRdWVyeSBuYW1lIGNhbm5vdCBiZSBudWxsLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWRRdWVyeU5hbWUocXVlcnlOYW1lKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKE5hbWVWYWxpZGF0b3IuRVJST1JfSUxMRUdBTF9OQU1FKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGNoZWNrIHNldCBxdWVyeSBuYW1lIGlzIHVuaXF1ZSBpbiB0aGUgdHlwZSBzeXN0ZW0NCi0gICAgICAgIGlmIChudWxsICE9IHRtLmdldFR5cGVCeVF1ZXJ5TmFtZShxdWVyeU5hbWUpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIllvdSBjYW5ub3QgYWRkIHR5cGUgd2l0aCBxdWVyeSBuYW1lICIgKyBxdWVyeU5hbWUNCi0gICAgICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tUeXBlTG9jYWxOYW1lKFR5cGVNYW5hZ2VyIHRtLCBTdHJpbmcgbG9jYWxOYW1lKSB7DQotDQotICAgICAgICBpZiAobnVsbCA9PSBsb2NhbE5hbWUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTG9jYWwgbmFtZSBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkTG9jYWxOYW1lKGxvY2FsTmFtZSkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihOYW1lVmFsaWRhdG9yLkVSUk9SX0lMTEVHQUxfTkFNRSk7DQotICAgICAgICB9DQotDQotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHRkYyA6IHRtLmdldFR5cGVEZWZpbml0aW9uTGlzdCgpKSB7DQotICAgICAgICAgICAgaWYgKHRkYy5nZXRUeXBlRGVmaW5pdGlvbigpLmdldExvY2FsTmFtZSgpLmVxdWFscyhsb2NhbE5hbWUpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiWW91IGNhbm5vdCBhZGQgdHlwZSB3aXRoIGxvY2FsIG5hbWUgIiArIGxvY2FsTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQmFzZUFuZFBhcmVudFR5cGUoVHlwZURlZmluaXRpb24gdGQpIHsNCi0gICAgICAgIGlmIChudWxsID09IHRkLmdldEJhc2VUeXBlSWQoKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJZb3UgY2Fubm90IGNyZWF0ZSBhIHR5cGUgd2l0aG91dCBhIGJhc2UgdHlwZSBpZDogIiArIHRkLmdldElkKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG51bGwgPT0gdGQuZ2V0UGFyZW50VHlwZUlkKCkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiWW91IGNhbm5vdCBjcmVhdGUgYSB0eXBlIHdpdGhvdXQgYSBwYXJlbnQgdHlwZSBpZDogIiArIHRkLmdldElkKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L0luTWVtb3J5UXVlcnlQcm9jZXNzb3IuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L0luTWVtb3J5UXVlcnlQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlNjYzOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9Jbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKZW5zIEh1ZWJlbAotICogICAgIEZsb3JlbnQgR3VpbGxhdW1lLCBOdXhlbwotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnF1ZXJ5OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Eb2N1bWVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5GaWxpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5PYmplY3RTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlZE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlZlcnNpb25lZERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsLkNvbnRlbnRTdHJlYW1EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbC5PYmplY3RTdG9yZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuUHJvcGVydHlDcmVhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5UeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5BYnN0cmFjdFByZWRpY2F0ZVdhbGtlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUXVlcnlXYWxrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1NlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNvbHVtblJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5RdWVyeU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5RdWVyeU9iamVjdC5Kb2luU3BlYzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5RdWVyeU9iamVjdC5Tb3J0U3BlYzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5RdWVyeVV0aWxTdHJpY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIEEgcHJvY2Vzc29yIGZvciBhIENNSVMgcXVlcnkgZm9yIHRoZSBJbi1NZW1vcnkgc2VydmVyLiBEdXJpbmcgdHJlZSB0cmF2ZXJzYWwKLSAqIGNvbmRpdGlvbnMgYXJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIGNlbnRyYWwgaGFzaCBtYXAKLSAqIHdpdGggYWxsIG9iamVjdHMuIEluIGEgZmlyc3QgcGFzcyBvbmUgdGltZSBzZXR1cCBpcyBwZXJmb3JtZWQsIGluIGEgY3VzdG9tCi0gKiB3YWxrIGFjcm9zcyB0aGUgcXVlcnkgZXhwcmVzc2lvbiB0cmVlIGFuIG9iamVjdCBpcyBjaGVja2VkIGlmIGl0IG1hdGNoZXMuIEluCi0gKiBjYXNlIG9mIGEgbWF0Y2ggaXQgaXMgYXBwZW5kZWQgdG8gYSBsaXN0IG9mIG1hdGNoaW5nIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yLmNsYXNzKTsKLQotICAgIHByaXZhdGUgTGlzdDxTdG9yZWRPYmplY3Q+IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0PFN0b3JlZE9iamVjdD4oKTsKLSAgICBwcml2YXRlIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqOwotICAgIHByaXZhdGUgVHJlZSB3aGVyZVRyZWU7Ci0gICAgcHJpdmF0ZSBPYmplY3RTdG9yZUltcGwgb2JqU3RvcmU7Ci0gICAgcHJpdmF0ZSBMaXN0PFR5cGVEZWZpbml0aW9uPiBzZWNvbmRhcnlUeXBlSWRzOwotCi0gICAgcHVibGljIEluTWVtb3J5UXVlcnlQcm9jZXNzb3IoT2JqZWN0U3RvcmVJbXBsIG9ialN0b3JlKSB7Ci0gICAgICAgIHRoaXMub2JqU3RvcmUgPSBvYmpTdG9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWluIGVudHJ5IGZ1bmN0aW9uIHRvIHByb2Nlc3MgYSBxdWVyeSBmcm9tIGRpc2NvdmVyeSBzZXJ2aWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0bQotICAgICAqICAgICAgICAgICAgdHlwZSBtYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RTdG9yZQotICAgICAqICAgICAgICAgICAgb2JqZWN0IHN0b3JlIHRvIGdldHMgb2JqZWN0IGZyb20KLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdXNlciBleGVjdWluZyB0aGUgcXVlcnkKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHN0YXRlbWVudAotICAgICAqICAgICAgICAgICAgcXVlcnkgc3RhdGVtZW50Ci0gICAgICogQHBhcmFtIHNlYXJjaEFsbFZlcnNpb25zCi0gICAgICogICAgICAgICAgICBzZWFyY2ggaW4gYWxsIHZlcnNpb25zIG9mIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGUgYWxsb3dhYmxlIGFjdGlvbnMKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGUgcmVsYXRpb25zaGlwcwotICAgICAqIEBwYXJhbSByZW5kaXRpb25GaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGUgcmVuZGl0aW9ucwotICAgICAqIEBwYXJhbSBtYXhJdGVtcwotICAgICAqICAgICAgICAgICAgbWF4IG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogICAgICAgICAgICBpdGVtcyB0byBza2lwCi0gICAgICogQHJldHVybiBsaXN0IG9mIG9iamVjdHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoVHlwZU1hbmFnZXIgdG0sIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlLCBTdHJpbmcgdXNlciwgU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIFN0cmluZyBzdGF0ZW1lbnQsIEJvb2xlYW4gc2VhcmNoQWxsVmVyc2lvbnMsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQmlnSW50ZWdlciBtYXhJdGVtcywgCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIHNraXBDb3VudCkgewotCi0gICAgICAgIHByb2Nlc3NRdWVyeUFuZENhdGNoRXhjKHN0YXRlbWVudCwgdG0pOyAvLyBjYWxscyBxdWVyeSBwcm9jZXNzb3IKLQotICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIHRoZSBvYmplY3RzIGFuZCBjaGVjayBmb3IgZWFjaCBpZiB0aGUgcXVlcnkgbWF0Y2hlcwotICAgICAgICBmb3IgKFN0cmluZyBvYmplY3RJZCA6ICgoT2JqZWN0U3RvcmVJbXBsKSBvYmplY3RTdG9yZSkuZ2V0SWRzKCkpIHsKLSAgICAgICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IG9iamVjdFN0b3JlLmdldE9iamVjdEJ5SWQob2JqZWN0SWQpOwotICAgICAgICAgICAgbWF0Y2goc28sIHVzZXIsIHNlYXJjaEFsbFZlcnNpb25zID09IG51bGwgPyB0cnVlIDogc2VhcmNoQWxsVmVyc2lvbnMuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0TGlzdCBvYmpMaXN0ID0gYnVpbGRSZXN1bHRMaXN0KHRtLCB1c2VyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgICAgICBtYXhJdGVtcywgc2tpcENvdW50KTsKLSAgICAgICAgTE9HLmRlYnVnKCJRdWVyeSByZXN1bHQsIG51bWJlciBvZiBtYXRjaGluZyBvYmplY3RzOiAiICsgb2JqTGlzdC5nZXROdW1JdGVtcygpKTsKLSAgICAgICAgcmV0dXJuIG9iakxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhIHF1ZXJ5LgotICAgICAqIEBwYXJhbSBzdGF0ZW1lbnQKLSAgICAgKiAgICAgIENNSVNRTCBzdGF0ZW1lbnQgdG8gZXhlY3V0ZQotICAgICAqIEBwYXJhbSB0bQotICAgICAqICAgICAgdHlwZSBtYW5hZ2VyIGZvciB0aGUgcmVwb3NpdG9yeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NRdWVyeUFuZENhdGNoRXhjKFN0cmluZyBzdGF0ZW1lbnQsIFR5cGVNYW5hZ2VyIHRtKSB7Ci0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSBuZXcgUXVlcnlVdGlsU3RyaWN0KHN0YXRlbWVudCwgdG0sIG51bGwpOwotICAgICAgICBxdWVyeVV0aWwucHJvY2Vzc1N0YXRlbWVudFVzaW5nQ21pc0V4Y2VwdGlvbnMoKTsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKTsKLSAgICAgICAgcXVlcnlPYmogPSBxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKTsKLSAgICAgICAgd2hlcmVUcmVlID0gd2Fsa2VyLmdldFdoZXJlUHJlZGljYXRlVHJlZSgpOwotICAgICAgICBzZWNvbmRhcnlUeXBlSWRzID0gcXVlcnlPYmouZ2V0Sm9pbmVkU2Vjb25kYXJ5VHlwZXMoKTsKLSAgICAgICAgZG9BZGRpdGlvbmFsQ2hlY2tzKHdhbGtlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBsaXN0IG9mIG1hdGNoaW5nIG9iamVjdHMgZm9yIHRoaXMgcXVlcnkuIAotICAgICAqIEBwYXJhbSB0bQotICAgICAqICB0eXBlIG1hbmFnZXIgZm9yIHRoZSBnaXZlbiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgdXNlciBleGVjdWluZyB0aGUgcXVlcnkKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMKLSAgICAgKiAgIGluY2x1ZGUgYWxsb3dhYmxlIGFjdGlvbnMKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgaW5jbHVkZSByZWxhdGlvbnNoaXBzCi0gICAgICogQHBhcmFtIHJlbmRpdGlvbkZpbHRlcgotICAgICAqICBpbmNsdWRlIHJlbmRpdGlvbnMKLSAgICAgKiBAcGFyYW0gbWF4SXRlbXMKLSAgICAgKiAgbWF4IG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogIGl0ZW1zIHRvIHNraXAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogIGxpc3Qgb2Ygb2JqZWN0cyBtYXRjaGluZyB0aGUgcXVlcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBidWlsZFJlc3VsdExpc3QoVHlwZU1hbmFnZXIgdG0sIFN0cmluZyB1c2VyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIAotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQpIHsKLQotICAgICAgICBzb3J0TWF0Y2hlcygpOwotCi0gICAgICAgIE9iamVjdExpc3RJbXBsIHJlcyA9IG5ldyBPYmplY3RMaXN0SW1wbCgpOwotICAgICAgICByZXMuc2V0TnVtSXRlbXMoQmlnSW50ZWdlci52YWx1ZU9mKG1hdGNoZXMuc2l6ZSgpKSk7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGlmIChza2lwQ291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhcnQgPSAoaW50KSBza2lwQ291bnQubG9uZ1ZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGFydCA+IG1hdGNoZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBzdGFydCA9IG1hdGNoZXMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGludCBzdG9wID0gMDsKLSAgICAgICAgaWYgKG1heEl0ZW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0b3AgPSBzdGFydCArIChpbnQpIG1heEl0ZW1zLmxvbmdWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdG9wIDw9IDAgfHwgc3RvcCA+IG1hdGNoZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBzdG9wID0gbWF0Y2hlcy5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzLnNldEhhc01vcmVJdGVtcyhzdG9wIDwgbWF0Y2hlcy5zaXplKCkpOwotICAgICAgICBpZiAoc3RhcnQgPiAwIHx8IHN0b3AgPiAwKSB7Ci0gICAgICAgICAgICBtYXRjaGVzID0gbWF0Y2hlcy5zdWJMaXN0KHN0YXJ0LCBzdG9wKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gb2JqRGF0YUxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMgPSBxdWVyeU9iai5nZXRSZXF1ZXN0ZWRQcm9wZXJ0aWVzQnlBbGlhcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGZ1bmNzID0gcXVlcnlPYmouZ2V0UmVxdWVzdGVkRnVuY3NCeUFsaWFzKCk7Ci0KLSAgICAgICAgZm9yIChTdG9yZWRPYmplY3Qgc28gOiBtYXRjaGVzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcXVlcnlOYW1lID0gcXVlcnlPYmouZ2V0VHlwZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHRkID0gcXVlcnlPYmouZ2V0VHlwZURlZmluaXRpb25Gcm9tUXVlcnlOYW1lKHF1ZXJ5TmFtZSk7Ci0KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2QgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmdldE9iamVjdERhdGFRdWVyeVJlc3VsdCh0bSwgb2JqU3RvcmUsIHRkLCBzbywgdXNlciwgcHJvcHMsIGZ1bmNzLAotICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlUeXBlSWRzLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgICAgICBvYmpEYXRhTGlzdC5hZGQob2QpOwotICAgICAgICB9Ci0gICAgICAgIHJlcy5zZXRPYmplY3RzKG9iakRhdGFMaXN0KTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHlwZU1hdGNoZXMoVHlwZURlZmluaXRpb24gdGQsIFN0b3JlZE9iamVjdCBzbykgewotICAgICAgICBTdHJpbmcgdHlwZUlkID0gc28uZ2V0VHlwZUlkKCk7Ci0gICAgICAgIHdoaWxlICh0eXBlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHR5cGVJZC5lcXVhbHModGQuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIHNlY29uZGFyeSB0eXBlcwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNlY1R5cGVJZHMgPSBzby5nZXRTZWNvbmRhcnlUeXBlSWRzKCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBzZWNUeXBlSWQgOiBzZWNUeXBlSWRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlY1R5cGVJZC5lcXVhbHModGQuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2hlY2sgcGFyZW50IHR5cGUKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHBhcmVudFREID0gcXVlcnlPYmouZ2V0UGFyZW50VHlwZSh0eXBlSWQpOwotICAgICAgICAgICAgdHlwZUlkID0gcGFyZW50VEQgPT0gbnVsbCA/IG51bGwgOiBwYXJlbnRURC5nZXRJZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc29ydE1hdGNoZXMoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U29ydFNwZWM+IG9yZGVyQnkgPSBxdWVyeU9iai5nZXRPcmRlckJ5cygpOwotICAgICAgICBpZiAob3JkZXJCeS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBMT0cud2FybigiT1JERVIgQlkgaGFzIG1vcmUgdGhhbiBvbmUgc29ydCBjcml0ZXJpdW0sIGFsbCBidXQgdGhlIGZpcnN0IGFyZSBpZ25vcmVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNsYXNzIFJlc3VsdENvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFN0b3JlZE9iamVjdD4gewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFN0b3JlZE9iamVjdCBzbzEsIFN0b3JlZE9iamVjdCBzbzIpIHsKLSAgICAgICAgICAgICAgICBTb3J0U3BlYyBzID0gb3JkZXJCeS5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgQ21pc1NlbGVjdG9yIHNlbCA9IHMuZ2V0U2VsZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0OwotCi0gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5T2JqLmlzUHJlZGZpbmVkUXVlcnlOYW1lKHNlbC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgU0VBUkNIX1NDT1JFIHdoaWNoIGlzIGN1cnJlbnRseSBpZ25vcmVkCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BJZCA9ICgoQ29sdW1uUmVmZXJlbmNlKSBzZWwpLmdldFByb3BlcnR5SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbCkuZ2V0UHJvcGVydHlEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BWYWwxID0gUHJvcGVydHlRdWVyeVV0aWwuZ2V0UHJvcGVydHkoc28xLCBwcm9wSWQsIHBkKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHByb3BWYWwyID0gUHJvcGVydHlRdWVyeVV0aWwuZ2V0UHJvcGVydHkoc28yLCBwcm9wSWQsIHBkKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFZhbDEgPT0gbnVsbCAmJiBwcm9wVmFsMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BWYWwxID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BWYWwyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoKENvbXBhcmFibGU8T2JqZWN0PikgcHJvcFZhbDEpLmNvbXBhcmVUbyhwcm9wVmFsMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0ZSBmdW5jdGlvbiBoZXJlLCBjdXJyZW50bHkgaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcy5pc0FzY2VuZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3JkZXJCeS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG1hdGNoZXMsIG5ldyBSZXN1bHRDb21wYXJhdG9yKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGZvciBlYWNoIG9iamVjdCBjb250YWluZWQgaW4gdGhlIGluLW1lbW9yeSByZXBvc2l0b3J5IGlmIGl0IG1hdGNoZXMKLSAgICAgKiB0aGUgY3VycmVudCBxdWVyeSBleHByZXNzaW9uLiBJZiB5ZXMgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIG1hdGNoZWQKLSAgICAgKiBvYmplY3RzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYXRjaChTdG9yZWRPYmplY3Qgc28sIFN0cmluZyB1c2VyLCBib29sZWFuIHNlYXJjaEFsbFZlcnNpb25zKSB7Ci0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHR5cGUgaXMgbWF0Y2hpbmcuLi4KLSAgICAgICAgLy8gYXMgd2UgZG9uJ3Qgc3VwcG9ydCBqb2lucyB0YWtlIGZpcnN0IHR5cGUKLSAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IHF1ZXJ5T2JqLmdldFR5cGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdGQgPSBxdWVyeU9iai5nZXRUeXBlRGVmaW5pdGlvbkZyb21RdWVyeU5hbWUocXVlcnlOYW1lKTsKLQotICAgICAgICAvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHZlcnNpb25zIG5vdCBpbiB0aGUgc2VyaWVzCi0gICAgICAgIGJvb2xlYW4gc2tpcCA9IHNvIGluc3RhbmNlb2YgVmVyc2lvbmVkRG9jdW1lbnQ7Ci0KLSAgICAgICAgYm9vbGVhbiB0eXBlTWF0Y2hlcyA9IHR5cGVNYXRjaGVzKHRkLCBzbyk7Ci0gICAgICAgIGlmICghc2VhcmNoQWxsVmVyc2lvbnMgJiYgc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24KLSAgICAgICAgICAgICAgICAmJiAoKERvY3VtZW50VmVyc2lvbikgc28pLmdldFBhcmVudERvY3VtZW50KCkuZ2V0TGF0ZXN0VmVyc2lvbihmYWxzZSkgIT0gc28pIHsKLSAgICAgICAgICAgIHNraXAgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIC4uLiB0aGVuIGNoZWNrIGV4cHJlc3Npb24uLi4KLSAgICAgICAgaWYgKHR5cGVNYXRjaGVzICYmICFza2lwKSB7Ci0gICAgICAgICAgICBldmFsV2hlcmVUcmVlKHdoZXJlVHJlZSwgdXNlciwgc28pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV2YWxXaGVyZVRyZWUoVHJlZSBub2RlLCBTdHJpbmcgdXNlciwgU3RvcmVkT2JqZWN0IHNvKSB7Ci0gICAgICAgIGJvb2xlYW4gbWF0Y2ggPSB0cnVlOwotICAgICAgICBpZiAobnVsbCAhPSBub2RlKSB7Ci0gICAgICAgICAgICBtYXRjaCA9IGV2YWxXaGVyZU5vZGUoc28sIHVzZXIsIG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXRjaCAmJiBvYmpTdG9yZS5oYXNSZWFkQWNjZXNzKHVzZXIsIHNvKSkgewotICAgICAgICAgICAgbWF0Y2hlcy5hZGQoc28pOyAvLyBhZGQgdG8gbGlzdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGb3IgZWFjaCBvYmplY3QgY2hlY2sgaWYgaXQgbWF0Y2hlcyBhbmQgYXBwZW5kIGl0IHRvIG1hdGNoLWxpc3QgaWYgaXQKLSAgICAgKiBkb2VzLiBXZSBkbyBoZXJlIG91ciBvd24gd2Fsa2luZyBtZWNoYW5pc20gc28gdGhhdCB3ZSBjYW4gcGFzcyBhZGRpdGlvbmFsCi0gICAgICogcGFyYW1ldGVycyBhbmQgZGVmaW5lIHRoZSByZXR1cm4gdHlwZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGV2YWxXaGVyZU5vZGUoU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgdXNlciwgVHJlZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5NZW1vcnlXaGVyZUNsYXVzZVdhbGtlcihzbywgdXNlcikud2Fsa1ByZWRpY2F0ZShub2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgSW5NZW1vcnlXaGVyZUNsYXVzZVdhbGtlciBleHRlbmRzIEFic3RyYWN0UHJlZGljYXRlV2Fsa2VyIHsKLQotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU3RvcmVkT2JqZWN0IHNvOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHVzZXI7Ci0KLSAgICAgICAgcHVibGljIEluTWVtb3J5V2hlcmVDbGF1c2VXYWxrZXIoU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgdXNlcikgewotICAgICAgICAgICAgdGhpcy5zbyA9IHNvOwotICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTm90KFRyZWUgb3BOb2RlLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzTWF0Y2hlZCA9IHdhbGtQcmVkaWNhdGUobm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gIWhhc01hdGNoZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa0FuZChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlczEgPSB3YWxrUHJlZGljYXRlKGxlZnROb2RlKTsKLSAgICAgICAgICAgIGJvb2xlYW4gbWF0Y2hlczIgPSB3YWxrUHJlZGljYXRlKHJpZ2h0Tm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gbWF0Y2hlczEgJiYgbWF0Y2hlczI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa09yKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICAgICAgYm9vbGVhbiBtYXRjaGVzMSA9IHdhbGtQcmVkaWNhdGUobGVmdE5vZGUpOwotICAgICAgICAgICAgYm9vbGVhbiBtYXRjaGVzMiA9IHdhbGtQcmVkaWNhdGUocmlnaHROb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBtYXRjaGVzMSB8fCBtYXRjaGVzMjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQm9vbGVhbiB3YWxrRXF1YWxzKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICAgICAgSW50ZWdlciBjbXAgPSBjb21wYXJlVG8obGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gY21wID09IG51bGwgPyBmYWxzZSA6IGNtcCA9PSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIHdhbGtOb3RFcXVhbHMoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIGNtcCA9IGNvbXBhcmVUbyhsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBjbXAgPT0gbnVsbCA/IGZhbHNlIDogY21wICE9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa0dyZWF0ZXJUaGFuKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICAgICAgSW50ZWdlciBjbXAgPSBjb21wYXJlVG8obGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gY21wID09IG51bGwgPyBmYWxzZSA6IGNtcCA+IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa0dyZWF0ZXJPckVxdWFscyhUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgICAgIEludGVnZXIgY21wID0gY29tcGFyZVRvKGxlZnROb2RlLCByaWdodE5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIGNtcCA9PSBudWxsID8gZmFsc2UgOiBjbXAgPj0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTGVzc1RoYW4oVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIGNtcCA9IGNvbXBhcmVUbyhsZWZ0Tm9kZSwgcmlnaHROb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBjbXAgPT0gbnVsbCA/IGZhbHNlIDogY21wIDwgMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTGVzc09yRXF1YWxzKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICAgICAgSW50ZWdlciBjbXAgPSBjb21wYXJlVG8obGVmdE5vZGUsIHJpZ2h0Tm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gY21wID09IG51bGwgPyBmYWxzZSA6IGNtcCA8PSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJbihUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gZ2V0Q29sdW1uUmVmZXJlbmNlKGNvbE5vZGUpOwotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkID0gY29sUmVmLmdldFByb3BlcnR5RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGxpdGVyYWxzID0gb25MaXRlcmFsTGlzdChsaXN0Tm9kZSk7Ci0gICAgICAgICAgICBPYmplY3QgcHJvcCA9IFByb3BlcnR5UXVlcnlVdGlsLmdldFByb3BlcnR5KHNvLCBjb2xSZWYuZ2V0UHJvcGVydHlJZCgpLCBwZCk7Ci0KLSAgICAgICAgICAgIGlmIChwZC5nZXRDYXJkaW5hbGl0eSgpICE9IENhcmRpbmFsaXR5LlNJTkdMRSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdG9yIElOIG9ubHkgaXMgYWxsb3dlZCBvbiBzaW5nbGUtdmFsdWUgcHJvcGVydGllcyAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGl0ZXJhbHMuY29udGFpbnMocHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa05vdEluKFRyZWUgb3BOb2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsKLSAgICAgICAgICAgIC8vIE5vdGUganVzdCByZXR1cm4gIXdhbGtJbihub2RlLCBjb2xOb2RlLCBsaXN0Tm9kZSkgaXMgd3JvbmcsCi0gICAgICAgICAgICAvLyBiZWNhdXNlCi0gICAgICAgICAgICAvLyB0aGVuIGl0IGV2YWx1YXRlcyB0byB0cnVlIGZvciBudWxsIHZhbHVlcyAobm90IHNldCBwcm9wZXJ0aWVzKS4KLSAgICAgICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSBnZXRDb2x1bW5SZWZlcmVuY2UoY29sTm9kZSk7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcGQgPSBjb2xSZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBPYmplY3QgcHJvcCA9IFByb3BlcnR5UXVlcnlVdGlsLmdldFByb3BlcnR5KHNvLCBjb2xSZWYuZ2V0UHJvcGVydHlJZCgpLCBwZCk7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdD4gbGl0ZXJhbHMgPSBvbkxpdGVyYWxMaXN0KGxpc3ROb2RlKTsKLSAgICAgICAgICAgIGlmIChwZC5nZXRDYXJkaW5hbGl0eSgpICE9IENhcmRpbmFsaXR5LlNJTkdMRSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdG9yIElOIG9ubHkgaXMgYWxsb3dlZCBvbiBzaW5nbGUtdmFsdWUgcHJvcGVydGllcyAiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIWxpdGVyYWxzLmNvbnRhaW5zKHByb3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJbkFueShUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gZ2V0Q29sdW1uUmVmZXJlbmNlKGNvbE5vZGUpOwotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkID0gY29sUmVmLmdldFByb3BlcnR5RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IGxWYWwgPSBzby5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGNvbFJlZi5nZXRQcm9wZXJ0eUlkKCkpOwotICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGxpdGVyYWxzID0gb25MaXRlcmFsTGlzdChsaXN0Tm9kZSk7Ci0gICAgICAgICAgICBpZiAocGQuZ2V0Q2FyZGluYWxpdHkoKSAhPSBDYXJkaW5hbGl0eS5NVUxUSSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdG9yIEFOWS4uLklOIG9ubHkgaXMgYWxsb3dlZCBvbiBtdWx0aS12YWx1ZSBwcm9wZXJ0aWVzICIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsVmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExpc3Q8Pz4gcHJvcHMgPSBsVmFsLmdldFZhbHVlcygpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHByb3AgOiBwcm9wcykgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoImNvbXBhcmluZyB3aXRoOiAiICsgcHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaXRlcmFscy5jb250YWlucyhwcm9wKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIHdhbGtOb3RJbkFueShUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgICAgICAvLyBOb3RlIGp1c3QgcmV0dXJuICF3YWxrTm90SW5Bbnkobm9kZSwgY29sTm9kZSwgbGlzdE5vZGUpIGlzCi0gICAgICAgICAgICAvLyB3cm9uZywgYmVjYXVzZQotICAgICAgICAgICAgLy8gdGhlbiBpdCBldmFsdWF0ZXMgdG8gdHJ1ZSBmb3IgbnVsbCB2YWx1ZXMgKG5vdCBzZXQgcHJvcGVydGllcykuCi0gICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gZ2V0Q29sdW1uUmVmZXJlbmNlKGNvbE5vZGUpOwotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkID0gY29sUmVmLmdldFByb3BlcnR5RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IGxWYWwgPSBzby5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGNvbFJlZi5nZXRQcm9wZXJ0eUlkKCkpOwotICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGxpdGVyYWxzID0gb25MaXRlcmFsTGlzdChsaXN0Tm9kZSk7Ci0gICAgICAgICAgICBpZiAocGQuZ2V0Q2FyZGluYWxpdHkoKSAhPSBDYXJkaW5hbGl0eS5NVUxUSSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdG9yIEFOWS4uLklOIG9ubHkgaXMgYWxsb3dlZCBvbiBtdWx0aS12YWx1ZSBwcm9wZXJ0aWVzICIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsVmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExpc3Q8Pz4gcHJvcHMgPSBsVmFsLmdldFZhbHVlcygpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHByb3AgOiBwcm9wcykgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoImNvbXBhcmluZyB3aXRoOiAiICsgcHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaXRlcmFscy5jb250YWlucyhwcm9wKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIHdhbGtFcUFueShUcmVlIG9wTm9kZSwgVHJlZSBsaXRlcmFsTm9kZSwgVHJlZSBjb2xOb2RlKSB7Ci0gICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gZ2V0Q29sdW1uUmVmZXJlbmNlKGNvbE5vZGUpOwotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkID0gY29sUmVmLmdldFByb3BlcnR5RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IGxWYWwgPSBzby5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGNvbFJlZi5nZXRQcm9wZXJ0eUlkKCkpOwotICAgICAgICAgICAgT2JqZWN0IGxpdGVyYWwgPSB3YWxrRXhwcihsaXRlcmFsTm9kZSk7Ci0gICAgICAgICAgICBpZiAocGQuZ2V0Q2FyZGluYWxpdHkoKSAhPSBDYXJkaW5hbGl0eS5NVUxUSSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9wZXJhdG9yID0gQU5ZIG9ubHkgaXMgYWxsb3dlZCBvbiBtdWx0aS12YWx1ZSBwcm9wZXJ0aWVzICIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsVmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExpc3Q8Pz4gcHJvcHMgPSBsVmFsLmdldFZhbHVlcygpOwotICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcy5jb250YWlucyhsaXRlcmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQm9vbGVhbiB3YWxrSXNOdWxsKFRyZWUgb3BOb2RlLCBUcmVlIGNvbE5vZGUpIHsKLSAgICAgICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSBnZXRDb2x1bW5SZWZlcmVuY2UoY29sTm9kZSk7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcGQgPSBjb2xSZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBPYmplY3QgcHJvcFZhbCA9IFByb3BlcnR5UXVlcnlVdGlsLmdldFByb3BlcnR5KHNvLCBjb2xSZWYuZ2V0UHJvcGVydHlJZCgpLCBwZCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcFZhbCA9PSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJc05vdE51bGwoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9IGdldENvbHVtblJlZmVyZW5jZShjb2xOb2RlKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZCA9IGNvbFJlZi5nZXRQcm9wZXJ0eURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIE9iamVjdCBwcm9wVmFsID0gUHJvcGVydHlRdWVyeVV0aWwuZ2V0UHJvcGVydHkoc28sIGNvbFJlZi5nZXRQcm9wZXJ0eUlkKCksIHBkKTsKLSAgICAgICAgICAgIHJldHVybiBwcm9wVmFsICE9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa0xpa2UoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBzdHJpbmdOb2RlKSB7Ci0gICAgICAgICAgICBPYmplY3QgclZhbCA9IHdhbGtFeHByKHN0cmluZ05vZGUpOwotICAgICAgICAgICAgaWYgKCEoclZhbCBpbnN0YW5jZW9mIFN0cmluZykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJMSUtFIG9wZXJhdG9yIHJlcXVpcmVzIFN0cmluZyBsaXRlcmFsIG9uIHJpZ2h0IGhhbmQgc2lkZS4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9IGdldENvbHVtblJlZmVyZW5jZShjb2xOb2RlKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZCA9IGNvbFJlZi5nZXRQcm9wZXJ0eURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIFByb3BlcnR5VHlwZSBwcm9wVHlwZSA9IHBkLmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgaWYgKHByb3BUeXBlICE9IFByb3BlcnR5VHlwZS5TVFJJTkcgJiYgcHJvcFR5cGUgIT0gUHJvcGVydHlUeXBlLkhUTUwgJiYgcHJvcFR5cGUgIT0gUHJvcGVydHlUeXBlLklECi0gICAgICAgICAgICAgICAgICAgICYmIHByb3BUeXBlICE9IFByb3BlcnR5VHlwZS5VUkkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm9wZXJ0eSB0eXBlICIgKyBwcm9wVHlwZS52YWx1ZSgpICsgIiBpcyBub3QgYWxsb3dlZCBGT1IgTElLRSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBkLmdldENhcmRpbmFsaXR5KCkgIT0gQ2FyZGluYWxpdHkuU0lOR0xFKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTElLRSBpcyBub3QgYWxsb3dlZCBmb3IgbXVsdGktdmFsdWUgcHJvcGVydGllcyAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWwgPSAoU3RyaW5nKSBQcm9wZXJ0eVF1ZXJ5VXRpbC5nZXRQcm9wZXJ0eShzbywgY29sUmVmLmdldFByb3BlcnR5SWQoKSwgcGQpOwotCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wVmFsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0dGVybiA9IHRyYW5zbGF0ZVBhdHRlcm4oKFN0cmluZykgclZhbCk7IC8vIFNRTCB0byBKYXZhCi0gICAgICAgICAgICAgICAgLy8gcmVnZXgKLSAgICAgICAgICAgICAgICAvLyBzeW50YXgKLSAgICAgICAgICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHAubWF0Y2hlcihwcm9wVmFsKS5tYXRjaGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa05vdExpa2UoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBzdHJpbmdOb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gIXdhbGtMaWtlKG9wTm9kZSwgY29sTm9kZSwgc3RyaW5nTm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJvb2xlYW4gd2Fsa0luRm9sZGVyKFRyZWUgb3BOb2RlLCBUcmVlIHF1YWxOb2RlLCBUcmVlIHBhcmFtTm9kZSkgewotICAgICAgICAgICAgaWYgKG51bGwgIT0gcXVhbE5vZGUpIHsKLSAgICAgICAgICAgICAgICBnZXRUYWJsZVJlZmVyZW5jZShxdWFsTm9kZSk7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBmb3IgZXJyb3IgY2hlY2tpbmcgd2UgZG8gbm90IGV2YWx1YXRlIHRoaXMsIHRoZXJlIGlzCi0gICAgICAgICAgICAgICAgLy8gb25seSBvbmUgZnJvbSB3aXRob3V0IGpvaW4gc3VwcG9ydAotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IGxpdCA9IHdhbGtFeHByKHBhcmFtTm9kZSk7Ci0gICAgICAgICAgICBpZiAoIShsaXQgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRm9sZGVyIGlkIGluIElOX0ZPTERFUiBtdXN0IGJlIG9mIHR5cGUgU3RyaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSAoU3RyaW5nKSBsaXQ7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIG9iamVjdCBpcyBpbiBmb2xkZXIKLSAgICAgICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIEZpbGluZykgewotICAgICAgICAgICAgICAgIHJldHVybiBoYXNQYXJlbnQoc28sIGZvbGRlcklkLCB1c2VyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJblRyZWUoVHJlZSBvcE5vZGUsIFRyZWUgcXVhbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBxdWFsTm9kZSkgewotICAgICAgICAgICAgICAgIGdldFRhYmxlUmVmZXJlbmNlKHF1YWxOb2RlKTsKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGZvciBlcnJvciBjaGVja2luZyB3ZSBkbyBub3QgZXZhbHVhdGUgdGhpcywgdGhlcmUgaXMKLSAgICAgICAgICAgICAgICAvLyBvbmx5IG9uZSBmcm9tIHdpdGhvdXQgam9pbiBzdXBwb3J0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgbGl0ID0gd2Fsa0V4cHIocGFyYW1Ob2RlKTsKLSAgICAgICAgICAgIGlmICghKGxpdCBpbnN0YW5jZW9mIFN0cmluZykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGb2xkZXIgaWQgaW4gSU5fRk9MREVSIG11c3QgYmUgb2YgdHlwZSBTdHJpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCA9IChTdHJpbmcpIGxpdDsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgb2JqZWN0IGlzIGluIGZvbGRlcgotICAgICAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRmlsaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhc0FuY2VzdG9yKHNvLCBmb2xkZXJJZCwgdXNlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBJbnRlZ2VyIGNvbXBhcmVUbyhUcmVlIGxlZnRDaGlsZCwgVHJlZSByaWdodENoaWxkKSB7Ci0gICAgICAgICAgICBPYmplY3QgclZhbCA9IHdhbGtFeHByKHJpZ2h0Q2hpbGQpOwotCi0gICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gZ2V0Q29sdW1uUmVmZXJlbmNlKGxlZnRDaGlsZCk7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcGQgPSBjb2xSZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsID0gUHJvcGVydHlRdWVyeVV0aWwuZ2V0UHJvcGVydHkoc28sIGNvbFJlZi5nZXRQcm9wZXJ0eUlkKCksIHBkKTsKLSAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBMaXN0PD8+KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgY2FuJ3QgcXVlcnkgb3BlcmF0b3JzIDwsIDw9LCA9PSwgIT0sID49LCA+IG9uIG11bHRpLXZhbHVlIHByb3BlcnRpZXMgIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yLnRoaXMuY29tcGFyZVRvKHBkLCB2YWwsIHJWYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gb25MaXRlcmFsTGlzdChUcmVlIG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiAoTGlzdDxPYmplY3Q+KSB3YWxrRXhwcihub2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQm9vbGVhbiB3YWxrVGV4dEFuZChUcmVlIG5vZGUpIHsKLSAgICAgICAgICAgIExpc3Q8VHJlZT4gdGVybXMgPSBnZXRDaGlsZHJlbkFzTGlzdChub2RlKTsKLSAgICAgICAgICAgIGZvciAoVHJlZSB0ZXJtIDogdGVybXMpIHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGZvdW5kT25jZSA9IHdhbGtTZWFyY2hFeHByKHRlcm0pOwotICAgICAgICAgICAgICAgIGlmIChmb3VuZE9uY2UgPT0gbnVsbCB8fCAhZm91bmRPbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQm9vbGVhbiB3YWxrVGV4dE9yKFRyZWUgbm9kZSkgewotICAgICAgICAgICAgTGlzdDxUcmVlPiB0ZXJtcyA9IGdldENoaWxkcmVuQXNMaXN0KG5vZGUpOwotICAgICAgICAgICAgZm9yIChUcmVlIHRlcm0gOiB0ZXJtcykgewotICAgICAgICAgICAgICAgIEJvb2xlYW4gZm91bmRPbmNlID0gd2Fsa1NlYXJjaEV4cHIodGVybSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvdW5kT25jZSAhPSBudWxsICYmIGZvdW5kT25jZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEJvb2xlYW4gd2Fsa1RleHRNaW51cyhUcmVlIG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiAhZmluZFRleHQobm9kZS5nZXRDaGlsZCgwKS5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBCb29sZWFuIHdhbGtUZXh0V29yZChUcmVlIG5vZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmaW5kVGV4dChub2RlLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEJvb2xlYW4gd2Fsa1RleHRQaHJhc2UoVHJlZSBub2RlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGhyYXNlID0gbm9kZS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gZmluZFRleHQocGhyYXNlLnN1YnN0cmluZygxLCBwaHJhc2UubGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIExpc3Q8VHJlZT4gZ2V0Q2hpbGRyZW5Bc0xpc3QoVHJlZSBub2RlKSB7Ci0gICAgICAgICAgICBMaXN0PFRyZWU+IHJlcyA9IG5ldyBBcnJheUxpc3Q8VHJlZT4obm9kZS5nZXRDaGlsZENvdW50KCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVHJlZSBjaGlsZE5ub2RlID0gbm9kZS5nZXRDaGlsZChpKTsKLSAgICAgICAgICAgICAgICByZXMuYWRkKGNoaWxkTm5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaW5kVGV4dChTdHJpbmcgbm9kZVRleHQpIHsKLSAgICAgICAgICAgIENvbnRlbnQgY29udCA9IChDb250ZW50KSBzbzsKLSAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gU3RyaW5nVXRpbC51bmVzY2FwZShub2RlVGV4dCwgIlxcJy0iKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHBhdHRlcm4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBFc2NhcGUgc2VxdWVuY2UgaW4gdGV4dCBzZWFyY2ggZXhwcmVzc2lvbiAiICsgbm9kZVRleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBDb250ZW50ICYmIGNvbnQuaGFzQ29udGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbURhdGFJbXBsIGNkaSA9IChDb250ZW50U3RyZWFtRGF0YUltcGwpIGNvbnQuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICAgIGlmIChjZGkuZ2V0TWltZVR5cGUoKS5zdGFydHNXaXRoKCJ0ZXh0LyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiYSA9IGNkaS5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBuZXcgU3RyaW5nKGJhLCAiVVRGLTgiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBVbnN1cHBvcnRlZCBlbmNvZGluZyBVVEYtOCIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBtYXRjaCA9IHRleHQuaW5kZXhPZihwYXR0ZXJuKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoID49IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1BhcmVudChTdG9yZWRPYmplY3Qgb2JqSW5Gb2xkZXIsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmVudHMgPSBvYmpTdG9yZS5nZXRQYXJlbnRJZHMob2JqSW5Gb2xkZXIsIHVzZXIpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIHBhcmVudElkIDogcGFyZW50cykgewotICAgICAgICAgICAgaWYgKGZvbGRlcklkLmVxdWFscyhwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0FuY2VzdG9yKFN0b3JlZE9iamVjdCBvYmpJbkZvbGRlciwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgdXNlcikgewotICAgICAgICBMaXN0PFN0cmluZz4gcGFyZW50cyA9IG9ialN0b3JlLmdldFBhcmVudElkcyhvYmpJbkZvbGRlciwgdXNlcik7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgcGFyZW50SWQgOiBwYXJlbnRzKSB7Ci0gICAgICAgICAgICBpZiAoZm9sZGVySWQuZXF1YWxzKHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoU3RyaW5nIHBhcmVudElkIDogcGFyZW50cykgewotICAgICAgICAgICAgRm9sZGVyIHBhcmVudEZvbGRlciA9IChGb2xkZXIpIG9ialN0b3JlLmdldE9iamVjdEJ5SWQocGFyZW50SWQpOwotICAgICAgICAgICAgaWYgKGhhc0FuY2VzdG9yKHBhcmVudEZvbGRlciwgZm9sZGVySWQsIHVzZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgY29tcGFyZVRvKFByb3BlcnR5RGVmaW5pdGlvbjw/PiB0ZCwgT2JqZWN0IGxWYWx1ZSwgT2JqZWN0IHJWYWwpIHsKLSAgICAgICAgc3dpdGNoICh0ZC5nZXRQcm9wZXJ0eVR5cGUoKSkgewotICAgICAgICBjYXNlIEJPT0xFQU46Ci0gICAgICAgICAgICBpZiAoclZhbCBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChCb29sZWFuKSBsVmFsdWUpLmNvbXBhcmVUbygoQm9vbGVhbikgclZhbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93SW5jb21wYXRpYmxlVHlwZXNFeGNlcHRpb24obFZhbHVlLCByVmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICBMb25nIGxMb25nVmFsdWUgPSAoKEJpZ0ludGVnZXIpIGxWYWx1ZSkubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoclZhbCBpbnN0YW5jZW9mIExvbmcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGxMb25nVmFsdWUpLmNvbXBhcmVUbygoTG9uZykgclZhbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJWYWwgaW5zdGFuY2VvZiBEb3VibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLnZhbHVlT2YoKChJbnRlZ2VyKSBsVmFsdWUpLmRvdWJsZVZhbHVlKCkpLmNvbXBhcmVUbygoRG91YmxlKSByVmFsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dJbmNvbXBhdGlibGVUeXBlc0V4Y2VwdGlvbihsVmFsdWUsIHJWYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICBpZiAoclZhbCBpbnN0YW5jZW9mIEdyZWdvcmlhbkNhbGVuZGFyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoR3JlZ29yaWFuQ2FsZW5kYXIpIGxWYWx1ZSkuY29tcGFyZVRvKChHcmVnb3JpYW5DYWxlbmRhcikgclZhbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93SW5jb21wYXRpYmxlVHlwZXNFeGNlcHRpb24obFZhbHVlLCByVmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFQ0lNQUw6Ci0gICAgICAgICAgICBEb3VibGUgbERvdWJsZVZhbHVlID0gKChCaWdEZWNpbWFsKSBsVmFsdWUpLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoclZhbCBpbnN0YW5jZW9mIERvdWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsRG91YmxlVmFsdWUuY29tcGFyZVRvKChEb3VibGUpIHJWYWwpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyVmFsIGluc3RhbmNlb2YgTG9uZykgewotICAgICAgICAgICAgICAgIHJldHVybiBsRG91YmxlVmFsdWUuY29tcGFyZVRvKERvdWJsZS52YWx1ZU9mKCgoTG9uZykgclZhbCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dJbmNvbXBhdGlibGVUeXBlc0V4Y2VwdGlvbihsVmFsdWUsIHJWYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSFRNTDoKLSAgICAgICAgY2FzZSBVUkk6Ci0gICAgICAgIGNhc2UgSUQ6Ci0gICAgICAgICAgICBpZiAoclZhbCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiY29tcGFyZSBzdHJpbmdzOiAiICsgbFZhbHVlICsgIiB3aXRoICIgKyByVmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIGxWYWx1ZSkuY29tcGFyZVRvKChTdHJpbmcpIHJWYWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvd0luY29tcGF0aWJsZVR5cGVzRXhjZXB0aW9uKGxWYWx1ZSwgclZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICBpZiAoclZhbCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgCVN0cmluZyB1bmVzYyA9IFN0cmluZ1V0aWwudW5lc2NhcGUoKFN0cmluZykgclZhbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJjb21wYXJlIHN0cmluZ3M6ICIgKyBsVmFsdWUgKyAiIHdpdGggIiArIHVuZXNjKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIGxWYWx1ZSkuY29tcGFyZVRvKHVuZXNjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dJbmNvbXBhdGlibGVUeXBlc0V4Y2VwdGlvbihsVmFsdWUsIHJWYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb2x1bW5SZWZlcmVuY2UgZ2V0Q29sdW1uUmVmZXJlbmNlKFRyZWUgY29sdW1uTm9kZSkgewotICAgICAgICBDbWlzU2VsZWN0b3Igc2VsID0gcXVlcnlPYmouZ2V0Q29sdW1uUmVmZXJlbmNlKGNvbHVtbk5vZGUuZ2V0VG9rZW5TdGFydEluZGV4KCkpOwotICAgICAgICBpZiAobnVsbCA9PSBzZWwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHkgcXVlcnkgbmFtZSAiICsgY29sdW1uTm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgQ29sdW1uUmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbHVtblJlZmVyZW5jZSkgc2VsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBudW1lcmljYWwgdmFsdWUgZnVuY3Rpb24gaW4gd2hlcmUgY2xhdXNlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYWJsZVJlZmVyZW5jZShUcmVlIHRhYmxlTm9kZSkgewotICAgICAgICBTdHJpbmcgdHlwZVF1ZXJ5TmFtZSA9IHF1ZXJ5T2JqLmdldFR5cGVRdWVyeU5hbWUodGFibGVOb2RlLmdldFRleHQoKSk7Ci0gICAgICAgIGlmIChudWxsID09IHR5cGVRdWVyeU5hbWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkluYXZsaWQgdHlwZSBpbiBJTl9GT0xERVIoKSBvciBJTl9UUkVFKCksIG11c3QgYmUgaW4gRlJPTSBsaXN0OiAiCi0gICAgICAgICAgICAgICAgICAgICsgdGFibGVOb2RlLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVRdWVyeU5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvQWRkaXRpb25hbENoZWNrcyhDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyKSB7Ci0gICAgICAgIGlmICh3YWxrZXIuZ2V0TnVtYmVyT2ZDb250YWluc0NsYXVzZXMoKSA+IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJNb3JlIHRoYW4gb25lIENPTlRBSU5TIGNsYXVzZSBpcyBub3QgYWxsb3dlZCIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8Sm9pblNwZWM+IGpvaW5zID0gcXVlcnlPYmouZ2V0Sm9pbnMoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gc2Vjb25kYXJ5VHlwZUlkcyAmJiBqb2lucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkpPSU5zIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzZWNvbmRhcnkgdHlwZXMgYW5kIGEgTEVGVCBPVVRFUiBKT0lOIik7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVsbCAhPSBzZWNvbmRhcnlUeXBlSWRzKSB7Ci0gICAgICAgICAgICBmb3IgKEpvaW5TcGVjIGpvaW4gOiBqb2lucykgewotICAgICAgICAgICAgICAgIGlmICgham9pbi5raW5kLmVxdWFscygiTEVGVCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKT0lOcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIHRoZSBleGNlcHRpb24gb2Ygc2Vjb25kYXJ5IHR5cGVzIGFuZCBhIExFRlQgT1VURVIgSk9JTiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZSBTUUwgd2lsZGNhcmRzICUsIF8gdG8gSmF2YSByZWdleCBzeW50YXguCi0gICAgICogCi0gICAgICogQHBhcmFtIHdpbGRjYXJkU3RyaW5nCi0gICAgICogICAgIHN0cmluZyB0byBwcm9jZXNzCi0gICAgICogQHJldHVybgotICAgICAqICAgICAgc3RyaW5nIHdpdGggcmVwbGFjZWQgY2hhcmFjdGVycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRyYW5zbGF0ZVBhdHRlcm4oU3RyaW5nIHdpbGRjYXJkU3RyaW5nKSB7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIFN0cmluZyB3aWxkY2FyZCA9IHdpbGRjYXJkU3RyaW5nOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgaW5kZXggPSB3aWxkY2FyZC5pbmRleE9mKCclJywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQod2lsZGNhcmQuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPiAwICYmIHdpbGRjYXJkLmNoYXJBdChpbmRleCAtIDEpICE9ICdcXCcpIHsKLSAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHdpbGRjYXJkLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpKTsKLSAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCIuKiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHdpbGRjYXJkLnN1YnN0cmluZyhzdGFydCwgaW5kZXggKyAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCA9IGluZGV4ICsgMTsKLSAgICAgICAgfQotICAgICAgICB3aWxkY2FyZCA9IHJlcy50b1N0cmluZygpOwotCi0gICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBpbmRleCA9IHdpbGRjYXJkLmluZGV4T2YoJ18nLCBzdGFydCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzLmFwcGVuZCh3aWxkY2FyZC5zdWJzdHJpbmcoc3RhcnQpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA+IDAgJiYgd2lsZGNhcmQuY2hhckF0KGluZGV4IC0gMSkgIT0gJ1xcJykgewotICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQod2lsZGNhcmQuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCkpOwotICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoIi4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzLmFwcGVuZCh3aWxkY2FyZC5zdWJzdHJpbmcoc3RhcnQsIGluZGV4ICsgMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQgPSBpbmRleCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dJbmNvbXBhdGlibGVUeXBlc0V4Y2VwdGlvbihPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIFR5cGVzIHRvIGNvbXBhcmU6ICIgKyBvMSArICIgYW5kICIgKyBvMik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9Qcm9wZXJ0eVF1ZXJ5VXRpbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvUHJvcGVydHlRdWVyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmNTk0Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9Qcm9wZXJ0eVF1ZXJ5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5xdWVyeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuSW5NZW1vcnlTZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Db250ZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkRvY3VtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkRvY3VtZW50VmVyc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Gb2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuUG9saWN5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlJlbGF0aW9uc2hpcDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZWRPYmplY3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuVmVyc2lvbmVkRG9jdW1lbnQ7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnR5UXVlcnlVdGlsIHsNCi0NCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVF1ZXJ5VXRpbCgpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdG9yZWRPYmplY3Qgc28sIFN0cmluZyBwcm9wZXJ0eUlkLCBQcm9wZXJ0eURlZmluaXRpb248Pz4gcGQpIHsNCi0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudCA9IG51bGw7DQotICAgICAgICBEb2N1bWVudFZlcnNpb24gdmVyID0gbnVsbDsNCi0gICAgICAgIFZlcnNpb25lZERvY3VtZW50IHZlckRvYyA9IG51bGw7DQotICAgICAgICBGb2xkZXIgZm9sZGVyID0gbnVsbDsNCi0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7DQotICAgICAgICBSZWxhdGlvbnNoaXAgcmVsID0gbnVsbDsNCi0gICAgICAgIFBvbGljeSBwb2wgPSBudWxsOw0KLQ0KLSAgICAgICAgYm9vbGVhbiBjbWlzMTEgPSBJbk1lbW9yeVNlcnZpY2VDb250ZXh0LmdldENhbGxDb250ZXh0KCkuZ2V0Q21pc1ZlcnNpb24oKSAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMDsNCi0NCi0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIENvbnRlbnQpIHsNCi0gICAgICAgICAgICBjb250ZW50ID0gKChDb250ZW50KSBzbykuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRG9jdW1lbnRWZXJzaW9uKSB7DQotICAgICAgICAgICAgdmVyID0gKERvY3VtZW50VmVyc2lvbikgc287DQotICAgICAgICB9DQotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCkgew0KLSAgICAgICAgICAgIHZlckRvYyA9IChWZXJzaW9uZWREb2N1bWVudCkgc287DQotICAgICAgICB9DQotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBGb2xkZXIpIHsNCi0gICAgICAgICAgICBmb2xkZXIgPSAoRm9sZGVyKSBzbzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIERvY3VtZW50KSB7DQotICAgICAgICAgICAgZG9jID0gKERvY3VtZW50KSBzbzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcCkgew0KLSAgICAgICAgICAgIHJlbCA9IChSZWxhdGlvbnNoaXApIHNvOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgUG9saWN5KSB7DQotICAgICAgICAgICAgcG9sID0gKFBvbGljeSkgc287DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBnZW5lcmljIHByb3BlcnRpZXM6DQotICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuTkFNRSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gc28uZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLk9CSkVDVF9JRCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gc28uZ2V0SWQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gc28uZ2V0VHlwZUlkKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lEKSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBiYXNlIHR5cGUgaWQgbm90IGF2YWlsYWJsZSBmcm9tIHNvDQotICAgICAgICB9DQotICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gc28uZ2V0Q3JlYXRlZEJ5KCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gc28uZ2V0Q3JlYXRlZEF0KCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gc28uZ2V0TW9kaWZpZWRCeSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHNvLmdldE1vZGlmaWVkQXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pKSB7DQotICAgICAgICAgICAgcmV0dXJuIHNvLmdldENoYW5nZVRva2VuKCk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoY21pczExICYmIHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkRFU0NSSVBUSU9OKSkgew0KLSAgICAgICAgICAgIHJldHVybiBzby5nZXREZXNjcmlwdGlvbigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHZlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgLy8gZ2V0IHZlcnNpb24gcmVsYXRlZCBwcm9wZXJ0aWVzDQotICAgICAgICAgICAgLy8gbm90IHN1cHBvcnQgb24gYSB2ZXJzaW9uLCBvbmx5IG9uIGEgdmVyc2lvbmVkIGRvY3VtZW50Og0KLSAgICAgICAgICAgIC8vIFZFUlNJT05fU0VSSUVTX0lELCBJU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCwNCi0gICAgICAgICAgICAvLyBWRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwNCi0gICAgICAgICAgICAvLyBWRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCwgSVNfTEFURVNUX01BSk9SX1ZFUlNJT04sDQotICAgICAgICAgICAgLy8gSVNfTEFURVNUX1ZFUlNJT04NCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuSVNfTUFKT1JfVkVSU0lPTikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZlci5pc01ham9yKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2ZXIuZ2V0Q2hlY2tpbkNvbW1lbnQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLlZFUlNJT05fTEFCRUwpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2ZXIuZ2V0VmVyc2lvbkxhYmVsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZlci5pc1B3YygpID8gdmVyLmdldElkKCkgOiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGdldCB2ZXJzaW9uZWQgZG9jdW1lbnQgcmVsYXRlZCBwcm9wZXJ0aWVzDQotICAgICAgICBpZiAodmVyRG9jICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2ZXJEb2MuZ2V0SWQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLklTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmVyRG9jLmlzQ2hlY2tlZE91dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2ZXJEb2MuZ2V0Q2hlY2tlZE91dEJ5KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gU2V0IHRoZSBjb250ZW50IHJlbGF0ZWQgcHJvcGVydGllcw0KLSAgICAgICAgaWYgKG51bGwgIT0gY29udGVudCkgew0KLSAgICAgICAgICAgIC8vIG9taXQ6IFByb3BlcnR5SWRzLkNNSVNfQ09OVEVOVF9TVFJFQU1fSUQNCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5nZXRGaWxlTmFtZSgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RIKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5nZXRCaWdMZW5ndGgoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQuZ2V0TWltZVR5cGUoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZm9sZGVyICE9IG51bGwgJiYgcHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuUEFSRU5UX0lEKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmb2xkZXIuZ2V0UGFyZW50SWQoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChkb2MgIT0gbnVsbCAmJiBwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHJlbCAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLlNPVVJDRV9JRCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlbC5nZXRTb3VyY2VPYmplY3RJZCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuVEFSR0VUX0lEKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVsLmdldFRhcmdldE9iamVjdElkKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHBvbCAhPSBudWxsICYmIHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLlBPTElDWV9URVhUKSkgew0KLSAgICAgICAgICAgIHJldHVybiBwb2wuZ2V0UG9saWN5VGV4dCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gdHJ5IGN1c3RvbSBwcm9wZXJ0eToNCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBsVmFsID0gc28uZ2V0UHJvcGVydGllcygpLmdldChwcm9wZXJ0eUlkKTsNCi0gICAgICAgIGlmIChudWxsID09IGxWYWwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0gZWxzZSBpZiAocGQuZ2V0Q2FyZGluYWxpdHkoKSA9PSBDYXJkaW5hbGl0eS5TSU5HTEUpIHsNCi0gICAgICAgICAgICByZXR1cm4gbFZhbC5nZXRGaXJzdFZhbHVlKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBsVmFsLmdldFZhbHVlcygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9BYnN0cmFjdFNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvQWJzdHJhY3RTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2MyMzFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9BYnN0cmFjdFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkRvY3VtZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuVmVyc2lvbmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogQ29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0U2VydmljZUltcGwgewotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0b3JlTWFuYWdlciBmU3RvcmVNYW5hZ2VyOwotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0U2VydmljZUltcGwoU3RvcmVNYW5hZ2VyIHN0b3JlTWFuYWdlcikgewotICAgICAgICBmU3RvcmVNYW5hZ2VyID0gc3RvcmVNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrIGlmIHJlcG9zaXRvcnkgaXMga25vd24gYW5kIHRoYXQgb2JqZWN0IGV4aXN0cy4gVG8gYXZvaWQgbGF0ZXIgY2FsbHMKLSAgICAgKiB0byBhZ2FpbiByZXRyaWV2ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGlkIHJldHVybiB0aGUgcmV0cmlldmVkIG9iamVjdCBmb3IKLSAgICAgKiBsYXRlciB1c2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgcmVwb3NpdG9yeSBpZAotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgb2JqZWN0IGlkCi0gICAgICogQHJldHVybiBvYmplY3QgZm9yIG9iamVjdElkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0b3JlZE9iamVjdCBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpIHsKLQotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICBpZiAob2JqU3RvcmUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5IGlkOiAiICsgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IG9ialN0b3JlLmdldE9iamVjdEJ5SWQob2JqZWN0SWQpOwotCi0gICAgICAgIGlmIChzbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIG9iamVjdCBpZDogIiArIG9iamVjdElkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzbzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RvcmVkT2JqZWN0IGNoZWNrRXhpc3RpbmdPYmplY3RJZChPYmplY3RTdG9yZSBvYmpTdG9yZSwgU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IG9ialN0b3JlLmdldE9iamVjdEJ5SWQob2JqZWN0SWQpOwotCi0gICAgICAgIGlmIChzbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIG9iamVjdCBpZDogIiArIG9iamVjdElkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzbzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1JlcG9zaXRvcnlJZChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIGlmIChvYmpTdG9yZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIHJlcG9zaXRvcnkgaWQ6ICIgKyByZXBvc2l0b3J5SWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBTdHJpbmcgdHlwZUlkID0gKFN0cmluZykgcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWZDID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlQnlJZChyZXBvc2l0b3J5SWQsIHR5cGVJZCk7Ci0gICAgICAgIGlmICh0eXBlRGVmQyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBvYmplY3QsIGEgdHlwZSB3aXRoIGlkICIgKyB0eXBlSWQgKyAiIGlzIHVua25vd24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlRGVmQy5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdG9yZWRPYmplY3Qgb2JqKSB7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZURlZkMgPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVCeUlkKHJlcG9zaXRvcnlJZCwgb2JqLmdldFR5cGVJZCgpKTsKLSAgICAgICAgcmV0dXJuIHR5cGVEZWZDLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgYWxsb3cgY2hlY2tpbiwgY2FuY2VsLCBjaGVja291dCBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIHZlcnNpb24gYXMgd2VsbAotICAgICAqIGFzIG9uIGEgdmVyc2lvbiBzZXJpZXMgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdmVyc2lvbmVkIGRvY3VtZW50Ci0gICAgICogKHZlcnNpb24gc2VyaWVzKSBpbiBlYWNoIGNhc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvCi0gICAgICogICAgICAgICAgICB2ZXJzaW9uIG9yIHZlcnNpb25lZCBkb2N1bWVudAotICAgICAqIEByZXR1cm4gdmVyc2lvbmVkIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZlcnNpb25lZERvY3VtZW50IGdldFZlcnNpb25lZERvY3VtZW50T2ZPYmplY3RJZChTdG9yZWRPYmplY3Qgc28pIHsKLSAgICAgICAgVmVyc2lvbmVkRG9jdW1lbnQgdmVyRG9jOwotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24pIHsKLSAgICAgICAgICAgIC8vIGdldCBkb2N1bWVudCB0aGUgdmVyc2lvbiBpcyBjb250YWluZWQgaW4gdG8gYwotICAgICAgICAgICAgdmVyRG9jID0gKChEb2N1bWVudFZlcnNpb24pIHNvKS5nZXRQYXJlbnREb2N1bWVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyRG9jID0gKFZlcnNpb25lZERvY3VtZW50KSBzbzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2ZXJEb2M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFZlcnNpb25lZERvY3VtZW50IHRlc3RJc05vdENoZWNrZWRPdXRCeVNvbWVvbmVFbHNlKFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgY2hlY2tJc1ZlcnNpb25hYmxlT2JqZWN0KHNvKTsKLSAgICAgICAgVmVyc2lvbmVkRG9jdW1lbnQgdmVyRG9jID0gZ2V0VmVyc2lvbmVkRG9jdW1lbnRPZk9iamVjdElkKHNvKTsKLSAgICAgICAgaWYgKHZlckRvYy5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgdGVzdENoZWNrZWRPdXRCeUN1cnJlbnRVc2VyKHVzZXIsIHZlckRvYyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmVyRG9jOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBWZXJzaW9uZWREb2N1bWVudCB0ZXN0SGFzUHJvcGVyQ2hlY2tlZE91dFN0YXR1cyhTdG9yZWRPYmplY3Qgc28sIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGNoZWNrSXNWZXJzaW9uYWJsZU9iamVjdChzbyk7Ci0gICAgICAgIFZlcnNpb25lZERvY3VtZW50IHZlckRvYyA9IGdldFZlcnNpb25lZERvY3VtZW50T2ZPYmplY3RJZChzbyk7Ci0KLSAgICAgICAgY2hlY2tIYXNVc2VyKHVzZXIpOwotCi0gICAgICAgIHRlc3RJc0NoZWNrZWRPdXQodmVyRG9jKTsKLSAgICAgICAgdGVzdENoZWNrZWRPdXRCeUN1cnJlbnRVc2VyKHVzZXIsIHZlckRvYyk7Ci0KLSAgICAgICAgcmV0dXJuIHZlckRvYzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0lzVmVyc2lvbmFibGVPYmplY3QoU3RvcmVkT2JqZWN0IHNvKSB7Ci0gICAgICAgIGlmICghKHNvIGluc3RhbmNlb2YgVmVyc2lvbmVkRG9jdW1lbnQgfHwgc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0ICIgKyBzby5nZXRJZCgpICsgIiBtdXN0IG9mIGEgdmVyc2lvbmFibGUgdHlwZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrSGFzVXNlcihTdHJpbmcgdXNlcikgewotICAgICAgICBpZiAobnVsbCA9PSB1c2VyIHx8IHVzZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbigiT2JqZWN0IGNhbid0IGJlIGNoZWNrZWQtaW4sIG5vIHVzZXIgaXMgZ2l2ZW4uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0Q2hlY2tlZE91dEJ5Q3VycmVudFVzZXIoU3RyaW5nIHVzZXIsIFZlcnNpb25lZERvY3VtZW50IHZlckRvYykgewotICAgICAgICBpZiAoIXVzZXIuZXF1YWxzKHZlckRvYy5nZXRDaGVja2VkT3V0QnkoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24oIk9iamVjdCBjYW4ndCBiZSBjaGVja2VkLWluLCB1c2VyICIgKyB2ZXJEb2MuZ2V0Q2hlY2tlZE91dEJ5KCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGVja2VkIG91dCB0aGUgZG9jdW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0SXNDaGVja2VkT3V0KFZlcnNpb25lZERvY3VtZW50IHZlckRvYykgewotICAgICAgICBpZiAoIXZlckRvYy5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbigiQ2Fub3QgY2hlY2staW46IERvY3VtZW50ICIgKyB2ZXJEb2MuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGNoZWNrZWQgb3V0LiIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvQXRvbUxpbmtJbmZvUHJvdmlkZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9BdG9tTGlua0luZm9Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGQzMzU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9BdG9tTGlua0luZm9Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5SZWxhdGlvbnNoaXBEaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlci5PYmplY3RJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLlJlbmRpdGlvbkluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm9IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlJlbmRpdGlvbkluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Db250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRG9jdW1lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRmlsaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuT2JqZWN0U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5WZXJzaW9uZWREb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5Qcm9wZXJ0eUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotCi0vKioKLSAqIEZvciB0aGUgQXRvbSBiaW5kaW5nIG1vcmUgaW5mb3JtYXRpb24gbWlnaHQgYmUgcmVxdWlyZWQgdGhhbiB0aGUgcmVzdWx0IG9mIGEKLSAqIHNlcnZpY2UgY2FsbCBwcm92aWRlcyAobWFpbmx5IHRvIGZpbGwgYWxsIHRoZSBsaW5rcykuIFRoaXMgY2xhc3MgZmlsbHMgdGhlCi0gKiBvYmplY3RJbmZvSG9sZGVyIHRoYXQgd2FzIGludHJvZHVjZWQgZm9yIHRoaXMgcHVycG9zZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdG9tTGlua0luZm9Qcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0b3JlTWFuYWdlciBmU3RvcmVNYW5hZ2VyOwotCi0gICAgcHVibGljIEF0b21MaW5rSW5mb1Byb3ZpZGVyKFN0b3JlTWFuYWdlciBzdG9yZU1hbmFnZXIpIHsKLSAgICAgICAgZlN0b3JlTWFuYWdlciA9IHN0b3JlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsT2JqZWN0SW5mb0hvbGRlciBvYmplY3Qgd2l0aCByZXF1aXJlZCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIEF0b20KLSAgICAgKiBiaW5kaW5nIGZvciBhIHNpbmdsZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBzbwotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGZvcgotICAgICAqIEBwYXJhbSBvZAotICAgICAqICAgICAgICAgICAgb2JqZWN0IGRhdGEKLSAgICAgKiBAcGFyYW0gb2JqSW5mbwotICAgICAqICAgICAgICAgICAgSG9sZGVyIHRvIGZpbGwgd2l0aCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdG9yZWRPYmplY3Qgc28sIE9iamVjdERhdGEgb2QsIAotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqSW5mbykgewotICAgICAgICBpZiAobnVsbCA9PSBvYmpJbmZvIHx8IG51bGwgPT0gc28pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlQnlJZChyZXBvc2l0b3J5SWQsIHNvLmdldFR5cGVJZCgpKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAvLyBGaWxsIGFsbCBzZXR0ZXJzOgotICAgICAgICBvYmpJbmZvLnNldElkKHNvLmdldElkKCkpOwotICAgICAgICBvYmpJbmZvLnNldE5hbWUoc28uZ2V0TmFtZSgpKTsKLSAgICAgICAgb2JqSW5mby5zZXRDcmVhdGVkQnkoc28uZ2V0Q3JlYXRlZEJ5KCkpOyAvLyAhCi0gICAgICAgIG9iakluZm8uc2V0Q3JlYXRpb25EYXRlKHNvLmdldENyZWF0ZWRBdCgpKTsgLy8gIQotICAgICAgICBvYmpJbmZvLnNldExhc3RNb2RpZmljYXRpb25EYXRlKHNvLmdldE1vZGlmaWVkQXQoKSk7Ci0gICAgICAgIG9iakluZm8uc2V0VHlwZUlkKHNvLmdldFR5cGVJZCgpKTsKLSAgICAgICAgb2JqSW5mby5zZXRCYXNlVHlwZSh0eXBlRGVmLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgIG9iakluZm8uc2V0T2JqZWN0KG9kKTsKLQotICAgICAgICAvLyB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uOgotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24pIHsKLSAgICAgICAgICAgIERvY3VtZW50VmVyc2lvbiB2ZXIgPSAoRG9jdW1lbnRWZXJzaW9uKSBzbzsKLSAgICAgICAgICAgIERvY3VtZW50VmVyc2lvbiBwd2MgPSB2ZXIuZ2V0UGFyZW50RG9jdW1lbnQoKS5nZXRQd2MoKTsKLSAgICAgICAgICAgIG9iakluZm8uc2V0SXNDdXJyZW50VmVyc2lvbih2ZXIgPT0gdmVyLmdldFBhcmVudERvY3VtZW50KCkuZ2V0TGF0ZXN0VmVyc2lvbihmYWxzZSkpOwotICAgICAgICAgICAgb2JqSW5mby5zZXRWZXJzaW9uU2VyaWVzSWQodmVyLmdldFBhcmVudERvY3VtZW50KCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBvYmpJbmZvLnNldFdvcmtpbmdDb3B5SWQocHdjID09IG51bGwgPyBudWxsIDogcHdjLmdldElkKCkpOwotICAgICAgICAgICAgb2JqSW5mby5zZXRXb3JraW5nQ29weU9yaWdpbmFsSWQocHdjID09IHZlciAmJiB2ZXIuZ2V0UGFyZW50RG9jdW1lbnQoKS5nZXRMYXRlc3RWZXJzaW9uKGZhbHNlKSAhPSBudWxsID8gdmVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJlbnREb2N1bWVudCgpLmdldExhdGVzdFZlcnNpb24oZmFsc2UpLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmIChzbyBpbnN0YW5jZW9mIFZlcnNpb25lZERvY3VtZW50KSB7Ci0gICAgICAgICAgICBWZXJzaW9uZWREb2N1bWVudCBkb2MgPSAoVmVyc2lvbmVkRG9jdW1lbnQpIHNvOwotICAgICAgICAgICAgRG9jdW1lbnRWZXJzaW9uIHB3YyA9IGRvYy5nZXRQd2MoKTsKLSAgICAgICAgICAgIG9iakluZm8uc2V0SXNDdXJyZW50VmVyc2lvbihmYWxzZSk7Ci0gICAgICAgICAgICBvYmpJbmZvLnNldFZlcnNpb25TZXJpZXNJZChkb2MuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBvYmpJbmZvLnNldFdvcmtpbmdDb3B5SWQocHdjID09IG51bGwgPyBudWxsIDogcHdjLmdldElkKCkpOwotICAgICAgICAgICAgb2JqSW5mby5zZXRXb3JraW5nQ29weU9yaWdpbmFsSWQobnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIHVudmVyc2lvbmVkIGRvY3VtZW50Ci0gICAgICAgICAgICBvYmpJbmZvLnNldElzQ3VycmVudFZlcnNpb24odHJ1ZSk7Ci0gICAgICAgICAgICBvYmpJbmZvLnNldFZlcnNpb25TZXJpZXNJZChudWxsKTsKLSAgICAgICAgICAgIG9iakluZm8uc2V0V29ya2luZ0NvcHlJZChudWxsKTsKLSAgICAgICAgICAgIG9iakluZm8uc2V0V29ya2luZ0NvcHlPcmlnaW5hbElkKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgQ29udGVudCkgewotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gKChDb250ZW50KSBzbykuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgb2JqSW5mby5zZXRIYXNDb250ZW50KGNvbnRlbnRTdHJlYW0gIT0gbnVsbCk7Ci0gICAgICAgICAgICBvYmpJbmZvLnNldENvbnRlbnRUeXBlKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCA/IGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKSA6IG51bGwpOwotICAgICAgICAgICAgb2JqSW5mby5zZXRGaWxlTmFtZShjb250ZW50U3RyZWFtICE9IG51bGwgPyBjb250ZW50U3RyZWFtLmdldEZpbGVOYW1lKCkgOiBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iakluZm8uc2V0SGFzQ29udGVudChmYWxzZSk7Ci0gICAgICAgICAgICBvYmpJbmZvLnNldENvbnRlbnRUeXBlKG51bGwpOwotICAgICAgICAgICAgb2JqSW5mby5zZXRGaWxlTmFtZShudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbGluZwotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBGaWxpbmcpIHsKLSAgICAgICAgICAgIEZpbGluZyBzb3AgPSAoKEZpbGluZykgc28pOwotICAgICAgICAgICAgb2JqSW5mby5zZXRIYXNQYXJlbnQoc29wLmhhc1BhcmVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iakluZm8uc2V0SGFzUGFyZW50KGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyA9IG9ialN0b3JlLmdldFJlbmRpdGlvbnMoc28sICIqIiwgMCwgMCk7Ci0gICAgICAgIGlmIChyZW5kaXRpb25zID09IG51bGwgfHwgcmVuZGl0aW9ucy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgb2JqSW5mby5zZXRSZW5kaXRpb25JbmZvcyhudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3Q8UmVuZGl0aW9uSW5mbz4gaW5mb3MgPSBuZXcgQXJyYXlMaXN0PFJlbmRpdGlvbkluZm8+KCk7Ci0gICAgICAgICAgICBmb3IgKFJlbmRpdGlvbkRhdGEgcmVuZGl0aW9uIDogcmVuZGl0aW9ucykgewotICAgICAgICAgICAgICAgIFJlbmRpdGlvbkluZm9JbXBsIGluZm8gPSBuZXcgUmVuZGl0aW9uSW5mb0ltcGwoKTsKLSAgICAgICAgICAgICAgICBpbmZvLnNldEtpbmQocmVuZGl0aW9uLmdldEtpbmQoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRJZChyZW5kaXRpb24uZ2V0U3RyZWFtSWQoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRDb250ZW50VHlwZShyZW5kaXRpb24uZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRMZW5ndGgocmVuZGl0aW9uLmdldEJpZ0xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBpbmZvLnNldFRpdGxlKHJlbmRpdGlvbi5nZXRUaXRsZSgpKTsKLSAgICAgICAgICAgICAgICBpbmZvcy5hZGQoaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvYmpJbmZvLnNldFJlbmRpdGlvbkluZm9zKGluZm9zKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbGF0aW9uc2hpcHMKLSAgICAgICAgb2JqSW5mby5zZXRTdXBwb3J0c1JlbGF0aW9uc2hpcHModHJ1ZSk7Ci0gICAgICAgIExpc3Q8U3RvcmVkT2JqZWN0PiByZWxzID0gb2JqU3RvcmUuZ2V0UmVsYXRpb25zaGlwcyhzby5nZXRJZCgpLCBudWxsLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHNyY0lkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihyZWxzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoU3RvcmVkT2JqZWN0IHJlbCA6IHJlbHMpIHsKLSAgICAgICAgICAgIHNyY0lkcy5hZGQocmVsLmdldElkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVscyA9IG9ialN0b3JlLmdldFJlbGF0aW9uc2hpcHMoc28uZ2V0SWQoKSwgbnVsbCwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlRBUkdFVCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB0YXJnZXRJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ocmVscy5zaXplKCkpOwotICAgICAgICBmb3IgKFN0b3JlZE9iamVjdCByZWwgOiByZWxzKSB7Ci0gICAgICAgICAgICB0YXJnZXRJZHMuYWRkKHJlbC5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBvYmpJbmZvLnNldFJlbGF0aW9uc2hpcFNvdXJjZUlkcyhzcmNJZHMpOwotICAgICAgICBvYmpJbmZvLnNldFJlbGF0aW9uc2hpcFRhcmdldElkcyh0YXJnZXRJZHMpOwotCi0gICAgICAgIG9iakluZm8uc2V0U3VwcG9ydHNQb2xpY2llcyh0cnVlKTsKLQotICAgICAgICBvYmpJbmZvLnNldEhhc0FjbCh0cnVlKTsKLQotICAgICAgICBvYmpJbmZvLnNldFN1cHBvcnRzRGVzY2VuZGFudHModHJ1ZSk7Ci0gICAgICAgIG9iakluZm8uc2V0U3VwcG9ydHNGb2xkZXJUcmVlKHRydWUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbE9iamVjdEluZm9Ib2xkZXIgb2JqZWN0IHdpdGggcmVxdWlyZWQgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBBdG9tCi0gICAgICogYmluZGluZyBmb3IgYSBzaW5nbGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gc28KLSAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IKLSAgICAgKiBAcGFyYW0gb2JqZWN0SW5mbwotICAgICAqICAgICAgICAgICAgSG9sZGVyIHRvIGZpbGwgd2l0aCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdG9yZWRPYmplY3Qgc28sIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8pIHsKLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBPYmplY3REYXRhIG9kID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5nZXRPYmplY3REYXRhKHRtLCBvYmpTdG9yZSwgc28sIG51bGwsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvZCwgb2JqZWN0SW5mbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbE9iamVjdEluZm9Ib2xkZXIgb2JqZWN0IHdpdGggcmVxdWlyZWQgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBBdG9tCi0gICAgICogYmluZGluZyBmb3IgYSBzaW5nbGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IKLSAgICAgKiBAcGFyYW0gb2JqZWN0SW5mbwotICAgICAqICAgICAgICAgICAgSG9sZGVyIHRvIGZpbGwgd2l0aCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8pIHsKLSAgICAgICAgaWYgKG51bGwgPT0gb2JqZWN0SW5mbyB8fCBudWxsID09IG9iamVjdElkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gb2JqZWN0U3RvcmUuZ2V0T2JqZWN0QnlJZChvYmplY3RJZCk7Ci0gICAgICAgIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvYmplY3RJbmZvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsT2JqZWN0SW5mb0hvbGRlciBvYmplY3Qgd2l0aCByZXF1aXJlZCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIEF0b20KLSAgICAgKiBiaW5kaW5nIGFmdGVyIGEgZ2V0Q2hpbGRyZW4oKSBjYWxsIGluIG5hdmlnYXRpb24gc2VydmljZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yCi0gICAgICogQHBhcmFtIG9iamVjdEluZm9zCi0gICAgICogICAgICAgICAgICBIb2xkZXIgdG8gZmlsbCB3aXRoIGluZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIG9iakxpc3QKLSAgICAgKiAgICAgICAgICAgIHJlc3VsdCBvZiBnZXRDaGlsZHJlbiBjYWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckxpc3Qgb2JqTGlzdCkgewotCi0gICAgICAgIGlmIChudWxsID09IG9iamVjdEluZm9zIHx8IG51bGwgPT0gb2JqTGlzdCB8fCBudWxsID09IG9iamVjdElkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaWxsIG9iamVjdCBpbmZvcm1hdGlvbiBmb3IgcmVxdWVzdGVkIG9iamVjdAotICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvYmplY3RJbmZvKTsKLSAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLQotICAgICAgICAvLyBGaWxsIG9iamVjdCBpbmZvcm1hdGlvbiBmb3IgYWxsIGNoaWxkcmVuIGluIHJlc3VsdCBsaXN0Ci0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJEYXRhIG9iamVjdCA6IG9iakxpc3QuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmaWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0SWQoKSwgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbE9iamVjdEluZm9Ib2xkZXIgb2JqZWN0IHdpdGggcmVxdWlyZWQgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBBdG9tCi0gICAgICogYmluZGluZyBmb3IgYW4gb2JqZWN0IGxpc3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGZvcgotICAgICAqIEBwYXJhbSBvYmplY3RJbmZvcwotICAgICAqICAgICAgICAgICAgSG9sZGVyIHRvIGZpbGwgd2l0aCBpbmZvcm1hdGlvbgotICAgICAqIEBwYXJhbSBvYmpMaXN0Ci0gICAgICogICAgICAgICAgICByZXN1bHQgb2YgZ2V0Q2hpbGRyZW4gY2FsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLAotICAgICAgICAgICAgT2JqZWN0TGlzdCBvYmpMaXN0KSB7Ci0KLSAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICBpZiAobnVsbCAhPSBvYmplY3RJZCkgewotICAgICAgICAgICAgLy8gRmlsbCBvYmplY3QgaW5mb3JtYXRpb24gZm9yIHJlcXVlc3RlZCBvYmplY3QKLSAgICAgICAgICAgIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBvYmpMaXN0ICYmIG51bGwgIT0gb2JqTGlzdC5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgIC8vIEZpbGwgb2JqZWN0IGluZm9ybWF0aW9uIGZvciBhbGwgY2hpbGRyZW4gaW4gcmVzdWx0IGxpc3QKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gbGlzdE9iamVjdHMgPSBvYmpMaXN0LmdldE9iamVjdHMoKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IGxpc3RPYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdCA6IGxpc3RPYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKG9iamVjdCwgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKE9iamVjdERhdGEgb2QsIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8pIHsKLSAgICAgICAgb2JqZWN0SW5mby5zZXRPYmplY3Qob2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGxPYmplY3RJbmZvSG9sZGVyIG9iamVjdCB3aXRoIHJlcXVpcmVkIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgQXRvbQotICAgICAqIGJpbmRpbmcgZm9yIGFuIE9iamVjdEluRm9sZGVyQ29udGFpbmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gb2JqZWN0SW5mb3MKLSAgICAgKiAgICAgICAgICAgIEhvbGRlciB0byBmaWxsIHdpdGggaW5mb3JtYXRpb24KLSAgICAgKiBAcGFyYW0gb2lmYwotICAgICAqICAgICAgICAgICAgcmVzdWx0IG9mIHByZXZpb3VzIGNhbGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKFN0cmluZyByZXBvc2l0b3J5SWQsIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLAotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgb2lmYykgewotCi0gICAgICAgIGlmIChudWxsID09IG9iamVjdEluZm9zIHx8IG51bGwgPT0gb2lmYykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmlsbCBvYmplY3QgaW5mb3JtYXRpb24gZm9yIGFsbCBlbGVtZW50cyBpbiByZXN1bHQgbGlzdAotICAgICAgICBmaWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBvYmplY3RJbmZvcywgb2lmYy5nZXRPYmplY3QoKSk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gb2lmYy5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIG9iamVjdCA6IG9pZmMuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIC8vIGNhbGwgcmVjdXJzaXZlbHkKLSAgICAgICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICAgICAgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SW5mb3MsIG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGxPYmplY3RJbmZvSG9sZGVyIG9iamVjdCB3aXRoIHJlcXVpcmVkIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgQXRvbQotICAgICAqIGJpbmRpbmcgZm9yIGEgbGlzdCB3aXRoIE9iamVjdEluRm9sZGVyQ29udGFpbmVycy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICBvYmplY3QgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yCi0gICAgICogQHBhcmFtIG9iamVjdEluZm9zCi0gICAgICogICAgICAgICAgICBIb2xkZXIgdG8gZmlsbCB3aXRoIGluZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIG9pZmNMaXN0Ci0gICAgICogICAgICAgICAgICByZXN1bHQgb2YgZ2V0RGVzY2VuZGFudHMgY2FsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLAotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gb2lmY0xpc3QpIHsKLQotICAgICAgICBpZiAobnVsbCA9PSBvYmplY3RJbmZvcyB8fCBudWxsID09IG9pZmNMaXN0IHx8IG51bGwgPT0gb2JqZWN0SWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgLy8gRmlsbCBvYmplY3QgaW5mb3JtYXRpb24gZm9yIHJlcXVlc3RlZCBvYmplY3QKLSAgICAgICAgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG9iamVjdEluZm8pOwotICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotCi0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgb2JqZWN0IDogb2lmY0xpc3QpIHsKLSAgICAgICAgICAgIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIG9iamVjdEluZm9zLCBvYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcywKLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyRGF0YSBvYmplY3QpIHsKLQotICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgIGZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIG9iamVjdC5nZXRPYmplY3QoKS5nZXRJZCgpLCBvYmplY3RJbmZvKTsKLSAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWxsT2JqZWN0SW5mb0hvbGRlciBvYmplY3Qgd2l0aCByZXF1aXJlZCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIEF0b20KLSAgICAgKiBiaW5kaW5nIGZvciBhIGxpc3Qgd2l0aCBPYmplY3RQYXJlbnREYXRhIG9iamVjdHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBvYmplY3RJZAotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGZvcgotICAgICAqIEBwYXJhbSBvYmplY3RJbmZvcwotICAgICAqICAgICAgICAgICAgSG9sZGVyIHRvIGZpbGwgd2l0aCBpbmZvcm1hdGlvbgotICAgICAqIEBwYXJhbSBvYmpQYXJlbnRzCi0gICAgICogICAgICAgICAgICByZXN1bHQgb2YgZ2V0T2JqZWN0UGFyZW50cyBjYWxsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzR2V0UGFyZW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsCi0gICAgICAgICAgICBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcywgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBvYmpQYXJlbnRzKSB7Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gb2JqZWN0SW5mb3MgfHwgbnVsbCA9PSBvYmpQYXJlbnRzIHx8IG51bGwgPT0gb2JqZWN0SWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbGwgb2JqZWN0IGluZm9ybWF0aW9uIGZvciByZXF1ZXN0ZWQgb2JqZWN0Ci0gICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG9iamVjdEluZm8pOwotCi0gICAgICAgIGZvciAoT2JqZWN0UGFyZW50RGF0YSBvYmplY3QgOiBvYmpQYXJlbnRzKSB7Ci0gICAgICAgICAgICBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmaWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBvYmplY3QuZ2V0T2JqZWN0KCkuZ2V0SWQoKSwgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjY3MDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0Jhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOw0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ3JlYXRhYmxlUHJvcGVydHlUeXBlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuQ21pc1NlcnZpY2VWYWxpZGF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuT2JqZWN0U3RvcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuUG9saWN5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZWRPYmplY3Q7DQotDQotcHVibGljIGNsYXNzIEJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbCBpbXBsZW1lbnRzIENtaXNTZXJ2aWNlVmFsaWRhdG9yIHsNCi0NCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9PQkpFQ1RfSUQgPSAiVW5rbm93biBvYmplY3QgaWQ6ICI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fUkVQT1NJVE9SWV9JRCA9ICJVbmtub3duIHJlcG9zaXRvcnkgaWQ6ICI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9JRF9DQU5OT1RfQkVfTlVMTCA9ICJPYmplY3QgSWQgY2Fubm90IGJlIG51bGwuIjsNCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9JRF9DQU5OT1RfQkVfTlVMTCA9ICJSZXBvc2l0b3J5IElkIGNhbm5vdCBiZSBudWxsLiI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fVFlQRV9JRCA9ICJVbmtub3duIHR5cGUgaWQ6ICI7DQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSURfQ0FOTk9UX0JFX05VTEwgPSAiVHlwZSBJZCBjYW5ub3QgYmUgbnVsbC4iOw0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RvcmVNYW5hZ2VyIGZTdG9yZU1hbmFnZXI7DQotDQotICAgIHB1YmxpYyBCYXNlU2VydmljZVZhbGlkYXRvckltcGwoU3RvcmVNYW5hZ2VyIHNtKSB7DQotICAgICAgICBmU3RvcmVNYW5hZ2VyID0gc207DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENoZWNrIGlmIHJlcG9zaXRvcnkgaXMga25vd24gYW5kIHRoYXQgb2JqZWN0IGV4aXN0cy4gVG8gYXZvaWQgbGF0ZXIgY2FsbHMNCi0gICAgICogdG8gYWdhaW4gcmV0cmlldmUgdGhlIG9iamVjdCBmcm9tIHRoZSBpZCByZXR1cm4gdGhlIHJldHJpZXZlZCBvYmplY3QgZm9yDQotICAgICAqIGxhdGVyIHVzZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQNCi0gICAgICogICAgICAgICAgICByZXBvc2l0b3J5IGlkDQotICAgICAqIEBwYXJhbSBvYmplY3RJZA0KLSAgICAgKiAgICAgICAgICAgIG9iamVjdCBpZA0KLSAgICAgKiBAcmV0dXJuIG9iamVjdCBmb3Igb2JqZWN0SWQNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdG9yZWRPYmplY3QgY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkKSB7DQotICAgICAgICBpZiAobnVsbCA9PSByZXBvc2l0b3J5SWQpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihSRVBPU0lUT1JZX0lEX0NBTk5PVF9CRV9OVUxMKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChudWxsID09IG9iamVjdElkKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oT0JKRUNUX0lEX0NBTk5PVF9CRV9OVUxMKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOw0KLQ0KLSAgICAgICAgaWYgKG9ialN0b3JlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFVOS05PV05fUkVQT1NJVE9SWV9JRCArIHJlcG9zaXRvcnlJZCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBvYmpTdG9yZS5nZXRPYmplY3RCeUlkKG9iamVjdElkKTsNCi0NCi0gICAgICAgIGlmIChzbyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihVTktOT1dOX09CSkVDVF9JRCArIG9iamVjdElkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgU3RvcmVkT2JqZWN0IGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzQnlQYXRoKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwYXRoLCBTdHJpbmcgdXNlcikgew0KLSAgICAgICAgaWYgKG51bGwgPT0gcmVwb3NpdG9yeUlkKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oUkVQT1NJVE9SWV9JRF9DQU5OT1RfQkVfTlVMTCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobnVsbCA9PSBwYXRoKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlBhdGggcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7DQotDQotICAgICAgICBpZiAob2JqU3RvcmUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oVU5LTk9XTl9SRVBPU0lUT1JZX0lEICsgcmVwb3NpdG9yeUlkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IG9ialN0b3JlLmdldE9iamVjdEJ5UGF0aChwYXRoLCB1c2VyKTsNCi0NCi0gICAgICAgIGlmIChzbyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biBwYXRoOiAiICsgcGF0aCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JlZE9iamVjdCBjaGVja1N0YW5kYXJkUGFyYW1ldGVyc0FsbG93TnVsbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IG51bGw7DQotDQotICAgICAgICBpZiAobnVsbCA9PSByZXBvc2l0b3J5SWQpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihSRVBPU0lUT1JZX0lEX0NBTk5PVF9CRV9OVUxMKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChudWxsICE9IG9iamVjdElkKSB7DQotDQotICAgICAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7DQotDQotICAgICAgICAgICAgaWYgKG9ialN0b3JlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihVTktOT1dOX1JFUE9TSVRPUllfSUQgKyByZXBvc2l0b3J5SWQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzbyA9IG9ialN0b3JlLmdldE9iamVjdEJ5SWQob2JqZWN0SWQpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzbyA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oVU5LTk9XTl9PQkpFQ1RfSUQgKyBvYmplY3RJZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdG9yZWRPYmplY3QgY2hlY2tFeGlzdGluZ09iamVjdElkKE9iamVjdFN0b3JlIG9ialN0b3JlLCBTdHJpbmcgb2JqZWN0SWQpIHsNCi0NCi0gICAgICAgIGlmIChudWxsID09IG9iamVjdElkKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oT0JKRUNUX0lEX0NBTk5PVF9CRV9OVUxMKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IG9ialN0b3JlLmdldE9iamVjdEJ5SWQob2JqZWN0SWQpOw0KLQ0KLSAgICAgICAgaWYgKHNvID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFVOS05PV05fT0JKRUNUX0lEICsgb2JqZWN0SWQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUmVwb3NpdG9yeUlkKFN0cmluZyByZXBvc2l0b3J5SWQpIHsNCi0gICAgICAgIGlmIChudWxsID09IHJlcG9zaXRvcnlJZCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFJFUE9TSVRPUllfSURfQ0FOTk9UX0JFX05VTEwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7DQotDQotICAgICAgICBpZiAob2JqU3RvcmUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFVOS05PV05fUkVQT1NJVE9SWV9JRCArIHJlcG9zaXRvcnlJZCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIFN0b3JlZE9iamVjdFtdIGNoZWNrUGFyYW1zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZDEsIFN0cmluZyBvYmplY3RJZDIpIHsNCi0gICAgICAgIFN0b3JlZE9iamVjdFtdIHNvID0gbmV3IFN0b3JlZE9iamVjdFsyXTsNCi0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7DQotICAgICAgICBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgIHNvWzBdID0gY2hlY2tFeGlzdGluZ09iamVjdElkKG9iamVjdFN0b3JlLCBvYmplY3RJZDEpOw0KLSAgICAgICAgc29bMV0gPSBjaGVja0V4aXN0aW5nT2JqZWN0SWQob2JqZWN0U3RvcmUsIG9iamVjdElkMik7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQb2xpY2llcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzKSB7DQotICAgICAgICBpZiAocG9saWN5SWRzICE9IG51bGwgJiYgcG9saWN5SWRzLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBwb2xpY3lJZCA6IHBvbGljeUlkcykgew0KLSAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0ZGMgPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVCeUlkKHJlcG9zaXRvcnlJZCwgcG9saWN5SWQpOw0KLSAgICAgICAgICAgICAgICBpZiAodGRjID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHBvbGljeSB0eXBlOiAiICsgcG9saWN5SWQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICh0ZGMuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRCYXNlVHlwZUlkKCkgIT0gQmFzZVR5cGVJZC5DTUlTX1BPTElDWSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ocG9saWN5SWQgKyAiIGlzIG5vdCBhIHBvbGljeSB0eXBlIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKFN0cmluZyByZXBvc2l0b3J5SWQsDQotICAgICAgICAgICAgQ29sbGVjdGlvbjxQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BlcnR5RGVmaW5pdGlvbnMgKQ0KLSAgICB7DQotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5SW5mbyA9IGZTdG9yZU1hbmFnZXIuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgcmVwb3NpdG9yeUNhcGFiaWxpdGllcyA9IHJlcG9zaXRvcnlJbmZvLmdldENhcGFiaWxpdGllcygpOw0KLSAgICAgICAgQ3JlYXRhYmxlUHJvcGVydHlUeXBlcyBjcmVhdGFibGVQcm9wZXJ0eVR5cGVzID0gcmVwb3NpdG9yeUNhcGFiaWxpdGllcy5nZXRDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKCk7DQotICAgICAgICANCi0gICAgICAgIFNldDxQcm9wZXJ0eVR5cGU+IGNyZWF0YWJsZVByb3BlcnR5VHlwZVNldCA9IGNyZWF0YWJsZVByb3BlcnR5VHlwZXMuY2FuQ3JlYXRlKCk7DQotICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wZXJ0eURlZmluaXRpb24gOiBwcm9wZXJ0eURlZmluaXRpb25zKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICghY3JlYXRhYmxlUHJvcGVydHlUeXBlU2V0LmNvbnRhaW5zKHByb3BlcnR5RGVmaW5pdGlvbi5nZXRQcm9wZXJ0eVR5cGUoKSkpDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigicHJvcGVydHlEZWZpbml0aW9uICIgKyBwcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSArDQotICAgICAgICAgICAgICAgICAgICAgICAgImlzIG9mIG5vdCBjcmVhdGFibGUgdHlwZSAiICsgcHJvcGVydHlEZWZpbml0aW9uLmdldFByb3BlcnR5VHlwZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBtYW5kYXRvcnkgcHJvcGVydGllcyBtdXN0IGhhdmUgYSBkZWZhdWx0IHZhbHVlDQotICAgICAgICAgICAgaWYgKHByb3BlcnR5RGVmaW5pdGlvbi5pc1JlcXVpcmVkKCkgJiYgDQotICAgICAgICAgICAgICAgICAgICAocHJvcGVydHlEZWZpbml0aW9uLmdldERlZmF1bHRWYWx1ZSgpID09IG51bGwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJwcm9wZXJ0eTogIiArIHByb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIHByb3BlcnRpZXMgbXVzdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tTZXR0YWJsZUF0dHJpYnV0ZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gb2xkVHlwZURlZmluaXRpb24sDQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gbmV3VHlwZURlZmluaXRpb24gKQ0KLSAgICB7DQotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5SW5mbyA9IGZTdG9yZU1hbmFnZXIuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgcmVwb3NpdG9yeUNhcGFiaWxpdGllcyA9IHJlcG9zaXRvcnlJbmZvLmdldENhcGFiaWxpdGllcygpOw0KLSAgICAgICAgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzID0gcmVwb3NpdG9yeUNhcGFiaWxpdGllcy5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChudWxsID09IG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMpDQotICAgICAgICAgICAgcmV0dXJuOyAvLyBubyByZXN0cmljdGlvbnMgZGVmaW5lZA0KLSAgICAgICAgaWYgKG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0Q29udHJvbGxhYmxlQWNsKCkgJiYNCi0gICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDb250cm9sbGFibGVQb2xpY3koKSAmJg0KLSAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENyZWF0YWJsZSgpICYmDQotICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RGVzY3JpcHRpb24oKSAmJg0KLSAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERpc3BsYXlOYW1lKCkgJiYNCi0gICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRGaWxlYWJsZSgpICYmDQotICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RnVsbHRleHRJbmRleGVkKCkgJiYNCi0gICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRJZCgpICYmDQotICAgICAgICAgICAgICAgIG5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkgJiYNCi0gICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRMb2NhbE5hbWUoKSAmJg0KLSAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldExvY2FsTmFtZXNwYWNlKCkgJiYNCi0gICAgICAgICAgICAgICAgbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRRdWVyeWFibGUoKSAmJg0KLSAgICAgICAgICAgICAgICBuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldFF1ZXJ5TmFtZSgpKQ0KLSAgICAgICAgICAgIHJldHVybjsgIC8vIGFsbCBpcyBhbGxvd2VkDQotICAgICAgICBpZiAoIW5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0Q29udHJvbGxhYmxlQWNsKCkgJiYgDQotICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmlzQ29udHJvbGxhYmxlQWNsKCkgIT0gbmV3VHlwZURlZmluaXRpb24uaXNDb250cm9sbGFibGVBY2woKSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oImNvbnRyb2xsYWJsZUFjbCBpcyBub3Qgc2V0dGFibGUgaW4gcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkICsgIiwgYnV0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGFuZCAiICsgbmV3VHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgZGlmZmVyIGluIGNvbnRyb2xsYWJsZUFjbCIpOw0KLSAgICAgICAgaWYgKCFuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENvbnRyb2xsYWJsZVBvbGljeSgpICYmIA0KLSAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5pc0NvbnRyb2xsYWJsZVBvbGljeSgpICE9IG5ld1R5cGVEZWZpbml0aW9uLmlzQ29udHJvbGxhYmxlUG9saWN5KCkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJjb250cm9sbGFibGVQb2xpY3kgaXMgbm90IHNldHRhYmxlIGluIHJlcG9zaXRvcnkgIiArIHJlcG9zaXRvcnlJZCArICIsIGJ1dCAiICsNCi0gICAgICAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBhbmQgIiArIG5ld1R5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGRpZmZlciBpbiBjb250cm9sbGFibGVQb2xpY3kiKTsNCi0gICAgICAgIGlmICghbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDcmVhdGFibGUoKSAmJiANCi0gICAgICAgICAgICAgICAgb2xkVHlwZURlZmluaXRpb24uaXNDcmVhdGFibGUoKSAhPSBuZXdUeXBlRGVmaW5pdGlvbi5pc0NyZWF0YWJsZSgpKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiaXNDcmVhdGFibGUgaXMgbm90IHNldHRhYmxlIGluIHJlcG9zaXRvcnkgIiArIHJlcG9zaXRvcnlJZCArICIsIGJ1dCAiICsNCi0gICAgICAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBhbmQgIiArIG5ld1R5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGRpZmZlciBpbiBpc0NyZWF0YWJsZSIpOw0KLSAgICAgICAgaWYgKCFuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERlc2NyaXB0aW9uKCkgJiYgDQotICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkgIT0gbmV3VHlwZURlZmluaXRpb24uZ2V0RGVzY3JpcHRpb24oKSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oImRlc2NyaXB0aW9uIGlzIG5vdCBzZXR0YWJsZSBpbiByZXBvc2l0b3J5ICIgKyByZXBvc2l0b3J5SWQgKyAiLCBidXQgIiArDQotICAgICAgICAgICAgICAgICAgICAgb2xkVHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgYW5kICIgKyBuZXdUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBkaWZmZXIgaW4gdGhlaXIgZGVzY3JpcHRpb24iKTsNCi0gICAgICAgIGlmICghbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXREaXNwbGF5TmFtZSgpICYmIA0KLSAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXREaXNwbGF5TmFtZSgpICE9IG5ld1R5cGVEZWZpbml0aW9uLmdldERpc3BsYXlOYW1lKCkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJkaXNwbGF5TmFtZSBpcyBub3Qgc2V0dGFibGUgaW4gcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkICsgIiwgYnV0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGFuZCAiICsgbmV3VHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgZGlmZmVyIGluIHRoZWlyIGRpc3BsYXlOYW1lIik7DQotICAgICAgICBpZiAoIW5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RmlsZWFibGUoKSAmJiANCi0gICAgICAgICAgICAgICAgb2xkVHlwZURlZmluaXRpb24uaXNGaWxlYWJsZSgpICE9IG5ld1R5cGVEZWZpbml0aW9uLmlzRmlsZWFibGUoKSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oImZpbGVhYmxlIGlzIG5vdCBzZXR0YWJsZSBpbiByZXBvc2l0b3J5ICIgKyByZXBvc2l0b3J5SWQgKyAiLCBidXQgIiArDQotICAgICAgICAgICAgICAgICAgICAgb2xkVHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgYW5kICIgKyBuZXdUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBkaWZmZXIgaW4gaXNGaWxlYWJsZSIpOw0KLSAgICAgICAgaWYgKCFuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldEZ1bGx0ZXh0SW5kZXhlZCgpICYmIA0KLSAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5pc0Z1bGx0ZXh0SW5kZXhlZCgpICE9IG5ld1R5cGVEZWZpbml0aW9uLmlzRnVsbHRleHRJbmRleGVkKCkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJmdWxsdGV4dEluZGV4ZWQgaXMgbm90IHNldHRhYmxlIGluIHJlcG9zaXRvcnkgIiArIHJlcG9zaXRvcnlJZCArICIsIGJ1dCAiICsNCi0gICAgICAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBhbmQgIiArIG5ld1R5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGRpZmZlciBpbiBpc0Z1bGx0ZXh0SW5kZXhlZCIpOw0KLSAgICAgICAgLy8gVE9ETyAgaG93IGNhbiB0aGUgaWRzIGRpZmZlcj8NCi0gICAgICAgIGlmICghbmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRJZCgpICYmIA0KLSAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICE9IG5ld1R5cGVEZWZpbml0aW9uLmdldElkKCkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJpZCBpcyBub3Qgc2V0dGFibGUgaW4gcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkICsgIiwgYnV0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGFuZCAiICsgbmV3VHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgZGlmZmVyIGluIHRoZWlyIGlkIik7DQotICAgICAgICBpZiAoIW5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0SW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkgJiYgDQotICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkgIT0gbmV3VHlwZURlZmluaXRpb24uaXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoKSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oImluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSBpcyBub3Qgc2V0dGFibGUgaW4gcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkICsgIiwgYnV0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGFuZCAiICsgbmV3VHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgZGlmZmVyIGluIHRoZWlyIGlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5Iik7DQotICAgICAgICBpZiAoIW5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lKCkgJiYgDQotICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmdldExvY2FsTmFtZSgpICE9IG5ld1R5cGVEZWZpbml0aW9uLmdldExvY2FsTmFtZSgpKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigibG9jYWxOYW1lIGlzIG5vdCBzZXR0YWJsZSBpbiByZXBvc2l0b3J5ICIgKyByZXBvc2l0b3J5SWQgKyAiLCBidXQgIiArDQotICAgICAgICAgICAgICAgICAgICAgb2xkVHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgYW5kICIgKyBuZXdUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBkaWZmZXIgaW4gdGhlaXIgbG9jYWxOYW1lIik7DQotICAgICAgICBpZiAoIW5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0TG9jYWxOYW1lc3BhY2UoKSAmJiANCi0gICAgICAgICAgICAgICAgb2xkVHlwZURlZmluaXRpb24uZ2V0TG9jYWxOYW1lc3BhY2UoKSAhPSBuZXdUeXBlRGVmaW5pdGlvbi5nZXRMb2NhbE5hbWVzcGFjZSgpKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigibG9jYWxOYW1lc3BhY2UgaXMgbm90IHNldHRhYmxlIGluIHJlcG9zaXRvcnkgIiArIHJlcG9zaXRvcnlJZCArICIsIGJ1dCAiICsNCi0gICAgICAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBhbmQgIiArIG5ld1R5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGRpZmZlciBpbiB0aGVpciBsb2NhbE5hbWVzcGFjZSIpOw0KLSAgICAgICAgaWYgKCFuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldFF1ZXJ5YWJsZSgpICYmIA0KLSAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5pc1F1ZXJ5YWJsZSgpICE9IG5ld1R5cGVEZWZpbml0aW9uLmlzUXVlcnlhYmxlKCkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJxdWVyeWFibGUgaXMgbm90IHNldHRhYmxlIGluIHJlcG9zaXRvcnkgIiArIHJlcG9zaXRvcnlJZCArICIsIGJ1dCAiICsNCi0gICAgICAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXRJZCgpICsgIiBhbmQgIiArIG5ld1R5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGRpZmZlciBpbiB0aGVpciBpc1F1ZXJ5YWJsZSIpOw0KLSAgICAgICAgaWYgKCFuZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldFF1ZXJ5TmFtZSgpICYmIA0KLSAgICAgICAgICAgICAgICBvbGRUeXBlRGVmaW5pdGlvbi5nZXRRdWVyeU5hbWUoKSAhPSBuZXdUeXBlRGVmaW5pdGlvbi5nZXRRdWVyeU5hbWUoKSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInF1ZXJ5TmFtZSBpcyBub3Qgc2V0dGFibGUgaW4gcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkICsgIiwgYnV0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgIG9sZFR5cGVEZWZpbml0aW9uLmdldElkKCkgKyAiIGFuZCAiICsgbmV3VHlwZURlZmluaXRpb24uZ2V0SWQoKSArICIgZGlmZmVyIGluIHRoZWlyIHF1ZXJ5TmFtZSIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrVXBkYXRlUHJvcGVydHlEZWZpbml0aW9ucyhNYXA8U3RyaW5nLFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gb2xkUHJvcGVydHlEZWZpbml0aW9ucywNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gbmV3UHJvcGVydHlEZWZpbml0aW9ucykNCi0gICAgew0KLSAgICAgICAgZm9yKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBuZXdQcm9wZXJ0eURlZmluaXRpb24gOiBuZXdQcm9wZXJ0eURlZmluaXRpb25zLnZhbHVlcygpKQ0KLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gb2xkUHJvcGVydHlEZWZpbml0aW9uID0gb2xkUHJvcGVydHlEZWZpbml0aW9ucy5nZXQobmV3UHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkpOw0KLSAgICAgICAgDQotICAgICAgICAgICAgaWYgKG9sZFByb3BlcnR5RGVmaW5pdGlvbi5pc0luaGVyaXRlZCgpKQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInByb3BlcnR5OiAiICsgb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHVwZGF0ZSBvZiBpbmhlcml0ZWQgcHJvcGVydGllcyBpcyBub3QgYWxsb3dlZCIpOw0KLSAgICAgICAgICAgIGlmICghKG9sZFByb3BlcnR5RGVmaW5pdGlvbi5pc1JlcXVpcmVkKCkpICYmIG5ld1Byb3BlcnR5RGVmaW5pdGlvbi5pc1JlcXVpcmVkKCkpDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigicHJvcGVydHk6ICIgKyBvbGRQcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICIgb3B0aW9uYWwgcHJvcGVydGllcyBtdXN0IG5vdCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVkIik7ICAgIA0KLSAgICAgICAgICAgIGlmIChvbGRQcm9wZXJ0eURlZmluaXRpb24uZ2V0UHJvcGVydHlUeXBlKCkgIT0gbmV3UHJvcGVydHlEZWZpbml0aW9uLmdldFByb3BlcnR5VHlwZSgpKQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInByb3BlcnR5OiAiICsgb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCB1cGRhdGUgdGhlIHByb3BlcnR5VHlwZSAoIiArIG9sZFByb3BlcnR5RGVmaW5pdGlvbi5nZXRQcm9wZXJ0eVR5cGUoKSArICIpIik7ICAgDQotICAgICAgICAgICAgaWYgKG9sZFByb3BlcnR5RGVmaW5pdGlvbi5nZXRDYXJkaW5hbGl0eSgpICE9IG5ld1Byb3BlcnR5RGVmaW5pdGlvbi5nZXRDYXJkaW5hbGl0eSgpKQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInByb3BlcnR5OiAiICsgb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCB1cGRhdGUgdGhlIGNhcmRpbmFsaXR5ICgiICsgb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldENhcmRpbmFsaXR5KCkgKyAiKSIpOyANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAob2xkUHJvcGVydHlEZWZpbml0aW9uLmlzT3BlbkNob2ljZSgpICYmICFuZXdQcm9wZXJ0eURlZmluaXRpb24uaXNPcGVuQ2hvaWNlKCkgKQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInByb3BlcnR5OiAiICsgb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAiIG9wZW4gY2hvaWNlIGNhbm5vdCBjaGFuZ2UgZnJvbSB0cnVlIHRvIGZhbHNlIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gY2hlY2sgY2hvaWNlcw0KLSAgICAgICAgICAgIGlmICghb2xkUHJvcGVydHlEZWZpbml0aW9uLmlzT3BlbkNob2ljZSgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgTGlzdDw/PiBvbGRDaG9pY2VzID0gb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldENob2ljZXMoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gb2xkQ2hvaWNlcykNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigicHJvcGVydHk6ICIgKyBvbGRQcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZXJlIHNob3VsZCBiZSBhbnkgY2hvaWNlcyB3aGVuIGl0J3Mgbm8gb3BlbiBjaG9pY2UiKTsNCi0gICAgICAgICAgICAgICAgTGlzdDw/PiBuZXdDaG9pY2VzID0gbmV3UHJvcGVydHlEZWZpbml0aW9uLmdldENob2ljZXMoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbmV3Q2hvaWNlcykNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJwcm9wZXJ0eTogIiArIG5ld1Byb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGVyZSBzaG91bGQgYmUgYW55IGNob2ljZXMgd2hlbiBpdCdzIG5vIG9wZW4gY2hvaWNlIik7DQotICAgICAgICAgICAgICAgIExpc3RJdGVyYXRvcjw/PiBuZXdDaG9pY2VzSXRlcmF0b3IgPSBuZXdDaG9pY2VzLmxpc3RJdGVyYXRvcigpOw0KLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvbGRDaG9pY2VPYmplY3QgOiBvbGRDaG9pY2VzKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgbmV3Q2hvaWNlT2JqZWN0ID0gbmV3Q2hvaWNlc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghKG9sZENob2ljZU9iamVjdCBpbnN0YW5jZW9mIENob2ljZSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJwcm9wZXJ0eTogIiArIG5ld1Byb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9sZCBjaG9pY2Ugb2JqZWN0IGlzIG5vdCBvZiBjbGFzcyBDaG9pY2U6ICIgKyBvbGRDaG9pY2VPYmplY3QudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIShuZXdDaG9pY2VPYmplY3QgaW5zdGFuY2VvZiBDaG9pY2UpKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigicHJvcGVydHk6ICIgKyBuZXdQcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuZXcgY2hvaWNlIG9iamVjdCBpcyBub3Qgb2YgY2xhc3MgQ2hvaWNlOiAiICsgbmV3Q2hvaWNlT2JqZWN0LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgQ2hvaWNlPD8+IG9sZENob2ljZSA9IChDaG9pY2U8Pz4pIG9sZENob2ljZU9iamVjdDsNCi0gICAgICAgICAgICAgICAgICAgIENob2ljZTw/PiBuZXdDaG9pY2UgPSAoQ2hvaWNlPD8+KSBuZXdDaG9pY2VPYmplY3Q7DQotICAgICAgICAgICAgICAgICAgICBMaXN0PD8+IG9sZFZhbHVlcyA9IG9sZENob2ljZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgTGlzdDw/PiBuZXdWYWx1ZXMgPSBuZXdDaG9pY2UuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG9sZFZhbHVlIDogb2xkVmFsdWVzKQ0KLSAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3VmFsdWVzLmNvbnRhaW5zKG9sZFZhbHVlKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJwcm9wZXJ0eTogIiArIG5ld1Byb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2YWx1ZTogIiArIG9sZFZhbHVlLnRvU3RyaW5nKCkgKyAiIGlzIG5vdCBpbiBuZXcgdmFsdWVzIG9mIHRoZSBuZXcgY2hvaWNlIik7DQotICAgICAgICAgICAgICAgICAgICB9ICAgICAgIA0KLSAgICAgICAgICAgICAgICB9ICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAgICAgLy8gY2hlY2sgcmVzdHJpY3Rpb25zDQotICAgICAgICAgICAgaWYgKG9sZFByb3BlcnR5RGVmaW5pdGlvbiBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uIG9sZFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24gPSAoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgb2xkUHJvcGVydHlEZWZpbml0aW9uOw0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uIG5ld1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb24gPSAoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgbmV3UHJvcGVydHlEZWZpbml0aW9uOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgQmlnRGVjaW1hbCBvbGRNaW5WYWx1ZSA9IG9sZFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24uZ2V0TWluVmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgQmlnRGVjaW1hbCBuZXdNaW5WYWx1ZSA9IG5ld1Byb3BlcnR5RGVjaW1hbERlZmluaXRpb24uZ2V0TWluVmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbmV3TWluVmFsdWUgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAob2xkTWluVmFsdWUgPT0gbnVsbCB8fCAobmV3TWluVmFsdWUuY29tcGFyZVRvKCBvbGRNaW5WYWx1ZSkgPiAwKSkpDQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInByb3BlcnR5OiAiICsgb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtaW5WYWx1ZSAiICsgb2xkTWluVmFsdWUgKyAiIGNhbm5vdCBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgdG8gIiArIG5ld01pblZhbHVlKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgb2xkTWF4VmFsdWUgPSBvbGRQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uLmdldE1heFZhbHVlKCk7DQotICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgbmV3TWF4VmFsdWUgPSBuZXdQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uLmdldE1heFZhbHVlKCk7DQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG5ld01heFZhbHVlICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKG9sZE1heFZhbHVlID09IG51bGwgfHwgKG5ld01heFZhbHVlLmNvbXBhcmVUbyggb2xkTWF4VmFsdWUpIDwgMCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJwcm9wZXJ0eTogIiArIG9sZFByb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbWF4VmFsdWUgIiArIG9sZE1heFZhbHVlICsgIiBjYW5ub3QgYmUgZnVydGhlciByZXN0cmljdGVkIHRvICIgKyBuZXdNYXhWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChvbGRQcm9wZXJ0eURlZmluaXRpb24gaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbiBvbGRQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uID0gKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIG9sZFByb3BlcnR5RGVmaW5pdGlvbjsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbiBuZXdQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uID0gKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIG5ld1Byb3BlcnR5RGVmaW5pdGlvbjsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgb2xkTWluVmFsdWUgPSBvbGRQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uLmdldE1pblZhbHVlKCk7DQotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbmV3TWluVmFsdWUgPSBuZXdQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uLmdldE1pblZhbHVlKCk7DQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG5ld01pblZhbHVlICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKG9sZE1pblZhbHVlID09IG51bGwgfHwgKG5ld01pblZhbHVlLmNvbXBhcmVUbyggb2xkTWluVmFsdWUpID4gMCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJwcm9wZXJ0eTogIiArIG9sZFByb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbWluVmFsdWUgIiArIG9sZE1pblZhbHVlICsgIiBjYW5ub3QgYmUgZnVydGhlciByZXN0cmljdGVkIHRvICIgKyBuZXdNaW5WYWx1ZSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG9sZE1heFZhbHVlID0gb2xkUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbi5nZXRNYXhWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIG5ld01heFZhbHVlID0gbmV3UHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbi5nZXRNYXhWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBuZXdNYXhWYWx1ZSAmJg0KLSAgICAgICAgICAgICAgICAgICAgICAgIChvbGRNYXhWYWx1ZSA9PSBudWxsIHx8IChuZXdNYXhWYWx1ZS5jb21wYXJlVG8oIG9sZE1heFZhbHVlKSA8IDApKSkNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigicHJvcGVydHk6ICIgKyBvbGRQcm9wZXJ0eURlZmluaXRpb24uZ2V0SWQoKSArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG1heFZhbHVlICIgKyBvbGRNYXhWYWx1ZSArICIgY2Fubm90IGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCB0byAiICsgbmV3TWF4VmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAob2xkUHJvcGVydHlEZWZpbml0aW9uIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIG9sZFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiA9IChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIG9sZFByb3BlcnR5RGVmaW5pdGlvbjsNCi0gICAgICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIG5ld1Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiA9IChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIG5ld1Byb3BlcnR5RGVmaW5pdGlvbjsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgb2xkTWF4VmFsdWUgPSBvbGRQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24uZ2V0TWF4TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgbmV3TWF4VmFsdWUgPSBuZXdQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24uZ2V0TWF4TGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG5ld01heFZhbHVlICYmDQotICAgICAgICAgICAgICAgICAgICAgICAgKG9sZE1heFZhbHVlID09IG51bGwgfHwgKG5ld01heFZhbHVlLmNvbXBhcmVUbyggb2xkTWF4VmFsdWUpIDwgMCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJwcm9wZXJ0eTogIiArIG9sZFByb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpICsgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbWF4VmFsdWUgIiArIG9sZE1heFZhbHVlICsgIiBjYW5ub3QgYmUgZnVydGhlciByZXN0cmljdGVkIHRvICIgKyBuZXdNYXhWYWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBjaGVjayBmb3IgcmVtb3ZlZCBwcm9wZXJ0aWVzDQotICAgICAgICBmb3IoUHJvcGVydHlEZWZpbml0aW9uPD8+IG9sZFByb3BlcnR5RGVmaW5pdGlvbiA6IG9sZFByb3BlcnR5RGVmaW5pdGlvbnMudmFsdWVzKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IG5ld1Byb3BlcnR5RGVmaW5pdGlvbiA9IG5ld1Byb3BlcnR5RGVmaW5pdGlvbnMuZ2V0KG9sZFByb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpKTsNCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBuZXdQcm9wZXJ0eURlZmluaXRpb24pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInByb3BlcnR5OiAiICsgb2xkUHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCByZW1vdmUgdGhhdCBwcm9wZXJ0eSIpOyAgICANCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrVXBkYXRlVHlwZSAoVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZSwgVHlwZURlZmluaXRpb24gdHlwZSkNCi0gICAgew0KLSAgICAgICAgaWYgKHVwZGF0ZVR5cGUuZ2V0SWQoKSAhPSB0eXBlLmdldElkKCkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJ0eXBlIHRvIHVwZGF0ZSBtdXN0IGJlIG9mIHRoZSBzYW1lIGlkOiAiICsgdXBkYXRlVHlwZS5nZXRJZCgpICsgIiwgIiArIHR5cGUuZ2V0SWQoKSk7DQotICAgICAgICBpZiAodXBkYXRlVHlwZS5nZXRCYXNlVHlwZUlkKCkgIT0gdHlwZS5nZXRCYXNlVHlwZUlkKCkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJiYXNlIHR5cGUgdG8gdXBkYXRlIG11c3QgYmUgdGhlIHNhbWU6ICIgKyB1cGRhdGVUeXBlLmdldEJhc2VUeXBlSWQoKSArICIsICIgKyB0eXBlLmdldEJhc2VUeXBlSWQoKSk7DQotICAgICAgICAvLyBhbnl0aGluZyBlbHNlIHNob3VsZCBiZSBpZ25vcmVkICAgICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgVHlwZURlZmluaXRpb24gY2hlY2tFeGlzdGluZ1R5cGVJZChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkKSB7DQotDQotICAgICAgICBpZiAobnVsbCA9PSB0eXBlSWQpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihUWVBFX0lEX0NBTk5PVF9CRV9OVUxMKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHRkYyA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZUJ5SWQocmVwb3NpdG9yeUlkLCB0eXBlSWQpOw0KLSAgICAgICAgaWYgKHRkYyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihVTktOT1dOX1RZUEVfSUQgKyB0eXBlSWQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRkYy5nZXRUeXBlRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotDQotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQmFzaWNUeXBlKFR5cGVEZWZpbml0aW9uIHR5cGUpDQotICAgIHsNCi0gICAgICAgIGlmICh0eXBlLmdldElkKCkgPT0gdHlwZS5nZXRCYXNlVHlwZUlkKCkudmFsdWUoKSkgICAgICAgDQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oInR5cGUgIiArIHR5cGUuZ2V0SWQoKSArICIgaXMgYSBiYXNpYyB0eXBlLCBiYXNpYyB0eXBlcyBhcmUgcmVhZC1vbmx5Iik7ICANCi0gICAgfQ0KLSAgICANCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGdldFJlcG9zaXRvcnlJbmZvcyhDYWxsQ29udGV4dCBjb250ZXh0LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZ2V0UmVwb3NpdG9yeUluZm8oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBnZXRUeXBlQ2hpbGRyZW4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBnZXRUeXBlRGVzY2VuZGFudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBnZXRUeXBlRGVmaW5pdGlvbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0Q2hpbGRyZW4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCANCi0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0RGVzY2VuZGFudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldEZvbGRlclRyZWUoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldE9iamVjdFBhcmVudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldEZvbGRlclBhcmVudChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0Q2hlY2tlZE91dERvY3MoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgaWYgKG51bGwgIT0gZm9sZGVySWQpIHsNCi0gICAgICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgY3JlYXRlRG9jdW1lbnQoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzQWxsb3dOdWxsKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsDQotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVyc0FsbG93TnVsbChyZXBvc2l0b3J5SWQsIHNvdXJjZUlkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVGb2xkZXIoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0W10gY3JlYXRlUmVsYXRpb25zaGlwKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBzb3VyY2VJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0SWQsIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzQWxsb3dOdWxsKHJlcG9zaXRvcnlJZCwgbnVsbCk7DQotICAgICAgICByZXR1cm4gY2hlY2tQYXJhbXMocmVwb3NpdG9yeUlkLCBzb3VyY2VJZCwgdGFyZ2V0SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGNyZWF0ZVBvbGljeShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEFjbCBhZGRBY2VzLA0KLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVyc0FsbG93TnVsbChyZXBvc2l0b3J5SWQsIGZvbGRlcklkKTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBDTUlTIDEuMQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVJdGVtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVyc0FsbG93TnVsbChyZXBvc2l0b3J5SWQsIGZvbGRlcklkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRBbGxvd2FibGVBY3Rpb25zKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIC8vDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0T2JqZWN0KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRQcm9wZXJ0aWVzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRSZW5kaXRpb25zKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRPYmplY3RCeVBhdGgoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzQnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgY29udGV4dC5nZXRVc2VybmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRDb250ZW50U3RyZWFtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHN0cmVhbUlkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IHVwZGF0ZVByb3BlcnRpZXMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZC5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdFtdIG1vdmVPYmplY3QoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEZvbGRlcklkLCBTdHJpbmcgc291cmNlRm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0W10gcmVzID0gbmV3IFN0b3JlZE9iamVjdFszXTsNCi0gICAgICAgIHJlc1swXSA9IGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7DQotICAgICAgICByZXNbMV0gPSBjaGVja0V4aXN0aW5nT2JqZWN0SWQoZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpLCBzb3VyY2VGb2xkZXJJZCk7DQotICAgICAgICByZXNbMl0gPSBjaGVja0V4aXN0aW5nT2JqZWN0SWQoZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpLCB0YXJnZXRGb2xkZXJJZCk7DQotICAgICAgICByZXR1cm4gcmVzOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGRlbGV0ZU9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZGVsZXRlVHJlZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsDQotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IHNldENvbnRlbnRTdHJlYW0oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsDQotICAgICAgICAgICAgQm9vbGVhbiBvdmVyd3JpdGVGbGFnLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGFwcGVuZENvbnRlbnRTdHJlYW0oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZC5nZXRWYWx1ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBkZWxldGVDb250ZW50U3RyZWFtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgY2hlY2tPdXQoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLCBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCkgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgY2FuY2VsQ2hlY2tPdXQoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGNoZWNrSW4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEFjbCBhZGRBY2VzLA0KLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLmdldFZhbHVlKCkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCB2ZXJzaW9uU2VyaWVzSWQgPT0gbnVsbCA/IG9iamVjdElkIDogdmVyc2lvblNlcmllc0lkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIHZlcnNpb25TZXJpZXNJZCA9PSBudWxsID8gb2JqZWN0SWQgOiB2ZXJzaW9uU2VyaWVzSWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldEFsbFZlcnNpb25zKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIHZlcnNpb25TZXJpZXNJZCA9PSBudWxsID8gb2JqZWN0SWQgOiB2ZXJzaW9uU2VyaWVzSWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBxdWVyeShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGdldENvbnRlbnRDaGFuZ2VzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdFtdIGFkZE9iamVjdFRvRm9sZGVyKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrUGFyYW1zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdFtdIHJlbW92ZU9iamVjdEZyb21Gb2xkZXIoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLA0KLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBpZiAoZm9sZGVySWQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBjaGVja1BhcmFtcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFN0b3JlZE9iamVjdFtdIHNvID0gbmV3IFN0b3JlZE9iamVjdFsxXTsNCi0gICAgICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOw0KLSAgICAgICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOw0KLSAgICAgICAgICAgIHNvWzBdID0gY2hlY2tFeGlzdGluZ09iamVjdElkKG9iamVjdFN0b3JlLCBvYmplY3RJZCk7DQotICAgICAgICAgICAgcmV0dXJuIHNvOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldE9iamVjdFJlbGF0aW9uc2hpcHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLA0KLSAgICAgICAgICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbiByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7DQotDQotICAgICAgICBpZiAocmVsYXRpb25zaGlwRGlyZWN0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRpb25zaGlwIGRpcmVjdGlvbiBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0eXBlSWQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVCeUlkKHJlcG9zaXRvcnlJZCwgdHlwZUlkKS5nZXRUeXBlRGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgIGlmICh0eXBlRGVmID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgSWQgIiArIHR5cGVJZCArICIgaXMgbm90IGtub3duIGluIHJlcG9zaXRvcnkgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgcmVwb3NpdG9yeUlkKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKCF0eXBlRGVmLmdldEJhc2VUeXBlSWQoKS5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgSWQgIiArIHR5cGVJZCArICIgaXMgbm90IGEgcmVsYXRpb25zaGlwIHR5cGUuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldEFjbChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGFwcGx5QWNsKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3RbXSBhcHBseVBvbGljeShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1BhcmFtcyhyZXBvc2l0b3J5SWQsIHBvbGljeUlkLCBvYmplY3RJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3RbXSByZW1vdmVQb2xpY3koQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3RbXSBzb3MgPSBjaGVja1BhcmFtcyhyZXBvc2l0b3J5SWQsIHBvbGljeUlkLCBvYmplY3RJZCk7DQotICAgICAgICBTdG9yZWRPYmplY3QgcG9sID0gc29zWzBdOw0KLSAgICAgICAgaWYgKCEocG9sIGluc3RhbmNlb2YgUG9saWN5KSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJZCAiICsgcG9saWN5SWQgKyAiIGlzIG5vdCBhIHBvbGljeSBvYmplY3QuIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc29zOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldEFwcGxpZWRQb2xpY2llcyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgY3JlYXRlKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICByZXR1cm4gY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnMocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBkZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBhcHBseUFjbChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpIHsNCi0NCi0gICAgICAgIHJldHVybiBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsNCi0gICAgfQ0KLSAgICANCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVR5cGUoQ2FsbENvbnRleHQgY2FsbENvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsNCi0NCi0gICAgICAgIGlmIChudWxsID09IHR5cGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyBwYXJlbnRUeXBlSWQgPSB0eXBlLmdldFBhcmVudFR5cGVJZCgpOw0KLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgcGFyZW50VHlwZUNvbnRhaW5lciA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZUJ5SWQocmVwb3NpdG9yeUlkLCBwYXJlbnRUeXBlSWQpOw0KLSAgICAgICAgaWYgKG51bGwgPT0gcGFyZW50VHlwZUNvbnRhaW5lcikgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFVOS05PV05fVFlQRV9JRCArIHBhcmVudFR5cGVJZCk7DQotICAgICAgICB9DQotICAgICAgICBUeXBlRGVmaW5pdGlvbiBwYXJlbnRUeXBlID0gcGFyZW50VHlwZUNvbnRhaW5lci5nZXRUeXBlRGVmaW5pdGlvbigpOw0KLSAgICAgICAgLy8gY2hlY2sgaWYgdHlwZSBjYW4gYmUgY3JlYXRlZA0KLSAgICAgICAgaWYgKCEocGFyZW50VHlwZS5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhbkNyZWF0ZSgpKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigicGFyZW50IHR5cGU6ICIgKyBwYXJlbnRUeXBlSWQgKyAiIGRvZXMgbm90IGFsbG93IG11dGFiaWxpdHkgY3JlYXRlIik7DQotICAgICAgICB9DQotICAgICAgICBjaGVja0NyZWF0YWJsZVByb3BlcnR5VHlwZXMocmVwb3NpdG9yeUlkLCB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiB1cGRhdGVUeXBlKENhbGxDb250ZXh0IGNhbGxDb250ZXh0LA0KLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgIA0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZSA9IGNoZWNrRXhpc3RpbmdUeXBlSWQocmVwb3NpdG9yeUlkLCB0eXBlLmdldElkKCkpOw0KLSAgICAgICAgY2hlY2tVcGRhdGVUeXBlKHVwZGF0ZVR5cGUsIHR5cGUpOw0KLSAgICAgICAgY2hlY2tCYXNpY1R5cGUodHlwZSk7DQotICAgICAgICAvLyBjaGVjayBpZiB0eXBlIGNhbiBiZSB1cGRhdGVkDQotICAgICAgICBpZiAoISh1cGRhdGVUeXBlLmdldFR5cGVNdXRhYmlsaXR5KCkuY2FuVXBkYXRlKCkpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJ0eXBlOiAiICsgdHlwZS5nZXRJZCgpICsgIiBkb2VzIG5vdCBhbGxvdyBtdXRhYmlsaXR5IHVwZGF0ZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2hlY2tDcmVhdGFibGVQcm9wZXJ0eVR5cGVzKHJlcG9zaXRvcnlJZCwgdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpOw0KLSAgICAgICAgY2hlY2tTZXR0YWJsZUF0dHJpYnV0ZXMocmVwb3NpdG9yeUlkLCB1cGRhdGVUeXBlLCB0eXBlICk7DQotICAgICAgICBjaGVja1VwZGF0ZVByb3BlcnR5RGVmaW5pdGlvbnModXBkYXRlVHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCksIHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpKTsNCi0gICAgICAgIHJldHVybiB1cGRhdGVUeXBlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZGVsZXRlVHlwZShDYWxsQ29udGV4dCBjYWxsQ29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7DQotICAgICAgICANCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIGRlbGV0ZVR5cGUgPSAgY2hlY2tFeGlzdGluZ1R5cGVJZChyZXBvc2l0b3J5SWQsIHR5cGVJZCk7DQotICAgICAgICBjaGVja0Jhc2ljVHlwZShkZWxldGVUeXBlKTsNCi0gICAgICAgIC8vIGNoZWNrIGlmIHR5cGUgY2FuIGJlIGRlbGV0ZWQNCi0gICAgICAgIGlmICghKGRlbGV0ZVR5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKS5jYW5EZWxldGUoKSkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oInR5cGU6ICIgKyB0eXBlSWQgKyAiIGRvZXMgbm90IGFsbG93IG11dGFiaWxpdHkgZGVsZXRlIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZGVsZXRlVHlwZTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0V4dGVuc2lvblNhbXBsZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0V4dGVuc2lvblNhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTkzMWUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9FeHRlbnNpb25TYW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLUBYbWxUeXBlKG5hbWUgPSAiY21pc0V4dGVuc2lvblR5cGUiLCBwcm9wT3JkZXIgPSB7ICJzIiwgImkiLCAiZiIgfSkKLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25TYW1wbGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQUdJQ19OVU1CRVIgPSA0MjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzOwotICAgIHByaXZhdGUgZmluYWwgaW50IGk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgZjsKLQotICAgIHB1YmxpYyBFeHRlbnNpb25TYW1wbGUoKSB7Ci0gICAgICAgIHMgPSAiVGhpcyBpcyBhbiBleGFtcGxlIGZvciBhIENNSVMgZXh0ZW5zaW9uLiI7Ci0gICAgICAgIGkgPSBNQUdJQ19OVU1CRVI7Ci0gICAgICAgIGYgPSBNYXRoLlBJOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEludCgpIHsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoKSB7Ci0gICAgICAgIHJldHVybiBmOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeUFic3RyYWN0U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeUFic3RyYWN0U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyZjgyYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlBYnN0cmFjdFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkNtaXNTZXJ2aWNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRG9jdW1lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuVmVyc2lvbmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogQ29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucwotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeUFic3RyYWN0U2VydmljZUltcGwgewotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0b3JlTWFuYWdlciBmU3RvcmVNYW5hZ2VyOwotICAgIHByb3RlY3RlZCBmaW5hbCBDbWlzU2VydmljZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIEF0b21MaW5rSW5mb1Byb3ZpZGVyIGZBdG9tTGlua1Byb3ZpZGVyOwotCi0gICAgcHJvdGVjdGVkIEluTWVtb3J5QWJzdHJhY3RTZXJ2aWNlSW1wbChTdG9yZU1hbmFnZXIgc3RvcmVNYW5hZ2VyLCBDbWlzU2VydmljZVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLSAgICAgICAgdGhpcy5mU3RvcmVNYW5hZ2VyID0gc3RvcmVNYW5hZ2VyOwotICAgICAgICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLSAgICAgICAgdGhpcy5mQXRvbUxpbmtQcm92aWRlciA9IG5ldyBBdG9tTGlua0luZm9Qcm92aWRlcihmU3RvcmVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5NZW1vcnlBYnN0cmFjdFNlcnZpY2VJbXBsKFN0b3JlTWFuYWdlciBzdG9yZU1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5mU3RvcmVNYW5hZ2VyID0gc3RvcmVNYW5hZ2VyOwotICAgICAgICB0aGlzLnZhbGlkYXRvciA9IHN0b3JlTWFuYWdlci5nZXRTZXJ2aWNlVmFsaWRhdG9yKCk7Ci0gICAgICAgIHRoaXMuZkF0b21MaW5rUHJvdmlkZXIgPSBuZXcgQXRvbUxpbmtJbmZvUHJvdmlkZXIoZlN0b3JlTWFuYWdlcik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBpZiAobnVsbCA9PSBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZURlZkMgPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVCeUlkKHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICAgICAgaWYgKHR5cGVEZWZDID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIG9iamVjdCwgYSB0eXBlIHdpdGggaWQgIiArIHR5cGVJZCArICIgaXMgdW5rbm93biIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR5cGVEZWZDLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8VHlwZURlZmluaXRpb24+IGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIExpc3Q8U3RyaW5nPiB0eXBlSWRzKSB7Ci0gICAgICAgIGlmIChudWxsID09IHR5cGVJZHMgfHwgdHlwZUlkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbj4odHlwZUlkcy5zaXplKCkpOwotICAgICAgICBmb3IgKFN0cmluZyB0eXBlSWQgOiB0eXBlSWRzKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0eXBlRGVmQyA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZUJ5SWQocmVwb3NpdG9yeUlkLCB0eXBlSWQpOwotICAgICAgICAgICAgaWYgKHR5cGVEZWZDID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBvYmplY3QsIGEgdHlwZSB3aXRoIGlkICIgKyB0eXBlSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyB1bmtub3duIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHR5cGVEZWZDLmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RvcmVkT2JqZWN0IG9iaikgewotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWZDID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlQnlJZChyZXBvc2l0b3J5SWQsIG9iai5nZXRUeXBlSWQoKSk7Ci0gICAgICAgIHJldHVybiB0eXBlRGVmQyA9PSBudWxsID8gbnVsbCA6IHR5cGVEZWZDLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2UgYWxsb3cgY2hlY2tpbiwgY2FuY2VsLCBjaGVja291dCBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIHZlcnNpb24gYXMgd2VsbAotICAgICAqIGFzIG9uIGEgdmVyc2lvbiBzZXJpZXMgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdmVyc2lvbmVkIGRvY3VtZW50Ci0gICAgICogKHZlcnNpb24gc2VyaWVzKSBpbiBlYWNoIGNhc2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvCi0gICAgICogICAgICAgICAgICB2ZXJzaW9uIG9yIHZlcnNpb25lZCBkb2N1bWVudAotICAgICAqIEByZXR1cm4gdmVyc2lvbmVkIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFZlcnNpb25lZERvY3VtZW50IGdldFZlcnNpb25lZERvY3VtZW50T2ZPYmplY3RJZChTdG9yZWRPYmplY3Qgc28pIHsKLQotICAgICAgICBWZXJzaW9uZWREb2N1bWVudCB2ZXJEb2M7Ci0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIERvY3VtZW50VmVyc2lvbikgewotICAgICAgICAgICAgLy8gZ2V0IGRvY3VtZW50IHRoZSB2ZXJzaW9uIGlzIGNvbnRhaW5lZCBpbiB0byBjCi0gICAgICAgICAgICB2ZXJEb2MgPSAoKERvY3VtZW50VmVyc2lvbikgc28pLmdldFBhcmVudERvY3VtZW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJEb2MgPSAoVmVyc2lvbmVkRG9jdW1lbnQpIHNvOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZlckRvYzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVmVyc2lvbmVkRG9jdW1lbnQgdGVzdElzTm90Q2hlY2tlZE91dEJ5U29tZW9uZUVsc2UoU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgdXNlcikgewotICAgICAgICBjaGVja0lzVmVyc2lvbmFibGVPYmplY3Qoc28pOwotICAgICAgICBWZXJzaW9uZWREb2N1bWVudCB2ZXJEb2MgPSBnZXRWZXJzaW9uZWREb2N1bWVudE9mT2JqZWN0SWQoc28pOwotICAgICAgICBpZiAodmVyRG9jLmlzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICB0ZXN0Q2hlY2tlZE91dEJ5Q3VycmVudFVzZXIodXNlciwgdmVyRG9jKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2ZXJEb2M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFZlcnNpb25lZERvY3VtZW50IHRlc3RIYXNQcm9wZXJDaGVja2VkT3V0U3RhdHVzKFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHVzZXIpIHsKLQotICAgICAgICBjaGVja0lzVmVyc2lvbmFibGVPYmplY3Qoc28pOwotICAgICAgICBWZXJzaW9uZWREb2N1bWVudCB2ZXJEb2MgPSBnZXRWZXJzaW9uZWREb2N1bWVudE9mT2JqZWN0SWQoc28pOwotCi0gICAgICAgIGNoZWNrSGFzVXNlcih1c2VyKTsKLQotICAgICAgICB0ZXN0SXNDaGVja2VkT3V0KHZlckRvYyk7Ci0gICAgICAgIHRlc3RDaGVja2VkT3V0QnlDdXJyZW50VXNlcih1c2VyLCB2ZXJEb2MpOwotCi0gICAgICAgIHJldHVybiB2ZXJEb2M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tJc1ZlcnNpb25hYmxlT2JqZWN0KFN0b3JlZE9iamVjdCBzbykgewotICAgICAgICBpZiAoIShzbyBpbnN0YW5jZW9mIFZlcnNpb25lZERvY3VtZW50IHx8IHNvIGluc3RhbmNlb2YgRG9jdW1lbnRWZXJzaW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJPYmplY3QgaXMgb2YgYSB2ZXJzaW9uYWJsZSB0eXBlIGJ1dCBub3QgaW5zdGFuY2Ugb2YgVmVyc2lvbmVkRG9jdW1lbnQgb3IgRG9jdW1lbnRWZXJzaW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tIYXNVc2VyKFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGlmIChudWxsID09IHVzZXIgfHwgdXNlci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oIk9iamVjdCBjYW4ndCBiZSBjaGVja2VkLWluLCBubyB1c2VyIGlzIGdpdmVuLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdENoZWNrZWRPdXRCeUN1cnJlbnRVc2VyKFN0cmluZyB1c2VyLCBWZXJzaW9uZWREb2N1bWVudCB2ZXJEb2MpIHsKLSAgICAgICAgaWYgKCF1c2VyLmVxdWFscyh2ZXJEb2MuZ2V0Q2hlY2tlZE91dEJ5KCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKCJVc2VyICIgKyB2ZXJEb2MuZ2V0Q2hlY2tlZE91dEJ5KCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGVja2VkIG91dCB0aGUgZG9jdW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0SXNDaGVja2VkT3V0KFZlcnNpb25lZERvY3VtZW50IHZlckRvYykgewotICAgICAgICBpZiAoIXZlckRvYy5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbigiRG9jdW1lbnQgIiArIHZlckRvYy5nZXRJZCgpICsgIiBpcyBub3QgY2hlY2tlZCBvdXQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NoZWNrZWRPdXQoU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgdXNlcikgewotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCB8fCBzbyBpbnN0YW5jZW9mIERvY3VtZW50VmVyc2lvbikgewotICAgICAgICAgICAgVmVyc2lvbmVkRG9jdW1lbnQgdmVyRG9jID0gZ2V0VmVyc2lvbmVkRG9jdW1lbnRPZk9iamVjdElkKHNvKTsKLSAgICAgICAgICAgIHJldHVybiB2ZXJEb2MuaXNDaGVja2VkT3V0KCkgJiYgdXNlci5lcXVhbHModmVyRG9jLmdldENoZWNrZWRPdXRCeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlBY2xTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlBY2xTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjFjOWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5QWNsU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlci5PYmplY3RJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRG9jdW1lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuT2JqZWN0U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEluTWVtb3J5QWNsU2VydmljZSBleHRlbmRzIEluTWVtb3J5QWJzdHJhY3RTZXJ2aWNlSW1wbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5NZW1vcnlBY2xTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICBwdWJsaWMgSW5NZW1vcnlBY2xTZXJ2aWNlKFN0b3JlTWFuYWdlciBzdG9yZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIoc3RvcmVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGdldEFjbChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gb25seUJhc2ljUGVybWlzc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgZ2V0QWNsKCkiKTsKLSAgICAgICAgaW50IGFjbElkOwotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSB2YWxpZGF0b3IuZ2V0QWNsKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24pIHsKLSAgICAgICAgICAgIGFjbElkID0gKChEb2N1bWVudFZlcnNpb24pIHNvKS5nZXRQYXJlbnREb2N1bWVudCgpLmdldEFjbElkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhY2xJZCA9IHNvLmdldEFjbElkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBY2wgYWNsID0gb2JqZWN0U3RvcmUuZ2V0QWNsKGFjbElkKTsKLQotICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBzbywgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjbEFkZCwgQWNsIGFjbFJlbW92ZSwKLSAgICAgICAgICAgIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0KLSAgICAgICAgQWNsIGFkZEFjZXMgPSBUeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksIGFjbEFkZCk7Ci0gICAgICAgIEFjbCByZW1vdmVBY2VzID0gVHlwZVZhbGlkYXRvci5leHBhbmRBY2xNYWtyb3MoY29udGV4dC5nZXRVc2VybmFtZSgpLCBhY2xSZW1vdmUpOwotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5hcHBseUFjbChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2xQcm9wYWdhdGlvbiwgZXh0ZW5zaW9uKTsKLSAgICAgICAgQWNsIGFjbCA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKS5hcHBseUFjbChzbywgYWRkQWNlcywgcmVtb3ZlQWNlcywgYWNsUHJvcGFnYXRpb24sCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRVc2VybmFtZSgpKTsKLQotICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBzbywgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY2w7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBhcHBseUFjbChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEFjbCBhY2VzUGFyYW0sCi0gICAgICAgICAgICBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbikgewotCi0gICAgICAgIEFjbCBhY2VzID0gVHlwZVZhbGlkYXRvci5leHBhbmRBY2xNYWtyb3MoY29udGV4dC5nZXRVc2VybmFtZSgpLCBhY2VzUGFyYW0pOwotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5hcHBseUFjbChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkKTsKLSAgICAgICAgcmV0dXJuIGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKS5hcHBseUFjbChzbywgYWNlcywgYWNsUHJvcGFnYXRpb24sIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlEaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5RGlzY292ZXJ5U2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4OWFiMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlEaXNjb3ZlcnlTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUG9saWN5SWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUG9saWN5SWRMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SWRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm9IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlTWFuYWdlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSW5NZW1vcnlEaXNjb3ZlcnlTZXJ2aWNlSW1wbCBleHRlbmRzIEluTWVtb3J5QWJzdHJhY3RTZXJ2aWNlSW1wbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5NZW1vcnlEaXNjb3ZlcnlTZXJ2aWNlSW1wbC5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgSW5NZW1vcnlEaXNjb3ZlcnlTZXJ2aWNlSW1wbChTdG9yZU1hbmFnZXIgc3RvcmVNYW5hZ2VyKSB7Ci0gICAgICAgIHN1cGVyKHN0b3JlTWFuYWdlcik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0Q29udGVudENoYW5nZXMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlTG9nVG9rZW4sCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFjbCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLSAgICAgICAgLy8gZHVtbXkgaW1wbGVtZW50YXRpb24gdXNpbmcgaGFyZCBjb2RlZCB2YWx1ZXMKLSAgICAgICAgZmluYWwgaW50IElURU1TX0FWQUlMQUJMRSA9IDI1OwotCi0gICAgICAgIGludCB0b2tlbiA9IDA7Ci0gICAgICAgIGlmIChjaGFuZ2VMb2dUb2tlbiAhPSBudWxsICYmIGNoYW5nZUxvZ1Rva2VuLmdldFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFjaGFuZ2VMb2dUb2tlbi5nZXRWYWx1ZSgpLnN0YXJ0c1dpdGgoInRva2VuLSIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gY2hhbmdlIGxvZyB0b2tlbiEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0b2tlbiA9IEludGVnZXIucGFyc2VJbnQoY2hhbmdlTG9nVG9rZW4uZ2V0VmFsdWUoKS5zdWJzdHJpbmcoNikpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNoYW5nZSBsb2cgdG9rZW4hIiwgbmZlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRva2VuIDwgMCB8fCB0b2tlbiA+IElURU1TX0FWQUlMQUJMRSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNoYW5nZSBsb2cgdG9rZW4hIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RMaXN0SW1wbCBvYmpMaXN0ID0gbmV3IE9iamVjdExpc3RJbXBsKCk7Ci0gICAgICAgIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSA2MCAqIDEwMDA7Ci0gICAgICAgIC8vIGNvbnZlcnQgT2JqZWN0SW5Gb2xkZXJDb250YWluZXJMaXN0IHRvIG9iamVjdExpc3QKLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiBsb2QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KCk7Ci0gICAgICAgIGlmIChudWxsID09IG1heEl0ZW1zKSB7Ci0gICAgICAgICAgICBtYXhJdGVtcyA9IEJpZ0ludGVnZXIudmFsdWVPZihJVEVNU19BVkFJTEFCTEUpOwotICAgICAgICB9Ci0gICAgICAgIGludCBsYXN0ID0gTWF0aC5taW4oSVRFTVNfQVZBSUxBQkxFLCB0b2tlbiArIG1heEl0ZW1zLmludFZhbHVlKCkpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSB0b2tlbjsgaSA8IGxhc3Q7IGkrKykgewotICAgICAgICAgICAgLy8gYWRkIGEgZHVtbXkgZGVsZXRlIGV2ZW50Ci0gICAgICAgICAgICBPYmplY3REYXRhSW1wbCBvZEltcGwgPSBuZXcgT2JqZWN0RGF0YUltcGwoKTsKLSAgICAgICAgICAgIFByb3BlcnRpZXNJbXBsIHByb3BzID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0gICAgICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShuZXcgUHJvcGVydHlJZEltcGwoUHJvcGVydHlJZHMuT0JKRUNUX0lELCAiY2wtIiArIGkpKTsKLSAgICAgICAgICAgIHByb3BzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eUlkSW1wbChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCkpKTsKLSAgICAgICAgICAgIHByb3BzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eUlkSW1wbChQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKSk7Ci0gICAgICAgICAgICBvZEltcGwuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0gICAgICAgICAgICBDaGFuZ2VFdmVudEluZm9EYXRhSW1wbCBjaGFuZ2VFdmVudEluZm8gPSBuZXcgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwoKTsKLSAgICAgICAgICAgIGNoYW5nZUV2ZW50SW5mby5zZXRDaGFuZ2VUeXBlKENoYW5nZVR5cGUuREVMRVRFRCk7Ci0gICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBldmVudFRpbWVzdGFtcCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgZXZlbnRUaW1lc3RhbXAuc2V0VGltZUluTWlsbGlzKHRpbWVzdGFtcCArIGkgKiAxMDAwKTsKLSAgICAgICAgICAgIGNoYW5nZUV2ZW50SW5mby5zZXRDaGFuZ2VUaW1lKGV2ZW50VGltZXN0YW1wKTsKLSAgICAgICAgICAgIG9kSW1wbC5zZXRDaGFuZ2VFdmVudEluZm8oY2hhbmdlRXZlbnRJbmZvKTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlUG9saWN5SWRzICE9IG51bGwgJiYgaW5jbHVkZVBvbGljeUlkcykgewotICAgICAgICAgICAgICAgIFBvbGljeUlkTGlzdCBwb2xpY2llcyA9IG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7Ci0gICAgICAgICAgICAgICAgb2RJbXBsLnNldFBvbGljeUlkcyhwb2xpY2llcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2QuYWRkKG9kSW1wbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBvYmpMaXN0LnNldE9iamVjdHMobG9kKTsKLSAgICAgICAgb2JqTGlzdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2YoSVRFTVNfQVZBSUxBQkxFIC0gdG9rZW4pKTsKLSAgICAgICAgb2JqTGlzdC5zZXRIYXNNb3JlSXRlbXMoZmFsc2UpOwotCi0gICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9ICJ0b2tlbi0iICsgKHRva2VuICsgbG9kLnNpemUoKSAtIDEpOwotICAgICAgICBjaGFuZ2VMb2dUb2tlbi5zZXRWYWx1ZShjaGFuZ2VUb2tlbik7Ci0KLSAgICAgICAgLy8gVG8gYmUgYWJsZSB0byBwcm92aWRlIGFsbCBBdG9tIGxpbmtzIGluIHRoZSByZXNwb25zZSB3ZSBuZWVkCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0gICAgICAgIGlmIChvYmplY3RJbmZvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBudWxsLCBvYmplY3RJbmZvcywgb2JqTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iakxpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbnZlcnRMaXN0KExpc3Q8T2JqZWN0RGF0YT4gbG9kLCBPYmplY3RJbkZvbGRlckNvbnRhaW5lciBvYmopIHsKLSAgICAgICAgbG9kLmFkZChvYmouZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCkpOwotICAgICAgICAvLyBhZGQgZHVtbXkgZXZlbnQgaW5mbwotICAgICAgICBPYmplY3REYXRhIG9pZiA9IG9iai5nZXRPYmplY3QoKS5nZXRPYmplY3QoKTsKLSAgICAgICAgT2JqZWN0RGF0YUltcGwgb2lmSW1wbCA9IChPYmplY3REYXRhSW1wbCkgb2lmOwotICAgICAgICBDaGFuZ2VFdmVudEluZm9EYXRhSW1wbCBjaGFuZ2VFdmVudEluZm8gPSBuZXcgQ2hhbmdlRXZlbnRJbmZvRGF0YUltcGwoKTsKLSAgICAgICAgY2hhbmdlRXZlbnRJbmZvLnNldENoYW5nZVR5cGUoQ2hhbmdlVHlwZS5VUERBVEVEKTsKLSAgICAgICAgY2hhbmdlRXZlbnRJbmZvLnNldENoYW5nZVRpbWUobmV3IEdyZWdvcmlhbkNhbGVuZGFyKCkpOwotICAgICAgICBvaWZJbXBsLnNldENoYW5nZUV2ZW50SW5mbyhjaGFuZ2VFdmVudEluZm8pOwotICAgICAgICBpZiAobnVsbCAhPSBvYmouZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckNvbnRhaW5lciBvaWZjIDogb2JqLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0TGlzdChsb2QsIG9pZmMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgcXVlcnkoKSIpOwotICAgICAgICB2YWxpZGF0b3IucXVlcnkoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBleHRlbnNpb24pOwotCi0gICAgICAgIFN0cmluZyB1c2VyID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgICAgICBPYmplY3RMaXN0IHJlczsKLQotICAgICAgICByZXMgPSBmU3RvcmVNYW5hZ2VyLnF1ZXJ5KHVzZXIsIHJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsIHNraXBDb3VudCk7Ci0gICAgICAgIExPRy5kZWJ1Zygic3RvcCBxdWVyeSgpIik7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlNdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlNdWx0aUZpbGluZ1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTNkMGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5TXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnN0cmFpbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlci5PYmplY3RJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeU11bHRpRmlsaW5nU2VydmljZUltcGwgZXh0ZW5kcyBJbk1lbW9yeUFic3RyYWN0U2VydmljZUltcGwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluTWVtb3J5TXVsdGlGaWxpbmdTZXJ2aWNlSW1wbC5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgcHVibGljIEluTWVtb3J5TXVsdGlGaWxpbmdTZXJ2aWNlSW1wbChTdG9yZU1hbmFnZXIgc3RvcmVNZ3IpIHsKLSAgICAgICAgc3VwZXIoc3RvcmVNZ3IpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9iamVjdFRvRm9sZGVyKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQm9vbGVhbiBhbGxWZXJzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIExPRy5kZWJ1ZygiQmVnaW4gYWRkT2JqZWN0VG9Gb2xkZXIoKSIpOwotCi0gICAgICAgIGlmIChhbGxWZXJzaW9ucyAhPSBudWxsICYmICFhbGxWZXJzaW9ucy5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYWRkIG9iamVjdCB0byBmb2xkZXIsIHZlcnNpb24gc3BlY2lmaWMgZmlsaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIFN0b3JlZE9iamVjdFtdIHNvcyA9IHZhbGlkYXRvci5hZGRPYmplY3RUb0ZvbGRlcihjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzb3NbMF07Ci0gICAgICAgIFN0b3JlZE9iamVjdCBmb2xkZXIgPSBzb3NbMV07Ci0gICAgICAgIGNoZWNrT2JqZWN0cyhyZXBvc2l0b3J5SWQsIHNvLCBmb2xkZXIpOwotCi0gICAgICAgIEZvbGRlciBuZXdQYXJlbnQgPSAoRm9sZGVyKSBmb2xkZXI7Ci0gICAgICAgIG9ialN0b3JlLmFkZFBhcmVudChzbywgbmV3UGFyZW50KTsKLSAgICAgICAgaWYgKGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgZkF0b21MaW5rUHJvdmlkZXIuZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgc28sIG9iamVjdEluZm8pOwotICAgICAgICAgICAgZkF0b21MaW5rUHJvdmlkZXIuZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgZm9sZGVyLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0cuZGVidWcoIkVuZCBhZGRPYmplY3RUb0ZvbGRlcigpIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLQotICAgICAgICBMT0cuZGVidWcoIkJlZ2luIHJlbW92ZU9iamVjdEZyb21Gb2xkZXIoKSIpOwotCi0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBTdG9yZWRPYmplY3RbXSBzb3MgPSB2YWxpZGF0b3IucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc29zWzBdOwotICAgICAgICBpZiAobnVsbCAhPSBmb2xkZXJJZCkgewotICAgICAgICAgICAgU3RvcmVkT2JqZWN0IGZvbGRlciA9IHNvc1sxXTsKLSAgICAgICAgICAgIGNoZWNrT2JqZWN0cyhyZXBvc2l0b3J5SWQsIHNvLCBmb2xkZXIpOwotICAgICAgICAgICAgRm9sZGVyIHBhcmVudCA9IChGb2xkZXIpIGZvbGRlcjsKLQotICAgICAgICAgICAgb2JqU3RvcmUucmVtb3ZlUGFyZW50KHNvLCBwYXJlbnQpOwotCi0gICAgICAgICAgICAvLyBUbyBiZSBhYmxlIHRvIHByb3ZpZGUgYWxsIEF0b20gbGlua3MgaW4gdGhlIHJlc3BvbnNlIHdlIG5lZWQKLSAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgICAgIGZBdG9tTGlua1Byb3ZpZGVyLmZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBmb2xkZXIsIG9iamVjdEluZm8pOwotICAgICAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGVja09iamVjdHMocmVwb3NpdG9yeUlkLCBzbywgbnVsbCk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFyZW50SWRzID0gb2JqU3RvcmUuZ2V0UGFyZW50SWRzKHNvLCBjb250ZXh0LmdldFVzZXJuYW1lKCkpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgcGFyZW50SWQgOiBwYXJlbnRJZHMpIHsKLSAgICAgICAgICAgICAgICBGb2xkZXIgcGFyZW50ID0gKEZvbGRlcikgb2JqU3RvcmUuZ2V0T2JqZWN0QnlJZChwYXJlbnRJZCk7Ci0gICAgICAgICAgICAgICAgb2JqU3RvcmUucmVtb3ZlUGFyZW50KHNvLCBwYXJlbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUbyBiZSBhYmxlIHRvIHByb3ZpZGUgYWxsIEF0b20gbGlua3MgaW4gdGhlIHJlc3BvbnNlIHdlIG5lZWQKLSAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgICAgIGZBdG9tTGlua1Byb3ZpZGVyLmZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcigpIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrT2JqZWN0cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdG9yZWRPYmplY3Qgc28sIFN0b3JlZE9iamVjdCBmb2xkZXIpIHsKLSAgICAgICAgaWYgKChzbyBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBvYmplY3QgdG8gZm9sZGVyLCBvYmplY3QgaWQgIiArIGZvbGRlci5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBpcyBhIGZvbGRlciBhbmQgZm9sZGVycyBhcmUgbm90IG11bHRpLWZpbGVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZvbGRlciAhPSBudWxsICYmICEoZm9sZGVyIGluc3RhbmNlb2YgRm9sZGVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJDYW5ub3QgYWRkIG9iamVjdCB0byBmb2xkZXIsIGZvbGRlciBpZCAiICsgZm9sZGVyLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IHJlZmVyIHRvIGEgZm9sZGVyLiIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlOYXZpZ2F0aW9uU2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeU5hdmlnYXRpb25TZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVkY2Q3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeU5hdmlnYXRpb25TZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdEluRm9sZGVyTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RQYXJlbnREYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLk9iamVjdEluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm9IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LkRhdGFPYmplY3RDcmVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LkZpbHRlclBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkRvY3VtZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZpbGVhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRmlsaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlByb3BlcnR5Q3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEluTWVtb3J5TmF2aWdhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgSW5NZW1vcnlBYnN0cmFjdFNlcnZpY2VJbXBsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRk9MREVSU19JTl9HRVRfREVTQyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluTWVtb3J5TmF2aWdhdGlvblNlcnZpY2VJbXBsLmNsYXNzKTsKLQotICAgIHB1YmxpYyBJbk1lbW9yeU5hdmlnYXRpb25TZXJ2aWNlSW1wbChTdG9yZU1hbmFnZXIgc3RvcmVNYW5hZ2VyKSB7Ci0gICAgICAgIHN1cGVyKHN0b3JlTWFuYWdlcik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgZ2V0Q2hlY2tlZE91dERvY3MoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgU3RyaW5nIG9yZGVyQnksIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0KLSAgICAgICAgdmFsaWRhdG9yLmdldENoZWNrZWRPdXREb2NzKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGV4dGVuc2lvbik7Ci0gICAgICAgIE9iamVjdExpc3RJbXBsIHJlcyA9IG5ldyBPYmplY3RMaXN0SW1wbCgpOwotICAgICAgICBMaXN0PE9iamVjdERhdGE+IG9kTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGdldENoZWNrZWRPdXREb2NzKCkiKTsKLQotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChudWxsID09IGZvbGRlcklkKSB7Ci0gICAgICAgICAgICBMaXN0PFN0b3JlZE9iamVjdD4gY2hlY2tlZE91dHMgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCkuZ2V0Q2hlY2tlZE91dERvY3VtZW50cyhvcmRlckJ5LAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFVzZXJuYW1lKCksIGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgICAgIGZvciAoU3RvcmVkT2JqZWN0IGNoZWNrZWRPdXQgOiBjaGVja2VkT3V0cykgewotICAgICAgICAgICAgICAgIFR5cGVNYW5hZ2VyIHRtID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2QgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmdldE9iamVjdERhdGEodG0sIG9ialN0b3JlLCBjaGVja2VkT3V0LCBmaWx0ZXIsIHVzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgZmFsc2UsIGZhbHNlLCBleHRlbnNpb24pOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCAvKiB3b3JraW5nQ29weSAqL2NoZWNrZWRPdXQsIG9iamVjdEluZm8pOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvZExpc3QuYWRkKG9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiZ2V0dGluZyBjaGVja2VkLW91dCBkb2N1bWVudHMgZm9yIGZvbGRlcjogIiArIGZvbGRlcklkKTsKLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuSW50ZXJuKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGZhbHNlLCAtMSwgLTEsIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkgPyBvYmplY3RJbmZvcyA6IG51bGwsIHVzZXIpOwotICAgICAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgY2hpbGQgOiBjaGlsZHJlbi5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIG9iaiA9IGNoaWxkLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKS5nZXRPYmplY3RCeUlkKG9iai5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNoZWNrZWQgb3V0OiBjaGlsZHJlbjoiICsgb2JqLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIERvY3VtZW50VmVyc2lvbiAmJiAoKERvY3VtZW50VmVyc2lvbikgc28pLmdldFBhcmVudERvY3VtZW50KCkuaXNDaGVja2VkT3V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb2RMaXN0LmFkZChvYmopOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBzbywgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlcy5zZXRPYmplY3RzKG9kTGlzdCk7Ci0gICAgICAgIHJlcy5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2Yob2RMaXN0LnNpemUoKSkpOwotICAgICAgICByZXMuc2V0SGFzTW9yZUl0ZW1zKGZhbHNlKTsKLQotICAgICAgICBMT0cuZGVidWcoImVuZCBnZXRDaGVja2VkT3V0RG9jcygpIik7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBTdHJpbmcgb3JkZXJCeSwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBnZXRDaGlsZHJlbigpIik7Ci0KLSAgICAgICAgdmFsaWRhdG9yLmdldENoaWxkcmVuKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgaW50IG1heEl0ZW1zSW50ID0gbWF4SXRlbXMgPT0gbnVsbCA/IC0xIDogbWF4SXRlbXMuaW50VmFsdWUoKTsKLSAgICAgICAgaW50IHNraXBDb3VudEludCA9IHNraXBDb3VudCA9PSBudWxsID8gMCA6IHNraXBDb3VudC5pbnRWYWx1ZSgpOwotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IHJlcyA9IGdldENoaWxkcmVuSW50ZXJuKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBtYXhJdGVtc0ludCwgc2tpcENvdW50SW50LCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpID8gb2JqZWN0SW5mb3MgOiBudWxsLCB1c2VyKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGdldENoaWxkcmVuKCkiKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQmlnSW50ZWdlciBkZXB0aCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGdldERlc2NlbmRhbnRzKCkiKTsKLQotICAgICAgICB2YWxpZGF0b3IuZ2V0RGVzY2VuZGFudHMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBpbnQgbGV2ZWxzOwotICAgICAgICBpZiAoZGVwdGggPT0gbnVsbCkgewotICAgICAgICAgICAgbGV2ZWxzID0gMjsgLy8gb25lIG9mIHRoZSByZWNvbW1lbmRlZCBkZWZhdWx0cyAoc2hvdWxkIGl0IGJlCi0gICAgICAgIH0gZWxzZSBpZiAoZGVwdGguaW50VmFsdWUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSB6ZXJvIGRlcHRoIGlzIG5vdCBhbGxvd2VkIGZvciBnZXREZXNjZW5kYW50cygpLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV2ZWxzID0gZGVwdGguaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZXZlbCA9IDA7Ci0gICAgICAgIFN0cmluZyB1c2VyID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiByZXN1bHQgPSBnZXREZXNjZW5kYW50c0ludGVybihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwgbGV2ZWwsIGxldmVscywKLSAgICAgICAgICAgICAgICBmYWxzZSwgb2JqZWN0SW5mb3MsIHVzZXIpOwotCi0gICAgICAgIExPRy5kZWJ1Zygic3RvcCBnZXREZXNjZW5kYW50cygpIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGdldEZvbGRlclBhcmVudCgpIik7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldEZvbGRlclBhcmVudChjb250ZXh0LCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBleHRlbnNpb24pOwotCi0gICAgICAgIEZvbGRlciBmb2xkZXIgPSBudWxsOwotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgIGZvbGRlciA9IChGb2xkZXIpIHNvOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGdldCBmb2xkZXIgcGFyZW50LCBpZCBkb2VzIG5vdCByZWZlciB0byBhIGZvbGRlcjogIgotICAgICAgICAgICAgICAgICAgICArIGZvbGRlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdERhdGEgcmVzID0gZ2V0Rm9sZGVyUGFyZW50SW50ZXJuKHJlcG9zaXRvcnlJZCwgZm9sZGVyLCBmaWx0ZXIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpID8gb2JqZWN0SW5mb3MgOiBudWxsKTsKLSAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGdldCBwYXJlbnQgb2YgYSByb290IGZvbGRlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVG8gYmUgYWJsZSB0byBwcm92aWRlIGFsbCBBdG9tIGxpbmtzIGluIHRoZSByZXNwb25zZSB3ZSBuZWVkCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0gICAgICAgIGlmIChjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgIGZBdG9tTGlua1Byb3ZpZGVyLmZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0cuZGVidWcoInN0b3AgZ2V0Rm9sZGVyUGFyZW50KCkiKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0Rm9sZGVyVHJlZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIGRlcHRoLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgZ2V0Rm9sZGVyVHJlZSgpIik7Ci0KLSAgICAgICAgdmFsaWRhdG9yLmdldEZvbGRlclRyZWUoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBpZiAoZGVwdGggIT0gbnVsbCAmJiBkZXB0aC5pbnRWYWx1ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJBIHplcm8gZGVwdGggaXMgbm90IGFsbG93ZWQgZm9yIGdldEZvbGRlclRyZWUoKS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZXZlbHMgPSBkZXB0aCA9PSBudWxsID8gMiA6IGRlcHRoLmludFZhbHVlKCk7Ci0gICAgICAgIGludCBsZXZlbCA9IDA7Ci0gICAgICAgIFN0cmluZyB1c2VyID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiByZXN1bHQgPSBnZXREZXNjZW5kYW50c0ludGVybihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwgbGV2ZWwsIGxldmVscywKLSAgICAgICAgICAgICAgICB0cnVlLCBvYmplY3RJbmZvcywgdXNlcik7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGdldEZvbGRlclRyZWUoKSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sCi0gICAgICAgICAgICBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgZ2V0T2JqZWN0UGFyZW50cygpIik7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldE9iamVjdFBhcmVudHMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAvLyBmb3Igbm93IHdlIGhhdmUgb25seSBmb2xkZXJzIHRoYXQgaGF2ZSBhIHBhcmVudCBhbmQgdGhlIGluLW1lbW9yeQotICAgICAgICAvLyBwcm92aWRlciBvbmx5IGhhcyBvbmUKLSAgICAgICAgLy8gcGFyZW50IGZvciBlYWNoIG9iamVjdCAobm8gbXVsdGktZmlsaW5nKQotICAgICAgICBMaXN0PE9iamVjdFBhcmVudERhdGE+IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgRmlsaW5nIHNwbyA9IG51bGw7Ci0gICAgICAgIGlmICghKHNvIGluc3RhbmNlb2YgRmlsaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gZ2V0T2JqZWN0UGFyZW50c0ludGVybihyZXBvc2l0b3J5SWQsIHNvLCBmaWx0ZXIsIGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSA/IG9iamVjdEluZm9zIDogbnVsbCwKLSAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsCi0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRVc2VybmFtZSgpKTsKLQotICAgICAgICAvLyBUbyBiZSBhYmxlIHRvIHByb3ZpZGUgYWxsIEF0b20gbGlua3MgaW4gdGhlIHJlc3BvbnNlIHdlIG5lZWQKLSAgICAgICAgLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKLSAgICAgICAgaWYgKGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgZkF0b21MaW5rUHJvdmlkZXIuZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgc28sIG9iamVjdEluZm8pOwotICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIExPRy5kZWJ1Zygic3RvcCBnZXRPYmplY3RQYXJlbnRzKCkiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBwcml2YXRlIGhlbHBlcnMKLQotICAgIHByaXZhdGUgT2JqZWN0SW5Gb2xkZXJMaXN0IGdldENoaWxkcmVuSW50ZXJuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50cywgaW50IG1heEl0ZW1zLCBpbnQgc2tpcENvdW50LCBib29sZWFuIGZvbGRlck9ubHksIGJvb2xlYW4gaW5jbHVkZVB3YywKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLCBTdHJpbmcgdXNlcikgewotCi0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdEltcGwgcmVzdWx0ID0gbmV3IE9iamVjdEluRm9sZGVyTGlzdEltcGwoKTsKLSAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckRhdGE+IGZvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4oKTsKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IG9ialN0b3JlLmdldE9iamVjdEJ5SWQoZm9sZGVySWQpOwotICAgICAgICBib29sZWFuIGNtaXMxMSA9IEluTWVtb3J5U2VydmljZUNvbnRleHQuZ2V0Q2FsbENvbnRleHQoKS5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotCi0gICAgICAgIGlmIChzbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJVbmtub3duIG9iamVjdCBpZDogIiArIGZvbGRlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKHNvIGluc3RhbmNlb2YgRm9sZGVyKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGl0IGlzIGEgZG9jdW1lbnQgYW5kIGhhcyBubyBjaGlsZHJlbgotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0U3RvcmUuQ2hpbGRyZW5SZXN1bHQgY2hpbGRyZW4gPSBmb2xkZXJPbmx5ID8gb2JqU3RvcmUuZ2V0Rm9sZGVyQ2hpbGRyZW4oKEZvbGRlcikgc28sIG1heEl0ZW1zLCBza2lwQ291bnQsCi0gICAgICAgICAgICAgICAgdXNlcikgOiBvYmpTdG9yZS5nZXRDaGlsZHJlbigoRm9sZGVyKSBzbywgbWF4SXRlbXMsIHNraXBDb3VudCwgdXNlciwgaW5jbHVkZVB3Yyk7Ci0KLSAgICAgICAgZm9yIChGaWxlYWJsZSBjaGlsZCA6IGNoaWxkcmVuLmdldENoaWxkcmVuKCkpIHsKLQotICAgICAgICAgICAgaWYgKCFjbWlzMTEgJiYgY2hpbGQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSBpdGVtcyBmb3IgQ01JUyAxLjAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCBvaWZkID0gbmV3IE9iamVjdEluRm9sZGVyRGF0YUltcGwoKTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlUGF0aFNlZ21lbnRzICE9IG51bGwgJiYgaW5jbHVkZVBhdGhTZWdtZW50cykgewotICAgICAgICAgICAgICAgIG9pZmQuc2V0UGF0aFNlZ21lbnQoY2hpbGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdERhdGEgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmdldE9iamVjdERhdGEodG0sIG9ialN0b3JlLCBjaGlsZCwgZmlsdGVyLCB1c2VyLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgZmFsc2UsIGZhbHNlLCBudWxsKTsKLQotICAgICAgICAgICAgb2lmZC5zZXRPYmplY3Qob2JqZWN0RGF0YSk7Ci0gICAgICAgICAgICBmb2xkZXJMaXN0LmFkZChvaWZkKTsKLSAgICAgICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBBdG9tCi0gICAgICAgICAgICBpZiAob2JqZWN0SW5mb3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBjaGlsZCwgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0T2JqZWN0cyhmb2xkZXJMaXN0KTsKLSAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKEJpZ0ludGVnZXIudmFsdWVPZihjaGlsZHJlbi5nZXROb0l0ZW1zKCkpKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhjaGlsZHJlbi5nZXROb0l0ZW1zKCkgPiBza2lwQ291bnQgKyBmb2xkZXJMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgaWYgKG9iamVjdEluZm9zICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgIGZBdG9tTGlua1Byb3ZpZGVyLmZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldERlc2NlbmRhbnRzSW50ZXJuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnRzLCBpbnQgbGV2ZWwsIGludCBtYXhMZXZlbHMsIGJvb2xlYW4gZm9sZGVyT25seSwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICBTdHJpbmcgdXNlcikgewotCi0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGNoaWxkcmVuT2ZGb2xkZXJJZCA9IG51bGw7Ci0gICAgICAgIGlmIChtYXhMZXZlbHMgPT0gLTEgfHwgbGV2ZWwgPCBtYXhMZXZlbHMpIHsKLSAgICAgICAgICAgIFN0cmluZyBvcmRlckJ5ID0gUHJvcGVydHlJZHMuTkFNRTsKLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuSW50ZXJuKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgIE1BWF9GT0xERVJTX0lOX0dFVF9ERVNDLCAwLCBmb2xkZXJPbmx5LCBmYWxzZSwgb2JqZWN0SW5mb3MsIHVzZXIpOwotICAgICAgICAgICAgY2hpbGRyZW5PZkZvbGRlcklkID0gbmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4oKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IGNoaWxkcmVuKSB7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBjaGlsZCA6IGNoaWxkcmVuLmdldE9iamVjdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwgb2lmYyA9IG5ldyBPYmplY3RJbkZvbGRlckNvbnRhaW5lckltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoaWxkSWQgPSBjaGlsZC5nZXRPYmplY3QoKS5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBzdWJDaGlsZHJlbiA9IGdldERlc2NlbmRhbnRzSW50ZXJuKHJlcG9zaXRvcnlJZCwgY2hpbGRJZCwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsICsgMSwgbWF4TGV2ZWxzLCBmb2xkZXJPbmx5LCBvYmplY3RJbmZvcywgdXNlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgb2lmYy5zZXRPYmplY3QoY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzdWJDaGlsZHJlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgb2lmYy5zZXRDaGlsZHJlbihzdWJDaGlsZHJlbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5PZkZvbGRlcklkLmFkZChvaWZjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuT2ZGb2xkZXJJZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gZ2V0T2JqZWN0UGFyZW50c0ludGVybihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdG9yZWRPYmplY3Qgc28sIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcywgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBTdHJpbmcgdXNlcikgewotCi0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxPYmplY3RQYXJlbnREYXRhPigpOwotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmVudElkcyA9IG9ialN0b3JlLmdldFBhcmVudElkcyhzbywgdXNlcik7Ci0gICAgICAgIGlmIChudWxsICE9IHBhcmVudElkcykgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgcGFyZW50SWQgOiBwYXJlbnRJZHMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RQYXJlbnREYXRhSW1wbCBwYXJlbnREYXRhID0gbmV3IE9iamVjdFBhcmVudERhdGFJbXBsKCk7Ci0gICAgICAgICAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICAgICAgRm9sZGVyIHBhcmVudCA9IChGb2xkZXIpIG9ialN0b3JlLmdldE9iamVjdEJ5SWQocGFyZW50SWQpOwotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqRGF0YSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuZ2V0T2JqZWN0RGF0YSh0bSwgb2JqU3RvcmUsIHBhcmVudCwgZmlsdGVyLCB1c2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGZhbHNlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgICAgICBwYXJlbnREYXRhLnNldE9iamVjdChvYmpEYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCAmJiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCAmJiBzbyBpbnN0YW5jZW9mIEZpbGVhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudERhdGEuc2V0UmVsYXRpdmVQYXRoU2VnbWVudCgoKEZpbGVhYmxlKSBzbykuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocGFyZW50RGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdEluZm9zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBwYXJlbnQsIG9iamVjdEluZm8pOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3REYXRhIGdldEZvbGRlclBhcmVudEludGVybihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdG9yZWRPYmplY3Qgc28sIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHVzZXIsCi0gICAgICAgICAgICBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIE9iamVjdERhdGFJbXBsIHBhcmVudCA9IG5ldyBPYmplY3REYXRhSW1wbCgpOwotCi0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBMaXN0PFN0cmluZz4gcGFyZW50cyA9IG9ialN0b3JlLmdldFBhcmVudElkcyhzbywgdXNlcik7Ci0gICAgICAgIGlmIChudWxsID09IHBhcmVudHMgfHwgcGFyZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXJlbnRJZCA9IHBhcmVudHMuZ2V0KDApOwotCi0gICAgICAgIEZvbGRlciBwYXJlbnRGb2xkZXIgPSAoRm9sZGVyKSBvYmpTdG9yZS5nZXRPYmplY3RCeUlkKHBhcmVudElkKTsKLQotICAgICAgICBjb3B5RmlsdGVyZWRQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgcGFyZW50Rm9sZGVyLCBmaWx0ZXIsIHBhcmVudCk7Ci0KLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHBhcmVudC5zZXRSZWxhdGlvbnNoaXBzKERhdGFPYmplY3RDcmVhdG9yLmdldFJlbGF0aW9uc2hpcHModG0sIG9ialN0b3JlLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcGFyZW50Rm9sZGVyLAotICAgICAgICAgICAgICAgIHVzZXIpKTsKLQotICAgICAgICBpZiAoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgIT0gbnVsbCAmJiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucykgewotICAgICAgICAgICAgQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zID0gcGFyZW50Rm9sZGVyLmdldEFsbG93YWJsZUFjdGlvbnModXNlcik7Ci0gICAgICAgICAgICBwYXJlbnQuc2V0QWxsb3dhYmxlQWN0aW9ucyhhbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvYmplY3RJbmZvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBwYXJlbnRGb2xkZXIsIG9iamVjdEluZm8pOwotICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgdm9pZCBjb3B5RmlsdGVyZWRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIGZpbHRlciwgT2JqZWN0RGF0YUltcGwgb2JqRGF0YSkgewotICAgICAgICBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3RlZElkcyA9IEZpbHRlclBhcnNlci5nZXRSZXF1ZXN0ZWRJZHNGcm9tRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgIFR5cGVNYW5hZ2VyIHRtID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5nZXRQcm9wZXJ0aWVzRnJvbU9iamVjdChzbywgb2JqZWN0U3RvcmUsIHRtLCByZXF1ZXN0ZWRJZHMsIHRydWUpOwotICAgICAgICBvYmpEYXRhLnNldFByb3BlcnRpZXMocHJvcHMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5T2JqZWN0U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeU9iamVjdFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDk1YmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5T2JqZWN0U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNtaXNFeHRlbnNpb25FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnRlbnRBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRmFpbGVkVG9EZWxldGVEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlci5PYmplY3RJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRmlsdGVyUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5Lk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Db250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Eb2N1bWVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5GaWxlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZpbGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuVmVyc2lvbmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuUHJvcGVydHlDcmVhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5UeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5UeXBlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeU9iamVjdFNlcnZpY2VJbXBsIGV4dGVuZHMgSW5NZW1vcnlBYnN0cmFjdFNlcnZpY2VJbXBsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9VU0VSID0gInVua25vd24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX09CSkVDVF9JRCA9ICJVbmtub3duIG9iamVjdCBpZDogIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5NZW1vcnlTZXJ2aWNlRmFjdG9yeUltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHB1YmxpYyBJbk1lbW9yeU9iamVjdFNlcnZpY2VJbXBsKFN0b3JlTWFuYWdlciBzdG9yZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIoc3RvcmVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgY3JlYXRlRG9jdW1lbnQoKSIpOwotICAgICAgICAvLyBBdHRhY2ggdGhlIENhbGxDb250ZXh0IHRvIGEgdGhyZWFkIGxvY2FsIGNvbnRleHQgdGhhdCBjYW4gYmUKLSAgICAgICAgLy8gYWNjZXNzZWQgZnJvbSBldmVyeXdoZXJlCi0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gY3JlYXRlRG9jdW1lbnRJbnRlcm4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgICAgICBMT0cuZGVidWcoInN0b3AgY3JlYXRlRG9jdW1lbnQoKSIpOwotICAgICAgICByZXR1cm4gc28uZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSgpIik7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBzb3VyY2VJZCwgZm9sZGVySWQsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudCA9IGdldENvbnRlbnRTdHJlYW0oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBzb3VyY2VJZCwgbnVsbCwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBudWxsKTsKLQotICAgICAgICBpZiAoc28gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihVTktOT1dOX09CSkVDVF9JRCArIHNvdXJjZUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJ1aWxkIHByb3BlcnRpZXMgY29sbGVjdGlvbgotICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzID0gRmlsdGVyUGFyc2VyLmdldFJlcXVlc3RlZElkc0Zyb21GaWx0ZXIoIioiKTsKLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIFByb3BlcnRpZXMgZXhpc3RpbmdQcm9wcyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuZ2V0UHJvcGVydGllc0Zyb21PYmplY3Qoc28sIG9iamVjdFN0b3JlLCB0bSwgcmVxdWVzdGVkSWRzLAotICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIFByb3BlcnRpZXNJbXBsIG5ld1BEID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0gICAgICAgIC8vIGNvcHkgYWxsIGV4aXN0aW5nIHByb3BlcnRpZXMKLSAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcHJvcCA6IGV4aXN0aW5nUHJvcHMuZ2V0UHJvcGVydGllcygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBuZXdQRC5hZGRQcm9wZXJ0eShwcm9wKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsICE9IHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIC8vIG92ZXJ3cml0ZSBhbGwgbmV3IHByb3BlcnRpZXMKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3AgOiBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIG5ld1BELmFkZFByb3BlcnR5KHByb3ApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlcyA9IGNyZWF0ZURvY3VtZW50KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgbmV3UEQsIGZvbGRlcklkLCBjb250ZW50LCB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgIGFkZEFjZXMsIHJlbW92ZUFjZXMsIG51bGwpOwotICAgICAgICBMT0cuZGVidWcoInN0b3AgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKCkiKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUZvbGRlcihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBjcmVhdGVGb2xkZXIoKSIpOwotCi0gICAgICAgIEZvbGRlciBmb2xkZXIgPSBjcmVhdGVGb2xkZXJJbnRlcm4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGNyZWF0ZUZvbGRlcigpIik7Ci0gICAgICAgIHJldHVybiBmb2xkZXIuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVBvbGljeShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGNyZWF0ZVBvbGljeSgpIik7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IGNyZWF0ZVBvbGljeUludGVybihjb250ZXh0LCByZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywKLSAgICAgICAgICAgICAgICByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgICAgICBMT0cuZGVidWcoInN0b3AgY3JlYXRlUG9saWN5KCkiKTsKLSAgICAgICAgcmV0dXJuIHNvID09IG51bGwgPyBudWxsIDogc28uZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbGF0aW9uc2hpcChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBjcmVhdGVSZWxhdGlvbnNoaXAoKSIpOwotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBjcmVhdGVSZWxhdGlvbnNoaXBJbnRlcm4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgICAgICBMT0cuZGVidWcoInN0b3AgY3JlYXRlUmVsYXRpb25zaGlwKCkiKTsKLSAgICAgICAgcmV0dXJuIHNvID09IG51bGwgPyBudWxsIDogc28uZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICAvLyBDTUlTIDEuMQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSXRlbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gY3JlYXRlSXRlbUludGVybihjb250ZXh0LCByZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgICAgICByZXR1cm4gc28uZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIGlmIChudWxsID09IHByb3BlcnRpZXMgfHwgbnVsbCA9PSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgb2JqZWN0LCB3aXRob3V0IHByb3BlcnRpZXMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaW5kIG91dCB3aGF0IGtpbmQgb2Ygb2JqZWN0IG5lZWRzIHRvIGJlIGNyZWF0ZWQKLSAgICAgICAgUHJvcGVydHlEYXRhPFN0cmluZz4gcGQgPSAoUHJvcGVydHlEYXRhPFN0cmluZz4pIHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBwZCA9PSBudWxsID8gbnVsbCA6IHBkLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gdHlwZUlkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgb2JqZWN0LCB3aXRob3V0IGEgdHlwZSAobm8gcHJvcGVydHkgd2l0aCBpZCBDTUlTX09CSkVDVF9UWVBFX0lEKS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWZDID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlQnlJZChyZXBvc2l0b3J5SWQsIHR5cGVJZCk7Ci0gICAgICAgIGlmICh0eXBlRGVmQyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBvYmplY3QsIGEgdHlwZSB3aXRoIGlkICIgKyB0eXBlSWQgKyAiIGlzIHVua25vd24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBnaXZlbiB0eXBlIGlzIGEgZG9jdW1lbnQgdHlwZQotICAgICAgICBCYXNlVHlwZUlkIHR5cGVCYXNlSWQgPSB0eXBlRGVmQy5nZXRUeXBlRGVmaW5pdGlvbigpLmdldEJhc2VUeXBlSWQoKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gbnVsbDsKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgaWYgKHR5cGVCYXNlSWQuZXF1YWxzKERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICBzbyA9IGNyZWF0ZURvY3VtZW50SW50ZXJuKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZUJhc2VJZC5lcXVhbHMoRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0ZvbGRlclR5cGUoKS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICBzbyA9IGNyZWF0ZUZvbGRlckludGVybihjb250ZXh0LCByZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlQmFzZUlkLmVxdWFscyhEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzUG9saWN5VHlwZSgpLmdldEJhc2VUeXBlSWQoKSkpIHsKLSAgICAgICAgICAgIHNvID0gY3JlYXRlUG9saWN5SW50ZXJuKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGVCYXNlSWQuZXF1YWxzKERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNSZWxhdGlvbnNoaXBUeXBlKCkuZ2V0QmFzZVR5cGVJZCgpKSkgewotICAgICAgICAgICAgc28gPSBjcmVhdGVSZWxhdGlvbnNoaXBJbnRlcm4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlQmFzZUlkLmVxdWFscyhEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzSXRlbVR5cGUoKS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICBzbyA9IGNyZWF0ZUl0ZW1JbnRlcm4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIlRoZSB0eXBlIGNvbnRhaW5zIGFuIHVua25vd24gYmFzZSBvYmplY3QgaWQsIG9iamVjdCBjYW4ndCBiZSBjcmVhdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYWtlIGEgY2FsbCB0byBnZXRPYmplY3QgdG8gY29udmVydCB0aGUgcmVzdWx0aW5nIGlkIGludG8gYW4KLSAgICAgICAgLy8gT2JqZWN0RGF0YQotICAgICAgICBUeXBlTWFuYWdlciB0bSA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZU1hbmFnZXIocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgT2JqZWN0RGF0YSBvZCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuZ2V0T2JqZWN0RGF0YSh0bSwgb2JqU3RvcmUsIHNvLCBudWxsLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIGZhbHNlLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBzbywgb2QsIG9iamVjdEluZm8pOwotICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc28gIT0gbnVsbCA/IHNvLmdldElkKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRlbnRTdHJlYW0oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBkZWxldGVDb250ZW50U3RyZWFtKCkiKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmRlbGV0ZUNvbnRlbnRTdHJlYW0oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBpZiAoc28gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihVTktOT1dOX09CSkVDVF9JRCArIG9iamVjdElkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzby5nZXRDaGFuZ2VUb2tlbigpICE9IG51bGwgJiYgKGNoYW5nZVRva2VuID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCAhc28uZ2V0Q2hhbmdlVG9rZW4oKS5lcXVhbHMoY2hhbmdlVG9rZW4uZ2V0VmFsdWUoKSkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKCJkZWxldGVDb250ZW50U3RyZWFtIGZhaWxlZCwgQ2hhbmdlVG9rZW4gZG9lcyBub3QgbWF0Y2guIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShzbyBpbnN0YW5jZW9mIENvbnRlbnQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJJZCIgKyBvYmplY3RJZAotICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgcmVmZXIgdG8gYSBkb2N1bWVudCwgYnV0IG9ubHkgZG9jdW1lbnRzIGNhbiBoYXZlIGNvbnRlbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBvYmplY3RTdG9yZS5zZXRDb250ZW50KHNvLCBudWxsKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGRlbGV0ZUNvbnRlbnRTdHJlYW0oKSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGRlbGV0ZU9iamVjdCgpIik7Ci0gICAgICAgIHZhbGlkYXRvci5kZWxldGVPYmplY3QoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWxsVmVyc2lvbnMsIGV4dGVuc2lvbik7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBMT0cuZGVidWcoImRlbGV0ZSBvYmplY3QgZm9yIGlkOiAiICsgb2JqZWN0SWQpOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIHRoZSByb290IGZvbGRlcgotICAgICAgICBpZiAob2JqZWN0SWQuZXF1YWxzKG9iamVjdFN0b3JlLmdldFJvb3RGb2xkZXIoKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIllvdSBjYW4ndCBkZWxldGUgYSByb290IGZvbGRlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb2JqZWN0U3RvcmUuZGVsZXRlT2JqZWN0KG9iamVjdElkLCBhbGxWZXJzaW9ucywgY29udGV4dC5nZXRVc2VybmFtZSgpKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGRlbGV0ZU9iamVjdCgpIik7Ci0gICAgfQotCi0gICAgcHVibGljIEZhaWxlZFRvRGVsZXRlRGF0YSBkZWxldGVUcmVlKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZSwgQm9vbGVhbiBjb250aW51ZU9uRmFpbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBkZWxldGVUcmVlKCkiKTsKLSAgICAgICAgYm9vbGVhbiBhbGxWZXJzaW9ucyA9IChudWxsID09IGFsbFZlcnMgPyB0cnVlIDogYWxsVmVycyk7Ci0gICAgICAgIFVuZmlsZU9iamVjdCB1bmZpbGVPYmplY3RzID0gKG51bGwgPT0gdW5maWxlID8gVW5maWxlT2JqZWN0LkRFTEVURSA6IHVuZmlsZSk7Ci0gICAgICAgIGJvb2xlYW4gY29udGludWVPbkZhaWx1cmUgPSAobnVsbCA9PSBjb250aW51ZU9uRmFpbCA/IGZhbHNlIDogY29udGludWVPbkZhaWwpOwotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSB2YWxpZGF0b3IuZGVsZXRlVHJlZShjb250ZXh0LCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBhbGxWZXJzaW9ucywgdW5maWxlT2JqZWN0cywgZXh0ZW5zaW9uKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGZhaWxlZFRvRGVsZXRlSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIEZhaWxlZFRvRGVsZXRlRGF0YUltcGwgcmVzdWx0ID0gbmV3IEZhaWxlZFRvRGVsZXRlRGF0YUltcGwoKTsKLQotICAgICAgICBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICBpZiAobnVsbCA9PSBzbykgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBkZWxldGUgb2JqZWN0IHdpdGggaWQgICIgKyBmb2xkZXJJZAotICAgICAgICAgICAgICAgICAgICArICIuIE9iamVjdCBkb2VzIG5vdCBleGlzdC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKHNvIGluc3RhbmNlb2YgRm9sZGVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oImRlbGV0ZVRyZWUgY2FuIG9ubHkgYmUgaW52b2tlZCBvbiBhIGZvbGRlciwgYnV0IGlkICIgKyBmb2xkZXJJZAotICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgcmVmZXIgdG8gYSBmb2xkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1bmZpbGVPYmplY3RzID09IFVuZmlsZU9iamVjdC5VTkZJTEUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIHJlcG9zaXRvcnkgZG9lcyBub3Qgc3VwcG9ydCB1bmZpbGUgb3BlcmF0aW9ucy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIHRoZSByb290IGZvbGRlcgotICAgICAgICBpZiAoZm9sZGVySWQuZXF1YWxzKG9iamVjdFN0b3JlLmdldFJvb3RGb2xkZXIoKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIllvdSBjYW4ndCBkZWxldGUgYSByb290IGZvbGRlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVjdXJzaXZlbHkgZGVsZXRlIGZvbGRlcgotICAgICAgICBkZWxldGVSZWN1cnNpdmUob2JqZWN0U3RvcmUsIChGb2xkZXIpIHNvLCBjb250aW51ZU9uRmFpbHVyZSwgYWxsVmVyc2lvbnMsIGZhaWxlZFRvRGVsZXRlSWRzLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSk7Ci0KLSAgICAgICAgcmVzdWx0LnNldElkcyhmYWlsZWRUb0RlbGV0ZUlkcyk7Ci0gICAgICAgIExPRy5kZWJ1Zygic3RvcCBkZWxldGVUcmVlKCkiKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgZ2V0QWxsb3dhYmxlQWN0aW9ucygpIik7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5nZXRBbGxvd2FibGVBY3Rpb25zKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIGlmIChzbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFVOS05PV05fT0JKRUNUX0lEICsgb2JqZWN0SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHVzZXIgPSBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0gICAgICAgIEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9ucyA9IHNvLmdldEFsbG93YWJsZUFjdGlvbnModXNlcik7Ci0gICAgICAgIExPRy5kZWJ1Zygic3RvcCBnZXRBbGxvd2FibGVBY3Rpb25zKCkiKTsKLSAgICAgICAgcmV0dXJuIGFsbG93YWJsZUFjdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgb2Zmc2V0LCBCaWdJbnRlZ2VyIGxlbmd0aCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBnZXRDb250ZW50U3RyZWFtKCkiKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldENvbnRlbnRTdHJlYW0oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgc3RyZWFtSWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgaWYgKHNvID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oVU5LTk9XTl9PQkpFQ1RfSUQgKyBvYmplY3RJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShzbyBpbnN0YW5jZW9mIENvbnRlbnQpICYmIG9iamVjdElkLmVuZHNXaXRoKCItcmVuZGl0aW9uIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiSWQiICsgb2JqZWN0SWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IHJlZmVyIHRvIGEgZG9jdW1lbnQgb3IgdmVyc2lvbiwgYnV0IG9ubHkgdGhvc2UgY2FuIGhhdmUgY29udGVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY3NkID0gZ2V0Q29udGVudFN0cmVhbShvYmpTdG9yZSwgc28sIHN0cmVhbUlkLCBvZmZzZXQsIGxlbmd0aCk7Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gY3NkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIk9iamVjdCAiICsgc28uZ2V0SWQoKSArICIgZG9lcyBub3QgaGF2ZSBjb250ZW50LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGdldENvbnRlbnRTdHJlYW0oKSIpOwotICAgICAgICByZXR1cm4gY3NkOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBnZXRPYmplY3QoKSIpOwotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5nZXRPYmplY3QoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgaWYgKHNvID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oVU5LTk9XTl9PQkpFQ1RfSUQgKyBvYmplY3RJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIE9iamVjdERhdGEgb2QgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmdldE9iamVjdERhdGEodG0sIG9ialN0b3JlLCBzbywgZmlsdGVyLCB1c2VyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBleHRlbnNpb24pOwotCi0gICAgICAgIGlmIChjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgIGZBdG9tTGlua1Byb3ZpZGVyLmZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaWxsIGFuIGV4YW1wbGUgZXh0ZW5zaW9uCi0gICAgICAgIFN0cmluZyBucyA9ICJodHRwOi8vYXBhY2hlLm9yZy9vcGVuY21pcy9pbm1lbW9yeSI7Ci0gICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4oKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgYXR0ci5wdXQoInR5cGUiLCBzby5nZXRUeXBlSWQoKSk7Ci0KLSAgICAgICAgZXh0RWxlbWVudHMuYWRkKG5ldyBDbWlzRXh0ZW5zaW9uRWxlbWVudEltcGwobnMsICJvYmplY3RJZCIsIGF0dHIsIG9iamVjdElkKSk7Ci0gICAgICAgIGV4dEVsZW1lbnRzLmFkZChuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG5zLCAibmFtZSIsIG51bGwsIHNvLmdldE5hbWUoKSkpOwotICAgICAgICBvZC5zZXRFeHRlbnNpb25zKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoKENtaXNFeHRlbnNpb25FbGVtZW50KSBuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKG5zLAotICAgICAgICAgICAgICAgICJleGFtcGxlRXh0ZW5zaW9uIiwgbnVsbCwgZXh0RWxlbWVudHMpKSk7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGdldE9iamVjdCgpIik7Ci0KLSAgICAgICAgcmV0dXJuIG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdEJ5UGF0aChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGdldE9iamVjdEJ5UGF0aCgpIik7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5nZXRPYmplY3RCeVBhdGgoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBwYXRoLCBleHRlbnNpb24pOwotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCkgewotICAgICAgICAgICAgVmVyc2lvbmVkRG9jdW1lbnQgdmVyRG9jID0gKFZlcnNpb25lZERvY3VtZW50KSBzbzsKLSAgICAgICAgICAgIHNvID0gdmVyRG9jLmdldExhdGVzdFZlcnNpb24oZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHVzZXIgPSBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIFR5cGVNYW5hZ2VyIHRtID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotICAgICAgICBPYmplY3REYXRhIG9kID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5nZXRPYmplY3REYXRhKHRtLCBvYmpTdG9yZSwgc28sIGZpbHRlciwgdXNlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBMT0cuZGVidWcoInN0b3AgZ2V0T2JqZWN0QnlQYXRoKCkiKTsKLQotICAgICAgICAvLyBUbyBiZSBhYmxlIHRvIHByb3ZpZGUgYWxsIEF0b20gbGlua3MgaW4gdGhlIHJlc3BvbnNlIHdlIG5lZWQKLSAgICAgICAgLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKLSAgICAgICAgaWYgKGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgZkF0b21MaW5rUHJvdmlkZXIuZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgc28sIG9iamVjdEluZm8pOwotICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgZ2V0UHJvcGVydGllcygpIik7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5nZXRQcm9wZXJ0aWVzKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIGlmIChzbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKFVOS05PV05fT0JKRUNUX0lEICsgb2JqZWN0SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgcHJvcGVydGllcyBjb2xsZWN0aW9uCi0gICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0ZWRJZHMgPSBGaWx0ZXJQYXJzZXIuZ2V0UmVxdWVzdGVkSWRzRnJvbUZpbHRlcihmaWx0ZXIpOwotICAgICAgICBUeXBlTWFuYWdlciB0bSA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZU1hbmFnZXIocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuZ2V0UHJvcGVydGllc0Zyb21PYmplY3Qoc28sIG9iamVjdFN0b3JlLCB0bSwgcmVxdWVzdGVkSWRzLCB0cnVlKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGdldFByb3BlcnRpZXMoKSIpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCBnZXRSZW5kaXRpb25zKCkiKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldFJlbmRpdGlvbnMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBpZiAoc28gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihVTktOT1dOX09CSkVDVF9JRCArIG9iamVjdElkKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IHJlbmRpdGlvbnMgPSBvYmpTdG9yZS5nZXRSZW5kaXRpb25zKHNvLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zID09IG51bGwgPyAwIDogbWF4SXRlbXMubG9uZ1ZhbHVlKCksCi0gICAgICAgICAgICAgICAgc2tpcENvdW50ID09IG51bGwgPyAwIDogc2tpcENvdW50LmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGdldFJlbmRpdGlvbnMoKSIpOwotICAgICAgICByZXR1cm4gcmVuZGl0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBtb3ZlT2JqZWN0KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldEZvbGRlcklkLCBTdHJpbmcgc291cmNlRm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IG1vdmVPYmplY3QoKSIpOwotICAgICAgICBTdG9yZWRPYmplY3RbXSBzb3MgPSB2YWxpZGF0b3IubW92ZU9iamVjdChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCB0YXJnZXRGb2xkZXJJZCwgc291cmNlRm9sZGVySWQsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc29zWzBdOwotICAgICAgICBGb2xkZXIgdGFyZ2V0Rm9sZGVyID0gbnVsbDsKLSAgICAgICAgRm9sZGVyIHNvdXJjZUZvbGRlciA9IG51bGw7Ci0gICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLQotICAgICAgICBpZiAobnVsbCA9PSBzbykgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biBvYmplY3Q6ICIgKyBvYmplY3RJZC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmICghKHNvIGluc3RhbmNlb2YgRmlsaW5nKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBtdXN0IGJlIGZpbGVhYmxlOiAiICsgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdG9yZWRPYmplY3Qgc29UYXJnZXQgPSBvYmplY3RTdG9yZS5nZXRPYmplY3RCeUlkKHRhcmdldEZvbGRlcklkKTsKLSAgICAgICAgaWYgKG51bGwgPT0gc29UYXJnZXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlVua25vd24gdGFyZ2V0IGZvbGRlcjogIiArIHRhcmdldEZvbGRlcklkKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb1RhcmdldCBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgdGFyZ2V0Rm9sZGVyID0gKEZvbGRlcikgc29UYXJnZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRGVzdGluYXRpb24gIiArIHRhcmdldEZvbGRlcklkCi0gICAgICAgICAgICAgICAgICAgICsgIiBvZiBhIG1vdmUgb3BlcmF0aW9uIG11c3QgYmUgYSBmb2xkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzb1NvdXJjZSA9IG9iamVjdFN0b3JlLmdldE9iamVjdEJ5SWQoc291cmNlRm9sZGVySWQpOwotICAgICAgICBpZiAobnVsbCA9PSBzb1NvdXJjZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biBzb3VyY2UgZm9sZGVyOiAiICsgc291cmNlRm9sZGVySWQpOwotICAgICAgICB9IGVsc2UgaWYgKHNvU291cmNlIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICBzb3VyY2VGb2xkZXIgPSAoRm9sZGVyKSBzb1NvdXJjZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJTb3VyY2UgIiArIHNvdXJjZUZvbGRlcklkICsgIiBvZiBhIG1vdmUgb3BlcmF0aW9uIG11c3QgYmUgYSBmb2xkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZm91bmRPbGRQYXJlbnQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChTdHJpbmcgcGFyZW50SWQgOiBvYmplY3RTdG9yZS5nZXRQYXJlbnRJZHMoc28sIHVzZXIpKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQuZXF1YWxzKHNvU291cmNlLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRPbGRQYXJlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmRPbGRQYXJlbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJDYW5ub3QgbW92ZSBvYmplY3QsIHNvdXJjZSBmb2xkZXIgIiArIHNvdXJjZUZvbGRlcklkCi0gICAgICAgICAgICAgICAgICAgICsgImlzIG5vdCBhIHBhcmVudCBvZiBvYmplY3QgIiArIG9iamVjdElkLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRm9sZGVyICYmIGhhc0Rlc2NlbmRhbnQoY29udGV4dC5nZXRVc2VybmFtZSgpLCBvYmplY3RTdG9yZSwgKEZvbGRlcikgc28sIHRhcmdldEZvbGRlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBvZiBhIG1vdmUgY2Fubm90IGJlIGEgc3ViZm9sZGVyIG9mIHRoZSBzb3VyY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9iamVjdFN0b3JlLm1vdmUoc28sIHNvdXJjZUZvbGRlciwgdGFyZ2V0Rm9sZGVyLCB1c2VyKTsKLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUoc28uZ2V0SWQoKSk7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIG1vdmVPYmplY3QoKSIpOwotCi0gICAgICAgIFR5cGVNYW5hZ2VyIHRtID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotICAgICAgICBPYmplY3REYXRhIG9kID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5nZXRPYmplY3REYXRhKHRtLCBvYmplY3RTdG9yZSwgc28sIG51bGwsIHVzZXIsIGZhbHNlLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgZXh0ZW5zaW9uKTsKLQotICAgICAgICAvLyBUbyBiZSBhYmxlIHRvIHByb3ZpZGUgYWxsIEF0b20gbGlua3MgaW4gdGhlIHJlc3BvbnNlIHdlIG5lZWQKLSAgICAgICAgLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKLSAgICAgICAgaWYgKGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgZkF0b21MaW5rUHJvdmlkZXIuZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgc28sIG9kLCBvYmplY3RJbmZvKTsKLSAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFN0cmVhbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBvdmVyd3JpdGUsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IHNldENvbnRlbnRTdHJlYW0oKSIpOwotICAgICAgICBib29sZWFuIG92ZXJ3cml0ZUZsYWcgPSAob3ZlcndyaXRlID09IG51bGwgPyB0cnVlIDogb3ZlcndyaXRlKTsKLSAgICAgICAgQ29udGVudCBjb250ZW50OwotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5zZXRDb250ZW50U3RyZWFtKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgaWYgKGNoYW5nZVRva2VuICE9IG51bGwgJiYgY2hhbmdlVG9rZW4uZ2V0VmFsdWUoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgTG9uZy52YWx1ZU9mKHNvLmdldENoYW5nZVRva2VuKCkpID4gTG9uZy52YWx1ZU9mKGNoYW5nZVRva2VuLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKCJzZXRDb250ZW50U3RyZWFtIGZhaWxlZDogY2hhbmdlVG9rZW4gZG9lcyBub3QgbWF0Y2giKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKHNvIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCB8fCBzbyBpbnN0YW5jZW9mIERvY3VtZW50VmVyc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIklkIiArIG9iamVjdElkCi0gICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCByZWZlciB0byBhIGRvY3VtZW50LCBidXQgb25seSBkb2N1bWVudHMgY2FuIGhhdmUgY29udGVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdmFsaWRhdGUgY29udGVudCBhbGxvd2VkCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBnZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHNvKTsKLSAgICAgICAgaWYgKCEodHlwZURlZiBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IGRvZXMgbm90IHJlZmVyIHRvIGEgZG9jdW1lbnQsIGNhbid0IHNldCBjb250ZW50Iik7Ci0gICAgICAgIH0KLSAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZUNvbnRlbnRBbGxvd2VkKChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmLCBudWxsICE9IGNvbnRlbnRTdHJlYW0pOwotCi0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICBjb250ZW50ID0gKChEb2N1bWVudCkgc28pOwotICAgICAgICB9IGVsc2UgaWYgKHNvIGluc3RhbmNlb2YgRG9jdW1lbnRWZXJzaW9uKSB7Ci0gICAgICAgICAgICAvLyBzb21ldGhpbmcgdGhhdCBpcyB2ZXJzaW9uYWJsZSBjaGVjayB0aGUgcHJvcGVyIHN0YXR1cyBvZiB0aGUKLSAgICAgICAgICAgIC8vIG9iamVjdAotICAgICAgICAgICAgU3RyaW5nIHVzZXIgPSBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0gICAgICAgICAgICB0ZXN0SGFzUHJvcGVyQ2hlY2tlZE91dFN0YXR1cyhzbywgdXNlcik7Ci0gICAgICAgICAgICBjb250ZW50ID0gKERvY3VtZW50VmVyc2lvbikgc287Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZW50IGNhbm5vdCBiZSBzZXQgb24gdGhpcyBvYmplY3QgKG11c3QgYmUgZG9jdW1lbnQgb3IgdmVyc2lvbikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghb3ZlcndyaXRlRmxhZyAmJiBjb250ZW50Lmhhc0NvbnRlbnQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgY29udGVudCBpZiBvdmVyd3JpdGUgZmxhZyBpcyBub3Qgc2V0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgb2JqU3RvcmUuc2V0Q29udGVudChzbywgY29udGVudFN0cmVhbSk7Ci0gICAgICAgIHNvLnVwZGF0ZVN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbk1vZGlmaWVkKG51bGwsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSk7Ci0gICAgICAgIExPRy5kZWJ1Zygic3RvcCBzZXRDb250ZW50U3RyZWFtKCkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLAotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sIFByb3BlcnRpZXMgcHJvcGVydGllcywgQWNsIGFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IHVwZGF0ZVByb3BlcnRpZXMoKSIpOwotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oInVwZGF0ZSBwcm9wZXJ0aWVzOiBubyBwcm9wZXJ0aWVzIGdpdmVuIGZvciBvYmplY3QgaWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBvYmplY3RJZC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSB2YWxpZGF0b3IudXBkYXRlUHJvcGVydGllcyhjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgLy8gVmFsaWRhdGlvbgotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBzbyk7Ci0gICAgICAgIGJvb2xlYW4gaXNDaGVja2VkT3V0ID0gZmFsc2U7Ci0KLSAgICAgICAgaXNDaGVja2VkT3V0ID0gaXNDaGVja2VkT3V0KHNvLCB1c2VyKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IG9sZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4oKTsKLQotICAgICAgICAvLyBjaGVjayBwcm9wZXJ0aWVzIGZvciB2YWxpZGl0eQotICAgICAgICBib29sZWFuIGNtaXMxMSA9IGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMDsKLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgc28sIHByb3BlcnRpZXMsIGZhbHNlLCBjbWlzMTEpOwotCi0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsICYmIGNoYW5nZVRva2VuLmdldFZhbHVlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIExvbmcudmFsdWVPZihzby5nZXRDaGFuZ2VUb2tlbigpKSA+IExvbmcudmFsdWVPZihjaGFuZ2VUb2tlbi5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbigidXBkYXRlUHJvcGVydGllcyBmYWlsZWQ6IGNoYW5nZVRva2VuIGRvZXMgbm90IG1hdGNoIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgcHJvcGVydGllcwotICAgICAgICBib29sZWFuIGhhc1VwZGF0ZWRQcm9wID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gRmluZCBzZWNvbmRhcnkgdHlwZSBkZWZpbml0aW9ucyB0byBjb25zaWRlciBmb3IgdXBkYXRlCi0gICAgICAgIExpc3Q8U3RyaW5nPiBleGlzdGluZ1NlY29uZGFyeVR5cGVJZHMgPSBzby5nZXRTZWNvbmRhcnlUeXBlSWRzKCk7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBQcm9wZXJ0eURhdGE8U3RyaW5nPiBwZFNlYyA9IChQcm9wZXJ0eURhdGE8U3RyaW5nPikgcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KAotICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMpOwotICAgICAgICBMaXN0PFN0cmluZz4gbmV3U2Vjb25kYXJ5VHlwZUlkcyA9IHBkU2VjID09IG51bGwgPyBudWxsIDogcGRTZWMuZ2V0VmFsdWVzKCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHNlY29uZGFyeVR5cGVJZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChudWxsICE9IGV4aXN0aW5nU2Vjb25kYXJ5VHlwZUlkcykgewotICAgICAgICAgICAgc2Vjb25kYXJ5VHlwZUlkcy5hZGRBbGwoZXhpc3RpbmdTZWNvbmRhcnlUeXBlSWRzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCAhPSBuZXdTZWNvbmRhcnlUeXBlSWRzKSB7Ci0gICAgICAgICAgICBzZWNvbmRhcnlUeXBlSWRzLmFkZEFsbChuZXdTZWNvbmRhcnlUeXBlSWRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZpbmQgc2Vjb25kYXJ5IHR5cGUgZGVmaW5pdGlvbnMgdG8gZGVsZXRlIChudWxsIG1lYW5zIG5vdCBzZXQgLS0+IGRvCi0gICAgICAgIC8vIG5vdCBjaGFuZ2UsIGVtcHR5IC0tPiByZW1vdmUgYWxsIHNlY29uZGFyeSB0eXBlcykKLSAgICAgICAgaWYgKG51bGwgIT0gbmV3U2Vjb25kYXJ5VHlwZUlkcykgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BlcnRpZXNJZFRvRGVsZXRlID0gZ2V0TGlzdE9mUHJvcGVydGllc1RvRGVsZXRlRnJvbVJlbW92ZWRTZWNvbmRhcnlUeXBlcyhyZXBvc2l0b3J5SWQsIHNvLAotICAgICAgICAgICAgICAgICAgICBuZXdTZWNvbmRhcnlUeXBlSWRzKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHByb3BJZFRvUmVtb3ZlIDogcHJvcGVydGllc0lkVG9EZWxldGUpIHsKLSAgICAgICAgICAgICAgICBvbGRQcm9wZXJ0aWVzLnB1dChwcm9wSWRUb1JlbW92ZSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgcHJvcGVydGllczoKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKFByb3BlcnR5SWRzLk5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSBoZXJlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChrZXkpOwotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgPSB0eXBlRGVmLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoa2V5KTsKLSAgICAgICAgICAgIGlmIChjbWlzMTEgJiYgbnVsbCA9PSBwcm9wRGVmKSB7Ci0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZlNlY29uZGFyeSA9IGdldFNlY29uZGFyeVR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgc2Vjb25kYXJ5VHlwZUlkcywga2V5KTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB0eXBlRGVmU2Vjb25kYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgdXBkYXRlIHByb3BlcnR5ICIgKyBrZXkgKyAiOiBub3QgY29udGFpbmVkIGluIHR5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvcERlZiA9IHR5cGVEZWZTZWNvbmRhcnkuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChrZXkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wRGVmKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHkgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBub3QgY29udGFpbmVkIGluIHR5cGUgKG9yIGFueSBzZWNvbmRhcnkgdHlwZSkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhbHVlLmdldFZhbHVlcygpID09IG51bGwgfHwgdmFsdWUuZ2V0Rmlyc3RWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhIHJlcXVpcmVkIGEgcHJvcGVydHkKLSAgICAgICAgICAgICAgICBpZiAocHJvcERlZi5pc1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVQcm9wZXJ0aWVzIGZhaWxlZCwgZm9sbG93aW5nIHByb3BlcnR5IGNhbid0IGJlIGRlbGV0ZWQsIGJlY2F1c2UgaXQgaXMgcmVxdWlyZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2xkUHJvcGVydGllcy5wdXQoa2V5LCBudWxsKTsKLSAgICAgICAgICAgICAgICBoYXNVcGRhdGVkUHJvcCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldFVwZGF0YWJpbGl0eSgpID09IFVwZGF0YWJpbGl0eS5XSEVOQ0hFQ0tFRE9VVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2hlY2tlZE91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZVByb3BlcnRpZXMgZmFpbGVkLCBmb2xsb3dpbmcgcHJvcGVydHkgY2FuJ3QgYmUgdXBkYXRlZCwgYmVjYXVzZSBpdCBpcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjaGVja2VkLW91dDogIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkgIT0gVXBkYXRhYmlsaXR5LlJFQURXUklURSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZVByb3BlcnRpZXMgZmFpbGVkLCBmb2xsb3dpbmcgcHJvcGVydHkgY2FuJ3QgYmUgdXBkYXRlZCwgYmVjYXVzZSBpdCBpcyBub3Qgd3JpdGFibGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2xkUHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaGFzVXBkYXRlZFByb3AgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBnZXQgbmFtZSBmcm9tIHByb3BlcnRpZXMgYW5kIHBlcmZvcm0gc3BlY2lhbCByZW5hbWUgdG8gY2hlY2sgaWYKLSAgICAgICAgLy8gcGF0aCBhbHJlYWR5IGV4aXN0cwotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIGlmIChwZCAhPSBudWxsICYmIHNvIGluc3RhbmNlb2YgRmlsaW5nKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIHBkLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzUGFyZW50ID0gKChGaWxpbmcpIHNvKS5oYXNQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIEZvbGRlciAmJiAhaGFzUGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJ1cGRhdGVQcm9wZXJ0aWVzIGZhaWxlZCwgeW91IGNhbm5vdCByZW5hbWUgdGhlIHJvb3QgZm9sZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV3TmFtZSA9PSBudWxsIHx8IG5ld05hbWUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigidXBkYXRlUHJvcGVydGllcyBmYWlsZWQsIG5hbWUgbXVzdCBub3QgYmUgZW1wdHkuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZE5hbWUobmV3TmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihOYW1lVmFsaWRhdG9yLkVSUk9SX0lMTEVHQUxfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBOb3RlOiB0aGUgdGVzdCBmb3IgZHVwbGljYXRlZCBuYW1lIGluIGZvbGRlciBpcyBsZWZ0IHRvIHRoZQotICAgICAgICAgICAgLy8gb2JqZWN0IHN0b3JlCi0gICAgICAgICAgICBvYmpTdG9yZS5yZW5hbWUoKEZpbGVhYmxlKSBzbywgKFN0cmluZykgcGQuZ2V0Rmlyc3RWYWx1ZSgpLCB1c2VyKTsKLSAgICAgICAgICAgIGhhc1VwZGF0ZWRQcm9wID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG9ialN0b3JlLnVwZGF0ZU9iamVjdChzbywgb2xkUHJvcGVydGllcywgdXNlcik7Ci0KLSAgICAgICAgaWYgKGhhc1VwZGF0ZWRQcm9wKSB7Ci0gICAgICAgICAgICBvYmplY3RJZC5zZXRWYWx1ZShzby5nZXRJZCgpKTsgLy8gbWlnaHQgaGF2ZSBhIG5ldyBpZAotICAgICAgICAgICAgaWYgKG51bGwgIT0gY2hhbmdlVG9rZW4pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2hhbmdlVG9rZW5WYWwgPSBzby5nZXRDaGFuZ2VUb2tlbigpOwotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygidXBkYXRlUHJvcGVydGllcygpLCBuZXcgY2hhbmdlIHRva2VuIGlzOiAiICsgY2hhbmdlVG9rZW5WYWwpOwotICAgICAgICAgICAgICAgIGNoYW5nZVRva2VuLnNldFZhbHVlKGNoYW5nZVRva2VuVmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsICE9IGFjbCkgewotICAgICAgICAgICAgb2JqU3RvcmUuYXBwbHlBY2woc28sIGFjbCwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgdXNlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlTWFuYWdlciB0bSA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZU1hbmFnZXIocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgT2JqZWN0RGF0YSBvZCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuZ2V0T2JqZWN0RGF0YSh0bSwgb2JqU3RvcmUsIHNvLCBudWxsLCB1c2VyLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgLy8gVG8gYmUgYWJsZSB0byBwcm92aWRlIGFsbCBBdG9tIGxpbmtzIGluIHRoZSByZXNwb25zZSB3ZSBuZWVkCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0gICAgICAgIGlmIChjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgIGZBdG9tTGlua1Byb3ZpZGVyLmZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHNvLCBvZCwgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIHVwZGF0ZVByb3BlcnRpZXMoKSIpOwotICAgIH0KLQotICAgIC8vIENNSVMgMS4xCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQ29udGVudFN0cmVhbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIENvbnRlbnQgY29udGVudDsKLQotICAgICAgICBMT0cuZGVidWcoInN0YXJ0IGFwcGVuZENvbnRlbnRTdHJlYW0oKSIpOwotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSB2YWxpZGF0b3IuYXBwZW5kQ29udGVudFN0cmVhbShjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotCi0gICAgICAgIGlmIChjaGFuZ2VUb2tlbiAhPSBudWxsICYmIGNoYW5nZVRva2VuLmdldFZhbHVlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIExvbmcudmFsdWVPZihzby5nZXRDaGFuZ2VUb2tlbigpKSA+IExvbmcudmFsdWVPZihjaGFuZ2VUb2tlbi5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbigidXBkYXRlUHJvcGVydGllcyBmYWlsZWQ6IGNoYW5nZVRva2VuIGRvZXMgbm90IG1hdGNoIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShzbyBpbnN0YW5jZW9mIERvY3VtZW50IHx8IHNvIGluc3RhbmNlb2YgVmVyc2lvbmVkRG9jdW1lbnQgfHwgc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJJZCIgKyBvYmplY3RJZAotICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgcmVmZXIgdG8gYSBkb2N1bWVudCwgYnV0IG9ubHkgZG9jdW1lbnRzIGNhbiBoYXZlIGNvbnRlbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZhbGlkYXRlIGNvbnRlbnQgYWxsb3dlZAotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBzbyk7Ci0gICAgICAgIGlmICghKHR5cGVEZWYgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGVEZWZpbml0aW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBkb2VzIG5vdCByZWZlciB0byBhIGRvY3VtZW50LCBjYW4ndCBzZXQgY29udGVudCIpOwotICAgICAgICB9Ci0gICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVDb250ZW50QWxsb3dlZCgoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZURlZiwgbnVsbCAhPSBjb250ZW50U3RyZWFtKTsKLQotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgY29udGVudCA9ICgoRG9jdW1lbnQpIHNvKTsKLSAgICAgICAgfSBlbHNlIGlmIChzbyBpbnN0YW5jZW9mIERvY3VtZW50VmVyc2lvbikgewotICAgICAgICAgICAgLy8gc29tZXRoaW5nIHRoYXQgaXMgdmVyc2lvbmFibGUgY2hlY2sgdGhlIHByb3BlciBzdGF0dXMgb2YgdGhlCi0gICAgICAgICAgICAvLyBvYmplY3QKLSAgICAgICAgICAgIFN0cmluZyB1c2VyID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgICAgICAgICAgdGVzdEhhc1Byb3BlckNoZWNrZWRPdXRTdGF0dXMoc28sIHVzZXIpOwotICAgICAgICAgICAgY29udGVudCA9IChEb2N1bWVudFZlcnNpb24pIHNvOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udGVudCBjYW5ub3QgYmUgc2V0IG9uIHRoaXMgb2JqZWN0IChtdXN0IGJlIGRvY3VtZW50IG9yIHZlcnNpb24pIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgb2JqU3RvcmUuYXBwZW5kQ29udGVudChzbywgY29udGVudFN0cmVhbSk7Ci0gICAgICAgIHNvLnVwZGF0ZVN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbk1vZGlmaWVkKG51bGwsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IGJ1bGtVcGRhdGVQcm9wZXJ0aWVzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBvYmplY3RJZEFuZENoYW5nZVRva2VuLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYWRkU2Vjb25kYXJ5VHlwZUlkcywgTGlzdDxTdHJpbmc+IHJlbW92ZVNlY29uZGFyeVR5cGVJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0KLSAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4oKTsKLSAgICAgICAgZm9yIChCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiBvYmogOiBvYmplY3RJZEFuZENoYW5nZVRva2VuKSB7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBvYmpJZCA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmouZ2V0SWQoKSk7Ci0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiA9IG5ldyBIb2xkZXI8U3RyaW5nPihvYmouZ2V0Q2hhbmdlVG9rZW4oKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmpJZCwgY2hhbmdlVG9rZW4sIHByb3BlcnRpZXMsIG51bGwsIG51bGwsIG9iamVjdEluZm9zKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGwob2JqLmdldElkKCksIGNoYW5nZVRva2VuLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmVycm9yKCJ1cGRhdGluZyBwcm9wZXJ0aWVzIGluIGJ1bGsgdXBhZGF0ZSBmYWlsZWQgZm9yIG9iamVjdCIgKyBvYmouZ2V0SWQoKSArICI6ICIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHByaXZhdGUgaGVscGVyIG1ldGhvZHMKLQotICAgIHByaXZhdGUgU3RvcmVkT2JqZWN0IGNyZWF0ZURvY3VtZW50SW50ZXJuKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIEFjbCBhY2xBZGQgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksCi0gICAgICAgICAgICAgICAgYWRkQUNFcyk7Ci0gICAgICAgIEFjbCBhY2xSZW1vdmUgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksCi0gICAgICAgICAgICAgICAgcmVtb3ZlQUNFcyk7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmNyZWF0ZURvY3VtZW50KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIHBvbGljaWVzLCBleHRlbnNpb24pOwotCi0gICAgICAgIC8vIFZhbGlkYXRpb24gc3R1ZmYKLSAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVJlcXVpcmVkU3lzdGVtUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqZWN0U3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcE1hcCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAvLyBnZXQgbmFtZSBmcm9tIHByb3BlcnRpZXMKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBkID0gcHJvcE1hcC5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgcGQuZ2V0Rmlyc3RWYWx1ZSgpOwotCi0gICAgICAgIC8vIHZhbGlkYXRlIEFDTAotICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQWNsKHR5cGVEZWYsIGFjbEFkZCwgYWNsUmVtb3ZlKTsKLQotICAgICAgICBGb2xkZXIgZm9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgIT0gZm9sZGVySWQpIHsKLSAgICAgICAgICAgIGlmIChudWxsID09IHNvKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIiBDYW5ub3QgY3JlYXRlIGRvY3VtZW50LCBmb2xkZXJJZDogIiArIGZvbGRlcklkIAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGludmFsaWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgZm9sZGVyID0gKEZvbGRlcikgc287Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBjcmVhdCBkb2N1bWVudCwgZm9sZGVySWQgZG9lcyBub3QgcmVmZXIgdG8gYSBmb2xkZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZm9sZGVySWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQWxsb3dlZENoaWxkT2JqZWN0VHlwZXModHlwZURlZiwgZm9sZGVyLmdldEFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIGRvY3VtZW50IHR5cGUKLSAgICAgICAgaWYgKCF0eXBlRGVmLmdldEJhc2VUeXBlSWQoKS5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgYSBkb2N1bWVudCwgd2l0aCBhIG5vbi1kb2N1bWVudCB0eXBlOiAiCi0gICAgICAgICAgICAgICAgICAgICsgdHlwZURlZi5nZXRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIG5hbWUgc3ludGF4Ci0gICAgICAgIGlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkTmFtZShuYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oTmFtZVZhbGlkYXRvci5FUlJPUl9JTExFR0FMX05BTUUgKyAiIE5hbWUgaXM6ICIgKyBuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZhbGlkYXRlIGNvbnRlbnQgYWxsb3dlZAotICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQ29udGVudEFsbG93ZWQoKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVEZWYsIG51bGwgIT0gY29udGVudFN0cmVhbSk7Ci0KLSAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVZlcnNpb25TdGF0ZUZvckNyZWF0ZSgoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZURlZiwgdmVyc2lvbmluZ1N0YXRlKTsKLQotICAgICAgICAvLyBzZXQgcHJvcGVydGllcyB0aGF0IGFyZSBub3Qgc2V0IGJ1dCBoYXZlIGEgZGVmYXVsdDoKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwTmV3ID0gc2V0RGVmYXVsdFByb3BlcnRpZXModHlwZURlZiwgcHJvcE1hcCk7Ci0gICAgICAgIGlmIChwcm9wTWFwTmV3ICE9IHByb3BNYXApIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllc0ltcGwocHJvcE1hcE5ldy52YWx1ZXMoKSk7Ci0gICAgICAgICAgICBwcm9wTWFwID0gcHJvcE1hcE5ldzsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY21pczExID0gY29udGV4dC5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICB2YWxpZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBudWxsLCBwcm9wZXJ0aWVzLCBmYWxzZSwgY21pczExKTsKLQotICAgICAgICAvLyBzZXQgdXNlciwgY3JlYXRpb24gZGF0ZSwgZXRjLgotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VyID0gVU5LTk9XTl9VU0VSOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IGNyZWF0ZWREb2MgPSBudWxsOwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW1OZXcgPSBjb250ZW50U3RyZWFtOwotICAgICAgICAvLyBjaGVjayBpZiBjb250ZW50IHN0cmVhbSBwYXJhbWV0ZXJzIGFyZSBzZXQgYW5kIGlmIG5vdCBzZXQgc29tZQotICAgICAgICAvLyBkZWZhdWx0cwotICAgICAgICBpZiAobnVsbCAhPSBjb250ZW50U3RyZWFtCi0gICAgICAgICAgICAgICAgJiYgKGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSA9PSBudWxsIHx8IGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKS5sZW5ndGgoKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkgPT0gbnVsbCB8fCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW1JbXBsIGNzID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0gICAgICAgICAgICBjcy5zZXRTdHJlYW0oY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpID09IG51bGwgfHwgY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjcy5zZXRGaWxlTmFtZShuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3Muc2V0RmlsZU5hbWUoY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNzLnNldExlbmd0aChjb250ZW50U3RyZWFtLmdldEJpZ0xlbmd0aCgpKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkgPT0gbnVsbCB8fCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNzLnNldE1pbWVUeXBlKCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3Muc2V0TWltZVR5cGUoY29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNzLnNldEV4dGVuc2lvbnMoY29udGVudFN0cmVhbS5nZXRFeHRlbnNpb25zKCkpOwotICAgICAgICAgICAgY29udGVudFN0cmVhbU5ldyA9IGNzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHdlIGFyZSBzdXJlIHRvIGhhdmUgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uOgotICAgICAgICBpZiAoKChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmKS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgIERvY3VtZW50VmVyc2lvbiB2ZXJzaW9uID0gb2JqZWN0U3RvcmUuY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQobmFtZSwgcHJvcE1hcCwgdXNlciwgZm9sZGVyLCBwb2xpY2llcywKLSAgICAgICAgICAgICAgICAgICAgYWNsQWRkLCBhY2xSZW1vdmUsIGNvbnRlbnRTdHJlYW1OZXcsIHZlcnNpb25pbmdTdGF0ZSk7Ci0gICAgICAgICAgICBjcmVhdGVkRG9jID0gdmVyc2lvbjsgLy8gcmV0dXJuIHRoZSB2ZXJzaW9uIGFuZCBub3QgdGhlIHZlcnNpb24gc2VyaWVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlcgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gb2JqZWN0U3RvcmUuY3JlYXRlRG9jdW1lbnQocHJvcE1hcCwgdXNlciwgZm9sZGVyLCBjb250ZW50U3RyZWFtTmV3LCBwb2xpY2llcywgYWNsQWRkLCBhY2xSZW1vdmUpOwotICAgICAgICAgICAgY3JlYXRlZERvYyA9IGRvYzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjcmVhdGVkRG9jOwotICAgIH0KLQotICAgIHByaXZhdGUgRm9sZGVyIGNyZWF0ZUZvbGRlckludGVybihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBBY2wgYWNsQWRkID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZVZhbGlkYXRvci5leHBhbmRBY2xNYWtyb3MoY29udGV4dC5nZXRVc2VybmFtZSgpLAotICAgICAgICAgICAgICAgIGFkZEFjZXMpOwotICAgICAgICBBY2wgYWNsUmVtb3ZlID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZVZhbGlkYXRvci5leHBhbmRBY2xNYWtyb3MoY29udGV4dC5nZXRVc2VybmFtZSgpLAotICAgICAgICAgICAgICAgIHJlbW92ZUFjZXMpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXNOZXcgPSBwcm9wZXJ0aWVzOwotCi0gICAgICAgIHZhbGlkYXRvci5jcmVhdGVGb2xkZXIoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgcG9saWNpZXMsIGV4dGVuc2lvbik7Ci0gICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVSZXF1aXJlZFN5c3RlbVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgIFN0cmluZyB1c2VyID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotCi0gICAgICAgIE9iamVjdFN0b3JlIGZzID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBGb2xkZXIgcGFyZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBnZXQgcmVxdWlyZWQgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gKFN0cmluZykgcGQuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBpZiAobnVsbCA9PSBmb2xkZXJOYW1lIHx8IGZvbGRlck5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgYSBmb2xkZXIgd2l0aG91dCBhIG5hbWUuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBuYW1lIHN5bnRheAotICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZE5hbWUoZm9sZGVyTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKE5hbWVWYWxpZGF0b3IuRVJST1JfSUxMRUdBTF9OQU1FICsgIiBOYW1lIGlzOiAiICsgZm9sZGVyTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhIGZvbGRlciB0eXBlCi0gICAgICAgIGlmICghdHlwZURlZi5nZXRCYXNlVHlwZUlkKCkuZXF1YWxzKEJhc2VUeXBlSWQuQ01JU19GT0xERVIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhIGZvbGRlciwgd2l0aCBhIG5vbi1mb2xkZXIgdHlwZTogIgotICAgICAgICAgICAgICAgICAgICArIHR5cGVEZWYuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAgPSBwcm9wZXJ0aWVzTmV3LmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwTmV3ID0gc2V0RGVmYXVsdFByb3BlcnRpZXModHlwZURlZiwgcHJvcE1hcCk7Ci0gICAgICAgIGlmIChwcm9wTWFwTmV3ICE9IHByb3BNYXApIHsgLy8gTk9TT05BUgotICAgICAgICAgICAgcHJvcGVydGllc05ldyA9IG5ldyBQcm9wZXJ0aWVzSW1wbChwcm9wTWFwTmV3LnZhbHVlcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY21pczExID0gY29udGV4dC5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICB2YWxpZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBudWxsLCBwcm9wZXJ0aWVzTmV3LCBmYWxzZSwgY21pczExKTsKLQotICAgICAgICAvLyB2YWxpZGF0ZSBBQ0wKLSAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFjbCh0eXBlRGVmLCBhY2xBZGQsIGFjbFJlbW92ZSk7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gbnVsbDsKLSAgICAgICAgLy8gY3JlYXRlIGZvbGRlcgotICAgICAgICB0cnkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJnZXQgZm9sZGVyIGZvciBpZDogIiArIGZvbGRlcklkKTsKLSAgICAgICAgICAgIHNvID0gZnMuZ2V0T2JqZWN0QnlJZChmb2xkZXJJZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmV0cmlldmUgZm9sZGVyLiIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICBwYXJlbnQgPSAoRm9sZGVyKSBzbzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBjcmVhdGUgZm9sZGVyLCBmb2xkZXJJZCBkb2VzIG5vdCByZWZlciB0byBhIGZvbGRlcjogIgotICAgICAgICAgICAgICAgICAgICArIGZvbGRlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHVzZXIgPSBVTktOT1dOX1VTRVI7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgRm9sZGVyIG5ld0ZvbGRlciA9IG9ialN0b3JlLmNyZWF0ZUZvbGRlcihmb2xkZXJOYW1lLCBwcm9wZXJ0aWVzTmV3LmdldFByb3BlcnRpZXMoKSwgdXNlciwgcGFyZW50LCBwb2xpY2llcywKLSAgICAgICAgICAgICAgICBhY2xBZGQsIGFjbFJlbW92ZSk7Ci0gICAgICAgIExPRy5kZWJ1Zygic3RvcCBjcmVhdGVGb2xkZXIoKSIpOwotICAgICAgICByZXR1cm4gbmV3Rm9sZGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RvcmVkT2JqZWN0IGNyZWF0ZVBvbGljeUludGVybihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBBY2wgYWNsQWRkID0gYWRkQWNlczsKLSAgICAgICAgQWNsIGFjbFJlbW92ZSA9IHJlbW92ZUFjZXM7Ci0KLSAgICAgICAgdmFsaWRhdG9yLmNyZWF0ZVBvbGljeShjb250ZXh0LCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBhY2xBZGQsIGFjbFJlbW92ZSwgcG9saWNpZXMsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgYWNsQWRkID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZVZhbGlkYXRvci5leHBhbmRBY2xNYWtyb3MoY29udGV4dC5nZXRVc2VybmFtZSgpLCBhY2xBZGQpOwotICAgICAgICBhY2xSZW1vdmUgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksCi0gICAgICAgICAgICAgICAgYWNsUmVtb3ZlKTsKLQotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIC8vIGdldCBuYW1lIGZyb20gcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wTWFwLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwZC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIHBkID0gcHJvcE1hcC5nZXQoUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQpOwotICAgICAgICBTdHJpbmcgcG9saWN5VGV4dCA9IChTdHJpbmcpIHBkLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgU3RvcmVkT2JqZWN0IHN0b3JlZE9iamVjdCA9IG9ialN0b3JlLmNyZWF0ZVBvbGljeShuYW1lLCBwb2xpY3lUZXh0LCBwcm9wTWFwLCB1c2VyLCBhY2xBZGQsIGFjbFJlbW92ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHN0b3JlZE9iamVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0b3JlZE9iamVjdCBjcmVhdGVSZWxhdGlvbnNoaXBJbnRlcm4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVSZXF1aXJlZFN5c3RlbVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgU3RyaW5nIHVzZXIgPSBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0KLSAgICAgICAgQWNsIGFjbEFkZCA9IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlR5cGVWYWxpZGF0b3IuZXhwYW5kQWNsTWFrcm9zKGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwKLSAgICAgICAgICAgICAgICBhZGRBY2VzKTsKLSAgICAgICAgQWNsIGFjbFJlbW92ZSA9IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlR5cGVWYWxpZGF0b3IuZXhwYW5kQWNsTWFrcm9zKGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwKLSAgICAgICAgICAgICAgICByZW1vdmVBY2VzKTsKLQotICAgICAgICAvLyBnZXQgcmVxdWlyZWQgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuU09VUkNFX0lEKTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUlkID0gKFN0cmluZykgcGQuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBpZiAobnVsbCA9PSBzb3VyY2VJZCB8fCBzb3VyY2VJZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhIHJlbGF0aW9uc2hpcCB3aXRob3V0IGEgc291cmNlSWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwZCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5UQVJHRVRfSUQpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0SWQgPSAoU3RyaW5nKSBwZC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGlmIChudWxsID09IHRhcmdldElkIHx8IHRhcmdldElkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGEgcmVsYXRpb25zaGlwIHdpdGhvdXQgYSB0YXJnZXRJZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBnZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBnaXZlbiB0eXBlIGlzIGEgcmVsYXRpb25zaGlwIHR5cGUKLSAgICAgICAgaWYgKCF0eXBlRGVmLmdldEJhc2VUeXBlSWQoKS5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGEgcmVsYXRpb25zaGlwLCB3aXRoIGEgbm9uLXJlbGF0aW9uc2hpcCB0eXBlOiAiCi0gICAgICAgICAgICAgICAgICAgICsgdHlwZURlZi5nZXRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0b3JlZE9iamVjdFtdIHJlbGF0aW9uT2JqZWN0cyA9IHZhbGlkYXRvci5jcmVhdGVSZWxhdGlvbnNoaXAoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBzb3VyY2VJZCwgdGFyZ2V0SWQsCi0gICAgICAgICAgICAgICAgcG9saWNpZXMsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgLy8gc2V0IGRlZmF1bHQgcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXNOZXc7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcE1hcCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXBOZXcgPSBzZXREZWZhdWx0UHJvcGVydGllcyh0eXBlRGVmLCBwcm9wTWFwKTsKLSAgICAgICAgaWYgKHByb3BNYXBOZXcgIT0gcHJvcE1hcCkgeyAvLyBOT1NPTkFSCi0gICAgICAgICAgICBwcm9wZXJ0aWVzTmV3ID0gbmV3IFByb3BlcnRpZXNJbXBsKHByb3BNYXBOZXcudmFsdWVzKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcGVydGllc05ldyA9IHByb3BlcnRpZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGNtaXMxMSA9IGNvbnRleHQuZ2V0Q21pc1ZlcnNpb24oKSAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMDsKLSAgICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgbnVsbCwgcHJvcGVydGllc05ldywgZmFsc2UsIGNtaXMxMSk7Ci0KLSAgICAgICAgLy8gdmFsaWRhdGUgQUNMCi0gICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVBY2wodHlwZURlZiwgYWNsQWRkLCBhY2xSZW1vdmUpOwotCi0gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBhbGxvd2VkIHR5cGVzIG9mIHRoZSByZWxhdGlvbnNoaXAKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gc291cmNlVHlwZURlZiA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZUJ5SWQocmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgIG9ialN0b3JlLmdldE9iamVjdEJ5SWQoc291cmNlSWQpLmdldFR5cGVJZCgpKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0YXJnZXRUeXBlRGVmID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlQnlJZChyZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICAgICAgb2JqU3RvcmUuZ2V0T2JqZWN0QnlJZCh0YXJnZXRJZCkuZ2V0VHlwZUlkKCkpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVBbGxvd2VkUmVsYXRpb25zaGlwVHlwZXMoKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmLCBzb3VyY2VUeXBlRGVmLAotICAgICAgICAgICAgICAgIHRhcmdldFR5cGVEZWYpOwotCi0gICAgICAgIC8vIGdldCBuYW1lIGZyb20gcHJvcGVydGllcwotICAgICAgICBwZCA9IHByb3BNYXAuZ2V0KFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHBkLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICBTdG9yZWRPYmplY3Qgc3RvcmVkT2JqZWN0ID0gb2JqU3RvcmUuY3JlYXRlUmVsYXRpb25zaGlwKG5hbWUsIHJlbGF0aW9uT2JqZWN0c1swXSwgcmVsYXRpb25PYmplY3RzWzFdLAotICAgICAgICAgICAgICAgIHByb3BNYXBOZXcsIHVzZXIsIGFjbEFkZCwgYWNsUmVtb3ZlKTsKLSAgICAgICAgcmV0dXJuIHN0b3JlZE9iamVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0b3JlZE9iamVjdCBjcmVhdGVJdGVtSW50ZXJuKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5jcmVhdGVJdGVtKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotCi0gICAgICAgIEFjbCBhY2xBZGQgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksCi0gICAgICAgICAgICAgICAgYWRkQWNlcyk7Ci0gICAgICAgIEFjbCBhY2xSZW1vdmUgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksCi0gICAgICAgICAgICAgICAgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgdmFsaWRhdG9yLmNyZWF0ZURvY3VtZW50KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIHBvbGljaWVzLCBleHRlbnNpb24pOwotCi0gICAgICAgIC8vIFZhbGlkYXRpb24gc3R1ZmYKLSAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVJlcXVpcmVkU3lzdGVtUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqZWN0U3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcE1hcCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAvLyBnZXQgbmFtZSBmcm9tIHByb3BlcnRpZXMKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBkID0gcHJvcE1hcC5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgcGQuZ2V0Rmlyc3RWYWx1ZSgpOwotCi0gICAgICAgIC8vIHZhbGlkYXRlIEFDTAotICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQWNsKHR5cGVEZWYsIGFjbEFkZCwgYWNsUmVtb3ZlKTsKLQotICAgICAgICBGb2xkZXIgZm9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgIT0gZm9sZGVySWQpIHsKLSAgICAgICAgICAgIGlmIChudWxsID09IHNvKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIiBDYW5ub3QgY3JlYXRlIGl0ZW0sIGZvbGRlcklkOiAiICsgZm9sZGVySWQgKyAiIGlzIGludmFsaWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgZm9sZGVyID0gKEZvbGRlcikgc287Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBjcmVhdGUgaXRlbSwgZm9sZGVySWQgZG9lcyBub3QgcmVmZXIgdG8gYSBmb2xkZXI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZm9sZGVySWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQWxsb3dlZENoaWxkT2JqZWN0VHlwZXModHlwZURlZiwgZm9sZGVyLmdldEFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgZ2l2ZW4gdHlwZSBpcyBhbiBpdGVtIHR5cGUKLSAgICAgICAgaWYgKCF0eXBlRGVmLmdldEJhc2VUeXBlSWQoKS5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0lURU0pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhbiBpdGVtLCB3aXRoIGEgbm9uLWl0ZW0gdHlwZTogIiArIHR5cGVEZWYuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBuYW1lIHN5bnRheAotICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKE5hbWVWYWxpZGF0b3IuRVJST1JfSUxMRUdBTF9OQU1FICsgIiBOYW1lIGlzOiAiICsgbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXNOZXcgPSBwcm9wZXJ0aWVzOwotICAgICAgICAvLyBzZXQgcHJvcGVydGllcyB0aGF0IGFyZSBub3Qgc2V0IGJ1dCBoYXZlIGEgZGVmYXVsdDoKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwTmV3ID0gc2V0RGVmYXVsdFByb3BlcnRpZXModHlwZURlZiwgcHJvcE1hcCk7Ci0gICAgICAgIGlmIChwcm9wTWFwTmV3ICE9IHByb3BNYXApIHsgLy8gTk9TT05BUgotICAgICAgICAgICAgcHJvcGVydGllc05ldyA9IG5ldyBQcm9wZXJ0aWVzSW1wbChwcm9wTWFwTmV3LnZhbHVlcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY21pczExID0gY29udGV4dC5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICB2YWxpZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBudWxsLCBwcm9wZXJ0aWVzTmV3LCBmYWxzZSwgY21pczExKTsKLQotICAgICAgICAvLyBzZXQgdXNlciwgY3JlYXRpb24gZGF0ZSwgZXRjLgotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VyID0gVU5LTk9XTl9VU0VSOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IGl0ZW0gPSBudWxsOwotCi0gICAgICAgIC8vIE5vdyB3ZSBhcmUgc3VyZSB0byBoYXZlIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbjoKLSAgICAgICAgaXRlbSA9IG9iamVjdFN0b3JlLmNyZWF0ZUl0ZW0obmFtZSwgcHJvcE1hcE5ldywgdXNlciwgZm9sZGVyLCBwb2xpY2llcywgYWNsQWRkLCBhY2xSZW1vdmUpOwotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRGVzY2VuZGFudChTdHJpbmcgdXNlciwgT2JqZWN0U3RvcmUgb2JqU3RvcmUsIEZvbGRlciBzb3VyY2VGb2xkZXIsIEZvbGRlciB0YXJnZXRGb2xkZXIpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUlkID0gc291cmNlRm9sZGVyLmdldElkKCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXRJZCA9IHRhcmdldEZvbGRlci5nZXRJZCgpOwotCi0gICAgICAgIEZvbGRlciBmb2xkZXIgPSB0YXJnZXRGb2xkZXI7Ci0gICAgICAgIHdoaWxlICh0YXJnZXRJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0SWQuZXF1YWxzKHNvdXJjZUlkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmVudElkcyA9IG9ialN0b3JlLmdldFBhcmVudElkcyhmb2xkZXIsIHVzZXIpOwotICAgICAgICAgICAgdGFyZ2V0SWQgPSBwYXJlbnRJZHMgPT0gbnVsbCB8fCBwYXJlbnRJZHMuaXNFbXB0eSgpID8gbnVsbCA6IHBhcmVudElkcy5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB0YXJnZXRJZCkgewotICAgICAgICAgICAgICAgIGZvbGRlciA9IChGb2xkZXIpIG9ialN0b3JlLmdldE9iamVjdEJ5SWQodGFyZ2V0SWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIHRyZWUgYnkgdHJhdmVyc2luZyBpdCBhbmQgZmlyc3QgZGVsZXRpbmcgYWxsCi0gICAgICogY2hpbGRyZW4gYW5kIHRoZW4gdGhlIG9iamVjdCBpdHNlbGYuCi0gICAgICogCi0gICAgICogcmV0dXJucyB0cnVlIGlmIG9wZXJhdGlvbiBzaG91bGQgY29udGludWUsIGZhbHNlIGlmIGl0IHNob3VsZAotICAgICAqICAgICAgICAgc3RvcAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVSZWN1cnNpdmUoT2JqZWN0U3RvcmUgb2JqU3RvcmUsIEZvbGRlciBwYXJlbnRGb2xkZXIsIGJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsCi0gICAgICAgICAgICBib29sZWFuIGFsbFZlcnNpb25zLCBMaXN0PFN0cmluZz4gZmFpbGVkVG9EZWxldGVJZHMsIFN0cmluZyB1c2VyKSB7Ci0KLSAgICAgICAgT2JqZWN0U3RvcmUuQ2hpbGRyZW5SZXN1bHQgY2hpbGRyZW5SZXN1bHQgPSBvYmpTdG9yZS5nZXRDaGlsZHJlbihwYXJlbnRGb2xkZXIsIC0xLCAtMSwgIkFkbWluIiwgdHJ1ZSk7Ci0gICAgICAgIExpc3Q8RmlsZWFibGU+IGNoaWxkcmVuID0gY2hpbGRyZW5SZXN1bHQuZ2V0Q2hpbGRyZW4oKTsKLQotICAgICAgICBpZiAobnVsbCA9PSBjaGlsZHJlbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEZpbGVhYmxlIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gbXVzdENvbnRpbnVlID0gZGVsZXRlUmVjdXJzaXZlKG9ialN0b3JlLCAoRm9sZGVyKSBjaGlsZCwgY29udGludWVPbkZhaWx1cmUsIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9EZWxldGVJZHMsIHVzZXIpOwotICAgICAgICAgICAgICAgIGlmICghbXVzdENvbnRpbnVlICYmICFjb250aW51ZU9uRmFpbHVyZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHN0b3AgZnVydGhlciBkZWxldGlvbnMKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ialN0b3JlLmRlbGV0ZU9iamVjdChjaGlsZC5nZXRJZCgpLCBhbGxWZXJzaW9ucywgdXNlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVG9EZWxldGVJZHMuYWRkKGNoaWxkLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvYmpTdG9yZS5kZWxldGVPYmplY3QocGFyZW50Rm9sZGVyLmdldElkKCksIGFsbFZlcnNpb25zLCB1c2VyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKE9iamVjdFN0b3JlIG9ialN0b3JlLCBTdG9yZWRPYmplY3Qgc28sIFN0cmluZyBzdHJlYW1JZCwgQmlnSW50ZWdlciBvZmZzZXQsIAotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgpIHsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjc2QgPSBudWxsOwotICAgICAgICBsb25nIGxPZmZzZXQgPSBvZmZzZXQgPT0gbnVsbCA/IDAgOiBvZmZzZXQubG9uZ1ZhbHVlKCk7Ci0gICAgICAgIGxvbmcgbExlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gLTEgOiBsZW5ndGgubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKHN0cmVhbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIGNzZCA9ICBvYmpTdG9yZS5nZXRDb250ZW50KHNvLCBsT2Zmc2V0LCBsTGVuZ3RoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1JZC5lbmRzV2l0aCgiLXJlbmRpdGlvbiIpKSB7Ci0gICAgICAgICAgICBjc2QgPSBvYmpTdG9yZS5nZXRSZW5kaXRpb25Db250ZW50KHNvLCBzdHJlYW1JZCwgbE9mZnNldCwgbExlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3NkOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBzZXREZWZhdWx0UHJvcGVydGllcyhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmLAotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllc1JldHVybiA9IHByb3BlcnRpZXM7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcERlZnMgPSB0eXBlRGVmLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKTsKLSAgICAgICAgYm9vbGVhbiBoYXNDb3BpZWQgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmIDogcHJvcERlZnMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wSWQgPSBwcm9wRGVmLmdldElkKCk7Ci0gICAgICAgICAgICBMaXN0PD8+IGRlZmF1bHRWYWwgPSBwcm9wRGVmLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWwgIT0gbnVsbCAmJiAhZGVmYXVsdFZhbC5pc0VtcHR5KCkgJiYgbnVsbCA9PSBwcm9wZXJ0aWVzLmdldChwcm9wSWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNDb3BpZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY29weSBiZWNhdXNlIGl0IGlzIGFuIHVubW9kaWZpZWQgY29sbGVjdGlvbgotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzUmV0dXJuID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+KHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgICAgICBoYXNDb3BpZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwcm9wRGVmLmdldENhcmRpbmFsaXR5KCkgPT0gQ2FyZGluYWxpdHkuU0lOR0xFID8gZGVmYXVsdFZhbC5nZXQoMCkgOiBkZWZhdWx0VmFsOwotICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVByb3BlcnR5RGF0YShwcm9wRGVmLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgLy8gc2V0IHByb3BlcnR5OgotICAgICAgICAgICAgICAgIHByb3BlcnRpZXNSZXR1cm4ucHV0KHByb3BJZCwgcGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzUmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RvcmVkT2JqZWN0IHNvLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBib29sZWFuIGNoZWNrTWFuZGF0b3J5LCBib29sZWFuIGNtaXMxMSkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmOwotCi0gICAgICAgIGlmIChudWxsICE9IHNvKSB7Ci0gICAgICAgICAgICB0eXBlRGVmID0gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBzbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlRGVmID0gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHByb3BlcnRpZXMgZm9yIHZhbGlkaXR5Ci0gICAgICAgIGlmICghY21pczExKSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyh0eXBlRGVmLCBwcm9wZXJ0aWVzLCBjaGVja01hbmRhdG9yeSwgY21pczExKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENNSVMgMS4xIHNlY29uZGFyeSB0eXBlcwotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUyk7Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzZWNvbmRhcnlUeXBlSWRzID0gKExpc3Q8U3RyaW5nPikgKHBkID09IG51bGwgPyBudWxsIDogcGQuZ2V0VmFsdWVzKCkpOwotICAgICAgICAvLyBpZiBubyBzZWNvbmRhcnkgdHlwZXMgYXJlIHBhc3NlZCB1c2UgdGhlIGV4aXN0aW5nIG9uZXM6Ci0gICAgICAgIGlmIChudWxsICE9IHNvICYmIChudWxsID09IHNlY29uZGFyeVR5cGVJZHMgfHwgc2Vjb25kYXJ5VHlwZUlkcy5zaXplKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIHNlY29uZGFyeVR5cGVJZHMgPSBzby5nZXRTZWNvbmRhcnlUeXBlSWRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBzZWNvbmRhcnlUeXBlSWRzICYmIHNlY29uZGFyeVR5cGVJZHMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhbGxUeXBlSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNlY29uZGFyeVR5cGVJZHMpOwotICAgICAgICAgICAgYWxsVHlwZUlkcy5hZGQodHlwZURlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHR5cGVEZWZzID0gZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBhbGxUeXBlSWRzKTsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWZzLCBwcm9wZXJ0aWVzLCBjaGVja01hbmRhdG9yeSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyh0eXBlRGVmLCBwcm9wZXJ0aWVzLCBjaGVja01hbmRhdG9yeSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFR5cGVEZWZpbml0aW9uIGdldFNlY29uZGFyeVR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFNldDxTdHJpbmc+IHNlY29uZGFyeVR5cGVJZHMsCi0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlJZCkgewotICAgICAgICBpZiAobnVsbCA9PSBzZWNvbmRhcnlUeXBlSWRzIHx8IHNlY29uZGFyeVR5cGVJZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoU3RyaW5nIHR5cGVJZCA6IHNlY29uZGFyeVR5cGVJZHMpIHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWZDID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlQnlJZChyZXBvc2l0b3J5SWQsIHR5cGVJZCk7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gdHlwZURlZkMuZ2V0VHlwZURlZmluaXRpb24oKTsKLQotICAgICAgICAgICAgaWYgKFR5cGVWYWxpZGF0b3IudHlwZUNvbnRhaW5zUHJvcGVydHkodHlwZURlZiwgcHJvcGVydHlJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZURlZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldExpc3RPZlByb3BlcnRpZXNUb0RlbGV0ZUZyb21SZW1vdmVkU2Vjb25kYXJ5VHlwZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RvcmVkT2JqZWN0IHNvLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG5ld1NlY29uZGFyeVR5cGVJZHMpIHsKLQotICAgICAgICBMaXN0PFN0cmluZz4gcHJvcGVydGllc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7IC8vIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZCB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQKLQotICAgICAgICAvLyBjYWxjdWxhdGUgZGVsdGEgdG8gYmUgcmVtb3ZlZAotICAgICAgICBMaXN0PFN0cmluZz4gZXhpc3RpbmdTZWNvbmRhcnlUeXBlSWRzID0gc28uZ2V0U2Vjb25kYXJ5VHlwZUlkcygpOwotICAgICAgICBMaXN0PFN0cmluZz4gZGVsdGEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oZXhpc3RpbmdTZWNvbmRhcnlUeXBlSWRzKTsKLSAgICAgICAgZGVsdGEucmVtb3ZlQWxsKG5ld1NlY29uZGFyeVR5cGVJZHMpOwotICAgICAgICBmb3IgKFN0cmluZyB0eXBlRGVmSWQgOiBkZWx0YSkgewotICAgICAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZURlZkMgPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVCeUlkKHJlcG9zaXRvcnlJZCwgdHlwZURlZklkKTsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB0eXBlRGVmQy5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgcHJvcGVydGllc1RvRGVsZXRlLmFkZEFsbCh0eXBlRGVmLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5rZXlTZXQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiB0aGUgbGlzdCBtYXkgY29udGFpbiB0b28gbWFueSBwcm9wZXJ0aWVzLCBpZiB0aGUgc2FtZSBwcm9wZXJ0eQotICAgICAgICAvLyBpcyBhbHNvIGluIGEgdHlwZSBub3QgdG8gYmUgcmVtb3ZlZAotICAgICAgICByZXR1cm4gcHJvcGVydGllc1RvRGVsZXRlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5UG9saWN5U2VydmljZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeVBvbGljeVNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MjQ2NzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5UG9saWN5U2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlByb3BlcnR5Q3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeVBvbGljeVNlcnZpY2VJbXBsIGV4dGVuZHMgSW5NZW1vcnlBYnN0cmFjdFNlcnZpY2VJbXBsIHsKLQotICAgIHByb3RlY3RlZCBJbk1lbW9yeVBvbGljeVNlcnZpY2VJbXBsKFN0b3JlTWFuYWdlciBzdG9yZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIoc3RvcmVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBcHBsaWVkUG9saWNpZXMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldEFwcGxpZWRQb2xpY2llcyhjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLQotICAgICAgICBpZiAoc28gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biBvYmplY3QgaWQ6ICIgKyBvYmplY3RJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBvbElkcyA9IHNvLmdldEFwcGxpZWRQb2xpY2llcygpOwotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHJlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcG9sSWRzICYmIHBvbElkcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3RTdG9yZSBvcyA9IHN1cGVyLmZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHBvbElkIDogcG9sSWRzKSB7Ci0gICAgICAgICAgICAgICAgU3RvcmVkT2JqZWN0IHBvbCA9IG9zLmdldE9iamVjdEJ5SWQocG9sSWQpOwotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2QgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmdldE9iamVjdERhdGEodG0sIG9ialN0b3JlLCBwb2wsIGZpbHRlciwgdXNlciwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgICAgIHJlcy5hZGQob2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldEFwcGxpZWRQb2xpY2llcyhjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBwb2xJZHMgPSBzby5nZXRBcHBsaWVkUG9saWNpZXMoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gcG9sSWRzIHx8ICEocG9sSWRzLmNvbnRhaW5zKHBvbGljeUlkKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQb2xpY3kgaWQgIiArIHBvbGljeUlkCi0gICAgICAgICAgICAgICAgICAgICsgImNhbm5vdCBiZSByZW1vdmVkLCBiZWNhdXNlIGl0IGlzIG5vdCBhcHBsaWVkIHRvIG9iamVjdCAiICsgb2JqZWN0SWQpOwotICAgICAgICB9Ci0gICAgICAgIHNvLnJlbW92ZVBvbGljeShwb2xpY3lJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgU3RvcmVkT2JqZWN0W10gc29zID0gdmFsaWRhdG9yLmFwcGx5UG9saWN5KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzb3NbMV07Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBvbElkcyA9IHNvLmdldEFwcGxpZWRQb2xpY2llcygpOwotICAgICAgICBpZiAobnVsbCAhPSBwb2xJZHMgJiYgcG9sSWRzLmNvbnRhaW5zKHBvbGljeUlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlBvbGljeSBpZCAiICsgcG9saWN5SWQKLSAgICAgICAgICAgICAgICAgICAgKyAiY2Fubm90IGJlIGFkZGVkLCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgYXBwbGllZCB0byBvYmplY3QgIiArIG9iamVjdElkKTsKLSAgICAgICAgfQotICAgICAgICBzby5hZGRBcHBsaWVkUG9saWN5KHBvbGljeUlkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeVJlbGF0aW9uc2hpcFNlcnZpY2VJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWFkYzA0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeVJlbGF0aW9uc2hpcFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuT2JqZWN0SW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mb0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5PYmplY3RTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlZE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5Qcm9wZXJ0eUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgSW5NZW1vcnlSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbCBleHRlbmRzIEluTWVtb3J5QWJzdHJhY3RTZXJ2aWNlSW1wbCB7Ci0KLSAgICBwcml2YXRlIEluTWVtb3J5UmVwb3NpdG9yeVNlcnZpY2VJbXBsIHJlcFN2YzsKLQotICAgIHByb3RlY3RlZCBJbk1lbW9yeVJlbGF0aW9uc2hpcFNlcnZpY2VJbXBsKFN0b3JlTWFuYWdlciBzdG9yZU1hbmFnZXIsIEluTWVtb3J5UmVwb3NpdG9yeVNlcnZpY2VJbXBsIHJlcFN2YykgewotICAgICAgICBzdXBlcihzdG9yZU1hbmFnZXIpOwotICAgICAgICB0aGlzLnJlcFN2YyA9IHJlcFN2YzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRPYmplY3RSZWxhdGlvbnNoaXBzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uLCBTdHJpbmcgdHlwZUlkLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0KLSAgICAgICAgaW50IHNraXAgPSBudWxsID09IHNraXBDb3VudCA/IDAgOiBza2lwQ291bnQuaW50VmFsdWUoKTsKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldE9iamVjdFJlbGF0aW9uc2hpcHMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgcmVsYXRpb25zaGlwRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgIHR5cGVJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBpZiAoc28gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVW5rbm93biBvYmplY3QgaWQ6ICIgKyBvYmplY3RJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdXNlciA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB0eXBlSWRzID0gbnVsbDsKLSAgICAgICAgaWYgKG51bGwgIT0gdHlwZUlkKSB7Ci0gICAgICAgICAgICB0eXBlSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB0eXBlSWRzLmFkZCh0eXBlSWQpOwotICAgICAgICAgICAgaWYgKGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcykgewotICAgICAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHR5cGVEZXNjcyA9IHJlcFN2Yy5nZXRUeXBlRGVzY2VuZGFudHMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0eXBlRGVzY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0IDogdHlwZURlc2NzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlSWRzLmFkZCh0LmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxTdG9yZWRPYmplY3Q+IHJlbHMgPSBvYmpTdG9yZS5nZXRSZWxhdGlvbnNoaXBzKG9iamVjdElkLCB0eXBlSWRzLCByZWxhdGlvbnNoaXBEaXJlY3Rpb24pOwotICAgICAgICBPYmplY3RMaXN0SW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0TGlzdEltcGwoKTsKLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiBvZExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KCk7Ci0KLSAgICAgICAgZm9yIChTdG9yZWRPYmplY3QgcmVsIDogcmVscykgewotICAgICAgICAgICAgT2JqZWN0RGF0YSBvZCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuZ2V0T2JqZWN0RGF0YSh0bSwgb2JqU3RvcmUsIHJlbCwgZmlsdGVyLCB1c2VyLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBleHRlbnNpb24pOwotICAgICAgICAgICAgb2RMaXN0LmFkZChvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgZkF0b21MaW5rUHJvdmlkZXIuZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgc28sIG9iamVjdEluZm8pOwotICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRPYmplY3RzKG9kTGlzdCk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2YocmVscy5zaXplKCkpKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhyZWxzLnNpemUoKSA+IHNraXAgKyByZWxzLnNpemUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeVJlcG9zaXRvcnlTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5UmVwb3NpdG9yeVNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDA2YmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5UmVwb3NpdG9yeVNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVEZWZpbml0aW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgSW5NZW1vcnlSZXBvc2l0b3J5U2VydmljZUltcGwgZXh0ZW5kcyBJbk1lbW9yeUFic3RyYWN0U2VydmljZUltcGwgewotCi0gICAgcHVibGljIEluTWVtb3J5UmVwb3NpdG9yeVNlcnZpY2VJbXBsKFN0b3JlTWFuYWdlciBzdG9yZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIoc3RvcmVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgdmFsaWRhdG9yLmdldFJlcG9zaXRvcnlJbmZvKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZXh0ZW5zaW9uKTsKLQotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvSW5mbyA9IGdldFJlcG9zaXRvcnlJbmZvRnJvbVN0b3JlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHJldHVybiByZXBvSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKENhbGxDb250ZXh0IGNvbnRleHQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHZhbGlkYXRvci5nZXRSZXBvc2l0b3J5SW5mb3MoY29udGV4dCwgZXh0ZW5zaW9uKTsKLSAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gcmVzID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5SW5mbz4oKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlcElkcyA9IGZTdG9yZU1hbmFnZXIuZ2V0QWxsUmVwb3NpdG9yeUlkcygpOwotICAgICAgICBmb3IgKFN0cmluZyByZXBJZCA6IHJlcElkcykgewotICAgICAgICAgICAgcmVzLmFkZChmU3RvcmVNYW5hZ2VyLmdldFJlcG9zaXRvcnlJbmZvKHJlcElkKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGdldFR5cGVDaGlsZHJlbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHZhbGlkYXRvci5nZXRUeXBlQ2hpbGRyZW4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgYm9vbGVhbiBpbmNsUHJvcERlZnMgPSBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyA9PSBudWxsID8gZmFsc2UgOiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9uczsKLSAgICAgICAgZ2V0UmVwb3NpdG9yeUluZm9Gcm9tU3RvcmVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7IC8vIGp1c3QgdG8gY2hlY2sgaWYKLSAgICAgICAgLy8gcmVwb3NpdG9yeSBleGlzdHMKLQotICAgICAgICBpbnQgc2tpcCA9IHNraXBDb3VudCA9PSBudWxsID8gMCA6IHNraXBDb3VudC5pbnRWYWx1ZSgpOwotICAgICAgICBpbnQgbWF4ID0gbWF4SXRlbXMgPT0gbnVsbCA/IC0xIDogbWF4SXRlbXMuaW50VmFsdWUoKTsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsIHJlc3VsdCA9IG5ldyBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsKCk7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGNoaWxkcmVuOwotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNwZWMgc2F5cyB0aGF0IGJhc2UgdHlwZXMgbXVzdCBiZSByZXR1cm5lZCBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgIGNoaWxkcmVuID0gZlN0b3JlTWFuYWdlci5nZXRSb290VHlwZXMocmVwb3NpdG9yeUlkLCBpbmNsUHJvcERlZnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hpbGRyZW4gPSBnZXRUeXBlRGVzY2VuZGFudHMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIEJpZ0ludGVnZXIudmFsdWVPZigxKSwgaW5jbFByb3BEZWZzLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMoQmlnSW50ZWdlci52YWx1ZU9mKGNoaWxkcmVuLnNpemUoKSkpOwotICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKGNoaWxkcmVuLnNpemUoKSA+IG1heCAtIHNraXApOwotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiBjaGlsZHJlblR5cGVzID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgTGlzdEl0ZXJhdG9yPFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBpdCA9IGNoaWxkcmVuLmxpc3RJdGVyYXRvcihza2lwKTsKLSAgICAgICAgaWYgKG1heCA8IDApIHsKLSAgICAgICAgICAgIG1heCA9IGNoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gc2tpcDsgaSA8IG1heCArIHNraXAgJiYgaXQuaGFzTmV4dCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoaWxkcmVuVHlwZXMuYWRkKGl0Lm5leHQoKS5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRMaXN0KGNoaWxkcmVuVHlwZXMpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICB2YWxpZGF0b3IuZ2V0VHlwZURlZmluaXRpb24oY29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdGMgPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVCeUlkKHJlcG9zaXRvcnlJZCwgdHlwZUlkKTsKLSAgICAgICAgaWYgKHRjICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0Yy5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigidW5rbm93biB0eXBlIGlkOiAiICsgdHlwZUlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVzY2VuZGFudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgZGVwdGgsIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHZhbGlkYXRvci5nZXRUeXBlRGVzY2VuZGFudHMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgYm9vbGVhbiBpbmNsUHJvcERlZnMgPSBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyA9PSBudWxsID8gZmFsc2UgOiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9uczsKLQotICAgICAgICBpZiAoZGVwdGggIT0gbnVsbCAmJiBkZXB0aC5pbnRWYWx1ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJkZXB0aCA9PSAwIGlzIGlsbGVnYWwgaW4gZ2V0VHlwZURlc2NlbmRhbnRzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNwZWMgc2F5cyB0aGF0IGRlcHRoIG11c3QgYmUgaWdub3JlZCBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgIENvbGxlY3Rpb248VHlwZURlZmluaXRpb25Db250YWluZXI+IHRtcCA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZURlZmluaXRpb25MaXN0KHJlcG9zaXRvcnlJZCwgaW5jbFByb3BEZWZzKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+KHRtcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0YyA9IGZTdG9yZU1hbmFnZXIuZ2V0VHlwZUJ5SWQocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGluY2xQcm9wRGVmcywKLSAgICAgICAgICAgICAgICAgICAgZGVwdGggPT0gbnVsbCA/IC0xIDogZGVwdGguaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICBpZiAodGMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHR5cGUgaWQ6ICIgKyB0eXBlSWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0Yy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gY3JlYXRlVHlwZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICB2YWxpZGF0b3IuY3JlYXRlVHlwZShjb250ZXh0LCByZXBvc2l0b3J5SWQsIHR5cGUsIGV4dGVuc2lvbik7ICAgICAgICAKLSAgICAgICAgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIgPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlZmluaXRpb24gbmV3VHlwZSA9IFR5cGVWYWxpZGF0b3IuY29tcGxldGVUeXBlKHR5cGUpOwotICAgICAgICBUeXBlVmFsaWRhdG9yLmFkanVzdFR5cGVOYW1lc0FuZElkKG5ld1R5cGUpOwotICAgICAgICBUeXBlVmFsaWRhdG9yLmNoZWNrVHlwZSh0eXBlTWFuYWdlciwgbmV3VHlwZSk7Ci0gICAgICAgIHR5cGVNYW5hZ2VyLmFkZFR5cGVEZWZpbml0aW9uKG5ld1R5cGUsIHRydWUpOwotICAgICAgICByZXR1cm4gbmV3VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdmFsaWRhdG9yLnVwZGF0ZVR5cGUoY29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlLCBleHRlbnNpb24pOyAgICAgICAgCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSB0eXBlLmdldElkKCk7Ci0gICAgICAgIFR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotICAgICAgICBpZiAobnVsbCA9PSB0eXBlTWFuYWdlcikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGVEZWZDID0gdHlwZU1hbmFnZXIuZ2V0VHlwZUJ5SWQodHlwZUlkKTsKLSAgICAgICAgaWYgKG51bGwgPT0gdHlwZURlZkMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgdXBkYXRlIHR5cGUgdW5rbm93biB0eXBlIGlkOiAiICsgdHlwZUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGVNYW5hZ2VyLnVwZGF0ZVR5cGVEZWZpbml0aW9uKHR5cGUpOwotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUeXBlKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHZhbGlkYXRvci5kZWxldGVUeXBlKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHRlbnNpb24pOyAgICAgICAgCi0gICAgICAgIFR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyID0gZlN0b3JlTWFuYWdlci5nZXRUeXBlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBpZiAob2JqZWN0U3RvcmUuaXNUeXBlSW5Vc2UodHlwZUlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oInR5cGUgZGVmaW5pdGlvbiAiICsgdHlwZUlkICsgIiBjYW5ub3QgYmUgZGVsZXRlZCwgdHlwZSBpcyBpbiB1c2UuIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0eXBlTWFuYWdlci5kZWxldGVUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm9Gcm9tU3RvcmVNYW5hZ2VyKFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb0luZm8gPSBmU3RvcmVNYW5hZ2VyLmdldFJlcG9zaXRvcnlJbmZvKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChudWxsID09IHJlcG9JbmZvIHx8ICFyZXBvSW5mby5nZXRJZCgpLmVxdWFscyhyZXBvc2l0b3J5SWQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biByZXBvc2l0b3J5OiAiICsgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVwb0luZm87Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zZXJ2ZXIvSW5NZW1vcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwY2RkMjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuQWJzdHJhY3RDbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeVNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdENtaXNTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RvcmVNYW5hZ2VyIHN0b3JlTWFuYWdlcjsgLy8gc2luZ2xldG9uIHJvb3Qgb2YgZXZlcnl0aGluZwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJbk1lbW9yeVJlcG9zaXRvcnlTZXJ2aWNlSW1wbCBmUmVwU3ZjOwotICAgIHByaXZhdGUgZmluYWwgSW5NZW1vcnlPYmplY3RTZXJ2aWNlSW1wbCBmT2JqU3ZjOwotICAgIHByaXZhdGUgZmluYWwgSW5NZW1vcnlOYXZpZ2F0aW9uU2VydmljZUltcGwgZk5hdlN2YzsKLSAgICBwcml2YXRlIGZpbmFsIEluTWVtb3J5VmVyc2lvbmluZ1NlcnZpY2VJbXBsIGZWZXJTdmM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbk1lbW9yeURpc2NvdmVyeVNlcnZpY2VJbXBsIGZEaXNTdmM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJbk1lbW9yeU11bHRpRmlsaW5nU2VydmljZUltcGwgZk11bHRpU3ZjOwotICAgIHByaXZhdGUgZmluYWwgSW5NZW1vcnlSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbCBmUmVsU3ZjOwotICAgIHByaXZhdGUgZmluYWwgSW5NZW1vcnlQb2xpY3lTZXJ2aWNlSW1wbCBmUG9sU3ZjOwotICAgIHByaXZhdGUgZmluYWwgSW5NZW1vcnlBY2xTZXJ2aWNlIGZBY2xTdmM7Ci0KLSAgICBwdWJsaWMgU3RvcmVNYW5hZ2VyIGdldFN0b3JlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHN0b3JlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5NZW1vcnlTZXJ2aWNlKFN0b3JlTWFuYWdlciBzbSkgewotICAgICAgICBzdG9yZU1hbmFnZXIgPSBzbTsKLSAgICAgICAgZlJlcFN2YyA9IG5ldyBJbk1lbW9yeVJlcG9zaXRvcnlTZXJ2aWNlSW1wbChzdG9yZU1hbmFnZXIpOwotICAgICAgICBmTmF2U3ZjID0gbmV3IEluTWVtb3J5TmF2aWdhdGlvblNlcnZpY2VJbXBsKHN0b3JlTWFuYWdlcik7Ci0gICAgICAgIGZPYmpTdmMgPSBuZXcgSW5NZW1vcnlPYmplY3RTZXJ2aWNlSW1wbChzdG9yZU1hbmFnZXIpOwotICAgICAgICBmVmVyU3ZjID0gbmV3IEluTWVtb3J5VmVyc2lvbmluZ1NlcnZpY2VJbXBsKHN0b3JlTWFuYWdlciwgZk9ialN2Yyk7Ci0gICAgICAgIGZEaXNTdmMgPSBuZXcgSW5NZW1vcnlEaXNjb3ZlcnlTZXJ2aWNlSW1wbChzdG9yZU1hbmFnZXIpOwotICAgICAgICBmTXVsdGlTdmMgPSBuZXcgSW5NZW1vcnlNdWx0aUZpbGluZ1NlcnZpY2VJbXBsKHN0b3JlTWFuYWdlcik7Ci0gICAgICAgIGZSZWxTdmMgPSBuZXcgSW5NZW1vcnlSZWxhdGlvbnNoaXBTZXJ2aWNlSW1wbChzdG9yZU1hbmFnZXIsIGZSZXBTdmMpOwotICAgICAgICBmUG9sU3ZjID0gbmV3IEluTWVtb3J5UG9saWN5U2VydmljZUltcGwoc3RvcmVNYW5hZ2VyKTsKLSAgICAgICAgZkFjbFN2YyA9IG5ldyBJbk1lbW9yeUFjbFNlcnZpY2Uoc3RvcmVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsbENvbnRleHQgZ2V0Q2FsbENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBJbk1lbW9yeVNlcnZpY2VDb250ZXh0LmdldENhbGxDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbENvbnRleHQoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBJbk1lbW9yeVNlcnZpY2VDb250ZXh0LnNldENhbGxDb250ZXh0KGNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIC0tLSByZXBvc2l0b3J5IHNlcnZpY2UgLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgc2V0Q2FsbENvbnRleHQobnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZSZXBTdmMuZ2V0UmVwb3NpdG9yeUluZm9zKGdldENhbGxDb250ZXh0KCksIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZlJlcFN2Yy5nZXRSZXBvc2l0b3J5SW5mbyhnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZSZXBTdmMuZ2V0VHlwZUNoaWxkcmVuKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZSZXBTdmMuZ2V0VHlwZURlZmluaXRpb24oZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGNyZWF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmUmVwU3ZjLmNyZWF0ZVR5cGUoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCB0eXBlLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiB1cGRhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZlJlcFN2Yy51cGRhdGVUeXBlKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgdHlwZSwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBmUmVwU3ZjLmRlbGV0ZVR5cGUoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmUmVwU3ZjLmdldFR5cGVEZXNjZW5kYW50cyhnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIHR5cGVJZCwgZGVwdGgsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgLy8gLS0tIG5hdmlnYXRpb24gc2VydmljZSAtLS0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENoZWNrZWRPdXREb2NzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZOYXZTdmMuZ2V0Q2hlY2tlZE91dERvY3MoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBvcmRlckJ5LAotICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24sIHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckxpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBvcmRlckJ5LCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldERlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZk5hdlN2Yy5nZXREZXNjZW5kYW50cyhnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBkZXB0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmTmF2U3ZjLmdldEZvbGRlclBhcmVudChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldEZvbGRlclRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmTmF2U3ZjLmdldEZvbGRlclRyZWUoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZGVwdGgsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBleHRlbnNpb24sIHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZOYXZTdmMuZ2V0T2JqZWN0UGFyZW50cyhnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBleHRlbnNpb24sIHRoaXMpOwotICAgIH0KLQotICAgIC8vIC0tLSBvYmplY3Qgc2VydmljZSAtLS0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZShnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgICAgIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBpZDsKLQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZPYmpTdmMuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgc291cmNlSWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLAotICAgICAgICAgICAgICAgIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVGb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmT2JqU3ZjLmNyZWF0ZUZvbGRlcihnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywKLSAgICAgICAgICAgICAgICByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZk9ialN2Yy5jcmVhdGVQb2xpY3koZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFjZXMsCi0gICAgICAgICAgICAgICAgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbGF0aW9uc2hpcChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmT2JqU3ZjLmNyZWF0ZVJlbGF0aW9uc2hpcChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVJdGVtKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZk9ialN2Yy5jcmVhdGVJdGVtKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZk9ialN2Yy5kZWxldGVDb250ZW50U3RyZWFtKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGNoYW5nZVRva2VuLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBmT2JqU3ZjLmRlbGV0ZU9iamVjdChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBmT2JqU3ZjLmRlbGV0ZU9iamVjdChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmFpbGVkVG9EZWxldGVEYXRhIGRlbGV0ZVRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZk9ialN2Yy5kZWxldGVUcmVlKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLCB1bmZpbGVPYmplY3RzLAotICAgICAgICAgICAgICAgIGNvbnRpbnVlT25GYWlsdXJlLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZPYmpTdmMuZ2V0QWxsb3dhYmxlQWN0aW9ucyhnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc3RyZWFtSWQsIEJpZ0ludGVnZXIgb2Zmc2V0LAotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHN0cmVhbUlkLCBvZmZzZXQsIGxlbmd0aCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmT2JqU3ZjLmdldE9iamVjdChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBY2wsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwYXRoLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmT2JqU3ZjLmdldE9iamVjdEJ5UGF0aChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIHBhdGgsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgZXh0ZW5zaW9uLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmT2JqU3ZjLmdldFByb3BlcnRpZXMoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFJlbmRpdGlvbkRhdGE+IGdldFJlbmRpdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZk9ialN2Yy5nZXRSZW5kaXRpb25zKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsIHNraXBDb3VudCwKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1vdmVPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIFN0cmluZyB0YXJnZXRGb2xkZXJJZCwgU3RyaW5nIHNvdXJjZUZvbGRlcklkLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGZPYmpTdmMubW92ZU9iamVjdChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCB0YXJnZXRGb2xkZXJJZCwgc291cmNlRm9sZGVySWQsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBvdmVyd3JpdGVGbGFnLAotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGZPYmpTdmMuc2V0Q29udGVudFN0cmVhbShnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvdmVyd3JpdGVGbGFnLCBjaGFuZ2VUb2tlbiwgY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZk9ialN2Yy51cGRhdGVQcm9wZXJ0aWVzKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGNoYW5nZVRva2VuLCBwcm9wZXJ0aWVzLCBudWxsLCBleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgfQotCi0gICAgLy8gQ01JUyAxLjEKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgYm9vbGVhbiBpc0xhc3RDaHVuaywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGZPYmpTdmMuYXBwZW5kQ29udGVudFN0cmVhbShnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjaGFuZ2VUb2tlbiwgY29udGVudFN0cmVhbSwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICAvLyBDTUlTIDEuMQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBidWxrVXBkYXRlUHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFkZFNlY29uZGFyeVR5cGVJZHMsIExpc3Q8U3RyaW5nPiByZW1vdmVTZWNvbmRhcnlUeXBlSWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZPYmpTdmMuYnVsa1VwZGF0ZVByb3BlcnRpZXMoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZEFuZENoYW5nZVRva2VuLCBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIGFkZFNlY29uZGFyeVR5cGVJZHMsIHJlbW92ZVNlY29uZGFyeVR5cGVJZHMsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgLy8gLS0tIHZlcnNpb25pbmcgc2VydmljZSAtLS0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbENoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGZWZXJTdmMuY2FuY2VsQ2hlY2tPdXQoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZlZlclN2Yy5jaGVja0luKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG1ham9yLCBwcm9wZXJ0aWVzLCBjb250ZW50U3RyZWFtLCBjaGVja2luQ29tbWVudCwKLSAgICAgICAgICAgICAgICBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLAotICAgICAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQpIHsKLSAgICAgICAgZlZlclN2Yy5jaGVja091dChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24sIGNvbnRlbnRDb3BpZWQsIHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGZWZXJTdmMuZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsCi0gICAgICAgICAgICAgICAgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwKLSAgICAgICAgICAgICAgICBleHRlbnNpb24sIHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmVmVyU3ZjLmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBtYWpvciwKLSAgICAgICAgICAgICAgICBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QWxsVmVyc2lvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmVmVyU3ZjLmdldEFsbFZlcnNpb25zKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgZmlsdGVyLAotICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBleHRlbnNpb24sIHRoaXMpOwotICAgIH0KLQotICAgIC8vIC0tLSBkaXNjb3Zlcnkgc2VydmljZSAtLS0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmRGlzU3ZjLmdldENvbnRlbnRDaGFuZ2VzKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgY2hhbmdlTG9nVG9rZW4sIGluY2x1ZGVQcm9wZXJ0aWVzLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgbWF4SXRlbXMsIGV4dGVuc2lvbiwgdGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZkRpc1N2Yy5xdWVyeShnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIHN0YXRlbWVudCwgc2VhcmNoQWxsVmVyc2lvbnMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgLy8gLS0tIG11bHRpIGZpbGluZyBzZXJ2aWNlIC0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkT2JqZWN0VG9Gb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgZk11bHRpU3ZjLmFkZE9iamVjdFRvRm9sZGVyKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RGcm9tRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLCAKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBmTXVsdGlTdmMucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gcmVsYXRpb25zaGlwIHNlcnZpY2UgLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRPYmplY3RSZWxhdGlvbnNoaXBzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsCi0gICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZlJlbFN2Yy5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcywKLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIHR5cGVJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gQUNMIHNlcnZpY2UgLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBmQWNsU3ZjLmFwcGx5QWNsKGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFjZXMsIGFjbFByb3BhZ2F0aW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZkFjbFN2Yy5hcHBseUFjbChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBhY2xQcm9wYWdhdGlvbiwKLSAgICAgICAgICAgICAgICBleHRlbnNpb24sIHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBmQWNsU3ZjLmdldEFjbChnZXRDYWxsQ29udGV4dCgpLCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgZXh0ZW5zaW9uLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gcG9saWN5IHNlcnZpY2UgLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGZQb2xTdmMuYXBwbHlQb2xpY3koZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QXBwbGllZFBvbGljaWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gZlBvbFN2Yy5nZXRBcHBsaWVkUG9saWNpZXMoZ2V0Q2FsbENvbnRleHQoKSwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGZQb2xTdmMucmVtb3ZlUG9saWN5KGdldENhbGxDb250ZXh0KCksIHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIC8vIC8vLy8vLy8vLy8vLy8KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5U2VydmljZUNvbnRleHQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeVNlcnZpY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlODc0NjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5U2VydmljZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5DbWlzU2VydmljZVdyYXBwZXI7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGFzc29jaWF0ZSBjb250ZXh0IGluZm9ybWF0aW9uIHdpdGggZWFjaCBpbmNvbWluZyBjYWxsLgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbk1lbW9yeVNlcnZpY2VDb250ZXh0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRleHRIb2xkZXIgewotICAgICAgICBwcml2YXRlIENtaXNTZXJ2aWNlV3JhcHBlcjxJbk1lbW9yeVNlcnZpY2U+IHdyYXBwZXI7Ci0gICAgICAgIHByaXZhdGUgQ2FsbENvbnRleHQgY2FsbENvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb250ZXh0SG9sZGVyKENtaXNTZXJ2aWNlV3JhcHBlcjxJbk1lbW9yeVNlcnZpY2U+IHdyYXBwZXIpIHsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ21pc1NlcnZpY2VXcmFwcGVyPEluTWVtb3J5U2VydmljZT4gZ2V0U2VydmljZVdyYXBwZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENhbGxDb250ZXh0KENhbGxDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMuY2FsbENvbnRleHQgPSBjb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENhbGxDb250ZXh0IGdldENhbGxDb250ZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIGNhbGxDb250ZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWw8Q29udGV4dEhvbGRlcj4gdGhyZWFkTG9jYWxTZXJ2aWNlID0gbmV3IFRocmVhZExvY2FsPENvbnRleHRIb2xkZXI+KCk7Ci0KLSAgICBwcml2YXRlIEluTWVtb3J5U2VydmljZUNvbnRleHQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRXcmFwcGVyU2VydmljZShDbWlzU2VydmljZVdyYXBwZXI8SW5NZW1vcnlTZXJ2aWNlPiB3cmFwcGVyU2VydmljZSkgewotICAgICAgICB0aHJlYWRMb2NhbFNlcnZpY2UucmVtb3ZlKCk7Ci0gICAgICAgIGlmIChudWxsICE9IHdyYXBwZXJTZXJ2aWNlKSB7Ci0gICAgICAgICAgICBDb250ZXh0SG9sZGVyIGhvbGRlciA9IG5ldyBDb250ZXh0SG9sZGVyKHdyYXBwZXJTZXJ2aWNlKTsKLSAgICAgICAgICAgIHRocmVhZExvY2FsU2VydmljZS5zZXQoaG9sZGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEluTWVtb3J5U2VydmljZSBnZXRDbWlzU2VydmljZSgpIHsKLSAgICAgICAgQ29udGV4dEhvbGRlciBob2xkZXIgPSB0aHJlYWRMb2NhbFNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgIGlmIChudWxsID09IGhvbGRlcikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbWlzU2VydmljZVdyYXBwZXI8SW5NZW1vcnlTZXJ2aWNlPiB3cmFwcGVyU2VydmljZSA9IGhvbGRlci5nZXRTZXJ2aWNlV3JhcHBlcigpOwotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXJTZXJ2aWNlID09IG51bGwgPyBudWxsIDogd3JhcHBlclNlcnZpY2UuZ2V0V3JhcHBlZFNlcnZpY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q2FsbENvbnRleHQoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb250ZXh0SG9sZGVyIGhvbGRlciA9IHRocmVhZExvY2FsU2VydmljZS5nZXQoKTsKLSAgICAgICAgaWYgKG51bGwgPT0gaG9sZGVyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc3RvcmUgY2FsbCBjb250ZXh0LCBubyBzZXJ2aWNlIHdyYXBwZXIgc2V0LiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaG9sZGVyLnNldENhbGxDb250ZXh0KGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDYWxsQ29udGV4dCBnZXRDYWxsQ29udGV4dCgpIHsKLSAgICAgICAgQ29udGV4dEhvbGRlciBob2xkZXIgPSB0aHJlYWRMb2NhbFNlcnZpY2UuZ2V0KCk7Ci0gICAgICAgIHJldHVybiBudWxsID09IGhvbGRlciA/IG51bGwgOiBob2xkZXIuZ2V0Q2FsbENvbnRleHQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeVNlcnZpY2VGYWN0b3J5SW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5U2VydmljZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmVhMzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5U2VydmljZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MVXRpbHMubmV4dDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuWE1MQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQmluZGluZ3NPYmplY3RGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLkFic3RyYWN0U2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQmluZGluZ3NPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LkNvbmZpZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5Db25maWd1cmF0aW9uU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5PYmplY3RTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbC5TdG9yZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsLlN0b3JlTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuQ21pc1NlcnZpY2VXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwucmVwb3NpdG9yeS5PYmplY3RHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEluTWVtb3J5U2VydmljZUZhY3RvcnlJbXBsIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5NZW1vcnlTZXJ2aWNlRmFjdG9yeUltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfTUFYX0lURU1TX09CSkVDVFMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwMCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX01BWF9JVEVNU19UWVBFUyA9IEJpZ0ludGVnZXIudmFsdWVPZigxMDApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9ERVBUSF9PQkpFQ1RTID0gQmlnSW50ZWdlci52YWx1ZU9mKDIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9ERVBUSF9UWVBFUyA9IEJpZ0ludGVnZXIudmFsdWVPZigtMSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ2FsbENvbnRleHQgb3ZlcnJpZGVDdHg7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZlVzZU92ZXJyaWRlQ3R4ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdG9yZU1hbmFnZXIgc3RvcmVNYW5hZ2VyOyAvLyBzaW5nbGV0b24gcm9vdCBvZiBldmVyeXRoaW5nCi0gICAgcHJpdmF0ZSBDbGVhbk1hbmFnZXIgY2xlYW5NYW5hZ2VyID0gbnVsbDsKLQotICAgIHByaXZhdGUgRmlsZSB0ZW1wRGlyOwotICAgIHByaXZhdGUgaW50IG1lbW9yeVRocmVzaG9sZDsKLSAgICBwcml2YXRlIGxvbmcgbWF4Q29udGVudFNpemU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVuY3J5cHQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBMT0cuaW5mbygiSW5pdGlhbGl6aW5nIGluLW1lbW9yeSByZXBvc2l0b3J5Li4uIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiSW5pdCBwYXJhbWF0ZXJzOiAiICsgcGFyYW1ldGVycyk7Ci0KLSAgICAgICAgU3RyaW5nIG92ZXJyaWRlQ3R4UGFyYW0gPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuT1ZFUlJJREVfQ0FMTF9DT05URVhUKTsKLSAgICAgICAgaWYgKG51bGwgIT0gb3ZlcnJpZGVDdHhQYXJhbSkgewotICAgICAgICAgICAgZlVzZU92ZXJyaWRlQ3R4ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbmZpZ3VyYXRpb25TZXR0aW5ncy5pbml0KHBhcmFtZXRlcnMpOwotCi0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5Q2xhc3NOYW1lID0gcGFyYW1ldGVycy5nZXQoQ29uZmlnQ29uc3RhbnRzLlJFUE9TSVRPUllfQ0xBU1MpOwotICAgICAgICBpZiAobnVsbCA9PSByZXBvc2l0b3J5Q2xhc3NOYW1lKSB7Ci0gICAgICAgICAgICByZXBvc2l0b3J5Q2xhc3NOYW1lID0gU3RvcmVNYW5hZ2VySW1wbC5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCA9PSBzdG9yZU1hbmFnZXIpIHsKLSAgICAgICAgICAgIHN0b3JlTWFuYWdlciA9IFN0b3JlTWFuYWdlckZhY3RvcnkuY3JlYXRlSW5zdGFuY2UocmVwb3NpdG9yeUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGVtcERpclN0ciA9IHBhcmFtZXRlcnMuZ2V0KENvbmZpZ0NvbnN0YW50cy5URU1QX0RJUik7Ci0gICAgICAgIHRlbXBEaXIgPSAodGVtcERpclN0ciA9PSBudWxsID8gc3VwZXIuZ2V0VGVtcERpcmVjdG9yeSgpIDogbmV3IEZpbGUodGVtcERpclN0cikpOwotCi0gICAgICAgIFN0cmluZyBtZW1vcnlUaHJlc2hvbGRTdHIgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuTUVNT1JZX1RIUkVTSE9MRCk7Ci0gICAgICAgIG1lbW9yeVRocmVzaG9sZCA9IChtZW1vcnlUaHJlc2hvbGRTdHIgPT0gbnVsbCA/IHN1cGVyLmdldE1lbW9yeVRocmVzaG9sZCgpIDogSW50ZWdlcgotICAgICAgICAgICAgICAgIC5wYXJzZUludChtZW1vcnlUaHJlc2hvbGRTdHIpKTsKLQotICAgICAgICBTdHJpbmcgbWF4Q29udGVudFNpemVTdHIgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuTUFYX0NPTlRFTlRfU0laRSk7Ci0gICAgICAgIG1heENvbnRlbnRTaXplID0gKG1heENvbnRlbnRTaXplU3RyID09IG51bGwgPyBzdXBlci5nZXRNYXhDb250ZW50U2l6ZSgpIDogTG9uZy5wYXJzZUxvbmcobWF4Q29udGVudFNpemVTdHIpKTsKLQotICAgICAgICBTdHJpbmcgZW5jcnlwdFRlbXBGaWxlc1N0ciA9IHBhcmFtZXRlcnMuZ2V0KENvbmZpZ0NvbnN0YW50cy5FTkNSWVBUX1RFTVBfRklMRVMpOwotICAgICAgICBlbmNyeXB0ID0gKGVuY3J5cHRUZW1wRmlsZXNTdHIgPT0gbnVsbCA/IHN1cGVyLmVuY3J5cHRUZW1wRmlsZXMoKSA6IEJvb2xlYW4ucGFyc2VCb29sZWFuKGVuY3J5cHRUZW1wRmlsZXNTdHIpKTsKLQotICAgICAgICBEYXRlIGRlcGxveW1lbnRUaW1lID0gbmV3IERhdGUoKTsKLSAgICAgICAgU3RyaW5nIHN0ckRhdGUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTSBkZCBoaDptbTpzcyBhIHogeXl5eSIsIExvY2FsZS5VUykuZm9ybWF0KGRlcGxveW1lbnRUaW1lKTsKLQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb25maWdDb25zdGFudHMuREVQTE9ZTUVOVF9USU1FLCBzdHJEYXRlKTsKLQotICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSBpbml0U3RvcmFnZU1hbmFnZXIocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgaWYgKGNyZWF0ZWQpIHsKLSAgICAgICAgICAgIGZpbGxSZXBvc2l0b3J5SWZDb25maWd1cmVkKHBhcmFtZXRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9uZyBjbGVhbkludGVydmFsID0gQ29uZmlndXJhdGlvblNldHRpbmdzCi0gICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25WYWx1ZUFzTG9uZyhDb25maWdDb25zdGFudHMuQ0xFQU5fUkVQT1NJVE9SWV9JTlRFUlZBTCk7Ci0gICAgICAgIGlmIChudWxsICE9IGNsZWFuSW50ZXJ2YWwgJiYgY2xlYW5JbnRlcnZhbCA+IDApIHsKLSAgICAgICAgICAgIHNjaGVkdWxlQ2xlYW5SZXBvc2l0b3J5Sm9iKGNsZWFuSW50ZXJ2YWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgTE9HLmluZm8oIi4uLmluaXRpYWxpemVkIGluLW1lbW9yeSByZXBvc2l0b3J5LiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdmVycmlkZUNhbGxDb250ZXh0KENhbGxDb250ZXh0IGN0eCkgewotICAgICAgICBvdmVycmlkZUN0eCA9IGN0eDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ21pc1NlcnZpY2UgZ2V0U2VydmljZShDYWxsQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIExPRy5kZWJ1Zygic3RhcnQgZ2V0U2VydmljZSgpIik7Ci0gICAgICAgIENhbGxDb250ZXh0IGNvbnRleHRUb1VzZSA9IGNvbnRleHQ7Ci0gICAgICAgIC8vIEF0dGFjaCB0aGUgQ2FsbENvbnRleHQgdG8gYSB0aHJlYWQgbG9jYWwgY29udGV4dCB0aGF0IGNhbiBiZQotICAgICAgICAvLyBhY2Nlc3NlZCBmcm9tIGV2ZXJ5d2hlcmUKLSAgICAgICAgLy8gU29tZSB1bml0IHRlc3RzIHNldCB0aGVpciBvd24gY29udGV4dC4gU28gaWYgd2UgZmluZCBvbmUgdGhlbiB3ZSB1c2UKLSAgICAgICAgLy8gdGhpcyBvbmUgYW5kIGlnbm9yZSB0aGUgcHJvdmlkZWQgb25lLiBPdGhlcndpc2Ugd2Ugc2V0IGEgbmV3IGNvbnRleHQuCi0gICAgICAgIGlmIChmVXNlT3ZlcnJpZGVDdHggJiYgbnVsbCAhPSBvdmVycmlkZUN0eCkgewotICAgICAgICAgICAgY29udGV4dFRvVXNlID0gb3ZlcnJpZGVDdHg7Ci0gICAgICAgIH0KLQotICAgICAgICBJbk1lbW9yeVNlcnZpY2UgaW5NZW1vcnlTZXJ2aWNlID0gSW5NZW1vcnlTZXJ2aWNlQ29udGV4dC5nZXRDbWlzU2VydmljZSgpOwotICAgICAgICBpZiAoaW5NZW1vcnlTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRpbmcgbmV3IEluTWVtb3J5U2VydmljZSBpbnN0YW5jZSEiKTsKLSAgICAgICAgICAgIENtaXNTZXJ2aWNlV3JhcHBlcjxJbk1lbW9yeVNlcnZpY2U+IHdyYXBwZXJTZXJ2aWNlOwotICAgICAgICAgICAgaW5NZW1vcnlTZXJ2aWNlID0gbmV3IEluTWVtb3J5U2VydmljZShzdG9yZU1hbmFnZXIpOwotICAgICAgICAgICAgd3JhcHBlclNlcnZpY2UgPSBuZXcgQ21pc1NlcnZpY2VXcmFwcGVyPEluTWVtb3J5U2VydmljZT4oaW5NZW1vcnlTZXJ2aWNlLCBERUZBVUxUX01BWF9JVEVNU19UWVBFUywKLSAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ERVBUSF9UWVBFUywgREVGQVVMVF9NQVhfSVRFTVNfT0JKRUNUUywgREVGQVVMVF9ERVBUSF9PQkpFQ1RTKTsKLSAgICAgICAgICAgIEluTWVtb3J5U2VydmljZUNvbnRleHQuc2V0V3JhcHBlclNlcnZpY2Uod3JhcHBlclNlcnZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5NZW1vcnlTZXJ2aWNlLnNldENhbGxDb250ZXh0KGNvbnRleHRUb1VzZSk7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJzdG9wIGdldFNlcnZpY2UoKSIpOwotICAgICAgICByZXR1cm4gaW5NZW1vcnlTZXJ2aWNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWxlIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiB0ZW1wRGlyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVuY3J5cHRUZW1wRmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiBlbmNyeXB0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5VGhyZXNob2xkKCkgewotICAgICAgICByZXR1cm4gbWVtb3J5VGhyZXNob2xkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldE1heENvbnRlbnRTaXplKCkgewotICAgICAgICByZXR1cm4gbWF4Q29udGVudFNpemU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJEZXN0cm95aW5nIEluTWVtb3J5IHNlcnZpY2UgaW5zdGFuY2UuIik7Ci0gICAgICAgIGlmIChudWxsICE9IGNsZWFuTWFuYWdlcikgewotICAgICAgICAgICAgY2xlYW5NYW5hZ2VyLnN0b3BDbGVhblJlcG9zaXRvcnlKb2IoKTsKLSAgICAgICAgfQotICAgICAgICBJbk1lbW9yeVNlcnZpY2VDb250ZXh0LnNldFdyYXBwZXJTZXJ2aWNlKG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdG9yZU1hbmFnZXIgZ2V0U3RvcmVNYW5nZXIoKSB7Ci0gICAgICAgIHJldHVybiBzdG9yZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGluaXRTdG9yYWdlTWFuYWdlcihNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSBpbi1tZW1vcnkgbWFuYWdlbWVudAotICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlDbGFzc05hbWUgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuUkVQT1NJVE9SWV9DTEFTUyk7Ci0gICAgICAgIGlmIChudWxsID09IHJlcG9zaXRvcnlDbGFzc05hbWUpIHsKLSAgICAgICAgICAgIHJlcG9zaXRvcnlDbGFzc05hbWUgPSBTdG9yZU1hbmFnZXJJbXBsLmNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsID09IHN0b3JlTWFuYWdlcikgewotICAgICAgICAgICAgc3RvcmVNYW5hZ2VyID0gU3RvcmVNYW5hZ2VyRmFjdG9yeS5jcmVhdGVJbnN0YW5jZShyZXBvc2l0b3J5Q2xhc3NOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuUkVQT1NJVE9SWV9JRCk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGFsbEF2YWlsYWJsZVJlcG9zaXRvcmllcyA9IHN0b3JlTWFuYWdlci5nZXRBbGxSZXBvc2l0b3J5SWRzKCk7Ci0KLSAgICAgICAgLy8gaW5pdCBleGlzdGluZyByZXBvc2l0b3JpZXMKLSAgICAgICAgZm9yIChTdHJpbmcgZXhpc3RpbmdSZXBJZCA6IGFsbEF2YWlsYWJsZVJlcG9zaXRvcmllcykgewotICAgICAgICAgICAgc3RvcmVNYW5hZ2VyLmluaXRSZXBvc2l0b3J5KGV4aXN0aW5nUmVwSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHJlcG9zaXRvcnkgaWYgY29uZmlndXJlZCBhcyBhIHN0YXJ0dXAgcGFyYW1ldGVyCi0gICAgICAgIGlmIChudWxsICE9IHJlcG9zaXRvcnlJZCkgewotICAgICAgICAgICAgaWYgKGFsbEF2YWlsYWJsZVJlcG9zaXRvcmllcy5jb250YWlucyhyZXBvc2l0b3J5SWQpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oIlJlcG9zdG9yeSAiICsgcmVwb3NpdG9yeUlkICsgIiBhbHJlYWR5IGV4aXN0cyBhbmQgd2lsbCBub3QgYmUgY3JlYXRlZC4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVDcmVhdG9yQ2xhc3NOYW1lID0gcGFyYW1ldGVycy5nZXQoQ29uZmlnQ29uc3RhbnRzLlRZUEVfQ1JFQVRPUl9DTEFTUyk7Ci0gICAgICAgICAgICAgICAgc3RvcmVNYW5hZ2VyLmNyZWF0ZUFuZEluaXRSZXBvc2l0b3J5KHJlcG9zaXRvcnlJZCwgdHlwZUNyZWF0b3JDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGNyZWF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgYSB0eXBlIGRlZmluaXRpb25zIFhNTCBmaWxlIGlzIGNvbmZpZ3VyZWQuIGlmIHllcyBpbXBvcnQKLSAgICAgICAgLy8gdHlwZSBkZWZpbml0aW9ucwotICAgICAgICBTdHJpbmcgdHlwZURlZnNGaWxlTmFtZSA9IHBhcmFtZXRlcnMuZ2V0KENvbmZpZ0NvbnN0YW50cy5UWVBFX1hNTCk7Ci0gICAgICAgIGlmIChudWxsID09IHR5cGVEZWZzRmlsZU5hbWUpIHsKLSAgICAgICAgICAgIExPRy5pbmZvKCJObyBmaWxlIG5hbWUgZm9yIHR5cGUgZGVmaW5pdGlvbnMgZ2l2ZW4sIG5vIHR5cGVzIHdpbGwgYmUgY3JlYXRlZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyID0gc3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgICAgICBUeXBlTWFuYWdlciB0bWMgPSB0eXBlTWFuYWdlcjsKLSAgICAgICAgICAgIGltcG9ydFR5cGVzRnJvbUZpbGUodG1jLCB0eXBlRGVmc0ZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW1wb3J0VHlwZXNGcm9tRmlsZShUeXBlTWFuYWdlciB0bWMsIFN0cmluZyB0eXBlRGVmc0ZpbGVOYW1lKSB7Ci0KLSAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gbnVsbDsKLSAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodHlwZURlZnNGaWxlTmFtZSk7Ci0gICAgICAgIElucHV0U3RyZWFtIHR5cGVzU3RyZWFtID0gbnVsbDsKLQotICAgICAgICBpZiAoIWYuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHR5cGVzU3RyZWFtID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi8iICsgdHlwZURlZnNGaWxlTmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZi5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdHlwZXNTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkNvdWxkIG5vdCBsb2FkIHR5cGUgZGVmaW5pdGlvbnMgZnJvbSBmaWxlICciICsgdHlwZURlZnNGaWxlTmFtZSArICInOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZXNTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgTE9HLndhcm4oIlJlc291cmNlIGZpbGUgd2l0aCB0eXBlIGRlZmluaXRpb25zICIgKyB0eXBlRGVmc0ZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBjb3VsZCBub3QgYmUgZm91bmQsIG5vIHR5cGVzIHdpbGwgYmUgY3JlYXRlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh0eXBlc1N0cmVhbSk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gWE1MVXRpbHMuY3JlYXRlUGFyc2VyKHN0cmVhbSk7Ci0gICAgICAgICAgICBYTUxVdGlscy5maW5kTmV4dFN0YXJ0RWxlbWVuZXQocGFyc2VyKTsKLQotICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBuZXN0ZWQgdGFncyBpbiB0b3AgZWxlbWVudAotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSBwYXJzZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoInR5cGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZURlZiA9IFhNTENvbnZlcnRlci5jb252ZXJ0VHlwZURlZmluaXRpb24ocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgdHlwZSBpbiBmaWxlOiAiICsgdHlwZURlZi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQWJzdHJhY3RUeXBlRGVmaW5pdGlvbikgdHlwZURlZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcm9wZXJ0eURlZmluaXRpb25zKG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtYy5hZGRUeXBlRGVmaW5pdGlvbih0eXBlRGVmLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5uZXh0KHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyc2VyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkNvdWxkIG5vdCBsb2FkIHR5cGUgZGVmaW5pdGlvbnMgZnJvbSBmaWxlICciICsgdHlwZURlZnNGaWxlTmFtZSArICInOiAiICsgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHJlYWRQcm9wZXJ0aWVzVG9TZXRGcm9tQ29uZmlnKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgU3RyaW5nIGtleVByZWZpeCkgewotICAgICAgICBMaXN0PFN0cmluZz4gcHJvcHNUb1NldCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKGludCBpID0gMDs7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5S2V5ID0ga2V5UHJlZml4ICsgSW50ZWdlci50b1N0cmluZyhpKTsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eVRvQWRkID0gcGFyYW1ldGVycy5nZXQocHJvcGVydHlLZXkpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gcHJvcGVydHlUb0FkZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9wc1RvU2V0LmFkZChwcm9wZXJ0eVRvQWRkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvcHNUb1NldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbFJlcG9zaXRvcnlJZkNvbmZpZ3VyZWQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0KLSAgICAgICAgY2xhc3MgRHVtbXlDYWxsQ29udGV4dCBpbXBsZW1lbnRzIENhbGxDb250ZXh0IHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcga2V5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0SW5mb1JlcXVpcmVkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeUlkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE9mZnNldCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBGaWxlIGdldFRlbXBEaXJlY3RvcnkoKSB7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGVtcERpcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmNyeXB0VGVtcEZpbGVzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbmNyeXB0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5VGhyZXNob2xkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1vcnlUaHJlc2hvbGQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0TWF4Q29udGVudFNpemUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1heENvbnRlbnRTaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IHBhcmFtZXRlcnMuZ2V0KENvbmZpZ0NvbnN0YW50cy5SRVBPU0lUT1JZX0lEKTsKLSAgICAgICAgU3RyaW5nIGRvRmlsbFJlcG9zaXRvcnlTdHIgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuVVNFX1JFUE9TSVRPUllfRklMRVIpOwotICAgICAgICBTdHJpbmcgY29udGVudEtpbmRTdHIgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuQ09OVEVOVF9LSU5EKTsKLSAgICAgICAgYm9vbGVhbiBkb0ZpbGxSZXBvc2l0b3J5ID0gZG9GaWxsUmVwb3NpdG9yeVN0ciA9PSBudWxsID8gZmFsc2UgOiBCb29sZWFuLnBhcnNlQm9vbGVhbihkb0ZpbGxSZXBvc2l0b3J5U3RyKTsKLQotICAgICAgICBpZiAoZG9GaWxsUmVwb3NpdG9yeSkgewotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYW4gaW5pdGlhbCB0ZW1wb3Jhcnkgc2VydmljZSBpbnN0YW5jZSB0byBmaWxsIHRoZQotICAgICAgICAgICAgLy8gcmVwb3NpdG9yeQotCi0gICAgICAgICAgICBJbk1lbW9yeVNlcnZpY2Ugc3ZjID0gbmV3IEluTWVtb3J5U2VydmljZShzdG9yZU1hbmFnZXIpOwotCi0gICAgICAgICAgICBCaW5kaW5nc09iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSA9IG5ldyBCaW5kaW5nc09iamVjdEZhY3RvcnlJbXBsKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBsZXZlbHNTdHIgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuRklMTEVSX0RFUFRIKTsKLSAgICAgICAgICAgIGludCBsZXZlbHMgPSAxOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gbGV2ZWxzU3RyKSB7Ci0gICAgICAgICAgICAgICAgbGV2ZWxzID0gSW50ZWdlci5wYXJzZUludChsZXZlbHNTdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZG9jc1BlckxldmVsU3RyID0gcGFyYW1ldGVycy5nZXQoQ29uZmlnQ29uc3RhbnRzLkZJTExFUl9ET0NTX1BFUl9GT0xERVIpOwotICAgICAgICAgICAgaW50IGRvY3NQZXJMZXZlbCA9IDE7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBkb2NzUGVyTGV2ZWxTdHIpIHsKLSAgICAgICAgICAgICAgICBkb2NzUGVyTGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KGRvY3NQZXJMZXZlbFN0cik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjaGlsZHJlblBlckxldmVsU3RyID0gcGFyYW1ldGVycy5nZXQoQ29uZmlnQ29uc3RhbnRzLkZJTExFUl9GT0xERVJTX1BFUl9GT0xERVIpOwotICAgICAgICAgICAgaW50IGNoaWxkcmVuUGVyTGV2ZWwgPSAyOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gY2hpbGRyZW5QZXJMZXZlbFN0cikgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuUGVyTGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KGNoaWxkcmVuUGVyTGV2ZWxTdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZG9jdW1lbnRUeXBlSWQgPSBwYXJhbWV0ZXJzLmdldChDb25maWdDb25zdGFudHMuRklMTEVSX0RPQ1VNRU5UX1RZUEVfSUQpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gZG9jdW1lbnRUeXBlSWQpIHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGVJZCA9IEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVyVHlwZUlkID0gcGFyYW1ldGVycy5nZXQoQ29uZmlnQ29uc3RhbnRzLkZJTExFUl9GT0xERVJfVFlQRV9JRCk7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBmb2xkZXJUeXBlSWQpIHsKLSAgICAgICAgICAgICAgICBmb2xkZXJUeXBlSWQgPSBCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjb250ZW50U2l6ZUtCID0gMDsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50U2l6ZUtCU3RyID0gcGFyYW1ldGVycy5nZXQoQ29uZmlnQ29uc3RhbnRzLkZJTExFUl9DT05URU5UX1NJWkUpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gY29udGVudFNpemVLQlN0cikgewotICAgICAgICAgICAgICAgIGNvbnRlbnRTaXplS0IgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbnRlbnRTaXplS0JTdHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3RHZW5lcmF0b3IuQ29udGVudEtpbmQgY29udGVudEtpbmQ7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBjb250ZW50S2luZFN0cikgewotICAgICAgICAgICAgICAgIGNvbnRlbnRLaW5kID0gT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kLkxPUkVNX0lQU1VNX1RFWFQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjb250ZW50S2luZFN0ci5lcXVhbHMoInN0YXRpYy90ZXh0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudEtpbmQgPSBPYmplY3RHZW5lcmF0b3IuQ29udGVudEtpbmQuU1RBVElDX1RFWFQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50S2luZFN0ci5lcXVhbHMoImxvcmVtL3RleHQiKSkgewotICAgICAgICAgICAgICAgICAgICBjb250ZW50S2luZCA9IE9iamVjdEdlbmVyYXRvci5Db250ZW50S2luZC5MT1JFTV9JUFNVTV9URVhUOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudEtpbmRTdHIuZXF1YWxzKCJsb3JlbS9odG1sIikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudEtpbmQgPSBPYmplY3RHZW5lcmF0b3IuQ29udGVudEtpbmQuTE9SRU1fSVBTVU1fSFRNTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnRLaW5kU3RyLmVxdWFscygiZnJhY3RhbC9qcGVnIikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudEtpbmQgPSBPYmplY3RHZW5lcmF0b3IuQ29udGVudEtpbmQuSU1BR0VfRlJBQ1RBTF9KUEVHOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRLaW5kID0gT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kLlNUQVRJQ19URVhUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGhpZXJhcmNoeSBvZiBmb2xkZXJzIGFuZCBmaWxsIGl0IHdpdGggc29tZSBkb2N1bWVudHMKLSAgICAgICAgICAgIE9iamVjdEdlbmVyYXRvciBnZW4gPSBuZXcgT2JqZWN0R2VuZXJhdG9yKG9iamVjdEZhY3RvcnksIHN2Yywgc3ZjLCBzdmMsIHJlcG9zaXRvcnlJZCwgY29udGVudEtpbmQpOwotCi0gICAgICAgICAgICBnZW4uc2V0TnVtYmVyT2ZEb2N1bWVudHNUb0NyZWF0ZVBlckZvbGRlcihkb2NzUGVyTGV2ZWwpOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIHR5cGUgaWQgZm9yIGFsbCBjcmVhdGVkIGRvY3VtZW50czoKLSAgICAgICAgICAgIGdlbi5zZXREb2N1bWVudFR5cGVJZChkb2N1bWVudFR5cGVJZCk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgdHlwZSBpZCBmb3IgYWxsIGNyZWF0ZWQgZm9sZGVyczoKLSAgICAgICAgICAgIGdlbi5zZXRGb2xkZXJUeXBlSWQoZm9sZGVyVHlwZUlkKTsKLQotICAgICAgICAgICAgLy8gU2V0IGNvbnRlbnRTaXplCi0gICAgICAgICAgICBnZW4uc2V0Q29udGVudFNpemVJbktCKGNvbnRlbnRTaXplS0IpOwotCi0gICAgICAgICAgICAvLyBzZXQgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgZmlsbGVkCi0gICAgICAgICAgICAvLyBzZXQgdGhlIHByb3BlcnRpZXMgdGhlIGdlbmVyYXRvciBzaG91bGQgZmlsbCB3aXRoIHZhbHVlcyBmb3IKLSAgICAgICAgICAgIC8vIGRvY3VtZW50czoKLSAgICAgICAgICAgIC8vIE5vdGU6IG11c3QgYmUgdmFsaWQgcHJvcGVydGllcyBpbiBjb25maWd1cmVkIGRvY3VtZW50IGFuZCBmb2xkZXIKLSAgICAgICAgICAgIC8vIHR5cGUKLQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BzVG9TZXQgPSByZWFkUHJvcGVydGllc1RvU2V0RnJvbUNvbmZpZyhwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICBDb25maWdDb25zdGFudHMuRklMTEVSX0RPQ1VNRU5UX1BST1BFUlRZKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHByb3BzVG9TZXQpIHsKLSAgICAgICAgICAgICAgICBnZW4uc2V0RG9jdW1lbnRQcm9wZXJ0aWVzVG9HZW5lcmF0ZShwcm9wc1RvU2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvcHNUb1NldCA9IHJlYWRQcm9wZXJ0aWVzVG9TZXRGcm9tQ29uZmlnKHBhcmFtZXRlcnMsIENvbmZpZ0NvbnN0YW50cy5GSUxMRVJfRk9MREVSX1BST1BFUlRZKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHByb3BzVG9TZXQpIHsKLSAgICAgICAgICAgICAgICBnZW4uc2V0Rm9sZGVyUHJvcGVydGllc1RvR2VuZXJhdGUocHJvcHNUb1NldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNpbXVsYXRlIGEgcnVudGltZSBjb250ZXh0IHdpdGggY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAvLyBBdHRhY2ggdGhlIENhbGxDb250ZXh0IHRvIGEgdGhyZWFkIGxvY2FsIGNvbnRleHQgdGhhdCBjYW4gYmUKLSAgICAgICAgICAgIC8vIGFjY2Vzc2VkIGZyb20gZXZlcnl3aGVyZQotICAgICAgICAgICAgRHVtbXlDYWxsQ29udGV4dCBjdHggPSBuZXcgRHVtbXlDYWxsQ29udGV4dCgpOwotICAgICAgICAgICAgLy8gY3JlYXRlIHRocmVhZCBsb2NhbCBzdG9yYWdlIGFuZCBhdHRhY2ggY2FsbCBjb250ZXh0Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlKGN0eCk7Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSB0cmVlCi0gICAgICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXAgPSBzdmMuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkLCBudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyByb290Rm9sZGVySWQgPSByZXAuZ2V0Um9vdEZvbGRlcklkKCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2VuLmNyZWF0ZUZvbGRlckhpZXJhY2h5KGxldmVscywgY2hpbGRyZW5QZXJMZXZlbCwgcm9vdEZvbGRlcklkKTsKLSAgICAgICAgICAgICAgICAvLyBEdW1wIHRoZSB0cmVlCi0gICAgICAgICAgICAgICAgZ2VuLmR1bXBGb2xkZXIocm9vdEZvbGRlcklkLCAiKiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgZm9sZGVyIGhpZXJhcmNoeSB3aXRoIGRvY3VtZW50cy4gIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0cm95KCk7Ci0gICAgICAgIH0gLy8gaWYKLQotICAgIH0gLy8gZmlsbFJlcG9zaXRvcnlJZkNvbmZpZ3VyZWQKLQotICAgIGNsYXNzIENsZWFuTWFuYWdlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVyID0gRXhlY3V0b3JzLm5ld1NjaGVkdWxlZFRocmVhZFBvb2woMSk7Ci0gICAgICAgIHByaXZhdGUgU2NoZWR1bGVkRnV0dXJlPD8+IGNsZWFuZXJIYW5kbGUgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Q2xlYW5SZXBvc2l0b3J5Sm9iKGxvbmcgaW50ZXJ2YWxJbk1pbnV0ZXMpIHsKLQotICAgICAgICAgICAgZmluYWwgUnVubmFibGUgY2xlYW5lciA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5pbmZvKCJDbGVhbmluZyByZXBvc2l0b3J5IGFzIHBhcnQgb2YgYSBzY2hlZHVsZWQgbWFpbnRlbmFuY2Ugam9iLiIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyByZXBvc2l0b3J5SWQgOiBzdG9yZU1hbmFnZXIuZ2V0QWxsUmVwb3NpdG9yeUlkcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTdG9yZSBzdG9yZSA9IHN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxSZXBvc2l0b3J5SWZDb25maWd1cmVkKENvbmZpZ3VyYXRpb25TZXR0aW5ncy5nZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExPRy5pbmZvKCJSZXBvc2l0b3J5IGNsZWFuZWQuIEZyZWVpbmcgbWVtb3J5LiIpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBMT0cuaW5mbygiUmVwb3NpdG9yeSBDbGVhbiBKb2Igc3RhcnRpbmcgY2xlYW4gam9iLCBpbnRlcnZhbCAiICsgaW50ZXJ2YWxJbk1pbnV0ZXMgKyAiIG1pbiIpOwotICAgICAgICAgICAgY2xlYW5lckhhbmRsZSA9IHNjaGVkdWxlci5zY2hlZHVsZUF0Rml4ZWRSYXRlKGNsZWFuZXIsIGludGVydmFsSW5NaW51dGVzLCBpbnRlcnZhbEluTWludXRlcywKLSAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlOVVRFUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdG9wQ2xlYW5SZXBvc2l0b3J5Sm9iKCkgewotICAgICAgICAgICAgTE9HLmluZm8oIlJlcG9zaXRvcnkgQ2xlYW4gSm9iIGNhbmNlbGxpbmcgY2xlYW4gam9iLiIpOwotICAgICAgICAgICAgYm9vbGVhbiBvayA9IGNsZWFuZXJIYW5kbGUuY2FuY2VsKHRydWUpOwotICAgICAgICAgICAgTE9HLmluZm8oIlJlcG9zaXRvcnkgQ2xlYW4gSm9iIGNhbmNlbGxlZCB3aXRoIHJlc3VsdDogIiArIG9rKTsKLSAgICAgICAgICAgIHNjaGVkdWxlci5zaHV0ZG93bk5vdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlQ2xlYW5SZXBvc2l0b3J5Sm9iKGxvbmcgbWludXRlcykgewotICAgICAgICBjbGVhbk1hbmFnZXIgPSBuZXcgQ2xlYW5NYW5hZ2VyKCk7Ci0gICAgICAgIGNsZWFuTWFuYWdlci5zdGFydENsZWFuUmVwb3NpdG9yeUpvYihtaW51dGVzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3NlcnZlci9Jbk1lbW9yeVZlcnNpb25pbmdTZXJ2aWNlSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5VmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTI4NDQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc2VydmVyL0luTWVtb3J5VmVyc2lvbmluZ1NlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLnNlcnZlci5PYmplY3RJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRmlsdGVyUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5Lk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Db250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Eb2N1bWVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5PYmplY3RTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlZE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlZlcnNpb25lZERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlByb3BlcnR5Q3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeVZlcnNpb25pbmdTZXJ2aWNlSW1wbCBleHRlbmRzIEluTWVtb3J5QWJzdHJhY3RTZXJ2aWNlSW1wbCB7Ci0KLSAgICBwcml2YXRlIEluTWVtb3J5T2JqZWN0U2VydmljZUltcGwgZk9iamVjdFNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBBdG9tTGlua0luZm9Qcm92aWRlciBmQXRvbUxpbmtQcm92aWRlcjsKLQotICAgIHB1YmxpYyBJbk1lbW9yeVZlcnNpb25pbmdTZXJ2aWNlSW1wbChTdG9yZU1hbmFnZXIgc3RvcmVNYW5hZ2VyLCBJbk1lbW9yeU9iamVjdFNlcnZpY2VJbXBsIG9iamVjdFNlcnZpY2UpIHsKLSAgICAgICAgc3VwZXIoc3RvcmVNYW5hZ2VyKTsKLSAgICAgICAgZk9iamVjdFNlcnZpY2UgPSBvYmplY3RTZXJ2aWNlOwotICAgICAgICBmQXRvbUxpbmtQcm92aWRlciA9IG5ldyBBdG9tTGlua0luZm9Qcm92aWRlcihmU3RvcmVNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5jYW5jZWxDaGVja091dChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgU3RyaW5nIHVzZXIgPSBjb250ZXh0LmdldFVzZXJuYW1lKCk7Ci0gICAgICAgIFZlcnNpb25lZERvY3VtZW50IHZlckRvYyA9IHRlc3RIYXNQcm9wZXJDaGVja2VkT3V0U3RhdHVzKHNvLCB1c2VyKTsKLSAgICAgICAgRG9jdW1lbnRWZXJzaW9uIHB3YyA9IHZlckRvYy5nZXRQd2MoKTsKLSAgICAgICAgdmVyRG9jLmNhbmNlbENoZWNrT3V0KHVzZXIpOwotICAgICAgICBvYmpTdG9yZS5kZWxldGVWZXJzaW9uKHB3Yyk7Ci0KLSAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgbGFzdCB2ZXJzaW9uIGRlbGV0ZSB0aGUgZG9jdW1lbnQgaXRzZWxmCi0gICAgICAgIGlmICh2ZXJEb2MuZ2V0QWxsVmVyc2lvbnMoKS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpLmRlbGV0ZU9iamVjdCh2ZXJEb2MuZ2V0SWQoKSwgdHJ1ZSwgdXNlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yUGFyYW0sCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbVBhcmFtLCBTdHJpbmcgY2hlY2tpbkNvbW1lbnQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIEFjbCBhY2xBZGQgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksCi0gICAgICAgICAgICAgICAgYWRkQWNlcyk7Ci0gICAgICAgIEFjbCBhY2xSZW1vdmUgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlVmFsaWRhdG9yLmV4cGFuZEFjbE1ha3Jvcyhjb250ZXh0LmdldFVzZXJuYW1lKCksCi0gICAgICAgICAgICAgICAgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmNoZWNrSW4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWNsQWRkLCBhY2xSZW1vdmUsIHBvbGljaWVzLCBleHRlbnNpb24pOwotCi0gICAgICAgIFN0cmluZyB1c2VyID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgICAgICBWZXJzaW9uZWREb2N1bWVudCB2ZXJEb2MgPSB0ZXN0SGFzUHJvcGVyQ2hlY2tlZE91dFN0YXR1cyhzbywgdXNlcik7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGNvbnRlbnRTdHJlYW0gaXMgYSB1c2FibGUgb2JqZWN0IG9yIGlnbm9yZSBpdCBvdGhlcndpc2UKLSAgICAgICAgLy8gTm90ZSBCcm93c2VyIGJpbmRpbmcgc2V0cyBhbiBlbXB0eSBvYmplY3QKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqU3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGNvbnRlbnRTdHJlYW1QYXJhbTsKLSAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvYmpTdG9yZS5zZXRDb250ZW50KHNvLCBjb250ZW50U3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gbWFqb3IgPSAobnVsbCA9PSBtYWpvclBhcmFtID8gdHJ1ZSA6IG1ham9yUGFyYW0pOwotCi0gICAgICAgIHZlckRvYy5jaGVja0luKG1ham9yLCBwcm9wZXJ0aWVzLCAoKENvbnRlbnQpc28pLmdldENvbnRlbnQoKSwgY2hlY2tpbkNvbW1lbnQsIHBvbGljaWVzLCB1c2VyKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcHJvcGVydGllcyAmJiBudWxsICE9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICAvLyByZW5hbWU6Ci0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgICAgICBpZiAocGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdOYW1lID0gKFN0cmluZykgcGQuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09IG51bGwgfHwgbmV3TmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigidXBkYXRlUHJvcGVydGllcyBmYWlsZWQsIG5hbWUgbXVzdCBub3QgYmUgZW1wdHkuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkTmFtZShuZXdOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihOYW1lVmFsaWRhdG9yLkVSUk9SX0lMTEVHQUxfTkFNRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSB0ZXN0IGZvciBkdXBsaWNhdGVkIG5hbWUgaW4gZm9sZGVyIGlzIGxlZnQgdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gb2JqZWN0IHN0b3JlCi0gICAgICAgICAgICAgICAgb2JqU3RvcmUucmVuYW1lKHNvLCAoU3RyaW5nKSBwZC5nZXRGaXJzdFZhbHVlKCksIHVzZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNvLnVwZGF0ZVN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbk1vZGlmaWVkKG51bGwsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSk7Ci0gICAgICAgIC8vIFRvIGJlIGFibGUgdG8gcHJvdmlkZSBhbGwgQXRvbSBsaW5rcyBpbiB0aGUgcmVzcG9uc2Ugd2UgbmVlZAotICAgICAgICAvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOgotICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBzbywgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXQoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHZhbGlkYXRvci5jaGVja091dChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24sIGNvbnRlbnRDb3BpZWQpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBnZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHNvKTsKLSAgICAgICAgaWYgKCF0eXBlRGVmLmdldEJhc2VUeXBlSWQoKS5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk9ubHkgZG9jdW1lbnRzIGNhbiBiZSBjaGVja2VkLW91dC4iKTsKLSAgICAgICAgfSBlbHNlIGlmICghKChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmKS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJPYmplY3QgY2FuJ3QgYmUgY2hlY2tlZC1vdXQsIHR5cGUgaXMgbm90IHZlcnNpb25hYmxlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hlY2tJc1ZlcnNpb25hYmxlT2JqZWN0KHNvKTsKLQotICAgICAgICBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSA9IGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgVmVyc2lvbmVkRG9jdW1lbnQgdmVyRG9jID0gZ2V0VmVyc2lvbmVkRG9jdW1lbnRPZk9iamVjdElkKHNvKTsKLQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQgPSBudWxsOwotCi0gICAgICAgIE9iamVjdFN0b3JlIG9ialN0b3JlID0gZlN0b3JlTWFuYWdlci5nZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpOwotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24pIHsKLSAgICAgICAgICAgIGNvbnRlbnQgPSBvYmpTdG9yZS5nZXRDb250ZW50KHNvLCAwLCAtMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEb2N1bWVudFZlcnNpb24gbGF0ZXN0VmVyID0gKChWZXJzaW9uZWREb2N1bWVudCkgc28pLmdldExhdGVzdFZlcnNpb24oZmFsc2UpOwotICAgICAgICAgICAgY29udGVudCA9IG9ialN0b3JlLmdldENvbnRlbnQobGF0ZXN0VmVyLCAwLCAtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmVyRG9jLmlzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKCJEb2N1bWVudCAiICsgb2JqZWN0SWQuZ2V0VmFsdWUoKSArICIgaXMgYWxyZWFkeSBjaGVja2VkIG91dC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB1c2VyID0gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgICAgICBjaGVja0hhc1VzZXIodXNlcik7Ci0KLSAgICAgICAgRG9jdW1lbnRWZXJzaW9uIHB3YyA9IHZlckRvYy5jaGVja091dCh1c2VyKTsKLSAgICAgICAgb2JqZWN0U3RvcmUuc2V0Q29udGVudChwd2MsIGNvbnRlbnQpOwotICAgICAgICBvYmplY3RTdG9yZS5zdG9yZVZlcnNpb24ocHdjKTsKLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUocHdjLmdldElkKCkpOyAvLyByZXR1cm4gdGhlIGlkIG9mIHRoZSBjcmVhdGVkIHB3YwotICAgICAgICBpZiAobnVsbCAhPSBjb250ZW50Q29waWVkKSB7Ci0gICAgICAgICAgICBjb250ZW50Q29waWVkLnNldFZhbHVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVG8gYmUgYWJsZSB0byBwcm92aWRlIGFsbCBBdG9tIGxpbmtzIGluIHRoZSByZXNwb25zZSB3ZSBuZWVkCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246Ci0gICAgICAgIGlmIChjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8gPSBuZXcgT2JqZWN0SW5mb0ltcGwoKTsKLSAgICAgICAgICAgIGZBdG9tTGlua1Byb3ZpZGVyLmZpbGxJbmZvcm1hdGlvbkZvckF0b21MaW5rcyhyZXBvc2l0b3J5SWQsIHB3Yywgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QWxsVmVyc2lvbnMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLAotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MpIHsKLQotICAgICAgICAvLyBOb3RlIHRoYXQgaW4gQXRvbVB1YiBvYmplY3QgaWQgaXMgbnVsbCBhbmQgdmVyc2lvblNlcmllc0lkIGlzIHNldCBhbmQKLSAgICAgICAgLy8gaW4gU09BUCBiaW5kaW5mIHZlcnNpb25TZXJpZXNJZCBpcyBzZXQKLSAgICAgICAgLy8gYW5kIG9iamVjdElkIGlzIG51bGwKLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvOwotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHJlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4oKTsKLSAgICAgICAgU3RyaW5nIGlkID0gdmVyc2lvblNlcmllc0lkOwotICAgICAgICBpZiAobnVsbCA9PSB2ZXJzaW9uU2VyaWVzSWQpIHsKLSAgICAgICAgICAgIGlmIChudWxsID09IG9iamVjdElkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oImdldEFsbFZlcnNpb25zIHJlcXVpcmVzIGEgdmVyc2lvbiBzZXJpZXMgaWQsIGJ1dCBpdCB3YXMgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlkID0gb2JqZWN0SWQ7Ci0gICAgICAgIH0KLSAgICAgICAgc28gPSB2YWxpZGF0b3IuZ2V0QWxsVmVyc2lvbnMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgaWQsIGV4dGVuc2lvbik7Ci0KLSAgICAgICAgaWYgKCEoc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCkpIHsKLSAgICAgICAgICAgIGlmICghKHNvIGluc3RhbmNlb2YgRG9jdW1lbnRWZXJzaW9uKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJnZXRBbGxWZXJzaW9ucyByZXF1aXJlcyBhbiBpZCBvZiBhIHZlcnNpb25lZCBkb2N1bWVudC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNvID0gKChEb2N1bWVudFZlcnNpb24pIHNvKS5nZXRQYXJlbnREb2N1bWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmVyc2lvbmVkRG9jdW1lbnQgdmVyRG9jID0gKFZlcnNpb25lZERvY3VtZW50KSBzbzsKLSAgICAgICAgTGlzdDxEb2N1bWVudFZlcnNpb24+IHZlcnNpb25zID0gdmVyRG9jLmdldEFsbFZlcnNpb25zKCk7Ci0gICAgICAgIGZvciAoRG9jdW1lbnRWZXJzaW9uIHZlcnNpb24gOiB2ZXJzaW9ucykgewotICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmpEYXRhID0gZ2V0T2JqZWN0KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgdmVyc2lvbi5nZXRJZCgpLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBmYWxzZSwgZXh0ZW5zaW9uLCBvYmplY3RJbmZvcyk7Ci0gICAgICAgICAgICByZXMuYWRkKG9iakRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmV2ZXJzZSBsaXN0IG9mIHZlcnNpb25zIGJlY2F1c2Ugc3BlYyBleHBlY3RzIGxhdGVzdCB2ZXJzaW9uIGZpcnN0Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0RGF0YT4ocmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSB2ZXIgOiByZXMpIHsKLSAgICAgICAgICAgIHRlbXAuYWRkKDAsIHZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gdGVtcDsKLQotICAgICAgICAvLyBwcm92aWRlIGluZm9ybWF0aW9uIGZvciBBdG9tIGxpbmtzIGZvciB2ZXJzaW9uIHNlcmllczoKLSAgICAgICAgaWYgKGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotICAgICAgICAgICAgZkF0b21MaW5rUHJvdmlkZXIuZmlsbEluZm9ybWF0aW9uRm9yQXRvbUxpbmtzKHJlcG9zaXRvcnlJZCwgc28sIG9iamVjdEluZm8pOwotICAgICAgICAgICAgb2JqZWN0SW5mb3MuYWRkT2JqZWN0SW5mbyhvYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwKLSAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zKSB7Ci0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gdmFsaWRhdG9yLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLQotICAgICAgICBPYmplY3REYXRhIG9iakRhdGEgPSBudWxsOwotCi0gICAgICAgIC8vIEluIEF0b21QdThiIHlvdSBkbyBub3QgZ2V0IHRoZSB2ZXJzaW9uIHNlcmllcyBpZCwgb25seSB0aGUgb2JqZWN0IGlkCi0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIERvY3VtZW50VmVyc2lvbikgewotICAgICAgICAgICAgc28gPSAoKERvY3VtZW50VmVyc2lvbikgc28pLmdldFBhcmVudERvY3VtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCkgewotICAgICAgICAgICAgVmVyc2lvbmVkRG9jdW1lbnQgdmVyRG9jID0gKFZlcnNpb25lZERvY3VtZW50KSBzbzsKLSAgICAgICAgICAgIERvY3VtZW50VmVyc2lvbiBsYXRlc3RWZXJzaW9uID0gdmVyRG9jLmdldExhdGVzdFZlcnNpb24obWFqb3IpOwotICAgICAgICAgICAgb2JqRGF0YSA9IGdldE9iamVjdChjb250ZXh0LCByZXBvc2l0b3J5SWQsIGxhdGVzdFZlcnNpb24uZ2V0SWQoKSwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIGluY2x1ZGVQb2xpY3lJZHMsIGV4dGVuc2lvbiwgb2JqZWN0SW5mb3MpOwotICAgICAgICB9IGVsc2UgaWYgKHNvIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIG9iakRhdGEgPSBnZXRPYmplY3QoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBzby5nZXRJZCgpLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgaW5jbHVkZVBvbGljeUlkcywgZXh0ZW5zaW9uLCBvYmplY3RJbmZvcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IGlzIG5vdCBpbnN0YW5jZSBvZiBhIGRvY3VtZW50ICh2ZXJzaW9uIHNlcmllcykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByb3ZpZGUgaW5mb3JtYXRpb24gZm9yIEF0b20gbGlua3MgZm9yIHZlcnNpb24gc2VyaWVzOgotICAgICAgICBpZiAoY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvID0gbmV3IE9iamVjdEluZm9JbXBsKCk7Ci0gICAgICAgICAgICBmQXRvbUxpbmtQcm92aWRlci5maWxsSW5mb3JtYXRpb25Gb3JBdG9tTGlua3MocmVwb3NpdG9yeUlkLCBzbywgb2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICBvYmplY3RJbmZvcy5hZGRPYmplY3RJbmZvKG9iamVjdEluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iakRhdGE7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsCi0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSB2YWxpZGF0b3IuZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICAgICAgT2JqZWN0U3RvcmUgb2JqZWN0U3RvcmUgPSBmU3RvcmVNYW5hZ2VyLmdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBsYXRlc3RWZXJzaW9uT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICAvLyBJbiBBdG9tUHU4YiB5b3UgZG8gbm90IGdldCB0aGUgdmVyc2lvbiBzZXJpZXMgaWQsIG9ubHkgdGhlIG9iamVjdCBpZAotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24pIHsKLSAgICAgICAgICAgIHNvID0gKChEb2N1bWVudFZlcnNpb24pIHNvKS5nZXRQYXJlbnREb2N1bWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgVmVyc2lvbmVkRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIFZlcnNpb25lZERvY3VtZW50IHZlckRvYyA9IChWZXJzaW9uZWREb2N1bWVudCkgc287Ci0gICAgICAgICAgICBsYXRlc3RWZXJzaW9uT2JqZWN0ID0gdmVyRG9jLmdldExhdGVzdFZlcnNpb24obWFqb3IpOwotICAgICAgICB9IGVsc2UgaWYgKHNvIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIGxhdGVzdFZlcnNpb25PYmplY3QgPSBzbzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgaXMgbm90IGluc3RhbmNlIG9mIGEgZG9jdW1lbnQgKHZlcnNpb24gc2VyaWVzKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3RlZElkcyA9IEZpbHRlclBhcnNlci5nZXRSZXF1ZXN0ZWRJZHNGcm9tRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBmU3RvcmVNYW5hZ2VyLmdldFR5cGVNYW5hZ2VyKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuZ2V0UHJvcGVydGllc0Zyb21PYmplY3QobGF0ZXN0VmVyc2lvbk9iamVjdCwgb2JqZWN0U3RvcmUsIHRtLAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZElkcywgdHJ1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0RGF0YSBnZXRPYmplY3QoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIEJvb2xlYW4gaW5jbHVkZVBvbGljaWVzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcykgewotCi0gICAgICAgIHJldHVybiBmT2JqZWN0U2VydmljZS5nZXRPYmplY3QoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgbnVsbCwgaW5jbHVkZVBvbGljaWVzLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgZXh0ZW5zaW9uLCBvYmplY3RJbmZvcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9DaGlsZHJlbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9DaGlsZHJlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWIxNDJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvQ2hpbGRyZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgZm9sZGVyIGlzIGEgU3RvcmVkT2JqZWN0IHRoYXQgdGhhdCBoYXMgYSBwYXRoIGFuZCBjaGlsZHJlbi4gQ2hpbGRyZW4gY2FuIGJlCi0gKiBmb2xkZXIgb3IgZG9jdW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hpbGRyZW4gewotCi0gICAgLyoqCi0gICAgICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgcmVzdWx0IG9mIGdldCBjaGlsZHJlbiBjYWxscwotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGNsYXNzIENoaWxkcmVuUmVzdWx0IHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbm9JdGVtczsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PD8gZXh0ZW5kcyBTdG9yZWRPYmplY3Q+IGNoaWxkcmVuOwotCi0gICAgICAgIHByaXZhdGUgQ2hpbGRyZW5SZXN1bHQoTGlzdDw/IGV4dGVuZHMgU3RvcmVkT2JqZWN0PiBjaGlsZHJlbiwgaW50IG5vSXRlbXMpIHsKLSAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLSAgICAgICAgICAgIHRoaXMubm9JdGVtcyA9IG5vSXRlbXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIHJlc3VsdC4KLSAgICAgICAgICogQHJldHVybgotICAgICAgICAgKiAgbnVtYmVyIG9mIGl0ZW1zCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldE5vSXRlbXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9JdGVtczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIGNoaWxkcmVuIG9iamVjdHMuCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICogICAgICBsaXN0IG9mIGNoaWxkcmVuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgU3RvcmVkT2JqZWN0PiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZm9sZGVyLiBUbyBzdXBwb3J0IHBhZ2luZyBhbiBpbml0aWFsIG9mZnNldAotICAgICAqIGFuZCBhIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIHRvIHJldHJpZXZlIGNhbiBiZSBwYXNzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1heEl0ZW1zCi0gICAgICogICAgICAgICAgICBtYXguIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogICAgICAgICAgICBpbml0aWFsIG9mZnNldCB3aGVyZSB0byBzdGFydCBmZXRjaGluZwotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIHRvIGRldGVybWluZSB2aXNpYmxlIGNoaWxkcmVuCi0gICAgICogQHBhcmFtIHVzZVB3YwotICAgICAqICAgICAgICAgICAgaWYgdHJ1ZSByZXR1cm4gcHJpdmF0ZSB3b3JraW5nIGNvcHkgb3RoZXJ3aXNlIHJldHVybiBsYXRlc3QKLSAgICAgKiAgICAgICAgICAgIHZlcnNpb247Ci0gICAgICogCi0gICAgICogQHJldHVybiBsaXN0IG9mIGNoaWxkcmVuIG9iamVjdHMKLSAgICAgKi8KLSAgICBDaGlsZHJlblJlc3VsdCBnZXRDaGlsZHJlbihpbnQgbWF4SXRlbXMsIGludCBza2lwQ291bnQsIFN0cmluZyB1c2VyLCBib29sZWFuIHVzZVB3Yyk7Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGZvbGRlciB3aGljaCBhcmUgZm9sZGVycy4gVG8gc3VwcG9ydCBwYWdpbmcKLSAgICAgKiBhbiBpbml0aWFsIG9mZnNldCBhbmQgYSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbiB0byByZXRyaWV2ZSBjYW4gYmUKLSAgICAgKiBwYXNzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1heEl0ZW1zCi0gICAgICogICAgICAgICAgICBtYXguIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogICAgICAgICAgICBpbml0aWFsIG9mZnNldCB3aGVyZSB0byBzdGFydCBmZXRjaGluZwotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgdXNlciB0byBkZXRlcm1pbmUgdmlzaWJsZSBjaGlsZHJlbgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBjaGlsZHJlbiBmb2xkZXJzCi0gICAgICovCi0gICAgQ2hpbGRyZW5SZXN1bHQgZ2V0Rm9sZGVyQ2hpbGRyZW4oaW50IG1heEl0ZW1zLCBpbnQgc2tpcENvdW50LCBTdHJpbmcgdXNlcik7Ci0KLSAgICAvKioKLSAgICAgKiBpbmRpY2F0ZSBpZiBhIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzIGluIHRoaXMgZm9sZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBuYW1lIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lIGV4aXN0cyBpbiB0aGUgZm9sZGVyYXMgY2hpbGQsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQ2hpbGQoU3RyaW5nIG5hbWUpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9DbWlzU2VydmljZVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9DbWlzU2VydmljZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjJkZjQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvQ21pc1NlcnZpY2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIENtaXNTZXJ2aWNlVmFsaWRhdG9yIHsNCi0NCi0gICAgdm9pZCBnZXRSZXBvc2l0b3J5SW5mb3MoQ2FsbENvbnRleHQgY29udGV4dCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgdm9pZCBnZXRSZXBvc2l0b3J5SW5mbyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICB2b2lkIGdldFR5cGVDaGlsZHJlbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICB2b2lkIGdldFR5cGVEZXNjZW5kYW50cyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICB2b2lkIGdldFR5cGVEZWZpbml0aW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBnZXRDaGlsZHJlbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBnZXREZXNjZW5kYW50cyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBnZXRGb2xkZXJUcmVlKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGdldE9iamVjdFBhcmVudHMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgZ2V0Rm9sZGVyUGFyZW50KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGdldENoZWNrZWRPdXREb2NzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGNyZWF0ZURvY3VtZW50KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljeUlkcywNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBzb3VyY2VJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBjcmVhdGVGb2xkZXIoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIC8vIHJlbGF0aW9uc2hpcCBoYXMgbm8gcGFyZW50LCByZXR1cm5zIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdA0KLSAgICBTdG9yZWRPYmplY3RbXSBjcmVhdGVSZWxhdGlvbnNoaXAoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHNvdXJjZUlkLCBTdHJpbmcgdGFyZ2V0SWQsDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljeUlkcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGNyZWF0ZVBvbGljeShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcG9saWN5SWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgZ2V0QWxsb3dhYmxlQWN0aW9ucyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBnZXRPYmplY3QoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgZ2V0UHJvcGVydGllcyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBnZXRSZW5kaXRpb25zKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGdldE9iamVjdEJ5UGF0aChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGdldENvbnRlbnRTdHJlYW0oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc3RyZWFtSWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IHVwZGF0ZVByb3BlcnRpZXMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0W10gbW92ZU9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgU3RyaW5nIHRhcmdldEZvbGRlcklkLA0KLSAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGRlbGV0ZU9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGRlbGV0ZVRyZWUoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLA0KLSAgICAgICAgICAgIFVuZmlsZU9iamVjdCB1bmZpbGVPYmplY3RzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3Qgc2V0Q29udGVudFN0cmVhbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwNCi0gICAgICAgICAgICBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIC8vIENNSVMgMS4xDQotICAgIFN0b3JlZE9iamVjdCBhcHBlbmRDb250ZW50U3RyZWFtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBkZWxldGVDb250ZW50U3RyZWFtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBjaGVja091dChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uLA0KLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGNhbmNlbENoZWNrT3V0KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGNoZWNrSW4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEFjbCBhZGRBY2VzLA0KLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGdldEFsbFZlcnNpb25zKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICB2b2lkIHF1ZXJ5KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIHZvaWQgZ2V0Q29udGVudENoYW5nZXMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0W10gYWRkT2JqZWN0VG9Gb2xkZXIoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZm9sZGVySWQsDQotICAgICAgICAgICAgQm9vbGVhbiBhbGxWZXJzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0W10gcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGdldEFjbChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBhcHBseUFjbChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdFtdIGFwcGx5UG9saWN5KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdFtdIHJlbW92ZVBvbGljeShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLQ0KLSAgICBTdG9yZWRPYmplY3QgZ2V0QXBwbGllZFBvbGljaWVzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgU3RvcmVkT2JqZWN0IGNyZWF0ZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotDQotICAgIFN0b3JlZE9iamVjdCBhcHBseUFjbChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpOw0KLQ0KLSAgICAvLyBDTUlTIDEuMQ0KLSAgICBTdG9yZWRPYmplY3QgY3JlYXRlSXRlbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0NCi0gICAgdm9pZCBjcmVhdGVUeXBlKENhbGxDb250ZXh0IGNhbGxDb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pOw0KLSAgICANCi0gICAgVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZShDYWxsQ29udGV4dCBjYWxsQ29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKTsNCi0gICAgDQotICAgIFR5cGVEZWZpbml0aW9uIGRlbGV0ZVR5cGUoQ2FsbENvbnRleHQgY2FsbENvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbik7DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvQ29udGVudC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9Db250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmQ4ODkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9Db250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotCi0vKioKLSAqIEludGVyZmFjZSB0byByZXByZXNlbnQgYSBjb250ZW50IHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIENNSVMgc3BlYy4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudCB7Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9iamVjdCBoYXMgY29udGVudCBvciBmYWxzZSBpZiB0aGVyZSBpcyBubyBjb250ZW50Ci0gICAgICogYXR0YWNoZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGhhcyBjb250ZW50IG90aGVyd2lzZSBmYWxzZQotICAgICAqLwotICAgIGJvb2xlYW4gaGFzQ29udGVudCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgYSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0Ci0gICAgICogICAgICAgICAgICBvZmZzZXQgaW4gY29udGVudCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogICAgICAgICAgICBsZW5ndGggb2YgY29udGVudCB0byByZXR1cm4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG9iamVjdCBjb250YWluaW5nIG1pbWUtdHlwZSwgbGVuZ3RoIGFuZCBhIHN0cmVhbSB3aXRoIGNvbnRlbnQKLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGdldENvbnRlbnQoKTsKLQotICAgIC8qKgotICAgICAqIEFzc2lnbiBjb250ZW50IHRvIGEgZG9jdW1lbnQuIEV4aXN0aW5nIGNvbnRlbnQgZ2V0cyBvdmVyd3JpdHRlbi4gVGhlCi0gICAgICogZG9jdW1lbnQgaXMgbm90IHlldCBwZXJzaXN0ZWQgaW4gdGhlIG5ldyBzdGF0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGVudAotICAgICAqICAgICAgICAgICAgY29udGVudCB0byBiZSBhc3NpZ25lZCB0byB0aGUgZG9jdW1lbnQuCi0gICAgICovCi0gICAgdm9pZCBzZXRDb250ZW50KENvbnRlbnRTdHJlYW0gY29udGVudCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL0RvY3VtZW50LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL0RvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTJlZDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGk7Ci0KLS8qKgotICogQSBkb2N1bWVudCBpcyBhIGNvbmNyZXRlIG9iamVjdCAobWVhbmluZyBpdCBjYW4gYmUgc3RvcmVkKSBhbmQgaGFzIGNvbnRlbnQuCi0gKiBJdCBhbHNvIGhhcyBhIHBhdGggKGlzIGNvbnRhaW5lZCBpbiBhIHBhcmVudCBmb2xkZXIpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnQgZXh0ZW5kcyBGaWxlYWJsZSwgQ29udGVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvRG9jdW1lbnRWZXJzaW9uLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL0RvY3VtZW50VmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQxYTY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvRG9jdW1lbnRWZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotLyoqCi0gKiBBIERvY3VtZW50VmVyc2lvbiBpcyBhIGNvbmNyZXRlIHZlcnNpb24gb2YgYSB2ZXJzaW9uZWQgZG9jdW1lbnQuIEl0IGhhcyBhbgotICogaWQsIGlzIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHN0b3JlLCBoYXMgY29udGVudCBhbmQgYWRkcyB2ZXJzaW9uaW5nCi0gKiBmdW5jdGlvbmFsaXR5LiBJdCBkb2VzIG5vdCBoYXZlIGEgcGF0aC4gSXQgaW5oZXJpdHMgYWxzbyBwcm9wZXJ0aWVzIHNvIGVhY2gKLSAqIHZlcnNpb24gbWF5IGhhdmUgaXRzIG93biBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50VmVyc2lvbiBleHRlbmRzIFZlcnNpb24sIENvbnRlbnQsIEZpbGVhYmxlIHsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9GaWxlYWJsZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9GaWxlYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTBmMzNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvRmlsZWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgY29udmVuaWVuY2UgcmVwcmVzZW50aW5nIG9iamVjdHMgdGhhdCBjYW4gYmUgZmlsZWQgdG8gYSBmb2xkZXIuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpbGVhYmxlIGV4dGVuZHMgU3RvcmVkT2JqZWN0LCBGaWxpbmcgewotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL0ZpbGluZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9GaWxpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhYjVlMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL0ZpbGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBQYXRoIGlzIHRoZSBjYXBhYmlsaXR5IG9mIGFuIG9iamVjdCB0byBnZXQgYWNjZXNzZWQgYnkgYSBwYXRoIGluIGFkZGl0aW9uIHRvCi0gKiB0aGUgaWRlbnRpZmllci4gUGF0aHMgYXJlIGhpZXJhcmNoaWNhbCwgZWFjaCBvYmplY3Qgd2l0aCBhIHBhdGggaGFzIGEgcGFyZW50Ci0gKiB3aGVyZSB0aGUgcGFyZW50IGlzIGFsd2F5cyBhIGZvbGRlci4gUGF0aHMgZG8gbm90IGV4aXN0IG9uIGl0cyBvd24gYnV0IGFyZQotICogcGFydCBvZiBvdGhlciBvYmplY3RzIChkb2N1bWVudHMgYW5kIGZvbGRlcnMpLiBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGlzCi0gKiBkZWZpbmVkIGluIGludGVyZmFjZXMgdGhhdCBhcmUgc3ViY2xhc3Nlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWxpbmcgewotCi0gICAgLyoqCi0gICAgICogY2hhcmFjdGVyIGluZGljYXRpbmcgaG93IGZvbGRlcnMgYXJlIHNlcGFyYXRlZCB3aXRoaW4gYSBwYXRoIHN0cmluZy4gVGhpcwotICAgICAqIGNoYXIgbXVzdCBub3QgYmUgYSB2YWxpZCBjaGFyYWN0ZXIgb2YgYW4gb2JqZWN0IG5hbWUuCi0gICAgICovCi0gICAgU3RyaW5nIFBBVEhfU0VQQVJBVE9SID0gIi8iOwotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIGEgbGlzdCBvZiBwYXJlbnRzIHRoZSBwcmluY2lwYWwgaGFzIGFjY2VzcyB0by4gZm9yIHNpbmdsZSBwYXJlbnQKLSAgICAgKiBvYmplY3QgdGhpcyBsaXN0IG11c3QgY29udGFpbiBvbmx5IG9uZSBlbGVtZW50LiByZXR1cm5zIGFuIGVtcHR5IGxpc3QgaWYKLSAgICAgKiB0aGlzIGlzIGFuIHVuZmlsZWQgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiBsaXN0IG9mIHBhcmVudCBmb2xkZXJzCi0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldFBhcmVudElkcygpOwotCi0gICAgLyoqCi0gICAgICogdXN1YWxseSB0cnVlIGV4Y2VwdCBmb3IgdGhlIHJvb3QgZm9sZGVyLCBvcHRpbWl6ZWQgY2FsbCB0aGF0IGp1c3QgdGVzdHMKLSAgICAgKiBleGlzdGVuY2UgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgQXRvbVB1YiBsaW5rcyAobXVjaCBjaGVhcGVyIHRoYW4KLSAgICAgKiBjYWxsaW5nIGdldFBhcmVudHMoKSBhbmQgdGVzdCBmb3IgZW1wdHkgcmVzdWx0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBvYmplY3QgaGFzIGEgcGFyZW50LCBmYWxzZSBpZiBpdCBpcyBhIHJvb3Qgb2JqZWN0Ci0gICAgICovCi0gICAgYm9vbGVhbiBoYXNQYXJlbnQoKTsKLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgcGF0aCBzZWdtZW50IG9mIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgIFN0cmluZyB3aXRoIHBhdGggc2VnbWVudAotICAgICAqLwotICAgIFN0cmluZyBnZXRQYXRoU2VnbWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvRm9sZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL0ZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQyOWFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgZm9sZGVyIGlzIGEgY29uY3JldGUgb2JqZWN0IChtZWFuaW5nIGl0IGNhbiBiZSBzdG9yZWQpIGFuZCBoYXMgRWFjaCBmb2xkZXIKLSAqIGlzIGNvbnRhaW5lZCBpbiBhIHBhcmVudCBmb2xkZXIuIFRoZSBwYXJlbnQgZm9sZGVyIGZvciB0aGUgc3BlY2lhbCByb290Ci0gKiBmb2xkZXIgaXMgbnVsbC4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEZvbGRlciBleHRlbmRzIEZpbGVhYmxlIHsKLQotICAgIC8qKgotICAgICAqIGdldCBwYXJlbnQgaWYgb2YgdGhpcyBmb2xkZXIuCi0gICAgICogCi0gICAgICogQHJldHVybiBwYXJlbnQgaWQgb2YgdGhpcyBmb2xkZXIKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UGFyZW50SWQoKTsKLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgcGFyZW50IGlkIG9mIGEgZm9sZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRJZAotICAgICAqICAgICAgICAgICAgcGFyZW50IGlkIG9mIHRoaXMgZm9sZGVyCi0gICAgICovCi0gICAgdm9pZCBzZXRQYXJlbnRJZChTdHJpbmcgcGFyZW50SWQpOwotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIGEgbGlzdCBvZiBhbGxvd2VkIHR5cGVzIG9mIGNoaWxkcmVuIGluIHRoaXMgZm9sZGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgIGxpc3Qgb2YgYWxsb3dlZCBvYmplY3QgY2hpbGQgdHlwZSBpZHMKLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZENoaWxkT2JqZWN0VHlwZUlkcygpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL0l0ZW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWViNTEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGk7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHJlcHJlc2VudCBhIENNSVMgaXRlbSBhY2NvcmRpbmcgdG8gdGhlIENNSVMgc3BlY2lmaWNhdGlvbi4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW0gZXh0ZW5kcyBGaWxlYWJsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvTXVsdGlGaWxpbmcuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvTXVsdGlGaWxpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5NmZmNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL011bHRpRmlsaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotLyoqCi0gKiBEb2N1bWVudHMgY2FuIGhhdmUgaW4gdGhlIENNSVMgc3BlY2lmaWNhdGlvbiBtdWx0aXBsZSBwYXJlbnRzLiBUaGlzIGludGVyZmFjZQotICogZGVzY3JpYmVzIHRoZSBiZWhhdmlvciBvZiBvYmplY3RzIHdpdGggbXVsdGlwbGUgcGFyZW50IG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXVsdGlGaWxpbmcgZXh0ZW5kcyBGaWxpbmcgewotCi0gICAgLyoqCi0gICAgICogQWRkIHBhcmVudCBmb2xkZXIgdG8gdGhpcyBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHBhcmVudCBmb2xkZXIgdG8gYmUgYWRkZWQuCi0gICAgICovCi0gICAgdm9pZCBhZGRQYXJlbnRJZChTdHJpbmcgcGFyZW50SWQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHBhcmVudCBmcm9tIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnRJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgcGFyZW50IGZvbGRlciB0byBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlUGFyZW50SWQoU3RyaW5nIHBhcmVudElkKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvT2JqZWN0U3RvcmUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvT2JqZWN0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3YzUzMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL09iamVjdFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgYW4gaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIHRvIHN0b3JlIGFueSBraW5kIG9mCi0gKiBDTUlTIG9iamVjdHMuIFRoZSBPYmplY3RTdG9yZSBpcyB0aGUgdG9wbW9zdCBjb250YWluZXIgb2YgYWxsIENNSVMgb2JqZWN0Ci0gKiB0aGF0IGdldCBwZXJzaXN0ZWQuIEl0IGlzIGNvbXBhcmFibGUgdG8gYSBmaWxlIHN5c3RlbSwgb25lIG9iamVjdCBzdG9yZQotICogZXhpc3RzIHBlciByZXBvc2l0b3J5IGlkLiBUaGUgb2JqZWN0IHN0b3JlIGFsbG93cyBhY2Nlc3Mgb2JqZWN0cyBieSBhbiBpZC4gSW4KLSAqIGFkZGl0aW9uIGEgb2JqZWN0IGNhbiBiZSByZXRyaWV2ZWQgYnkgcGF0aC4gVHlwaWNhbGx5IHRoZSBvYmplY3Qgc3RvcmUgb3ducwotICogdGhlIGxpc3Qgb2Ygb2JqZWN0IGlkcyBhbmQgbWFpbnRhaW5zIHRoZSBwYXRoIGhpZXJhcmNoeS4KLSAqLwotcHVibGljIGludGVyZmFjZSBPYmplY3RTdG9yZSB7Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzcyB0byByZXByZXNlbnQgYSByZXN1bHQgb2YgZ2V0IGNoaWxkcmVuIGNhbGxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGRyZW5SZXN1bHQgewotICAgICAgICBwcml2YXRlIGludCBub0l0ZW1zOwotICAgICAgICBwcml2YXRlIExpc3Q8RmlsZWFibGU+IGNoaWxkcmVuOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGUgbmV3IGNoaWxkcmVuIHJlc3VsdHMgb2JqZWN0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIGNoaWxkcmVuCi0gICAgICAgICAqICAgICAgICAgICAgbGlzdCBvZiBjaGlsZHJlbgotICAgICAgICAgKiBAcGFyYW0gbm9JdGVtcwotICAgICAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBpdGVtcyBpbiByZXN1bHQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDaGlsZHJlblJlc3VsdChMaXN0PEZpbGVhYmxlPiBjaGlsZHJlbiwgaW50IG5vSXRlbXMpIHsKLSAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLSAgICAgICAgICAgIHRoaXMubm9JdGVtcyA9IG5vSXRlbXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIHJlc3VsdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGl0ZW1zCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldE5vSXRlbXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9JdGVtczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIGNoaWxkcmVuIG9iamVjdHMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgY2hpbGRyZW4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0PEZpbGVhYmxlPiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhpcyBvYmplY3Qgc3RvcmUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgcm9vdCBmb2xkZXIgb2YgdGhpcyBzdG9yZQotICAgICAqLwotICAgIEZvbGRlciBnZXRSb290Rm9sZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gYW4gb2JqZWN0IGJ5IHBhdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhdGgKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdXNlciB0byBjaGVjayB2aXNpYmlsaXR5Ci0gICAgICogQHJldHVybiB0aGUgc3RvcmVkIG9iamVjdCB3aXRoIHRoaXMgcGF0aAotICAgICAqLwotICAgIFN0b3JlZE9iamVjdCBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyB1c2VyKTsKLQotICAgIC8qKgotICAgICAqIGdldCBhbiBvYmplY3QgYnkgaXRzIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgaWRlbnRpZmllZCBieSB0aGlzIGlkCi0gICAgICovCi0gICAgU3RvcmVkT2JqZWN0IGdldE9iamVjdEJ5SWQoU3RyaW5nIGZvbGRlcklkKTsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYW4gb2JqZWN0IGZyb20gdGhlIHN0b3JlLiBGb3IgYSBmb2xkZXJzIHRoZSBmb2xkZXIgbXVzdCBiZSBlbXB0eS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIG9iamVjdCB0byBiZSBkZWxldGVkCi0gICAgICogQHBhcmFtIGFsbFZlcnNpb25zCi0gICAgICogICAgICAgICAgICBpcyBUUlVFIGFsbCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCBhcmUgZGVsZXRlZCwgb3RoZXJ3aXNlCi0gICAgICogICAgICAgICAgICBqdXN0IHRoaXMgb25lCi0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIHVzZXIgdG8gY2hlY2sgdmlzaWJpbGl0eQotICAgICAqLwotICAgIHZvaWQgZGVsZXRlT2JqZWN0KFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZG9jdW1lbnQgYXMgaW5pdGlhbCBzdGVwLiBUaGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBidXQgc3RpbGwKLSAgICAgKiB0ZW1wb3JhcnkgSXQgaXMgbm90IHlldCBwZXJzaXN0ZWQgYW5kIGRvZXMgbm90IGhhdmUgYW4gaWQgeWV0LiBBZnRlciB0aGlzCi0gICAgICogY2FsbCBhZGRpdGlvbmFsIGFjdGlvbnMgY2FuIHRha2UgcGxhY2UgKGxpa2UgYXNzaWduaW5nIHByb3BlcnRpZXMgYW5kIGEKLSAgICAgKiB0eXBlKSBiZWZvcmUgaXQgaXMgcGVyc2lzdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wTWFwCi0gICAgICogICAgICAgICAgICBtYXAgb2YgcHJvcGVydGllcwotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB0aGUgdXNlciB3aG8gY3JlYXRlcyB0aGUgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gZm9sZGVyCi0gICAgICogICAgICAgICAgICB0aGUgcGFyZW50IGZvbGRlcgotICAgICAqIEBwYXJhbSBjb250ZW50U3RyZWFtCi0gICAgICogICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gcG9saWNpZXMKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgb2YgcG9saWNpZXMgdG8gYXBwbHkKLSAgICAgKiBAcGFyYW0gYWRkQUNFcwotICAgICAqICAgICAgICAgICAgYWNlcyB0aGF0IGFyZSBhZGRlZAotICAgICAqIEBwYXJhbSByZW1vdmVBQ0VzCi0gICAgICogICAgICAgICAgICBhY2VzIHRoYXQgYXJlIHJlbW92ZWQKLSAgICAgKiBAcmV0dXJuIGRvY3VtZW50IG9iamVjdAotICAgICAqLwotICAgIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcE1hcCwgU3RyaW5nIHVzZXIsIEZvbGRlciBmb2xkZXIsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGZvbGRlciBhcyBpbml0aWFsIHN0ZXAuIFRoZSBmb2xkZXIgaXMgY3JlYXRlZCBidXQgc3RpbGwKLSAgICAgKiB0ZW1wb3JhcnkuIEl0IGlzIG5vdCB5ZXQgcGVyc2lzdGVkIGFuZCBkb2VzIG5vdCBoYXZlIGFuIGlkIHlldC4gQWZ0ZXIKLSAgICAgKiB0aGlzIGNhbGwgYWRkaXRpb25hbCBhY3Rpb25zIGNhbiB0YWtlIHBsYWNlIChsaWtlIGFzc2lnbmluZyBwcm9wZXJ0aWVzCi0gICAgICogYW5kIGEgdHlwZSkgYmVmb3JlIGl0IGlzIHBlcnNpc3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZm9sZGVyCi0gICAgICogQHBhcmFtIHByb3BNYXAKLSAgICAgKiAgICAgICAgICAgIG1hcCBvZiBwcm9wZXJ0aWVzCi0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB1c2VyIHdobyBjcmVhdGVzIHRoZSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBmb2xkZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZm9sZGVyCi0gICAgICogQHBhcmFtIHBvbGljaWVzCi0gICAgICogICAgICAgICAgICBsaXN0IG9mIHBvbGljaWVzIHRvIGFwcGx5Ci0gICAgICogQHBhcmFtIGFkZEFDRXMKLSAgICAgKiAgICAgICAgICAgIGFjZXMgdGhhdCBhcmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gcmVtb3ZlQUNFcwotICAgICAqICAgICAgICAgICAgYWNlcyB0aGF0IGFyZSByZW1vdmVkCi0gICAgICogQHJldHVybiBmb2xkZXIgb2JqZWN0Ci0gICAgICovCi0gICAgRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwLCBTdHJpbmcgdXNlciwgRm9sZGVyIGZvbGRlciwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGRvY3VtZW50IHRoYXQgc3VwcG9ydHMgdmVyc2lvbnMgYXMgaW5pdGlhbCBzdGVwLiBUaGUgZG9jdW1lbnQgaXMKLSAgICAgKiBjcmVhdGVkIGJ1dCBzdGlsbCB0ZW1wb3JhcnkuIEl0IGlzIG5vdCB5ZXQgcGVyc2lzdGVkIGFuZCBkb2VzIG5vdCBoYXZlIGFuCi0gICAgICogaWQgeWV0LiBBZnRlciB0aGlzIGNhbGwgYWRkaXRpb25hbCBhY3Rpb25zIGNhbiB0YWtlIHBsYWNlIChsaWtlIGFzc2lnbmluZwotICAgICAqIHByb3BlcnRpZXMgYW5kIGEgdHlwZSkgYmVmb3JlIGl0IGlzIHBlcnNpc3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZG9jdW1lbnQgKiBAcGFyYW0gcHJvcE1hcCBtYXAgb2YgcHJvcGVyaXRpZXMKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdGhlIHVzZXIgd2hvIGNyZWF0ZXMgdGhlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGZvbGRlcgotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBmb2xkZXIKLSAgICAgKiBAcGFyYW0gcG9saWNpZXMKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgb2YgcG9saWNpZXMgdG8gYXBwbHkKLSAgICAgKiBAcGFyYW0gYWRkQUNFcwotICAgICAqICAgICAgICAgICAgYWNlcyB0aGF0IGFyZSBhZGRlZAotICAgICAqIEBwYXJhbSByZW1vdmVBQ0VzCi0gICAgICogICAgICAgICAgICBhY2VzIHRoYXQgYXJlIHJlbW92ZWQKLSAgICAgKiBAcGFyYW0gY29udGVudFN0cmVhbQotICAgICAqICAgICAgICAgICAgY29udGVudCBzdHJlYW0gb2YgdGhlIG9iamVjdCB0byBjcmVhdGUKLSAgICAgKiBAcGFyYW0gdmVyc2lvbmluZ1N0YXRlCi0gICAgICogICAgICAgICAgICB2ZXJzaW9uIHN0YXRlIG9mIHRoZSBvYmplY3QgdG8gYmUgY3JlYXRlZCBpbgotICAgICAqIEByZXR1cm4gdmVyc2lvbmVkIGRvY3VtZW50IG9iamVjdAotICAgICAqLwotICAgIERvY3VtZW50VmVyc2lvbiBjcmVhdGVWZXJzaW9uZWREb2N1bWVudChTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwLCBTdHJpbmcgdXNlciwKLSAgICAgICAgICAgIEZvbGRlciBmb2xkZXIsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpdGVtIGFzIGluaXRpYWwgc3RlcC4gVGhlIGl0ZW0gaXMgY3JlYXRlZCBidXQgc3RpbGwgdGVtcG9yYXJ5LgotICAgICAqIEl0IGlzIG5vdCB5ZXQgcGVyc2lzdGVkIGFuZCBkb2VzIG5vdCBoYXZlIGFuIGlkIHlldC4gQWZ0ZXIgdGhpcyBjYWxsCi0gICAgICogYWRkaXRpb25hbCBhY3Rpb25zIGNhbiB0YWtlIHBsYWNlIChsaWtlIGFzc2lnbmluZyBwcm9wZXJ0aWVzIGFuZCBhIHR5cGUpCi0gICAgICogYmVmb3JlIGl0IGlzIHBlcnNpc3RlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gcHJvcE1hcAotICAgICAqICAgICAgICAgICAgbWFwIG9mIHByb3BlcnRpZXMKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdGhlIHVzZXIgd2hvIGNyZWF0ZXMgdGhlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGZvbGRlcgotICAgICAqICAgICAgICAgICAgdGhlIHBhcmVudCBmb2xkZXIKLSAgICAgKiBAcGFyYW0gcG9saWNpZXMKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgb2YgcG9saWNpZXMgdG8gYXBwbHkKLSAgICAgKiBAcGFyYW0gYWRkQUNFcwotICAgICAqICAgICAgICAgICAgYWNlcyB0aGF0IGFyZSBhZGRlZAotICAgICAqIEBwYXJhbSByZW1vdmVBQ0VzCi0gICAgICogICAgICAgICAgICBhY2VzIHRoYXQgYXJlIHJlbW92ZWQKLSAgICAgKiBAcmV0dXJuIGRvY3VtZW50IG9iamVjdAotICAgICAqLwotICAgIFN0b3JlZE9iamVjdCBjcmVhdGVJdGVtKFN0cmluZyBuYW1lLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAsIFN0cmluZyB1c2VyLCBGb2xkZXIgZm9sZGVyLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcG9saWN5LiBUaGUgcG9saWN5IGlzIGNyZWF0ZWQgYnV0IHN0aWxsIHRlbXBvcmFyeS4gSXQgaXMgbm90IHlldAotICAgICAqIHBlcnNpc3RlZCBhbmQgZG9lcyBub3QgaGF2ZSBhbiBpZCB5ZXQuIEFmdGVyIHRoaXMgY2FsbCBhZGRpdGlvbmFsIGFjdGlvbnMKLSAgICAgKiBjYW4gdGFrZSBwbGFjZSAobGlrZSBhc3NpZ25pbmcgcHJvcGVydGllcyBhbmQgYSB0eXBlKSBiZWZvcmUgaXQgaXMKLSAgICAgKiBwZXJzaXN0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIHBvbGljeVRleHQKLSAgICAgKiAgICAgICAgICAgIHBvbGljeSB0ZXh0IHRvIGFwcGx5IHRvIHRoaXMgcG9saWN5Ci0gICAgICogQHBhcmFtIHByb3BNYXAKLSAgICAgKiAgICAgICAgICAgIG1hcCBvZiBwcm9wZXJ0aWVzCi0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB1c2VyIHdobyBjcmVhdGVzIHRoZSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBhZGRBQ0VzCi0gICAgICogICAgICAgICAgICBhY2VzIHRoYXQgYXJlIGFkZGVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFDRXMKLSAgICAgKiAgICAgICAgICAgIGFjZXMgdGhhdCBhcmUgcmVtb3ZlZAotICAgICAqIEByZXR1cm4gcG9saWN5IG9iamVjdAotICAgICAqLwotICAgIFN0b3JlZE9iamVjdCBjcmVhdGVQb2xpY3koU3RyaW5nIG5hbWUsIFN0cmluZyBwb2xpY3lUZXh0LCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAsIFN0cmluZyB1c2VyLAotICAgICAgICAgICAgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKTsKLQotICAgIC8qKgotICAgICAqIGdldCBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZm9sZGVyLiBUbyBzdXBwb3J0IHBhZ2luZyBhbiBpbml0aWFsIG9mZnNldAotICAgICAqIGFuZCBhIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIHRvIHJldHJpZXZlIGNhbiBiZSBwYXNzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvbGRlcgotICAgICAqICAgICAgICAgICAgZm9sZGVyIHRvIGdldCBjaGlsZHJlbiBmcm9tCi0gICAgICogQHBhcmFtIG1heEl0ZW1zCi0gICAgICogICAgICAgICAgICBtYXguIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogICAgICAgICAgICBpbml0aWFsIG9mZnNldCB3aGVyZSB0byBzdGFydCBmZXRjaGluZwotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIHRvIGRldGVybWluZSB2aXNpYmxlIGNoaWxkcmVuCi0gICAgICogQHBhcmFtIHVzZVB3YwotICAgICAqICAgICAgICAgICAgaWYgdHJ1ZSByZXR1cm4gcHJpdmF0ZSB3b3JraW5nIGNvcHkgb3RoZXJ3aXNlIHJldHVybiBsYXRlc3QKLSAgICAgKiAgICAgICAgICAgIHZlcnNpb247Ci0gICAgICogCi0gICAgICogQHJldHVybiBsaXN0IG9mIGNoaWxkcmVuIG9iamVjdHMKLSAgICAgKi8KLSAgICBDaGlsZHJlblJlc3VsdCBnZXRDaGlsZHJlbihGb2xkZXIgZm9sZGVyLCBpbnQgbWF4SXRlbXMsIGludCBza2lwQ291bnQsIFN0cmluZyB1c2VyLCBib29sZWFuIHVzZVB3Yyk7Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGZvbGRlciB3aGljaCBhcmUgZm9sZGVycy4gVG8gc3VwcG9ydCBwYWdpbmcKLSAgICAgKiBhbiBpbml0aWFsIG9mZnNldCBhbmQgYSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbiB0byByZXRyaWV2ZSBjYW4gYmUKLSAgICAgKiBwYXNzZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZvbGRlcgotICAgICAqICAgICAgICAgICAgZm9sZGVyIHRvIGdldCBjaGlsZHJlbiBmcm9tCi0gICAgICogQHBhcmFtIG1heEl0ZW1zCi0gICAgICogICAgICAgICAgICBtYXguIG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogICAgICAgICAgICBpbml0aWFsIG9mZnNldCB3aGVyZSB0byBzdGFydCBmZXRjaGluZwotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB0aGUgdXNlciB3aG8gcGVyZm9ybXMgdGhlIGNhbGwKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgY2hpbGRyZW4gZm9sZGVycwotICAgICAqLwotICAgIENoaWxkcmVuUmVzdWx0IGdldEZvbGRlckNoaWxkcmVuKEZvbGRlciBmb2xkZXIsIGludCBtYXhJdGVtcywgaW50IHNraXBDb3VudCwgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogTW92ZSBhbiBvYmplY3QgdG8gYSBkaWZmZXJlbnQgZm9sZGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzbwotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIGJlIG1vdmVkCi0gICAgICogQHBhcmFtIG9sZFBhcmVudAotICAgICAqICAgICAgICAgICAgb2xkIHBhcmVudCBmb2xkZXIgZm9yIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gbmV3UGFyZW50Ci0gICAgICogICAgICAgICAgICBuZXcgcGFyZW50IGZvbGRlciBmb3IgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotICAgICAqLwotICAgIHZvaWQgbW92ZShTdG9yZWRPYmplY3Qgc28sIEZvbGRlciBvbGRQYXJlbnQsIEZvbGRlciBuZXdQYXJlbnQsIFN0cmluZyB1c2VyKTsKLQotICAgIC8qKgotICAgICAqIFJlbmFtZSBhbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvCi0gICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgcmVuYW1lZAotICAgICAqIEBwYXJhbSBuZXdOYW1lCi0gICAgICogICAgICAgICAgICBuZXcgbmFtZSB0byBiZSBhc3NpZ25lZAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotICAgICAqLwotICAgIHZvaWQgcmVuYW1lKFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIG5ld05hbWUsIFN0cmluZyB1c2VyKTsKLQotICAgIC8qKgotICAgICAqIFBlcnNpc3QgYSBuZXcgdmVyc2lvbiBpbiB0aGUgc3RvcmUgKGNyZWF0ZWQgZnJvbSBhIGNoZWNrLW91dCkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnNpb24KLSAgICAgKiAgICAgIHZlcnNpb24gdG8gYmUgc3RvcmVkCi0gICAgICovCi0gICAgdm9pZCBzdG9yZVZlcnNpb24oRG9jdW1lbnRWZXJzaW9uIHZlcnNpb24pOwotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlIGEgdmVyc2lvbiBmcm9tIHRoZSBzdG9yZSAoYWZ0ZXIgYSBjYW5jZWwgY2hlY2stb3V0KS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbgotICAgICAqICAgICAgICAgICAgdmVyc2lvbiB0byBiZSBkZWxldGVkCi0gICAgICovCi0gICAgdm9pZCBkZWxldGVWZXJzaW9uKERvY3VtZW50VmVyc2lvbiB2ZXJzaW9uKTsKLQotICAgIC8qKgotICAgICAqIE1vZGlmeSBhbmQgc3RvcmUgdGhlIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzbwotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIHVwZGF0ZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICBtYXAgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRvIGJlIHVwZGF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZU9iamVjdChTdG9yZWRPYmplY3Qgc28sIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBwYXRoIG9mIHRoaXMgZm9sZGVyIChmb3IgZm9sZGVyIGluIENNSVMgcGF0aCBpcyB1bmlxdWUpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmb2xkZXJJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgZm9sZGVyCi0gICAgICogQHJldHVybiBwYXRoIG9mIHRoaXMgZm9sZGVyCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZvbGRlclBhdGgoU3RyaW5nIGZvbGRlcklkKTsKLQotICAgIC8qKgotICAgICAqIENsZWFyIHJlcG9zaXRvcnkgYW5kIHJlbW92ZSBhbGwgZGF0YS4KLSAgICAgKi8KLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igc3RhdGlzdGljczogcmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBjb250YWluZWQgaW4gdGhlIHN5c3RlbS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBzdG9yZWQgb2JqZWN0cwotICAgICAqLwotICAgIGxvbmcgZ2V0T2JqZWN0Q291bnQoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHJlbGF0aW9uc2hpcC4gVGhlIHJlbGF0aW9uc2hpcCBpcyBjcmVhdGVkIGJ1dCBzdGlsbCB0ZW1wb3JhcnkuCi0gICAgICogSXQgaXMgbm90IHlldCBwZXJzaXN0ZWQgYW5kIGRvZXMgbm90IGhhdmUgYW4gaWQgeWV0LiBBZnRlciB0aGlzIGNhbGwKLSAgICAgKiBhZGRpdGlvbmFsIGFjdGlvbnMgY2FuIHRha2UgcGxhY2UgKGxpa2UgYXNzaWduaW5nIHByb3BlcnRpZXMgYW5kIGEgdHlwZSkKLSAgICAgKiBiZWZvcmUgaXQgaXMgcGVyc2lzdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBuYW1lIG9mIHJlbGF0aW9uc2hpcAotICAgICAqIEBwYXJhbSBzb3VyY2VPYmplY3QKLSAgICAgKiAgICAgICAgICAgIHNvdXJjZSBvZiB0aGUgcmVsYXRpb25zaGlwCi0gICAgICogQHBhcmFtIHRhcmdldE9iamVjdAotICAgICAqICAgICAgICAgICAgdGFyZ2V0IG9mIHRoZSByZWxhdGlvbnNoaXAKLSAgICAgKiBAcGFyYW0gcHJvcE1hcAotICAgICAqICAgICAgICAgICAgbWFwIG9mIHByb3Blcml0aWVzCi0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB1c2VyIHdobyBjcmVhdGVzIHRoZSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBhZGRBQ0VzCi0gICAgICogICAgICAgICAgICBhY2VzIHRoYXQgYXJlIGFkZGVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFDRXMKLSAgICAgKiAgICAgICAgICAgIGFjZXMgdGhhdCBhcmUgcmVtb3ZlZAotICAgICAqIEByZXR1cm4gdmVyc2lvbmVkIGRvY3VtZW50IG9iamVjdAotICAgICAqLwotICAgIFN0b3JlZE9iamVjdCBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIG5hbWUsIFN0b3JlZE9iamVjdCBzb3VyY2VPYmplY3QsIFN0b3JlZE9iamVjdCB0YXJnZXRPYmplY3QsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAsIFN0cmluZyB1c2VyLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgZG9jdW1lbnRzIHRoYXQgYXJlIGNoZWNrZWQgb3V0IGluIHRoZSByZXBvc2l0b3J5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBvcmRlckJ5Ci0gICAgICogICAgICAgICAgICBvcmRlckJ5IHNwZWNpZmljYXRpb24gYWNjb3JkaW5nIHRvIENNSVMgc3BlYy4KLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdXNlciBpZCBvZiB1c2VyIGNhbGxpbmcKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgICAgICAgICAgIGlmIHRydWUgaW5jbHVkZSBhbGwgcmVsYXRpb25zaGlwcyBpbiB0aGUgcmVzcG9uc2UKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgY2hlY2tlZCBvdXQgZG9jdW1lbnRzIGluIHRoZSByZXBvc2l0b3J5Ci0gICAgICovCi0gICAgTGlzdDxTdG9yZWRPYmplY3Q+IGdldENoZWNrZWRPdXREb2N1bWVudHMoU3RyaW5nIG9yZGVyQnksIFN0cmluZyB1c2VyLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBseSBhIEFDTHMgYnkgcmVsYXRpdmUgYWRkaW5nIGFuZCByZW1vdmluZyBhIGxpc3Qgb2YgQUNFcyB0by9mcm9tIGFuCi0gICAgICogb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzbwotICAgICAqICAgICAgICAgICAgb2JqZWN0IHdoZXJlIEFDTHMgYXJlIGFwcGxpZWQKLSAgICAgKiBAcGFyYW0gYWRkQWNlcwotICAgICAqICAgICAgICAgICAgbGlzdCBvZiBBQ0VzIHRvIGJlIGFkZGVkCi0gICAgICogQHBhcmFtIHJlbW92ZUFjZXMKLSAgICAgKiAgICAgICAgICAgIGxpc3Qgb2YgQUNFcyB0byBiZSByZW1vdmVkCi0gICAgICogQHBhcmFtIGFjbFByb3BhZ2F0aW9uCi0gICAgICogICAgICAgICAgICBlbnVtIHZhbHVlIGhvdyB0byBwcm9wYWdhdGUgQUNMcyB0byBjaGlsZCBvYmplY3RzCi0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSB1c2VyIHdobyBhcHBsaWVzIEFDTAotICAgICAqIEByZXR1cm4gbmV3IEFDTCBvZiBvYmplY3QKLSAgICAgKi8KLSAgICBBY2wgYXBwbHlBY2woU3RvcmVkT2JqZWN0IHNvLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uLCBTdHJpbmcgdXNlcik7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBseSBhIEFDTHMgYnkgc2V0dGluZyBhIG5ldyBsaXN0IG9mIEFDRXMgdG8gYW4gb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzbwotICAgICAqICAgICAgICAgICAgb2JqZWN0IHdoZXJlIEFDTHMgYXJlIGFwcGxpZWQKLSAgICAgKiBAcGFyYW0gYWNlcwotICAgICAqICAgICAgICAgICAgbGlzdCBvZiBBQ0VzIHRvIGJlIGFwcGxpZWQKLSAgICAgKiBAcGFyYW0gYWNsUHJvcGFnYXRpb24KLSAgICAgKiAgICAgICAgICAgIGVudW0gdmFsdWUgaG93IHRvIHByb3BhZ2F0ZSBBQ0xzIHRvIGNoaWxkIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdXNlciB3aG8gZXhlY3V0ZXMgdGhlIGNhbGwgYW5kIG5lZWRzIHRvIGhhdmUgcGVybWlzc2lvbiB0bwotICAgICAqICAgICAgICAgICAgYXBwbHkgQUNMCi0gICAgICogQHJldHVybiBuZXcgQUNMIG9mIG9iamVjdAotICAgICAqLwotICAgIEFjbCBhcHBseUFjbChTdG9yZWRPYmplY3Qgc28sIEFjbCBhY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhpcyBzdG9yZSBjb250YWlucyBhbnkgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHR5cGUgaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgdHlwZSBkZWZpbml0aW9uIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvYmplY3QgaW4gdGhlIHN0b3JlIGhhcyB0aGUgZ2l2ZW4gdHlwZSwKLSAgICAgKiAgICAgICAgIGZhbHNlIGlmIG5vIG9iamVjdHMgZXhpc3QgaGF2aW5nIHRoaXMgdHlwZQotICAgICAqLwotICAgIGJvb2xlYW4gaXNUeXBlSW5Vc2UoU3RyaW5nIHR5cGVJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgcmVsYXRpb25zaGlwcyB0byBhbmQgZnJvbSBhbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG9iamVjdElkCi0gICAgICogICAgICAgICAgICBpZCBvZiBvYmplY3QgdG8gZ2V0IHJlbGF0aW9uc2hpcHMgd2l0aAotICAgICAqIEBwYXJhbSB0eXBlSWRzCi0gICAgICogICAgICAgICAgICBsaXN0IG9mIGFsbCB0eXBlcyB0byBiZSBpbmNsdWRlZAotICAgICAqIEBwYXJhbSBkaXJlY3Rpb24KLSAgICAgKiAgICAgICAgICAgIGRpcmVjdGlvbiBvZiByZWxhdGlvbnNoaXAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgICAgICAgICBsaXN0IG9mIHJlbGF0aW9uc2hpcHMgYmVsb25naW5nIHRvIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgTGlzdDxTdG9yZWRPYmplY3Q+IGdldFJlbGF0aW9uc2hpcHMoU3RyaW5nIG9iamVjdElkLCBMaXN0PFN0cmluZz4gdHlwZUlkcywgUmVsYXRpb25zaGlwRGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYW4gQUNMIG9iamVjdCBmcm9tIGFuIEFDTCBpZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWNsSWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIEFDTAotICAgICAqIEByZXR1cm4gQUNMIG9mIHRoaXMgaWQKLSAgICAgKi8KLSAgICBBY2wgZ2V0QWNsKGludCBhY2xJZCk7Ci0KLSAgICAvLyBNdWx0aWZpbGluZyBtZXRob2RzOgotICAgIC8qKgotICAgICAqIGdldCBhbGwgcGFyZW50IGlkcyBvZiB0aGlzIG9iamVjdCB2aXNpYmxlIGZvciBhIHVzZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvCi0gICAgICogICAgICAgICAgICBvYmplY3RzIHRvIGdldCBwYXJlbnRzIGZyb20KLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdXNlciB3aG8gY2FuIHNlZSBwYXJlbnRzCi0gICAgICogQHJldHVybiBsaXN0IG9mIGZvbGRlciBpZHMKLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZ2V0UGFyZW50SWRzKFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogQWRkIHRoaXMgZG9jdW1lbnQgdG8gYSBuZXcgcGFyZW50IGZvbGRlciBhcyBjaGlsZCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvCi0gICAgICogICAgICAgICAgICBvYmplY3RzIHRvIGJlIGFkZGVkCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgcGFyZW50IGZvbGRlciB0aGUgb2JqZWN0IGlzIHRvIGJlIGFkZGVkIHRvCi0gICAgICovCi0gICAgdm9pZCBhZGRQYXJlbnQoU3RvcmVkT2JqZWN0IHNvLCBGb2xkZXIgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGlzIG9iamVjdCBmcm9tIHRoZSBjaGlsZHJlbiBvZiBwYXJlbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvCi0gICAgICogICAgICAgICAgICBvYmplY3QgdG8gYmUgcmVtb3ZlZAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHBhcmVudCBmb2xkZXIgdGhlIG9iamVjdCBpcyB0byBiZSByZW1vdmVkIGZyb20KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVBhcmVudChTdG9yZWRPYmplY3Qgc28sIEZvbGRlciBwYXJlbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgYSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc28KLSAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byBnZXQgY29udGVudCBmcm9tCi0gICAgICogQHBhcmFtIG9mZnNldAotICAgICAqICAgICAgICAgICAgb2Zmc2V0IGluIGNvbnRlbnQgc3RyZWFtCi0gICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqICAgICAgICAgICAgbGVuZ3RoIG9mIGNvbnRlbnQgdG8gcmV0dXJuCi0gICAgICogCi0gICAgICogQHJldHVybiBvYmplY3QgY29udGFpbmluZyBtaW1lLXR5cGUsIGxlbmd0aCBhbmQgYSBzdHJlYW0gd2l0aCBjb250ZW50Ci0gICAgICovCi0gICAgQ29udGVudFN0cmVhbSBnZXRDb250ZW50KFN0b3JlZE9iamVjdCBzbywgbG9uZyBvZmZzZXQsIGxvbmcgbGVuZ3RoKTsKLQotICAgIC8qKgotICAgICAqIFdyaXRlIGNvbnRlbnQgYW5kIGF0dGFjaCBpdCB0byBhIGRvY3VtZW50LiBFeGlzdGluZyBjb250ZW50IGdldHMgb3ZlcndyaXR0ZW4uIAotICAgICAqIAotICAgICAqIEBwYXJhbSBzbwotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIHNldCBjb250ZW50IHRvCi0gICAgICogQHBhcmFtIGNvbnRlbnQKLSAgICAgKiAgICAgICAgICAgIGNvbnRlbnQgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGRvY3VtZW50LiBJZiBudWxsIGFueSBleGlzdGluZyAKLSAgICAgKiAgICAgICAgICAgIGNvbnRlbnQgaXMgZGVsZXRlZAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgICAgICAgICB0aGUgY3JlYXRlZCBjb250ZW50IHN0cmVhbQotICAgICAqLwotICAgIENvbnRlbnRTdHJlYW0gc2V0Q29udGVudChTdG9yZWRPYmplY3Qgc28sIENvbnRlbnRTdHJlYW0gY29udGVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmQgY29udGVudCB0byBhbiBleGlzdGluZyBjb250ZW50IHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc28KLSAgICAgKiAgICAgICAgICAgIG9iamVjdCB0byBhcHBlbmQgY29udGVudCB0bwotICAgICAqIEBwYXJhbSBjb250ZW50Ci0gICAgICogICAgICAgICAgICBjb250ZW50IHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBkb2N1bWVudC4KLSAgICAgKi8KLSAgICB2b2lkIGFwcGVuZENvbnRlbnQoU3RvcmVkT2JqZWN0IHNvLCBDb250ZW50U3RyZWFtIGNvbnRlbnQpOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSByZW5kaXRpb24gdGhpcyBvYmplY3RzIHN1cHBvcnRzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzbwotICAgICAqICAgICAgICAgICAgb2JqZWN0IHRvIGdldCByZW5kaXRpb25zIGZyb20KLSAgICAgKiBAcGFyYW0gcmVuZGl0aW9uRmlsdGVyCi0gICAgICogICAgICAgICAgICBmaWx0ZXIgb2YgcmVuZGl0aW9ucyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gbWF4SXRlbXMKLSAgICAgKiAgICAgICAgICAgIG1heCBudWJtZXIgb2YgaXRlbXMgdG8gcmV0dXJuCi0gICAgICogQHBhcmFtIHNraXBDb3VudAotICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIG9iamVjdHMgdG8gc2tpcCBpbiByZXN1bHQKLSAgICAgKiBAcmV0dXJuIExpc3Qgb2YgcmVuZGl0aW9ucyBvciBudWxsIGlmIG5vIHJlbmRpdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IKLSAgICAgKiAgICAgICAgIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgTGlzdDxSZW5kaXRpb25EYXRhPiBnZXRSZW5kaXRpb25zKFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgbG9uZyBtYXhJdGVtcywgbG9uZyBza2lwQ291bnQpOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSByZW5kaXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNvCi0gICAgICogICAgICAgICAgICBvYmplY3QgdG8gZ2V0IHJlbmRpdGlvbnMgZnJvbQotICAgICAqIEBwYXJhbSBzdHJlYW1JZAotICAgICAqICAgICAgICAgICAgc3RyZWFtIGlmIG9mIHJlbmRpdGlvbgotICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbiByZW5kaXRpb24gY29udGVudAotICAgICAqIEBwYXJhbSBsZW5ndGgKLSAgICAgKiAgICAgICAgICAgIGxlbmd0aCBvZiByZW5kaXRpb24gY29udGVudAotICAgICAqIEByZXR1cm4gQ29udGVudFN0cmVhbSBjb250YWluaW5nIHRoZSByZW5kaXRpb24KLSAgICAgKi8KLSAgICBDb250ZW50U3RyZWFtIGdldFJlbmRpdGlvbkNvbnRlbnQoU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgc3RyZWFtSWQsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCk7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9Qb2xpY3kuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvUG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODA3NTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9Qb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpOwotCi0vKioKLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgYSBwb2xpY3kgYWNjb3JkaW5nIHRvIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBQb2xpY3kgewotCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0aGUgcG9saWN5IHRleHQgb2YgdGhpcyBwb2xpY3kuCi0gICAgICogCi0gICAgICogQHJldHVybiBwb2xpY3kgdGV4dAotICAgICAqLwotICAgIFN0cmluZyBnZXRQb2xpY3lUZXh0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvUmVsYXRpb25zaGlwLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL1JlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc5ZGZiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgcG9saWN5IGFjY29yZGluZyB0byB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uLgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsYXRpb25zaGlwIHsKLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgc291cmNlIG9iamVjdHMgb2YgdGhpcyByZWxhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2Ygb2JqZWN0IGlkcwotICAgICAqLwotICAgIFN0cmluZyBnZXRTb3VyY2VPYmplY3RJZCgpOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSB0YXJnZXQgb2JqZWN0cyBvZiB0aGlzIHJlbGF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gbGlzdCBvZiBvYmplY3QgaWRzCi0gICAgICovCi0gICAgU3RyaW5nIGdldFRhcmdldE9iamVjdElkKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL1N0b3JlTWFuYWdlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9TdG9yZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhZDZmNS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL1N0b3JlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5UeXBlTWFuYWdlcjsKLQotLyoqCi0gKiBpbnRlcmZhY2UgdG8gYSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uLiBUaGlzIGludGVyZmFjZSBpcyB0aGUgZW50cnkgcG9pbnQKLSAqIHRvIGEgcmVwb3NpdG9yeSB0aGF0IGNhbiBwZXJzaXN0IENNSVMgb2JqZWN0cy4gVXNpbmcgdGhpcyBpbnRlcmZhY2UgdGhlIHR5cGUKLSAqIGluZm9ybWF0aW9uIGNhbiBiZSByZXRyaWV2ZWQgb3Igc2V0LCBhIHJlcG9zaXRvcnkgY2FuIGJlIGNyZWF0ZWQgb3IgZm9yIGEKLSAqIGdpdmVuIHJlcG9zaXRvcnkgdGhlIHN0b3JlIGNhbiBiZSByZXRyaWV2ZWQuCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBTdG9yZU1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHJlcG9zaXRvcmllcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgcmVwb3NpdG9yeSBpZHMKLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZ2V0QWxsUmVwb3NpdG9yeUlkcygpOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgc3RvcmUgZm9yIHRoZSBnaXZlbiByZXBvc2l0b3J5LiBPbmx5IGNhbGxlZCBmb3IKLSAgICAgKiByZXBvc2l0b3JpZXMgdGhhdCBleGlzdCBvbiBzdGFydHVwIChpLmUuIGZvciBlYWNoIHJlcG9zaXRvcnkgaWQgcmV0dXJuZWQKLSAgICAgKiBpbiBhIHByZXZpb3VzIGdldEFsbFJlcG9zaXRvcnlJZHMoKSBjYWxsLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHJlcG9zaXRvcnkgdG8gaW5pdGlhbGl6ZQotICAgICAqLwotICAgIHZvaWQgaW5pdFJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG9iamVjdCBzdG9yZSBmb3IgdGhlIGdpdmVuIHJlcG9zaXRvcnkgaWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgcmVwb3NpdG9yeSBpZCBvZiBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgc3RvcmUgaW4gd2hpY2ggb2JqZWN0cyBmb3IgdGhpcyByZXBvc2l0b3J5IGFyZSBzdG9yZWQuCi0gICAgICovCi0gICAgT2JqZWN0U3RvcmUgZ2V0T2JqZWN0U3RvcmUoU3RyaW5nIHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBwZXJtaXNzaW9uIGFuZCBwYXJhbWV0ZXIgdmFsaWRhdGluZyBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHZhbGlkYXRvciBhbmQgcGVybWlzc2lvbiBjaGVja2VyCi0gICAgICovCi0gICAgQ21pc1NlcnZpY2VWYWxpZGF0b3IgZ2V0U2VydmljZVZhbGlkYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkgd2l0aCB0aGUgZ2l2ZW4gaWQuIENyZWF0ZSB0aGUgcmVwb3NpdG9yeSwKLSAgICAgKiBpbml0aWF0ZSB0aGUgdHlwZSBzeXN0ZW0gYW5kIGluaXRpYWxpemUgaXQgc28gdGhhdCBpdCBpcyByZWFkeSBmb3IgdXNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gdHlwZUNyZWF0b3JDbGFzc05hbWUKLSAgICAgKiAgICAgICAgICAgIGNsYXNzIGltcGxlbWVudGluZyB0aGUgdHlwZSBjcmVhdGlvbiwgdGhlIGNsYXNzIG11c3QgaW1wbGVtZW50Ci0gICAgICogICAgICAgICAgICB0aGUgaW50ZXJmYWNlIFR5cGVDcmVhdG9yCi0gICAgICovCi0gICAgdm9pZCBjcmVhdGVBbmRJbml0UmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUNyZWF0b3JDbGFzc05hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSBsaXN0IHdpdGggYWxsIHR5cGUgZGVmaW5pdGlvbnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucwotICAgICAqICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdG8gaW5jbHVkZSBwcm9wZXJ0eSBkZWZpbml0aW9ucyBpbiByZXR1cm5lZAotICAgICAqICAgICAgICAgICAgdHlwZQotICAgICAqIEByZXR1cm4gbWFwIHdpdGggdHlwZSBkZWZpbml0aW9uCi0gICAgICovCi0gICAgQ29sbGVjdGlvbjxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0VHlwZURlZmluaXRpb25MaXN0KFN0cmluZyByZXBvc2l0b3J5SWQsIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSB0eXBlIGRlZmluaXRpb24gZm9yIGEgZ2l2ZSByZXBvc2l0b3J5IGFuZCB0eXBlIGlkLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHJlcG9zaXRvcnkKLSAgICAgKiBAcGFyYW0gdHlwZUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiB0eXBlIGRlZmluaXRpb24KLSAgICAgKiBAcmV0dXJuIHR5cGUgZGVmaW5pdGlvbgotICAgICAqLwotICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGdldFR5cGVCeUlkKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSB0eXBlIGRlZmluaXRpb24gZm9yIGEgZ2l2ZSByZXBvc2l0b3J5IGFuZCB0eXBlIGlkIHdpdGggb3IKLSAgICAgKiB3aXRob3V0IHByb3BlcnR5IGRlZmluaXRpb25zIGFuZCBsaW1pdGVkIHRvIGRlcHRoIGluIGhpZXJhcmNoeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHR5cGVJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgdHlwZSBkZWZpbml0aW9uCi0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0byBpbmNsdWRlIHByb3BlcnR5IGRlZmluaXRpb25zIGluIHJldHVybmVkCi0gICAgICogICAgICAgICAgICB0eXBlCi0gICAgICogQHBhcmFtIGRlcHRoCi0gICAgICogICAgICAgICAgICBsaW1pdCBkZXB0aCBvZiB0eXBlIGhpZXJhcmNoeSBpbiByZXR1cm4gKC0xIG1lYW5zIHVubGltaXRlZCkKLSAgICAgKiBAcmV0dXJuIHR5cGUgZGVmaW5pdGlvbgotICAgICAqLwotICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGdldFR5cGVCeUlkKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICBpbnQgZGVwdGgpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSBmYWN0b3J5IHRvIGNyZWF0ZSBDTUlTIGRhdGEgc3RydWN0dXJlcyB1c2VkIGFzIGNvbnRhaW5lcnMuCi0gICAgICogCi0gICAgICogQHJldHVybiBmYWN0b3J5IG9iamVjdAotICAgICAqLwotICAgIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBnZXRPYmplY3RGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhIGxpc3Qgb2Ygcm9vdCB0eXBlcyBpbiB0aGUgcmVwb3NpdG9yaWVzLiBSb290IHR5cGVzIGFyZQotICAgICAqIGF2YWlsYWJsZSBieSBkZWZpbml0aW9uIGFuZCBuZWVkIHRvIHRvIGJlIGNyZWF0ZWQgYnkgYSBjbGllbnQuIENNSVMKLSAgICAgKiBzdXBwb3J0cyBkb2N1bWVudHMsIGZvbGRlcnMsIHJlbGF0aW9ucyBhbmQgcG9saWNpZXMgYXMgcm9vdCB0eXBlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIGluY2xQcm9wRGVmcwotICAgICAqICAgICAgICAgICAgdHJ1ZSB0byBpbmNsdWRlIHByb3BlcnR5IGRlZmluaXRpb25zLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2Ygcm9vdCB0eXBlcwotICAgICAqLwotICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFJvb3RUeXBlcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBib29sZWFuIGluY2xQcm9wRGVmcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgcmVwb3NpdG9yeSBpbmZvcm1hdGlvbiBmb3IgYSByZXBvc2l0b3J5LgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHJlcG9zaXRvcnkKLSAgICAgKiBAcmV0dXJuIHJlcG9zaXRvcnkgaW5mb3JtYXRpb24KLSAgICAgKi8KLSAgICBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSB0eXBlIG1hbmFnZXIgZm9yIGEgZ2l2ZW4gcmVwb3NpdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiByZXBvc2l0b3J5Ci0gICAgICogQHJldHVybiB0eXBlIG1hbmFnZXIgZm9yIHRoaXMgcmVwb3NpdG9yeSBvciBudWxsIGlmIHJlcG9zaXRvcnkgaXMgdW5rbm93bgotICAgICAqLwotICAgIFR5cGVNYW5hZ2VyIGdldFR5cGVNYW5hZ2VyKFN0cmluZyByZXBvc2l0b3J5SWQpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGluZm9ybWF0aW9uIGlmIGEgcmVwb3NpdG9yeSBzdXBwb3J0cyBzaW5nbGUgZmlsaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgaWQgb2YgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgc2luZ2xlIGZpbGluZyBpcyBzdXBwb3J0ZWQgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgYm9vbGVhbiBzdXBwb3J0c1NpbmdsZUZpbGluZyhTdHJpbmcgcmVwb3NpdG9yeUlkKTsKLQotICAgIC8qKgotICAgICAqIEdldCBpbmZvcm1hdGlvbiBpZiBhIHJlcG9zaXRvcnkgc3VwcG9ydHMgbXVsdGkgZmlsaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXBvc2l0b3J5SWQKLSAgICAgKiAgICAgICAgICAgIHJlcG9zaXRvcnkgaWQgb2YgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbXVsdGkgZmlsaW5nIGlzIHN1cHBvcnRlZCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBib29sZWFuIHN1cHBvcnRzTXVsdGlGaWxpbmdzKFN0cmluZyByZXBvc2l0b3J5SWQpOwotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIHF1ZXJ5IGFnYWluc3QgdGhlIHJlcG9zaXRvcnkgKHNhbWUgcGFyYW1ldGVyIGFzIHRoZSBkaXNjb3ZlcnkKLSAgICAgKiBzZXJ2aWNlIHF1ZXJ5IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgdXNlciBleGVjdWluZyB0aGUgcXVlcnkKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHN0YXRlbWVudAotICAgICAqICAgICAgICAgICAgcXVlcnkgc3RhdGVtZW50Ci0gICAgICogQHBhcmFtIHNlYXJjaEFsbFZlcnNpb25zCi0gICAgICogICAgICAgICAgICBzZWFyY2ggaW4gYWxsIHZlcnNpb25zIG9mIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGUgYWxsb3dhYmxlIGFjdGlvbnMKLSAgICAgKiBAcGFyYW0gaW5jbHVkZVJlbGF0aW9uc2hpcHMKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGUgcmVsYXRpb25zaGlwcwotICAgICAqIEBwYXJhbSByZW5kaXRpb25GaWx0ZXIKLSAgICAgKiAgICAgICAgICAgIGluY2x1ZGUgcmVuZGl0aW9ucwotICAgICAqIEBwYXJhbSBtYXhJdGVtcwotICAgICAqICAgICAgICAgICAgbWF4IG51bWJlciBvZiBpdGVtcyB0byByZXR1cm4KLSAgICAgKiBAcGFyYW0gc2tpcENvdW50Ci0gICAgICogICAgICAgICAgICBpdGVtcyB0byBza2lwCi0gICAgICogQHJldHVybiBsaXN0IG9mIG9iamVjdHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5Ci0gICAgICovCi0gICAgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgdXNlciwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9TdG9yZWRPYmplY3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvU3RvcmVkT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NGYwN2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9TdG9yZWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5CaW5kaW5nc09iamVjdEZhY3Rvcnk7Ci0KLS8qKgotICogU3RvcmVkIE9iamVjdCBpbnRlcmZhY2UgaXMgY29tbW9uIHBhcnQgdGhhdCBhbGwgb2JqZWN0cyBoYW5kbGVkIGJ5IENNSVMKLSAqIChEb2N1bWVudHMsIEZvbGRlcnMsIFJlbGF0aW9ucywgUG9saWNpZXMsIEFDTHMpIHNoYXJlLiBPYmplY3RzIHRoYXQgaW1wbGVtZW50Ci0gKiB0aGlzIGludGVyZmFjZSBhcmUgYWx3YXlzIGNvbmNyZXRlIGFuZCBjYW4gbGl2ZSBpbiB0aGUgb2JqZWN0IHN0b3JlLiBBIHN0b3JlZAotICogb2JqZWN0IGFsd2F5cyBoYXMgYW4gaWQsIGEgbmFtZSBhbmQgcHJvcGVydGllcy4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0b3JlZE9iamVjdCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgaWQgb2YgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBpZCBvZiB0aGlzIG9iamVjdAotICAgICAqLwotICAgIFN0cmluZyBnZXRJZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBpZCBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIGlkIG9mIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBuYW1lIG9mIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJzaXN0IHRoZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgdGhhdCBpcyBhc3NpZ25lZCB0byB0aGlzIG9iamVjdAotICAgICAqLwotICAgIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGlzIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gSWQgb2YgdGhlIHR5cGUgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VHlwZUlkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHR5cGUgb2YgdGhpcyBkb2N1bWVudC4gVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyc2lzdCB0aGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdHlwZSB0aGlzIG9iamVjdCBnZXRzIGFzc2lnbmVkLgotICAgICAqLwotICAgIHZvaWQgc2V0VHlwZUlkKFN0cmluZyB0eXBlKTsKLQotICAgIC8qKgotICAgICAqIENNSVMgMS4xIGdldCBpZHMgb2YgYWxsIHNlY29uZGFyeSB0eXBlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdHlwZSBpZHMKLSAgICAgKi8KLSAgICBMaXN0PFN0cmluZz4gZ2V0U2Vjb25kYXJ5VHlwZUlkcygpOwotCi0gICAgLyoqCi0gICAgICogQ01JUyAxLjE6IHNldCBkZXNjcmlwdGlvbiBvZiBhbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uCi0gICAgICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAqLwotICAgIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotICAgIC8qKgotICAgICAqIENNSVMgMS4xOiBnZXQgZGVzY3JpcHRpb24gb2YgYW4gb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gZGVzY3JpcHRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSB1c2VyIHdobyBjcmVhdGVkIHRoZSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHVzZXIgd2hvIGNyZWF0ZWQgdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIFN0cmluZyBnZXRDcmVhdGVkQnkoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdXNlciB3aG8gbGFzdCBtb2RpZmllZCB0aGUgb2JqZWN0LiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJzaXN0LgotICAgICAqIHRoZSBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNyZWF0ZWRCeQotICAgICAqICAgICAgICAgICAgdXNlciB3aG8gbGFzdCBtb2RpZmllZCB0aGUgZG9jdW1lbnQKLSAgICAgKi8KLSAgICB2b2lkIHNldENyZWF0ZWRCeShTdHJpbmcgY3JlYXRlZEJ5KTsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSB1c2VyIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHVzZXIgd2hvIGxhc3QgbW9kaWZpZWQgdGhlIGRvY3VtZW50LgotICAgICAqLwotICAgIFN0cmluZyBnZXRNb2RpZmllZEJ5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHVzZXIgd2hvIGxhc3QgbW9kaWZpZWQgdGhlIG9iamVjdC4gVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyc2lzdC4KLSAgICAgKiB0aGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtb2RpZmllZEJ5Ci0gICAgICogICAgICAgICAgICB1c2VyIHdobyBsYXN0IG1vZGlmaWVkIHRoZSBkb2N1bWVudAotICAgICAqLwotICAgIHZvaWQgc2V0TW9kaWZpZWRCeShTdHJpbmcgbW9kaWZpZWRCeSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNyZWF0aW9uIGRhdGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBkYXRlIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgYXQKLSAgICAgKi8KLSAgICBHcmVnb3JpYW5DYWxlbmRhciBnZXRDcmVhdGVkQXQoKTsKLQotICAgIC8qKgotICAgICAqIEFzc2lnbiBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIG9iamVjdCB3YXMgY3JlYXRlZC4gVXN1YWxseSB5b3Ugc2hvdWxkIG5vdAotICAgICAqIGNhbGwgdGhpcyBtZXRob2QgZXh0ZXJuYWxseS4gVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyc2lzdCB0aGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBjcmVhdGVkQXQKLSAgICAgKiAgICAgICAgICAgIGRhdGUgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCBhdAotICAgICAqLwotICAgIHZvaWQgc2V0Q3JlYXRlZEF0KEdyZWdvcmlhbkNhbGVuZGFyIGNyZWF0ZWRBdCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIG9iamVjdCB3YXMgbGFzdCBtb2RpZmllZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGRhdGUgdGhlIG9iamVjdCB3YXMgbGFzdCBtb2RpZmllZAotICAgICAqLwotICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdldE1vZGlmaWVkQXQoKTsKLQotICAgIC8qKgotICAgICAqIEFzc2lnbiBjdXJyZW50IGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgb2JqZWN0IHdhcyBsYXN0IG1vZGlmaWVkLiBVc3VhbGx5Ci0gICAgICogeW91IHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCBleHRlcm5hbGx5LiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJzaXN0Ci0gICAgICogdGhlIG9iamVjdC4KLSAgICAgKi8KLSAgICB2b2lkIHNldE1vZGlmaWVkQXROb3coKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCBtb2RpZmljYXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhbGVuZGFyCi0gICAgICogICAgICAgICAgICB0aW1lc3RhbXAgb2YgbGFzdCBtb2RpZmljYXRpb24KLSAgICAgKi8KLSAgICB2b2lkIHNldE1vZGlmaWVkQXQoR3JlZ29yaWFuQ2FsZW5kYXIgY2FsZW5kYXIpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSByZXBvc2l0b3J5IGlkIG9mIHRoaXMgb2JqZWN0IHdoZXJlIHRoZSBvYmplY3QgaXMgc3RvcmVkLgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgIHJlcG9zaXRvcnkgaWQgb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UmVwb3NpdG9yeUlkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBc3NpZ24gYSByZXBvc2l0b3J5IHdoZXJlIHRoaXMgb2JqZWN0IHdpbGwgYmUgc3RvcmVkLiBUaGlzIG1ldGhvZCBkb2VzCi0gICAgICogbm90IHBlcnNpc3QgdGhlIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgcmVwb3NpdG9yeQotICAgICAqLwotICAgIHZvaWQgc2V0UmVwb3NpdG9yeUlkKFN0cmluZyByZXBvc2l0b3J5SWQpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIG1hcCBvZiBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBnZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBc3NpZ24gdGhlIHByb3BlcnRpZXMgdG8gYW4gb2JqZWN0LiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJzaXN0IHRoZQotICAgICAqIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcHMKLSAgICAgKiAgICAgICAgICAgIHByb3BlcnRpZXMgdG8gYmUgYXNzaWduZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhIGNoYW5nZSB0b2tlbiB1bmlxdWVseSBpZGVudGlmeWluZyB0aGUgc3RhdGUgb2YgdGhlIG9iamVjdCB3aGVuCi0gICAgICogaXQgd2FzIHBlcnNpc3RlZCAodXNlZCBmb3Igb3B0aW1pc3RpYyBsb2NraW5nKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBpZGVudGlmeWluZyB0aGUgY2hhbmdlIHRva2VuCi0gICAgICovCi0gICAgU3RyaW5nIGdldENoYW5nZVRva2VuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYWxsIHN5c3RlbSBiYXNlIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIHN0b3JlZCB3aXRoIGV2ZXJ5Ci0gICAgICogb2JqZWN0IGluIHRoZSByZXBvc2l0b3J5IFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgbmV3IG9iamVjdCBpcwotICAgICAqIGNyZWF0ZWQgdG8gcmVjb3JkIGFsbCBvZiB0aGUgY2FwdHVyaW5nIGRhdGEgbGlrZSB0aGUgY3JlYXRpb24gdGltZSwKLSAgICAgKiBjcmVhdG9yIGV0Yy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgVGhlIHByb3BlcnRpZXMgcGFzc2VkIGJ5IHRoZSBjbGllbnQsIGNvbnRhaW5pbmcsIG5hbWUsIHR5cGUsCi0gICAgICogICAgICAgICAgICBldGMKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqICAgICAgICAgICAgVGhlIHVzZXIgY3JlYXRpbmcgdGhlIGRvY3VtZW50Ci0gICAgICovCi0gICAgdm9pZCBjcmVhdGVTeXN0ZW1CYXNlUHJvcGVydGllc1doZW5DcmVhdGVkKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIGFsbCBzeXN0ZW0gYmFzZSBwcm9wZXJ0aWVzIHRoYXQgbmVlZCB0byBiZSBzdG9yZWQgd2l0aCBldmVyeQotICAgICAqIG9iamVjdCBpbiB0aGUgcmVwb3NpdG9yeSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBvYmplY3QgaXMgaXMKLSAgICAgKiB1cGRhdGVkIHRvIHJlY29yZCBhbGwgb2YgdGhlIGNhcHR1cmluZyBkYXRhIGxpa2UgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLAotICAgICAqIHVwZGF0aW5nIHVzZXIgZXRjLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBwYXNzZWQgYnkgdGhlIGNsaWVudCwgY29udGFpbmluZywgbmFtZSwgdHlwZSwKLSAgICAgKiAgICAgICAgICAgIGV0YwotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICBUaGUgdXNlciBjcmVhdGluZyB0aGUgZG9jdW1lbnQKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbk1vZGlmaWVkKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogZmlsbCBhIHBhc3NlZCBtYXAgb2JqZWN0IHdpdGggcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgbWFwIHRvIGZpbGwKLSAgICAgKiBAcGFyYW0gb2JqRmFjdG9yeQotICAgICAqICAgICAgICAgICAgb2JqZWN0IGZhY3RvcnkgdG8gY3JlYXRlIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gcmVxdWVzdGVkSWRzCi0gICAgICogICAgICAgICAgICBsaXN0IG9mIHByb3BlcnR5IGlkcyBiZWluZyByZXF1ZXN0ZWQKLSAgICAgKi8KLSAgICB2b2lkIGZpbGxQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgQmluZGluZ3NPYmplY3RGYWN0b3J5IG9iakZhY3RvcnksCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzKTsKLQotICAgIC8qKgotICAgICAqIFNldCBhbGwgcHJvcGVydGllcyB3aGljaCBhcmUgbm90IHN5c3RlbSBwcm9wZXJ0aWVzLiBUaGVzZSBhcmUgdGhlCi0gICAgICogcHJvcGVydGllcyBhcyBkZWZpbmVkIGluIFR5cGUgc3lzdGVtIGRlZmluaXRpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZAotICAgICAqIHdoZW4gYW4gb2JqZWN0IGlzIGNyZWF0ZWQgb3IgdXBkYXRlZC4gVGhlIGltcGxlbWVudGF0aW9uIG11c3QgaWdub3JlIHRoZQotICAgICAqIHN5c3RlbSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICBTZXQgb2YgcHJvcGVydGllcyBhcyBzZXQgYnkgdGhlIGNsaWVudCwgaW5jbHVkaW5nIHN5c3RlbQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVycwotICAgICAqLwotICAgIHZvaWQgc2V0Q3VzdG9tUHJvcGVydGllcyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMpOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBBY2wgaWQgb2YgdGhlIHN0b3JlZCBvYmplY3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBhY2wgaWQgb2YgdGhlIEFDbCBvZiB0aGlzIG9iamVjdAotICAgICAqLwotICAgIGludCBnZXRBY2xJZCgpOwotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBhbGxvd2FibGUgYWN0aW9ucyBvZiB0aGUgb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIHJlcXVlc3RpbmcgYWxsb3dhYmxlIGFjdGlvbnMKLSAgICAgKiBAcmV0dXJuIGFsbG93YWJsZSBhY3Rpb25zIG9mIHRoaXMgb2JqZWN0IGZvciB0aGUgdXNlCi0gICAgICovCi0gICAgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKFN0cmluZyB1c2VyKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIGlmIHRoZSBkb2N1bWVudCBjYW4gZ2VuZXJhdGUgYSByZW5kaXRpb25zIGFuZCByZW5kaXRpb24gaXMgdmlzaWJsZQotICAgICAqIGZvciB1c2VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIHJlcXVlc3RpbmcgYWxsb3dhYmxlIGFjdGlvbnMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVuZGl0aW9uIGV4aXN0cywgZmFsc2UgaWYgbm90LgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzUmVuZGl0aW9uKFN0cmluZyB1c2VyKTsKLQotICAgIC8qKgotICAgICAqIGdldCBhcHBsaWVkIHBvbGljaWVzIG9mIHRoaXMgb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gbGlzdCBvZiBpZHMgb2YgcG9saWNpZXMgYXBwbGllZCB0byB0aGlzIG9iamVjdAotICAgICAqLwotICAgIExpc3Q8U3RyaW5nPiBnZXRBcHBsaWVkUG9saWNpZXMoKTsKLQotICAgIC8qKgotICAgICAqIGFkZCBhbiBpZCBvZiBhIHBvbGljeSB0byBhbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvbGljeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiBwb2xpY3kgdG8gYWRkCi0gICAgICovCi0gICAgdm9pZCBhZGRBcHBsaWVkUG9saWN5KFN0cmluZyBwb2xpY3lJZCk7Ci0KLSAgICAvKioKLSAgICAgKiByZW1vdmUgYW4gaWQgb2YgYSBwb2xpY3kgZnJvbSBhbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHBvbGljeUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiBwb2xpY3kgdG8gcmVtb3ZlCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVQb2xpY3koU3RyaW5nIHBvbGljeUlkKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvVHlwZU1hbmFnZXJDcmVhdGFibGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvVHlwZU1hbmFnZXJDcmVhdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0NTYwOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovYXBpL1R5cGVNYW5hZ2VyQ3JlYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7DQotDQotLyoqDQotICogRXh0ZW5zaW9uIG9mIFR5cGVNYW5hZ2VyIGludGVyZmFjZSB0byBhZGQgdHlwZSBtdXRhYmlsaXR5Lg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZU1hbmFnZXJDcmVhdGFibGUgZXh0ZW5kcyBUeXBlTWFuYWdlciB7DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGQgYSB0eXBlIHRvIHRoZSB0eXBlIHN5c3RlbS4gQWRkIGFsbCBwcm9wZXJ0aWVzIGZyb20gaW5oZXJpdGVkIHR5cGVzLA0KLSAgICAgKiBhZGQgdHlwZSB0byBjaGlsZHJlbiBvZiBwYXJlbnQgdHlwZXMuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdHlwZURlZmluaXRpb24NCi0gICAgICogICAgICAgICAgICBuZXcgdHlwZSB0byBhZGQNCi0gICAgICogQHBhcmFtIGFkZEluaGVyaXRlZFByb3BlcnRpZXMNCi0gICAgICogICAgICAgICAgICBhZGQgcHJvcGVydGllcyBmcm9tIHN1cGVydHlwZSB0byB0eXBlIGRlZmluaXRpb24NCi0gICAgICovDQotICAgIHZvaWQgYWRkVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24sIGJvb2xlYW4gYWRkSW5oZXJpdGVkUHJvcGVydGllcyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBNb2RpZnkgYW4gZXhpc3RpbmcgdHlwZSBkZWZpbml0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHR5cGVEZWZpbml0aW9uDQotICAgICAqICAgICAgICAgICAgdHlwZSB0byBiZSBtb2RpZmllZA0KLSAgICAgKi8NCi0gICAgdm9pZCB1cGRhdGVUeXBlRGVmaW5pdGlvbihUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbik7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWxldGUgYSB0eXBlIGZyb20gdGhlIHR5cGUgc3lzdGVtLiBEZWxldGUgd2lsbCBzdWNjZWVkIG9ubHkgaWYgdHlwZSBpcw0KLSAgICAgKiBub3QgaW4gdXNlLiBPdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB0eXBlSWQNCi0gICAgICogICAgICAgICAgICBpZCBvZiB0eXBlIHRvIGJlIGRlbGV0ZWQNCi0gICAgICovDQotICAgIHZvaWQgZGVsZXRlVHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCk7DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvVmVyc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9WZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzMxZDMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIHZlcnNpb24gYWRkcyB0aGUgdmVyc2lvbiBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHRvIGFuIG9iamVjdC4KLSAqIEl0IGhhcyBtaW5vciBhbmQgbWFqb3IgdmVyc2lvbnMsIHN0b3JlcyBhIGNvbW1lbnQgYW5kIGhhcyBhIGxhYmVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZlcnNpb24gewotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgdGhpcyB2ZXJzaW9uIGlzIGEgbWFqb3IgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbWFqb3IgdmVyc2lvbiwgZmFsc2UgaWYgaXQgaXMgYSBtaW5vciB2ZXJzaW9uCi0gICAgICovCi0gICAgYm9vbGVhbiBpc01ham9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGlzIHZlcnNpb24gaXMgYSBwcml2YXRlIHdvcmtpbmcgY29weS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaXQgYSBQV0MsIGZhbHNlIGlmIG5vdAotICAgICAqLwotICAgIGJvb2xlYW4gaXNQd2MoKTsKLQotICAgIC8qKgotICAgICAqIG1ha2UgdGhlIHByaXZhdGUgd29ya2luZyBjb3B5IGFuIG9mZmljaWFsIHZlcnNpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGlzTWFqb3IKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgbWFqb3IgdmVyc2lvbiwgZmFsc2UgaWYgaXQgaXMgYSBtaW5vciB2ZXJzaW9uCi0gICAgICovCi0gICAgdm9pZCBjb21taXQoYm9vbGVhbiBpc01ham9yKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2hlY2suaW4gY29tbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tbWVudAotICAgICAqICAgICAgICAgICAgY2hlY2staW4gY29tbWVudAotICAgICAqLwotICAgIHZvaWQgc2V0Q2hlY2tpbkNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGVjay1pbiBjb21tZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gY2hlY2staW4gY29tbWVudAotICAgICAqLwotICAgIFN0cmluZyBnZXRDaGVja2luQ29tbWVudCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2ZXJzaW9uIGxhYmVsLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24gbGFiZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZlcnNpb25lZCBkb2N1bWVudCAocGFyZW50KSBvZiB0aGlzIHZlcnNpb24uCi0gICAgICogCi0gICAgICogQHJldHVybiB2ZXJzaW9uZWQgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBWZXJzaW9uZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9WZXJzaW9uZWREb2N1bWVudC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2FwaS9WZXJzaW9uZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2E5OGU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9hcGkvVmVyc2lvbmVkRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci0KLS8qKgotICogQSB2ZXJzaW9uIHNlcmllcyBpcyBhIGNvbmNyZXRlIG9iamVjdCAobWVhbmluZyBpdCBjYW4gYmUgc3RvcmVkKSBhbmQgaGFzCi0gKiBtZXRob2RzIGZvciBjaGVjay1vdXQgYW5kIGNoZWNraW4uIEl0IGhhcyBhIHBhdGggKGlzIGNvbnRhaW5lZCBpbiBhIGZvbGRlcikKLSAqIEluIGNvbnRyYXN0IHRvIGEgbm9uLXZlcnNpb25lZCBkb2N1bWVudCBpdCBoYXMgbm8gY29udGVudCwgYnV0IHZlcnNpb25zCi0gKiBpbnN0ZWFkLgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmVyc2lvbmVkRG9jdW1lbnQgZXh0ZW5kcyBGaWxpbmcsIFN0b3JlZE9iamVjdCB7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBuZXcgdmVyc2lvbiB0byB0aGlzIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEBwYXJhbSB2ZXJTdGF0ZQotICAgICAqICAgICAgICAgICAgdmVyc2lvbmluZyBzdGF0ZSBvZiBuZXcgdmVyc2lvbgotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIGFkZGluZyB0aGUgbmV3IHZlc2lvbgotICAgICAqIEByZXR1cm4gZG9jdW1lbnQgdmVyc2lvbiBhZGRlZAotICAgICAqLwotICAgIERvY3VtZW50VmVyc2lvbiBhZGRWZXJzaW9uKFZlcnNpb25pbmdTdGF0ZSB2ZXJTdGF0ZSwgU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogRGVsZXRlIGEgdmVyc2lvbiBmcm9tIHRoaXMgb2JqZWN0LCB0aHJvdyBleGNlcHRpb24gaWYgZG9jdW1lbnQgaXMgY2hlY2tlZAotICAgICAqIG91dCBvciBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIHRoaXMgdmVyc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbgotICAgICAqICAgICAgICAgICAgdmVyc2lvbiB0byBiZSByZW1vdmVkCi0gICAgICogQHJldHVybiB0cnVlIGlmIHZlcnNpb24gY291bGQgYmUgcmVtb3ZlZCwgYW5kIG90aGVyIHZlcnNpb25zIGV4aXN0LCBmYWxzZQotICAgICAqICAgICAgICAgaWYgdGhlIGRlbGV0ZWQgdmVyc2lvbiB3YXMgdGhlIGxhc3QgdmVyc2lvbiBpbiB0aGlzIGRvY3VtZW50Ci0gICAgICovCi0gICAgYm9vbGVhbiBkZWxldGVWZXJzaW9uKERvY3VtZW50VmVyc2lvbiB2ZXJzaW9uKTsKLQotICAgIC8qKgotICAgICAqIFRlc3QgaWYgY3VycmVudCBvYmplY3QgaXMgY2hlY2tlZC1vdXQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIGNoZWNrZWQtb3V0LCBmYWxzZSBpZiBub3QgY2hlY2tlZC1vdXQKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2hlY2tlZE91dCgpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIGEgY2hlY2stb3V0IG9wZXJhdGlvbiBhbmQgZGlzY2FyZCB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIHVzZXIgZG9pbmcgdGhlIGNhbmNlbCBjaGVjay1vdXQKLSAgICAgKi8KLSAgICB2b2lkIGNhbmNlbENoZWNrT3V0KFN0cmluZyB1c2VyKTsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSBjaGVjay1vdXQgb3BlcmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSB1c2VyCi0gICAgICogICAgICAgICAgICB1c2VyIHdobyBjaGVja3Mtb3V0Ci0gICAgICogQHJldHVybiBkb2N1bWVudCB2ZXJzaW9uIGJlaW5mIHRoZSBuZXcgcHJpdmF0ZSB3b3JraW5nIGNvcHkKLSAgICAgKi8KLSAgICBEb2N1bWVudFZlcnNpb24gY2hlY2tPdXQoU3RyaW5nIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaW4gYSBwcml2YXRlIHdvcmtpbmcgY29weS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNNYWpvcgotICAgICAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIGlzIGEgbWFqb3IgdmVyc2lvbgotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0gICAgICogICAgICAgICAgICBwcm9wZXJ0aWVzIHRvIHNldAotICAgICAqIEBwYXJhbSBjb250ZW50Ci0gICAgICogICAgICAgICAgICBjb250ZW50IG9mIHRoZSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBjaGVja2luQ29tbWVudAotICAgICAqICAgICAgICAgICAgY29tbWVudCB0byBhdHRhY2ggdG8gY2hlY2staW4KLSAgICAgKiBAcGFyYW0gcG9saWN5SWRzCi0gICAgICogICAgICAgICAgICBsaXN0IG9mIHBvbGljeSBpZHMgdG8gYWRkCi0gICAgICogQHBhcmFtIHVzZXIKLSAgICAgKiAgICAgICAgICAgIHVzZXIgd2hvIGRvZXMgdGhlIGNoZWNrLWluCi0gICAgICovCi0gICAgdm9pZCBjaGVja0luKGJvb2xlYW4gaXNNYWpvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBDb250ZW50U3RyZWFtIGNvbnRlbnQsIFN0cmluZyBjaGVja2luQ29tbWVudCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMsIFN0cmluZyB1c2VyKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgdmVyc2lvbnMgb2YgdGhpcyBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgZG9jdW1lbnQgdmVyc2lvbnMKLSAgICAgKi8KLSAgICBMaXN0PERvY3VtZW50VmVyc2lvbj4gZ2V0QWxsVmVyc2lvbnMoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFqb3IKLSAgICAgKiAgICAgICAgICAgIHRydWUgaWYgbGF0ZXN0IG1ham9yIHZlcnNpb24sIGZhbHNlIHRvIGluY2x1ZGUgbWlub3IgdmVyc2lvbnMKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgICAgICAgICBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQKLSAgICAgKi8KLSAgICBEb2N1bWVudFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbihib29sZWFuIG1ham9yKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdXNlciB3aG8gaGFzIGNoZWNrZWQgb3V0IHRoaXMgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB1c2VyIGlkIG9mIHVzZXIgd2hvIGhhcyBjaGVja2VkIG91dCB0aGlzIGRvY3VtZW50Ci0gICAgICovCi0gICAgU3RyaW5nIGdldENoZWNrZWRPdXRCeSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcml2YXRlIHdvcmtpbmcgY29weSBvZiB0aGlzIGRvY3VtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gcHJpdmF0ZSB3b3JraW5nIGNvcHkKLSAgICAgKi8KLSAgICBEb2N1bWVudFZlcnNpb24gZ2V0UHdjKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0NvbnRlbnRTdHJlYW1EYXRhSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvQ29udGVudFN0cmVhbURhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjBjZjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvQ29udGVudFN0cmVhbURhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbDsKLQotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNtaXNFeHRlbnNpb25FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5MYXN0TW9kaWZpZWRDb250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50U3RyZWFtRGF0YUltcGwgaW1wbGVtZW50cyBMYXN0TW9kaWZpZWRDb250ZW50U3RyZWFtIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX0tCID0gMTAyNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDB4RkZGRjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb250ZW50U3RyZWFtRGF0YUltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgdG90YWxMZW5ndGggPSAwTDsKLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHRvdGFsQ2FsbHMgPSAwTDsKLQotICAgIHByaXZhdGUgbG9uZyBmTGVuZ3RoOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZk1pbWVUeXBlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZkZpbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBieXRlW10gZkNvbnRlbnQ7Ci0KLSAgICBwcml2YXRlIEdyZWdvcmlhbkNhbGVuZGFyIGZMYXN0TW9kaWZpZWQ7Ci0KLSAgICBwcml2YXRlIGxvbmcgZlN0cmVhbUxpbWl0T2Zmc2V0OwotCi0gICAgcHJpdmF0ZSBsb25nIGZTdHJlYW1MaW1pdExlbmd0aDsKLQotICAgIHByaXZhdGUgZmluYWwgbG9uZyBzaXplTGltaXRLQjsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZG9Ob3RTdG9yZUNvbnRlbnQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRUb3RhbExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIHRvdGFsTGVuZ3RoOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluY3JlYXNlVG90YWxMZW5ndGgobG9uZyBsZW5ndGgpIHsKLSAgICAgICAgdG90YWxMZW5ndGggKz0gbGVuZ3RoOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGRlY3JlYXNlVG90YWxMZW5ndGgobG9uZyBsZW5ndGgpIHsKLSAgICAgICAgdG90YWxMZW5ndGggLT0gbGVuZ3RoOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBsb25nIGdldFRvdGFsQ2FsbHMoKSB7Ci0gICAgICAgIHJldHVybiB0b3RhbENhbGxzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGluY3JlYXNlVG90YWxDYWxscygpIHsKLSAgICAgICAgdG90YWxDYWxscysrOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtRGF0YUltcGwobG9uZyBtYXhBbGxvd2VkQ29udGVudFNpemVLQikgewotICAgICAgICBzaXplTGltaXRLQiA9IG1heEFsbG93ZWRDb250ZW50U2l6ZUtCOwotICAgICAgICBmTGVuZ3RoID0gMDsKLSAgICAgICAgZG9Ob3RTdG9yZUNvbnRlbnQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbURhdGFJbXBsKGxvbmcgbWF4QWxsb3dlZENvbnRlbnRTaXplS0IsIGJvb2xlYW4gZG9Ob3RTdG9yZSkgewotICAgICAgICBzaXplTGltaXRLQiA9IG1heEFsbG93ZWRDb250ZW50U2l6ZUtCOwotICAgICAgICBmTGVuZ3RoID0gMDsKLSAgICAgICAgZG9Ob3RTdG9yZUNvbnRlbnQgPSBkb05vdFN0b3JlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZTdHJlYW1MaW1pdE9mZnNldCA9IC0xOwotICAgICAgICBmU3RyZWFtTGltaXRMZW5ndGggPSAtMTsKLSAgICAgICAgaWYgKG51bGwgPT0gaW4pIHsKLSAgICAgICAgICAgIGZDb250ZW50ID0gbnVsbDsgLy8gZGVsZXRlIGNvbnRlbnQKLSAgICAgICAgICAgIGZMZW5ndGggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb250ZW50U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaW50IGxlbiA9IGluLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgIHdoaWxlIChsZW4gIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWRvTm90U3RvcmVDb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmTGVuZ3RoICs9IGxlbjsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZUxpbWl0S0IgPiAwICYmIGZMZW5ndGggPiBzaXplTGltaXRLQiAqIFNJWkVfS0IpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNvbnRlbnQgc2l6ZSBleGNlZWRzIG1heC4gYWxsb3dlZCBzaXplIG9mICIgKyBzaXplTGltaXRLQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIktCLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW4gPSBpbi5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRvTm90U3RvcmVDb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgZkNvbnRlbnQgPSBjb250ZW50U3RyZWFtLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgZkxlbmd0aCA9IGNvbnRlbnRTdHJlYW0uc2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGVudFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpbmNyZWFzZVRvdGFsTGVuZ3RoKGZMZW5ndGgpOwotICAgICAgICBpbmNyZWFzZVRvdGFsQ2FsbHMoKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzZXR0aW5nIGNvbnRlbnQgc3RyZWFtLCB0b3RhbCBubyBjYWxscyAiICsgZ2V0VG90YWxDYWxscygpICsgIi4iKTsKLSAgICAgICAgTE9HLmRlYnVnKCJzZXR0aW5nIGNvbnRlbnQgc3RyZWFtLCBuZXcgc2l6ZSB0b3RhbCAiICsgKGdldFRvdGFsTGVuZ3RoKCkgLyAoU0laRV9LQiAqIFNJWkVfS0IpKSArICJNQi4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRDb250ZW50KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChudWxsID09IGlzKSB7Ci0gICAgICAgICAgICByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY29udGVudFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgLy8gZmlyc3QgcmVhZCBleGlzdGluZyBzdHJlYW0KLSAgICAgICAgICAgIGlmICghZG9Ob3RTdG9yZUNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtLndyaXRlKGZDb250ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlY3JlYXNlVG90YWxMZW5ndGgoZkxlbmd0aCk7Ci0KLSAgICAgICAgICAgIC8vIHRoZW4gYXBwZW5kIG5ldyBjb250ZW50Ci0gICAgICAgICAgICBpbnQgbGVuID0gaXMucmVhZChidWZmZXIpOwotICAgICAgICAgICAgd2hpbGUgKGxlbiAhPSAtMSkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBsZW4pOwotICAgICAgICAgICAgICAgIGZMZW5ndGggKz0gbGVuOwotICAgICAgICAgICAgICAgIGlmIChzaXplTGltaXRLQiA+IDAgJiYgZkxlbmd0aCA+IHNpemVMaW1pdEtCICogU0laRV9LQikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ29udGVudCBzaXplIGV4Y2VlZHMgbWF4LiBhbGxvd2VkIHNpemUgb2YgIiArIHNpemVMaW1pdEtCCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiS0IuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxlbiA9IGlzLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZG9Ob3RTdG9yZUNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICBmQ29udGVudCA9IGNvbnRlbnRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZMZW5ndGggPSBjb250ZW50U3RyZWFtLnNpemUoKTsKLSAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5jcmVhc2VUb3RhbExlbmd0aChmTGVuZ3RoKTsKLSAgICAgICAgaW5jcmVhc2VUb3RhbENhbGxzKCk7Ci0gICAgICAgIExPRy5kZWJ1Zygic2V0dGluZyBjb250ZW50IHN0cmVhbSwgdG90YWwgbm8gY2FsbHMgIiArIGdldFRvdGFsQ2FsbHMoKSArICIuIik7Ci0gICAgICAgIExPRy5kZWJ1Zygic2V0dGluZyBjb250ZW50IHN0cmVhbSwgbmV3IHNpemUgdG90YWwgIiArIChnZXRUb3RhbExlbmd0aCgpIC8gKFNJWkVfS0IgKiBTSVpFX0tCKSkgKyAiTUIuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZkxlbmd0aDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YoZkxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZNaW1lVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgdGhpcy5mTWltZVR5cGUgPSBtaW1lVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gZkZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0aGlzLmZGaWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmRmlsZU5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFN0cmVhbSgpIHsKLSAgICAgICAgaWYgKGRvTm90U3RvcmVDb250ZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJhbmRvbUlucHV0U3RyZWFtKGZMZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobnVsbCA9PSBmQ29udGVudCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoZlN0cmVhbUxpbWl0T2Zmc2V0IDw9IDAgJiYgZlN0cmVhbUxpbWl0TGVuZ3RoIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZkNvbnRlbnQpOwotICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmQ29udGVudCwgKGludCkgKGZTdHJlYW1MaW1pdE9mZnNldCA8IDAgPyAwIDogZlN0cmVhbUxpbWl0T2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKGZTdHJlYW1MaW1pdExlbmd0aCA8IDAgPyBmTGVuZ3RoIDogZlN0cmVhbUxpbWl0TGVuZ3RoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQoR3JlZ29yaWFuQ2FsZW5kYXIgbGFzdE1vZGlmaWVkKSB7Ci0gICAgICAgIHRoaXMuZkxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0TGFzdE1vZGlmaWVkKCkgewotICAgICAgICByZXR1cm4gZkxhc3RNb2RpZmllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDbG9uZVdpdGhMaW1pdHMobG9uZyBvZmZzZXQsIGxvbmcgbGVuZ3RoKSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW1EYXRhSW1wbCBjbG9uZSA9IG5ldyBDb250ZW50U3RyZWFtRGF0YUltcGwoMCwgZG9Ob3RTdG9yZUNvbnRlbnQpOwotICAgICAgICBjbG9uZS5mRmlsZU5hbWUgPSBmRmlsZU5hbWU7Ci0gICAgICAgIGNsb25lLmZMZW5ndGggPSBsZW5ndGggPCAwID8gZkxlbmd0aCA6IE1hdGgubWluKGZMZW5ndGgsIGxlbmd0aCk7Ci0gICAgICAgIGNsb25lLmZDb250ZW50ID0gZkNvbnRlbnQ7Ci0gICAgICAgIGNsb25lLmZNaW1lVHlwZSA9IGZNaW1lVHlwZTsKLSAgICAgICAgY2xvbmUuZlN0cmVhbUxpbWl0T2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBjbG9uZS5mU3RyZWFtTGltaXRMZW5ndGggPSBjbG9uZS5mTGVuZ3RoOwotICAgICAgICBjbG9uZS5mTGFzdE1vZGlmaWVkID0gZkxhc3RNb2RpZmllZDsKLSAgICAgICAgcmV0dXJuIGNsb25lOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBieXRlW10gZ2V0Qnl0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBmQ29udGVudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZ2V0RXh0ZW5zaW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9ucyhMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBleHRlbnNpb25zKSB7Ci0gICAgICAgIC8vIG5vdCBpbXBsZW1lbnRlZAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0RvY3VtZW50SW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Yjk5NWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvRG9jdW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5CaW5kaW5nc09iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRmlsdGVyUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBJbk1lbW9yeSBTdG9yZWQgRG9jdW1lbnQgQSBkb2N1bWVudCBpcyBhIHN0b3JlZCBvYmplY3QgdGhhdCBoYXMgYSBwYXRoIGFuZAotICogKG9wdGlvbmFsKSBjb250ZW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEltcGwgZXh0ZW5kcyBGaWxpbmdJbXBsIGltcGxlbWVudHMgRG9jdW1lbnQgewotICAgIHByaXZhdGUgQ29udGVudFN0cmVhbSBmQ29udGVudDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEb2N1bWVudEltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHB1YmxpYyBEb2N1bWVudEltcGwoKSB7IC8vIHZpc2liaWxpdHkgc2hvdWxkIGJlIHBhY2thZ2UKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBnZXRDb250ZW50KCkgewotICAgICAgICByZXR1cm4gZkNvbnRlbnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudChDb250ZW50U3RyZWFtIGNvbnRlbnQpIHsKLSAgICAgICAgZkNvbnRlbnQgPSBjb250ZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZpbGxQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgQmluZGluZ3NPYmplY3RGYWN0b3J5IG9iakZhY3RvcnksCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzKSB7Ci0KLSAgICAgICAgc3VwZXIuZmlsbFByb3BlcnRpZXMocHJvcGVydGllcywgb2JqRmFjdG9yeSwgcmVxdWVzdGVkSWRzKTsKLQotICAgICAgICAvLyBmaWxsIHRoZSB2ZXJzaW9uIHJlbGF0ZWQgcHJvcGVydGllcyAodmVyc2lvbnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMKLSAgICAgICAgLy8gYnV0IHRoZSBzcGVjIHJlcXVpcmVzIHNvbWUKLSAgICAgICAgLy8gcHJvcGVydGllcyBhbHdheXMgdG8gYmUgc2V0Ci0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLklTX0lNTVVUQUJMRSwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuSVNfSU1NVVRBQkxFLAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEoUHJvcGVydHlJZHMuSVNfSU1NVVRBQkxFLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBjb250ZW50IHJlbGF0ZWQgcHJvcGVydGllcwotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUsIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKAotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUsIG51bGwgIT0gZkNvbnRlbnQgPyBmQ29udGVudC5nZXRGaWxlTmFtZSgpIDogKFN0cmluZykgbnVsbCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9JRCwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fSUQsCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0lELCAoU3RyaW5nKSBudWxsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IGZDb250ZW50ID8gZkNvbnRlbnQuZ2V0QmlnTGVuZ3RoKCkgOiBudWxsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFLCBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFLCBudWxsICE9IGZDb250ZW50ID8gZkNvbnRlbnQuZ2V0TWltZVR5cGUoKSA6IChTdHJpbmcpIG51bGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNwZWMgcmVxdWlyZXMgdmVyc2lvbmluZyBwcm9wZXJ0aWVzIGV2ZW4gZm9yIHVudmVyc2lvbmVkIGRvY3VtZW50cwotICAgICAgICAvLyBvdmVyd3JpdGUgdGhlIHZlcnNpb24gcmVsYXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQsCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQsIGdldElkKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLklTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VULAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsIGZhbHNlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0JZLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlksIChTdHJpbmcpIG51bGwpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lELAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lELCAoU3RyaW5nKSBudWxsKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5JU19MQVRFU1RfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OLCB0cnVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04sIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShQcm9wZXJ0eUlkcy5JU19NQUpPUl9WRVJTSU9OLCB0cnVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OLCB0cnVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLkNIRUNLSU5fQ09NTUVOVCwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5ULAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQsIChTdHJpbmcpIG51bGwpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCwgKFN0cmluZykgbnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ01JUyAxLjEKLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLklTX1BSSVZBVEVfV09SS0lOR19DT1BZLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5JU19QUklWQVRFX1dPUktJTkdfQ09QWSwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKFByb3BlcnR5SWRzLklTX1BSSVZBVEVfV09SS0lOR19DT1BZLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KCkgewotICAgICAgICByZXR1cm4gbnVsbCAhPSBmQ29udGVudDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVuZGl0aW9uKFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIHJldHVybiBSZW5kaXRpb25VdGlsLmhhc1JlbmRpdGlvbih0aGlzLCB1c2VyKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvRG9jdW1lbnRWZXJzaW9uSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvRG9jdW1lbnRWZXJzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQwMzhmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0RvY3VtZW50VmVyc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQmluZGluZ3NPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LkNvbmZpZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5Db25maWd1cmF0aW9uU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRmlsdGVyUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRG9jdW1lbnRWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuTXVsdGlGaWxpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5WZXJzaW9uZWREb2N1bWVudDsKLQotLyoqCi0gKiBBIGNsYXNzIHJlcHJlc2VudGluZyBhIHNpbmdsZSB2ZXJzaW9uIG9mIGEgZG9jdW1lbnQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50VmVyc2lvbkltcGwgZXh0ZW5kcyBTdG9yZWRPYmplY3RJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRWZXJzaW9uLCBNdWx0aUZpbGluZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nIE1BWF9DT05URU5UX1NJWkVfS0IgPSBDb25maWd1cmF0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uVmFsdWVBc0xvbmcoQ29uZmlnQ29uc3RhbnRzLk1BWF9DT05URU5UX1NJWkVfS0IpOwotCi0gICAgcHJpdmF0ZSBDb250ZW50U3RyZWFtIGZDb250ZW50OwotICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbmVkRG9jdW1lbnRJbXBsIGZDb250YWluZXI7IC8vIHRoZSBkb2N1bWVudCB0aGlzIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvbmdzIHRvCi0gICAgcHJpdmF0ZSBTdHJpbmcgZkNvbW1lbnQ7IC8vIGNoZWNraW4gY29tbWVudAotICAgIHByaXZhdGUgYm9vbGVhbiBmSXNNYWpvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZklzUHdjOyAvLyB0cnVlIGlmIHRoaXMgaXMgdGhlIFBXQwotCi0gICAgcHVibGljIERvY3VtZW50VmVyc2lvbkltcGwoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVmVyc2lvbmVkRG9jdW1lbnQgY29udGFpbmVyLCBWZXJzaW9uaW5nU3RhdGUgdmVyU3RhdGUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0UmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGZDb250YWluZXIgPSAoVmVyc2lvbmVkRG9jdW1lbnRJbXBsKSBjb250YWluZXI7Ci0gICAgICAgIGZJc01ham9yID0gdmVyU3RhdGUgPT0gVmVyc2lvbmluZ1N0YXRlLk1BSk9SIHx8IHZlclN0YXRlID09IG51bGw7Ci0gICAgICAgIGZJc1B3YyA9IHZlclN0YXRlID09IFZlcnNpb25pbmdTdGF0ZS5DSEVDS0VET1VUOwotICAgICAgICBmUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICAvLyBjb3B5IHVzZXIgcHJvcGVydGllcyBmcm9tIGxhdGVzdCB2ZXJzaW9uCi0gICAgICAgIERvY3VtZW50VmVyc2lvbkltcGwgc3JjID0gKERvY3VtZW50VmVyc2lvbkltcGwpIGNvbnRhaW5lci5nZXRMYXRlc3RWZXJzaW9uKGZhbHNlKTsKLSAgICAgICAgaWYgKG51bGwgIT0gc3JjICYmIG51bGwgIT0gc3JjLmZQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wIDogc3JjLmZQcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBmUHJvcGVydGllcy5wdXQocHJvcC5nZXRLZXkoKSwgcHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoQ29udGVudFN0cmVhbSBjb250ZW50KSB7Ci0gICAgICAgIHNldENvbnRlbnRJbnRlcm4oY29udGVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldENvbnRlbnRJbnRlcm4oQ29udGVudFN0cmVhbSBjb250ZW50KSB7Ci0gICAgICAgIGZDb250ZW50ID0gY29udGVudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2luQ29tbWVudChTdHJpbmcgY29tbWVudCkgewotICAgICAgICBmQ29tbWVudCA9IGNvbW1lbnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGVja2luQ29tbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGZDb21tZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVZlcnNpb25MYWJlbCgpIHsKLSAgICAgICAgaW50IG1ham9yTm8gPSAwOwotICAgICAgICBpbnQgbWlub3JObyA9IDA7Ci0gICAgICAgIExpc3Q8RG9jdW1lbnRWZXJzaW9uPiBhbGxWZXJzaW9ucyA9IGZDb250YWluZXIuZ2V0QWxsVmVyc2lvbnMoKTsKLSAgICAgICAgZm9yIChEb2N1bWVudFZlcnNpb24gdmVyIDogYWxsVmVyc2lvbnMpIHsKLSAgICAgICAgICAgIGlmICh2ZXIuaXNNYWpvcigpKSB7Ci0gICAgICAgICAgICAgICAgKyttYWpvck5vOwotICAgICAgICAgICAgICAgIG1pbm9yTm8gPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICArK21pbm9yTm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmVyID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbGFiZWwgPSBtYWpvck5vICsgIi4iICsgbWlub3JObzsKLSAgICAgICAgcmV0dXJuIGxhYmVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTWFqb3IoKSB7Ci0gICAgICAgIHJldHVybiBmSXNNYWpvciAmJiAhaXNQd2MoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1B3YygpIHsKLSAgICAgICAgcmV0dXJuIGZJc1B3YzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjb21taXQoYm9vbGVhbiBpc01ham9yKSB7Ci0gICAgICAgIGZJc1B3YyA9IGZhbHNlOyAvLyB1bnNldCB3b3JraW5nIGNvcHkgZmxhZwotICAgICAgICBmSXNNYWpvciA9IGlzTWFqb3I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIGZDb250ZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWZXJzaW9uZWREb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGZDb250YWluZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGF0ZXN0VmVyc2lvbigpIHsKLSAgICAgICAgTGlzdDxEb2N1bWVudFZlcnNpb24+IGFsbFZlcnMgPSBmQ29udGFpbmVyLmdldEFsbFZlcnNpb25zKCk7Ci0gICAgICAgIGJvb2xlYW4gaGFzUHdjID0gbnVsbCAhPSBmQ29udGFpbmVyLmdldFB3YygpOwotICAgICAgICBib29sZWFuIGlzTGF0ZXN0VmVyc2lvbjsKLSAgICAgICAgaWYgKGhhc1B3YykgewotICAgICAgICAgICAgLy8gQ01JUyAxLjEgZm9yYmlkcyBpdCBmb3IgUFdDCi0gICAgICAgICAgICBpc0xhdGVzdFZlcnNpb24gPSBhbGxWZXJzLnNpemUoKSA+IDEgJiYgYWxsVmVycy5nZXQoYWxsVmVycy5zaXplKCkgLSAyKS5lcXVhbHModGhpcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpc0xhdGVzdFZlcnNpb24gPSBhbGxWZXJzLmdldChhbGxWZXJzLnNpemUoKSAtIDEpLmVxdWFscyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGFzUHdjKSB7Ci0gICAgICAgICAgICAvLyBDTUlTIDEuMSBmb3JiaWRzIGl0IGZvciBQV0MKLSAgICAgICAgICAgIGlzTGF0ZXN0VmVyc2lvbiA9IGFsbFZlcnMuc2l6ZSgpID4gMSAmJiBhbGxWZXJzLmdldChhbGxWZXJzLnNpemUoKSAtIDIpLmVxdWFscyh0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzTGF0ZXN0VmVyc2lvbiA9IGFsbFZlcnMuZ2V0KGFsbFZlcnMuc2l6ZSgpIC0gMSkuZXF1YWxzKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0xhdGVzdFZlcnNpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGF0ZXN0TWFqb3JWZXJzaW9uKCkgewotICAgICAgICBpZiAoIWZJc01ham9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PERvY3VtZW50VmVyc2lvbj4gYWxsVmVyc2lvbnMgPSBmQ29udGFpbmVyLmdldEFsbFZlcnNpb25zKCk7Ci0gICAgICAgIERvY3VtZW50VmVyc2lvbiBsYXRlc3RNYWpvciA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChEb2N1bWVudFZlcnNpb24gdmVyIDogYWxsVmVyc2lvbnMpIHsKLSAgICAgICAgICAgIGlmICh2ZXIuaXNNYWpvcigpICYmICF2ZXIuaXNQd2MoKSkgewotICAgICAgICAgICAgICAgIGxhdGVzdE1ham9yID0gdmVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0xhdGVzdE1ham9yVmVyc2lvbiA9IGxhdGVzdE1ham9yID09IHRoaXM7Ci0gICAgICAgIHJldHVybiBpc0xhdGVzdE1ham9yVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaWxsUHJvcGVydGllcyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMsIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBvYmpGYWN0b3J5LAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3RlZElkcykgewotCi0gICAgICAgIERvY3VtZW50VmVyc2lvbiBwd2MgPSBmQ29udGFpbmVyLmdldFB3YygpOwotCi0gICAgICAgIC8vIEZpcnN0IGdldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgY29udGFpbmVyIChsaWtlIGN1c3RvbSB0eXBlCi0gICAgICAgIC8vIHByb3BlcnRpZXMsIGV0YykKLSAgICAgICAgZkNvbnRhaW5lci5maWxsUHJvcGVydGllcyhwcm9wZXJ0aWVzLCBvYmpGYWN0b3J5LCByZXF1ZXN0ZWRJZHMpOwotCi0gICAgICAgIC8vIG92ZXJ3cml0ZSB0aGUgdmVyc2lvbiBzcGVjaWZpYyBwcm9wZXJ0aWVzIChsaWtlIG1vZGlmaWNhdGlvbiBkYXRlLAotICAgICAgICAvLyB1c2VyLCBldGMuKQotICAgICAgICAvLyBhbmQgc2V0IHNvbWUgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgdmVyc2lvbgotICAgICAgICBzdXBlci5maWxsUHJvcGVydGllcyhwcm9wZXJ0aWVzLCBvYmpGYWN0b3J5LCByZXF1ZXN0ZWRJZHMpOwotCi0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLklTX0lNTVVUQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKFByb3BlcnR5SWRzLklTX0lNTVVUQUJMRSwgZmFsc2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbGwgdGhlIHZlcnNpb24gcmVsYXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5JU19MQVRFU1RfVkVSU0lPTiwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuSVNfTEFURVNUX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShQcm9wZXJ0eUlkcy5JU19MQVRFU1RfVkVSU0lPTiwgaXNMYXRlc3RWZXJzaW9uKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuSVNfTUFKT1JfVkVSU0lPTiwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuSVNfTUFKT1JfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04sIGZJc01ham9yKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OLCBpc0xhdGVzdE1ham9yVmVyc2lvbigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0lELCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCwgZkNvbnRhaW5lci5nZXRJZCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLklTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VULCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGFpbmVyLmlzQ2hlY2tlZE91dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0JZLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlksCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250YWluZXIuZ2V0Q2hlY2tlZE91dEJ5KCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KAotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2MgPT0gbnVsbCA/IG51bGwgOiBwd2MuZ2V0SWQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLkNIRUNLSU5fQ09NTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5ULCBmQ29tbWVudCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCBnZXRWZXJzaW9uTGFiZWwoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBjb250ZW50IHJlbGF0ZWQgcHJvcGVydGllcwotICAgICAgICBpZiAobnVsbCAhPSBmQ29udGVudCkgewotICAgICAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudC5nZXRGaWxlTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fSUQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0lELCAoU3RyaW5nKSBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RILCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RILCBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9MRU5HVEgsIGZDb250ZW50LmdldEJpZ0xlbmd0aCgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50LmdldE1pbWVUeXBlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENNSVMgMS4xCi0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5JU19QUklWQVRFX1dPUktJTkdfQ09QWSwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuSVNfUFJJVkFURV9XT1JLSU5HX0NPUFksCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShQcm9wZXJ0eUlkcy5JU19QUklWQVRFX1dPUktJTkdfQ09QWSwgaXNQd2MoKSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEFjbElkKCkgewotICAgICAgICByZXR1cm4gKChTdG9yZWRPYmplY3RJbXBsKSBmQ29udGFpbmVyKS5nZXRBY2xJZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFjbElkKGludCBpZCkgewotICAgICAgICAoKFN0b3JlZE9iamVjdEltcGwpIGZDb250YWluZXIpLnNldEFjbElkKGlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmVudElkcygpIHsKLSAgICAgICAgcmV0dXJuIGZDb250YWluZXIuZ2V0UGFyZW50SWRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoU2VnbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGZDb250YWluZXIuZ2V0UGF0aFNlZ21lbnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50KCkgewotICAgICAgICByZXR1cm4gbnVsbCAhPSBmQ29udGVudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBmQ29udGFpbmVyLmhhc1BhcmVudCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCkgewotICAgICAgICByZXR1cm4gY3JlYXRlVmVyc2lvbkxhYmVsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGFyZW50SWQoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIGZDb250YWluZXIuYWRkUGFyZW50SWQocGFyZW50SWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmVudElkKFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBmQ29udGFpbmVyLnJlbW92ZVBhcmVudElkKHBhcmVudElkKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0ZpbGluZ0ltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0ZpbGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliMTk1Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9GaWxpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5GaWxlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk11bHRpRmlsaW5nOwotCi1wdWJsaWMgY2xhc3MgRmlsaW5nSW1wbCBleHRlbmRzIFN0b3JlZE9iamVjdEltcGwgaW1wbGVtZW50cyBGaWxlYWJsZSwgTXVsdGlGaWxpbmcgewotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyZW50SWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEpOwotCi0gICAgRmlsaW5nSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmVudElkcygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudElkczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiAhKG51bGwgPT0gcGFyZW50SWRzIHx8IHBhcmVudElkcy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFNlZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGFyZW50SWQoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIHBhcmVudElkcy5hZGQocGFyZW50SWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmVudElkKFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBwYXJlbnRJZHMucmVtb3ZlKHBhcmVudElkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9Gb2xkZXJJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9Gb2xkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NjM4MzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvRm9sZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5GaWx0ZXJQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRm9sZGVySW1wbCBleHRlbmRzIFN0b3JlZE9iamVjdEltcGwgaW1wbGVtZW50cyBGb2xkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGaWxpbmdJbXBsLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50SWQ7Ci0KLSAgICBwdWJsaWMgRm9sZGVySW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9sZGVySW1wbChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGluaXQobmFtZSwgcGFyZW50SWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZpbGxQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgQmluZGluZ3NPYmplY3RGYWN0b3J5IG9iakZhY3RvcnksCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzKSB7Ci0KLSAgICAgICAgc3VwZXIuZmlsbFByb3BlcnRpZXMocHJvcGVydGllcywgb2JqRmFjdG9yeSwgcmVxdWVzdGVkSWRzKTsKLQotICAgICAgICAvLyBhZGQgZm9sZGVyIHNwZWNpZmljIHByb3BlcnRpZXMKLQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuUEFSRU5UX0lELCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5QQVJFTlRfSUQsIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuUEFSRU5UX0lELCBwYXJlbnRJZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLkFMTE9XRURfQ0hJTERfT0JKRUNUX1RZUEVfSURTLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWxsb3dlZENoaWxkT2JqZWN0cyA9IG51bGw7IC8vIFRPRE86IG5vdCB5ZXQgc3VwcG9ydGVkCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5BTExPV0VEX0NISUxEX09CSkVDVF9UWVBFX0lEUywKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5BTExPV0VEX0NISUxEX09CSkVDVF9UWVBFX0lEUywgYWxsb3dlZENoaWxkT2JqZWN0cykpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMoKSB7Ci0gICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IHRoaXMuCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc1JlbmRpdGlvbihTdHJpbmcgdXNlcikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmVudElkcygpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBhcmVudElkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGwgIT0gcGFyZW50SWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRJZCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudElkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFNlZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50SWQoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDsKLSAgICB9Ci0KLSAgICAvLyBIZWxwZXIgZnVuY3Rpb25zCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKE5hbWVWYWxpZGF0b3IuRVJST1JfSUxMRUdBTF9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9JbWFnZVRodW1ibmFpbEdlbmVyYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvSW1hZ2VUaHVtYm5haWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjOGI4Yy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9JbWFnZVRodW1ibmFpbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbDsKLQotaW1wb3J0IGphdmEuYXd0LkFscGhhQ29tcG9zaXRlOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ29udGVudFN0cmVhbUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBJbWFnZVRodW1ibmFpbEdlbmVyYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9MRU5HVEggPSAxMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkRJVElPTl9NSU1FX1RZUEUgPSAiaW1hZ2UvanBlZyI7OwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW1hZ2U7Ci0gICAgcHJpdmF0ZSBpbnQgdGh1bWJXaWR0aDsKLSAgICBwcml2YXRlIGludCB0aHVtYkhlaWdodDsKLQotICAgIHB1YmxpYyBJbWFnZVRodW1ibmFpbEdlbmVyYXRvcihJbnB1dFN0cmVhbSBpbWFnZUNvbnRlbnQpIHsKLSAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlQ29udGVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFdpZHRoKCkgewotICAgICAgICByZXR1cm4gdGh1bWJXaWR0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIHRodW1iSGVpZ2h0OwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldFJlbmRpdGlvbihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgYnl0ZVtdIHRodW1ibmFpbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRodW1ibmFpbCA9IHNjYWxlSW1hZ2UoaW1hZ2UsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgQ29udGVudFN0cmVhbUltcGwgY3MgPSBuZXcgQ29udGVudFN0cmVhbUltcGwoKTsKLSAgICAgICAgICAgIGNzLnNldEZpbGVOYW1lKCJ0aHVtYm5haWwuanBnIik7Ci0gICAgICAgICAgICBjcy5zZXRNaW1lVHlwZShSRU5ESVRJT05fTUlNRV9UWVBFKTsKLSAgICAgICAgICAgIGNzLnNldFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGh1bWJuYWlsKSk7Ci0gICAgICAgICAgICBjcy5zZXRMZW5ndGgoQmlnSW50ZWdlci52YWx1ZU9mKHRodW1ibmFpbC5sZW5ndGgpKTsKLSAgICAgICAgICAgIHJldHVybiBjczsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2VuZXJhdGUgdGh1bWJuYWlsIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBzY2FsZUltYWdlKElucHV0U3RyZWFtIHN0cmVhbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgcmVzaXplZEltYWdlOwotICAgICAgICBCdWZmZXJlZEltYWdlIG9yaWdpbmFsSW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsKLQotICAgICAgICBpZiAod2lkdGggPD0gMCkgewotICAgICAgICAgICAgcmVzaXplZEltYWdlID0gc2NhbGVMb25nZXJTaWRlVG8ob3JpZ2luYWxJbWFnZSwgaGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIGlmIChoZWlnaHQgPD0gMCkgewotICAgICAgICAgICAgcmVzaXplZEltYWdlID0gc2NhbGVMb25nZXJTaWRlVG8ob3JpZ2luYWxJbWFnZSwgd2lkdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzaXplZEltYWdlID0gc2NhbGVJbWFnZShvcmlnaW5hbEltYWdlLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRodW1iV2lkdGggPSByZXNpemVkSW1hZ2UuZ2V0V2lkdGgoKTsKLSAgICAgICAgdGh1bWJIZWlnaHQgPSByZXNpemVkSW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgcmV0dXJuIHN0b3JlSW1hZ2VpbkJ5dGVBcnJheShyZXNpemVkSW1hZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgQnVmZmVyZWRJbWFnZSBzY2FsZUxvbmdlclNpZGVUbyhCdWZmZXJlZEltYWdlIGJpLCBpbnQgbG9uZ2VyU2lkZUxlbmd0aFBhcmFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgaW50IGxvbmdlclNpZGVMZW5ndGggPSBsb25nZXJTaWRlTGVuZ3RoUGFyYW07Ci0KLSAgICAgICAgaWYgKGxvbmdlclNpZGVMZW5ndGggPD0gMCkgewotICAgICAgICAgICAgbG9uZ2VyU2lkZUxlbmd0aCA9IERFRkFVTFRfTEVOR1RIOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJpLmdldFdpZHRoKCkgPiBiaS5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgd2lkdGggPSBsb25nZXJTaWRlTGVuZ3RoOwotICAgICAgICAgICAgaGVpZ2h0ID0gYmkuZ2V0SGVpZ2h0KCkgKiBsb25nZXJTaWRlTGVuZ3RoIC8gYmkuZ2V0V2lkdGgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhlaWdodCA9IGxvbmdlclNpZGVMZW5ndGg7Ci0gICAgICAgICAgICB3aWR0aCA9IGJpLmdldFdpZHRoKCkgKiBsb25nZXJTaWRlTGVuZ3RoIC8gYmkuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJlZEltYWdlIHJlc2l6ZWRJbWFnZSA9IHNjYWxlSW1hZ2UoYmksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICByZXR1cm4gcmVzaXplZEltYWdlOwotICAgIH0KLQotICAgIHByaXZhdGUgQnVmZmVyZWRJbWFnZSBzY2FsZUltYWdlKEJ1ZmZlcmVkSW1hZ2Ugb3JpZ2luYWxJbWFnZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0KLSAgICAgICAgQnVmZmVyZWRJbWFnZSByZXNpemVkSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZSh3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEltYWdlLmdldFR5cGUoKSk7Ci0gICAgICAgIEdyYXBoaWNzMkQgZyA9IHJlc2l6ZWRJbWFnZS5jcmVhdGVHcmFwaGljcygpOwotCi0gICAgICAgIGcuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfSU5URVJQT0xBVElPTiwgUmVuZGVyaW5nSGludHMuVkFMVUVfSU5URVJQT0xBVElPTl9CSUxJTkVBUik7Ci0gICAgICAgIGcuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfUkVOREVSSU5HLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9SRU5ERVJfUVVBTElUWSk7Ci0gICAgICAgIGcuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfQU5USUFMSUFTSU5HLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOwotCi0gICAgICAgIGcuZHJhd0ltYWdlKG9yaWdpbmFsSW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIG51bGwpOwotICAgICAgICBnLmRpc3Bvc2UoKTsKLSAgICAgICAgZy5zZXRDb21wb3NpdGUoQWxwaGFDb21wb3NpdGUuU3JjKTsKLQotICAgICAgICByZXR1cm4gcmVzaXplZEltYWdlOwotICAgIH0KLQotICAgIHByaXZhdGUgYnl0ZVtdIHN0b3JlSW1hZ2VpbkJ5dGVBcnJheShCdWZmZXJlZEltYWdlIGJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgYm9vbGVhbiBvayA9IEltYWdlSU8ud3JpdGUoYmksICJKUEciLCBvcyk7Ci0gICAgICAgIGlmIChvaykgewotICAgICAgICAgICAgcmV0dXJuIG9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvSW5NZW1vcnlBY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0luTWVtb3J5QWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWE1MjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvSW5NZW1vcnlBY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeUFjZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk9OWU1PVVMgPSAiYW5vbnltb3VzIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWU9ORSA9ICJhbnlvbmUiOw0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcmluY2lwYWxJZDsNCi0gICAgcHJpdmF0ZSBQZXJtaXNzaW9uIHBlcm1pc3Npb247DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEluTWVtb3J5QWNlIERFRkFVTFRfQUNFID0gbmV3IEluTWVtb3J5QWNlKEluTWVtb3J5QWNlLmdldEFueW9uZVVzZXIoKSwgUGVybWlzc2lvbi5BTEwpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBbnlvbmVVc2VyKCkgew0KLSAgICAgICAgcmV0dXJuIEFOWU9ORTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBbm9ueW1vdXNVc2VyKCkgew0KLSAgICAgICAgcmV0dXJuIEFOT05ZTU9VUzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEluTWVtb3J5QWNlIGdldERlZmF1bHRBY2UoKSB7DQotICAgICAgICByZXR1cm4gREVGQVVMVF9BQ0U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEluTWVtb3J5QWNlKEFjZSBjb21tb25zQWNlKSB7DQotICAgICAgICBpZiAobnVsbCA9PSBjb21tb25zQWNlIHx8IG51bGwgPT0gY29tbW9uc0FjZS5nZXRQcmluY2lwYWxJZCgpIHx8IG51bGwgPT0gY29tbW9uc0FjZS5nZXRQZXJtaXNzaW9ucygpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBJbk1lbW9yeUFjZSB3aXRoIG51bGwgdmFsdWUiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBwZXJtcyA9IGNvbW1vbnNBY2UuZ2V0UGVybWlzc2lvbnMoKTsNCi0gICAgICAgIGlmIChwZXJtcy5zaXplKCkgIT0gMSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluTWVtb3J5IG9ubHkgc3VwcG9ydHMgQUNFcyB3aXRoIGEgc2luZ2xlIHBlcm1pc3Npb24uIik7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgcGVybSA9IHBlcm1zLmdldCgwKTsNCi0gICAgICAgIHRoaXMucHJpbmNpcGFsSWQgPSBjb21tb25zQWNlLmdldFByaW5jaXBhbElkKCk7DQotICAgICAgICB0aGlzLnBlcm1pc3Npb24gPSBQZXJtaXNzaW9uLmZyb21DbWlzU3RyaW5nKHBlcm0pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbk1lbW9yeUFjZShTdHJpbmcgcHJpbmljcGFsSWQsIFBlcm1pc3Npb24gcGVybWlzc2lvbikgew0KLSAgICAgICAgaWYgKG51bGwgPT0gcHJpbmljcGFsSWQgfHwgbnVsbCA9PSBwZXJtaXNzaW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBJbk1lbW9yeUFjZSB3aXRoIG51bGwgdmFsdWUiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRoaXMucHJpbmNpcGFsSWQgPSBwcmluaWNwYWxJZDsNCi0gICAgICAgIHRoaXMucGVybWlzc2lvbiA9IHBlcm1pc3Npb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmluY2lwYWxJZCgpIHsNCi0gICAgICAgIHJldHVybiBwcmluY2lwYWxJZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGVybWlzc2lvbiBnZXRQZXJtaXNzaW9uKCkgew0KLSAgICAgICAgcmV0dXJuIHBlcm1pc3Npb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbihQZXJtaXNzaW9uIG5ld1Blcm1pc3Npb24pIHsNCi0gICAgICAgIHBlcm1pc3Npb24gPSBuZXdQZXJtaXNzaW9uOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KLSAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7DQotICAgICAgICBpbnQgcmVzdWx0ID0gMTsNCi0gICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChwZXJtaXNzaW9uID09IG51bGwpID8gMCA6IHBlcm1pc3Npb24uaGFzaENvZGUoKSk7DQotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgocHJpbmNpcGFsSWQgPT0gbnVsbCkgPyAwIDogcHJpbmNpcGFsSWQuaGFzaENvZGUoKSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAob2JqID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEluTWVtb3J5QWNlIG90aGVyID0gKEluTWVtb3J5QWNlKSBvYmo7DQotICAgICAgICBpZiAocGVybWlzc2lvbiAhPSBvdGhlci5wZXJtaXNzaW9uKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHByaW5jaXBhbElkID09IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAob3RoZXIucHJpbmNpcGFsSWQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmICghcHJpbmNpcGFsSWQuZXF1YWxzKG90aGVyLnByaW5jaXBhbElkKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhc1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtaXNzaW9uMikgew0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbi5jb21wYXJlVG8ocGVybWlzc2lvbjIpID49IDA7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gIkluTWVtb3J5QWNlIFtwcmluY2lwYWxJZD0iICsgcHJpbmNpcGFsSWQgKyAiLCBwZXJtaXNzaW9uPSIgKyBwZXJtaXNzaW9uICsgIl0iOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBY2UgdG9Db21tb25zQWNlKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sRW50cnlJbXBsKG5ldyBBY2Nlc3NDb250cm9sUHJpbmNpcGFsRGF0YUltcGwocHJpbmNpcGFsSWQpLA0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBlcm1pc3Npb24udG9DbWlzU3RyaW5nKCkpKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9Jbk1lbW9yeUFjbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvSW5NZW1vcnlBY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFiOGIwYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9Jbk1lbW9yeUFjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qDQoteCAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbExpc3RJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbk1lbW9yeUFjbCBpbXBsZW1lbnRzIENsb25lYWJsZSB7DQotDQotICAgIHByaXZhdGUgTGlzdDxJbk1lbW9yeUFjZT4gYWNsOw0KLSAgICBwcml2YXRlIGludCBpZDsNCi0NCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjZUNvbXBhcmF0b3I8VCBleHRlbmRzIEluTWVtb3J5QWNlPiBpbXBsZW1lbnRzIENvbXBhcmF0b3I8VD4gew0KLQ0KLSAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBvMSwgVCBvMikgew0KLSAgICAgICAgICAgIGlmIChudWxsID09IG8xIHx8IG51bGwgPT0gbzIpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG8xID09IG8yKSB7IC8vIE5PU09OQVINCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8xID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGludCByZXMgPSBvMS5nZXRQcmluY2lwYWxJZCgpLmNvbXBhcmVUbyhvMi5nZXRQcmluY2lwYWxJZCgpKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPD8gc3VwZXIgSW5NZW1vcnlBY2U+IENPTVAgPSBuZXcgQWNlQ29tcGFyYXRvcjxJbk1lbW9yeUFjZT4oKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5NZW1vcnlBY2wgREVGQVVMVF9BQ0wgPSBuZXcgSW5NZW1vcnlBY2wobmV3IEFycmF5TGlzdDxJbk1lbW9yeUFjZT4oKSB7DQotICAgICAgICB7DQotICAgICAgICAgICAgYWRkKEluTWVtb3J5QWNlLmdldERlZmF1bHRBY2UoKSk7DQotICAgICAgICB9DQotICAgIH0pOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEluTWVtb3J5QWNsIGNyZWF0ZUZyb21Db21tb25zQWNsKEFjbCBjb21tb25zQWNsKSB7DQotICAgICAgICBJbk1lbW9yeUFjbCBhY2wgPSBuZXcgSW5NZW1vcnlBY2woKTsNCi0gICAgICAgIGZvciAoQWNlIGNhY2UgOiBjb21tb25zQWNsLmdldEFjZXMoKSkgew0KLSAgICAgICAgICAgIGlmIChhY2wuaGFzUHJpbmNpcGFsKGNhY2UuZ2V0UHJpbmNpcGFsSWQoKSkpIHsNCi0gICAgICAgICAgICAgICAgUGVybWlzc2lvbiBwZXJtID0gYWNsLmdldFBlcm1pc3Npb24oY2FjZS5nZXRQcmluY2lwYWxJZCgpKTsNCi0gICAgICAgICAgICAgICAgUGVybWlzc2lvbiBuZXdQZXJtID0gUGVybWlzc2lvbi5mcm9tQ21pc1N0cmluZyhjYWNlLmdldFBlcm1pc3Npb25zKCkuZ2V0KDApKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBlcm0ub3JkaW5hbCgpID4gbmV3UGVybS5vcmRpbmFsKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGFjbC5zZXRQZXJtaXNzaW9uKGNhY2UuZ2V0UHJpbmNpcGFsSWQoKSwgbmV3UGVybSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBhY2wuYWRkQWNlKG5ldyBJbk1lbW9yeUFjZShjYWNlKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGFjbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIEluTWVtb3J5QWNsIGdldERlZmF1bHRBY2woKSB7DQotICAgICAgICByZXR1cm4gREVGQVVMVF9BQ0w7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEluTWVtb3J5QWNsKCkgew0KLSAgICAgICAgYWNsID0gbmV3IEFycmF5TGlzdDxJbk1lbW9yeUFjZT4oMyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEluTWVtb3J5QWNsKGZpbmFsIExpc3Q8SW5NZW1vcnlBY2U+IGFyZykgew0KLSAgICAgICAgdGhpcy5hY2wgPSBuZXcgQXJyYXlMaXN0PEluTWVtb3J5QWNlPihhcmcpOw0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLmFjbCwgQ09NUCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjbC5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIEluTWVtb3J5QWNlIGFjZSA9IGFjbC5nZXQoaSk7DQotICAgICAgICAgICAgaWYgKGFjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgQUNMcyB3aXRoIGEgbnVsbCBwcmluY2lwYWwgaWQgb3IgcGVybWlzc2lvbi4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjbC5zaXplKCkgLSAxOyBpKyspIHsNCi0gICAgICAgICAgICBpZiAoYWNsLmdldChpKS5lcXVhbHMoYWNsLmdldChpICsgMSkpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgQUNMcyB3aXRoIHNhbWUgcHJpbmNpcGFsIGlkIGluIG1vcmUgdGhhbiBvbmUgQUNFLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsNCi0gICAgICAgIHRoaXMuaWQgPSBpZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldElkKCkgew0KLSAgICAgICAgcmV0dXJuIGlkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEluTWVtb3J5QWNlPiBnZXRBY2VzKCkgew0KLSAgICAgICAgcmV0dXJuIGFjbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRBY2UoSW5NZW1vcnlBY2UgYWNlKSB7DQotICAgICAgICBpZiAoYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBmb3IgKEluTWVtb3J5QWNlIGFjZTIgOiBhY2wpIHsNCi0gICAgICAgICAgICBpZiAoYWNlMi5nZXRQcmluY2lwYWxJZCgpLmVxdWFscyhhY2UuZ2V0UHJpbmNpcGFsSWQoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGFjbC5hZGQoYWNlKTsNCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWNsLCBDT01QKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFjZShJbk1lbW9yeUFjZSBhY2UpIHsNCi0gICAgICAgIHJldHVybiBhY2wucmVtb3ZlKGFjZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgbWVyZ2VBY2woSW5NZW1vcnlBY2wgYWNsMikgew0KLSAgICAgICAgaWYgKGFjbDIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGZvciAoSW5NZW1vcnlBY2UgYWNlIDogYWNsMi5nZXRBY2VzKCkpIHsNCi0gICAgICAgICAgICBJbk1lbW9yeUFjZSBleGlzdGluZ0FjZSA9IGdldEFjZShhY2UuZ2V0UHJpbmNpcGFsSWQoKSk7DQotICAgICAgICAgICAgaWYgKGV4aXN0aW5nQWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgYWNsLmFkZChhY2UpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdBY2UuZ2V0UGVybWlzc2lvbigpLm9yZGluYWwoKSA8IGFjZS5nZXRQZXJtaXNzaW9uKCkub3JkaW5hbCgpKSB7DQotICAgICAgICAgICAgICAgIGV4aXN0aW5nQWNlLnNldFBlcm1pc3Npb24oYWNlLmdldFBlcm1pc3Npb24oKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0aGlzLmFjbCwgQ09NUCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBlcm1pc3Npb24gZ2V0UGVybWlzc2lvbihTdHJpbmcgcHJpbmNpcGFsSWQpIHsNCi0gICAgICAgIEluTWVtb3J5QWNlIGFjZSA9IGdldEFjZShwcmluY2lwYWxJZCk7DQotICAgICAgICByZXR1cm4gYWNlID09IG51bGwgPyBQZXJtaXNzaW9uLk5PTkUgOiBhY2UuZ2V0UGVybWlzc2lvbigpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgSW5NZW1vcnlBY2UgZ2V0QWNlKFN0cmluZyBwcmluY2lwYWxJZCkgew0KLSAgICAgICAgaWYgKG51bGwgPT0gcHJpbmNpcGFsSWQpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoSW5NZW1vcnlBY2UgYWNlIDogYWNsKSB7DQotICAgICAgICAgICAgaWYgKGFjZS5nZXRQcmluY2lwYWxJZCgpLmVxdWFscyhwcmluY2lwYWxJZCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFjZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQZXJtaXNzaW9uKFN0cmluZyBwcmluY2lwYWxJZCwgUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7DQotICAgICAgICBpZiAobnVsbCA9PSBwZXJtaXNzaW9uKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG51bGwgPT0gcHJpbmNpcGFsSWQpIHsNCi0gICAgICAgICAgICBmb3IgKEluTWVtb3J5QWNlIGFjZSA6IGFjbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoYWNlLmdldFByaW5jaXBhbElkKCkuZXF1YWxzKEluTWVtb3J5QWNlLmdldEFub255bW91c1VzZXIoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2UuaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoSW5NZW1vcnlBY2UgYWNlIDogYWNsKSB7DQotICAgICAgICAgICAgaWYgKGFjZS5nZXRQcmluY2lwYWxJZCgpLmVxdWFscyhwcmluY2lwYWxJZCkgfHwgYWNlLmdldFByaW5jaXBhbElkKCkuZXF1YWxzKEluTWVtb3J5QWNlLmdldEFueW9uZVVzZXIoKSkNCi0gICAgICAgICAgICAgICAgICAgIHx8IGFjZS5nZXRQcmluY2lwYWxJZCgpLmVxdWFscyhJbk1lbW9yeUFjZS5nZXRBbm9ueW1vdXNVc2VyKCkpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBhY2UuaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbihTdHJpbmcgcHJpbmNpcGFsSWQsIFBlcm1pc3Npb24gcGVybWlzc2lvbikgew0KLSAgICAgICAgZm9yIChJbk1lbW9yeUFjZSBhY2UgOiBhY2wpIHsNCi0gICAgICAgICAgICBpZiAoYWNlLmdldFByaW5jaXBhbElkKCkuZXF1YWxzKHByaW5jaXBhbElkKSkgew0KLSAgICAgICAgICAgICAgICBhY2Uuc2V0UGVybWlzc2lvbihwZXJtaXNzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHByaW5jaXBhbElkIGluIHNldFBlcm1pc3Npb246ICIgKyBwcmluY2lwYWxJZCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBzaXplKCkgew0KLSAgICAgICAgcmV0dXJuIGFjbC5zaXplKCk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQotICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsNCi0gICAgICAgIGludCByZXN1bHQgPSAxOw0KLSAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGFjbCA9PSBudWxsKSA/IDAgOiBhY2wuaGFzaENvZGUoKSk7DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBpZiAob2JqID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIEluTWVtb3J5QWNsIG90aGVyID0gKEluTWVtb3J5QWNsKSBvYmo7DQotICAgICAgICBpZiAoYWNsID09IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAob3RoZXIuYWNsICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoIWFjbC5lcXVhbHMob3RoZXIuYWNsKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuICJJbk1lbW9yeUFjbCBbYWNsPSIgKyBhY2wgKyAiXSI7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ByaW5jaXBhbChTdHJpbmcgcHJpbmNpcGFsSWQpIHsNCi0gICAgICAgIGZvciAoSW5NZW1vcnlBY2UgYWNlIDogYWNsKSB7DQotICAgICAgICAgICAgaWYgKGFjZS5nZXRQcmluY2lwYWxJZCgpLmVxdWFscyhwcmluY2lwYWxJZCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBY2wgdG9Db21tb25zQWNsKCkgew0KLSAgICAgICAgTGlzdDxBY2U+IGNvbW1vbnNBY2wgPSBuZXcgQXJyYXlMaXN0PEFjZT4oKTsNCi0gICAgICAgIGZvciAoSW5NZW1vcnlBY2UgbWVtQWNlIDogYWNsKSB7DQotICAgICAgICAgICAgY29tbW9uc0FjbC5hZGQobWVtQWNlLnRvQ29tbW9uc0FjZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKGNvbW1vbnNBY2wpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgSW5NZW1vcnlBY2wgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gew0KLSAgICAgICAgSW5NZW1vcnlBY2wgbmV3QWNsID0gbmV3IEluTWVtb3J5QWNsKGFjbCk7DQotICAgICAgICByZXR1cm4gbmV3QWNsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0luTWVtb3J5U2VydmljZVZhbGlkYXRvckltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL0luTWVtb3J5U2VydmljZVZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2ZmYxNS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9Jbk1lbW9yeVNlcnZpY2VWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuT2JqZWN0U3RvcmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuUG9saWN5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZWRPYmplY3Q7DQotDQotcHVibGljIGNsYXNzIEluTWVtb3J5U2VydmljZVZhbGlkYXRvckltcGwgZXh0ZW5kcyBCYXNlU2VydmljZVZhbGlkYXRvckltcGwgew0KLQ0KLSAgICBwdWJsaWMgSW5NZW1vcnlTZXJ2aWNlVmFsaWRhdG9ySW1wbChTdG9yZU1hbmFnZXIgc20pIHsNCi0gICAgICAgIHN1cGVyKHNtKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2NoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0b3JlZE9iamVjdCBjaGVja1N0YW5kYXJkUGFyYW1ldGVycyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQpOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnNBbGxvd051bGwoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgU3RvcmVkT2JqZWN0IGNoZWNrU3RhbmRhcmRQYXJhbWV0ZXJzQWxsb3dOdWxsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCkgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuY2hlY2tTdGFuZGFyZFBhcmFtZXRlcnNBbGxvd051bGwocmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNjaGVja0V4aXN0aW5nT2JqZWN0SWQNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuT2JqZWN0U3RvcmUsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIFN0b3JlZE9iamVjdCBjaGVja0V4aXN0aW5nT2JqZWN0SWQoT2JqZWN0U3RvcmUgb2JqU3RvcmUsIFN0cmluZyBvYmplY3RJZCkgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuY2hlY2tFeGlzdGluZ09iamVjdElkKG9ialN0b3JlLCBvYmplY3RJZCk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNjaGVja1BhcmFtcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBTdG9yZWRPYmplY3RbXSBjaGVja1BhcmFtcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQxLCBTdHJpbmcgb2JqZWN0SWQyKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3RbXSBzb3MgPSBzdXBlci5jaGVja1BhcmFtcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkMSwgb2JqZWN0SWQyKTsNCi0gICAgICAgIHJldHVybiBzb3M7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNnZXRSZXBvc2l0b3J5SW5mb3MNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZ2V0UmVwb3NpdG9yeUluZm9zKENhbGxDb250ZXh0IGNvbnRleHQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgc3VwZXIuZ2V0UmVwb3NpdG9yeUluZm9zKGNvbnRleHQsIGV4dGVuc2lvbik7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNnZXRSZXBvc2l0b3J5SW5mbw0KLSAgICAgKiAob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBnZXRSZXBvc2l0b3J5SW5mbyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIHN1cGVyLmdldFJlcG9zaXRvcnlJbmZvKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZXh0ZW5zaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldFR5cGVDaGlsZHJlbg0KLSAgICAgKiAob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBnZXRUeXBlQ2hpbGRyZW4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBzdXBlci5nZXRUeXBlQ2hpbGRyZW4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNnZXRUeXBlRGVzY2VuZGFudHMNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZ2V0VHlwZURlc2NlbmRhbnRzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgc3VwZXIuZ2V0VHlwZURlc2NlbmRhbnRzKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHRlbnNpb24pOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0VHlwZURlZmluaXRpb24NCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZ2V0VHlwZURlZmluaXRpb24oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBzdXBlci5nZXRUeXBlRGVmaW5pdGlvbihjb250ZXh0LCByZXBvc2l0b3J5SWQsIHR5cGVJZCwgZXh0ZW5zaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldENoaWxkcmVuKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRDaGlsZHJlbihDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuZ2V0Q2hpbGRyZW4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrUmVhZEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0RGVzY2VuZGFudHMob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldERlc2NlbmRhbnRzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldERlc2NlbmRhbnRzKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1JlYWRBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldEZvbGRlclRyZWUob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldEZvbGRlclRyZWUoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuZ2V0Rm9sZGVyVHJlZShjb250ZXh0LCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNnZXRPYmplY3RQYXJlbnRzDQotICAgICAqIChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0T2JqZWN0UGFyZW50cyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5nZXRPYmplY3RQYXJlbnRzKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1JlYWRBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldEZvbGRlclBhcmVudA0KLSAgICAgKiAob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldEZvbGRlclBhcmVudChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5nZXRGb2xkZXJQYXJlbnQoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrUmVhZEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0Q2hlY2tlZE91dERvY3MNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRDaGVja2VkT3V0RG9jcyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5nZXRDaGVja2VkT3V0RG9jcyhjb250ZXh0LCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBleHRlbnNpb24pOw0KLSAgICAgICAgaWYgKG51bGwgIT0gc28pIHsNCi0gICAgICAgICAgICBjaGVja1JlYWRBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2NyZWF0ZURvY3VtZW50KG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVEb2N1bWVudChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljeUlkcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3QgZm9sZGVyID0gc3VwZXIuY3JlYXRlRG9jdW1lbnQoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgcG9saWN5SWRzLCBleHRlbnNpb24pOw0KLSAgICAgICAgaWYgKG51bGwgIT0gZm9sZGVyKSB7DQotICAgICAgICAgICAgY2hlY2tXcml0ZUFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgZm9sZGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmb2xkZXI7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHNvdXJjZUlkLA0KLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljeUlkcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc291cmNlID0gc3VwZXIuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgc291cmNlSWQsIGZvbGRlcklkLCBwb2xpY3lJZHMsDQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1dyaXRlQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzb3VyY2UpOw0KLSAgICAgICAgcmV0dXJuIHNvdXJjZTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2NyZWF0ZUZvbGRlcihvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgY3JlYXRlRm9sZGVyKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljeUlkcywNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBwYXJlbnRGb2xkZXIgPSBzdXBlci5jcmVhdGVGb2xkZXIoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgcG9saWN5SWRzLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tXcml0ZUFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgcGFyZW50Rm9sZGVyKTsNCi0gICAgICAgIHJldHVybiBwYXJlbnRGb2xkZXI7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNjcmVhdGVSZWxhdGlvbnNoaXANCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdFtdIGNyZWF0ZVJlbGF0aW9uc2hpcChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsDQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldElkLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdFtdIHNvcyA9IHN1cGVyLmNyZWF0ZVJlbGF0aW9uc2hpcChjb250ZXh0LCByZXBvc2l0b3J5SWQsIHNvdXJjZUlkLCB0YXJnZXRJZCwgcG9saWN5SWRzLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzb3NbMF0pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzb3NbMV0pOw0KLSAgICAgICAgcmV0dXJuIHNvczsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2NyZWF0ZVBvbGljeShvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgY3JlYXRlUG9saWN5KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQWNsIGFkZEFjZXMsDQotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgaWYgKHBvbGljeUlkcyAhPSBudWxsICYmIHBvbGljeUlkcy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJBcHBseWluZyBwb2xpY2llcyB0byBwb2xpY2llcyBpcyBub3Qgc3VwcG9ydGVkLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGZvbGRlcklkICE9IG51bGwgJiYgZm9sZGVySWQubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQb2xpY2llcyBjYW5ub3QgYmUgY3JlYXRlZCBpbiBmb2xkZXJzLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGFkZEFjZXMgIT0gbnVsbCB8fCByZW1vdmVBY2VzICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIkFDTHMgb24gcG9saWNpZXMgYXJlIG5vdCBzdXBvcnRlZC4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHN1cGVyLmNyZWF0ZVBvbGljeShjb250ZXh0LCByZXBvc2l0b3J5SWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIGV4dGVuc2lvbik7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVJdGVtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICBTdG9yZWRPYmplY3QgZm9sZGVyID0gc3VwZXIuY3JlYXRlSXRlbShjb250ZXh0LCByZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY3lJZHMsIGFkZEFjZXMsDQotICAgICAgICAgICAgICAgIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7DQotICAgICAgICBpZiAobnVsbCAhPSBmb2xkZXIpIHsNCi0gICAgICAgICAgICBjaGVja1dyaXRlQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBmb2xkZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZvbGRlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldEFsbG93YWJsZUFjdGlvbnMNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRBbGxvd2FibGVBY3Rpb25zKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldEFsbG93YWJsZUFjdGlvbnMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrUmVhZEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0T2JqZWN0KG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRPYmplY3QoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldE9iamVjdChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNnZXRQcm9wZXJ0aWVzKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRQcm9wZXJ0aWVzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldFByb3BlcnRpZXMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrUmVhZEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0UmVuZGl0aW9ucyhvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0UmVuZGl0aW9ucyhDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5nZXRSZW5kaXRpb25zKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1JlYWRBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldE9iamVjdEJ5UGF0aA0KLSAgICAgKiAob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldE9iamVjdEJ5UGF0aChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcGF0aCwgDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5nZXRPYmplY3RCeVBhdGgoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBwYXRoLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNnZXRDb250ZW50U3RyZWFtDQotICAgICAqIChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0Q29udGVudFN0cmVhbShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldENvbnRlbnRTdHJlYW0oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgc3RyZWFtSWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1JlYWRBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI3VwZGF0ZVByb3BlcnRpZXMNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXIsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IHVwZGF0ZVByb3BlcnRpZXMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci51cGRhdGVQcm9wZXJ0aWVzKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1dyaXRlQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNtb3ZlT2JqZWN0KG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXIsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0W10gbW92ZU9iamVjdChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0Rm9sZGVySWQsIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3RbXSBzb3MgPSBzdXBlci5tb3ZlT2JqZWN0KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHRhcmdldEZvbGRlcklkLCBzb3VyY2VGb2xkZXJJZCwNCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrUmVhZEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc29zWzBdKTsNCi0gICAgICAgIGNoZWNrUmVhZEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc29zWzFdKTsNCi0gICAgICAgIGNoZWNrV3JpdGVBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvc1syXSk7DQotICAgICAgICByZXR1cm4gc29zOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZGVsZXRlT2JqZWN0KG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQm9vbGVhbiwNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZGVsZXRlT2JqZWN0KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmRlbGV0ZU9iamVjdChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrV3JpdGVBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2RlbGV0ZVRyZWUob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5Cb29sZWFuLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdCwNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZGVsZXRlVHJlZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsDQotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuZGVsZXRlVHJlZShjb250ZXh0LCByZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBhbGxWZXJzaW9ucywgdW5maWxlT2JqZWN0cywgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrV3JpdGVBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI3NldENvbnRlbnRTdHJlYW0NCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXIsDQotICAgICAqIGphdmEubGFuZy5Cb29sZWFuLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBzZXRDb250ZW50U3RyZWFtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLA0KLSAgICAgICAgICAgIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5zZXRDb250ZW50U3RyZWFtKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1dyaXRlQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNkZWxldGVDb250ZW50U3RyZWFtDQotICAgICAqIChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBkZWxldGVDb250ZW50U3RyZWFtKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuZGVsZXRlQ29udGVudFN0cmVhbShjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tXcml0ZUFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjY2hlY2tPdXQob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlciwNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXIpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjaGVja091dChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5jaGVja091dChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24sIGNvbnRlbnRDb3BpZWQpOw0KLSAgICAgICAgY2hlY2tXcml0ZUFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjY2FuY2VsQ2hlY2tPdXQob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGNhbmNlbENoZWNrT3V0KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmNhbmNlbENoZWNrT3V0KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1dyaXRlQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNjaGVja0luKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXIsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGNoZWNrSW4oQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEFjbCBhZGRBY2VzLA0KLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBMaXN0PFN0cmluZz4gcG9saWN5SWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmNoZWNrSW4oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWRkQWNlcywgcmVtb3ZlQWNlcywgcG9saWN5SWRzLCBleHRlbnNpb24pOw0KLQ0KLSAgICAgICAgaWYgKG51bGwgIT0gYWRkQWNlcyB8fCBudWxsICE9IHJlbW92ZUFjZXMpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIHNwZWNpZmljIEFDTHMgYXJlIG5vdCBzdXBwb3J0ZWQsIGFkZEFjZXMgYW5kIHJlbW92ZUFjZXMgbXVzdCBiZSBudWxsLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY2hlY2tXcml0ZUFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uDQotICAgICAqIChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1JlYWRBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24NCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLA0KLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNnZXRBbGxWZXJzaW9ucyhvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0QWxsVmVyc2lvbnMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLA0KLSAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuZ2V0QWxsVmVyc2lvbnMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNxdWVyeShvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHF1ZXJ5KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgc3VwZXIucXVlcnkoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBleHRlbnNpb24pOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0Q29udGVudENoYW5nZXMNCi0gICAgICogKG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0LA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgZ2V0Q29udGVudENoYW5nZXMoQ2FsbENvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBzdXBlci5nZXRDb250ZW50Q2hhbmdlcyhjb250ZXh0LCByZXBvc2l0b3J5SWQsIGV4dGVuc2lvbik7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNhZGRPYmplY3RUb0ZvbGRlcg0KLSAgICAgKiAob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5Cb29sZWFuLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdFtdIGFkZE9iamVjdFRvRm9sZGVyKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLA0KLSAgICAgICAgICAgIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0W10gc29zID0gc3VwZXIuYWRkT2JqZWN0VG9Gb2xkZXIoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzb3NbMF0pOw0KLSAgICAgICAgY2hlY2tXcml0ZUFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc29zWzFdKTsNCi0gICAgICAgIHJldHVybiBzb3M7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNyZW1vdmVPYmplY3RGcm9tRm9sZGVyDQotICAgICAqIChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3RbXSByZW1vdmVPYmplY3RGcm9tRm9sZGVyKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0W10gc29zID0gc3VwZXIucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrV3JpdGVBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvc1swXSk7DQotICAgICAgICBpZiAobnVsbCAhPSBmb2xkZXJJZCkgew0KLSAgICAgICAgICAgIGNoZWNrV3JpdGVBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvc1sxXSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc29zOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0T2JqZWN0UmVsYXRpb25zaGlwcw0KLSAgICAgKiAob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uLA0KLSAgICAgKiBqYXZhLmxhbmcuU3RyaW5nLA0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGEpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRPYmplY3RSZWxhdGlvbnNoaXBzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldE9iamVjdFJlbGF0aW9uc2hpcHMoY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgcmVsYXRpb25zaGlwRGlyZWN0aW9uLCB0eXBlSWQsDQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1JlYWRBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvKTsNCi0gICAgICAgIHJldHVybiBzbzsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIA0KLSAgICAgKiBAc2VlDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnNlcnZlci5CYXNlU2VydmljZVZhbGlkYXRvckltcGwNCi0gICAgICogI2dldEFjbChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0QWNsKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5nZXRBY2woY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrUmVhZEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjYXBwbHlBY2wob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb24sDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGFwcGx5QWNsKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5hcHBseUFjbChjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2xQcm9wYWdhdGlvbiwgZXh0ZW5zaW9uKTsNCi0gICAgICAgIGNoZWNrQWxsQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNhcHBseVBvbGljeShvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3RbXSBhcHBseVBvbGljeShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdFtdIHNvcyA9IHN1cGVyLmFwcGx5UG9saWN5KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOw0KLSAgICAgICAgaWYgKCEoc29zWzBdIGluc3RhbmNlb2YgUG9saWN5KSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJhcHBseVBvbGljeSBmYWlsZWQsICIgKyBwb2xpY3lJZCArICIgaXMgbm90IGEgcG9saWN5IGlkIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAoc29zWzFdIGluc3RhbmNlb2YgUG9saWN5KSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oImFwcGx5UG9saWN5IGZhaWxlZCwgIiArIG9iamVjdElkDQotICAgICAgICAgICAgICAgICAgICArICIgaXMgYSBwb2xpY3kgaWQuIEFwcGx5aW5nIHBvbGljaWVzIHRvIHBvbGljaWVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7DQotICAgICAgICB9DQotICAgICAgICBjaGVja0FsbEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc29zWzFdKTsNCi0gICAgICAgIHJldHVybiBzb3M7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNyZW1vdmVQb2xpY3kob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0W10gcmVtb3ZlUG9saWN5KENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLA0KLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0W10gc29zID0gc3VwZXIucmVtb3ZlUG9saWN5KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tBbGxBY2Nlc3MocmVwb3NpdG9yeUlkLCBjb250ZXh0LmdldFVzZXJuYW1lKCksIHNvc1sxXSk7DQotICAgICAgICByZXR1cm4gc29zOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogDQotICAgICAqIEBzZWUNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkJhc2VTZXJ2aWNlVmFsaWRhdG9ySW1wbA0KLSAgICAgKiAjZ2V0QXBwbGllZFBvbGljaWVzDQotICAgICAqIChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZ2V0QXBwbGllZFBvbGljaWVzKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwNCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0NCi0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IHN1cGVyLmdldEFwcGxpZWRQb2xpY2llcyhjb250ZXh0LCByZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOw0KLSAgICAgICAgY2hlY2tSZWFkQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNjcmVhdGUob3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQsDQotICAgICAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YSkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGNyZWF0ZShDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuY3JlYXRlKGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1dyaXRlQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNkZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0DQotICAgICAqIChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywNCi0gICAgICogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhKQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdG9yZWRPYmplY3QgZGVsZXRlT2JqZWN0T3JDYW5jZWxDaGVja091dChDYWxsQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotDQotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBzdXBlci5kZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0KGNvbnRleHQsIHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7DQotICAgICAgICBjaGVja1dyaXRlQWNjZXNzKHJlcG9zaXRvcnlJZCwgY29udGV4dC5nZXRVc2VybmFtZSgpLCBzbyk7DQotICAgICAgICByZXR1cm4gc287DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiANCi0gICAgICogQHNlZQ0KLSAgICAgKiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuQmFzZVNlcnZpY2VWYWxpZGF0b3JJbXBsDQotICAgICAqICNhcHBseUFjbChvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dCwNCi0gICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGFwcGx5QWNsKENhbGxDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCkgew0KLQ0KLSAgICAgICAgU3RvcmVkT2JqZWN0IHNvID0gc3VwZXIuYXBwbHlBY2woY29udGV4dCwgcmVwb3NpdG9yeUlkLCBvYmplY3RJZCk7DQotICAgICAgICBjaGVja0FsbEFjY2VzcyhyZXBvc2l0b3J5SWQsIGNvbnRleHQuZ2V0VXNlcm5hbWUoKSwgc28pOw0KLSAgICAgICAgcmV0dXJuIHNvOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVUeXBlKENhbGxDb250ZXh0IGNhbGxDb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsNCi0gICAgICAgIHN1cGVyLmNyZWF0ZVR5cGUoY2FsbENvbnRleHQsIHJlcG9zaXRvcnlJZCwgdHlwZSwgZXh0ZW5zaW9uKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIHVwZGF0ZVR5cGUoQ2FsbENvbnRleHQgY2FsbENvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiVXBkYXRpbmcgYSB0eXBlIGRlZmluaXRpb24gaXMgbm90IHN1cHBvcnRlZC4iKTsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGRlbGV0ZVR5cGUoQ2FsbENvbnRleHQgY2FsbENvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsDQotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZGVsZXRlVHlwZShjYWxsQ29udGV4dCwgcmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3RTdG9yZUltcGwgZ2V0T2JqZWN0U3RvcmUoU3RyaW5nIHJlcG9zaXRvcnlJZCkgew0KLSAgICAgICAgcmV0dXJuIChPYmplY3RTdG9yZUltcGwpIGZTdG9yZU1hbmFnZXIuZ2V0T2JqZWN0U3RvcmUocmVwb3NpdG9yeUlkKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tSZWFkQWNjZXNzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwcmluY2lwYWxJZCwgU3RvcmVkT2JqZWN0IHNvKSB7DQotICAgICAgICBnZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpLmNoZWNrUmVhZEFjY2VzcyhwcmluY2lwYWxJZCwgc28pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjaGVja1dyaXRlQWNjZXNzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwcmluY2lwYWxJZCwgU3RvcmVkT2JqZWN0IHNvKSB7DQotICAgICAgICBnZXRPYmplY3RTdG9yZShyZXBvc2l0b3J5SWQpLmNoZWNrV3JpdGVBY2Nlc3MocHJpbmNpcGFsSWQsIHNvKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbGxBY2Nlc3MoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHByaW5jaXBhbElkLCBTdG9yZWRPYmplY3Qgc28pIHsNCi0gICAgICAgIGdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCkuY2hlY2tBbGxBY2Nlc3MocHJpbmNpcGFsSWQsIHNvKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9JdGVtSW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvSXRlbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmOGQyMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9JdGVtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5GaWxpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5JdGVtOwotCi0vKioKLSAqIGl0ZW1JbXBsIGlzIHVzZWQgZm9yIENNSVM6aXRlbSBvYmplY3RzLiBJdGVtcyBhcmUgZmlsZWFibGUgYnV0IGRvIG5vdCBoYXZlCi0gKiBjb250ZW50Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1JbXBsIGV4dGVuZHMgRmlsaW5nSW1wbCBpbXBsZW1lbnRzIEl0ZW0sIEZpbGluZyB7Ci0KLSAgICBwdWJsaWMgSXRlbUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9PYmplY3RTdG9yZUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL09iamVjdFN0b3JlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQyNGM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL09iamVjdFN0b3JlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuQ29uZmlnQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LkNvbmZpZ3VyYXRpb25TZXR0aW5nczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkRvY3VtZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZpbGVhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRmlsaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuTXVsdGlGaWxpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5PYmplY3RTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlZE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlZlcnNpb25lZERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLkRlZmF1bHRUeXBlU3lzdGVtQ3JlYXRvcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBvYmplY3Qgc3RvcmUgaXMgdGhlIGNlbnRyYWwgY29yZSBvZiB0aGUgaW4tbWVtb3J5IHJlcG9zaXRvcnkuIEl0IGlzIGJhc2VkCi0gKiBvbiBodWdlIEhhc2hNYXAgbWFwIG1hcHBpbmcgaWRzIHRvIG9iamVjdHMgaW4gbWVtb3J5LiBUbyBhbGxvdyBhY2Nlc3MgZnJvbQotICogbXVsdGlwbGUgdGhyZWFkcyBhIEphdmEgY29uY3VycmVudCBIYXNoTWFwIGlzIHVzZWQgdGhhdCBhbGxvd3MgcGFyYWxsZWwKLSAqIGFjY2VzcyBtZXRob2RzLgotICogPHA+Ci0gKiBDZXJ0YWluIG1ldGhvZHMgaW4gdGhlIGluLW1lbW9yeSByZXBvc2l0b3J5IG11c3QgZ3VhcmFudGVlIGNvbnN0cmFpbnRzLiBGb3IKLSAqIGV4YW1wbGUgYSBmb2xkZXIgZW5mb3JjZXMgdGhhdCBlYWNoIGNoaWxkIGhhcyBhIHVuaXF1ZSBuYW1lLiBUaGVyZWZvcmUKLSAqIGNlcnRhaW4gb3BlcmF0aW9ucyBtdXN0IG9jY3VyIGluIGFuIGF0b21pYyBtYW5uZXIuIEluIHRoZSBleGFtcGxlIGl0IG11c3QgYmUKLSAqIGd1YXJhbnRlZWQgdGhhdCBubyB3cml0ZSBhY2Nlc3Mgb2NjdXJzIHRvIHRoZSBtYXAgYmV0d2VlbiBhY3F1aXJpbmcgdGhlCi0gKiBpdGVyYXRvciB0byBmaW5kIHRoZSBjaGlsZHJlbiBhbmQgZmluaXNoaW5nIHRoZSBhZGQgb3BlcmF0aW9uIHdoZW4gbm8gbmFtZQotICogY29uZmxpY3RzIGNhbiBvY2N1ci4gRm9yIHRoaXMgcHVycG9zZSB0aGlzIGNsYXNzIGhhcyBtZXRob2RzIHRvIGxvY2sgYW4KLSAqIHVubG9jayB0aGUgc3RhdGUgb2YgdGhlIHJlcG9zaXRvcnkuIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGNhbGxlcgotICogYWNxdWlyaW5nIHRoZSBsb2NrIGVuZm9yY2VzIGFuIHVubG9jayB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4gVHlwaWNhbCBjb2RlCi0gKiBpczoKLSAqIDxwPgotICogCi0gKiA8cHJlPgotICogT2JqZWN0U3RvcmVJbXBsIG9zID0gLi4uIDsKLSAqIHRyeSB7Ci0gKiAgICAgb3MubG9jaygpOwotICogfSBmaW5hbGx5IHsKLSAqICAgICBvcy51bmxvY2soKTsKLSAqIH0KLSAqIDwvcHJlPgotICogCi0gKiBUaGUgbG9ja2luZyBpcyB2ZXJ5IGNvYXJzZS1ncmFpbmVkLiBQcm9kdWN0aXZlIGltcGxlbWVudGF0aW9ucyB3b3VsZCBwcm9iYWJseQotICogaW1wbGVtZW50IGZpbmVyIGdyYWluZWQgbG9ja3Mgb24gYSBmb2xkZXIgb3IgZG9jdW1lbnQgcmF0aGVyIHRoYW4gdGhlCi0gKiBjb21wbGV0ZSByZXBvc2l0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0U3RvcmVJbXBsIGltcGxlbWVudHMgT2JqZWN0U3RvcmUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9iamVjdFN0b3JlSW1wbC5jbGFzcy5nZXROYW1lKCkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVJTVF9JRCA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nIE1BWF9DT05URU5UX1NJWkVfS0IgPSBDb25maWd1cmF0aW9uU2V0dGluZ3MKLSAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uVmFsdWVBc0xvbmcoQ29uZmlnQ29uc3RhbnRzLk1BWF9DT05URU5UX1NJWkVfS0IpOwotCi0gICAgLyoqCi0gICAgICogVXNlciBpZCBmb3IgYWRtaW5pc3RyYXRvciBhbHdheXMgaGF2aW5nIGFsbCByaWdodHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fUFJJTkNJUEFMX0lEID0gIkFkbWluIjsKLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBpZCBnZW5lcmF0b3IgdGhhdCB1c2VzIGp1c3QgYW4gaW50ZWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmV4dFVudXNlZElkID0gRklSU1RfSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbmN1cnJlbnQgSGFzaE1hcCBhcyBjb3JlIGVsZW1lbnQgdG8gaG9sZCBhbGwgb2JqZWN0cyBpbiB0aGUKLSAgICAgKiByZXBvc2l0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RvcmVkT2JqZWN0PiBmU3RvcmVkT2JqZWN0TWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU3RvcmVkT2JqZWN0PigpOwotCi0gICAgLyoqCi0gICAgICogQSBjb25jdXJyZW50IEhhc2hNYXAgdG8gaG9sZCBhbGwgQWNscyBpbiB0aGUgcmVwb3NpdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBuZXh0VW51c2VkQWNsSWQgPSAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEluTWVtb3J5QWNsPiBmQWNscyA9IG5ldyBBcnJheUxpc3Q8SW5NZW1vcnlBY2w+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExvY2sgZkxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlJlcG9zaXRvcnlJZDsKLSAgICBwcml2YXRlIEZvbGRlckltcGwgZlJvb3RGb2xkZXIgPSBudWxsOwotCi0gICAgcHVibGljIE9iamVjdFN0b3JlSW1wbChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIGZSZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5SWQ7Ci0gICAgICAgIGNyZWF0ZVJvb3RGb2xkZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgSW50ZWdlciBnZXROZXh0SWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXh0VW51c2VkSWQrKzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBJbnRlZ2VyIGdldE5leHRBY2xJZCgpIHsKLSAgICAgICAgcmV0dXJuIG5leHRVbnVzZWRBY2xJZCsrOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2NrKCkgewotICAgICAgICBmTG9jay5sb2NrKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVubG9jaygpIHsKLSAgICAgICAgZkxvY2sudW5sb2NrKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZvbGRlciBnZXRSb290Rm9sZGVyKCkgewotICAgICAgICByZXR1cm4gZlJvb3RGb2xkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBzbyA9IGZpbmRPYmplY3RXaXRoUGF0aEluRGVzY2VuZGVudHMocGF0aCwgdXNlciwgRmlsaW5nLlBBVEhfU0VQQVJBVE9SLCBmUm9vdEZvbGRlcik7Ci0gICAgICAgIHJldHVybiBzbzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGVhYmxlIGZpbmRPYmplY3RXaXRoUGF0aEluRGVzY2VuZGVudHMoU3RyaW5nIHBhdGgsIFN0cmluZyB1c2VyLCBTdHJpbmcgcHJlZml4LCBGaWxlYWJsZSBmbykgewotICAgICAgICBpZiAocGF0aC5lcXVhbHMocHJlZml4KSkgewotICAgICAgICAgICAgcmV0dXJuIGZvOwotICAgICAgICB9IGVsc2UgaWYgKGZvIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICBMaXN0PEZpbGVhYmxlPiBjaGlsZHJlbiA9IGdldENoaWxkcmVuKChGb2xkZXIpIGZvKTsKLSAgICAgICAgICAgIGZvciAoRmlsZWFibGUgY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgICAgIFN0cmluZyBmb3VuZFBhdGggPSBwcmVmaXgubGVuZ3RoKCkgPT0gMSA/IHByZWZpeCArIGNoaWxkLmdldE5hbWUoKSA6IHByZWZpeCArIEZpbGluZy5QQVRIX1NFUEFSQVRPUgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChmb3VuZFBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVhYmxlIGZvdW5kID0gZmluZE9iamVjdFdpdGhQYXRoSW5EZXNjZW5kZW50cyhwYXRoLCB1c2VyLCBmb3VuZFBhdGgsIGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDsgLy8gbm90ZSB0aGF0IHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBmb2xkZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHNhbWUgcHJlZml4IGxpa2UgZm9sZGVyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sZGVyMTAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RvcmVkT2JqZWN0IGdldE9iamVjdEJ5SWQoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIC8vIHdlIHVzZSBwYXRoIGFzIGlkIHNvIHdlIGp1c3QgY2FuIGxvb2sgaXQgdXAgaW4gdGhlIG1hcAotICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBmU3RvcmVkT2JqZWN0TWFwLmdldChvYmplY3RJZCk7Ci0gICAgICAgIHJldHVybiBzbzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVPYmplY3QoU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGFsbFZlcnNpb25zLCBTdHJpbmcgdXNlcikgewotICAgICAgICBTdG9yZWRPYmplY3Qgb2JqID0gZlN0b3JlZE9iamVjdE1hcC5nZXQob2JqZWN0SWQpOwotCi0gICAgICAgIGlmIChudWxsID09IG9iaikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSBvYmplY3Qgd2l0aCBpZCAgIiArIG9iamVjdElkCi0gICAgICAgICAgICAgICAgICAgICsgIi4gT2JqZWN0IGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvbGRlckltcGwpIHsKLSAgICAgICAgICAgIGRlbGV0ZUZvbGRlcihvYmplY3RJZCwgdXNlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRG9jdW1lbnRWZXJzaW9uKSB7Ci0gICAgICAgICAgICBEb2N1bWVudFZlcnNpb24gdmVycyA9IChEb2N1bWVudFZlcnNpb24pIG9iajsKLSAgICAgICAgICAgIFZlcnNpb25lZERvY3VtZW50IHBhcmVudERvYyA9IHZlcnMuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gb3RoZXJWZXJzaW9uc0V4aXN0czsKLSAgICAgICAgICAgIGlmIChhbGxWZXJzaW9ucyAhPSBudWxsICYmIGFsbFZlcnNpb25zKSB7Ci0gICAgICAgICAgICAgICAgb3RoZXJWZXJzaW9uc0V4aXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIExpc3Q8RG9jdW1lbnRWZXJzaW9uPiBhbGxWZXJzID0gcGFyZW50RG9jLmdldEFsbFZlcnNpb25zKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChEb2N1bWVudFZlcnNpb24gdmVyIDogYWxsVmVycykgewotICAgICAgICAgICAgICAgICAgICBmU3RvcmVkT2JqZWN0TWFwLnJlbW92ZSh2ZXIuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmU3RvcmVkT2JqZWN0TWFwLnJlbW92ZShvYmplY3RJZCk7Ci0gICAgICAgICAgICAgICAgb3RoZXJWZXJzaW9uc0V4aXN0cyA9IHBhcmVudERvYy5kZWxldGVWZXJzaW9uKHZlcnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW90aGVyVmVyc2lvbnNFeGlzdHMpIHsKLSAgICAgICAgICAgICAgICBmU3RvcmVkT2JqZWN0TWFwLnJlbW92ZShwYXJlbnREb2MuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmU3RvcmVkT2JqZWN0TWFwLnJlbW92ZShvYmplY3RJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0b3JlT2JqZWN0KFN0b3JlZE9iamVjdCBzbykgewotICAgICAgICBTdHJpbmcgaWQgPSBzby5nZXRJZCgpOwotICAgICAgICAvLyBjaGVjayBpZiB1cGRhdGUgb3IgY3JlYXRlCi0gICAgICAgIGlmIChudWxsID09IGlkKSB7Ci0gICAgICAgICAgICBpZCA9IGdldE5leHRJZCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZlN0b3JlZE9iamVjdE1hcC5wdXQoaWQsIHNvKTsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIFN0b3JlZE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBmU3RvcmVkT2JqZWN0TWFwLmdldChpZCk7Ci0gICAgfQotCi0gICAgdm9pZCByZW1vdmVPYmplY3QoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZTdG9yZWRPYmplY3RNYXAucmVtb3ZlKGlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0SWRzKCkgewotICAgICAgICBTZXQ8U3RyaW5nPiBlbnRyaWVzID0gZlN0b3JlZE9iamVjdE1hcC5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIGVudHJpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgcmVwb3NpdG9yeSBhbmQgcmVtb3ZlIGFsbCBkYXRhLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBsb2NrKCk7Ci0gICAgICAgIGZTdG9yZWRPYmplY3RNYXAuY2xlYXIoKTsKLSAgICAgICAgc3RvcmVPYmplY3QoZlJvb3RGb2xkZXIpOwotICAgICAgICB1bmxvY2soKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRPYmplY3RDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGZTdG9yZWRPYmplY3RNYXAuc2l6ZSgpOwotICAgIH0KLQotICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gcHJpdmF0ZSBoZWxwZXIgbWV0aG9kcwotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJvb3RGb2xkZXIoKSB7Ci0gICAgICAgIEZvbGRlckltcGwgcm9vdEZvbGRlciA9IG5ldyBGb2xkZXJJbXBsKCk7Ci0gICAgICAgIHJvb3RGb2xkZXIuc2V0TmFtZSgiUm9vdEZvbGRlciIpOwotICAgICAgICByb290Rm9sZGVyLnNldFBhcmVudElkKG51bGwpOwotICAgICAgICByb290Rm9sZGVyLnNldFR5cGVJZChCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpOwotICAgICAgICByb290Rm9sZGVyLnNldENyZWF0ZWRCeSgiQWRtaW4iKTsKLSAgICAgICAgcm9vdEZvbGRlci5zZXRNb2RpZmllZEJ5KCJBZG1pbiIpOwotICAgICAgICByb290Rm9sZGVyLnNldE1vZGlmaWVkQXROb3coKTsKLSAgICAgICAgcm9vdEZvbGRlci5zZXRSZXBvc2l0b3J5SWQoZlJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJvb3RGb2xkZXIuc2V0QWNsSWQoYWRkQWNsKEluTWVtb3J5QWNsLmdldERlZmF1bHRBY2woKSkpOwotICAgICAgICBTdHJpbmcgaWQgPSBzdG9yZU9iamVjdChyb290Rm9sZGVyKTsKLSAgICAgICAgcm9vdEZvbGRlci5zZXRJZChpZCk7Ci0gICAgICAgIGZSb290Rm9sZGVyID0gcm9vdEZvbGRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwLCBTdHJpbmcgdXNlciwgRm9sZGVyIGZvbGRlciwKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwcm9wTWFwLmdldChQcm9wZXJ0eUlkcy5OQU1FKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIERvY3VtZW50SW1wbCBkb2MgPSBuZXcgRG9jdW1lbnRJbXBsKCk7Ci0gICAgICAgIGRvYy5jcmVhdGVTeXN0ZW1CYXNlUHJvcGVydGllc1doZW5DcmVhdGVkKHByb3BNYXAsIHVzZXIpOwotICAgICAgICBkb2Muc2V0Q3VzdG9tUHJvcGVydGllcyhwcm9wTWFwKTsKLSAgICAgICAgZG9jLnNldFJlcG9zaXRvcnlJZChmUmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZG9jLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIGlmIChudWxsICE9IGZvbGRlcikgewotICAgICAgICAgICAgaWYgKGhhc0NoaWxkKGZvbGRlciwgbmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGRvY3VtZW50IGFuIG9iamVjdCB3aXRoIG5hbWUgIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbHJlYWR5IGV4aXN0cyBpbiBmb2xkZXIgIiArIGdldEZvbGRlclBhdGgoZm9sZGVyLmdldElkKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvYy5hZGRQYXJlbnRJZChmb2xkZXIuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50ID0gc2V0Q29udGVudChkb2MsIGNvbnRlbnRTdHJlYW0pOwotICAgICAgICBkb2Muc2V0Q29udGVudChjb250ZW50KTsKLSAgICAgICAgaW50IGFjbElkID0gZ2V0QWNsSWQoKChGb2xkZXJJbXBsKSBmb2xkZXIpLCBhZGRBQ0VzLCByZW1vdmVBQ0VzKTsKLSAgICAgICAgZG9jLnNldEFjbElkKGFjbElkKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcG9saWNpZXMpIHsKLSAgICAgICAgICAgIGRvYy5zZXRBcHBsaWVkUG9saWNpZXMocG9saWNpZXMpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBpZCA9IHN0b3JlT2JqZWN0KGRvYyk7Ci0gICAgICAgIGRvYy5zZXRJZChpZCk7Ci0gICAgICAgIGFwcGx5QWNsKGRvYywgYWRkQUNFcywgcmVtb3ZlQUNFcyk7Ci0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVJdGVtKFN0cmluZyBuYW1lLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAsIFN0cmluZyB1c2VyLCBGb2xkZXIgZm9sZGVyLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpIHsKLSAgICAgICAgSXRlbUltcGwgaXRlbSA9IG5ldyBJdGVtSW1wbCgpOwotICAgICAgICBpdGVtLmNyZWF0ZVN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbkNyZWF0ZWQocHJvcE1hcCwgdXNlcik7Ci0gICAgICAgIGl0ZW0uc2V0Q3VzdG9tUHJvcGVydGllcyhwcm9wTWFwKTsKLSAgICAgICAgaXRlbS5zZXRSZXBvc2l0b3J5SWQoZlJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGl0ZW0uc2V0TmFtZShuYW1lKTsKLSAgICAgICAgaWYgKG51bGwgIT0gZm9sZGVyKSB7Ci0gICAgICAgICAgICBpZiAoaGFzQ2hpbGQoZm9sZGVyLCBuYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgZG9jdW1lbnQgYW4gb2JqZWN0IHdpdGggbmFtZSAiICsgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFscmVhZHkgZXhpc3RzIGluIGZvbGRlciAiICsgZ2V0Rm9sZGVyUGF0aChmb2xkZXIuZ2V0SWQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXRlbS5hZGRQYXJlbnRJZChmb2xkZXIuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgIT0gcG9saWNpZXMpIHsKLSAgICAgICAgICAgIGl0ZW0uc2V0QXBwbGllZFBvbGljaWVzKHBvbGljaWVzKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgYWNsSWQgPSBnZXRBY2xJZCgoKEZvbGRlckltcGwpIGZvbGRlciksIGFkZEFDRXMsIHJlbW92ZUFDRXMpOwotICAgICAgICBpdGVtLnNldEFjbElkKGFjbElkKTsKLSAgICAgICAgU3RyaW5nIGlkID0gc3RvcmVPYmplY3QoaXRlbSk7Ci0gICAgICAgIGl0ZW0uc2V0SWQoaWQpOwotICAgICAgICBhcHBseUFjbChpdGVtLCBhZGRBQ0VzLCByZW1vdmVBQ0VzKTsKLSAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERvY3VtZW50VmVyc2lvbiBjcmVhdGVWZXJzaW9uZWREb2N1bWVudChTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwLCBTdHJpbmcgdXNlciwKLSAgICAgICAgICAgIEZvbGRlciBmb2xkZXIsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgIFZlcnNpb25lZERvY3VtZW50SW1wbCBkb2MgPSBuZXcgVmVyc2lvbmVkRG9jdW1lbnRJbXBsKCk7Ci0gICAgICAgIGRvYy5jcmVhdGVTeXN0ZW1CYXNlUHJvcGVydGllc1doZW5DcmVhdGVkKHByb3BNYXAsIHVzZXIpOwotICAgICAgICBkb2Muc2V0Q3VzdG9tUHJvcGVydGllcyhwcm9wTWFwKTsKLSAgICAgICAgZG9jLnNldFJlcG9zaXRvcnlJZChmUmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZG9jLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIFN0cmluZyBpZCA9IHN0b3JlT2JqZWN0KGRvYyk7Ci0gICAgICAgIGRvYy5zZXRJZChpZCk7Ci0gICAgICAgIERvY3VtZW50VmVyc2lvbiB2ZXJzaW9uID0gZG9jLmFkZFZlcnNpb24odmVyc2lvbmluZ1N0YXRlLCB1c2VyKTsKLSAgICAgICAgc2V0Q29udGVudCh2ZXJzaW9uLCBjb250ZW50U3RyZWFtKTsKLSAgICAgICAgdmVyc2lvbi5jcmVhdGVTeXN0ZW1CYXNlUHJvcGVydGllc1doZW5DcmVhdGVkKHByb3BNYXAsIHVzZXIpOwotICAgICAgICB2ZXJzaW9uLnNldEN1c3RvbVByb3BlcnRpZXMocHJvcE1hcCk7Ci0gICAgICAgIGlmIChudWxsICE9IGZvbGRlcikgewotICAgICAgICAgICAgaWYgKGhhc0NoaWxkKGZvbGRlciwgbmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGRvY3VtZW50IGFuIG9iamVjdCB3aXRoIG5hbWUgIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbHJlYWR5IGV4aXN0cyBpbiBmb2xkZXIgIiArIGdldEZvbGRlclBhdGgoZm9sZGVyLmdldElkKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvYy5hZGRQYXJlbnRJZChmb2xkZXIuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGFjbElkID0gZ2V0QWNsSWQoKChGb2xkZXJJbXBsKSBmb2xkZXIpLCBhZGRBQ0VzLCByZW1vdmVBQ0VzKTsKLSAgICAgICAgZG9jLnNldEFjbElkKGFjbElkKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcG9saWNpZXMpIHsKLSAgICAgICAgICAgIGRvYy5zZXRBcHBsaWVkUG9saWNpZXMocG9saWNpZXMpOwotICAgICAgICB9Ci0gICAgICAgIGlkID0gc3RvcmVPYmplY3QodmVyc2lvbik7Ci0gICAgICAgIHZlcnNpb24uc2V0SWQoaWQpOwotICAgICAgICBhcHBseUFjbChkb2MsIGFkZEFDRXMsIHJlbW92ZUFDRXMpOwotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wTWFwLCBTdHJpbmcgdXNlciwgRm9sZGVyIHBhcmVudCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKSB7Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gcGFyZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSByb290IGZvbGRlci4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChoYXNDaGlsZChwYXJlbnQsIG5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBmb2xkZXIsIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiBwYXJlbnQgZm9sZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIEZvbGRlckltcGwgZm9sZGVyID0gbmV3IEZvbGRlckltcGwobmFtZSwgcGFyZW50LmdldElkKCkpOwotICAgICAgICBpZiAobnVsbCAhPSBwcm9wTWFwKSB7Ci0gICAgICAgICAgICBmb2xkZXIuY3JlYXRlU3lzdGVtQmFzZVByb3BlcnRpZXNXaGVuQ3JlYXRlZChwcm9wTWFwLCB1c2VyKTsKLSAgICAgICAgICAgIGZvbGRlci5zZXRDdXN0b21Qcm9wZXJ0aWVzKHByb3BNYXApOwotICAgICAgICB9Ci0gICAgICAgIGZvbGRlci5zZXRSZXBvc2l0b3J5SWQoZlJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgaW50IGFjbElkID0gZ2V0QWNsSWQoKChGb2xkZXJJbXBsKSBwYXJlbnQpLCBhZGRBQ0VzLCByZW1vdmVBQ0VzKTsKLSAgICAgICAgZm9sZGVyLnNldEFjbElkKGFjbElkKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcG9saWNpZXMpIHsKLSAgICAgICAgICAgIGZvbGRlci5zZXRBcHBsaWVkUG9saWNpZXMocG9saWNpZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gc3RvcmVPYmplY3QoZm9sZGVyKTsKLSAgICAgICAgZm9sZGVyLnNldElkKGlkKTsKLSAgICAgICAgYXBwbHlBY2woZm9sZGVyLCBhZGRBQ0VzLCByZW1vdmVBQ0VzKTsKLSAgICAgICAgcmV0dXJuIGZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICBGb2xkZXIgZm9sZGVyID0gbmV3IEZvbGRlckltcGwobmFtZSwgbnVsbCk7Ci0gICAgICAgIGZvbGRlci5zZXRSZXBvc2l0b3J5SWQoZlJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBmb2xkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVQb2xpY3koU3RyaW5nIG5hbWUsIFN0cmluZyBwb2xpY3lUZXh0LCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAsIFN0cmluZyB1c2VyLAotICAgICAgICAgICAgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKSB7Ci0gICAgICAgIFBvbGljeUltcGwgcG9saWN5ID0gbmV3IFBvbGljeUltcGwoKTsKLSAgICAgICAgcG9saWN5LmNyZWF0ZVN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbkNyZWF0ZWQocHJvcE1hcCwgdXNlcik7Ci0gICAgICAgIHBvbGljeS5zZXRDdXN0b21Qcm9wZXJ0aWVzKHByb3BNYXApOwotICAgICAgICBwb2xpY3kuc2V0UmVwb3NpdG9yeUlkKGZSZXBvc2l0b3J5SWQpOwotICAgICAgICBwb2xpY3kuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgcG9saWN5LnNldFBvbGljeVRleHQocG9saWN5VGV4dCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IHN0b3JlT2JqZWN0KHBvbGljeSk7Ci0gICAgICAgIHBvbGljeS5zZXRJZChpZCk7Ci0gICAgICAgIGFwcGx5QWNsKHBvbGljeSwgYWRkQUNFcywgcmVtb3ZlQUNFcyk7Ci0gICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0b3JlZE9iamVjdCBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIG5hbWUsIFN0b3JlZE9iamVjdCBzb3VyY2VPYmplY3QsIFN0b3JlZE9iamVjdCB0YXJnZXRPYmplY3QsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAsIFN0cmluZyB1c2VyLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpIHsKLQotICAgICAgICBSZWxhdGlvbnNoaXBJbXBsIHJlbCA9IG5ldyBSZWxhdGlvbnNoaXBJbXBsKCk7Ci0gICAgICAgIHJlbC5jcmVhdGVTeXN0ZW1CYXNlUHJvcGVydGllc1doZW5DcmVhdGVkKHByb3BNYXAsIHVzZXIpOwotICAgICAgICByZWwuc2V0Q3VzdG9tUHJvcGVydGllcyhwcm9wTWFwKTsKLSAgICAgICAgcmVsLnNldFJlcG9zaXRvcnlJZChmUmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmVsLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIGlmIChudWxsICE9IHNvdXJjZU9iamVjdCkgewotICAgICAgICAgICAgcmVsLnNldFNvdXJjZShzb3VyY2VPYmplY3QuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgIT0gdGFyZ2V0T2JqZWN0KSB7Ci0gICAgICAgICAgICByZWwuc2V0VGFyZ2V0KHRhcmdldE9iamVjdC5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgaWQgPSBzdG9yZU9iamVjdChyZWwpOwotICAgICAgICByZWwuc2V0SWQoaWQpOwotICAgICAgICBhcHBseUFjbChyZWwsIGFkZEFDRXMsIHJlbW92ZUFDRXMpOwotICAgICAgICByZXR1cm4gcmVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmVyc2lvbihEb2N1bWVudFZlcnNpb24gdmVyc2lvbikgewotICAgICAgICBTdHJpbmcgaWQgPSBzdG9yZU9iamVjdCh2ZXJzaW9uKTsKLSAgICAgICAgdmVyc2lvbi5zZXRJZChpZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGVsZXRlVmVyc2lvbihEb2N1bWVudFZlcnNpb24gdmVyc2lvbikgewotICAgICAgICBTdG9yZWRPYmplY3QgZm91bmQgPSBmU3RvcmVkT2JqZWN0TWFwLnJlbW92ZSh2ZXJzaW9uLmdldElkKCkpOwotCi0gICAgICAgIGlmIChudWxsID09IGZvdW5kKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSBvYmplY3Qgd2l0aCBpZCAgIiArIHZlcnNpb24uZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICArICIuIE9iamVjdCBkb2VzIG5vdCBleGlzdC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU9iamVjdChTdG9yZWRPYmplY3Qgc28sIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gbmV3UHJvcGVydGllcywgU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBzby5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG5ld1Byb3BlcnRpZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiB2YWx1ZSA9IG5ld1Byb3BlcnRpZXMuZ2V0KGtleSk7Ci0KLSAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7IC8vIHByZXNlcnZlIGl0IGV2ZW4gaWYgaXQgaXMgZW1wdHkhCi0gICAgICAgICAgICB9IGVsc2UgIGlmIChudWxsID09IHZhbHVlIHx8IHZhbHVlLmdldFZhbHVlcygpID09IG51bGwgfHwgdmFsdWUuZ2V0Rmlyc3RWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgcHJvcGVydHkKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyB1cGRhdGUgc3lzdGVtIHByb3BlcnRpZXMgYW5kIHNlY29uZGFyeSBvYmplY3QgdHlwZSBpZHMKLSAgICAgICAgc28udXBkYXRlU3lzdGVtQmFzZVByb3BlcnRpZXNXaGVuTW9kaWZpZWQocHJvcGVydGllcywgdXNlcik7Ci0gICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFN0b3JlZE9iamVjdD4gZ2V0Q2hlY2tlZE91dERvY3VtZW50cyhTdHJpbmcgb3JkZXJCeSwgU3RyaW5nIHVzZXIsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcykgewotICAgICAgICBMaXN0PFN0b3JlZE9iamVjdD4gcmVzID0gbmV3IEFycmF5TGlzdDxTdG9yZWRPYmplY3Q+KCk7Ci0KLSAgICAgICAgZm9yIChTdG9yZWRPYmplY3Qgc28gOiBmU3RvcmVkT2JqZWN0TWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCkgewotICAgICAgICAgICAgICAgIFZlcnNpb25lZERvY3VtZW50IHZlckRvYyA9IChWZXJzaW9uZWREb2N1bWVudCkgc287Ci0gICAgICAgICAgICAgICAgaWYgKHZlckRvYy5pc0NoZWNrZWRPdXQoKSAmJiBoYXNSZWFkQWNjZXNzKHVzZXIsIHZlckRvYykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzLmFkZCh2ZXJEb2MuZ2V0UHdjKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8U3RvcmVkT2JqZWN0PiBnZXRSZWxhdGlvbnNoaXBzKFN0cmluZyBvYmplY3RJZCwgTGlzdDxTdHJpbmc+IHR5cGVJZHMsIFJlbGF0aW9uc2hpcERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKLQotICAgICAgICBMaXN0PFN0b3JlZE9iamVjdD4gcmVzID0gbmV3IEFycmF5TGlzdDxTdG9yZWRPYmplY3Q+KCk7Ci0KLSAgICAgICAgaWYgKHR5cGVJZHMgIT0gbnVsbCAmJiB0eXBlSWRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVJZCA6IHR5cGVJZHMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0b3JlZE9iamVjdCBzbyA6IGZTdG9yZWRPYmplY3RNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgUmVsYXRpb25zaGlwICYmIHNvLmdldFR5cGVJZCgpLmVxdWFscyh0eXBlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgcm8gPSAoUmVsYXRpb25zaGlwKSBzbzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyby5nZXRTb3VyY2VPYmplY3RJZCgpLmVxdWFscyhvYmplY3RJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKFJlbGF0aW9uc2hpcERpcmVjdGlvbi5FSVRIRVIgPT0gZGlyZWN0aW9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlNPVVJDRSA9PSBkaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFkZChzbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvLmdldFRhcmdldE9iamVjdElkKCkuZXF1YWxzKG9iamVjdElkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoUmVsYXRpb25zaGlwRGlyZWN0aW9uLkVJVEhFUiA9PSBkaXJlY3Rpb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uVEFSR0VUID09IGRpcmVjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuYWRkKHNvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IGdldEFsbFJlbGF0aW9uc2hpcHMob2JqZWN0SWQsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlclBhdGgoU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnNlcnRQYXRoU2VnbWVudChzYiwgZm9sZGVySWQpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0UGF0aFNlZ21lbnQoU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIEZvbGRlciBmb2xkZXIgPSAoRm9sZGVyKSBnZXRPYmplY3RCeUlkKGZvbGRlcklkKTsKLSAgICAgICAgaWYgKG51bGwgPT0gZm9sZGVyLmdldFBhcmVudElkKCkpIHsKLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc2IuaW5zZXJ0KDAsIEZpbGluZy5QQVRIX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5pbnNlcnQoMCwgZm9sZGVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzYi5pbnNlcnQoMCwgRmlsaW5nLlBBVEhfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIGluc2VydFBhdGhTZWdtZW50KHNiLCBmb2xkZXIuZ2V0UGFyZW50SWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0b3JlZE9iamVjdCBzbywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgCi0gICAgICAgICAgICBTdHJpbmcgcHJpbmNpcGFsSWQpIHsKLSAgICAgICAgaWYgKGFjbFByb3BhZ2F0aW9uID09IEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFkgfHwgIShzbyBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBhcHBseUFjbChzbywgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBwbHlBY2xSZWN1cnNpdmUoKChGb2xkZXIpIHNvKSwgYWRkQWNlcywgcmVtb3ZlQWNlcywgcHJpbmNpcGFsSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFjbCBhcHBseUFjbChTdG9yZWRPYmplY3Qgc28sIEFjbCBhY2wsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uLCBTdHJpbmcgcHJpbmNpcGFsSWQpIHsKLSAgICAgICAgaWYgKGFjbFByb3BhZ2F0aW9uID09IEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFkgfHwgIShzbyBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBhcHBseUFjbChzbywgYWNsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhcHBseUFjbFJlY3Vyc2l2ZSgoKEZvbGRlcikgc28pLCBhY2wsIHByaW5jaXBhbElkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGdldEFsbEFjbHNGb3JVc2VyKFN0cmluZyBwcmluY2lwYWxJZCwgUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0gICAgICAgIExpc3Q8SW50ZWdlcj4gYWNscyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgZm9yIChJbk1lbW9yeUFjbCBhY2wgOiBmQWNscykgewotICAgICAgICAgICAgaWYgKGFjbC5oYXNQZXJtaXNzaW9uKHByaW5jaXBhbElkLCBwZXJtaXNzaW9uKSkgewotICAgICAgICAgICAgICAgIGFjbHMuYWRkKGFjbC5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWNsczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWNsIGdldEFjbChpbnQgYWNsSWQpIHsKLSAgICAgICAgSW5NZW1vcnlBY2wgYWNsID0gZ2V0SW5NZW1vcnlBY2woYWNsSWQpOwotICAgICAgICByZXR1cm4gYWNsID09IG51bGwgPyBJbk1lbW9yeUFjbC5nZXREZWZhdWx0QWNsKCkudG9Db21tb25zQWNsKCkgOiBhY2wudG9Db21tb25zQWNsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBY2xJZChTdG9yZWRPYmplY3RJbXBsIHNvLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpIHsKLSAgICAgICAgSW5NZW1vcnlBY2wgbmV3QWNsOwotICAgICAgICBib29sZWFuIHJlbW92ZURlZmF1bHRBY2wgPSBmYWxzZTsKLSAgICAgICAgaW50IGFjbElkID0gMDsKLQotICAgICAgICBpZiAoc28gPT0gbnVsbCkgewotICAgICAgICAgICAgbmV3QWNsID0gbmV3IEluTWVtb3J5QWNsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhY2xJZCA9IHNvLmdldEFjbElkKCk7Ci0gICAgICAgICAgICBuZXdBY2wgPSBnZXRJbk1lbW9yeUFjbChhY2xJZCk7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBuZXdBY2wpIHsKLSAgICAgICAgICAgICAgICBuZXdBY2wgPSBuZXcgSW5NZW1vcnlBY2woKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBsaXN0IHNvIHRoYXQgd2UgY2FuIHNhZmVseSBjaGFuZ2UgaXQgd2l0aG91dCBlZmZlY3RpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICBuZXdBY2wgPSBuZXcgSW5NZW1vcnlBY2wobmV3QWNsLmdldEFjZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3QWNsLnNpemUoKSA9PSAwICYmIGFkZEFDRXMgPT0gbnVsbCAmJiByZW1vdmVBQ0VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gcmVtb3ZlQUNFcykgewotICAgICAgICAgICAgZm9yIChBY2UgYWNlIDogcmVtb3ZlQUNFcy5nZXRBY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBJbk1lbW9yeUFjZSBpbk1lbUFjZSA9IG5ldyBJbk1lbW9yeUFjZShhY2UpOwotICAgICAgICAgICAgICAgIGlmIChpbk1lbUFjZS5lcXVhbHMoSW5NZW1vcnlBY2UuZ2V0RGVmYXVsdEFjZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVEZWZhdWx0QWNsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc28gIT0gbnVsbCAmJiAwID09IGFjbElkICYmICFyZW1vdmVEZWZhdWx0QWNsKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsgLy8gaWYgb2JqZWN0IGdyYW50cyBmdWxsIGFjY2VzcyB0byBldmVyeW9uZSBhbmQgaXQgd2lsbAotICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZSByZW1vdmVkIHdlIGRvIG5vdGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBBQ0VzCi0gICAgICAgIGlmIChudWxsICE9IGFkZEFDRXMpIHsKLSAgICAgICAgICAgIGZvciAoQWNlIGFjZSA6IGFkZEFDRXMuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgSW5NZW1vcnlBY2UgaW5NZW1BY2UgPSBuZXcgSW5NZW1vcnlBY2UoYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5NZW1BY2UuZXF1YWxzKEluTWVtb3J5QWNlLmdldERlZmF1bHRBY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIGlmIGV2ZXJ5b25lIGhhcyBmdWxsIGFjY2VzcyB0aGVyZSBpcyBubyBuZWVkIHRvCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIEFDTHMuCi0gICAgICAgICAgICAgICAgbmV3QWNsLmFkZEFjZShpbk1lbUFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgQUNFcwotICAgICAgICBpZiAobnVsbCAhPSByZW1vdmVBQ0VzKSB7Ci0gICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiByZW1vdmVBQ0VzLmdldEFjZXMoKSkgewotICAgICAgICAgICAgICAgIEluTWVtb3J5QWNlIGluTWVtQWNlID0gbmV3IEluTWVtb3J5QWNlKGFjZSk7Ci0gICAgICAgICAgICAgICAgbmV3QWNsLnJlbW92ZUFjZShpbk1lbUFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmV3QWNsLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRBY2wobmV3QWNsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUZvbGRlcihTdHJpbmcgZm9sZGVySWQsIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBmb2xkZXIgPSBmU3RvcmVkT2JqZWN0TWFwLmdldChmb2xkZXJJZCk7Ci0gICAgICAgIGlmIChmb2xkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gb2JqZWN0IHdpdGggaWQ6ICAiICsgZm9sZGVySWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEoZm9sZGVyIGluc3RhbmNlb2YgRm9sZGVySW1wbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgZGVsZXRlIGZvbGRlciB3aXRoIGlkOiAgIiArIGZvbGRlcklkCi0gICAgICAgICAgICAgICAgICAgICsgIi4gT2JqZWN0IGV4aXN0cyBidXQgaXMgbm90IGEgZm9sZGVyLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgY2hpbGRyZW4gZXhpc3QKLSAgICAgICAgTGlzdDxGaWxlYWJsZT4gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigoRm9sZGVyKSBmb2xkZXIsIC0xLCAtMSwgdXNlciwgdHJ1ZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgIWNoaWxkcmVuLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJDYW5ub3QgZGVsZXRlIGZvbGRlciB3aXRoIGlkOiAgIiArIGZvbGRlcklkICsgIi4gRm9sZGVyIGlzIG5vdCBlbXB0eS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZTdG9yZWRPYmplY3RNYXAucmVtb3ZlKGZvbGRlcklkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hpbGRyZW5SZXN1bHQgZ2V0Q2hpbGRyZW4oRm9sZGVyIGZvbGRlciwgaW50IG1heEl0ZW1zUGFyYW0sIGludCBza2lwQ291bnRQYXJhbSwgU3RyaW5nIHVzZXIsIAotICAgICAgICAgICAgYm9vbGVhbiB1c2VQd2MpIHsKLSAgICAgICAgTGlzdDxGaWxlYWJsZT4gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihmb2xkZXIsIHVzZXIsIHVzZVB3Yyk7Ci0gICAgICAgIHNvcnRGb2xkZXJMaXN0KGNoaWxkcmVuKTsKLQotICAgICAgICBpbnQgbWF4SXRlbXMgPSBtYXhJdGVtc1BhcmFtIDwgMCA/IGNoaWxkcmVuLnNpemUoKSA6IG1heEl0ZW1zUGFyYW07Ci0gICAgICAgIGludCBza2lwQ291bnQgPSBza2lwQ291bnRQYXJhbSA8IDAgPyAwIDogc2tpcENvdW50UGFyYW07Ci0KLSAgICAgICAgaW50IGZyb20gPSBNYXRoLm1pbihza2lwQ291bnQsIGNoaWxkcmVuLnNpemUoKSk7Ci0gICAgICAgIGludCB0byA9IE1hdGgubWluKG1heEl0ZW1zICsgZnJvbSwgY2hpbGRyZW4uc2l6ZSgpKTsKLSAgICAgICAgaW50IG5vSXRlbXMgPSBjaGlsZHJlbi5zaXplKCk7Ci0KLSAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5zdWJMaXN0KGZyb20sIHRvKTsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGlsZHJlblJlc3VsdChjaGlsZHJlbiwgbm9JdGVtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PEZpbGVhYmxlPiBnZXRDaGlsZHJlbihGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihmb2xkZXIsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8RmlsZWFibGU+IGdldENoaWxkcmVuKEZvbGRlciBmb2xkZXIsIFN0cmluZyB1c2VyLCBib29sZWFuIHVzZVB3YykgewotICAgICAgICBMaXN0PEZpbGVhYmxlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8RmlsZWFibGU+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGlkIDogZ2V0SWRzKCkpIHsKLSAgICAgICAgICAgIFN0b3JlZE9iamVjdCBvYmogPSBnZXRPYmplY3QoaWQpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZpbGVhYmxlKSB7Ci0gICAgICAgICAgICAgICAgRmlsZWFibGUgcGF0aE9iaiA9IChGaWxlYWJsZSkgb2JqOwotICAgICAgICAgICAgICAgIGlmICgobnVsbCA9PSB1c2VyIHx8IGhhc1JlYWRBY2Nlc3ModXNlciwgb2JqKSkgJiYgcGF0aE9iai5nZXRQYXJlbnRJZHMoKS5jb250YWlucyhmb2xkZXIuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhPYmogaW5zdGFuY2VvZiBWZXJzaW9uZWREb2N1bWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWZXJzaW9uIHZlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQd2MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSAoKFZlcnNpb25lZERvY3VtZW50KSBwYXRoT2JqKS5nZXRQd2MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB2ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gKChWZXJzaW9uZWREb2N1bWVudCkgcGF0aE9iaikuZ2V0TGF0ZXN0VmVyc2lvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSAoKFZlcnNpb25lZERvY3VtZW50KSBwYXRoT2JqKS5nZXRMYXRlc3RWZXJzaW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZCh2ZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEocGF0aE9iaiBpbnN0YW5jZW9mIERvY3VtZW50VmVyc2lvbikpIHsgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudFZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChwYXRoT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hpbGRyZW5SZXN1bHQgZ2V0Rm9sZGVyQ2hpbGRyZW4oRm9sZGVyIGZvbGRlciwgaW50IG1heEl0ZW1zLCBpbnQgc2tpcENvdW50LCBTdHJpbmcgdXNlcikgewotICAgICAgICBMaXN0PEZpbGVhYmxlPiBmb2xkZXJDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8RmlsZWFibGU+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGlkIDogZ2V0SWRzKCkpIHsKLSAgICAgICAgICAgIFN0b3JlZE9iamVjdCBvYmogPSBnZXRPYmplY3QoaWQpOwotICAgICAgICAgICAgaWYgKGhhc1JlYWRBY2Nlc3ModXNlciwgb2JqKSAmJiBvYmogaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICBGb2xkZXIgY2hpbGRGb2xkZXIgPSAoRm9sZGVyKSBvYmo7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkRm9sZGVyLmdldFBhcmVudElkcygpLmNvbnRhaW5zKGZvbGRlci5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmb2xkZXJDaGlsZHJlbi5hZGQoY2hpbGRGb2xkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzb3J0Rm9sZGVyTGlzdChmb2xkZXJDaGlsZHJlbik7Ci0gICAgICAgIGludCBmcm9tID0gTWF0aC5taW4oc2tpcENvdW50LCBmb2xkZXJDaGlsZHJlbi5zaXplKCkpOwotICAgICAgICBpbnQgdG8gPSBNYXRoLm1pbihtYXhJdGVtcyArIGZyb20sIGZvbGRlckNoaWxkcmVuLnNpemUoKSk7Ci0gICAgICAgIGludCBub0l0ZW1zID0gZm9sZGVyQ2hpbGRyZW4uc2l6ZSgpOwotCi0gICAgICAgIGZvbGRlckNoaWxkcmVuID0gZm9sZGVyQ2hpbGRyZW4uc3ViTGlzdChmcm9tLCB0byk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDaGlsZHJlblJlc3VsdChmb2xkZXJDaGlsZHJlbiwgbm9JdGVtcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbW92ZShTdG9yZWRPYmplY3Qgc28sIEZvbGRlciBvbGRQYXJlbnQsIEZvbGRlciBuZXdQYXJlbnQsIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaGFzQ2hpbGQobmV3UGFyZW50LCBzby5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBtb3ZlIG9iamVjdCAiICsgc28uZ2V0TmFtZSgpICsgIiB0byBmb2xkZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRGb2xkZXJQYXRoKG5ld1BhcmVudC5nZXRJZCgpKSArICIuIEEgY2hpbGQgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2NrKCk7Ci0gICAgICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBNdWx0aUZpbGluZykgewotICAgICAgICAgICAgICAgIE11bHRpRmlsaW5nIGZpID0gKE11bHRpRmlsaW5nKSBzbzsKLSAgICAgICAgICAgICAgICBhZGRQYXJlbnRJbnRlcm4oZmksIG5ld1BhcmVudCk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUGFyZW50SW50ZXJuKGZpLCBvbGRQYXJlbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzbyBpbnN0YW5jZW9mIEZvbGRlckltcGwpIHsKLSAgICAgICAgICAgICAgICAoKEZvbGRlckltcGwpIHNvKS5zZXRQYXJlbnRJZChuZXdQYXJlbnQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbmFtZShTdG9yZWRPYmplY3Qgc28sIFN0cmluZyBuZXdOYW1lLCBTdHJpbmcgdXNlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9jaygpOwotICAgICAgICAgICAgaWYgKHNvLmdldElkKCkuZXF1YWxzKGZSb290Rm9sZGVyLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlJvb3QgZm9sZGVyIGNhbm5vdCBiZSByZW5hbWVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNvLmdldE5hbWUoKS5lcXVhbHMobmV3TmFtZSkpIHsKLSAgICAgICAgICAgIAlyZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBGaWxlYWJsZSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZvbGRlcklkIDogKChGaWxlYWJsZSlzbykuZ2V0UGFyZW50SWRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRm9sZGVyIGZvbGRlciA9IChGb2xkZXIpIGdldE9iamVjdEJ5SWQoZm9sZGVySWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ2hpbGQoZm9sZGVyLCBuZXdOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IHJlbmFtZSBvYmplY3QgdG8gIiArIG5ld05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBUaGlzIHBhdGggYWxyZWFkeSBleGlzdHMgaW4gcGFyZW50ICIgKyBnZXRGb2xkZXJQYXRoKGZvbGRlci5nZXRJZCgpKSArICIuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzby5zZXROYW1lKG5ld05hbWUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2hpbGQoRm9sZGVyIGZvbGRlciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgTGlzdDxGaWxlYWJsZT4gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihmb2xkZXIpOwotICAgICAgICBmb3IgKEZpbGVhYmxlIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFyZW50SWRzKFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZpc2libGVQYXJlbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmICghKHNvIGluc3RhbmNlb2YgRmlsZWFibGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IGlzIG5vdCBmaWxlYWJsZTogIiArIHNvLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGluZyBmaWxlYWJsZSA9IChGaWxlYWJsZSkgc287Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwYXJlbnRzID0gZmlsZWFibGUuZ2V0UGFyZW50SWRzKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGlkIDogcGFyZW50cykgewotICAgICAgICAgICAgU3RvcmVkT2JqZWN0IHBhcmVudCA9IGdldE9iamVjdEJ5SWQoaWQpOwotICAgICAgICAgICAgaWYgKGhhc1JlYWRBY2Nlc3ModXNlciwgcGFyZW50KSkgewotICAgICAgICAgICAgICAgIHZpc2libGVQYXJlbnRzLmFkZChpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZpc2libGVQYXJlbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1JlYWRBY2Nlc3MoU3RyaW5nIHByaW5jaXBhbElkLCBTdG9yZWRPYmplY3Qgc28pIHsKLSAgICAgICAgcmV0dXJuIGhhc0FjY2VzcyhwcmluY2lwYWxJZCwgc28sIFBlcm1pc3Npb24uUkVBRCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzV3JpdGVBY2Nlc3MoU3RyaW5nIHByaW5jaXBhbElkLCBTdG9yZWRPYmplY3Qgc28pIHsKLSAgICAgICAgcmV0dXJuIGhhc0FjY2VzcyhwcmluY2lwYWxJZCwgc28sIFBlcm1pc3Npb24uV1JJVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0FsbEFjY2VzcyhTdHJpbmcgcHJpbmNpcGFsSWQsIFN0b3JlZE9iamVjdCBzbykgewotICAgICAgICByZXR1cm4gaGFzQWNjZXNzKHByaW5jaXBhbElkLCBzbywgUGVybWlzc2lvbi5BTEwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoZWNrUmVhZEFjY2VzcyhTdHJpbmcgcHJpbmNpcGFsSWQsIFN0b3JlZE9iamVjdCBzbykgewotICAgICAgICBjaGVja0FjY2VzcyhwcmluY2lwYWxJZCwgc28sIFBlcm1pc3Npb24uUkVBRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tXcml0ZUFjY2VzcyhTdHJpbmcgcHJpbmNpcGFsSWQsIFN0b3JlZE9iamVjdCBzbykgewotICAgICAgICBjaGVja0FjY2VzcyhwcmluY2lwYWxJZCwgc28sIFBlcm1pc3Npb24uV1JJVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoZWNrQWxsQWNjZXNzKFN0cmluZyBwcmluY2lwYWxJZCwgU3RvcmVkT2JqZWN0IHNvKSB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKHByaW5jaXBhbElkLCBzbywgUGVybWlzc2lvbi5BTEwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FjY2VzcyhTdHJpbmcgcHJpbmNpcGFsSWQsIFN0b3JlZE9iamVjdCBzbywgUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0gICAgICAgIGlmICghaGFzQWNjZXNzKHByaW5jaXBhbElkLCBzbywgcGVybWlzc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbigiT2JqZWN0IHdpdGggaWQgIiArIHNvLmdldElkKCkgKyAiIGFuZCBuYW1lICIgKyBzby5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGdyYW50ICIgKyBwZXJtaXNzaW9uLnRvU3RyaW5nKCkgKyAiIGFjY2VzcyB0byBwcmluY2lwYWwgIiArIHByaW5jaXBhbElkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNBY2Nlc3MoU3RyaW5nIHByaW5jaXBhbElkLCBTdG9yZWRPYmplY3Qgc28sIFBlcm1pc3Npb24gcGVybWlzc2lvbikgewotICAgICAgICBpZiAobnVsbCAhPSBwcmluY2lwYWxJZCAmJiBwcmluY2lwYWxJZC5lcXVhbHMoQURNSU5fUFJJTkNJUEFMX0lEKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxJbnRlZ2VyPiBhY2xJZHMgPSBnZXRBbGxBY2xzRm9yVXNlcihwcmluY2lwYWxJZCwgcGVybWlzc2lvbik7Ci0gICAgICAgIHJldHVybiBhY2xJZHMuY29udGFpbnMoKChTdG9yZWRPYmplY3RJbXBsKSBzbykuZ2V0QWNsSWQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbk1lbW9yeUFjbCBnZXRJbk1lbW9yeUFjbChpbnQgYWNsSWQpIHsKLQotICAgICAgICBmb3IgKEluTWVtb3J5QWNsIGFjbCA6IGZBY2xzKSB7Ci0gICAgICAgICAgICBpZiAoYWNsSWQgPT0gYWNsLmdldElkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWNsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHNldEFjbChTdG9yZWRPYmplY3RJbXBsIHNvLCBBY2wgYWNsKSB7Ci0gICAgICAgIGludCBhY2xJZDsKLSAgICAgICAgaWYgKG51bGwgPT0gYWNsIHx8IGFjbC5nZXRBY2VzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBhY2xJZCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhY2xJZCA9IGdldEFjbElkKG51bGwsIGFjbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgc28uc2V0QWNsSWQoYWNsSWQpOwotICAgICAgICByZXR1cm4gYWNsSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgaWYgYW4gQWNsIGlzIGFscmVhZHkga25vd24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGFjbAotICAgICAqICAgICAgICAgICAgYWNsIHRvIGJlIGNoZWNrZWQKLSAgICAgKiBAcmV0dXJuIDAgaWYgQWNsIGlzIG5vdCBrbm93biwgaWQgb2YgQWNsIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGhhc0FjbChJbk1lbW9yeUFjbCBhY2wpIHsKLSAgICAgICAgZm9yIChJbk1lbW9yeUFjbCBhY2wyIDogZkFjbHMpIHsKLSAgICAgICAgICAgIGlmIChhY2wyLmVxdWFscyhhY2wpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjbDIuZ2V0SWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgYWRkQWNsKEluTWVtb3J5QWNsIGFjbCkgewotICAgICAgICBpbnQgYWNsSWQgPSAtMTsKLQotICAgICAgICBpZiAobnVsbCA9PSBhY2wpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWNsSWQgPSBoYXNBY2woYWNsKTsKLSAgICAgICAgICAgIGlmIChhY2xJZCA8IDApIHsKLSAgICAgICAgICAgICAgICBhY2xJZCA9IGdldE5leHRBY2xJZCgpOwotICAgICAgICAgICAgICAgIGFjbC5zZXRJZChhY2xJZCk7Ci0gICAgICAgICAgICAgICAgZkFjbHMuYWRkKGFjbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB1bmxvY2soKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWNsSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBY2wgYXBwbHlBY2woU3RvcmVkT2JqZWN0IHNvLCBBY2wgYWNsKSB7Ci0gICAgICAgIGludCBhY2xJZCA9IHNldEFjbCgoU3RvcmVkT2JqZWN0SW1wbCkgc28sIGFjbCk7Ci0gICAgICAgIHJldHVybiBnZXRBY2woYWNsSWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgQWNsIGFwcGx5QWNsKFN0b3JlZE9iamVjdCBzbywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzKSB7Ci0gICAgICAgIGludCBhY2xJZCA9IGdldEFjbElkKChTdG9yZWRPYmplY3RJbXBsKSBzbywgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgICgoU3RvcmVkT2JqZWN0SW1wbCkgc28pLnNldEFjbElkKGFjbElkKTsKLSAgICAgICAgcmV0dXJuIGdldEFjbChhY2xJZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBY2wgYXBwbHlBY2xSZWN1cnNpdmUoRm9sZGVyIGZvbGRlciwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBTdHJpbmcgcHJpbmNpcGFsSWQpIHsKLSAgICAgICAgTGlzdDxGaWxlYWJsZT4gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihmb2xkZXIsIC0xLCAtMSwgQURNSU5fUFJJTkNJUEFMX0lELCBmYWxzZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgQWNsIHJlc3VsdCA9IGFwcGx5QWNsKGZvbGRlciwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEZpbGVhYmxlIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGlmIChoYXNBbGxBY2Nlc3MocHJpbmNpcGFsSWQsIGNoaWxkKSkgewotICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgICAgICAgICBhcHBseUFjbFJlY3Vyc2l2ZSgoRm9sZGVyKSBjaGlsZCwgYWRkQWNlcywgcmVtb3ZlQWNlcywgcHJpbmNpcGFsSWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5QWNsKGNoaWxkLCBhZGRBY2VzLCByZW1vdmVBY2VzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgQWNsIGFwcGx5QWNsUmVjdXJzaXZlKEZvbGRlciBmb2xkZXIsIEFjbCBhY2wsIFN0cmluZyBwcmluY2lwYWxJZCkgewotICAgICAgICBMaXN0PEZpbGVhYmxlPiBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGZvbGRlciwgLTEsIC0xLCBBRE1JTl9QUklOQ0lQQUxfSUQsIGZhbHNlKS5nZXRDaGlsZHJlbigpOwotICAgICAgICBBY2wgcmVzdWx0ID0gYXBwbHlBY2woZm9sZGVyLCBhY2wpOwotCi0gICAgICAgIGlmIChudWxsID09IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChGaWxlYWJsZSBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBpZiAoaGFzQWxsQWNjZXNzKHByaW5jaXBhbElkLCBjaGlsZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBwbHlBY2xSZWN1cnNpdmUoKEZvbGRlcikgY2hpbGQsIGFjbCwgcHJpbmNpcGFsSWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5QWNsKGNoaWxkLCBhY2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFN0b3JlZE9iamVjdD4gZ2V0QWxsUmVsYXRpb25zaGlwcyhTdHJpbmcgb2JqZWN0SWQsIFJlbGF0aW9uc2hpcERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKLQotICAgICAgICBMaXN0PFN0b3JlZE9iamVjdD4gcmVzID0gbmV3IEFycmF5TGlzdDxTdG9yZWRPYmplY3Q+KCk7Ci0KLSAgICAgICAgZm9yIChTdG9yZWRPYmplY3Qgc28gOiBmU3RvcmVkT2JqZWN0TWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBSZWxhdGlvbnNoaXApIHsKLSAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgcm8gPSAoUmVsYXRpb25zaGlwKSBzbzsKLSAgICAgICAgICAgICAgICBpZiAocm8uZ2V0U291cmNlT2JqZWN0SWQoKS5lcXVhbHMob2JqZWN0SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoUmVsYXRpb25zaGlwRGlyZWN0aW9uLkVJVEhFUiA9PSBkaXJlY3Rpb24gfHwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlNPVVJDRSA9PSBkaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5hZGQoc28pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm8uZ2V0VGFyZ2V0T2JqZWN0SWQoKS5lcXVhbHMob2JqZWN0SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoUmVsYXRpb25zaGlwRGlyZWN0aW9uLkVJVEhFUiA9PSBkaXJlY3Rpb24gfHwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlRBUkdFVCA9PSBkaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5hZGQoc28pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZUluVXNlKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgb2JqZWN0cyBhbmQgY2hlY2sgZm9yIGVhY2ggaWYgdGhlIHR5cGUgbWF0Y2hlcwotICAgICAgICBmb3IgKFN0cmluZyBvYmplY3RJZCA6IGdldElkcygpKSB7Ci0gICAgICAgICAgICBTdG9yZWRPYmplY3Qgc28gPSBnZXRPYmplY3RCeUlkKG9iamVjdElkKTsKLSAgICAgICAgICAgIGlmIChzby5nZXRUeXBlSWQoKS5lcXVhbHModHlwZUlkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJlbnQoU3RvcmVkT2JqZWN0IHNvLCBGb2xkZXIgcGFyZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2NrKCk7Ci0gICAgICAgICAgICBpZiAoaGFzQ2hpbGQocGFyZW50LCBzby5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYXNzaWduIG5ldyBwYXJlbnQgZm9sZGVyLCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGFyZ2V0IGZvbGRlci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE11bHRpRmlsaW5nIG1maTsKLSAgICAgICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIE11bHRpRmlsaW5nKSB7Ci0gICAgICAgICAgICAgICAgbWZpID0gKE11bHRpRmlsaW5nKSBzbzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0ICIgKyBzby5nZXRJZCgpICsgImlzIG5vdCBmaWxlYWJsZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRQYXJlbnRJbnRlcm4obWZpLCBwYXJlbnQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJlbnQoU3RvcmVkT2JqZWN0IHNvLCBGb2xkZXIgcGFyZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2NrKCk7Ci0gICAgICAgICAgICBNdWx0aUZpbGluZyBtZmk7Ci0gICAgICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBNdWx0aUZpbGluZykgewotICAgICAgICAgICAgICAgIG1maSA9IChNdWx0aUZpbGluZykgc287Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCAiICsgc28uZ2V0SWQoKSArICJpcyBub3QgZmlsZWFibGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVtb3ZlUGFyZW50SW50ZXJuKG1maSwgcGFyZW50KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBhcmVudEludGVybihNdWx0aUZpbGluZyBzbywgRm9sZGVyIHBhcmVudCkgewotICAgICAgICBzby5hZGRQYXJlbnRJZChwYXJlbnQuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVBhcmVudEludGVybihNdWx0aUZpbGluZyBzbywgRm9sZGVyIHBhcmVudCkgewotICAgICAgICBzby5yZW1vdmVQYXJlbnRJZChwYXJlbnQuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzb3J0Rm9sZGVyTGlzdChMaXN0PD8gZXh0ZW5kcyBTdG9yZWRPYmplY3Q+IGxpc3QpIHsKLSAgICAgICAgLy8gVE9ETyBldmFsdWF0ZSBvcmRlckJ5LCBmb3Igbm93IHNvcnQgYnkgcGF0aCBzZWdtZW50Ci0gICAgICAgIGNsYXNzIEZvbGRlckNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFN0b3JlZE9iamVjdD4gewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTdG9yZWRPYmplY3QgZjEsIFN0b3JlZE9iamVjdCBmMikgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZWdtZW50MSA9IGYxLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VnbWVudDIgPSBmMi5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2VnbWVudDEuY29tcGFyZVRvKHNlZ21lbnQyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IEZvbGRlckNvbXBhcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudChTdG9yZWRPYmplY3Qgc28sIGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCkgewotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBDb250ZW50KSB7Ci0gICAgICAgICAgICBDb250ZW50IGNvbnRlbnQgPSAoQ29udGVudCkgc287Ci0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjb250ZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGNvbnRlbnRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDw9IDAgJiYgbGVuZ3RoIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50U3RyZWFtOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChDb250ZW50U3RyZWFtRGF0YUltcGwpY29udGVudFN0cmVhbSkuZ2V0Q2xvbmVXaXRoTGltaXRzKG9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGNvbnRlbnQsIG9iamVjdCBkb2VzIG5vdCBpbXBsZW1lbnQgaW50ZXJmYWNlIENvbnRlbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBzZXRDb250ZW50KFN0b3JlZE9iamVjdCBzbywgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtKSB7Ci0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIENvbnRlbnQpIHsKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW1EYXRhSW1wbCBuZXdDb250ZW50OwotICAgICAgICAgICAgQ29udGVudCBjb250ZW50ID0gKENvbnRlbnQpIHNvOwotCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBjb250ZW50U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgbmV3Q29udGVudCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlRmFrZUNvbnRlbnRTdG9yZSA9IHNvLmdldFR5cGVJZCgpLmVxdWFscyhEZWZhdWx0VHlwZVN5c3RlbUNyZWF0b3IuQklHX0NPTlRFTlRfRkFLRV9UWVBFKTsKLSAgICAgICAgICAgICAgICBuZXdDb250ZW50ID0gbmV3IENvbnRlbnRTdHJlYW1EYXRhSW1wbChNQVhfQ09OVEVOVF9TSVpFX0tCID09IG51bGwgPyAwIDogTUFYX0NPTlRFTlRfU0laRV9LQiwgdXNlRmFrZUNvbnRlbnRTdG9yZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gY29udGVudFN0cmVhbS5nZXRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGZpbGVOYW1lIHx8IGZpbGVOYW1lLmxlbmd0aCgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBzby5nZXROYW1lKCk7IC8vIHVzZSBuYW1lIG9mIGRvY3VtZW50IGFzIGZhbGxiYWNrCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBtaW1lVHlwZSB8fCBtaW1lVHlwZS5sZW5ndGgoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7IC8vIHVzZSBhcyBmYWxsYmFjawotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdDb250ZW50LnNldE1pbWVUeXBlKG1pbWVUeXBlKTsKLSAgICAgICAgICAgICAgICBuZXdDb250ZW50LnNldExhc3RNb2RpZmllZChuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5zZXRDb250ZW50KGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2V0IGNvbnRlbnQgZnJvbSBJbnB1dFN0cmVhbSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRlbnQuc2V0Q29udGVudChuZXdDb250ZW50KTsKLSAgICAgICAgICAgIHJldHVybiBuZXdDb250ZW50OwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IHNldCBjb250ZW50LCBvYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IGludGVyZmFjZSBDb250ZW50LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQ29udGVudChTdG9yZWRPYmplY3Qgc28sIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSkgewotICAgICAgICBpZiAoc28gaW5zdGFuY2VvZiBDb250ZW50KSB7Ci0gICAgICAgICAgICBDb250ZW50IGNvbnRlbnQgPSAoQ29udGVudCkgc287Ci0gICAgICAgICAgICBDb250ZW50U3RyZWFtRGF0YUltcGwgbmV3Q29udGVudCA9IChDb250ZW50U3RyZWFtRGF0YUltcGwpIGNvbnRlbnQuZ2V0Q29udGVudCgpOwotCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBuZXdDb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgY29udGVudC5zZXRDb250ZW50KG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LmFwcGVuZENvbnRlbnQoY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24oIkZhaWxlZCB0byBhcHBlbmQgY29udGVudDogSU8gRXhjZXB0aW9uIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBzZXQgY29udGVudCwgb2JqZWN0IGRvZXMgbm90IGltcGxlbWVudCBpbnRlcmZhY2UgQ29udGVudC4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxSZW5kaXRpb25EYXRhPiBnZXRSZW5kaXRpb25zKFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgbG9uZyBtYXhJdGVtcywgbG9uZyBza2lwQ291bnQpIHsKLQotICAgICAgICByZXR1cm4gUmVuZGl0aW9uVXRpbC5nZXRSZW5kaXRpb25zKHNvLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldFJlbmRpdGlvbkNvbnRlbnQoU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgc3RyZWFtSWQsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbmd0aCkgewotICAgICAgICByZXR1cm4gUmVuZGl0aW9uVXRpbC5nZXRSZW5kaXRpb25Db250ZW50KHNvLCBzdHJlYW1JZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvUGVybWlzc2lvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvUGVybWlzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWU3ODgxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1Blcm1pc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5CYXNpY1Blcm1pc3Npb25zOw0KLQ0KLXB1YmxpYyBlbnVtIFBlcm1pc3Npb24gew0KLSAgICBOT05FKCJub25lIiksIFJFQUQoInJlYWQiKSwgV1JJVEUoIndyaXRlIiksIEFMTCgiYWxsIik7DQotDQotICAgIHByaXZhdGUgZW51bSBFbnVtQmFzaWNQZXJtaXNzaW9ucyB7DQotDQotICAgICAgICBDTUlTX1JFQUQoQmFzaWNQZXJtaXNzaW9ucy5SRUFEKSwgQ01JU19XUklURShCYXNpY1Blcm1pc3Npb25zLldSSVRFKSwgQ01JU19BTEwoQmFzaWNQZXJtaXNzaW9ucy5BTEwpOw0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7DQotDQotICAgICAgICBFbnVtQmFzaWNQZXJtaXNzaW9ucyhTdHJpbmcgdikgew0KLSAgICAgICAgICAgIHZhbHVlID0gdjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFbnVtQmFzaWNQZXJtaXNzaW9ucyBmcm9tVmFsdWUoU3RyaW5nIHYpIHsNCi0gICAgICAgICAgICBmb3IgKEVudW1CYXNpY1Blcm1pc3Npb25zIGMgOiBFbnVtQmFzaWNQZXJtaXNzaW9ucy52YWx1ZXMoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7DQotDQotICAgIFBlcm1pc3Npb24oU3RyaW5nIHYpIHsNCi0gICAgICAgIHZhbHVlID0gdjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgew0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUGVybWlzc2lvbiBmcm9tVmFsdWUoU3RyaW5nIHYpIHsNCi0gICAgICAgIGZvciAoUGVybWlzc2lvbiBjIDogUGVybWlzc2lvbi52YWx1ZXMoKSkgew0KLSAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gYzsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUGVybWlzc2lvbiBmcm9tQ21pc1N0cmluZyhTdHJpbmcgc3RyUGVybSkgew0KLSAgICAgICAgUGVybWlzc2lvbiBwZXJtaXNzaW9uOw0KLSAgICAgICAgaWYgKHN0clBlcm0uZXF1YWxzKEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRC52YWx1ZSgpKSkgew0KLSAgICAgICAgICAgIHBlcm1pc3Npb24gPSBQZXJtaXNzaW9uLlJFQUQ7DQotICAgICAgICB9IGVsc2UgaWYgKHN0clBlcm0uZXF1YWxzKEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUudmFsdWUoKSkpIHsNCi0gICAgICAgICAgICBwZXJtaXNzaW9uID0gUGVybWlzc2lvbi5XUklURTsNCi0gICAgICAgIH0gZWxzZSBpZiAoc3RyUGVybS5lcXVhbHMoRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19BTEwudmFsdWUoKSkpIHsNCi0gICAgICAgICAgICBwZXJtaXNzaW9uID0gUGVybWlzc2lvbi5BTEw7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluTWVtb3J5IG9ubHkgc3VwcG9ydHMgQ01JUyBiYXNpYyBwZXJtaXNzaW9ucyByZWFkLCB3cml0ZSwgYWxsLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHBlcm1pc3Npb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0b0NtaXNTdHJpbmcoKSB7DQotICAgICAgICBpZiAodGhpcy5lcXVhbHMoUkVBRCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19SRUFELnZhbHVlKCk7DQotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXF1YWxzKFdSSVRFKSkgew0KLSAgICAgICAgICAgIHJldHVybiBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFLnZhbHVlKCk7DQotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXF1YWxzKEFMTCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19BTEwudmFsdWUoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1BvbGljeUltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1BvbGljeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2ZTE2NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9Qb2xpY3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5GaWx0ZXJQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Qb2xpY3k7Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3lJbXBsIGV4dGVuZHMgU3RvcmVkT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFBvbGljeSB7Ci0KLSAgICBwdWJsaWMgUG9saWN5SW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwb2xpY3lUZXh0OwotCi0gICAgcHVibGljIHZvaWQgc2V0UG9saWN5VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBwb2xpY3lUZXh0ID0gdGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvbGljeVRleHQoKSB7Ci0gICAgICAgIHJldHVybiBwb2xpY3lUZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZpbGxQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgQmluZGluZ3NPYmplY3RGYWN0b3J5IG9iakZhY3RvcnksCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzKSB7Ci0KLSAgICAgICAgc3VwZXIuZmlsbFByb3BlcnRpZXMocHJvcGVydGllcywgb2JqRmFjdG9yeSwgcmVxdWVzdGVkSWRzKTsKLQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLlBPTElDWV9URVhULAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5QT0xJQ1lfVEVYVCwgcG9saWN5VGV4dCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1JhbmRvbUlucHV0U3RyZWFtLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9SYW5kb21JbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZThmZTM2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1JhbmRvbUlucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLXB1YmxpYyBjbGFzcyBSYW5kb21JbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLQotICAgIHByaXZhdGUgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGxvbmcgc2l6ZTsKLSAgICBwcml2YXRlIGxvbmcgYnl0ZXNSZWFkOwotCi0gICAgcHVibGljIFJhbmRvbUlucHV0U3RyZWFtKGxvbmcgc2l6ZSkgewotICAgICAgICB0aGlzLnNpemUgPSBzaXplOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja09wZW4oKTsKLSAgICAgICAgbG9uZyBsZW4gPSBjaGVja0xpbWl0KDEpOwotICAgICAgICBpZiAobGVuID4gMCkgewotICAgICAgICAgICAgaW50IHJlc3VsdCA9IHJhbmRvbS5uZXh0SW50KCkgJSAyNTY7Ci0gICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlc1JlYWQrKzsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrT3BlbigpOwotICAgICAgICBpbnQgc2l6ZVRvUmVhZCA9IChpbnQpY2hlY2tMaW1pdChsZW5ndGgpOwotICAgICAgICBpZiAoMCA9PSBzaXplVG9SZWFkKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gdGVtcCA9IG5ldyBieXRlW3NpemVUb1JlYWRdOwotICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHRlbXApOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGRhdGEsIG9mZnNldCwgc2l6ZVRvUmVhZCk7Ci0gICAgICAgIGJ5dGVzUmVhZCArPSBsZW5ndGg7Ci0gICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBjaGVja09wZW4oKTsKLSAgICAgICAgbG9uZyBsZW4gPSBjaGVja0xpbWl0KGRhdGEubGVuZ3RoKTsKLSAgICAgICAgaWYgKDAgPT0gbGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhkYXRhKTsKLSAgICAgICAgYnl0ZXNSZWFkICs9IGxlbjsKLSAgICAgICAgcmV0dXJuIChpbnQpIGxlbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgYnl0ZXNUb1NraXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrT3BlbigpOwotICAgICAgICBsb25nIHNraXAgPSBjaGVja0xpbWl0KGJ5dGVzVG9Ta2lwKTsKLSAgICAgICAgYnl0ZXNSZWFkICs9IHNraXA7Ci0gICAgICAgIHJldHVybiBza2lwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB0aGlzLmlzQ2xvc2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIChpbnQpKHNpemUgLSBieXRlc1JlYWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja09wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaXNDbG9zZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUmFuZG9tSW5wdXRTdHJlYW0gd2FzIGFscmVhZHkgY2xvc2VkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIGNoZWNrTGltaXQobG9uZyBzaXplUmVxdWVzdGVkKSB7Ci0gICAgICAgIGlmIChieXRlc1JlYWQgPj0gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnl0ZXNSZWFkICsgc2l6ZVJlcXVlc3RlZCA+PSBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZSAtIGJ5dGVzUmVhZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzaXplUmVxdWVzdGVkOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9SZWxhdGlvbnNoaXBJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9SZWxhdGlvbnNoaXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjA4YzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvUmVsYXRpb25zaGlwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5CaW5kaW5nc09iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRmlsdGVyUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuUmVsYXRpb25zaGlwOwotCi1wdWJsaWMgY2xhc3MgUmVsYXRpb25zaGlwSW1wbCBleHRlbmRzIFN0b3JlZE9iamVjdEltcGwgaW1wbGVtZW50cyBSZWxhdGlvbnNoaXAgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlT2JqSWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0T2JqSWQ7Ci0KLSAgICBwdWJsaWMgUmVsYXRpb25zaGlwSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU9iamVjdElkKCkgewotICAgICAgICByZXR1cm4gc291cmNlT2JqSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLnNvdXJjZU9iaklkID0gaWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3RJZCgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE9iaklkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChTdHJpbmcgaWQpIHsKLSAgICAgICAgdGFyZ2V0T2JqSWQgPSBpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaWxsUHJvcGVydGllcyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMsIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBvYmpGYWN0b3J5LAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3RlZElkcykgewotCi0gICAgICAgIHN1cGVyLmZpbGxQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIG9iakZhY3RvcnksIHJlcXVlc3RlZElkcyk7Ci0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlNPVVJDRV9JRCwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuU09VUkNFX0lELAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQsIHNvdXJjZU9iaklkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuVEFSR0VUX0lELCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5UQVJHRVRfSUQsCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLlRBUkdFVF9JRCwgdGFyZ2V0T2JqSWQpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9SZW5kaXRpb25VdGlsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9SZW5kaXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGM3NzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvUmVuZGl0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlbmRpdGlvbkRhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlZE9iamVjdDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUmVuZGl0aW9uVXRpbCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlbmRpdGlvblV0aWwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA2NTUzNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5ESVRJT05fTUlNRV9UWVBFX0pQRUcgPSAiaW1hZ2UvanBlZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVORElUSU9OX01JTUVfVFlQRV9QTkcgPSAiaW1hZ2UvcG5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5ESVRJT05fU1VGRklYID0gIi1yZW5kaXRpb24iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRIVU1CTkFJTF9TSVpFID0gMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElDT05fU0laRSA9IDMyOwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1JlbmRpdGlvbihTdG9yZWRPYmplY3Qgc28sIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGlmIChzbyBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc28gaW5zdGFuY2VvZiBDb250ZW50KSB7Ci0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSAoKENvbnRlbnQpc28pLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGNvbnRlbnRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGlzSW1hZ2UobWltZVR5cGUpIHx8IGlzQXVkaW8obWltZVR5cGUpIHx8IGlzVmlkZW8obWltZVR5cGUpIHx8IGlzUERGKG1pbWVUeXBlKSB8fCBpc1Bvd2VycG9pbnQobWltZVR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHx8IGlzRXhjZWwobWltZVR5cGUpIHx8IGlzV29yZChtaW1lVHlwZSkgfHwgaXNIdG1sKG1pbWVUeXBlKSB8fCBpc1BsYWluVGV4dChtaW1lVHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ltYWdlKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICByZXR1cm4gbWltZVR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dvcmQoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50IikKLSAgICAgICAgICAgICAgICB8fCBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL21zLXdvcmQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXhjZWwoU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IikKLSAgICAgICAgICAgICAgICB8fCBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQb3dlcnBvaW50KFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICByZXR1cm4gbWltZVR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93IikKLSAgICAgICAgICAgICAgICB8fCBtaW1lVHlwZS5lcXVhbHMoImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24iKQotICAgICAgICAgICAgICAgIHx8IG1pbWVUeXBlLmVxdWFscygiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUERGKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICByZXR1cm4gbWltZVR5cGUuZXF1YWxzKCJhcHBsaWNhdGlvbi9wZGYiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbChTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1pbWVUeXBlLmVxdWFscygidGV4dC9odG1sIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F1ZGlvKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICByZXR1cm4gbWltZVR5cGUuc3RhcnRzV2l0aCgiYXVkaW8vIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZpZGVvKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICByZXR1cm4gbWltZVR5cGUuc3RhcnRzV2l0aCgidmlkZW8vIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BsYWluVGV4dChTdHJpbmcgbWltZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIG1pbWVUeXBlLmVxdWFscygidGV4dC9wbGFpbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFN0cmVhbSBnZXRJY29uRnJvbVJlc291cmNlRGlyKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIElucHV0U3RyZWFtIGltYWdlU3RyZWFtID0gU3RvcmVkT2JqZWN0SW1wbC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgIGludCBub0J5dGVzUmVhZCA9IDA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICgobm9CeXRlc1JlYWQgPSBpbWFnZVN0cmVhbS5yZWFkKGJ1ZmZlcikpID49IDApIHsKLSAgICAgICAgICAgICAgICBiYS53cml0ZShidWZmZXIsIDAsIG5vQnl0ZXNSZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGJhKTsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGltYWdlU3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRlbnRTdHJlYW1EYXRhSW1wbCBjb250ZW50ID0gbmV3IENvbnRlbnRTdHJlYW1EYXRhSW1wbCgwKTsKLSAgICAgICAgY29udGVudC5zZXRGaWxlTmFtZShuYW1lKTsKLSAgICAgICAgY29udGVudC5zZXRNaW1lVHlwZSgiaW1hZ2UvcG5nIik7Ci0gICAgICAgIGNvbnRlbnQuc2V0Q29udGVudChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmEudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdGVzdFJlbmRpdGlvbkZpbHRlckZvckltYWdlKFN0cmluZ1tdIGZvcm1hdHMpIHsKLSAgICAgICAgaWYgKGZvcm1hdHMubGVuZ3RoID09IDEgJiYgbnVsbCAhPSBmb3JtYXRzWzBdICYmIGZvcm1hdHNbMF0uZXF1YWxzKCJjbWlzOm5vbmUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFycmF5Q29udGFpbnNTdHJpbmcoZm9ybWF0cywgIioiKSB8fCBhcnJheUNvbnRhaW5zU3RyaW5nKGZvcm1hdHMsICJpbWFnZS8qIikKLSAgICAgICAgICAgICAgICAgICAgfHwgYXJyYXlDb250YWluc1N0cmluZyhmb3JtYXRzLCAiaW1hZ2UvanBlZyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcnJheUNvbnRhaW5zU3RyaW5nKFN0cmluZ1tdIGZvcm1hdHMsIFN0cmluZyB2YWwpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IGZvcm1hdHMpIHsKLSAgICAgICAgICAgIGlmICh2YWwuZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFN0cmVhbSBnZXRSZW5kaXRpb25Db250ZW50KFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHN0cmVhbUlkLCBsb25nIG9mZnNldCwgbG9uZyBsZW5ndGgpIHsKLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gUmVuZGl0aW9uVXRpbC5nZXRGb2xkZXJSZW5kaXRpb25Db250ZW50KHN0cmVhbUlkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEoc28gaW5zdGFuY2VvZiBDb250ZW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgb2JqZWN0cyB3aXRoIGNvbnRlbnQgY2FuIGhhdmUgYSByZW5kaXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSAoKENvbnRlbnQpc28pLmdldENvbnRlbnQoKTsKLQotICAgICAgICBpZiAobnVsbCA9PSBjb250ZW50U3RyZWFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGlzSW1hZ2UobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VUaHVtYm5haWxHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IEltYWdlVGh1bWJuYWlsR2VuZXJhdG9yKGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZ2V0UmVuZGl0aW9uKFRIVU1CTkFJTF9TSVpFLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBdWRpbyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SWNvbkZyb21SZXNvdXJjZURpcigiL2F1ZGlvLXgtZ2VuZXJpYy5wbmciKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNWaWRlbyhtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SWNvbkZyb21SZXNvdXJjZURpcigiL3ZpZGVvLXgtZ2VuZXJpYy5wbmciKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQREYobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEljb25Gcm9tUmVzb3VyY2VEaXIoIi9hcHBsaWNhdGlvbi1wZGYucG5nIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzV29yZChtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SWNvbkZyb21SZXNvdXJjZURpcigiL2FwcGxpY2F0aW9uLW1zd29yZC5wbmciKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQb3dlcnBvaW50KG1pbWVUeXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJY29uRnJvbVJlc291cmNlRGlyKCIvYXBwbGljYXRpb24tdm5kLm1zLXBvd2VycG9pbnQucG5nIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRXhjZWwobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEljb25Gcm9tUmVzb3VyY2VEaXIoIi9hcHBsaWNhdGlvbi12bmQubXMtZXhjZWwucG5nIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSHRtbChtaW1lVHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SWNvbkZyb21SZXNvdXJjZURpcigiL3RleHQtaHRtbC5wbmciKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpblRleHQobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEljb25Gcm9tUmVzb3VyY2VEaXIoIi90ZXh0LXgtZ2VuZXJpYy5wbmciKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIHJlbmRpdGlvbjogIiwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBnZW5lcmF0ZSByZW5kaXRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBDb250ZW50U3RyZWFtIGdldEZvbGRlclJlbmRpdGlvbkNvbnRlbnQoU3RyaW5nIHN0cmVhbUlkLCBsb25nIG9mZnNldCwgbG9uZyBsZW5ndGgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJY29uRnJvbVJlc291cmNlRGlyKCIvZm9sZGVyLnBuZyIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSByZW5kaXRpb246ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVuZGl0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFJlbmRpdGlvbkRhdGE+IGdldFJlbmRpdGlvbnMoU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBsb25nIG1heEl0ZW1zLCBsb25nIHNraXBDb3VudCkgewotCi0gICAgICAgIFN0cmluZyB0b2tlbml6ZXIgPSAiW1xccztdIjsKLSAgICAgICAgaWYgKG51bGwgPT0gcmVuZGl0aW9uRmlsdGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSBmb3JtYXRzID0gcmVuZGl0aW9uRmlsdGVyLnNwbGl0KHRva2VuaXplcik7Ci0gICAgICAgIGJvb2xlYW4gaXNJbWFnZVJlbmRpdGlvbiA9IFJlbmRpdGlvblV0aWwudGVzdFJlbmRpdGlvbkZpbHRlckZvckltYWdlKGZvcm1hdHMpOwotICAgICAgICBpZiAoIShzbyBpbnN0YW5jZW9mIENvbnRlbnQpICYmICEoc28gaW5zdGFuY2VvZiBGb2xkZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGlzSW1hZ2VSZW5kaXRpb24gJiYgaGFzUmVuZGl0aW9uKHNvLCBudWxsKSkgewotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlOwotICAgICAgICAgICAgaWYgKHNvICBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gImltYWdlL3BuZyI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9ICgoQ29udGVudClzbykuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gY29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IHJlbmRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFJlbmRpdGlvbkRhdGE+KDEpOwotICAgICAgICAgICAgUmVuZGl0aW9uRGF0YUltcGwgcmVuZGl0aW9uID0gbmV3IFJlbmRpdGlvbkRhdGFJbXBsKCk7Ci0gICAgICAgICAgICBpZiAobWltZVR5cGUuZXF1YWxzKCJpbWFnZS9qcGVnIikpIHsKLSAgICAgICAgICAgICAgICByZW5kaXRpb24uc2V0QmlnSGVpZ2h0KEJpZ0ludGVnZXIudmFsdWVPZihUSFVNQk5BSUxfU0laRSkpOwotICAgICAgICAgICAgICAgIHJlbmRpdGlvbi5zZXRCaWdXaWR0aChCaWdJbnRlZ2VyLnZhbHVlT2YoVEhVTUJOQUlMX1NJWkUpKTsKLSAgICAgICAgICAgICAgICByZW5kaXRpb24uc2V0TWltZVR5cGUoUkVORElUSU9OX01JTUVfVFlQRV9KUEVHKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVuZGl0aW9uLnNldEJpZ0hlaWdodChCaWdJbnRlZ2VyLnZhbHVlT2YoSUNPTl9TSVpFKSk7Ci0gICAgICAgICAgICAgICAgcmVuZGl0aW9uLnNldEJpZ1dpZHRoKEJpZ0ludGVnZXIudmFsdWVPZihJQ09OX1NJWkUpKTsKLSAgICAgICAgICAgICAgICByZW5kaXRpb24uc2V0TWltZVR5cGUoUkVORElUSU9OX01JTUVfVFlQRV9QTkcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVuZGl0aW9uLnNldEtpbmQoImNtaXM6dGh1bWJuYWlsIik7Ci0gICAgICAgICAgICByZW5kaXRpb24uc2V0UmVuZGl0aW9uRG9jdW1lbnRJZChzby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHJlbmRpdGlvbi5zZXRTdHJlYW1JZChzby5nZXRJZCgpICsgUkVORElUSU9OX1NVRkZJWCk7Ci0gICAgICAgICAgICByZW5kaXRpb24uc2V0QmlnTGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZigtMUwpKTsKLSAgICAgICAgICAgIHJlbmRpdGlvbi5zZXRUaXRsZShzby5nZXROYW1lKCkpOwotICAgICAgICAgICAgcmVuZGl0aW9ucy5hZGQocmVuZGl0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiByZW5kaXRpb25zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1N0b3JlTWFuYWdlckZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1N0b3JlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMzlhOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9TdG9yZU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBDcmVhdGUgb2JqZWN0cyB0aGF0IGFyZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50IHN0b3JlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RvcmVNYW5hZ2VyRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RvcmVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0b3JlTWFuYWdlckZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdG9yZU1hbmFnZXIgY3JlYXRlSW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCi0gICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNyZWF0ZSBTdG9yZWRPYmplY3RDcmVhdG9yLCBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBkb2VzIG5vdCBleGlzdC4iOwotICAgICAgICAgICAgTE9HLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24obXNnLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqID0gY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgU3RvcmVkT2JqZWN0Q3JlYXRvciBmcm9tIGNsYXNzICIgKyBjbGFzc05hbWUsIGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBTdG9yZWRPYmplY3RDcmVhdG9yIGZyb20gY2xhc3MgIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU3RvcmVNYW5hZ2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0b3JlTWFuYWdlcikgb2JqOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFN0b3JlZE9iamVjdENyZWF0b3IsIGNsYXNzICIgKyBjbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGltcGxlbWVudCBpbnRlcmZhY2UgU3RvcmVkT2JqZWN0Q3JlYXRvciIpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1N0b3JlTWFuYWdlckltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1N0b3JlTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4YTkxMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9TdG9yZU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBlcm1pc3Npb25NYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q2hhbmdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlKb2luOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eU9yZGVyQnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UmVuZGl0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5TdXBwb3J0ZWRQZXJtaXNzaW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNsQ2FwYWJpbGl0aWVzRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNyZWF0YWJsZVByb3BlcnR5VHlwZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5OZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbkRlZmluaXRpb25EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUGVybWlzc2lvbk1hcHBpbmdEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlJbmZvSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlQ3JlYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkucXVlcnkuSW5NZW1vcnlRdWVyeVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuSW5NZW1vcnlTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkNtaXNTZXJ2aWNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuT2JqZWN0U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5TdG9yZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZURlZmluaXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIG9iamVjdHMgdGhhdCBhcmUgc3RvcmVkIGluIHRoZSBJbk1lbW9yeSBzdG9yZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RvcmVNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIFN0b3JlTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9SRVBPU0lUT1JZID0gIlVua25vd24gcmVwb3NpdG9yeSAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTUlTX1JFQUQgPSAiY21pczpyZWFkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU19XUklURSA9ICJjbWlzOndyaXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU19BTEwgPSAiY21pczphbGwiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nc09iamVjdEZhY3RvcnkgZk9iamVjdEZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdHlwZUZhY3RvcnkgPSBUeXBlRGVmaW5pdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkNNSVNfVkVSU0lPTjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkNNSVNfU0VSVkVSOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgUGFja2FnZSBwID0gUGFja2FnZS5nZXRQYWNrYWdlKCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeSIpOwotICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBPUEVOQ01JU19WRVJTSU9OID0gIj8iOwotICAgICAgICAgICAgT1BFTkNNSVNfU0VSVkVSID0gIkFwYWNoZS1DaGVtaXN0cnktT3BlbkNNSVMtSW5NZW1vcnkiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHZlciA9IHAuZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCk7Ci0gICAgICAgICAgICBPUEVOQ01JU19WRVJTSU9OID0gKG51bGwgPT0gdmVyID8gIj8iIDogdmVyKTsKLSAgICAgICAgICAgIE9QRU5DTUlTX1NFUlZFUiA9ICJBcGFjaGUtQ2hlbWlzdHJ5LU9wZW5DTUlTLUluTWVtb3J5LyIgKyBPUEVOQ01JU19WRVJTSU9OOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFwIGZyb20gcmVwb3NpdG9yeSBpZCB0byBhIHR5cGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGVNYW5hZ2VySW1wbD4gZk1hcFJlcG9zaXRvcnlUb1R5cGVNYW5hZ2VyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUeXBlTWFuYWdlckltcGw+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBNYXAgZnJvbSByZXBvc2l0b3J5IGlkIHRvIGEgb2JqZWN0IHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0U3RvcmU+IGZNYXBSZXBvc2l0b3J5VG9PYmplY3RTdG9yZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0U3RvcmU+KCk7Ci0KLSAgICBwdWJsaWMgT2JqZWN0U3RvcmVJbXBsIGdldFN0b3JlKFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgcmV0dXJuIChPYmplY3RTdG9yZUltcGwpIGZNYXBSZXBvc2l0b3J5VG9PYmplY3RTdG9yZS5nZXQocmVwb3NpdG9yeUlkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RvcmVNYW5hZ2VySW1wbCgpIHsKLSAgICAgICAgZk9iamVjdEZhY3RvcnkgPSBuZXcgQmluZGluZ3NPYmplY3RGYWN0b3J5SW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsUmVwb3NpdG9yeUlkcygpIHsKLSAgICAgICAgU2V0PFN0cmluZz4gcmVwSWRzID0gZk1hcFJlcG9zaXRvcnlUb09iamVjdFN0b3JlLmtleVNldCgpOwotICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHJlc3VsdC5hZGRBbGwocmVwSWRzKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0UmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIGZNYXBSZXBvc2l0b3J5VG9PYmplY3RTdG9yZS5wdXQocmVwb3NpdG9yeUlkLCBuZXcgT2JqZWN0U3RvcmVJbXBsKHJlcG9zaXRvcnlJZCkpOwotICAgICAgICBmTWFwUmVwb3NpdG9yeVRvVHlwZU1hbmFnZXIucHV0KHJlcG9zaXRvcnlJZCwgbmV3IFR5cGVNYW5hZ2VySW1wbCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVBbmRJbml0UmVwb3NpdG9yeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUNyZWF0b3JDbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKGZNYXBSZXBvc2l0b3J5VG9PYmplY3RTdG9yZS5jb250YWluc0tleShyZXBvc2l0b3J5SWQpCi0gICAgICAgICAgICAgICAgfHwgZk1hcFJlcG9zaXRvcnlUb1R5cGVNYW5hZ2VyLmNvbnRhaW5zS2V5KHJlcG9zaXRvcnlJZCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QgYWRkIHJlcG9zaXRvcnksIHJlcG9zaXRvcnkgIiArIHJlcG9zaXRvcnlJZAotICAgICAgICAgICAgICAgICAgICArICIgYWxyZWFkeSBleGlzdHMuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmTWFwUmVwb3NpdG9yeVRvT2JqZWN0U3RvcmUucHV0KHJlcG9zaXRvcnlJZCwgbmV3IE9iamVjdFN0b3JlSW1wbChyZXBvc2l0b3J5SWQpKTsKLSAgICAgICAgZk1hcFJlcG9zaXRvcnlUb1R5cGVNYW5hZ2VyLnB1dChyZXBvc2l0b3J5SWQsIG5ldyBUeXBlTWFuYWdlckltcGwoKSk7Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgdHlwZSBzeXN0ZW06Ci0gICAgICAgIGluaXRUeXBlU3lzdGVtKHJlcG9zaXRvcnlJZCwgdHlwZUNyZWF0b3JDbGFzc05hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RTdG9yZSBnZXRPYmplY3RTdG9yZShTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIHJldHVybiBmTWFwUmVwb3NpdG9yeVRvT2JqZWN0U3RvcmUuZ2V0KHJlcG9zaXRvcnlJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNTZXJ2aWNlVmFsaWRhdG9yIGdldFNlcnZpY2VWYWxpZGF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5NZW1vcnlTZXJ2aWNlVmFsaWRhdG9ySW1wbCh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQmluZGluZ3NPYmplY3RGYWN0b3J5IGdldE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBmT2JqZWN0RmFjdG9yeTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25Db250YWluZXIgZ2V0VHlwZUJ5SWQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBUeXBlTWFuYWdlciB0eXBlTWFuYWdlciA9IGZNYXBSZXBvc2l0b3J5VG9UeXBlTWFuYWdlci5nZXQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgaWYgKG51bGwgPT0gdHlwZU1hbmFnZXIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oVU5LTk9XTl9SRVBPU0lUT1JZICsgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gY21pczExID0gSW5NZW1vcnlTZXJ2aWNlQ29udGV4dC5nZXRDYWxsQ29udGV4dCgpLmdldENtaXNWZXJzaW9uKCkgIT0gQ21pc1ZlcnNpb24uQ01JU18xXzA7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHRkYyA9IHR5cGVNYW5hZ2VyLmdldFR5cGVCeUlkKHR5cGVJZCk7Ci0gICAgICAgIGlmIChudWxsICE9IHRkYyAmJiAhY21pczExKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0ZCA9IHRkYy5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgaWYgKHRkLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfSVRFTSB8fCB0ZC5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWQotICAgICAgICAgICAgICAgICAgICB8fCB0ZC5nZXRJZCgpLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfSVRFTS52YWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICB8fCB0ZC5nZXRJZCgpLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfU0VDT05EQVJZLnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGRjID0gbnVsbDsgLy8gZmlsdGVyIG5ldyB0eXBlcyBmb3IgQ01JUyAxLjAKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAJLy8gcmVtb3ZlIHR5cGUgbXV0YWJpbGl0eSBpbmZvcm1hdGlvbjoKLSAgICAgICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gdGRtID0gdHlwZUZhY3RvcnkuY29weSh0ZCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdGRtLnNldFR5cGVNdXRhYmlsaXR5KG51bGwpOwotICAgICAgICAgICAgICAgIHRkYyA9IG5ldyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwodGRtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGRjOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBnZXRUeXBlQnlJZChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgaW50IGRlcHRoUGFyYW0pIHsKLSAgICAgICAgaW50IGRlcHRoID0gZGVwdGhQYXJhbTsKLSAgICAgICAgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIgPSBmTWFwUmVwb3NpdG9yeVRvVHlwZU1hbmFnZXIuZ2V0KHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChudWxsID09IHR5cGVNYW5hZ2VyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihVTktOT1dOX1JFUE9TSVRPUlkgKyByZXBvc2l0b3J5SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdGMgPSB0eXBlTWFuYWdlci5nZXRUeXBlQnlJZCh0eXBlSWQpOwotICAgICAgICBib29sZWFuIGNtaXMxMSA9IEluTWVtb3J5U2VydmljZUNvbnRleHQuZ2V0Q2FsbENvbnRleHQoKS5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotCi0gICAgICAgIGlmICh0YyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVwdGggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoY21pczExICYmIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMCB8fCBkZXB0aCA8IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgZGVwdGggdmFsdWU6ICIgKyBkZXB0aCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVMaXN0KGRlcHRoLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgdGMsIG51bGwsIGNtaXMxMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVmaW5pdGlvbkxpc3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLSAgICAgICAgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIgPSBmTWFwUmVwb3NpdG9yeVRvVHlwZU1hbmFnZXIuZ2V0KHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChudWxsID09IHR5cGVNYW5hZ2VyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihVTktOT1dOX1JFUE9TSVRPUlkgKyByZXBvc2l0b3J5SWQpOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb248VHlwZURlZmluaXRpb25Db250YWluZXI+IHR5cGVDb2xsID0gZ2V0Um9vdFR5cGVzKHJlcG9zaXRvcnlJZCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpOwotICAgICAgICByZXR1cm4gdHlwZUNvbGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFJvb3RUeXBlcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHJlc3VsdDsKLSAgICAgICAgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIgPSBmTWFwUmVwb3NpdG9yeVRvVHlwZU1hbmFnZXIuZ2V0KHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChudWxsID09IHR5cGVNYW5hZ2VyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihVTktOT1dOX1JFUE9TSVRPUlkgKyByZXBvc2l0b3J5SWQpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHJvb3RUeXBlcyA9IHR5cGVNYW5hZ2VyLmdldFJvb3RUeXBlcygpOwotCi0gICAgICAgIC8vIHJlbW92ZSBjbWlzOml0ZW0gYW5kIGNtaXM6c2Vjb25kYXJ5IGZvciBDTUlTIDEuMAotICAgICAgICBib29sZWFuIGNtaXMxMSA9IEluTWVtb3J5U2VydmljZUNvbnRleHQuZ2V0Q2FsbENvbnRleHQoKS5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICBpZiAoIWNtaXMxMSkgewotICAgICAgICAgICAgcm9vdFR5cGVzID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4ocm9vdFR5cGVzKTsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHRjSXRlbSA9IG51bGwsIHRjU2Vjb25kYXJ5ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgdGMgOiByb290VHlwZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodGMuZ2V0VHlwZURlZmluaXRpb24oKS5nZXRJZCgpLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfSVRFTS52YWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB0Y0l0ZW0gPSB0YzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRjLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0SWQoKS5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWS52YWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB0Y1NlY29uZGFyeSA9IHRjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0Y0l0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJvb3RUeXBlcy5yZW1vdmUodGNJdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0Y1NlY29uZGFyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcm9vdFR5cGVzLnJlbW92ZSh0Y1NlY29uZGFyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY21pczExICYmIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByb290VHlwZXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBjbG9uZVR5cGVEZWZpbml0aW9uVHJlZShyb290VHlwZXMsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBjbWlzMTEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gY2xvbmVUeXBlRGVmaW5pdGlvblRyZWUgKExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHRkY0xpc3QsIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIGJvb2xlYW4gY21pczExKSB7Ci0gICAgCUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+KHRkY0xpc3Quc2l6ZSgpKTsKLQkJZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBjIDogdGRjTGlzdCkgewotCQkJTXV0YWJsZVR5cGVEZWZpbml0aW9uIHRkID0gdHlwZUZhY3RvcnkuY29weShjLmdldFR5cGVEZWZpbml0aW9uKCksIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLQkJCWlmICghY21pczExKSB7Ci0JCQkJdGQuc2V0VHlwZU11dGFiaWxpdHkobnVsbCk7Ci0JCQl9Ci0JCQlUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgdGRjID0gbmV3IFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCh0ZCk7Ci0JCQl0ZGMuc2V0Q2hpbGRyZW4oY2xvbmVUeXBlRGVmaW5pdGlvblRyZWUoYy5nZXRDaGlsZHJlbigpLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgY21pczExKSk7Ci0JCQlyZXN1bHQuYWRkKHRkYyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgT2JqZWN0U3RvcmUgc20gPSBmTWFwUmVwb3NpdG9yeVRvT2JqZWN0U3RvcmUuZ2V0KHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGlmIChudWxsID09IHNtKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9JbmZvID0gY3JlYXRlUmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIHJlcG9JbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyVHlwZVN5c3RlbShTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIFR5cGVNYW5hZ2VySW1wbCB0eXBlTWFuYWdlciA9IGZNYXBSZXBvc2l0b3J5VG9UeXBlTWFuYWdlci5nZXQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgaWYgKG51bGwgPT0gdHlwZU1hbmFnZXIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFVOS05PV05fUkVQT1NJVE9SWSArIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0eXBlTWFuYWdlci5jbGVhclR5cGVTeXN0ZW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8VHlwZURlZmluaXRpb24+IGluaXRUeXBlU3lzdGVtKFN0cmluZyB0eXBlQ3JlYXRvckNsYXNzTmFtZSkgewotCi0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHR5cGVzTGlzdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHR5cGVDcmVhdG9yQ2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAgICAgICAgVHlwZUNyZWF0b3IgdHlwZUNyZWF0b3IgPSBudWxsOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJJbGxlZ2FsIGNsYXNzIHRvIGNyZWF0ZSB0eXBlIHN5c3RlbSwgbXVzdCBpbXBsZW1lbnQgVHlwZUNyZWF0b3IgaW50ZXJmYWNlLiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9iaiA9IENsYXNzLmZvck5hbWUodHlwZUNyZWF0b3JDbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBUeXBlQ3JlYXRvcikgewotICAgICAgICAgICAgICAgIHR5cGVDcmVhdG9yID0gKFR5cGVDcmVhdG9yKSBvYmo7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHR5cGVzIGZyb20gdGhlIGNvbmZpZ3VyZWQgY2xhc3MuCi0gICAgICAgICAgICAvLyB0ZXN0Ci0gICAgICAgICAgICB0eXBlc0xpc3QgPSB0eXBlQ3JlYXRvci5jcmVhdGVUeXBlc0xpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlc0xpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRUeXBlU3lzdGVtKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlQ3JlYXRvckNsYXNzTmFtZSkgewotCi0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHR5cGVEZWZzID0gbnVsbDsKLSAgICAgICAgVHlwZU1hbmFnZXJJbXBsIHR5cGVNYW5hZ2VyID0gZk1hcFJlcG9zaXRvcnlUb1R5cGVNYW5hZ2VyLmdldChyZXBvc2l0b3J5SWQpOwotICAgICAgICBpZiAobnVsbCA9PSB0eXBlTWFuYWdlcikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihVTktOT1dOX1JFUE9TSVRPUlkgKyByZXBvc2l0b3J5SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gdHlwZUNyZWF0b3JDbGFzc05hbWUpIHsKLSAgICAgICAgICAgIHR5cGVEZWZzID0gaW5pdFR5cGVTeXN0ZW0odHlwZUNyZWF0b3JDbGFzc05hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHlwZU1hbmFnZXIuaW5pdFR5cGVTeXN0ZW0odHlwZURlZnMsIHRydWUpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotICAgIHByaXZhdGUgUmVwb3NpdG9yeUluZm8gY3JlYXRlUmVwb3NpdG9yeUluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBib29sZWFuIGNtaXMxMSA9IEluTWVtb3J5U2VydmljZUNvbnRleHQuZ2V0Q2FsbENvbnRleHQoKS5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICBPYmplY3RTdG9yZSBvYmpTdG9yZSA9IGdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIFN0cmluZyByb290Rm9sZGVySWQgPSBvYmpTdG9yZS5nZXRSb290Rm9sZGVyKCkuZ2V0SWQoKTsKLSAgICAgICAgLy8gcmVwb3NpdG9yeSBpbmZvCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvSW1wbCByZXBvSW5mbzsKLSAgICAgICAgcmVwb0luZm8gPSBuZXcgUmVwb3NpdG9yeUluZm9JbXBsKCk7Ci0gICAgICAgIHJlcG9JbmZvLnNldElkKHJlcG9zaXRvcnlJZCA9PSBudWxsID8gImluTWVtIiA6IHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJlcG9JbmZvLnNldE5hbWUoIkFwYWNoZSBDaGVtaXN0cnkgT3BlbkNNSVMgSW5NZW1vcnkgUmVwb3NpdG9yeSIpOwotICAgICAgICByZXBvSW5mby5zZXREZXNjcmlwdGlvbigiQXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUyBJbk1lbW9yeSBSZXBvc2l0b3J5IChWZXJzaW9uOiAiICsgT1BFTkNNSVNfVkVSU0lPTiArICIpIik7Ci0gICAgICAgIHJlcG9JbmZvLnNldFJvb3RGb2xkZXIocm9vdEZvbGRlcklkKTsKLSAgICAgICAgcmVwb0luZm8uc2V0UHJpbmNpcGFsQW5vbnltb3VzKEluTWVtb3J5QWNlLmdldEFub255bW91c1VzZXIoKSk7Ci0gICAgICAgIHJlcG9JbmZvLnNldFByaW5jaXBhbEFueW9uZShJbk1lbW9yeUFjZS5nZXRBbnlvbmVVc2VyKCkpOwotICAgICAgICByZXBvSW5mby5zZXRUaGluQ2xpZW50VXJpKCIiKTsKLSAgICAgICAgcmVwb0luZm8uc2V0Q2hhbmdlc0luY29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgcmVwb0luZm8uc2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oInRva2VuLTI0Iik7Ci0gICAgICAgIHJlcG9JbmZvLnNldFZlbmRvck5hbWUoIkFwYWNoZSBDaGVtaXN0cnkiKTsKLSAgICAgICAgcmVwb0luZm8uc2V0UHJvZHVjdE5hbWUoT1BFTkNNSVNfU0VSVkVSKTsKLSAgICAgICAgcmVwb0luZm8uc2V0UHJvZHVjdFZlcnNpb24oT1BFTkNNSVNfVkVSU0lPTik7Ci0KLSAgICAgICAgLy8gc2V0IGNhcGFiaWxpdGllcwotICAgICAgICBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzSW1wbCBjYXBzID0gbmV3IFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsKCk7Ci0gICAgICAgIGNhcHMuc2V0QWxsVmVyc2lvbnNTZWFyY2hhYmxlKGZhbHNlKTsKLSAgICAgICAgY2Fwcy5zZXRDYXBhYmlsaXR5QWNsKENhcGFiaWxpdHlBY2wuTUFOQUdFKTsKLSAgICAgICAgY2Fwcy5zZXRDYXBhYmlsaXR5Q2hhbmdlcyhDYXBhYmlsaXR5Q2hhbmdlcy5PQkpFQ1RJRFNPTkxZKTsKLSAgICAgICAgY2Fwcy5zZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMoQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLkFOWVRJTUUpOwotICAgICAgICBjYXBzLnNldENhcGFiaWxpdHlKb2luKENhcGFiaWxpdHlKb2luLk5PTkUpOwotICAgICAgICBjYXBzLnNldENhcGFiaWxpdHlRdWVyeShDYXBhYmlsaXR5UXVlcnkuQk9USENPTUJJTkVEKTsKLSAgICAgICAgY2Fwcy5zZXRDYXBhYmlsaXR5UmVuZGl0aW9uKENhcGFiaWxpdHlSZW5kaXRpb25zLlJFQUQpOwotICAgICAgICBjYXBzLnNldElzUHdjU2VhcmNoYWJsZShmYWxzZSk7Ci0gICAgICAgIGNhcHMuc2V0SXNQd2NVcGRhdGFibGUodHJ1ZSk7Ci0gICAgICAgIGNhcHMuc2V0U3VwcG9ydHNHZXREZXNjZW5kYW50cyh0cnVlKTsKLSAgICAgICAgY2Fwcy5zZXRTdXBwb3J0c0dldEZvbGRlclRyZWUodHJ1ZSk7Ci0gICAgICAgIGNhcHMuc2V0U3VwcG9ydHNNdWx0aWZpbGluZyh0cnVlKTsKLSAgICAgICAgY2Fwcy5zZXRTdXBwb3J0c1VuZmlsaW5nKHRydWUpOwotICAgICAgICBjYXBzLnNldFN1cHBvcnRzVmVyc2lvblNwZWNpZmljRmlsaW5nKGZhbHNlKTsKLSAgICAgICAgY2Fwcy5zZXRDYXBhYmlsaXR5QWNsKENhcGFiaWxpdHlBY2wuTUFOQUdFKTsKLQotICAgICAgICBBY2xDYXBhYmlsaXRpZXNEYXRhSW1wbCBhY2xDYXBzID0gbmV3IEFjbENhcGFiaWxpdGllc0RhdGFJbXBsKCk7Ci0gICAgICAgIGFjbENhcHMuc2V0QWNsUHJvcGFnYXRpb24oQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSk7Ci0gICAgICAgIGFjbENhcHMuc2V0U3VwcG9ydGVkUGVybWlzc2lvbnMoU3VwcG9ydGVkUGVybWlzc2lvbnMuQkFTSUMpOwotCi0gICAgICAgIC8vIHBlcm1pc3Npb25zCi0gICAgICAgIExpc3Q8UGVybWlzc2lvbkRlZmluaXRpb24+IHBlcm1pc3Npb25zID0gbmV3IEFycmF5TGlzdDxQZXJtaXNzaW9uRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgcGVybWlzc2lvbnMuYWRkKGNyZWF0ZVBlcm1pc3Npb24oQ01JU19SRUFELCAiUmVhZCIpKTsKLSAgICAgICAgcGVybWlzc2lvbnMuYWRkKGNyZWF0ZVBlcm1pc3Npb24oQ01JU19XUklURSwgIldyaXRlIikpOwotICAgICAgICBwZXJtaXNzaW9ucy5hZGQoY3JlYXRlUGVybWlzc2lvbihDTUlTX0FMTCwgIkFsbCIpKTsKLSAgICAgICAgaWYgKGNtaXMxMSkgewotICAgICAgICAgICAgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlc0ltcGwgdHlwZUF0dHJzID0gbmV3IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXNJbXBsKCk7Ci0gICAgICAgICAgICB0eXBlQXR0cnMuc2V0Q2FuU2V0Q29udHJvbGxhYmxlQWNsKGZhbHNlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXRDb250cm9sbGFibGVQb2xpY3koZmFsc2UpOwotICAgICAgICAgICAgdHlwZUF0dHJzLnNldENhblNldENyZWF0YWJsZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXREZXNjcmlwdGlvbih0cnVlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXREaXNwbGF5TmFtZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXRGaWxlYWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlQXR0cnMuc2V0Q2FuU2V0RnVsbHRleHRJbmRleGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXRJZCh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXRJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoZmFsc2UpOwotICAgICAgICAgICAgdHlwZUF0dHJzLnNldENhblNldExvY2FsTmFtZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXRMb2NhbE5hbWVzcGFjZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVBdHRycy5zZXRDYW5TZXRRdWVyeWFibGUoZmFsc2UpOwotICAgICAgICAgICAgdHlwZUF0dHJzLnNldENhblNldFF1ZXJ5TmFtZSh0cnVlKTsKLSAgICAgICAgICAgIGNhcHMuc2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyh0eXBlQXR0cnMpOwotICAgICAgICB9Ci0gICAgICAgIGFjbENhcHMuc2V0UGVybWlzc2lvbkRlZmluaXRpb25EYXRhKHBlcm1pc3Npb25zKTsKLQotICAgICAgICAvLyBtYXBwaW5nCi0gICAgICAgIExpc3Q8UGVybWlzc2lvbk1hcHBpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFBlcm1pc3Npb25NYXBwaW5nPigpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9HRVRfREVTQ0VOREVOVFNfRk9MREVSLCBDTUlTX1JFQUQpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fR0VUX0NISUxEUkVOX0ZPTERFUiwgQ01JU19SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9QQVJFTlRTX0ZPTERFUiwgQ01JU19SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9GT0xERVJfUEFSRU5UX09CSkVDVCwgQ01JU19SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0NSRUFURV9ET0NVTUVOVF9GT0xERVIsIENNSVNfV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fQ1JFQVRFX0ZPTERFUl9GT0xERVIsIENNSVNfV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fQ1JFQVRFX1JFTEFUSU9OU0hJUF9TT1VSQ0UsIENNSVNfUkVBRCkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9DUkVBVEVfUkVMQVRJT05TSElQX1RBUkdFVCwgQ01JU19SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9QUk9QRVJUSUVTX09CSkVDVCwgQ01JU19SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX1ZJRVdfQ09OVEVOVF9PQkpFQ1QsIENNSVNfUkVBRCkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9VUERBVEVfUFJPUEVSVElFU19PQkpFQ1QsIENNSVNfV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fTU9WRV9PQkpFQ1QsIENNSVNfV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fTU9WRV9UQVJHRVQsIENNSVNfV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fTU9WRV9TT1VSQ0UsIENNSVNfV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fREVMRVRFX09CSkVDVCwgQ01JU19XUklURSkpOwotCi0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0RFTEVURV9UUkVFX0ZPTERFUiwgQ01JU19XUklURSkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9TRVRfQ09OVEVOVF9ET0NVTUVOVCwgQ01JU19XUklURSkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9ERUxFVEVfQ09OVEVOVF9ET0NVTUVOVCwgQ01JU19XUklURSkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9BRERfVE9fRk9MREVSX09CSkVDVCwgQ01JU19XUklURSkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9SRU1PVkVfRlJPTV9GT0xERVJfT0JKRUNULCBDTUlTX1dSSVRFKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0NIRUNLT1VUX0RPQ1VNRU5ULCBDTUlTX1dSSVRFKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0NBTkNFTF9DSEVDS09VVF9ET0NVTUVOVCwgQ01JU19XUklURSkpOwotCi0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0NIRUNLSU5fRE9DVU1FTlQsIENNSVNfV1JJVEUpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fR0VUX0FMTF9WRVJTSU9OU19WRVJTSU9OX1NFUklFUywgQ01JU19SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9PQkpFQ1RfUkVMQVRJT05TSElQU19PQkpFQ1QsIENNSVNfUkVBRCkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9BRERfUE9MSUNZX09CSkVDVCwgQ01JU19XUklURSkpOwotICAgICAgICBsaXN0LmFkZChjcmVhdGVNYXBwaW5nKFBlcm1pc3Npb25NYXBwaW5nLkNBTl9SRU1PVkVfUE9MSUNZX09CSkVDVCwgQ01JU19XUklURSkpOwotCi0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9BUFBMSUVEX1BPTElDSUVTX09CSkVDVCwgQ01JU19SRUFEKSk7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZU1hcHBpbmcoUGVybWlzc2lvbk1hcHBpbmcuQ0FOX0dFVF9BQ0xfT0JKRUNULCBDTUlTX1JFQUQpKTsKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlTWFwcGluZyhQZXJtaXNzaW9uTWFwcGluZy5DQU5fQVBQTFlfQUNMX09CSkVDVCwgQ01JU19BTEwpKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4gbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQZXJtaXNzaW9uTWFwcGluZz4oKTsKLSAgICAgICAgZm9yIChQZXJtaXNzaW9uTWFwcGluZyBwbSA6IGxpc3QpIHsKLSAgICAgICAgICAgIG1hcC5wdXQocG0uZ2V0S2V5KCksIHBtKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8QmFzZVR5cGVJZD4gY2hhbmdlc09uVHlwZTsKLSAgICAgICAgLy8gQ01JUyAxLjEgZXh0ZW5zaW9ucwotICAgICAgICBpZiAoY21pczExKSB7Ci0gICAgICAgICAgICByZXBvSW5mby5zZXRDbWlzVmVyc2lvblN1cHBvcnRlZChDbWlzVmVyc2lvbi5DTUlTXzFfMS52YWx1ZSgpKTsKLSAgICAgICAgICAgIHJlcG9JbmZvLnNldENtaXNWZXJzaW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xKTsKLSAgICAgICAgICAgIGNoYW5nZXNPblR5cGUgPSBuZXcgQXJyYXlMaXN0PEJhc2VUeXBlSWQ+KCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChCYXNlVHlwZUlkLkNNSVNfRk9MREVSKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkKEJhc2VUeXBlSWQuQ01JU19JVEVNKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBTZXQ8UHJvcGVydHlUeXBlPiBwcm9wZXJ0eVR5cGVTZXQgPSBuZXcgSGFzaFNldDxQcm9wZXJ0eVR5cGU+KCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKFByb3BlcnR5VHlwZS5CT09MRUFOKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkKFByb3BlcnR5VHlwZS5EQVRFVElNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChQcm9wZXJ0eVR5cGUuREVDSU1BTCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChQcm9wZXJ0eVR5cGUuSFRNTCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChQcm9wZXJ0eVR5cGUuSUQpOwotICAgICAgICAgICAgICAgICAgICBhZGQoUHJvcGVydHlUeXBlLklOVEVHRVIpOwotICAgICAgICAgICAgICAgICAgICBhZGQoUHJvcGVydHlUeXBlLlNUUklORyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChQcm9wZXJ0eVR5cGUuVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgQ3JlYXRhYmxlUHJvcGVydHlUeXBlc0ltcGwgY3JlYXRhYmxlUHJvcGVydHlUeXBlcyA9IG5ldyBDcmVhdGFibGVQcm9wZXJ0eVR5cGVzSW1wbCgpOwotICAgICAgICAgICAgY3JlYXRhYmxlUHJvcGVydHlUeXBlcy5zZXRDYW5DcmVhdGUocHJvcGVydHlUeXBlU2V0KTsKLSAgICAgICAgICAgIGNhcHMuc2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcyhjcmVhdGFibGVQcm9wZXJ0eVR5cGVzKTsKLSAgICAgICAgICAgIGNhcHMuc2V0Q2FwYWJpbGl0eU9yZGVyQnkoQ2FwYWJpbGl0eU9yZGVyQnkuQ09NTU9OKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcG9JbmZvLnNldENtaXNWZXJzaW9uU3VwcG9ydGVkKENtaXNWZXJzaW9uLkNNSVNfMV8wLnZhbHVlKCkpOwotICAgICAgICAgICAgcmVwb0luZm8uc2V0Q21pc1ZlcnNpb24oQ21pc1ZlcnNpb24uQ01JU18xXzApOwotICAgICAgICAgICAgY2hhbmdlc09uVHlwZSA9IG5ldyBBcnJheUxpc3Q8QmFzZVR5cGVJZD4oKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGQoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkKEJhc2VUeXBlSWQuQ01JU19GT0xERVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmVwb0luZm8uc2V0Q2hhbmdlc09uVHlwZShjaGFuZ2VzT25UeXBlKTsKLQotICAgICAgICBhY2xDYXBzLnNldFBlcm1pc3Npb25NYXBwaW5nRGF0YShtYXApOwotCi0gICAgICAgIHJlcG9JbmZvLnNldEFjbENhcGFiaWxpdGllcyhhY2xDYXBzKTsKLQotICAgICAgICByZXBvSW5mby5zZXRDYXBhYmlsaXRpZXMoY2Fwcyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlcG9JbmZvOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFBlcm1pc3Npb25EZWZpbml0aW9uIGNyZWF0ZVBlcm1pc3Npb24oU3RyaW5nIHBlcm1pc3Npb24sIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICBQZXJtaXNzaW9uRGVmaW5pdGlvbkRhdGFJbXBsIHBkID0gbmV3IFBlcm1pc3Npb25EZWZpbml0aW9uRGF0YUltcGwoKTsKLSAgICAgICAgcGQuc2V0SWQocGVybWlzc2lvbik7Ci0gICAgICAgIHBkLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotICAgICAgICByZXR1cm4gcGQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUGVybWlzc2lvbk1hcHBpbmcgY3JlYXRlTWFwcGluZyhTdHJpbmcga2V5LCBTdHJpbmcgcGVybWlzc2lvbikgewotICAgICAgICBQZXJtaXNzaW9uTWFwcGluZ0RhdGFJbXBsIHBtID0gbmV3IFBlcm1pc3Npb25NYXBwaW5nRGF0YUltcGwoKTsKLSAgICAgICAgcG0uc2V0S2V5KGtleSk7Ci0gICAgICAgIHBtLnNldFBlcm1pc3Npb25zKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocGVybWlzc2lvbikpOwotCi0gICAgICAgIHJldHVybiBwbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0cmF2ZXJzZSB0cmVlIGFuZCByZXBsYWNlIGVhY2ggbmVlZCBub2RlIHdpdGggYSBjbG9uZS4gcmVtb3ZlIHByb3BlcnRpZXMKLSAgICAgKiBvbiBjbG9uZSBpZiByZXF1ZXN0ZWQsIGN1dCBjaGlsZHJlbiBvZiBjbG9uZSBpZiBkZXB0aCBpcyBleGNlZWRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVwdGgKLSAgICAgKiAgICAgICAgICAgIGxldmVscyBvZiBjaGlsZHJlbiB0byBjb3B5Ci0gICAgICogQHBhcmFtIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zCi0gICAgICogICAgICAgICAgICBpbmRpY2F0ZXMgd2l0aCBvciB3aXRob3V0IHByb3BlcnR5IGRlZmluaXRpb25zCi0gICAgICogQHBhcmFtIHRkYwotICAgICAqICAgICAgICAgICAgdHlwZSBkZWZpbml0aW9uIHRvIGNsb25lCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqICAgICAgICAgICAgcGFyZW50IGNvbnRhaW5lciB3aGVyZSB0byBhZGQgY2xvbmUgYXMgY2hpbGQKLSAgICAgKiBAcmV0dXJuIGNsb25lZCB0eXBlIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGNsb25lVHlwZUxpc3QoaW50IGRlcHRoLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdGRjLCBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBwYXJlbnQsIGJvb2xlYW4gY21pczExKSB7Ci0KLSAgICAgICAgZmluYWwgVHlwZURlZmluaXRpb25GYWN0b3J5IHR5cGVGYWN0b3J5ID0gVHlwZURlZmluaXRpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiB0ZENsb25lID0gdHlwZUZhY3RvcnkuY29weSh0ZGMuZ2V0VHlwZURlZmluaXRpb24oKSwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpOwotICAgICAgICBpZiAoIWNtaXMxMSkgewotICAgICAgICAJdGRDbG9uZS5zZXRUeXBlTXV0YWJpbGl0eShudWxsKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgdGRjQ2xvbmUgPSBuZXcgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsKHRkQ2xvbmUpOwotICAgICAgICBpZiAobnVsbCAhPSBwYXJlbnQpIHsKLSAgICAgICAgICAgIHBhcmVudC5nZXRDaGlsZHJlbigpLmFkZCh0ZGNDbG9uZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVwdGggPiAwKSB7Ci0gICAgICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBjaGlsZHJlbiA9IHRkYy5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgY2xvbmVUeXBlTGlzdChkZXB0aCAtIDEsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBjaGlsZCwgdGRjQ2xvbmUsIGNtaXMxMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRkY0Nsb25lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUeXBlTWFuYWdlciBnZXRUeXBlTWFuYWdlcihTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIFR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyID0gZk1hcFJlcG9zaXRvcnlUb1R5cGVNYW5hZ2VyLmdldChyZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gdHlwZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNTaW5nbGVGaWxpbmcoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNNdWx0aUZpbGluZ3MoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgdXNlciwgU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQpIHsKLSAgICAgICAgVHlwZU1hbmFnZXIgdG0gPSBnZXRUeXBlTWFuYWdlcihyZXBvc2l0b3J5SWQpOwotICAgICAgICBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSA9IGdldE9iamVjdFN0b3JlKHJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgSW5NZW1vcnlRdWVyeVByb2Nlc3NvciBxdWVyeVByb2Nlc3NvciA9IG5ldyBJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yKGdldFN0b3JlKHJlcG9zaXRvcnlJZCkpOwotICAgICAgICBPYmplY3RMaXN0IG9iakxpc3QgPSBxdWVyeVByb2Nlc3Nvci5xdWVyeSh0bSwgb2JqZWN0U3RvcmUsIHVzZXIsIHJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsIHNraXBDb3VudCk7Ci0KLSAgICAgICAgcmV0dXJuIG9iakxpc3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvU3RvcmVkT2JqZWN0SW1wbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvU3RvcmVkT2JqZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFiNWZlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3N0b3JlZG9iai9pbXBsL1N0b3JlZE9iamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5CaW5kaW5nc09iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRGF0YU9iamVjdENyZWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRmlsdGVyUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotCi0vKioKLSAqIFN0b3JlZE9iamVjdCBpcyB0aGUgY29tbW9uIHN1cGVyY2xhc3Mgb2YgYWxsIG9iamVjdHMgaG9sZCBpbiB0aGUgcmVwb3NpdG9yeQotICogRG9jdW1lbnRzLCBGb2xkZXJzLCBSZWxhdGlvbnNoaXBzIGFuZCBQb2xpY2llcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RvcmVkT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFN0b3JlZE9iamVjdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA2NTUzNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9VU0VSID0gInVua25vd24iOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmSWQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBmTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZUeXBlSWQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBmQ3JlYXRlZEJ5OwotICAgIHByb3RlY3RlZCBTdHJpbmcgZk1vZGlmaWVkQnk7Ci0gICAgcHJvdGVjdGVkIEdyZWdvcmlhbkNhbGVuZGFyIGZDcmVhdGVkQXQ7Ci0gICAgcHJvdGVjdGVkIEdyZWdvcmlhbkNhbGVuZGFyIGZNb2RpZmllZEF0OwotICAgIHByb3RlY3RlZCBTdHJpbmcgZlJlcG9zaXRvcnlJZDsKLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBmUHJvcGVydGllczsKLSAgICBwcm90ZWN0ZWQgaW50IGZBY2xJZDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOyAvLyBDTUlTIDEuMQotICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gc2Vjb25kYXJ5VHlwZUlkczsgLy8gQ01JUyAxLjEKLSAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHBvbGljeUlkczsKLQotICAgIFN0b3JlZE9iamVjdEltcGwoKSB7IC8vIHZpc2liaWxpdHkgc2hvdWxkIGJlIHBhY2thZ2UKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbm93ID0gZ2V0Tm93KCk7Ci0gICAgICAgIG5vdy5zZXRUaW1lKG5ldyBEYXRlKCkpOwotICAgICAgICBmQ3JlYXRlZEF0ID0gbm93OwotICAgICAgICBmTW9kaWZpZWRBdCA9IG5vdzsKLSAgICAgICAgc2Vjb25kYXJ5VHlwZUlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwb2xpY3lJZHMgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBmSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZJZCA9IGlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZk5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUlkKCkgewotICAgICAgICByZXR1cm4gZlR5cGVJZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlSWQoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgZlR5cGVJZCA9IHR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVkQnkoKSB7Ci0gICAgICAgIHJldHVybiBmQ3JlYXRlZEJ5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZWRCeShTdHJpbmcgY3JlYXRlZEJ5KSB7Ci0gICAgICAgIHRoaXMuZkNyZWF0ZWRCeSA9IGNyZWF0ZWRCeTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVkQnkoKSB7Ci0gICAgICAgIHJldHVybiBmTW9kaWZpZWRCeTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllZEJ5KFN0cmluZyBtb2RpZmllZEJ5KSB7Ci0gICAgICAgIHRoaXMuZk1vZGlmaWVkQnkgPSBtb2RpZmllZEJ5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhciBnZXRDcmVhdGVkQXQoKSB7Ci0gICAgICAgIHJldHVybiBmQ3JlYXRlZEF0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZWRBdChHcmVnb3JpYW5DYWxlbmRhciBjcmVhdGVkQXQpIHsKLSAgICAgICAgdGhpcy5mQ3JlYXRlZEF0ID0gY3JlYXRlZEF0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhciBnZXRNb2RpZmllZEF0KCkgewotICAgICAgICByZXR1cm4gZk1vZGlmaWVkQXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TW9kaWZpZWRBdE5vdygpIHsKLSAgICAJR3JlZ29yaWFuQ2FsZW5kYXIgbm93ID0gZ2V0Tm93KCk7Ci0gICAgCS8vIGVuc3VyZSBhIGxhcmdlciB0aW1lIGZvciBtb2RpZmljYXRpb24gZGF0ZSBhbmQgY2hhbmdlIHRva2VuOgotICAgIAl3aGlsZSAobm93LmdldFRpbWVJbk1pbGxpcygpID09IGZNb2RpZmllZEF0LmdldFRpbWVJbk1pbGxpcygpKSB7Ci0gICAgCQl0cnkgewotICAgIAkJCVRocmVhZC5zbGVlcCgxKTsKLSAgICAJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7ICAgIAkJCQotICAgIAkJfQotICAgIAkJbm93ID0gZ2V0Tm93KCk7Ci0gICAgCX0KLSAgICAgICAgdGhpcy5mTW9kaWZpZWRBdCA9IG5vdzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllZEF0KEdyZWdvcmlhbkNhbGVuZGFyIGNhbCkgewotICAgICAgICB0aGlzLmZNb2RpZmllZEF0ID0gY2FsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnlJZChTdHJpbmcgcmVwb3NpdG9yeUlkKSB7Ci0gICAgICAgIGZSZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5SWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXBvc2l0b3J5SWQoKSB7Ci0gICAgICAgIHJldHVybiBmUmVwb3NpdG9yeUlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXBwbGllZFBvbGljaWVzKCkgewotICAgICAgICBpZiAobnVsbCA9PSBwb2xpY3lJZHMpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocG9saWN5SWRzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpZWRQb2xpY2llcyhMaXN0PFN0cmluZz4gbmV3UG9saWNpZXMpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gbmV3UG9saWNpZXMpIHsKLSAgICAgICAgICAgIHBvbGljeUlkcyA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBwb2xpY3lJZHMpIHsKLSAgICAgICAgICAgICAgICBwb2xpY3lJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvbGljeUlkcy5hZGRBbGwobmV3UG9saWNpZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQXBwbGllZFBvbGljeShTdHJpbmcgcG9saWN5SWQpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gcG9saWN5SWRzKSB7Ci0gICAgICAgICAgICBwb2xpY3lJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXBvbGljeUlkcy5jb250YWlucyhwb2xpY3lJZCkpIHsKLSAgICAgICAgICAgIHBvbGljeUlkcy5hZGQocG9saWN5SWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KFN0cmluZyBwb2xpY3lJZCkgewotICAgICAgICBpZiAobnVsbCAhPSBwb2xpY3lJZHMgJiYgcG9saWN5SWRzLmNvbnRhaW5zKHBvbGljeUlkKSkgewotICAgICAgICAgICAgcG9saWN5SWRzLnJlbW92ZShwb2xpY3lJZCk7Ci0gICAgICAgICAgICBpZiAocG9saWN5SWRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHBvbGljeUlkcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDTUlTIDEuMToKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3IpIHsKLSAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcjsKLSAgICB9Ci0KLSAgICAvLyBDTUlTIDEuMToKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTZWNvbmRhcnlUeXBlSWRzKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChzZWNvbmRhcnlUeXBlSWRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcHMpIHsKLSAgICAgICAgZlByb3BlcnRpZXMgPSBwcm9wczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gZlByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFuZ2VUb2tlbigpIHsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbGFzdE1vZGlmaWVkID0gZ2V0TW9kaWZpZWRBdCgpOwotICAgICAgICBTdHJpbmcgdG9rZW4gPSBMb25nLnZhbHVlT2YobGFzdE1vZGlmaWVkLmdldFRpbWVJbk1pbGxpcygpKS50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU3lzdGVtQmFzZVByb3BlcnRpZXNXaGVuQ3JlYXRlZChNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMsIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGFkZFN5c3RlbUJhc2VQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIHVzZXIsIHRydWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbk1vZGlmaWVkKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgYWRkU3lzdGVtQmFzZVByb3BlcnRpZXMocHJvcGVydGllcywgdXNlciwgZmFsc2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZpbGxQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcywgQmluZGluZ3NPYmplY3RGYWN0b3J5IG9iakZhY3RvcnksCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzKSB7Ci0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLk5BTUUsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk5BTUUsIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLk5BTUUsIGdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCwgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIGdldElkKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBnZXRUeXBlSWQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHNldCB0aGUgYmFzZSB0eXBlIGlkIFByb3BlcnR5SWRzLkNNSVNfQkFTRV9UWVBFX0lEIG91dHNpZGUgYmVjYXVzZSBpdAotICAgICAgICAvLyByZXF1aXJlcyB0aGUgdHlwZSBkZWZpbml0aW9uCi0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZLAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZLCBnZXRDcmVhdGVkQnkoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGF0ZVRpbWVEYXRhKFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUsIGdldENyZWF0ZWRBdCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlksIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlksCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlksIGdldE1vZGlmaWVkQnkoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFLAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGF0ZVRpbWVEYXRhKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUsIGdldE1vZGlmaWVkQXQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4sIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IGdldENoYW5nZVRva2VuKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4sCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTiwgdG9rZW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENNSVMgMS4xIHByb3BlcnRpZXM6Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5ERVNDUklQVElPTiwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuREVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLkRFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTLAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsIHNlY29uZGFyeVR5cGVJZHMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBjdXN0b20gcHJvcGVydGllcyBvZiB0eXBlIGRlZmluaXRpb24gdG8gdGhlIGNvbGxlY3Rpb24KLSAgICAgICAgaWYgKG51bGwgIT0gZlByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3AgOiBmUHJvcGVydGllcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKHByb3AuZ2V0S2V5KCksIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcC5nZXRLZXkoKSwgcHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBwcml2YXRlIGhlbHBlciBtZXRob2RzCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21Qcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcykgewotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXNOZXcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4ocHJvcGVydGllcyk7Ci0gICAgICAgIC8vIGdldCBhIHdyaXRhYmxlY29sbGVjdGlvbgotICAgICAgICByZW1vdmVBbGxTeXN0ZW1Qcm9wZXJ0aWVzKHByb3BlcnRpZXNOZXcpOwotICAgICAgICBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXNOZXcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEdyZWdvcmlhbkNhbGVuZGFyIGdldE5vdygpIHsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbm93ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgIHJldHVybiBub3c7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBZGQgQ01JU19DUkVBVEVEX0JZLCBDTUlTX0NSRUFUSU9OX0RBVEUsIENNSVNfTEFTVF9NT0RJRklFRF9CWSwKLSAgICAgKiBDTUlTX0xBU1RfTU9ESUZJQ0FUSU9OX0RBVEUsIENNSVNfQ0hBTkdFX1RPS0VOIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIHRoZQotICAgICAqIGxpc3Qgb2YgcHJvcGVydGllcyB3aXRoIGN1cnJlbnQgdmFsdWVzLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhZGRTeXN0ZW1CYXNlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMsIFN0cmluZyB1c2VyLCBib29sZWFuIGlzQ3JlYXRlZCkgewotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VyID0gVU5LTk9XTl9VU0VSOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSB0aGF0IGluaXRpYWwgY3JlYXRpb24gYW5kIG1vZGlmaWNhdGlvbiBkYXRlIGlzIHNldCBpbgotICAgICAgICAvLyBjb25zdHJ1Y3Rvci4KLSAgICAgICAgc2V0TW9kaWZpZWRCeSh1c2VyKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcHJvcGVydGllcykgewotICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJvcGVydGllcy5nZXQoUHJvcGVydHlJZHMuREVTQ1JJUFRJT04pKSB7Ci0gICAgICAgICAgICAgICAgc2V0RGVzY3JpcHRpb24oKFN0cmluZykgcHJvcGVydGllcy5nZXQoUHJvcGVydHlJZHMuREVTQ1JJUFRJT04pLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMpKSB7Ci0gICAgICAgICAgICAgICAgc2Vjb25kYXJ5VHlwZUlkcy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHJvcGVydHlEYXRhPD8+IHNlY29uZGFyeVR5cGVQcm9wID0gcHJvcGVydGllcy5nZXQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUyk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBzZWNvbmRhcnlUeXBlUHJvcCkgewotICAgICAgICAgICAgICAgIHNlY29uZGFyeVR5cGVJZHMuYWRkQWxsKChMaXN0PFN0cmluZz4pIHNlY29uZGFyeVR5cGVQcm9wLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXNDcmVhdGVkKSB7Ci0gICAgICAgICAgICBzZXRDcmVhdGVkQnkodXNlcik7Ci0gICAgICAgICAgICBzZXROYW1lKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KFByb3BlcnR5SWRzLk5BTUUpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgICAgICBzZXRUeXBlSWQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRNb2RpZmllZEF0Tm93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFkZCBDTUlTX0NSRUFURURfQlksIENNSVNfQ1JFQVRJT05fREFURSwgQ01JU19MQVNUX01PRElGSUVEX0JZLAotICAgICAqIENNSVNfTEFTVF9NT0RJRklDQVRJT05fREFURSwgQ01JU19DSEFOR0VfVE9LRU4gc3lzdGVtIHByb3BlcnRpZXMgdG8gdGhlCi0gICAgICogbGlzdCBvZiBwcm9wZXJ0aWVzIHdpdGggY3VycmVudCB2YWx1ZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTeXN0ZW1CYXNlUHJvcGVydGllc1doZW5DcmVhdGVkRGlyZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdXNlcikgewotICAgICAgICAvLyBOb3RlIHRoYXQgaW5pdGlhbCBjcmVhdGlvbiBhbmQgbW9kaWZpY2F0aW9uIGRhdGUgaXMgc2V0IGluCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yLgotICAgICAgICBzZXRNb2RpZmllZEJ5KHVzZXIpOwotICAgICAgICBzZXRDcmVhdGVkQnkodXNlcik7Ci0gICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIHNldFR5cGVJZCh0eXBlSWQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ01JU19OQU1FIENNSVNfT0JKRUNUX0lEIENNSVNfT0JKRUNUX1RZUEVfSUQgQ01JU19CQVNFX1RZUEVfSUQKLSAgICAgKiBDTUlTX0NSRUFURURfQlkgQ01JU19DUkVBVElPTl9EQVRFIENNSVNfTEFTVF9NT0RJRklFRF9CWQotICAgICAqIENNSVNfTEFTVF9NT0RJRklDQVRJT05fREFURSBDTUlTX0NIQU5HRV9UT0tFTgotICAgICAqIAotICAgICAqIC8vIC0tLS0gZG9jdW1lbnQgLS0tLSBDTUlTX0lTX0lNTVVUQUJMRSBDTUlTX0lTX0xBVEVTVF9WRVJTSU9OCi0gICAgICogQ01JU19JU19NQUpPUl9WRVJTSU9OIENNSVNfSVNfTEFURVNUX01BSk9SX1ZFUlNJT04gQ01JU19WRVJTSU9OX0xBQkVMCi0gICAgICogQ01JU19WRVJTSU9OX1NFUklFU19JRCBDTUlTX0lTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUCi0gICAgICogQ01JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSBDTUlTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lECi0gICAgICogQ01JU19DSEVDS0lOX0NPTU1FTlQgQ01JU19DT05URU5UX1NUUkVBTV9MRU5HVEgKLSAgICAgKiBDTUlTX0NPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSBDTUlTX0NPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRQotICAgICAqIENNSVNfQ09OVEVOVF9TVFJFQU1fSUQKLSAgICAgKiAKLSAgICAgKiAvLyAtLS0tIGZvbGRlciAtLS0tIENNSVNfUEFSRU5UX0lEIENNSVNfQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFMKLSAgICAgKiBDTUlTX1BBVEgKLSAgICAgKiAKLSAgICAgKiAvLyAtLS0tIHJlbGF0aW9uc2hpcCAtLS0tIENNSVNfU09VUkNFX0lEIENNSVNfVEFSR0VUX0lECi0gICAgICogCi0gICAgICogLy8gLS0tLSBwb2xpY3kgLS0tLSBDTUlTX1BPTElDWV9URVhUCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxTeXN0ZW1Qcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcykgewotICAgICAgICAvLyAtLS0tIGJhc2UgLS0tLQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5OQU1FKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuT0JKRUNUX0lEKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLkNSRUFURURfQlkpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWSkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pOwotICAgICAgICB9Ci0gICAgICAgIC8vIC0tLS0gZG9jdW1lbnQgLS0tLQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuSVNfTEFURVNUX1ZFUlNJT04pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5JU19NQUpPUl9WRVJTSU9OKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTikpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlkpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5UKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5UKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9MRU5HVEgpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9MRU5HVEgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9JRCkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0lEKTsKLSAgICAgICAgfQotICAgICAgICAvLyAtLS0tIGZvbGRlciAtLS0tCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLlBBUkVOVF9JRCkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLlBBUkVOVF9JRCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5BTExPV0VEX0NISUxEX09CSkVDVF9UWVBFX0lEUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuUEFUSCkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKFByb3BlcnR5SWRzLlBBVEgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIC0tLS0gcmVsYXRpb25zaGlwIC0tLS0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuU09VUkNFX0lEKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoUHJvcGVydHlJZHMuU09VUkNFX0lEKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJvcGVydGllcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5UQVJHRVRfSUQpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5UQVJHRVRfSUQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIC0tLS0gcG9saWN5IC0tLS0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShQcm9wZXJ0eUlkcy5QT0xJQ1lfVEVYVCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldEFjbElkKCkgewotICAgICAgICByZXR1cm4gZkFjbElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFjbElkKGludCBhY2xJZCkgewotICAgICAgICBmQWNsSWQgPSBhY2xJZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIEFsbG93YWJsZUFjdGlvbnMgYWN0aW9ucyA9IERhdGFPYmplY3RDcmVhdG9yLmZpbGxBbGxvd2FibGVBY3Rpb25zKHRoaXMsIHVzZXIpOwotICAgICAgICByZXR1cm4gYWN0aW9uczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kaXRpb24oU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb250ZW50U3RyZWFtIGdldEljb25Gcm9tUmVzb3VyY2VEaXIoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaW1hZ2VTdHJlYW0gPSBTdG9yZWRPYmplY3RJbXBsLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgaW50IG5vQnl0ZXNSZWFkID0gMDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKChub0J5dGVzUmVhZCA9IGltYWdlU3RyZWFtLnJlYWQoYnVmZmVyKSkgPj0gMCkgewotICAgICAgICAgICAgICAgIGJhLndyaXRlKGJ1ZmZlciwgMCwgbm9CeXRlc1JlYWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYmEpOwotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoaW1hZ2VTdHJlYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGVudFN0cmVhbURhdGFJbXBsIGNvbnRlbnQgPSBuZXcgQ29udGVudFN0cmVhbURhdGFJbXBsKDApOwotICAgICAgICBjb250ZW50LnNldEZpbGVOYW1lKG5hbWUpOwotICAgICAgICBjb250ZW50LnNldE1pbWVUeXBlKCJpbWFnZS9wbmciKTsKLSAgICAgICAgY29udGVudC5zZXRDb250ZW50KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYS50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIHJldHVybiBjb250ZW50OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHRlc3RSZW5kaXRpb25GaWx0ZXJGb3JJbWFnZShTdHJpbmdbXSBmb3JtYXRzKSB7Ci0gICAgICAgIGlmIChmb3JtYXRzLmxlbmd0aCA9PSAxICYmIG51bGwgIT0gZm9ybWF0c1swXSAmJiBmb3JtYXRzWzBdLmVxdWFscygiY21pczpub25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhcnJheUNvbnRhaW5zU3RyaW5nKGZvcm1hdHMsICIqIikgfHwgYXJyYXlDb250YWluc1N0cmluZyhmb3JtYXRzLCAiaW1hZ2UvKiIpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFycmF5Q29udGFpbnNTdHJpbmcoZm9ybWF0cywgImltYWdlL2pwZWciKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhcnJheUNvbnRhaW5zU3RyaW5nKFN0cmluZ1tdIGZvcm1hdHMsIFN0cmluZyB2YWwpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IGZvcm1hdHMpIHsKLSAgICAgICAgICAgIGlmICh2YWwuZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvc3RvcmVkb2JqL2ltcGwvVmVyc2lvbmVkRG9jdW1lbnRJbXBsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9WZXJzaW9uZWREb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0NzE0NC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9zdG9yZWRvYmovaW1wbC9WZXJzaW9uZWREb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5GaWx0ZXJQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5Eb2N1bWVudFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5WZXJzaW9uZWREb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25lZERvY3VtZW50SW1wbCBleHRlbmRzIEZpbGluZ0ltcGwgaW1wbGVtZW50cyBWZXJzaW9uZWREb2N1bWVudCB7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZklzQ2hlY2tlZE91dDsKLSAgICBwcml2YXRlIFN0cmluZyBmQ2hlY2tlZE91dFVzZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PERvY3VtZW50VmVyc2lvbj4gZlZlcnNpb25zOwotCi0gICAgcHVibGljIFZlcnNpb25lZERvY3VtZW50SW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZlZlcnNpb25zID0gbmV3IEFycmF5TGlzdDxEb2N1bWVudFZlcnNpb24+KCk7Ci0gICAgICAgIGZJc0NoZWNrZWRPdXQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRG9jdW1lbnRWZXJzaW9uIGFkZFZlcnNpb24oVmVyc2lvbmluZ1N0YXRlIHZlclN0YXRlLCBTdHJpbmcgdXNlcikgewotCi0gICAgICAgIGlmIChpc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJDYW5ub3QgYWRkIGEgdmVyc2lvbiB0byBkb2N1bWVudCwgZG9jdW1lbnQgaXMgY2hlY2tlZCBvdXQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudFZlcnNpb25JbXBsIHZlciA9IG5ldyBEb2N1bWVudFZlcnNpb25JbXBsKGZSZXBvc2l0b3J5SWQsIHRoaXMsIHZlclN0YXRlKTsKLSAgICAgICAgdmVyLnNldFN5c3RlbUJhc2VQcm9wZXJ0aWVzV2hlbkNyZWF0ZWREaXJlY3QoZ2V0TmFtZSgpLCBnZXRUeXBlSWQoKSwgdXNlcik7IC8vIGNvcHkKLSAgICAgICAgLy8gbmFtZSBhbmQgdHlwZSBpZCBmcm9tIHZlcnNpb24gc2VyaWVzLgotICAgICAgICBmVmVyc2lvbnMuYWRkKHZlcik7Ci0gICAgICAgIGlmICh2ZXJTdGF0ZSA9PSBWZXJzaW9uaW5nU3RhdGUuQ0hFQ0tFRE9VVCkgewotICAgICAgICAgICAgZkNoZWNrZWRPdXRVc2VyID0gdXNlcjsKLSAgICAgICAgICAgIGZJc0NoZWNrZWRPdXQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGVWZXJzaW9uKERvY3VtZW50VmVyc2lvbiB2ZXJzaW9uKSB7Ci0gICAgICAgIGlmIChmSXNDaGVja2VkT3V0KSB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBEbyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgaWYgdGhlIGRvY3VtZW50IGlzCi0gICAgICAgICAgICAvLyBjaGVja2VkLW91dC4gSW4gQXRvbVB1YiBiaW5kaW5nIGNhbmNlbENoZWNrb3V0Ci0gICAgICAgICAgICAvLyBtYXBwZWQgdG8gYSBkZWxldGVWZXJzaW9uKCkgY2FsbCEKLSAgICAgICAgICAgIERvY3VtZW50VmVyc2lvbiBwd2MgPSBnZXRQd2MoKTsKLSAgICAgICAgICAgIGlmIChwd2MgPT0gdmVyc2lvbikgeyAvLyBOT1NPTkFSCi0gICAgICAgICAgICAgICAgY2FuY2VsQ2hlY2tPdXQoZmFsc2UpOyAvLyBub3RlIG9iamVjdCBpcyBhbHJlYWR5IGRlbGV0ZWQgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIGluIE9iamVjdFN0b3JlCi0gICAgICAgICAgICAgICAgcmV0dXJuICFmVmVyc2lvbnMuaXNFbXB0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmVmVyc2lvbnMucmVtb3ZlKHZlcnNpb24pOwotICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVmVyc2lvbiBpcyBub3QgY29udGFpbmVkIGluIHRoZSBkb2N1bWVudDoiICsgdmVyc2lvbi5nZXRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAhZlZlcnNpb25zLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgdXNlcikgewotICAgICAgICBjYW5jZWxDaGVja091dCh0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKGJvb2xlYW4gaXNNYWpvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBDb250ZW50U3RyZWFtIGNvbnRlbnQsIFN0cmluZyBjaGVja2luQ29tbWVudCwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY3lJZHMsIFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGlmIChmSXNDaGVja2VkT3V0KSB7Ci0gICAgICAgICAgICBpZiAoZkNoZWNrZWRPdXRVc2VyLmVxdWFscyh1c2VyKSkgewotICAgICAgICAgICAgICAgIGZJc0NoZWNrZWRPdXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmQ2hlY2tlZE91dFVzZXIgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIkVycm9yOiBDYW4ndCBjaGVja2luLiBEb2N1bWVudCAiICsgZ2V0SWQoKSArICIgdXNlciAiICsgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBub3QgY2hlY2tlZCBvdXQgdGhlIGRvY3VtZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIkVycm9yOiBDYW4ndCBjYW5jZWwgY2hlY2tvdXQsIERvY3VtZW50ICIgKyBnZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgY2hlY2tlZCBvdXQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudFZlcnNpb24gcHdjID0gZ2V0UHdjKCk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gY29udGVudCkgewotICAgICAgICAgICAgcHdjLnNldENvbnRlbnQoY29udGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBwcm9wZXJ0aWVzICYmIG51bGwgIT0gcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkpIHsKLSAgICAgICAgICAgICgoRG9jdW1lbnRWZXJzaW9uSW1wbCkgcHdjKS5zZXRDdXN0b21Qcm9wZXJ0aWVzKHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB3Yy5zZXRDaGVja2luQ29tbWVudChjaGVja2luQ29tbWVudCk7Ci0gICAgICAgIHB3Yy5jb21taXQoaXNNYWpvcik7Ci0gICAgICAgIGlmIChwb2xpY3lJZHMgIT0gbnVsbCAmJiBwb2xpY3lJZHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgKChEb2N1bWVudFZlcnNpb25JbXBsKSBwd2MpLnNldEFwcGxpZWRQb2xpY2llcyhwb2xpY3lJZHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERvY3VtZW50VmVyc2lvbiBjaGVja091dChTdHJpbmcgdXNlcikgewotICAgICAgICBpZiAoZklzQ2hlY2tlZE91dCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJFcnJvcjogQ2FuJ3QgY2hlY2tvdXQsIERvY3VtZW50ICIgKyBnZXRJZCgpIAotICAgICAgICAgICAgICAgICAgICArICIgaXMgYWxyZWFkeSBjaGVja2VkIG91dC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBQV0MKLSAgICAgICAgRG9jdW1lbnRWZXJzaW9uIHB3YyA9IGFkZFZlcnNpb24oVmVyc2lvbmluZ1N0YXRlLkNIRUNLRURPVVQsIHVzZXIpOyAvLyB3aWxsCi0gICAgICAgIC8vIHNldCBjaGVjay1vdXQgZmxhZwotICAgICAgICByZXR1cm4gcHdjOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PERvY3VtZW50VmVyc2lvbj4gZ2V0QWxsVmVyc2lvbnMoKSB7Ci0gICAgICAgIHJldHVybiBmVmVyc2lvbnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERvY3VtZW50VmVyc2lvbiBnZXRMYXRlc3RWZXJzaW9uKGJvb2xlYW4gbWFqb3IpIHsKLQotICAgICAgICBEb2N1bWVudFZlcnNpb24gbGF0ZXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGZWZXJzaW9ucy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWFqb3IpIHsKLSAgICAgICAgICAgIGZvciAoRG9jdW1lbnRWZXJzaW9uIHZlciA6IGZWZXJzaW9ucykgewotICAgICAgICAgICAgICAgIGlmICh2ZXIuaXNNYWpvcigpICYmICF2ZXIuaXNQd2MoKSkgewotICAgICAgICAgICAgICAgICAgICBsYXRlc3QgPSB2ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG51bGwgPT0gZ2V0UHdjKCkpIHsKLSAgICAgICAgICAgICAgICBsYXRlc3QgPSBmVmVyc2lvbnMuZ2V0KGZWZXJzaW9ucy5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZlZlcnNpb25zLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBsYXRlc3QgPSBmVmVyc2lvbnMuZ2V0KGZWZXJzaW9ucy5zaXplKCkgLSAyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbGF0ZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChudWxsID09IGdldFB3YygpKSB7Ci0gICAgICAgICAgICAgICAgbGF0ZXN0ID0gZlZlcnNpb25zLmdldChmVmVyc2lvbnMuc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZWZXJzaW9ucy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbGF0ZXN0ID0gZlZlcnNpb25zLmdldChmVmVyc2lvbnMuc2l6ZSgpIC0gMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxhdGVzdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhdGVzdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWRPdXQoKSB7Ci0gICAgICAgIHJldHVybiBmSXNDaGVja2VkT3V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tlZE91dEJ5KCkgewotICAgICAgICByZXR1cm4gZkNoZWNrZWRPdXRVc2VyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEb2N1bWVudFZlcnNpb24gZ2V0UHdjKCkgewotICAgICAgICBmb3IgKERvY3VtZW50VmVyc2lvbiB2ZXIgOiBmVmVyc2lvbnMpIHsKLSAgICAgICAgICAgIGlmICh2ZXIuaXNQd2MoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB2ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmlsbFByb3BlcnRpZXMoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzLCBCaW5kaW5nc09iamVjdEZhY3Rvcnkgb2JqRmFjdG9yeSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0ZWRJZHMpIHsKLQotICAgICAgICBEb2N1bWVudFZlcnNpb24gcHdjID0gZ2V0UHdjKCk7Ci0KLSAgICAgICAgc3VwZXIuZmlsbFByb3BlcnRpZXMocHJvcGVydGllcywgb2JqRmFjdG9yeSwgcmVxdWVzdGVkSWRzKTsKLQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuSVNfSU1NVVRBQkxFLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUsCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUsIGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvdmVyd3JpdGUgdGhlIHZlcnNpb24gcmVsYXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQsCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQsIGdldElkKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLklTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VULAotICAgICAgICAgICAgICAgICAgICBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsIGlzQ2hlY2tlZE91dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0JZLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwKLSAgICAgICAgICAgICAgICAgICAgb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlksIGdldENoZWNrZWRPdXRCeSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lELCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsCi0gICAgICAgICAgICAgICAgICAgIG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdjID09IG51bGwgPyBudWxsIDogcHdjLmdldElkKCkpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNhbmNlbENoZWNrT3V0KGJvb2xlYW4gZGVsZXRlSW5PYmplY3RTdG9yZSkgewotICAgICAgICBEb2N1bWVudFZlcnNpb24gcHdjID0gZ2V0UHdjKCk7Ci0gICAgICAgIGZJc0NoZWNrZWRPdXQgPSBmYWxzZTsKLSAgICAgICAgZkNoZWNrZWRPdXRVc2VyID0gbnVsbDsKLSAgICAgICAgZlZlcnNpb25zLnJlbW92ZShwd2MpOwotICAgICAgICBpZiAoZlZlcnNpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lTGF0ZXN0VmVyID0gZ2V0TGF0ZXN0VmVyc2lvbihmYWxzZSkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCFnZXROYW1lKCkuZXF1YWxzKG5hbWVMYXRlc3RWZXIpKSB7Ci0gICAgICAgICAgICAgICAgc2V0TmFtZShuYW1lTGF0ZXN0VmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZGVsZXRlSW5PYmplY3RTdG9yZSkgewotICAgICAgICAgICAgLy8gVE9ETzoKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS90eXBlcy9EZWZhdWx0VHlwZVN5c3RlbUNyZWF0b3IuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3R5cGVzL0RlZmF1bHRUeXBlU3lzdGVtQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjcyNmRiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3R5cGVzL0RlZmF1bHRUeXBlU3lzdGVtQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5DaG9pY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVJdGVtVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUG9saWN5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ2hvaWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SWREZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZURlZmluaXRpb25GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFR5cGVTeXN0ZW1DcmVhdG9yIGltcGxlbWVudHMgVHlwZUNyZWF0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMVElOX0lOX01FTU9SWV9UWVBFX0RFRklOSVRJT05fREVTQ1IgPSAiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VHlwZURlZmluaXRpb24+IFNJTkdMRVRPTl9UWVBFUyA9IGJ1aWxkVHlwZXNMaXN0KCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUExFWF9UWVBFID0gIkNvbXBsZXhUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BMRVZFTF9UWVBFID0gIkRvY3VtZW50VG9wTGV2ZWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05FRF9UWVBFID0gIlZlcnNpb25hYmxlVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV9UWVBFID0gIk15SXRlbVR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMMV9UWVBFID0gIkRvY3VtZW50TGV2ZWwxIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTDJfVFlQRSA9ICJEb2N1bWVudExldmVsMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1RZUEVfSUQgPSAiTXlTZWNvbmRhcnlUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSUdfQ09OVEVOVF9GQUtFX1RZUEUgPSAiQmlnQ29udGVudEZha2VUeXBlIjsKLQotICAgIC8qCi0gICAgICogSW4gdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgdGhpcyBjbGFzcyB3ZSByZXR1cm4gdGhlIHNpbmdsZXRvbiBjb250YWluaW5nCi0gICAgICogdGhlIHJlcXVpcmVkIHR5cGVzIGZvciB0ZXN0aW5nLgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZUNyZWF0b3IjY3JlYXRlVHlwZXNMaXN0KCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbj4gY3JlYXRlVHlwZXNMaXN0KCkgewotICAgICAgICByZXR1cm4gU0lOR0xFVE9OX1RZUEVTOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxUeXBlRGVmaW5pdGlvbj4gZ2V0VHlwZXNMaXN0KCkgewotICAgICAgICByZXR1cm4gU0lOR0xFVE9OX1RZUEVTOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZUJ5SWQoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgOiBTSU5HTEVUT05fVFlQRVMpIHsKLSAgICAgICAgICAgIGlmICh0eXBlRGVmLmdldElkKCkuZXF1YWxzKHR5cGVJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZURlZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgcm9vdCB0eXBlcyBhbmQgYSBjb2xsZWN0aW9uIG9mIHNhbXBsZSB0eXBlcy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHR5cGVzTWFwIGEgbWFwIGZpbGxlZCB3aXRoIGNyZWF0ZWQgdHlwZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFR5cGVEZWZpbml0aW9uPiBidWlsZFR5cGVzTGlzdCgpIHsKLSAgICAgICAgLy8gYWx3YXlzIGFkZCBDTUlTIGRlZmF1bHQgdHlwZXMKLSAgICAgICAgVHlwZURlZmluaXRpb25GYWN0b3J5IHR5cGVGYWN0b3J5ID0gRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0VHlwZURlZmluaXRpb25GYWN0b3J5KCk7Ci0KLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gdHlwZXNMaXN0ID0gbmV3IExpbmtlZExpc3Q8VHlwZURlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY21pc1R5cGUxOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY21pc1R5cGUxID0gdHlwZUZhY3RvcnkuY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbi5DTUlTXzFfMSwgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldENtaXNEb2N1bWVudFR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMS5zZXRJZCgiTXlEb2NUeXBlMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxLnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDEgTGV2ZWwgMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUxIik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMSk7Ci0KLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMjsKLSAgICAgICAgICAgIGNtaXNUeXBlMiA9IHR5cGVGYWN0b3J5LmNyZWF0ZURvY3VtZW50VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDbWlzRG9jdW1lbnRUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBjbWlzVHlwZTIuc2V0SWQoIk15RG9jVHlwZTIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMi5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAyIExldmVsIDEiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMi5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMiIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTIpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUxMTsKLSAgICAgICAgICAgIGNtaXNUeXBlMTEgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMSwgIk15RG9jVHlwZTEuMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxMS5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAzIExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMTEuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTEuMSIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTExKTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMTExOwotICAgICAgICAgICAgY21pc1R5cGUxMTEgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMTEsICJNeURvY1R5cGUxLjEuMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxMTEuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgNCBMZXZlbCAzIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTExMS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMS4xLjEiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUxMTEpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUxMTI7Ci0gICAgICAgICAgICBjbWlzVHlwZTExMiA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUxMSwgIk15RG9jVHlwZTEuMS4yIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTExMi5zZXRJZCgiTXlEb2NUeXBlMS4xLjIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMTEyLnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDUgTGV2ZWwgMyIpOwotICAgICAgICAgICAgY21pc1R5cGUxMTIuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTEuMS4yIik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMTEyKTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMTI7Ci0gICAgICAgICAgICBjbWlzVHlwZTEyID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzVHlwZTEsICJNeURvY1R5cGUxLjIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMTIuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgNiBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTEyLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUxLjIiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUxMik7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTIxOwotICAgICAgICAgICAgY21pc1R5cGUyMSA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUyLCAiTXlEb2NUeXBlMi4xIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTIxLnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDcgTGV2ZWwgMiIpOwotICAgICAgICAgICAgY21pc1R5cGUyMS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMi4xIik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMjEpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUyMjsKLSAgICAgICAgICAgIGNtaXNUeXBlMjIgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMiwgIk15RG9jVHlwZTIuMiIpOwotICAgICAgICAgICAgY21pc1R5cGUyMi5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSA4IExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjIuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTIuMiIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTIyKTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMjM7Ci0gICAgICAgICAgICBjbWlzVHlwZTIzID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzVHlwZTIsICJNeURvY1R5cGUyLjMiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjMuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgOSBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTIzLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUyLjMiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUyMyk7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTI0OwotICAgICAgICAgICAgY21pc1R5cGUyNCA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUyLCAiTXlEb2NUeXBlMi40Iik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI0LnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDEwIExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjQuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTIuNCIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTI0KTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMjU7Ci0gICAgICAgICAgICBjbWlzVHlwZTI1ID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzVHlwZTIsICJNeURvY1R5cGUyLjUiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjUuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgMTEgTGV2ZWwgMiIpOwotICAgICAgICAgICAgY21pc1R5cGUyNS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMi41Iik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMjUpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUyNjsKLSAgICAgICAgICAgIGNtaXNUeXBlMjYgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMiwgIk15RG9jVHlwZTIuNiIpOwotICAgICAgICAgICAgY21pc1R5cGUyNi5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAxMiBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI2LnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUyLjYiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUyNik7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTI3OwotICAgICAgICAgICAgY21pc1R5cGUyNyA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUyLCAiTXlEb2NUeXBlMi43Iik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI3LnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDEzIExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjcuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTIuNyIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTI3KTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMjg7Ci0gICAgICAgICAgICBjbWlzVHlwZTI4ID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzVHlwZTIsICJNeURvY1R5cGUyLjgiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjguc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgMTQgTGV2ZWwgMiIpOwotICAgICAgICAgICAgY21pc1R5cGUyOC5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMi44Iik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMjgpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUyOTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjkgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMiwgIk15RG9jVHlwZTIuOSIpOwotICAgICAgICAgICAgY21pc1R5cGUyOS5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAxNSBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI5LnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUyLjkiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUyOSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSB3aXRoIHByb3BlcnRpZXMKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNDb21wbGV4VHlwZTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZURvY3VtZW50VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDbWlzRG9jdW1lbnRUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuc2V0SWQoQ09NUExFWF9UWVBFKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5zZXREaXNwbGF5TmFtZSgiQ29tcGxleCB0eXBlIHdpdGggcHJvcGVydGllcywgTGV2ZWwgMSIpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBDb21wbGV4VHlwZSIpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Qm9vbGVhbj4gcHJvcCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlQm9vbGVhbkRlZmluaXRpb24oIkJvb2xlYW5Qcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBCb29sZWFuIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3ApOwotCi0gICAgICAgICAgICBwcm9wID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVCb29sZWFuTXVsdGlEZWZpbml0aW9uKCJCb29sZWFuUHJvcE1WIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBCb29sZWFuIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3ApOwotCi0gICAgICAgICAgICBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwgcHJvcDIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZURhdGVUaW1lRGVmaW5pdGlvbigiRGF0ZVRpbWVQcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBEYXRlVGltZSBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMik7Ci0KLSAgICAgICAgICAgIHByb3AyID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVEYXRlVGltZU11bHRpRGVmaW5pdGlvbigiRGF0ZVRpbWVQcm9wTVYiLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIERhdGVUaW1lIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AyKTsKLQotICAgICAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwgcHJvcDMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZURlY2ltYWxEZWZpbml0aW9uKCJEZWNpbWFsUHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgRGVjaW1hbCBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMyk7Ci0KLSAgICAgICAgICAgIHByb3AzID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVEZWNpbWFsTXVsdGlEZWZpbml0aW9uKCJEZWNpbWFsUHJvcE1WIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBEZWNpbWFsIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AzKTsKLQotICAgICAgICAgICAgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwgcHJvcDQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUh0bWxEZWZpbml0aW9uKCJIdG1sUHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgSHRtbCBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wNCk7Ci0KLSAgICAgICAgICAgIHByb3A0ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVIdG1sTXVsdGlEZWZpbml0aW9uKCJIdG1sUHJvcE1WIiwgIlNhbXBsZSBIdG1sIG11bHRpLXZhbHVlIFByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A0KTsKLQotICAgICAgICAgICAgUHJvcGVydHlJZERlZmluaXRpb25JbXBsIHByb3A1ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVJZERlZmluaXRpb24oIklkUHJvcCIsICJTYW1wbGUgSWQgUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDUpOwotCi0gICAgICAgICAgICBwcm9wNSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSWRNdWx0aURlZmluaXRpb24oIklkUHJvcE1WIiwgIlNhbXBsZSBJZCBIdG1sIG11bHRpLXZhbHVlIFByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A1KTsKLQotICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcDYgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKCJJbnRQcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBJbnQgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDYpOwotCi0gICAgICAgICAgICBwcm9wNiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlck11bHRpRGVmaW5pdGlvbigiSW50UHJvcE1WIiwgIlNhbXBsZSBJbnQgbXVsdGktdmFsdWUgUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDYpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3A3ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKCJTdHJpbmdQcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDcpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsIHByb3A4ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVVcmlEZWZpbml0aW9uKCJVcmlQcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBVcmkgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDgpOwotCi0gICAgICAgICAgICBwcm9wOCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlVXJpTXVsdGlEZWZpbml0aW9uKCJVcmlQcm9wTVYiLCAiU2FtcGxlIFVyaSBtdWx0aS12YWx1ZSBQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wOCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcDkgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oIlBpY2tMaXN0UHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgUGljayBMaXN0IFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBMaXN0PENob2ljZTxTdHJpbmc+PiBjaG9pY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8U3RyaW5nPj4oKTsKLSAgICAgICAgICAgIENob2ljZUltcGw8U3RyaW5nPiBlbGVtID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJyZWQiKSk7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0LmFkZChlbGVtKTsKLSAgICAgICAgICAgIGVsZW0gPSBuZXcgQ2hvaWNlSW1wbDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBlbGVtLnNldFZhbHVlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImdyZWVuIikpOwotICAgICAgICAgICAgY2hvaWNlTGlzdC5hZGQoZWxlbSk7Ci0gICAgICAgICAgICBlbGVtID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJibHVlIikpOwotICAgICAgICAgICAgY2hvaWNlTGlzdC5hZGQoZWxlbSk7Ci0gICAgICAgICAgICBlbGVtID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJibGFjayIpKTsKLSAgICAgICAgICAgIGNob2ljZUxpc3QuYWRkKGVsZW0pOwotICAgICAgICAgICAgcHJvcDkuc2V0Q2hvaWNlcyhjaG9pY2VMaXN0KTsKLSAgICAgICAgICAgIHByb3A5LnNldERlZmF1bHRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJibHVlIikpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wOSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0eXBlIHRvIHR5cGVzIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc0NvbXBsZXhUeXBlKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgd2l0aCBpbmhlcml0ZWQgcHJvcGVydGllcwotICAgICAgICAgICAgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY21pc0RvY1R5cGVUb3BMZXZlbDsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlVG9wTGV2ZWwgPSB0eXBlRmFjdG9yeS5jcmVhdGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRG9jdW1lbnRUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZVRvcExldmVsLnNldElkKFRPUExFVkVMX1RZUEUpOwotICAgICAgICAgICAgY21pc0RvY1R5cGVUb3BMZXZlbC5zZXREaXNwbGF5TmFtZSgiRG9jdW1lbnQgdHlwZSB3aXRoIHByb3BlcnRpZXMsIExldmVsIDEiKTsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlVG9wTGV2ZWwuc2V0RGVzY3JpcHRpb24oQlVJTFRJTl9JTl9NRU1PUllfVFlQRV9ERUZJTklUSU9OX0RFU0NSICsgVE9QTEVWRUxfVFlQRSk7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzRG9jVHlwZUxldmVsMTsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlTGV2ZWwxID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzRG9jVHlwZVRvcExldmVsLCBMRVZFTDFfVFlQRSk7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZUxldmVsMS5zZXREaXNwbGF5TmFtZSgiRG9jdW1lbnQgdHlwZSB3aXRoIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZUxldmVsMS5zZXREZXNjcmlwdGlvbihCVUlMVElOX0lOX01FTU9SWV9UWVBFX0RFRklOSVRJT05fREVTQ1IgKyBMRVZFTDFfVFlQRSk7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzRG9jVHlwZUxldmVsMjsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlTGV2ZWwyID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzRG9jVHlwZUxldmVsMSwgTEVWRUwyX1RZUEUpOwotICAgICAgICAgICAgY21pc0RvY1R5cGVMZXZlbDIuc2V0RGlzcGxheU5hbWUoIkRvY3VtZW50IHR5cGUgd2l0aCBpbmhlcml0ZWQgcHJvcGVydGllcywgTGV2ZWwgMyIpOwotICAgICAgICAgICAgY21pc0RvY1R5cGVMZXZlbDIuc2V0RGVzY3JpcHRpb24oQlVJTFRJTl9JTl9NRU1PUllfVFlQRV9ERUZJTklUSU9OX0RFU0NSICsgTEVWRUwyX1RZUEUpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3BUb3AgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oIlN0cmluZ1Byb3BUb3BMZXZlbCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgU3RyaW5nIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZVRvcExldmVsLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wVG9wKTsKLQotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wTGV2ZWwxID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKCJTdHJpbmdQcm9wTGV2ZWwxIiwKLSAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBQcm9wZXJ0eSBMZXZlbCAxIiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZUxldmVsMS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcExldmVsMSk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcExldmVsMiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbigiU3RyaW5nUHJvcExldmVsMiIsCi0gICAgICAgICAgICAgICAgICAgICJTdHJpbmcgUHJvcGVydHkgTGV2ZWwgMiIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc0RvY1R5cGVMZXZlbDIuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BMZXZlbDIpOwotCi0gICAgICAgICAgICAvLyBhZGQgdHlwZSB0byB0eXBlcyBjb2xsZWN0aW9uCi0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNEb2NUeXBlVG9wTGV2ZWwpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzRG9jVHlwZUxldmVsMSk7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNEb2NUeXBlTGV2ZWwyKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdHlwZSB0aGF0IGlzIHZlcnNpb25hYmxlCi0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzVmVyc2lvbmVkVHlwZTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uZWRUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbi5DTUlTXzFfMSwKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc1ZlcnNpb25lZFR5cGUuc2V0SWQoVkVSU0lPTkVEX1RZUEUpOwotICAgICAgICAgICAgY21pc1ZlcnNpb25lZFR5cGUuc2V0RGlzcGxheU5hbWUoIlZlcnNpb25lZCBUeXBlIik7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbmVkVHlwZS5zZXREZXNjcmlwdGlvbihCVUlMVElOX0lOX01FTU9SWV9UWVBFX0RFRklOSVRJT05fREVTQ1IgKyBWRVJTSU9ORURfVFlQRSk7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbmVkVHlwZS5zZXRJc1ZlcnNpb25hYmxlKHRydWUpOyAvLyBtYWtlIGl0IGEgdmVyc2lvbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlIFN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3AxID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKCJWZXJzaW9uZWRTdHJpbmdQcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQpOwotICAgICAgICAgICAgY21pc1ZlcnNpb25lZFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AxKTsKLQotICAgICAgICAgICAgLy8gYWRkIHR5cGUgdG8gdHlwZXMgY29sbGVjdGlvbgotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVmVyc2lvbmVkVHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIENNSVMgMS4xIGNyZWF0ZSBhbiBpdGVtIGl0ZW0gdHlwZQotCi0gICAgICAgICAgICBNdXRhYmxlSXRlbVR5cGVEZWZpbml0aW9uIGl0ZW1UeXBlOwotICAgICAgICAgICAgaXRlbVR5cGUgPSB0eXBlRmFjdG9yeS5jcmVhdGVJdGVtVHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDbWlzSXRlbVR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGl0ZW1UeXBlLnNldElkKElURU1fVFlQRSk7Ci0gICAgICAgICAgICBpdGVtVHlwZS5zZXREaXNwbGF5TmFtZSgiTXlJdGVtVHlwZSIpOwotICAgICAgICAgICAgaXRlbVR5cGUuc2V0RGVzY3JpcHRpb24oQlVJTFRJTl9JTl9NRU1PUllfVFlQRV9ERUZJTklUSU9OX0RFU0NSICsgSVRFTV9UWVBFKTsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLnNldERlZmF1bHRUeXBlQ2FwYWJpbGl0aWVzKGl0ZW1UeXBlKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlIFN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uCi0KLSAgICAgICAgICAgIHByb3AxID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKCJJdGVtU3RyaW5nUHJvcCIsICJJdGVtIFN0cmluZyBQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgaXRlbVR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AxKTsKLSAgICAgICAgICAgIC8vIGFkZCB0eXBlIHRvIHR5cGVzIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoaXRlbVR5cGUpOwotCi0gICAgICAgICAgICBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gY21pc1NlY29uZGFyeVR5cGU7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzU2Vjb25kYXJ5VHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuc2V0SWQoU0VDT05EQVJZX1RZUEVfSUQpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuc2V0RGlzcGxheU5hbWUoIk15U2Vjb25kYXJ5VHlwZSIpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuc2V0RGVzY3JpcHRpb24oQlVJTFRJTl9JTl9NRU1PUllfVFlQRV9ERUZJTklUSU9OX0RFU0NSICsgU0VDT05EQVJZX1RZUEVfSUQpOwotICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuc2V0RGVmYXVsdFR5cGVDYXBhYmlsaXRpZXMoY21pc1NlY29uZGFyeVR5cGUpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuc2V0SXNGaWxlYWJsZShmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNpbmdsZSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wUzEgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oIlNlY29uZGFyeVN0cmluZ1Byb3AiLAotICAgICAgICAgICAgICAgICAgICAiU2Vjb25kYXJ5IFN0cmluZyBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BTMSk7Ci0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wUzIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICAiU2Vjb25kYXJ5SW50ZWdlclByb3AiLCAiU2Vjb25kYXJ5IEludGVnZXIgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIHByb3BTMi5zZXRJc1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BTMik7Ci0gICAgICAgICAgICAvLyBhZGQgdHlwZSB0byB0eXBlcyBjb2xsZWN0aW9uCi0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNTZWNvbmRhcnlUeXBlKTsKLQotICAgICAgICAgICAgLy8gYWRkIHJlbGF0aW9uc2hpcCB0eXBlCi0gICAgICAgICAgICBNdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gcmVsVHlwZTsKLSAgICAgICAgICAgIHJlbFR5cGUgPSB0eXBlRmFjdG9yeS5jcmVhdGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbi5DTUlTXzFfMSwgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldENtaXNSZWxhdGlvbnNoaXBUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICByZWxUeXBlLnNldElkKCJDcm9zc1JlZmVyZW5jZVR5cGUiKTsKLSAgICAgICAgICAgIHJlbFR5cGUuc2V0RGlzcGxheU5hbWUoIkNyb3NzUmVmZXJlbmNlVHlwZSIpOwotICAgICAgICAgICAgcmVsVHlwZS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gQ3Jvc3NSZWZlcmVuY2VUeXBlIik7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5zZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhyZWxUeXBlKTsKLSAgICAgICAgICAgIHJlbFR5cGUuc2V0SXNGaWxlYWJsZShmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNpbmdsZSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotCi0gICAgICAgICAgICBwcm9wMSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbigiQ3Jvc3NSZWZlcmVuY2VLaW5kIiwgIkNyb3NzUmVmZXJlbmNlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcmVsVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDEpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChyZWxUeXBlKTsKLQotICAgICAgICAgICAgLy8gYWRkIGEgcG9saWN5IHR5cGUKLSAgICAgICAgICAgIE11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xUeXBlOwotICAgICAgICAgICAgcG9sVHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZVBvbGljeVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLCBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0Q21pc1BvbGljeVR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIHBvbFR5cGUuc2V0SWQoIkF1ZGl0UG9saWN5Iik7Ci0gICAgICAgICAgICBwb2xUeXBlLnNldERpc3BsYXlOYW1lKCJBdWRpdCBQb2xpY3kiKTsKLSAgICAgICAgICAgIHBvbFR5cGUuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIEF1ZGl0UG9saWN5Iik7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5zZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhwb2xUeXBlKTsKLSAgICAgICAgICAgIHBvbFR5cGUuc2V0SXNGaWxlYWJsZShmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uCi0gICAgICAgICAgICBwcm9wMSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbigiQXVkaXRTZXR0aW5ncyIsICJBdWRpdCBLaW5kIFByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBwb2xUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMSk7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKHBvbFR5cGUpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGVGYWtlOwotICAgICAgICAgICAgY21pc1R5cGVGYWtlID0gdHlwZUZhY3RvcnkuY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbi5DTUlTXzFfMSwgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldENtaXNEb2N1bWVudFR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGNtaXNUeXBlRmFrZS5zZXRJZChCSUdfQ09OVEVOVF9GQUtFX1RZUEUpOwotICAgICAgICAgICAgY21pc1R5cGVGYWtlLnNldERpc3BsYXlOYW1lKCJCaWdDb250ZW50RmFrZVR5cGUiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlRmFrZS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gZm9yIGJpZyBjb250ZW50IHN0cmVhbXMuIENvbnRlbnQgaXMgIgotICAgICAgICAgICAgICAgICAgICArICJpZ25vcmVkIGFuZCByZXBsYWNlZCBieSByYW5kb20gYnl0ZXMiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGVGYWtlKTsKLQotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIHJldHVybiB0eXBlc0xpc3Q7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gY3JlYXRpbmcgYnVpbHQtaW4gSW5NZW1vcnkgdHlwZXMuIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3R5cGVzL0RvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS90eXBlcy9Eb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQ4NDAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3R5cGVzL0RvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Gb2xkZXJUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkl0ZW1UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZUZvbGRlclR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qb2xpY3lUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ29udGVudFN0cmVhbUFsbG93ZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRm9sZGVyVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5JdGVtVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SWREZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlTXV0YWJpbGl0eUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZURlZmluaXRpb25GYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbk1lbW9yeURvY3VtZW50VHlwZSBleHRlbmRzIERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eURlZmluaXRpb24pOwotICAgICAgICAgICAgc3VwZXIuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5RGVmaW5pdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRJZChpZCk7Ci0gICAgICAgICAgICBzdXBlci5zZXRMb2NhbE5hbWUoaWQpOwotICAgICAgICAgICAgc3VwZXIuc2V0UXVlcnlOYW1lKERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldFF1ZXJ5TmFtZShpZCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbk1lbW9yeUZvbGRlclR5cGUgZXh0ZW5kcyBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BlcnR5RGVmaW5pdGlvbikgewotICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5RGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBzdXBlci5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHlEZWZpbml0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIHN1cGVyLnNldElkKGlkKTsKLSAgICAgICAgICAgIHN1cGVyLnNldExvY2FsTmFtZShpZCk7Ci0gICAgICAgICAgICBzdXBlci5zZXRRdWVyeU5hbWUoRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0UXVlcnlOYW1lKGlkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluTWVtb3J5UmVsYXRpb25zaGlwVHlwZSBleHRlbmRzIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcGVydHlEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHlEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIHN1cGVyLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eURlZmluaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgc3VwZXIuc2V0SWQoaWQpOwotICAgICAgICAgICAgc3VwZXIuc2V0TG9jYWxOYW1lKGlkKTsKLSAgICAgICAgICAgIHN1cGVyLnNldFF1ZXJ5TmFtZShEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRRdWVyeU5hbWUoaWQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5NZW1vcnlQb2xpY3lUeXBlIGV4dGVuZHMgUG9saWN5VHlwZURlZmluaXRpb25JbXBsIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eURlZmluaXRpb24pOwotICAgICAgICAgICAgc3VwZXIuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BlcnR5RGVmaW5pdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRJZChpZCk7Ci0gICAgICAgICAgICBzdXBlci5zZXRMb2NhbE5hbWUoaWQpOwotICAgICAgICAgICAgc3VwZXIuc2V0UXVlcnlOYW1lKERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldFF1ZXJ5TmFtZShpZCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbk1lbW9yeUl0ZW1UeXBlIGV4dGVuZHMgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcGVydHlEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHlEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIHN1cGVyLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eURlZmluaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgc3VwZXIuc2V0SWQoaWQpOwotICAgICAgICAgICAgc3VwZXIuc2V0TG9jYWxOYW1lKGlkKTsKLSAgICAgICAgICAgIHN1cGVyLnNldFF1ZXJ5TmFtZShpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluTWVtb3J5U2Vjb25kYXJ5VHlwZSBleHRlbmRzIFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcGVydHlEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcGVydHlEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIHN1cGVyLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wZXJ0eURlZmluaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgc3VwZXIuc2V0SWQoaWQpOwotICAgICAgICAgICAgc3VwZXIuc2V0TG9jYWxOYW1lKGlkKTsKLSAgICAgICAgICAgIHN1cGVyLnNldFF1ZXJ5TmFtZShpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFR5cGVEZWZpbml0aW9uPiBERUZBVUxUX1RZUEVTID0gY3JlYXRlQ21pc0RlZmF1bHRUeXBlcygpOwotICAgIHByaXZhdGUgc3RhdGljIFR5cGVEZWZpbml0aW9uRmFjdG9yeSB0eXBlRmFjdG9yeTsKLSAgICBwcml2YXRlIHN0YXRpYyBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZURvYzsKLSAgICBwcml2YXRlIHN0YXRpYyBNdXRhYmxlRm9sZGVyVHlwZURlZmluaXRpb24gY21pc1R5cGVGb2xkZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIGNtaXNUeXBlUmVsOwotICAgIHByaXZhdGUgc3RhdGljIE11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZVBvbGljeTsKLSAgICBwcml2YXRlIHN0YXRpYyBNdXRhYmxlSXRlbVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlSXRlbTsKLSAgICBwcml2YXRlIHN0YXRpYyBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gY21pc1R5cGVTZWNvbmRhcnk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50VHlwZURlZmluaXRpb24gZ2V0Q21pc0RvY3VtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNtaXNUeXBlRG9jOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRm9sZGVyVHlwZURlZmluaXRpb24gZ2V0Q21pc0ZvbGRlclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBjbWlzVHlwZUZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIGdldENtaXNSZWxhdGlvbnNoaXBUeXBlKCkgewotICAgICAgICByZXR1cm4gY21pc1R5cGVSZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQb2xpY3lUeXBlRGVmaW5pdGlvbiBnZXRDbWlzUG9saWN5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNtaXNUeXBlUG9saWN5OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSXRlbVR5cGVEZWZpbml0aW9uIGdldENtaXNJdGVtVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNtaXNUeXBlSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlY29uZGFyeVR5cGVEZWZpbml0aW9uIGdldENtaXNTZWNvbmRhcnlUeXBlKCkgewotICAgICAgICByZXR1cm4gY21pc1R5cGVTZWNvbmRhcnk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0VHlwZShNdXRhYmxlVHlwZURlZmluaXRpb24gdHlwZSwgVHlwZURlZmluaXRpb24gcGFyZW50VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgdHlwZS5zZXRCYXNlVHlwZUlkKHBhcmVudFR5cGVEZWZpbml0aW9uLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgIHR5cGUuc2V0UGFyZW50VHlwZUlkKHBhcmVudFR5cGVEZWZpbml0aW9uLmdldElkKCkpOwotICAgICAgICB0eXBlLnNldElzQ29udHJvbGxhYmxlQWNsKHBhcmVudFR5cGVEZWZpbml0aW9uLmlzQ29udHJvbGxhYmxlQWNsKCkpOwotICAgICAgICB0eXBlLnNldElzQ29udHJvbGxhYmxlUG9saWN5KHBhcmVudFR5cGVEZWZpbml0aW9uLmlzQ29udHJvbGxhYmxlUG9saWN5KCkpOwotICAgICAgICB0eXBlLnNldElzQ3JlYXRhYmxlKHBhcmVudFR5cGVEZWZpbml0aW9uLmlzQ3JlYXRhYmxlKCkpOwotICAgICAgICB0eXBlLnNldERlc2NyaXB0aW9uKG51bGwpOwotICAgICAgICB0eXBlLnNldERpc3BsYXlOYW1lKG51bGwpOwotICAgICAgICB0eXBlLnNldElzRmlsZWFibGUocGFyZW50VHlwZURlZmluaXRpb24uaXNGaWxlYWJsZSgpKTsKLSAgICAgICAgdHlwZS5zZXRJc0Z1bGx0ZXh0SW5kZXhlZChwYXJlbnRUeXBlRGVmaW5pdGlvbi5pc0Z1bGx0ZXh0SW5kZXhlZCgpKTsKLSAgICAgICAgdHlwZS5zZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeShwYXJlbnRUeXBlRGVmaW5pdGlvbi5pc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpKTsKLSAgICAgICAgdHlwZS5zZXRMb2NhbE5hbWUobnVsbCk7Ci0gICAgICAgIHR5cGUuc2V0TG9jYWxOYW1lc3BhY2UocGFyZW50VHlwZURlZmluaXRpb24uZ2V0TG9jYWxOYW1lc3BhY2UoKSk7Ci0gICAgICAgIHR5cGUuc2V0SXNRdWVyeWFibGUocGFyZW50VHlwZURlZmluaXRpb24uaXNRdWVyeWFibGUoKSk7Ci0gICAgICAgIHR5cGUuc2V0UXVlcnlOYW1lKG51bGwpOwotICAgICAgICB0eXBlLnNldElkKG51bGwpOwotICAgICAgICB0eXBlLnNldFR5cGVNdXRhYmlsaXR5KHBhcmVudFR5cGVEZWZpbml0aW9uLmdldFR5cGVNdXRhYmlsaXR5KCkpOwotICAgIH0KLQotICAgIC8qICAKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGFibGUgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uLCB3aGljaCBpcyBhIGNoaWxkIG9mIHRoZQotICAgICAqIHByb3ZpZGVkIHR5cGUgZGVmaW5pdGlvbi4gUHJvcGVydHkgZGVmaW5pdGlvbnMgYXJlIG5vdCBhZGRlZCB3aGljaCBpcwotICAgICAqIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYWRkaXRpb25hbCB0eXBlcyBhdCBydW50aW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjcmVhdGVEb2N1bWVudFR5cGVEZWZpbml0aW9uV2l0aG91dEJhc2VQcm9wZXJ0aWVzKAotICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBwYXJlbnRUeXBlRGVmaW5pdGlvbikgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2N1bWVudFR5cGUgPSBuZXcgSW5NZW1vcnlEb2N1bWVudFR5cGUoKTsKLSAgICAgICAgaW5pdFR5cGUoZG9jdW1lbnRUeXBlLCBwYXJlbnRUeXBlRGVmaW5pdGlvbik7Ci0KLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldElzVmVyc2lvbmFibGUocGFyZW50VHlwZURlZmluaXRpb24uaXNWZXJzaW9uYWJsZSgpKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldENvbnRlbnRTdHJlYW1BbGxvd2VkKHBhcmVudFR5cGVEZWZpbml0aW9uLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkpOwotICAgICAgICByZXR1cm4gZG9jdW1lbnRUeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFR5cGVEZWZpbml0aW9uPiBjcmVhdGVNYXBXaXRoRGVmYXVsdFR5cGVzKCkgewotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiB0eXBlc0xpc3QgPSBuZXcgTGlua2VkTGlzdDxUeXBlRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgdHlwZXNMaXN0LmFkZEFsbChERUZBVUxUX1RZUEVTKTsKLSAgICAgICAgcmV0dXJuIHR5cGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8VHlwZURlZmluaXRpb24+IGdldERlZmF1bHRUeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfVFlQRVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BlcnR5RGVmaW5pdGlvbikgewotICAgICAgICBpZiAocHJvcGVydHlEZWZpbml0aW9uLmdldElkKCkuZXF1YWxzKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMpKSB7Ci0gICAgICAgICAgICBNdXRhYmxlUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgPSAoTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbjw/PikgcHJvcGVydHlEZWZpbml0aW9uOwotICAgICAgICAgICAgcHJvcERlZi5zZXRVcGRhdGFiaWxpdHkoVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UXVlcnlOYW1lKFN0cmluZyBpZCkgewotICAgICAgICBpZiAobnVsbCA9PSBpZCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoaWQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNiLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHNiLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcgJykgewotICAgICAgICAgICAgICAgIHNiLnNldENoYXJBdChpLCAnXycpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUpIHsKLSAgICAgICAgY21pc1R5cGUuc2V0SXNDcmVhdGFibGUodHJ1ZSk7Ci0gICAgICAgIGNtaXNUeXBlLnNldElzRmlsZWFibGUodHJ1ZSk7Ci0gICAgICAgIGNtaXNUeXBlLnNldElzRnVsbHRleHRJbmRleGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgVHlwZU11dGFiaWxpdHlJbXBsIGdldEJhc2VUeXBlTXV0YWJpbGl0eSgpIHsKLSAgICAgICAgVHlwZU11dGFiaWxpdHlJbXBsIHR5cGVNdXRhYmlsaXR5ID0gbmV3IFR5cGVNdXRhYmlsaXR5SW1wbCgpOwotICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5DcmVhdGUodHJ1ZSk7Ci0gICAgICAgIHR5cGVNdXRhYmlsaXR5LnNldENhblVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIHR5cGVNdXRhYmlsaXR5LnNldENhbkRlbGV0ZShmYWxzZSk7Ci0gICAgICAgIHJldHVybiB0eXBlTXV0YWJpbGl0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFR5cGVEZWZpbml0aW9uPiBjcmVhdGVDbWlzRGVmYXVsdFR5cGVzKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdHlwZUZhY3RvcnlMb2NhbCA9IGdldFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpOwotCi0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHR5cGVzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgIC8vIGNyZWF0ZSByb290IHR5cGVzOgotICAgICAgICB0cnkgewotICAgICAgICAgICAgY21pc1R5cGVEb2MgPSB0eXBlRmFjdG9yeUxvY2FsLmNyZWF0ZURvY3VtZW50VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIG51bGwpOwotICAgICAgICAgICAgc2V0RGVmYXVsdFR5cGVDYXBhYmlsaXRpZXMoY21pc1R5cGVEb2MpOwotICAgICAgICAgICAgY21pc1R5cGVEb2Muc2V0VHlwZU11dGFiaWxpdHkoZ2V0QmFzZVR5cGVNdXRhYmlsaXR5KCkpOwotICAgICAgICAgICAgY21pc1R5cGVEb2Muc2V0Q29udGVudFN0cmVhbUFsbG93ZWQoQ29udGVudFN0cmVhbUFsbG93ZWQuQUxMT1dFRCk7Ci0gICAgICAgICAgICBjbWlzVHlwZURvYy5zZXRJc1ZlcnNpb25hYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGVEb2MpOwotCi0gICAgICAgICAgICBjbWlzVHlwZUZvbGRlciA9IHR5cGVGYWN0b3J5TG9jYWwuY3JlYXRlRm9sZGVyVHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIG51bGwpOwotICAgICAgICAgICAgc2V0RGVmYXVsdFR5cGVDYXBhYmlsaXRpZXMoY21pc1R5cGVGb2xkZXIpOwotICAgICAgICAgICAgY21pc1R5cGVGb2xkZXIuc2V0VHlwZU11dGFiaWxpdHkoZ2V0QmFzZVR5cGVNdXRhYmlsaXR5KCkpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZUZvbGRlcik7Ci0KLSAgICAgICAgICAgIGNtaXNUeXBlUmVsID0gdHlwZUZhY3RvcnlMb2NhbC5jcmVhdGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbi5DTUlTXzFfMSwgbnVsbCk7Ci0gICAgICAgICAgICBzZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhjbWlzVHlwZVJlbCk7Ci0gICAgICAgICAgICBjbWlzVHlwZVJlbC5zZXRUeXBlTXV0YWJpbGl0eShnZXRCYXNlVHlwZU11dGFiaWxpdHkoKSk7Ci0gICAgICAgICAgICBjbWlzVHlwZVJlbC5zZXRJc0ZpbGVhYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGVSZWwpOwotCi0gICAgICAgICAgICBjbWlzVHlwZVBvbGljeSA9IHR5cGVGYWN0b3J5TG9jYWwuY3JlYXRlUG9saWN5VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIG51bGwpOwotICAgICAgICAgICAgc2V0RGVmYXVsdFR5cGVDYXBhYmlsaXRpZXMoY21pc1R5cGVQb2xpY3kpOwotICAgICAgICAgICAgY21pc1R5cGVQb2xpY3kuc2V0VHlwZU11dGFiaWxpdHkoZ2V0QmFzZVR5cGVNdXRhYmlsaXR5KCkpOwotICAgICAgICAgICAgY21pc1R5cGVQb2xpY3kuc2V0SXNGaWxlYWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlUG9saWN5KTsKLQotICAgICAgICAgICAgY21pc1R5cGVJdGVtID0gdHlwZUZhY3RvcnlMb2NhbC5jcmVhdGVJdGVtVHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIG51bGwpOwotICAgICAgICAgICAgc2V0RGVmYXVsdFR5cGVDYXBhYmlsaXRpZXMoY21pc1R5cGVJdGVtKTsKLSAgICAgICAgICAgIGNtaXNUeXBlSXRlbS5zZXRUeXBlTXV0YWJpbGl0eShnZXRCYXNlVHlwZU11dGFiaWxpdHkoKSk7Ci0gICAgICAgICAgICBjbWlzVHlwZUl0ZW0uc2V0SXNGaWxlYWJsZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGVJdGVtKTsKLQotICAgICAgICAgICAgY21pc1R5cGVTZWNvbmRhcnkgPSB0eXBlRmFjdG9yeUxvY2FsLmNyZWF0ZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLCBudWxsKTsKLSAgICAgICAgICAgIHNldERlZmF1bHRUeXBlQ2FwYWJpbGl0aWVzKGNtaXNUeXBlU2Vjb25kYXJ5KTsKLSAgICAgICAgICAgIGNtaXNUeXBlU2Vjb25kYXJ5LnNldFR5cGVNdXRhYmlsaXR5KGdldEJhc2VUeXBlTXV0YWJpbGl0eSgpKTsKLSAgICAgICAgICAgIGNtaXNUeXBlU2Vjb25kYXJ5LnNldElzRmlsZWFibGUoZmFsc2UpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZVNlY29uZGFyeSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gY3JlYXRpbmcgYmFzZSB0eXBlcy4gIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHlwZXNMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb25GYWN0b3J5IGdldFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gdHlwZUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHR5cGVGYWN0b3J5ID0gVHlwZURlZmluaXRpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB0eXBlRmFjdG9yeS5zZXREZWZhdWx0Q29udHJvbGxhYmxlQWNsKHRydWUpOwotICAgICAgICAgICAgdHlwZUZhY3Rvcnkuc2V0RGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVGYWN0b3J5LnNldERlZmF1bHROYW1lc3BhY2UoImh0dHA6Ly9hcGFjaGUub3JnIik7Ci0gICAgICAgICAgICB0eXBlRmFjdG9yeS5zZXREZWZhdWx0SXNGdWxsdGV4dEluZGV4ZWQoZmFsc2UpOwotICAgICAgICAgICAgdHlwZUZhY3Rvcnkuc2V0RGVmYXVsdFF1ZXJ5YWJsZSh0cnVlKTsKLSAgICAgICAgICAgIFR5cGVNdXRhYmlsaXR5SW1wbCB0eXBlTXV0YWJpbGl0eSA9IG5ldyBUeXBlTXV0YWJpbGl0eUltcGwoKTsKLSAgICAgICAgICAgIHR5cGVNdXRhYmlsaXR5LnNldENhbkNyZWF0ZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVNdXRhYmlsaXR5LnNldENhblVwZGF0ZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVNdXRhYmlsaXR5LnNldENhbkRlbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIHR5cGVGYWN0b3J5LnNldERlZmF1bHRUeXBlTXV0YWJpbGl0eSh0eXBlTXV0YWJpbGl0eSk7Ci0gICAgICAgICAgICB0eXBlRmFjdG9yeS5zZXREb2N1bWVudFR5cGVEZWZpbml0aW9uQ2xhc3MoSW5NZW1vcnlEb2N1bWVudFR5cGUuY2xhc3MpOwotICAgICAgICAgICAgdHlwZUZhY3Rvcnkuc2V0Rm9sZGVyVHlwZURlZmluaXRpb25DbGFzcyhJbk1lbW9yeUZvbGRlclR5cGUuY2xhc3MpOwotICAgICAgICAgICAgdHlwZUZhY3Rvcnkuc2V0UmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25DbGFzcyhJbk1lbW9yeVJlbGF0aW9uc2hpcFR5cGUuY2xhc3MpOwotICAgICAgICAgICAgdHlwZUZhY3Rvcnkuc2V0UG9saWN5VHlwZURlZmluaXRpb25DbGFzcyhJbk1lbW9yeVBvbGljeVR5cGUuY2xhc3MpOwotICAgICAgICAgICAgdHlwZUZhY3Rvcnkuc2V0SXRlbVR5cGVEZWZpbml0aW9uQ2xhc3MoSW5NZW1vcnlJdGVtVHlwZS5jbGFzcyk7Ci0gICAgICAgICAgICB0eXBlRmFjdG9yeS5zZXRTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkNsYXNzKEluTWVtb3J5U2Vjb25kYXJ5VHlwZS5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSByb290IHR5cGVzIGFuZCBhIGNvbGxlY3Rpb24gb2Ygc2FtcGxlIHR5cGVzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdHlwZXNNYXAgbWFwIGZpbGxlZCB3aXRoIGNyZWF0ZWQgdHlwZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8VHlwZURlZmluaXRpb24+IGNyZWF0ZURlZmF1bHRUeXBlcygpIHsKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gdHlwZXNMaXN0ID0gY3JlYXRlQ21pc0RlZmF1bHRUeXBlcygpOwotCi0gICAgICAgIHJldHVybiB0eXBlc0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJhc2ljUHJvcGVydHlEZWZpbml0aW9ucyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLQotICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3BTID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLk5BTUUsICJOYW1lIiwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgcHJvcFMuc2V0SXNSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcFMuZ2V0SWQoKSwgcHJvcFMpOwotCi0gICAgICAgIFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCBwcm9wSWQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUlkRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsICJPYmplY3QgSWQiLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BJZC5nZXRJZCgpLCBwcm9wSWQpOwotCi0gICAgICAgIHByb3BJZCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIKLSAgICAgICAgICAgICAgICAuY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiVHlwZS1JZCIsIFVwZGF0YWJpbGl0eS5PTkNSRUFURSk7Ci0gICAgICAgIHByb3BJZC5zZXRJc1JlcXVpcmVkKHRydWUpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wSWQuZ2V0SWQoKSwgcHJvcElkKTsKLQotICAgICAgICBwcm9wSWQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUlkRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsICJCYXNlLVR5cGUtSWQiLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BJZC5nZXRJZCgpLCBwcm9wSWQpOwotCi0gICAgICAgIHByb3BTID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNSRUFURURfQlksICJDcmVhdGVkIEJ5IiwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0KLSAgICAgICAgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsIHByb3BEID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVEYXRlVGltZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSwgIkNyZWF0aW9uIERhdGUiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wRC5nZXRJZCgpLCBwcm9wRCk7Ci0KLSAgICAgICAgcHJvcFMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWSwgIk1vZGlmaWVkIEJ5IiwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0KLSAgICAgICAgcHJvcEQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZURhdGVUaW1lRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFLAotICAgICAgICAgICAgICAgICJNb2RpZmljYXRpb24gRGF0ZSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BELmdldElkKCksIHByb3BEKTsKLQotICAgICAgICBwcm9wUyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4sICJDaGFuZ2UgVG9rZW4iLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICAvLyBDTUlTIDEuMToKLSAgICAgICAgcHJvcFMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuREVTQ1JJUFRJT04sICJEZXNjcmlwdGlvbiIsCi0gICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICBwcm9wSWQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUlkTXVsdGlEZWZpbml0aW9uKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsCi0gICAgICAgICAgICAgICAgIlNlY29uZGFyeSBUeXBlIElkcyIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wSWQuZ2V0SWQoKSwgcHJvcElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QmFzaWNEb2N1bWVudFByb3BlcnR5RGVmaW5pdGlvbnMoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0KLSAgICAgICAgc2V0QmFzaWNQcm9wZXJ0eURlZmluaXRpb25zKHByb3BlcnR5RGVmaW5pdGlvbnMpOwotICAgICAgICBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCBwcm9wQiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlQm9vbGVhbkRlZmluaXRpb24oUHJvcGVydHlJZHMuSVNfSU1NVVRBQkxFLAotICAgICAgICAgICAgICAgICJJbW11dGFibGUiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wQi5nZXRJZCgpLCBwcm9wQik7Ci0KLSAgICAgICAgcHJvcEIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OLCAiSXMgTGF0ZXN0IFZlcnNpb24iLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BCLmdldElkKCksIHByb3BCKTsKLQotICAgICAgICBwcm9wQiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlQm9vbGVhbkRlZmluaXRpb24oUHJvcGVydHlJZHMuSVNfTUFKT1JfVkVSU0lPTiwgIklzIE1ham9yIFZlcnNpb24iLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BCLmdldElkKCksIHByb3BCKTsKLQotICAgICAgICBwcm9wQiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlQm9vbGVhbkRlZmluaXRpb24oUHJvcGVydHlJZHMuSVNfTEFURVNUX01BSk9SX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgIklzIExhdGVzdCBNYWpvciBWZXJzaW9uIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcEIuZ2V0SWQoKSwgcHJvcEIpOwotCi0gICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcFMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCwKLSAgICAgICAgICAgICAgICAiVmVyc2lvbiBMYWJlbCIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLQotICAgICAgICBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwgcHJvcElkID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVJZERlZmluaXRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQsCi0gICAgICAgICAgICAgICAgIlZlcnNpb24gU2VyaWVzIElkIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcElkLnNldElzUXVlcnlhYmxlKGZhbHNlKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcElkLmdldElkKCksIHByb3BJZCk7Ci0KLSAgICAgICAgcHJvcEIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VULAotICAgICAgICAgICAgICAgICJDaGVja2VkIE91dCIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BCLmdldElkKCksIHByb3BCKTsKLQotICAgICAgICBwcm9wUyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwKLSAgICAgICAgICAgICAgICAiQ2hlY2tlZCBPdXQgQnkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0KLSAgICAgICAgcHJvcElkID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVJZERlZmluaXRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsICJDaGVja2VkIE91dCBJZCIsCi0gICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcElkLmdldElkKCksIHByb3BJZCk7Ci0KLSAgICAgICAgcHJvcFMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5ULCAiQ2hlY2tpbiBDb21tZW50IiwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAvLyByZWFkLW9ubHksIGJlY2F1c2UKLSAgICAgICAgLy8gbm90IHNldCBhcyBwcm9wZXJ0eQotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0KLSAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcEkgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwgIkNvbnRlbnQgTGVuZ3RoIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcEkuZ2V0SWQoKSwgcHJvcEkpOwotCi0gICAgICAgIHByb3BTID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSwgIk1pbWUgVHlwZSIsCi0gICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcFMuZ2V0SWQoKSwgcHJvcFMpOwotCi0gICAgICAgIHByb3BTID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSwgIkZpbGUgTmFtZSIsCi0gICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucy5wdXQocHJvcFMuZ2V0SWQoKSwgcHJvcFMpOwotCi0gICAgICAgIHByb3BJZCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0lELCAiU3RyZWFtIElkIiwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wSWQuZ2V0SWQoKSwgcHJvcElkKTsKLQotICAgICAgICAvLyBDTUlTIDEuMToKLSAgICAgICAgcHJvcEIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX1BSSVZBVEVfV09SS0lOR19DT1BZLAotICAgICAgICAgICAgICAgICJQcml2YXRlIFdvcmtpbmcgQ29weSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BCLmdldElkKCksIHByb3BCKTsKLQotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJhc2ljRm9sZGVyUHJvcGVydHlEZWZpbml0aW9ucyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLQotICAgICAgICBzZXRCYXNpY1Byb3BlcnR5RGVmaW5pdGlvbnMocHJvcGVydHlEZWZpbml0aW9ucyk7Ci0gICAgICAgIFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCBwcm9wSWQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUlkRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5QQVJFTlRfSUQsICJQYXJlbnQgSWQiLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BJZC5nZXRJZCgpLCBwcm9wSWQpOwotCi0gICAgICAgIHByb3BJZCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSWRNdWx0aURlZmluaXRpb24oUHJvcGVydHlJZHMuQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFMsCi0gICAgICAgICAgICAgICAgIkFsbG93ZWQgQ2hpbGQgVHlwZXMiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wSWQuZ2V0SWQoKSwgcHJvcElkKTsKLQotICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3BTID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFByb3BlcnR5SWRzLlBBVEgsICJQYXRoIiwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wUy5nZXRJZCgpLCBwcm9wUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEJhc2ljUG9saWN5UHJvcGVydHlEZWZpbml0aW9ucyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLQotICAgICAgICBzZXRCYXNpY1Byb3BlcnR5RGVmaW5pdGlvbnMocHJvcGVydHlEZWZpbml0aW9ucyk7Ci0gICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcFMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQsCi0gICAgICAgICAgICAgICAgIlBvbGljeSBUZXh0IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIHByb3BTLnNldElzUmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BTLmdldElkKCksIHByb3BTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QmFzaWNSZWxhdGlvbnNoaXBQcm9wZXJ0eURlZmluaXRpb25zKE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcGVydHlEZWZpbml0aW9ucykgewotCi0gICAgICAgIHNldEJhc2ljUHJvcGVydHlEZWZpbml0aW9ucyhwcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgUHJvcGVydHlJZERlZmluaXRpb25JbXBsIHByb3BJZCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSWREZWZpbml0aW9uKFByb3BlcnR5SWRzLlNPVVJDRV9JRCwgIlNvdXJjZSBJZCIsCi0gICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIHByb3BJZC5zZXRJc1JlcXVpcmVkKHRydWUpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wSWQuZ2V0SWQoKSwgcHJvcElkKTsKLQotICAgICAgICBwcm9wSWQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUlkRGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5UQVJHRVRfSUQsICJUYXJnZXQgSWQiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgcHJvcElkLnNldElzUmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvbnMucHV0KHByb3BJZC5nZXRJZCgpLCBwcm9wSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZVByb3BlcnR5RGVmaW5pdGlvbnMoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBleGlzdGluZ1Bwcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBuZXdQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIHByb3BJZCA6IG5ld1Byb3BlcnR5RGVmaW5pdGlvbnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChleGlzdGluZ1Bwcm9wZXJ0eURlZmluaXRpb25zLmNvbnRhaW5zS2V5KHByb3BJZCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiWW91IGNhbid0IHNldCBhIHByb3BlcnR5IHdpdGggaWQgIiArIHByb3BJZAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBUaGlzIHByb3BlcnR5IGlkIGFscmVhZHkgZXhpc3RzIGFscmVhZHkgb3IgZXhpc3RzIGluIHN1cGVydHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGV4aXN0aW5nUHByb3BlcnR5RGVmaW5pdGlvbnMucHV0QWxsKG5ld1Byb3BlcnR5RGVmaW5pdGlvbnMpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvdHlwZXMvUHJvcGVydHlDcmVhdGlvbkhlbHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvdHlwZXMvUHJvcGVydHlDcmVhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmZkZDUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3R5cGVzL1Byb3BlcnR5Q3JlYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZW5kaXRpb25EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNob2ljZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLk9iamVjdERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lJZExpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEYXRlVGltZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUlkSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5EYXRhT2JqZWN0Q3JlYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5GaWx0ZXJQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkRvY3VtZW50VmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5hcGkuU3RvcmVkT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgUHJvcGVydHlDcmVhdGlvbkhlbHBlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsIGNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCAKLSAgICAgICAgICAgIFVwZGF0YWJpbGl0eSB1cGQpIHsKLSAgICAgICAgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5CT09MRUFOLCBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkuU0lOR0xFLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsIGNyZWF0ZUJvb2xlYW5NdWx0aURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsCi0gICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuQk9PTEVBTiwgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5Lk1VTFRJLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCBjcmVhdGVEYXRlVGltZURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsCi0gICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCBwcm9wID0gbmV3IFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5EQVRFVElNRSwgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5LlNJTkdMRSwgdXBkKTsKLSAgICAgICAgcmV0dXJuIHByb3A7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwgY3JlYXRlRGF0ZVRpbWVNdWx0aURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsCi0gICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCBwcm9wID0gbmV3IFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5EQVRFVElNRSwgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5Lk1VTFRJLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsIGNyZWF0ZURlY2ltYWxEZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCAKLSAgICAgICAgICAgIFVwZGF0YWJpbGl0eSB1cGQpIHsKLSAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5ERUNJTUFMLCBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkuU0lOR0xFLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsIGNyZWF0ZURlY2ltYWxNdWx0aURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsCi0gICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuREVDSU1BTCwgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5Lk1VTFRJLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsIGNyZWF0ZUh0bWxEZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuSFRNTCwgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5LlNJTkdMRSwgdXBkKTsKLSAgICAgICAgcmV0dXJuIHByb3A7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCBjcmVhdGVIdG1sTXVsdGlEZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCAKLSAgICAgICAgICAgIFVwZGF0YWJpbGl0eSB1cGQpIHsKLSAgICAgICAgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5IVE1MLCBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkuTVVMVEksIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlJZERlZmluaXRpb25JbXBsIGNyZWF0ZUlkRGVmaW5pdGlvbihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgVXBkYXRhYmlsaXR5IHVwZCkgewotICAgICAgICBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuSUQsIGRpc3BsYXlOYW1lLCBDYXJkaW5hbGl0eS5TSU5HTEUsIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlJZERlZmluaXRpb25JbXBsIGNyZWF0ZUlkTXVsdGlEZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCBwcm9wID0gbmV3IFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5JRCwgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5Lk1VTFRJLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsIGNyZWF0ZUludGVnZXJEZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGRpc3BsYXlOYW1lLCAKLSAgICAgICAgICAgIFVwZGF0YWJpbGl0eSB1cGQpIHsKLSAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5JTlRFR0VSLCBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkuU0lOR0xFLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsIGNyZWF0ZUludGVnZXJNdWx0aURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsCi0gICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuSU5URUdFUiwgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5Lk1VTFRJLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgVXBkYXRhYmlsaXR5IHVwZCkgewotICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5TVFJJTkcsIGRpc3BsYXlOYW1lLCBDYXJkaW5hbGl0eS5TSU5HTEUsIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBjcmVhdGVTdHJpbmdNdWx0aURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsCi0gICAgICAgICAgICBVcGRhdGFiaWxpdHkgdXBkKSB7Ci0gICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIGNyZWF0ZVN0YW5kYXJkRGVmaW5pdGlvbihwcm9wLCBpZCwgUHJvcGVydHlUeXBlLlNUUklORywgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5Lk1VTFRJLCB1cGQpOwotICAgICAgICByZXR1cm4gcHJvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwgY3JlYXRlVXJpRGVmaW5pdGlvbihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgVXBkYXRhYmlsaXR5IHVwZCkgewotICAgICAgICBQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsIHByb3AgPSBuZXcgUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24ocHJvcCwgaWQsIFByb3BlcnR5VHlwZS5VUkksIGRpc3BsYXlOYW1lLCBDYXJkaW5hbGl0eS5TSU5HTEUsIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCBjcmVhdGVVcmlNdWx0aURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsIFVwZGF0YWJpbGl0eSB1cGQpIHsKLSAgICAgICAgUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCBwcm9wID0gbmV3IFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhcmREZWZpbml0aW9uKHByb3AsIGlkLCBQcm9wZXJ0eVR5cGUuVVJJLCBkaXNwbGF5TmFtZSwgQ2FyZGluYWxpdHkuTVVMVEksIHVwZCk7Ci0gICAgICAgIHJldHVybiBwcm9wOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgYWRkRWxlbVRvUGlja2xpc3QoQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248VD4gcHJvcCwgVCB2YWx1ZSkgewotICAgICAgICBMaXN0PENob2ljZTxUPj4gY2hvaWNlTGlzdCA9IHByb3AuZ2V0Q2hvaWNlcygpOwotICAgICAgICBpZiAoY2hvaWNlTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8VD4+KCk7Ci0gICAgICAgICAgICBwcm9wLnNldENob2ljZXMoY2hvaWNlTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDaG9pY2VJbXBsPFQ+IGVsZW0gPSBuZXcgQ2hvaWNlSW1wbDxUPigpOwotICAgICAgICBlbGVtLnNldFZhbHVlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpKTsKLSAgICAgICAgY2hvaWNlTGlzdC5hZGQoZWxlbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyA8VD4gdm9pZCBzZXREZWZhdWx0VmFsdWUoQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248VD4gcHJvcCwgVCBkZWZWYWwpIHsKLSAgICAgICAgcHJvcC5zZXREZWZhdWx0VmFsdWUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChkZWZWYWwpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllc0Zyb21PYmplY3QoU3RvcmVkT2JqZWN0IHNvLCBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSwgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdGVkSWRzLCBib29sZWFuIGZpbGxPcHRpb25hbFByb3BlcnR5RGF0YSkgewotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0aWVzIGNvbGxlY3Rpb24KLQotICAgICAgICBCaW5kaW5nc09iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSA9IG5ldyBCaW5kaW5nc09iamVjdEZhY3RvcnlJbXBsKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBzby5maWxsUHJvcGVydGllcyhwcm9wZXJ0aWVzLCBvYmplY3RGYWN0b3J5LCByZXF1ZXN0ZWRJZHMpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0ZCA9IHR5cGVNYW5hZ2VyLmdldFR5cGVCeUlkKHNvLmdldFR5cGVJZCgpKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBzby5nZXRUeXBlSWQoKTsKLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRm9sZGVyICYmIEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlBBVEgsIHJlcXVlc3RlZElkcykpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gb2JqZWN0U3RvcmUuZ2V0Rm9sZGVyUGF0aChzby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLlBBVEgsIG9iamVjdEZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLlBBVEgsIHBhdGgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIoUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lELCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICBpZiAodGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJnZXRQcm9wZXJ0aWVzRnJvbU9iamVjdCgpLCBjYW5ub3QgZ2V0IHR5cGUgZGVmaW5pdGlvbiwgYSB0eXBlIHdpdGggaWQgIiArIHR5cGVJZAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIHVua25vd24iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VUeXBlSWQgPSB0ZC5nZXRCYXNlVHlwZUlkKCkudmFsdWUoKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRCwgYmFzZVR5cGVJZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmlsbCBub3Qtc2V0IHByb3BlcnRpZXMgZnJvbSB0eXBlIGRlZmluaXRpb24gKGFzIHNwZWMgcmVxdWlyZXMpCi0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcERlZnMgPSB0ZC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiBwcm9wRGVmcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHByb3BEZWYuZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgRmlsdGVyUGFyc2VyLmlzQ29udGFpbmVkSW5GaWx0ZXIocHJvcERlZi5nZXRJZCgpLCByZXF1ZXN0ZWRJZHMpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcERlZi5nZXRJZCgpLCBnZXRFbXB0eVZhbHVlKHByb3BEZWYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbGwgbm90LXNldCBwcm9wZXJ0aWVzIGZyb20gc2Vjb25kYXJ5IHR5cGVzCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzZWNUeXBlSWRzID0gc28uZ2V0U2Vjb25kYXJ5VHlwZUlkcygpOwotICAgICAgICBmb3IgKFN0cmluZyBzZWNUeXBlSWQgOiBzZWNUeXBlSWRzKSB7Ci0gICAgICAgICAgICB0ZCA9IHR5cGVNYW5hZ2VyLmdldFR5cGVCeUlkKHNlY1R5cGVJZCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIHByb3BEZWZzID0gdGQuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA6IHByb3BEZWZzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHByb3BEZWYuZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKHByb3BEZWYuZ2V0SWQoKSwgcmVxdWVzdGVkSWRzKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwcm9wRGVmLmdldElkKCksIGdldEVtcHR5VmFsdWUocHJvcERlZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+Pihwcm9wZXJ0aWVzLnZhbHVlcygpKTsKLQotICAgICAgICAvLyBhZGQgcXVlcnkgbmFtZSwgbG9jYWwgbmFtZSwgZGlzcGxheSBuYW1lCi0gICAgICAgIGlmIChmaWxsT3B0aW9uYWxQcm9wZXJ0eURhdGEpIHsKLSAgICAgICAgICAgIGZpbGxPcHRpb25hbFByb3BlcnR5RGF0YSh0ZCwgcHJvcGVydGllc0xpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG9iamVjdEZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllc0xpc3QpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNGcm9tT2JqZWN0KFN0b3JlZE9iamVjdCBzbywgT2JqZWN0U3RvcmUgb2JqZWN0U3RvcmUsCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBwcmltYXJ5VHlwZSwgTGlzdDxUeXBlRGVmaW5pdGlvbj4gc2Vjb25kYXJ5VHlwZXMsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVxdWVzdGVkSWRzLAotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZXF1ZXN0ZWRGdW5jcykgewotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0aWVzIGNvbGxlY3Rpb24KLQotICAgICAgICBMaXN0PFN0cmluZz4gaWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHJlcXVlc3RlZElkcy52YWx1ZXMoKSk7Ci0gICAgICAgIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBvYmplY3RGYWN0b3J5ID0gbmV3IEJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGwoKTsKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHNvLmZpbGxQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIG9iamVjdEZhY3RvcnksIGlkTGlzdCk7Ci0gICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHBhdGgKLSAgICAgICAgaWYgKHNvIGluc3RhbmNlb2YgRm9sZGVyICYmIEZpbHRlclBhcnNlci5pc0NvbnRhaW5lZEluRmlsdGVyKFByb3BlcnR5SWRzLlBBVEgsIGlkTGlzdCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gb2JqZWN0U3RvcmUuZ2V0Rm9sZGVyUGF0aChzby5nZXRJZCgpKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLlBBVEgsIG9iamVjdEZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLlBBVEgsIHBhdGgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChGaWx0ZXJQYXJzZXIuaXNDb250YWluZWRJbkZpbHRlcihQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsIGlkTGlzdCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlVHlwZUlkID0gcHJpbWFyeVR5cGUuZ2V0QmFzZVR5cGVJZCgpLnZhbHVlKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdEZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lELCBiYXNlVHlwZUlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IG1hcHBlZFByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4oKTsKLQotICAgICAgICAvLyBwcmltYXJ5IHR5cGU6Ci0gICAgICAgIGlmIChyZXF1ZXN0ZWRJZHMuY29udGFpbnNWYWx1ZSgiKiIpKSB7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcCA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VG9NYXAobWFwcGVkUHJvcGVydGllcywgcHJpbWFyeVR5cGUsIHByb3AuZ2V0VmFsdWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhZGQgYWxsIHZhbHVlcyB0aGF0IGFyZSBub3Qgc2V0OgotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmcyA9IHByaW1hcnlUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiBwcm9wRGVmcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICghbWFwcGVkUHJvcGVydGllcy5jb250YWluc0tleShwcm9wRGVmLmdldFF1ZXJ5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtYXBwZWRQcm9wZXJ0aWVzLnB1dChwcm9wRGVmLmdldElkKCksIGdldEVtcHR5VmFsdWUocHJvcERlZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmVwbGFjZSBhbGwgaWRzIHdpdGggcXVlcnkgbmFtZXMgb3IgYWxpYXM6Ci0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBwcm9wQWxpYXMgOiByZXF1ZXN0ZWRJZHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWVPckFsaWFzID0gcHJvcEFsaWFzLmdldEtleSgpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wID0gcHJvcGVydGllcy5nZXQocHJvcEFsaWFzLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHByb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlUb01hcChtYXBwZWRQcm9wZXJ0aWVzLCBwcmltYXJ5VHlwZSwgcHJvcCwgcXVlcnlOYW1lT3JBbGlhcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkTm90U2V0UHJvcGVydHlUb01hcChtYXBwZWRQcm9wZXJ0aWVzLCBwcmltYXJ5VHlwZSwgcHJvcEFsaWFzLmdldFZhbHVlKCksIHF1ZXJ5TmFtZU9yQWxpYXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNlY29uZGFyeSB0eXBlczoKLSAgICAgICAgaWYgKG51bGwgIT0gc2Vjb25kYXJ5VHlwZXMpIHsKLSAgICAgICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZURlZiA6IHNlY29uZGFyeVR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZElkcy5jb250YWluc1ZhbHVlKCIqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3AgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VG9NYXAobWFwcGVkUHJvcGVydGllcywgdHlwZURlZiwgcHJvcC5nZXRWYWx1ZSgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYWxsIHZhbHVlcyB0aGF0IGFyZSBub3Qgc2V0OgotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BEZWZzID0gdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiBwcm9wRGVmcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXBwZWRQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHByb3BEZWYuZ2V0UXVlcnlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUHJvcGVydGllcy5wdXQocHJvcERlZi5nZXRJZCgpLCBnZXRFbXB0eVZhbHVlKHByb3BEZWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIGlkcyB3aXRoIHF1ZXJ5IG5hbWVzIG9yIGFsaWFzOgotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU3RyaW5nPiBwcm9wQWxpYXMgOiByZXF1ZXN0ZWRJZHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZU9yQWxpYXMgPSBwcm9wQWxpYXMuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcHJvcCA9IHByb3BlcnRpZXMuZ2V0KHByb3BBbGlhcy5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHByb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVRvTWFwKG1hcHBlZFByb3BlcnRpZXMsIHR5cGVEZWYsIHByb3AsIHF1ZXJ5TmFtZU9yQWxpYXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGROb3RTZXRQcm9wZXJ0eVRvTWFwKG1hcHBlZFByb3BlcnRpZXMsIHR5cGVEZWYsIHByb3BBbGlhcy5nZXRWYWx1ZSgpLCBxdWVyeU5hbWVPckFsaWFzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBmdW5jdGlvbnM6Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGZ1bmNFbnRyeSA6IHJlcXVlc3RlZEZ1bmNzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWU7Ci0gICAgICAgICAgICBpZiAoZnVuY0VudHJ5LmdldFZhbHVlKCkuZXF1YWxzKCJTQ09SRSIpKSB7Ci0gICAgICAgICAgICAgICAgcXVlcnlOYW1lID0gIlNFQVJDSF9TQ09SRSI7Ci0gICAgICAgICAgICAgICAgaWYgKCFmdW5jRW50cnkuZ2V0S2V5KCkuZXF1YWxzKCJTQ09SRSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1ZXJ5TmFtZSA9IGZ1bmNFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlY2ltYWxJbXBsIHBkID0gbmV3IFByb3BlcnR5RGVjaW1hbEltcGwoKTsKLSAgICAgICAgICAgICAgICAvLyBmaXhlZCBkdW1teSB2YWx1ZQotICAgICAgICAgICAgICAgIHBkLnNldFZhbHVlKEJpZ0RlY2ltYWwudmFsdWVPZigxLjApKTsKLSAgICAgICAgICAgICAgICBwZC5zZXRJZChxdWVyeU5hbWUpOwotICAgICAgICAgICAgICAgIHBkLnNldFF1ZXJ5TmFtZShxdWVyeU5hbWUpOwotICAgICAgICAgICAgICAgIHBkLnNldExvY2FsTmFtZSgiU0NPUkUiKTsKLSAgICAgICAgICAgICAgICBwZC5zZXREaXNwbGF5TmFtZSgiU2NvcmUiKTsKLSAgICAgICAgICAgICAgICBtYXBwZWRQcm9wZXJ0aWVzLnB1dChmdW5jRW50cnkuZ2V0S2V5KCksIHBkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllc0ltcGwobWFwcGVkUHJvcGVydGllcy52YWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE5vdFNldFByb3BlcnR5VG9NYXAoTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBtYXBwZWRQcm9wZXJ0aWVzLCBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmLAotICAgICAgICAgICAgU3RyaW5nIHByb3BJZCwgU3RyaW5nIHF1ZXJ5TmFtZU9yQWxpYXMpIHsKLSAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgPSB0eXBlRGVmLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcElkKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcHJvcERlZikgewotICAgICAgICAgICAgQWJzdHJhY3RQcm9wZXJ0eURhdGE8Pz4gYWQgPSBnZXRFbXB0eVZhbHVlKHByb3BEZWYpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHByb3BEZWYuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBwcm9wRGVmLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICAgICAgICBhZC5zZXRRdWVyeU5hbWUocXVlcnlOYW1lT3JBbGlhcyk7Ci0gICAgICAgICAgICBhZC5zZXRMb2NhbE5hbWUobG9jYWxOYW1lKTsKLSAgICAgICAgICAgIGFkLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIG1hcHBlZFByb3BlcnRpZXMucHV0KHF1ZXJ5TmFtZU9yQWxpYXMsIGFkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydHlUb01hcChNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IG1hcHBlZFByb3BlcnRpZXMsIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYsCi0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcHJvcERhdGEsIFN0cmluZyBxdWVyeU5hbWVPckFsaWFzKSB7Ci0gICAgICAgIFN0cmluZyBwcm9wSWQgPSBwcm9wRGF0YS5nZXRJZCgpOwotICAgICAgICBpZiAodHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuY29udGFpbnNLZXkocHJvcElkKSkgewotICAgICAgICAgICAgLy8gbWFwIHByb3BlcnR5IGlkIHRvIHByb3BlcnR5IHF1ZXJ5IG5hbWUKLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmID0gdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KHByb3BJZCk7Ci0gICAgICAgICAgICBTdHJpbmcgcXVlcnlOYW1lID0gcHJvcERlZi5nZXRRdWVyeU5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBwcm9wRGVmLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gcHJvcERlZi5nZXREaXNwbGF5TmFtZSgpOwotCi0gICAgICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGF0YTw/PiBhZCA9IGNsb25lUHJvcGVydHlEYXRhKHByb3BEYXRhKTsKLSAgICAgICAgICAgIGFkLnNldFF1ZXJ5TmFtZShxdWVyeU5hbWVPckFsaWFzID09IG51bGwgPyBxdWVyeU5hbWUgOiBxdWVyeU5hbWVPckFsaWFzKTsKLSAgICAgICAgICAgIGFkLnNldExvY2FsTmFtZShsb2NhbE5hbWUpOwotICAgICAgICAgICAgYWQuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwotCi0gICAgICAgICAgICBtYXBwZWRQcm9wZXJ0aWVzLnB1dChxdWVyeU5hbWUsIGFkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0RGF0YSBnZXRPYmplY3REYXRhKFR5cGVNYW5hZ2VyIHRtLCBPYmplY3RTdG9yZSBvYmplY3RTdG9yZSwgU3RvcmVkT2JqZWN0IHNvLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgU3RyaW5nIHVzZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBQ0wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIE9iamVjdERhdGFJbXBsIG9kID0gbmV3IE9iamVjdERhdGFJbXBsKCk7Ci0KLSAgICAgICAgaWYgKHNvID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIklsbGVnYWwgb2JqZWN0IGlkOiBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBwcm9wZXJ0aWVzIGNvbGxlY3Rpb24KLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3RlZElkcyA9IEZpbHRlclBhcnNlci5nZXRSZXF1ZXN0ZWRJZHNGcm9tRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXRQcm9wZXJ0aWVzRnJvbU9iamVjdChzbywgb2JqZWN0U3RvcmUsIHRtLCByZXF1ZXN0ZWRJZHMsIHRydWUpOwotCi0gICAgICAgIC8vIGZpbGwgb3V0cHV0IG9iamVjdAotICAgICAgICBpZiAobnVsbCAhPSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyAmJiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucykgewotICAgICAgICAgICAgQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zID0gc28uZ2V0QWxsb3dhYmxlQWN0aW9ucyh1c2VyKTsKLSAgICAgICAgICAgIG9kLnNldEFsbG93YWJsZUFjdGlvbnMoYWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IHJlbmRpdGlvbnMgPSBvYmplY3RTdG9yZS5nZXRSZW5kaXRpb25zKHNvLCByZW5kaXRpb25GaWx0ZXIsIDAsIDApOwotICAgICAgICBpZiAobnVsbCAhPSByZW5kaXRpb25zICYmIHJlbmRpdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgb2Quc2V0UmVuZGl0aW9ucyhyZW5kaXRpb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsICE9IGluY2x1ZGVBQ0wgJiYgaW5jbHVkZUFDTCkgewotICAgICAgICAgICAgaW50IGFjbElkID0gc28gaW5zdGFuY2VvZiBEb2N1bWVudFZlcnNpb24gPyAoKERvY3VtZW50VmVyc2lvbikgc28pLmdldFBhcmVudERvY3VtZW50KCkuZ2V0QWNsSWQoKSA6IHNvCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBY2xJZCgpOwotICAgICAgICAgICAgQWNsIGFjbCA9IG9iamVjdFN0b3JlLmdldEFjbChhY2xJZCk7Ci0gICAgICAgICAgICBvZC5zZXRBY2woYWNsKTsKLSAgICAgICAgfQotICAgICAgICBvZC5zZXRJc0V4YWN0QWNsKHRydWUpOwotCi0gICAgICAgIGlmIChudWxsICE9IGluY2x1ZGVQb2xpY3lJZHMgJiYgaW5jbHVkZVBvbGljeUlkcykgewotICAgICAgICAgICAgb2Quc2V0UG9saWN5SWRzKERhdGFPYmplY3RDcmVhdG9yLmZpbGxQb2xpY3lJZHMoc28pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsICE9IGluY2x1ZGVSZWxhdGlvbnNoaXBzICYmIGluY2x1ZGVSZWxhdGlvbnNoaXBzICE9IEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUpIHsKLSAgICAgICAgICAgIG9kLnNldFJlbGF0aW9uc2hpcHMoRGF0YU9iamVjdENyZWF0b3IuZmlsbFJlbGF0aW9uc2hpcHModG0sIG9iamVjdFN0b3JlLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgc28sIHVzZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChudWxsICE9IGluY2x1ZGVQb2xpY3lJZHMgJiYgaW5jbHVkZVBvbGljeUlkcykgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBvbElkcyA9IHNvLmdldEFwcGxpZWRQb2xpY2llcygpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gcG9sSWRzKSB7Ci0gICAgICAgICAgICAgICAgUG9saWN5SWRMaXN0SW1wbCBwb2xpY2llcyA9IG5ldyBQb2xpY3lJZExpc3RJbXBsKCk7Ci0gICAgICAgICAgICAgICAgcG9saWNpZXMuc2V0UG9saWN5SWRzKHBvbElkcyk7Ci0gICAgICAgICAgICAgICAgb2Quc2V0UG9saWN5SWRzKHBvbGljaWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvZC5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQotICAgICAgICAvLyBOb3RlOiBkbyBub3Qgc2V0IGNoYW5nZSBldmVudCBpbmZvIGZvciB0aGlzIGNhbGwKLSAgICAgICAgcmV0dXJuIG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0RGF0YSBnZXRPYmplY3REYXRhUXVlcnlSZXN1bHQoVHlwZU1hbmFnZXIgdG0sIE9iamVjdFN0b3JlIG9iamVjdFN0b3JlLAotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gcHJpbWFyeVR5cGUsIFN0b3JlZE9iamVjdCBzbywgU3RyaW5nIHVzZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVxdWVzdGVkUHJvcGVydGllcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVxdWVzdGVkRnVuY3MsIExpc3Q8VHlwZURlZmluaXRpb24+IHNlY29uZGFyeVR5cGVzLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIpIHsKLQotICAgICAgICBPYmplY3REYXRhSW1wbCBvZCA9IG5ldyBPYmplY3REYXRhSW1wbCgpOwotCi0gICAgICAgIC8vIGJ1aWxkIHByb3BlcnRpZXMgY29sbGVjdGlvbgotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZ2V0UHJvcGVydGllc0Zyb21PYmplY3Qoc28sIG9iamVjdFN0b3JlLCBwcmltYXJ5VHlwZSwgc2Vjb25kYXJ5VHlwZXMsIHJlcXVlc3RlZFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkRnVuY3MpOwotCi0gICAgICAgIC8vIGZpbGwgb3V0cHV0IG9iamVjdAotICAgICAgICBpZiAobnVsbCAhPSBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyAmJiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucykgewotICAgICAgICAgICAgQWxsb3dhYmxlQWN0aW9ucyBhbGxvd2FibGVBY3Rpb25zID0gc28uZ2V0QWxsb3dhYmxlQWN0aW9ucyh1c2VyKTsKLSAgICAgICAgICAgIG9kLnNldEFsbG93YWJsZUFjdGlvbnMoYWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYWNsSWQgPSBzby5nZXRBY2xJZCgpOwotICAgICAgICBBY2wgYWNsID0gb2JqZWN0U3RvcmUuZ2V0QWNsKGFjbElkKTsKLSAgICAgICAgb2Quc2V0QWNsKGFjbCk7Ci0KLSAgICAgICAgb2Quc2V0SXNFeGFjdEFjbCh0cnVlKTsKLQotICAgICAgICBpZiAobnVsbCAhPSBpbmNsdWRlUmVsYXRpb25zaGlwcyAmJiBpbmNsdWRlUmVsYXRpb25zaGlwcyAhPSBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FKSB7Ci0gICAgICAgICAgICBvZC5zZXRSZWxhdGlvbnNoaXBzKERhdGFPYmplY3RDcmVhdG9yLmZpbGxSZWxhdGlvbnNoaXBzKHRtLCBvYmplY3RTdG9yZSwgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHNvLCB1c2VyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFJlbmRpdGlvbkRhdGE+IHJlbmRpdGlvbnMgPSBvYmplY3RTdG9yZS5nZXRSZW5kaXRpb25zKHNvLCByZW5kaXRpb25GaWx0ZXIsIDAsIDApOwotICAgICAgICBpZiAobnVsbCAhPSByZW5kaXRpb25zICYmIHJlbmRpdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgb2Quc2V0UmVuZGl0aW9ucyhyZW5kaXRpb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9kLnNldFByb3BlcnRpZXMocHJvcHMpOwotCi0gICAgICAgIHJldHVybiBvZDsKLSAgICB9Ci0KLSAgICAvLyBpbnRlcm5hbCBoZWxwZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVTdGFuZGFyZERlZmluaXRpb24oQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcCwgU3RyaW5nIGlkLCBQcm9wZXJ0eVR5cGUgcHJvcFR5cGUsCi0gICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUsIENhcmRpbmFsaXR5IGNhcmQsIFVwZGF0YWJpbGl0eSB1cGQpIHsKLQotICAgICAgICBpZiAoIU5hbWVWYWxpZGF0b3IuaXNWYWxpZElkKGlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oTmFtZVZhbGlkYXRvci5FUlJPUl9JTExFR0FMX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcC5zZXRJZChpZCk7Ci0gICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wLnNldERpc3BsYXlOYW1lKCJTYW1wbGUgIiArIHByb3AuZ2V0SWQoKSArICIgYm9vbGVhbiBwcm9wZXJ0eSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcC5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcC5zZXREZXNjcmlwdGlvbigiVGhpcyBpcyBhICIgKyBwcm9wLmdldERpc3BsYXlOYW1lKCkgKyAiIHByb3BlcnR5LiIpOwotICAgICAgICBwcm9wLnNldExvY2FsTmFtZShpZCk7Ci0gICAgICAgIHByb3Auc2V0TG9jYWxOYW1lc3BhY2UobnVsbCk7Ci0gICAgICAgIHByb3Auc2V0UXVlcnlOYW1lKGlkKTsKLSAgICAgICAgcHJvcC5zZXRJc0luaGVyaXRlZChmYWxzZSk7Ci0gICAgICAgIHByb3Auc2V0Q2FyZGluYWxpdHkoY2FyZCk7Ci0gICAgICAgIHByb3Auc2V0SXNPcGVuQ2hvaWNlKGZhbHNlKTsKLSAgICAgICAgcHJvcC5zZXRJc1F1ZXJ5YWJsZSh0cnVlKTsKLSAgICAgICAgcHJvcC5zZXRJc1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgcHJvcC5zZXRJc09yZGVyYWJsZShjYXJkID09IENhcmRpbmFsaXR5LlNJTkdMRSA/IHRydWUgOiBmYWxzZSk7Ci0gICAgICAgIHByb3Auc2V0UHJvcGVydHlUeXBlKHByb3BUeXBlKTsKLSAgICAgICAgcHJvcC5zZXRVcGRhdGFiaWxpdHkodXBkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxPcHRpb25hbFByb3BlcnR5RGF0YShUeXBlRGVmaW5pdGlvbiB0ZCwgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcGQgOiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBmaWxsT3B0aW9uYWxQcm9wZXJ0eURhdGEodGQsIChBYnN0cmFjdFByb3BlcnR5RGF0YTw/PikgcGQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsT3B0aW9uYWxQcm9wZXJ0eURhdGEoVHlwZURlZmluaXRpb24gdGQsIEFic3RyYWN0UHJvcGVydHlEYXRhPD8+IHByb3BlcnR5KSB7Ci0gICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZCA9IHRkLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcGVydHkuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChudWxsICE9IHBkKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGlzcGxheU5hbWUgPSBwZC5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IHBkLmdldFF1ZXJ5TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHBkLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgcHJvcGVydHkuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwotICAgICAgICAgICAgcHJvcGVydHkuc2V0TG9jYWxOYW1lKGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eS5zZXRRdWVyeU5hbWUocXVlcnlOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0UHJvcGVydHlEYXRhPD8+IGdldEVtcHR5VmFsdWUoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYpIHsKLSAgICAgICAgQWJzdHJhY3RQcm9wZXJ0eURhdGE8Pz4gZW1wdHlWYWx1ZTsKLSAgICAgICAgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKFByb3BlcnR5VHlwZS5CT09MRUFOKSkgewotICAgICAgICAgICAgZW1wdHlWYWx1ZSA9IG5ldyBQcm9wZXJ0eUJvb2xlYW5JbXBsKHByb3BEZWYuZ2V0SWQoKSwgKEJvb2xlYW4pIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKFByb3BlcnR5VHlwZS5EQVRFVElNRSkpIHsKLSAgICAgICAgICAgIGVtcHR5VmFsdWUgPSBuZXcgUHJvcGVydHlEYXRlVGltZUltcGwocHJvcERlZi5nZXRJZCgpLCAoR3JlZ29yaWFuQ2FsZW5kYXIpIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKFByb3BlcnR5VHlwZS5ERUNJTUFMKSkgewotICAgICAgICAgICAgZW1wdHlWYWx1ZSA9IG5ldyBQcm9wZXJ0eURlY2ltYWxJbXBsKHByb3BEZWYuZ2V0SWQoKSwgKEJpZ0RlY2ltYWwpIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKFByb3BlcnR5VHlwZS5IVE1MKSkgewotICAgICAgICAgICAgZW1wdHlWYWx1ZSA9IG5ldyBQcm9wZXJ0eUh0bWxJbXBsKHByb3BEZWYuZ2V0SWQoKSwgKFN0cmluZykgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKS5lcXVhbHMoUHJvcGVydHlUeXBlLklEKSkgewotICAgICAgICAgICAgZW1wdHlWYWx1ZSA9IG5ldyBQcm9wZXJ0eUlkSW1wbChwcm9wRGVmLmdldElkKCksIChTdHJpbmcpIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKFByb3BlcnR5VHlwZS5JTlRFR0VSKSkgewotICAgICAgICAgICAgZW1wdHlWYWx1ZSA9IG5ldyBQcm9wZXJ0eUludGVnZXJJbXBsKHByb3BEZWYuZ2V0SWQoKSwgKEJpZ0ludGVnZXIpIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKFByb3BlcnR5VHlwZS5TVFJJTkcpKSB7Ci0gICAgICAgICAgICBlbXB0eVZhbHVlID0gbmV3IFByb3BlcnR5U3RyaW5nSW1wbChwcm9wRGVmLmdldElkKCksIChTdHJpbmcpIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKFByb3BlcnR5VHlwZS5VUkkpKSB7Ci0gICAgICAgICAgICBlbXB0eVZhbHVlID0gbmV3IFByb3BlcnR5VXJpSW1wbChwcm9wRGVmLmdldElkKCksIChTdHJpbmcpIG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IHR5cGUgIiArIHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVtcHR5VmFsdWUuc2V0RGlzcGxheU5hbWUocHJvcERlZi5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgZW1wdHlWYWx1ZS5zZXRRdWVyeU5hbWUocHJvcERlZi5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgIGVtcHR5VmFsdWUuc2V0TG9jYWxOYW1lKHByb3BEZWYuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXR1cm4gZW1wdHlWYWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFByb3BlcnR5RGF0YTw/PiBjbG9uZVByb3BlcnR5RGF0YShQcm9wZXJ0eURhdGE8Pz4gcHJvcCkgewotICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGF0YTw/PiBhZCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wZXJ0eUJvb2xlYW5JbXBsKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eUJvb2xlYW5JbXBsIGNsb25lID0gbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwoKTsKLSAgICAgICAgICAgIGNsb25lLnNldFZhbHVlcygoKFByb3BlcnR5Qm9vbGVhbkltcGwpIHByb3ApLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgIGFkID0gY2xvbmU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5RGF0ZVRpbWVJbXBsKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURhdGVUaW1lSW1wbCBjbG9uZSA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lSW1wbCgpOwotICAgICAgICAgICAgY2xvbmUuc2V0VmFsdWVzKCgoUHJvcGVydHlEYXRlVGltZUltcGwpIHByb3ApLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgIGFkID0gY2xvbmU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5RGVjaW1hbEltcGwpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVjaW1hbEltcGwgY2xvbmUgPSBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbCgpOwotICAgICAgICAgICAgY2xvbmUuc2V0VmFsdWVzKCgoUHJvcGVydHlEZWNpbWFsSW1wbCkgcHJvcCkuZ2V0VmFsdWVzKCkpOwotICAgICAgICAgICAgYWQgPSBjbG9uZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wIGluc3RhbmNlb2YgUHJvcGVydHlIdG1sSW1wbCkgewotICAgICAgICAgICAgUHJvcGVydHlIdG1sSW1wbCBjbG9uZSA9IG5ldyBQcm9wZXJ0eUh0bWxJbXBsKCk7Ci0gICAgICAgICAgICBjbG9uZS5zZXRWYWx1ZXMoKChQcm9wZXJ0eUh0bWxJbXBsKSBwcm9wKS5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICBhZCA9IGNsb25lOwotICAgICAgICB9IGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wZXJ0eUlkSW1wbCkgewotICAgICAgICAgICAgUHJvcGVydHlJZEltcGwgY2xvbmUgPSBuZXcgUHJvcGVydHlJZEltcGwoKTsKLSAgICAgICAgICAgIGNsb25lLnNldFZhbHVlcygoKFByb3BlcnR5SWRJbXBsKSBwcm9wKS5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICBhZCA9IGNsb25lOwotICAgICAgICB9IGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXJJbXBsKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJJbXBsIGNsb25lID0gbmV3IFByb3BlcnR5SW50ZWdlckltcGwoKTsKLSAgICAgICAgICAgIGNsb25lLnNldFZhbHVlcygoKFByb3BlcnR5SW50ZWdlckltcGwpIHByb3ApLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgIGFkID0gY2xvbmU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nSW1wbCkgewotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdJbXBsIGNsb25lID0gbmV3IFByb3BlcnR5U3RyaW5nSW1wbCgpOwotICAgICAgICAgICAgY2xvbmUuc2V0VmFsdWVzKCgoUHJvcGVydHlTdHJpbmdJbXBsKSBwcm9wKS5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICBhZCA9IGNsb25lOwotICAgICAgICB9IGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaUltcGwpIHsKLSAgICAgICAgICAgIFByb3BlcnR5VXJpSW1wbCBjbG9uZSA9IG5ldyBQcm9wZXJ0eVVyaUltcGwoKTsKLSAgICAgICAgICAgIGNsb25lLnNldFZhbHVlcygoKFByb3BlcnR5VXJpSW1wbCkgcHJvcCkuZ2V0VmFsdWVzKCkpOwotICAgICAgICAgICAgYWQgPSBjbG9uZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBwcm9wZXJ0eSB0eXBlOiAiICsgcHJvcC5nZXRDbGFzcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkLnNldERpc3BsYXlOYW1lKHByb3AuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIGFkLnNldElkKHByb3AuZ2V0SWQoKSk7Ci0gICAgICAgIGFkLnNldExvY2FsTmFtZShwcm9wLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYWQuc2V0UXVlcnlOYW1lKHByb3AuZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICBhZC5zZXRFeHRlbnNpb25zKHByb3AuZ2V0RXh0ZW5zaW9ucygpKTsKLQotICAgICAgICByZXR1cm4gYWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvdHlwZXMvVHlwZURlZmluaXRpb25zLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS90eXBlcy9UeXBlRGVmaW5pdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNkM2I5NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS90eXBlcy9UeXBlRGVmaW5pdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLlhNTENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuQ21pc1R5cGVEZWZpbml0aW9uVHlwZTsNCi0NCi1AWG1sUm9vdEVsZW1lbnQNCi1wdWJsaWMgY2xhc3MgVHlwZURlZmluaXRpb25zIHsNCi0NCi0gICAgcHJpdmF0ZSBMaXN0PENtaXNUeXBlRGVmaW5pdGlvblR5cGU+IHR5cGU7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IFhNTENvbnN0YW50cy5OQU1FU1BBQ0VfUkVTVEFUT00sIG5hbWUgPSAidHlwZSIpDQotICAgIHB1YmxpYyBMaXN0PENtaXNUeXBlRGVmaW5pdGlvblR5cGU+IGdldFR5cGVEZWZpbml0aW9ucygpIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0eXBlID0gbmV3IEFycmF5TGlzdDxDbWlzVHlwZURlZmluaXRpb25UeXBlPigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRoaXMudHlwZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS90eXBlcy9UeXBlVXRpbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvdHlwZXMvVHlwZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyNDM3Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS90eXBlcy9UeXBlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkZvbGRlclR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuSXRlbVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUG9saWN5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEYXRlVGltZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SWREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5VXJpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkRvY3VtZW50VHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Gb2xkZXJUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkl0ZW1UeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlBvbGljeVR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFR5cGVVdGlsIHsKLQotICAgIHByaXZhdGUgVHlwZVV0aWwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjbG9uZVR5cGUoVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVEb2MoKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBGb2xkZXJUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNsb25lVHlwZUZvbGRlcigoRm9sZGVyVHlwZURlZmluaXRpb24pIHR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBQb2xpY3lUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNsb25lVHlwZVBvbGljeSgoUG9saWN5VHlwZURlZmluaXRpb24pIHR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJdGVtVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVJdGVtKChJdGVtVHlwZURlZmluaXRpb24pIHR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNsb25lVHlwZVJlbGF0aW9uc2hpcCgoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGNsb25lVHlwZVNlY29uZGFyeSgoU2Vjb25kYXJ5VHlwZURlZmluaXRpb24pIHR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IGNsb25lUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZCkgewotICAgICAgICBpZiAocGQgaW5zdGFuY2VvZiBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCBwZEJvb2xEZWYgPSBuZXcgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsIHBkU3JjID0gKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSBwZDsKLSAgICAgICAgICAgIGluaXRpYWxpemVBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbihwZCwgcGRCb29sRGVmKTsKLSAgICAgICAgICAgIHBkQm9vbERlZi5zZXRDaG9pY2VzKHBkU3JjLmdldENob2ljZXMoKSk7Ci0gICAgICAgICAgICBwZEJvb2xEZWYuc2V0RGVmYXVsdFZhbHVlKHBkU3JjLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBwZEJvb2xEZWY7Ci0gICAgICAgIH0gZWxzZSBpZiAocGQgaW5zdGFuY2VvZiBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbikgewotICAgICAgICAgICAgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsIHBkRGF0ZURlZiA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCBwZFNyYyA9IChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHBkOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uKHBkLCBwZERhdGVEZWYpOwotICAgICAgICAgICAgcGREYXRlRGVmLnNldENob2ljZXMocGRTcmMuZ2V0Q2hvaWNlcygpKTsKLSAgICAgICAgICAgIHBkRGF0ZURlZi5zZXREZWZhdWx0VmFsdWUocGRTcmMuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgcGREYXRlRGVmLnNldERhdGVUaW1lUmVzb2x1dGlvbihwZFNyYy5nZXREYXRlVGltZVJlc29sdXRpb24oKSk7Ci0gICAgICAgICAgICByZXR1cm4gcGREYXRlRGVmOwotICAgICAgICB9IGVsc2UgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgewotICAgICAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwgcGREZWNEZWYgPSBuZXcgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsIHBkU3JjID0gKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSBwZDsKLSAgICAgICAgICAgIGluaXRpYWxpemVBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbihwZCwgcGREZWNEZWYpOwotICAgICAgICAgICAgcGREZWNEZWYuc2V0Q2hvaWNlcyhwZFNyYy5nZXRDaG9pY2VzKCkpOwotICAgICAgICAgICAgcGREZWNEZWYuc2V0RGVmYXVsdFZhbHVlKHBkU3JjLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHBkRGVjRGVmLnNldE1pblZhbHVlKHBkU3JjLmdldE1pblZhbHVlKCkpOwotICAgICAgICAgICAgcGREZWNEZWYuc2V0TWF4VmFsdWUocGRTcmMuZ2V0TWF4VmFsdWUoKSk7Ci0gICAgICAgICAgICBwZERlY0RlZi5zZXRQcmVjaXNpb24ocGRTcmMuZ2V0UHJlY2lzaW9uKCkpOwotICAgICAgICAgICAgcmV0dXJuIHBkRGVjRGVmOwotICAgICAgICB9IGVsc2UgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlIdG1sRGVmaW5pdGlvbikgewotICAgICAgICAgICAgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwgcGRIdG1sRGVmID0gbmV3IFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCBwZFNyYyA9IChQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCkgcGQ7Ci0gICAgICAgICAgICBpbml0aWFsaXplQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24ocGQsIHBkSHRtbERlZik7Ci0gICAgICAgICAgICBwZEh0bWxEZWYuc2V0Q2hvaWNlcyhwZFNyYy5nZXRDaG9pY2VzKCkpOwotICAgICAgICAgICAgcGRIdG1sRGVmLnNldERlZmF1bHRWYWx1ZShwZFNyYy5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcGRIdG1sRGVmOwotICAgICAgICB9IGVsc2UgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlJZERlZmluaXRpb24pIHsKLSAgICAgICAgICAgIFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCBwZElkRGVmID0gbmV3IFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgUHJvcGVydHlJZERlZmluaXRpb25JbXBsIHBkU3JjID0gKFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCkgcGQ7Ci0gICAgICAgICAgICBpbml0aWFsaXplQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24ocGQsIHBkSWREZWYpOwotICAgICAgICAgICAgcGRJZERlZi5zZXRDaG9pY2VzKHBkU3JjLmdldENob2ljZXMoKSk7Ci0gICAgICAgICAgICBwZElkRGVmLnNldERlZmF1bHRWYWx1ZShwZFNyYy5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcGRJZERlZjsKLSAgICAgICAgfSBlbHNlIGlmIChwZCBpbnN0YW5jZW9mIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHsKLSAgICAgICAgICAgIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsIHBkSW50RGVmID0gbmV3IFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwZFNyYyA9IChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcGQ7Ci0gICAgICAgICAgICBpbml0aWFsaXplQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24ocGQsIHBkSW50RGVmKTsKLSAgICAgICAgICAgIHBkSW50RGVmLnNldENob2ljZXMocGRTcmMuZ2V0Q2hvaWNlcygpKTsKLSAgICAgICAgICAgIHBkSW50RGVmLnNldERlZmF1bHRWYWx1ZShwZFNyYy5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICBwZEludERlZi5zZXRNaW5WYWx1ZShwZFNyYy5nZXRNaW5WYWx1ZSgpKTsKLSAgICAgICAgICAgIHBkSW50RGVmLnNldE1heFZhbHVlKHBkU3JjLmdldE1heFZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHBkSW50RGVmOwotICAgICAgICB9IGVsc2UgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHBkU3RyaW5nRGVmID0gbmV3IFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcGRTcmMgPSAoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCkgcGQ7Ci0gICAgICAgICAgICBpbml0aWFsaXplQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24ocGQsIHBkU3RyaW5nRGVmKTsKLSAgICAgICAgICAgIHBkU3RyaW5nRGVmLnNldENob2ljZXMocGRTcmMuZ2V0Q2hvaWNlcygpKTsKLSAgICAgICAgICAgIHBkU3RyaW5nRGVmLnNldERlZmF1bHRWYWx1ZShwZFNyYy5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICBwZFN0cmluZ0RlZi5zZXRNYXhMZW5ndGgocGRTcmMuZ2V0TWF4TGVuZ3RoKCkpOwotICAgICAgICAgICAgcmV0dXJuIHBkU3RyaW5nRGVmOwotICAgICAgICB9IGVsc2UgaWYgKHBkIGluc3RhbmNlb2YgUHJvcGVydHlVcmlEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsIHBkVXJpRGVmID0gbmV3IFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIFByb3BlcnR5VXJpRGVmaW5pdGlvbiBwZFNyYyA9IChQcm9wZXJ0eVVyaURlZmluaXRpb24pIHBkOwotICAgICAgICAgICAgaW5pdGlhbGl6ZUFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uKHBkLCBwZFVyaURlZik7Ci0gICAgICAgICAgICBwZFVyaURlZi5zZXRDaG9pY2VzKHBkU3JjLmdldENob2ljZXMoKSk7Ci0gICAgICAgICAgICBwZFVyaURlZi5zZXREZWZhdWx0VmFsdWUocGRTcmMuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHBkVXJpRGVmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsIGNsb25lVHlwZURvYyhEb2N1bWVudFR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgdGQgPSBuZXcgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgdGQuaW5pdGlhbGl6ZSh0eXBlKTsKLSAgICAgICAgdGQuc2V0SXNWZXJzaW9uYWJsZSh0eXBlLmlzVmVyc2lvbmFibGUoKSk7Ci0gICAgICAgIHRkLnNldENvbnRlbnRTdHJlYW1BbGxvd2VkKHR5cGUuZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSk7Ci0gICAgICAgIHJldHVybiB0ZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZvbGRlclR5cGVEZWZpbml0aW9uSW1wbCBjbG9uZVR5cGVGb2xkZXIoRm9sZGVyVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgICAgICBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwgdGQgPSBuZXcgRm9sZGVyVHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIHRkLmluaXRpYWxpemUodHlwZSk7Ci0gICAgICAgIHJldHVybiB0ZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uSW1wbCBjbG9uZVR5cGVSZWxhdGlvbnNoaXAoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgICAgICBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwgdGQgPSBuZXcgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIHRkLmluaXRpYWxpemUodHlwZSk7Ci0gICAgICAgIHRkLnNldEFsbG93ZWRTb3VyY2VUeXBlcyh0eXBlLmdldEFsbG93ZWRTb3VyY2VUeXBlSWRzKCkpOwotICAgICAgICB0ZC5zZXRBbGxvd2VkVGFyZ2V0VHlwZXModHlwZS5nZXRBbGxvd2VkVGFyZ2V0VHlwZUlkcygpKTsKLSAgICAgICAgcmV0dXJuIHRkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCBjbG9uZVR5cGVJdGVtKEl0ZW1UeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgICAgIEl0ZW1UeXBlRGVmaW5pdGlvbkltcGwgdGQgPSBuZXcgSXRlbVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICB0ZC5pbml0aWFsaXplKHR5cGUpOwotICAgICAgICByZXR1cm4gdGQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGwgY2xvbmVUeXBlU2Vjb25kYXJ5KFNlY29uZGFyeVR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgU2Vjb25kYXJ5VHlwZURlZmluaXRpb25JbXBsIHRkID0gbmV3IFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICB0ZC5pbml0aWFsaXplKHR5cGUpOwotICAgICAgICByZXR1cm4gdGQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQb2xpY3lUeXBlRGVmaW5pdGlvbkltcGwgY2xvbmVUeXBlUG9saWN5KFBvbGljeVR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgUG9saWN5VHlwZURlZmluaXRpb25JbXBsIHRkID0gbmV3IFBvbGljeVR5cGVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICB0ZC5pbml0aWFsaXplKHRkKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVlcnlOYW1lRnJvbUlkKFN0cmluZyBpZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoaWQubGVuZ3RoKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IGlkLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcgJyB8fCBjID09ICcsJyB8fCBjID09ICdcJycgfHwgYyA9PSAnIicgfHwgYyA9PSAnXFwnIHx8IGMgPT0gJygnIHx8IGMgPT0gJyknKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdfJyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemVBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248Pz4gcGRTcmMsCi0gICAgICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZFRhcmdldCkgewotICAgICAgICBwZFRhcmdldC5zZXRDYXJkaW5hbGl0eShwZFNyYy5nZXRDYXJkaW5hbGl0eSgpKTsKLSAgICAgICAgcGRUYXJnZXQuc2V0RGVzY3JpcHRpb24ocGRTcmMuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHBkVGFyZ2V0LnNldERpc3BsYXlOYW1lKHBkU3JjLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICBwZFRhcmdldC5zZXRFeHRlbnNpb25zKHBkU3JjLmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgICAgIHBkVGFyZ2V0LnNldElkKHBkU3JjLmdldElkKCkpOwotICAgICAgICBwZFRhcmdldC5zZXRJc0luaGVyaXRlZChmYWxzZSk7Ci0gICAgICAgIHBkVGFyZ2V0LnNldElzT3BlbkNob2ljZShwZFNyYy5pc09wZW5DaG9pY2UoKSk7Ci0gICAgICAgIHBkVGFyZ2V0LnNldElzT3JkZXJhYmxlKHBkU3JjLmlzT3JkZXJhYmxlKCkpOwotICAgICAgICBwZFRhcmdldC5zZXRJc1F1ZXJ5YWJsZShwZFNyYy5pc1F1ZXJ5YWJsZSgpKTsKLSAgICAgICAgcGRUYXJnZXQuc2V0SXNSZXF1aXJlZChwZFNyYy5pc1JlcXVpcmVkKCkpOwotICAgICAgICBwZFRhcmdldC5zZXRMb2NhbE5hbWUocGRTcmMuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBwZFRhcmdldC5zZXRMb2NhbE5hbWVzcGFjZShwZFNyYy5nZXRMb2NhbE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcGRUYXJnZXQuc2V0UHJvcGVydHlUeXBlKHBkU3JjLmdldFByb3BlcnR5VHlwZSgpKTsKLSAgICAgICAgcGRUYXJnZXQuc2V0UXVlcnlOYW1lKHBkU3JjLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgcGRUYXJnZXQuc2V0VXBkYXRhYmlsaXR5KHBkU3JjLmdldFVwZGF0YWJpbGl0eSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tbXN3b3JkLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tbXN3b3JkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxNWI1Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLW1zd29yZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLXBkZi5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLXBkZi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjdlNjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi1wZGYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi12bmQubXMtZXhjZWwucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi12bmQubXMtZXhjZWwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjllZTdiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tdm5kLm1zLWV4Y2VsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24tdm5kLm1zLXBvd2VycG9pbnQucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi12bmQubXMtcG93ZXJwb2ludC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWM0MzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi12bmQubXMtcG93ZXJwb2ludC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2F1ZGlvLXgtZ2VuZXJpYy5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2F1ZGlvLXgtZ2VuZXJpYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTIxZTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9hdWRpby14LWdlbmVyaWMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9mb2xkZXIucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9mb2xkZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdkODQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvZm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2UteC1nZW5lcmljLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2UteC1nZW5lcmljLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ODY2Yy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlLXgtZ2VuZXJpYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NmY5ZmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMgDQotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMgDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi0jIHNhbXBsZSBsb2c0ai5wcm9wZXJ0aWVzDQotDQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8NCi0NCi0jIFN0ZG91dA0KLWxvZzRqLmFwcGVuZGVyLk89b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXINCi0NCi0jIEZpbGUNCi1sb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLlIuRmlsZT1sb2c0ai5sb2cNCi0NCi0jIENvbnRyb2wgdGhlIG1heGltdW0gbG9nIGZpbGUgc2l6ZQ0KLWxvZzRqLmFwcGVuZGVyLlIuTWF4RmlsZVNpemU9MTAwS0INCi0NCi0jIEFyY2hpdmUgbG9nIGZpbGVzIChvbmUgYmFja3VwIGZpbGUgaGVyZSkNCi1sb2c0ai5hcHBlbmRlci5SLk1heEJhY2t1cEluZGV4PTENCi1sb2c0ai5hcHBlbmRlci5SLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5PLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5SLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWM6ICVtJW4NCi1sb2c0ai5hcHBlbmRlci5PLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWM6ICVtJW4NCi0NCi0jIGxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeT1ERUJVRw0KLSMgbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LmZpbHRlcj1JTkZPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy90ZXh0LWh0bWwucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy90ZXh0LWh0bWwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2RlOGNiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvdGV4dC1odG1sLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvdGV4dC14LWdlbmVyaWMucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy90ZXh0LXgtZ2VuZXJpYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmZjNjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy90ZXh0LXgtZ2VuZXJpYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL3R5cGVzLnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvdHlwZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2ODkyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvdHlwZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM4NCArMCwwIEBACi08IS0tIEdlbmVyYXRlZCBPdXRwdXQgZmlsZSB3aXRoIHR5cGUgZGVmaW5pdGlvbnMuIERvIG5vdCBlZGl0ISAtLT4KLTxjaGVtOnR5cGVEZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iCi0gICAgIHhtbG5zOmNtaXNyYT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9yZXN0YXRvbS8yMDA5MDgvIgotICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICB4bWxuczpjaGVtPSJodHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmcvc2NoZW1hcy9UeXBlRGVmbml0aW9ucyI+Ci08Y21pc3JhOnR5cGUgeHNpOnR5cGU9ImNtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSI+Ci0gICAgPGlkPmF1ZGlvRmlsZTwvaWQ+Ci0gICAgPGxvY2FsTmFtZT5hdWRpb0ZpbGU8L2xvY2FsTmFtZT4KLSAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICA8cGFyZW50SWQ+Y21pczpkb2N1bWVudDwvcGFyZW50SWQ+Ci0gICAgPGRpc3BsYXlOYW1lPkF1ZGlvIEZpbGU8L2Rpc3BsYXlOYW1lPgotICAgIDxxdWVyeU5hbWU+QVVESU9fRklMRTwvcXVlcnlOYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BdWRpbyBDb250ZW50IChjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCk8L2Rlc2NyaXB0aW9uPgotICAgIDxiYXNlSWQ+Y21pczpkb2N1bWVudDwvYmFzZUlkPgotICAgIDxjcmVhdGFibGU+dHJ1ZTwvY3JlYXRhYmxlPgotICAgIDxmaWxlYWJsZT50cnVlPC9maWxlYWJsZT4KLSAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICA8ZnVsbHRleHRJbmRleGVkPnRydWU8L2Z1bGx0ZXh0SW5kZXhlZD4KLSAgICA8aW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PnRydWU8L2luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT4KLSAgICA8Y29udHJvbGxhYmxlUG9saWN5PmZhbHNlPC9jb250cm9sbGFibGVQb2xpY3k+Ci0gICAgPGNvbnRyb2xsYWJsZUFDTD50cnVlPC9jb250cm9sbGFibGVBQ0w+Ci0gICAgPFR5cGVNdXRhYmlsaXR5PgotICAgICAgICA8Y3JlYXRlPnRydWU8L2NyZWF0ZT4KLSAgICAgICAgPHVwZGF0ZT50cnVlPC91cGRhdGU+Ci0gICAgICAgIDxkZWxldGU+dHJ1ZTwvZGVsZXRlPgotICAgIDwvVHlwZU11dGFiaWxpdHk+Ci0gICAgPHZlcnNpb25hYmxlPmZhbHNlPC92ZXJzaW9uYWJsZT4KLSAgICA8Y29udGVudFN0cmVhbUFsbG93ZWQ+YWxsb3dlZDwvY29udGVudFN0cmVhbUFsbG93ZWQ+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmFydGlzdDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTNiPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BcnRpc3Q8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFSVElTVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QXJ0aXN0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmFsYnVtPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5hbGJ1bTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+QWxidW08L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFMQlVNPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj50aXRsZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD50aXRsZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+dGl0bGU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlRpdGxlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5USVRMRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGl0bGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y29tbWVudDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y29tbWVudDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q29tbWVudDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q09NTUVOVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWVudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmdlbnJlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5nZW5yZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+R2VucmU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkdFTlJFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HZW5yZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bGVuZ3RoPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5sZW5ndGg8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxlbmd0aDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TEVOR1RIPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5MZW5ndGggaW4gc2Vjb25kczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnRyYWNrPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT50cmFjazwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VHJhY2s8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRSQUNLPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UcmFjayBpbiBhbGJ1bTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnllYXI8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnllYXI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlllYXI8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPllFQVI8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnJlbGVhc2UgZGF0ZSBvZiBhbGJ1bjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb21wb3NlcjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y29tcG9zZXI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbXBvc2VyPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT01QT1NFUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tcG9zZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZGlzY05vPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5kaXNjTm88L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkRpc2MgTnVtYmVyPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5ESVNDX05VTUJFUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+bnVtYmVyIG9mIGRpc2MgLyB0b3RhbCBkaXNjczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmF1ZGlvRm9ybWF0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5hdWRpb0Zvcm1hdDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+QXVkaW8gRm9ybWF0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5BVURJT19GT1JNQVQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkF1ZGlvIEZvcm1hdCAvIGNvbXByZXNzaW9uIHNjaGVtZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zYW1wbGVSYXRlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5zYW1wbGVSYXRlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5TYW1wbGUgUmF0ZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U0FNUExFX1JBVEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlNhbXBsZSBSYXRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5hdWRpb0NoYW5uZWxUeXBlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5hdWRpb0NoYW5uZWxUeXBlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BdWRpbyBDaGFubmVsIFR5cGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFVRElPX0NIQU5ORUxfVFlQRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+YXVkaW8gY2hhbm5lbCB0eXBlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTW9ubyI+Ci0gICAgICAgICAgICA8dmFsdWU+TW9ubzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJTdGVyZW8iPgotICAgICAgICAgICAgPHZhbHVlPlN0ZXJlbzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSI1LjEiPgotICAgICAgICAgICAgPHZhbHVlPjUuMTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSI3LjEiPgotICAgICAgICAgICAgPHZhbHVlPjcuMTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bm9DaGFubmVsczwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+bm9DaGFubmVsczwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TnVtYmVyIENoYW5uZWxzPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5OVU1CRVJfQ0hBTk5FTFM8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPm51bWJlciBvZiBhdWRpbyBjaGFubmVsczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y29tcHJlc3NvclZlcnNpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNvbXByZXNzb3JWZXJzaW9uPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Db21wcmVzc29yIFZlcnNpb248L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNPTVBSRVNTT1JfVkVSU0lPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+dmVyc2lvbiBkZXNjcmlwdGlvbiBvZiBjb21wcmVzc29yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLTwvY21pc3JhOnR5cGU+Ci0KLTxjbWlzcmE6dHlwZSB4c2k6dHlwZT0iY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIj4KLSAgICA8aWQ+ZW1haWxEb2N1bWVudDwvaWQ+Ci0gICAgPGxvY2FsTmFtZT5lbWFpbERvY3VtZW50PC9sb2NhbE5hbWU+Ci0gICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgPHBhcmVudElkPmNtaXM6ZG9jdW1lbnQ8L3BhcmVudElkPgotICAgIDxkaXNwbGF5TmFtZT5FbWFpbCBEb2N1bWVudDwvZGlzcGxheU5hbWU+Ci0gICAgPHF1ZXJ5TmFtZT5FTUFJTF9ET0NVTUVOVDwvcXVlcnlOYW1lPgotICAgIDxkZXNjcmlwdGlvbj5Eb2N1bWVudCBvZiB0eXBlIEVtYWlsPC9kZXNjcmlwdGlvbj4KLSAgICA8YmFzZUlkPmNtaXM6ZG9jdW1lbnQ8L2Jhc2VJZD4KLSAgICA8Y3JlYXRhYmxlPnRydWU8L2NyZWF0YWJsZT4KLSAgICA8ZmlsZWFibGU+dHJ1ZTwvZmlsZWFibGU+Ci0gICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgPGZ1bGx0ZXh0SW5kZXhlZD50cnVlPC9mdWxsdGV4dEluZGV4ZWQ+Ci0gICAgPGluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT50cnVlPC9pbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+Ci0gICAgPGNvbnRyb2xsYWJsZVBvbGljeT5mYWxzZTwvY29udHJvbGxhYmxlUG9saWN5PgotICAgIDxjb250cm9sbGFibGVBQ0w+dHJ1ZTwvY29udHJvbGxhYmxlQUNMPgotICAgIDxUeXBlTXV0YWJpbGl0eT4KLSAgICAgICAgPGNyZWF0ZT50cnVlPC9jcmVhdGU+Ci0gICAgICAgIDx1cGRhdGU+dHJ1ZTwvdXBkYXRlPgotICAgICAgICA8ZGVsZXRlPnRydWU8L2RlbGV0ZT4KLSAgICA8L1R5cGVNdXRhYmlsaXR5PgotICAgIDx2ZXJzaW9uYWJsZT5mYWxzZTwvdmVyc2lvbmFibGU+Ci0gICAgPGNvbnRlbnRTdHJlYW1BbGxvd2VkPmFsbG93ZWQ8L2NvbnRlbnRTdHJlYW1BbGxvd2VkPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5mcm9tPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5mcm9tPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Gcm9tPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5GUk9NPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5zZW5kZXIgb2YgbWVzc2FnZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD50bzwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+dG88L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlRvPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5UTzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+cmVjaXBpZW50cyBvZiBtZXNzYWdlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5tdWx0aTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y2M8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNjPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5DYzwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q0M8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmNhcmJvbiBjb3B5IHJlY2lwaWVudHMgb2YgbWVzc2FnZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+bXVsdGk8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmJjYzwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+YmNjPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5CY2M8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkJDQzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+YmxpbmQgY2FyYm9uIGNvcHkgcmVjaXBpZW50cyBvZiBtZXNzYWdlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5tdWx0aTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zdWJqZWN0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5zdWJqZWN0PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5TdWJqZWN0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TVUJKRUNUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5zdWJqZXQgb2YgbWVzc2FnZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5tZXNzYWdlUmVjaXBpZW50QWRkcmVzczwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+bWVzc2FnZVJlY2lwaWVudEFkZHJlc3M8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPk1lc3NhZ2UgUmVjaXBpZW50IEFkZHJlc3M8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPk1FU1NBR0VfUkVDSVBJRU5UX0FERFJFU1M8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk1lc3NhZ2UgUmVjaXBpZW50IEFkZHJlc3M8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEYXRlVGltZURlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jcmVhdGlvbkRhdGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNyZWF0aW9uRGF0ZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q3JlYXRpb24gRGF0ZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q1JFQVRJT05fREFURTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q3JlYXRpb24gRGF0ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRhdGV0aW1lPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmxhc3RTYXZlRGF0ZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+bGFzdFNhdmVEYXRlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5MYXN0IFNhdmUgRGF0ZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TEFTVF9TQVZFX0RBVEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkxhc3QgU2F2ZSBEYXRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGF0ZXRpbWU8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEYXRlVGltZURlZmluaXRpb24+Ci08L2NtaXNyYTp0eXBlPgotCi08Y21pc3JhOnR5cGUgeHNpOnR5cGU9ImNtaXNUeXBlRG9jdW1lbnREZWZpbml0aW9uVHlwZSI+Ci0gICAgPGlkPmV4aWZJbWFnZTwvaWQ+Ci0gICAgPGxvY2FsTmFtZT5leGlmSW1hZ2U8L2xvY2FsTmFtZT4KLSAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICA8cGFyZW50SWQ+Y21pczpkb2N1bWVudDwvcGFyZW50SWQ+Ci0gICAgPGRpc3BsYXlOYW1lPkVYSUYgSW1hZ2U8L2Rpc3BsYXlOYW1lPgotICAgIDxxdWVyeU5hbWU+RVhJRl9JTUFHRTwvcXVlcnlOYW1lPgotICAgIDxkZXNjcmlwdGlvbj5JbWFnZSB3aXRoIEVYSUYgdGFnczwvZGVzY3JpcHRpb24+Ci0gICAgPGJhc2VJZD5jbWlzOmRvY3VtZW50PC9iYXNlSWQ+Ci0gICAgPGNyZWF0YWJsZT50cnVlPC9jcmVhdGFibGU+Ci0gICAgPGZpbGVhYmxlPnRydWU8L2ZpbGVhYmxlPgotICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgIDxmdWxsdGV4dEluZGV4ZWQ+dHJ1ZTwvZnVsbHRleHRJbmRleGVkPgotICAgIDxpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+dHJ1ZTwvaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PgotICAgIDxjb250cm9sbGFibGVQb2xpY3k+ZmFsc2U8L2NvbnRyb2xsYWJsZVBvbGljeT4KLSAgICA8Y29udHJvbGxhYmxlQUNMPnRydWU8L2NvbnRyb2xsYWJsZUFDTD4KLSAgICA8VHlwZU11dGFiaWxpdHk+Ci0gICAgICAgIDxjcmVhdGU+dHJ1ZTwvY3JlYXRlPgotICAgICAgICA8dXBkYXRlPnRydWU8L3VwZGF0ZT4KLSAgICAgICAgPGRlbGV0ZT50cnVlPC9kZWxldGU+Ci0gICAgPC9UeXBlTXV0YWJpbGl0eT4KLSAgICA8dmVyc2lvbmFibGU+ZmFsc2U8L3ZlcnNpb25hYmxlPgotICAgIDxjb250ZW50U3RyZWFtQWxsb3dlZD5hbGxvd2VkPC9jb250ZW50U3RyZWFtQWxsb3dlZD4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmltYWdlV2lkdGg8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEwMDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+SW1hZ2UgV2lkdGg8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklNQUdFX1dJRFRIPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JbWFnZSBXaWR0aDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+b25jcmVhdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmltYWdlSGVpZ2h0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMDE8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkltYWdlIEhlaWdodDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+SU1BR0VfSEVJR0hUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JbWFnZSBIZWlnaHQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5Pm9uY3JlYXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5iaXRzUGVyU2FtcGxlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMDI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkJpdHMgUGVyIFNhbXBsZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QklUU19QRVJfU0FNUExFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5CaXRzIFBlciBTYW1wbGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5Pm9uY3JlYXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNvbXByZXNzaW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMDM8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbXByZXNzaW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT01QUkVTU0lPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tcHJlc3Npb24gRm9ybWF0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iVW5jb21wcmVzc2VkIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNDSVRUIDFEIj4KLSAgICAgICAgICAgIDx2YWx1ZT4yPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlQ0L0dyb3VwIDMgRmF4Ij4KLSAgICAgICAgICAgIDx2YWx1ZT4zPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlQ2L0dyb3VwIDQgRmF4Ij4KLSAgICAgICAgICAgIDx2YWx1ZT40PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkxaVyI+Ci0gICAgICAgICAgICA8dmFsdWU+NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJKUEVHIChvbGQtc3R5bGUpIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpQRUciPgotICAgICAgICAgICAgPHZhbHVlPjc8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQWRvYmUgRGVmbGF0ZSI+Ci0gICAgICAgICAgICA8dmFsdWU+ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJKQklHIEJXIj4KLSAgICAgICAgICAgIDx2YWx1ZT45PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpCSUcgQ29sb3IiPgotICAgICAgICAgICAgPHZhbHVlPjEwPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpQRUciPgotICAgICAgICAgICAgPHZhbHVlPjk5PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IktvZGFrIDI2MiI+Ci0gICAgICAgICAgICA8dmFsdWU+MjYyPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik5leHQiPgotICAgICAgICAgICAgPHZhbHVlPjMyNzY2PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlNvbnkgQVJXIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjMyNzY3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBhY2tlZCBSQVciPgotICAgICAgICAgICAgPHZhbHVlPjMyNzY5PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlNhbXN1bmcgU1JXIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjMyNzcwPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNDSVJMRVciPgotICAgICAgICAgICAgPHZhbHVlPjMyNzcxPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBhY2tCaXRzIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjc3MzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJUaHVuZGVyc2NhbiI+Ci0gICAgICAgICAgICA8dmFsdWU+MzI4MDk8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iS29kYWsgS0RDIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjMyODY3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IklUOENUUEFEIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjg5NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJJVDhMVyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzI4OTY8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iSVQ4TVAiPgotICAgICAgICAgICAgPHZhbHVlPjMyODk3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IklUOEJMIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjg5ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJQaXhhckZpbG0iPgotICAgICAgICAgICAgPHZhbHVlPjMyOTA4PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBpeGFyTG9nIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjkwOTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJEZWZsYXRlIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjk0NjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJEQ1MiPgotICAgICAgICAgICAgPHZhbHVlPjMyOTQ3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpCSUciPgotICAgICAgICAgICAgPHZhbHVlPjM0NjYxPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlNHSUxvZyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ2NzY8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iU0dJTG9nMjQiPgotICAgICAgICAgICAgPHZhbHVlPjM0Njc3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpQRUcgMjAwMCI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ3MTI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTmlrb24gTkVGIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjM0NzEzPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpCSUcyIFRJRkYgRlgiPgotICAgICAgICAgICAgPHZhbHVlPjM0NzE1PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik1pY3Jvc29mdCBEb2N1bWVudCBJbWFnaW5nIChNREkpIEJpbmFyeSBMZXZlbCBDb2RlYyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ3MTg8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTWljcm9zb2Z0IERvY3VtZW50IEltYWdpbmcgKE1ESSkgUHJvZ3Jlc3NpdmUgVHJhbnNmb3JtIENvZGVjIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zNDcxOTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNaWNyb3NvZnQgRG9jdW1lbnQgSW1hZ2luZyAoTURJKSBWZWN0b3IiPgotICAgICAgICAgICAgPHZhbHVlPjM0NzIwPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IktvZGFrIERDUiBDb21wcmVzc2VkIj4KLSAgICAgICAgICAgIDx2YWx1ZT42NTAwMDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJQZW50YXggUEVGIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjY1NTM1PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTA2PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5QaG90b21ldHJpYyBJbnRlcnByZXRhdGlvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+UEhPVE9NRVRSSUNfSU5URVJQUkVUQVRJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbG9yIEZvcm1hdDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT48L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+b25jcmVhdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IldoaXRlSXNaZXJvIj4KLSAgICAgICAgICAgIDx2YWx1ZT4wPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkJsYWNrSXNaZXJvIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlJHQiI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJSR0IgUGFsZXR0ZSI+Ci0gICAgICAgICAgICA8dmFsdWU+MzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJUcmFuc3BhcmVuY3kgTWFzayI+Ci0gICAgICAgICAgICA8dmFsdWU+NDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDTVlLIj4KLSAgICAgICAgICAgIDx2YWx1ZT41PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IllDYkNyIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNJRUxhYiI+Ci0gICAgICAgICAgICA8dmFsdWU+ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJJQ0NMYWIiPgotICAgICAgICAgICAgPHZhbHVlPjk8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iSVRVTGFiIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xMDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDb2xvciBGaWx0ZXIgQXJyYXkiPgotICAgICAgICAgICAgPHZhbHVlPjMyODAzPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBpeGFyIExvZ0wiPgotICAgICAgICAgICAgPHZhbHVlPjMyODQ0PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBpeGFyIExvZ0x1diI+Ci0gICAgICAgICAgICA8dmFsdWU+MzI4NDU8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTGluZWFyIFJhdyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ4OTI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmltYWdlRGVzY3JpcHRpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEwZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+SW1hZ2UgRGVzY3JpcHRpb248L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklNQUdFX0RFU0NSSVBUSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1ha2U8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEwZjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TWFrZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TUFLRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q2FtZXJhIE1ha2U8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bW9kZWw8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDExMDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TW9kZWw8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPk1PREVMPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5DYW1lcmEgTW9kZWw8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm9yaWVudGF0aW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMTI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPk9yaWVudGF0aW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5PUklFTlRBVElPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+T3JpZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iSG9yaXpvbnRhbCAobm9ybWFsKSI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNaXJyb3IgaG9yaXpvbnRhbCI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJSb3RhdGUgMTgwIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik1pcnJvciB2ZXJ0aWNhbCI+Ci0gICAgICAgICAgICA8dmFsdWU+NDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNaXJyb3IgaG9yaXpvbnRhbCBhbmQgcm90YXRlIDI3MCBDVyI+Ci0gICAgICAgICAgICA8dmFsdWU+NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJSb3RhdGUgOTAgQ1ciPgotICAgICAgICAgICAgPHZhbHVlPjY8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTWlycm9yIGhvcml6b250YWwgYW5kIHJvdGF0ZSA5MCBDVyI+Ci0gICAgICAgICAgICA8dmFsdWU+NzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJSb3RhdGUgMjcwIENXIj4KLSAgICAgICAgICAgIDx2YWx1ZT44PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+eFJlc29sdXRpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDExYTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+WCBSZXNvbHV0aW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5YX1JFU09MVVRJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnhyZXNvbHV0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+eVJlc29sdXRpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDExYjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+WSBSZXNvbHV0aW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5ZX1JFU09MVVRJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnlyZXNvbHV0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cmVzb2x1dGlvblVuaXQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEyODwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+UmVzb2x1dGlvbiBVbml0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5SRVNPTFVUSU9OX1VOSVQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlJlc29sdXRpb24gVW5pdDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJOb25lIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9ImluY2hlcyI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJjbSI+Ci0gICAgICAgICAgICA8dmFsdWU+MzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+c29mdHdhcmU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEzMTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U29mdHdhcmU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlNPRlRXQVJFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Tb2Z0d2FyZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bW9kaWZ5RGF0ZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTMyPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Nb2RpZnkgRGF0ZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TU9ESUZZX0RBVEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk1vZGlmeSBEYXRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGF0ZXRpbWU8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEYXRlVGltZURlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmFydGlzdDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTNiPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BcnRpc3Q8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFSVElTVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QXJ0aXN0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD55Q2JDclBvc2l0aW9uaW5nPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAyMTM8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPllDYkNyUG9zaXRpb25pbmc8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPllDQkNSUE9TSVRJT05JTkc8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPllDYkNyIFBvc2l0aW9uaW5nPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNlbnRlcmVkIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNvLXNpdGVkIj4KLSAgICAgICAgICAgIDx2YWx1ZT4yPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb3B5cmlnaHQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODI5ODwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q29weXJpZ2h0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT1BZUklHSFQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvcHlyaWdodCBOb3RpY2U8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZXhwb3N1cmVUaW1lPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDgyOWE8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkV4cG9zdXJlIFRpbWU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkVYUE9TVVJFX1RJTUU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4cG9zdXJlIFRpbWU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5kZWNpbWFsPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5Pm9uY3JlYXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmZOdW1iZXI8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODI5ZDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RiBOdW1iZXI8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkZfTlVNQkVSPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5GLVN0b3AgTnVtYmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5leHBvc3VyZVByb2dyYW08L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODgyMjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RXhwb3N1cmUgUHJvZ3JhbTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+RVhQT1NVUkVfUFJPR1JBTTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhwb3N1cmUgUHJvZ3JhbTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+b25jcmVhdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik5vdCBEZWZpbmVkIj4KLSAgICAgICAgICAgIDx2YWx1ZT4wPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik1hbnVhbCI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJQcm9ncmFtIEFFIj4KLSAgICAgICAgICAgIDx2YWx1ZT4yPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkFwZXJ0dXJlLXByaW9yaXR5IEFFIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlNodXR0ZXIgc3BlZWQgcHJpb3JpdHkgQUUiPgotICAgICAgICAgICAgPHZhbHVlPjQ8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQ3JlYXRpdmUgKFNsb3cgc3BlZWQpIj4KLSAgICAgICAgICAgIDx2YWx1ZT41PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkFjdGlvbiAoSGlnaCBzcGVlZCkiPgotICAgICAgICAgICAgPHZhbHVlPjY8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iUG9ydHJhaXQiPgotICAgICAgICAgICAgPHZhbHVlPjc8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTGFuZHNjYXBlIj4KLSAgICAgICAgICAgIDx2YWx1ZT44PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkJ1bGIiPgotICAgICAgICAgICAgPHZhbHVlPjk8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5pc29TcGVlZDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODI3PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5JU08gU3BlZWQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklTT19TUEVFRDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+SVNPIFNwZWVkIFNldHRpbmc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5Pm9uY3JlYXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgICAgIDxpZD5ncHNMYXRpdHVkZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODI1LTB4MDAwMjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+R1BTIExhdGl0dWRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5HUFNfTEFUSVRVREU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkdQUyBMYXRpdHVkZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmdwc0xhdGl0dWRlUmVmPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDg4MjUtMHgwMDAxPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5HUFMgTGF0aXR1ZGUgUmVmPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5HUFNfTEFUSVRVREVfUkVGPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HUFMgTGF0aXR1ZGUgUmVmZXJlbmNlIChOL1MpPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTm9ydGgiPgotICAgICAgICAgICAgPHZhbHVlPk48L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iU291dGgiPgotICAgICAgICAgICAgPHZhbHVlPlM8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmdwc0xvbmdpdHVkZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODI1LTB4MDAwNDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+R1BTIExvbmdpdHVkZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0xPTkdJVFVERTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+R1BTIExvbmdpdHVkZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmdwc0xvbmdpdHVkZVJlZjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODI1LTB4MDAwMzwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+R1BTIExvbmdpdHVkZSBSZWY8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkdQU19MT05HSVRVREVfUkVGPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HUFMgTG9uZ2l0dWRlIFJlZmVyZW5jZSAoVy9FKTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkVhc3QiPgotICAgICAgICAgICAgPHZhbHVlPkU8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iV2VzdCI+Ci0gICAgICAgICAgICA8dmFsdWU+VzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Z3BzQWx0aXR1ZGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODgyNS0weDAwMDY8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkdQUyBBbHRpdHVkZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0FMVElUVURFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HUFMgQWx0aXR1ZGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5kZWNpbWFsPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5ncHNBbHRpdHVkZVJlZjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODI1LTB4MDAwNTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+R1BTIEFsdGl0dWRlIFJlZjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0FMVElUVURFX1JFRjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+R1BTIEFsdGl0dWRlIFJlZmVyZW5jZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkFib3ZlIFNlYSBMZXZlbCI+Ci0gICAgICAgICAgICA8dmFsdWU+MDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJCZWxvdyBTZWEgTGV2ZWwiPgotICAgICAgICAgICAgPHZhbHVlPjE8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnNlbGZUaW1lck1vZGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODgyYjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U2VsZiBUaW1lciBNb2RlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TRUxGX1RJTUVSX01PREU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlNlbGYgVGltZXIgTW9kZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnRpbWVab25lT2Zmc2V0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDg4MmE8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlRpbWUgWm9uZSBPZmZzZXQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRJTUVfWk9ORV9PRkZTRVQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRpbWUgWm9uZSBPZmZzZXQgKEdNVCBvZmZzZXQgaW4gaG91cnMpPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+bXVsdGk8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZGF0ZVRpbWVPcmlnaW5hbDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MDAzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5EYXRlIFRpbWUgT3JpZ2luYWw8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkRBVEVfVElNRV9PUklHSU5BTDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGF0ZS90aW1lIHdoZW4gb3JpZ2luYWwgaW1hZ2Ugd2FzIHRha2VuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGF0ZXRpbWU8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNyZWF0ZURhdGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTAwNDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q3JlYXRlIERhdGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNSRUFURV9EQVRFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kYXRlL3RpbWUgZGlnaXRpemVkPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGF0ZXRpbWU8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+c2h1dHRlclNwZWVkVmFsdWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwMTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U2h1dHRlciBTcGVlZCBWYWx1ZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U0hVVFRFUl9TUEVFRF9WQUxVRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+c2h1dHRlciBzcGVlZCB2YWx1ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmFwZXJ0dXJlVmFsdWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwMjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+QXBlcnR1cmUgVmFsdWU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFQRVJUVVJFX1ZBTFVFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BcGVydHVyZSBWYWx1ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmJyaWdodG5lc3NWYWx1ZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjAzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5CcmlnaHRuZXNzIFZhbHVlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5CUklHSFRORVNTX1ZBTFVFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5CcmlnaHRuZXNzIFZhbHVlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZXhwb3N1cmVDb21wZW5zYXRpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwNDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RXhwb3N1cmUgQ29tcGVuc2F0aW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5FWFBPU1VSRV9DT01QRU5TQVRJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4cG9zdXJlIENvbXBlbnNhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1heEFwZXJ0dXJlVmFsdWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwNTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TWF4IEFwZXJ0dXJlIFZhbHVlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5NQVhfQVBFUlRVUkVfVkFMVUU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk1heCBBcGVydHVyZSBWYWx1ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1ldGVyaW5nTW9kZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjA3PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5NZXRlcmluZyBNb2RlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5NRVRFUklOR19NT0RFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5tZXRlcmluZyBtb2RlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlVua25vd24iPgotICAgICAgICAgICAgPHZhbHVlPjA8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQXZlcmFnZSI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDZW50ZXItd2VpZ2h0ZWQgYXZlcmFnZSI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJTcG90Ij4KLSAgICAgICAgICAgIDx2YWx1ZT4zPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik11bHRpLXNwb3QiPgotICAgICAgICAgICAgPHZhbHVlPjQ8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTXVsdGktc2VnbWVudCI+Ci0gICAgICAgICAgICA8dmFsdWU+NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJQYXJ0aWFsIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik90aGVyIj4KLSAgICAgICAgICAgIDx2YWx1ZT4yNTU8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zdWJqZWN0RGlzdGFuY2U8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwNjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U3ViamVjdCBEaXN0YW5jZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U1VCSkVDVF9ESVNUQU5DRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+c3ViamVjdCBkaXN0YW5jZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmxpZ2h0U291cmNlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDkyMDg8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxpZ2h0IFNvdXJjZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TElHSFRfU09VUkNFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5saWdodCBzb3VyY2UgdmFsdWU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5mbGFzaDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjA5PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5GbGFzaDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+RkxBU0g8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkZsYXNoIFNldHRpbmc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgICAgIDxpZD5mb2NhbExlbmd0aDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjBhPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Gb2NhbCBMZW5ndGg8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkZPQ0FMX0xFTkdUSDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Zm9jYWwgbGVuZ3RoPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dXNlckNvbW1lbnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTI4NjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VXNlciBDb21tZW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5VU0VSX0NPTU1FTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnVzZXIgY29tbWVudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb2xvclNwYWNlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weGEwMDE8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbG9yIFNwYWNlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT0xPUl9TUEFDRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Y29sb3Igc3BhY2U8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0ic1JHQiI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJBZG9iZSBSR0IiPgotICAgICAgICAgICAgPHZhbHVlPjI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iV2lkZSBHYW11dCBSR0IiPgotICAgICAgICAgICAgPHZhbHVlPjY1NTMzPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IklDQyBQcm9maWxlIj4KLSAgICAgICAgICAgIDx2YWx1ZT42NTUzNDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJVbmNhbGlicmF0ZWQiPgotICAgICAgICAgICAgPHZhbHVlPjY1NTM1PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cGl4ZWxYRGltZW5zaW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weGEwMDI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlBpeGVsWERpbWVuc2lvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+UElYRUxYRElNRU5TSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kaW1lbnNpb24gaW4gcGl4ZWwgeDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnBpeGVsWURpbWVuc2lvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHhhMDAzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5QaXhlbFlEaW1lbnNpb248L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlBJWEVMWURJTUVOU0lPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGltZW5zaW9uIGluIHBpeGVsIHk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5leHBvc3VyZU1vZGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4YTQwMjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RXhwb3N1cmUgTW9kZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+RVhQT1NVUkVfTU9ERTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+RXhwb3N1cmUgTW9kZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJBdXRvIj4KLSAgICAgICAgICAgIDx2YWx1ZT4wPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik1hbnVhbCI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJBdXRvIGJyYWNrZXQiPgotICAgICAgICAgICAgPHZhbHVlPjI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD53aGl0ZUJhbGFuY2U8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4YTQwMzwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+V2hpdGUgQmFsYW5jZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+V0hJVEVfQkFMQU5DRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+d2hpdGUgYmFsYW5jZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJBdXRvIj4KLSAgICAgICAgICAgIDx2YWx1ZT4wPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik1hbnVhbCI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnNjZW5lQ2FwdHVyZVR5cGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4YTQwNjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U2NlbmUgQ2FwdHVyZSBUeXBlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TQ0VORV9DQVBUVVJFX1RZUEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlNjZW5lIENhcHR1cmUgVHlwZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJTdGFuZGFyZCI+Ci0gICAgICAgICAgICA8dmFsdWU+MDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJMYW5kc2NhcGUiPgotICAgICAgICAgICAgPHZhbHVlPjE8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iUG9ydHJhaXQiPgotICAgICAgICAgICAgPHZhbHVlPjI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTmlnaHQiPgotICAgICAgICAgICAgPHZhbHVlPjM8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SWREZWZpbml0aW9uPgotICAgICAgICA8aWQ+aW1hZ2VVbmlxdWVJZDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHhhNDIwPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5JbWFnZSBVbmlxdWUgSWQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklNQUdFX1VOSVFVRV9JRDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+SW1hZ2UgVW5pcXVlIElkPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aWQ8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJZERlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm93bmVyTmFtZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHhhNDMwPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Pd25lciBOYW1lPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5PV05FUl9OQU1FPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pd25lciBOYW1lPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnNlcmlhbE51bWJlcjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHhhNDMxPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5TZXJpYWwgTnVtYmVyPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TRVJJQUxfTlVNQkVSPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5zZXJpYWwgbnVtYmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5yYXRpbmc8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4NDc0NjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+UmF0aW5nPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5SQVRJTkc8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnJhdGluZyB2YWx1ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnJhdGluZ1BlcmNlbnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4NDc0OTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+UmF0aW5nIFBlcmNlbnQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlJBVElOR19QRVJDRU5UPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5yYXRpbmcgcGVyY2VudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmRhdGFQcmVjaXNpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDAwMDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RGF0YSBQcmVjaXNpb248L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkRBVEFfUFJFQ0lTSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5KUEVHIERhdGEgUHJlY2lzaW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotPC9jbWlzcmE6dHlwZT4KLQotPGNtaXNyYTp0eXBlIHhzaTp0eXBlPSJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotICAgIDxpZD5vZmZpY2VEb2N1bWVudDwvaWQ+Ci0gICAgPGxvY2FsTmFtZT5vZmZpY2VEb2N1bWVudDwvbG9jYWxOYW1lPgotICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgIDxwYXJlbnRJZD5jbWlzOmRvY3VtZW50PC9wYXJlbnRJZD4KLSAgICA8ZGlzcGxheU5hbWU+T2ZmaWNlIERvY3VtZW50PC9kaXNwbGF5TmFtZT4KLSAgICA8cXVlcnlOYW1lPk9GRklDRV9ET0NVTUVOVDwvcXVlcnlOYW1lPgotICAgIDxkZXNjcmlwdGlvbj5Eb2N1bWVudCBvZiB0eXBlIE9mZmljZTwvZGVzY3JpcHRpb24+Ci0gICAgPGJhc2VJZD5jbWlzOmRvY3VtZW50PC9iYXNlSWQ+Ci0gICAgPGNyZWF0YWJsZT50cnVlPC9jcmVhdGFibGU+Ci0gICAgPGZpbGVhYmxlPnRydWU8L2ZpbGVhYmxlPgotICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgIDxmdWxsdGV4dEluZGV4ZWQ+dHJ1ZTwvZnVsbHRleHRJbmRleGVkPgotICAgIDxpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+dHJ1ZTwvaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PgotICAgIDxjb250cm9sbGFibGVQb2xpY3k+ZmFsc2U8L2NvbnRyb2xsYWJsZVBvbGljeT4KLSAgICA8Y29udHJvbGxhYmxlQUNMPnRydWU8L2NvbnRyb2xsYWJsZUFDTD4KLSAgICA8VHlwZU11dGFiaWxpdHk+Ci0gICAgICAgIDxjcmVhdGU+dHJ1ZTwvY3JlYXRlPgotICAgICAgICA8dXBkYXRlPnRydWU8L3VwZGF0ZT4KLSAgICAgICAgPGRlbGV0ZT50cnVlPC9kZWxldGU+Ci0gICAgPC9UeXBlTXV0YWJpbGl0eT4KLSAgICA8dmVyc2lvbmFibGU+ZmFsc2U8L3ZlcnNpb25hYmxlPgotICAgIDxjb250ZW50U3RyZWFtQWxsb3dlZD5hbGxvd2VkPC9jb250ZW50U3RyZWFtQWxsb3dlZD4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YXBwbGljYXRpb25OYW1lPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5hcHBsaWNhdGlvbk5hbWU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkFwcGxpY2F0aW9uIE5hbWU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFQUExJQ0FUSU9OX05BTUU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkFwcGxpY2F0aW9uIE5hbWU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YXBwbGljYXRpb25WZXJzaW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5hcHBsaWNhdGlvblZlcnNpb248L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkFwcGxpY2F0aW9uIFZlcnNpb248L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFQUExJQ0FUSU9OX1ZFUlNJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkFwcGxpY2F0aW9uIFZlcnNpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5hdXRob3I8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmF1dGhvcjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+QXV0aG9yPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5BVVRIT1I8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkF1dGhvcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jYXRlZ29yeTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y2F0ZWdvcnk8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNhdGVnb3J5PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DQVRFR09SWTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q2F0ZWdvcnk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y29udGVudFN0YXR1czwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y29udGVudFN0YXR1czwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q29udGVudCBTdGF0dXM8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNPTlRFTlRfU1RBVFVTPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db250ZW50IFN0YXR1czwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNvbW1lbnRzPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jb21tZW50czwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q29tbWVudHM8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNPTU1FTlRTPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tZW50czwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb21wYW55PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jb21wYW55PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Db21wYW55PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT01QQU5ZPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21wYW55PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmtleXdvcmRzPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5rZXl3b3JkczwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+S2V5d29yZHM8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPktFWVdPUkRTPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5LZXl3b3JkczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+bXVsdGk8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmxhc3RBdXRob3I8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmxhc3RBdXRob3I8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxhc3QgQXV0aG9yPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5MQVNUX0FVVEhPUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TGFzdCBBdXRob3I8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5tYW5hZ2VyPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5tYW5hZ2VyPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5NYW5hZ2VyPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5NQU5BR0VSPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5NYW5hZ2VyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bm90ZXM8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPm5vdGVzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Ob3RlczwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Tk9URVM8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk5vdGVzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cHJlc2VudGF0aW9uRm9ybWF0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5wcmVzZW50YXRpb25Gb3JtYXQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlByZXNlbnRhdGlvbiBGb3JtYXQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlBSRVNFTlRBVElPTl9GT1JNQVQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlByZXNlbnRhdGlvbiBGb3JtYXQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5yZXZpc2lvbk51bWJlcjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+cmV2aXNpb25OdW1iZXI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlJldmlzaW9uIE51bWJlcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+UkVWSVNJT05fTlVNQkVSPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5SZXZpc2lvbiBOdW1iZXI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD50ZW1wbGF0ZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+dGVtcGxhdGU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlRlbXBsYXRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5URU1QTEFURTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGVtcGxhdGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD52ZXJzaW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT52ZXJzaW9uPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5WZXJzaW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5WRVJTSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5WZXJzaW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNoYXJhY3RlckNvdW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jaGFyYWN0ZXJDb3VudDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q2hhcmFjdGVyIENvdW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DSEFSQUNURVJfQ09VTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNoYXJhY3RlciBDb3VudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNoYXJhY3RlckNvdW50V2l0aFNwYWNlczwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y2hhcmFjdGVyQ291bnRXaXRoU3BhY2VzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5DaGFyYWN0ZXIgQ291bnQgV2l0aCBTcGFjZXM8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNIQVJBQ1RFUl9DT1VOVF9XSVRIX1NQQUNFUzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q2hhcmFjdGVyIENvdW50IFdpdGggU3BhY2VzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+d29yZENvdW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT53b3JkQ291bnQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPldvcmQgQ291bnQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPldPUkRfQ09VTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPldvcmQgQ291bnQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5saW5lQ291bnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmxpbmVDb3VudDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TGluZSBDb3VudDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TElORV9DT1VOVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TGluZSBDb3VudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnBhZ2VDb3VudDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+cGFnZUNvdW50PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5QYWdlIENvdW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5QQUdFX0NPVU5UPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5QYWdlIENvdW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnNsaWRlQ291bnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnNsaWRlQ291bnQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlNsaWRlIENvdW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TTElERV9DT1VOVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+U2xpZGUgQ291bnQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cGFyYWdyYXBoQ291bnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnBhcmFncmFwaENvdW50PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5QYXJhZ3JhcGggQ291bnQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlBBUkFHUkFQSF9DT1VOVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+UGFyYWdyYXBoIENvdW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD50b3RhbFRpbWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnRvdGFsVGltZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VG90YWwgVGltZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+VE9UQUxfVElNRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+VG90YWwgVGltZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmVkaXRUaW1lPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5lZGl0VGltZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RWRpdCBUaW1lPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5FRElUX1RJTUU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkVkaXQgVGltZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y3JlYXRpb25EYXRlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jcmVhdGlvbkRhdGU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNyZWF0aW9uIERhdGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNSRUFUSU9OX0RBVEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNyZWF0aW9uIERhdGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5kYXRldGltZTwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEYXRlVGltZURlZmluaXRpb24+Ci0gICAgICAgIDxpZD5sYXN0U2F2ZURhdGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmxhc3RTYXZlRGF0ZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TGFzdCBTYXZlIERhdGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkxBU1RfU0FWRV9EQVRFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5MYXN0IFNhdmUgRGF0ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRhdGV0aW1lPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5sYXN0UHJpbnRlZDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+bGFzdFByaW50ZWQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxhc3QgUHJpbnRlZDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TEFTVF9QUklOVEVEPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5MYXN0IFByaW50ZWQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotPC9jbWlzcmE6dHlwZT4KLQotPGNtaXNyYTp0eXBlIHhzaTp0eXBlPSJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotICAgIDxpZD5wZGZEb2N1bWVudDwvaWQ+Ci0gICAgPGxvY2FsTmFtZT5wZGZEb2N1bWVudDwvbG9jYWxOYW1lPgotICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgIDxwYXJlbnRJZD5vZmZpY2VEb2N1bWVudDwvcGFyZW50SWQ+Ci0gICAgPGRpc3BsYXlOYW1lPlBERiBEb2N1bWVudDwvZGlzcGxheU5hbWU+Ci0gICAgPHF1ZXJ5TmFtZT5QREZfRE9DVU1FTlQ8L3F1ZXJ5TmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+RG9jdW1lbnQgb2YgdHlwZSBQREY8L2Rlc2NyaXB0aW9uPgotICAgIDxiYXNlSWQ+Y21pczpkb2N1bWVudDwvYmFzZUlkPgotICAgIDxjcmVhdGFibGU+dHJ1ZTwvY3JlYXRhYmxlPgotICAgIDxmaWxlYWJsZT50cnVlPC9maWxlYWJsZT4KLSAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICA8ZnVsbHRleHRJbmRleGVkPnRydWU8L2Z1bGx0ZXh0SW5kZXhlZD4KLSAgICA8aW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PnRydWU8L2luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT4KLSAgICA8Y29udHJvbGxhYmxlUG9saWN5PmZhbHNlPC9jb250cm9sbGFibGVQb2xpY3k+Ci0gICAgPGNvbnRyb2xsYWJsZUFDTD50cnVlPC9jb250cm9sbGFibGVBQ0w+Ci0gICAgPFR5cGVNdXRhYmlsaXR5PgotICAgICAgICA8Y3JlYXRlPnRydWU8L2NyZWF0ZT4KLSAgICAgICAgPHVwZGF0ZT50cnVlPC91cGRhdGU+Ci0gICAgICAgIDxkZWxldGU+dHJ1ZTwvZGVsZXRlPgotICAgIDwvVHlwZU11dGFiaWxpdHk+Ci0gICAgPHZlcnNpb25hYmxlPmZhbHNlPC92ZXJzaW9uYWJsZT4KLSAgICA8Y29udGVudFN0cmVhbUFsbG93ZWQ+YWxsb3dlZDwvY29udGVudFN0cmVhbUFsbG93ZWQ+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNyZWF0b3I8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNyZWF0b3I8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNyZWF0b3I8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNSRUFUT1I8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmNyZWF0b3Igb2YgZG9jdW1lbnQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dGl0bGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnRpdGxlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5UaXRsZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+VElUTEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRpdGxlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnN1YmplY3Q8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnN1YmplY3Q8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlN1YmplY3Q8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlNVQkpFQ1Q8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnN1YmpldCBvZiBtZXNzYWdlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnRyYXBwZWQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnRyYXBwZWQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlRyYXBwZWQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRSQVBQRUQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnRyYXBwZWQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotPC9jbWlzcmE6dHlwZT4KLQotPGNtaXNyYTp0eXBlIHhzaTp0eXBlPSJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotICAgIDxpZD52aWRlb0ZpbGU8L2lkPgotICAgIDxsb2NhbE5hbWU+dmlkZW9GaWxlPC9sb2NhbE5hbWU+Ci0gICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgPHBhcmVudElkPmNtaXM6ZG9jdW1lbnQ8L3BhcmVudElkPgotICAgIDxkaXNwbGF5TmFtZT5WaWRlbyBGaWxlPC9kaXNwbGF5TmFtZT4KLSAgICA8cXVlcnlOYW1lPlZJREVPX0ZJTEU8L3F1ZXJ5TmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+VmlkZW8gTW92aWVzPC9kZXNjcmlwdGlvbj4KLSAgICA8YmFzZUlkPmNtaXM6ZG9jdW1lbnQ8L2Jhc2VJZD4KLSAgICA8Y3JlYXRhYmxlPnRydWU8L2NyZWF0YWJsZT4KLSAgICA8ZmlsZWFibGU+dHJ1ZTwvZmlsZWFibGU+Ci0gICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgPGZ1bGx0ZXh0SW5kZXhlZD50cnVlPC9mdWxsdGV4dEluZGV4ZWQ+Ci0gICAgPGluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT50cnVlPC9pbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+Ci0gICAgPGNvbnRyb2xsYWJsZVBvbGljeT5mYWxzZTwvY29udHJvbGxhYmxlUG9saWN5PgotICAgIDxjb250cm9sbGFibGVBQ0w+dHJ1ZTwvY29udHJvbGxhYmxlQUNMPgotICAgIDxUeXBlTXV0YWJpbGl0eT4KLSAgICAgICAgPGNyZWF0ZT50cnVlPC9jcmVhdGU+Ci0gICAgICAgIDx1cGRhdGU+dHJ1ZTwvdXBkYXRlPgotICAgICAgICA8ZGVsZXRlPnRydWU8L2RlbGV0ZT4KLSAgICA8L1R5cGVNdXRhYmlsaXR5PgotICAgIDx2ZXJzaW9uYWJsZT5mYWxzZTwvdmVyc2lvbmFibGU+Ci0gICAgPGNvbnRlbnRTdHJlYW1BbGxvd2VkPmFsbG93ZWQ8L2NvbnRlbnRTdHJlYW1BbGxvd2VkPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5hcnRpc3Q8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEzYjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+QXJ0aXN0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5BUlRJU1Q8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkFydGlzdDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5hbGJ1bTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+YWxidW08L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkFsYnVtPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5BTEJVTTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+dGl0bGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dGl0bGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnRpdGxlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5UaXRsZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+VElUTEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRpdGxlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNvbW1lbnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNvbW1lbnQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbW1lbnQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNPTU1FTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1lbnQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5nZW5yZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Z2VucmU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkdlbnJlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5HRU5SRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+R2VucmU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmxlbmd0aDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+bGVuZ3RoPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5MZW5ndGg8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkxFTkdUSDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TGVuZ3RoIGluIHNlY29uZHM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD50cmFjazwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+dHJhY2s8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlRyYWNrPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5UUkFDSzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+VHJhY2sgaW4gYWxidW08L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD55ZWFyPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT55ZWFyPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5ZZWFyPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5ZRUFSPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5yZWxlYXNlIGRhdGUgb2YgYWxidW48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZGlzY05vPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5kaXNjTm88L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkRpc2MgTnVtYmVyPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5ESVNDX05VTUJFUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+bnVtYmVyIG9mIGRpc2MgLyB0b3RhbCBkaXNjczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5pbWFnZVdpZHRoPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMDA8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkltYWdlIFdpZHRoPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5JTUFHRV9XSURUSDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+SW1hZ2UgV2lkdGg8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5Pm9uY3JlYXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5pbWFnZUhlaWdodDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTAxPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5JbWFnZSBIZWlnaHQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklNQUdFX0hFSUdIVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+SW1hZ2UgSGVpZ2h0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotPC9jbWlzcmE6dHlwZT4KLQotPC9jaGVtOnR5cGVEZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvdmlkZW8teC1nZW5lcmljLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi9yZXNvdXJjZXMvdmlkZW8teC1nZW5lcmljLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMmFmZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL3ZpZGVvLXgtZ2VuZXJpYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL0xJQ0VOU0UgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTAzODkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVBsZWFzZSBzZWUgYWxzbyBUSFJJRC1QQVJUWS1MSUNFTlNFUy4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gU0xGNEogTE9HNEotMTIgQmluZGluZyAoaHR0cDovL3d3dy5zbGY0ai5vcmcpCi0gIExpY2Vuc2U6IE1JVCBMaWNlbnNlICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApCi0KLQotQ29weXJpZ2h0IChjKSAyMDA0LTIwMTMgUU9TLmNoCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSBhICBjb3B5ICBvZiB0aGlzICBzb2Z0d2FyZSAgYW5kICBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICAodGhlCi0gIlNvZnR3YXJlIiksIHRvICBkZWFsIGluICB0aGUgU29mdHdhcmUgd2l0aG91dCAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotIHdpdGhvdXQgbGltaXRhdGlvbiAgdGhlIHJpZ2h0cyB0byAgdXNlLCBjb3B5LCBtb2RpZnksICBtZXJnZSwgcHVibGlzaCwKLSBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgIGNvcGllcyBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKLSBUaGUgIGFib3ZlICBjb3B5cmlnaHQgIG5vdGljZSAgYW5kICB0aGlzIHBlcm1pc3Npb24gIG5vdGljZSAgc2hhbGwgIGJlCi0gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFICBTT0ZUV0FSRSBJUyAgUFJPVklERUQgICJBUyAgSVMiLCBXSVRIT1VUICBXQVJSQU5UWSAgT0YgQU5ZICBLSU5ELAotIEVYUFJFU1MgT1IgIElNUExJRUQsIElOQ0xVRElORyAgQlVUIE5PVCBMSU1JVEVEICBUTyBUSEUgIFdBUlJBTlRJRVMgT0YKLSBNRVJDSEFOVEFCSUxJVFksICAgIEZJVE5FU1MgICAgRk9SICAgIEEgICBQQVJUSUNVTEFSICAgIFBVUlBPU0UgICAgQU5ECi0gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTk9USUNFIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjAzNjcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0KLU9wZW5DTUlTIEluTWVtb3J5IFJlcG9zaXRvcnkKLUNvcHlyaWdodCAyMDA5LTIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLQotT3BlbkNNSVMgY29udGFpbnMgY29kZSBmcm9tIHRoZSBmb2xsb3dpbmcgT3BlbiBTb3VyY2UgcHJvamVjdHM6Ci0KLS0gQmFzZTY0IAotICBDb3B5cmlnaHQgKGMpIDIwMTAgUm9iZXJ0IEhhcmRlcgotICBQdWJsaWMgRG9tYWluLCA8aHR0cDovL2loYXJkZXIubmV0L2Jhc2U2ND4KLQotLSBKU09OLnNpbXBsZQotICBDb3B5cmlnaHQgKGMpIDIwMTIgWWlkb25nIEZhbmcKLSAgQXBhY2hlIExpY2Vuc2UgMi4wLCA8aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2pzb24tc2ltcGxlLz4KLSAgCi0gIAotT3BlbkNNSVMgY29udGFpbnMgT0FTSVMgQ01JUyAxLjAgYW5kIENNSVMgMS4xIHNjaGVtYSBhbmQgV1NETCBmaWxlcy4KLUNvcHlyaWdodCAoYykgMjAxMCBhbmQgMjAxMyBPQVNJUyBPcGVuCi08aHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9jbWlzPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmRhYzBjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3JlcG9zaXRvcnkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotY2xhc3M9b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkluTWVtb3J5U2VydmljZUZhY3RvcnlJbXBsCi0KLXJlcG9zaXRvcnkuaWQ9ZHVtbXktcmVwCi1yZXBvc2l0b3J5Lm5hbWU9RHVtbXkgUmVwb3NpdG9yeQotCi0jIEluIE1lbW9yeSBTZXR0aW5ncwotSW5NZW1vcnlTZXJ2ZXIuUmVwb3NpdG9yeUlkPUExCi0jIEluTWVtb3J5U2VydmVyLlJlcG9zaXRvcnlJbmZvQ3JlYXRvckNsYXNzPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5wcm92aWRlci5pbm1lbW9yeS5Vbml0VGVzdFJlcG9zaXRvcnlJbmZvCi1Jbk1lbW9yeVNlcnZlci5Vc2VyPWR1bW15dXNlcgotSW5NZW1vcnlTZXJ2ZXIuUGFzc3dvcmQ9ZHVtbXlzZWNyZXQKLUluTWVtb3J5U2VydmVyLlR5cGVzQ3JlYXRvckNsYXNzPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLkRlZmF1bHRUeXBlU3lzdGVtQ3JlYXRvcgotSW5NZW1vcnlTZXJ2ZXIuVHlwZURlZmluaXRpb25zRmlsZT10eXBlcy54bWwKLUluTWVtb3J5U2VydmVyLkNsYXNzPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsLlN0b3JlTWFuYWdlckltcGwKLQotIyBJbk1lbW9yeVNlcnZlci5NZW1vcnlUaHJlc2hvbGQ9MTA0ODU3NjAKLSMgSW5NZW1vcnlTZXJ2ZXIuVGVtcERpcj0vcGF0aC90by95b3VyL3RtcAotSW5NZW1vcnlTZXJ2ZXIuTWF4U2l6ZT0yMDk3MTUyMAotSW5NZW1vcnlTZXJ2ZXIuRW5jcnlwdFRlbXBGaWxlcz10cnVlCi0KLSMgc2V0dGluZ3MgZm9yIGluaXQgcmVwb3NpdG9yeSB3aXRoIGRhdGEKLSAgIyBlbmFibGUgb3IgZGlzYWJsZQotIyBSZXBvc2l0b3J5RmlsbGVyLkVuYWJsZT1mYWxzZQotUmVwb3NpdG9yeUZpbGxlci5FbmFibGU9dHJ1ZQotICAjIFR5cGUgaWQgb2YgZG9jdW1lbnRzIHRoYXQgYXJlIGNyZWF0ZWQKLVJlcG9zaXRvcnlGaWxsZXIuRG9jdW1lbnRUeXBlSWQ9Q29tcGxleFR5cGUKLSAgIyBUeXBlIGlkIG9mIGZvbGRlcnMgdGhhdCBhcmUgY3JlYXRlZAotUmVwb3NpdG9yeUZpbGxlci5Gb2xkZXJUeXBlSWQ9Y21pczpmb2xkZXIKLSAgIyBOdW1iZXIgb2YgZG9jdW1lbnRzIGNyZWF0ZWQgcGVyIGZvbGRlcgotUmVwb3NpdG9yeUZpbGxlci5Eb2NzUGVyRm9sZGVyPTMKLSAgIyBOdW1iZXIgb2YgZm9sZGVycyBjcmVhdGVkIHBlciBmb2xkZXIKLVJlcG9zaXRvcnlGaWxsZXIuRm9sZGVyUGVyRm9sZGVyPTIKLSAgIyBudW1iZXIgb2YgZm9sZGVyIGxldmVscyBjcmVhdGVkIChkZXB0aCBvZiBoaWVyYXJjaHkpCi1SZXBvc2l0b3J5RmlsbGVyLkRlcHRoPTMKLSAgIyBTaXplIG9mIGNvbnRlbnQgZm9yIGRvY3VtZW50cyAoMD1kbyBub3QgY3JlYXRlIGNvbnRlbnQpLCBkZWZhdWx0PTAKLVJlcG9zaXRvcnlGaWxsZXIuQ29udGVudFNpemVJbktCPTMyCi0gICMgcHJvcGVydGllcyB0byBzZXQgZm9yIGEgZG9jdW1lbnQKLVJlcG9zaXRvcnlGaWxsZXIuRG9jdW1lbnRQcm9wZXJ0eS4wPVN0cmluZ1Byb3AKLSNSZXBvc2l0b3J5RmlsbGVyLkRvY3VtZW50UHJvcGVydHkuMT1TdHJpbmdQcm9wTVYKLSAgIyBwcm9wZXJ0aWVzIHRvIHNldCBmb3IgYSBmb2xkZXIKLSNSZXBvc2l0b3J5RmlsbGVyLkZvbGRlclByb3BlcnR5LjA9U3RyaW5nRm9sZGVyUHJvcAotIyBJbk1lbW9yeVNlcnZlci5NYXhDb250ZW50U2l6ZUtCPTQwOTYKLSMgSW5NZW1vcnlTZXJ2ZXIuQ2xlYW5JbnRlcnZhbE1pbnV0ZXM9MjQwCi1SZXBvc2l0b3J5RmlsbGVyLkNvbnRlbnRLaW5kPWxvcmVtL3RleHQKLSMgUmVwb3NpdG9yeUZpbGxlci5Db250ZW50S2luZD1sb3JlbS9odG1sCi0jIFJlcG9zaXRvcnlGaWxsZXIuQ29udGVudEtpbmQ9c3RhdGljL3RleHQKLSMgUmVwb3NpdG9yeUZpbGxlci5Db250ZW50S2luZD1mcmFjdGFsL2pwZWcKLSMgc2xvdyEhIAotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMGExODYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotPCEtLSANCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS0tPg0KLTwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiDQotICAgIHBhZ2VFbmNvZGluZz0iSVNPLTg4NTktMSIlPg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkRhdGUsIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0LCBqYXZhLnV0aWwuTG9jYWxlLCBqYXZhLnV0aWwuQ2FsZW5kYXIiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlTWFuYWdlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuRHVtbXlDYWxsQ29udGV4dCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlRmFjdG9yeSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNtaXNTZXJ2aWNlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkluTWVtb3J5U2VydmljZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LkNvbmZpZ0NvbnN0YW50cyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LkNvbmZpZ3VyYXRpb25TZXR0aW5ncyIgJT4NCi0NCi08JSENCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5DTUlTX1ZFUlNJT047DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBQYWNrYWdlIHAgPSBQYWNrYWdlLmdldFBhY2thZ2UoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5Iik7DQotICAgICAgICBpZiAocCA9PSBudWxsKSB7DQotICAgICAgICAgICAgT1BFTkNNSVNfVkVSU0lPTiA9ICIodW5vZmZpY2lhbCBkZXYgb3Igc25hcHNob3QgYnVpbGQpIjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgU3RyaW5nIHZlciA9IHAuZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCk7DQotICAgICAgICAgICAgT1BFTkNNSVNfVkVSU0lPTiA9IChudWxsID09IHZlciA/ICIodW5vZmZpY2lhbCBkZXYgb3Igc25hcHNob3QgYnVpbGQpIiA6IHZlcik7DQotICAgICAgICB9DQotICAgIH0NCi0lPg0KLTxodG1sPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPg0KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNzcy9vcGVuY21pcy5jc3MiLz4NCi08dGl0bGU+QXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUy1Jbk1lbW9yeSBTZXJ2ZXI8L3RpdGxlPg0KLQ0KLTwlIQ0KLQlwcml2YXRlIFN0b3JlTWFuYWdlciBnZXRTdG9yZU1hbmFnZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsNCi0JICAgIENhbGxDb250ZXh0IGNvbnRleHQgPSBuZXcgRHVtbXlDYWxsQ29udGV4dCgpOw0KLQkgICAgQ21pc1NlcnZpY2VGYWN0b3J5IHNlcnZpY2VzRmFjdG9yeSA9IChDbWlzU2VydmljZUZhY3RvcnkpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKA0KLQkgICAgICAgICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2aWNlc2ZhY3RvcnkiKTsNCi0JICAgIC8vIEFic3RyYWN0U2VydmljZUZhY3RvcnkgZmFjdG9yeSA9IChBYnN0cmFjdFNlcnZpY2VGYWN0b3J5KQ0KLQkgICAgQ21pc1NlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzRmFjdG9yeS5nZXRTZXJ2aWNlKGNvbnRleHQpOw0KLQkgICAgaWYgKCEoc2VydmljZSBpbnN0YW5jZW9mIEluTWVtb3J5U2VydmljZSkpDQotCSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbGxlZ2FsIGNvbmZpZ3VyYXRpb24sIHNlcnZpY2UgbXVzdCBiZSBvZiB0eXBlIEluTWVtb3J5U2VydmljZS4iKTsNCi0JICAgIHJldHVybiAgKChJbk1lbW9yeVNlcnZpY2UpIHNlcnZpY2UpLmdldFN0b3JlTWFuYWdlcigpOw0KLQl9DQotJT4NCi0NCi08L2hlYWQ+DQotPGJvZHk+DQotPGltZyBhbHQ9IkFwYWNoZSBDaGVtaXN0cnkgTG9nbyIgdGl0bGU9IkFwYWNoZSBDaGVtaXN0cnkgTG9nbyIgc3JjPSJpbWFnZXMvY2hlbWlzdHJ5X2xvZ29fc21hbGwucG5nIi8+DQotPGltZyBhbGlnbj0icmlnaHQiIGFsdD0iUG93ZXJlZCBieSBBcGFjaGUiIHNyYz0iaW1hZ2VzL3BiLWNoZW1pc3RyeS0xNTB4MTUwLmpwZyIvPg0KLTxoMT5PcGVuQ01JUyBJbk1lbW9yeSBTZXJ2ZXI8L2gxPg0KLTxwPiBZb3VyIHNlcnZlciBpcyB1cCBhbmQgcnVubmluZy48L3A+DQotPHA+DQotCVRoZSBPcGVuQ01JUyBJbk1lbW9yeSBTZXJ2ZXIgaXMgYSBDTUlTIHNlcnZlciBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3QgcHVycG9zZXMuDQotCUFsbCBvYmplY3RzIGFyZSBob2xkIGluIG1lbW9yeSBhbmQgd2lsbCBiZSBsb3N0IGFmdGVyIHNodXRkb3duLg0KLTwvcD4NCi08cD4NCi0JWW91IGhhdmUgdG8gdXNlIGEgQ01JUyBjbGllbnQgdG8gdXNlIHRoaXMgYXBwbGljYXRpb24uIEFuIGV4YW1wbGUgZm9yDQotCXN1Y2ggYSBjbGllbnQgaXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9qYXZhL2RldmVsb3BpbmcvdG9vbHMvZGV2LXRvb2xzLXdvcmtiZW5jaC5odG1sIj4gQ01JUyBXb3JrYmVuY2guPC9hPg0KLTwvcD4NCi08dGFibGU+DQotPHRyPjx0aD5TZXJ2ZXItTmFtZTwvdGg+PHRkPkFwYWNoZS1DaGVtaXN0cnktT3BlbkNNSVMtSW5NZW1vcnk8L3RkPjwvdHI+DQotPHRyPg0KLSAgPHRoPlZlcnNpb248L3RoPg0KLSAgPHRkPg0KLTwlIA0KLSAgICAgICBvdXQucHJpbnRsbihPUEVOQ01JU19WRVJTSU9OKTsNCi0lPg0KLSAgPC90ZD4NCi08L3RyPg0KLTwvdGFibGU+DQotDQotPGgyPkFjY2VzcyBJbmZvcm1hdGlvbjwvaDI+DQotPGgzPkNNSVMgMS4xPC9oMz4NCi08cD4NCi1XUyAoU09BUCkgQmluZGluZzogPGEgaHJlZj0ic2VydmljZXMxMS9jbWlzP3dzZGwiPg0KLTwlIA0KLVN0cmluZyByZXFTdHIgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOw0KLW91dC5wcmludGxuKHJlcVN0ci5zdWJzdHJpbmcoMCwgcmVxU3RyLmxhc3RJbmRleE9mKCcvJykrMSkgKyAic2VydmljZXMxMS9jbWlzP3dzZGwiKTsNCi0lPg0KLTwvYT4NCi08L3A+DQotPHA+DQotQXRvbVB1YiBCaW5kaW5nOiA8YSBocmVmPSJhdG9tMTEiPiANCi08JSANCi1yZXFTdHIgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpOw0KLW91dC5wcmludGxuKHJlcVN0ci5zdWJzdHJpbmcoMCwgcmVxU3RyLmxhc3RJbmRleE9mKCcvJykrMSkgKyAiYXRvbTExIik7DQotJT4NCi08L2E+DQotPC9wPg0KLTxwPg0KLUJyb3dzZXIgQmluZGluZzogPGEgaHJlZj0iYnJvd3NlciI+IA0KLTwlIA0KLW91dC5wcmludGxuKHJlcVN0ci5zdWJzdHJpbmcoMCwgcmVxU3RyLmxhc3RJbmRleE9mKCcvJykrMSkgKyAiYnJvd3NlciIpOw0KLSU+DQotPC9hPg0KLTwvcD4NCi08aDM+Q01JUyAxLjA8L2gzPg0KLTxwPg0KLVdTIChTT0FQKSBCaW5kaW5nOiA8YSBocmVmPSJzZXJ2aWNlcy9jbWlzP3dzZGwiPg0KLTwlIA0KLXJlcVN0ciA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7DQotb3V0LnByaW50bG4ocmVxU3RyLnN1YnN0cmluZygwLCByZXFTdHIubGFzdEluZGV4T2YoJy8nKSsxKSArICJzZXJ2aWNlcy9jbWlzP3dzZGwiKTsNCi0lPg0KLTwvYT4NCi08L3A+DQotPHA+DQotQXRvbVB1YiBCaW5kaW5nOiA8YSBocmVmPSJhdG9tIj4gDQotPCUgDQotcmVxU3RyID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsNCi1vdXQucHJpbnRsbihyZXFTdHIuc3Vic3RyaW5nKDAsIHJlcVN0ci5sYXN0SW5kZXhPZignLycpKzEpICsgImF0b20iKTsNCi0lPg0KLTwvYT4NCi08L3A+DQotPHA+DQotPGgzPkF1dGhlbnRpY2F0aW9uPC9oMz4NCi08cD4NCi1CYXNpYyBBdXRoZW50aWNhdGlvbiAodXNlciBuYW1lIGFuZCBwYXNzd29yZCBhcmUgYXJiaXRyYXJ5KTxicj4NCi1Ob3RlOiBBdXRoZW50aWNhdGlvbiBpcyBvcHRpb25hbCBhbmQgb25seSBpbmZvcm1hdGlvbmFsLiBVc2VyIG5hbWVzIGFyZSBzdG9yZWQgDQotaW4gcHJvcGVydGllcyAoY3JlYXRlZEJ5LCBldGMuKSwgcGFzc3dvcmQgaXMgbm90IHJlcXVpcmVkLiBUaGUgc2VydmVyIGRvZXMgDQotbm90IHBlcmZvcm0gYW55IGtpbmQgb2Ygc2VjdXJlIGF1dGhlbnRpY2F0aW9uLg0KLTwvcD4NCi0NCi08aDI+V2ViIEludGVyZmFjZTwvaDI+DQotPHA+DQotVGhlIDxhIGhyZWY9IndlYiI+T3BlbkNNSVMgd2ViIGludGVyZmFjZTwvYT4gaXMgc2ltcGxlIHdlYiBpbnRlcmZhY2UgdG8gYWNjZXNzDQotdGhlIHJlcG9zaXRvcnkuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHVzdWFsIHdheSB0byBhY2Nlc3MgdGhlIHJlcG9zaXRvcnkuDQotVXN1YWxseSB5b3Ugd2lsbCB1c2UgYSBjbGllbnQgYXBwbGljYXRpb24gc3VwcG9ydGluZyB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uIGxpa2UNCi10aGUgQ01JUyB3b3JrYmVuY2guDQotPC9wPg0KLQ0KLTxoMj5OT1RJQ0U8L2gyPg0KLTxwPg0KLVRoaXMgaXMgYW4gdW5zdXBwb3J0ZWQgYW5kIGV4cGVyaW1lbnRhbCBzZXJ2aWNlLiBBbnkgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suDQotPC9wPg0KLTxwPg0KLVRoaXMgc2VydmljZSBpcyBwcm92aWRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyANCi1PRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBsaWNlbnNlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLg0KLTwvcD4NCi0NCi08aDI+TW9uaXRvcjwvaDI+DQotPHA+DQotICBDdXJyZW50IHN0YXRlIG9mIHRoZSBzZXJ2ZXI6DQotPC9wPg0KLQ0KLTx0YWJsZT4NCi08dHI+IDx0aD4gUmVwb3NpdG9yeSBJZCA8L3RoPiA8dGg+IE5vLiBvZiBvYmplY3RzPC90aD48L3RyPg0KLTwlIA0KLSAgIFN0b3JlTWFuYWdlciBzbSA9IGdldFN0b3JlTWFuYWdlcihyZXF1ZXN0KTsNCi0gICBmb3IgKFN0cmluZyByZXBJZDogc20uZ2V0QWxsUmVwb3NpdG9yeUlkcygpICkgew0KLSAgICAgICBvdXQucHJpbnRsbigiPHRkPiIgKyByZXBJZCArICI8L3RkPiIpOw0KLSAgICAgICBvdXQucHJpbnRsbigiPHRkPiIgKyBzbS5nZXRPYmplY3RTdG9yZShyZXBJZCkuZ2V0T2JqZWN0Q291bnQoKSArICI8L3RkPiIpOw0KLSAgIH0gICAgICAgDQotJT4NCi08L3RhYmxlPg0KLTxwPiZuYnNwOzwvcD4NCi08dGFibGU+DQotPHRyPiA8dGg+IEphdmEgVk0gPC90aD4gPHRoPlNpemU8L3RoPjwvdHI+DQotPCUgDQotICAgUnVudGltZSBydW50aW1lID0gUnVudGltZS5nZXRSdW50aW1lICgpOyAgIA0KLSAgIGxvbmcgbWIgPSAxMDQ4NTc2Ow0KLSAgIGxvbmcgdmFsdWU7DQotICAgdmFsdWUgPSBydW50aW1lLnRvdGFsTWVtb3J5ICgpOw0KLSAgIHZhbHVlID0gKHZhbHVlICsgbWIvMikgLyBtYjsgDQotICAgb3V0LnByaW50bG4oIjx0cj48dGQ+IFVzZWQgTWVtb3J5IDwvdGQ+Iik7DQotICAgb3V0LnByaW50bG4oIjx0ZD4iICsgIHZhbHVlICsgIk1CPC90ZD48L3RyPiIpOw0KLSAgIHZhbHVlID0gcnVudGltZS5tYXhNZW1vcnkgKCk7DQotICAgdmFsdWUgPSAodmFsdWUgKyBtYi8yKSAvIG1iOyANCi0gICBvdXQucHJpbnRsbigiPHRyPjx0ZD4gTWF4IE1lbW9yeSA8L3RkPiIpOw0KLSAgIG91dC5wcmludGxuKCI8dGQ+IiArIHZhbHVlICsgIk1CPC90ZD48L3RyPiIpOw0KLSAgIHZhbHVlID0gcnVudGltZS5mcmVlTWVtb3J5ICgpOw0KLSAgIHZhbHVlID0gKHZhbHVlICsgbWIvMikgLyBtYjsgDQotICAgb3V0LnByaW50bG4oIjx0cj48dGQ+IEZyZWUgTWVtb3J5IDwvdGQ+Iik7DQotICAgb3V0LnByaW50bG4oIjx0ZD4iICsgdmFsdWUgKyAiTUI8L3RkPiIpOw0KLSAgIG91dC5wcmludGxuKCI8dHI+PHRkPiBQcm9jZXNzb3JzIDwvdGQ+Iik7DQotICAgb3V0LnByaW50bG4oIjx0ZD4iICsgcnVudGltZS5hdmFpbGFibGVQcm9jZXNzb3JzKCkgKyAiPC90ZD48L3RyPiIpOw0KLSU+DQotPC90YWJsZT4NCi0NCi08aDI+Q29uZmlndXJhdGlvbjwvaDI+DQotPHA+DQotICBJbXBvcnRhbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncw0KLTwvcD4NCi0NCi08dGFibGU+DQotPHRyPiA8dGg+IFNldHRpbmcgPC90aD4gPHRoPiBWYWx1ZTwvdGg+PC90cj4NCi08dHI+DQotCTx0ZD5NYXguIGFsbG93ZWQgY29udGVudCBzaXplIDwvdGQ+DQotCTwlIA0KLQkgIFN0cmluZyBtYXhTaXplID0gQ29uZmlndXJhdGlvblNldHRpbmdzLmdldENvbmZpZ3VyYXRpb25WYWx1ZUFzU3RyaW5nKENvbmZpZ0NvbnN0YW50cy5NQVhfQ09OVEVOVF9TSVpFX0tCKTsNCi0JICBpZiAobnVsbCA9PSBtYXhTaXplKQ0KLQkgICAgICBtYXhTaXplID0gInVubGltaXRlZCI7DQotCSAgZWxzZQ0KLQkJbWF4U2l6ZSArPSAiS0IiOw0KLQkgIG91dC5wcmludGxuKCI8dGQ+IiArIG1heFNpemUgKyAiPC90ZD4iKTsNCi0JJT4NCi08L3RyPg0KLTx0cj4NCi0JPHRkPkF1dG8gY2xlYW4gZXZlcnk8L3RkPg0KLQk8JSANCi0JICBTdHJpbmcgY2xlYW5JbnRlclZhbFN0ciA9IENvbmZpZ3VyYXRpb25TZXR0aW5ncy5nZXRDb25maWd1cmF0aW9uVmFsdWVBc1N0cmluZyhDb25maWdDb25zdGFudHMuQ0xFQU5fUkVQT1NJVE9SWV9JTlRFUlZBTCk7DQotCSAgaWYgKG51bGwgPT0gY2xlYW5JbnRlclZhbFN0cikNCi0JICAgICAgb3V0LnByaW50bG4oIjx0ZD4gLSA8L3RkPiIpOw0KLQkgIGVsc2UNCi0JICAJb3V0LnByaW50bG4oIjx0ZD4iICsgY2xlYW5JbnRlclZhbFN0ciArICIgbWludXRlcyA8L3RkPiIpOw0KLQklPg0KLTwvdHI+DQotPHRyPg0KLQk8dGQ+VGltZSBvZiBkZXBsb3ltZW50PC90ZD4NCi0JPCUgDQotCSAgb3V0LnByaW50bG4oIjx0ZD4iICsgQ29uZmlndXJhdGlvblNldHRpbmdzLmdldENvbmZpZ3VyYXRpb25WYWx1ZUFzU3RyaW5nKENvbmZpZ0NvbnN0YW50cy5ERVBMT1lNRU5UX1RJTUUpICsgIjwvdGQ+Iik7DQotCSU+DQotPC90cj4NCi08dHI+DQotCTx0ZD5OZXh0IGNsZWFudXA8L3RkPg0KLQk8JSANCi0JICBTdHJpbmcgZGF0ZVN0cjsNCi0JICBMb25nIGludGVydmFsID0gQ29uZmlndXJhdGlvblNldHRpbmdzLmdldENvbmZpZ3VyYXRpb25WYWx1ZUFzTG9uZyhDb25maWdDb25zdGFudHMuQ0xFQU5fUkVQT1NJVE9SWV9JTlRFUlZBTCk7DQotCSAgbG9uZyBkaWZmID0gMDsNCi0JICANCi0JICBpZiAobnVsbCA9PSBpbnRlcnZhbCkNCi0JICAgICAgZGF0ZVN0ciA9ICJOZXZlciI7DQotCSAgZWxzZSB7DQotCQkgIHRyeSB7DQotCQkgICAgICBEYXRlIG5vdyA9IG5ldyBEYXRlKCk7DQotCQkgICAgICBDYWxlbmRhciBjYWxOb3cgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOw0KLQkJICAgICAgQ2FsZW5kYXIgY2FsTmV4dENsZWFuID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsNCi0JCSAgICAgIGNhbE5vdy5zZXRUaW1lKG5vdyk7DQotCQkJICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdHRlciA7IA0KLQkJICAgICAgRGF0ZSBkZXBsb3k7DQotCQkgICAgICBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFIE1NTSBkZCBoaDptbTpzcyBhIHogeXl5eSIsIExvY2FsZS5VUyk7DQotCQkgICAgICBkZXBsb3kgPSBmb3JtYXR0ZXIucGFyc2UoQ29uZmlndXJhdGlvblNldHRpbmdzLmdldENvbmZpZ3VyYXRpb25WYWx1ZUFzU3RyaW5nKENvbmZpZ0NvbnN0YW50cy5ERVBMT1lNRU5UX1RJTUUpKTsNCi0JCSAgICAgIGNhbE5leHRDbGVhbi5zZXRUaW1lKGRlcGxveSk7DQotCQkgICAgICB3aGlsZSAoY2FsTmV4dENsZWFuLmJlZm9yZShjYWxOb3cpKQ0KLQkJICAgICAgICAgIGNhbE5leHRDbGVhbi5hZGQoQ2FsZW5kYXIuTUlOVVRFLCBpbnRlcnZhbC5pbnRWYWx1ZSgpKTsNCi0JCSAgICAgIGRhdGVTdHIgPSBmb3JtYXR0ZXIuZm9ybWF0KGNhbE5leHRDbGVhbi5nZXRUaW1lKCkpOw0KLQkJICAgICAgZGlmZiA9IGNhbE5leHRDbGVhbi5nZXRUaW1lSW5NaWxsaXMoKSAtIGNhbE5vdy5nZXRUaW1lSW5NaWxsaXMoKTsNCi0JCSAgICAgIA0KLQkJICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJICAgICAgZGF0ZVN0ciA9IGUuZ2V0TWVzc2FnZSgpOw0KLQkJICB9DQotCSAgfQ0KLQkgIGlmIChkaWZmID4gMCkNCi0JICAgICAgZGF0ZVN0ciArPSAiIChpbiAiICsgZGlmZiAvIDYwMDAwICsgIm1pbiwgIiArICgoZGlmZiAvIDEwMDApICUgNjApICsgInMpIjsNCi0JICANCi0JICAvLyBEYXRlIGRlcGxveSA9IG5ldyBEYXRlKERhdGUucGFyc2UoKTsNCi0JICBvdXQucHJpbnRsbigiPHRkPiIgKyBkYXRlU3RyICsgIjwvdGQ+Iik7DQotCSU+DQotPC90cj4NCi08L3RhYmxlPg0KLQ0KLTxoMj5Nb3JlIEluZm9ybWF0aW9uPC9oMj4NCi08cD4NCi08YSBocmVmPSJodHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmciPiBBcGFjaGUgQ2hlbWlzdHJ5IHdlYiBzaXRlPC9hPg0KLTwvcD4NCi08cD4NCi08YSBocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvY21pcyI+IENNSVMgcGFnZSBhdCBPQVNJUzwvYT4NCi08L3A+DQotDQotDQotPGhyLz4NCi08aDI+TGljZW5zZSBJbmZvcm1hdGlvbjwvaDI+DQotVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgDQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPiBBcGFjaGUgMi4wIExpY2Vuc2UgPC9hPg0KLTxici8+DQotDQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIj4NCi0gIDxpbWcgYWx0PSJBU0YgTG9nbyIgdGl0bGU9IkFTRiBMb2dvIiBzcmM9ImltYWdlcy9hc2ZfbG9nby5wbmciIGFsaWduPSJyaWdodCIvPg0KLTwvYT4NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0Fic3RyYWN0U2VydmljZVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0Fic3RyYWN0U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhNGMyZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9BYnN0cmFjdFNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5DbWlzQmluZGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlNlc3Npb25QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQmluZGluZ3NPYmplY3RGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BY2xTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLk11bHRpRmlsaW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5PYmplY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlBvbGljeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVsYXRpb25zaGlwU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuSW5NZW1vcnlTZXJ2aWNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGwuQ29udGVudFN0cmVhbURhdGFJbXBsOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlcnZpY2VUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYnN0cmFjdFNlcnZpY2VUZXN0LmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAiVW5pdFRlc3RSZXBvc2l0b3J5IjsKLSAgICBwcm90ZWN0ZWQgQmluZGluZ3NPYmplY3RGYWN0b3J5IGZGYWN0b3J5ID0gbmV3IEJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGwoKTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZSb290Rm9sZGVySWQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBmUmVwb3NpdG9yeUlkOwotICAgIHByb3RlY3RlZCBPYmplY3RTZXJ2aWNlIGZPYmpTdmM7Ci0gICAgcHJvdGVjdGVkIE5hdmlnYXRpb25TZXJ2aWNlIGZOYXZTdmM7Ci0gICAgcHJvdGVjdGVkIFJlcG9zaXRvcnlTZXJ2aWNlIGZSZXBTdmM7Ci0gICAgcHJvdGVjdGVkIFZlcnNpb25pbmdTZXJ2aWNlIGZWZXJTdmM7Ci0gICAgcHJvdGVjdGVkIE11bHRpRmlsaW5nU2VydmljZSBmTXVsdGlTdmM7Ci0gICAgcHJvdGVjdGVkIERpc2NvdmVyeVNlcnZpY2UgZkRpc2NTdmM7Ci0gICAgcHJvdGVjdGVkIEFjbFNlcnZpY2UgZkFjbFN2YzsKLSAgICBwcm90ZWN0ZWQgUmVsYXRpb25zaGlwU2VydmljZSBmUmVsU3ZjOwotICAgIHByb3RlY3RlZCBQb2xpY3lTZXJ2aWNlIGZQb2xTdmM7Ci0KLSAgICBwcm90ZWN0ZWQgQ2FsbENvbnRleHQgZlRlc3RDYWxsQ29udGV4dDsKLSAgICBwcml2YXRlIFN0cmluZyBmVHlwZUNyZWF0b3JDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBDbWlzQmluZGluZyBiaW5kaW5nOwotCi0gICAgcHVibGljIEFic3RyYWN0U2VydmljZVRlc3QoKSB7Ci0gICAgICAgIC8vIFRoZSBpbi1tZW1vcnkgc2VydmVyIHVuaXQgdGVzdHMgY2FuIGVpdGhlciBiZSBydW4gZGlyZWN0bHkgYWdhaW5zdAotICAgICAgICAvLyB0aGUKLSAgICAgICAgLy8gc2VydmljZSBpbXBsZW1lbnRhdGlvbiBvciBhZ2FpbnN0IGEgY2xvY2FsIGJpbmRpbmcgaW50ZXJmYWNlLiBUaGUKLSAgICAgICAgLy8gbG9jYWwKLSAgICAgICAgLy8gYmluZGluZyBpbnRlcmZhY2VzIG9mZmVycyBzb21lIGJlbmVmaXRzIGxpa2UgdHlwZSBzeXN0ZW0gY2FjaGluZyBldGMuCi0gICAgICAgIC8vIFRoZSBkZWZhdWx0IGlzIHVzaW5nIHRoZSBkaXJlY3QgaW1wbGVtZW50YXRpb24uIFN1YmNsYXNzZXMgbWF5Ci0gICAgICAgIC8vIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IuCi0KLSAgICAgICAgLy8gSW5pdCB3aXRoIGRlZmF1bHQgdHlwZXMsIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXM6Ci0gICAgICAgIGZUeXBlQ3JlYXRvckNsYXNzTmFtZSA9IFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8vIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gdXNlIHRoZWlyIG93biB0eXBlcwotICAgIHByb3RlY3RlZCB2b2lkIHNldFR5cGVDcmVhdG9yQ2xhc3MoU3RyaW5nIHR5cGVDcmVhdG9yQ2xhc3NOYW1lKSB7Ci0gICAgICAgIGZUeXBlQ3JlYXRvckNsYXNzTmFtZSA9IHR5cGVDcmVhdG9yQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUNyZWF0b3JDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGZUeXBlQ3JlYXRvckNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJJbml0aWFsaXppbmcgSW5NZW1vcnkgVGVzdCB3aXRoIHR5cGUgY3JlYXRvciBjbGFzczogIiArIGZUeXBlQ3JlYXRvckNsYXNzTmFtZSk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIC8vIGF0dGFjaCByZXBvc2l0b3J5IGluZm8gdG8gdGhlIHNlc3Npb246Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbmZpZ0NvbnN0YW50cy5UWVBFX0NSRUFUT1JfQ0xBU1MsIGZUeXBlQ3JlYXRvckNsYXNzTmFtZSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbmZpZ0NvbnN0YW50cy5SRVBPU0lUT1JZX0lELCBSRVBPU0lUT1JZX0lEKTsKLQotICAgICAgICAvLyBnaXZlIHN1YmNsYXNzZXMgYSBjaGFuY2UgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNwZWNpYWwKLSAgICAgICAgLy8gdGVzdHMKLSAgICAgICAgYWRkUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKLQotICAgICAgICBmVGVzdENhbGxDb250ZXh0ID0gbmV3IER1bW15Q2FsbENvbnRleHQoKTsKLSAgICAgICAgLy8gQXR0YWNoIGEgc3RhbmRhcmQgQ2FsbENvbnRleHQgdG8gYSB0aHJlYWQgYmVmb3JlIHRoZSBzZXJ2aWNlcyBhcmUKLSAgICAgICAgLy8gaW5pdGlhbGl6ZWQuCi0gICAgICAgIC8vIFJ1bnRpbWVDb250ZXh0LmF0dGFjaENmZyhmVGVzdENhbGxDb250ZXh0KTsKLQotICAgICAgICBpbml0aWFsaXplVXNpbmdMb2NhbEJpbmRpbmcocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmUmVwU3ZjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmT2JqU3ZjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmTmF2U3ZjKTsKLQotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXAgPSBmUmVwU3ZjLmdldFJlcG9zaXRvcnlJbmZvKFJFUE9TSVRPUllfSUQsIG51bGwpOwotICAgICAgICBmUm9vdEZvbGRlcklkID0gcmVwLmdldFJvb3RGb2xkZXJJZCgpOwotICAgICAgICBmUmVwb3NpdG9yeUlkID0gcmVwLmdldElkKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmUmVwb3NpdG9yeUlkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmUm9vdEZvbGRlcklkKTsKLSAgICB9Ci0KLSAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzIGlmIHlvdSB3YW50IHRvIHByb3ZpZGUgYWRkaXRpb25hbAotICAgIC8vIGNvbmZpZ3VyYXRpb24KLSAgICAvLyBwYXJhbWV0ZXJzLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5Ci0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1ldGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJDbG9zZSBsb2NhbCBiaW5kaW5nLiIpOwotICAgICAgICBiaW5kaW5nLmNsb3NlKCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiTG9jYWwgYmluZGluZyBjbG9zZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER1bW15KCkgewotICAgICAgICAvLyBkdW1teSB0ZXN0IHRvIG1ha2UgdG9vbHMgaGFwcHkgdGhhdCBjb21wbGFpbiBpZiB0aGVyZSBhcmUgbm8gdGVzdHMKLSAgICAgICAgLy8gYXZhaWxhYmxlIGluIGEgdGVzdCBjbGFzcwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlRm9sZGVyKFN0cmluZyBmb2xkZXJOYW1lLCBTdHJpbmcgcGFyZW50Rm9sZGVySWQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlkID0gY3JlYXRlRm9sZGVyTm9DYXRjaChmb2xkZXJOYW1lLCBwYXJlbnRGb2xkZXJJZCwgdHlwZUlkKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGlkKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRm9sZGVyIGZhaWxlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0ZUZvbGRlcigpIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUZvbGRlck5vQ2F0Y2goU3RyaW5nIGZvbGRlck5hbWUsIFN0cmluZyBwYXJlbnRGb2xkZXJJZCwgU3RyaW5nIHR5cGVJZCkgewotICAgICAgICByZXR1cm4gY3JlYXRlRm9sZGVyTm9DYXRjaChmb2xkZXJOYW1lLCBwYXJlbnRGb2xkZXJJZCwgdHlwZUlkLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUZvbGRlck5vQ2F0Y2goU3RyaW5nIGZvbGRlck5hbWUsIFN0cmluZyBwYXJlbnRGb2xkZXJJZCwgU3RyaW5nIHR5cGVJZCwgQWNsIGFkZEFDRXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQUNFcykgewotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gY3JlYXRlRm9sZGVyUHJvcGVydGllcyhmb2xkZXJOYW1lLCB0eXBlSWQpOwotICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZUZvbGRlcihmUmVwb3NpdG9yeUlkLCBwcm9wcywgcGFyZW50Rm9sZGVySWQsIG51bGwsIGFkZEFDRXMsIHJlbW92ZUFDRXMsIG51bGwpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVEb2N1bWVudE5vQ2F0Y2goU3RyaW5nIG5hbWUsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIGJvb2xlYW4gd2l0aENvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURvY3VtZW50Tm9DYXRjaChuYW1lLCBmb2xkZXJJZCwgdHlwZUlkLCB2ZXJzaW9uaW5nU3RhdGUsIHdpdGhDb250ZW50LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURvY3VtZW50Tm9DYXRjaChTdHJpbmcgbmFtZSwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgdHlwZUlkLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgYm9vbGVhbiB3aXRoQ29udGVudCwgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcyA9IG51bGw7Ci0gICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGNyZWF0ZURvY3VtZW50UHJvcGVydGllcyhuYW1lLCB0eXBlSWQpOwotCi0gICAgICAgIGlmICh3aXRoQ29udGVudCkgewotICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IGNyZWF0ZUNvbnRlbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBpZCA9IGZPYmpTdmMuY3JlYXRlRG9jdW1lbnQoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgIGFkZEFDRXMsIHJlbW92ZUFDRXMsIGV4dGVuc2lvbik7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyB0eXBlSWQsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsCi0gICAgICAgICAgICBib29sZWFuIHdpdGhDb250ZW50KSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZCA9IGNyZWF0ZURvY3VtZW50Tm9DYXRjaChuYW1lLCBmb2xkZXJJZCwgdHlwZUlkLCB2ZXJzaW9uaW5nU3RhdGUsIHdpdGhDb250ZW50KTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGlkKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRG9jdW1lbnQgZmFpbGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiY3JlYXRlRG9jdW1lbnQoKSBmYWlsZWQgd2l0aCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgdHlwZUlkLCBib29sZWFuIHdpdGhDb250ZW50KSB7Ci0gICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSBWZXJzaW9uaW5nU3RhdGUuTk9ORTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURvY3VtZW50KG5hbWUsIGZvbGRlcklkLCB0eXBlSWQsIHZlcnNpb25pbmdTdGF0ZSwgd2l0aENvbnRlbnQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIGNyZWF0ZURvY3VtZW50UHJvcGVydGllcyhTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlSWQpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgY3JlYXRlRm9sZGVyUHJvcGVydGllcyhTdHJpbmcgZm9sZGVyTmFtZSwgU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCBmb2xkZXJOYW1lKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlSWQpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudCgpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRlbnQoMzIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb250ZW50U3RyZWFtIGNyZWF0ZUNvbnRlbnQoaW50IHNpemVJbktCKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDb250ZW50KHNpemVJbktCLCAwLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udGVudFN0cmVhbSBjcmVhdGVDb250ZW50KGludCBzaXplSW5LQiwgbG9uZyBtYXhTaXplSW5LQiwgU3RyaW5nIG1pbWVUeXBlKSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW1EYXRhSW1wbCBjb250ZW50ID0gbmV3IENvbnRlbnRTdHJlYW1EYXRhSW1wbChtYXhTaXplSW5LQik7Ci0gICAgICAgIGNvbnRlbnQuc2V0RmlsZU5hbWUoImRhdGEudHh0Iik7Ci0KLSAgICAgICAgaWYgKG51bGwgPT0gbWltZVR5cGUpIHsKLSAgICAgICAgICAgIGNvbnRlbnQuc2V0TWltZVR5cGUoInRleHQvcGxhaW4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRlbnQuc2V0TWltZVR5cGUobWltZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGludCBsZW4gPSBzaXplSW5LQiAqIDEwMjQ7Ci0gICAgICAgIGJ5dGVbXSBiID0geyAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDBjLCAweDBhLAotICAgICAgICAgICAgICAgIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4MGMsIDB4MGEgfTsgLy8gMzIKLSAgICAgICAgaW50IG5vQmxvY2tzID0gbGVuIC8gYi5sZW5ndGg7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShsZW4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub0Jsb2NrczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYmEud3JpdGUoYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZW50LnNldENvbnRlbnQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBmaWxsIGNvbnRlbnQgc3RyZWFtIHdpdGggZGF0YSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZW50OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb250ZW50U3RyZWFtIGNyZWF0ZUNvbnRlbnQoY2hhciBjaCkgewotICAgICAgICBDb250ZW50U3RyZWFtRGF0YUltcGwgY29udGVudCA9IG5ldyBDb250ZW50U3RyZWFtRGF0YUltcGwoMCk7Ci0gICAgICAgIGNvbnRlbnQuc2V0RmlsZU5hbWUoImRhdGEudHh0Iik7Ci0gICAgICAgIGNvbnRlbnQuc2V0TWltZVR5cGUoInRleHQvcGxhaW4iKTsKLSAgICAgICAgaW50IGxlbiA9IDMyICogMTAyNDsKLSAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVszMl07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykgewotICAgICAgICAgICAgYltpXSA9IChieXRlKSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKGNoKTsKLSAgICAgICAgfQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGxlbik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJhLndyaXRlKGIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGVudC5zZXRDb250ZW50KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYS50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gZmlsbCBjb250ZW50IHN0cmVhbSB3aXRoIGRhdGEiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDb250ZW50UmVzdWx0KENvbnRlbnRTdHJlYW0gc2QpIHsKLSAgICAgICAgdmVyaWZ5Q29udGVudFJlc3VsdChzZCwgMzIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUNvbnRlbnRSZXN1bHQoQ29udGVudFN0cmVhbSBzZCwgaW50IHNpemVJbkspIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgc2QuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGF0YS50eHQiLCBzZC5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemVJbksgKiAxMDI0LCBzZC5nZXRCaWdMZW5ndGgoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIGJ5dGVbXSBiYSA9IG5ldyBieXRlWzMyXTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBzZC5nZXRTdHJlYW0oKTsKLSAgICAgICAgaW50IGNvdW50ZXIgPSAwOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKGlzLnJlYWQoYmEpID09IGJhLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICsrY291bnRlcjsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMHg2MSwgYmFbMF0pOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygweDZlLCBiYVsyOV0pOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygweDBjLCBiYVszMF0pOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygweDBhLCBiYVszMV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJyZWFkaW5nIGZyb20gY29udGVudCBzdHJlYW0gZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemVJbksgKiAxMDI0IC8gMzIsIGNvdW50ZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnlQYXRoKFN0cmluZyBpZCwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgT2JqZWN0RGF0YSByZXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzID0gZk9ialN2Yy5nZXRPYmplY3RCeVBhdGgoZlJlcG9zaXRvcnlJZCwgcGF0aCwgIioiLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpZCwgcmVzLmdldElkKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZ2V0T2JqZWN0KCkgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcy5nZXRJZCgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aE9mRm9sZGVyKFN0cmluZyBpZCkgewotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyID0gUHJvcGVydHlJZHMuUEFUSDsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcmVzID0gZk9ialN2Yy5nZXRQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkLCBmaWx0ZXIsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgUHJvcGVydHlEYXRhPFN0cmluZz4gcGQgPSAoUHJvcGVydHlEYXRhPFN0cmluZz4pIHJlcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLlBBVEgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwZCk7Ci0gICAgICAgICAgICBwYXRoID0gcGQuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXRoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImdldFByb3BlcnRpZXMoKSBmYWlsZWQgd2l0aCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhdGhPZkRvY3VtZW50KFN0cmluZyBpZCkgewotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmaWx0ZXIgPSAiKiI7Ci0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcGFyZW50RGF0YSA9IGZOYXZTdmMuZ2V0T2JqZWN0UGFyZW50cyhmUmVwb3NpdG9yeUlkLCBpZCwgZmlsdGVyLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJlbnREYXRhLmdldCgwKS5nZXRSZWxhdGl2ZVBhdGhTZWdtZW50KCk7Ci0gICAgICAgIFByb3BlcnR5RGF0YTxTdHJpbmc+IHBkID0gKFByb3BlcnR5RGF0YTxTdHJpbmc+KSBwYXJlbnREYXRhLmdldCgwKS5nZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5QQVRIKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZCk7Ci0gICAgICAgIHBhdGggPSBwZC5nZXRGaXJzdFZhbHVlKCkgKyAiLyIgKyBuYW1lOwotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0RGF0YSBnZXREb2N1bWVudE9iamVjdERhdGEoU3RyaW5nIGlkKSB7Ci0gICAgICAgIE9iamVjdERhdGEgcmVzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5lZElkID0gbnVsbDsKLSAgICAgICAgICAgIHJlcyA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgcmV0dXJuZWRJZCA9IHJlcy5nZXRJZCgpOwotICAgICAgICAgICAgdGVzdFJldHVybmVkUHJvcGVydGllcyhyZXR1cm5lZElkLCByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIHJldHVybmVkSWQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZ2V0T2JqZWN0KCkgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50KFN0cmluZyBpZCkgewotICAgICAgICBPYmplY3REYXRhIHJlcyA9IGdldERvY3VtZW50T2JqZWN0RGF0YShpZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlcy5nZXRJZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RSZXR1cm5lZFByb3BlcnRpZXMoU3RyaW5nIG9iamVjdElkLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BzKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHBkIDogcHJvcHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygicmV0dXJuIHByb3BlcnR5IGlkOiAiICsgcGQuZ2V0SWQoKSArICIsIHZhbHVlOiAiICsgcGQuZ2V0VmFsdWVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBkID0gcHJvcHMuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqZWN0SWQsIHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIHRoZSBzZXJ2aWNlcyBieSB1c2luZyB0aGUgY2xpZW50IHByb3ZpZGVyIGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycwotICAgICAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBjbGllbnQgcHJvdmlkZXIgaW50ZXJmYWNlIGFuZAotICAgICAqICAgICAgICAgICAgaW4tbWVtb3J5IHByb3ZpZGVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVVzaW5nTG9jYWxCaW5kaW5nKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotCi0gICAgICAgIExPRy5pbmZvKCJJbml0aWFsaXplIHVuaXQgdGVzdCB1c2luZyB0aGUgbG9jYWwgYmluZGluZyBpbnRlcmZhY2UuIik7Ci0KLSAgICAgICAgLy8gYWRkIHBhcmFtZXRlcnMgZm9yIGxvY2FsIGJpbmRpbmc6Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19TUElfQ0xBU1MsIFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxfRkFDVE9SWSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuTE9DQUxfRkFDVE9SWSwgSW5NZW1vcnlTZXJ2aWNlRmFjdG9yeUltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29uZmlnQ29uc3RhbnRzLk9WRVJSSURFX0NBTExfQ09OVEVYVCwgInRydWUiKTsKLSAgICAgICAgSW5NZW1vcnlTZXJ2aWNlRmFjdG9yeUltcGwuc2V0T3ZlcnJpZGVDYWxsQ29udGV4dChmVGVzdENhbGxDb250ZXh0KTsKLQotICAgICAgICAvLyBnZXQgZmFjdG9yeSBhbmQgY3JlYXRlIGJpbmRpbmcKLSAgICAgICAgQ21pc0JpbmRpbmdGYWN0b3J5IGZhY3RvcnkgPSBDbWlzQmluZGluZ0ZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgYmluZGluZyA9IGZhY3RvcnkuY3JlYXRlQ21pc0xvY2FsQmluZGluZyhwYXJhbWV0ZXJzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChiaW5kaW5nKTsKLSAgICAgICAgZkZhY3RvcnkgPSBiaW5kaW5nLmdldE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgZlJlcFN2YyA9IGJpbmRpbmcuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKTsKLSAgICAgICAgZk9ialN2YyA9IGJpbmRpbmcuZ2V0T2JqZWN0U2VydmljZSgpOwotICAgICAgICBmTmF2U3ZjID0gYmluZGluZy5nZXROYXZpZ2F0aW9uU2VydmljZSgpOwotICAgICAgICBmVmVyU3ZjID0gYmluZGluZy5nZXRWZXJzaW9uaW5nU2VydmljZSgpOwotICAgICAgICBmTXVsdGlTdmMgPSBiaW5kaW5nLmdldE11bHRpRmlsaW5nU2VydmljZSgpOwotICAgICAgICBmRGlzY1N2YyA9IGJpbmRpbmcuZ2V0RGlzY292ZXJ5U2VydmljZSgpOwotICAgICAgICBmQWNsU3ZjID0gYmluZGluZy5nZXRBY2xTZXJ2aWNlKCk7Ci0gICAgICAgIGZSZWxTdmMgPSBiaW5kaW5nLmdldFJlbGF0aW9uc2hpcFNlcnZpY2UoKTsKLSAgICAgICAgZlBvbFN2YyA9IGJpbmRpbmcuZ2V0UG9saWN5U2VydmljZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoT2JqZWN0RGF0YSBvYmpEYXRhLCBTdHJpbmcgcHJvcGVydHlLZXkpIHsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8gZXh0ZW5kcyBPYmplY3Q+IHBkID0gb2JqRGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5QQVRIKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZC5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHBkLmdldEZpcnN0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZyk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBwZC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlRG9jdW1lbnQoU3RyaW5nIGRvY0lkKSB7Ci0gICAgICAgIGZPYmpTdmMuZGVsZXRlT2JqZWN0KGZSZXBvc2l0b3J5SWQsIGRvY0lkLCB0cnVlLCBudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0FjbFBlcm1pc3Npb25zVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvQWNsUGVybWlzc2lvbnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMjEzY2QuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvQWNsUGVybWlzc2lvbnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmpheGIuRW51bUJhc2VPYmplY3RUeXBlSWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qYXhiLkVudW1CYXNpY1Blcm1pc3Npb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLkNhbGxDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLk9iamVjdFN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsLkluTWVtb3J5QWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNhbGVuZGFySGVscGVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBY2xQZXJtaXNzaW9uc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBY2xQZXJtaXNzaW9uc1Rlc3QuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVNfT05FID0gQmlnSW50ZWdlci52YWx1ZU9mKC0xTCk7Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0Q3JlYXRvciBmQ3JlYXRvcjsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0U3RvcmUgb2JqZWN0U3RvcmUgPSBudWxsOwotICAgIHByb3RlY3RlZCBMaXN0PEFjZT4gYWRkQUNFcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEFjbCBhZGRBY2wgPSBudWxsOwotICAgIHByb3RlY3RlZCBMaXN0PEFjZT4gc3RhbmRhcmRBQ0VzID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQWNsIHN0YW5kYXJkQWNsID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgTGlzdDxBY2U+IG5vUmVhZEFDRXMgPSBudWxsOwotICAgIHByb3RlY3RlZCBBY2wgbm9SZWFkQWNsID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgTGlzdDxBY2U+IHJlYWRBQ0VzID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQWNsIHJlYWRBY2wgPSBudWxsOwotICAgIHByb3RlY3RlZCBMaXN0PEFjZT4gcmVhZFdyaXRlQUNFcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEFjbCByZWFkV3JpdGVBY2wgPSBudWxsOwotICAgIHByb3RlY3RlZCBMaXN0PEFjZT4gd3JpdGVyUmVhZEFDRXMgPSBudWxsOwotICAgIHByb3RlY3RlZCBBY2wgd3JpdGVyUmVhZEFjbCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIExpc3Q8QWNlPiBhZG1pbkFDRXMgPSBudWxsOwotICAgIHByb3RlY3RlZCBBY2wgYWRtaW5BY2wgPSBudWxsOwotICAgIHByb3RlY3RlZCBMaXN0PEFjZT4gdGVzdFVzZXJBQ0VzID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQWNsIHRlc3RVc2VyQWNsID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgQWNsIGRlZmF1bHRBY2wgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGlkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHN1cGVyLnNldFR5cGVDcmVhdG9yQ2xhc3MoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBmQ3JlYXRvciA9IG5ldyBPYmplY3RDcmVhdG9yKGZGYWN0b3J5LCBmT2JqU3ZjLCBmUmVwb3NpdG9yeUlkKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByaW5jaXBhbElkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKLSAgICAgICAgcHJpbmNpcGFsSWRzLmFkZCgiVGVzdEFkbWluIik7Ci0gICAgICAgIHByaW5jaXBhbElkcy5hZGQoIldyaXRlciIpOwotICAgICAgICBwcmluY2lwYWxJZHMuYWRkKCJSZWFkZXIiKTsKLSAgICAgICAgcHJpbmNpcGFsSWRzLmFkZCgiVGVzdFVzZXIiKTsKLSAgICAgICAgYWRkQUNFcyA9IG5ldyBBcnJheUxpc3Q8QWNlPig0KTsKLSAgICAgICAgYWRkQUNFcy5hZGQoY3JlYXRlQWNlKCJUZXN0QWRtaW4iLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTCkpOwotICAgICAgICBhZGRBQ0VzLmFkZChjcmVhdGVBY2UoIldyaXRlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUpKTsKLSAgICAgICAgYWRkQUNFcy5hZGQoY3JlYXRlQWNlKCJUZXN0VXNlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUpKTsKLSAgICAgICAgYWRkQUNFcy5hZGQoY3JlYXRlQWNlKCJSZWFkZXIiLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1JFQUQpKTsKLSAgICAgICAgYWRkQWNsID0gZkZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbExpc3QoYWRkQUNFcyk7Ci0KLSAgICAgICAgc3RhbmRhcmRBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDMpOwotICAgICAgICBzdGFuZGFyZEFDRXMuYWRkKGNyZWF0ZUFjZSgiVGVzdEFkbWluIiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19BTEwpKTsKLSAgICAgICAgc3RhbmRhcmRBQ0VzLmFkZChjcmVhdGVBY2UoIldyaXRlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUpKTsKLSAgICAgICAgc3RhbmRhcmRBQ0VzLmFkZChjcmVhdGVBY2UoIlJlYWRlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRCkpOwotICAgICAgICBzdGFuZGFyZEFjbCA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KHN0YW5kYXJkQUNFcyk7Ci0KLSAgICAgICAgbm9SZWFkQUNFcyA9IG5ldyBBcnJheUxpc3Q8QWNlPigyKTsKLSAgICAgICAgbm9SZWFkQUNFcy5hZGQoY3JlYXRlQWNlKCJUZXN0QWRtaW4iLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTCkpOwotICAgICAgICBub1JlYWRBQ0VzLmFkZChjcmVhdGVBY2UoIldyaXRlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUpKTsKLSAgICAgICAgbm9SZWFkQWNsID0gZkZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbExpc3Qobm9SZWFkQUNFcyk7Ci0KLSAgICAgICAgcmVhZEFDRXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oMSk7Ci0gICAgICAgIHJlYWRBQ0VzLmFkZChjcmVhdGVBY2UoIlJlYWRlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRCkpOwotICAgICAgICByZWFkQWNsID0gZkZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbExpc3QocmVhZEFDRXMpOwotCi0gICAgICAgIHJlYWRXcml0ZUFDRXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oMik7Ci0gICAgICAgIHJlYWRXcml0ZUFDRXMuYWRkKGNyZWF0ZUFjZSgiUmVhZGVyIiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19SRUFEKSk7Ci0gICAgICAgIHJlYWRXcml0ZUFDRXMuYWRkKGNyZWF0ZUFjZSgiV3JpdGVyIiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19XUklURSkpOwotICAgICAgICByZWFkV3JpdGVBY2wgPSBmRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sTGlzdChyZWFkV3JpdGVBQ0VzKTsKLQotICAgICAgICB0ZXN0VXNlckFDRXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oMSk7Ci0gICAgICAgIHRlc3RVc2VyQUNFcy5hZGQoY3JlYXRlQWNlKCJUZXN0VXNlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUpKTsKLSAgICAgICAgdGVzdFVzZXJBY2wgPSBmRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sTGlzdCh0ZXN0VXNlckFDRXMpOwotCi0gICAgICAgIHdyaXRlclJlYWRBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDEpOwotICAgICAgICB3cml0ZXJSZWFkQUNFcy5hZGQoY3JlYXRlQWNlKCJXcml0ZXIiLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1JFQUQpKTsKLSAgICAgICAgd3JpdGVyUmVhZEFjbCA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KHdyaXRlclJlYWRBQ0VzKTsKLQotICAgICAgICBhZG1pbkFDRXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oMSk7Ci0gICAgICAgIGFkbWluQUNFcy5hZGQoY3JlYXRlQWNlKCJUZXN0QWRtaW4iLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTCkpOwotICAgICAgICBhZG1pbkFjbCA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGFkbWluQUNFcyk7Ci0KLSAgICAgICAgTGlzdDxBY2U+IGRlZmF1bHRBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDEpOwotICAgICAgICBkZWZhdWx0QUNFcy5hZGQoY3JlYXRlQWNlKEluTWVtb3J5QWNlLmdldEFueW9uZVVzZXIoKSwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19BTEwpKTsKLSAgICAgICAgZGVmYXVsdEFjbCA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGRlZmF1bHRBQ0VzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPYmplY3RzV2l0aEFjbCgpIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgZG9jdW1lbnQgd2l0aCBpbml0aWFsIEFDTAotICAgICAgICBTdHJpbmcgZG9jSWQgPSBjcmVhdGVEb2N1bWVudFdpdGhBY2xzKCJjb21wbGV4RG9jdW1lbnQiLCBmUm9vdEZvbGRlcklkLCBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLkNPTVBMRVhfVFlQRSwKLSAgICAgICAgICAgICAgICBhZGRBY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICBBY2wgYWNsMSA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xFcXVhbHMoYWRkQWNsLCBhY2wxKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZm9sZGVyIHdpdGggaW5pdGlhbCBBQ0wKLSAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gY3JlYXRlRm9sZGVyV2l0aEFjbHMoImZvbGRlcldpdGhBY2wiLCBmUm9vdEZvbGRlcklkLCBCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCksIGFkZEFjbCwKLSAgICAgICAgICAgICAgICBkZWZhdWx0QWNsKTsKLSAgICAgICAgQWNsIGFjbDIgPSBmQWNsU3ZjLmdldEFjbChmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsRXF1YWxzKGFkZEFjbCwgYWNsMikpOwotCi0gICAgICAgIC8vIGFkZCBhY2wgbGF0ZXIKLSAgICAgICAgU3RyaW5nIGRvY0lkMiA9IGNyZWF0ZVZlcnNpb25lZERvY3VtZW50KCJjb21wbGV4RG9jdW1lbnQyIiwgZlJvb3RGb2xkZXJJZCk7Ci0gICAgICAgIEFjbCBhY2wgPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGRvY0lkMiwgYWRkQWNsLCBkZWZhdWx0QWNsLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xFcXVhbHMoYWRkQWNsLCBhY2wpKTsKLQotICAgICAgICBTdHJpbmcgZm9sZGVySWQyID0gY3JlYXRlRm9sZGVyKCJmb2xkZXIyIiwgZlJvb3RGb2xkZXJJZCwgImNtaXM6Zm9sZGVyIik7Ci0gICAgICAgIGFjbDIgPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkMiwgYWRkQWNsLCBkZWZhdWx0QWNsLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xFcXVhbHMoYWRkQWNsLCBhY2wyKSk7Ci0KLSAgICAgICAgLy8gYWRkIGEgc3ViZm9sZGVyCi0gICAgICAgIFN0cmluZyBzdWJGb2xkZXJJZCA9IGNyZWF0ZUZvbGRlcigic3ViRm9sZGVyIiwgZm9sZGVySWQsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSk7Ci0gICAgICAgIC8vIGZvbGRlciBzaG91bGQgaW5oZXJpdCBhY2wKLSAgICAgICAgQWNsIHN1YkFjbCA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIHN1YkZvbGRlcklkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xFcXVhbHMoYWRkQWNsLCBzdWJBY2wpKTsKLQotICAgICAgICAvLyBhZGQgYSBkb2N1bWVudAotICAgICAgICBTdHJpbmcgc3ViRG9jSWQgPSBjcmVhdGVWZXJzaW9uZWREb2N1bWVudCgic3ViRG9jIiwgc3ViRm9sZGVySWQpOwotICAgICAgICAvLyBkb2N1bWVudCBzaG91bGQgaW5oZXJpdCBhY2wKLSAgICAgICAgQWNsIHN1YkFjbERvYyA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIHN1YkRvY0lkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xFcXVhbHMoYWRkQWNsLCBzdWJBY2xEb2MpKTsKLQotICAgICAgICAvLyByZW1vdmUgYW4gYWNlLCBubyBwZXJtaXNzaW9uIGlzIGxlZnQgZm9yIFRlc3RVc2VyCi0gICAgICAgIEFjbCByZW1vdmVBY2wgPSBjcmVhdGVBY2woIlRlc3RVc2VyIiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19XUklURSk7Ci0gICAgICAgIEFjbCBhY2wzID0gZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBkb2NJZDIsIG51bGwsIHJlbW92ZUFjbCwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgbnVsbCk7Ci0KLSAgICAgICAgTGlzdDxBY2U+IGNvbXBhcmVSZW1vdmVBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDMpOwotICAgICAgICBjb21wYXJlUmVtb3ZlQUNFcy5hZGQoY3JlYXRlQWNlKCJUZXN0QWRtaW4iLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTCkpOwotICAgICAgICBjb21wYXJlUmVtb3ZlQUNFcy5hZGQoY3JlYXRlQWNlKCJXcml0ZXIiLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFKSk7Ci0gICAgICAgIGNvbXBhcmVSZW1vdmVBQ0VzLmFkZChjcmVhdGVBY2UoIlJlYWRlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRCkpOwotICAgICAgICBBY2wgY29tcGFyZVJlbW92ZUFjbCA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGNvbXBhcmVSZW1vdmVBQ0VzKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGFjbEVxdWFscyhjb21wYXJlUmVtb3ZlQWNsLCBhY2wzKSk7Ci0KLSAgICAgICAgLy8gYWRkQUNFIG5vdCBwcm9wYWdhdGVkCi0gICAgICAgIEFjbCBhZGRQcm9wQWNsID0gY3JlYXRlQWNsKCJUZXN0VXNlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUpOwotCi0gICAgICAgIEFjbCBhY2w0ID0gZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBzdWJGb2xkZXJJZCwgYWRkUHJvcEFjbCwgbnVsbCwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgbnVsbCk7Ci0gICAgICAgIEFjbCBzdWJBY2xEb2MyID0gZkFjbFN2Yy5nZXRBY2woZlJlcG9zaXRvcnlJZCwgc3ViRG9jSWQsIHRydWUsIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbEVxdWFscyhhZGRBY2wsIHN1YkFjbERvYzIpKTsgLy8gYWNsIG9mIGRvYyBkaWQgbm90IGNoYW5nZQotCi0gICAgICAgIExpc3Q8QWNlPiBjb21wYXJlUmVtb3ZlQUNFczIgPSBuZXcgQXJyYXlMaXN0PEFjZT4oNCk7Ci0gICAgICAgIGNvbXBhcmVSZW1vdmVBQ0VzMi5hZGQoY3JlYXRlQWNlKCJUZXN0QWRtaW4iLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTCkpOwotICAgICAgICBjb21wYXJlUmVtb3ZlQUNFczIuYWRkKGNyZWF0ZUFjZSgiV3JpdGVyIiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19XUklURSkpOwotICAgICAgICBjb21wYXJlUmVtb3ZlQUNFczIuYWRkKGNyZWF0ZUFjZSgiVGVzdFVzZXIiLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTCkpOwotICAgICAgICBjb21wYXJlUmVtb3ZlQUNFczIuYWRkKGNyZWF0ZUFjZSgiUmVhZGVyIiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19SRUFEKSk7Ci0gICAgICAgIEFjbCBjb21wYXJlUmVtb3ZlQWNsMiA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGNvbXBhcmVSZW1vdmVBQ0VzMik7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsRXF1YWxzKGNvbXBhcmVSZW1vdmVBY2wyLCBhY2w0KSk7Ci0KLSAgICAgICAgLy8gYWRkQUNFIHByb3BhZ2F0ZWQKLSAgICAgICAgQWNsIGFjbDUgPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIHN1YkZvbGRlcklkLCBhZGRQcm9wQWNsLCBudWxsLCBBY2xQcm9wYWdhdGlvbi5QUk9QQUdBVEUsIG51bGwpOwotICAgICAgICBBY2wgc3ViQWNsRG9jMyA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIHN1YkRvY0lkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xFcXVhbHMoY29tcGFyZVJlbW92ZUFjbDIsIHN1YkFjbERvYzMpKTsgLy8gYWNsIG9mIGRvYyBkaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlCi0gICAgICAgIGFzc2VydFRydWUoYWNsRXF1YWxzKGNvbXBhcmVSZW1vdmVBY2wyLCBhY2w1KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjaGVja05hdmlnYXRpb25TZXJ2aWNlR2VuZXJhbEFjY2VzcygpIHsKLSAgICAgICAgLy8gc3RhcnRzIHdpdGggY2FsbCBjb250ZXh0IFRlc3RVc2VyCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRG9jdW1lbnRXaXRoQWNscygiZG9jIiwgZlJvb3RGb2xkZXJJZCwgIkNvbXBsZXhUeXBlIiwgc3RhbmRhcmRBY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygiZm9sZGVyIiwgZlJvb3RGb2xkZXJJZCwgImNtaXM6Zm9sZGVyIiwgc3RhbmRhcmRBY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICAvLyBmVGVzdENhbGxDb250ZXh0ID0gbmV3IER1bW15Q2FsbENvbnRleHQoIldyaXRlciIpOwotICAgICAgICBTdHJpbmcgc3ViRm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygic3ViRm9sZGVyIiwgZm9sZGVySWQsICJjbWlzOmZvbGRlciIsIHN0YW5kYXJkQWNsLCBudWxsKTsKLQotICAgICAgICAvLyBUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbiBhdCBhbGwKLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgbGlzdCA9IGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBudWxsLCBCaWdJbnRlZ2VyLlpFUk8sIEJpZ0ludGVnZXIuWkVSTywgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJSZWFkZXIiKTsKLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IGxpc3QgPSBmTmF2U3ZjLmdldENoaWxkcmVuKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBudWxsLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBudWxsLCBCaWdJbnRlZ2VyLlpFUk8sIEJpZ0ludGVnZXIuWkVSTywgbnVsbCk7Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gbGlzdDIgPSBmTmF2U3ZjLmdldERlc2NlbmRhbnRzKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBNSU5VU19PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbnMpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiUmVhZGVyIik7Ci0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGxpc3QyID0gZk5hdlN2Yy5nZXREZXNjZW5kYW50cyhmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgTUlOVVNfT05FLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGxpc3QzID0gZk5hdlN2Yy5nZXRGb2xkZXJUcmVlKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBCaWdJbnRlZ2VyLk9ORSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJSZWFkZXIiKTsKLSAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gbGlzdDMgPSBmTmF2U3ZjLmdldEZvbGRlclRyZWUoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIEJpZ0ludGVnZXIuT05FLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gbGlzdDQgPSBmTmF2U3ZjLmdldE9iamVjdFBhcmVudHMoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbnMpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiUmVhZGVyIik7Ci0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gbGlzdDQgPSBmTmF2U3ZjLmdldE9iamVjdFBhcmVudHMoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0RGF0YSBsaXN0NSA9IGZOYXZTdmMuZ2V0Rm9sZGVyUGFyZW50KGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiVGVzdFVzZXIgaGFzIG5vIHBlcm1pc3Npb25zKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlJlYWRlciIpOwotICAgICAgICBPYmplY3REYXRhIGxpc3Q1ID0gZk5hdlN2Yy5nZXRGb2xkZXJQYXJlbnQoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdExpc3QgbGlzdDYgPSBmTmF2U3ZjLmdldENoZWNrZWRPdXREb2NzKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBNSU5VU19PTkUsIE1JTlVTX09ORSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJSZWFkZXIiKTsKLSAgICAgICAgT2JqZWN0TGlzdCBsaXN0NiA9IGZOYXZTdmMuZ2V0Q2hlY2tlZE91dERvY3MoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgTUlOVVNfT05FLCBNSU5VU19PTkUsIG51bGwpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFjbFNlcnZpY2VHZW5lcmFsQWNjZXNzKCkgewotICAgICAgICBMaXN0PEFjZT4gaW5pdGlhbEFDRXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oNCk7Ci0gICAgICAgIGluaXRpYWxBQ0VzLmFkZEFsbChzdGFuZGFyZEFDRXMpOwotICAgICAgICBpbml0aWFsQUNFcy5hZGQoY3JlYXRlQWNlKCJBZG1pbjIiLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTCkpOwotICAgICAgICBBY2wgaW5pdGlhbEFjbCA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGluaXRpYWxBQ0VzKTsKLQotICAgICAgICBMaXN0PEFjZT4gZXhwZWN0ZWRBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDUpOwotICAgICAgICBleHBlY3RlZEFDRXMuYWRkQWxsKGluaXRpYWxBQ0VzKTsKLSAgICAgICAgZXhwZWN0ZWRBQ0VzLmFkZEFsbCh0ZXN0VXNlckFDRXMpOwotICAgICAgICBBY2wgZXhwZWN0ZWRBY2wgPSBmRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sTGlzdChleHBlY3RlZEFDRXMpOwotCi0gICAgICAgIExpc3Q8QWNlPiByZW1vdmVBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDEpOwotICAgICAgICByZW1vdmVBQ0VzLmFkZChjcmVhdGVBY2UoIlRlc3RBZG1pbiIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfQUxMKSk7Ci0gICAgICAgIEFjbCByZW1vdmVBY2wgPSBmRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sTGlzdChyZW1vdmVBQ0VzKTsKLQotICAgICAgICBMaXN0PEFjZT4gcmVtb3ZlQUNFczIgPSBuZXcgQXJyYXlMaXN0PEFjZT4oMik7Ci0gICAgICAgIHJlbW92ZUFDRXMyLmFkZChjcmVhdGVBY2UoIlRlc3RBZG1pbiIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfQUxMKSk7Ci0gICAgICAgIHJlbW92ZUFDRXMyLmFkZChjcmVhdGVBY2UoIlJlYWRlciIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRCkpOwotICAgICAgICBBY2wgcmVtb3ZlQWNsMiA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KHJlbW92ZUFDRXMyKTsKLQotICAgICAgICBMaXN0PEFjZT4gdGVzdFVzZXJBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDEpOwotICAgICAgICB0ZXN0VXNlckFDRXMuYWRkKGNyZWF0ZUFjZSgiVGVzdFVzZXIiLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFKSk7Ci0gICAgICAgIEFjbCB0ZXN0VXNlckFjbCA9IGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KHRlc3RVc2VyQUNFcyk7Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RBZG1pbiIpOwotICAgICAgICBTdHJpbmcgZG9jSWQgPSBjcmVhdGVEb2N1bWVudFdpdGhBY2xzKCJkb2MiLCBmUm9vdEZvbGRlcklkLCAiQ29tcGxleFR5cGUiLCBpbml0aWFsQWNsLCBkZWZhdWx0QWNsKTsKLSAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gY3JlYXRlRm9sZGVyV2l0aEFjbHMoImZvbGRlciIsIGZSb290Rm9sZGVySWQsICJjbWlzOmZvbGRlciIsIGluaXRpYWxBY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICBTdHJpbmcgc3ViRm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygic3ViRm9sZGVyIiwgZm9sZGVySWQsICJjbWlzOmZvbGRlciIsIGluaXRpYWxBY2wsIGRlZmF1bHRBY2wpOwotCi0gICAgICAgIC8vIGdldEFjbCBvZiBhIGZvbGRlcgotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdFVzZXIiKTsKLSAgICAgICAgYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFjbCBhY2wgPSBmQWNsU3ZjLmdldEFjbChmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBnZXQgYWNsIG9mIGZvbGRlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlJlYWRlciIpOwotICAgICAgICBBY2wgYWNsID0gZkFjbFN2Yy5nZXRBY2woZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIGdldEFjbCBvZiBhIGRvY3VtZW50Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFjbCBkb2NBY2wgPSBmQWNsU3ZjLmdldEFjbChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBnZXQgYWNsIG9mIGRvYykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJSZWFkZXIiKTsKLSAgICAgICAgQWNsIGRvY0FjbCA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCB0cnVlLCBudWxsKTsKLQotICAgICAgICAvLyBhcHBseUFjbAotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiUmVhZGVyIik7Ci0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWNsIGRvY0FjbDIgPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBpbml0aWFsQWNsLCBudWxsLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiVGVzdFVzZXIgaGFzIG5vIHBlcm1pc3Npb25zKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3dpdGNoQ2FsbENvbnRleHQoIldyaXRlciIpOwotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIEFjbCBkb2NBY2wyID0gZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgaW5pdGlhbEFjbCwgbnVsbCwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gYXBwbHlBY2wgd2hlbiBub3QgYWxsb3dlZCB0byBzdWJJdGVtCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgQWNsIGRvY0FjbDQgPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIHN1YkZvbGRlcklkLCBudWxsLCByZW1vdmVBY2wsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotCi0gICAgICAgIC8vIHN3aXRjaENhbGxDb250ZXh0KCJXcml0ZXIiKTsKLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RBZG1pbiIpOwotICAgICAgICAvLyBhcHBseSBhbiBBQ0wgd2hlcmUgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgQUNMIG9uCi0gICAgICAgIC8vIGZvbGRlciBidXQgbm90IG9uIHN1Yi1mb2xkZXI6Ci0gICAgICAgIEFjbCBkb2NBY2w1ID0gZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgdGVzdFVzZXJBY2wsIG51bGwsIEFjbFByb3BhZ2F0aW9uLlBST1BBR0FURSwgbnVsbCk7Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJBZG1pbiIpOwotICAgICAgICBBY2wgZG9jQWNsNiA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xFcXVhbHMoZXhwZWN0ZWRBY2wsIGRvY0FjbDYpKTsKLSAgICAgICAgQWNsIGRvY0FjbDcgPSBmQWNsU3ZjLmdldEFjbChmUmVwb3NpdG9yeUlkLCBzdWJGb2xkZXJJZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsRXF1YWxzKHN0YW5kYXJkQWNsLCBkb2NBY2w3KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0U2VydmljZUdlbmVyYWxBY2Nlc3MoKSB7Ci0KLSAgICAgICAgLy8gc3RhcnRzIHdpdGggY2FsbCBjb250ZXh0IFRlc3RVc2VyCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRG9jdW1lbnRXaXRoQWNscygiZG9jIiwgZlJvb3RGb2xkZXJJZCwgIkNvbXBsZXhUeXBlIiwgc3RhbmRhcmRBY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygiZm9sZGVyIiwgZlJvb3RGb2xkZXJJZCwgImNtaXM6Zm9sZGVyIiwgc3RhbmRhcmRBY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICAvLyBmVGVzdENhbGxDb250ZXh0ID0gbmV3IER1bW15Q2FsbENvbnRleHQoIldyaXRlciIpOwotICAgICAgICBTdHJpbmcgc3ViRm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygic3ViRm9sZGVyIiwgZm9sZGVySWQsICJjbWlzOmZvbGRlciIsIHN0YW5kYXJkQWNsLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIG5vUmVhZEZvbGRlcklkID0gY3JlYXRlRm9sZGVyV2l0aEFjbHMoIm5vUmVhZEZvbGRlciIsIGZvbGRlcklkLCAiY21pczpmb2xkZXIiLCBudWxsLCByZWFkQWNsKTsKLSAgICAgICAgU3RyaW5nIGFkbWluRm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygiYWRtaW5Gb2xkZXIiLCBmb2xkZXJJZCwgImNtaXM6Zm9sZGVyIiwgbnVsbCwgcmVhZFdyaXRlQWNsKTsKLQotICAgICAgICAvLyBUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbiBhdCBhbGwKLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBjcmVhdGVEb2N1bWVudFByb3BlcnRpZXMoImRvYyIsICJDb21wbGV4VHlwZSIpOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYSBkb2N1bWVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZUZvbGRlcihmUmVwb3NpdG9yeUlkLCBudWxsLCBmb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgYSBmb2xkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOyB0cnkgeyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPQotICAgICAgICAgKiBjcmVhdGVSZWxhdGlvbnNoaXBQcm9wZXJ0aWVzKGZvbGRlcklkLCBmUm9vdEZvbGRlcklkKTsgU3RyaW5nIGlkMSA9Ci0gICAgICAgICAqIGZPYmpTdmMuY3JlYXRlUmVsYXRpb25zaGlwKGZSZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIG51bGwsIG51bGwsCi0gICAgICAgICAqIG51bGwsIG51bGwpOyB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAqIGV4Y2VwdGlvblRocm93biA9IHRydWU7IH0gaWYgKCFleGNlcHRpb25UaHJvd24pIGZhaWwoCi0gICAgICAgICAqICJUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbnMgdG8gY3JlYXRlIGEgcmVsYXRpb25zaGlwOiBtaXNzaW5nIHJlYWQgcGVybWlzc2lvbiBmb3Igc291cmNlIGlkIgotICAgICAgICAgKiApOwotICAgICAgICAgKiAKLSAgICAgICAgICogZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7IFByb3BlcnRpZXMgcHJvcGVydGllcyA9Ci0gICAgICAgICAqIGNyZWF0ZVJlbGF0aW9uc2hpcFByb3BlcnRpZXMoIGZSb290Rm9sZGVySWQsIGZvbGRlcklkKTsgdHJ5IHsgU3RyaW5nCi0gICAgICAgICAqIGlkMiA9IGZPYmpTdmMuY3JlYXRlUmVsYXRpb25zaGlwKGZSZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIG51bGwsCi0gICAgICAgICAqIG51bGwsIG51bGwsIG51bGwpOyB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAqIGV4Y2VwdGlvblRocm93biA9IHRydWU7IH0gaWYgKCFleGNlcHRpb25UaHJvd24pIGZhaWwoCi0gICAgICAgICAqICJUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbnMgdG8gY3JlYXRlIGEgcmVsYXRpb25zaGlwOiBtaXNzaW5nIHJlYWQgcGVybWlzc2lvbiBmb3IgZGVzdGluYXRpb24iCi0gICAgICAgICAqICk7Ci0gICAgICAgICAqLwotCi0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZPYmpTdmMuZ2V0UHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBnZXQgcHJvcGVydGllcyBvZiB0aGUgZm9sZGVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmT2JqU3ZjLmdldFByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIG51bGwsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbnMgdG8gZ2V0IHByb3BlcnRpZXMgb2YgdGhlIGRvY3VtZW50Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyA9IGZPYmpTdmMuZ2V0UmVuZGl0aW9ucyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBnZXQgcmVuZGl0aW9ucyBvZiB0aGUgZG9jdW1lbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLAotICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiVGVzdFVzZXIgaGFzIG5vIHBlcm1pc3Npb25zIHRvIGdldCBjb250ZW50U3RyZWFtIG9mIHRoZSBkb2N1bWVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlJlYWRlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gY3JlYXRlRG9jdW1lbnRQcm9wZXJ0aWVzKCJuYW1lIiwgInR5cGVJZCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZk9ialN2Yy51cGRhdGVQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIG5ldyBIb2xkZXI8U3RyaW5nPihkb2NJZCksIG5ldyBIb2xkZXI8U3RyaW5nPigiY2hhbmdlVG9rZW4iKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcywgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlJlYWRlciBoYXMgbm8gcGVybWlzc2lvbnMgdG8gdXBkYXRlIHByb3BlcnRpZXMgb2YgdGhlIGRvY3VtZW50Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgcHJvcGVydGllcyA9IGNyZWF0ZURvY3VtZW50UHJvcGVydGllcygibmFtZSIsICJ0eXBlSWQiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZPYmpTdmMudXBkYXRlUHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpLCBuZXcgSG9sZGVyPFN0cmluZz4oImNoYW5nZVRva2VuIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJSZWFkZXIgaGFzIG5vIHBlcm1pc3Npb25zIHRvIHVwZGF0ZSBwcm9wZXJ0aWVzIG9mIHRoZSBkb2N1bWVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLm1vdmVPYmplY3QoZlJlcG9zaXRvcnlJZCwgbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkKSwgc3ViRm9sZGVySWQsIGZSb290Rm9sZGVySWQsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJSZWFkZXIgaGFzIG5vIHBlcm1pc3Npb25zIHRvIG1vdmUgZG9jdW1lbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJXcml0ZXIiKTsKLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLm1vdmVPYmplY3QoZlJlcG9zaXRvcnlJZCwgbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkKSwgYWRtaW5Gb2xkZXJJZCwgZlJvb3RGb2xkZXJJZCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIldyaXRlciBoYXMgbm8gcGVybWlzc2lvbnMgdG8gbW92ZSBkb2N1bWVudCB0byBhZG1pbiBmb2xkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJSZWFkZXIiKTsKLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLmRlbGV0ZU9iamVjdChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlJlYWRlciBoYXMgbm8gcGVybWlzc2lvbnMgdG8gZGVsZXRlIGRvY3VtZW50ICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLmRlbGV0ZU9iamVjdChmUmVwb3NpdG9yeUlkLCBhZG1pbkZvbGRlcklkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiUmVhZGVyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBkZWxldGUgYWRtaW4gZm9sZGVyICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLnNldENvbnRlbnRTdHJlYW0oZlJlcG9zaXRvcnlJZCwgbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkKSwgdHJ1ZSwgbmV3IEhvbGRlcjxTdHJpbmc+KCJjaGFuZ2VUb2tlbiIpLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiUmVhZGVyIGhhcyBubyBwZXJtaXNzaW9ucyB0byBzZXQgY29udGVudCAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZk9ialN2Yy5kZWxldGVDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIG5ldyBIb2xkZXI8U3RyaW5nPihkb2NJZCksIG5ldyBIb2xkZXI8U3RyaW5nPigiY2hhbmdlVG9rZW4iKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlJlYWRlciBoYXMgbm8gcGVybWlzc2lvbnMgdG8gZGVsZXRlIGNvbnRlbnQgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZPYmpTdmMuZGVsZXRlVHJlZShmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgdHJ1ZSwgbnVsbCwgZmFsc2UsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJSZWFkZXIgaGFzIG5vIHBlcm1pc3Npb25zIHRvIGRlbGV0ZSB0cmVlICIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaWxpbmdTZXJ2aWNlR2VuZXJhbEFjY2VzcygpIHsKLSAgICAgICAgLy8gc3RhcnRzIHdpdGggY2FsbCBjb250ZXh0IFRlc3RVc2VyCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRG9jdW1lbnRXaXRoQWNscygiZG9jIiwgZlJvb3RGb2xkZXJJZCwgIkNvbXBsZXhUeXBlIiwgc3RhbmRhcmRBY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygiZm9sZGVyIiwgZlJvb3RGb2xkZXJJZCwgImNtaXM6Zm9sZGVyIiwgYWRkQWNsLCBkZWZhdWx0QWNsKTsKLSAgICAgICAgU3RyaW5nIG5vUmVhZEZvbGRlcklkID0gY3JlYXRlRm9sZGVyV2l0aEFjbHMoIm5vUmVhZEZvbGRlciIsIGZvbGRlcklkLCAiY21pczpmb2xkZXIiLCBudWxsLCByZWFkQWNsKTsKLQotICAgICAgICAvLyBUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbiBhdCB0aGUgZG9jdW1lbnQKLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGJvb2xlYW4gZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGZNdWx0aVN2Yy5hZGRPYmplY3RUb0ZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZm9sZGVySWQsIHRydWUsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbnMgYXQgdGhlIGRvY3VtZW50IHRvIGFkZCBhIHBhcmVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJSZWFkZXIiKTsgLy8gaGFzIG5vIHBlcm1pc3Npb24gYXQgdGhlIGZvbGRlcgotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBmTXVsdGlTdmMuYWRkT2JqZWN0VG9Gb2xkZXIoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIG5vUmVhZEZvbGRlcklkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiUmVhZGVyIGhhcyBubyBwZXJtaXNzaW9uIGF0IHRoZSBmb2xkZXIgdG8gYWRkIGEgcGFyZW50Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIGZNdWx0aVN2Yy5hZGRPYmplY3RUb0ZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbm9SZWFkRm9sZGVySWQsIHRydWUsIG51bGwpOwotICAgICAgICBmTXVsdGlTdmMuYWRkT2JqZWN0VG9Gb2xkZXIoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIGZvbGRlcklkLCB0cnVlLCBudWxsKTsKLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiUmVhZGVyIik7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGZNdWx0aVN2Yy5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBub1JlYWRGb2xkZXJJZCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlJlYWRlciBoYXMgbm8gcGVybWlzc2lvbiBhdCB0aGUgZm9sZGVyIHRvIHJlbW92ZSBhIHBhcmVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGZNdWx0aVN2Yy5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBmb2xkZXJJZCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9uIGF0IHRoZSBvYmplY3QgdG8gcmVtb3ZlIGEgcGFyZW50Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uaW5nU2VydmljZUdlbmVyYWxBY2Nlc3MoKSB7Ci0gICAgICAgIC8vIHN0YXJ0cyB3aXRoIGNhbGwgY29udGV4dCBUZXN0VXNlcgotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZURvY3VtZW50V2l0aEFjbHMoImRvYyIsIGZSb290Rm9sZGVySWQsIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTkVEX1RZUEUsCi0gICAgICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlLk1BSk9SLCBzdGFuZGFyZEFjbCwgZGVmYXVsdEFjbCk7Ci0KLSAgICAgICAgLy8gVGVzdFVzZXIgaGFzIG5vIHBlcm1pc3Npb24gYXQgYWxsCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOwotICAgICAgICBib29sZWFuIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gZG9jSWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpOwotICAgICAgICAgICAgZlZlclN2Yy5jaGVja091dChmUmVwb3NpdG9yeUlkLCBkb2NJZEhvbGRlciwgbnVsbCwgbmV3IEhvbGRlcjxCb29sZWFuPihmYWxzZSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJUZXN0VXNlciBoYXMgbm8gcGVybWlzc2lvbiB0byBjaGVja291dCkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWRlciBoYXMgb25seSByZWFkIHBlcm1pc3Npb24KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlJlYWRlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkKSwgbnVsbCwgbmV3IEhvbGRlcjxCb29sZWFuPihmYWxzZSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25UaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhjZXB0aW9uVGhyb3duKSB7Ci0gICAgICAgICAgICBmYWlsKCJSZWFkZXIgaGFzIG5vdCBlbm91Z2ggcGVybWlzc2lvbiB0byBjaGVja291dCkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrb3V0Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgdGVzdFVzZXJBY2wsIG51bGwsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdFVzZXIiKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gZG9jSWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpOwotICAgICAgICBmVmVyU3ZjLmNoZWNrT3V0KGZSZXBvc2l0b3J5SWQsIGRvY0lkSG9sZGVyLCBudWxsLCBuZXcgSG9sZGVyPEJvb2xlYW4+KGZhbHNlKSk7Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RBZG1pbiIpOwotICAgICAgICBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBudWxsLCB0ZXN0VXNlckFjbCwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gVGVzdFVzZXIgaGFzIG5vIHBlcm1pc3Npb24gYXQgYWxsLCBvbmx5IGNoZWNrb3V0IHVzZXIgY2FuIGNoZWNraW4KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlZlclN2Yy5jYW5jZWxDaGVja091dChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9uIHRvIGNhbmNlbENoZWNrT3V0KSIpOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgdGVzdFVzZXJBY2wsIG51bGwsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdFVzZXIiKTsKLSAgICAgICAgZlZlclN2Yy5jYW5jZWxDaGVja091dChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gd3JpdGVyIGxvb3NlcyB3cml0ZSBwZXJtaXNzaW9uCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJXcml0ZXIiKTsKLSAgICAgICAgZlZlclN2Yy5jaGVja091dChmUmVwb3NpdG9yeUlkLCBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpLCBudWxsLCBuZXcgSG9sZGVyPEJvb2xlYW4+KGZhbHNlKSk7Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RBZG1pbiIpOwotICAgICAgICBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBudWxsLCByZWFkV3JpdGVBY2wsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJXcml0ZXIiKTsKLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmVmVyU3ZjLmNhbmNlbENoZWNrT3V0KGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiUmVhZGVyIGhhcyBub3QgZW5vdWdoIHBlcm1pc3Npb24gdG8gY2FuY2VsQ2hlY2tPdXQpIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RBZG1pbiIpOwotICAgICAgICBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCByZWFkV3JpdGVBY2wsIG51bGwsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiV3JpdGVyIik7Ci0gICAgICAgIGZWZXJTdmMuY2FuY2VsQ2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIG51bGwpOwotCi0gICAgICAgIC8vIFRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9uIGF0IGFsbAotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIGZBY2xTdmMuYXBwbHlBY2woZlJlcG9zaXRvcnlJZCwgZG9jSWQsIHRlc3RVc2VyQWNsLCBudWxsLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLCBudWxsKTsKLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkKSwgbnVsbCwgbmV3IEhvbGRlcjxCb29sZWFuPihmYWxzZSkpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgdGVzdFVzZXJBY2wsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpLCB0cnVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiVGVzdFVzZXIgaGFzIG5vIHBlcm1pc3Npb24gdG8gY2hlY2tJbikiKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIGZBY2xTdmMuYXBwbHlBY2woZlJlcG9zaXRvcnlJZCwgZG9jSWQsIHRlc3RVc2VyQWNsLCBudWxsLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLCBudWxsKTsKLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpLCB0cnVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIGZBY2xTdmMuYXBwbHlBY2woZlJlcG9zaXRvcnlJZCwgZG9jSWQsIG51bGwsIHRlc3RVc2VyQWNsLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLCBudWxsKTsKLQotICAgICAgICAvLyB3cml0ZXIgbG9vc2VzIHdyaXRlIHBlcm1pc3Npb24KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIldyaXRlciIpOwotICAgICAgICBmVmVyU3ZjLmNoZWNrT3V0KGZSZXBvc2l0b3J5SWQsIG5ldyBIb2xkZXI8U3RyaW5nPihkb2NJZCksIG51bGwsIG5ldyBIb2xkZXI8Qm9vbGVhbj4oZmFsc2UpKTsKLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIGZBY2xTdmMuYXBwbHlBY2woZlJlcG9zaXRvcnlJZCwgZG9jSWQsIG51bGwsIHJlYWRXcml0ZUFjbCwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgbnVsbCk7Ci0KLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIldyaXRlciIpOwotICAgICAgICBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpLCB0cnVlLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiV3JpdGVyIGhhcyBub3QgZW5vdWdoIHBlcm1pc3Npb24gdG8gY2hlY2tJbikiKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIGZBY2xTdmMuYXBwbHlBY2woZlJlcG9zaXRvcnlJZCwgZG9jSWQsIHJlYWRXcml0ZUFjbCwgbnVsbCwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgbnVsbCk7Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJXcml0ZXIiKTsKLSAgICAgICAgZlZlclN2Yy5jaGVja0luKGZSZXBvc2l0b3J5SWQsIG5ldyBIb2xkZXI8U3RyaW5nPihkb2NJZCksIHRydWUsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFRlc3RVc2VyIGhhcyBubyBwZXJtaXNzaW9uIGF0IGFsbAotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdFVzZXIiKTsKLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdERhdGEgPSBmVmVyU3ZjLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgdHJ1ZSwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBub3QgZW5vdWdoIHBlcm1pc3Npb24gdG8gZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdERhdGE+IG9iamVjdERhdGFMaXN0ID0gZlZlclN2Yy5nZXRBbGxWZXJzaW9ucyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZG9jSWQsIG51bGwsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZXhjZXB0aW9uVGhyb3duID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4Y2VwdGlvblRocm93bikgewotICAgICAgICAgICAgZmFpbCgiVGVzdFVzZXIgaGFzIG5vdCBlbm91Z2ggcGVybWlzc2lvbiB0byBnZXRBbGxWZXJzaW9ucykiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4Y2VwdGlvblRocm93biA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gZlZlclN2Yy5nZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBudWxsLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGNlcHRpb25UaHJvd24pIHsKLSAgICAgICAgICAgIGZhaWwoIlRlc3RVc2VyIGhhcyBub3QgZW5vdWdoIHBlcm1pc3Npb24gdG8gZ2V0QWxsVmVyc2lvbnMpIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWaXNpYmxlT2JqZWN0cygpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydCB0ZXN0IGNoZWNrVmlzaWJsZU9iamVjdHMoKS4uLiIpOwotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZURvY3VtZW50V2l0aEFjbHMoImRvYyIsIGZSb290Rm9sZGVySWQsIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTkVEX1RZUEUsCi0gICAgICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlLk1BSk9SLCBzdGFuZGFyZEFjbCwgZGVmYXVsdEFjbCk7Ci0gICAgICAgIFN0cmluZyBkb2NJZDIgPSBjcmVhdGVEb2N1bWVudFdpdGhBY2xzKCJkb2MyIiwgZlJvb3RGb2xkZXJJZCwgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5WRVJTSU9ORURfVFlQRSwKLSAgICAgICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUuTUFKT1IsIGFkZEFjbCwgZGVmYXVsdEFjbCk7Ci0gICAgICAgIFN0cmluZyBmb2xkZXJJZCA9IGNyZWF0ZUZvbGRlcldpdGhBY2xzKCJmb2xkZXIiLCBmUm9vdEZvbGRlcklkLCAiY21pczpmb2xkZXIiLCBzdGFuZGFyZEFjbCwgZGVmYXVsdEFjbCk7Ci0gICAgICAgIFN0cmluZyBmb2xkZXJJZDIgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygiZm9sZGVyMiIsIGZSb290Rm9sZGVySWQsICJjbWlzOmZvbGRlciIsIGFkZEFjbCwgZGVmYXVsdEFjbCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiY2hlY2tWaXNpYmxlT2JqZWN0cygpOiBmb2xkZXJJZDIgaXM6ICIgKyBmb2xkZXJJZDIpOwotICAgICAgICBTdHJpbmcgc3ViRm9sZGVySWQgPSBjcmVhdGVGb2xkZXJXaXRoQWNscygic3ViRm9sZGVyIiwgZm9sZGVySWQyLCAiY21pczpmb2xkZXIiLCBudWxsLCB0ZXN0VXNlckFjbCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiY2hlY2tWaXNpYmxlT2JqZWN0cygpOiBzdWJGb2xkZXJJZCBpczogIiArIHN1YkZvbGRlcklkKTsKLSAgICAgICAgU3RyaW5nIHN1YkZvbGRlcklkMiA9IGNyZWF0ZUZvbGRlcldpdGhBY2xzKCJzdWJGb2xkZXIyIiwgZm9sZGVySWQyLCAiY21pczpmb2xkZXIiLCBhZGRBY2wsIG51bGwpOwotICAgICAgICBMT0cuZGVidWcoImNoZWNrVmlzaWJsZU9iamVjdHMoKTogc3ViRm9sZGVySWQyIGlzOiAiICsgc3ViRm9sZGVySWQyKTsKLSAgICAgICAgU3RyaW5nIHN1YkRvY0lkID0gY3JlYXRlRG9jdW1lbnRXaXRoQWNscygic3ViRG9jIiwgZm9sZGVySWQyLCBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlZFUlNJT05FRF9UWVBFLAotICAgICAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZS5NQUpPUiwgbnVsbCwgdGVzdFVzZXJBY2wpOwotICAgICAgICBMT0cuZGVidWcoImNoZWNrVmlzaWJsZU9iamVjdHMoKTogc3ViRG9jSWQgaXM6ICIgKyBzdWJEb2NJZCk7Ci0gICAgICAgIFN0cmluZyBzdWJEb2NJZDIgPSBjcmVhdGVEb2N1bWVudFdpdGhBY2xzKCJzdWJEb2MyIiwgZm9sZGVySWQyLCBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlZFUlNJT05FRF9UWVBFLAotICAgICAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZS5NQUpPUiwgYWRkQWNsLCBudWxsKTsKLSAgICAgICAgTE9HLmRlYnVnKCJjaGVja1Zpc2libGVPYmplY3RzKCk6IHN1YkRvY0lkMiBpczogIiArIHN1YkRvY0lkMik7Ci0gICAgICAgIFN0cmluZyBub0FjbERvY0lkMiA9IGNyZWF0ZURvY3VtZW50V2l0aEFjbHMoIm5vQWNsRG9jMiIsIGZSb290Rm9sZGVySWQsICJDb21wbGV4VHlwZSIsIG51bGwsIG51bGwpOwotICAgICAgICBMT0cuZGVidWcoImNoZWNrVmlzaWJsZU9iamVjdHMoKTogbm9BY2xEb2NJZDIgaXM6ICIgKyBub0FjbERvY0lkMik7Ci0KLSAgICAgICAgLy8gVGVzdFVzZXIgaGFzIG5vIHBlcm1pc3Npb24gaW4gc3RhbmRhcmRBY2wKLSAgICAgICAgc3dpdGNoQ2FsbENvbnRleHQoIlRlc3RVc2VyIik7Ci0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IGxpc3QgPSBmTmF2U3ZjLmdldENoaWxkcmVuKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkMiwgbnVsbCwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPiBvYmplY3RzID0gbGlzdC5nZXRPYmplY3RzKCk7Ci0gICAgICAgIGFzc2VydE9iamVjdERhdGFMaXN0SWRzKG9iamVjdHMsIHN1YkRvY0lkMik7Ci0gICAgICAgIGFzc2VydE9iamVjdERhdGFMaXN0SWRzKG9iamVjdHMsIHN1YkZvbGRlcklkMik7Ci0KLSAgICAgICAgbGlzdCA9IGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZlJlcG9zaXRvcnlJZCwgZlJvb3RGb2xkZXJJZCwgbnVsbCwgbnVsbCwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIG9iamVjdHMgPSBsaXN0LmdldE9iamVjdHMoKTsKLSAgICAgICAgYXNzZXJ0T2JqZWN0RGF0YUxpc3RJZHMob2JqZWN0cywgZG9jSWQyKTsKLSAgICAgICAgYXNzZXJ0T2JqZWN0RGF0YUxpc3RJZHMob2JqZWN0cywgZm9sZGVySWQyKTsKLSAgICAgICAgYXNzZXJ0T2JqZWN0RGF0YUxpc3RJZHMob2JqZWN0cywgbm9BY2xEb2NJZDIpOwotCi0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGRlc2NMaXN0ID0gZk5hdlN2Yy5nZXREZXNjZW5kYW50cyhmUmVwb3NpdG9yeUlkLCBmUm9vdEZvbGRlcklkLCBNSU5VU19PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0T2JqZWN0SW5Gb2xkZXJDb250YWluZXJJZHMoZGVzY0xpc3QsIGRvY0lkMik7Ci0gICAgICAgIGFzc2VydE9iamVjdEluRm9sZGVyQ29udGFpbmVySWRzKGRlc2NMaXN0LCBmb2xkZXJJZDIpOwotICAgICAgICBhc3NlcnRPYmplY3RJbkZvbGRlckNvbnRhaW5lcklkcyhkZXNjTGlzdCwgbm9BY2xEb2NJZDIpOwotCi0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGZvbGRlckxpc3QgPSBmTmF2U3ZjLmdldEZvbGRlclRyZWUoZlJlcG9zaXRvcnlJZCwgZlJvb3RGb2xkZXJJZCwgTUlOVVNfT05FLCBudWxsLAotICAgICAgICAgICAgICAgIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE9iamVjdEluRm9sZGVyQ29udGFpbmVySWRzKGZvbGRlckxpc3QsIGZvbGRlcklkMik7Ci0gICAgICAgIGFzc2VydE9iamVjdEluRm9sZGVyQ29udGFpbmVySWRzKGZvbGRlckxpc3QsIHN1YkZvbGRlcklkMik7Ci0KLSAgICAgICAgLy8gY2hlY2sgb3V0Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaG9sZGVyRG9jSWQgPSBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpOwotICAgICAgICBIb2xkZXI8U3RyaW5nPiBob2xkZXJEb2NJZDIgPSBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQyKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaG9sZGVyU3ViRG9jSWQgPSBuZXcgSG9sZGVyPFN0cmluZz4oc3ViRG9jSWQpOwotICAgICAgICBIb2xkZXI8U3RyaW5nPiBob2xkZXJTdWJEb2NJZDIgPSBuZXcgSG9sZGVyPFN0cmluZz4oc3ViRG9jSWQyKTsKLSAgICAgICAgZlZlclN2Yy5jaGVja091dChmUmVwb3NpdG9yeUlkLCBob2xkZXJEb2NJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaG9sZGVyRG9jSWQyLCBudWxsLCBudWxsKTsKLSAgICAgICAgZlZlclN2Yy5jaGVja091dChmUmVwb3NpdG9yeUlkLCBob2xkZXJTdWJEb2NJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaG9sZGVyU3ViRG9jSWQyLCBudWxsLCBudWxsKTsKLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdFVzZXIiKTsKLSAgICAgICAgT2JqZWN0TGlzdCBvYmplY3RMaXN0ID0gZk5hdlN2Yy5nZXRDaGVja2VkT3V0RG9jcyhmUmVwb3NpdG9yeUlkLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBNSU5VU19PTkUsIE1JTlVTX09ORSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE9iamVjdEluT2JqZWN0TGlzdElkcyhvYmplY3RMaXN0LCBob2xkZXJEb2NJZDIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydE9iamVjdEluT2JqZWN0TGlzdElkcyhvYmplY3RMaXN0LCBob2xkZXJTdWJEb2NJZDIuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gb25seSBkaXJlY3QgY2hpbGRyZW4gYXJlIHJldHVybmVkCi0gICAgICAgIE9iamVjdExpc3Qgb2JqZWN0TGlzdDIgPSBmTmF2U3ZjLmdldENoZWNrZWRPdXREb2NzKGZSZXBvc2l0b3J5SWQsIGZSb290Rm9sZGVySWQsIG51bGwsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIE1JTlVTX09ORSwgTUlOVVNfT05FLCBudWxsKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGRvY0lkczIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7Ci0gICAgICAgIGRvY0lkczIuYWRkKGRvY0lkMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMUwpLCBvYmplY3RMaXN0Mi5nZXROdW1JdGVtcygpKTsKLQotICAgICAgICAvLyBtdWx0aSBmaWxpbmcsIGdldCBvYmplY3QgcGFyZW50cwotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIFN0cmluZyBzZWNGb2xkZXJJZCA9IGNyZWF0ZUZvbGRlcldpdGhBY2xzKCJzZWNvbmRGb2xkZXIiLCBmUm9vdEZvbGRlcklkLCAiY21pczpmb2xkZXIiLCBzdGFuZGFyZEFjbCwgZGVmYXVsdEFjbCk7Ci0gICAgICAgIFN0cmluZyBkb2NJZDMgPSBjcmVhdGVEb2N1bWVudFdpdGhBY2xzKCJ0aGlyZERvYyIsIGZvbGRlcklkMiwgIkNvbXBsZXhUeXBlIiwgYWRkQWNsLCBudWxsKTsKLSAgICAgICAgZk11bHRpU3ZjLmFkZE9iamVjdFRvRm9sZGVyKGZSZXBvc2l0b3J5SWQsIGRvY0lkMywgc2VjRm9sZGVySWQsIHRydWUsIG51bGwpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOyAvLyBzZWNvbmQgcGFyZW50IGlzIG5vdCB2aXNpYmxlCi0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gb2JqZWN0UGFyZW50RGF0YSA9IGZOYXZTdmMuZ2V0T2JqZWN0UGFyZW50cyhmUmVwb3NpdG9yeUlkLCBkb2NJZDMsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvYmplY3RQYXJlbnREYXRhLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmb2xkZXJJZDIsIG9iamVjdFBhcmVudERhdGEuZ2V0KDApLmdldE9iamVjdCgpLmdldElkKCkpOwotICAgICAgICBMT0cuZGVidWcoIi4uLnN0b3AgdGVzdCBjaGVja1Zpc2libGVPYmplY3RzKCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeUFjY2VzcygpIHsKLSAgICAgICAgY3JlYXRlQ3VzdG9tUHJvcGVydHlEb2N1bWVudHMoKTsKLQotICAgICAgICBTdHJpbmcgcXVlcnlTdGF0ZW1lbnQ7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gb2JqZWN0RGF0YUxpc3Q7Ci0gICAgICAgIE9iamVjdExpc3Qgb2JqZWN0TGlzdDsKLSAgICAgICAgT2JqZWN0RGF0YSBmaXJzdDsKLQotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdFVzZXIiKTsgLy8gVGVzdHVzZXIgaGFzIG5vIHBlcm1pc3Npb25zIHRvIHZpZXcgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9jdW1lbnQKLSAgICAgICAgcXVlcnlTdGF0ZW1lbnQgPSAic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IjsKLSAgICAgICAgb2JqZWN0TGlzdCA9IGZEaXNjU3ZjLnF1ZXJ5KGZSZXBvc2l0b3J5SWQsIHF1ZXJ5U3RhdGVtZW50LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBNSU5VU19PTkUsIE1JTlVTX09ORSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoMEwgPT0gb2JqZWN0TGlzdC5nZXROdW1JdGVtcygpLmxvbmdWYWx1ZSgpKTsKLQotICAgICAgICAvLyBhZGQgYSBwZXJtaXNzaW9uIGZvciBhIGRvY3VtZW50Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0QWRtaW4iKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkMjAgPSBpZE1hcC5nZXQoImN1c3RvbURvY0lkMjAiKTsKLSAgICAgICAgZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBpZE1hcC5nZXQoImN1c3RvbURvY0lkMjAiKSwgdGVzdFVzZXJBY2wsIG51bGwsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotCi0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJUZXN0VXNlciIpOyAvLyBUZXN0dXNlciBoYXMgaGFzIG9ubHkgcGVybWlzc2lvbnMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b21Eb2NJZDIwCi0gICAgICAgIHF1ZXJ5U3RhdGVtZW50ID0gInNlbGVjdCAqIGZyb20gQ29tcGxleFR5cGUgd2hlcmUgSW50UHJvcCA8PSAyMCI7Ci0KLSAgICAgICAgb2JqZWN0TGlzdCA9IGZEaXNjU3ZjLnF1ZXJ5KGZSZXBvc2l0b3J5SWQsIHF1ZXJ5U3RhdGVtZW50LCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBNSU5VU19PTkUsIE1JTlVTX09ORSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoMUwgPT0gb2JqZWN0TGlzdC5nZXROdW1JdGVtcygpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgb2JqZWN0RGF0YUxpc3QgPSBvYmplY3RMaXN0LmdldE9iamVjdHMoKTsKLSAgICAgICAgZmlyc3QgPSBvYmplY3REYXRhTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydFRydWUoZmlyc3QuZ2V0QmFzZVR5cGVJZCgpLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURvY3VtZW50V2l0aEFjbHMoU3RyaW5nIG5hbWUsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIHR5cGVJZCwgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudFdpdGhBY2xzKG5hbWUsIGZvbGRlcklkLCB0eXBlSWQsIFZlcnNpb25pbmdTdGF0ZS5OT05FLCBhZGRBQ0VzLCByZW1vdmVBQ0VzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURvY3VtZW50V2l0aEFjbHMoU3RyaW5nIG5hbWUsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIEFjbCBhZGRBQ0VzLCBBY2wgcmVtb3ZlQUNFcykgewotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMgPSBudWxsOwotICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24gPSBudWxsOwotCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVEb2N1bWVudFByb3BlcnRpZXMobmFtZSwgdHlwZUlkKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywKLSAgICAgICAgICAgICAgICBhZGRBQ0VzLCByZW1vdmVBQ0VzLCBleHRlbnNpb24pOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVGb2xkZXJXaXRoQWNscyhTdHJpbmcgbmFtZSwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgdHlwZUlkLCBBY2wgYWRkQUNFcywgQWNsIHJlbW92ZUFDRXMpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljaWVzID0gbnVsbDsKLSAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uID0gbnVsbDsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gY3JlYXRlRm9sZGVyUHJvcGVydGllcyhuYW1lLCB0eXBlSWQpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IGZPYmpTdmMuY3JlYXRlRm9sZGVyKGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFDRXMsIHJlbW92ZUFDRXMsIGV4dGVuc2lvbik7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBjcmVhdGVSZWxhdGlvbnNoaXBQcm9wZXJ0aWVzKFN0cmluZyBzb3VyY2VJZCwgU3RyaW5nIHRhcmdldElkKSB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLlNPVVJDRV9JRCwgc291cmNlSWQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuVEFSR0VUX0lELCB0YXJnZXRJZCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwKLSAgICAgICAgICAgICAgICBFbnVtQmFzZU9iamVjdFR5cGVJZHMuQ01JU19SRUxBVElPTlNISVAudmFsdWUoKSkpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3dpdGNoQ2FsbENvbnRleHQoU3RyaW5nIHVzZXIpIHsKLSAgICAgICAgKChEdW1teUNhbGxDb250ZXh0KSBmVGVzdENhbGxDb250ZXh0KS5wdXQoQ2FsbENvbnRleHQuVVNFUk5BTUUsIHVzZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUN1c3RvbVByb3BlcnR5RG9jdW1lbnRzKCkgewotICAgICAgICBzd2l0Y2hDYWxsQ29udGV4dCgiVGVzdEFkbWluIik7Ci0gICAgICAgIC8vIGNyZWF0ZSBmb2xkZXIKLSAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gY3JlYXRlRm9sZGVyV2l0aEFjbHMoImN1c3RvbUZvbGRlciIsIGZSb290Rm9sZGVySWQsICJjbWlzOmZvbGRlciIsIHN0YW5kYXJkQWNsLCBkZWZhdWx0QWNsKTsKLSAgICAgICAgaWRNYXAucHV0KCJjdXN0b21Gb2xkZXIiLCBmb2xkZXJJZCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGRvY3VtZW50cwotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllczEwID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMxMC5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YSgiSW50UHJvcCIsIEJpZ0ludGVnZXIudmFsdWVPZigxMCkpKTsKLSAgICAgICAgcHJvcGVydGllczEwLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoIlN0cmluZ1Byb3AiLCAiMTAgc3RyaW5nIikpOwotICAgICAgICBwcm9wZXJ0aWVzMTAuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEoIkJvb2xlYW5Qcm9wIiwgdHJ1ZSkpOwotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBncmVnb3JpYW5DYWxlbmRhciA9IENhbGVuZGFySGVscGVyLmZyb21TdHJpbmcoIjIwMTAtMDctMTBUMTI6MDA6MDAuMDAwLTAxOjAwIik7Ci0gICAgICAgIHByb3BlcnRpZXMxMC5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlEYXRlVGltZURhdGEoIkRhdGVUaW1lUHJvcCIsIGdyZWdvcmlhbkNhbGVuZGFyKSk7Ci0gICAgICAgIFN0cmluZyBjdXN0b21Eb2NJZDEwID0gY3JlYXRlRG9jdW1lbnRXaXRoUHJvcGVydGllcygiY3VzdG9tRG9jdW1lbnQxMCIsIGZvbGRlcklkLCAiQ29tcGxleFR5cGUiLCBwcm9wZXJ0aWVzMTAsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBpZE1hcC5wdXQoImN1c3RvbURvY0lkMTAiLCBjdXN0b21Eb2NJZDEwKTsKLQotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllczIwID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMyMC5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YSgiSW50UHJvcCIsIEJpZ0ludGVnZXIudmFsdWVPZigyMCkpKTsKLSAgICAgICAgcHJvcGVydGllczIwLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoIlN0cmluZ1Byb3AiLCAiMjAgc3RyaW5nIikpOwotICAgICAgICBwcm9wZXJ0aWVzMjAuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEoIkJvb2xlYW5Qcm9wIiwgZmFsc2UpKTsKLSAgICAgICAgZ3JlZ29yaWFuQ2FsZW5kYXIgPSBDYWxlbmRhckhlbHBlci5mcm9tU3RyaW5nKCIyMDEwLTA3LTIwVDEyOjAwOjAwLjAwMC0wMTowMCIpOwotICAgICAgICBwcm9wZXJ0aWVzMjAuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGF0ZVRpbWVEYXRhKCJEYXRlVGltZVByb3AiLCBncmVnb3JpYW5DYWxlbmRhcikpOwotICAgICAgICBTdHJpbmcgY3VzdG9tRG9jSWQyMCA9IGNyZWF0ZURvY3VtZW50V2l0aFByb3BlcnRpZXMoImN1c3RvbURvY3VtZW50MjAiLCBmb2xkZXJJZCwgIkNvbXBsZXhUeXBlIiwgcHJvcGVydGllczIwLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgaWRNYXAucHV0KCJjdXN0b21Eb2NJZDIwIiwgY3VzdG9tRG9jSWQyMCk7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMzMCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzMzAuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoIkludFByb3AiLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMzApKSk7Ci0gICAgICAgIHByb3BlcnRpZXMzMC5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKCJTdHJpbmdQcm9wIiwgIjMwIHN0cmluZyIpKTsKLSAgICAgICAgcHJvcGVydGllczMwLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKCJCb29sZWFuUHJvcCIsIHRydWUpKTsKLSAgICAgICAgZ3JlZ29yaWFuQ2FsZW5kYXIgPSBDYWxlbmRhckhlbHBlci5mcm9tU3RyaW5nKCIyMDEwLTA3LTMwVDEyOjAwOjAwLjAwMC0wMTowMCIpOwotICAgICAgICBwcm9wZXJ0aWVzMzAuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGF0ZVRpbWVEYXRhKCJEYXRlVGltZVByb3AiLCBncmVnb3JpYW5DYWxlbmRhcikpOwotICAgICAgICBTdHJpbmcgY3VzdG9tRG9jSWQzMCA9IGNyZWF0ZURvY3VtZW50V2l0aFByb3BlcnRpZXMoImN1c3RvbURvY3VtZW50MzAiLCBmb2xkZXJJZCwgIkNvbXBsZXhUeXBlIiwgcHJvcGVydGllczMwLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgaWRNYXAucHV0KCJjdXN0b21Eb2NJZDMwIiwgY3VzdG9tRG9jSWQzMCk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZURvY3VtZW50V2l0aFByb3BlcnRpZXMoU3RyaW5nIG5hbWUsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzLCBib29sZWFuIHdpdGhDb250ZW50KSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0KLSAgICAgICAgLy8gYWRkIGRvY3VtZW50IHByb3BlcnRpZXMKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiAod2l0aENvbnRlbnQpIHsKLSAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBjcmVhdGVDb250ZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWQgPSBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gaWQpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJjcmVhdGVEb2N1bWVudCBmYWlsZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGVEb2N1bWVudCgpIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZDsKLQotICAgIH0KLQotICAgIHByaXZhdGUgQWNsIGNyZWF0ZUFjbChTdHJpbmcgcHJpbmNpcGFsSWQsIEVudW1CYXNpY1Blcm1pc3Npb25zIHBlcm1pc3Npb24pIHsKLSAgICAgICAgTGlzdDxBY2U+IGFjZXNBZGQgPSBBcnJheXMuYXNMaXN0KG5ldyBBY2VbXSB7IGNyZWF0ZUFjZShwcmluY2lwYWxJZCwgcGVybWlzc2lvbiksIH0pOwotICAgICAgICByZXR1cm4gZkZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbExpc3QoYWNlc0FkZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBY2UgY3JlYXRlQWNlKFN0cmluZyBwcmluY2lwYWxJZCwgRW51bUJhc2ljUGVybWlzc2lvbnMgcGVybWlzc2lvbikgewotICAgICAgICByZXR1cm4gZkZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbEVudHJ5KHByaW5jaXBhbElkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBlcm1pc3Npb24udmFsdWUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNsRXF1YWxzKEFjbCBhY2wxLCBBY2wgYWNsMikgewotICAgICAgICBpZiAoYWNsMSA9PSBhY2wyKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWNsMSA9PSBudWxsIHx8IGFjbDIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhY2wxLmdldENsYXNzKCkgIT0gYWNsMi5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjbDEuZ2V0QWNlcygpLnNpemUoKSAhPSBhY2wyLmdldEFjZXMoKS5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjbDEuZ2V0QWNlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhY2xIYXNBY2UoYWNsMS5nZXRBY2VzKCksIGFjbDIuZ2V0QWNlcygpLmdldChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhY2xIYXNBY2UoTGlzdDxBY2U+IGFjZXMsIEFjZSBhY2UpIHsKLSAgICAgICAgZm9yIChBY2UgYWNlMiA6IGFjZXMpIHsKLSAgICAgICAgICAgIGlmICghYWNlLmdldFByaW5jaXBhbElkKCkuZXF1YWxzKGFjZTIuZ2V0UHJpbmNpcGFsSWQoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhY2UuZ2V0UGVybWlzc2lvbnMoKS5zaXplKCkgIT0gYWNlMi5nZXRQZXJtaXNzaW9ucygpLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2UyLmdldFBlcm1pc3Npb25zKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFjZUhhc1Blcm1pc3Npb24oYWNlLmdldFBlcm1pc3Npb25zKCksIGFjZTIuZ2V0UGVybWlzc2lvbnMoKS5nZXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNlSGFzUGVybWlzc2lvbihMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMsIFN0cmluZyBwZXJtaXNzaW9uKSB7Ci0gICAgICAgIGZvciAoU3RyaW5nIHBlcm1pc3Npb24yIDogcGVybWlzc2lvbnMpIHsKLSAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uMi5lcXVhbHMocGVybWlzc2lvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoU3RyaW5nIG5hbWUsIFN0cmluZyBmb2xkZXJJZCkgewotCi0gICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSBWZXJzaW9uaW5nU3RhdGUuTUFKT1I7Ci0gICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBpZCA9IGZDcmVhdG9yLmNyZWF0ZURvY3VtZW50KG5hbWUsIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTkVEX1RZUEUsIGZvbGRlcklkLCB2ZXJzaW9uaW5nU3RhdGUsCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRPYmplY3REYXRhTGlzdElkcyhMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gZm9sZGVyRGF0YSwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgZm9sZGVyIDogZm9sZGVyRGF0YSkgewotICAgICAgICAgICAgTE9HLmluZm8oIiAgIGZvdW5kIGZvbGRlciBpZCAiICsgZm9sZGVyLmdldE9iamVjdCgpLmdldElkKCkpOwotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhmb2xkZXIuZ2V0T2JqZWN0KCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGZpbmQgZm9sZGVyIGlkICIgKyBpZCwgZm91bmQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRPYmplY3RJbkZvbGRlckNvbnRhaW5lcklkcyhMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBmb2xkZXJMaXN0LCBTdHJpbmcgaWQpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IG9iamVjdEluRm9sZGVyQ29udGFpbmVySGFzSWQoZm9sZGVyTGlzdCwgaWQpOwotICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmluZCBmb2xkZXIgaWQgIiArIGlkLCBmb3VuZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG9iamVjdEluRm9sZGVyQ29udGFpbmVySGFzSWQoTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZm9sZGVyTGlzdCwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgZmMgOiBmb2xkZXJMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKGZjLmdldE9iamVjdCgpLmdldE9iamVjdCgpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBjaGlsZHJlbiA9IGZjLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBvYmplY3RJbkZvbGRlckNvbnRhaW5lckhhc0lkKGNoaWxkcmVuLCBpZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydE9iamVjdEluT2JqZWN0TGlzdElkcyhPYmplY3RMaXN0IG9iakxpc3QsIFN0cmluZyBpZCkgewotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvZCA6IG9iakxpc3QuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBMT0cuaW5mbygiICAgZm91bmQgb2JqZWN0IGlkICIgKyBvZC5nZXRJZCgpKTsKLSAgICAgICAgICAgIGlmIChpZC5lcXVhbHMob2QuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gZmluZCBvYmplY3QgaWQgIiArIGlkLCBmb3VuZCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9BY2xTZXJ2aWNlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvQWNsU2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViNmM0MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9BY2xTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQmFzaWNQZXJtaXNzaW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5PYmplY3RTZXJ2aWNlVGVzdC5PYmplY3RUZXN0VHlwZVN5c3RlbUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGwuSW5NZW1vcnlBY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFjbFNlcnZpY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWNsU2VydmljZVRlc3QuY2xhc3MpOwotICAgIHByaXZhdGUgT2JqZWN0Q3JlYXRvciBmQ3JlYXRvcjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTkFNRSA9ICJEb2N1bWVudFdpdGhBY2wiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfTkFNRSA9ICJGb2xkZXJXaXRoQWNsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRV9JRCA9IERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKS5nZXRJZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfVFlQRV9JRCA9IERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNGb2xkZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJ1c2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQ0UgPSAiYWxpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT0IgPSAiYm9iIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hSSVMgPSAiY2hyaXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQU4gPSAiZGFuIjsKLSAgICBwcml2YXRlIEFjbCBkZWZhdWx0QWNsID0gbnVsbDsKLQotICAgIEBPdmVycmlkZQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgc3VwZXIuc2V0VHlwZUNyZWF0b3JDbGFzcyhPYmplY3RUZXN0VHlwZVN5c3RlbUNyZWF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZkNyZWF0b3IgPSBuZXcgT2JqZWN0Q3JlYXRvcihmRmFjdG9yeSwgZk9ialN2YywgZlJlcG9zaXRvcnlJZCk7Ci0KLSAgICAgICAgTGlzdDxBY2U+IGRlZmF1bHRBQ0VzID0gbmV3IEFycmF5TGlzdDxBY2U+KDEpOwotICAgICAgICBkZWZhdWx0QUNFcy5hZGQoZkZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbEVudHJ5KEluTWVtb3J5QWNlLmdldEFueW9uZVVzZXIoKSwKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfQUxMLnZhbHVlKCkpKSk7Ci0gICAgICAgIGRlZmF1bHRBY2wgPSBmRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sTGlzdChkZWZhdWx0QUNFcyk7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudFdpdGhBY2woKSB7Ci0gICAgICAgIExPRy5pbmZvKCJzdGFydGluZyB0ZXN0Q3JlYXRlRG9jdW1lbnRXaXRoQWNsKCkgLi4uIik7Ci0gICAgICAgIEFjbCByZW1vdmVBY2VzID0gZGVmYXVsdEFjbDsKLSAgICAgICAgQWNsIGFjbCA9IGNyZWF0ZVNpbXBsZVRlc3RBY2woKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBjcmVhdGVEb2N1bWVudChmUm9vdEZvbGRlcklkLCBhY2wsIHJlbW92ZUFjZXMpOwotICAgICAgICBMT0cuZGVidWcoImNyZWF0ZWQgZG9jdW1lbnQgd2l0aCBpZDogIiArIGlkKTsKLQotICAgICAgICAvLyBnZXQgQUNMIHVzaW5nIEFjbFNlcnZpY2UKLSAgICAgICAgQWNsIGFjbFJldHVybiA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIGlkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgY2hlY2tTaW1wbGVUZXN0QWNsKGFjbCwgYWNsUmV0dXJuKTsKLQotICAgICAgICAvLyBnZXQgQUNMIHVzaW5nIE9iamVjdFNlcnZpY2UgZ2V0T2JqZWN0Ci0gICAgICAgIE9iamVjdERhdGEgb2JqRGF0YSA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICB0cnVlLCBudWxsKTsKLSAgICAgICAgY2hlY2tTaW1wbGVUZXN0QWNsKGFjbCwgYWNsUmV0dXJuKTsKLQotICAgICAgICAvLyBnZXQgQUNMIHVzaW5nIE9iamVjdFNlcnZpY2UgZ2V0T2JqZWN0QnlQYXRoCi0gICAgICAgIG9iakRhdGEgPSBmT2JqU3ZjLmdldE9iamVjdEJ5UGF0aChmUmVwb3NpdG9yeUlkLCAiLyIgKyBET0NVTUVOVF9OQU1FLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLAotICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmpEYXRhKTsKLSAgICAgICAgYWNsUmV0dXJuID0gb2JqRGF0YS5nZXRBY2woKTsKLSAgICAgICAgY2hlY2tTaW1wbGVUZXN0QWNsKGFjbCwgYWNsUmV0dXJuKTsKLQotICAgICAgICBMT0cuaW5mbygiLi4uIHRlc3RDcmVhdGVEb2N1bWVudFdpdGhBY2woKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGb2xkZXJXaXRoQWNsKCkgewotICAgICAgICBMT0cuaW5mbygic3RhcnRpbmcgdGVzdENyZWF0ZUZvbGRlcldpdGhBY2woKSAuLi4iKTsKLSAgICAgICAgQWNsIHJlbW92ZUFjZXMgPSBkZWZhdWx0QWNsOwotICAgICAgICBBY2wgYWNsID0gY3JlYXRlU2ltcGxlVGVzdEFjbCgpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZUZvbGRlcihmUm9vdEZvbGRlcklkLCBhY2wsIHJlbW92ZUFjZXMpOwotICAgICAgICBMT0cuZGVidWcoImNyZWF0ZWQgZm9sZGVyIHdpdGggaWQ6ICIgKyBpZCk7Ci0KLSAgICAgICAgLy8gZ2V0IEFDTCB1c2luZyBBY2xTZXJ2aWNlCi0gICAgICAgIEFjbCBhY2xSZXR1cm4gPSBmQWNsU3ZjLmdldEFjbChmUmVwb3NpdG9yeUlkLCBpZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGNoZWNrU2ltcGxlVGVzdEFjbChhY2wsIGFjbFJldHVybik7Ci0KLSAgICAgICAgLy8gZ2V0IEFDTCB1c2luZyBPYmplY3RTZXJ2aWNlIGdldE9iamVjdAotICAgICAgICBPYmplY3REYXRhIG9iakRhdGEgPSBmT2JqU3ZjLmdldE9iamVjdChmUmVwb3NpdG9yeUlkLCBpZCwgIioiLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGNoZWNrU2ltcGxlVGVzdEFjbChhY2wsIGFjbFJldHVybik7Ci0KLSAgICAgICAgLy8gZ2V0IEFDTCB1c2luZyBPYmplY3RTZXJ2aWNlIGdldE9iamVjdEJ5UGF0aAotICAgICAgICBvYmpEYXRhID0gZk9ialN2Yy5nZXRPYmplY3RCeVBhdGgoZlJlcG9zaXRvcnlJZCwgIi8iICsgRk9MREVSX05BTUUsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsCi0gICAgICAgICAgICAgICAgbnVsbCwgZmFsc2UsIHRydWUsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9iakRhdGEpOwotICAgICAgICBhY2xSZXR1cm4gPSBvYmpEYXRhLmdldEFjbCgpOwotICAgICAgICBjaGVja1NpbXBsZVRlc3RBY2woYWNsLCBhY2xSZXR1cm4pOwotICAgICAgICBMT0cuaW5mbygiLi4uIHRlc3RDcmVhdGVGb2xkZXJXaXRoQWNsKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbHlBY2woKSB7Ci0gICAgICAgIExPRy5pbmZvKCJzdGFydGluZyB0ZXN0QXBwbHlBY2woKSAuLi4iKTsKLSAgICAgICAgQWNsIGFjbCA9IGNyZWF0ZVNpbXBsZVRlc3RBY2woKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBjcmVhdGVEb2N1bWVudChmUm9vdEZvbGRlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgTE9HLmRlYnVnKCJjcmVhdGVkIGRvY3VtZW50IHdpdGggaWQ6ICIgKyBpZCk7Ci0KLSAgICAgICAgLy8gYXBwbHkgYWJzb2x1dGUgQUNMIHVzaW5nIEFjbFNlcnZpY2UKLSAgICAgICAgQWNsIGFjbDEgPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGlkLCBhY2wsIGRlZmF1bHRBY2wsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotICAgICAgICBjaGVja1NpbXBsZVRlc3RBY2woYWNsLCBhY2wxKTsKLQotICAgICAgICAvLyBnZXQgQUNMIHVzaW5nIEFjbFNlcnZpY2UKLSAgICAgICAgQWNsIGFjbFJldHVybiA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIGlkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgY2hlY2tTaW1wbGVUZXN0QWNsKGFjbCwgYWNsUmV0dXJuKTsKLQotICAgICAgICBMT0cuaW5mbygiLi4uIHRlc3RBcHBseUFjbCgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUFjbCgpIHsKLQotICAgICAgICBMT0cuaW5mbygic3RhcnRpbmcgdGVzdEFkZFJlbW92ZUFjbCgpIC4uLiIpOwotICAgICAgICBBY2wgYWNsID0gY3JlYXRlQWR2YW5jZWRUZXN0QWNsKCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlRG9jdW1lbnQoZlJvb3RGb2xkZXJJZCwgYWNsLCBkZWZhdWx0QWNsKTsKLSAgICAgICAgTE9HLmRlYnVnKCJjcmVhdGVkIGRvY3VtZW50IHdpdGggaWQ6ICIgKyBpZCk7Ci0KLSAgICAgICAgQWNsIGFjbEFkZCA9IGNyZWF0ZUFjbEFkZCgpOwotICAgICAgICBBY2wgYWNsUmVtb3ZlID0gY3JlYXRlQWNsUmVtb3ZlKCk7Ci0gICAgICAgIC8vIGFwcGx5IGFic29sdXRlIEFDTCB1c2luZyBBY2xTZXJ2aWNlCi0gICAgICAgIEFjbCBhY2xSZXR1cm4gPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGlkLCBhY2xBZGQsIGFjbFJlbW92ZSwgQWNsUHJvcGFnYXRpb24uT0JKRUNUT05MWSwgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2tBY2xBZnRlckFkZFJlbW92ZShhY2xSZXR1cm4pOwotCi0gICAgICAgIExPRy5pbmZvKCIuLi4gdGVzdEFkZFJlbW92ZUFjbCgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUR1cGxpY2F0ZWRBY2woKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBET0NVTUVOVF9OQU1FXzEgPSAiRG9jdW1lbnRXaXRoQWNsLTEiOwotICAgICAgICBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfTkFNRV8yID0gIkRvY3VtZW50V2l0aEFjbC0yIjsKLQotICAgICAgICBMT0cuaW5mbygic3RhcnRpbmcgdGVzdEFkZFJlbW92ZUR1cGxpY2F0ZWRBY2woKSAuLi4iKTsKLSAgICAgICAgQWNsIGFjbCA9IGNyZWF0ZUFkdmFuY2VkVGVzdEFjbCgpOwotICAgICAgICBTdHJpbmcgaWQxID0gY3JlYXRlRG9jdW1lbnQoRE9DVU1FTlRfTkFNRV8xLCBmUm9vdEZvbGRlcklkLCBhY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICBTdHJpbmcgaWQyID0gY3JlYXRlRG9jdW1lbnQoRE9DVU1FTlRfTkFNRV8yLCBmUm9vdEZvbGRlcklkLCBhY2wsIGRlZmF1bHRBY2wpOwotCi0gICAgICAgIC8vIC8vIG1vZGlmeSBBQ0wgb2YgZmlyc3QgZG9jCi0gICAgICAgIC8vIExpc3Q8QWNlPiBhY2VzUmVtb3ZlID0gQXJyYXlzLmFzTGlzdChuZXcgQWNlW10gewotICAgICAgICAvLyBjcmVhdGVBY2UoQk9CLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFLnZhbHVlKCkpLAotICAgICAgICAvLyB9KTsKLSAgICAgICAgLy8gQWNsIGFjbFJlbW92ZSA9IG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoYWNlc1JlbW92ZSk7Ci0gICAgICAgIC8vIExpc3Q8QWNlPiBhY2VzQWRkID0gQXJyYXlzLmFzTGlzdChuZXcgQWNlW10gewotICAgICAgICAvLyBjcmVhdGVBY2UoREFOLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFLnZhbHVlKCkpLAotICAgICAgICAvLyB9KTsKLSAgICAgICAgLy8gQWNsIGFjbEFkZCA9IG5ldyBBY2Nlc3NDb250cm9sTGlzdEltcGwoYWNlc0FkZCk7Ci0gICAgICAgIEFjbCBhY2xBZGQgPSBjcmVhdGVBY2xBZGQoKTsKLSAgICAgICAgQWNsIGFjbFJlbW92ZSA9IGNyZWF0ZUFjbFJlbW92ZSgpOwotICAgICAgICBBY2wgYWNsUmV0dXJuID0gZkFjbFN2Yy5hcHBseUFjbChmUmVwb3NpdG9yeUlkLCBpZDEsIGFjbEFkZCwgYWNsUmVtb3ZlLCBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZLCBudWxsKTsKLQotICAgICAgICBjaGVja0FjbEFmdGVyQWRkUmVtb3ZlKGFjbFJldHVybik7Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgQUNMIG9mIHNlY29uZCBkb2MgaXMgdW5jaGFuZ2VkCi0gICAgICAgIGFjbFJldHVybiA9IGZBY2xTdmMuZ2V0QWNsKGZSZXBvc2l0b3J5SWQsIGlkMiwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGNoZWNrQWR2YW5jZWRUZXN0QWNsKGFjbCwgYWNsUmV0dXJuKTsKLSAgICAgICAgTE9HLmluZm8oIi4uLiB0ZXN0QWRkUmVtb3ZlRHVwbGljYXRlZEFjbCgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFwcGx5QWNsUmVjdXJzaXZlU2ltcGxlKCkgewotICAgICAgICBMT0cuaW5mbygic3RhcnRpbmcgdGVzdEFwcGx5QWNsUmVjdXJzaXZlU2ltcGxlKCkgLi4uIik7Ci0gICAgICAgIEFjbCBhY2wgPSBjcmVhdGVTaW1wbGVUZXN0QWNsKCk7Ci0gICAgICAgIFN0cmluZ1tdIGlkcyA9IGNyZWF0ZUhpZXJhcmNoeShhY2wsIGRlZmF1bHRBY2wpOwotICAgICAgICBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGlkc1swXSwgYWNsLCBudWxsLCBBY2xQcm9wYWdhdGlvbi5QUk9QQUdBVEUsIG51bGwpOwotICAgICAgICBjaGVja0FjbFJlY3Vyc2l2ZVNpbXBsZShpZHMsIGFjbCk7Ci0gICAgICAgIExPRy5pbmZvKCIuLi4gdGVzdEFwcGx5QWNsUmVjdXJzaXZlU2ltcGxlKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbHlBY2xSZWN1cnNpdmVJbmNyZW1lbnRhbCgpIHsKLSAgICAgICAgTE9HLmluZm8oInN0YXJ0aW5nIHRlc3RBcHBseUFjbFJlY3Vyc2l2ZUluY3JlbWVudGFsKCkgLi4uIik7Ci0gICAgICAgIEFjbCBhY2wgPSBjcmVhdGVBZHZhbmNlZFRlc3RBY2woKTsKLSAgICAgICAgU3RyaW5nW10gaWRzID0gY3JlYXRlSGllcmFyY2h5KGFjbCwgZGVmYXVsdEFjbCk7Ci0KLSAgICAgICAgQWNsIGFjbFJlbW92ZSA9IGNyZWF0ZUFjbFJlbW92ZSgpOwotICAgICAgICBBY2wgYWNsQWRkID0gY3JlYXRlQWNsQWRkKCk7Ci0KLSAgICAgICAgQWNsIGFjbFJldHVybiA9IGZBY2xTdmMuYXBwbHlBY2woZlJlcG9zaXRvcnlJZCwgaWRzWzBdLCBhY2xBZGQsIGFjbFJlbW92ZSwgQWNsUHJvcGFnYXRpb24uUFJPUEFHQVRFLCBudWxsKTsKLSAgICAgICAgY2hlY2tBY2xBZnRlckFkZFJlbW92ZShhY2xSZXR1cm4pOwotICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGlkcykgewotICAgICAgICAgICAgYWNsUmV0dXJuID0gZkFjbFN2Yy5nZXRBY2woZlJlcG9zaXRvcnlJZCwgaWQsIHRydWUsIG51bGwpOwotICAgICAgICAgICAgY2hlY2tBY2xBZnRlckFkZFJlbW92ZShhY2xSZXR1cm4pOwotICAgICAgICB9Ci0gICAgICAgIExPRy5pbmZvKCIuLi4gdGVzdEFwcGx5QWNsUmVjdXJzaXZlSW5jcmVtZW50YWwoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxBY2xzKCkgewotICAgICAgICBMT0cuaW5mbygic3RhcnRpbmcgdGVzdFJlbW92ZUFsbEFjbHMoKSAuLi4iKTsKLQotICAgICAgICBBY2wgYWNsID0gY3JlYXRlQWR2YW5jZWRUZXN0QWNsKCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KGZSb290Rm9sZGVySWQsIGFjbCwgZGVmYXVsdEFjbCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiY3JlYXRlZCBkb2N1bWVudCB3aXRoIGlkOiAiICsgaWQpOwotCi0gICAgICAgIEFjbCBhY2xSZXR1cm4gPSBmQWNsU3ZjLmFwcGx5QWNsKGZSZXBvc2l0b3J5SWQsIGlkLCBudWxsLCBhY2wsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFjbFJldHVybik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhY2xSZXR1cm4uZ2V0QWNlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsSGFzUGVybWlzc2lvbihhY2xSZXR1cm4sICJhbnlvbmUiLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTC52YWx1ZSgpKSk7Ci0KLSAgICAgICAgTE9HLmluZm8oIi4uLiB0ZXN0UmVtb3ZlQWxsQWNscygpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgZm9sZGVySWQsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcykgewotICAgICAgICByZXR1cm4gY3JlYXRlRG9jdW1lbnROb0NhdGNoKG5hbWUsIGZvbGRlcklkLCBET0NVTUVOVF9UWVBFX0lELCBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgZmFsc2UsIGFkZEFjZXMsIHJlbW92ZUFjZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyBmb2xkZXJJZCwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudE5vQ2F0Y2goRE9DVU1FTlRfTkFNRSwgZm9sZGVySWQsIERPQ1VNRU5UX1RZUEVfSUQsIFZlcnNpb25pbmdTdGF0ZS5OT05FLCBmYWxzZSwgYWRkQWNlcywKLSAgICAgICAgICAgICAgICByZW1vdmVBY2VzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVGb2xkZXIoU3RyaW5nIGZvbGRlcklkLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZvbGRlck5vQ2F0Y2goRk9MREVSX05BTUUsIGZvbGRlcklkLCBGT0xERVJfVFlQRV9JRCwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjcmVhdGVIaWVyYXJjaHkoQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbNl07Ci0gICAgICAgIFN0cmluZyByb290Rm9sZGVySWQgPSBjcmVhdGVGb2xkZXJOb0NhdGNoKEZPTERFUl9OQU1FLCBmUm9vdEZvbGRlcklkLCBGT0xERVJfVFlQRV9JRCwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgIHJlc3VsdFswXSA9IHJvb3RGb2xkZXJJZDsKLSAgICAgICAgcmVzdWx0WzFdID0gY3JlYXRlRG9jdW1lbnQoRE9DVU1FTlRfTkFNRSArICItMSIsIHJvb3RGb2xkZXJJZCwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgIHJlc3VsdFsyXSA9IGNyZWF0ZURvY3VtZW50KERPQ1VNRU5UX05BTUUgKyAiLTIiLCByb290Rm9sZGVySWQsIGFkZEFjZXMsIHJlbW92ZUFjZXMpOwotICAgICAgICBTdHJpbmcgc3ViRm9sZGVySWQgPSBjcmVhdGVGb2xkZXJOb0NhdGNoKEZPTERFUl9OQU1FLCByb290Rm9sZGVySWQsIEZPTERFUl9UWVBFX0lELCBhZGRBY2VzLCByZW1vdmVBY2VzKTsKLSAgICAgICAgcmVzdWx0WzNdID0gc3ViRm9sZGVySWQ7Ci0gICAgICAgIHJlc3VsdFs0XSA9IGNyZWF0ZURvY3VtZW50KERPQ1VNRU5UX05BTUUgKyAiLTEiLCBzdWJGb2xkZXJJZCwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgIHJlc3VsdFs1XSA9IGNyZWF0ZURvY3VtZW50KERPQ1VNRU5UX05BTUUgKyAiLTIiLCBzdWJGb2xkZXJJZCwgYWRkQWNlcywgcmVtb3ZlQWNlcyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWNsUmVjdXJzaXZlU2ltcGxlKFN0cmluZ1tdIGlkcywgQWNsIGFjbCkgewotICAgICAgICAvLyBnZXQgQUNMIHVzaW5nIE9iamVjdFNlcnZpY2UgZ2V0T2JqZWN0Ci0gICAgICAgIGZvciAoU3RyaW5nIGlkIDogaWRzKSB7Ci0gICAgICAgICAgICBPYmplY3REYXRhIG9iakRhdGEgPSBmT2JqU3ZjLmdldE9iamVjdChmUmVwb3NpdG9yeUlkLCBpZCwgIioiLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIG51bGwpOwotICAgICAgICAgICAgY2hlY2tTaW1wbGVUZXN0QWNsKGFjbCwgb2JqRGF0YS5nZXRBY2woKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFjbCBjcmVhdGVTaW1wbGVUZXN0QWNsKCkgewotICAgICAgICBMaXN0PEFjZT4gYWNlcyA9IEFycmF5cy5hc0xpc3QobmV3IEFjZVtdIHsgY3JlYXRlQWNlKFVTRVIsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRC52YWx1ZSgpKSB9KTsKLSAgICAgICAgcmV0dXJuIGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGFjZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1NpbXBsZVRlc3RBY2woQWNsIGFjbCwgQWNsIGFjbFJldHVybikgewotICAgICAgICBhc3NlcnROb3ROdWxsKGFjbFJldHVybik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhY2wuZ2V0QWNlcygpLnNpemUoKSwgYWNsUmV0dXJuLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbEhhc1Blcm1pc3Npb24oYWNsUmV0dXJuLCBVU0VSLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1JFQUQudmFsdWUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQWNsIGNyZWF0ZUFkdmFuY2VkVGVzdEFjbCgpIHsKLSAgICAgICAgTGlzdDxBY2U+IGFjZXMgPSBBcnJheXMuYXNMaXN0KG5ldyBBY2VbXSB7IGNyZWF0ZUFjZShBTElDRSwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19SRUFELnZhbHVlKCkpLAotICAgICAgICAgICAgICAgIGNyZWF0ZUFjZShCT0IsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUudmFsdWUoKSksCi0gICAgICAgICAgICAgICAgY3JlYXRlQWNlKENIUklTLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTC52YWx1ZSgpKSwgfSk7Ci0gICAgICAgIHJldHVybiBmRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sTGlzdChhY2VzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFjbCBjcmVhdGVBY2xBZGQoKSB7Ci0gICAgICAgIExpc3Q8QWNlPiBhY2VzQWRkID0gQXJyYXlzLmFzTGlzdChuZXcgQWNlW10geyBjcmVhdGVBY2UoREFOLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFLnZhbHVlKCkpLCB9KTsKLSAgICAgICAgcmV0dXJuIGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGFjZXNBZGQpOwotICAgIH0KLQotICAgIHByaXZhdGUgQWNsIGNyZWF0ZUFjbFJlbW92ZSgpIHsKLSAgICAgICAgTGlzdDxBY2U+IGFjZXNSZW1vdmUgPSBBcnJheXMuYXNMaXN0KG5ldyBBY2VbXSB7IGNyZWF0ZUFjZShCT0IsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUudmFsdWUoKSksCi0gICAgICAgICAgICAgICAgY3JlYXRlQWNlKENIUklTLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTC52YWx1ZSgpKSB9KTsKLSAgICAgICAgcmV0dXJuIGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xMaXN0KGFjZXNSZW1vdmUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FjbEFmdGVyQWRkUmVtb3ZlKEFjbCBhY2xSZXR1cm4pIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhY2xSZXR1cm4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWNsUmV0dXJuLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbEhhc1Blcm1pc3Npb24oYWNsUmV0dXJuLCBBTElDRSwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19SRUFELnZhbHVlKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xIYXNQZXJtaXNzaW9uKGFjbFJldHVybiwgREFOLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFLnZhbHVlKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYWNsSGFzUGVybWlzc2lvbihhY2xSZXR1cm4sIEJPQiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19XUklURS52YWx1ZSgpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFjbEhhc1Blcm1pc3Npb24oYWNsUmV0dXJuLCBDSFJJUywgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19BTEwudmFsdWUoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbEhhc05vUGVybWlzc2lvbihhY2xSZXR1cm4sIEJPQikpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbEhhc05vUGVybWlzc2lvbihhY2xSZXR1cm4sIENIUklTKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWR2YW5jZWRUZXN0QWNsKEFjbCBhY2wsIEFjbCBhY2xSZXR1cm4pIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhY2xSZXR1cm4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoYWNsLmdldEFjZXMoKS5zaXplKCksIGFjbFJldHVybi5nZXRBY2VzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2xIYXNQZXJtaXNzaW9uKGFjbFJldHVybiwgQUxJQ0UsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRC52YWx1ZSgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsSGFzUGVybWlzc2lvbihhY2xSZXR1cm4sIEJPQiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19XUklURS52YWx1ZSgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsSGFzUGVybWlzc2lvbihhY2xSZXR1cm4sIENIUklTLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTC52YWx1ZSgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBY2UgY3JlYXRlQWNlKFN0cmluZyBwcmluY2lwYWxJZCwgU3RyaW5nIHBlcm1pc3Npb24pIHsKLSAgICAgICAgcmV0dXJuIGZGYWN0b3J5LmNyZWF0ZUFjY2Vzc0NvbnRyb2xFbnRyeShwcmluY2lwYWxJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwZXJtaXNzaW9uKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFjbEhhc1Blcm1pc3Npb24oQWNsIGFjbCwgU3RyaW5nIHByaW5jaXBhbElkLCBTdHJpbmcgcGVybWlzc2lvbikgewotICAgICAgICBmb3IgKEFjZSBhY2UgOiBhY2wuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYWNlLmdldFByaW5jaXBhbElkKCkuZXF1YWxzKHByaW5jaXBhbElkKSAmJiBhY2VDb250YWluc1Blcm1pc3Npb24oYWNlLCBwZXJtaXNzaW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWNsSGFzTm9QZXJtaXNzaW9uKEFjbCBhY2wsIFN0cmluZyBwcmluY2lwYWxJZCkgewotICAgICAgICBpZiAobnVsbCA9PSBhY2wpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQWNlIGFjZSA6IGFjbC5nZXRBY2VzKCkpIHsKLSAgICAgICAgICAgIGlmIChhY2UuZ2V0UHJpbmNpcGFsSWQoKS5lcXVhbHMocHJpbmNpcGFsSWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhY2VDb250YWluc1Blcm1pc3Npb24oQWNlIGFjZSwgU3RyaW5nIHBlcm1pc3Npb24pIHsKLSAgICAgICAgZm9yIChTdHJpbmcgYWNlUGVybSA6IGFjZS5nZXRQZXJtaXNzaW9ucygpKSB7Ci0gICAgICAgICAgICBpZiAocGVybWlzc2lvbi5lcXVhbHMoYWNlUGVybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvQWNsVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvQWNsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDViZGQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0FjbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sRW50cnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BY2Nlc3NDb250cm9sTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4Yi5FbnVtQmFzaWNQZXJtaXNzaW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbC5Jbk1lbW9yeUFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbC5Jbk1lbW9yeUFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbC5QZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBY2xUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBY2xUZXN0LmNsYXNzKTsKLQotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5EUkVBUyA9ICJhbmRyZWFzIjsKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEJFUlRBID0gImJlcnRhIjsKLSAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIENIUklTVElBTiA9ICJjaHJpc3RpYW4iOwotICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9ST1RIRUUgPSAiZG9yb3RoZWUiOwotCi0gICAgZmluYWwgSW5NZW1vcnlBY2UgYWNlTiA9IG5ldyBJbk1lbW9yeUFjZShBTkRSRUFTLCBQZXJtaXNzaW9uLk5PTkUpOwotICAgIGZpbmFsIEluTWVtb3J5QWNlIGFjZVIgPSBuZXcgSW5NZW1vcnlBY2UoQkVSVEEsIFBlcm1pc3Npb24uUkVBRCk7Ci0gICAgZmluYWwgSW5NZW1vcnlBY2UgYWNlVyA9IG5ldyBJbk1lbW9yeUFjZShDSFJJU1RJQU4sIFBlcm1pc3Npb24uV1JJVEUpOwotICAgIGZpbmFsIEluTWVtb3J5QWNlIGFjZUEgPSBuZXcgSW5NZW1vcnlBY2UoRE9ST1RIRUUsIFBlcm1pc3Npb24uQUxMKTsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFjZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBJbk1lbW9yeUFjZShudWxsLCBQZXJtaXNzaW9uLk5PTkUpOwotICAgICAgICAgICAgZmFpbCgiY3JlYXRlIGFuIEFDRSB3aXRoIG51bGwgcHJpbmNpcGFsSWQgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBJbk1lbW9yeUFjZSgieHh4IiwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGUgYW4gQUNFIHdpdGggbnVsbCBwZXJtaXNzaW9uIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKLQotICAgICAgICBJbk1lbW9yeUFjbCBhY2wgPSBuZXcgSW5NZW1vcnlBY2woKTsKLSAgICAgICAgYWNsLmFkZEFjZShhY2VBKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFjbC5nZXRBY2VzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2wuZ2V0QWNlcygpLmdldCgwKSA9PSBhY2VBKTsKLQotICAgICAgICBhY2wgPSBuZXcgSW5NZW1vcnlBY2woY3JlYXRlQWNlTGlzdCgpKTsKLSAgICAgICAgTE9HLmRlYnVnKGFjbC50b1N0cmluZygpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWNsLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDApID09IGFjZVIpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDEpID09IGFjZUEpOwotCi0gICAgICAgIGFjbCA9IGNyZWF0ZURlZmF1bHRBY2woKTsKLSAgICAgICAgY2hlY2tEZWZhdWx0QWNsKGFjbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8SW5NZW1vcnlBY2U+IGFjZXMgPSBjcmVhdGVBY2VMaXN0KCk7Ci0gICAgICAgICAgICBhY2VzLmFkZChudWxsKTsKLSAgICAgICAgICAgIGFjbCA9IG5ldyBJbk1lbW9yeUFjbChhY2VzKTsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0ZSBhbiBBQ0wgd2l0aCBhIG51bGwgQUNFIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLSAgICAgICAgSW5NZW1vcnlBY2wgYWNsID0gbmV3IEluTWVtb3J5QWNsKCk7Ci0gICAgICAgIGFjbC5hZGRBY2UoYWNlUik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhY2wuZ2V0QWNlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMCkgPT0gYWNlUik7Ci0gICAgICAgIGFjbC5hZGRBY2UoYWNlVyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBhY2wuZ2V0QWNlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMCkgPT0gYWNlUik7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMSkgPT0gYWNlVyk7Ci0gICAgICAgIGFjbC5hZGRBY2UoYWNlTik7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBhY2wuZ2V0QWNlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMCkgPT0gYWNlTik7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMSkgPT0gYWNlUik7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMikgPT0gYWNlVyk7Ci0gICAgICAgIGFjbC5hZGRBY2UoYWNlQSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBhY2wuZ2V0QWNlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMCkgPT0gYWNlTik7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMSkgPT0gYWNlUik7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMikgPT0gYWNlVyk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmdldEFjZXMoKS5nZXQoMykgPT0gYWNlQSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIkFkZGluZyBhbiBleGlzdGluZyBBQ0UgdG8gYW4gQUNMIHNob3VsZCBmYWlsLiIsIGFjbC5hZGRBY2UoYWNlTikpOwotICAgICAgICBhc3NlcnRGYWxzZSgiQWRkaW5nIG51bGwgdG8gYW4gQUNMIHNob3VsZCBmYWlsLiIsIGFjbC5hZGRBY2UobnVsbCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLSAgICAgICAgSW5NZW1vcnlBY2wgYWNsID0gY3JlYXRlRGVmYXVsdEFjbCgpOwotICAgICAgICBjaGVja0RlZmF1bHRBY2woYWNsKTsKLQotICAgICAgICBhY2wucmVtb3ZlQWNlKGFjZVIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgYWNsLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDApID09IGFjZU4pOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDEpID09IGFjZVcpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDIpID09IGFjZUEpOwotICAgICAgICBhY2wucmVtb3ZlQWNlKGFjZVcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWNsLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDApID09IGFjZU4pOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDEpID09IGFjZUEpOwotICAgICAgICBhY2wucmVtb3ZlQWNlKGFjZU4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWNsLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDApID09IGFjZUEpOwotICAgICAgICBhY2wucmVtb3ZlQWNlKGFjZUEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYWNsLmdldEFjZXMoKS5zaXplKCkpOwotCi0gICAgICAgIGFjbCA9IGNyZWF0ZURlZmF1bHRBY2woKTsKLSAgICAgICAgZmluYWwgSW5NZW1vcnlBY2UgYWNlID0gbmV3IEluTWVtb3J5QWNlKCJ4eXUiLCBQZXJtaXNzaW9uLkFMTCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJSZW1vdmluZyBhbiB1bmtub3duIEFDRSBmcm9tIGFuIEFDTCBzaG91bGQgZmFpbC4iLCBhY2wucmVtb3ZlQWNlKGFjZSkpOwotICAgICAgICBhc3NlcnRGYWxzZSgiUmVtb3ZpbmcgbnVsbCBmcm9tIGFuIEFDTCBzaG91bGQgZmFpbC4iLCBhY2wucmVtb3ZlQWNlKG51bGwpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHsKLSAgICAgICAgZmluYWwgSW5NZW1vcnlBY2UgYWNlTmV3ID0gbmV3IEluTWVtb3J5QWNlKCJIdWdvIiwgUGVybWlzc2lvbi5XUklURSk7IC8vIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZAotICAgICAgICBmaW5hbCBJbk1lbW9yeUFjZSBhY2VSQ29weSA9IG5ldyBJbk1lbW9yeUFjZShCRVJUQSwgUGVybWlzc2lvbi5SRUFEKTsgLy8gaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUKLSAgICAgICAgZmluYWwgSW5NZW1vcnlBY2UgYWNlQ2hhbmdlID0gbmV3IEluTWVtb3J5QWNlKENIUklTVElBTiwgUGVybWlzc2lvbi5BTEwpOyAvLyBjaGFuZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGVybWlzc2lvbgotCi0gICAgICAgIEluTWVtb3J5QWNsIGFjbDEgPSBjcmVhdGVEZWZhdWx0QWNsKCk7Ci0gICAgICAgIEluTWVtb3J5QWNsIGFjbDIgPSBuZXcgSW5NZW1vcnlBY2wobmV3IEFycmF5TGlzdDxJbk1lbW9yeUFjZT4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKGFjZU5ldyk7Ci0gICAgICAgICAgICAgICAgYWRkKGFjZVJDb3B5KTsKLSAgICAgICAgICAgICAgICBhZGQoYWNlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFjbDEubWVyZ2VBY2woYWNsMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBhY2wxLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGVybWlzc2lvbi5OT05FLCBhY2wxLmdldFBlcm1pc3Npb24oQU5EUkVBUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGVybWlzc2lvbi5SRUFELCBhY2wxLmdldFBlcm1pc3Npb24oQkVSVEEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBlcm1pc3Npb24uQUxMLCBhY2wxLmdldFBlcm1pc3Npb24oQ0hSSVNUSUFOKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQZXJtaXNzaW9uLkFMTCwgYWNsMS5nZXRQZXJtaXNzaW9uKERPUk9USEVFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQZXJtaXNzaW9uLldSSVRFLCBhY2wxLmdldFBlcm1pc3Npb24oIkh1Z28iKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWNsRXF1YWxpdHkoKSB7Ci0gICAgICAgIGZpbmFsIEluTWVtb3J5QWNlIGFjZU5ldyA9IG5ldyBJbk1lbW9yeUFjZSgiSHVnbyIsIFBlcm1pc3Npb24uV1JJVEUpOwotICAgICAgICBmaW5hbCBJbk1lbW9yeUFjZSBhY2VSQ29weSA9IG5ldyBJbk1lbW9yeUFjZShCRVJUQSwgUGVybWlzc2lvbi5SRUFEKTsKLQotICAgICAgICBJbk1lbW9yeUFjbCBhY2wxID0gY3JlYXRlRGVmYXVsdEFjbCgpOwotICAgICAgICBJbk1lbW9yeUFjbCBhY2wyID0gbmV3IEluTWVtb3J5QWNsKG5ldyBBcnJheUxpc3Q8SW5NZW1vcnlBY2U+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChhY2VSQ29weSk7Ci0gICAgICAgICAgICAgICAgYWRkKGFjZUEpOwotICAgICAgICAgICAgICAgIGFkZChhY2VXKTsKLSAgICAgICAgICAgICAgICBhZGQoYWNlTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBJbk1lbW9yeUFjbCBhY2wzID0gbmV3IEluTWVtb3J5QWNsKG5ldyBBcnJheUxpc3Q8SW5NZW1vcnlBY2U+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChhY2VSKTsKLSAgICAgICAgICAgICAgICBhZGQoYWNlTmV3KTsKLSAgICAgICAgICAgICAgICBhZGQoYWNlVyk7Ci0gICAgICAgICAgICAgICAgYWRkKGFjZU4pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFjbDEsIGFjbDIpOwotICAgICAgICBhc3NlcnRGYWxzZShhY2wxLmVxdWFscyhhY2wzKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tQZXJtaXNzaW9ucygpIHsKLSAgICAgICAgSW5NZW1vcnlBY2wgYWNsID0gY3JlYXRlRGVmYXVsdEFjbCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoYWNsLmhhc1Blcm1pc3Npb24oQU5EUkVBUywgUGVybWlzc2lvbi5OT05FKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFjbC5oYXNQZXJtaXNzaW9uKEFORFJFQVMsIFBlcm1pc3Npb24uUkVBRCkpOwotICAgICAgICBhc3NlcnRGYWxzZShhY2wuaGFzUGVybWlzc2lvbihBTkRSRUFTLCBQZXJtaXNzaW9uLldSSVRFKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFjbC5oYXNQZXJtaXNzaW9uKEFORFJFQVMsIFBlcm1pc3Npb24uQUxMKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2wuaGFzUGVybWlzc2lvbihCRVJUQSwgUGVybWlzc2lvbi5OT05FKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmhhc1Blcm1pc3Npb24oQkVSVEEsIFBlcm1pc3Npb24uUkVBRCkpOwotICAgICAgICBhc3NlcnRGYWxzZShhY2wuaGFzUGVybWlzc2lvbihCRVJUQSwgUGVybWlzc2lvbi5XUklURSkpOwotICAgICAgICBhc3NlcnRGYWxzZShhY2wuaGFzUGVybWlzc2lvbihCRVJUQSwgUGVybWlzc2lvbi5BTEwpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGFjbC5oYXNQZXJtaXNzaW9uKENIUklTVElBTiwgUGVybWlzc2lvbi5OT05FKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWNsLmhhc1Blcm1pc3Npb24oQ0hSSVNUSUFOLCBQZXJtaXNzaW9uLlJFQUQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2wuaGFzUGVybWlzc2lvbihDSFJJU1RJQU4sIFBlcm1pc3Npb24uV1JJVEUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYWNsLmhhc1Blcm1pc3Npb24oQ0hSSVNUSUFOLCBQZXJtaXNzaW9uLkFMTCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoYWNsLmhhc1Blcm1pc3Npb24oRE9ST1RIRUUsIFBlcm1pc3Npb24uTk9ORSkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5oYXNQZXJtaXNzaW9uKERPUk9USEVFLCBQZXJtaXNzaW9uLlJFQUQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY2wuaGFzUGVybWlzc2lvbihET1JPVEhFRSwgUGVybWlzc2lvbi5XUklURSkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5oYXNQZXJtaXNzaW9uKERPUk9USEVFLCBQZXJtaXNzaW9uLkFMTCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRGb21DbWlzQWNsKCkgewotICAgICAgICBMaXN0PEFjZT4gYWNlcyA9IEFycmF5cy5hc0xpc3QobmV3IEFjZVtdIHsgY3JlYXRlQWNlKEFORFJFQVMsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRC52YWx1ZSgpKSwKLSAgICAgICAgICAgICAgICBjcmVhdGVBY2UoRE9ST1RIRUUsIEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfV1JJVEUudmFsdWUoKSkgfSk7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xMaXN0SW1wbCBjQWNsID0gbmV3IEFjY2Vzc0NvbnRyb2xMaXN0SW1wbChhY2VzKTsKLSAgICAgICAgSW5NZW1vcnlBY2wgYWNsID0gSW5NZW1vcnlBY2wuY3JlYXRlRnJvbUNvbW1vbnNBY2woY0FjbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBhY2wuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFBlcm1pc3Npb24uUkVBRCwgYWNsLmdldFBlcm1pc3Npb24oQU5EUkVBUykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUGVybWlzc2lvbi5XUklURSwgYWNsLmdldFBlcm1pc3Npb24oRE9ST1RIRUUpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxBY2U+IGFjZXMyID0gQXJyYXlzLmFzTGlzdChuZXcgQWNlW10geyBuZXcgQWNjZXNzQ29udHJvbEVudHJ5SW1wbChudWxsLCBBcnJheXMKLSAgICAgICAgICAgICAgICAgICAgLmFzTGlzdChuZXcgU3RyaW5nW10geyBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1JFQUQudmFsdWUoKSB9KSkgfSk7Ci0gICAgICAgICAgICBhY2wgPSBJbk1lbW9yeUFjbC5jcmVhdGVGcm9tQ29tbW9uc0FjbChuZXcgQWNjZXNzQ29udHJvbExpc3RJbXBsKGFjZXMyKSk7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGUgQWNlIHdpbGwgbnVsbCBwcmluY2lwYWwgc2hvdWxkIHJhaXNlIGV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8QWNlPiBhY2VzMiA9IEFycmF5cy5hc0xpc3QobmV3IEFjZVtdIHsgbmV3IEFjY2Vzc0NvbnRyb2xFbnRyeUltcGwobmV3IEFjY2Vzc0NvbnRyb2xQcmluY2lwYWxEYXRhSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgQU5EUkVBUyksIG51bGwpIH0pOwotICAgICAgICAgICAgYWNsID0gSW5NZW1vcnlBY2wuY3JlYXRlRnJvbUNvbW1vbnNBY2wobmV3IEFjY2Vzc0NvbnRyb2xMaXN0SW1wbChhY2VzMikpOwotICAgICAgICAgICAgZmFpbCgiY3JlYXRlIEFjZSB3aWxsIG51bGwgcGVybWlzc2lvbiBzaG91bGQgcmFpc2UgZXhjZXB0aW9uLiIpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NtaXNBY2woKSB7Ci0gICAgICAgIEFjZSBhY2UgPSBhY2VOLnRvQ29tbW9uc0FjZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQU5EUkVBUywgYWNlLmdldFByaW5jaXBhbElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWNlLmdldFBlcm1pc3Npb25zKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhY2UuZ2V0UGVybWlzc2lvbnMoKS5nZXQoMCkpOwotCi0gICAgICAgIGFjZSA9IGFjZVIudG9Db21tb25zQWNlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCRVJUQSwgYWNlLmdldFByaW5jaXBhbElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWNlLmdldFBlcm1pc3Npb25zKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVudW1CYXNpY1Blcm1pc3Npb25zLkNNSVNfUkVBRC52YWx1ZSgpLCBhY2UuZ2V0UGVybWlzc2lvbnMoKS5nZXQoMCkpOwotCi0gICAgICAgIGFjZSA9IGFjZVcudG9Db21tb25zQWNlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDSFJJU1RJQU4sIGFjZS5nZXRQcmluY2lwYWxJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFjZS5nZXRQZXJtaXNzaW9ucygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFLnZhbHVlKCksIGFjZS5nZXRQZXJtaXNzaW9ucygpLmdldCgwKSk7Ci0KLSAgICAgICAgYWNlID0gYWNlQS50b0NvbW1vbnNBY2UoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERPUk9USEVFLCBhY2UuZ2V0UHJpbmNpcGFsSWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBhY2UuZ2V0UGVybWlzc2lvbnMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19BTEwudmFsdWUoKSwgYWNlLmdldFBlcm1pc3Npb25zKCkuZ2V0KDApKTsKLQotICAgICAgICBJbk1lbW9yeUFjbCBhY2wgPSBjcmVhdGVEZWZhdWx0QWNsKCk7Ci0gICAgICAgIEFjbCBjb21tb25zQWNsID0gYWNsLnRvQ29tbW9uc0FjbCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgY29tbW9uc0FjbC5nZXRBY2VzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoYXNDb21tb25zQWNlKGNvbW1vbnNBY2wsIEFORFJFQVMsICIiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGhhc0NvbW1vbnNBY2UoY29tbW9uc0FjbCwgQU5EUkVBUywgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19SRUFELnZhbHVlKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaGFzQ29tbW9uc0FjZShjb21tb25zQWNsLCBBTkRSRUFTLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX1dSSVRFLnZhbHVlKCkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaGFzQ29tbW9uc0FjZShjb21tb25zQWNsLCBBTkRSRUFTLCBFbnVtQmFzaWNQZXJtaXNzaW9ucy5DTUlTX0FMTC52YWx1ZSgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaGFzQ29tbW9uc0FjZShjb21tb25zQWNsLCBCRVJUQSwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19SRUFELnZhbHVlKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoYXNDb21tb25zQWNlKGNvbW1vbnNBY2wsIENIUklTVElBTiwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19XUklURS52YWx1ZSgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaGFzQ29tbW9uc0FjZShjb21tb25zQWNsLCBET1JPVEhFRSwgRW51bUJhc2ljUGVybWlzc2lvbnMuQ01JU19BTEwudmFsdWUoKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENsb25lQWNsKCkgewotICAgICAgICBJbk1lbW9yeUFjbCBhY2wgPSBjcmVhdGVEZWZhdWx0QWNsKCk7Ci0gICAgICAgIEluTWVtb3J5QWNsIGFjbDIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWNsMiA9IGFjbC5jbG9uZSgpOwotICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJDbG9uZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RmFsc2UoYWNsID09IGFjbDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYWNsLCBhY2wyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluTWVtb3J5QWNsIGNyZWF0ZURlZmF1bHRBY2woKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5NZW1vcnlBY2wobmV3IEFycmF5TGlzdDxJbk1lbW9yeUFjZT4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKGFjZUEpOwotICAgICAgICAgICAgICAgIGFkZChhY2VSKTsKLSAgICAgICAgICAgICAgICBhZGQoYWNlTik7Ci0gICAgICAgICAgICAgICAgYWRkKGFjZVcpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEZWZhdWx0QWNsKEluTWVtb3J5QWNsIGFjbCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgYWNsLmdldEFjZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDApID09IGFjZU4pOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDEpID09IGFjZVIpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDIpID09IGFjZVcpOwotICAgICAgICBhc3NlcnRUcnVlKGFjbC5nZXRBY2VzKCkuZ2V0KDMpID09IGFjZUEpOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxJbk1lbW9yeUFjZT4gY3JlYXRlQWNlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8SW5NZW1vcnlBY2U+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChhY2VBKTsKLSAgICAgICAgICAgICAgICBhZGQoYWNlUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBY2UgY3JlYXRlQWNlKFN0cmluZyBwcmluY2lwYWxJZCwgU3RyaW5nIHBlcm1pc3Npb24pIHsKLSAgICAgICAgQWNjZXNzQ29udHJvbEVudHJ5SW1wbCBhY2UgPSBuZXcgQWNjZXNzQ29udHJvbEVudHJ5SW1wbChuZXcgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsKHByaW5jaXBhbElkKSwKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IHBlcm1pc3Npb24gfSkpOwotICAgICAgICByZXR1cm4gYWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNDb21tb25zQWNlKEFjbCBhY2wsIFN0cmluZyBwcmluY2lwYWxJZCwgU3RyaW5nIHBlcm1pc3Npb24pIHsKLSAgICAgICAgZm9yIChBY2UgYWNlIDogYWNsLmdldEFjZXMoKSkgewotICAgICAgICAgICAgaWYgKGFjZS5nZXRQcmluY2lwYWxJZCgpLmVxdWFscyhwcmluY2lwYWxJZCkgJiYgYWNlLmdldFBlcm1pc3Npb25zKCkuZ2V0KDApLmVxdWFscyhwZXJtaXNzaW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0Rpc2NvdmVyeVNlcnZpY2VUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9EaXNjb3ZlcnlTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZlMTc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L0Rpc2NvdmVyeVNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuT2JqZWN0U2VydmljZVRlc3QuT2JqZWN0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwucmVwb3NpdG9yeS5PYmplY3RHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERpc2NvdmVyeVNlcnZpY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGlzY292ZXJ5U2VydmljZVRlc3QuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZPTERFUl9UWVBFX0lEID0gT2JqZWN0U2VydmljZVRlc3QuVEVTVF9GT0xERVJfVFlQRV9JRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9ET0NVTUVOVF9UWVBFX0lEID0gT2JqZWN0U2VydmljZVRlc3QuVEVTVF9ET0NVTUVOVF9UWVBFX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZPTERFUl9TVFJJTkdfUFJPUF9JRCA9IE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfRk9MREVSX1NUUklOR19QUk9QX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RPQ1VNRU5UX1NUUklOR19QUk9QX0lEID0gT2JqZWN0U2VydmljZVRlc3QuVEVTVF9ET0NVTUVOVF9TVFJJTkdfUFJPUF9JRDsKLQotICAgIEBPdmVycmlkZQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgc3VwZXIuc2V0VHlwZUNyZWF0b3JDbGFzcyhPYmplY3RUZXN0VHlwZVN5c3RlbUNyZWF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeSgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RRdWVyeSgpIC4uLiIpOwotCi0gICAgICAgIE9iamVjdEdlbmVyYXRvciBnZW4gPSBuZXcgT2JqZWN0R2VuZXJhdG9yKGZGYWN0b3J5LCBmTmF2U3ZjLCBmT2JqU3ZjLCBmUmVwU3ZjLCBmUmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgIE9iamVjdEdlbmVyYXRvci5Db250ZW50S2luZC5MT1JFTV9JUFNVTV9URVhUKTsKLSAgICAgICAgZ2VuLnNldE51bWJlck9mRG9jdW1lbnRzVG9DcmVhdGVQZXJGb2xkZXIoMyk7Ci0gICAgICAgIGdlbi5zZXREb2N1bWVudFR5cGVJZChURVNUX0RPQ1VNRU5UX1RZUEVfSUQpOwotICAgICAgICBnZW4uc2V0Rm9sZGVyVHlwZUlkKFRFU1RfRk9MREVSX1RZUEVfSUQpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wc1RvU2V0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BzVG9TZXQuYWRkKFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQpOwotICAgICAgICBnZW4uc2V0RG9jdW1lbnRQcm9wZXJ0aWVzVG9HZW5lcmF0ZShwcm9wc1RvU2V0KTsKLQotICAgICAgICBwcm9wc1RvU2V0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BzVG9TZXQuYWRkKFRFU1RfRk9MREVSX1NUUklOR19QUk9QX0lEKTsKLSAgICAgICAgZ2VuLnNldEZvbGRlclByb3BlcnRpZXNUb0dlbmVyYXRlKHByb3BzVG9TZXQpOwotCi0gICAgICAgIGdlbi5jcmVhdGVGb2xkZXJIaWVyYWNoeSgyLCAyLCBmUm9vdEZvbGRlcklkKTsKLQotICAgICAgICBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORTsKLSAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9IG51bGw7Ci0gICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBudWxsOwotICAgICAgICBCaWdJbnRlZ2VyIHNraXBDb3VudCA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBURVNUX0RPQ1VNRU5UX1RZUEVfSUQgKyAiIFdIRVJFICIgKyBURVNUX0RPQ1VNRU5UX1NUUklOR19QUk9QX0lECi0gICAgICAgICAgICAgICAgKyAiPSdNeSBEb2MgU3RyaW5nUHJvcGVydHkgMSciOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGZEaXNjU3ZjLnF1ZXJ5KGZSZXBvc2l0b3J5SWQsIHN0YXRlbWVudCwgc2VhcmNoQWxsVmVyc2lvbnMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgIiArIFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQgKyAiIEZST00gIiArIFRFU1RfRE9DVU1FTlRfVFlQRV9JRCArICIgV0hFUkUgIgotICAgICAgICAgICAgICAgICsgVEVTVF9ET0NVTUVOVF9TVFJJTkdfUFJPUF9JRCArICI9J015IERvYyBTdHJpbmdQcm9wZXJ0eSAxJyI7Ci0gICAgICAgIHJlcyA9IGZEaXNjU3ZjLnF1ZXJ5KGZSZXBvc2l0b3J5SWQsIHN0YXRlbWVudCwgc2VhcmNoQWxsVmVyc2lvbnMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5nZXQoMCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOyAvLyBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcmVkCi0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gY21pczpmb2xkZXIiOwotICAgICAgICByZXMgPSBmRGlzY1N2Yy5xdWVyeShmUmVwb3NpdG9yeUlkLCBzdGF0ZW1lbnQsIHNlYXJjaEFsbFZlcnNpb25zLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBudWxsKTsKLSAgICAgICAgLy8gcm9vdCArIDIgYXQgbGV2ZWwgMSArIDIqMiBhdCBsZXZlbCAyID0gNwotICAgICAgICBhc3NlcnRFcXVhbHMoNywgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoOSksIHJlcy5nZXROdW1JdGVtcygpKTsKLSAgICAgICAgICogCi0gICAgICAgICAqIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6Zm9sZGVyIjsgcmVzID0KLSAgICAgICAgICogZkRpc2NTdmMucXVlcnkoZlJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICogaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAqIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOyAvLyByb290ICsgMiBhdCBsZXZlbCAxICsgMioyIGF0IGxldmVsIDIgPQotICAgICAgICAgKiA3IGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoNyksIHJlcy5nZXROdW1JdGVtcygpKTsKLSAgICAgICAgICogCi0gICAgICAgICAqIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6Zm9sZGVyIjsgcmVzID0KLSAgICAgICAgICogZkRpc2NTdmMucXVlcnkoZlJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICogaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAqIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOyAvLyByb290ICsgMiBhdCBsZXZlbCAxICsgMioyIGF0IGxldmVsIDIgPQotICAgICAgICAgKiA3IGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoNyksIHJlcy5nZXROdW1JdGVtcygpKTsKLSAgICAgICAgICogCi0gICAgICAgICAqIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6Zm9sZGVyIFdIRVJFIG5hbWU9J0plbnMnIjsgcmVzID0KLSAgICAgICAgICogZkRpc2NTdmMucXVlcnkoZlJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICogaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAqIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOyBhc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLAotICAgICAgICAgKiByZXMuZ2V0TnVtSXRlbXMoKSk7Ci0gICAgICAgICAqLwotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RRdWVyeSgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFnaW5nKCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdFF1ZXJ5KCkgLi4uIik7Ci0KLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudDsKLSAgICAgICAgT2JqZWN0TGlzdCByZXM7Ci0gICAgICAgIE9iamVjdEdlbmVyYXRvciBnZW4gPSBuZXcgT2JqZWN0R2VuZXJhdG9yKGZGYWN0b3J5LCBmTmF2U3ZjLCBmT2JqU3ZjLCBmUmVwU3ZjLCBmUmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgIE9iamVjdEdlbmVyYXRvci5Db250ZW50S2luZC5MT1JFTV9JUFNVTV9URVhUKTsKLSAgICAgICAgZ2VuLnNldE51bWJlck9mRG9jdW1lbnRzVG9DcmVhdGVQZXJGb2xkZXIoMyk7Ci0gICAgICAgIGdlbi5zZXREb2N1bWVudFR5cGVJZChURVNUX0RPQ1VNRU5UX1RZUEVfSUQpOwotICAgICAgICBnZW4uc2V0Rm9sZGVyVHlwZUlkKFRFU1RfRk9MREVSX1RZUEVfSUQpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wc1RvU2V0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BzVG9TZXQuYWRkKFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQpOwotICAgICAgICBnZW4uc2V0RG9jdW1lbnRQcm9wZXJ0aWVzVG9HZW5lcmF0ZShwcm9wc1RvU2V0KTsKLQotICAgICAgICBwcm9wc1RvU2V0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BzVG9TZXQuYWRkKFRFU1RfRk9MREVSX1NUUklOR19QUk9QX0lEKTsKLSAgICAgICAgZ2VuLnNldEZvbGRlclByb3BlcnRpZXNUb0dlbmVyYXRlKHByb3BzVG9TZXQpOwotCi0gICAgICAgIGdlbi5jcmVhdGVGb2xkZXJIaWVyYWNoeSgyLCAyLCBmUm9vdEZvbGRlcklkKTsKLQotICAgICAgICBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORTsKLSAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9IG51bGw7Ci0gICAgICAgIEJpZ0ludGVnZXIgc2tpcENvdW50ID0gQmlnSW50ZWdlci52YWx1ZU9mKDApOwotICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zID0gQmlnSW50ZWdlci52YWx1ZU9mKDMpOwotCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGJvb2xlYW4gaGFzTW9yZUl0ZW1zID0gdHJ1ZTsKLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCI7Ci0gICAgICAgIHdoaWxlIChoYXNNb3JlSXRlbXMpIHsKLSAgICAgICAgICAgIHJlcyA9IGZEaXNjU3ZjLnF1ZXJ5KGZSZXBvc2l0b3J5SWQsIHN0YXRlbWVudCwgc2VhcmNoQWxsVmVyc2lvbnMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBudWxsKTsKLSAgICAgICAgICAgIGhhc01vcmVJdGVtcyA9IHJlcy5oYXNNb3JlSXRlbXMoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgICAgICBpZiAocmVzLmdldE51bUl0ZW1zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg5TCwgcmVzLmdldE51bUl0ZW1zKCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2tpcENvdW50ID0gc2tpcENvdW50LmFkZChtYXhJdGVtcyk7Ci0gICAgICAgICAgICArK2NvdW50OwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBjb3VudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9Gb2xkZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9Gb2xkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MjFlMmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvRm9sZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmFwaS5GaWxlYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZpbGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouYXBpLlN0b3JlZE9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbC5Gb2xkZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnN0b3JlZG9iai5pbXBsLk9iamVjdFN0b3JlSW1wbDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIFNvbWUgdGVzdCBkaXJlY3RseSBhZ2FpbnN0IHRoZSBpbi1tZW1vcnkgZm9sZGVyIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEZvbGRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIE9iamVjdFN0b3JlSW1wbCBmU3RvcmU7Ci0gICAgcHJpdmF0ZSBGb2xkZXJJbXBsIGZSb290OwotICAgIHByaXZhdGUgRm9sZGVySW1wbCBmMTsKLSAgICBwcml2YXRlIEZvbGRlckltcGwgZjI7Ci0gICAgcHJpdmF0ZSBGb2xkZXJJbXBsIGYzOwotICAgIHByaXZhdGUgRm9sZGVySW1wbCBmNDsKLSAgICBwcml2YXRlIEZvbGRlckltcGwgZjExOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1JFUE9TSVRPUllfSUQgPSAiVGVzdFJlcG9zaXRvcnlJZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAidXNlciI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZlN0b3JlID0gbmV3IE9iamVjdFN0b3JlSW1wbChURVNUX1JFUE9TSVRPUllfSUQpOwotICAgICAgICBjcmVhdGVGb2xkZXJzKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kR2V0Rm9sZGVycygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZUZvbGRlcigiRm9sZGVyIDEiLCBmUm9vdCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgZXhjZXB0aW9uIGlmIGZvbGRlciBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZjEuZ2V0TmFtZSgpLCAiRm9sZGVyIDEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGYxMS5nZXROYW1lKCksICJGb2xkZXIgMS4xIik7Ci0gICAgICAgIGFzc2VydE51bGwoZlJvb3QuZ2V0UGFyZW50SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmUm9vdC5nZXRJZCgpLCBmMS5nZXRQYXJlbnRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGYxLmdldElkKCksIGYxMS5nZXRQYXJlbnRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGluZy5QQVRIX1NFUEFSQVRPUiwgZ2V0UGF0aChmUm9vdCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIi9Gb2xkZXIgMSIsIGdldFBhdGgoZjEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIvRm9sZGVyIDEvRm9sZGVyIDEuMSIsIGdldFBhdGgoZjExKSk7Ci0gICAgICAgIFN0b3JlZE9iamVjdCBmVGVzdCA9IGZTdG9yZS5nZXRPYmplY3RCeVBhdGgoIi8iLCBVU0VSKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZSb290LCBmVGVzdCk7Ci0gICAgICAgIGZUZXN0ID0gZlN0b3JlLmdldE9iamVjdEJ5UGF0aCgiL0ZvbGRlciAxIiwgVVNFUik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmMSwgZlRlc3QpOwotICAgICAgICBmVGVzdCA9IGZTdG9yZS5nZXRPYmplY3RCeVBhdGgoIi9Gb2xkZXIgMS9Gb2xkZXIgMS4xIiwgVVNFUik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmMTEsIGZUZXN0KTsKLSAgICAgICAgTGlzdDxGaWxlYWJsZT4gc3ViRm9sZGVycyA9IGZTdG9yZS5nZXRDaGlsZHJlbihmUm9vdCwgLTEsIC0xLCAidXNlciIsIGZhbHNlKS5nZXRDaGlsZHJlbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc3ViRm9sZGVycy5zaXplKCkpOwotICAgICAgICBzdWJGb2xkZXJzID0gZlN0b3JlLmdldENoaWxkcmVuKGYyLCAtMSwgLTEsICJ1c2VyIiwgZmFsc2UpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzdWJGb2xkZXJzLnNpemUoKSk7Ci0gICAgICAgIHN1YkZvbGRlcnMgPSBmU3RvcmUuZ2V0Q2hpbGRyZW4oZjEsIC0xLCAtMSwgInVzZXIiLCBmYWxzZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN1YkZvbGRlcnMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5hbWVGb2xkZXIoKSB7Ci0gICAgICAgIC8vIHJlbmFtZSB0b3AgbGV2ZWwgZm9sZGVyCi0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gIkZvbGRlciBCIjsKLSAgICAgICAgU3RyaW5nIG9sZFBhdGggPSBnZXRQYXRoKGYyKTsKLSAgICAgICAgZlN0b3JlLnJlbmFtZShmMiwgbmV3TmFtZSwgVVNFUik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmMi5nZXROYW1lKCksIG5ld05hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UGF0aChmMiksIEZpbGluZy5QQVRIX1NFUEFSQVRPUiArIG5ld05hbWUpOwotICAgICAgICBhc3NlcnROdWxsKGZTdG9yZS5nZXRPYmplY3RCeVBhdGgob2xkUGF0aCwgVVNFUikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZjIsIGZTdG9yZS5nZXRPYmplY3RCeVBhdGgoRmlsaW5nLlBBVEhfU0VQQVJBVE9SICsgbmV3TmFtZSwgVVNFUikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlN0b3JlLnJlbmFtZShmMiwgIkZvbGRlciAzIiwgVVNFUik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGFsbG93IHRvIHJlbmFtZSBhIGZvbGRlciB0byBhbiBleGlzdGluZyBuYW1lIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW5hbWUgc3ViIGZvbGRlcgotICAgICAgICBvbGRQYXRoID0gZ2V0UGF0aChmMTEpOwotICAgICAgICBmU3RvcmUucmVuYW1lKGYxMSwgbmV3TmFtZSwgVVNFUik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmMTEuZ2V0TmFtZSgpLCBuZXdOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFBhdGgoZjExKSwgIi9Gb2xkZXIgMS9Gb2xkZXIgQiIpOwotICAgICAgICBhc3NlcnROdWxsKGZTdG9yZS5nZXRPYmplY3RCeVBhdGgob2xkUGF0aCwgVVNFUikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZjExLCBmU3RvcmUuZ2V0T2JqZWN0QnlQYXRoKCIvRm9sZGVyIDEvRm9sZGVyIEIiLCBVU0VSKSk7Ci0KLSAgICAgICAgLy8gcmVuYW1lIHRvIGV4aXN0aW5nIG5hbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCW5ld05hbWUgPSBmMy5nZXROYW1lKCk7Ci0gICAgICAgICAgICBmU3RvcmUucmVuYW1lKGYyLCBuZXdOYW1lLCBVU0VSKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYWxsb3cgdG8gcmVuYW1lIGEgZm9sZGVyIHRvIGFuIGV4aXN0aW5nIG5hbWUiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbmFtZSB0byBzYW1lIG5hbWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld05hbWUgPSBmMi5nZXROYW1lKCk7Ci0gICAgICAgIAlmU3RvcmUucmVuYW1lKGYyLCBmMi5nZXROYW1lKCksIFVTRVIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYyLmdldE5hbWUoKSwgbmV3TmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJSZW5hbWUgd2l0aCBzYW1lIG5hbWUgYXMgYmVmb3JlIHNob3VsZCBzdWNjZWVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVuYW1lIHJvb3QgZm9sZGVyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmU3RvcmUucmVuYW1lKGZSb290LCAiYWJjIiwgVVNFUik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIHJlbmFtZSByb290IGZvbGRlciIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZUZvbGRlcigpIHsKLSAgICAgICAgU3RyaW5nIG9sZFBhdGggPSBnZXRQYXRoKGYxKTsKLSAgICAgICAgRm9sZGVyIGYxUGFyZW50ID0gZlJvb3Q7Ci0gICAgICAgIGZTdG9yZS5tb3ZlKGYxLCBmMVBhcmVudCwgZjMsIFVTRVIpOwotICAgICAgICBhc3NlcnROdWxsKGZTdG9yZS5nZXRPYmplY3RCeVBhdGgob2xkUGF0aCwgVVNFUikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UGF0aChmMSksICIvRm9sZGVyIDMvRm9sZGVyIDEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGYxLCBmU3RvcmUuZ2V0T2JqZWN0QnlQYXRoKCIvRm9sZGVyIDMvRm9sZGVyIDEiLCBVU0VSKSk7Ci0KLSAgICAgICAgZlN0b3JlLnJlbmFtZShmMiwgIkZvbGRlciAxIiwgVVNFUik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGb2xkZXIgZjJQYXJlbnQgPSBmUm9vdDsKLSAgICAgICAgICAgIGZTdG9yZS5tb3ZlKGYyLCBmMlBhcmVudCwgZjMsIFVTRVIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBtb3ZlIGZvbGRlciB0byBhIGZvbGRlciB0aGF0IGhhcyBhIGNoaWxkIHdpdGggc2FtZSBuYW1lIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVGb2xkZXIoKSB7Ci0gICAgICAgIFN0cmluZyBvbGRQYXRoID0gZ2V0UGF0aChmMik7Ci0gICAgICAgIGZTdG9yZS5kZWxldGVPYmplY3QoZjIuZ2V0SWQoKSwgdHJ1ZSwgIlRlc3RVc2VyIik7Ci0gICAgICAgIGFzc2VydE51bGwoZlN0b3JlLmdldE9iamVjdEJ5UGF0aChvbGRQYXRoLCBVU0VSKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZTdG9yZS5kZWxldGVPYmplY3QoZjEuZ2V0SWQoKSwgdHJ1ZSwgIlRlc3RVc2VyIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIG1vdmUgZm9sZGVyIHRoYXQgaGFzIGNoaWxkcmVuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRm9sZGVycygpIHsKLSAgICAgICAgZlJvb3QgPSAoRm9sZGVySW1wbCkgZlN0b3JlLmdldFJvb3RGb2xkZXIoKTsKLSAgICAgICAgZjEgPSAoRm9sZGVySW1wbCkgY3JlYXRlRm9sZGVyKCJGb2xkZXIgMSIsIGZSb290KTsKLQotICAgICAgICBmMiA9IChGb2xkZXJJbXBsKSBjcmVhdGVGb2xkZXIoIkZvbGRlciAyIiwgZlJvb3QpOwotCi0gICAgICAgIGYzID0gKEZvbGRlckltcGwpIGNyZWF0ZUZvbGRlcigiRm9sZGVyIDMiLCBmUm9vdCk7Ci0KLSAgICAgICAgZjQgPSAoRm9sZGVySW1wbCkgY3JlYXRlRm9sZGVyKCJGb2xkZXIgNCIsIGZSb290KTsKLQotICAgICAgICBmMTEgPSAoRm9sZGVySW1wbCkgY3JlYXRlRm9sZGVyKCJGb2xkZXIgMS4xIiwgZjEpOwotICAgIH0KLQotICAgIHByaXZhdGUgRm9sZGVyIGNyZWF0ZUZvbGRlcihTdHJpbmcgbmFtZSwgRm9sZGVyIHBhcmVudCkgewotICAgICAgICByZXR1cm4gZlN0b3JlLmNyZWF0ZUZvbGRlcihuYW1lLCBudWxsLCAidXNlciIsIHBhcmVudCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIHJldHVybiBmU3RvcmUuZ2V0Rm9sZGVyUGF0aChmb2xkZXIuZ2V0SWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvTXVsdGlGaWxpbmdUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9NdWx0aUZpbGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlZjI4MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9NdWx0aUZpbGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE11bHRpRmlsaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0U2VydmljZVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE11bHRpRmlsaW5nVGVzdC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEVfSUQgPSBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLkNPTVBMRVhfVFlQRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX1RZUEVfSUQgPSBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRm9sZGVyVHlwZSgpLmdldElkKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORklMRURfRE9DX05BTUUgPSAiVW5maWxlZCBkb2N1bWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRURfRE9DX05BTUUgPSAiTXkgUmVuYW1lZCBEb2N1bWVudCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmSWQxOwotICAgIHByaXZhdGUgU3RyaW5nIGZJZDI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZklkMTE7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVW5maWxlZERvY3VtZW50KCkgewotICAgICAgICBMT0cuZGVidWcoIkJlZ2luIHRlc3RDcmVhdFVuZmlsZWREb2N1bWVudCgpIik7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZVVuZmlsZWREb2N1bWVudCgpOwotICAgICAgICBTdHJpbmcgZG9jSWQyID0gZ2V0RG9jdW1lbnQoZG9jSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZG9jSWQsIGRvY0lkMik7Ci0KLSAgICAgICAgLy8gZ2V0IG9iamVjdCBwYXJlbnRzLCBtdXN0IGJlIGVtcHR5Ci0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcmVzID0gZk5hdlN2Yy5nZXRPYmplY3RQYXJlbnRzKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCAiKiIsIGZhbHNlLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIHRydWUsIG51bGwpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcy5zaXplKCksIDApOwotCi0gICAgICAgIC8vIHRlc3Qgd2l0aCBhIGRpZmZlcmVudCB1c2VyIHRoYW4gQWRtaW46Ci0gICAgICAgIHN3aXRjaENhbGxDb250ZXh0KCJBbGljZSIpOwotICAgICAgICBkb2NJZCA9IGNyZWF0ZURvY3VtZW50KFVORklMRURfRE9DX05BTUUgKyAiXzIiLCBudWxsLCBET0NVTUVOVF9UWVBFX0lELCB0cnVlKTsKLSAgICAgICAgZG9jSWQyID0gZ2V0RG9jdW1lbnQoZG9jSWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZG9jSWQsIGRvY0lkMik7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgdGVzdENyZWF0VW5maWxlZERvY3VtZW50KCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlRmlsZWREb2N1bWVudFVuZmlsZWQoKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiQmVnaW4gdGVzdE1ha2VGaWxlZERvY3VtZW50VW5maWxlZCgpIik7Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRG9jdW1lbnQoIkZpbGVkIGRvY3VtZW50IiwgZlJvb3RGb2xkZXJJZCwgRE9DVU1FTlRfVFlQRV9JRCwgdHJ1ZSk7Ci0KLSAgICAgICAgZk11bHRpU3ZjLnJlbW92ZU9iamVjdEZyb21Gb2xkZXIoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIGZSb290Rm9sZGVySWQsIG51bGwpOwotICAgICAgICBMaXN0PE9iamVjdFBhcmVudERhdGE+IHBhcmVudHMgPSBmTmF2U3ZjLmdldE9iamVjdFBhcmVudHMoZlJlcG9zaXRvcnlJZCwgZG9jSWQsICIqIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwYXJlbnRzLnNpemUoKSk7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgdGVzdE1ha2VGaWxlZERvY3VtZW50VW5maWxlZCgpIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRG9jdW1lbnRUb0ZvbGRlcigpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJCZWdpbiB0ZXN0QWRkRG9jdW1lbnRUb0ZvbGRlcigpIik7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZVVuZmlsZWREb2N1bWVudCgpOwotICAgICAgICBhZGREb2N1bWVudFRvRm9sZGVyKGRvY0lkKTsKLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgdGVzdEFkZERvY3VtZW50VG9Gb2xkZXIoKSIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZURvY3VtZW50RnJvbUZvbGRlcigpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJCZWdpbiB0ZXN0UmVtb3ZlRG9jdW1lbnRGcm9tRm9sZGVyKCkiKTsKLQotICAgICAgICBTdHJpbmcgZG9jSWQgPSBjcmVhdGVVbmZpbGVkRG9jdW1lbnQoKTsKLSAgICAgICAgcmVtb3ZlRG9jdW1lbnRGcm9tRm9sZGVyKGRvY0lkKTsKLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgdGVzdFJlbW92ZURvY3VtZW50RnJvbUZvbGRlcigpIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW92ZU11bHRpRmlsZWREb2N1bWVudCgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJiZWdpbiB0ZXN0TW92ZU11bHRpRmlsZWREb2N1bWVudCgpIik7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZVVuZmlsZWREb2N1bWVudCgpOwotICAgICAgICBwcmVwYXJlTXVsdGlGaWxlZERvY3VtZW50KGRvY0lkKTsKLSAgICAgICAgU3RyaW5nIG5ld0ZvbGRlcklkID0gY3JlYXRlRm9sZGVyKCJmb2xkZXIyLjEiLCBmSWQyLCBGT0xERVJfVFlQRV9JRCk7Ci0KLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpOwotICAgICAgICBmT2JqU3ZjLm1vdmVPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG5ld0ZvbGRlcklkLCBmSWQxMSwgbnVsbCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcGFyZW50cyA9IGZOYXZTdmMuZ2V0T2JqZWN0UGFyZW50cyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgIioiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHBhcmVudHMuc2l6ZSgpKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZE5ld1BhcmVudCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kT2xkUGFyZW50ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoT2JqZWN0UGFyZW50RGF0YSBwYXJlbnREYXRhIDogcGFyZW50cykgewotICAgICAgICAgICAgaWYgKHBhcmVudERhdGEuZ2V0T2JqZWN0KCkuZ2V0SWQoKS5lcXVhbHMobmV3Rm9sZGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROZXdQYXJlbnQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudERhdGEuZ2V0T2JqZWN0KCkuZ2V0SWQoKS5lcXVhbHMoZklkMTEpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRPbGRQYXJlbnQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIkFmdGVyIG1vdmUgbmV3IHRhcmdldCBzaG91bGQgYmUgYSBwYXJlbnQiLCBmb3VuZE5ld1BhcmVudCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJBZnRlciBtb3ZlIG9sZCBzb3VyY2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBhIHBhcmVudCIsIGZvdW5kT2xkUGFyZW50KTsKLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgdGVzdE1vdmVNdWx0aUZpbGVkRG9jdW1lbnQoKSIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlbmFtZU11bHRpRmlsZWREb2N1bWVudCgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJiZWdpbiB0ZXN0UmVuYW1lTXVsdGlGaWxlZERvY3VtZW50KCkiKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlVW5maWxlZERvY3VtZW50KCk7Ci0gICAgICAgIHByZXBhcmVNdWx0aUZpbGVkRG9jdW1lbnQoZG9jSWQpOwotICAgICAgICByZW5hbWVEb2N1bWVudEFuZENoZWNrUmVzdWx0KGRvY0lkKTsKLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgdGVzdFJlbmFtZU11bHRpRmlsZWREb2N1bWVudCgpIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuYW1lTXVsdGlGaWxlZERvY3VtZW50V2l0aE5hbWVDb25mbGljdCgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJiZWdpbiB0ZXN0UmVuYW1lTXVsdGlGaWxlZERvY3VtZW50KCkiKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlVW5maWxlZERvY3VtZW50KCk7Ci0gICAgICAgIHByZXBhcmVNdWx0aUZpbGVkRG9jdW1lbnQoZG9jSWQpOwotICAgICAgICAvLyBjcmVhdGUgYSBkb2N1bWVudCB3aXRoIHRoZSBuZXcgbmFtZSBpbiBvbmUgb2YgdGhlIGZvbGRlcnMKLSAgICAgICAgY3JlYXRlRG9jdW1lbnQoUkVOQU1FRF9ET0NfTkFNRSwgZklkMTEsIERPQ1VNRU5UX1RZUEVfSUQsIHRydWUpOwotICAgICAgICAvLyB0cnkgdG8gcmVuYW1lIHdoaWNoIHNob3VsZCBmYWlsIG5vdwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVuYW1lRG9jdW1lbnRBbmRDaGVja1Jlc3VsdChkb2NJZCk7Ci0gICAgICAgICAgICBmYWlsKCJBIHJlbmFtZSB0byBhbiBleGlzdGluZyBuYW1lIGluIG9uZSBvZiB0aGUgZmlsZWQgZm9sZGVycyBzaG91bGQgZmFpbCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBMT0cuZGVidWcoIkVuZCB0ZXN0UmVuYW1lTXVsdGlGaWxlZERvY3VtZW50KCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEb2N1bWVudEZyb21BbGxGb2xkZXJzKCkgewotICAgICAgICBMT0cuZGVidWcoIkJlZ2luIHRlc3RSZW1vdmVEb2N1bWVudEZyb21BbGxGb2xkZXJzKCkiKTsKLQotICAgICAgICBTdHJpbmcgZG9jSWQgPSBjcmVhdGVVbmZpbGVkRG9jdW1lbnQoKTsKLSAgICAgICAgcmVtb3ZlRG9jdW1lbnRGcm9tQWxsRm9sZGVycyhkb2NJZCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiRW5kIHRlc3RSZW1vdmVEb2N1bWVudEZyb21BbGxGb2xkZXJzKCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRWZXJzaW9uZWREb2N1bWVudFRvRm9sZGVyKCkgewotICAgICAgICBMT0cuZGVidWcoIkJlZ2luIHRlc3RBZGRWZXJzaW9uZWREb2N1bWVudFRvRm9sZGVyKCkiKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoKTsKLSAgICAgICAgYWRkRG9jdW1lbnRUb0ZvbGRlcihkb2NJZCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiRW5kIHRlc3RBZGRWZXJzaW9uZWREb2N1bWVudFRvRm9sZGVyKCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWZXJzaW9uZWREb2N1bWVudEZyb21Gb2xkZXIoKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiQmVnaW4gdGVzdFJlbW92ZVZlcnNpb25lZERvY3VtZW50RnJvbUZvbGRlcigpIik7Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoKTsKLSAgICAgICAgcmVtb3ZlRG9jdW1lbnRGcm9tRm9sZGVyKGRvY0lkKTsKLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgdGVzdFJlbW92ZVZlcnNpb25lZERvY3VtZW50RnJvbUZvbGRlcigpIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmVyc2lvbmVkRG9jdW1lbnRGcm9tQWxsRm9sZGVycygpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJCZWdpbiB0ZXN0UmVtb3ZlVmVyc2lvbmVkRG9jdW1lbnRGcm9tQWxsRm9sZGVycygpIik7Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoKTsKLSAgICAgICAgcmVtb3ZlRG9jdW1lbnRGcm9tQWxsRm9sZGVycyhkb2NJZCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiRW5kIHRlc3RSZW1vdmVWZXJzaW9uZWREb2N1bWVudEZyb21BbGxGb2xkZXJzKCkiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRm9sZGVycygpIHsKLSAgICAgICAgZklkMSA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMSIsIGZSb290Rm9sZGVySWQsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgZklkMiA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMiIsIGZSb290Rm9sZGVySWQsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgZklkMTEgPSBjcmVhdGVGb2xkZXIoImZvbGRlcjEuMSIsIGZJZDEsIEZPTERFUl9UWVBFX0lEKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRG9jdW1lbnRUb0ZvbGRlcihTdHJpbmcgZG9jSWQpIHsKLQotICAgICAgICBMaXN0PFN0cmluZz4gZm9sZGVySWRzID0gcHJlcGFyZU11bHRpRmlsZWREb2N1bWVudChkb2NJZCk7Ci0KLSAgICAgICAgLy8gZ2V0IG9iamVjdCBwYXJlbnRzLCBtdXN0IGNvbnRhaW4gYWxsIGZvbGRlcnMKLSAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiByZXMgPSBmTmF2U3ZjLmdldE9iamVjdFBhcmVudHMoZlJlcG9zaXRvcnlJZCwgZG9jSWQsICIqIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCByZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChPYmplY3RQYXJlbnREYXRhIG9wZCA6IHJlcykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb2xkZXJJZHMuY29udGFpbnMob3BkLmdldE9iamVjdCgpLmdldElkKCkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCYXNlVHlwZUlkLkNNSVNfRk9MREVSLCBvcGQuZ2V0T2JqZWN0KCkuZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhVTkZJTEVEX0RPQ19OQU1FLCBvcGQuZ2V0UmVsYXRpdmVQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRyeSB2ZXJzaW9uIHNwZWNpZmljIGZpbGluZywgc2hvdWxkIGZhaWwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZNdWx0aVN2Yy5hZGRPYmplY3RUb0ZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZklkMSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQWRkaW5nIG5vdCBhbGwgdmVyc2lvbnMgdG8gYSBmb2xkZXIgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVEb2N1bWVudEZyb21Gb2xkZXIoU3RyaW5nIGRvY0lkKSB7Ci0gICAgICAgIHByZXBhcmVNdWx0aUZpbGVkRG9jdW1lbnQoZG9jSWQpOwotCi0gICAgICAgIGZNdWx0aVN2Yy5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBmSWQxLCBudWxsKTsKLSAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBwYXJlbnRzID0gZk5hdlN2Yy5nZXRPYmplY3RQYXJlbnRzKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCAiKiIsIGZhbHNlLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIHRydWUsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGFyZW50cy5zaXplKCkpOwotICAgICAgICBmb3IgKE9iamVjdFBhcmVudERhdGEgb3BkIDogcGFyZW50cykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZklkMS5lcXVhbHMob3BkLmdldE9iamVjdCgpLmdldElkKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZNdWx0aVN2Yy5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBmSWQyLCBudWxsKTsKLSAgICAgICAgcGFyZW50cyA9IGZOYXZTdmMuZ2V0T2JqZWN0UGFyZW50cyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgIioiLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmVudHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChPYmplY3RQYXJlbnREYXRhIG9wZCA6IHBhcmVudHMpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGZJZDEuZXF1YWxzKG9wZC5nZXRPYmplY3QoKS5nZXRJZCgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmTXVsdGlTdmMucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZklkMTEsIG51bGwpOwotICAgICAgICBwYXJlbnRzID0gZk5hdlN2Yy5nZXRPYmplY3RQYXJlbnRzKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcGFyZW50cy5zaXplKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVEb2N1bWVudEZyb21BbGxGb2xkZXJzKFN0cmluZyBkb2NJZCkgewotICAgICAgICBwcmVwYXJlTXVsdGlGaWxlZERvY3VtZW50KGRvY0lkKTsKLQotICAgICAgICBmTXVsdGlTdmMucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcGFyZW50cyA9IGZOYXZTdmMuZ2V0T2JqZWN0UGFyZW50cyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgIioiLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBhcmVudHMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVVbmZpbGVkRG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudChVTkZJTEVEX0RPQ19OQU1FLCBudWxsLCBET0NVTUVOVF9UWVBFX0lELCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwcmVwYXJlTXVsdGlGaWxlZERvY3VtZW50KFN0cmluZyBkb2NJZCkgewotICAgICAgICBjcmVhdGVGb2xkZXJzKCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBkb2N1bWVudCB0byB0aHJlZSBmb2xkZXJzCi0gICAgICAgIGZNdWx0aVN2Yy5hZGRPYmplY3RUb0ZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZklkMSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGZNdWx0aVN2Yy5hZGRPYmplY3RUb0ZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZklkMiwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIGZNdWx0aVN2Yy5hZGRPYmplY3RUb0ZvbGRlcihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZklkMTEsIHRydWUsIG51bGwpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmb2xkZXJJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9sZGVySWRzLmFkZChmSWQxKTsKLSAgICAgICAgZm9sZGVySWRzLmFkZChmSWQyKTsKLSAgICAgICAgZm9sZGVySWRzLmFkZChmSWQxMSk7Ci0KLSAgICAgICAgcmV0dXJuIGZvbGRlcklkczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVuYW1lRG9jdW1lbnRBbmRDaGVja1Jlc3VsdChTdHJpbmcgZG9jSWQpIHsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oZG9jSWQpOwotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCBSRU5BTUVEX0RPQ19OQU1FKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgbmV3UHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW5Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oKTsKLSAgICAgICAgZk9ialN2Yy51cGRhdGVQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCBjaGFuZ2VUb2tlbkhvbGRlciwgbmV3UHJvcHMsIG51bGwpOwotICAgICAgICBkb2NJZCA9IGlkSG9sZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIE9iamVjdERhdGEgcmVzID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgZG9jSWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgIGZhbHNlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXAgPSByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBkID0gcHJvcE1hcC5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUkVOQU1FRF9ET0NfTkFNRSwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVWZXJzaW9uZWREb2N1bWVudCgpIHsKLQotICAgICAgICByZXR1cm4gY3JlYXRlRG9jdW1lbnQoVU5GSUxFRF9ET0NfTkFNRSwgbnVsbCwgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5WRVJTSU9ORURfVFlQRSwgVmVyc2lvbmluZ1N0YXRlLk1BSk9SLAotICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN3aXRjaENhbGxDb250ZXh0KFN0cmluZyB1c2VyKSB7Ci0gICAgICAgICgoRHVtbXlDYWxsQ29udGV4dCkgZlRlc3RDYWxsQ29udGV4dCkucHV0KENhbGxDb250ZXh0LlVTRVJOQU1FLCB1c2VyKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L05hdmlnYXRpb25TZXJ2aWNlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvTmF2aWdhdGlvblNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU3NWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvTmF2aWdhdGlvblNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLkRvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwucmVwb3NpdG9yeS5PYmplY3RHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgTmF2aWdhdGlvblNlcnZpY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlVGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5hdmlnYXRpb25TZXJ2aWNlVGVzdC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9ST09UX0ZPTERFUlMgPSAxMDsKLSAgICBwcml2YXRlIFN0cmluZyBmTGV2ZWwxRm9sZGVySWQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGRyZW4oKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0Q2hpbGRyZW4oKSAuLi4iKTsKLSAgICAgICAgY3JlYXRlTGV2ZWwxRm9sZGVycygpOwotCi0gICAgICAgIGxvZy5pbmZvKCJ0ZXN0IGdldHRpbmcgYWxsIG9iamVjdHMgd2l0aCBnZXRDaGlsZHJlbiIpOwotICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zID0gQmlnSW50ZWdlci52YWx1ZU9mKE5VTV9ST09UX0ZPTERFUlMgKiAyKTsKLSAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCByZXN1bHQgPSBmTmF2U3ZjLmdldENoaWxkcmVuKGZSZXBvc2l0b3J5SWQsIGZSb290Rm9sZGVySWQsICIqIiwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPiBmb2xkZXJzID0gcmVzdWx0LmdldE9iamVjdHMoKTsKLSAgICAgICAgbG9nLmluZm8oIiBmb3VuZCAiICsgZm9sZGVycy5zaXplKCkgKyAiIGZvbGRlcnMgaW4gZ2V0Q2hpbGRyZW4oKSIpOwotICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBmb2xkZXIgOiBmb2xkZXJzKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICAgZm91bmQgZm9sZGVyIGlkICIgKyBmb2xkZXIuZ2V0T2JqZWN0KCkuZ2V0SWQoKSArICIgcGF0aCBzZWdtZW50ICIgKyBmb2xkZXIuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE5VTV9ST09UX0ZPTERFUlMsIGZvbGRlcnMuc2l6ZSgpKTsKLQotICAgICAgICBsb2cuaW5mbygidGVzdCBwYWdpbmcgd2l0aCBnZXRDaGlsZHJlbiIpOwotICAgICAgICBtYXhJdGVtcyA9IEJpZ0ludGVnZXIudmFsdWVPZigzKTsKLSAgICAgICAgc2tpcENvdW50ID0gQmlnSW50ZWdlci52YWx1ZU9mKDMpOwotICAgICAgICByZXN1bHQgPSBmTmF2U3ZjLmdldENoaWxkcmVuKGZSZXBvc2l0b3J5SWQsIGZSb290Rm9sZGVySWQsICIqIiwgbnVsbCwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgdHJ1ZSwgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0gICAgICAgIGZvbGRlcnMgPSByZXN1bHQuZ2V0T2JqZWN0cygpOwotICAgICAgICBsb2cuaW5mbygiIGZvdW5kICIgKyBmb2xkZXJzLnNpemUoKSArICIgZm9sZGVycyBpbiBnZXRDaGlsZHJlbigpIik7Ci0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJEYXRhIGZvbGRlciA6IGZvbGRlcnMpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCIgICBmb3VuZCBmb2xkZXIgaWQgIiArIGZvbGRlci5nZXRPYmplY3QoKS5nZXRJZCgpICsgIiBwYXRoIHNlZ21lbnQgIiArIGZvbGRlci5nZXRQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMywgZm9sZGVycy5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvbGRlciAzIiwgZm9sZGVycy5nZXQoMCkuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldE51bUl0ZW1zKCkubG9uZ1ZhbHVlKCkgPiAwKTsKLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0R2V0Q2hpbGRyZW4oKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGb2xkZXJUcmVlKCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdEdldEZvbGRlclRyZWUoKSAuLi4iKTsKLSAgICAgICAgY3JlYXRlRm9sZGVySGllcmFjaHkoMywgNSk7Ci0KLSAgICAgICAgbG9nLmluZm8oInRlc3QgZ2V0dGluZyBhbGwgb2JqZWN0cyB3aXRoIGdldEZvbGRlclRyZWUiKTsKLSAgICAgICAgQmlnSW50ZWdlciBkZXB0aCA9IEJpZ0ludGVnZXIudmFsdWVPZigtMSk7Ci0gICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50cyA9IHRydWU7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUZpbHRlciA9ICIqIjsKLSAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9IG51bGw7Ci0gICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZlJvb3RGb2xkZXJJZDsKLQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiB0cmVlID0gZk5hdlN2Yy5nZXRGb2xkZXJUcmVlKGZSZXBvc2l0b3J5SWQsIG9iamVjdElkLCBkZXB0aCwgcHJvcGVydHlGaWx0ZXIsCi0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50cywgbnVsbCk7Ci0KLSAgICAgICAgbG9nLmluZm8oIkRlc2NlbmRhbnRzIGZvciBvYmplY3QgaWQgIiArIG9iamVjdElkICsgIiBhcmU6ICIpOwotICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIGZvbGRlciA6IHRyZWUpIHsKLSAgICAgICAgICAgIGxvZ0ZvbGRlckNvbnRhaW5lcihmb2xkZXIsIDApOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0R2V0Rm9sZGVyVHJlZSgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2dGb2xkZXJDb250YWluZXIoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgZm9sZGVyLCBpbnQgZGVwdGgpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKLSAgICAgICAgICAgIHByZWZpeC5hcHBlbmQoIiAgICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8ocHJlZml4ICsgIm5hbWU6ICIgKyBmb2xkZXIuZ2V0T2JqZWN0KCkuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGNoaWxkcmVuID0gZm9sZGVyLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGlmIChudWxsICE9IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBsb2dGb2xkZXJDb250YWluZXIoY2hpbGQsIGRlcHRoICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREZXNjZW5kYW50cygpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RHZXREZXNjZW5kYW50cygpIC4uLiIpOwotICAgICAgICBmaW5hbCBpbnQgbnVtTGV2ZWxzID0gMzsKLSAgICAgICAgZmluYWwgaW50IGNoaWxkcmVuUGVyTGV2ZWwgPSAzOwotICAgICAgICBpbnQgb2JqQ291bnQgPSBjcmVhdGVGb2xkZXJIaWVyYWNoeShudW1MZXZlbHMsIGNoaWxkcmVuUGVyTGV2ZWwpOwotCi0gICAgICAgIGxvZy5pbmZvKCJ0ZXN0IGdldHRpbmcgYWxsIG9iamVjdHMgd2l0aCBnZXREZXNjZW5kYW50cyIpOwotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiByZXN1bHQgPSBmTmF2U3ZjLmdldERlc2NlbmRhbnRzKGZSZXBvc2l0b3J5SWQsIGZSb290Rm9sZGVySWQsCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgIioiLCBCb29sZWFuLlRSVUUsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIEJvb2xlYW4uVFJVRSwgbnVsbCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckNvbnRhaW5lciBvYmogOiByZXN1bHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCIgICBmb3VuZCBmb2xkZXIgaWQgIiArIG9iai5nZXRPYmplY3QoKS5nZXRPYmplY3QoKS5nZXRJZCgpICsgIiBwYXRoIHNlZ21lbnQgIgotICAgICAgICAgICAgICAgICAgICArIG9iai5nZXRPYmplY3QoKS5nZXRQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZU9mRGVzY3MgPSBnZXRTaXplT2ZEZXNjZW5kYW50cyhyZXN1bHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqQ291bnQsIHNpemVPZkRlc2NzKTsKLQotICAgICAgICBsb2cuaW5mbygidGVzdCBnZXR0aW5nIG9uZSBsZXZlbCB3aXRoIGdldERlc2NlbmRhbnRzIik7Ci0gICAgICAgIHJlc3VsdCA9IGZOYXZTdmMuZ2V0RGVzY2VuZGFudHMoZlJlcG9zaXRvcnlJZCwgZlJvb3RGb2xkZXJJZCwgQmlnSW50ZWdlci52YWx1ZU9mKDEpLCAiKiIsIEJvb2xlYW4uVFJVRSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBCb29sZWFuLlRSVUUsIG51bGwpOwotCi0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgb2JqIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICAgZm91bmQgZm9sZGVyIGlkICIgKyBvYmouZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCkuZ2V0SWQoKSArICIgcGF0aCBzZWdtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgKyBvYmouZ2V0T2JqZWN0KCkuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZU9mRGVzY3MgPSBnZXRTaXplT2ZEZXNjZW5kYW50cyhyZXN1bHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hpbGRyZW5QZXJMZXZlbCwgc2l6ZU9mRGVzY3MpOwotCi0gICAgICAgIGxvZy5pbmZvKCJ0ZXN0IGdldHRpbmcgdHdvIGxldmVscyB3aXRoIGdldERlc2NlbmRhbnRzIik7Ci0gICAgICAgIHJlc3VsdCA9IGZOYXZTdmMuZ2V0RGVzY2VuZGFudHMoZlJlcG9zaXRvcnlJZCwgZlJvb3RGb2xkZXJJZCwgQmlnSW50ZWdlci52YWx1ZU9mKDIpLCAiKiIsIEJvb2xlYW4uVFJVRSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBCb29sZWFuLlRSVUUsIG51bGwpOwotCi0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgb2JqIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICAgZm91bmQgZm9sZGVyIGlkICIgKyBvYmouZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCkuZ2V0SWQoKSArICIgcGF0aCBzZWdtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgKyBvYmouZ2V0T2JqZWN0KCkuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZU9mRGVzY3MgPSBnZXRTaXplT2ZEZXNjZW5kYW50cyhyZXN1bHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hpbGRyZW5QZXJMZXZlbCAqIGNoaWxkcmVuUGVyTGV2ZWwgKyBjaGlsZHJlblBlckxldmVsLCBzaXplT2ZEZXNjcyk7Ci0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0R2V0RGVzY2VuZGFudHMoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGb2xkZXJQYXJlbnQoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0Rm9sZGVyUGFyZW50KCkgLi4uIik7Ci0gICAgICAgIGNyZWF0ZUxldmVsMUZvbGRlcnMoKTsKLSAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gZkxldmVsMUZvbGRlcklkOwotCi0gICAgICAgIE9iamVjdERhdGEgcmVzdWx0ID0gZk5hdlN2Yy5nZXRGb2xkZXJQYXJlbnQoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwpOwotICAgICAgICBsb2cuaW5mbygiIGZvdW5kIHBhcmVudCBmb3IgaWQgXCciICsgZm9sZGVySWQgKyAiXCcgaXMgXCciICsgcmVzdWx0LmdldElkKCkgKyAiXCciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZSb290Rm9sZGVySWQsIHJlc3VsdC5nZXRJZCgpKTsgLy8gc2hvdWxkIGJlIHJvb3QgZm9sZGVyCi0KLSAgICAgICAgZm9sZGVySWQgPSBmUm9vdEZvbGRlcklkOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gZk5hdlN2Yy5nZXRGb2xkZXJQYXJlbnQoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgbG9nLmluZm8oIiBmb3VuZCBwYXJlbnQgZm9yIGlkICIgKyBmb2xkZXJJZCArICIgaXMgIiArIHJlc3VsdC5nZXRJZCgpKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gZ2V0IHBhcmVudCBmb3Igcm9vdCBmb2xkZXIiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzLCBlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgbG9nLmluZm8oIiBnZXRQYXJlbnQoKSBmb3Igcm9vdCBmb2xkZXIgcmFpc2VkIGV4cGVjdGVkIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdEdldEZvbGRlclBhcmVudCgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFBhZ2luZygpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RHZXRQYWdpbmcoKSAuLi4iKTsKLSAgICAgICAgLy8gY3JlYXRlIGEgZm9sZGVyCi0gICAgICAgIFN0cmluZyBmb2xkZXJJZCA9IHN1cGVyLmNyZWF0ZUZvbGRlcigiUGFnaW5nRm9sZGVyIiwgZlJvb3RGb2xkZXJJZCwgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIKLSAgICAgICAgICAgICAgICAuZ2V0Q21pc0ZvbGRlclR5cGUoKS5nZXRJZCgpKTsKLQotICAgICAgICAvLyBjcmVhdGUgc29tZSBkb2N1bWVudHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICBzdXBlci5jcmVhdGVEb2N1bWVudCgiRmlsZS0iICsgaSwgZm9sZGVySWQsICJjbWlzOmRvY3VtZW50IiwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oInRlc3QgZ2V0dGluZyBhbGwgb2JqZWN0cyB3aXRoIGdldENoaWxkcmVuIik7Ci0gICAgICAgIC8vIGdldCBmaXJzdCBwYWdlCi0gICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMyk7Ci0gICAgICAgIEJpZ0ludGVnZXIgc2tpcENvdW50ID0gQmlnSW50ZWdlci52YWx1ZU9mKDApOwotICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgcmVzdWx0ID0gZk5hdlN2Yy5nZXRDaGlsZHJlbihmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgIioiLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBtYXhJdGVtcywgc2tpcENvdW50LCBudWxsKTsKLSAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckRhdGE+IGZpbGVzID0gcmVzdWx0LmdldE9iamVjdHMoKTsKLSAgICAgICAgbG9nLmluZm8oIiBmb3VuZCAiICsgZmlsZXMuc2l6ZSgpICsgIiBmaWxlcyBpbiBnZXRDaGlsZHJlbigpIik7Ci0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJEYXRhIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgbG9nLmluZm8oIiAgIGZvdW5kIGZvbGRlciBpZCAiICsgZmlsZS5nZXRPYmplY3QoKS5nZXRJZCgpICsgIiBwYXRoIHNlZ21lbnQgIiArIGZpbGUuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGZpbGVzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMTApLCByZXN1bHQuZ2V0TnVtSXRlbXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Lmhhc01vcmVJdGVtcygpKTsKLQotICAgICAgICAvLyBnZXQgc2Vjb25kIHBhZ2UKLSAgICAgICAgbWF4SXRlbXMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMyk7Ci0gICAgICAgIHNraXBDb3VudCA9IEJpZ0ludGVnZXIudmFsdWVPZigzKTsKLSAgICAgICAgcmVzdWx0ID0gZk5hdlN2Yy5nZXRDaGlsZHJlbihmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgIioiLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICBtYXhJdGVtcywgc2tpcENvdW50LCBudWxsKTsKLSAgICAgICAgZmlsZXMgPSByZXN1bHQuZ2V0T2JqZWN0cygpOwotICAgICAgICBsb2cuaW5mbygiIGZvdW5kICIgKyBmaWxlcy5zaXplKCkgKyAiIGZpbGVzIGluIGdldENoaWxkcmVuKCkiKTsKLSAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICAgZm91bmQgZm9sZGVyIGlkICIgKyBmaWxlLmdldE9iamVjdCgpLmdldElkKCkgKyAiIHBhdGggc2VnbWVudCAiICsgZmlsZS5nZXRQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMywgZmlsZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxMCksIHJlc3VsdC5nZXROdW1JdGVtcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaGFzTW9yZUl0ZW1zKCkpOwotCi0gICAgICAgIC8vIGdldCB0aGlyZCBwYWdlCi0gICAgICAgIG1heEl0ZW1zID0gQmlnSW50ZWdlci52YWx1ZU9mKDMpOwotICAgICAgICBza2lwQ291bnQgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoOSk7Ci0gICAgICAgIHJlc3VsdCA9IGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsICIqIiwgbnVsbCwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIHRydWUsCi0gICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0gICAgICAgIGZpbGVzID0gcmVzdWx0LmdldE9iamVjdHMoKTsKLSAgICAgICAgbG9nLmluZm8oIiBmb3VuZCAiICsgZmlsZXMuc2l6ZSgpICsgIiBmaWxlcyBpbiBnZXRDaGlsZHJlbigpIik7Ci0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJEYXRhIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgbG9nLmluZm8oIiAgIGZvdW5kIGZvbGRlciBpZCAiICsgZmlsZS5nZXRPYmplY3QoKS5nZXRJZCgpICsgIiBwYXRoIHNlZ21lbnQgIiArIGZpbGUuZ2V0UGF0aFNlZ21lbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGZpbGVzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMTApLCByZXN1bHQuZ2V0TnVtSXRlbXMoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5oYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdEdldFBhZ2luZygpIGZpbmlzaGVkLiIpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2l6ZU9mRGVzY2VuZGFudHMoTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gb2JqcykgewotICAgICAgICBpbnQgc3VtID0gMDsKLSAgICAgICAgaWYgKG51bGwgIT0gb2JqcykgewotICAgICAgICAgICAgc3VtID0gb2Jqcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyQ29udGFpbmVyIG9iaiA6IG9ianMpIHsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBvYmouZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgICAgICBzdW0gKz0gZ2V0U2l6ZU9mRGVzY2VuZGFudHMob2JqLmdldENoaWxkcmVuKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VtOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVMZXZlbDFGb2xkZXJzKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9ST09UX0ZPTERFUlM7IGkrKykgewotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsICJGb2xkZXIgIiArIGkpKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0Q21pc0ZvbGRlclR5cGUoKS5nZXRJZCgpKSk7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZUZvbGRlcihmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZkxldmVsMUZvbGRlcklkID0gaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjcmVhdGVGb2xkZXJIaWVyYWNoeShpbnQgbGV2ZWxzLCBpbnQgY2hpbGRyZW5QZXJMZXZlbCkgewotCi0gICAgICAgIE9iamVjdEdlbmVyYXRvciBnZW4gPSBuZXcgT2JqZWN0R2VuZXJhdG9yKGZGYWN0b3J5LCBmTmF2U3ZjLCBmT2JqU3ZjLCBmUmVwU3ZjLCBmUmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgIE9iamVjdEdlbmVyYXRvci5Db250ZW50S2luZC5MT1JFTV9JUFNVTV9URVhUKTsKLSAgICAgICAgZ2VuLmNyZWF0ZUZvbGRlckhpZXJhY2h5KGxldmVscywgY2hpbGRyZW5QZXJMZXZlbCwgZlJvb3RGb2xkZXJJZCk7Ci0gICAgICAgIGludCBvYmpDb3VudCA9IGdlbi5nZXRPYmplY3RzSW5Ub3RhbCgpOwotICAgICAgICByZXR1cm4gb2JqQ291bnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9PYmplY3RDcmVhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9PYmplY3RDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODViNzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvT2JqZWN0Q3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLQotcHVibGljIGNsYXNzIE9iamVjdENyZWF0b3IgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nc09iamVjdEZhY3RvcnkgZkZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RTZXJ2aWNlIGZPYmpTdmM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlJlcG9zaXRvcnlJZDsKLQotICAgIHB1YmxpYyBPYmplY3RDcmVhdG9yKEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBmYWN0b3J5LCBPYmplY3RTZXJ2aWNlIG9ialN2YywgU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBmT2JqU3ZjID0gb2JqU3ZjOwotICAgICAgICBmRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGZSZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLAotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wc1RvU2V0KSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcyA9IG51bGw7Ci0gICAgICAgIEFjbCBhZGRBQ0VzID0gbnVsbDsKLSAgICAgICAgQWNsIHJlbW92ZUFDRXMgPSBudWxsOwotICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24gPSBudWxsOwotCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVTdHJpbmdEb2N1bWVudFByb3BlcnRpZXMobmFtZSwgdHlwZUlkLCBwcm9wc1RvU2V0KTsKLQotICAgICAgICBjb250ZW50U3RyZWFtID0gY3JlYXRlQ29udGVudCgpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsIGFkZEFDRXMsCi0gICAgICAgICAgICAgICAgcmVtb3ZlQUNFcywgZXh0ZW5zaW9uKTsKLSAgICAgICAgaWYgKG51bGwgPT0gaWQpIHsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJjcmVhdGVEb2N1bWVudCBmYWlsZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgY3JlYXRlU3RyaW5nRG9jdW1lbnRQcm9wZXJ0aWVzKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZUlkLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzVG9TZXQpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKSk7Ci0gICAgICAgIGlmIChudWxsICE9IHByb3BzVG9TZXQpIHsKLSAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IHByb3BUb1NldCA6IHByb3BzVG9TZXQuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShwcm9wVG9TZXQuZ2V0S2V5KCksIHByb3BUb1NldC5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudCgpIHsKLSAgICAgICAgQ29udGVudFN0cmVhbUltcGwgY29udGVudCA9IG5ldyBDb250ZW50U3RyZWFtSW1wbCgpOwotICAgICAgICBjb250ZW50LnNldEZpbGVOYW1lKCJkYXRhLnR4dCIpOwotICAgICAgICBjb250ZW50LnNldE1pbWVUeXBlKCJ0ZXh0L3BsYWluIik7Ci0gICAgICAgIGludCBsZW4gPSAzMiAqIDEwMjQ7Ci0gICAgICAgIGJ5dGVbXSBiID0geyAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDBjLCAweDBhLAotICAgICAgICAgICAgICAgIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4MGMsIDB4MGEgfTsgLy8gMzIKLSAgICAgICAgLy8gQnl0ZXMKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShsZW4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBiYS53cml0ZShiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBmaWxsIGNvbnRlbnQgc3RyZWFtIHdpdGggZGF0YSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRlbnQuc2V0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYS50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIGNvbnRlbnQuc2V0TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZihsZW4pKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gY3JlYXRlQWx0ZXJuYXRlQ29udGVudCgpIHsKLSAgICAgICAgQ29udGVudFN0cmVhbUltcGwgY29udGVudCA9IG5ldyBDb250ZW50U3RyZWFtSW1wbCgpOwotICAgICAgICBjb250ZW50LnNldEZpbGVOYW1lKCJkYXRhLnR4dCIpOwotICAgICAgICBjb250ZW50LnNldE1pbWVUeXBlKCJ0ZXh0L3BsYWluIik7Ci0gICAgICAgIGludCBsZW4gPSAzMiAqIDEwMjQ7Ci0gICAgICAgIGJ5dGVbXSBiID0geyAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLCAweDYxLAotICAgICAgICAgICAgICAgIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEsIDB4NjEgfTsgLy8gMzIKLSAgICAgICAgLy8gQnl0ZXMKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShsZW4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBiYS53cml0ZShiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBmaWxsIGNvbnRlbnQgc3RyZWFtIHdpdGggZGF0YSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRlbnQuc2V0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYS50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIGNvbnRlbnQuc2V0TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZihsZW4pKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gc3RyZWFtcyBhbmQgcmV0dXJuIHRydWUgaWYgdGhleSBhcmUgZXF1YWwuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5Q29udGVudChDb250ZW50U3RyZWFtIGNzZDEsIENvbnRlbnRTdHJlYW0gY3NkMikgewotICAgICAgICBpZiAoIWNzZDEuZ2V0RmlsZU5hbWUoKS5lcXVhbHMoY3NkMi5nZXRGaWxlTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghY3NkMS5nZXRCaWdMZW5ndGgoKS5lcXVhbHMoY3NkMi5nZXRCaWdMZW5ndGgoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWNzZDEuZ2V0TWltZVR5cGUoKS5lcXVhbHMoY3NkMi5nZXRNaW1lVHlwZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgbGVuID0gY3NkMS5nZXRCaWdMZW5ndGgoKS5sb25nVmFsdWUoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gczEgPSBjc2QxLmdldFN0cmVhbSgpOwotICAgICAgICBJbnB1dFN0cmVhbSBzMiA9IGNzZDIuZ2V0U3RyZWFtKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZhbDEgPSBzMS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgaW50IHZhbDIgPSBzMi5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbDEgIT0gdmFsMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVByb3BlcnR5KFN0cmluZyBpZCwgU3RyaW5nIHByb3BlcnR5SWQsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IGdldFVwZGF0ZVByb3BlcnR5TGlzdChwcm9wZXJ0eUlkLCBwcm9wZXJ0eVZhbHVlKTsKLQotICAgICAgICBIb2xkZXI8U3RyaW5nPiBpZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihpZCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KCk7Ci0gICAgICAgIGZPYmpTdmMudXBkYXRlUHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgY2hhbmdlVG9rZW5Ib2xkZXIsIHByb3BlcnRpZXMsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFVwZGF0ZVByb3BlcnR5TGlzdChTdHJpbmcgcHJvcGVydHlJZCwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKHByb3BlcnR5SWQsIHByb3BlcnR5VmFsdWUpKTsKLSAgICAgICAgUHJvcGVydGllcyBuZXdQcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gbmV3UHJvcHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBnZXRVcGRhdGVQcm9wZXJ0eURhdGFMaXN0KFN0cmluZyBwcm9wZXJ0eUlkLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEocHJvcGVydHlJZCwgcHJvcGVydHlWYWx1ZSkpOwotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5UHJvcGVydHkoU3RyaW5nIGlkLCBTdHJpbmcgcHJvcGVydHlJZCwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZPYmpTdmMuZ2V0UHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBpZCwgIioiLCBudWxsKTsKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wc01hcCA9IHByb3BzLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgUHJvcGVydHlTdHJpbmcgcGQgPSAoUHJvcGVydHlTdHJpbmcpIHByb3BzTWFwLmdldChwcm9wZXJ0eUlkKTsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5VmFsdWUuZXF1YWxzKHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9PYmplY3RTZXJ2aWNlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvT2JqZWN0U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyNjI5Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9PYmplY3RTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVJdGVtVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUG9saWN5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zdG9yZWRvYmouaW1wbC5Db250ZW50U3RyZWFtRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGwuUmVuZGl0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5Eb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5Qcm9wZXJ0eUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVEZWZpbml0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLnJlcG9zaXRvcnkuT2JqZWN0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE9iamVjdFNlcnZpY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT2JqZWN0U2VydmljZVRlc3QuY2xhc3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRk9MREVSX1RZUEVfSUQgPSAiTXlGb2xkZXJUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RPQ1VNRU5UX1RZUEVfSUQgPSAiTXlEb2N1bWVudFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRE9DX1RZUEVfV0lUSF9ERUZBVUxUU19JRCA9ICJEb2N1bWVudFR5cGVXaXRoRGVmYXVsdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GT0xERVJfVFlQRV9XSVRIX0RFRkFVTFRTX0lEID0gIkZvbGRlclR5cGVXaXRoRGVmYXVsdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GT0xERVJfU1RSSU5HX1BST1BfSUQgPSAiTXlGb2xkZXJTdHJpbmdQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0RPQ1VNRU5UX1NUUklOR19QUk9QX0lEID0gIk15RG9jdW1lbnRTdHJpbmdQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1ZFUlNJT05fRE9DVU1FTlRfVFlQRV9JRCA9ICJNeVZlcnNpb25lZFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVkVSX1BST1BFUlRZX0lEID0gIlZlclN0cmluZ1Byb3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ1VTVE9NX0RPQ1VNRU5UX1RZUEVfSUQgPSAiTXlDdXN0b21Eb2N1bWVudFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSU5IRVJJVEVEX0NVU1RPTV9ET0NVTUVOVF9UWVBFX0lEID0gIk15Q3VzdG9tSW5oZXJpdGVkRG9jVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DVVNUT01fTk9fQ09OVEVOVF9UWVBFX0lEID0gIk5vQ29udGVudFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ1VTVE9NX01VU1RfQ09OVEVOVF9UWVBFX0lEID0gIk11c3RIYXZlQ29udGVudFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRE9DVU1FTlRfTVlfU1RSSU5HX1BST1BfSUQgPSAiTXlDdXN0b21Eb2N1bWVudFN0cmluZ1Byb3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRE9DVU1FTlRfTVlfTVVMVElfU1RSSU5HX1BST1BfSUQgPSAiTXlDdXN0b21Eb2N1bWVudE11bHRpU3RyaW5nUHJvcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9ET0NVTUVOVF9NWV9JTlRfUFJPUF9JRCA9ICJNeUN1c3RvbURvY3VtZW50SW50UHJvcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9ET0NVTUVOVF9NWV9JTlRfUFJPUF9JRF9NQU5EQVRPUllfREVGQVVMVCA9ICJNeUN1c3RvbURvY3VtZW50SW50UHJvcE1hbmRhdG9yeURlZmF1bHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRk9MREVSX01ZX01VTFRJX1NUUklOR19QUk9QX0lEID0gIk15Q3VzdG9tRG9jdW1lbnRNdWx0aVN0cmluZ1Byb3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRk9MREVSX01ZX0lOVF9QUk9QX0lEID0gIk15Q3VzdG9tRG9jdW1lbnRJbnRQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZPTERFUl9NWV9JTlRfUFJPUF9JRF9NQU5EQVRPUllfREVGQVVMVCA9ICJNeUN1c3RvbURvY3VtZW50SW50UHJvcE1hbmRhdG9yeURlZmF1bHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRE9DVU1FTlRfTVlfU1VCX1NUUklOR19QUk9QX0lEID0gIk15SW5oZXJpdGVkU3RyaW5nUHJvcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9ET0NVTUVOVF9NWV9TVUJfSU5UX1BST1BfSUQgPSAiTXlJbmhlcml0ZWRJbnRQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lURU1fVFlQRV9JRCA9ICJNeUl0ZW1UeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX1NUUklOR19QUk9QID0gIkl0ZW1TdHJpbmdQcm9wIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfVFlQRV9JRCA9IERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKS5nZXRJZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9JRCA9ICJEb2N1bWVudF8xIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX1RZUEVfSUQgPSBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRm9sZGVyVHlwZSgpLmdldElkKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9JRCA9ICJGb2xkZXJfMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZX0NVU1RPTV9OQU1FID0gIk15IEN1c3RvbSBEb2N1bWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TSVpFID0gMTAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTkcgPSAiaW1hZ2UvcG5nIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBFRyA9ICJpbWFnZS9qcGVnIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NUUklOR19QUk9QX1ZBTCA9ICJNeSB1Z2x5IHN0cmluZyAxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE5FV19JTlRfUFJPUF9WQUwgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoODE1KTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NFQ09OREFSWV9UWVBFX0lEID0gIk15U2Vjb25kYXJ5VHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1NUUklOR19QUk9QID0gIlNlY29uZGFyeVN0cmluZ1Byb3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9JTlRFR0VSX1BST1AgPSAiU2Vjb25kYXJ5SW50ZWdlclByb3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9TVFJJTkdfUFJPUCA9ICJDcm9zc1JlZmVyZW5jZUtpbmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVMQVRJT05fVFlQRV9JRCA9ICJDcm9zc1JlZmVyZW5jZVR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTVFJJQ1RFRF9SRUxBVElPTl9UWVBFX0lEID0gIlJlc3RyaWN0ZWRSZWxhdGlvblR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUE9MSUNZX1RZUEVfSUQgPSAiQXVkaXRQb2xpY3kiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUE9MSUNZX1BST1BFUlRZX0lEID0gIkF1ZGl0U2V0dGluZ3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElOR19VVEY4ID0gIlVURi04IjsKLQotICAgIE9iamVjdENyZWF0b3IgZkNyZWF0b3I7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHN1cGVyLnNldFR5cGVDcmVhdG9yQ2xhc3MoT2JqZWN0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGZDcmVhdG9yID0gbmV3IE9iamVjdENyZWF0b3IoZkZhY3RvcnksIGZPYmpTdmMsIGZSZXBvc2l0b3J5SWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFBhcmFtZXRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbmZpZ0NvbnN0YW50cy5NQVhfQ09OVEVOVF9TSVpFX0tCLCBJbnRlZ2VyLnZhbHVlT2YoTUFYX1NJWkUpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvY3VtZW50KCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdENyZWF0ZU9iamVjdCgpIC4uLiIpOwotICAgICAgICBTdHJpbmcgaWQgPSBjcmVhdGVEb2N1bWVudChmUm9vdEZvbGRlcklkLCBmYWxzZSk7Ci0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRlRG9jdW1lbnQgc3VjY2VlZGVkIHdpdGggY3JlYXRlZCBpZDogIiArIGlkKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RDcmVhdGVPYmplY3QoKSBmaW5pc2hlZC4iKTsKLQotICAgICAgICAvLyB0ZXN0IGNyZWF0ZSBhIGRvY3VtZW50IHdpdGggYSBmb2xkZXIgdHlwZSwgc2hvdWxkIGZhaWw6Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gY3JlYXRlRG9jdW1lbnRQcm9wZXJ0aWVzKCJEb2N1bWVudFdpdGhBRm9sZGVyVHlwZSIsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgICAgIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgbnVsbCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGluZyAgZG9jdW1lbnQgd2l0aCBhIGZvbGRlciB0eXBlIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICBkb2N1bWVudCB3aXRoIGEgZm9sZGVyIHR5cGUgZmFpbGVkIGFzIGV4cGVjdGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRlc3QgY3JlYXRlIGEgZG9jdW1lbnQgd2l0aCBhbiBpbGxlZ2FsIG5hbWUsIHNob3VsZCBmYWlsOgotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGNyZWF0ZURvY3VtZW50UHJvcGVydGllcygiYWJjICg6KikiLCBET0NVTUVOVF9UWVBFX0lEKTsKLSAgICAgICAgICAgIGZPYmpTdmMuY3JlYXRlRG9jdW1lbnQoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIGZSb290Rm9sZGVySWQsIG51bGwsIFZlcnNpb25pbmdTdGF0ZS5OT05FLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkNyZWF0aW5nICBkb2N1bWVudCB3aXRoIGFuIGlsbGVnYWwgbmFtZSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICBkb2N1bWVudCB3aXRoIGFuIGlsbGVnYWwgbmFtZSBmYWlsZWQgYXMgZXhwZWN0ZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEb2N1bWVudEludmFsaWROYW1lcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZURvY3VtZW50Tm9DYXRjaChudWxsLCBmUm9vdEZvbGRlcklkLCBET0NVTUVOVF9UWVBFX0lELCBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgZmFsc2UpOwotICAgICAgICAgICAgZmFpbCgiRG9jdW1lbnQgY3JlYXRpb24gd2l0aCBudWxsIG5hbWUgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjcmVhdGVEb2N1bWVudE5vQ2F0Y2goIiIsIGZSb290Rm9sZGVySWQsIERPQ1VNRU5UX1RZUEVfSUQsIFZlcnNpb25pbmdTdGF0ZS5OT05FLCBmYWxzZSk7Ci0gICAgICAgICAgICBmYWlsKCJEb2N1bWVudCBjcmVhdGlvbiB3aXRoIGVtcHR5IG5hbWUgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjcmVhdGVEb2N1bWVudE5vQ2F0Y2goIi8oJSMkYe+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vSIsIGZSb290Rm9sZGVySWQsIERPQ1VNRU5UX1RZUEVfSUQsIFZlcnNpb25pbmdTdGF0ZS5OT05FLCBmYWxzZSk7Ci0gICAgICAgICAgICBmYWlsKCJEb2N1bWVudCBjcmVhdGlvbiB3aXRoIGlsZWdhbCBuYW1lIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY3JlYXRlRG9jdW1lbnROb0NhdGNoKCJEdXBsaWNhdGVkTmFtZSIsIGZSb290Rm9sZGVySWQsIERPQ1VNRU5UX1RZUEVfSUQsIFZlcnNpb25pbmdTdGF0ZS5OT05FLCBmYWxzZSk7Ci0gICAgICAgICAgICBjcmVhdGVEb2N1bWVudE5vQ2F0Y2goIkR1cGxpY2F0ZWROYW1lIiwgZlJvb3RGb2xkZXJJZCwgRE9DVU1FTlRfVFlQRV9JRCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIGZhbHNlKTsKLSAgICAgICAgICAgIGZhaWwoIkRvY3VtZW50IGNyZWF0aW9uIHdpdGggZXhpc3RpbmcgbmFtZSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNOYW1lQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGb2xkZXJJbnZhbGlkTmFtZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjcmVhdGVGb2xkZXJOb0NhdGNoKG51bGwsIGZSb290Rm9sZGVySWQsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgICAgIGZhaWwoIkZvbGRlciBjcmVhdGlvbiB3aXRoIG51bGwgbmFtZSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZUZvbGRlck5vQ2F0Y2goIiIsIGZSb290Rm9sZGVySWQsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgICAgIGZhaWwoIkZvbGRlciBjcmVhdGlvbiB3aXRoIGVtcHR5IG5hbWUgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjcmVhdGVGb2xkZXJOb0NhdGNoKAotICAgICAgICAgICAgICAgICAgICAiLyglIyTvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv70iLAotICAgICAgICAgICAgICAgICAgICBmUm9vdEZvbGRlcklkLCBGT0xERVJfVFlQRV9JRCk7Ci0gICAgICAgICAgICBmYWlsKCJGb2xkZXIgY3JlYXRpb24gd2l0aCBpbGVnYWwgbmFtZSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZUZvbGRlck5vQ2F0Y2goIkR1cGxpY2F0ZWROYW1lIiwgZlJvb3RGb2xkZXJJZCwgRk9MREVSX1RZUEVfSUQpOwotICAgICAgICAgICAgY3JlYXRlRm9sZGVyTm9DYXRjaCgiRHVwbGljYXRlZE5hbWUiLCBmUm9vdEZvbGRlcklkLCBGT0xERVJfVFlQRV9JRCk7Ci0gICAgICAgICAgICBmYWlsKCJGb2xkZXIgY3JlYXRpb24gd2l0aCBleGlzdGluZyBuYW1lIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc05hbWVDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIHx8IGUgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0KCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdEdldE9iamVjdCgpIC4uLiIpOwotICAgICAgICBsb2cuaW5mbygiICBjcmVhdGluZyBvYmplY3QiKTsKLSAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlRG9jdW1lbnQoZlJvb3RGb2xkZXJJZCwgZmFsc2UpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmluZm8oIiAgY3JlYXRlRG9jdW1lbnQgc3VjY2VlZGVkIHdpdGggY3JlYXRlZCBpZDogIiArIGlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCIgIGdldHRpbmcgb2JqZWN0Iik7Ci0gICAgICAgIHJldHJpZXZlRG9jdW1lbnQoaWQpOwotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RHZXRPYmplY3QoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RCeVBhdGgoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0T2JqZWN0QnlQYXRoKCkgLi4uIik7Ci0gICAgICAgIGxvZy5pbmZvKCIgIGNyZWF0aW5nIG9iamVjdCIpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRyZWUgZm9yIHRlc3RpbmcgcGF0aHMKLSAgICAgICAgU3RyaW5nIGYxID0gY3JlYXRlRm9sZGVyKCJmb2xkZXIxIiwgZlJvb3RGb2xkZXJJZCwgRk9MREVSX1RZUEVfSUQpOwotICAgICAgICBTdHJpbmcgZjIgPSBjcmVhdGVGb2xkZXIoImZvbGRlcjIiLCBmUm9vdEZvbGRlcklkLCBGT0xERVJfVFlQRV9JRCk7Ci0gICAgICAgIFN0cmluZyBmMyA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMyIsIGZSb290Rm9sZGVySWQsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYxMSA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMS4xIiwgZjEsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYxMiA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMS4yIiwgZjEsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYxMyA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMS4zIiwgZjEsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYzMSA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMy4xIiwgZjMsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYzMiA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMy4yIiwgZjMsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYzMyA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMy4zIiwgZjMsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYxMjEgPSBjcmVhdGVGb2xkZXIoImZvbGRlcjEuMi4xIiwgZjEyLCBGT0xERVJfVFlQRV9JRCk7Ci0gICAgICAgIFN0cmluZyBmMTIyID0gY3JlYXRlRm9sZGVyKCJmb2xkZXIxLjIuMiIsIGYxMiwgRk9MREVSX1RZUEVfSUQpOwotICAgICAgICBTdHJpbmcgZjEyMyA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMS4yLjMiLCBmMTIsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGYzMzEgPSBjcmVhdGVGb2xkZXIoImZvbGRlcjMuMy4xIiwgZjMzLCBGT0xERVJfVFlQRV9JRCk7Ci0gICAgICAgIFN0cmluZyBmMzMyID0gY3JlYXRlRm9sZGVyKCJmb2xkZXIzLjMuMiIsIGYzMywgRk9MREVSX1RZUEVfSUQpOwotICAgICAgICBTdHJpbmcgZjMzMyA9IGNyZWF0ZUZvbGRlcigiZm9sZGVyMy4zLjMiLCBmMzMsIEZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgU3RyaW5nIGRvYzEyID0gY3JlYXRlRG9jdW1lbnQoIkRvY3VtZW50MS4yLkRvYyIsIGYxMiwgZmFsc2UpOwotICAgICAgICBTdHJpbmcgZG9jMzMgPSBjcmVhdGVEb2N1bWVudCgiRG9jdW1lbnQzLjMuRG9jIiwgZjMzLCBmYWxzZSk7Ci0gICAgICAgIFN0cmluZyBkb2MzMzEgPSBjcmVhdGVEb2N1bWVudCgiRG9jdW1lbnQzLjMuMS5Eb2MiLCBmMzMxLCBmYWxzZSk7Ci0gICAgICAgIFN0cmluZyBkb2MzMzMgPSBjcmVhdGVEb2N1bWVudCgiRG9jdW1lbnQzLjMuMy5Eb2MiLCBmMzMzLCBmYWxzZSk7Ci0KLSAgICAgICAgbG9nLmluZm8oIiAgZ2V0dGluZyBvYmplY3QgYnkgcGF0aCIpOwotICAgICAgICBnZXRCeVBhdGgoZjEsICIvZm9sZGVyMSIpOwotICAgICAgICBnZXRCeVBhdGgoZjIsICIvZm9sZGVyMiIpOwotICAgICAgICBnZXRCeVBhdGgoZjMsICIvZm9sZGVyMyIpOwotICAgICAgICBnZXRCeVBhdGgoZjExLCAiL2ZvbGRlcjEvZm9sZGVyMS4xIik7Ci0gICAgICAgIGdldEJ5UGF0aChmMTIsICIvZm9sZGVyMS9mb2xkZXIxLjIiKTsKLSAgICAgICAgZ2V0QnlQYXRoKGYxMywgIi9mb2xkZXIxL2ZvbGRlcjEuMyIpOwotICAgICAgICBnZXRCeVBhdGgoZjMxLCAiL2ZvbGRlcjMvZm9sZGVyMy4xIik7Ci0gICAgICAgIGdldEJ5UGF0aChmMzIsICIvZm9sZGVyMy9mb2xkZXIzLjIiKTsKLSAgICAgICAgZ2V0QnlQYXRoKGYzMywgIi9mb2xkZXIzL2ZvbGRlcjMuMyIpOwotICAgICAgICBnZXRCeVBhdGgoZjEyMSwgIi9mb2xkZXIxL2ZvbGRlcjEuMi9mb2xkZXIxLjIuMSIpOwotICAgICAgICBnZXRCeVBhdGgoZjEyMiwgIi9mb2xkZXIxL2ZvbGRlcjEuMi9mb2xkZXIxLjIuMiIpOwotICAgICAgICBnZXRCeVBhdGgoZjEyMywgIi9mb2xkZXIxL2ZvbGRlcjEuMi9mb2xkZXIxLjIuMyIpOwotICAgICAgICBnZXRCeVBhdGgoZjMzMSwgIi9mb2xkZXIzL2ZvbGRlcjMuMy9mb2xkZXIzLjMuMSIpOwotICAgICAgICBnZXRCeVBhdGgoZjMzMiwgIi9mb2xkZXIzL2ZvbGRlcjMuMy9mb2xkZXIzLjMuMiIpOwotICAgICAgICBnZXRCeVBhdGgoZjMzMywgIi9mb2xkZXIzL2ZvbGRlcjMuMy9mb2xkZXIzLjMuMyIpOwotICAgICAgICBnZXRCeVBhdGgoZG9jMTIsICIvZm9sZGVyMS9mb2xkZXIxLjIvRG9jdW1lbnQxLjIuRG9jIik7Ci0gICAgICAgIGdldEJ5UGF0aChkb2MzMywgIi9mb2xkZXIzL2ZvbGRlcjMuMy9Eb2N1bWVudDMuMy5Eb2MiKTsKLSAgICAgICAgZ2V0QnlQYXRoKGRvYzMzMSwgIi9mb2xkZXIzL2ZvbGRlcjMuMy9mb2xkZXIzLjMuMS9Eb2N1bWVudDMuMy4xLkRvYyIpOwotICAgICAgICBnZXRCeVBhdGgoZG9jMzMzLCAiL2ZvbGRlcjMvZm9sZGVyMy4zL2ZvbGRlcjMuMy4zL0RvY3VtZW50My4zLjMuRG9jIik7Ci0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0R2V0T2JqZWN0QnlQYXRoKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnRXaXRoQ29udGVudCgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RDcmVhdGVEb2N1bWVudFdpdGhDb250ZW50KCkgLi4uIik7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KGZSb290Rm9sZGVySWQsIHRydWUpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0ZURvY3VtZW50IHN1Y2NlZWRlZCB3aXRoIGNyZWF0ZWQgaWQ6ICIgKyBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250ZW50U3RyZWFtIHNkID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkLCBudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIG9mZnNldCAqLywKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIGxlbmd0aCAqLywgbnVsbCk7Ci0gICAgICAgIHZlcmlmeUNvbnRlbnRSZXN1bHQoc2QpOwotCi0gICAgICAgIC8vIGRlbGV0ZSBjb250ZW50IGFnYWluCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGlkKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZPYmpTdmMuZ2V0UHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBpZCwgUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGNoYW5nZVRva2VuID0gKFN0cmluZykgcHJvcHMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gdG9rZW5Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pOwotICAgICAgICBmT2JqU3ZjLmRlbGV0ZUNvbnRlbnRTdHJlYW0oZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIHRva2VuSG9sZGVyLCBudWxsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvcHMgPSBmT2JqU3ZjLmdldFByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgaWQsIFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTiwgbnVsbCk7Ci0gICAgICAgICAgICBjaGFuZ2VUb2tlbiA9IChTdHJpbmcpIHByb3BzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgICAgICB0b2tlbkhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihjaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBzZCA9IGZPYmpTdmMuZ2V0Q29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBpZCwgbnVsbCwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBvZmZzZXQgKi8sCi0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigtMSkgLyogbGVuZ3RoICovLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoImdldENvbnRlbnRTdHJlYW0gd2l0aCBub24gZXhpc3RpbmcgY29udGVudCBzaG91bGQgcmFpc2UgYSBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGNvbnRlbnQgYWdhaW4gaW4gYSBzZWNvbmQgY2FsbAotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjcmVhdGVDb250ZW50KCk7Ci0gICAgICAgIGZPYmpTdmMuc2V0Q29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgdHJ1ZSwgdG9rZW5Ib2xkZXIsIGNvbnRlbnRTdHJlYW0sIG51bGwpOwotICAgICAgICBzZCA9IGZPYmpTdmMuZ2V0Q29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBpZCwgbnVsbCwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBvZmZzZXQgKi8sCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBsZW5ndGggKi8sIG51bGwpOwotICAgICAgICB2ZXJpZnlDb250ZW50UmVzdWx0KHNkKTsKLQotICAgICAgICAvLyB1cGRhdGUgY29udGVudCBhbmQgZG8gbm90IHNldCBvdmVyd3JpdGUgZmxhZywgZXhwZWN0IGZhaWx1cmUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb3BzID0gZk9ialN2Yy5nZXRQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkLCBQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4sIG51bGwpOwotICAgICAgICAgICAgY2hhbmdlVG9rZW4gPSAoU3RyaW5nKSBwcm9wcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTikuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgdG9rZW5Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pOwotICAgICAgICAgICAgZk9ialN2Yy5zZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCBmYWxzZSwgdG9rZW5Ib2xkZXIsIGNvbnRlbnRTdHJlYW0sIG51bGwpOwotICAgICAgICAgICAgZmFpbCgic2V0Q29udGVudFN0cmVhbSB3aXRoIGV4aXN0aW5nIGNvbnRlbnQgYW5kIG5vIG92ZXJXcml0ZUZsYWcgc2hvdWxkIGZhaWwiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjbGVhbnVwCi0gICAgICAgIGZPYmpTdmMuZGVsZXRlT2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCB0cnVlLCBudWxsKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RDcmVhdGVEb2N1bWVudFdpdGhDb250ZW50KCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnRXaXRoQ29udGVudE5vRmlsZU5hbWVOb01pbWVUeXBlKCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdENyZWF0ZURvY3VtZW50V2l0aENvbnRlbnQoKSAuLi4iKTsKLSAgICAgICAgQ29udGVudFN0cmVhbURhdGFJbXBsIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMgPSBudWxsOwotICAgICAgICBBY2wgYWRkQUNFcyA9IG51bGw7Ci0gICAgICAgIEFjbCByZW1vdmVBQ0VzID0gbnVsbDsKLSAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uID0gbnVsbDsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gY3JlYXRlRG9jdW1lbnRQcm9wZXJ0aWVzKERPQ1VNRU5UX0lELCBET0NVTUVOVF9UWVBFX0lEKTsKLQotICAgICAgICBjb250ZW50U3RyZWFtID0gKENvbnRlbnRTdHJlYW1EYXRhSW1wbCkgY3JlYXRlQ29udGVudCgpOwotICAgICAgICBjb250ZW50U3RyZWFtLnNldEZpbGVOYW1lKG51bGwpOwotICAgICAgICBjb250ZW50U3RyZWFtLnNldE1pbWVUeXBlKG51bGwpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZCA9IGZPYmpTdmMuY3JlYXRlRG9jdW1lbnQoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIGZSb290Rm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZS5OT05FLAotICAgICAgICAgICAgICAgICAgICBwb2xpY2llcywgYWRkQUNFcywgcmVtb3ZlQUNFcywgZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGlkKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRG9jdW1lbnQgZmFpbGVkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIHNkID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkLCBudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIG9mZnNldCAqLywKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBsZW5ndGggKi8sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZC5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2QuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGVEb2N1bWVudCgpIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdENyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSgpIC4uLiIpOwotICAgICAgICAvLyBjcmVhdGUgYSAxc3QgZG9jdW1lbnQKLSAgICAgICAgU3RyaW5nIGlkMSA9IGNyZWF0ZURvY3VtZW50KGZSb290Rm9sZGVySWQsIHRydWUpOwotICAgICAgICAvLyBjcmVhdGUgYSBzZWNvbmQgZG9jdW1lbnQgd2l0aCBmaXJzdCBhcyBzb3VyY2UKLSAgICAgICAgU3RyaW5nIGlkMiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlID0gVmVyc2lvbmluZ1N0YXRlLk5PTkU7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gY3JlYXRlRG9jdW1lbnRQcm9wZXJ0aWVzRm9yRG9jdW1lbnRGcm9tU291cmNlKCJEb2N1bWVudCBGcm9tIFNvdXJjZSIpOwotICAgICAgICAgICAgaWQyID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoZlJlcG9zaXRvcnlJZCwgaWQxLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgdmVyc2lvbmluZ1N0YXRlLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGlkMikgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSBmYWlsZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoKSBmYWlsZWQgd2l0aCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCBjb250ZW50IGZyb20gc2Vjb25kIGRvY3VtZW50IGFuZCBjb21wYXJlIGl0IHdpdGggb3JpZ2luYWwgb25lCi0gICAgICAgIENvbnRlbnRTdHJlYW0gc2QgPSBmT2JqU3ZjLmdldENvbnRlbnRTdHJlYW0oZlJlcG9zaXRvcnlJZCwgaWQyLCBudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIG9mZnNldCAqLywKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIGxlbmd0aCAqLywgbnVsbCk7Ci0gICAgICAgIHZlcmlmeUNvbnRlbnRSZXN1bHQoc2QpOwotCi0gICAgICAgIC8vIGNsZWFudXAKLSAgICAgICAgZk9ialN2Yy5kZWxldGVPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQxLCB0cnVlLCBudWxsKTsKLSAgICAgICAgZk9ialN2Yy5kZWxldGVPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQyLCB0cnVlLCBudWxsKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RDcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVkRG9jdW1lbnRJbmhlcml0ZWQoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0Q3JlYXRlZERvY3VtZW50SW5oZXJpdGVkKCkgLi4uIik7Ci0gICAgICAgIGxvZy5pbmZvKCIgIGNyZWF0aW5nIG9iamVjdCIpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50SW5oZXJpdGVkUHJvcGVydGllcyhmUm9vdEZvbGRlcklkLCBmYWxzZSk7Ci0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICBjcmVhdGVEb2N1bWVudCBzdWNjZWVkZWQgd2l0aCBjcmVhdGVkIGlkOiAiICsgaWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8oIiAgZ2V0dGluZyBvYmplY3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdERhdGEgcmVzID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlcyk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5lZElkID0gcmVzLmdldElkKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIHJldHVybmVkSWQpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wcyA9IHJlcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcGQgOiBwcm9wcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJyZXR1cm4gcHJvcGVydHkgaWQ6ICIgKyBwZC5nZXRJZCgpICsgIiwgdmFsdWU6ICIgKyBwZC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IHByb3BzLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1ZX0NVU1RPTV9OQU1FLCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotCi0gICAgICAgICAgICBwZCA9IHByb3BzLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9JTkhFUklURURfQ1VTVE9NX0RPQ1VNRU5UX1RZUEVfSUQsIHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIHBkID0gcHJvcHMuZ2V0KFRFU1RfRE9DVU1FTlRfTVlfU1RSSU5HX1BST1BfSUQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNeSBwcmV0dHkgc3RyaW5nIiwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLQotICAgICAgICAgICAgcGQgPSBwcm9wcy5nZXQoVEVTVF9ET0NVTUVOVF9NWV9JTlRfUFJPUF9JRCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQ3MTEpLCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotCi0gICAgICAgICAgICBwZCA9IHByb3BzLmdldChURVNUX0RPQ1VNRU5UX01ZX1NVQl9TVFJJTkdfUFJPUF9JRCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImFub3RoZXIgY29vbCBzdHJpbmciLCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotCi0gICAgICAgICAgICBwZCA9IHByb3BzLmdldChURVNUX0RPQ1VNRU5UX01ZX1NVQl9JTlRfUFJPUF9JRCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQ3MTIpLCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZ2V0T2JqZWN0KCkgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0Q3JlYXRlZERvY3VtZW50SW5oZXJpdGVkKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGb2xkZXJBbmREb2N1bWVudHMoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIGhpZXJhcmNoeSBvZiBmb2xkZXJzIGFuZCBmaWxsIGl0IHdpdGggc29tZSBkb2N1bWVudHMKLQotICAgICAgICBPYmplY3RHZW5lcmF0b3IgZ2VuID0gbmV3IE9iamVjdEdlbmVyYXRvcihmRmFjdG9yeSwgZk5hdlN2YywgZk9ialN2YywgZlJlcFN2YywgZlJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgICAgICBPYmplY3RHZW5lcmF0b3IuQ29udGVudEtpbmQuTE9SRU1fSVBTVU1fVEVYVCk7Ci0gICAgICAgIGludCBsZXZlbHMgPSAyOyAvLyBjcmVhdGUgYSBoaWVyYXJjaHkgd2l0aCB0d28gbGV2ZWxzCi0gICAgICAgIGludCBjaGlsZHJlblBlckxldmVsID0gMjsgLy8gY3JlYXRlIHR3byBmb2xkZXJzIG9uIGVhY2ggbGV2ZWwKLQotICAgICAgICBnZW4uc2V0TnVtYmVyT2ZEb2N1bWVudHNUb0NyZWF0ZVBlckZvbGRlcigxKTsgLy8gY3JlYXRlIG9uZSBkb2N1bWVudCBpbgotICAgICAgICAvLyBlYWNoIGZvbGRlcgotCi0gICAgICAgIC8vIFNldCB0aGUgdHlwZSBpZCBmb3IgYWxsIGNyZWF0ZWQgZG9jdW1lbnRzOgotICAgICAgICBnZW4uc2V0RG9jdW1lbnRUeXBlSWQoVEVTVF9ET0NVTUVOVF9UWVBFX0lEKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHR5cGUgaWQgZm9yIGFsbCBjcmVhdGVkIGZvbGRlcnM6Ci0gICAgICAgIGdlbi5zZXRGb2xkZXJUeXBlSWQoVEVTVF9GT0xERVJfVFlQRV9JRCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBwcm9wZXJ0aWVzIHRoZSBnZW5lcmF0b3Igc2hvdWxkIGZpbGwgd2l0aCB2YWx1ZXMgZm9yCi0gICAgICAgIC8vIGRvY3VtZW50czoKLSAgICAgICAgLy8gTm90ZTogbXVzdCBiZSB2YWxpZCBwcm9wZXJ0aWVzIGluIHR5cGUgVEVTVF9ET0NVTUVOVF9UWVBFX0lECi0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wc1RvU2V0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BzVG9TZXQuYWRkKFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQpOwotICAgICAgICBnZW4uc2V0RG9jdW1lbnRQcm9wZXJ0aWVzVG9HZW5lcmF0ZShwcm9wc1RvU2V0KTsKLQotICAgICAgICAvLyBzZXQgdGhlIHByb3BlcnRpZXMgdGhlIGdlbmVyYXRvciBzaG91bGQgZmlsbCB3aXRoIHZhbHVlcyBmb3IgZm9sZGVyczoKLSAgICAgICAgLy8gTm90ZTogbXVzdCBiZSB2YWxpZCBwcm9wZXJ0aWVzIGluIHR5cGUgVEVTVF9GT0xERVJfVFlQRV9JRAotICAgICAgICBwcm9wc1RvU2V0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BzVG9TZXQuYWRkKFRFU1RfRk9MREVSX1NUUklOR19QUk9QX0lEKTsKLSAgICAgICAgZ2VuLnNldEZvbGRlclByb3BlcnRpZXNUb0dlbmVyYXRlKHByb3BzVG9TZXQpOwotCi0gICAgICAgIC8vIEJ1aWxkIHRoZSB0cmVlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZW4uY3JlYXRlRm9sZGVySGllcmFjaHkobGV2ZWxzLCBjaGlsZHJlblBlckxldmVsLCBmUm9vdEZvbGRlcklkKTsKLSAgICAgICAgICAgIC8vIER1bXAgdGhlIHRyZWUKLSAgICAgICAgICAgIGdlbi5kdW1wRm9sZGVyKGZSb290Rm9sZGVySWQsICIqIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJDb3VsZCBub3QgY3JlYXRlIGZvbGRlciBoaWVyYXJjaHkgd2l0aCBkb2N1bWVudHMuICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZU9iamVjdCgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3REZWxldGVPYmplY3QoKSAuLi4iKTsKLSAgICAgICAgbG9nLmluZm8oIlRlc3RpbmcgdG8gZGVsZXRlIGEgZG9jdW1lbnQiKTsKLSAgICAgICAgbG9nLmluZm8oIiAgY3JlYXRpbmcgb2JqZWN0Iik7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KGZSb290Rm9sZGVySWQsIGZhbHNlKTsKLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCIgIGNyZWF0ZURvY3VtZW50IHN1Y2NlZWRlZCB3aXRoIGNyZWF0ZWQgaWQ6ICIgKyBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiICBnZXR0aW5nIG9iamVjdCIpOwotICAgICAgICByZXRyaWV2ZURvY3VtZW50KGlkKTsKLSAgICAgICAgbG9nLmluZm8oIiAgZGVsZXRpbmcgb2JqZWN0Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLmRlbGV0ZU9iamVjdChmUmVwb3NpdG9yeUlkLCBpZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJkZWxldGVPYmplY3QoKSBmb3IgZG9jdW1lbnQgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0aGF0IGl0IGRvZXMgbm90IGV4aXN0IGFueW1vcmUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgib2JqZWN0IHNob3VsZCBub3QgbG9uZ2VyIGV4aXN0IGFmdGVyIGl0IHdhcyBkZWxldGVkLiIpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImdldHRpbmcgZGVsZXRlZCBvYmplY3Qgc2hvdWxkIHJhaXNlIENNSVNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgYnV0IGdvdCAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiVGVzdGluZyB0byBkZWxldGUgYW4gZW1wdHkgZm9sZGVyIik7Ci0gICAgICAgIC8vIGNyZWF0ZSBhbmQgZGVsZXRlIGFuIGVtcHR5IGZvbGRlcgotICAgICAgICBpZCA9IGNyZWF0ZUZvbGRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZk9ialN2Yy5kZWxldGVPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQsIHRydWUsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZGVsZXRlT2JqZWN0KCkgZm9yIGZvbGRlciBmYWlsZWQgd2l0aCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayB0aGF0IGl0IGRvZXMgbm90IGV4aXN0IGFueW1vcmUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgib2JqZWN0IHNob3VsZCBub3QgbG9uZ2VyIGV4aXN0IGFmdGVyIGl0IHdhcyBkZWxldGVkLiIpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImdldHRpbmcgZGVsZXRlZCBvYmplY3Qgc2hvdWxkIHJhaXNlIENNSVNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgYnV0IGdvdCAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgYSBmb2xkZXIgd2l0aCBhIGRvY3VtZW50IGFuZCBkZWxldGUgc2hvdWxkIGZhaWwKLSAgICAgICAgLy8gY3JlYXRlIGFuZCBkZWxldGUgYW4gZW1wdHkgZm9sZGVyCi0gICAgICAgIGxvZy5pbmZvKCJUZXN0aW5nIHRvIGRlbGV0ZSBhIGZvbGRlciB3aXRoIGEgY29udGFpbmVkIGRvY3VtZW50Iik7Ci0gICAgICAgIFN0cmluZyBmb2xkZXJJZDsKLSAgICAgICAgZm9sZGVySWQgPSBjcmVhdGVGb2xkZXIoKTsKLSAgICAgICAgaWQgPSBjcmVhdGVEb2N1bWVudChmb2xkZXJJZCwgZmFsc2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLmRlbGV0ZU9iamVjdChmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJkZWxldGVPYmplY3QoKSBmb3IgZm9sZGVyIHdpdGggYSBkb2N1bWVudCBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyBzaG91bGQgc3VjY2VlZCBpZiB3ZSBmaXJzdCBkZWxldGUgZG9jdW1lbnQgdGhlbiBmb2xkZXIKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZPYmpTdmMuZGVsZXRlT2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgIGZPYmpTdmMuZGVsZXRlT2JqZWN0KGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImRlbGV0ZU9iamVjdCgpIGZvciBkb2N1bWVudCBhbmQgZm9sZGVyIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgaXQgZG9lcyBub3QgZXhpc3QgYW55bW9yZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJvYmplY3Qgc2hvdWxkIG5vdCBsb25nZXIgZXhpc3QgYWZ0ZXIgaXQgd2FzIGRlbGV0ZWQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZ2V0dGluZyBkZWxldGVkIG9iamVjdCBzaG91bGQgcmFpc2UgQ01JU09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBidXQgZ290ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJvYmplY3Qgc2hvdWxkIG5vdCBsb25nZXIgZXhpc3QgYWZ0ZXIgaXQgd2FzIGRlbGV0ZWQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZ2V0dGluZyBkZWxldGVkIG9iamVjdCBzaG91bGQgcmFpc2UgQ01JU09iamVjdE5vdEZvdW5kRXhjZXB0aW9uLCBidXQgZ290ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3REZWxldGVPYmplY3QoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGVUcmVlKCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdERlbGV0ZVRyZWUoKSAuLi4iKTsKLSAgICAgICAgT2JqZWN0R2VuZXJhdG9yIGdlbiA9IG5ldyBPYmplY3RHZW5lcmF0b3IoZkZhY3RvcnksIGZOYXZTdmMsIGZPYmpTdmMsIGZSZXBTdmMsIGZSZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICAgICAgT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kLkxPUkVNX0lQU1VNX1RFWFQpOwotICAgICAgICBTdHJpbmcgcm9vdEZvbGRlcklkID0gY3JlYXRlRm9sZGVyKCk7Ci0gICAgICAgIC8vIFNldCB0aGUgdHlwZSBpZCBmb3IgYWxsIGNyZWF0ZWQgZG9jdW1lbnRzOgotICAgICAgICBnZW4uc2V0RG9jdW1lbnRUeXBlSWQoRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLmdldElkKCkpOwotICAgICAgICAvLyBTZXQgdGhlIHR5cGUgaWQgZm9yIGFsbCBjcmVhdGVkIGZvbGRlcnM6Ci0gICAgICAgIGdlbi5zZXRGb2xkZXJUeXBlSWQoRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0ZvbGRlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgZ2VuLnNldE51bWJlck9mRG9jdW1lbnRzVG9DcmVhdGVQZXJGb2xkZXIoMik7IC8vIGNyZWF0ZSB0d28gZG9jdW1lbnRzIGluCi0gICAgICAgIC8vIGVhY2ggZm9sZGVyCi0gICAgICAgIGdlbi5jcmVhdGVGb2xkZXJIaWVyYWNoeSgxLCAxLCByb290Rm9sZGVySWQpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZk9ialN2Yy5kZWxldGVUcmVlKGZSZXBvc2l0b3J5SWQsIHJvb3RGb2xkZXJJZCwgbnVsbCAvKiB0cnVlICovLCBVbmZpbGVPYmplY3QuREVMRVRFLCB0cnVlLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImRlbGV0ZVRyZWUgZmFpbGVkIHVuZXhwZWN0ZWQuICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuaW5mbygiRHVtcGluZyBmb2xkZXIsIHNob3VsZCBvbmx5IGNvbnRhaW4gb25lIGVtcHR5IGZvbGRlciB1bmRlciByb290Iik7Ci0gICAgICAgIGdlbi5kdW1wRm9sZGVyKGZSb290Rm9sZGVySWQsICIqIik7Ci0KLSAgICAgICAgLy8gQWZ0ZXIgdGhhdCB3ZSBzaG91bGQgYmUgbm90IGJlIGFibGUgdG8gZ2V0IHRoZSByb290IGZvbGRlciwgYmVjYXVzZQotICAgICAgICAvLyBpdCBzaG91bGQgYmUgZGVsZXRlZAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgcm9vdEZvbGRlcklkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgZmFpbCgib2JqZWN0IHNob3VsZCBub3QgbG9uZ2VyIGV4aXN0IGFmdGVyIGl0IHdhcyBkZWxldGVkLiIpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImdldHRpbmcgZGVsZXRlZCBvYmplY3Qgc2hvdWxkIHJhaXNlIENNSVNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiwgYnV0IGdvdCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0RGVsZXRlVHJlZSgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVGb2xkZXIoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0TW92ZUZvbGRlcigpIC4uLiIpOwotICAgICAgICBtb3ZlT2JqZWN0VGVzdCh0cnVlKTsKLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0TW92ZUZvbGRlcigpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1vdmVEb2N1bWVudCgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RNb3ZlRG9jdW1lbnQoKSAuLi4iKTsKLSAgICAgICAgbW92ZU9iamVjdFRlc3QoZmFsc2UpOwotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RNb3ZlRG9jdW1lbnQoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0aWVzKCkgewotICAgICAgICAvLyBUT0RPIGFkZCB0ZXN0IHJlbmFtZSByb290IGZvbGRlciBhbmQgbm9uIHJvb3QgZm9sZGVyIChtdXN0IGJlIGEKLSAgICAgICAgLy8gZm9sZGVyKQotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdFVwZGF0ZVByb3BlcnRpZXMoKSAuLi4iKTsKLSAgICAgICAgU3RyaW5nIG9sZENoYW5nZVRva2VuLCBuZXdDaGFuZ2VUb2tlbjsKLSAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlRG9jdW1lbnRXaXRoQ3VzdG9tVHlwZShNWV9DVVNUT01fTkFNRSwgZlJvb3RGb2xkZXJJZCwgZmFsc2UpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0ZURvY3VtZW50IHN1Y2NlZWRlZCB3aXRoIGNyZWF0ZWQgaWQ6ICIgKyBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiICBnZXR0aW5nIG9iamVjdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0RGF0YSByZXMgPSBmT2JqU3ZjLmdldE9iamVjdChmUmVwb3NpdG9yeUlkLCBpZCwgIioiLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgcmV0dXJuZWQgcHJvcGVydGllcwotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcGQgOiBwcm9wcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgIHJldHVybiBwcm9wZXJ0eSBpZDogIiArIHBkLmdldElkKCkgKyAiLCB2YWx1ZTogIiArIHBkLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHJldHVybmVkSWQgPSByZXMuZ2V0SWQoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpZCwgcmV0dXJuZWRJZCk7Ci0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wcy5nZXQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBkKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNWV9DVVNUT01fTkFNRSwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgIHBkID0gcHJvcHMuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhURVNUX0NVU1RPTV9ET0NVTUVOVF9UWVBFX0lELCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICAgICAgcGQgPSBwcm9wcy5nZXQoVEVTVF9ET0NVTUVOVF9NWV9TVFJJTkdfUFJPUF9JRCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk15IHByZXR0eSBzdHJpbmciLCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICAgICAgcGQgPSBwcm9wcy5nZXQoVEVTVF9ET0NVTUVOVF9NWV9JTlRfUFJPUF9JRCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDQ3MTEpLCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotCi0gICAgICAgICAgICAvLyB1cGRhdGUgcHJvcGVydGllczoKLSAgICAgICAgICAgIGxvZy5pbmZvKCJ1cGRhdGluZyBwcm9wZXJ0eSIpOwotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgICAgIC8vIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLkNNSVNfTkFNRQotICAgICAgICAgICAgLy8gLCBNWV9DVVNUT01fTkFNRSkpOwotICAgICAgICAgICAgLy8gcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuCi0gICAgICAgICAgICAvLyBDTUlTX09CSkVDVF9UWVBFX0lELCBURVNUX0NVU1RPTV9ET0NVTUVOVF9UWVBFX0lEKSk7Ci0gICAgICAgICAgICAvLyBHZW5lcmF0ZSBzb21lIHByb3BlcnR5IHZhbHVlcyBmb3IgY3VzdG9tIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShURVNUX0RPQ1VNRU5UX01ZX1NUUklOR19QUk9QX0lELCBORVdfU1RSSU5HX1BST1BfVkFMKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFRFU1RfRE9DVU1FTlRfTVlfSU5UX1BST1BfSUQsIE5FV19JTlRfUFJPUF9WQUwpKTsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgbmV3UHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oaWQpOwotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW5Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZPYmpTdmMudXBkYXRlUHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgY2hhbmdlVG9rZW5Ib2xkZXIsIG5ld1Byb3BzLCBudWxsKTsKLSAgICAgICAgICAgIG9sZENoYW5nZVRva2VuID0gY2hhbmdlVG9rZW5Ib2xkZXIuZ2V0VmFsdWUoKTsgLy8gc3RvcmUgZm9yIGxhdGVyCi0gICAgICAgICAgICB2ZXJpZnlVcGRhdGVkUHJvcGVydGllcyhpZCwgTVlfQ1VTVE9NX05BTUUpOwotCi0gICAgICAgICAgICAvLyBUZXN0IGRlbGV0ZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBsb2cuaW5mbygiZGVsZXRpbmcgcHJvcGVydHkiKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShURVNUX0RPQ1VNRU5UX01ZX1NUUklOR19QUk9QX0lELCAoU3RyaW5nKSBudWxsKSk7Ci0gICAgICAgICAgICBuZXdQcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7IC8vIGVuc3VyZSBuZXcgY2hhbmdlIHRva2VuLCB0aW1lciByZXNvbHV0aW9uIGlzCi0gICAgICAgICAgICAvLyBub3QgZ29vZCBlbm91Z2gKLSAgICAgICAgICAgIGZPYmpTdmMudXBkYXRlUHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgY2hhbmdlVG9rZW5Ib2xkZXIsIG5ld1Byb3BzLCBudWxsKTsKLSAgICAgICAgICAgIHJlcyA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgcHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHBkMiA6IHByb3BzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIiAgcmV0dXJuIHByb3BlcnR5IGlkOiAiICsgcGQyLmdldElkKCkgKyAiLCB2YWx1ZTogIiArIHBkMi5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwZCA9IHByb3BzLmdldChURVNUX0RPQ1VNRU5UX01ZX1NUUklOR19QUk9QX0lEKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwocGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgICAgIC8vIGRlbGV0ZSBhIHJlcXVpcmVkIHByb3BlcnR5IGFuZCBleHBlY3QgZXhjZXB0aW9uOgotICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YShURVNUX0RPQ1VNRU5UX01ZX0lOVF9QUk9QX0lELCAoQmlnSW50ZWdlcikgbnVsbCkpOwotICAgICAgICAgICAgbmV3UHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGlkKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZk9ialN2Yy51cGRhdGVQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCBjaGFuZ2VUb2tlbkhvbGRlciwgbmV3UHJvcHMsIG51bGwpOwotICAgICAgICAgICAgICAgIGZhaWwoIkRlbGV0ZWluZyBhIHJlcXVpcmVkIHByb3BlcnR5IHNob3VsZCBmYWlsLiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRlc3QgdmlvbGF0aW9uIG9mIHByb3BlcnR5IGRlZmluaXRpb24gY29uc3RyYWludHMKLSAgICAgICAgICAgIGxvZy5pbmZvKCJUZXN0IHZpb2xhdGlvbiBvZiBwcm9wZXJ0eSBkZWZpbml0aW9uIGNvbnN0cmFpbnRzIik7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVEVTVF9ET0NVTUVOVF9NWV9TVFJJTkdfUFJPUF9JRCwKLSAgICAgICAgICAgICAgICAgICAgIkEgdmVyeSBsb25nIFN0cmluZyBBQkNERUZISUpLTE1OT1BRUlNUVVZXWFlaIikpOwotICAgICAgICAgICAgbmV3UHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGlkKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZk9ialN2Yy51cGRhdGVQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCBjaGFuZ2VUb2tlbkhvbGRlciwgbmV3UHJvcHMsIG51bGwpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4Y2VlZGluZyBtYXggU3RyaW5nIGxlbmd0IGggc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRlc3Qgc3RhbGUgdG9rZW4KLSAgICAgICAgICAgIGxvZy5pbmZvKCJUZXN0IHN0YWxlIHRva2VuIik7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVEVTVF9ET0NVTUVOVF9NWV9TVFJJTkdfUFJPUF9JRCwgIkFCQyIpKTsKLSAgICAgICAgICAgIG5ld1Byb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgICAgICAvLyBzZXQgb3V0ZGF0ZWQgdG9rZW4KLSAgICAgICAgICAgIG5ld0NoYW5nZVRva2VuID0gY2hhbmdlVG9rZW5Ib2xkZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGNoYW5nZVRva2VuSG9sZGVyLnNldFZhbHVlKG9sZENoYW5nZVRva2VuKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG9sZENoYW5nZVRva2VuLmVxdWFscyhuZXdDaGFuZ2VUb2tlbikpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmT2JqU3ZjLnVwZGF0ZVByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLCBuZXdQcm9wcywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVXBkYXRlIHdpdGggYW4gb3V0ZGF0ZWQgY2hhbmdlVG9rZW4gc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHRlc3QgYSByZW5hbWUKLSAgICAgICAgICAgIGxvZy5pbmZvKCJUZXN0IHJlbmFtaW5nIik7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmV3TmFtZSA9ICJNeSBSZW5hbWVkIERvY3VtZW50IjsgLy8gTVlfQ1VTVE9NX05BTUUKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsIG5ld05hbWUpKTsKLSAgICAgICAgICAgIG5ld1Byb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBjaGFuZ2VUb2tlbkhvbGRlci5zZXRWYWx1ZShuZXdDaGFuZ2VUb2tlbik7Ci0gICAgICAgICAgICBmT2JqU3ZjLnVwZGF0ZVByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLCBuZXdQcm9wcywgbnVsbCk7Ci0gICAgICAgICAgICBpZCA9IGlkSG9sZGVyLmdldFZhbHVlKCk7IC8vIG5vdGUgdGhhdCBpZCBpcyBwYXRoIGFuZCBoYXMgY2hhbmdlZCEKLSAgICAgICAgICAgIHJlcyA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgcHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIHBkID0gcHJvcHMuZ2V0KFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwZCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3TmFtZSwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLQotICAgICAgICAgICAgLy8gdGVzdCByZW5hbWUgd2l0aCBhIGNvbmZsaWN0aW5nIG5hbWUKLSAgICAgICAgICAgIGNyZWF0ZURvY3VtZW50V2l0aEN1c3RvbVR5cGUoTVlfQ1VTVE9NX05BTUUsIGZSb290Rm9sZGVySWQsIGZhbHNlKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsIE1ZX0NVU1RPTV9OQU1FKSk7Ci0gICAgICAgICAgICBuZXdQcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgLy8gbm93IHJlbmFtZSB0byBvbGQgbmFtZQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmT2JqU3ZjLnVwZGF0ZVByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLCBuZXdQcm9wcywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVXBkYXRlIHdpdGggYSBjb25mbGljdGluZyBuYW1lIHNob3VsZCBmYWlsLiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzTmFtZUNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0ZXN0IGFuIGludmFsaWQgbmFtZQotICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgIkludmFsaWQvTmFtZSIpKTsKLSAgICAgICAgICAgIG5ld1Byb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZPYmpTdmMudXBkYXRlUHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgY2hhbmdlVG9rZW5Ib2xkZXIsIG5ld1Byb3BzLCBudWxsKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJVcGRhdGUgd2l0aCBhbiBpbnZhbGlkIG5hbWUgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJnZXRPYmplY3QoKSBmYWlsZWQgd2l0aCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RVcGRhdGVQcm9wZXJ0aWVzKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dhYmxlQWN0aW9ucygpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RBbGxvd2FibGVBY3Rpb25zKCkgLi4uIik7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gd2l0aENvbnRlbnQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlRG9jdW1lbnQoZlJvb3RGb2xkZXJJZCwgd2l0aENvbnRlbnQpOwotCi0gICAgICAgIC8vIGdldCBhbGxvd2FibGUgYWN0aW9ucyB2aWEgZ2V0T2JqZWN0Ci0gICAgICAgIE9iamVjdERhdGEgcmVzID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQsICIqIiwgdHJ1ZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcy5nZXRBbGxvd2FibGVBY3Rpb25zKCkpOwotICAgICAgICBTZXQ8QWN0aW9uPiBhY3Rpb25zID0gcmVzLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWN0aW9ucyk7Ci0gICAgICAgIHZlcmlmeUFsbG93YWJsZUFjdGlvbnNEb2N1bWVudChhY3Rpb25zLCBmYWxzZSwgd2l0aENvbnRlbnQpOwotCi0gICAgICAgIC8vIGdldCBhbGxvd2FibGUgYWN0aW9ucyB2aWEgZ2V0QWxsb3dhYmxlQWN0aW9ucwotICAgICAgICBBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMgPSBmT2JqU3ZjLmdldEFsbG93YWJsZUFjdGlvbnMoZlJlcG9zaXRvcnlJZCwgaWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICBhY3Rpb25zID0gYWxsb3dhYmxlQWN0aW9ucy5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWN0aW9ucyk7Ci0gICAgICAgIHZlcmlmeUFsbG93YWJsZUFjdGlvbnNEb2N1bWVudChhY3Rpb25zLCBmYWxzZSwgd2l0aENvbnRlbnQpOwotCi0gICAgICAgIC8vIGNsZWFudXAKLSAgICAgICAgZk9ialN2Yy5kZWxldGVPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQsIHRydWUsIG51bGwpOwotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RBbGxvd2FibGVBY3Rpb25zKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFByb3BlcnRpZXNEb2N1bWVudCgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3REZWZhdWx0UHJvcGVydGllc0RvY3VtZW50KCkgLi4uIik7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KCJEZWZQcm9wRG9jIiwgZlJvb3RGb2xkZXJJZCwgVEVTVF9ET0NfVFlQRV9XSVRIX0RFRkFVTFRTX0lELCBmYWxzZSk7Ci0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRlRG9jdW1lbnQgc3VjY2VlZGVkIHdpdGggY3JlYXRlZCBpZDogIiArIGlkKTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3REYXRhIHJlcyA9IGdldERvY3VtZW50T2JqZWN0RGF0YShpZCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBkID0gcHJvcHMuZ2V0KFRFU1RfRE9DVU1FTlRfTVlfSU5UX1BST1BfSUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkKTsKLSAgICAgICAgT2JqZWN0IGJpID0gcGQuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGJpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigxMDApLCBiaSk7Ci0KLSAgICAgICAgcGQgPSBwcm9wcy5nZXQoVEVTVF9ET0NVTUVOVF9NWV9NVUxUSV9TVFJJTkdfUFJPUF9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVMaXN0ID0gKExpc3Q8U3RyaW5nPikgcGQuZ2V0VmFsdWVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmFsdWVMaXN0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZUxpc3QuY29udGFpbnMoIkFwYWNoZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZUxpc3QuY29udGFpbnMoIkNNSVMiKSk7Ci0KLSAgICAgICAgcGQgPSBwcm9wcy5nZXQoVEVTVF9ET0NVTUVOVF9NWV9JTlRfUFJPUF9JRF9NQU5EQVRPUllfREVGQVVMVCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICBiaSA9IHBkLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChiaSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwKSwgYmkpOwotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdERlZmF1bHRQcm9wZXJ0aWVzRG9jdW1lbnQoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UHJvcGVydGllc0ZvbGRlcigpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3REZWZhdWx0UHJvcGVydGllc0ZvbGRlcigpIC4uLiIpOwotICAgICAgICBTdHJpbmcgaWQgPSBjcmVhdGVGb2xkZXIoIkRlZlByb3BGb2xkZXIiLCBmUm9vdEZvbGRlcklkLCBURVNUX0ZPTERFUl9UWVBFX1dJVEhfREVGQVVMVFNfSUQpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0ZURvY3VtZW50IHN1Y2NlZWRlZCB3aXRoIGNyZWF0ZWQgaWQ6ICIgKyBpZCk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0RGF0YSByZXMgPSBnZXREb2N1bWVudE9iamVjdERhdGEoaWQpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BzID0gcmVzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IHByb3BzLmdldChURVNUX0ZPTERFUl9NWV9JTlRfUFJPUF9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICBPYmplY3QgYmkgPSBwZC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYmkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEwMCksIGJpKTsKLQotICAgICAgICBwZCA9IHByb3BzLmdldChURVNUX0ZPTERFUl9NWV9NVUxUSV9TVFJJTkdfUFJPUF9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVMaXN0ID0gKExpc3Q8U3RyaW5nPikgcGQuZ2V0VmFsdWVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmFsdWVMaXN0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZUxpc3QuY29udGFpbnMoIkFwYWNoZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZUxpc3QuY29udGFpbnMoIkNNSVMiKSk7Ci0KLSAgICAgICAgcGQgPSBwcm9wcy5nZXQoVEVTVF9GT0xERVJfTVlfSU5UX1BST1BfSURfTUFOREFUT1JZX0RFRkFVTFQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkKTsKLSAgICAgICAgYmkgPSBwZC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYmkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDEwMCksIGJpKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3REZWZhdWx0UHJvcGVydGllc0ZvbGRlcigpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldE9iamVjdE5vT2JqZWN0SWRJbkZpbHRlcigpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RHZXRPYmplY3ROb09iamVjdElkSW5GaWx0ZXIoKSAuLi4iKTsKLSAgICAgICAgbG9nLmluZm8oIiAgY3JlYXRpbmcgb2JqZWN0Iik7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KGZSb290Rm9sZGVySWQsIGZhbHNlKTsKLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCIgIGNyZWF0ZURvY3VtZW50IHN1Y2NlZWRlZCB3aXRoIGNyZWF0ZWQgaWQ6ICIgKyBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiICBnZXR0aW5nIG9iamVjdCIpOwotICAgICAgICBTdHJpbmcgZmlsdGVyID0gUHJvcGVydHlJZHMuTkFNRSArICIsIiArIFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUgKyAiLCIgKyBQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFOwotICAgICAgICBPYmplY3REYXRhIHJlcyA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCBmaWx0ZXIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHJldHVybmVkSWQgPSByZXMuZ2V0SWQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGlkLCByZXR1cm5lZElkKTsKLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0R2V0T2JqZWN0Tm9PYmplY3RJZEluRmlsdGVyKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lhbENoYXJzKCkgewotCi0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0T2JqZWN0QnlQYXRoKCkgd2l0aCBzcGVjYWwgY2hhcnMuLi4iKTsKLSAgICAgICAgbG9nLmluZm8oIiAgY3JlYXRpbmcgb2JqZWN0Iik7Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lEID0gY3JlYXRlRG9jdW1lbnQoIkjvv73vv73vv73vv73vv73vv71uc2NoZW4iLCBmUm9vdEZvbGRlcklkLCBmYWxzZSk7Ci0gICAgICAgIGxvZy5pbmZvKCIgIGdldHRpbmcgb2JqZWN0IGJ5IHBhdGggd2l0aCBzcGVjaWFsIGNoYXJzIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3REYXRhIHJlcyA9IGZPYmpTdmMuZ2V0T2JqZWN0QnlQYXRoKGZSZXBvc2l0b3J5SWQsICIvSO+/ve+/ve+/ve+/ve+/ve+/vW5zY2hlbiIsICIqIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlcy5nZXRJZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImdldE9iamVjdCgpIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Db250ZW50QWxsb3dlZCgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3ROb0NvbnRlbnRBbGxvd2VkKCkgLi4uIik7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KCJOb0NvbnRlbnRBbGxvd2VkRG9jMSIsIGZSb290Rm9sZGVySWQsIFRFU1RfQ1VTVE9NX05PX0NPTlRFTlRfVFlQRV9JRCwgZmFsc2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWQgPSBjcmVhdGVEb2N1bWVudE5vQ2F0Y2goIk5vQ29udGVudEFsbG93ZWREb2MyIiwgZlJvb3RGb2xkZXJJZCwgVEVTVF9DVVNUT01fTk9fQ09OVEVOVF9UWVBFX0lELAotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgdHJ1ZSk7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGluZyAgZG9jdW1lbnQgd2l0aCBjb250ZW50IGFuZCB0eXBlIGFsbG93cyBubyBjb250ZW50IHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24pOwotICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICBkb2N1bWVudCB3aXRoIGNvbnRlbnQgZm9yIG5vLWNvbnRlbnQgdHlwZSBmYWlsZWQgYXMgZXhwZWN0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0Tm9Db250ZW50QWxsb3dlZCBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNdXN0SGF2ZUNvbnRlbnQoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0TXVzdEhhdmVDb250ZW50KCkgLi4uIik7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KCJNdXN0SGF2ZUNvbnRlbnRBbGxvd2VkRG9jMSIsIGZSb290Rm9sZGVySWQsIFRFU1RfQ1VTVE9NX01VU1RfQ09OVEVOVF9UWVBFX0lELCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlkID0gY3JlYXRlRG9jdW1lbnROb0NhdGNoKCJNdXN0SGF2ZUNvbnRlbnRBbGxvd2VkRG9jMiIsIGZSb290Rm9sZGVySWQsIFRFU1RfQ1VTVE9NX01VU1RfQ09OVEVOVF9UWVBFX0lELAotICAgICAgICAgICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgZmFsc2UpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRpbmcgZG9jdW1lbnQgd2l0aG91dCBjb250ZW50IGFuZCB0eXBlIHJlcXVpcmVzIGNvbnRlbnQgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgZG9jdW1lbnQgd2l0aCBjb250ZW50IGZvciBtdXN0LWhhdmUtY29udGVudCB0eXBlIGZhaWxlZCBhcyBleHBlY3RlZC4iKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RNdXN0SGF2ZUNvbnRlbnQgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4Q29udGVudFNpemUoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0TWF4Q29udGVudFNpemUoKSAuLi4iKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZUNvbnRlbnQoTUFYX1NJWkUgKyAxLCBNQVhfU0laRSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGVDb250ZW50IHdpdGggZXhjZWVkZWQgY29udGVudCBzaXplIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY3JlYXRlRG9jdW1lbnQgd2l0aCBleGNlZWRlZCBmYWlsZWQgYXMgZXhjcGVjdGVkLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY3JlYXRlRG9jdW1lbnQgd2l0aCBleGNlZWRlZCBmYWlsZWQgd2l0aCB3cm9uZyBleGNlcHRpb24gKGV4cGVjdGVkIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24sIGdvdCAiCi0gICAgICAgICAgICAgICAgICAgICsgZTEuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjcmVhdGVDb250ZW50KE1BWF9TSVpFICsgMSwgTUFYX1NJWkUsIG51bGwpOwotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGNyZWF0ZURvY3VtZW50UHJvcGVydGllcygiVGVzdE1heENvbnRlbnRTaXplIiwgRE9DVU1FTlRfVFlQRV9JRCk7Ci0gICAgICAgICAgICBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmUm9vdEZvbGRlcklkLCBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGVEb2N1bWVudCB3aXRoIGV4Y2VlZGVkIGNvbnRlbnQgc2l6ZSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNyZWF0ZURvY3VtZW50IHdpdGggZXhjZWVkZWQgZmFpbGVkIGFzIGV4cGVjdGVkLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY3JlYXRlRG9jdW1lbnQgd2l0aCBleGNlZWRlZCBmYWlsZWQgd2l0aCB3cm9uZyBleGNlcHRpb24gKGV4cGVjdGVkIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24sIGdvdCAiCi0gICAgICAgICAgICAgICAgICAgICsgZTEuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlbmRpdGlvbkltYWdlKCkgewotICAgICAgICAvLyB1cGxvYWQgYW4gaW1hZ2UgYXMgSlBFRyBwaWN0dXJlCi0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0UmVuZGl0aW9uKCkgLi4uIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGltYWdlU3RyZWFtID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIi9pbWFnZS5qcGciKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlRlc3Qgc2V0dXAgZmFpbHVyZSBubyAnaW1hZ2UuanBnJyBpbiB0ZXN0IHJlc291cmNlcywgZ2V0UmVzb3VyY2VBc1N0cmVhbSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICBpbWFnZVN0cmVhbSk7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBjcmVhdGVEb2N1bWVudEZyb21TdHJlYW0oIlRlc3RKcGVnSW1hZ2UiLCBmUm9vdEZvbGRlcklkLCBET0NVTUVOVF9UWVBFX0lELCBpbWFnZVN0cmVhbSwgSlBFRyk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaWQpOwotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9ICIqIjsKLSAgICAgICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyA9IGZPYmpTdmMKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlbmRpdGlvbnMoZlJlcG9zaXRvcnlJZCwgaWQsIHJlbmRpdGlvbkZpbHRlciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlbmRpdGlvbnMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlbmRpdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIFJlbmRpdGlvbkRhdGEgcmQgPSByZW5kaXRpb25zLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKUEVHLCByZC5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiY21pczp0aHVtYm5haWwiLCByZC5nZXRLaW5kKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkLCByZC5nZXRSZW5kaXRpb25Eb2N1bWVudElkKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZC5nZXRCaWdIZWlnaHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJkLmdldEJpZ1dpZHRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlbmRpdGlvblV0aWwuVEhVTUJOQUlMX1NJWkUsIHJkLmdldEJpZ0hlaWdodCgpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZW5kaXRpb25VdGlsLlRIVU1CTkFJTF9TSVpFLCByZC5nZXRCaWdXaWR0aCgpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmQuZ2V0U3RyZWFtSWQoKSk7Ci0gICAgICAgICAgICBDb250ZW50U3RyZWFtIHJlbmRpdGlvbkNvbnRlbnQgPSBmT2JqU3ZjLmdldENvbnRlbnRTdHJlYW0oZlJlcG9zaXRvcnlJZCwgaWQsIHJkLmdldFN0cmVhbUlkKCksIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJkLmdldE1pbWVUeXBlKCksIHJlbmRpdGlvbkNvbnRlbnQuZ2V0TWltZVR5cGUoKSk7Ci0gICAgICAgICAgICByZWFkVGh1bWJuYWlsU3RyZWFtKHJlbmRpdGlvbkNvbnRlbnQuZ2V0U3RyZWFtKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJ0ZXN0UmVuZGl0aW9uIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiLCBlKTsKLSAgICAgICAgICAgIGZhaWwoInRlc3RSZW5kaXRpb24gZmFpbGVkIHdpdGggZXhjZWV0aW9uICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RSZW5kaXRpb24gZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGl0aW9uSWNvbigpIHsKLSAgICAgICAgLy8gZmFrZSBhbiBvZmZpY2UgZG9jdW1lbnQKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RSZW5kaXRpb24oKSAuLi4iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50ID0gY3JlYXRlQ29udGVudCg0LCAwLAotICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQiKTsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVEb2N1bWVudFByb3BlcnRpZXMoIlRlc3RKT2ZmaWNlIiwgRE9DVU1FTlRfVFlQRV9JRCk7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmUm9vdEZvbGRlcklkLCBjb250ZW50LCBWZXJzaW9uaW5nU3RhdGUuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaWQpOwotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9ICIqIjsKLSAgICAgICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyA9IGZPYmpTdmMKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlbmRpdGlvbnMoZlJlcG9zaXRvcnlJZCwgaWQsIHJlbmRpdGlvbkZpbHRlciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlbmRpdGlvbnMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlbmRpdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIFJlbmRpdGlvbkRhdGEgcmQgPSByZW5kaXRpb25zLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQTkcsIHJkLmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbWlzOnRodW1ibmFpbCIsIHJkLmdldEtpbmQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIHJkLmdldFJlbmRpdGlvbkRvY3VtZW50SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJkLmdldEJpZ0hlaWdodCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmQuZ2V0QmlnV2lkdGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVuZGl0aW9uVXRpbC5JQ09OX1NJWkUsIHJkLmdldEJpZ0hlaWdodCgpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZW5kaXRpb25VdGlsLklDT05fU0laRSwgcmQuZ2V0QmlnV2lkdGgoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJkLmdldFN0cmVhbUlkKCkpOwotICAgICAgICAgICAgQ29udGVudFN0cmVhbSByZW5kaXRpb25Db250ZW50ID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkLCByZC5nZXRTdHJlYW1JZCgpLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZC5nZXRNaW1lVHlwZSgpLCByZW5kaXRpb25Db250ZW50LmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgcmVhZFRodW1ibmFpbFN0cmVhbShyZW5kaXRpb25Db250ZW50LmdldFN0cmVhbSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigidGVzdFJlbmRpdGlvbiBmYWlsZWQgd2l0aCBleGNlcHRpb24gIiwgZSk7Ci0gICAgICAgICAgICBmYWlsKCJ0ZXN0UmVuZGl0aW9uIGZhaWxlZCB3aXRoIGV4Y2VldGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0UmVuZGl0aW9uIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZvbGRlclJlbmRpdGlvbigpIHsKLSAgICAgICAgLy8gdXBsb2FkIGFuIGltYWdlIGFzIEpQRUcgcGljdHVyZQotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdEZvbGRlclJlbmRpdGlvbigpIC4uLiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbWFnZVN0cmVhbSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvaW1hZ2UuanBnIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUZXN0IHNldHVwIGZhaWx1cmUgbm8gJ2ltYWdlLmpwZycgaW4gdGVzdCByZXNvdXJjZXMsIGdldFJlc291cmNlQXNTdHJlYW0gZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VTdHJlYW0pOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlRm9sZGVyKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaWQpOwotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciA9ICIqIjsKLSAgICAgICAgICAgIExpc3Q8UmVuZGl0aW9uRGF0YT4gcmVuZGl0aW9ucyA9IGZPYmpTdmMKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlbmRpdGlvbnMoZlJlcG9zaXRvcnlJZCwgaWQsIHJlbmRpdGlvbkZpbHRlciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlbmRpdGlvbnMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlbmRpdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIFJlbmRpdGlvbkRhdGEgcmQgPSByZW5kaXRpb25zLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhQTkcsIHJkLmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbWlzOnRodW1ibmFpbCIsIHJkLmdldEtpbmQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIHJkLmdldFJlbmRpdGlvbkRvY3VtZW50SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJkLmdldEJpZ0hlaWdodCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmQuZ2V0QmlnV2lkdGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVuZGl0aW9uVXRpbC5JQ09OX1NJWkUsIHJkLmdldEJpZ0hlaWdodCgpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZW5kaXRpb25VdGlsLklDT05fU0laRSwgcmQuZ2V0QmlnV2lkdGgoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJkLmdldFN0cmVhbUlkKCkpOwotICAgICAgICAgICAgQ29udGVudFN0cmVhbSByZW5kaXRpb25Db250ZW50ID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkLCByZC5nZXRTdHJlYW1JZCgpLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZC5nZXRNaW1lVHlwZSgpLCByZW5kaXRpb25Db250ZW50LmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgcmVhZFRodW1ibmFpbFN0cmVhbShyZW5kaXRpb25Db250ZW50LmdldFN0cmVhbSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigidGVzdEZvbGRlclJlbmRpdGlvbiBmYWlsZWQgd2l0aCBleGNlcHRpb24gIiwgZSk7Ci0gICAgICAgICAgICBmYWlsKCJ0ZXN0Rm9sZGVyUmVuZGl0aW9uIGZhaWxlZCB3aXRoIGV4Y2VldGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0Rm9sZGVyUmVuZGl0aW9uIGZpbmlzaGVkLiIpOwotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ29udGVudCgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RBcHBlbmRDb250ZW50KCkgLi4uIik7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50KGZSb290Rm9sZGVySWQsIHRydWUpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0ZURvY3VtZW50IHN1Y2NlZWRlZCB3aXRoIGNyZWF0ZWQgaWQ6ICIgKyBpZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhcHBlbmQgY29udGVudCBhZ2FpbiBpbiBhIHNlY29uZCBjYWxsCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGlkKTsKLQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBjcmVhdGVDb250ZW50KCk7Ci0gICAgICAgIGZPYmpTdmMuYXBwZW5kQ29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgbnVsbCwgY29udGVudFN0cmVhbSwgZmFsc2UsIG51bGwpOwotICAgICAgICBDb250ZW50U3RyZWFtIHNkID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgdmVyaWZ5Q29udGVudFJlc3VsdChzZCwgNjQpOwotCi0gICAgICAgIC8vIGNsZWFudXAKLSAgICAgICAgZk9ialN2Yy5kZWxldGVPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQsIHRydWUsIG51bGwpOwotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdEFwcGVuZENvbnRlbnQoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXJ0aWFsQ29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0UGFydGlhbENvbnRlbnQoKSAuLi4iKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIFNUUkVBTV9OQU1FICA9ICJkYXRhLnR4dCI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBNSU1FX1RZUEUgPSAidGV4dC9wbGFpbiI7Ci0gICAgICAgIC8vIGFwcGVuZCBjb250ZW50IGFnYWluIGluIGEgc2Vjb25kIGNhbGwKLQotICAgICAgICBDb250ZW50U3RyZWFtRGF0YUltcGwgY29udGVudCA9IG5ldyBDb250ZW50U3RyZWFtRGF0YUltcGwoLTEpOwotICAgICAgICBjb250ZW50LnNldEZpbGVOYW1lKFNUUkVBTV9OQU1FKTsKLSAgICAgICAgY29udGVudC5zZXRNaW1lVHlwZShNSU1FX1RZUEUpOwotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiIyMjIyMjIyMjIyMjIyMjIyB+fn5+VGhpcyBpcyBhIGNvbXBsZXRlbGV5IGlycmVsZXZhbnQgcHJlZml4IGhlYWRlci4gfn5+fiAjIyMjIyMjIyMjIyMjIyMjIjsKLQkJU3RyaW5nIG1haW4gPSAiTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gRG9uZWMgYSBkaWFtIGxlY3R1cy4gU2VkIHNpdCBhbWV0IGlwc3VtIG1hdXJpcy4gTWFlY2VuYXMgY29uZ3VlIGxpZ3VsYSBhYyBxdWFtIHZpdmVycmEgbmVjIGNvbnNlY3RldHVyIGFudGUgaGVuZHJlcml0LiBEb25lYyBldCBtb2xsaXMgZG9sb3IuIFByYWVzZW50IGV0IGRpYW0gZWdldCBsaWJlcm8gZWdlc3RhcyBtYXR0aXMgc2l0IGFtZXQgdml0YWUgYXVndWUuIE5hbSB0aW5jaWR1bnQgY29uZ3VlIGVuaW0sIHV0IHBvcnRhIGxvcmVtIGxhY2luaWEgY29uc2VjdGV0dXIuIERvbmVjIHV0IGxpYmVybyBzZWQgYXJjdSB2ZWhpY3VsYSB1bHRyaWNpZXMgYSBub24gdG9ydG9yLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBBZW5lYW4gdXQgZ3JhdmlkYSBsb3JlbS4gVXQgdHVycGlzIGZlbGlzLCBwdWx2aW5hciBhIHNlbXBlciBzZWQsIGFkaXBpc2NpbmcgaWQgZG9sb3IuIFBlbGxlbnRlc3F1ZSBhdWN0b3IgbmlzaSBpZCBtYWduYSBjb25zZXF1YXQgc2FnaXR0aXMuIEN1cmFiaXR1ciBkYXBpYnVzIGVuaW0gc2l0IGFtZXQgZWxpdCBwaGFyZXRyYSB0aW5jaWR1bnQgZmV1Z2lhdCBuaXNsIGltcGVyZGlldC4gVXQgY29udmFsbGlzIGxpYmVybyBpbiB1cm5hIHVsdHJpY2VzIGFjY3Vtc2FuLiBEb25lYyBzZWQgb2RpbyBlcm9zLiBEb25lYyB2aXZlcnJhIG1pIHF1aXMgcXVhbSBwdWx2aW5hciBhdCBtYWxlc3VhZGEgYXJjdSByaG9uY3VzLiBDdW0gc29jaWlzIG5hdG9xdWUgcGVuYXRpYnVzIGV0IG1hZ25pcyBkaXMgcGFydHVyaWVudCBtb250ZXMsIG5hc2NldHVyIHJpZGljdWx1cyBtdXMuIEluIHJ1dHJ1bSBhY2N1bXNhbiB1bHRyaWNpZXMuIE1hdXJpcyB2aXRhZSBuaXNpIGF0IHNlbSBmYWNpbGlzaXMgc2VtcGVyIGFjIGluIGVzdC4iOwotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9ICIjIyMjIyMjIyMjIyMjIyMjIH5+fn5QT1NURklYIFBsZWFzZSBpZ25vcmUgUE9TVEZJWCBQT1NURklYIFBPU1RGSVggfn5+fiAjIyMjIyMjIyMjIyMjIyMjIjsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFByaW50U3RyZWFtIHByaW50U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKGJhLCBmYWxzZSwgRU5DT0RJTkdfVVRGOCk7IAotICAgICAgICBwcmludFN0cmVhbS5wcmludGxuKHByZWZpeCk7Ci0gICAgICAgIHByaW50U3RyZWFtLnByaW50bG4obWFpbik7Ci0gICAgICAgIHByaW50U3RyZWFtLnByaW50bG4ocG9zdGZpeCk7Ci0KLSAgICAgICAgY29udGVudC5zZXRDb250ZW50KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYS50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgZG9jdW1lbnQgd2l0aCBjb250ZW50Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVEb2N1bWVudFByb3BlcnRpZXMoIlBhcnRpYWxDb250ZW50VGVzdCIsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKTsKLSAgICAgICAgU3RyaW5nIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgY29udGVudCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRlRG9jdW1lbnQgc3VjY2VlZGVkIHdpdGggY3JlYXRlZCBpZDogIiArIGlkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IG9mZnNldCA9IHByZWZpeC5sZW5ndGgoKSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKS5sZW5ndGgoKTsgLy8gZm9yIFxuCi0gICAgICAgIGludCBsZW5ndGggPSBtYWluLmxlbmd0aCgpOwotCQlDb250ZW50U3RyZWFtIHJlYWRDb250ZW50ID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkLCBudWxsLAotCQkJCUJpZ0ludGVnZXIudmFsdWVPZihvZmZzZXQpLCBCaWdJbnRlZ2VyLnZhbHVlT2YobGVuZ3RoKSwgbnVsbCk7Ci0JCQotICAgICAgICBhc3NlcnRFcXVhbHMoTUlNRV9UWVBFLCByZWFkQ29udGVudC5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUkVBTV9OQU1FLCByZWFkQ29udGVudC5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxlbmd0aCwgcmVhZENvbnRlbnQuZ2V0QmlnTGVuZ3RoKCkubG9uZ1ZhbHVlKCkpOwotCi0gICAgICAgIGJ5dGVbXSBieXRlc1JlYWQgPSBuZXcgYnl0ZVsxMDI0MF07Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gcmVhZENvbnRlbnQuZ2V0U3RyZWFtKCk7Ci0gICAgICAgIGludCBsZW5ndGhSZWFkID0gaXMucmVhZChieXRlc1JlYWQpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZyhieXRlc1JlYWQsIDAsIGxlbmd0aFJlYWQsIEVOQ09ESU5HX1VURjgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGVuZ3RoLCBsZW5ndGhSZWFkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1haW4sIHJlc3VsdCk7Ci0gICAgICAgIAotICAgICAgICAvLyBjbGVhbnVwCi0gICAgICAgIGZPYmpTdmMuZGVsZXRlT2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCB0cnVlLCBudWxsKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RHZXRQYXJ0aWFsQ29udGVudCgpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJ1bGtVcGRhdGVQcm9wZXJ0aWVzKCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdEJ1bGtVcGRhdGVQcm9wZXJ0aWVzKCkgLi4uIik7Ci0gICAgICAgIFN0cmluZyBNWV9DVVNUT01fTkFNRV8yID0gTVlfQ1VTVE9NX05BTUUgKyAiXzIiOwotICAgICAgICBTdHJpbmcgaWQxID0gY3JlYXRlRG9jdW1lbnRXaXRoQ3VzdG9tVHlwZShNWV9DVVNUT01fTkFNRSwgZlJvb3RGb2xkZXJJZCwgZmFsc2UpOwotICAgICAgICBTdHJpbmcgaWQyID0gY3JlYXRlRG9jdW1lbnRXaXRoQ3VzdG9tVHlwZShNWV9DVVNUT01fTkFNRV8yLCBmUm9vdEZvbGRlcklkLCBmYWxzZSk7Ci0gICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbjEsIGNoYW5nZVRva2VuMjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdERhdGEgcmVzID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQxLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wcyA9IHJlcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgY2hhbmdlVG9rZW4xID0gKFN0cmluZykgcHJvcHMuZ2V0KFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTikuZ2V0Rmlyc3RWYWx1ZSgpOwotCi0gICAgICAgICAgICByZXMgPSBmT2JqU3ZjCi0gICAgICAgICAgICAgICAgICAgIC5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgaWQyLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgcHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGNoYW5nZVRva2VuMiA9IChTdHJpbmcpIHByb3BzLmdldChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgcmV0dXJuZWQgcHJvcGVydGllcwotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcGQgOiBwcm9wcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCIgIHJldHVybiBwcm9wZXJ0eSBpZDogIiArIHBkLmdldElkKCkgKyAiLCB2YWx1ZTogIiArIHBkLmdldFZhbHVlcygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdXBkYXRlIHByb3BlcnRpZXM6Ci0gICAgICAgICAgICBsb2cuaW5mbygidXBkYXRpbmcgcHJvcGVydHkiKTsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVEVTVF9ET0NVTUVOVF9NWV9TVFJJTkdfUFJPUF9JRCwgTkVXX1NUUklOR19QUk9QX1ZBTCkpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YShURVNUX0RPQ1VNRU5UX01ZX0lOVF9QUk9QX0lELCBORVdfSU5UX1BST1BfVkFMKSk7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIG5ld1Byb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgICAgICAvLyB3YWl0IHNvbWUgdGltZSB0byBnZXQgYSBuZXdlciBjaGFuZ2UgdG9rZW4KLQotICAgICAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gb2JqcyA9IG5ldyBBcnJheUxpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+KCk7Ci0gICAgICAgICAgICBvYmpzLmFkZChuZXcgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsKGlkMSwgY2hhbmdlVG9rZW4xKSk7Ci0gICAgICAgICAgICBvYmpzLmFkZChuZXcgQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW5JbXBsKGlkMiwgY2hhbmdlVG9rZW4yKSk7Ci0KLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG5ld09ianM7Ci0gICAgICAgICAgICBuZXdPYmpzID0gZk9ialN2Yy5idWxrVXBkYXRlUHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBvYmpzLCBuZXdQcm9wcywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5ld09ianMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9ianMuc2l6ZSgpLCBuZXdPYmpzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld09ianMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMob2Jqcy5nZXQoaSkuZ2V0SWQoKSwgbmV3T2Jqcy5nZXQoaSkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghb2Jqcy5nZXQoaSkuZ2V0Q2hhbmdlVG9rZW4oKS5lcXVhbHMobmV3T2Jqcy5nZXQoaSkuZ2V0Q2hhbmdlVG9rZW4oKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBuZXcgcHJvcGVydGllcyBhcmUgc2V0Ci0gICAgICAgICAgICB2ZXJpZnlVcGRhdGVkUHJvcGVydGllcyhpZDEsIE1ZX0NVU1RPTV9OQU1FKTsKLSAgICAgICAgICAgIHZlcmlmeVVwZGF0ZWRQcm9wZXJ0aWVzKGlkMiwgTVlfQ1VTVE9NX05BTUVfMik7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoInRlc3RCdWxrVXBkYXRlUHJvcGVydGllcygpIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdEJ1bGtVcGRhdGVQcm9wZXJ0aWVzKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgLy8gQ01JUyAxLjE6IHRlc3QgaXRlbSB0eXBwZQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEl0ZW1DcmVhdGlvbigpIHsKLQotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdEl0ZW1DcmVhdGlvbigpIC4uLiIpOwotICAgICAgICBTdHJpbmcgcHJvcFZhbCA9ICJhYmMxMjMiOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJDb29sSXRlbSI7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZUl0ZW0obmFtZSwgZlJvb3RGb2xkZXJJZCwgcHJvcFZhbCk7Ci0gICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygidGVzdEl0ZW1DcmVhdGlvbiBzdWNjZWVkZWQgd2l0aCBjcmVhdGVkIGlkOiAiICsgaWQpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdENyZWF0ZU9iamVjdCgpIGZpbmlzaGVkLiIpOwotCi0gICAgICAgIC8vIHJlYWQgZG9jdW1lbnQgYWdhaW4gYW5kIGNoZWNrIHByb3BlcnRpZXMKLSAgICAgICAgT2JqZWN0RGF0YSByZXMgPSBnZXREb2N1bWVudE9iamVjdERhdGEoaWQpOwotICAgICAgICBTdHJpbmcgcmV0dXJuZWRJZCA9IHJlcy5nZXRJZCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BzID0gcmVzLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHRlc3RSZXR1cm5lZFByb3BlcnRpZXMocmV0dXJuZWRJZCwgbmFtZSwgVEVTVF9JVEVNX1RZUEVfSUQsIHByb3BzKTsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBkID0gcHJvcHMuZ2V0KElURU1fU1RSSU5HX1BST1ApOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJvcFZhbCwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBwcm9wcy5zaXplKCkpOyAvLyBzaG91bGQgbm90IGNvbnRhaW4gYWxsIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgbG9nLmluZm8oIi4uLiBmaW5pc2hlZCB0ZXN0SXRlbUNyZWF0aW9uKCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlUeXBlcygpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RJdGVtQ3JlYXRpb24oKSAuLi4iKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0clByb3BWYWwgPSAiU2Vjb25kYXJ5IjsKLSAgICAgICAgZmluYWwgQmlnSW50ZWdlciBpbnRQcm9wVmFsID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmltYXJ5UHJvcFZhbCA9ICJTYW1wbGUgRG9jIFN0cmluZyBQcm9wZXJ0eSI7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLk5BTUUsICJPYmplY3RXaXRoU2Vjb25kYXJ5VHlwZSIpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIFRFU1RfRE9DVU1FTlRfVFlQRV9JRCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVEVTVF9ET0NVTUVOVF9TVFJJTkdfUFJPUF9JRCwgcHJpbWFyeVByb3BWYWwpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUywgVEVTVF9TRUNPTkRBUllfVFlQRV9JRCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoU0VDT05EQVJZX1NUUklOR19QUk9QLCBzdHJQcm9wVmFsKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoU0VDT05EQVJZX0lOVEVHRVJfUFJPUCwgaW50UHJvcFZhbCkpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgbnVsbCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQpOwotCi0gICAgICAgIFByb3BlcnRpZXMgcmVzID0gZk9ialN2Yy5nZXRQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHJldHVybmVkUHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybmVkUHJvcHMpOwotICAgICAgICBTdHJpbmcgcmV0dXJuZWRWYWx1ZVN0ciA9IChTdHJpbmcpIHJldHVybmVkUHJvcHMuZ2V0KFNFQ09OREFSWV9TVFJJTkdfUFJPUCkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBCaWdJbnRlZ2VyIHJldHVybmVkVmFsdWVJbnQgPSAoQmlnSW50ZWdlcikgcmV0dXJuZWRQcm9wcy5nZXQoU0VDT05EQVJZX0lOVEVHRVJfUFJPUCkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RyUHJvcFZhbCwgcmV0dXJuZWRWYWx1ZVN0cik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnRQcm9wVmFsLCByZXR1cm5lZFZhbHVlSW50KTsKLSAgICAgICAgU3RyaW5nIHJldHVybmVkUHJpbWFyeVByb3BWYWwgPSAoU3RyaW5nKSByZXR1cm5lZFByb3BzLmdldChURVNUX0RPQ1VNRU5UX1NUUklOR19QUk9QX0lEKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcmltYXJ5UHJvcFZhbCwgcmV0dXJuZWRQcmltYXJ5UHJvcFZhbCk7Ci0KLSAgICAgICAgLy8gdGVzdCB1cGRhdGluZyBwcm9wZXJ0aWVzCi0gICAgICAgIGZpbmFsIFN0cmluZyBzdHJQcm9wVmFsMiA9ICJTZWNvbmRhcnkgdXBkYXRlZCI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmltYXJ5UHJvcFZhbDIgPSAiU2FtcGxlIERvYyBTdHJpbmcgUHJvcGVydHkgdXBkYXRlZCI7Ci0gICAgICAgIHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFNFQ09OREFSWV9TVFJJTkdfUFJPUCwgc3RyUHJvcFZhbDIpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQsIHByaW1hcnlQcm9wVmFsMikpOwotICAgICAgICBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICBmT2JqU3ZjLnVwZGF0ZVByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgbmV3IEhvbGRlcjxTdHJpbmc+KGlkKSwgbmV3IEhvbGRlcjxTdHJpbmc+KCksIHByb3BzLCBudWxsKTsKLQotICAgICAgICByZXMgPSBmT2JqU3ZjLmdldFByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgaWQsICIqIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIHJldHVybmVkUHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybmVkUHJvcHMpOwotICAgICAgICByZXR1cm5lZFZhbHVlU3RyID0gKFN0cmluZykgcmV0dXJuZWRQcm9wcy5nZXQoU0VDT05EQVJZX1NUUklOR19QUk9QKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIHJldHVybmVkVmFsdWVJbnQgPSAoQmlnSW50ZWdlcikgcmV0dXJuZWRQcm9wcy5nZXQoU0VDT05EQVJZX0lOVEVHRVJfUFJPUCkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RyUHJvcFZhbDIsIHJldHVybmVkVmFsdWVTdHIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW50UHJvcFZhbCwgcmV0dXJuZWRWYWx1ZUludCk7Ci0gICAgICAgIHJldHVybmVkUHJpbWFyeVByb3BWYWwgPSAoU3RyaW5nKSByZXR1cm5lZFByb3BzLmdldChURVNUX0RPQ1VNRU5UX1NUUklOR19QUk9QX0lEKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcmltYXJ5UHJvcFZhbDIsIHJldHVybmVkUHJpbWFyeVByb3BWYWwpOwotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gZmluaXNoZWQgdGVzdFNlY29uZGFyeVR5cGVzKCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlUeXBlUHJvcGVydGllc05vdFNldCgpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RTZWNvbmRhcnlUeXBlUHJvcGVydGllc05vdFNldCgpIC4uLiIpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBwcmltYXJ5UHJvcFZhbCA9ICJTYW1wbGUgRG9jIFN0cmluZyBQcm9wZXJ0eSI7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLk5BTUUsICJPYmplY3RXaXRoU2Vjb25kYXJ5VHlwZSIpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIFRFU1RfRE9DVU1FTlRfVFlQRV9JRCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVEVTVF9ET0NVTUVOVF9TVFJJTkdfUFJPUF9JRCwgcHJpbWFyeVByb3BWYWwpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUywgVEVTVF9TRUNPTkRBUllfVFlQRV9JRCkpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgbnVsbCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQpOwotCi0gICAgICAgIFByb3BlcnRpZXMgcmVzID0gZk9ialN2Yy5nZXRQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHJldHVybmVkUHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybmVkUHJvcHMpOwotICAgICAgICBib29sZWFuIGhhc1Byb3AgPSByZXR1cm5lZFByb3BzLmNvbnRhaW5zS2V5KFNFQ09OREFSWV9TVFJJTkdfUFJPUCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGFzUHJvcCk7Ci0gICAgICAgIGhhc1Byb3AgPSByZXR1cm5lZFByb3BzLmNvbnRhaW5zS2V5KFNFQ09OREFSWV9JTlRFR0VSX1BST1ApOwotICAgICAgICBhc3NlcnRUcnVlKGhhc1Byb3ApOwotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcmV0dXJuZWRWYWx1ZSA9IHJldHVybmVkUHJvcHMuZ2V0KFNFQ09OREFSWV9TVFJJTkdfUFJPUCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0dXJuZWRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuZWRWYWx1ZS5nZXRWYWx1ZXMoKS5pc0VtcHR5KCkpOwotICAgICAgICByZXR1cm5lZFZhbHVlID0gcmV0dXJuZWRQcm9wcy5nZXQoU0VDT05EQVJZX0lOVEVHRVJfUFJPUCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0dXJuZWRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuZWRWYWx1ZS5nZXRWYWx1ZXMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gZmluaXNoZWQgdGVzdFNlY29uZGFyeVR5cGVQcm9wZXJ0aWVzTm90U2V0KCkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0aWVzV2l0aFR5cGVDcmVhdGlvbigpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0clByb3BWYWwgPSAiU2Vjb25kYXJ5IjsKLSAgICAgICAgZmluYWwgQmlnSW50ZWdlciBpbnRQcm9wVmFsID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmltYXJ5UHJvcFZhbCA9ICJTYW1wbGUgRG9jIFN0cmluZyBQcm9wZXJ0eSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcmltYXJ5UHJvcFZhbDIgPSAiU2FtcGxlIERvYyBTdHJpbmcgUHJvcGVydHkgdXBkYXRlZCI7Ci0KLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RVcGRhdGVQcm9wZXJ0aWVzV2l0aFR5cGVDcmVhdGlvbigpIC4uLiIpOwotCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCAiU2ltcGxlRG9jdW1lbnQiKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBURVNUX0RPQ1VNRU5UX1RZUEVfSUQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQsIHByaW1hcnlQcm9wVmFsKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmUm9vdEZvbGRlcklkLCBudWxsLCBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0KLSAgICAgICAgcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVEVTVF9ET0NVTUVOVF9TVFJJTkdfUFJPUF9JRCwgcHJpbWFyeVByb3BWYWwyKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsIFRFU1RfU0VDT05EQVJZX1RZUEVfSUQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFNFQ09OREFSWV9TVFJJTkdfUFJPUCwgc3RyUHJvcFZhbCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFNFQ09OREFSWV9JTlRFR0VSX1BST1AsIGludFByb3BWYWwpKTsKLSAgICAgICAgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLSAgICAgICAgZk9ialN2Yy51cGRhdGVQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIG5ldyBIb2xkZXI8U3RyaW5nPihpZCksIG5ldyBIb2xkZXI8U3RyaW5nPigpLCBwcm9wcywgbnVsbCk7Ci0KLSAgICAgICAgUHJvcGVydGllcyByZXMgPSBmT2JqU3ZjLmdldFByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgaWQsICIqIiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcmV0dXJuZWRQcm9wcyA9IHJlcy5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0dXJuZWRQcm9wcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXR1cm5lZFByb3BzLmdldChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKS5nZXRWYWx1ZXMoKS5zaXplKCkpOwotICAgICAgICBTdHJpbmcgc2VjSWRzID0gKFN0cmluZykgcmV0dXJuZWRQcm9wcy5nZXQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUykuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9TRUNPTkRBUllfVFlQRV9JRCwgc2VjSWRzKTsKLSAgICAgICAgU3RyaW5nIHJldHVybmVkVmFsdWVTdHIgPSAoU3RyaW5nKSByZXR1cm5lZFByb3BzLmdldChTRUNPTkRBUllfU1RSSU5HX1BST1ApLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgQmlnSW50ZWdlciByZXR1cm5lZFZhbHVlSW50ID0gKEJpZ0ludGVnZXIpIHJldHVybmVkUHJvcHMuZ2V0KFNFQ09OREFSWV9JTlRFR0VSX1BST1ApLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN0clByb3BWYWwsIHJldHVybmVkVmFsdWVTdHIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW50UHJvcFZhbCwgcmV0dXJuZWRWYWx1ZUludCk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5lZFByaW1hcnlQcm9wVmFsID0gKFN0cmluZykgcmV0dXJuZWRQcm9wcy5nZXQoVEVTVF9ET0NVTUVOVF9TVFJJTkdfUFJPUF9JRCkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWFyeVByb3BWYWwyLCByZXR1cm5lZFByaW1hcnlQcm9wVmFsKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIGZpbmlzaGVkIHRlc3RVcGRhdGVQcm9wZXJ0aWVzV2l0aFR5cGVDcmVhdGlvbigpIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlU2Vjb25kYXJ5VHlwZSgpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByaW1hcnlQcm9wVmFsID0gIlNhbXBsZSBEb2MgU3RyaW5nIFByb3BlcnR5IjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByaW1hcnlQcm9wVmFsMiA9ICJTYW1wbGUgRG9jIFN0cmluZyBQcm9wZXJ0eSB1cGRhdGVkIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0clByb3BWYWwgPSAiU2Vjb25kYXJ5IjsKLSAgICAgICAgZmluYWwgQmlnSW50ZWdlciBpbnRQcm9wVmFsID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0KLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3REZWxldGVTZWNvbmRhcnlUeXBlKCkgLi4uIik7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZG9jdW1lbnQgd2l0aCBhIHNlY29uZGFyeSB0eXBlCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCAiT2JqZWN0V2l0aFNlY29uZGFyeVR5cGUiKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBURVNUX0RPQ1VNRU5UX1RZUEVfSUQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQsIHByaW1hcnlQcm9wVmFsKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsIFRFU1RfU0VDT05EQVJZX1RZUEVfSUQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFNFQ09OREFSWV9TVFJJTkdfUFJPUCwgc3RyUHJvcFZhbCkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFNFQ09OREFSWV9JTlRFR0VSX1BST1AsIGludFByb3BWYWwpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IGZPYmpTdmMuY3JlYXRlRG9jdW1lbnQoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIGZSb290Rm9sZGVySWQsIG51bGwsIFZlcnNpb25pbmdTdGF0ZS5OT05FLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkKTsKLQotICAgICAgICAvLyBkZWxldGUgdGhlIHNlY29uZGFyeSB0eXBlCi0gICAgICAgIHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFRFU1RfRE9DVU1FTlRfU1RSSU5HX1BST1BfSUQsIHByaW1hcnlQcm9wVmFsMikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTLCAoU3RyaW5nKSBudWxsKSk7IC8vIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5Ci0gICAgICAgIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgIGZPYmpTdmMudXBkYXRlUHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBuZXcgSG9sZGVyPFN0cmluZz4oaWQpLCBuZXcgSG9sZGVyPFN0cmluZz4oKSwgcHJvcHMsIG51bGwpOwotCi0gICAgICAgIC8vIHRlc3QgdGhhdCBwcm9wZXJ0aWVzIGFyZSBnb25lCi0gICAgICAgIFByb3BlcnRpZXMgcmVzID0gZk9ialN2Yy5nZXRQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHJldHVybmVkUHJvcHMgPSByZXMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybmVkUHJvcHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmV0dXJuZWRQcm9wcy5nZXQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUykuZ2V0VmFsdWVzKCkuc2l6ZSgpKTsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHBkID0gcmV0dXJuZWRQcm9wcy5nZXQoU0VDT05EQVJZX1NUUklOR19QUk9QKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwZCk7IC8vIHByb3BlcnR5IG11c3Qgbm90IGV4aXN0IGFueSBsb25nZXIKLSAgICAgICAgcGQgPSByZXR1cm5lZFByb3BzLmdldChTRUNPTkRBUllfSU5URUdFUl9QUk9QKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwZCk7IC8vIHByb3BlcnR5IG11c3Qgbm90IGV4aXN0IGFueSBsb25nZXIKLSAgICAgICAgU3RyaW5nIHJldHVybmVkUHJpbWFyeVByb3BWYWwgPSAoU3RyaW5nKSByZXR1cm5lZFByb3BzLmdldChURVNUX0RPQ1VNRU5UX1NUUklOR19QUk9QX0lEKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcmltYXJ5UHJvcFZhbDIsIHJldHVybmVkUHJpbWFyeVByb3BWYWwpOyAvLyBvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVkCi0gICAgICAgIC8vIHRlc3QgdGhhdCBzeXN0ZW0gcHJvcGVydGllcyBhcmUgdGhlcmUKLSAgICAgICAgcGQgPSByZXR1cm5lZFByb3BzLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZCk7Ci0gICAgICAgIHBkID0gcmV0dXJuZWRQcm9wcy5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZCk7Ci0gICAgICAgIHBkID0gcmV0dXJuZWRQcm9wcy5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIGZpbmlzaGVkIHRlc3REZWxldGVTZWNvbmRhcnlUeXBlKCkiKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB0ZXN0IGNvbnN0cmFpbnRzIG9uIHNlY29uZGFyeSB0eXBlcwotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVVwZGF0ZWRQcm9wZXJ0aWVzKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQotICAgICAgICBPYmplY3REYXRhIHJlcyA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzKTsKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wcyA9IHJlcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwZDIgOiBwcm9wcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgbG9nLmluZm8oIiAgcmV0dXJuIHByb3BlcnR5IGlkOiAiICsgcGQyLmdldElkKCkgKyAiLCB2YWx1ZTogIiArIHBkMi5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQ7Ci0gICAgICAgIHBkID0gcHJvcHMuZ2V0KFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUsIHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIHBkID0gcHJvcHMuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQ1VTVE9NX0RPQ1VNRU5UX1RZUEVfSUQsIHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIHBkID0gcHJvcHMuZ2V0KFRFU1RfRE9DVU1FTlRfTVlfU1RSSU5HX1BST1BfSUQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTkVXX1NUUklOR19QUk9QX1ZBTCwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgcGQgPSBwcm9wcy5nZXQoVEVTVF9ET0NVTUVOVF9NWV9JTlRfUFJPUF9JRCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhORVdfSU5UX1BST1BfVkFMLCBwZC5nZXRGaXJzdFZhbHVlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlRG9jdW1lbnRGcm9tU3RyZWFtKFN0cmluZyBuYW1lLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyB0eXBlSWQsIElucHV0U3RyZWFtIGlzLAotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVEb2N1bWVudFByb3BlcnRpZXMobmFtZSwgdHlwZUlkKTsKLQotICAgICAgICBDb250ZW50U3RyZWFtRGF0YUltcGwgY29udGVudCA9IG5ldyBDb250ZW50U3RyZWFtRGF0YUltcGwoMCk7Ci0gICAgICAgIGNvbnRlbnQuc2V0RmlsZU5hbWUobmFtZSk7Ci0gICAgICAgIGNvbnRlbnQuc2V0TWltZVR5cGUoY29udGVudFR5cGUpOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICBJT1V0aWxzLmNvcHkoaXMsIGJhLCA2NCAqIDEwMjQpOwotCi0gICAgICAgIGNvbnRlbnQuc2V0Q29udGVudChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmEudG9CeXRlQXJyYXkoKSkpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IGZPYmpTdmMuY3JlYXRlRG9jdW1lbnQoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIGZvbGRlcklkLCBjb250ZW50LCBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkVGh1bWJuYWlsU3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSkgewotCi0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NTUzNl07Ci0gICAgICAgIGludCBub0J5dGVzUmVhZCA9IDA7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoKG5vQnl0ZXNSZWFkID0gc3RyZWFtLnJlYWQoYnVmZmVyKSkgPj0gMCkgewotICAgICAgICAgICAgICAgIGNvdW50ICs9IG5vQnl0ZXNSZWFkOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiUmVhZGluZyByZW5kaXRpb24gc3RyZWFtIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudCA+IDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5QWxsb3dhYmxlQWN0aW9uc0RvY3VtZW50KFNldDxBY3Rpb24+IGFjdGlvbnMsIGJvb2xlYW4gaXNWZXJzaW9uZWQsIGJvb2xlYW4gaGFzQ29udGVudCkgewotICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9ERUxFVEVfT0JKRUNUKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX1VQREFURV9QUk9QRVJUSUVTKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9QUk9QRVJUSUVTKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfT0JKRUNUX1JFTEFUSU9OU0hJUFMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX09CSkVDVF9QQVJFTlRTKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9GT0xERVJfUEFSRU5UKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfRk9MREVSX1RSRUUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9ERVNDRU5EQU5UUykpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9NT1ZFX09CSkVDVCkpOwotICAgICAgICBpZiAoaGFzQ29udGVudCkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fREVMRVRFX0NPTlRFTlRfU1RSRUFNKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfQ09OVEVOVF9TVFJFQU0pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9SRU5ESVRJT05TKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fREVMRVRFX0NPTlRFTlRfU1RSRUFNKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX0NPTlRFTlRfU1RSRUFNKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX1JFTkRJVElPTlMpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9BRERfT0JKRUNUX1RPX0ZPTERFUikpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSKSk7Ci0KLSAgICAgICAgaWYgKGlzVmVyc2lvbmVkKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9DQU5DRUxfQ0hFQ0tfT1VUKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9DSEVDS19JTikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fQ0hFQ0tfT1VUKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfQUxMX1ZFUlNJT05TKSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9DQU5DRUxfQ0hFQ0tfT1VUKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fQ0hFQ0tfSU4pKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9DSEVDS19PVVQpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfQUxMX1ZFUlNJT05TKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fU0VUX0NPTlRFTlRfU1RSRUFNKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0FQUExZX1BPTElDWSkpOwotICAgICAgICBhc3NlcnRUcnVlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9HRVRfQVBQTElFRF9QT0xJQ0lFUykpOwotICAgICAgICBhc3NlcnRGYWxzZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fUkVNT1ZFX1BPTElDWSkpOwotICAgICAgICBhc3NlcnRGYWxzZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX0NISUxEUkVOKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9DUkVBVEVfRE9DVU1FTlQpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0NSRUFURV9GT0xERVIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0NSRUFURV9SRUxBVElPTlNISVApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0RFTEVURV9UUkVFKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9BQ0wpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fQVBQTFlfQUNMKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmV0cmlldmVEb2N1bWVudChTdHJpbmcgaWQpIHsKLSAgICAgICAgT2JqZWN0RGF0YSByZXMgPSBnZXREb2N1bWVudE9iamVjdERhdGEoaWQpOwotICAgICAgICBTdHJpbmcgcmV0dXJuZWRJZCA9IHJlcy5nZXRJZCgpOwotICAgICAgICB0ZXN0UmV0dXJuZWRQcm9wZXJ0aWVzKHJldHVybmVkSWQsIERPQ1VNRU5UX0lELCBET0NVTUVOVF9UWVBFX0lELCByZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIHJldHVybiByZXR1cm5lZElkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtb3ZlT2JqZWN0VGVzdChib29sZWFuIGlzRm9sZGVyKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUZpbHRlciA9IFByb3BlcnR5SWRzLk9CSkVDVF9JRCArICIsIiArIFByb3BlcnR5SWRzLk5BTUU7Ci0gICAgICAgIFN0cmluZyByb290Rm9sZGVySWQgPSBjcmVhdGVGb2xkZXIoKTsKLSAgICAgICAgT2JqZWN0R2VuZXJhdG9yIGdlbiA9IG5ldyBPYmplY3RHZW5lcmF0b3IoZkZhY3RvcnksIGZOYXZTdmMsIGZPYmpTdmMsIGZSZXBTdmMsIGZSZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICAgICAgT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kLkxPUkVNX0lQU1VNX1RFWFQpOwotICAgICAgICAvLyBTZXQgdGhlIHR5cGUgaWQgZm9yIGFsbCBjcmVhdGVkIGRvY3VtZW50czoKLSAgICAgICAgZ2VuLnNldERvY3VtZW50VHlwZUlkKERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgLy8gU2V0IHRoZSB0eXBlIGlkIGZvciBhbGwgY3JlYXRlZCBmb2xkZXJzOgotICAgICAgICBnZW4uc2V0TnVtYmVyT2ZEb2N1bWVudHNUb0NyZWF0ZVBlckZvbGRlcigxKTsgLy8gY3JlYXRlIG9uZSBkb2N1bWVudCBpbgotICAgICAgICAvLyBlYWNoIGZvbGRlcgotICAgICAgICBnZW4uY3JlYXRlRm9sZGVySGllcmFjaHkoMywgMiwgcm9vdEZvbGRlcklkKTsKLSAgICAgICAgZ2VuLnNldEZvbGRlclR5cGVJZChEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRm9sZGVyVHlwZSgpLmdldElkKCkpOwotICAgICAgICBnZW4uZHVtcEZvbGRlcihmUm9vdEZvbGRlcklkLCBwcm9wZXJ0eUZpbHRlcik7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPigpOwotICAgICAgICBTdHJpbmcgc291cmNlSWRUb01vdmUgPSBnZW4uZ2V0Rm9sZGVySWQocm9vdEZvbGRlcklkLCAyLCAxKTsKLSAgICAgICAgaWYgKCFpc0ZvbGRlcikgewotICAgICAgICAgICAgc291cmNlSWRUb01vdmUgPSBnZW4uZ2V0RG9jdW1lbnRJZChzb3VyY2VJZFRvTW92ZSwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaG9sZGVyLnNldFZhbHVlKHNvdXJjZUlkVG9Nb3ZlKTsgLy8gIi9Gb2xkZXJfMS9NeSBGb2xkZXIgMC9NeSBGb2xkZXIgMSIpOwotICAgICAgICBTdHJpbmcgc291cmNlRm9sZGVySWQgPSBnZXRTb3VyY2VGb2xkZXIoc291cmNlSWRUb01vdmUpOwotICAgICAgICBsb2cuaW5mbygiSWQgYmVmb3JlIG1vdmVPYmplY3Q6ICIgKyBob2xkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGZPYmpTdmMubW92ZU9iamVjdChmUmVwb3NpdG9yeUlkLCBob2xkZXIsIHJvb3RGb2xkZXJJZCwgc291cmNlRm9sZGVySWQsIG51bGwpOwotICAgICAgICBsb2cuaW5mbygiSWQgYWZ0ZXIgbW92ZU9iamVjdDogIiArIGhvbGRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgZ2VuLmR1bXBGb2xkZXIoZlJvb3RGb2xkZXJJZCwgcHJvcGVydHlGaWx0ZXIpOwotCi0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcmVzdWx0ID0gZk5hdlN2Yy5nZXRPYmplY3RQYXJlbnRzKGZSZXBvc2l0b3J5SWQsIGhvbGRlci5nZXRWYWx1ZSgpLCBudWxsLCBCb29sZWFuLkZBTFNFLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIEJvb2xlYW4uRkFMU0UsIG51bGwpOwotICAgICAgICAvLyBjaGVjayB0aGF0IG5ldyBwYXJlbnQgaXMgc2V0IGNvcnJlY3RseQotICAgICAgICBTdHJpbmcgbmV3UGFyZW50SWQgPSByZXN1bHQuZ2V0KDApLmdldE9iamVjdCgpLmdldElkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb290Rm9sZGVySWQsIG5ld1BhcmVudElkKTsKLQotICAgICAgICBpZiAoaXNGb2xkZXIpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJ0ZXN0aW5nIG1vdmVGb2xkZXIgdG8gYSBzdWJmb2xkZXIiKTsKLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCBjaCA9IGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZlJlcG9zaXRvcnlJZCwgaG9sZGVyLmdldFZhbHVlKCksIHByb3BlcnR5RmlsdGVyLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgU3RyaW5nIHN1YkZvbGRlcklkID0gY2guZ2V0T2JqZWN0cygpLmdldCgwKS5nZXRPYmplY3QoKS5nZXRJZCgpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZPYmpTdmMubW92ZU9iamVjdChmUmVwb3NpdG9yeUlkLCBob2xkZXIsIHN1YkZvbGRlcklkLCBzb3VyY2VGb2xkZXJJZCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgibW92ZU9iamVjdCB0byBhIGZvbGRlciB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc291cmNlIG11c3QgZmFpbC4iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVGb2xkZXIoRk9MREVSX0lELCBmUm9vdEZvbGRlcklkLCBGT0xERVJfVFlQRV9JRCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIGZvbGRlcklkLCBib29sZWFuIHdpdGhDb250ZW50KSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudChET0NVTUVOVF9JRCwgZm9sZGVySWQsIHdpdGhDb250ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIGZvbGRlcklkLCBib29sZWFuIHdpdGhDb250ZW50KSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudChuYW1lLCBmb2xkZXJJZCwgRE9DVU1FTlRfVFlQRV9JRCwgd2l0aENvbnRlbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUl0ZW0oU3RyaW5nIG5hbWUsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGl0ZW1Qcm9wVmFsKSB7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBwcm9wZXJ0aWVzOgotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoSVRFTV9TVFJJTkdfUFJPUCwgaXRlbVByb3BWYWwpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIFRFU1RfSVRFTV9UWVBFX0lEKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICByZXR1cm4gZk9ialN2Yy5jcmVhdGVJdGVtKGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGNyZWF0ZURvY3VtZW50UHJvcGVydGllc0ZvckRvY3VtZW50RnJvbVNvdXJjZShTdHJpbmcgbmFtZSkgewotICAgICAgICAvLyBXZSBvbmx5IHByb3ZpZGUgYSBuYW1lIGJ1dCBub3QgYSB0eXBlIGlkLCBhcyBzcGVjIHNheXMgdG8gY29weQotICAgICAgICAvLyBtaXNzaW5nIGF0dHJpYnV0ZXMKLSAgICAgICAgLy8gZnJvbSB0aGUgZXhpc3Rpbmcgb25lCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RSZXR1cm5lZFByb3BlcnRpZXMoU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcHMpIHsKLSAgICAgICAgc3VwZXIudGVzdFJldHVybmVkUHJvcGVydGllcyhvYmplY3RJZCwgcHJvcHMpOwotCi0gICAgICAgIGlmIChudWxsICE9IG9iamVjdE5hbWUpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IHByb3BzLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9iamVjdE5hbWUsIHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgIT0gdHlwZUlkKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcGQgPSBwcm9wcy5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGVJZCwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50V2l0aEN1c3RvbVR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBmb2xkZXJJZCwgYm9vbGVhbiB3aXRoQ29udGVudCkgewotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlID0gVmVyc2lvbmluZ1N0YXRlLk5PTkU7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcyA9IG51bGw7Ci0gICAgICAgIEFjbCBhZGRBQ0VzID0gbnVsbDsKLSAgICAgICAgQWNsIHJlbW92ZUFDRXMgPSBudWxsOwotICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24gPSBudWxsOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcHJvcGVydGllczoKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgVEVTVF9DVVNUT01fRE9DVU1FTlRfVFlQRV9JRCkpOwotICAgICAgICAvLyBHZW5lcmF0ZSBzb21lIHByb3BlcnR5IHZhbHVlcyBmb3IgY3VzdG9tIGF0dHJpYnV0ZXMKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFRFU1RfRE9DVU1FTlRfTVlfU1RSSU5HX1BST1BfSUQsICJNeSBwcmV0dHkgc3RyaW5nIikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFRFU1RfRE9DVU1FTlRfTVlfSU5UX1BST1BfSUQsIEJpZ0ludGVnZXIudmFsdWVPZig0NzExKSkpOwotCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBpZiAod2l0aENvbnRlbnQpIHsKLSAgICAgICAgICAgIGNvbnRlbnRTdHJlYW0gPSBjcmVhdGVDb250ZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgdGhlIGRvY3VtZW50Ci0gICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsIGFkZEFDRXMsCi0gICAgICAgICAgICAgICAgcmVtb3ZlQUNFcywgZXh0ZW5zaW9uKTsKLSAgICAgICAgaWYgKG51bGwgPT0gaWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjcmVhdGVEb2N1bWVudCBmYWlsZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50SW5oZXJpdGVkUHJvcGVydGllcyhTdHJpbmcgZm9sZGVySWQsIGJvb2xlYW4gd2l0aENvbnRlbnQpIHsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsKLSAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSA9IFZlcnNpb25pbmdTdGF0ZS5OT05FOwotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMgPSBudWxsOwotICAgICAgICBBY2wgYWRkQUNFcyA9IG51bGw7Ci0gICAgICAgIEFjbCByZW1vdmVBQ0VzID0gbnVsbDsKLSAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uID0gbnVsbDsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIHByb3BlcnRpZXM6Ci0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsIE1ZX0NVU1RPTV9OQU1FKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBURVNUX0lOSEVSSVRFRF9DVVNUT01fRE9DVU1FTlRfVFlQRV9JRCkpOwotICAgICAgICAvLyBHZW5lcmF0ZSBzb21lIHByb3BlcnR5IHZhbHVlcyBmb3IgY3VzdG9tIGF0dHJpYnV0ZXMKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFRFU1RfRE9DVU1FTlRfTVlfU1RSSU5HX1BST1BfSUQsICJNeSBwcmV0dHkgc3RyaW5nIikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFRFU1RfRE9DVU1FTlRfTVlfSU5UX1BST1BfSUQsIEJpZ0ludGVnZXIudmFsdWVPZig0NzExKSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVEVTVF9ET0NVTUVOVF9NWV9TVUJfU1RSSU5HX1BST1BfSUQsICJhbm90aGVyIGNvb2wgc3RyaW5nIikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKFRFU1RfRE9DVU1FTlRfTVlfU1VCX0lOVF9QUk9QX0lELCBCaWdJbnRlZ2VyLnZhbHVlT2YoNDcxMikpKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWYgKHdpdGhDb250ZW50KSB7Ci0gICAgICAgICAgICBjb250ZW50U3RyZWFtID0gY3JlYXRlQ29udGVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBkb2N1bWVudAotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICBpZCA9IGZPYmpTdmMuY3JlYXRlRG9jdW1lbnQoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLCBhZGRBQ0VzLAotICAgICAgICAgICAgICAgIHJlbW92ZUFDRXMsIGV4dGVuc2lvbik7Ci0gICAgICAgIGlmIChudWxsID09IGlkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY3JlYXRlRG9jdW1lbnQgZmFpbGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTb3VyY2VGb2xkZXIoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgcGFyZW50IGZvdW5kIGluIHRoZSByZXN1bHQgbGlzdCBvZiBhbGwgcGFyZW50cwotICAgICAgICBMaXN0PE9iamVjdFBhcmVudERhdGE+IHBhcmVudHMgPSBmTmF2U3ZjLmdldE9iamVjdFBhcmVudHMoZlJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsICIqIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiBwYXJlbnRzLmdldCgwKS5nZXRPYmplY3QoKS5nZXRJZCgpOwotICAgIH0KLQotICAgIC8vIEhlbHBlciBjbGFzcyB0byBjcmVhdGUgc29tZSB0eXBlIGZvciB0ZXN0aW5nIHRoZSBPYmplY3RTZXJ2aWNlCi0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdFRlc3RUeXBlU3lzdGVtQ3JlYXRvciBpbXBsZW1lbnRzIFR5cGVDcmVhdG9yIHsKLQotICAgICAgICBzdGF0aWMgZmluYWwgVHlwZURlZmluaXRpb25GYWN0b3J5IHR5cGVGYWN0b3J5ID0gRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0VHlwZURlZmluaXRpb25GYWN0b3J5KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNyZWF0ZSByb290IHR5cGVzIGFuZCBhIHNhbXBsZSB0eXBlIGZvciBmb2xkZXIgYW5kIGRvY3VtZW50Ci0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuIHR5cGVzTWFwIG1hcCBmaWxsZWQgd2l0aCBjcmVhdGVkIHR5cGVzCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb24+IGNyZWF0ZVR5cGVzTGlzdCgpIHsKLSAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHR5cGVzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzRG9jdW1lbnRUeXBlOwotICAgICAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLCBURVNUX0RPQ1VNRU5UX1RZUEVfSUQpOwotICAgICAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuc2V0RGlzcGxheU5hbWUoIk15IERvY3VtZW50IFR5cGUiKTsKLSAgICAgICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgVEVTVF9ET0NVTUVOVF9UWVBFX0lEKTsKLQotICAgICAgICAgICAgICAgIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBjbWlzRm9sZGVyVHlwZTsKLSAgICAgICAgICAgICAgICBjbWlzRm9sZGVyVHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZUZvbGRlclR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0ZvbGRlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBjbWlzRm9sZGVyVHlwZS5zZXRJZChURVNUX0ZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgICAgICAgICBjbWlzRm9sZGVyVHlwZS5zZXREaXNwbGF5TmFtZSgiTXkgRm9sZGVyIFR5cGUiKTsKLSAgICAgICAgICAgICAgICBjbWlzRm9sZGVyVHlwZS5zZXREZXNjcmlwdGlvbigiSW5NZW1vcnkgdGVzdCB0eXBlIGRlZmluaXRpb24gIiArIFRFU1RfRk9MREVSX1RZUEVfSUQpOwotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNpbXBsZSBzdHJpbmcgcHJvcGVydHkgdHlwZSBhbmQKLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggdGhlIHByb3BlcnR5IGRlZmluaXRpb24gdG8gdGhlIHR5cGUgZGVmaW5pdGlvbiBmb3IKLSAgICAgICAgICAgICAgICAvLyBkb2N1bWVudCBhbmQgZm9sZGVyIHR5cGUKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BlcnR5RGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4oKTsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3AgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPQ1VNRU5UX1NUUklOR19QUk9QX0lELCAiU2FtcGxlIERvYyBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wLmdldElkKCksIHByb3ApOwotICAgICAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3ApOwotCi0gICAgICAgICAgICAgICAgcHJvcGVydHlEZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PigpOwotICAgICAgICAgICAgICAgIHByb3AgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oVEVTVF9GT0xERVJfU1RSSU5HX1BST1BfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIEZvbGRlciBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25zLnB1dChwcm9wLmdldElkKCksIHByb3ApOwotICAgICAgICAgICAgICAgIGNtaXNGb2xkZXJUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wKTsKLQotICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gY3VzdG9tRG9jVHlwZSA9IGNyZWF0ZUN1c3RvbVR5cGVXaXRoU3RyaW5nSW50UHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBub0NvbnRlbnRUeXBlID0gY3JlYXRlQ3VzdG9tVHlwZU5vQ29udGVudCgpOwotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIG11c3RIYXZlQ29udGVudFR5cGUgPSBjcmVhdGVDdXN0b21UeXBlTXVzdEhhdmVDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gcmVsVHlwZSA9IGNyZWF0ZVJlbGF0aW9uc2hpcFR5cGUoKTsKLSAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiByZWxUeXBlUmVzdHJpY3RlZCA9IGNyZWF0ZVJlbGF0aW9uc2hpcFR5cGVSZXN0cmljdGVkKCk7Ci0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdmVyVHlwZSA9IGNyZWF0ZVZlcnNpb25hYmxlVHlwZSgpOwotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHBvbFR5cGUgPSBjcmVhdGVQb2xpY3lUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdHlwZSB0byB0eXBlcyBjb2xsZWN0aW9uCi0gICAgICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzRG9jdW1lbnRUeXBlKTsKLSAgICAgICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNGb2xkZXJUeXBlKTsKLSAgICAgICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGN1c3RvbURvY1R5cGUpOwotICAgICAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQobm9Db250ZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChtdXN0SGF2ZUNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNyZWF0ZUN1c3RvbUluaGVyaXRlZFR5cGUoY3VzdG9tRG9jVHlwZSkpOwotICAgICAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY3JlYXRlRG9jdW1lbnRUeXBlV2l0aERlZmF1bHQoKSk7Ci0gICAgICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjcmVhdGVGb2xkZXJUeXBlV2l0aERlZmF1bHQoKSk7Ci0gICAgICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjcmVhdGVJdGVtVHlwZSgpKTsKLSAgICAgICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNyZWF0ZVNlY29uZGFyeVR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChyZWxUeXBlKTsKLSAgICAgICAgICAgICAgICB0eXBlc0xpc3QuYWRkKHJlbFR5cGVSZXN0cmljdGVkKTsKLSAgICAgICAgICAgICAgICB0eXBlc0xpc3QuYWRkKHZlclR5cGUpOwotICAgICAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQocG9sVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVzTGlzdDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHR5cGVzLiIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjcmVhdGVDdXN0b21UeXBlV2l0aFN0cmluZ0ludFByb3BlcnR5KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzRG9jdW1lbnRUeXBlOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZSA9IChNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLCBURVNUX0NVU1RPTV9ET0NVTUVOVF9UWVBFX0lEKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuc2V0RGlzcGxheU5hbWUoIk15IEN1c3RvbSBEb2N1bWVudCBUeXBlIik7Ci0gICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgVEVTVF9DVVNUT01fRE9DVU1FTlRfVFlQRV9JRCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVEVTVF9ET0NVTUVOVF9NWV9TVFJJTkdfUFJPUF9JRCwgIk15IFN0cmluZyBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcHJvcC5zZXRJc1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgIHByb3Auc2V0TWF4TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZigyMCkpOyAvLyBtYXggbGVuIHRvIDIwCi0gICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wKTsKLQotICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcDIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICBURVNUX0RPQ1VNRU5UX01ZX0lOVF9QUk9QX0lELCAiTXkgSW50ZWdlciBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcHJvcDIuc2V0SXNSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgIHByb3AyLnNldE1pblZhbHVlKEJpZ0ludGVnZXIudmFsdWVPZigtMTAwMDApKTsKLSAgICAgICAgICAgIHByb3AyLnNldE1heFZhbHVlKEJpZ0ludGVnZXIudmFsdWVPZigxMDAwMCkpOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDIpOwotICAgICAgICAgICAgcmV0dXJuIGNtaXNEb2N1bWVudFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVDdXN0b21Jbmhlcml0ZWRUeXBlKERvY3VtZW50VHlwZURlZmluaXRpb24gYmFzZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNEb2N1bWVudFR5cGU7Ci0gICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihiYXNlVHlwZSwgVEVTVF9JTkhFUklURURfQ1VTVE9NX0RPQ1VNRU5UX1RZUEVfSUQpOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZS5zZXREaXNwbGF5TmFtZSgiTXkgQ3VzdG9tIERvY3VtZW50IFR5cGUiKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuc2V0RGVzY3JpcHRpb24oIkluTWVtb3J5IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBURVNUX0lOSEVSSVRFRF9DVVNUT01fRE9DVU1FTlRfVFlQRV9JRCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVEVTVF9ET0NVTUVOVF9NWV9TVUJfU1RSSU5HX1BST1BfSUQsICJTdWJ0eXBlIFN0cmluZyBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcHJvcC5zZXRJc1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3ApOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wMiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlckRlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRFU1RfRE9DVU1FTlRfTVlfU1VCX0lOVF9QUk9QX0lELCAiU3VidHlwZSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcHJvcDIuc2V0SXNSZXF1aXJlZCh0cnVlKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AyKTsKLSAgICAgICAgICAgIHJldHVybiBjbWlzRG9jdW1lbnRUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHlwZURlZmluaXRpb24gY3JlYXRlRG9jdW1lbnRUeXBlV2l0aERlZmF1bHQoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzRG9jdW1lbnRUeXBlOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICBURVNUX0RPQ19UWVBFX1dJVEhfREVGQVVMVFNfSUQpOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZS5zZXREaXNwbGF5TmFtZSgiRG9jdW1lbnQgVHlwZSBXaXRoIGRlZmF1bHQgdmFsdWVzIik7Ci0gICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgVEVTVF9ET0NfVFlQRV9XSVRIX0RFRkFVTFRTX0lEKTsKLQotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdNdWx0aURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRFU1RfRE9DVU1FTlRfTVlfTVVMVElfU1RSSU5HX1BST1BfSUQsICJUZXN0IE11bHRpIFN0cmluZyBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcHJvcC5zZXRJc1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkZWZWYWxTID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKCJBcGFjaGUiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkKCJDTUlTIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHByb3Auc2V0RGVmYXVsdFZhbHVlKGRlZlZhbFMpOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsIHByb3AyID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVJbnRlZ2VyRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVEVTVF9ET0NVTUVOVF9NWV9JTlRfUFJPUF9JRCwgIlRlc3QgSW50ZWdlciBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcHJvcDIuc2V0SXNSZXF1aXJlZChmYWxzZSk7Ci0gICAgICAgICAgICBMaXN0PEJpZ0ludGVnZXI+IGRlZlZhbCA9IG5ldyBBcnJheUxpc3Q8QmlnSW50ZWdlcj4oKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGQoQmlnSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBwcm9wMi5zZXREZWZhdWx0VmFsdWUoZGVmVmFsKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AyKTsKLQotICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcDMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICBURVNUX0RPQ1VNRU5UX01ZX0lOVF9QUk9QX0lEX01BTkRBVE9SWV9ERUZBVUxULCAiVGVzdCBJbnRlZ2VyIFByb3BlcnR5IE1hbmRhdG9yeSBkZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBwcm9wMy5zZXRJc1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgTGlzdDxCaWdJbnRlZ2VyPiBkZWZWYWwyID0gbmV3IEFycmF5TGlzdDxCaWdJbnRlZ2VyPigpIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHByb3AzLnNldERlZmF1bHRWYWx1ZShkZWZWYWwyKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AzKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNtaXNEb2N1bWVudFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVDdXN0b21UeXBlTm9Db250ZW50KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY21pc0RvY3VtZW50VHlwZTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUgPSAoTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwgVEVTVF9DVVNUT01fTk9fQ09OVEVOVF9UWVBFX0lEKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuc2V0RGlzcGxheU5hbWUoIk5vIENvbnRlbnQgRG9jdW1lbnQgVHlwZSIpOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZS5zZXREZXNjcmlwdGlvbigiSW5NZW1vcnkgdGVzdCB0eXBlIGRlZmluaXRpb24gIiArIFRFU1RfQ1VTVE9NX05PX0NPTlRFTlRfVFlQRV9JRCk7Ci0gICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlLnNldENvbnRlbnRTdHJlYW1BbGxvd2VkKENvbnRlbnRTdHJlYW1BbGxvd2VkLk5PVEFMTE9XRUQpOwotICAgICAgICAgICAgcmV0dXJuIGNtaXNEb2N1bWVudFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVDdXN0b21UeXBlTXVzdEhhdmVDb250ZW50KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzRG9jdW1lbnRUeXBlOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZSA9IChNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLCBURVNUX0NVU1RPTV9NVVNUX0NPTlRFTlRfVFlQRV9JRCk7Ci0gICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlLnNldERpc3BsYXlOYW1lKCJNdXN0IEhhdmUgQ29udGVudCBEb2N1bWVudCBUeXBlIik7Ci0gICAgICAgICAgICBjbWlzRG9jdW1lbnRUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgVEVTVF9DVVNUT01fTVVTVF9DT05URU5UX1RZUEVfSUQpOwotICAgICAgICAgICAgY21pc0RvY3VtZW50VHlwZS5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChDb250ZW50U3RyZWFtQWxsb3dlZC5OT1RBTExPV0VEKTsKLSAgICAgICAgICAgIGNtaXNEb2N1bWVudFR5cGUuc2V0Q29udGVudFN0cmVhbUFsbG93ZWQoQ29udGVudFN0cmVhbUFsbG93ZWQuUkVRVUlSRUQpOwotICAgICAgICAgICAgcmV0dXJuIGNtaXNEb2N1bWVudFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVGb2xkZXJUeXBlV2l0aERlZmF1bHQoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBjbWlzRm9sZGVyVHlwZTsKLSAgICAgICAgICAgIGNtaXNGb2xkZXJUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlRm9sZGVyVHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDbWlzRm9sZGVyVHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc0ZvbGRlclR5cGUuc2V0SWQoVEVTVF9GT0xERVJfVFlQRV9XSVRIX0RFRkFVTFRTX0lEKTsKLSAgICAgICAgICAgIGNtaXNGb2xkZXJUeXBlLnNldERpc3BsYXlOYW1lKCJGb2xkZXIgVHlwZSBXaXRoIGRlZmF1bHQgdmFsdWVzIik7Ci0gICAgICAgICAgICBjbWlzRm9sZGVyVHlwZS5zZXREZXNjcmlwdGlvbigiSW5NZW1vcnkgdGVzdCB0eXBlIGRlZmluaXRpb24gIiArIFRFU1RfRk9MREVSX1RZUEVfV0lUSF9ERUZBVUxUU19JRCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nTXVsdGlEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICBURVNUX0ZPTERFUl9NWV9NVUxUSV9TVFJJTkdfUFJPUF9JRCwgIlRlc3QgTXVsdGkgU3RyaW5nIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBwcm9wLnNldElzUmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRlZlZhbFMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGQoIkFwYWNoZSIpOwotICAgICAgICAgICAgICAgICAgICBhZGQoIkNNSVMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgcHJvcC5zZXREZWZhdWx0VmFsdWUoZGVmVmFsUyk7Ci0gICAgICAgICAgICBjbWlzRm9sZGVyVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsIHByb3AyID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVJbnRlZ2VyRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgVEVTVF9GT0xERVJfTVlfSU5UX1BST1BfSUQsICJUZXN0IEludGVnZXIgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIHByb3AyLnNldElzUmVxdWlyZWQoZmFsc2UpOwotICAgICAgICAgICAgTGlzdDxCaWdJbnRlZ2VyPiBkZWZWYWwgPSBuZXcgQXJyYXlMaXN0PEJpZ0ludGVnZXI+KCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKEJpZ0ludGVnZXIudmFsdWVPZigxMDApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgcHJvcDIuc2V0RGVmYXVsdFZhbHVlKGRlZlZhbCk7Ci0gICAgICAgICAgICBjbWlzRm9sZGVyVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDIpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wMyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlckRlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFRFU1RfRk9MREVSX01ZX0lOVF9QUk9QX0lEX01BTkRBVE9SWV9ERUZBVUxULCAiVGVzdCBJbnRlZ2VyIFByb3BlcnR5IE1hbmRhdG9yeSBkZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBwcm9wMy5zZXRJc1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgTGlzdDxCaWdJbnRlZ2VyPiBkZWZWYWwyID0gbmV3IEFycmF5TGlzdDxCaWdJbnRlZ2VyPigpIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHByb3AzLnNldERlZmF1bHRWYWx1ZShkZWZWYWwyKTsKLSAgICAgICAgICAgIGNtaXNGb2xkZXJUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjbWlzRm9sZGVyVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVHlwZURlZmluaXRpb24gY3JlYXRlUmVsYXRpb25zaGlwVHlwZSgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIE11dGFibGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiBjbWlzUmVsVHlwZTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDbWlzUmVsYXRpb25zaGlwVHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc1JlbFR5cGUuc2V0SWQoVEVTVF9SRUxBVElPTl9UWVBFX0lEKTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlLnNldERpc3BsYXlOYW1lKCJNeVJlbGF0aW9uc2hpcFR5cGUiKTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgVEVTVF9SRUxBVElPTl9UWVBFX0lEKTsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLnNldERlZmF1bHRUeXBlQ2FwYWJpbGl0aWVzKGNtaXNSZWxUeXBlKTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlLnNldElzRmlsZWFibGUoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBzaW5nbGUgU3RyaW5nIHByb3BlcnR5IGRlZmluaXRpb24KLQotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wMSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihSRUxfU1RSSU5HX1BST1AsCi0gICAgICAgICAgICAgICAgICAgICJDcm9zc1JlZmVyZW5jZVR5cGUiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjbWlzUmVsVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVHlwZURlZmluaXRpb24gY3JlYXRlUmVsYXRpb25zaGlwVHlwZVJlc3RyaWN0ZWQoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBNdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gY21pc1JlbFR5cGU7Ci0gICAgICAgICAgICBjbWlzUmVsVHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLCBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0Q21pc1JlbGF0aW9uc2hpcFR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlLnNldElkKFRFU1RfUkVTVFJJQ1RFRF9SRUxBVElPTl9UWVBFX0lEKTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlLnNldERpc3BsYXlOYW1lKCJSZXN0cmljdGVkUmVsYXRpb25zaGlwVHlwZSIpOwotICAgICAgICAgICAgY21pc1JlbFR5cGUuc2V0RGVzY3JpcHRpb24oIkluTWVtb3J5IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBURVNUX1JFU1RSSUNURURfUkVMQVRJT05fVFlQRV9JRCk7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5zZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhjbWlzUmVsVHlwZSk7Ci0gICAgICAgICAgICBjbWlzUmVsVHlwZS5zZXRJc0ZpbGVhYmxlKGZhbHNlKTsKLQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFsbG93ZWRUeXBlSWRzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChURVNUX0NVU1RPTV9ET0NVTUVOVF9UWVBFX0lEKTsKLSAgICAgICAgICAgIGNtaXNSZWxUeXBlLnNldEFsbG93ZWRTb3VyY2VUeXBlcyhhbGxvd2VkVHlwZUlkcyk7Ci0gICAgICAgICAgICBjbWlzUmVsVHlwZS5zZXRBbGxvd2VkVGFyZ2V0VHlwZXMoYWxsb3dlZFR5cGVJZHMpOwotICAgICAgICAgICAgcmV0dXJuIGNtaXNSZWxUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHlwZURlZmluaXRpb24gY3JlYXRlSXRlbVR5cGUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBDTUlTIDEuMSBjcmVhdGUgYW4gaXRlbSBpdGVtIHR5cGUKLSAgICAgICAgICAgIE11dGFibGVJdGVtVHlwZURlZmluaXRpb24gY21pc0l0ZW1UeXBlOwotICAgICAgICAgICAgY21pc0l0ZW1UeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlSXRlbVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLCBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0Q21pc0l0ZW1UeXBlKCkuZ2V0SWQoKSk7IC8vID8/PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNJdGVtVHlwZSgpKTsKLSAgICAgICAgICAgIGNtaXNJdGVtVHlwZS5zZXRJZChURVNUX0lURU1fVFlQRV9JRCk7Ci0gICAgICAgICAgICBjbWlzSXRlbVR5cGUuc2V0RGlzcGxheU5hbWUoIk15SXRlbVR5cGUiKTsKLSAgICAgICAgICAgIGNtaXNJdGVtVHlwZS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gIiArIFRFU1RfSVRFTV9UWVBFX0lEKTsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLnNldERlZmF1bHRUeXBlQ2FwYWJpbGl0aWVzKGNtaXNJdGVtVHlwZSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNpbmdsZSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wMSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihJVEVNX1NUUklOR19QUk9QLAotICAgICAgICAgICAgICAgICAgICAiSXRlbSBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNJdGVtVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDEpOwotICAgICAgICAgICAgLy8gYWRkIHR5cGUgdG8gdHlwZXMgY29sbGVjdGlvbgotICAgICAgICAgICAgcmV0dXJuIGNtaXNJdGVtVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFR5cGVEZWZpbml0aW9uIGNyZWF0ZVNlY29uZGFyeVR5cGUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBDTUlTIDEuMSBjcmVhdGUgYW4gaXRlbSBpdGVtIHR5cGUKLSAgICAgICAgICAgIE11dGFibGVTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbiBjbWlzU2Vjb25kYXJ5VHlwZTsKLSAgICAgICAgICAgIGNtaXNTZWNvbmRhcnlUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNTZWNvbmRhcnlUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZS5zZXRJZChURVNUX1NFQ09OREFSWV9UWVBFX0lEKTsKLSAgICAgICAgICAgIGNtaXNTZWNvbmRhcnlUeXBlLnNldERpc3BsYXlOYW1lKCJNeVNlY29uZGFyeVR5cGUiKTsKLSAgICAgICAgICAgIGNtaXNTZWNvbmRhcnlUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgVEVTVF9TRUNPTkRBUllfVFlQRV9JRCk7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5zZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhjbWlzU2Vjb25kYXJ5VHlwZSk7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZS5zZXRJc0ZpbGVhYmxlKGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlIFN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uCi0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcDEgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oU0VDT05EQVJZX1NUUklOR19QUk9QLAotICAgICAgICAgICAgICAgICAgICAiU2Vjb25kYXJ5IFN0cmluZyBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AxKTsKLQotICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcDIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICBTRUNPTkRBUllfSU5URUdFUl9QUk9QLCAiU2Vjb25kYXJ5IEludGVnZXIgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIHByb3AyLnNldElzUmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDIpOwotCi0gICAgICAgICAgICByZXR1cm4gY21pc1NlY29uZGFyeVR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVWZXJzaW9uYWJsZVR5cGUoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBjb21wbGV4IHR5cGUgd2l0aCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiB2ZXJUeXBlOwotICAgICAgICAgICAgdmVyVHlwZSA9IChNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLCBURVNUX1ZFUlNJT05fRE9DVU1FTlRfVFlQRV9JRCk7Ci0gICAgICAgICAgICB2ZXJUeXBlLnNldERpc3BsYXlOYW1lKCJWZXJzaW9uZWRUeXBlIik7Ci0gICAgICAgICAgICB2ZXJUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgVEVTVF9WRVJTSU9OX0RPQ1VNRU5UX1RZUEVfSUQpOwotCi0gICAgICAgICAgICB2ZXJUeXBlLnNldElzVmVyc2lvbmFibGUodHJ1ZSk7IC8vIG1ha2UgaXQgYSB2ZXJzaW9uYWJsZSB0eXBlOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wMSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihURVNUX1ZFUl9QUk9QRVJUWV9JRCwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQpOwotICAgICAgICAgICAgdmVyVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDEpOwotICAgICAgICAgICAgcmV0dXJuIHZlclR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVQb2xpY3lUeXBlKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgTXV0YWJsZVBvbGljeVR5cGVEZWZpbml0aW9uIHBvbFR5cGU7Ci0gICAgICAgICAgICBwb2xUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlUG9saWN5VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDbWlzUG9saWN5VHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgcG9sVHlwZS5zZXRJZChURVNUX1BPTElDWV9UWVBFX0lEKTsKLSAgICAgICAgICAgIHBvbFR5cGUuc2V0RGlzcGxheU5hbWUoIkF1ZGl0IFBvbGljeSIpOwotICAgICAgICAgICAgcG9sVHlwZS5zZXREZXNjcmlwdGlvbigiSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uICIgKyBURVNUX1BPTElDWV9UWVBFX0lEKTsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLnNldERlZmF1bHRUeXBlQ2FwYWJpbGl0aWVzKHBvbFR5cGUpOwotICAgICAgICAgICAgcG9sVHlwZS5zZXRJc0ZpbGVhYmxlKGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgU3RyaW5nIHByb3BlcnR5IGRlZmluaXRpb24KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcDEgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oVEVTVF9QT0xJQ1lfUFJPUEVSVFlfSUQsCi0gICAgICAgICAgICAgICAgICAgICJBdWRpdCBLaW5kIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBwb2xUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMSk7Ci0gICAgICAgICAgICByZXR1cm4gcG9sVHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvUG9saWN5VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvUG9saWN5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmYwMDIxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L1BvbGljeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUG9saWN5SWRMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuT2JqZWN0U2VydmljZVRlc3QuT2JqZWN0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgUG9saWN5VGVzdCBleHRlbmRzIEFic3RyYWN0U2VydmljZVRlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NVU1RPTV9WQUxVRSA9ICJTaW1wbGVBdWRpdFBvbGljeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUE9MSUNZX1RFWFQgPSAiVGVzdCBQb2xpY3kgVW5pdCBUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QT0xJQ1lfTkFNRSA9ICJUZXN0UG9saWN5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QT0xJQ1lfMl9OQU1FID0gIlRlc3RQb2xpY3kyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlfRE9DXzEgPSAiRG9jdW1lbnRfMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUl9ET0NfTkFNRSA9ICJWZXJzaW9uZWREb2N1bWVudCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwb2xJZDsKLQotICAgIEBPdmVycmlkZQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgc3VwZXIuc2V0VHlwZUNyZWF0b3JDbGFzcyhPYmplY3RUZXN0VHlwZVN5c3RlbUNyZWF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgY3JlYXRlUG9saWN5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVHZXRQb2xpY3koKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocG9sSWQpOwotICAgICAgICBPYmplY3REYXRhIG9kID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgcG9sSWQsIG51bGwsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvZC5nZXRCYXNlVHlwZUlkKCksIEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kpOwotICAgICAgICBhc3NlcnRFcXVhbHMocG9sSWQsIG9kLmdldElkKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9kLmdldFBvbGljeUlkcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUE9MSUNZX05BTUUsIG9kLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhURVNUX1BPTElDWV9URVhULCBvZC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5QT0xJQ1lfVEVYVCkuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfQ1VTVE9NX1ZBTFVFLAotICAgICAgICAgICAgICAgIG9kLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUE9MSUNZX1BST1BFUlRZX0lEKS5nZXRGaXJzdFZhbHVlKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgYXBwbHlHZXRQb2xpY3lUZXN0KCkgewotICAgICAgICBTdHJpbmcgZG9jSWQxID0gY3JlYXRlRG9jdW1lbnRXaXRoUG9saWN5KHBvbElkKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2NJZDEpOwotICAgICAgICBPYmplY3REYXRhIG9kID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgZG9jSWQxLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkb2NJZDEsIG9kLmdldElkKCkpOwotICAgICAgICBQb2xpY3lJZExpc3QgcG9sSWRzID0gb2QuZ2V0UG9saWN5SWRzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocG9sSWRzLmdldFBvbGljeUlkcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvbElkcy5nZXRQb2xpY3lJZHMoKS5zaXplKCkpOwotICAgICAgICBTdHJpbmcgcG9sSWRSZXMgPSBwb2xJZHMuZ2V0UG9saWN5SWRzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMocG9sSWQsIHBvbElkUmVzKTsKLQotICAgICAgICBTdHJpbmcgcGF0aCA9ICIvIiArIE1ZX0RPQ18xOwotICAgICAgICBvZCA9IGZPYmpTdmMuZ2V0T2JqZWN0QnlQYXRoKGZSZXBvc2l0b3J5SWQsIHBhdGgsIG51bGwsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgcG9sSWRzID0gb2QuZ2V0UG9saWN5SWRzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocG9sSWRzLmdldFBvbGljeUlkcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvbElkcy5nZXRQb2xpY3lJZHMoKS5zaXplKCkpOwotICAgICAgICBwb2xJZFJlcyA9IHBvbElkcy5nZXRQb2xpY3lJZHMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwb2xJZCwgcG9sSWRSZXMpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgYXBwbHlHZXRQb2xpY3lUZXN0VmVyc2lvbmVkKCkgewotICAgICAgICBTdHJpbmcgZG9jSWQgPSBjcmVhdGVDaGVja2VkT3V0RG9jdW1lbnQoKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGRvY0lkKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljaWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwb2xJZCk7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBob2xkZXIsIHRydWUsIG51bGwsIG51bGwsICJWZXJzaW9uIHdpdGggcG9saWNpZXMiLCBwb2xpY2llcywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIE9iamVjdERhdGEgb2QgPSBmT2JqU3ZjLmdldE9iamVjdChmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIHRydWUsCi0gICAgICAgICAgICAgICAgZmFsc2UsIG51bGwpOwotICAgICAgICBQb2xpY3lJZExpc3QgcG9sSWRzID0gb2QuZ2V0UG9saWN5SWRzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocG9sSWRzLmdldFBvbGljeUlkcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvbElkcy5nZXRQb2xpY3lJZHMoKS5zaXplKCkpOwotICAgICAgICBTdHJpbmcgcG9sSWRSZXMgPSBwb2xJZHMuZ2V0UG9saWN5SWRzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMocG9sSWQsIHBvbElkUmVzKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkID0gKFN0cmluZykgb2QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2ZXJzaW9uU2VyaWVzSWQpOwotICAgICAgICBvZCA9IGZWZXJTdmMuZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCB2ZXJzaW9uU2VyaWVzSWQsIGZhbHNlLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIHBvbElkcyA9IG9kLmdldFBvbGljeUlkcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBvbElkcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocG9sSWRzLmdldFBvbGljeUlkcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvbElkcy5nZXRQb2xpY3lJZHMoKS5zaXplKCkpOwotICAgICAgICBwb2xJZFJlcyA9IHBvbElkcy5nZXRQb2xpY3lJZHMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwb2xJZCwgcG9sSWRSZXMpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBvbGljeVNlcnZpY2VHZXRBcHBsaWVkUG9saWNpZXMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocG9sSWQpOwotICAgICAgICBTdHJpbmcgZG9jSWQxID0gY3JlYXRlRG9jdW1lbnRXaXRoUG9saWN5KHBvbElkKTsKLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiBwb2xzID0gZlBvbFN2Yy5nZXRBcHBsaWVkUG9saWNpZXMoZlJlcG9zaXRvcnlJZCwgZG9jSWQxLCBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvbHMuc2l6ZSgpKTsKLSAgICAgICAgT2JqZWN0RGF0YSBvZCA9IHBvbHMuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMocG9sSWQsIG9kLmdldElkKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9kLmdldFBvbGljeUlkcygpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb2xpY3lTZXJ2aWNlQXBwbHlQb2xpY2llcygpIHsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHBvbElkKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRG9jdW1lbnRXaXRob3V0UG9saWN5KCJEb2N1bWVudF8yIiwgcG9sSWQpOwotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHBvbHMgPSBmUG9sU3ZjLmdldEFwcGxpZWRQb2xpY2llcyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwb2xzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gYXBwbHkgYSBwb2xpY3kKLSAgICAgICAgZlBvbFN2Yy5hcHBseVBvbGljeShmUmVwb3NpdG9yeUlkLCBwb2xJZCwgZG9jSWQsIG51bGwpOwotICAgICAgICBwb2xzID0gZlBvbFN2Yy5nZXRBcHBsaWVkUG9saWNpZXMoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcG9scy5zaXplKCkpOwotICAgICAgICBPYmplY3REYXRhIG9kID0gcG9scy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwb2xJZCwgb2QuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob2QuZ2V0UG9saWN5SWRzKCkpOwotCi0gICAgICAgIFN0cmluZyBwb2xJZDIgPSBjcmVhdGVQb2xpY3kyKCk7Ci0gICAgICAgIGZQb2xTdmMuYXBwbHlQb2xpY3koZlJlcG9zaXRvcnlJZCwgcG9sSWQyLCBkb2NJZCwgbnVsbCk7Ci0gICAgICAgIHBvbHMgPSBmUG9sU3ZjLmdldEFwcGxpZWRQb2xpY2llcyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb2xzLnNpemUoKSk7Ci0gICAgICAgIG9kID0gcG9scy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwb2xJZCwgb2QuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob2QuZ2V0UG9saWN5SWRzKCkpOwotICAgICAgICBvZCA9IHBvbHMuZ2V0KDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocG9sSWQyLCBvZC5nZXRJZCgpKTsKLQotICAgICAgICAvLyBhc3NpZ24gYW4gdW5rbm93biBpZCBhcyBwb2xpY3kKLSAgICAgICAgZG9jSWQgPSBjcmVhdGVEb2N1bWVudFdpdGhvdXRQb2xpY3koIkRvY3VtZW50XzMiLCBwb2xJZCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmUG9sU3ZjLmFwcGx5UG9saWN5KGZSZXBvc2l0b3J5SWQsICJVbmtub3duSWQiLCBkb2NJZCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJhcHBseVBvbGljeSB3aXRoIHVua25vd24gaWQgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmFpbCgiYXBwbHlQb2xpY3kgd2l0aCB1bmtub3duIGlkIHNob3VsZCB0aHJvdyBhIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24sIGJ1dCB3YXMgYSAiICsgZXguZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhcHBseSBwb2xpY3kgd2l0aCBhIGRvYyBpZAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGRvY0lkMiA9IGNyZWF0ZURvY3VtZW50V2l0aG91dFBvbGljeShwb2xJZCk7Ci0gICAgICAgICAgICBmUG9sU3ZjLmFwcGx5UG9saWN5KGZSZXBvc2l0b3J5SWQsIGRvY0lkMiwgZG9jSWQsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiYXBwbHlQb2xpY3kgd2l0aCBkb2N1bWVudCBpZCBhcyBwb2xpY3kgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoImFwcGx5UG9saWN5IHdpdGggdW5rbm93biBpZCBzaG91bGQgdGhyb3cgYSBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLCBidXQgd2FzIGEgIiArIGV4LmdldENsYXNzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXBwbHkgYSBwb2xpY3kgdG8gYSBwb2xpY3kKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZQb2xTdmMuYXBwbHlQb2xpY3koZlJlcG9zaXRvcnlJZCwgcG9sSWQyLCBwb2xJZCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJhcHBseVBvbGljeSB0byBhIHBvbGljeSBpZCBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmFpbCgiYXBwbHlQb2xpY3kgd2l0aCB1bmtub3duIGlkIHNob3VsZCB0aHJvdyBhIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24sIGJ1dCB3YXMgYSAiICsgZXguZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBvbGljeVNlcnZpY2VSZW1vdmVQb2xpY2llcygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwb2xJZCk7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGNyZWF0ZURvY3VtZW50V2l0aFBvbGljeShwb2xJZCk7Ci0gICAgICAgIFN0cmluZyBwb2xJZDIgPSBjcmVhdGVQb2xpY3kyKCk7Ci0gICAgICAgIFN0cmluZyBkb2NJZDIgPSBjcmVhdGVEb2N1bWVudFdpdGhvdXRQb2xpY3koIkRvY3VtZW50XzMiLCBwb2xJZCk7Ci0KLSAgICAgICAgZlBvbFN2Yy5hcHBseVBvbGljeShmUmVwb3NpdG9yeUlkLCBwb2xJZDIsIGRvY0lkLCBudWxsKTsKLQotICAgICAgICBmUG9sU3ZjLnJlbW92ZVBvbGljeShmUmVwb3NpdG9yeUlkLCBwb2xJZCwgZG9jSWQsIG51bGwpOwotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHBvbHMgPSBmUG9sU3ZjLmdldEFwcGxpZWRQb2xpY2llcyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwb2xzLnNpemUoKSk7Ci0gICAgICAgIE9iamVjdERhdGEgb2QgPSBwb2xzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBvbElkMiwgb2QuZ2V0SWQoKSk7Ci0KLSAgICAgICAgZlBvbFN2Yy5yZW1vdmVQb2xpY3koZlJlcG9zaXRvcnlJZCwgcG9sSWQyLCBkb2NJZCwgbnVsbCk7Ci0gICAgICAgIHBvbHMgPSBmUG9sU3ZjLmdldEFwcGxpZWRQb2xpY2llcyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwb2xzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gdHJ5IGFnYWluIHNob3VsZCBmYWlsCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmUG9sU3ZjLnJlbW92ZVBvbGljeShmUmVwb3NpdG9yeUlkLCBwb2xJZDIsIGRvY0lkLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIlJlbW92aW5nIGEgbm9uLWV4aXN0aW5nIHBvbGljeSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlJlbW92aW5nIGEgbm9uLWV4aXN0aW5nIHBvbGljeSBzaG91bGQgcmFpc2UgYSBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24sIGJ1dCB3YXMgYSAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0cnkgcmVtb3ZpbmcgYSBub24gZXhpc3RpbmcgaWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZQb2xTdmMucmVtb3ZlUG9saWN5KGZSZXBvc2l0b3J5SWQsIHBvbElkMiwgZG9jSWQsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiUmVtb3ZpbmcgYSBub24tZXhpc3RpbmcgcG9saWN5IHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlJlbW92aW5nIGEgbm9uLWV4aXN0aW5nIHBvbGljeSBzaG91bGQgcmFpc2UgYSBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLCBidXQgd2FzIGEgIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdHJ5IHJlbW92aW5nIGEgbm9uIHBvbGljeSBpZAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlBvbFN2Yy5yZW1vdmVQb2xpY3koZlJlcG9zaXRvcnlJZCwgZG9jSWQyLCBkb2NJZCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJSZW1vdmluZyBhIG5vbi1leGlzdGluZyBwb2xpY3kgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiUmVtb3ZpbmcgYSBub24tcG9saWN5IHNob3VsZCByYWlzZSBhIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24sIGJ1dCB3YXMgYSAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQb2xpY3koKSB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsIFRFU1RfUE9MSUNZX05BTUUpKTsKLSAgICAgICAgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIC5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUE9MSUNZX1RZUEVfSUQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQsIFRFU1RfUE9MSUNZX1RFWFQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoT2JqZWN0U2VydmljZVRlc3QuVEVTVF9QT0xJQ1lfUFJPUEVSVFlfSUQsIFRFU1RfQ1VTVE9NX1ZBTFVFKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBwb2xJZCA9IGZPYmpTdmMuY3JlYXRlUG9saWN5KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVQb2xpY3kyKCkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCBURVNUX1BPTElDWV8yX05BTUUpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kudmFsdWUoKSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5QT0xJQ1lfVEVYVCwgIlJlYWRBdWRpdExvZ2dpbmciKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICByZXR1cm4gZk9ialN2Yy5jcmVhdGVQb2xpY3koZlJlcG9zaXRvcnlJZCwgcHJvcHMsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50V2l0aFBvbGljeShTdHJpbmcgcG9saWN5SWQpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgTVlfRE9DXzEpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBvbGljeUlkKTsKLSAgICAgICAgU3RyaW5nIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgbnVsbCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRG9jdW1lbnRXaXRob3V0UG9saWN5KFN0cmluZyBwb2xpY3lJZCkgewotICAgICAgICByZXR1cm4gY3JlYXRlRG9jdW1lbnRXaXRob3V0UG9saWN5KE1ZX0RPQ18xLCBwb2xpY3lJZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRG9jdW1lbnRXaXRob3V0UG9saWN5KFN0cmluZyBuYW1lLCBTdHJpbmcgcG9saWN5SWQpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCkpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmUm9vdEZvbGRlcklkLCBudWxsLCBWZXJzaW9uaW5nU3RhdGUuTk9ORSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVZlcnNpb25lZERvY3VtZW50KCkgewotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBudWxsOwotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMgPSBudWxsOwotCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsIFZFUl9ET0NfTkFNRSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwKLSAgICAgICAgICAgICAgICBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1ZFUlNJT05fRE9DVU1FTlRfVFlQRV9JRCkpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWQgPSBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KGZSZXBvc2l0b3J5SWQsIHByb3BzLCBmUm9vdEZvbGRlcklkLCBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUuTUFKT1IsCi0gICAgICAgICAgICAgICAgcG9saWNpZXMsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVDaGVja2VkT3V0RG9jdW1lbnQoKSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZVZlcnNpb25lZERvY3VtZW50KCk7Ci0gICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkID0gbmV3IEhvbGRlcjxCb29sZWFuPigpOwotICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGVja2VkT3V0SWQgPSBuZXcgSG9sZGVyPFN0cmluZz4oaWQpOwotICAgICAgICBmVmVyU3ZjLmNoZWNrT3V0KGZSZXBvc2l0b3J5SWQsIGNoZWNrZWRPdXRJZCwgbnVsbCwgY29udGVudENvcGllZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlkLmVxdWFscyhjaGVja2VkT3V0SWQuZ2V0VmFsdWUoKSkpOwotICAgICAgICByZXR1cm4gY2hlY2tlZE91dElkLmdldFZhbHVlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9SZWxhdGlvbnNoaXBTZXJ2aWNlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvUmVsYXRpb25zaGlwU2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyZGEyYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9SZWxhdGlvbnNoaXBTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUmVsYXRpb25zaGlwRGlyZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuT2JqZWN0U2VydmljZVRlc3QuT2JqZWN0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZWxhdGlvbnNoaXBTZXJ2aWNlVGVzdCBleHRlbmRzIEFic3RyYWN0U2VydmljZVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9iamVjdFNlcnZpY2VUZXN0LmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlfRE9DXzEgPSAiU291cmNlRG9jdW1lbnRfMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZX0RPQ18yID0gIlNvdXJjZURvY3VtZW50XzIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNWV9ET0NfMyA9ICJTb3VyY2VEb2N1bWVudF8zIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlfRE9DXzQgPSAiU291cmNlRG9jdW1lbnRfNCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1ZX0RPQ19UQVJHRVQgPSAiVGFyZ2V0RG9jdW1lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfQ1VTVE9NX1BST1BfVkFMVUUgPSAiU2ltcGxlIENyb3NzIFJlZmVyZW5jZSI7Ci0KLSAgICBPYmplY3RDcmVhdG9yIGZDcmVhdG9yOwotICAgIFN0cmluZyBkb2NJZDE7Ci0gICAgU3RyaW5nIGRvY0lkMjsKLSAgICBTdHJpbmcgZG9jSWQzOwotICAgIFN0cmluZyBkb2NJZDQ7Ci0gICAgU3RyaW5nIHRhcmdldElkOwotCi0gICAgQE92ZXJyaWRlCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBzdXBlci5zZXRUeXBlQ3JlYXRvckNsYXNzKE9iamVjdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBmQ3JlYXRvciA9IG5ldyBPYmplY3RDcmVhdG9yKGZGYWN0b3J5LCBmT2JqU3ZjLCBmUmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGVzdCBkYXRhCi0gICAgICAgIGRvY0lkMSA9IGNyZWF0ZURvY3VtZW50KE1ZX0RPQ18xLCBmUm9vdEZvbGRlcklkLCBCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKSwgZmFsc2UpOwotICAgICAgICBkb2NJZDIgPSBjcmVhdGVEb2N1bWVudChNWV9ET0NfMiwgZlJvb3RGb2xkZXJJZCwgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCksIHRydWUpOwotICAgICAgICB0YXJnZXRJZCA9IGNyZWF0ZURvY3VtZW50KE1ZX0RPQ19UQVJHRVQsIGZSb290Rm9sZGVySWQsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlR2V0UmVsYXRpb25zaGlwKCkgewotCi0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0Q3JlYXRlUmVsYXRpb25zaGlwKCkgLi4uIik7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiByZWxQcm9wczEgPSBjcmVhdGVSZWxhdGlvbnNoaXBQcm9wZXJ0aWVzKFJFTF9DVVNUT01fUFJPUF9WQUxVRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZDEgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMSIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZG9jSWQxLAotICAgICAgICAgICAgICAgIHRhcmdldElkLCByZWxQcm9wczEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkMSk7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiByZWxQcm9wczIgPSBjcmVhdGVSZWxhdGlvbnNoaXBQcm9wZXJ0aWVzKFJFTF9DVVNUT01fUFJPUF9WQUxVRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZDIgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMiIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZG9jSWQyLAotICAgICAgICAgICAgICAgIHRhcmdldElkLCByZWxQcm9wczIpOwotICAgICAgICBpZiAoaWQyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJjcmVhdGVSZWxhdGlvbnNoaXAgc3VjY2VlZGVkIHdpdGggY3JlYXRlZCBpZDogIiArIGlkMik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZDIpOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiByZWxJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKGlkMSk7Ci0gICAgICAgICAgICAgICAgYWRkKGlkMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gR2V0IHRoZSByZWxhdGlvbnNoaXBzIGJhY2sKLSAgICAgICAgLy8gc291cmNlCi0gICAgICAgIE9iamVjdExpc3Qgb2JqZWN0TGlzdCA9IGZSZWxTdmMuZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhSRVBPU0lUT1JZX0lELCB0YXJnZXRJZCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlRBUkdFVCwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lELCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG9iamVjdExpc3QuZ2V0TnVtSXRlbXMoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gb2JqZWN0RGF0YUxpc3QgPSBvYmplY3RMaXN0LmdldE9iamVjdHMoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihyZWxJZHMpOwotICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0RGF0YSA6IG9iamVjdERhdGFMaXN0KSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZWxhdGlvbihvYmplY3REYXRhLCBpZHMsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgdGFyZ2V0SWQsCi0gICAgICAgICAgICAgICAgICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5UQVJHRVQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgLy8gdGFyZ2V0Ci0gICAgICAgIG9iamVjdExpc3QgPSBmUmVsU3ZjLmdldE9iamVjdFJlbGF0aW9uc2hpcHMoUkVQT1NJVE9SWV9JRCwgZG9jSWQxLCBmYWxzZSwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlNPVVJDRSwKLSAgICAgICAgICAgICAgICBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBvYmplY3RMaXN0LmdldE51bUl0ZW1zKCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICBPYmplY3REYXRhIG9iamVjdERhdGEgPSBvYmplY3RMaXN0LmdldE9iamVjdHMoKS5nZXQoMCk7Ci0gICAgICAgIGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGlkMSkpOwotICAgICAgICB2ZXJpZnlSZWxhdGlvbihvYmplY3REYXRhLCBpZHMsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZG9jSWQxLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBib3RoCi0gICAgICAgIGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihyZWxJZHMpOwotICAgICAgICBvYmplY3RMaXN0ID0gZlJlbFN2Yy5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKFJFUE9TSVRPUllfSUQsIHRhcmdldElkLCBmYWxzZSwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLkVJVEhFUiwKLSAgICAgICAgICAgICAgICBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgb2JqZWN0TGlzdC5nZXROdW1JdGVtcygpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgb2JqZWN0RGF0YUxpc3QgPSBvYmplY3RMaXN0LmdldE9iamVjdHMoKTsKLSAgICAgICAgaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHJlbElkcyk7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvZCA6IG9iamVjdERhdGFMaXN0KSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZWxhdGlvbihvZCwgaWRzLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIHRhcmdldElkLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uRUlUSEVSKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlkcy5pc0VtcHR5KCkpOwotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdENyZWF0ZVJlbGF0aW9uc2hpcCgpIGZpbmlzaGVkLiIpOwotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpb25Ub0ZvbGRlcigpIHsKLSAgICAgICAgLy8gdGVzdCBjcmVhdGUgd2l0aCBhIGZvbGRlciBhcyBzb3VyY2UKLSAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gY3JlYXRlRm9sZGVyKCJmb2xkZXIxIiwgZlJvb3RGb2xkZXJJZCwgQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpKTsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHJlbFByb3BzID0gY3JlYXRlUmVsYXRpb25zaGlwUHJvcGVydGllcyhSRUxfQ1VTVE9NX1BST1BfVkFMVUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMyIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZm9sZGVySWQsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWQsIHJlbFByb3BzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0KLSAgICAgICAgT2JqZWN0TGlzdCBvYmplY3RMaXN0ID0gZlJlbFN2Yy5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKFJFUE9TSVRPUllfSUQsIGZvbGRlcklkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBvYmplY3RMaXN0LmdldE51bUl0ZW1zKCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICBPYmplY3REYXRhIG9iamVjdERhdGEgPSBvYmplY3RMaXN0LmdldE9iamVjdHMoKS5nZXQoMCk7Ci0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGlkKSk7Ci0gICAgICAgIHZlcmlmeVJlbGF0aW9uKG9iamVjdERhdGEsIGlkcywgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lELCBmb2xkZXJJZCwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlNPVVJDRSk7Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmlzRW1wdHkoKSk7Ci0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVJbGxlZ2FsVHlwZXMoKSB7Ci0gICAgICAgIC8vIHRlc3QgY3JlYXRlIGEgcmVsYXRpb25zaGlwIHdpdGggYSBmb2xkZXIgdHlwZSwgc2hvdWxkIGZhaWw6Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMSIsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSwgZG9jSWQxLCBkb2NJZDIsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRpbmcgIGRvY3VtZW50IHdpdGggYSBmb2xkZXIgdHlwZSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgYSByZWxhdGlvbnNoaXAgd2l0aCBhIGZvbGRlciB0eXBlIGZhaWxlZCBhcyBleHBlY3RlZC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNyZWF0aW5nIGEgcmVsYXRpb25zaGlwIHdpdGggYSBmb2xkZXIgdHlwZSBzaG91bGQgZmFpbCB3aXRoIGEgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiwgYnV0IHdhczogIgotICAgICAgICAgICAgICAgICAgICArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBnZXRSZWxhdGlvbnNoaXBTdWJUeXBlcygpIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RDcmVhdGVSZWxhdGlvbnNoaXAoKSAuLi4iKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkMSA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiQ3Jvc3NSZWZlcmVuY2UxIiwgQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC52YWx1ZSgpLCBkb2NJZDEsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkMSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZDIgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMiIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZG9jSWQyLAotICAgICAgICAgICAgICAgIHRhcmdldElkLCBudWxsKTsKLSAgICAgICAgaWYgKGlkMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRlUmVsYXRpb25zaGlwIHN1Y2NlZWRlZCB3aXRoIGNyZWF0ZWQgaWQ6ICIgKyBpZDIpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQyKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gcmVsSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChpZDEpOwotICAgICAgICAgICAgICAgIGFkZChpZDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIEdldCB0aGUgcmVsYXRpb25zaGlwcyBiYWNrCi0gICAgICAgIE9iamVjdExpc3Qgb2JqZWN0TGlzdCA9IGZSZWxTdmMuZ2V0T2JqZWN0UmVsYXRpb25zaGlwcyhSRVBPU0lUT1JZX0lELCB0YXJnZXRJZCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlRBUkdFVCwgQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC52YWx1ZSgpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9iamVjdExpc3QuZ2V0TnVtSXRlbXMoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gb2JqZWN0RGF0YUxpc3QgPSBvYmplY3RMaXN0LmdldE9iamVjdHMoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGlkMSkpOwotICAgICAgICB2ZXJpZnlSZWxhdGlvbihvYmplY3REYXRhTGlzdC5nZXQoMCksIGlkcywgQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC52YWx1ZSgpLCB0YXJnZXRJZCwKLSAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uVEFSR0VUKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLQotICAgICAgICBvYmplY3RMaXN0ID0gZlJlbFN2Yy5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKFJFUE9TSVRPUllfSUQsIHRhcmdldElkLCB0cnVlLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uVEFSR0VULAotICAgICAgICAgICAgICAgIEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVAudmFsdWUoKSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBvYmplY3RMaXN0LmdldE51bUl0ZW1zKCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICBvYmplY3REYXRhTGlzdCA9IG9iamVjdExpc3QuZ2V0T2JqZWN0cygpOwotICAgICAgICBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ocmVsSWRzKTsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdERhdGEgOiBvYmplY3REYXRhTGlzdCkgewotICAgICAgICAgICAgdmVyaWZ5UmVsYXRpb24ob2JqZWN0RGF0YSwgaWRzLCBudWxsLCB0YXJnZXRJZCwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlRBUkdFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBUZXN0IHRoZSBzYW1lIHdpdGggcGFzc2luZyBudWxsIGZvciB0aGUgdHlwZSBpZAotICAgICAgICBvYmplY3RMaXN0ID0gZlJlbFN2Yy5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKFJFUE9TSVRPUllfSUQsIHRhcmdldElkLCB0cnVlLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uVEFSR0VULCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgb2JqZWN0TGlzdC5nZXROdW1JdGVtcygpLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgb2JqZWN0RGF0YUxpc3QgPSBvYmplY3RMaXN0LmdldE9iamVjdHMoKTsKLSAgICAgICAgaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHJlbElkcyk7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3REYXRhIDogb2JqZWN0RGF0YUxpc3QpIHsKLSAgICAgICAgICAgIHZlcmlmeVJlbGF0aW9uKG9iamVjdERhdGEsIGlkcywgbnVsbCwgdGFyZ2V0SWQsIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5UQVJHRVQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmlzRW1wdHkoKSk7Ci0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd2VkVHlwZXMoKSB7Ci0gICAgICAgIFN0cmluZyBkb2NTdWIxID0gY3JlYXRlRG9jdW1lbnQoIkN1c3RvbURvYzEiLCBmUm9vdEZvbGRlcklkLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX0NVU1RPTV9ET0NVTUVOVF9UWVBFX0lELAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgU3RyaW5nIGRvY1N1YjIgPSBjcmVhdGVEb2N1bWVudCgiQ3VzdG9tRG9jMiIsIGZSb290Rm9sZGVySWQsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfQ1VTVE9NX0RPQ1VNRU5UX1RZUEVfSUQsCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjcmVhdGVSZWxhdGlvbnNoaXAoZlJvb3RGb2xkZXJJZCwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRVNUUklDVEVEX1JFTEFUSU9OX1RZUEVfSUQsIGRvY0lkMSwgdGFyZ2V0SWQsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRpbmcgYSByZWxhdGlvbnNoaXAgd2l0aCBhIHR5cGUgY21pczpkb2N1bWVudCBhcyBzb3VyY2Ugc2hvdWxkIGZhaWwsIG5vdCBhbiBhbGxvd2VkU291cmNlVHlwZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyBkb2N1bWVudCB3aXRoIGEgZm9sZGVyIGFzIHNvdXJjZSBhbmQgdGFyZ2V0IGZhaWxlZCBhcyBleHBlY3RlZCBkdWUgdG8gYWxsZWRTb3VyY2VUeXBlIHJlc3RyaWN0aW9uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZVJlbGF0aW9uc2hpcChmUm9vdEZvbGRlcklkLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFU1RSSUNURURfUkVMQVRJT05fVFlQRV9JRCwgZG9jU3ViMSwgdGFyZ2V0SWQsCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRpbmcgYSByZWxhdGlvbnNoaXAgd2l0aCBhIHR5cGUgY21pczpkb2N1bWVudCBhcyB0YXJnZXQgc2hvdWxkIGZhaWwsIG5vdCBhbiBhbGxvd2VkU291cmNlVHlwZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyBkb2N1bWVudCB3aXRoIGEgZm9sZGVyIGFzIHNvdXJjZSBmYWlsZWQgYXMgZXhwZWN0ZWQgZHVlIHRvIGFsbGVkU291cmNlVHlwZSByZXN0cmljdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjcmVhdGVSZWxhdGlvbnNoaXAoZlJvb3RGb2xkZXJJZCwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRVNUUklDVEVEX1JFTEFUSU9OX1RZUEVfSUQsIGRvY0lkMSwgZG9jU3ViMSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGluZyBhIHJlbGF0aW9uc2hpcCB3aXRoIGEgdHlwZSBjbWlzOmRvY3VtZW50IGFzIHNvdXJjZSBzaG91bGQgZmFpbCwgbm90IGFuIGFsbG93ZWRTb3VyY2VUeXBlLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24pOwotICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nIGRvY3VtZW50IHdpdGggYSBmb2xkZXIgYXMgc291cmNlIGZhaWxlZCBhcyBleHBlY3RlZCBkdWUgdG8gYWxsZWRTb3VyY2VUeXBlIHJlc3RyaWN0aW9uLiIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBjcmVhdGVSZWxhdGlvbnNoaXAoZlJvb3RGb2xkZXJJZCwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRVNUUklDVEVEX1JFTEFUSU9OX1RZUEVfSUQsIGRvY1N1YjEsCi0gICAgICAgICAgICAgICAgICAgIGRvY1N1YjIsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGluZyBhIHJlbGF0aW9uc2hpcCB3aXRoIGFuIGFsbG93ZWQgdHlwZSBhcyBzb3VyY2UgYW5kIHRhcmdldCBzaG91bGQgc3VjY2VlZC4iKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0KCkgewotCi0gICAgICAgIGZpbmFsIFN0cmluZyBpZDEgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMSIsIEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVAudmFsdWUoKSwgZG9jSWQxLAotICAgICAgICAgICAgICAgIHRhcmdldElkLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZDEpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQyID0gY3JlYXRlUmVsYXRpb25zaGlwKCJDcm9zc1JlZmVyZW5jZTIiLCBCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQLnZhbHVlKCksIGRvY0lkMiwKLSAgICAgICAgICAgICAgICB0YXJnZXRJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQxKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlbElkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoaWQxKTsKLSAgICAgICAgICAgICAgICBhZGQoaWQyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBnZXQgZG9jdW1lbnQgb2JqZWN0LCBzb3VyY2UKLSAgICAgICAgT2JqZWN0RGF0YSBvYmplY3REYXRhID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgZG9jSWQxLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuU09VUkNFLAotICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gb2RSZWxhdGlvbnNoaXBzID0gb2JqZWN0RGF0YS5nZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9kUmVsYXRpb25zaGlwcy5zaXplKCkpOwotICAgICAgICBMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaWQxKSk7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3REYXRhUmVsIDogb2RSZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZWxhdGlvbihvYmplY3REYXRhUmVsLCBpZHMsIG51bGwsIGRvY0lkMSwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLlNPVVJDRSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBnZXQgZG9jdW1lbnQgb2JqZWN0LCB0YXJnZXQKLSAgICAgICAgb2JqZWN0RGF0YSA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIHRhcmdldElkLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuVEFSR0VULCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIG9kUmVsYXRpb25zaGlwcyA9IG9iamVjdERhdGEuZ2V0UmVsYXRpb25zaGlwcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBvZFJlbGF0aW9uc2hpcHMuc2l6ZSgpKTsKLSAgICAgICAgaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHJlbElkcyk7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3REYXRhUmVsIDogb2RSZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZWxhdGlvbihvYmplY3REYXRhUmVsLCBpZHMsIG51bGwsIHRhcmdldElkLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uVEFSR0VUKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlkcy5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIGdldCBkb2N1bWVudCBvYmplY3QsIEJPVEgKLSAgICAgICAgb2JqZWN0RGF0YSA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIHRhcmdldElkLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgZmFsc2UsIG51bGwpOwotICAgICAgICBvZFJlbGF0aW9uc2hpcHMgPSBvYmplY3REYXRhLmdldFJlbGF0aW9uc2hpcHMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgb2RSZWxhdGlvbnNoaXBzLnNpemUoKSk7Ci0gICAgICAgIGlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihyZWxJZHMpOwotICAgICAgICBmb3IgKE9iamVjdERhdGEgb2JqZWN0RGF0YVJlbCA6IG9kUmVsYXRpb25zaGlwcykgewotICAgICAgICAgICAgdmVyaWZ5UmVsYXRpb24ob2JqZWN0RGF0YVJlbCwgaWRzLCBudWxsLCB0YXJnZXRJZCwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLkVJVEhFUik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLQotICAgICAgICAvLyBnZXQgZG9jdW1lbnQgb2JqZWN0LCBub25lCi0gICAgICAgIG9iamVjdERhdGEgPSBmT2JqU3ZjLmdldE9iamVjdChmUmVwb3NpdG9yeUlkLCB0YXJnZXRJZCwgbnVsbCwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgIGZhbHNlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmplY3REYXRhLmdldFJlbGF0aW9uc2hpcHMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIC8vIEZvbGRlcgotICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBjcmVhdGVGb2xkZXIoImZvbGRlcjEiLCBmUm9vdEZvbGRlcklkLCBCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpOwotICAgICAgICBTdHJpbmcgaWQgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkZvbGRlclJlbGF0aW9uc2hpcCIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZm9sZGVySWQsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkKTsKLSAgICAgICAgb2JqZWN0RGF0YSA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuU09VUkNFLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIG9kUmVsYXRpb25zaGlwcyA9IG9iamVjdERhdGEuZ2V0UmVsYXRpb25zaGlwcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBvZFJlbGF0aW9uc2hpcHMuc2l6ZSgpKTsKLSAgICAgICAgaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaWQpKTsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdERhdGFSZWwgOiBvZFJlbGF0aW9uc2hpcHMpIHsKLSAgICAgICAgICAgIHZlcmlmeVJlbGF0aW9uKG9iamVjdERhdGFSZWwsIGlkcywgbnVsbCwgZm9sZGVySWQsIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5TT1VSQ0UpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgLy8gVmVyc2lvbmVkIGRvY3VtZW50Ci0gICAgICAgIFN0cmluZyB2ZXJJZCA9IGNyZWF0ZVZlcnNpb25lZERvY3VtZW50KCk7Ci0gICAgICAgIGlkID0gY3JlYXRlUmVsYXRpb25zaGlwKCJWZXJzaW9uUmVsYXRpb25zaGlwIiwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lELCB2ZXJJZCwgdGFyZ2V0SWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkKTsKLSAgICAgICAgb2JqZWN0RGF0YSA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIHZlcklkLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuU09VUkNFLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIG9kUmVsYXRpb25zaGlwcyA9IG9iamVjdERhdGEuZ2V0UmVsYXRpb25zaGlwcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBvZFJlbGF0aW9uc2hpcHMuc2l6ZSgpKTsKLSAgICAgICAgaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaWQpKTsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdERhdGFSZWwgOiBvZFJlbGF0aW9uc2hpcHMpIHsKLSAgICAgICAgICAgIHZlcmlmeVJlbGF0aW9uKG9iamVjdERhdGFSZWwsIGlkcywgbnVsbCwgdmVySWQsIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5TT1VSQ0UpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoaWRzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgLy8gaXRlbQotICAgICAgICBTdHJpbmcgaXRlbUlkID0gY3JlYXRlSXRlbSgpOwotICAgICAgICBpZCA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiSXRlbVJlbGF0aW9uc2hpcCIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgaXRlbUlkLCB0YXJnZXRJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQpOwotICAgICAgICBvYmplY3REYXRhID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgaXRlbUlkLCBudWxsLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuU09VUkNFLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIG9kUmVsYXRpb25zaGlwcyA9IG9iamVjdERhdGEuZ2V0UmVsYXRpb25zaGlwcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBvZFJlbGF0aW9uc2hpcHMuc2l6ZSgpKTsKLSAgICAgICAgaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaWQpKTsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdERhdGFSZWwgOiBvZFJlbGF0aW9uc2hpcHMpIHsKLSAgICAgICAgICAgIHZlcmlmeVJlbGF0aW9uKG9iamVjdERhdGFSZWwsIGlkcywgbnVsbCwgaXRlbUlkLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlkcy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldE9iamV0QnlQYXRoKCkgewotICAgICAgICAvLyBnZXRPYmplY3RCeVBhdGgKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkMSA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiQ3Jvc3NSZWZlcmVuY2UxIiwgQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC52YWx1ZSgpLCBkb2NJZDEsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkMSk7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0RGF0YSA9IGZPYmpTdmMuZ2V0T2JqZWN0QnlQYXRoKGZSZXBvc2l0b3J5SWQsICIvIiArIE1ZX0RPQ18xLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLlNPVVJDRSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiBvZFJlbGF0aW9uc2hpcHMgPSBvYmplY3REYXRhLmdldFJlbGF0aW9uc2hpcHMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb2RSZWxhdGlvbnNoaXBzLnNpemUoKSk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpZDEpKTsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIG9iamVjdERhdGFSZWwgOiBvZFJlbGF0aW9uc2hpcHMpIHsKLSAgICAgICAgICAgIHZlcmlmeVJlbGF0aW9uKG9iamVjdERhdGFSZWwsIGlkcywgbnVsbCwgZG9jSWQxLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGlkcy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldENoZWNrZWRPdXQoKSB7Ci0gICAgICAgIC8vIGdldE9iamVjdEJ5UGF0aAotICAgICAgICBmaW5hbCBTdHJpbmcgZGlkID0gY3JlYXRlQ2hlY2tlZE91dERvY3VtZW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlkKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkMSA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiQ3Jvc3NSZWZlcmVuY2UxIiwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lELCBkaWQsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWQsIG51bGwpOwotCi0gICAgICAgIE9iamVjdExpc3Qgb2JqZWN0TGlzdCA9IGZOYXZTdmMuZ2V0Q2hlY2tlZE91dERvY3MoZlJlcG9zaXRvcnlJZCwgZlJvb3RGb2xkZXJJZCwgbnVsbCwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvYmplY3RMaXN0LmdldE51bUl0ZW1zKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gb2RSZWxhdGlvbnNoaXBzID0gb2JqZWN0TGlzdC5nZXRPYmplY3RzKCkuZ2V0KDApLmdldFJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9kUmVsYXRpb25zaGlwcy5zaXplKCkpOwotICAgICAgICBMaXN0PFN0cmluZz4gaWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaWQxKSk7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvYmplY3REYXRhUmVsIDogb2RSZWxhdGlvbnNoaXBzKSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZWxhdGlvbihvYmplY3REYXRhUmVsLCBpZHMsIG51bGwsIGRpZCwgUmVsYXRpb25zaGlwRGlyZWN0aW9uLkVJVEhFUik7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREZXNjZW5kYW50cygpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDMgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDUgPSBmYWxzZTsKLQotICAgICAgICBjcmVhdGVIaWVyYXJjaHkoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgaWQxID0gY3JlYXRlUmVsYXRpb25zaGlwKCJDcm9zc1JlZmVyZW5jZTEiLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIGRvY0lkMSwKLSAgICAgICAgICAgICAgICB0YXJnZXRJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQxKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkMiA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiQ3Jvc3NSZWZlcmVuY2UyIiwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lELCBkb2NJZDIsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkMik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZDMgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMyIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZG9jSWQzLAotICAgICAgICAgICAgICAgIHRhcmdldElkLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZDMpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQ0ID0gY3JlYXRlUmVsYXRpb25zaGlwKCJDcm9zc1JlZmVyZW5jZTQiLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIGRvY0lkNCwKLSAgICAgICAgICAgICAgICB0YXJnZXRJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQ0KTsKLQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBvZmNzID0gZk5hdlN2Yy5nZXREZXNjZW5kYW50cyhmUmVwb3NpdG9yeUlkLCBmUm9vdEZvbGRlcklkLAotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigtMSksIG51bGwsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5CT1RILCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxPYmplY3REYXRhPj4gcmVsTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PE9iamVjdERhdGE+PigpOwotICAgICAgICBnZXRSZWxhdGlvbnNoaXBzT2ZEZXNjZW5kYW50cyhvZmNzLCByZWxNYXApOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVsTWFwLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8T2JqZWN0RGF0YT4+IHJlbEVudHJ5IDogcmVsTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gcmVscyA9IHJlbEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjSWQgPSByZWxFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGlmIChzcmNJZC5lcXVhbHMoZG9jSWQxKSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZWxzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkMSwgcmVscy5nZXQoMCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZm91bmQxID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjSWQuZXF1YWxzKGRvY0lkMikpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVscy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpZDIsIHJlbHMuZ2V0KDApLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGZvdW5kMiA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNyY0lkLmVxdWFscyhkb2NJZDMpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlbHMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWQzLCByZWxzLmdldCgwKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBmb3VuZDMgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZC5lcXVhbHMoZG9jSWQ0KSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZWxzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkNCwgcmVscy5nZXQoMCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZm91bmQ0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjSWQuZXF1YWxzKHRhcmdldElkKSkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCByZWxzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm91bmQ1ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZvdW5kMSAmJiBmb3VuZDIgJiYgZm91bmQzICYmIGZvdW5kNCAmJiBmb3VuZDUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldENoaWxkcmVuKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgaWQxID0gY3JlYXRlUmVsYXRpb25zaGlwKCJDcm9zc1JlZmVyZW5jZTEiLCBCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQLnZhbHVlKCksIGRvY0lkMSwKLSAgICAgICAgICAgICAgICB0YXJnZXRJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQxKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkMiA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiQ3Jvc3NSZWZlcmVuY2UxIiwgQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC52YWx1ZSgpLCBkb2NJZDIsCi0gICAgICAgICAgICAgICAgdGFyZ2V0SWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlkMik7Ci0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IG9kcyA9IGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZlJlcG9zaXRvcnlJZCwgZlJvb3RGb2xkZXJJZCwgbnVsbCwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuU09VUkNFLCBudWxsLCBmYWxzZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBvZHMuZ2V0TnVtSXRlbXMoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgb2YgOiBvZHMuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBvZi5nZXRPYmplY3QoKS5nZXRJZCgpOwotICAgICAgICAgICAgTGlzdDxPYmplY3REYXRhPiByZWxzID0gb2YuZ2V0T2JqZWN0KCkuZ2V0UmVsYXRpb25zaGlwcygpOwotICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhkb2NJZDEpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlbHMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpZDEpKTsKLSAgICAgICAgICAgICAgICB2ZXJpZnlSZWxhdGlvbihyZWxzLmdldCgwKSwgaWRzLCBudWxsLCBkb2NJZDEsIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5TT1VSQ0UpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaWRzLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkLmVxdWFscyhkb2NJZDIpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlbHMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpZDIpKTsKLSAgICAgICAgICAgICAgICB2ZXJpZnlSZWxhdGlvbihyZWxzLmdldCgwKSwgaWRzLCBudWxsLCBkb2NJZDIsIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5TT1VSQ0UpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaWRzLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkLmVxdWFscyh0YXJnZXRJZCkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVscy5zaXplKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDaGlsZHJlbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyZW50cygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkMSA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiQ3Jvc3NSZWZlcmVuY2UxIiwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lELCBkb2NJZDEsCi0gICAgICAgICAgICAgICAgZlJvb3RGb2xkZXJJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaWQxKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGlkMiA9IGNyZWF0ZVJlbGF0aW9uc2hpcCgiQ3Jvc3NSZWZlcmVuY2UyIiwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lELCBkb2NJZDIsCi0gICAgICAgICAgICAgICAgZlJvb3RGb2xkZXJJZCwgbnVsbCk7Ci0KLSAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBvZHMgPSBmTmF2U3ZjLmdldE9iamVjdFBhcmVudHMoZlJlcG9zaXRvcnlJZCwgZG9jSWQxLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5UQVJHRVQsIG51bGwsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9kcy5zaXplKCkpOwotICAgICAgICBMaXN0PE9iamVjdERhdGE+IHJlbHMgPSBvZHMuZ2V0KDApLmdldE9iamVjdCgpLmdldFJlbGF0aW9uc2hpcHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlbHMuc2l6ZSgpKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHJlbElkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGQoaWQxKTsKLSAgICAgICAgICAgICAgICBhZGQoaWQyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIHJlbCA6IHJlbHMpIHsKLSAgICAgICAgICAgIHZlcmlmeVJlbGF0aW9uKHJlbCwgcmVsSWRzLCBudWxsLCBmUm9vdEZvbGRlcklkLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uVEFSR0VUKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKHJlbElkcy5pc0VtcHR5KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5SW5jbHVkZVJlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZDEgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMSIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZG9jSWQxLAotICAgICAgICAgICAgICAgIHRhcmdldElkLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZDEpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQyID0gY3JlYXRlUmVsYXRpb25zaGlwKCJDcm9zc1JlZmVyZW5jZTIiLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIGRvY0lkMiwKLSAgICAgICAgICAgICAgICB0YXJnZXRJZCwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgV0hFUkUgY21pczpuYW1lID0gJyIgKyBNWV9ET0NfMSArICInIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBmRGlzY1N2Yy5xdWVyeShmUmVwb3NpdG9yeUlkLCBzdGF0ZW1lbnQsIGZhbHNlLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuU09VUkNFLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE51bUl0ZW1zKCkuaW50VmFsdWUoKSk7Ci0KLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiByZWxzID0gcmVzLmdldE9iamVjdHMoKS5nZXQoMCkuZ2V0UmVsYXRpb25zaGlwcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVscy5zaXplKCkpOwotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpZDEpKTsKLSAgICAgICAgdmVyaWZ5UmVsYXRpb24ocmVscy5nZXQoMCksIGlkcywgbnVsbCwgZG9jSWQxLCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVJlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZDEgPSBjcmVhdGVSZWxhdGlvbnNoaXAoIkNyb3NzUmVmZXJlbmNlMSIsIE9iamVjdFNlcnZpY2VUZXN0LlRFU1RfUkVMQVRJT05fVFlQRV9JRCwgZG9jSWQxLAotICAgICAgICAgICAgICAgIHRhcmdldElkLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZDEpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQyID0gY3JlYXRlUmVsYXRpb25zaGlwKCJDcm9zc1JlZmVyZW5jZTIiLCBPYmplY3RTZXJ2aWNlVGVzdC5URVNUX1JFTEFUSU9OX1RZUEVfSUQsIGRvY0lkMiwKLSAgICAgICAgICAgICAgICB0YXJnZXRJZCwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBmcm9tIGNtaXM6cmVsYXRpb25zaGlwIFdIRVJFICIgKyBQcm9wZXJ0eUlkcy5UQVJHRVRfSUQgKyAiID0gJyIgKyB0YXJnZXRJZCArICInIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBmRGlzY1N2Yy5xdWVyeShmUmVwb3NpdG9yeUlkLCBzdGF0ZW1lbnQsIGZhbHNlLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5nZXROdW1JdGVtcygpLmludFZhbHVlKCkpOwotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBpZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKGlkMSk7Ci0gICAgICAgICAgICAgICAgYWRkKGlkMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvZCA6IHJlcy5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgIGlkcy5yZW1vdmUob2QuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpZHMuaXNFbXB0eSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UmVsYXRpb24oT2JqZWN0RGF0YSBvYmplY3REYXRhLCBMaXN0PFN0cmluZz4gZXhwZWN0ZWRSZWxJZHMsIFN0cmluZyBleHBlY3RlZFR5cGVJZCwKLSAgICAgICAgICAgIFN0cmluZyByZWZJZCwgUmVsYXRpb25zaGlwRGlyZWN0aW9uIGRpcmVjdGlvbikgewotICAgICAgICBTdHJpbmcgcmVsSWQgPSAoU3RyaW5nKSBvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkUmVsSWRzLnJlbW92ZShyZWxJZCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUCwgb2JqZWN0RGF0YS5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICBpZiAobnVsbCAhPSBleHBlY3RlZFR5cGVJZCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVHlwZUlkLCBvYmplY3REYXRhLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlSWQgIT0gbnVsbCAmJiBleHBlY3RlZFR5cGVJZC5lcXVhbHMoT2JqZWN0U2VydmljZVRlc3QuVEVTVF9SRUxBVElPTl9UWVBFX0lEKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJFTF9DVVNUT01fUFJPUF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChPYmplY3RTZXJ2aWNlVGVzdC5SRUxfU1RSSU5HX1BST1ApLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNvdXJjZUlkID0gKFN0cmluZykgb2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldElkID0gKFN0cmluZykgb2JqZWN0RGF0YS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5UQVJHRVRfSUQpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgaWYgKFJlbGF0aW9uc2hpcERpcmVjdGlvbi5TT1VSQ0UgPT0gZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVmSWQsIHNvdXJjZUlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChSZWxhdGlvbnNoaXBEaXJlY3Rpb24uVEFSR0VUID09IGRpcmVjdGlvbikgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlZklkLCB0YXJnZXRJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlZklkLmVxdWFscyhzb3VyY2VJZCkgfHwgcmVmSWQuZXF1YWxzKHRhcmdldElkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlSWQsIFN0cmluZyBzb3VyY2VJZCwgU3RyaW5nIHRhcmdldElkLAotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IGFkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVSZWxhdGlvbnNoaXBQcm9wZXJ0aWVzKG5hbWUsIHR5cGVJZCwgc291cmNlSWQsIHRhcmdldElkLCBhZGRpdGlvbmFsUHJvcGVydGllcyk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZk9ialN2Yy5jcmVhdGVSZWxhdGlvbnNoaXAoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gY3JlYXRlUmVsYXRpb25zaGlwUHJvcGVydGllcyhTdHJpbmcgY3Jvc3NSZWZlcmVuY2VUeXBlKSB7Ci0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShPYmplY3RTZXJ2aWNlVGVzdC5SRUxfU1RSSU5HX1BST1AsIGNyb3NzUmVmZXJlbmNlVHlwZSkpOwotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgd2l0aCBhIG5hbWUKLSAgICBwcml2YXRlIFByb3BlcnRpZXMgY3JlYXRlUmVsYXRpb25zaGlwUHJvcGVydGllcyhTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHNvdXJjZUlkLCBTdHJpbmcgdGFyZ2V0SWQsCi0gICAgICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gYWRkaXRpb25hbFByb3BlcnRpZXMpIHsKLQotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOwotICAgICAgICBpZiAobnVsbCA9PSBhZGRpdGlvbmFsUHJvcGVydGllcykgewotICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLlNPVVJDRV9JRCwgc291cmNlSWQpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuVEFSR0VUX0lELCB0YXJnZXRJZCkpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVWZXJzaW9uZWREb2N1bWVudCgpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKLSAgICAgICAgaWQgPSBmQ3JlYXRvci5jcmVhdGVEb2N1bWVudCgiVmVyc2lvbmVkRG9jdW1lbnQxIiwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9WRVJTSU9OX0RPQ1VNRU5UX1RZUEVfSUQsCi0gICAgICAgICAgICAgICAgZlJvb3RGb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlLk1BSk9SLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUNoZWNrZWRPdXREb2N1bWVudCgpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoKTsKLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoZWNrZWRPdXRJZCA9IG5ldyBIb2xkZXI8U3RyaW5nPihpZCk7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgY2hlY2tlZE91dElkLCBudWxsLCBjb250ZW50Q29waWVkKTsKLSAgICAgICAgcmV0dXJuIGNoZWNrZWRPdXRJZC5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUl0ZW0oKSB7Ci0gICAgICAgIFN0cmluZyBpZDsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgIkl0ZW0xIikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgT2JqZWN0U2VydmljZVRlc3QuVEVTVF9JVEVNX1RZUEVfSUQpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICBpZCA9IGZPYmpTdmMuY3JlYXRlSXRlbShmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlSGllcmFyY2h5KCkgewotICAgICAgICBTdHJpbmcgZm9sZGVySWQxID0gY3JlYXRlRm9sZGVyKCJNeUZvbGRlciIsIGZSb290Rm9sZGVySWQsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZm9sZGVySWQxKTsKLSAgICAgICAgU3RyaW5nIGZvbGRlcklkMiA9IGNyZWF0ZUZvbGRlcigiTXlTdWJGb2xkZXIiLCBmb2xkZXJJZDEsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZm9sZGVySWQyKTsKLSAgICAgICAgZG9jSWQzID0gY3JlYXRlRG9jdW1lbnQoTVlfRE9DXzMsIGZvbGRlcklkMSwgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCksIHRydWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRvY0lkMik7Ci0gICAgICAgIGRvY0lkNCA9IGNyZWF0ZURvY3VtZW50KE1ZX0RPQ180LCBmb2xkZXJJZDIsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2NJZDMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRSZWxhdGlvbnNoaXBzT2ZEZXNjZW5kYW50cyhMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBvZmNzLCBNYXA8U3RyaW5nLCBMaXN0PE9iamVjdERhdGE+PiByZWxzKSB7Ci0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJDb250YWluZXIgb2ZjIDogb2ZjcykgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJmb3VuZCBkZXNjOiAiICsgb2ZjLmdldE9iamVjdCgpLmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KCJjbWlzOm5hbWUiKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgIGJhc2U6ICIgKyBvZmMuZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCkuZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgICAgIGlmIChvZmMuZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCkuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCkgewotICAgICAgICAgICAgICAgIHJlbHMucHV0KG9mYy5nZXRPYmplY3QoKS5nZXRPYmplY3QoKS5nZXRJZCgpLCBvZmMuZ2V0T2JqZWN0KCkuZ2V0T2JqZWN0KCkuZ2V0UmVsYXRpb25zaGlwcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2V0UmVsYXRpb25zaGlwc09mRGVzY2VuZGFudHMob2ZjLmdldENoaWxkcmVuKCksIHJlbHMpOwotICAgICAgICAgICAgICAgIC8vIGZvciAoIE9iamVjdEluRm9sZGVyQ29udGFpbmVyIGNoaWxkIDogb2ZjLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICAvLyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9SZXBvc2l0b3J5U2VydmljZU11dGFiaWxpdHlUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9SZXBvc2l0b3J5U2VydmljZU11dGFiaWxpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODlkMTguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvUmVwb3NpdG9yeVNlcnZpY2VNdXRhYmlsaXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc2VydmVyLkluTWVtb3J5U2VydmljZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLkRvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlByb3BlcnR5Q3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBUZW1wb3JhcnkgdGVzdCBjbGFzcyB1bnRpbCBDTUlTIDEuMSBiaW5kaW5ncyBhcmUgY29tcGxldGVkLiBVbnRpbCB0aGVuIHdlIHVzZQotICogYSBzcGVjaWFsIHNldHVwIHByb2NlZHVyZSB0byBkaXJlY3RseSBjb25uZWN0IHRvIHRoZSByZXBvc2l0b3J5IHNlcnZpY2UKLSAqIGltcGxlbWVudGF0aW9uIG9mIEluTWVtb3J5LgotICovCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVNlcnZpY2VNdXRhYmlsaXR5VGVzdCBleHRlbmRzIEFic3RyYWN0U2VydmljZVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlcG9zaXRvcnlTZXJ2aWNlVGVzdC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAiVW5pdFRlc3RSZXBvc2l0b3J5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRF9NVVRBQklMSVRZID0gIkJvb2tUeXBlQWRkZWRMYXRlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lEX1RJVExFID0gIlRpdGxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfSURfTlVNQkVSID0gIk51bWJlciI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHN1cGVyLnNldFR5cGVDcmVhdG9yQ2xhc3MoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIC8vIGF0dGFjaCByZXBvc2l0b3J5IGluZm8gdG8gdGhlIHNlc3Npb246Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbmZpZ0NvbnN0YW50cy5UWVBFX0NSRUFUT1JfQ0xBU1MsIGdldFR5cGVDcmVhdG9yQ2xhc3MoKSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KENvbmZpZ0NvbnN0YW50cy5SRVBPU0lUT1JZX0lELCBSRVBPU0lUT1JZX0lEKTsKLQotICAgICAgICBJbk1lbW9yeVNlcnZpY2VGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IEluTWVtb3J5U2VydmljZUZhY3RvcnlJbXBsKCk7Ci0gICAgICAgIGZhY3RvcnkuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHRlc3QgaXMganVzdCBhZGRlZCBiZWNhdXNlIHRoaXMgdGVzdCBjbGFzcyB1c2VzIGEgZGlmZmVyZW50IHNldHVwIHRvCi0gICAgLy8gY29ubmVjdCB0byB0aGUKLSAgICAvLyBzZXJ2ZXIgYXMgbG9uZyBhcyB0aGUgc2VydmVyIGJpbmRpbmdzIGRvIG5vdCBzdXBwb3J0IHRoZSB0eXBlIG11dGFiaWxpdHkKLSAgICAvLyBleHRlbnNpb24gb2YKLSAgICAvLyBDTUlTIDEuMS4gSWYgdGhpcyB0ZXN0IGZhaWxzIHRoZW4gdGhlIHNldFVwKCkgZmFpbHMhCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeUluZm8oKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0UmVwb3NpdG9yeUluZm8oKSAuLi4iKTsKLSAgICAgICAgTGlzdDxSZXBvc2l0b3J5SW5mbz4gcmVwb3NpdG9yaWVzID0gZlJlcFN2Yy5nZXRSZXBvc2l0b3J5SW5mb3MobnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yaWVzKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocmVwb3NpdG9yaWVzLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgbG9nLmluZm8oImdlUmVwb3NpdG9yeUluZm8oKSwgZm91bmQgIiArIHJlcG9zaXRvcmllcy5zaXplKCkgKyAiIHJlcG9zaXRvcnkvcmVwb3NpdG9yaWVzKS4iKTsKLQotICAgICAgICBmb3IgKFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnkgOiByZXBvc2l0b3JpZXMpIHsKLSAgICAgICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnkyID0gZlJlcFN2Yy5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5LmdldElkKCksIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBvc2l0b3J5Mik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVwb3NpdG9yeS5nZXRJZCgpLCByZXBvc2l0b3J5Mi5nZXRJZCgpKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJmb3VuZCByZXBvc2l0b3J5IiArIHJlcG9zaXRvcnkyLmdldElkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0UmVwb3NpdG9yeUluZm8oKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTXV0YWJpbGl0eUNyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5pbmZvKCIiKTsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RUeXBlTXV0YWJpbGl0eUNyZWF0aW9uKCkgLi4uIik7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWZSZWYgPSBjcmVhdGVUeXBlRm9yQWRkaW5nQXRSdW50aW1lKCk7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBnZXRSZXBvc2l0b3J5SWQoKTsKLSAgICAgICAgLy8gYWRkIHR5cGUuCi0gICAgICAgIGZSZXBTdmMuY3JlYXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVEZWZSZWYsIG51bGwpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gZlJlcFN2Yy5nZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHR5cGVEZWZSZWYuZ2V0SWQoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlRGVmUmVmLmdldElkKCksIHR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlRGVmUmVmLmdldERlc2NyaXB0aW9uKCksIHR5cGUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlRGVmUmVmLmdldERpc3BsYXlOYW1lKCksIHR5cGUuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlRGVmUmVmLmdldExvY2FsTmFtZSgpLCB0eXBlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGVEZWZSZWYuZ2V0TG9jYWxOYW1lc3BhY2UoKSwgdHlwZS5nZXRMb2NhbE5hbWVzcGFjZSgpKTsKLSAgICAgICAgUmVwb3NpdG9yeVNlcnZpY2VUZXN0LmNvbnRhaW5zQWxsQmFzZVByb3BlcnR5RGVmaW5pdGlvbnModHlwZSk7Ci0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdFR5cGVNdXRhYmlsaXR5Q3JlYXRpb24oKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTXV0YWJpbGl0eUNyZWF0ZUR1cGxpY2F0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsb2cuaW5mbygiIik7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0VHlwZU11dGFiaWxpdHlDcmVhdGVEdXBsaWNhdGUoKSAuLi4iKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZlJlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IGdldFJlcG9zaXRvcnlJZCgpOwotICAgICAgICAvLyBhZGQgdHlwZS4KLSAgICAgICAgZlJlcFN2Yy5jcmVhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZlJlZiwgbnVsbCk7Ci0gICAgICAgIC8vIGFkZCB0eXBlIGFnYWluIHNob3VsZCBmYWlsCi0gICAgICAgIGNoZWNrQWRkaW5nVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVEZWZSZWYsIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICAvLyB0eXBlIHNob3VsZCBzdGlsbCBleGlzdCB0aGVuCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSBmUmVwU3ZjLmdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgdHlwZURlZlJlZi5nZXRJZCgpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHR5cGVEZWZSZWYuZ2V0SWQoKSwgdHlwZS5nZXRJZCgpKTsKLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0VHlwZU11dGFiaWxpdHlDcmVhdGVEdXBsaWNhdGUoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTXV0YWJpbGl0eVR5cGVOYW1lQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RUeXBlTXV0YWJpbGl0eVR5cGVOYW1lQ29uc3RyYWludHMoKSAuLi4iKTsKLQotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gZ2V0UmVwb3NpdG9yeUlkKCk7Ci0KLSAgICAgICAgLy8gdGVzdCBpbGxlZ2FsIHR5cGUgaWQKLSAgICAgICAgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gdHlwZURlZlJlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgdHlwZURlZlJlZi5zZXRJZCh0eXBlRGVmUmVmLmdldElkKCkgKyAiISEhIik7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWZOZXcgPSBmUmVwU3ZjLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmUmVmLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRZUEVfSURfTVVUQUJJTElUWSArICJfX18iLCB0eXBlRGVmTmV3LmdldElkKCkpOwotICAgICAgICBmUmVwU3ZjLmRlbGV0ZVR5cGUocmVwb3NpdG9yeUlkLCBUWVBFX0lEX01VVEFCSUxJVFkgKyAiX19fIiwgbnVsbCk7Ci0KLSAgICAgICAgLy8gdGVzdCBpbGxlZ2FsIHBhcmVudCB0eXBlIGlkCi0gICAgICAgIHR5cGVEZWZSZWYgPSBjcmVhdGVUeXBlRm9yQWRkaW5nQXRSdW50aW1lKCk7Ci0gICAgICAgIHR5cGVEZWZSZWYuc2V0UGFyZW50VHlwZUlkKCJOb25FeGlzdGluZ1BhcmVudFR5cGUiKTsKLSAgICAgICAgY2hlY2tBZGRpbmdUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZlJlZiwgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7Ci0KLSAgICAgICAgLy8gdGVzdCBudWxsIHR5cGUgaWQKLSAgICAgICAgdHlwZURlZlJlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgdHlwZURlZlJlZi5zZXRJZChudWxsKTsKLSAgICAgICAgdHlwZURlZk5ldyA9IGZSZXBTdmMuY3JlYXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVEZWZSZWYsIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKG51bGwgIT0gdHlwZURlZk5ldy5nZXRJZCgpICYmIHR5cGVEZWZOZXcuZ2V0SWQoKS5sZW5ndGgoKSA+IDApOwotICAgICAgICBmUmVwU3ZjLmRlbGV0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmTmV3LmdldElkKCksIG51bGwpOwotCi0gICAgICAgIC8vIHRlc3QgbnVsbCBxdWVyeSBuYW1lCi0gICAgICAgIHR5cGVEZWZSZWYgPSBjcmVhdGVUeXBlRm9yQWRkaW5nQXRSdW50aW1lKCk7Ci0gICAgICAgIHR5cGVEZWZSZWYuc2V0UXVlcnlOYW1lKG51bGwpOwotICAgICAgICB0eXBlRGVmTmV3ID0gZlJlcFN2Yy5jcmVhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZlJlZiwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUWVBFX0lEX01VVEFCSUxJVFksIHR5cGVEZWZOZXcuZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICBmUmVwU3ZjLmRlbGV0ZVR5cGUocmVwb3NpdG9yeUlkLCBUWVBFX0lEX01VVEFCSUxJVFksIG51bGwpOwotCi0gICAgICAgIC8vIHRlc3QgaWxsZWdhbCBxdWVyeSBuYW1lCi0gICAgICAgIHR5cGVEZWZSZWYgPSBjcmVhdGVUeXBlRm9yQWRkaW5nQXRSdW50aW1lKCk7Ci0gICAgICAgIHR5cGVEZWZSZWYuc2V0UXVlcnlOYW1lKHR5cGVEZWZSZWYuZ2V0UXVlcnlOYW1lKCkgKyAiISEhIik7Ci0gICAgICAgIHR5cGVEZWZOZXcgPSBmUmVwU3ZjLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmUmVmLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRZUEVfSURfTVVUQUJJTElUWSwgdHlwZURlZk5ldy5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgIGZSZXBTdmMuZGVsZXRlVHlwZShyZXBvc2l0b3J5SWQsIFRZUEVfSURfTVVUQUJJTElUWSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gdGVzdCBudWxsIGxvY2FsIG5hbWUKLSAgICAgICAgdHlwZURlZlJlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgdHlwZURlZlJlZi5zZXRMb2NhbE5hbWUobnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUWVBFX0lEX01VVEFCSUxJVFksIHR5cGVEZWZOZXcuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICB0eXBlRGVmTmV3ID0gZlJlcFN2Yy5jcmVhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZlJlZiwgbnVsbCk7Ci0gICAgICAgIGZSZXBTdmMuZGVsZXRlVHlwZShyZXBvc2l0b3J5SWQsIFRZUEVfSURfTVVUQUJJTElUWSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gdGVzdCBpbGxlZ2FsIGxvY2FsIG5hbWUKLSAgICAgICAgdHlwZURlZlJlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgdHlwZURlZlJlZi5zZXRMb2NhbE5hbWUodHlwZURlZlJlZi5nZXRMb2NhbE5hbWUoKSArICIhISEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRZUEVfSURfTVVUQUJJTElUWSwgdHlwZURlZk5ldy5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIHR5cGVEZWZOZXcgPSBmUmVwU3ZjLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmUmVmLCBudWxsKTsKLSAgICAgICAgZlJlcFN2Yy5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgVFlQRV9JRF9NVVRBQklMSVRZLCBudWxsKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RUeXBlTXV0YWJpbGl0eVR5cGVOYW1lQ29uc3RyYWludHMoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTXV0YWJpbGl0eVByb3BlcnR5TmFtZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0VHlwZU11dGFiaWxpdHlQcm9wZXJ0eU5hbWVDb25zdHJhaW50cygpIC4uLiIpOwotCi0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBnZXRSZXBvc2l0b3J5SWQoKTsKLQotICAgICAgICAvLyB0ZXN0IG51bGwgcHJvcGVydHkgaWQKLSAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gY3JlYXRlVHlwZUZvckFkZGluZ0F0UnVudGltZSgpOwotICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHBkID0gZ2V0UHJvcGVydHlEZWZpbml0aW9uSW1wbCh0eXBlRGVmKTsKLSAgICAgICAgcGQuc2V0SWQobnVsbCk7Ci0gICAgICAgIGNoZWNrQWRkaW5nVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVEZWYsIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOwotCi0gICAgICAgIC8vIHRlc3QgaWxsZWdhbCBwcm9wZXJ0eSBpZAotICAgICAgICB0eXBlRGVmID0gY3JlYXRlVHlwZUZvckFkZGluZ0F0UnVudGltZSgpOwotICAgICAgICBwZCA9IGdldFByb3BlcnR5RGVmaW5pdGlvbkltcGwodHlwZURlZik7Ci0gICAgICAgIHBkLnNldFF1ZXJ5TmFtZShwZC5nZXRRdWVyeU5hbWUoKSArICIhKiEiKTsKLSAgICAgICAgY2hlY2tBZGRpbmdUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZiwgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7Ci0KLSAgICAgICAgLy8gdGVzdCBudWxsIHByb3BlcnR5IHF1ZXJ5IG5hbWUKLSAgICAgICAgdHlwZURlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgcGQgPSBnZXRQcm9wZXJ0eURlZmluaXRpb25JbXBsKHR5cGVEZWYpOwotICAgICAgICBwZC5zZXRRdWVyeU5hbWUobnVsbCk7Ci0gICAgICAgIGNoZWNrQWRkaW5nVHlwZShyZXBvc2l0b3J5SWQsIHR5cGVEZWYsIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOwotCi0gICAgICAgIC8vIHRlc3QgaWxsZWdhbCBwcm9wZXJ0eSBxdWVyeSBuYW1lCi0gICAgICAgIHR5cGVEZWYgPSBjcmVhdGVUeXBlRm9yQWRkaW5nQXRSdW50aW1lKCk7Ci0gICAgICAgIHBkID0gZ2V0UHJvcGVydHlEZWZpbml0aW9uSW1wbCh0eXBlRGVmKTsKLSAgICAgICAgcGQuc2V0UXVlcnlOYW1lKHBkLmdldFF1ZXJ5TmFtZSgpICsgIiEhISIpOwotICAgICAgICBjaGVja0FkZGluZ1R5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmLCBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKLQotICAgICAgICAvLyB0ZXN0IG51bGwgcHJvcGVydHkgbG9jYWwgbmFtZQotICAgICAgICB0eXBlRGVmID0gY3JlYXRlVHlwZUZvckFkZGluZ0F0UnVudGltZSgpOwotICAgICAgICBwZCA9IGdldFByb3BlcnR5RGVmaW5pdGlvbkltcGwodHlwZURlZik7Ci0gICAgICAgIHBkLnNldExvY2FsTmFtZShudWxsKTsKLSAgICAgICAgY2hlY2tBZGRpbmdUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZiwgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7Ci0KLSAgICAgICAgLy8gdGVzdCBpbGxlZ2FsIHByb3BlcnR5IGxvY2FsIG5hbWUKLSAgICAgICAgdHlwZURlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgcGQgPSBnZXRQcm9wZXJ0eURlZmluaXRpb25JbXBsKHR5cGVEZWYpOwotICAgICAgICBwZC5zZXRMb2NhbE5hbWUodHlwZURlZi5nZXRMb2NhbE5hbWUoKSArICIhISEiKTsKLSAgICAgICAgY2hlY2tBZGRpbmdUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZiwgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7Ci0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0VHlwZU11dGFiaWxpdHlQcm9wZXJ0eU5hbWVDb25zdHJhaW50cygpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FkZGluZ1R5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZURlZiwgQ2xhc3M8PyBleHRlbmRzIEV4Y2VwdGlvbj4gY2xhenopIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHR5cGVEZWYgPSBmUmVwU3ZjLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIklsbGVnYWwgdHlwZSBzaG91bGQgdGhyb3cgYSAiICsgY2xhenouZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJbGxlZ2FsIHR5cGUgbmFtZSB0aHJldyB3cm9uZyBleGNlcHRpb24gdHlwZSAoc2hvdWxkIGJlIGEgIiArIGNsYXp6LmdldE5hbWUoKSArICIpIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhenouaXNJbnN0YW5jZShlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTXV0YWJpbGl0eVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBsb2cuaW5mbygiIik7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0VHlwZU11dGFiaWxpdHlVcGRhdGUoKSAuLi4iKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZlJlZiA9IGNyZWF0ZVR5cGVGb3JBZGRpbmdBdFJ1bnRpbWUoKTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IGdldFJlcG9zaXRvcnlJZCgpOwotICAgICAgICBmUmVwU3ZjLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmUmVmLCBudWxsKTsKLSAgICAgICAgLy8gdXBkYXRlIHR5cGUuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmUmVwU3ZjLnVwZGF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlRGVmUmVmLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoInVwZGF0aW5nIGEgdHlwZSBzaG91bGQgdGhyb3cgZXhjZXB0aW9uLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0VHlwZU11dGFiaWxpdHlVcGRhdGUoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlTXV0YWJpbGl0eURlbGV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy5pbmZvKCIiKTsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RUeXBlTXV0YWJpbGl0eURlbGV0aW9uKCkgLi4uIik7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWZSZWYgPSBjcmVhdGVUeXBlRm9yQWRkaW5nQXRSdW50aW1lKCk7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBnZXRSZXBvc2l0b3J5SWQoKTsKLSAgICAgICAgZlJlcFN2Yy5jcmVhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZURlZlJlZiwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIGRvY0lkID0gY3JlYXRlRG9jKCJCb29rMSIsIGdldFJvb3RGb2xkZXJJZChSRVBPU0lUT1JZX0lEKSwgVFlQRV9JRF9NVVRBQklMSVRZKTsKLQotICAgICAgICAvLyB0cnkgZGVsZXRpbmcgdHlwZSwgc2hvdWxkIGZhaWwsIGJlY2F1c2UgaW4gdXNlLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlJlcFN2Yy5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgVFlQRV9JRF9NVVRBQklMSVRZLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoImRlbGV0aW5nIGEgdHlwZSB3aGljaCBpcyBpbiB1c2Ugc2hvdWxkIHRocm93IGV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZk9ialN2Yy5kZWxldGVPYmplY3QoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIHRydWUsIG51bGwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmUmVwU3ZjLmRlbGV0ZVR5cGUocmVwb3NpdG9yeUlkLCBUWVBFX0lEX01VVEFCSUxJVFksIG51bGwpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZGVsZXRpbmcgYSB0eXBlIHdoaWNoIGlzIGluIG5vdCBpbiB1c2Ugc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24hIEV4Y2VwdGlvbiBpczogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZSZXBTdmMuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCBUWVBFX0lEX01VVEFCSUxJVFksIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiZ2V0dGluZyBhIHR5cGUgYWZ0ZXIgaXQgd2FzIGRlbGV0ZWQgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlJlcFN2Yy5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCksIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiZGVsZXRpbmcgYSBDTUlTIGJhc2UgdHlwZSB0aHJvdyBleGNlcHRpb24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlIChlIGluc3RhbmNlb2YgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZSZXBTdmMuZGVsZXRlVHlwZShyZXBvc2l0b3J5SWQsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJkZWxldGluZyBhIENNSVMgYmFzZSB0eXBlIHRocm93IGV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUgKGUgaW5zdGFuY2VvZiBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdFR5cGVNdXRhYmlsaXR5RGVsZXRpb24oKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZXBvc2l0b3J5SWQoKSB7Ci0gICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHJlcG9zaXRvcmllcyA9IGZSZXBTdmMuZ2V0UmVwb3NpdG9yeUluZm9zKG51bGwpOwotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5ID0gcmVwb3NpdG9yaWVzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXBvc2l0b3J5KTsKLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnkuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSb290Rm9sZGVySWQoU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5ID0gZlJlcFN2Yy5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5SWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcG9zaXRvcnkpOwotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRSb290Rm9sZGVySWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgZ2V0UHJvcGVydHlEZWZpbml0aW9uSW1wbChUeXBlRGVmaW5pdGlvbiB0eXBlRGVmKSB7Ci0gICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcGQgPSAoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCkgdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KAotICAgICAgICAgICAgICAgIFBST1BFUlRZX0lEX1RJVExFKTsKLSAgICAgICAgcmV0dXJuIHBkOwotICAgIH0KLQotICAgIHByaXZhdGUgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY3JlYXRlVHlwZUZvckFkZGluZ0F0UnVudGltZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNMYXRlclR5cGU7Ci0gICAgICAgICAgICBjbWlzTGF0ZXJUeXBlID0gRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZURvY3VtZW50VHlwZURlZmluaXRpb25XaXRob3V0QmFzZVByb3BlcnRpZXMoRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpKTsKLSAgICAgICAgICAgIGNtaXNMYXRlclR5cGUuc2V0SWQoVFlQRV9JRF9NVVRBQklMSVRZKTsKLSAgICAgICAgICAgIGNtaXNMYXRlclR5cGUuc2V0RGlzcGxheU5hbWUoIlR5cGUgd2l0aCB0d28gcHJvcGVydGllcyIpOwotICAgICAgICAgICAgY21pc0xhdGVyVHlwZS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gIiArIFRZUEVfSURfTVVUQUJJTElUWSk7Ci0gICAgICAgICAgICBjbWlzTGF0ZXJUeXBlLnNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KGZhbHNlKTsKLQotICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcDEgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKFBST1BFUlRZX0lEX05VTUJFUiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBJbnQgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNMYXRlclR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AxKTsKLQotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wMiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQUk9QRVJUWV9JRF9USVRMRSwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNMYXRlclR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AyKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNtaXNMYXRlclR5cGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gY3JlYXRpbmcgYnVpbHQtaW4gSW5NZW1vcnkgdHlwZXMuIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgY3JlYXRlRG9jKFN0cmluZyBuYW1lLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHBvbGljaWVzID0gbnVsbDsKLSAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uID0gbnVsbDsKLQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gY3JlYXRlRG9jdW1lbnRQcm9wZXJ0aWVzKG5hbWUsIHR5cGVJZCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZS5OT05FLAotICAgICAgICAgICAgICAgIHBvbGljaWVzLCBudWxsLCBudWxsLCBleHRlbnNpb24pOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvUmVwb3NpdG9yeVNlcnZpY2VUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9SZXBvc2l0b3J5U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkMzc2NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9SZXBvc2l0b3J5U2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkudHlwZXMuRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlTZXJ2aWNlVGVzdCBleHRlbmRzIEFic3RyYWN0U2VydmljZVRlc3QgewotCi0gICAgLy8gcHJpdmF0ZSBDbWlzUHJvdmlkZXIgZlByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlcG9zaXRvcnlTZXJ2aWNlVGVzdC5jbGFzcyk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHN1cGVyLnNldFR5cGVDcmVhdG9yQ2xhc3MoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlJbmZvKCkgewotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdFJlcG9zaXRvcnlJbmZvKCkgLi4uIik7Ci0gICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHJlcG9zaXRvcmllcyA9IGZSZXBTdmMuZ2V0UmVwb3NpdG9yeUluZm9zKG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcG9zaXRvcmllcyk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHJlcG9zaXRvcmllcy5pc0VtcHR5KCkpOwotCi0gICAgICAgIGxvZy5pbmZvKCJnZVJlcG9zaXRvcnlJbmZvKCksIGZvdW5kICIgKyByZXBvc2l0b3JpZXMuc2l6ZSgpICsgIiByZXBvc2l0b3J5L3JlcG9zaXRvcmllcykuIik7Ci0KLSAgICAgICAgZm9yIChSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5IDogcmVwb3NpdG9yaWVzKSB7Ci0gICAgICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5MiA9IGZSZXBTdmMuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeS5nZXRJZCgpLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yeTIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcG9zaXRvcnkuZ2V0SWQoKSwgcmVwb3NpdG9yeTIuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiZm91bmQgcmVwb3NpdG9yeSIgKyByZXBvc2l0b3J5Mi5nZXRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdFJlcG9zaXRvcnlJbmZvKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZURlZmluaXRpb24oKSB7Ci0gICAgICAgIGxvZy5pbmZvKCIiKTsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RUeXBlRGVmaW5pdGlvbigpIC4uLiIpOwotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gZ2V0UmVwb3NpdG9yeUlkKCk7Ci0gICAgICAgIFN0cmluZyB0eXBlSWQgPSAiTXlEb2NUeXBlMSI7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHJlZiA9IFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuZ2V0VHlwZUJ5SWQodHlwZUlkKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IGZSZXBTdmMuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVmLmdldElkKCksIHR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZWYuZ2V0RGVzY3JpcHRpb24oKSwgdHlwZS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlZi5nZXREaXNwbGF5TmFtZSgpLCB0eXBlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVmLmdldExvY2FsTmFtZSgpLCB0eXBlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlZi5nZXRMb2NhbE5hbWVzcGFjZSgpLCB0eXBlLmdldExvY2FsTmFtZXNwYWNlKCkpOwotICAgICAgICBjb250YWluc0FsbEJhc2VQcm9wZXJ0eURlZmluaXRpb25zKHR5cGUpOwotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RUeXBlRGVmaW5pdGlvbigpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFR5cGVzVW5saW1pdGVkRGVwdGgoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCIiKTsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RHZXRBbGxUeXBlc1VubGltaXRlZERlcHRoKCkuLi4iKTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IGdldFJlcG9zaXRvcnlJZCgpOwotCi0gICAgICAgIC8vIGdldCB0eXBlcwotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlcyA9IGZSZXBTdmMuZ2V0VHlwZURlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgbnVsbCwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVzKTsKLQotICAgICAgICAvLyBjaGVjayB0aGF0IHdlIGdvdCBhbGwgdHlwZXMKLSAgICAgICAgaW50IGV4cGVjdGVkU2l6ZSA9IFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuZ2V0VHlwZXNMaXN0KCkuc2l6ZSgpCi0gICAgICAgICAgICAgICAgKyBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXREZWZhdWx0VHlwZXMoKS5zaXplKCk7Ci0gICAgICAgIGludCB0b3RhbFNpemUgPSBnZXRSZWN1cnNpdmVTaXplKHR5cGVzKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTaXplLCB0b3RhbFNpemUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgdHlwZXMuc2l6ZSgpKTsKLQotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB0eXBlLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVEZWYpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmLmdldElkKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiRm91bmQgdHlwZTogIiArIHR5cGVEZWYuZ2V0SWQoKSArICIsIGRpc3BsYXkgbmFtZSBpczogIiArIHR5cGVEZWYuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICBCYXNlIHR5cGUgaXM6ICIgKyB0eXBlRGVmLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICBOdW1iZXIgb2YgY2hpbGRyZW4gdHlwZXMgaXM6ICIgKyB0eXBlLmdldENoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcERlZnMgPSB0eXBlLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgbG9nLmluZm8oIiAgTnVtYmVyIG9mIHByb3BlcnRpZXMgaXM6ICIgKyAocHJvcERlZnMgPT0gbnVsbCA/IDAgOiBwcm9wRGVmcy5zaXplKCkpKTsKLSAgICAgICAgICAgIGNvbnRhaW5zQWxsQmFzZVByb3BlcnR5RGVmaW5pdGlvbnModHlwZURlZik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RHZXRBbGxUeXBlc1VubGltaXRlZERlcHRoKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZXNXaWh0b3V0UHJvcERlZnMoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCIiKTsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RHZXRUeXBlc1dpaHRvdXRQcm9wRGVmcygpLi4uIik7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBnZXRSZXBvc2l0b3J5SWQoKTsKLQotICAgICAgICAvLyBnZXQgdHlwZXMKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gdHlwZXMgPSBmUmVwU3ZjLmdldFR5cGVEZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsCi0gICAgICAgICAgICAgICAgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCksIEJpZ0ludGVnZXIudmFsdWVPZigtMSksIEJvb2xlYW4uRkFMU0UsIG51bGwpOwotICAgICAgICAvLyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlcyA9Ci0gICAgICAgIC8vIGZSZXBTdmMuZ2V0VHlwZURlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgIk15RG9jVHlwZTEiLAotICAgICAgICAvLyBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLAotICAgICAgICAvLyBCb29sZWFuLkZBTFNFLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlcyk7Ci0KLSAgICAgICAgaW50IHRvdGFsU2l6ZSA9IGdldFJlY3Vyc2l2ZVNpemUodHlwZXMpOwotICAgICAgICBsb2cuaW5mbygiRm91bmQgIiArIHRvdGFsU2l6ZSArICIgbnVtYmVyIG9mIHR5cGUgZGVmaW5pdGlvbnMuICIpOwotCi0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IGRlc2NlbmRhbnRzID0gZ2V0VHlwZURlZnNGbGF0dGVuZWQodHlwZXMpOwotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgOiBkZXNjZW5kYW50cykgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodHlwZURlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodHlwZURlZi5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCwgdHlwZURlZi5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICAgICAgbG9nLmluZm8oIkZvdW5kIHR5cGU6ICIgKyB0eXBlRGVmLmdldElkKCkgKyAiLCBkaXNwbGF5IG5hbWUgaXM6ICIgKyB0eXBlRGVmLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgbG9nLmluZm8oIiAgQmFzZSB0eXBlIGlzOiAiICsgdHlwZURlZi5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmcyA9IHR5cGVEZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgbG9nLmluZm8oIiAgUHJvcGVydHkgZGVmaW5pdGlvbnMgKG11c3QgYmUgbnVsbCk6ICIgKyBwcm9wRGVmcyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZzLmlzRW1wdHkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RHZXRUeXBlc1dpaHRvdXRQcm9wRGVmcygpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEFsbFR5cGVzTGltaXRlZERlcHRoKCkgewotICAgICAgICBsb2cuaW5mbygiIik7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0QWxsVHlwZXNMaW1pdGVkRGVwdGgoKS4uLiIpOwotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gZ2V0UmVwb3NpdG9yeUlkKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHR5cGVzCi0gICAgICAgIGludCBkZXB0aCA9IDE7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IHR5cGVzID0gZlJlcFN2Yy5nZXRUeXBlRGVzY2VuZGFudHMocmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpLCBCb29sZWFuLlRSVUUsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVzKTsKLSAgICAgICAgbG9nLmluZm8oIkZvdW5kIGluIHJlcG9zaXRvcnkgIiArIHJlcG9zaXRvcnlJZCArICIgIiArIHR5cGVzLnNpemUoKSArICIgdHlwZShzKSB3aXRoIGRlcHRoICIgKyBkZXB0aCArICIuIik7Ci0KLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0eXBlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB0eXBlLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiRm91bmQgdHlwZTogIiArIHR5cGVEZWYuZ2V0SWQoKSArICIsIGRpc3BsYXkgbmFtZSBpczogIiArIHR5cGVEZWYuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICBCYXNlIHR5cGUgaXM6ICIgKyB0eXBlRGVmLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICBOdW1iZXIgb2YgY2hpbGRyZW4gdHlwZXMgaXM6ICIgKyB0eXBlLmdldENoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGNvbnRhaW5zQWxsQmFzZVByb3BlcnR5RGVmaW5pdGlvbnModHlwZURlZik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdG90YWxTaXplID0gZ2V0UmVjdXJzaXZlU2l6ZSh0eXBlcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCB0b3RhbFNpemUpOyAvLyBhbGwgUmVwb3NpdG9yeVRlc3RUeXBlU3lzdGVtQ3JlYXRvciB0eXBlcwotICAgICAgICAvLyBtaW51cyBvbmUgaW4gbGV2ZWwgdHdvIHBsdXMgY21pcy5kb2NtZW50Ci0gICAgICAgIGFzc2VydEZhbHNlKGNvbnRhaW5zVHlwZUJ5SWRSZWN1cnNpdmUoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCksIHR5cGVzKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNvbnRhaW5zVHlwZUJ5SWRSZWN1cnNpdmUoQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpLCB0eXBlcykpOwotCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNUeXBlQnlJZFJlY3Vyc2l2ZSgiTXlEb2NUeXBlMSIsIHR5cGVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNUeXBlQnlJZFJlY3Vyc2l2ZSgiTXlEb2NUeXBlMiIsIHR5cGVzKSk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoY29udGFpbnNUeXBlQnlJZFJlY3Vyc2l2ZShVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLkxFVkVMMl9UWVBFLCB0eXBlcykpOwotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGUpOwotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHR5cGUuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodHlwZURlZik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVEZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVEZWYuZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdEdldEFsbFR5cGVzTGltaXRlZERlcHRoKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWNUeXBlTGltaXRlZERlcHRoKCkgewotICAgICAgICBsb2cuaW5mbygiIik7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0U3BlY2lmaWNUeXBlTGltaXRlZERlcHRoKCkuLi4iKTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IGdldFJlcG9zaXRvcnlJZCgpOwotCi0gICAgICAgIC8vIGdldCB0eXBlcwotICAgICAgICBpbnQgZGVwdGggPSAyOwotICAgICAgICBTdHJpbmcgdHlwZUlkID0gIk15RG9jVHlwZTEiOwotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlcyA9IGZSZXBTdmMuZ2V0VHlwZURlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgdHlwZUlkLAotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihkZXB0aCksIEJvb2xlYW4uVFJVRSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodHlwZXMpOwotICAgICAgICBsb2cuaW5mbygiRm91bmQgaW4gcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkICsgIiBmb3IgdHlwZSAiICsgdHlwZUlkICsgIiwgIiArIHR5cGVzLnNpemUoKQotICAgICAgICAgICAgICAgICsgIiB0eXBlKHMpIHdpdGggZGVwdGggIiArIGRlcHRoICsgIi4iKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZ2V0UmVjdXJzaXZlU2l6ZSh0eXBlcykpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zVHlwZUJ5SWRSZWN1cnNpdmUoIk15RG9jVHlwZTEuMSIsIHR5cGVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNUeXBlQnlJZFJlY3Vyc2l2ZSgiTXlEb2NUeXBlMS4yIiwgdHlwZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluc1R5cGVCeUlkUmVjdXJzaXZlKCJNeURvY1R5cGUxLjEuMSIsIHR5cGVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNUeXBlQnlJZFJlY3Vyc2l2ZSgiTXlEb2NUeXBlMS4xLjIiLCB0eXBlcykpOwotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlKTsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSB0eXBlLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVEZWYpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmLmdldElkKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiRm91bmQgdHlwZTogIiArIHR5cGVEZWYuZ2V0SWQoKSArICIsIGRpc3BsYXkgbmFtZSBpczogIiArIHR5cGVEZWYuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICBCYXNlIHR5cGUgaXM6ICIgKyB0eXBlRGVmLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiICBOdW1iZXIgb2YgY2hpbGRyZW4gdHlwZXMgaXM6ICIgKyB0eXBlLmdldENoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGNvbnRhaW5zQWxsQmFzZVByb3BlcnR5RGVmaW5pdGlvbnModHlwZURlZik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RHZXRTcGVjaWZpY1R5cGVMaW1pdGVkRGVwdGgoKSBmaW5pc2hlZC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlQ2hpbGRyZW4oKSB7Ci0gICAgICAgIGxvZy5pbmZvKCIiKTsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RHZXRUeXBlQ2hpbGRyZW4oKS4uLiIpOwotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gZ2V0UmVwb3NpdG9yeUlkKCk7Ci0gICAgICAgIFN0cmluZyB0eXBlSWQgPSAiTXlEb2NUeXBlMiI7Ci0KLSAgICAgICAgLy8gZ2V0IGFsbCBjaGlsZHJlbgotICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zID0gQmlnSW50ZWdlci52YWx1ZU9mKDEwMDApOwotICAgICAgICBCaWdJbnRlZ2VyIHNraXBDb3VudCA9IEJpZ0ludGVnZXIudmFsdWVPZigwKTsKLSAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IGNoaWxkcmVuID0gZlJlcFN2Yy5nZXRUeXBlQ2hpbGRyZW4ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIHRydWUsIG1heEl0ZW1zLCBza2lwQ291bnQsIG51bGwpOwotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZSA6IGNoaWxkcmVuLmdldExpc3QoKSkgewotICAgICAgICAgICAgbG9nLmluZm8oIkZvdW5kIHR5cGU6ICIgKyB0eXBlLmdldElkKCkgKyAiLCBkaXNwbGF5IG5hbWUgaXM6ICIgKyB0eXBlLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgY29udGFpbnNBbGxCYXNlUHJvcGVydHlEZWZpbml0aW9ucyh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoOSwgY2hpbGRyZW4uZ2V0TGlzdCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg5LCBjaGlsZHJlbi5nZXROdW1JdGVtcygpLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGlsZHJlbi5oYXNNb3JlSXRlbXMoKSk7Ci0KLSAgICAgICAgLy8gZ2V0IGEgY2h1bmsKLSAgICAgICAgbWF4SXRlbXMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoNSk7Ci0gICAgICAgIHNraXBDb3VudCA9IEJpZ0ludGVnZXIudmFsdWVPZigzKTsKLSAgICAgICAgY2hpbGRyZW4gPSBmUmVwU3ZjLmdldFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgdHJ1ZSwgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0KLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0eXBlIDogY2hpbGRyZW4uZ2V0TGlzdCgpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiRm91bmQgdHlwZTogIiArIHR5cGUuZ2V0SWQoKSArICIsIGRpc3BsYXkgbmFtZSBpczogIiArIHR5cGUuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICBjb250YWluc0FsbEJhc2VQcm9wZXJ0eURlZmluaXRpb25zKHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBjaGlsZHJlbi5nZXRMaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDksIGNoaWxkcmVuLmdldE51bUl0ZW1zKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hpbGRyZW4uaGFzTW9yZUl0ZW1zKCkpOwotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdEdldFR5cGVDaGlsZHJlbigpIGZpbmlzaGVkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFR5cGVDaGlsZHJlbk5vUHJvcGVydGllcygpIHsKLSAgICAgICAgbG9nLmluZm8oIiIpOwotICAgICAgICBsb2cuaW5mbygic3RhcnRpbmcgdGVzdEdldFR5cGVDaGlsZHJlbk5vUHJvcGVydGllcygpLi4uIik7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5SWQgPSBnZXRSZXBvc2l0b3J5SWQoKTsKLSAgICAgICAgU3RyaW5nIHR5cGVJZCA9ICJjbWlzOmRvY3VtZW50IjsKLQotICAgICAgICAvLyBnZXQgYWxsIGNoaWxkcmVuCi0gICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwMCk7Ci0gICAgICAgIEJpZ0ludGVnZXIgc2tpcENvdW50ID0gQmlnSW50ZWdlci52YWx1ZU9mKDApOwotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3QgY2hpbGRyZW4gPSBmUmVwU3ZjLmdldFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgbnVsbCwgbWF4SXRlbXMsIHNraXBDb3VudCwgbnVsbCk7Ci0KLSAgICAgICAgY2hpbGRyZW4gPSBmUmVwU3ZjLmdldFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgbnVsbCwgbWF4SXRlbXMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZSA6IGNoaWxkcmVuLmdldExpc3QoKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5pc0VtcHR5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8oIi4uLiB0ZXN0R2V0VHlwZUNoaWxkcmVuTm9Qcm9wZXJ0aWVzKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V3JvbmdQYXJhbWV0ZXJzKCkgewotICAgICAgICBsb2cuaW5mbygiIik7Ci0gICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0ZXN0R2V0V3JvbmdQYXJhbWV0ZXJzKCkuLi4iKTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IGdldFJlcG9zaXRvcnlJZCgpOwotICAgICAgICBTdHJpbmcgd3JvbmdSZXBvc2l0b3J5SWQgPSAiTm9uRXhpc3RhbnRSZXBvc2l0b3J5IjsKLQotICAgICAgICAvLyBnZXQgdHlwZXMKLSAgICAgICAgaW50IGRlcHRoID0gLTE7Ci0gICAgICAgIFN0cmluZyB3cm9uZ1R5cGVJZCA9ICJVbmtub3duVHlwZSI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcEluZiA9IGZSZXBTdmMuZ2V0UmVwb3NpdG9yeUluZm8od3JvbmdSZXBvc2l0b3J5SWQsIG51bGwpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRSZXBvc2l0b3J5SW5mbygpOiAiICsgcmVwSW5mKTsKLSAgICAgICAgICAgIGZhaWwoImdldFJlcG9zaXRvcnlJbmZvKCkgd2l0aCBpbGxlZ2FsIHJlcG9zaXRvcnkgaWQgc2hvdWxkIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiZ2V0UmVwb3NpdG9yeUluZm8oKSB3aXRoIGRlcHRoPT0wIHJhaXNlZCBleHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlcyA9IGZSZXBTdmMuZ2V0VHlwZURlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgIkNNSVNEb2N1bWVudCIsCi0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigwKSwgQm9vbGVhbi5UUlVFLCBudWxsKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0VHlwZURlc2NlbmRhbnRzKCk6ICIgKyB0eXBlcyk7Ci0gICAgICAgICAgICBmYWlsKCJnZXRUeXBlRGVzY2VuZGFudHMoKSB3aXRoIGRlcHRoIDAgc2hvdWxkIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiZ2V0VHlwZURlc2NlbmRhbnRzKCkgd2l0aCBkZXB0aD09MCByYWlzZWQgZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gdHlwZXMgPSBmUmVwU3ZjLmdldFR5cGVEZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIHdyb25nVHlwZUlkLAotICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoZGVwdGgpLCBCb29sZWFuLlRSVUUsIG51bGwpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRUeXBlRGVzY2VuZGFudHMoKTogIiArIHR5cGVzKTsKLSAgICAgICAgICAgIGZhaWwoImdldFR5cGVEZXNjZW5kYW50cygpIHdpdGggdW5rbm93biB0eXBlIHNob3VsZCB0aHJvdyBleGNlcHRpb24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oImdldFR5cGVEZXNjZW5kYW50cygpIHdpdGggdW5rbm93biB0eXBlIHJhaXNlZCBleHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gZlJlcFN2Yy5nZXRUeXBlRGVmaW5pdGlvbih3cm9uZ1JlcG9zaXRvcnlJZCwgIkNNSVNEb2N1bWVudCIsIG51bGwpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRUeXBlRGVmaW5pdGlvbigpOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICBmYWlsKCJnZXRUeXBlRGVmaW5pdGlvbigpIHdpdGggdW5rbm93biByZXBvc2l0b3J5IGlkIHNob3VsZCB0aHJvdyBleGNlcHRpb24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oImdldFR5cGVEZWZpbml0aW9uKCkgd2l0aCB1bmtub3duIHJlcG9zaXRvcnkgaWQgcmFpc2VkIGV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSBmUmVwU3ZjLmdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgd3JvbmdUeXBlSWQsIG51bGwpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRUeXBlRGVmaW5pdGlvbigpOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICBmYWlsKCJnZXRUeXBlRGVmaW5pdGlvbigpIHdpdGggdW5rbm93biB0eXBlIHNob3VsZCB0aHJvdyBleGNlcHRpb24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiZ2V0VHlwZURlZmluaXRpb24oKSB3aXRoIHVua25vd24gdHlwZSByYWlzZWQgZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IHR5cGVzID0gZlJlcFN2Yy5nZXRUeXBlQ2hpbGRyZW4od3JvbmdSZXBvc2l0b3J5SWQsICJDTUlTRG9jdW1lbnQiLCBCb29sZWFuLlRSVUUsCi0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxMDApLCBCaWdJbnRlZ2VyLlpFUk8sIG51bGwpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRUeXBlQ2hpbGRyZW4oKTogIiArIHR5cGVzKTsKLSAgICAgICAgICAgIGZhaWwoImdldFR5cGVEZXNjZW5kYW50cygpIHdpdGggdW5rbm93biB0eXBlIHNob3VsZCB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oImdldFR5cGVEZXNjZW5kYW50cygpIHdpdGggdW5rbm93biByZXBvc2l0b3J5IGlkIHJhaXNlZCBleHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3QgdHlwZXMgPSBmUmVwU3ZjLmdldFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHdyb25nVHlwZUlkLCBCb29sZWFuLlRSVUUsCi0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxMDApLCBCaWdJbnRlZ2VyLlpFUk8sIG51bGwpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRUeXBlQ2hpbGRyZW4oKTogIiArIHR5cGVzKTsKLSAgICAgICAgICAgIGZhaWwoImdldFR5cGVEZXNjZW5kYW50cygpIHdpdGggdW5rbm93biB0eXBlIHNob3VsZCB0aHJvdyBleGNlcHRpb24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oImdldFR5cGVEZXNjZW5kYW50cygpIHdpdGggdW5rbm93biB0eXBlIHJhaXNlZCBleHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCIuLi4gdGVzdEdldFVua25vd25UeXBlKCkgdGVzdEdldFdyb25nUGFyYW1ldGVycy4iKTsKLQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEluaGVyaXRlZFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCIiKTsKLSAgICAgICAgbG9nLmluZm8oInN0YXJ0aW5nIHRlc3RJbmhlcml0ZWRQcm9wZXJ0aWVzKCkuLi4iKTsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlJZCA9IGdldFJlcG9zaXRvcnlJZCgpOwotICAgICAgICBTdHJpbmcgdHlwZUlkID0gVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5UT1BMRVZFTF9UWVBFOwotCi0gICAgICAgIC8vIGdldCB0b3AgbGV2ZWwgdHlwZQotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlQ29udGFpbmVyID0gZlJlcFN2Yy5nZXRUeXBlRGVmaW5pdGlvbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodHlwZUNvbnRhaW5lcik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcERlZk1hcCA9IHR5cGVDb250YWluZXIuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZNYXAuY29udGFpbnNLZXkoIlN0cmluZ1Byb3BUb3BMZXZlbCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocHJvcERlZk1hcC5nZXQoIlN0cmluZ1Byb3BUb3BMZXZlbCIpLmlzSW5oZXJpdGVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwcm9wRGVmTWFwLmNvbnRhaW5zS2V5KCJTdHJpbmdQcm9wTGV2ZWwxIikpOwotICAgICAgICBhc3NlcnRGYWxzZShwcm9wRGVmTWFwLmNvbnRhaW5zS2V5KCJTdHJpbmdQcm9wTGV2ZWwyIikpOwotICAgICAgICBjb250YWluc0FsbEJhc2VQcm9wZXJ0eURlZmluaXRpb25zKHR5cGVDb250YWluZXIpOwotCi0gICAgICAgIC8vIGdldCBsZXZlbCAxIHR5cGUKLSAgICAgICAgdHlwZUlkID0gVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5MRVZFTDFfVFlQRTsKLSAgICAgICAgdHlwZUNvbnRhaW5lciA9IGZSZXBTdmMuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVDb250YWluZXIpOwotICAgICAgICBwcm9wRGVmTWFwID0gdHlwZUNvbnRhaW5lci5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgIGFzc2VydFRydWUocHJvcERlZk1hcC5jb250YWluc0tleSgiU3RyaW5nUHJvcFRvcExldmVsIikpOwotICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZNYXAuZ2V0KCJTdHJpbmdQcm9wVG9wTGV2ZWwiKS5pc0luaGVyaXRlZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmTWFwLmNvbnRhaW5zS2V5KCJTdHJpbmdQcm9wTGV2ZWwxIikpOwotICAgICAgICBhc3NlcnRGYWxzZShwcm9wRGVmTWFwLmdldCgiU3RyaW5nUHJvcExldmVsMSIpLmlzSW5oZXJpdGVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwcm9wRGVmTWFwLmNvbnRhaW5zS2V5KCJTdHJpbmdQcm9wTGV2ZWwyIikpOwotICAgICAgICBjb250YWluc0FsbEJhc2VQcm9wZXJ0eURlZmluaXRpb25zKHR5cGVDb250YWluZXIpOwotCi0gICAgICAgIC8vIGdldCBsZXZlbCAyIHR5cGUKLSAgICAgICAgdHlwZUlkID0gVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5MRVZFTDJfVFlQRTsKLSAgICAgICAgdHlwZUNvbnRhaW5lciA9IGZSZXBTdmMuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVDb250YWluZXIpOwotICAgICAgICBwcm9wRGVmTWFwID0gdHlwZUNvbnRhaW5lci5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgIGFzc2VydFRydWUocHJvcERlZk1hcC5jb250YWluc0tleSgiU3RyaW5nUHJvcFRvcExldmVsIikpOwotICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZNYXAuZ2V0KCJTdHJpbmdQcm9wVG9wTGV2ZWwiKS5pc0luaGVyaXRlZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmTWFwLmNvbnRhaW5zS2V5KCJTdHJpbmdQcm9wTGV2ZWwxIikpOwotICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZNYXAuZ2V0KCJTdHJpbmdQcm9wTGV2ZWwxIikuaXNJbmhlcml0ZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocHJvcERlZk1hcC5jb250YWluc0tleSgiU3RyaW5nUHJvcExldmVsMiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocHJvcERlZk1hcC5nZXQoIlN0cmluZ1Byb3BMZXZlbDIiKS5pc0luaGVyaXRlZCgpKTsKLSAgICAgICAgY29udGFpbnNBbGxCYXNlUHJvcGVydHlEZWZpbml0aW9ucyh0eXBlQ29udGFpbmVyKTsKLQotICAgICAgICBsb2cuaW5mbygiLi4uIHRlc3RJbmhlcml0ZWRQcm9wZXJ0aWVzKCkgZmluaXNoZWQuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVwb3NpdG9yeUlkKCkgewotICAgICAgICBMaXN0PFJlcG9zaXRvcnlJbmZvPiByZXBvc2l0b3JpZXMgPSBmUmVwU3ZjLmdldFJlcG9zaXRvcnlJbmZvcyhudWxsKTsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeSA9IHJlcG9zaXRvcmllcy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVwb3NpdG9yeSk7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldElkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVHlwZUJ5SWRSZWN1cnNpdmUoU3RyaW5nIHR5cGVJZCwgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gdHlwZXMpIHsKLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0eXBlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChjb250YWluc1R5cGVCeUlkUmVjdXJzaXZlKHR5cGVJZCwgdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVHlwZUJ5SWRSZWN1cnNpdmUoU3RyaW5nIHR5cGVJZCwgVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZUNvbnRhaW5lcikgewotICAgICAgICBpZiAodHlwZUlkLmVxdWFscyh0eXBlQ29udGFpbmVyLmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0eXBlIDogdHlwZUNvbnRhaW5lci5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICBpZiAoY29udGFpbnNUeXBlQnlJZFJlY3Vyc2l2ZSh0eXBlSWQsIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNvbnRhaW5zQWxsQmFzZVByb3BlcnR5RGVmaW5pdGlvbnMoVHlwZURlZmluaXRpb24gdHlwZURlZikgewotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BEZWZzID0gdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgIFN0cmluZyBiYXNlVHlwZUlkID0gdHlwZURlZi5nZXRCYXNlVHlwZUlkKCkudmFsdWUoKTsKLQotICAgICAgICBpZiAoIXR5cGVEZWYuZ2V0SWQoKS5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWS52YWx1ZSgpKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5OQU1FKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLk9CSkVDVF9JRCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiYXNlVHlwZUlkLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuSVNfSU1NVVRBQkxFKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuSVNfTEFURVNUX01BSk9SX1ZFUlNJT04pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RIKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fSUQpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGVJZC5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5QQVJFTlRfSUQpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFMpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuUEFUSCkpOwotICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlSWQuZXF1YWxzKEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kudmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUocHJvcERlZnMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQpKTsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZUlkLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQLnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHByb3BEZWZzLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLlNPVVJDRV9JRCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wRGVmcy5jb250YWluc0tleShQcm9wZXJ0eUlkcy5UQVJHRVRfSUQpKTsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZUlkLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfSVRFTS52YWx1ZSgpKSkgewotICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlSWQuZXF1YWxzKEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkudmFsdWUoKSkpIHsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhaWwoIlVua25vd24gYmFzZSB0eXBlIGlkIGluIHR5cGUgZGVmaW5pdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UmVjdXJzaXZlU2l6ZShMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlcykgewotICAgICAgICBpZiAobnVsbCA9PSB0eXBlcykgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2l6ZSA9IHR5cGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0eXBlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIHNpemUgKz0gZ2V0UmVjdXJzaXZlU2l6ZSh0eXBlLmdldENoaWxkcmVuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFR5cGVEZWZpbml0aW9uPiBnZXRUeXBlRGVmc0ZsYXR0ZW5lZChMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlcykgewotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiBmbGF0dGVuZWQgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb25Db250YWluZXIgdHlwZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICBmbGF0dGVuZWQuYWRkKHR5cGUuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB0eXBlLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiBjaGlsZHJlbiA9IGdldFR5cGVEZWZzRmxhdHRlbmVkKHR5cGUuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgICAgICAgICAgICAgZmxhdHRlbmVkLmFkZEFsbChjaGlsZHJlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmxhdHRlbmVkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVHlwZVZhbGlkYXRpb25UZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmNmZhOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0NvbnN0cmFpbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CaW5kaW5nc09iamVjdEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DaG9pY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SWREZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQmluZGluZ3NPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLkRvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlByb3BlcnR5Q3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZURlZmluaXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlfRE9DX1RZUEUgPSAiTXlEb2NUeXBlMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19ET0NfVFlQRSA9ICJTdHJpbmdEb2NUeXBlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1BST1BfVFlQRSA9ICJTdHJpbmdQcm9wIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX0RPQ19UWVBFID0gIkludGVnZXJEb2NUeXBlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UX1BST1BfVFlQRSA9ICJJbnRlZ2VyUHJvcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0lNQUxfRE9DX1RZUEUgPSAiRGVjaW1hbERvY1R5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNJTUFMX1BST1BfVFlQRSA9ICJEZWNpbWFsUHJvcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJQ0tfTElTVF9ET0NfVFlQRSA9ICJQaWNrTGlzdERvY1R5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSUNLX0xJU1RfUFJPUF9ERUYgPSAiUGlja0xpc3RQcm9wIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1RZUEVfU1VQRVIgPSAiU3VwZXJEb2NUeXBlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX1RZUEVfU1VCID0gIlN1YkRvY1R5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfUFJPUF9UWVBFX1NVUEVSID0gIlN0cmluZ1Byb3BTdXBlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19QUk9QX1RZUEVfU1VCID0gIlN0cmluZ1Byb3BTdWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpbmRpbmdzT2JqZWN0RmFjdG9yeSBGQUNUT1JZID0gbmV3IEJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGwoKTsKLSAgICBzdGF0aWMgVHlwZURlZmluaXRpb25GYWN0b3J5IHR5cGVGYWN0b3J5ID0gRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0VHlwZURlZmluaXRpb25GYWN0b3J5KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gY3JlYXRlUHJvcGVydGllc1dpdGhOYW1lQW5kVHlwZUlkKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCAiRG9jdW1lbnRfMSIpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKSk7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1hbmRhdG9yeVByb3BlcnR5VmFsaWRhdGlvbigpIHsKLSAgICAgICAgLy8gY3JlYXRlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIHdvdWxkIHBhc3MgdGhlbSB0byBhCi0gICAgICAgIC8vIGNyZWF0ZURvY3VtZW50IGNhbGwKLSAgICAgICAgLy8gb2YgdGhlIE9iamVjdFNlcnZpY2UKLQotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IGNyZWF0ZVByb3BlcnRpZXNXaXRoTmFtZUFuZFR5cGVJZChNWV9ET0NfVFlQRSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIHZhbGlkYXRlIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIHR5cGUKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGJ1aWxkTXlUeXBlKCk7Ci0KLSAgICAgICAgLy8gdHJ5IG1pc3NpbmcgbWFuZGF0b3J5IEJvb2xlYW4gcHJvcGVydHkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIG1hbmRhdG9yeSBwcm9wZXJ0eSBpcyBtaXNzaW5nLiIpOwotICAgICAgICB9IGNhdGNoIChDbWlzQ29uc3RyYWludEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJtYW5kYXRvcnkgcHJvcGVydGllcyBhcmUgbWlzc2luZyIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBtaXNzaW5nIG1hbmRhdG9yeSBCb29sZWFuIHByb3BlcnR5IGFuZCB0cnkgYWdhaW4KLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eUJvb2xlYW5EYXRhKCJCb29sZWFuUHJvcCIsIHRydWUpKTsKLSAgICAgICAgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnRpZXModHlwZURlZiwgcHJvcHMsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChDbWlzQ29uc3RyYWludEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUeXBlVmFsaWRhdG9yIHNob3VsZCBub3QgdGhyb3cgQ01JU0NvbnN0cmFpbnRFeGNlcHRpb24gaWYgbWFuZGF0b3J5IHByb3BlcnR5IGlzIHByZXNlbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcm9wZXJ0eVZhbGlkYXRpb24oKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBidWlsZFR5cGVXaXRoU3RyaW5nUHJvcCgpOyAvLyB3ZSBvbmx5IGhhdmUgb25lCi0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoU1RSSU5HX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoU1RSSU5HX1BST1BfVFlQRSwKLSAgICAgICAgICAgICAgICAiQSBTdHJpbmcgcHJvcGVydHkgd2l0aCBxdWl0ZSBhIGxvbmcgdmFsdWUgZXhjZWVkaW5nIHRoZSBtYXguIGxlbmd0aC4iKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIHRyeSBleGNlZWRpbmcgc3RyaW5nIGxlbmd0aAotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnRpZXModHlwZURlZiwgcHJvcHMsIHRydWUpOwotICAgICAgICAgICAgZmFpbCgiVHlwZVZhbGlkYXRvciBzaG91bGQgdGhyb3cgQ01JU0NvbnN0cmFpbnRFeGNlcHRpb24gaWYgbWF4IHN0cmluZyBsZW5ndGggaXMgZXhjZWVkZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoU1RSSU5HX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoU1RSSU5HX1BST1BfVFlQRSwgInNob3J0IHZhbCIpKTsKLSAgICAgICAgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnRpZXModHlwZURlZiwgcHJvcHMsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVHlwZVZhbGlkYXRvciBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBpZiBzdHJpbmcgbGVuZ3RoIGlzIHZhbGlkIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlclByb3BlcnR5VmFsaWRhdGlvbigpIHsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gYnVpbGRUeXBlV2l0aEludGVnZXJQcm9wKCk7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoSU5UX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eUludGVnZXJEYXRhKElOVF9QUk9QX1RZUEUsIEJpZ0ludGVnZXIudmFsdWVPZigtMTAwKSkpOyAvLyB0cnkKLSAgICAgICAgLy8gd3JvbmcKLSAgICAgICAgLy8gdmFsdWUKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IEZBQ1RPUlkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gdHJ5IGV4Y2VlZGluZyBzdHJpbmcgbGVuZ3RoCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyh0eXBlRGVmLCBwcm9wcywgdHJ1ZSk7Ci0gICAgICAgICAgICBmYWlsKCJUeXBlVmFsaWRhdG9yIHNob3VsZCB0aHJvdyBDTUlTQ29uc3RyYWludEV4Y2VwdGlvbiBpZiBpbnRlZ2VyIHZhbHVlIGlzIG91dCBvZiByYW5nZSIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydGllcyA9IGNyZWF0ZVByb3BlcnRpZXNXaXRoTmFtZUFuZFR5cGVJZChJTlRfRE9DX1RZUEUpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChGQUNUT1JZLmNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEoSU5UX1BST1BfVFlQRSwgQmlnSW50ZWdlci52YWx1ZU9mKDEpKSk7IC8vIHRyeQotICAgICAgICAvLyBjb3JyZWN0Ci0gICAgICAgIC8vIHZhbHVlCi0gICAgICAgIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIG5vdCB0aHJvdyBleGNlcHRpb24gaWYgaW50ZWdlciB2YWx1ZSBpcyB2YWxpZC4gIiArIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsUHJvcGVydHlWYWxpZGF0aW9uKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gYnVpbGRUeXBlV2l0aERlY2ltYWxQcm9wKCk7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoREVDSU1BTF9ET0NfVFlQRSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlEZWNpbWFsRGF0YShERUNJTUFMX1BST1BfVFlQRSwgQmlnRGVjaW1hbC52YWx1ZU9mKC0xMS4xMSkpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IEZBQ1RPUlkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgLy8gdHJ5IGV4Y2VlZGluZyBzdHJpbmcgbGVuZ3RoCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyh0eXBlRGVmLCBwcm9wcywgdHJ1ZSk7Ci0gICAgICAgICAgICBmYWlsKCJUeXBlVmFsaWRhdG9yIHNob3VsZCB0aHJvdyBDTUlTQ29uc3RyYWludEV4Y2VwdGlvbiBpZiBkZWNpbWFsIHZhbHVlIGlzIG91dCBvZiByYW5nZSIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydGllcyA9IGNyZWF0ZVByb3BlcnRpZXNXaXRoTmFtZUFuZFR5cGVJZChERUNJTUFMX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eURlY2ltYWxEYXRhKERFQ0lNQUxfUFJPUF9UWVBFLCBCaWdEZWNpbWFsLnZhbHVlT2YoMS4yMykpKTsKLSAgICAgICAgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnRpZXModHlwZURlZiwgcHJvcHMsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVHlwZVZhbGlkYXRvciBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBpZiBkZWNpbWFsIHZhbHVlIGlzIHZhbGlkLiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrTGlzdFZhbGlkYXRpb25TaW5nbGVWYWx1ZSgpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGJ1aWxkVHlwZVdpdGhQaWNrTGlzdChDYXJkaW5hbGl0eS5TSU5HTEUpOwotCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gY3JlYXRlUHJvcGVydGllc1dpdGhOYW1lQW5kVHlwZUlkKFBJQ0tfTElTVF9ET0NfVFlQRSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFBJQ0tfTElTVF9QUk9QX0RFRiwgInBpbmsiKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIHRyeSB3cm9uZyB2YWx1ZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnRpZXModHlwZURlZiwgcHJvcHMsIHRydWUpOwotICAgICAgICAgICAgZmFpbCgiVHlwZVZhbGlkYXRvciBzaG91bGQgdGhyb3cgQ01JU0NvbnN0cmFpbnRFeGNlcHRpb24gaWYgY2hvaWNlIHZhbHVlIGlzIG5vdCBpbiBsaXN0IG9mIHZhbGlkIHZhbHVlcyIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvcGVydGllcyA9IGNyZWF0ZVByb3BlcnRpZXNXaXRoTmFtZUFuZFR5cGVJZChQSUNLX0xJU1RfRE9DX1RZUEUpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChGQUNUT1JZLmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQSUNLX0xJU1RfUFJPUF9ERUYsICJibHVlIikpOwotICAgICAgICBwcm9wcyA9IEZBQ1RPUlkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIG5vdCB0aHJvdyBDTUlTQ29uc3RyYWludEV4Y2VwdGlvbiBpZiBjaG9pY2UgdmFsdWUgaXMgaW4gbGlzdCBvZiB2YWxpZCB2YWx1ZXMiCi0gICAgICAgICAgICAgICAgICAgICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaWNrTGlzdFZhbGlkYXRpb25NdWx0aVZhbHVlKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gYnVpbGRUeXBlV2l0aFBpY2tMaXN0KENhcmRpbmFsaXR5Lk1VTFRJKTsKLQotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IGNyZWF0ZVByb3BlcnRpZXNXaXRoTmFtZUFuZFR5cGVJZChQSUNLX0xJU1RfRE9DX1RZUEUpOwotICAgICAgICBMaXN0PFN0cmluZz4gcHJvcFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcm9wVmFsdWVzLmFkZCgicmVkIik7Ci0gICAgICAgIHByb3BWYWx1ZXMuYWRkKCJwaW5rIik7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFBJQ0tfTElTVF9QUk9QX0RFRiwgcHJvcFZhbHVlcykpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyB0cnkgd3JvbmcgdmFsdWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIGNob2ljZSB2YWx1ZSBpcyBub3QgaW4gbGlzdCBvZiB2YWxpZCB2YWx1ZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoUElDS19MSVNUX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcm9wVmFsdWVzLmFkZCgicmVkIik7Ci0gICAgICAgIHByb3BWYWx1ZXMuYWRkKCJncmVlbiIpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChGQUNUT1JZLmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQSUNLX0xJU1RfUFJPUF9ERUYsIHByb3BWYWx1ZXMpKTsKLSAgICAgICAgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnRpZXModHlwZURlZiwgcHJvcHMsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVHlwZVZhbGlkYXRvciBzaG91bGQgbm90IHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIGNob2ljZSB2YWx1ZSBpcyBpbiBsaXN0IG9mIHZhbGlkIHZhbHVlcyIKLSAgICAgICAgICAgICAgICAgICAgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBpY2tMaXN0VmFsaWRhdGlvbk11bHRpVXNpbmdNdWx0aXBsZVZhbHVlTGlzdHMoKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBidWlsZFR5cGVXaXRoTXVsdGlQaWNrTGlzdCgpOwotCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gY3JlYXRlUHJvcGVydGllc1dpdGhOYW1lQW5kVHlwZUlkKFBJQ0tfTElTVF9ET0NfVFlQRSk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BWYWx1ZXMuYWRkKCJyZWQiKTsKLSAgICAgICAgcHJvcFZhbHVlcy5hZGQoImdyZWVuIik7Ci0gICAgICAgIHByb3BWYWx1ZXMuYWRkKCJwaW5rIik7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFBJQ0tfTElTVF9QUk9QX0RFRiwgcHJvcFZhbHVlcykpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyB0cnkgd3JvbmcgdmFsdWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIGNob2ljZSB2YWx1ZSBpcyBub3QgaW4gbGlzdCBvZiB2YWxpZCB2YWx1ZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoUElDS19MSVNUX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcm9wVmFsdWVzLmFkZCgicmVkIik7Ci0gICAgICAgIHByb3BWYWx1ZXMuYWRkKCJncmVlbiIpOwotICAgICAgICBwcm9wVmFsdWVzLmFkZCgiYmx1ZSIpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChGQUNUT1JZLmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQSUNLX0xJU1RfUFJPUF9ERUYsIHByb3BWYWx1ZXMpKTsKLSAgICAgICAgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyh0eXBlRGVmLCBwcm9wcywgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUeXBlVmFsaWRhdG9yIHNob3VsZCBub3QgdGhyb3cgQ01JU0NvbnN0cmFpbnRFeGNlcHRpb24gaWYgY2hvaWNlIHZhbHVlIGlzIGluIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIgotICAgICAgICAgICAgICAgICAgICArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGllcmFjaGljYWxQaWNrTGlzdFZhbGlkYXRpb25TaW5nbGVWYWx1ZSgpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGJ1aWxkVHlwZVdpdGhIaWVyYWNoaWNhbFBpY2tMaXN0KENhcmRpbmFsaXR5LlNJTkdMRSk7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoUElDS19MSVNUX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUElDS19MSVNUX1BST1BfREVGLCAiZnJhbmtmdXJ0IikpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyB0cnkgd3JvbmcgdmFsdWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIGNob2ljZSB2YWx1ZSBpcyBub3QgaW4gbGlzdCBvZiB2YWxpZCB2YWx1ZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoUElDS19MSVNUX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUElDS19MSVNUX1BST1BfREVGLCAibXVuaWNoIikpOwotICAgICAgICBwcm9wcyA9IEZBQ1RPUlkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIG5vdCB0aHJvdyBDTUlTQ29uc3RyYWludEV4Y2VwdGlvbiBpZiBjaG9pY2UgdmFsdWUgaXMgaW4gbGlzdCBvZiB2YWxpZCB2YWx1ZXMiCi0gICAgICAgICAgICAgICAgICAgICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIaWVyYWNoaWNhbFBpY2tMaXN0VmFsaWRhdGlvbk11bHRpVmFsdWUoKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBidWlsZFR5cGVXaXRoSGllcmFjaGljYWxQaWNrTGlzdChDYXJkaW5hbGl0eS5NVUxUSSk7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoUElDS19MSVNUX0RPQ19UWVBFKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb3BWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvcFZhbHVlcy5hZGQoInN0dXR0Z2FydCIpOwotICAgICAgICBwcm9wVmFsdWVzLmFkZCgiaGludGVydHVwZmluZ2VuIik7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFBJQ0tfTElTVF9QUk9QX0RFRiwgcHJvcFZhbHVlcykpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyB0cnkgd3JvbmcgdmFsdWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGVEZWYsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIGNob2ljZSB2YWx1ZSBpcyBub3QgaW4gbGlzdCBvZiB2YWxpZCB2YWx1ZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoUElDS19MSVNUX0RPQ19UWVBFKTsKLSAgICAgICAgcHJvcFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBwcm9wVmFsdWVzLmFkZCgibXVuaWNoIik7Ci0gICAgICAgIHByb3BWYWx1ZXMuYWRkKCJ3YWxsZG9yZiIpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChGQUNUT1JZLmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShQSUNLX0xJU1RfUFJPUF9ERUYsIHByb3BWYWx1ZXMpKTsKLSAgICAgICAgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyh0eXBlRGVmLCBwcm9wcywgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUeXBlVmFsaWRhdG9yIHNob3VsZCBub3QgdGhyb3cgQ01JU0NvbnN0cmFpbnRFeGNlcHRpb24gaWYgY2hvaWNlIHZhbHVlIGlzIGluIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIgotICAgICAgICAgICAgICAgICAgICArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkUHJvcGVydHlWYWxpZGF0aW9uKCkgewotICAgICAgICBUeXBlTWFuYWdlciB0bSA9IGJ1aWxkSW5oZXJpdGVkVHlwZXMoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gc3VwZXJUeXBlID0gdG0uZ2V0VHlwZUJ5SWQoRE9DX1RZUEVfU1VQRVIpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHN1YlR5cGUgPSB0bS5nZXRUeXBlQnlJZChET0NfVFlQRV9TVUIpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoRE9DX1RZUEVfU1VCKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoU1RSSU5HX1BST1BfVFlQRV9TVUIsCi0gICAgICAgICAgICAgICAgIkEgU3RyaW5nIHByb3BlcnR5IHdpdGggcXVpdGUgYSBsb25nIHZhbHVlIGV4Y2VlZGluZyB0aGUgbWF4LiBsZW5ndGguIikpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyB0cnkgZXhjZWVkaW5nIHN0cmluZyBsZW5ndGggb24gb3JnIHByb3BlcnR5Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyhzdXBlclR5cGUsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIG1heCBzdHJpbmcgbGVuZ3RoIGlzIGV4Y2VlZGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0cnkgZXhjZWVkaW5nIHN0cmluZyBsZW5ndGggb24gaW5oZXJpdGVkIHByb3BlcnR5Ci0gICAgICAgIHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aE5hbWVBbmRUeXBlSWQoRE9DX1RZUEVfU1VCKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoU1RSSU5HX1BST1BfVFlQRV9TVVBFUiwKLSAgICAgICAgICAgICAgICAiQSBTdHJpbmcgcHJvcGVydHkgd2l0aCBxdWl0ZSBhIGxvbmcgdmFsdWUgZXhjZWVkaW5nIHRoZSBtYXguIGxlbmd0aC4iKSk7Ci0gICAgICAgIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyB0cnkgZXhjZWVkaW5nIHN0cmluZyBsZW5ndGgKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKHN1YlR5cGUsIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIG1heCBzdHJpbmcgbGVuZ3RoIGlzIGV4Y2VlZGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wZXJ0aWVzID0gY3JlYXRlUHJvcGVydGllc1dpdGhOYW1lQW5kVHlwZUlkKERPQ19UWVBFX1NVQik7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFNUUklOR19QUk9QX1RZUEVfU1VQRVIsICJzdXBlciB2YWwiKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFNUUklOR19QUk9QX1RZUEVfU1VCLCAic3ViIHZhbCIpKTsKLSAgICAgICAgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHlwZVZhbGlkYXRvci52YWxpZGF0ZVByb3BlcnRpZXMoc3ViVHlwZSwgcHJvcHMsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVHlwZVZhbGlkYXRvciBzaG91bGQgbm90IHRocm93IGV4Y2VwdGlvbiBpZiBzdHJpbmcgbGVuZ3RoIGlzIHZhbGlkIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsUHJvcGVydGllc0tub3duKCkgewotCi0gICAgICAgIFN0cmluZyB1bmtub3duUHJvcGVydHlJZCA9ICJVbmtub3duUHJvcGVydHkiOwotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IGNyZWF0ZVByb3BlcnRpZXNXaXRoTmFtZUFuZFR5cGVJZChNWV9ET0NfVFlQRSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YSgiQm9vbGVhblByb3AiLCB0cnVlKSk7Ci0gICAgICAgIC8vIGFkZCB1bmtub3duIHByb3BlcnR5Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKHVua25vd25Qcm9wZXJ0eUlkLCAiU29tZVZhbHVlIikpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gRkFDVE9SWS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLyB2YWxpZGF0ZSBwcm9wZXJ0aWVzIGFjY29yZGluZyB0byB0eXBlCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSBidWlsZE15VHlwZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlVmFsaWRhdG9yLnZhbGlkYXRlUHJvcGVydGllcyh0eXBlRGVmLCBwcm9wcywgdHJ1ZSk7Ci0gICAgICAgICAgICBmYWlsKCJUeXBlVmFsaWRhdG9yIHNob3VsZCB0aHJvdyBDTUlTQ29uc3RyYWludEV4Y2VwdGlvbiBpZiBwcm9wZXJ0eSBpcyBub3Qga25vd24gaW4gdHlwZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiVW5rbm93biBwcm9wZXJ0eSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnModW5rbm93blByb3BlcnR5SWQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFsbFByb3BlcnRpZXNLbm93blNlY29uZGFyeVR5cGVzKCkgewotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHByaW1hcnlUeXBlID0gYnVpbGRUeXBlV2l0aFN0cmluZ1Byb3AoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gc2Vjb25kYXJ5VHlwZTEgPSBidWlsZFR5cGVXaXRoSW50ZWdlclByb3AoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gc2Vjb25kYXJ5VHlwZTIgPSBidWlsZFR5cGVXaXRoRGVjaW1hbFByb3AoKTsKLQotICAgICAgICBTdHJpbmcgdW5rbm93blByb3BlcnR5SWQgPSAiVW5rbm93blByb3BlcnR5IjsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBjcmVhdGVQcm9wZXJ0aWVzV2l0aFNlY29uZGFyeVR5cGVzKE1ZX0RPQ19UWVBFLAotICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoSU5UX0RPQ19UWVBFLCBERUNJTUFMX0RPQ19UWVBFKSk7Ci0KLSAgICAgICAgLy8gYWRkIHVua25vd24gcHJvcGVydHkKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEodW5rbm93blByb3BlcnR5SWQsICJTb21lVmFsdWUiKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBGQUNUT1JZLmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vIHZhbGlkYXRlIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIHR5cGUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVWYWxpZGF0b3IudmFsaWRhdGVQcm9wZXJ0aWVzKEFycmF5cy5hc0xpc3QocHJpbWFyeVR5cGUsIHNlY29uZGFyeVR5cGUxLCBzZWNvbmRhcnlUeXBlMiksIHByb3BzLCB0cnVlKTsKLSAgICAgICAgICAgIGZhaWwoIlR5cGVWYWxpZGF0b3Igc2hvdWxkIHRocm93IENNSVNDb25zdHJhaW50RXhjZXB0aW9uIGlmIHByb3BlcnR5IGlzIG5vdCBrbm93biBpbiB0eXBlLiIpOwotICAgICAgICB9IGNhdGNoIChDbWlzQ29uc3RyYWludEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJwcm9wZXJ0aWVzIGFyZSBub3Qga25vd24gaW4gYW55IG9mIHRoZSB0eXBlcyIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnModW5rbm93blByb3BlcnR5SWQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBjcmVhdGVQcm9wZXJ0aWVzV2l0aFNlY29uZGFyeVR5cGVzKFN0cmluZyB0eXBlSWRQcmltYXJ5LAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNlY29uZGFyeVR5cGVJZHMpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCAiRG9jdW1lbnRfMSIpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkUHJpbWFyeSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChGQUNUT1JZLmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBzZWNvbmRhcnlUeXBlSWRzKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YSgiQm9vbGVhblByb3AiLCB0cnVlKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKEZBQ1RPUlkuY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YShJTlRfUFJPUF9UWVBFLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoRkFDVE9SWS5jcmVhdGVQcm9wZXJ0eURlY2ltYWxEYXRhKERFQ0lNQUxfUFJPUF9UWVBFLCBCaWdEZWNpbWFsLnZhbHVlT2YoMC41KSkpOwotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgc2FtcGxlIHR5cGUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHR5cGUgZGVmaW5pdGlvbiBvZiBzYW1wbGUgdHlwZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50VHlwZURlZmluaXRpb24gYnVpbGRNeVR5cGUoKSB7Ci0gICAgICAgIC8vIGFsd2F5cyBhZGQgQ01JUyBkZWZhdWx0IHR5cGVzCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNUeXBlOwotICAgICAgICAgICAgY21pc1R5cGUgPSAoTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwgTVlfRE9DX1RZUEUpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGlzcGxheU5hbWUoIkRvY3VtZW50IFR5cGUgZm9yIFZhbGlkYXRpb24iKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgTVlfRE9DX1RZUEUpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBib29sZWFuIHByb3BlcnR5IGRlZmluaXRpb24KLQotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPEJvb2xlYW4+IHByb3AgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKCJCb29sZWFuUHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgQm9vbGVhbiBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSBwcm9wKS5zZXRJc1JlcXVpcmVkKHRydWUpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3ApOwotCi0gICAgICAgICAgICBwcm9wID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVCb29sZWFuTXVsdGlEZWZpbml0aW9uKCJCb29sZWFuUHJvcE1WIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBCb29sZWFuIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wKTsKLQotICAgICAgICAgICAgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsIHByb3AyID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVEYXRlVGltZURlZmluaXRpb24oIkRhdGVUaW1lUHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgRGF0ZVRpbWUgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AyKTsKLQotICAgICAgICAgICAgcHJvcDIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZURhdGVUaW1lTXVsdGlEZWZpbml0aW9uKCJEYXRlVGltZVByb3BNViIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgRGF0ZVRpbWUgbXVsdGktdmFsdWUgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AyKTsKLQotICAgICAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwgcHJvcDMgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZURlY2ltYWxEZWZpbml0aW9uKCJEZWNpbWFsUHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgRGVjaW1hbCBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDMpOwotCi0gICAgICAgICAgICBwcm9wMyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlRGVjaW1hbERlZmluaXRpb24oIkRlY2ltYWxQcm9wTVYiLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIERlY2ltYWwgbXVsdGktdmFsdWUgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AzKTsKLQotICAgICAgICAgICAgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwgcHJvcDQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUh0bWxEZWZpbml0aW9uKCJIdG1sUHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgSHRtbCBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDQpOwotCi0gICAgICAgICAgICBwcm9wNCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSHRtbERlZmluaXRpb24oIkh0bWxQcm9wTVYiLCAiU2FtcGxlIEh0bWwgbXVsdGktdmFsdWUgUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A0KTsKLQotICAgICAgICAgICAgUHJvcGVydHlJZERlZmluaXRpb25JbXBsIHByb3A1ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVJZERlZmluaXRpb24oIklkUHJvcCIsICJTYW1wbGUgSWQgUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A1KTsKLQotICAgICAgICAgICAgcHJvcDUgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUlkRGVmaW5pdGlvbigiSWRQcm9wTVYiLCAiU2FtcGxlIElkIEh0bWwgbXVsdGktdmFsdWUgUHJvcGVydHkiLAotICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A1KTsKLQotICAgICAgICAgICAgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwgcHJvcDYgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKCJJbnRQcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBJbnQgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A2KTsKLQotICAgICAgICAgICAgcHJvcDYgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUludGVnZXJEZWZpbml0aW9uKCJJbnRQcm9wTVYiLCAiU2FtcGxlIEludCBtdWx0aS12YWx1ZSBQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDYpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3A3ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKCJTdHJpbmdQcm9wIiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A3KTsKLQotICAgICAgICAgICAgUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCBwcm9wOCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlVXJpRGVmaW5pdGlvbigiVXJpUHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgVXJpIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wOCk7Ci0KLSAgICAgICAgICAgIHByb3A4ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVVcmlEZWZpbml0aW9uKCJVcmlQcm9wTVYiLCAiU2FtcGxlIFVyaSBtdWx0aS12YWx1ZSBQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDgpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3A5ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFBJQ0tfTElTVF9QUk9QX0RFRiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBQaWNrIExpc3QgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmFkZEVsZW1Ub1BpY2tsaXN0KHByb3A5LCAicmVkIik7Ci0gICAgICAgICAgICBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmFkZEVsZW1Ub1BpY2tsaXN0KHByb3A5LCAiZ3JlZW4iKTsKLSAgICAgICAgICAgIFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuYWRkRWxlbVRvUGlja2xpc3QocHJvcDksICJibHVlIik7Ci0gICAgICAgICAgICBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmFkZEVsZW1Ub1BpY2tsaXN0KHByb3A5LCAiYmxhY2siKTsKLSAgICAgICAgICAgIFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuc2V0RGVmYXVsdFZhbHVlKHByb3A5LCAiYmx1ZSIpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A5KTsKLQotICAgICAgICAgICAgcmV0dXJuIGNtaXNUeXBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIGNyZWF0aW5nIGJ1aWx0LWluIEluTWVtb3J5IHR5cGVzLiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBidWlsZFR5cGVXaXRoU3RyaW5nUHJvcCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNUeXBlOwotICAgICAgICAgICAgY21pc1R5cGUgPSAoTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwgU1RSSU5HX0RPQ19UWVBFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERpc3BsYXlOYW1lKCJTdHJpbmcgRG9jdW1lbnQgVHlwZSBmb3IgVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGVzY3JpcHRpb24oIkluTWVtb3J5IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBTVFJJTkdfRE9DX1RZUEUpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wRGVmID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFNUUklOR19QUk9QX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgU3RyaW5nIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIHByb3BEZWYuc2V0TWF4TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZigxMCkpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotCi0gICAgICAgICAgICByZXR1cm4gY21pc1R5cGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gY3JlYXRpbmcgYnVpbHQtaW4gSW5NZW1vcnkgdHlwZXMuIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudFR5cGVEZWZpbml0aW9uIGJ1aWxkVHlwZVdpdGhJbnRlZ2VyUHJvcCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNUeXBlOwotICAgICAgICAgICAgY21pc1R5cGUgPSAoTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwgSU5UX0RPQ19UWVBFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERpc3BsYXlOYW1lKCJJbnQgRG9jdW1lbnQgVHlwZSBmb3IgVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGVzY3JpcHRpb24oIkluTWVtb3J5IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBJTlRfRE9DX1RZUEUpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotCi0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wRGVmID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVJbnRlZ2VyRGVmaW5pdGlvbihJTlRfUFJPUF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIEludGVnZXIgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgcHJvcERlZi5zZXRNaW5WYWx1ZShCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpKTsKLSAgICAgICAgICAgIHByb3BEZWYuc2V0TWF4VmFsdWUoQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNtaXNUeXBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIGNyZWF0aW5nIGJ1aWx0LWluIEluTWVtb3J5IHR5cGVzLiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBidWlsZFR5cGVXaXRoRGVjaW1hbFByb3AoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTsKLSAgICAgICAgICAgIGNtaXNUeXBlID0gKE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRG9jdW1lbnRUeXBlKCksIERFQ0lNQUxfRE9DX1RZUEUpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGlzcGxheU5hbWUoIkRlY2ltYWwgVHlwZSBmb3IgVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGVzY3JpcHRpb24oIkluTWVtb3J5IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBERUNJTUFMX0RPQ19UWVBFKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgU3RyaW5nIHByb3BlcnR5IGRlZmluaXRpb24KLQotICAgICAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwgcHJvcERlZiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlRGVjaW1hbERlZmluaXRpb24oREVDSU1BTF9QUk9QX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgRGVjaW1hbCBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBwcm9wRGVmLnNldE1pblZhbHVlKEJpZ0RlY2ltYWwudmFsdWVPZigtMS41KSk7Ci0gICAgICAgICAgICBwcm9wRGVmLnNldE1heFZhbHVlKEJpZ0RlY2ltYWwudmFsdWVPZigxLjUpKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNtaXNUeXBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIGNyZWF0aW5nIGJ1aWx0LWluIEluTWVtb3J5IHR5cGVzLiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGVEZWZpbml0aW9uIGJ1aWxkVHlwZVdpdGhQaWNrTGlzdChDYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY21pc1R5cGU7Ci0gICAgICAgICAgICBjbWlzVHlwZSA9IChNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLCBQSUNLX0xJU1RfRE9DX1RZUEUpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGlzcGxheU5hbWUoIlBpY2tMaXN0IFR5cGUgZm9yIFZhbGlkYXRpb24iKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERlc2NyaXB0aW9uKCJJbk1lbW9yeSB0ZXN0IHR5cGUgZGVmaW5pdGlvbiAiICsgUElDS19MSVNUX0RPQ19UWVBFKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgU3RyaW5nIHByb3BlcnR5IGRlZmluaXRpb24KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcERlZiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQSUNLX0xJU1RfUFJPUF9ERUYsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgUGlja0xpc3QgKGNob2ljZSkgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgTGlzdDxDaG9pY2U8U3RyaW5nPj4gY2hvaWNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2hvaWNlPFN0cmluZz4+KCk7Ci0gICAgICAgICAgICBDaG9pY2VJbXBsPFN0cmluZz4gZWxlbSA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGVsZW0uc2V0VmFsdWUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgicmVkIikpOwotICAgICAgICAgICAgZWxlbS5zZXREaXNwbGF5TmFtZSgiUmVkIik7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0LmFkZChlbGVtKTsKLSAgICAgICAgICAgIGVsZW0gPSBuZXcgQ2hvaWNlSW1wbDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBlbGVtLnNldFZhbHVlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImdyZWVuIikpOwotICAgICAgICAgICAgZWxlbS5zZXREaXNwbGF5TmFtZSgiR3JlZW4iKTsKLSAgICAgICAgICAgIGNob2ljZUxpc3QuYWRkKGVsZW0pOwotICAgICAgICAgICAgZWxlbSA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGVsZW0uc2V0VmFsdWUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiYmx1ZSIpKTsKLSAgICAgICAgICAgIGVsZW0uc2V0RGlzcGxheU5hbWUoIkJsdWUiKTsKLSAgICAgICAgICAgIGNob2ljZUxpc3QuYWRkKGVsZW0pOwotICAgICAgICAgICAgZWxlbSA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGVsZW0uc2V0VmFsdWUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiYmxhY2siKSk7Ci0gICAgICAgICAgICBlbGVtLnNldERpc3BsYXlOYW1lKCJCbGFjayIpOwotICAgICAgICAgICAgY2hvaWNlTGlzdC5hZGQoZWxlbSk7Ci0gICAgICAgICAgICBwcm9wRGVmLnNldENob2ljZXMoY2hvaWNlTGlzdCk7Ci0gICAgICAgICAgICBwcm9wRGVmLnNldERlZmF1bHRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJibHVlIikpOwotICAgICAgICAgICAgcHJvcERlZi5zZXRDYXJkaW5hbGl0eShjYXJkaW5hbGl0eSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcERlZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBjbWlzVHlwZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBjcmVhdGluZyBidWlsdC1pbiBJbk1lbW9yeSB0eXBlcy4iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBidWlsZFR5cGVXaXRoTXVsdGlQaWNrTGlzdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNUeXBlOwotICAgICAgICAgICAgY21pc1R5cGUgPSAoTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwgUElDS19MSVNUX0RPQ19UWVBFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERpc3BsYXlOYW1lKCJNRG9jdW1lbnQgVHlwZSBmb3IgVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGVzY3JpcHRpb24oIlBpY2tMaXN0IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBQSUNLX0xJU1RfRE9DX1RZUEUpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wRGVmID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFBJQ0tfTElTVF9QUk9QX0RFRiwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBQaWNrTGlzdCAoY2hvaWNlKSBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBMaXN0PENob2ljZTxTdHJpbmc+PiBjaG9pY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8U3RyaW5nPj4oKTsKLSAgICAgICAgICAgIENob2ljZUltcGw8U3RyaW5nPiBlbGVtID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCgicmVkIik7Ci0gICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKCJncmVlbiIpOwotICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCgiYmx1ZSIpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZSh2YWx1ZUxpc3QpOwotICAgICAgICAgICAgZWxlbS5zZXREaXNwbGF5TmFtZSgiUkdCIik7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0LmFkZChlbGVtKTsKLQotICAgICAgICAgICAgZWxlbSA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgICAgIHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCgiY3lhbiIpOwotICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCgibWFnZW50YSIpOwotICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCgieWVsbG93Iik7Ci0gICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKCJibGFjayIpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZSh2YWx1ZUxpc3QpOwotICAgICAgICAgICAgZWxlbS5zZXREaXNwbGF5TmFtZSgiQ01ZSyIpOwotICAgICAgICAgICAgY2hvaWNlTGlzdC5hZGQoZWxlbSk7Ci0KLSAgICAgICAgICAgIHByb3BEZWYuc2V0Q2hvaWNlcyhjaG9pY2VMaXN0KTsKLSAgICAgICAgICAgIC8vIHByb3BEZWYuc2V0RGVmYXVsdFZhbHVlKC4uLik7Ci0gICAgICAgICAgICBwcm9wRGVmLnNldENhcmRpbmFsaXR5KENhcmRpbmFsaXR5Lk1VTFRJKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNtaXNUeXBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIGNyZWF0aW5nIGJ1aWx0LWluIEluTWVtb3J5IHR5cGVzLiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGVEZWZpbml0aW9uIGJ1aWxkVHlwZVdpdGhIaWVyYWNoaWNhbFBpY2tMaXN0KENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTsKLSAgICAgICAgICAgIGNtaXNUeXBlID0gKE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRG9jdW1lbnRUeXBlKCksIFBJQ0tfTElTVF9ET0NfVFlQRSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5zZXREaXNwbGF5TmFtZSgiUGlja0xpc3QgVHlwZSBmb3IgVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgY21pc1R5cGUuc2V0RGVzY3JpcHRpb24oIkluTWVtb3J5IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBQSUNLX0xJU1RfRE9DX1RZUEUpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBTdHJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbgotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSB0d28tbGV2ZWwgcGljayBsaXN0IHdpdGggYW4gb3V0ZXIgcHJvcGVydHkgbGlzdCBzdGF0ZQotICAgICAgICAgICAgLy8gYW5kIGFuCi0gICAgICAgICAgICAvLyBpbm5lcgotICAgICAgICAgICAgLy8gbGlzdCBvZiBjaXR5Ci0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3BEZWYgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUElDS19MSVNUX1BST1BfREVGLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIFBpY2tMaXN0IChjaG9pY2UpIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIExpc3Q8Q2hvaWNlPFN0cmluZz4+IGNob2ljZUxpc3RPdXRlciA9IG5ldyBBcnJheUxpc3Q8Q2hvaWNlPFN0cmluZz4+KCk7Ci0KLSAgICAgICAgICAgIENob2ljZUltcGw8U3RyaW5nPiBlbGVtT3V0ZXIgPSBuZXcgQ2hvaWNlSW1wbDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBlbGVtT3V0ZXIuc2V0RGlzcGxheU5hbWUoIkJhdmFyaWEiKTsKLSAgICAgICAgICAgIExpc3Q8Q2hvaWNlPFN0cmluZz4+IGNob2ljZUxpc3RJbm5lciA9IG5ldyBBcnJheUxpc3Q8Q2hvaWNlPFN0cmluZz4+KCk7Ci0gICAgICAgICAgICBDaG9pY2VJbXBsPFN0cmluZz4gZWxlbUlubmVyID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbUlubmVyLnNldERpc3BsYXlOYW1lKCJNdW5pY2giKTsKLSAgICAgICAgICAgIGVsZW1Jbm5lci5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJtdW5pY2giKSk7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0SW5uZXIuYWRkKGVsZW1Jbm5lcik7Ci0gICAgICAgICAgICBlbGVtSW5uZXIgPSBuZXcgQ2hvaWNlSW1wbDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBlbGVtSW5uZXIuc2V0RGlzcGxheU5hbWUoIkluZ29sc3RhZHQiKTsKLSAgICAgICAgICAgIGVsZW1Jbm5lci5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJpbmdvbHN0YWR0IikpOwotICAgICAgICAgICAgY2hvaWNlTGlzdElubmVyLmFkZChlbGVtSW5uZXIpOwotICAgICAgICAgICAgZWxlbUlubmVyID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbUlubmVyLnNldERpc3BsYXlOYW1lKCJQYXNzYXUiKTsKLSAgICAgICAgICAgIGVsZW1Jbm5lci5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJwYXNzYXUiKSk7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0SW5uZXIuYWRkKGVsZW1Jbm5lcik7Ci0gICAgICAgICAgICBlbGVtT3V0ZXIuc2V0Q2hvaWNlKGNob2ljZUxpc3RJbm5lcik7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0T3V0ZXIuYWRkKGVsZW1PdXRlcik7Ci0KLSAgICAgICAgICAgIGVsZW1PdXRlciA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGVsZW1PdXRlci5zZXREaXNwbGF5TmFtZSgiQmFkZW4gV3VydGVtYmVyZyIpOwotICAgICAgICAgICAgY2hvaWNlTGlzdElubmVyID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8U3RyaW5nPj4oKTsKLSAgICAgICAgICAgIGVsZW1Jbm5lciA9IG5ldyBDaG9pY2VJbXBsPFN0cmluZz4oKTsKLSAgICAgICAgICAgIGVsZW1Jbm5lci5zZXREaXNwbGF5TmFtZSgiU3R1dHRnYXJ0Iik7Ci0gICAgICAgICAgICBlbGVtSW5uZXIuc2V0VmFsdWUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgic3R1dHRnYXJ0IikpOwotICAgICAgICAgICAgY2hvaWNlTGlzdElubmVyLmFkZChlbGVtSW5uZXIpOwotICAgICAgICAgICAgZWxlbUlubmVyID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbUlubmVyLnNldERpc3BsYXlOYW1lKCJLYXJsc3J1aGUiKTsKLSAgICAgICAgICAgIGVsZW1Jbm5lci5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJrYXJsc3J1aGUiKSk7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0SW5uZXIuYWRkKGVsZW1Jbm5lcik7Ci0gICAgICAgICAgICBlbGVtSW5uZXIgPSBuZXcgQ2hvaWNlSW1wbDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBlbGVtSW5uZXIuc2V0RGlzcGxheU5hbWUoIldhbGxkb3JmIik7Ci0gICAgICAgICAgICBlbGVtSW5uZXIuc2V0VmFsdWUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgid2FsbGRvcmYiKSk7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0SW5uZXIuYWRkKGVsZW1Jbm5lcik7Ci0gICAgICAgICAgICBlbGVtT3V0ZXIuc2V0Q2hvaWNlKGNob2ljZUxpc3RJbm5lcik7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0T3V0ZXIuYWRkKGVsZW1PdXRlcik7Ci0KLSAgICAgICAgICAgIHByb3BEZWYuc2V0Q2hvaWNlcyhjaG9pY2VMaXN0T3V0ZXIpOwotICAgICAgICAgICAgcHJvcERlZi5zZXRDYXJkaW5hbGl0eShjYXJkaW5hbGl0eSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcERlZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBjbWlzVHlwZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBjcmVhdGluZyBidWlsdC1pbiBJbk1lbW9yeSB0eXBlcy4iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFR5cGVNYW5hZ2VyIGJ1aWxkSW5oZXJpdGVkVHlwZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIFR5cGVNYW5hZ2VySW1wbCB0bSA9IG5ldyBUeXBlTWFuYWdlckltcGwoKTsKLSAgICAgICAgICAgIHRtLmluaXRUeXBlU3lzdGVtKG51bGwsIHRydWUpOyAvLyBjcmVhdGUgQ01JUyBkZWZhdWx0IHR5cGVzCi0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBzdXBlciB0eXBlCi0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzU3VwZXJUeXBlOwotICAgICAgICAgICAgY21pc1N1cGVyVHlwZSA9IChNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLCBET0NfVFlQRV9TVVBFUik7Ci0gICAgICAgICAgICBjbWlzU3VwZXJUeXBlLnNldERpc3BsYXlOYW1lKCJEb2N1bWVudCBUeXBlIFdpdGggYSBjaGlsZCIpOwotICAgICAgICAgICAgY21pc1N1cGVyVHlwZS5zZXREZXNjcmlwdGlvbigiSW5NZW1vcnkgdGVzdCB0eXBlIGRlZmluaXRpb24gIiArIERPQ19UWVBFX1NVUEVSKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgU3RyaW5nIHByb3BlcnR5IGRlZmluaXRpb24KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcERlZiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgU1RSSU5HX1BST1BfVFlQRV9TVVBFUiwgIlNhbXBsZSBTdHJpbmcgUHJvcGVydHkgU3VwZXJUeXBlIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIHByb3BEZWYuc2V0TWF4TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZigxMCkpOwotICAgICAgICAgICAgY21pc1N1cGVyVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcERlZik7Ci0KLSAgICAgICAgICAgIHRtLmFkZFR5cGVEZWZpbml0aW9uKGNtaXNTdXBlclR5cGUsIGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIHN1YiB0eXBlCi0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzU3ViVHlwZTsKLSAgICAgICAgICAgIGNtaXNTdWJUeXBlID0gKE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNTdXBlclR5cGUsCi0gICAgICAgICAgICAgICAgICAgIERPQ19UWVBFX1NVQik7Ci0gICAgICAgICAgICBjbWlzU3ViVHlwZS5zZXREaXNwbGF5TmFtZSgiRG9jdW1lbnQgVHlwZSBXaXRoIGEgcGFyZW50Iik7Ci0gICAgICAgICAgICBjbWlzU3ViVHlwZS5zZXREZXNjcmlwdGlvbigiSW5NZW1vcnkgdGVzdCB0eXBlIGRlZmluaXRpb24gIiArIERPQ19UWVBFX1NVQik7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uCi0gICAgICAgICAgICBwcm9wRGVmID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFNUUklOR19QUk9QX1RZUEVfU1VCLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIFN0cmluZyBQcm9wZXJ0eSBTdWJ0eXBlIiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIHByb3BEZWYuc2V0TWF4TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZigyMCkpOwotICAgICAgICAgICAgY21pc1N1YlR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotCi0gICAgICAgICAgICB0bS5hZGRUeXBlRGVmaW5pdGlvbihjbWlzU3ViVHlwZSwgZmFsc2UpOwotCi0gICAgICAgICAgICByZXR1cm4gdG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gY3JlYXRpbmcgYnVpbHQtaW4gSW5NZW1vcnkgdHlwZXMuIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L1VuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L1VuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBhOTJjMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9Vbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkNob2ljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZUZvbGRlclR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNob2ljZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLkRvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlByb3BlcnR5Q3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZURlZmluaXRpb25GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvciBpbXBsZW1lbnRzIFR5cGVDcmVhdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRF9QSUNLX0xJU1QgPSAiUGlja0xpc3RQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VHlwZURlZmluaXRpb24+IHNpbmdsZXRvblR5cGVzID0gYnVpbGRUeXBlc0xpc3QoKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QTEVYX1RZUEUgPSAiQ29tcGxleFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUExFVkVMX1RZUEUgPSAiRG9jdW1lbnRUb3BMZXZlbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUwxX1RZUEUgPSAiRG9jdW1lbnRMZXZlbDEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMMl9UWVBFID0gIkRvY3VtZW50TGV2ZWwyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9ORURfVFlQRSA9ICJNeVZlcnNpb25lZFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fUFJPUEVSVFlfSUQgPSAiU3RyaW5nUHJvcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX1RZUEUgPSAiRm9sZGVyVHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1RZUEUgPSAiTXlTZWNvbmRhcnlUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfVFlQRV8yID0gIk15U2Vjb25kYXJ5VHlwZTIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRF9CT09MRUFOID0gIkJvb2xlYW5Qcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX0RBVEVUSU1FID0gIkRhdGVUaW1lUHJvcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRF9ERUNJTUFMID0gIkRlY2ltYWxQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX0hUTUwgPSAiSHRtbFByb3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSURfSUQgPSAiSWRQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX0lOVCA9ICJJbnRQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX1NUUklORyA9ICJTdHJpbmdQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX1VSSSA9ICJVcmlQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX0JPT0xFQU5fTVVMVElfVkFMVUUgPSAiQm9vbGVhblByb3BNViI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRF9EQVRFVElNRV9NVUxUSV9WQUxVRSA9ICJEYXRlVGltZVByb3BNViI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRF9ERUNJTUFMX01VTFRJX1ZBTFVFID0gIkRlY2ltYWxQcm9wTVYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSURfSFRNTF9NVUxUSV9WQUxVRSA9ICJIdG1sUHJvcE1WIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX0lEX01VTFRJX1ZBTFVFID0gIklkUHJvcE1WIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEX0lOVF9NVUxUSV9WQUxVRSA9ICJJbnRQcm9wTVYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSURfU1RSSU5HX01VTFRJX1ZBTFVFID0gIlN0cmluZ1Byb3BNViI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JRF9VUklfTVVMVElfVkFMVUUgPSAiVXJpUHJvcE1WIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfU1RSSU5HX1BST1AgPSAiU2Vjb25kYXJ5U3RyaW5nUHJvcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX0lOVEVHRVJfUFJPUCA9ICJTZWNvbmRhcnlJbnRlZ2VyUHJvcCI7Ci0KLSAgICAvKioKLSAgICAgKiBpbiB0aGUgcHVibGljIGludGVyZmFjZSBvZiB0aGlzIGNsYXNzIHdlIHJldHVybiB0aGUgc2luZ2xldG9uIGNvbnRhaW5pbmcKLSAgICAgKiB0aGUgcmVxdWlyZWQgdHlwZXMgZm9yIHRlc3RpbmcKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbj4gY3JlYXRlVHlwZXNMaXN0KCkgewotICAgICAgICByZXR1cm4gc2luZ2xldG9uVHlwZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFR5cGVEZWZpbml0aW9uPiBnZXRUeXBlc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b25UeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVCeUlkKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0eXBlRGVmIDogc2luZ2xldG9uVHlwZXMpIHsKLSAgICAgICAgICAgIGlmICh0eXBlRGVmLmdldElkKCkuZXF1YWxzKHR5cGVJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZURlZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgcm9vdCB0eXBlcyBhbmQgYSBjb2xsZWN0aW9uIG9mIHNhbXBsZSB0eXBlcwotICAgICAqIAotICAgICAqIEByZXR1cm4gdHlwZXNNYXAgbWFwIGZpbGxlZCB3aXRoIGNyZWF0ZWQgdHlwZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFR5cGVEZWZpbml0aW9uPiBidWlsZFR5cGVzTGlzdCgpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25GYWN0b3J5IHR5cGVGYWN0b3J5ID0gRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0VHlwZURlZmluaXRpb25GYWN0b3J5KCk7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHR5cGVzTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUxOwotICAgICAgICAgICAgY21pc1R5cGUxID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRG9jdW1lbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIExFVkVMMV9UWVBFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMS5zZXREaXNwbGF5TmFtZSgiRG9jdW1lbnQgdHlwZSB3aXRoIGluaGVyaXRlZCBwcm9wZXJ0aWVzLCBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTEuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uICIgKyBMRVZFTDFfVFlQRSk7Ci0KLSAgICAgICAgICAgIGNtaXNUeXBlMSA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiTXlEb2NUeXBlMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxLnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDEgTGV2ZWwgMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUxIik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMSk7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTI7Ci0gICAgICAgICAgICBjbWlzVHlwZTIgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk15RG9jVHlwZTIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMi5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAyIExldmVsIDEiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMi5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMiIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTIpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUxMTsKLSAgICAgICAgICAgIGNtaXNUeXBlMTEgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMSwgIk15RG9jVHlwZTEuMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxMS5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAzIExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMTEuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTEuMSIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTExKTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMTExOwotICAgICAgICAgICAgY21pc1R5cGUxMTEgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMTEsICJNeURvY1R5cGUxLjEuMSIpOwotICAgICAgICAgICAgY21pc1R5cGUxMTEuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgNCBMZXZlbCAzIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTExMS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMS4xLjEiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUxMTEpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUxMTI7Ci0gICAgICAgICAgICBjbWlzVHlwZTExMiA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUxMSwgIk15RG9jVHlwZTEuMS4yIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTExMi5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSA1IExldmVsIDMiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMTEyLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUxLjEuMiIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTExMik7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTEyOwotICAgICAgICAgICAgY21pc1R5cGUxMiA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUxLCAiTXlEb2NUeXBlMS4yIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTEyLnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDYgTGV2ZWwgMiIpOwotICAgICAgICAgICAgY21pc1R5cGUxMi5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMS4yIik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMTIpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUyMTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjEgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMiwgIk15RG9jVHlwZTIuMSIpOwotICAgICAgICAgICAgY21pc1R5cGUyMS5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSA3IExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjEuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTIuMSIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTIxKTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMjI7Ci0gICAgICAgICAgICBjbWlzVHlwZTIyID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzVHlwZTIsICJNeURvY1R5cGUyLjIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjIuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgOCBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTIyLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUyLjIiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUyMik7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTIzOwotICAgICAgICAgICAgY21pc1R5cGUyMyA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUyLCAiTXlEb2NUeXBlMi4zIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTIzLnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDkgTGV2ZWwgMiIpOwotICAgICAgICAgICAgY21pc1R5cGUyMy5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMi4zIik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMjMpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUyNDsKLSAgICAgICAgICAgIGNtaXNUeXBlMjQgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMiwgIk15RG9jVHlwZTIuNCIpOwotICAgICAgICAgICAgY21pc1R5cGUyNC5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAxMCBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI0LnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUyLjQiKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUyNCk7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTI1OwotICAgICAgICAgICAgY21pc1R5cGUyNSA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUyLCAiTXlEb2NUeXBlMi41Iik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI1LnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDExIExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjUuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTIuNSIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTI1KTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMjY7Ci0gICAgICAgICAgICBjbWlzVHlwZTI2ID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzVHlwZTIsICJNeURvY1R5cGUyLjYiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjYuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgMTIgTGV2ZWwgMiIpOwotICAgICAgICAgICAgY21pc1R5cGUyNi5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMi42Iik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMjYpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc1R5cGUyNzsKLSAgICAgICAgICAgIGNtaXNUeXBlMjcgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNUeXBlMiwgIk15RG9jVHlwZTIuNyIpOwotICAgICAgICAgICAgY21pc1R5cGUyNy5zZXREaXNwbGF5TmFtZSgiTXkgVHlwZSAxMyBMZXZlbCAyIik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI3LnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiBNeURvY1R5cGUyLjciKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1R5cGUyNyk7Ci0KLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTI4OwotICAgICAgICAgICAgY21pc1R5cGUyOCA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc1R5cGUyLCAiTXlEb2NUeXBlMi44Iik7Ci0gICAgICAgICAgICBjbWlzVHlwZTI4LnNldERpc3BsYXlOYW1lKCJNeSBUeXBlIDE0IExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjguc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uIE15RG9jVHlwZTIuOCIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVHlwZTI4KTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNUeXBlMjk7Ci0gICAgICAgICAgICBjbWlzVHlwZTI5ID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihjbWlzVHlwZTIsICJNeURvY1R5cGUyLjkiKTsKLSAgICAgICAgICAgIGNtaXNUeXBlMjkuc2V0RGlzcGxheU5hbWUoIk15IFR5cGUgMTUgTGV2ZWwgMiIpOwotICAgICAgICAgICAgY21pc1R5cGUyOS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gTXlEb2NUeXBlMi45Iik7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNUeXBlMjkpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBjb21wbGV4IHR5cGUgd2l0aCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjbWlzQ29tcGxleFR5cGU7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUgPSB0eXBlRmFjdG9yeS5jcmVhdGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLCBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLnNldElkKENPTVBMRVhfVFlQRSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuc2V0RGlzcGxheU5hbWUoIkNvbXBsZXggdHlwZSB3aXRoIHByb3BlcnRpZXMsIExldmVsIDEiKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gQ29tcGxleFR5cGUiKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgYm9vbGVhbiBwcm9wZXJ0eSBkZWZpbml0aW9uCi0KLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjxCb29sZWFuPiBwcm9wID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVCb29sZWFuRGVmaW5pdGlvbihQUk9QX0lEX0JPT0xFQU4sCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgQm9vbGVhbiBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3ApOwotCi0gICAgICAgICAgICBwcm9wID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVCb29sZWFuTXVsdGlEZWZpbml0aW9uKFBST1BfSURfQk9PTEVBTl9NVUxUSV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBCb29sZWFuIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcCk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCBwcm9wMiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlRGF0ZVRpbWVEZWZpbml0aW9uKFBST1BfSURfREFURVRJTUUsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgRGF0ZVRpbWUgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMik7Ci0KLSAgICAgICAgICAgIHByb3AyID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVEYXRlVGltZU11bHRpRGVmaW5pdGlvbihQUk9QX0lEX0RBVEVUSU1FX01VTFRJX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIERhdGVUaW1lIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDIpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCBwcm9wMyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlRGVjaW1hbERlZmluaXRpb24oUFJPUF9JRF9ERUNJTUFMLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIERlY2ltYWwgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMyk7Ci0KLSAgICAgICAgICAgIHByb3AzID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVEZWNpbWFsTXVsdGlEZWZpbml0aW9uKFBST1BfSURfREVDSU1BTF9NVUxUSV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBEZWNpbWFsIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDMpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCBwcm9wNCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSHRtbERlZmluaXRpb24oUFJPUF9JRF9IVE1MLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIEh0bWwgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wNCk7Ci0KLSAgICAgICAgICAgIHByb3A0ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVIdG1sTXVsdGlEZWZpbml0aW9uKFBST1BfSURfSFRNTF9NVUxUSV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBIdG1sIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDQpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwgcHJvcDUgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUlkRGVmaW5pdGlvbihQUk9QX0lEX0lELAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIElkIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDUpOwotCi0gICAgICAgICAgICBwcm9wNSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSWRNdWx0aURlZmluaXRpb24oUFJPUF9JRF9JRF9NVUxUSV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBJZCBIdG1sIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDUpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wNiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlckRlZmluaXRpb24oUFJPUF9JRF9JTlQsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgSW50IFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDYpOwotCi0gICAgICAgICAgICBwcm9wNiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlck11bHRpRGVmaW5pdGlvbihQUk9QX0lEX0lOVF9NVUxUSV9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBJbnQgbXVsdGktdmFsdWUgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wNik7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcDcgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oUFJPUF9JRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgU3RyaW5nIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDcpOwotCi0gICAgICAgICAgICBwcm9wNyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nTXVsdGlEZWZpbml0aW9uKFBST1BfSURfU1RSSU5HX01VTFRJX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIFN0cmluZyBtdWx0aS12YWx1ZSBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3A3KTsKLQotICAgICAgICAgICAgUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCBwcm9wOCA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlVXJpRGVmaW5pdGlvbihQUk9QX0lEX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBVcmkgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFkpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wOCk7Ci0KLSAgICAgICAgICAgIHByb3A4ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVVcmlNdWx0aURlZmluaXRpb24oUFJPUF9JRF9VUklfTVVMVElfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgVXJpIG11bHRpLXZhbHVlIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDgpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3A5ID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFBST1BfSURfUElDS19MSVNULAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIFBpY2sgTGlzdCBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBMaXN0PENob2ljZTxTdHJpbmc+PiBjaG9pY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxDaG9pY2U8U3RyaW5nPj4oKTsKLSAgICAgICAgICAgIENob2ljZUltcGw8U3RyaW5nPiBlbGVtID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJyZWQiKSk7Ci0gICAgICAgICAgICBjaG9pY2VMaXN0LmFkZChlbGVtKTsKLSAgICAgICAgICAgIGVsZW0gPSBuZXcgQ2hvaWNlSW1wbDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBlbGVtLnNldFZhbHVlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImdyZWVuIikpOwotICAgICAgICAgICAgY2hvaWNlTGlzdC5hZGQoZWxlbSk7Ci0gICAgICAgICAgICBlbGVtID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJibHVlIikpOwotICAgICAgICAgICAgY2hvaWNlTGlzdC5hZGQoZWxlbSk7Ci0gICAgICAgICAgICBlbGVtID0gbmV3IENob2ljZUltcGw8U3RyaW5nPigpOwotICAgICAgICAgICAgZWxlbS5zZXRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJibGFjayIpKTsKLSAgICAgICAgICAgIGNob2ljZUxpc3QuYWRkKGVsZW0pOwotICAgICAgICAgICAgcHJvcDkuc2V0Q2hvaWNlcyhjaG9pY2VMaXN0KTsKLSAgICAgICAgICAgIHByb3A5LnNldERlZmF1bHRWYWx1ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJibHVlIikpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wOSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0eXBlIHRvIHR5cGVzIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc0NvbXBsZXhUeXBlKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdHlwZSBoaWVyYXJjaHkgd2l0aCBpbmhlcml0ZWQgcHJvcGVydGllcwotICAgICAgICAgICAgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY21pc0RvY1R5cGVUb3BMZXZlbDsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlVG9wTGV2ZWwgPSB0eXBlRmFjdG9yeS5jcmVhdGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRG9jdW1lbnRUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZVRvcExldmVsLnNldElkKFRPUExFVkVMX1RZUEUpOwotICAgICAgICAgICAgY21pc0RvY1R5cGVUb3BMZXZlbC5zZXREaXNwbGF5TmFtZSgiRG9jdW1lbnQgdHlwZSB3aXRoIHByb3BlcnRpZXMsIExldmVsIDEiKTsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlVG9wTGV2ZWwuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uICIgKyBUT1BMRVZFTF9UWVBFKTsKLQotICAgICAgICAgICAgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNtaXNEb2NUeXBlTGV2ZWwxOwotICAgICAgICAgICAgY21pc0RvY1R5cGVMZXZlbDEgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGNtaXNEb2NUeXBlVG9wTGV2ZWwsIExFVkVMMV9UWVBFKTsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlTGV2ZWwxLnNldERpc3BsYXlOYW1lKCJEb2N1bWVudCB0eXBlIHdpdGggaW5oZXJpdGVkIHByb3BlcnRpZXMsIExldmVsIDIiKTsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlTGV2ZWwxLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiAiICsgTEVWRUwxX1RZUEUpOwotCi0gICAgICAgICAgICBNdXRhYmxlVHlwZURlZmluaXRpb24gY21pc0RvY1R5cGVMZXZlbDI7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZUxldmVsMiA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oY21pc0RvY1R5cGVMZXZlbDEsIExFVkVMMl9UWVBFKTsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlTGV2ZWwyLnNldERpc3BsYXlOYW1lKCJEb2N1bWVudCB0eXBlIHdpdGggaW5oZXJpdGVkIHByb3BlcnRpZXMsIExldmVsIDMiKTsKLSAgICAgICAgICAgIGNtaXNEb2NUeXBlTGV2ZWwyLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiAiICsgTEVWRUwyX1RZUEUpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3BUb3AgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oIlN0cmluZ1Byb3BUb3BMZXZlbCIsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgU3RyaW5nIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZVRvcExldmVsLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wVG9wKTsKLQotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wTGV2ZWwxID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKCJTdHJpbmdQcm9wTGV2ZWwxIiwKLSAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBQcm9wZXJ0eSBMZXZlbCAxIiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzRG9jVHlwZUxldmVsMS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcExldmVsMSk7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwgcHJvcExldmVsMiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbigiU3RyaW5nUHJvcExldmVsMiIsCi0gICAgICAgICAgICAgICAgICAgICJTdHJpbmcgUHJvcGVydHkgTGV2ZWwgMiIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgY21pc0RvY1R5cGVMZXZlbDIuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3BMZXZlbDIpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSB2ZXJzaW9uZWQgdHlwZSB3aXRoIHByb3BlcnRpZXMKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNWZXJzaW9uZWRUeXBlOwotICAgICAgICAgICAgY21pc1ZlcnNpb25lZFR5cGUgPSAoTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwgVkVSU0lPTkVEX1RZUEUpOwotICAgICAgICAgICAgY21pc1ZlcnNpb25lZFR5cGUuc2V0RGlzcGxheU5hbWUoIlZlcnNpb25lZCBUeXBlIik7Ci0gICAgICAgICAgICBjbWlzVmVyc2lvbmVkVHlwZS5zZXREZXNjcmlwdGlvbigiQnVpbHRpbiBJbk1lbW9yeSB0eXBlIGRlZmluaXRpb24gIiArIFZFUlNJT05FRF9UWVBFKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uZWRUeXBlLnNldElzVmVyc2lvbmFibGUodHJ1ZSk7IC8vIG1ha2UgaXQgYSB2ZXJzaW9uYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlIFN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3AxID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFZFUlNJT05fUFJPUEVSVFlfSUQsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgU3RyaW5nIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LldIRU5DSEVDS0VET1VUKTsKLSAgICAgICAgICAgIGNtaXNWZXJzaW9uZWRUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0eXBlIHRvIHR5cGVzIGNvbGxlY3Rpb24KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgZm9sZGVyIHR5cGUKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSB3aXRoIHByb3BlcnRpZXMKLSAgICAgICAgICAgIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBjbWlzRm9sZGVyVHlwZTsKLSAgICAgICAgICAgIGNtaXNGb2xkZXJUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlRm9sZGVyVHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24uQ01JU18xXzEsIERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDbWlzRm9sZGVyVHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc0ZvbGRlclR5cGUuc2V0SWQoRk9MREVSX1RZUEUpOwotICAgICAgICAgICAgY21pc0ZvbGRlclR5cGUuc2V0RGlzcGxheU5hbWUoIkZvbGRlciB0eXBlIHdpdGggcHJvcGVydGllcyIpOwotICAgICAgICAgICAgY21pc0ZvbGRlclR5cGUuc2V0RGVzY3JpcHRpb24oIkluTWVtb3J5IHRlc3QgdHlwZSBkZWZpbml0aW9uICIgKyBGT0xERVJfVFlQRSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHR3byBwcm9wZXJ0eSBkZWZpbml0aW9ucyBmb3IgZm9sZGVyCi0gICAgICAgICAgICBwcm9wNiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlckRlZmluaXRpb24oUFJPUF9JRF9JTlQsICJTYW1wbGUgRm9sZGVyIEludCBQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSk7Ci0gICAgICAgICAgICBjbWlzRm9sZGVyVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDYpOwotCi0gICAgICAgICAgICBwcm9wNyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQUk9QX0lEX1NUUklORywgIlNhbXBsZSBGb2xkZXIgU3RyaW5nIFByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURPTkxZKTsKLSAgICAgICAgICAgIGNtaXNGb2xkZXJUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wNyk7Ci0KLSAgICAgICAgICAgIC8vIENNSVMgMS4xIGNyZWF0ZSBhIHNlY29uZGFyeSB0eXBlCi0gICAgICAgICAgICBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gY21pc1NlY29uZGFyeVR5cGU7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzU2Vjb25kYXJ5VHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuc2V0SWQoU0VDT05EQVJZX1RZUEUpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuc2V0RGlzcGxheU5hbWUoIk15U2Vjb25kYXJ5VHlwZSIpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUuc2V0RGVzY3JpcHRpb24oIkJ1aWx0aW4gSW5NZW1vcnkgdHlwZSBkZWZpbml0aW9uICIgKyBTRUNPTkRBUllfVFlQRSk7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5zZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhjbWlzU2Vjb25kYXJ5VHlwZSk7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZS5zZXRJc0ZpbGVhYmxlKGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlIFN0cmluZyBwcm9wZXJ0eSBkZWZpbml0aW9uCi0gICAgICAgICAgICBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsIHByb3BTMSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihTRUNPTkRBUllfU1RSSU5HX1BST1AsCi0gICAgICAgICAgICAgICAgICAgICJTZWNvbmRhcnkgU3RyaW5nIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcFMxKTsKLSAgICAgICAgICAgIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsIHByb3BTMiA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlckRlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFNFQ09OREFSWV9JTlRFR0VSX1BST1AsICJTZWNvbmRhcnkgSW50ZWdlciBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotICAgICAgICAgICAgcHJvcFMyLnNldElzUmVxdWlyZWQodHJ1ZSk7Ci0gICAgICAgICAgICBjbWlzU2Vjb25kYXJ5VHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcFMyKTsKLQotICAgICAgICAgICAgTXV0YWJsZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uIGNtaXNTZWNvbmRhcnlUeXBlMjsKLSAgICAgICAgICAgIGNtaXNTZWNvbmRhcnlUeXBlMiA9IHR5cGVGYWN0b3J5LmNyZWF0ZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uLkNNSVNfMV8xLAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzU2Vjb25kYXJ5VHlwZSgpLmdldElkKCkpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUyLnNldElkKFNFQ09OREFSWV9UWVBFXzIpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUyLnNldERpc3BsYXlOYW1lKCJNeVNlY29uZGFyeVR5cGUtMiIpOwotICAgICAgICAgICAgY21pc1NlY29uZGFyeVR5cGUyLnNldERlc2NyaXB0aW9uKCJCdWlsdGluIEluTWVtb3J5IHR5cGUgZGVmaW5pdGlvbiAiICsgU0VDT05EQVJZX1RZUEVfMik7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5zZXREZWZhdWx0VHlwZUNhcGFiaWxpdGllcyhjbWlzU2Vjb25kYXJ5VHlwZTIpOwotCi0gICAgICAgICAgICAvLyBhZGQgdHlwZSB0byB0eXBlcyBjb2xsZWN0aW8KLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc0RvY1R5cGVUb3BMZXZlbCk7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNEb2NUeXBlTGV2ZWwxKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc0RvY1R5cGVMZXZlbDIpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzVmVyc2lvbmVkVHlwZSk7Ci0gICAgICAgICAgICB0eXBlc0xpc3QuYWRkKGNtaXNGb2xkZXJUeXBlKTsKLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc1NlY29uZGFyeVR5cGUpOwotICAgICAgICAgICAgdHlwZXNMaXN0LmFkZChjbWlzU2Vjb25kYXJ5VHlwZTIpOwotICAgICAgICAgICAgcmV0dXJuIHR5cGVzTGlzdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBjcmVhdGluZyBidWlsdC1pbiBJbk1lbW9yeSB0eXBlcy4iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVmVyc2lvblRlc3RUeXBlU3lzdGVtQ3JlYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVmVyc2lvblRlc3RUeXBlU3lzdGVtQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDZmZDA4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L1ZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5Eb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5Qcm9wZXJ0eUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVEZWZpbml0aW9uRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IgaW1wbGVtZW50cyBUeXBlQ3JlYXRvciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9URVNUX0RPQ1VNRU5UX1RZUEVfSUQgPSAiTXlWZXJzaW9uZWRUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JRCA9ICJTdHJpbmdQcm9wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VHlwZURlZmluaXRpb24+IHNpbmdsZXRvblR5cGVzID0gYnVpbGRUeXBlc0xpc3QoKTsKLQotICAgIC8qKgotICAgICAqIGluIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoaXMgY2xhc3Mgd2UgcmV0dXJuIHRoZSBzaW5nbGV0b24gY29udGFpbmluZwotICAgICAqIHRoZSByZXF1aXJlZCB0eXBlcyBmb3IgdGVzdGluZwotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uPiBjcmVhdGVUeXBlc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBzaW5nbGV0b25UeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8VHlwZURlZmluaXRpb24+IGdldFR5cGVzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvblR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZUJ5SWQoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgOiBzaW5nbGV0b25UeXBlcykgewotICAgICAgICAgICAgaWYgKHR5cGVEZWYuZ2V0SWQoKS5lcXVhbHModHlwZUlkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlRGVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSByb290IHR5cGVzIGFuZCBhIGNvbGxlY3Rpb24gb2Ygc2FtcGxlIHR5cGVzCi0gICAgICogCi0gICAgICogQHJldHVybiB0eXBlc01hcCBtYXAgZmlsbGVkIHdpdGggY3JlYXRlZCB0eXBlcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VHlwZURlZmluaXRpb24+IGJ1aWxkVHlwZXNMaXN0KCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdHlwZUZhY3RvcnkgPSBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKTsKLSAgICAgICAgLy8gYWx3YXlzIGFkZCBDTUlTIGRlZmF1bHQgdHlwZXMKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gdHlwZXNMaXN0ID0gbmV3IExpbmtlZExpc3Q8VHlwZURlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSB3aXRoIHByb3BlcnRpZXMKLSAgICAgICAgICAgIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIGNtaXNDb21wbGV4VHlwZTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZSA9IChNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLCBWRVJTSU9OX1RFU1RfRE9DVU1FTlRfVFlQRV9JRCk7Ci0gICAgICAgICAgICBjbWlzQ29tcGxleFR5cGUuc2V0RGlzcGxheU5hbWUoIlZlcnNpb25lZFR5cGUiKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5zZXREZXNjcmlwdGlvbigiSW5NZW1vcnkgdGVzdCB0eXBlIGRlZmluaXRpb24gIiArIFZFUlNJT05fVEVTVF9ET0NVTUVOVF9UWVBFX0lEKTsKLSAgICAgICAgICAgIGNtaXNDb21wbGV4VHlwZS5zZXRJc1ZlcnNpb25hYmxlKHRydWUpOyAvLyBtYWtlIGl0IGEgdmVyc2lvbmFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgYSBib29sZWFuIHByb3BlcnR5IGRlZmluaXRpb24KLQotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCBwcm9wMSA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihQUk9QRVJUWV9JRCwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBTdHJpbmcgUHJvcGVydHkiLCBVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQpOwotICAgICAgICAgICAgY21pc0NvbXBsZXhUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0eXBlIHRvIHR5cGVzIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIHR5cGVzTGlzdC5hZGQoY21pc0NvbXBsZXhUeXBlKTsKLQotICAgICAgICAgICAgcmV0dXJuIHR5cGVzTGlzdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBjcmVhdGluZyB0eXBlcy4iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVmVyc2lvbmluZ1Rlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L1ZlcnNpb25pbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTg1MWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvVmVyc2lvbmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUJvb2xlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0U2VydmljZVRlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPYmplY3RTZXJ2aWNlVGVzdC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVkFMVUUgPSAiTWlja2V5IE1vdXNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WQUxVRV9ORVcgPSAiRG9uYWxkIER1Y2siOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX05BTUUgPSAiTXkgVmVyc2lvbmVkIERvY3VtZW50IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ORVdfTkFNRSA9ICJNeSBSZW5hbWVkIFZlcnNpb25lZCBEb2N1bWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVVNFUiA9ICJUZXN0VXNlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVVNFUl8yID0gIk90aGVyVXNlciI7Ci0KLSAgICBPYmplY3RDcmVhdG9yIGZDcmVhdG9yOwotCi0gICAgQE92ZXJyaWRlCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBzdXBlci5zZXRUeXBlQ3JlYXRvckNsYXNzKFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgZkNyZWF0b3IgPSBuZXcgT2JqZWN0Q3JlYXRvcihmRmFjdG9yeSwgZk9ialN2YywgZlJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHNldFJ1bnRpbWVDb250ZXh0KFRFU1RfVVNFUik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVDb250ZXh0KFN0cmluZyB1c2VyKSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRHVtbXlDYWxsQ29udGV4dCBjdHggPSBuZXcgRHVtbXlDYWxsQ29udGV4dCgpOwotICAgICAgICAgKiBjdHgucHV0KENhbGxDb250ZXh0LlVTRVJOQU1FLCB1c2VyKTsgLy8gQXR0YWNoIHRoZSBDYWxsQ29udGV4dCB0byBhCi0gICAgICAgICAqIHRocmVhZCBsb2NhbCBjb250ZXh0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20gZXZlcnl3aGVyZQotICAgICAgICAgKiBSdW50aW1lQ29udGV4dC5hdHRhY2hDZmcoY3R4KTsKLSAgICAgICAgICovCi0gICAgICAgICgoRHVtbXlDYWxsQ29udGV4dCkgZlRlc3RDYWxsQ29udGV4dCkucHV0KENhbGxDb250ZXh0LlVTRVJOQU1FLCB1c2VyKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVWZXJzaW9uZWREb2N1bWVudE1pbm9yKCkgewotICAgICAgICBjcmVhdGVWZXJzaW9uZWREb2N1bWVudChWZXJzaW9uaW5nU3RhdGUuTUlOT1IpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVZlcnNpb25lZERvY3VtZW50Q2hlY2tlZE91dCgpIHsKLSAgICAgICAgY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoVmVyc2lvbmluZ1N0YXRlLkNIRUNLRURPVVQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVZlcnNpb25lZERvY3VtZW50Tm9uZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZVZlcnNpb25lZERvY3VtZW50KFZlcnNpb25pbmdTdGF0ZS5OT05FKTsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0aW5nIGEgZG9jdW1lbnQgb2YgYSB2ZXJzaW9uYWJsZSB0eXBlIHdpdGggc3RhdGUgVmVyc2lvbmluZ1N0YXRlLk5PTkUgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24uY2xhc3MsIGUuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja091dEJhc2ljKCkgewotICAgICAgICBTdHJpbmcgdmVySWQgPSBjcmVhdGVEb2N1bWVudChQUk9QX05BTUUsIGZSb290Rm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZS5NQUpPUik7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSB2ZXJzaW9uID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgdmVySWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKHZlcklkLCB2ZXJzaW9uLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG51bGwgIT0gZG9jSWQgJiYgZG9jSWQubGVuZ3RoKCkgPiAwKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpc0NoZWNrZWRPdXQodmVyc2lvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpKSk7Ci0KLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KHZlcklkKTsgLy8gb3Igc2hvdWxkIHRoaXMKLSAgICAgICAgLy8gYmUgdmVyc2lvbgotICAgICAgICAvLyBzZXJpZXM/Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotICAgICAgICBTdHJpbmcgcHdjSWQgPSBpZEhvbGRlci5nZXRWYWx1ZSgpOwotICAgICAgICAvLyB0ZXN0IHRoYXQgb2JqZWN0IGlzIGNoZWNrZWQgb3V0IGFuZCB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBzZXQKLSAgICAgICAgLy8gY29ycmVjdGx5Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmT2JqU3ZjLmdldFByb3BlcnRpZXMoZlJlcG9zaXRvcnlJZCwgcHdjSWQsICIqIiwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBjaGFuZ2VUb2tlbiA9IChTdHJpbmcpIHByb3BzLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGNoZWNrVmVyc2lvblByb3BlcnRpZXMocHdjSWQsIFZlcnNpb25pbmdTdGF0ZS5DSEVDS0VET1VULCBwcm9wcy5nZXRQcm9wZXJ0aWVzKCksIG51bGwpOwotCi0gICAgICAgIC8vIFRlc3QgdGhhdCBhIHNlY29uZCBjaGVja291dCBpcyBub3QgcG9zc2libGUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotICAgICAgICAgICAgZmFpbCgiQ2hlY2tpbmcgb3V0IGEgZG9jdW1lbnQgdGhhdCBpcyBhbHJlYWR5IGNoZWNrZWQtb3V0IHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyB2ZXJzaW9uIGFuZCB2ZXJzaW9uIHNlcmllcyBzaG91bGQgYmUgY2hlY2tlZCBvdXQgbm93Ci0gICAgICAgIC8vIGFzc2VydFRydWUoaXNDaGVja2VkT3V0KGRvY0lkKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNDaGVja2VkT3V0KHB3Y0lkKSk7Ci0KLSAgICAgICAgLy8gU2V0IGEgbmV3IGNvbnRlbnQgYW5kIG1vZGlmeSBwcm9wZXJ0eQotICAgICAgICBDb250ZW50U3RyZWFtIGFsdENvbnRlbnQgPSBmQ3JlYXRvci5jcmVhdGVBbHRlcm5hdGVDb250ZW50KCk7Ci0gICAgICAgIGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KHB3Y0lkKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gdG9rZW5Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oY2hhbmdlVG9rZW4pOwotICAgICAgICBmT2JqU3ZjLnNldENvbnRlbnRTdHJlYW0oZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIHRydWUsIHRva2VuSG9sZGVyLCBhbHRDb250ZW50LCBudWxsKTsKLSAgICAgICAgZkNyZWF0b3IudXBkYXRlUHJvcGVydHkoaWRIb2xkZXIuZ2V0VmFsdWUoKSwgVmVyc2lvblRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QRVJUWV9JRCwgUFJPUF9WQUxVRV9ORVcpOwotCi0gICAgICAgIC8vIFRlc3QgdGhhdCBhIGNoZWNrLWluIGFzIHNhbWUgdXNlciBpcyBwb3NzaWJsZQotICAgICAgICBTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiQ2hlY2tpbiB3aXRob3V0IGNvbnRlbnQgYW5kIHByb3BlcnRpZXMuIjsKLSAgICAgICAgZlZlclN2Yy5jaGVja0luKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCB0cnVlLCBudWxsLCBudWxsLCBjaGVja2luQ29tbWVudCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8vIE5laXRoZXIgdGhlIHZlcnNpb24gbm9yIHRoZSB2ZXJzaW9uIHNlcmllcyBzaG91bGQgYmUgY2hlY2tlZCBvdXQgYW55Ci0gICAgICAgIC8vIGxvbmdlcjoKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXNDaGVja2VkT3V0KGlkSG9sZGVyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgLy8gYXNzZXJ0RmFsc2UoaXNDaGVja2VkT3V0KGRvY0lkKSk7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gcmV0cmlldmVkQ29udGVudCA9IGZPYmpTdmMuZ2V0Q29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBpZEhvbGRlci5nZXRWYWx1ZSgpLCBudWxsLAotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZigtMSkgLyogb2Zmc2V0ICovLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIGxlbmd0aCAqLywgbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoZkNyZWF0b3IudmVyaWZ5Q29udGVudChmQ3JlYXRvci5jcmVhdGVBbHRlcm5hdGVDb250ZW50KCksIHJldHJpZXZlZENvbnRlbnQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmQ3JlYXRvci52ZXJpZnlQcm9wZXJ0eShpZEhvbGRlci5nZXRWYWx1ZSgpLCBWZXJzaW9uVGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BFUlRZX0lELAotICAgICAgICAgICAgICAgIFBST1BfVkFMVUVfTkVXKSk7Ci0KLSAgICAgICAgTGlzdDxPYmplY3REYXRhPiBhbGxWZXJzaW9ucyA9IGZWZXJTdmMuZ2V0QWxsVmVyc2lvbnMoZlJlcG9zaXRvcnlJZCwgZG9jSWQsIGRvY0lkLCAiKiIsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFsbFZlcnNpb25zLnNpemUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tJbldpdGhDb250ZW50KCkgewotICAgICAgICBTdHJpbmcgdmVySWQgPSBjcmVhdGVEb2N1bWVudChQUk9QX05BTUUsIGZSb290Rm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZS5NQUpPUik7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSB2ZXJzaW9uID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgdmVySWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKHZlcklkLCB2ZXJzaW9uLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG51bGwgIT0gZG9jSWQgJiYgZG9jSWQubGVuZ3RoKCkgPiAwKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShpc0NoZWNrZWRPdXQodmVyc2lvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpKSk7Ci0KLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KHZlcklkKTsgLy8gb3Igc2hvdWxkIHRoaXMKLSAgICAgICAgLy8gYmUgdmVyc2lvbgotICAgICAgICAvLyBzZXJpZXM/Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotICAgICAgICBTdHJpbmcgcHdjSWQgPSBpZEhvbGRlci5nZXRWYWx1ZSgpOwotCi0gICAgICAgIENvbnRlbnRTdHJlYW0gYWx0Q29udGVudCA9IGZDcmVhdG9yLmNyZWF0ZUFsdGVybmF0ZUNvbnRlbnQoKTsKLQotICAgICAgICAvLyB1cGRhdGUgdHdvIHByb3BlcnRpZXMgY3VzdG9tIGFuZCBuYW1lOgotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gbmV3UHJvcGVydGllcyA9IGZDcmVhdG9yLmdldFVwZGF0ZVByb3BlcnR5RGF0YUxpc3QoVmVyc2lvblRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QRVJUWV9JRCwgUFJPUF9WQUxVRV9ORVcpOwotICAgICAgICBuZXdQcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuTkFNRSwgUFJPUF9ORVdfTkFNRSkpOwotICAgICAgICBQcm9wZXJ0aWVzIG5ld1Byb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEobmV3UHJvcGVydGllcyk7Ci0KLSAgICAgICAgaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4ocHdjSWQpOwotICAgICAgICAvLyBhc3NlcnRUcnVlKGlzQ2hlY2tlZE91dChkb2NJZCkpOwotICAgICAgICBhc3NlcnRUcnVlKGlzQ2hlY2tlZE91dChwd2NJZCkpOwotCi0gICAgICAgIC8vIFRlc3QgY2hlY2staW4gYW5kIHBhc3MgY29udGVudCBhbmQgcHJvcGVydGllcwotICAgICAgICBTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiQ2hlY2tpbiB3aXRoIGNvbnRlbnQgYW5kIHByb3BlcnRpZXMuIjsKLSAgICAgICAgZlZlclN2Yy5jaGVja0luKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCB0cnVlLCBuZXdQcm9wcywgYWx0Q29udGVudCwgY2hlY2tpbkNvbW1lbnQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAvLyBOZWl0aGVyIHRoZSB2ZXJzaW9uIG5vciB0aGUgdmVyc2lvbiBzZXJpZXMgc2hvdWxkIGJlIGNoZWNrZWQgb3V0IGFueQotICAgICAgICAvLyBsb25nZXI6Ci0gICAgICAgIGFzc2VydEZhbHNlKGlzQ2hlY2tlZE91dChpZEhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIC8vIGFzc2VydEZhbHNlKGlzQ2hlY2tlZE91dChkb2NJZCkpOwotICAgICAgICBDb250ZW50U3RyZWFtIHJldHJpZXZlZENvbnRlbnQgPSBmT2JqU3ZjLmdldENvbnRlbnRTdHJlYW0oZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIuZ2V0VmFsdWUoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIG9mZnNldCAqLywgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBsZW5ndGggKi8sIG51bGwpOwotCi0gICAgICAgIC8vIE5ldyBjb250ZW50IGFuZCBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0Ci0gICAgICAgIGFzc2VydFRydWUoZkNyZWF0b3IudmVyaWZ5Q29udGVudChmQ3JlYXRvci5jcmVhdGVBbHRlcm5hdGVDb250ZW50KCksIHJldHJpZXZlZENvbnRlbnQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmQ3JlYXRvci52ZXJpZnlQcm9wZXJ0eShpZEhvbGRlci5nZXRWYWx1ZSgpLCBWZXJzaW9uVGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BFUlRZX0lELAotICAgICAgICAgICAgICAgIFBST1BfVkFMVUVfTkVXKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZkNyZWF0b3IudmVyaWZ5UHJvcGVydHkoaWRIb2xkZXIuZ2V0VmFsdWUoKSwgUHJvcGVydHlJZHMuTkFNRSwKLSAgICAgICAgICAgICAgICBQUk9QX05FV19OQU1FKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tPdXRBbmRPdGhlclVzZXIoKSB7Ci0gICAgICAgIFN0cmluZyB2ZXJJZCA9IGNyZWF0ZURvY3VtZW50KFBST1BfTkFNRSwgZlJvb3RGb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlLk1BSk9SKTsKLSAgICAgICAgT2JqZWN0RGF0YSB2ZXJzaW9uID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgdmVySWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKHZlcklkLCB2ZXJzaW9uLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG51bGwgIT0gZG9jSWQgJiYgZG9jSWQubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXNDaGVja2VkT3V0KHZlcnNpb24uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKSkpOwotICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCA9IG5ldyBIb2xkZXI8Qm9vbGVhbj4oKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4odmVySWQpOyAvLyBvciBzaG91bGQgdGhpcwotICAgICAgICAvLyBiZSB2ZXJzaW9uCi0gICAgICAgIC8vIHNlcmllcz8KLSAgICAgICAgZlZlclN2Yy5jaGVja091dChmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgbnVsbCwgY29udGVudENvcGllZCk7Ci0gICAgICAgIFN0cmluZyBwd2NJZCA9IGlkSG9sZGVyLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgLy8gVGVzdCB0aGF0IGEgY2hlY2tpbiBhcyBhbm90aGVyIHVzZXIgaXMgbm90IHBvc3NpYmxlCi0gICAgICAgIHNldFJ1bnRpbWVDb250ZXh0KFRFU1RfVVNFUl8yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgdHJ1ZSwgbnVsbCwgbnVsbCwgIk15IENvbW1lbnQiLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkNoZWNraW5nIGluIGEgZG9jdW1lbnQgYXMgYW5vdGhlciB1c2VyIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3QgdGhhdCBhIGNhbmNlbCBjaGVja291dCBhcyBhbm90aGVyIHVzZXIgaXMgbm90IHBvc3NpYmxlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmVmVyU3ZjLmNhbmNlbENoZWNrT3V0KGZSZXBvc2l0b3J5SWQsIHB3Y0lkLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkNoZWNraW5nIGluIGEgZG9jdW1lbnQgYXMgYW5vdGhlciB1c2VyIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3QgdGhhdCBhbiB1cGRhdGVQcm9wZXJ0aWVzIGFzIGFub3RoZXIgdXNlciBpcyBub3QgcG9zc2libGUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZDcmVhdG9yLnVwZGF0ZVByb3BlcnR5KHB3Y0lkLCBWZXJzaW9uVGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BFUlRZX0lELCBQUk9QX1ZBTFVFX05FVyk7Ci0gICAgICAgICAgICBmYWlsKCJ1cGRhdGVQcm9wZXJ0eSBpbiBhIGRvY3VtZW50IGFzIGFub3RoZXIgdXNlciBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250ZW50U3RyZWFtIGFsdENvbnRlbnQgPSBmQ3JlYXRvci5jcmVhdGVBbHRlcm5hdGVDb250ZW50KCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHB3Y0hvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihwd2NJZCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmT2JqU3ZjLnNldENvbnRlbnRTdHJlYW0oZlJlcG9zaXRvcnlJZCwgcHdjSG9sZGVyLCB0cnVlLCBudWxsLCBhbHRDb250ZW50LCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoInNldENvbnRlbnRTdHJlYW0gaW4gYSBkb2N1bWVudCBhcyBhbm90aGVyIHVzZXIgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0UnVudGltZUNvbnRleHQoVEVTVF9VU0VSKTsKLSAgICAgICAgLy8gVGVzdCB0aGF0IGEgY2hlY2staW4gYXMgc2FtZSB1c2VyIGlzIHBvc3NpYmxlCi0gICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBwd2NIb2xkZXIsIHRydWUsIG51bGwsIG51bGwsICJ0ZXN0Q2hlY2tPdXRBbmRPdGhlclVzZXIiLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBCZWNhdXNlIG5vdGhpbmcgd2FzIGNoYW5nZWQgd2Ugc2hvdWxkIGhhdmUgYSBuZXcgdmVyc2lvbiB3aXRoCi0gICAgICAgIC8vIGlkZW50aWNhbCBjb250ZW50Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gcmV0cmlldmVkQ29udGVudCA9IGZPYmpTdmMuZ2V0Q29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBwd2NIb2xkZXIuZ2V0VmFsdWUoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIG9mZnNldCAqLywgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBsZW5ndGggKi8sIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGZDcmVhdG9yLnZlcmlmeUNvbnRlbnQocmV0cmlldmVkQ29udGVudCwgZkNyZWF0b3IuY3JlYXRlQ29udGVudCgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZkNyZWF0b3IudmVyaWZ5UHJvcGVydHkoaWRIb2xkZXIuZ2V0VmFsdWUoKSwgVmVyc2lvblRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QRVJUWV9JRCwgUFJPUF9WQUxVRSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENhbmNlbENoZWNrb3V0KCkgewotICAgICAgICBTdHJpbmcgdmVySWQgPSBjcmVhdGVEb2N1bWVudChQUk9QX05BTUUsIGZSb290Rm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZS5NQUpPUik7Ci0gICAgICAgIE9iamVjdERhdGEgdmVyc2lvbiA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIHZlcklkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBpZE9mTGFzdFZlcnNpb24gPSB2ZXJzaW9uLmdldElkKCk7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGdldFZlcnNpb25TZXJpZXNJZCh2ZXJJZCwgdmVyc2lvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShudWxsICE9IGRvY0lkICYmIGRvY0lkLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGlzQ2hlY2tlZE91dCh2ZXJzaW9uLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpKTsKLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KHZlcklkKTsgLy8gb3Igc2hvdWxkIHRoaXMKLSAgICAgICAgLy8gYmUgdmVyc2lvbgotICAgICAgICAvLyBzZXJpZXM/Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotICAgICAgICBTdHJpbmcgcHdjSWQgPSBpZEhvbGRlci5nZXRWYWx1ZSgpOwotCi0gICAgICAgIC8vIFNldCBhIG5ldyBjb250ZW50IGFuZCBtb2RpZnkgcHJvcGVydHkKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZPYmpTdmMuZ2V0UHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBwd2NJZCwgIioiLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGNoYW5nZVRva2VuID0gKFN0cmluZykgcHJvcHMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgQ29udGVudFN0cmVhbSBhbHRDb250ZW50ID0gZkNyZWF0b3IuY3JlYXRlQWx0ZXJuYXRlQ29udGVudCgpOwotICAgICAgICBpZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihwd2NJZCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHRva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGNoYW5nZVRva2VuKTsKLSAgICAgICAgZk9ialN2Yy5zZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCB0cnVlLCB0b2tlbkhvbGRlciwgYWx0Q29udGVudCwgbnVsbCk7Ci0gICAgICAgIGZDcmVhdG9yLnVwZGF0ZVByb3BlcnR5KGlkSG9sZGVyLmdldFZhbHVlKCksIFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUEVSVFlfSUQsIFBST1BfVkFMVUVfTkVXKTsKLQotICAgICAgICAvLyBjYW5jZWwgY2hlY2tvdXQKLSAgICAgICAgZlZlclN2Yy5jYW5jZWxDaGVja091dChmUmVwb3NpdG9yeUlkLCBwd2NJZCwgbnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBwd2Mgbm8gbG9uZ2VyIGV4aXN0cwotICAgICAgICAgICAgZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgcHdjSWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJHZXR0aW5nIHB3YyBhZnRlciBjYW5jZWwgY2hlY2tvdXQgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGFmdGVyIGNhbmNlbCBjaGVja2luLCBidXQgZ290IGEgIiArIGUyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBvbGQgY29udGVudCBhbmQgcHJvcGVydGllcyBhcmUgc3RpbGwgdmFsaWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShmQ3JlYXRvci52ZXJpZnlQcm9wZXJ0eShpZE9mTGFzdFZlcnNpb24sIFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUEVSVFlfSUQsIFBST1BfVkFMVUUpKTsKLSAgICAgICAgQ29udGVudFN0cmVhbSByZXRyaWV2ZWRDb250ZW50ID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIGlkT2ZMYXN0VmVyc2lvbiwgbnVsbCwKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIG9mZnNldCAqLywgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBsZW5ndGggKi8sIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGZDcmVhdG9yLnZlcmlmeUNvbnRlbnQocmV0cmlldmVkQ29udGVudCwgZkNyZWF0b3IuY3JlYXRlQ29udGVudCgpKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbigpIHsKLSAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSA9IFZlcnNpb25pbmdTdGF0ZS5NQUpPUjsKLSAgICAgICAgU3RyaW5nIHZlcklkID0gY3JlYXRlRG9jdW1lbnQoUFJPUF9OQU1FLCBmUm9vdEZvbGRlcklkLCB2ZXJzaW9uaW5nU3RhdGUpOwotICAgICAgICBnZXREb2N1bWVudCh2ZXJJZCk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSB2ZXJzaW9uID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgdmVySWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKHZlcklkLCB2ZXJzaW9uLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG51bGwgIT0gZG9jSWQgJiYgZG9jSWQubGVuZ3RoKCkgPiAwKTsKLQotICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCA9IG5ldyBIb2xkZXI8Qm9vbGVhbj4oKTsKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4odmVySWQpOyAvLyBvciBzaG91bGQgdGhpcwotICAgICAgICAvLyBiZSB2ZXJzaW9uCi0gICAgICAgIC8vIHNlcmllcz8KLSAgICAgICAgZlZlclN2Yy5jaGVja091dChmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgbnVsbCwgY29udGVudENvcGllZCk7Ci0gICAgICAgIFN0cmluZyBwd2NJZCA9IGlkSG9sZGVyLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgQ29udGVudFN0cmVhbSBhbHRDb250ZW50ID0gZkNyZWF0b3IuY3JlYXRlQWx0ZXJuYXRlQ29udGVudCgpOwotICAgICAgICBQcm9wZXJ0aWVzIG5ld1Byb3BzID0gZkNyZWF0b3IuZ2V0VXBkYXRlUHJvcGVydHlMaXN0KFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUEVSVFlfSUQsIFBST1BfVkFMVUVfTkVXKTsKLSAgICAgICAgaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4ocHdjSWQpOwotICAgICAgICAvLyBhc3NlcnRUcnVlKGlzQ2hlY2tlZE91dChkb2NJZCkpOwotICAgICAgICBhc3NlcnRUcnVlKGlzQ2hlY2tlZE91dChwd2NJZCkpOwotCi0gICAgICAgIC8vIFRlc3QgY2hlY2staW4gYW5kIHBhc3MgY29udGVudCBhbmQgcHJvcGVydGllcwotICAgICAgICBTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiQ2hlY2tpbiB3aXRoIGNvbnRlbnQgYW5kIHByb3BlcnRpZXMuIjsKLSAgICAgICAgZlZlclN2Yy5jaGVja0luKGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCB0cnVlLCBuZXdQcm9wcywgYWx0Q29udGVudCwgY2hlY2tpbkNvbW1lbnQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCi0gICAgICAgIFByb3BlcnRpZXMgbGF0ZXN0ID0gZlZlclN2Yy5nZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKGZSZXBvc2l0b3J5SWQsIGRvY0lkLCBkb2NJZCwgdHJ1ZSwgIioiLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChsYXRlc3QpOwotCi0gICAgICAgIGNoZWNrVmVyc2lvblByb3BlcnRpZXModmVySWQsIHZlcnNpb25pbmdTdGF0ZSwgbGF0ZXN0LmdldFByb3BlcnRpZXMoKSwgY2hlY2tpbkNvbW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldExhdGVzdFZlcnNpb24oKSB7Ci0gICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSBWZXJzaW9uaW5nU3RhdGUuTUlOT1I7Ci0gICAgICAgIFN0cmluZyB2ZXJJZCA9IGNyZWF0ZURvY3VtZW50KFBST1BfTkFNRSwgZlJvb3RGb2xkZXJJZCwgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICAgICAgZ2V0RG9jdW1lbnQodmVySWQpOwotCi0gICAgICAgIE9iamVjdERhdGEgdmVyc2lvbiA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIHZlcklkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBkb2NJZCA9IGdldFZlcnNpb25TZXJpZXNJZCh2ZXJJZCwgdmVyc2lvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShudWxsICE9IGRvY0lkICYmIGRvY0lkLmxlbmd0aCgpID4gMCk7Ci0KLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KHZlcklkKTsgLy8gb3Igc2hvdWxkIHRoaXMKLSAgICAgICAgLy8gYmUgdmVyc2lvbgotICAgICAgICAvLyBzZXJpZXM/Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotICAgICAgICBTdHJpbmcgcHdjSWQgPSBpZEhvbGRlci5nZXRWYWx1ZSgpOwotCi0gICAgICAgIENvbnRlbnRTdHJlYW0gYWx0Q29udGVudCA9IGZDcmVhdG9yLmNyZWF0ZUFsdGVybmF0ZUNvbnRlbnQoKTsKLSAgICAgICAgUHJvcGVydGllcyBuZXdQcm9wcyA9IGZDcmVhdG9yLmdldFVwZGF0ZVByb3BlcnR5TGlzdChWZXJzaW9uVGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BFUlRZX0lELCBQUk9QX1ZBTFVFX05FVyk7Ci0gICAgICAgIGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KHB3Y0lkKTsKLSAgICAgICAgLy8gYXNzZXJ0VHJ1ZShpc0NoZWNrZWRPdXQoZG9jSWQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc0NoZWNrZWRPdXQocHdjSWQpKTsKLQotICAgICAgICAvLyBUZXN0IGNoZWNrLWluIGFuZCBwYXNzIGNvbnRlbnQgYW5kIHByb3BlcnRpZXMKLSAgICAgICAgU3RyaW5nIGNoZWNraW5Db21tZW50ID0gIkNoZWNraW4gd2l0aCBjb250ZW50IGFuZCBwcm9wZXJ0aWVzLiI7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgdHJ1ZSwgbmV3UHJvcHMsIGFsdENvbnRlbnQsIGNoZWNraW5Db21tZW50LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBnZXQgbGF0ZXN0IG1ham9yIHZlcnNpb24KLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlID0gVmVyc2lvbmluZ1N0YXRlLk1BSk9SOwotICAgICAgICBib29sZWFuIGlzTWFqb3IgPSB0cnVlOwotICAgICAgICBPYmplY3REYXRhIG9iakRhdGEgPSBmVmVyU3ZjLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZG9jSWQsIGlzTWFqb3IsICIqIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgY2hlY2tWZXJzaW9uUHJvcGVydGllcyh2ZXJJZCwgdmVyc2lvbmluZ1N0YXRlLCBvYmpEYXRhLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCksIGNoZWNraW5Db21tZW50KTsKLSAgICAgICAgQ29udGVudFN0cmVhbSByZXRyaWV2ZWRDb250ZW50ID0gZk9ialN2Yy5nZXRDb250ZW50U3RyZWFtKGZSZXBvc2l0b3J5SWQsIG9iakRhdGEuZ2V0SWQoKSwgbnVsbCwKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpIC8qIG9mZnNldCAqLywgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBsZW5ndGggKi8sIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGZDcmVhdG9yLnZlcmlmeUNvbnRlbnQocmV0cmlldmVkQ29udGVudCwgZkNyZWF0b3IuY3JlYXRlQWx0ZXJuYXRlQ29udGVudCgpKSk7Ci0KLSAgICAgICAgLy8gZ2V0IGxhdGVzdCBub24tbWFqb3IgdmVyc2lvbiwgbXVzdCBiZSB0aGUgc2FtZSBhcyBiZWZvcmUKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlID0gVmVyc2lvbmluZ1N0YXRlLk1BSk9SOwotICAgICAgICBpc01ham9yID0gZmFsc2U7Ci0gICAgICAgIG9iakRhdGEgPSBmVmVyU3ZjLmdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZG9jSWQsIGlzTWFqb3IsICIqIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgY2hlY2tWZXJzaW9uUHJvcGVydGllcyh2ZXJJZCwgdmVyc2lvbmluZ1N0YXRlLCBvYmpEYXRhLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCksIGNoZWNraW5Db21tZW50KTsKLSAgICAgICAgcmV0cmlldmVkQ29udGVudCA9IGZPYmpTdmMuZ2V0Q29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBvYmpEYXRhLmdldElkKCksIG51bGwsCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSAvKiBvZmZzZXQgKi8sIEJpZ0ludGVnZXIudmFsdWVPZigtMSkgLyogbGVuZ3RoICovLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmQ3JlYXRvci52ZXJpZnlDb250ZW50KHJldHJpZXZlZENvbnRlbnQsIGZDcmVhdG9yLmNyZWF0ZUFsdGVybmF0ZUNvbnRlbnQoKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldENoZWNrZWRPdXREb2N1bWVudHMoKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSB0d28gZm9sZGVycyB3aXRoIGVhY2ggaGF2aW5nIHR3byBkb2N1bWVudHMsIG9uZSBvZiB0aGVtIGJlaW5nCi0gICAgICAgIC8vIGNoZWNrZWQgb3V0Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IDI7Ci0gICAgICAgIFN0cmluZ1tdIGZvbGRlcklkcyA9IGNyZWF0ZUxldmVsMUZvbGRlcnMoKTsKLSAgICAgICAgU3RyaW5nW10gdmVyU2VyaWVzSWRzID0gbmV3IFN0cmluZ1tmb2xkZXJJZHMubGVuZ3RoICogY291bnRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvbGRlcklkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZlcklkID0gY3JlYXRlRG9jdW1lbnQoIk15RG9jIiArIGosIGZvbGRlcklkc1tpXSwgVmVyc2lvbmluZ1N0YXRlLk1BSk9SKTsKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIG9kID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgdmVySWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgICAgIHZlclNlcmllc0lkc1tpICogZm9sZGVySWRzLmxlbmd0aCArIGpdID0gdmVySWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2tvdXQgZmlyc3QgaW4gZWFjaCBmb2xkZXIKLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KHZlclNlcmllc0lkc1swXSk7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotICAgICAgICBpZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPih2ZXJTZXJpZXNJZHNbMl0pOwotICAgICAgICBmVmVyU3ZjLmNoZWNrT3V0KGZSZXBvc2l0b3J5SWQsIGlkSG9sZGVyLCBudWxsLCBjb250ZW50Q29waWVkKTsKLQotICAgICAgICAvLyBtdXN0IGJlIG9uZSBpbiBmaXJzdCBmb2xkZXIKLSAgICAgICAgT2JqZWN0TGlzdCBjaGVja2VkT3V0RG9jdW1lbnRzID0gZk5hdlN2Yy5nZXRDaGVja2VkT3V0RG9jcyhmUmVwb3NpdG9yeUlkLCBmb2xkZXJJZHNbMF0sICIqIiwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjaGVja2VkT3V0RG9jdW1lbnRzLmdldE51bUl0ZW1zKCkubG9uZ1ZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2hlY2tlZE91dERvY3VtZW50cy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLQotICAgICAgICAvLyBtdXN0IGJlIG9uZSBpbiBzZWNvbmQgZm9sZGVyCi0gICAgICAgIGNoZWNrZWRPdXREb2N1bWVudHMgPSBmTmF2U3ZjLmdldENoZWNrZWRPdXREb2NzKGZSZXBvc2l0b3J5SWQsIGZvbGRlcklkc1sxXSwgIioiLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNoZWNrZWRPdXREb2N1bWVudHMuZ2V0TnVtSXRlbXMoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjaGVja2VkT3V0RG9jdW1lbnRzLmdldE9iamVjdHMoKS5zaXplKCkpOwotCi0gICAgICAgIC8vIG11c3QgYmUgdHdvIGluIHJlcG9zaXRvcnkKLSAgICAgICAgY2hlY2tlZE91dERvY3VtZW50cyA9IGZOYXZTdmMuZ2V0Q2hlY2tlZE91dERvY3MoZlJlcG9zaXRvcnlJZCwgbnVsbCwgIioiLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNoZWNrZWRPdXREb2N1bWVudHMuZ2V0TnVtSXRlbXMoKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBjaGVja2VkT3V0RG9jdW1lbnRzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1vZGlmeU9sZFZlcnNpb25zKCkgewotICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkID0gY3JlYXRlVmVyc2lvblNlcmllc1dpdGhUaHJlZVZlcnNpb25zKCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gYWxsVmVyc2lvbnMgPSBmVmVyU3ZjLmdldEFsbFZlcnNpb25zKGZSZXBvc2l0b3J5SWQsIG51bGwsIHZlcnNpb25TZXJpZXNJZCwgIioiLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBhbGxWZXJzaW9ucy5zaXplKCkpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjcmVhdGVMZXZlbDFGb2xkZXJzKCkgewotICAgICAgICBmaW5hbCBpbnQgbnVtID0gMjsKLSAgICAgICAgU3RyaW5nW10gcmVzID0gbmV3IFN0cmluZ1tudW1dOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLSAgICAgICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCAiRm9sZGVyICIgKyBpKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpKSk7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBmT2JqU3ZjLmNyZWF0ZUZvbGRlcihmUmVwb3NpdG9yeUlkLCBwcm9wcywgZlJvb3RGb2xkZXJJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICByZXNbaV0gPSBpZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVWZXJzaW9uZWREb2N1bWVudChWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgIC8vIHR5cGUgaWQgaXM6Ci0gICAgICAgIC8vIFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTl9URVNUX0RPQ1VNRU5UX1RZUEVfSUQKLSAgICAgICAgU3RyaW5nIHZlcklkID0gY3JlYXRlRG9jdW1lbnQoUFJPUF9OQU1FLCBmUm9vdEZvbGRlcklkLCB2ZXJzaW9uaW5nU3RhdGUpOwotICAgICAgICBnZXREb2N1bWVudCh2ZXJJZCk7Ci0KLSAgICAgICAgT2JqZWN0RGF0YSB2ZXJzaW9uID0gZk9ialN2Yy5nZXRPYmplY3QoZlJlcG9zaXRvcnlJZCwgdmVySWQsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGRvY0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKHZlcklkLCB2ZXJzaW9uLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG51bGwgIT0gZG9jSWQgJiYgZG9jSWQubGVuZ3RoKCkgPiAwKTsKLQotICAgICAgICBMaXN0PE9iamVjdERhdGE+IGFsbFZlcnNpb25zID0gZlZlclN2Yy5nZXRBbGxWZXJzaW9ucyhmUmVwb3NpdG9yeUlkLCBkb2NJZCwgZG9jSWQsICIqIiwgZmFsc2UsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsVmVyc2lvbnMuc2l6ZSgpKTsKLQotICAgICAgICBjaGVja1ZlcnNpb25Qcm9wZXJ0aWVzKHZlcklkLCB2ZXJzaW9uaW5nU3RhdGUsIGFsbFZlcnNpb25zLmdldCgwKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvblNlcmllc0lkKFN0cmluZyBkb2NJZCwgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wcykgewotICAgICAgICBQcm9wZXJ0eUlkIHBkaWQgPSAoUHJvcGVydHlJZCkgcHJvcHMuZ2V0KFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0lEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGlkKTsKLSAgICAgICAgU3RyaW5nIHNWYWwgPSBwZGlkLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzVmFsKTsKLSAgICAgICAgcmV0dXJuIHNWYWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2hlY2tlZE91dChTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZPYmpTdmMuZ2V0UHJvcGVydGllcyhmUmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgIioiLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIGlzQ2hlY2tlZE91dChwcm9wcy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGVja2VkT3V0KE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcHMpIHsKLSAgICAgICAgUHJvcGVydHlCb29sZWFuIHBkYiA9IChQcm9wZXJ0eUJvb2xlYW4pIHByb3BzLmdldChQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRiKTsKLSAgICAgICAgYm9vbGVhbiBiVmFsID0gcGRiLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGJWYWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmVyc2lvblByb3BlcnRpZXMoU3RyaW5nIGRvY0lkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLAotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEYXRhPD8+PiBwcm9wcywgU3RyaW5nIGNoZWNraW5Db21tZW50KSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHBkIDogcHJvcHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJyZXR1cm4gcHJvcGVydHkgaWQ6ICIgKyBwZC5nZXRJZCgpICsgIiwgdmFsdWU6ICIgKyBwZC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgPSAoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgZlJlcFN2Yy5nZXRUeXBlRGVmaW5pdGlvbihmUmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgICAgIFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTl9URVNUX0RPQ1VNRU5UX1RZUEVfSUQsIG51bGwpOwotICAgICAgICBQcm9wZXJ0eUJvb2xlYW4gcGRiID0gKFByb3BlcnR5Qm9vbGVhbikgcHJvcHMuZ2V0KFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGIpOwotICAgICAgICBib29sZWFuIGJWYWwgPSBwZGIuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBpZiAodmVyc2lvbmluZ1N0YXRlICE9IFZlcnNpb25pbmdTdGF0ZS5DSEVDS0VET1VUKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJWYWwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYlZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGRiID0gKFByb3BlcnR5Qm9vbGVhbikgcHJvcHMuZ2V0KFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYik7Ci0gICAgICAgIGJWYWwgPSBwZGIuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyc2lvbmluZ1N0YXRlID09IFZlcnNpb25pbmdTdGF0ZS5NQUpPUiwgYlZhbCk7Ci0KLSAgICAgICAgcGRiID0gKFByb3BlcnR5Qm9vbGVhbikgcHJvcHMuZ2V0KFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGIpOwotICAgICAgICBiVmFsID0gcGRiLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcnNpb25pbmdTdGF0ZSA9PSBWZXJzaW9uaW5nU3RhdGUuTUFKT1IsIGJWYWwpOwotCi0gICAgICAgIFByb3BlcnR5SWQgcGRpZCA9IChQcm9wZXJ0eUlkKSBwcm9wcy5nZXQoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkaWQpOwotICAgICAgICBTdHJpbmcgc1ZhbCA9IHBkaWQuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAvLyBpZiAodHlwZURlZi5pc1ZlcnNpb25hYmxlKCkpIC8vIG5lZWQgbm90IGJlCi0gICAgICAgIC8vIGFzc2VydEZhbHNlKGRvY0lkLmVxdWFscyhzVmFsKSk7Ci0gICAgICAgIC8vIGVsc2UKLSAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKGRvY0lkLCBzVmFsKTsKLQotICAgICAgICBwZGIgPSAoUHJvcGVydHlCb29sZWFuKSBwcm9wcy5nZXQoUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYik7Ci0gICAgICAgIGJWYWwgPSBwZGIuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyc2lvbmluZ1N0YXRlID09IFZlcnNpb25pbmdTdGF0ZS5DSEVDS0VET1VULCBiVmFsKTsKLQotICAgICAgICBQcm9wZXJ0eVN0cmluZyBwZHMgPSAoUHJvcGVydHlTdHJpbmcpIHByb3BzLmdldChQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRzKTsKLSAgICAgICAgc1ZhbCA9IHBkcy5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGlmICh2ZXJzaW9uaW5nU3RhdGUgPT0gVmVyc2lvbmluZ1N0YXRlLkNIRUNLRURPVVQpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc1ZhbCAhPSBudWxsICYmIHNWYWwubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUobnVsbCA9PSBzVmFsIHx8IHNWYWwuZXF1YWxzKCIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwZGlkID0gKFByb3BlcnR5SWQpIHByb3BzLmdldChQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9JRCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRpZCk7Ci0gICAgICAgIHNWYWwgPSBwZGlkLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgaWYgKHZlcnNpb25pbmdTdGF0ZSA9PSBWZXJzaW9uaW5nU3RhdGUuQ0hFQ0tFRE9VVCkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzVmFsICE9IG51bGwgJiYgc1ZhbC5sZW5ndGgoKSA+IDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShudWxsID09IHNWYWwgfHwgc1ZhbC5lcXVhbHMoIiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBkcyA9IChQcm9wZXJ0eVN0cmluZykgcHJvcHMuZ2V0KFByb3BlcnR5SWRzLkNIRUNLSU5fQ09NTUVOVCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRiKTsKLSAgICAgICAgc1ZhbCA9IHBkcy5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGlmIChjaGVja2luQ29tbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG51bGwgPT0gc1ZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tpbkNvbW1lbnQsIHNWYWwpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50KFN0cmluZyBpZCkgewotICAgICAgICBTdHJpbmcgcmV0dXJuZWRJZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3REYXRhIHJlcyA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIGlkLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOwotICAgICAgICAgICAgdGVzdFJldHVybmVkUHJvcGVydGllcyhyZXMuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm5lZElkID0gcmVzLmdldElkKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIHJldHVybmVkSWQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiZ2V0T2JqZWN0KCkgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybmVkSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0UmV0dXJuZWRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gcHJvcHMpIHsKLSAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcGQgOiBwcm9wcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgbG9nLmluZm8oInJldHVybiBwcm9wZXJ0eSBpZDogIiArIHBkLmdldElkKCkgKyAiLCB2YWx1ZTogIiArIHBkLmdldFZhbHVlcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IHByb3BzLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhQUk9QX05BTUUsIHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIHBkID0gcHJvcHMuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTl9URVNUX0RPQ1VNRU5UX1RZUEVfSUQsIHBkLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIHBkID0gcHJvcHMuZ2V0KFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUEVSVFlfSUQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUFJPUF9WQUxVRSwgcGQuZ2V0Rmlyc3RWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUEVSVFlfSUQsIFBST1BfVkFMVUUpOwotICAgICAgICBpZCA9IGZDcmVhdG9yLmNyZWF0ZURvY3VtZW50KG5hbWUsIFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTl9URVNUX0RPQ1VNRU5UX1RZUEVfSUQsIGZvbGRlcklkLAotICAgICAgICAgICAgICAgIHZlcnNpb25pbmdTdGF0ZSwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVZlcnNpb25TZXJpZXNXaXRoVGhyZWVWZXJzaW9ucygpIHsKLSAgICAgICAgU3RyaW5nIHZlcklkVjEgPSBjcmVhdGVEb2N1bWVudChQUk9QX05BTUUsIGZSb290Rm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZS5NQUpPUik7Ci0gICAgICAgIGdldERvY3VtZW50KHZlcklkVjEpOwotCi0gICAgICAgIE9iamVjdERhdGEgdmVyc2lvbiA9IGZPYmpTdmMuZ2V0T2JqZWN0KGZSZXBvc2l0b3J5SWQsIHZlcklkVjEsICIqIiwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIHZlclNlcmllc0lkID0gZ2V0VmVyc2lvblNlcmllc0lkKHZlcklkVjEsIHZlcnNpb24uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHNlY29uZCB2ZXJzaW9uIHdpdGggZGlmZmVyZW50IGNvbnRlbnQKLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4odmVySWRWMSk7Ci0gICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkID0gbmV3IEhvbGRlcjxCb29sZWFuPihmYWxzZSk7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQoZlJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotCi0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudDIgPSBjcmVhdGVDb250ZW50KCdhJyk7Ci0gICAgICAgIFByb3BlcnRpZXMgbmV3UHJvcHMgPSBmQ3JlYXRvci5nZXRVcGRhdGVQcm9wZXJ0eUxpc3QoVmVyc2lvblRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QRVJUWV9JRCwKLSAgICAgICAgICAgICAgICAiUHJvcGVydHlGcm9tVmVyc2lvbjIiKTsKLSAgICAgICAgaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4odmVySWRWMSk7Ci0gICAgICAgIC8vIFRlc3QgY2hlY2staW4gYW5kIHBhc3MgY29udGVudCBhbmQgcHJvcGVydGllcwotICAgICAgICBTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiQ2hlY2tpbiBmcm9tIFVuaXQgVGVzdC0yLiI7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgdHJ1ZSwgbmV3UHJvcHMsIGNvbnRlbnQyLCBjaGVja2luQ29tbWVudCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyB2ZXJJZFYyID0gaWRIb2xkZXIuZ2V0VmFsdWUoKTsKLQotICAgICAgICAvLyBjcmVhdGUgdGhpcmQgdmVyc2lvbiB3aXRoIGRpZmZlcmVudCBjb250ZW50Ci0gICAgICAgIGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KGZhbHNlKTsKLSAgICAgICAgZlZlclN2Yy5jaGVja091dChmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgbnVsbCwgY29udGVudENvcGllZCk7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudDMgPSBzdXBlci5jcmVhdGVDb250ZW50KCdhJyk7Ci0gICAgICAgIG5ld1Byb3BzID0gZkNyZWF0b3IuZ2V0VXBkYXRlUHJvcGVydHlMaXN0KFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUEVSVFlfSUQsICJQcm9wZXJ0eUZyb21WZXJzaW9uMyIpOwotICAgICAgICAvLyBUZXN0IGNoZWNrLWluIGFuZCBwYXNzIGNvbnRlbnQgYW5kIHByb3BlcnRpZXMKLSAgICAgICAgY2hlY2tpbkNvbW1lbnQgPSAiQ2hlY2tpbiBmcm9tIFVuaXQgVGVzdC0zLiI7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tJbihmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgdHJ1ZSwgbmV3UHJvcHMsIGNvbnRlbnQzLCBjaGVja2luQ29tbWVudCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIC8qIFN0cmluZyB2ZXJJZFYzID0gKi9pZEhvbGRlci5nZXRWYWx1ZSgpOwotCi0gICAgICAgIC8vIFRyeSB0byB1cGRhdGUgdmVyc2lvbjIgd2hpY2ggc2hvdWxkIGZhaWwgKG9uIGEgdmVyc2lvbmVkIGRvY3VtZW50Ci0gICAgICAgIC8vIG9ubHkgYSBkb2N1bWVudCB0aGF0Ci0gICAgICAgIC8vIGlzIGNoZWNrZWQgb3V0IGNhbiBiZSBtb2RpZmllZC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZDcmVhdG9yLnVwZGF0ZVByb3BlcnR5KHZlcklkVjIsIFZlcnNpb25UZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUEVSVFlfSUQsICJDaGFuZ2VXaXRob3V0Q2hlY2tvdXQiKTsKLSAgICAgICAgICAgIGZhaWwoInVwZGF0ZVByb3BlcnR5IGZvciBhbiBvbGRlciB2ZXJzaW9uIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyB0cnkgdG8gc2V0IGNvbnRlbnQgb24gYW4gb2xkZXIgdmVyc2lvbgotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQ0ID0gc3VwZXIuY3JlYXRlQ29udGVudCgneCcpOwotICAgICAgICBpZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPih2ZXJJZFYyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZPYmpTdmMuc2V0Q29udGVudFN0cmVhbShmUmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgdHJ1ZSwgbnVsbCwgY29udGVudDQsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgic2V0Q29udGVudFN0cmVhbSBmb3IgYW4gb2xkZXIgdmVyc2lvbiBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmVyU2VyaWVzSWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9BYnN0cmFjdFF1ZXJ5Q29uZGl0aW9uUHJvY2Vzc29yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9BYnN0cmFjdFF1ZXJ5Q29uZGl0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGUzMWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvQWJzdHJhY3RRdWVyeUNvbmRpdGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5xdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNhbGVuZGFySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlByZWRpY2F0ZVdhbGtlckJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5UZXh0U2VhcmNoTGV4ZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVlcnlDb25kaXRpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBQcmVkaWNhdGVXYWxrZXJCYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzUXVlcnlUZXN0LmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uU3RhcnRQcm9jZXNzaW5nKFRyZWUgd2hlcmVOb2RlKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uU3RvcFByb2Nlc3NpbmcoKTsKLQotICAgIC8vIENvbXBhcmUgb3BlcmF0b3JzCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVFcXVhbHMoVHJlZSBlcU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25FcXVhbHMoVHJlZSBlcU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEVxdWFscyhUcmVlIGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZU5vdEVxdWFscyhUcmVlIG5lTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbk5vdEVxdWFscyhUcmVlIG5lTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0Tm90RXF1YWxzKFRyZWUgbmVOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlR3JlYXRlclRoYW4oVHJlZSBndE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25HcmVhdGVyVGhhbihUcmVlIGd0Tm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0R3JlYXRlclRoYW4oVHJlZSBndE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVHcmVhdGVyT3JFcXVhbHMoVHJlZSBnZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25HcmVhdGVyT3JFcXVhbHMoVHJlZSBnZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEdyZWF0ZXJPckVxdWFscyhUcmVlIGdlTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUxlc3NUaGFuKFRyZWUgbHROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uTGVzc1RoYW4oVHJlZSBsdE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdExlc3NUaGFuKFRyZWUgbHROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlTGVzc09yRXF1YWxzKFRyZWUgbGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkxlc3NPckVxdWFscyhUcmVlIGxlcU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdExlc3NPckVxdWFscyhUcmVlIGxlcU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotCi0gICAgLy8gQm9vbGVhbiBvcGVyYXRvcnMKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbk5vdChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3ROb3QoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUFuZChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkFuZChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0QW5kKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlT3IoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25PcihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0T3IoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgfQotCi0gICAgLy8gTXVsdGktdmFsdWU6Ci0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVJbihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZU5vdEluKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Ob3RJbihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3ROb3RJbihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlSW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkluQW55KFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEluQW55KFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVOb3RJbkFueShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uTm90SW5BbnkoVHJlZSBub2RlLCBUcmVlIGxpdGVyYWxOb2RlLCBUcmVlIGNvbE5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0Tm90SW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUVxQW55KFRyZWUgbm9kZSwgVHJlZSBsaXRlcmFsTm9kZSwgVHJlZSBjb2xOb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25FcUFueShUcmVlIG5vZGUsIFRyZWUgbGl0ZXJhbE5vZGUsIFRyZWUgY29sTm9kZSk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFcUFueShUcmVlIG5vZGUsIFRyZWUgbGl0ZXJhbE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgIH0KLQotICAgIC8vIE51bGwgY29tcGFyaXNvbnM6Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Jc051bGwoVHJlZSBudWxsTm9kZSwgVHJlZSBjb2xOb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdElzTnVsbChUcmVlIG51bGxOb2RlLCBUcmVlIGNvbE5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbklzTm90TnVsbChUcmVlIG5vdE51bGxOb2RlLCBUcmVlIGNvbE5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SXNOb3ROdWxsKFRyZWUgbm90TnVsbE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgIH0KLQotICAgIC8vIFN0cmluZyBtYXRjaGluZzoKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUlzTGlrZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBzdHJpbmdOb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Jc0xpa2UoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RJc0xpa2UoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlSXNOb3RMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbklzTm90TGlrZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBzdHJpbmdOb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdElzTm90TGlrZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBzdHJpbmdOb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25JbkZvbGRlcihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBwYXJhbU5vZGUpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25CZXR3ZWVuSW5Gb2xkZXIoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0SW5Gb2xkZXIoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25JblRyZWUoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uQmV0d2VlbkluVHJlZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBwYXJhbU5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RJblRyZWUoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25TY29yZShUcmVlIG5vZGUpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25Db2xOb2RlKFRyZWUgbm9kZSk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblByZVRleHRBbmQoVHJlZSBub2RlLCBMaXN0PFRyZWU+IGNvbmp1bmN0aW9uTm9kZXMpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblRleHRBbmQoVHJlZSBub2RlLCBMaXN0PFRyZWU+IGNvbmp1bmN0aW9uTm9kZXMsIGludCBpbmRleCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RUZXh0QW5kKFRyZWUgbm9kZSwgTGlzdDxUcmVlPiBjb25qdW5jdGlvbk5vZGVzKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25QcmVUZXh0T3IoVHJlZSBub2RlLCBMaXN0PFRyZWU+IHRlcm1Ob2RlcykgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uVGV4dE9yKFRyZWUgbm9kZSwgTGlzdDxUcmVlPiB0ZXJtTm9kZXMsIGludCBpbmRleCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RUZXh0T3IoVHJlZSBub2RlLCBMaXN0PFRyZWU+IHRlcm1Ob2RlcykgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uVGV4dE1pbnVzKFRyZWUgbm9kZSwgVHJlZSBub3ROb2RlKTsKLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdFRleHRNaW51cyhUcmVlIG5vZGUsIFRyZWUgbm90Tm9kZSkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uVGV4dFdvcmQoU3RyaW5nIHdvcmQpOwotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25UZXh0UGhyYXNlKFN0cmluZyBwaHJhc2UpOwotCi0gICAgLy8gQmFzZSBpbnRlcmZhY2UgY2FsbGVkIGZyb20gcXVlcnkgcGFyc2VyCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa1ByZWRpY2F0ZShUcmVlIHdoZXJlTm9kZSkgewotICAgICAgICBpZiAobnVsbCAhPSB3aGVyZU5vZGUpIHsKLSAgICAgICAgICAgIG9uU3RhcnRQcm9jZXNzaW5nKHdoZXJlTm9kZSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKHdoZXJlTm9kZSk7Ci0gICAgICAgICAgICBvblN0b3BQcm9jZXNzaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7IC8vIHVudXNlZAotICAgIH0KLQotICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm9jZXNzaW5nIHRoZSBXSEVSRSBjbGF1c2UKLQotICAgIHByb3RlY3RlZCB2b2lkIGV2YWxXaGVyZU5vZGUoVHJlZSBub2RlKSB7Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHdlIHJlY2VpdmUgb25seSB2YWxpZCB0b2tlbnMgYW5kIG5vZGVzIGluIHRoZSB3aGVyZQotICAgICAgICAvLyBjbGF1c2U6Ci0gICAgICAgIExPRy5kZWJ1ZygiZXZhbHVhdGluZyBub2RlOiAiICsgbm9kZS50b1N0cmluZygpKTsKLSAgICAgICAgc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLldIRVJFOgotICAgICAgICAgICAgYnJlYWs7IC8vIGlnbm9yZQotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkVROgotICAgICAgICAgICAgb25QcmVFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25FcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgb25Qb3N0RXF1YWxzKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTkVROgotICAgICAgICAgICAgb25QcmVOb3RFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25Ob3RFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgb25Qb3N0Tm90RXF1YWxzKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuR1Q6Ci0gICAgICAgICAgICBvblByZUdyZWF0ZXJUaGFuKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIG9uR3JlYXRlclRoYW4obm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgb25Qb3N0R3JlYXRlclRoYW4obm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5HVEVROgotICAgICAgICAgICAgb25QcmVHcmVhdGVyT3JFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25HcmVhdGVyT3JFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgb25Qb3N0R3JlYXRlck9yRXF1YWxzKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTFQ6Ci0gICAgICAgICAgICBvblByZUxlc3NUaGFuKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIG9uTGVzc1RoYW4obm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgb25Qb3N0TGVzc1RoYW4obm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MVEVROgotICAgICAgICAgICAgb25QcmVMZXNzT3JFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25MZXNzT3JFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgb25Qb3N0TGVzc09yRXF1YWxzKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OT1Q6Ci0gICAgICAgICAgICBvbk5vdChub2RlLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBvblBvc3ROb3Qobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5BTkQ6Ci0gICAgICAgICAgICBvblByZUFuZChub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBvbkFuZChub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBvblBvc3RBbmQobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5PUjoKLSAgICAgICAgICAgIG9uUHJlT3Iobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25Pcihub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBvblBvc3RPcihub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIE11bHRpLXZhbHVlOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOOgotICAgICAgICAgICAgb25QcmVJbihub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBvbkluKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIG9uUG9zdEluKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTk9UX0lOOgotICAgICAgICAgICAgb25QcmVOb3RJbihub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBvbk5vdEluKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIG9uUG9zdE5vdEluKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSU5fQU5ZOgotICAgICAgICAgICAgb25QcmVJbkFueShub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBvbkluQW55KG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIG9uUG9zdEluQW55KG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTk9UX0lOX0FOWToKLSAgICAgICAgICAgIG9uUHJlTm90SW5Bbnkobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25Ob3RJbkFueShub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBvblBvc3ROb3RJbkFueShub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkVRX0FOWToKLSAgICAgICAgICAgIG9uUHJlRXFBbnkobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25FcUFueShub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBvblBvc3RFcUFueShub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIE51bGwgY29tcGFyaXNvbnM6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSVNfTlVMTDoKLSAgICAgICAgICAgIG9uSXNOdWxsKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIG9uUG9zdElzTnVsbChub2RlLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklTX05PVF9OVUxMOgotICAgICAgICAgICAgb25Jc05vdE51bGwobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25Qb3N0SXNOb3ROdWxsKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gU3RyaW5nIG1hdGNoaW5nCi0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTElLRToKLSAgICAgICAgICAgIG9uUHJlSXNMaWtlKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIG9uSXNMaWtlKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIG9uUG9zdElzTGlrZShub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk5PVF9MSUtFOgotICAgICAgICAgICAgb25QcmVJc05vdExpa2Uobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgb25Jc05vdExpa2Uobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgb25Qb3N0SXNOb3RMaWtlKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gRnVuY3Rpb25zCi0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQ09OVEFJTlM6Ci0gICAgICAgICAgICBUcmVlIHR5cGVOb2RlID0gbm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMSA/IG51bGwgOiBub2RlLmdldENoaWxkKDApOwotICAgICAgICAgICAgVHJlZSB0ZXh0U2VhcmNoTm9kZSA9IG5vZGUuZ2V0Q2hpbGRDb3VudCgpID09IDEgPyBub2RlLmdldENoaWxkKDApIDogbm9kZS5nZXRDaGlsZCgxKTsKLQotICAgICAgICAgICAgb25QcmVDb250YWlucyhub2RlLCB0eXBlTm9kZSwgdGV4dFNlYXJjaE5vZGUpOwotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID4gMSkgewotICAgICAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUodHlwZU5vZGUpOwotICAgICAgICAgICAgICAgIG9uQmV0d2VlbkNvbnRhaW5zKG5vZGUsIHR5cGVOb2RlLCB0ZXh0U2VhcmNoTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbkNvbnRhaW5zKG5vZGUsIHR5cGVOb2RlLCB0ZXh0U2VhcmNoTm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9GT0xERVI6Ci0gICAgICAgICAgICBpZiAobm9kZS5nZXRDaGlsZENvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgICAgIG9uSW5Gb2xkZXIobm9kZSwgbnVsbCwgbm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgICAgICBvblBvc3RJbkZvbGRlcihub2RlLCBudWxsLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25JbkZvbGRlcihub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgICAgIG9uQmV0d2VlbkluRm9sZGVyKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgICAgIGV2YWxXaGVyZU5vZGUobm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICAgICAgb25Qb3N0SW5Gb2xkZXIobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9UUkVFOgotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBvbkluVHJlZShub2RlLCBudWxsLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgICAgICBldmFsV2hlcmVOb2RlKG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgICAgIG9uUG9zdEluVHJlZShub2RlLCBudWxsLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25JblRyZWUobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgICAgICBvbkJldHdlZW5JblRyZWUobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICAgICAgZXZhbFdoZXJlTm9kZShub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgICAgICBvblBvc3RJblRyZWUobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5TQ09SRToKLSAgICAgICAgICAgIG9uU2NvcmUobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5DT0w6Ci0gICAgICAgICAgICBvbkNvbE5vZGUobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5CT09MX0xJVDoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OVU1fTElUOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlNUUklOR19MSVQ6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuVElNRV9MSVQ6Ci0gICAgICAgICAgICBvbkxpdGVyYWwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9MSVNUOgotICAgICAgICAgICAgb25MaXRlcmFsTGlzdChub2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklEOgotICAgICAgICAgICAgb25JZChub2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gZG8gbm90aGluZzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlQ29udGFpbnMoVHJlZSBub2RlLCBUcmVlIHR5cGVOb2RlLCBUcmVlIHNlYXJjaEV4cHJOb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Db250YWlucyhUcmVlIG5vZGUsIFRyZWUgdHlwZU5vZGUsIFRyZWUgc2VhcmNoRXhwck5vZGUpIHsKLSAgICAgICAgZXZhbFRleHRTZWFyY2hOb2RlKHR5cGVOb2RlLCBzZWFyY2hFeHByTm9kZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25CZXR3ZWVuQ29udGFpbnMoVHJlZSBub2RlLCBUcmVlIHR5cGVOb2RlLCBUcmVlIHNlYXJjaEV4cHJOb2RlKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXZhbFRleHRTZWFyY2hOb2RlKFRyZWUgdHlwZU5vZGUsIFRyZWUgbm9kZSkgewotICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSByZWNlaXZlIG9ubHkgdmFsaWQgdG9rZW5zIGFuZCBub2RlcyBpbiB0aGUgd2hlcmUKLSAgICAgICAgLy8gY2xhdXNlOgotICAgICAgICBMT0cuZGVidWcoImV2YWx1YXRpbmcgbm9kZTogIiArIG5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9BTkQ6Ci0gICAgICAgICAgICBMaXN0PFRyZWU+IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5Bc0xpc3Qobm9kZSk7Ci0gICAgICAgICAgICBvblByZVRleHRBbmQobm9kZSwgY2hpbGRyZW4pOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChUcmVlIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBldmFsVGV4dFNlYXJjaE5vZGUodHlwZU5vZGUsIGNoaWxkKTsKLSAgICAgICAgICAgICAgICBvblRleHRBbmQobm9kZSwgY2hpbGRyZW4sIGkrKyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvblBvc3RUZXh0QW5kKG5vZGUsIGNoaWxkcmVuKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX09SOgotICAgICAgICAgICAgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkFzTGlzdChub2RlKTsKLSAgICAgICAgICAgIG9uUHJlVGV4dE9yKG5vZGUsIGNoaWxkcmVuKTsKLSAgICAgICAgICAgIGludCBqID0gMDsKLSAgICAgICAgICAgIGZvciAoVHJlZSBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgZXZhbFRleHRTZWFyY2hOb2RlKHR5cGVOb2RlLCBjaGlsZCk7Ci0gICAgICAgICAgICAgICAgb25UZXh0T3Iobm9kZSwgY2hpbGRyZW4sIGorKyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvblBvc3RUZXh0T3Iobm9kZSwgY2hpbGRyZW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfTUlOVVM6Ci0gICAgICAgICAgICBvblRleHRNaW51cyhub2RlLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIGV2YWxUZXh0U2VhcmNoTm9kZSh0eXBlTm9kZSwgbm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBvblBvc3RUZXh0TWludXMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfUEhSQVNFX1NUUklOR19MSVQ6Ci0gICAgICAgICAgICBvblRleHRQaHJhc2Uob25UZXh0TGl0ZXJhbChub2RlKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfV09SRF9MSVQ6Ci0gICAgICAgICAgICBvblRleHRXb3JkKG9uVGV4dExpdGVyYWwobm9kZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgYXJlIG5lZWRlZCBieSBtb3N0IHF1ZXJ5IHRyZWUgd2Fsa2VycwotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRMaXRlcmFsKFRyZWUgbm9kZSkgewotICAgICAgICBpbnQgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0VGV4dCgpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5CT09MX0xJVDoKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihub2RlLmdldFRleHQoKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTlVNX0xJVDoKLSAgICAgICAgICAgIGlmICh0ZXh0LmNvbnRhaW5zKCIuIikgfHwgdGV4dC5jb250YWlucygiZSIpIHx8IHRleHQuY29udGFpbnMoIkUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUodGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyh0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5TVFJJTkdfTElUOgotICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5USU1FX0xJVDoKLSAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gQ2FsZW5kYXJIZWxwZXIuZnJvbVN0cmluZyh0ZXh0LnN1YnN0cmluZyh0ZXh0LmluZGV4T2YoJ1wnJykgKyAxLAotICAgICAgICAgICAgICAgICAgICB0ZXh0Lmxhc3RJbmRleE9mKCdcJycpKSk7Ci0gICAgICAgICAgICByZXR1cm4gZ2M7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBsaXRlcmFsLiAiICsgbm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uTGl0ZXJhbChUcmVlIG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGdldExpdGVyYWwobm9kZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBvbklkKFRyZWUgbm9kZSkgewotICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBvblRleHRMaXRlcmFsKFRyZWUgbm9kZSkgewotICAgICAgICBpbnQgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IG5vZGUuZ2V0VGV4dCgpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfUEhSQVNFX1NUUklOR19MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nVXRpbC51bmVzY2FwZSh0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSksIG51bGwpOwotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX1NFQVJDSF9XT1JEX0xJVDoKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlsLnVuZXNjYXBlKHRleHQsIG51bGwpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVua25vd24gdGV4dCBsaXRlcmFsLiAiICsgbm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IG9uTGl0ZXJhbExpc3QoVHJlZSBub2RlKSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiByZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4obm9kZS5nZXRDaGlsZENvdW50KCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIFRyZWUgbGl0ZXJhbCA9IG5vZGUuZ2V0Q2hpbGQoaSk7Ci0gICAgICAgICAgICByZXMuYWRkKGdldExpdGVyYWwobGl0ZXJhbCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8VHJlZT4gZ2V0Q2hpbGRyZW5Bc0xpc3QoVHJlZSBub2RlKSB7Ci0gICAgICAgIExpc3Q8VHJlZT4gcmVzID0gbmV3IEFycmF5TGlzdDxUcmVlPihub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5nZXRDaGlsZENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgVHJlZSBjaGlsZE5ub2RlID0gbm9kZS5nZXRDaGlsZChpKTsKLSAgICAgICAgICAgIHJlcy5hZGQoY2hpbGRObm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9BYnN0cmFjdFF1ZXJ5VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvQWJzdHJhY3RRdWVyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhNTIwNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9BYnN0cmFjdFF1ZXJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5xdWVyeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eVN0cmluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLkRvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnR5cGVzLlByb3BlcnR5Q3JlYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZURlZmluaXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRdWVyeVdhbGtlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5QcmVkaWNhdGVXYWxrZXJCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5T2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5VXRpbFN0cmljdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVlcnlUZXN0IHsKLQotICAgIHByb3RlY3RlZCBQcmVkaWNhdGVXYWxrZXJCYXNlIHByZWRpY2F0ZVdhbGtlcjsKLSAgICBwcm90ZWN0ZWQgVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXI7Ci0gICAgcHJvdGVjdGVkIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqOwotICAgIHByb3RlY3RlZCBUeXBlRGVmaW5pdGlvbiBteVR5cGUsIG15VHlwZUNvcHksIGJvb2tUeXBlOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVlfRE9DX1RZUEUgPSAiTXlEb2NUeXBlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNWV9ET0NfVFlQRV9DT1BZID0gIk15RG9jVHlwZUNvcHkiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xfUFJPUCA9ICJNeUJvb2xlYW5Qcm9wIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfUFJPUCA9ICJNeVN0cmluZ1Byb3AiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9QUk9QID0gIk15SW50ZWdlclByb3AiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS19UWVBFID0gIkJvb2tUeXBlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRV9QUk9QID0gIlRpdGxlIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfUFJPUCA9ICJBdXRob3IiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElTQk5fUFJPUCA9ICJJU0JOIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJfREFURV9QUk9QID0gIlB1Ymxpc2hpbmdEYXRlIjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKFR5cGVNYW5hZ2VyIHRtLCBQcmVkaWNhdGVXYWxrZXJCYXNlIHB3KSB7Ci0gICAgICAgIHR5cGVNYW5hZ2VyID0gdG07Ci0gICAgICAgIHByZWRpY2F0ZVdhbGtlciA9IHB3OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBRdWVyeVV0aWxTdHJpY3QgdHJhdmVyc2VTdGF0ZW1lbnQoU3RyaW5nIHN0YXRlbWVudCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gbmV3IFF1ZXJ5VXRpbFN0cmljdChzdGF0ZW1lbnQsIHR5cGVNYW5hZ2VyLCBwcmVkaWNhdGVXYWxrZXIpOwotICAgICAgICBxdWVyeVV0aWwucHJvY2Vzc1N0YXRlbWVudCgpOwotICAgICAgICByZXR1cm4gcXVlcnlVdGlsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBRdWVyeVV0aWxTdHJpY3QgdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSBuZXcgUXVlcnlVdGlsU3RyaWN0KHN0YXRlbWVudCwgdHlwZU1hbmFnZXIsIHByZWRpY2F0ZVdhbGtlcik7Ci0gICAgICAgIHF1ZXJ5VXRpbC5wcm9jZXNzU3RhdGVtZW50VXNpbmdDbWlzRXhjZXB0aW9ucygpOwotICAgICAgICByZXR1cm4gcXVlcnlVdGlsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzUXVlcnlXYWxrZXIgZ2V0V2Fsa2VyKFN0cmluZyBzdGF0ZW1lbnQpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSBuZXcgUXVlcnlVdGlsU3RyaWN0KHN0YXRlbWVudCwgdHlwZU1hbmFnZXIsIHByZWRpY2F0ZVdhbGtlcik7Ci0gICAgICAgIHF1ZXJ5VXRpbC5wcm9jZXNzU3RhdGVtZW50VXNpbmdDbWlzRXhjZXB0aW9ucygpOwotICAgICAgICBxdWVyeU9iaiA9IHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpOwotICAgICAgICByZXR1cm4gcXVlcnlVdGlsLmdldFdhbGtlcigpOwotICAgIH0KLQotICAgIC8vIEhlbHBlciB0byBjcmVhdGUgc29tZSB0eXBlcyBmb3IgdGVzdGluZwotCi0gICAgcHJvdGVjdGVkIExpc3Q8VHlwZURlZmluaXRpb24+IGNyZWF0ZVR5cGVzKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdHlwZUZhY3RvcnkgPSBEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKTsKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gdHlwZURlZnMgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBGaXJzdCB0ZXN0IHR5cGUKLSAgICAgICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjbWlzVHlwZTsKLSAgICAgICAgICAgIGNtaXNUeXBlID0gdHlwZUZhY3RvcnkuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihEb2N1bWVudFR5cGVDcmVhdGlvbkhlbHBlci5nZXRDbWlzRG9jdW1lbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIE1ZX0RPQ19UWVBFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldElkKE1ZX0RPQ19UWVBFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERpc3BsYXlOYW1lKCJEb2N1bWVudCBUeXBlIGZvciBWYWxpZGF0aW9uIik7Ci0KLSAgICAgICAgICAgIFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24gcHJvcDEgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZUJvb2xlYW5EZWZpbml0aW9uKEJPT0xfUFJPUCwKLSAgICAgICAgICAgICAgICAgICAgIlNhbXBsZSBCb29sZWFuIFByb3BlcnR5IiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKSBwcm9wMSkuc2V0SXNSZXF1aXJlZCh0cnVlKTsKLQotICAgICAgICAgICAgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uIHByb3AyID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlci5jcmVhdGVTdHJpbmdEZWZpbml0aW9uKFNUUklOR19QUk9QLAotICAgICAgICAgICAgICAgICAgICAiU2FtcGxlIFN0cmluZyBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCBwcm9wMyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlckRlZmluaXRpb24oSU5UX1BST1AsCi0gICAgICAgICAgICAgICAgICAgICJTYW1wbGUgSW50ZWdlciBQcm9wZXJ0eSIsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpOwotCi0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDEpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AyKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMyk7Ci0KLSAgICAgICAgICAgIHR5cGVEZWZzLmFkZChjbWlzVHlwZSk7Ci0gICAgICAgICAgICBteVR5cGUgPSBjbWlzVHlwZTsKLQotICAgICAgICAgICAgLy8gYWRkIGFub3RoZXIgdHlwZSBkZWZpbml0aW9uIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBjbWlzVHlwZSA9IHR5cGVGYWN0b3J5LmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oRG9jdW1lbnRUeXBlQ3JlYXRpb25IZWxwZXIuZ2V0Q21pc0RvY3VtZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICBNWV9ET0NfVFlQRV9DT1BZKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERpc3BsYXlOYW1lKCJEb2N1bWVudCBUeXBlIGZvciBEdXBsaWNhdGVkIik7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBzYW1lIHByb3BlcnRpZXMKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDIpOwotICAgICAgICAgICAgY21pc1R5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKHByb3AzKTsKLSAgICAgICAgICAgIHR5cGVEZWZzLmFkZChjbWlzVHlwZSk7Ci0gICAgICAgICAgICBteVR5cGVDb3B5ID0gY21pc1R5cGU7Ci0KLSAgICAgICAgICAgIC8vIFNlY29uZCB0ZXN0IHR5cGUKLQotICAgICAgICAgICAgY21pc1R5cGUgPSB0eXBlRmFjdG9yeS5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKERvY3VtZW50VHlwZUNyZWF0aW9uSGVscGVyLmdldENtaXNEb2N1bWVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgQk9PS19UWVBFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLnNldERpc3BsYXlOYW1lKCJCb29rIERvY3VtZW50IFR5cGUiKTsKLQotICAgICAgICAgICAgcHJvcDIgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZVN0cmluZ0RlZmluaXRpb24oVElUTEVfUFJPUCwgIlRpdGxlIG9mIEJvb2siLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wMik7Ci0KLSAgICAgICAgICAgIHByb3AyID0gUHJvcGVydHlDcmVhdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlU3RyaW5nRGVmaW5pdGlvbihBVVRIT1JfUFJPUCwgIkF1dGhvciBvZiBCb29rIiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDIpOwotCi0gICAgICAgICAgICBwcm9wMyA9IFByb3BlcnR5Q3JlYXRpb25IZWxwZXIuY3JlYXRlSW50ZWdlckRlZmluaXRpb24oSVNCTl9QUk9QLCAiSVNCTiBvZiBCb29rIiwgVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgICAgICBjbWlzVHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24ocHJvcDMpOwotCi0gICAgICAgICAgICBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwgcHJvcDQgPSBQcm9wZXJ0eUNyZWF0aW9uSGVscGVyLmNyZWF0ZURhdGVUaW1lRGVmaW5pdGlvbihQVUJfREFURV9QUk9QLAotICAgICAgICAgICAgICAgICAgICAiUHVibGlzaGluZyBEYXRlIG9mIEJvb2siLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKTsKLSAgICAgICAgICAgIGNtaXNUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wNCk7Ci0KLSAgICAgICAgICAgIHR5cGVEZWZzLmFkZChjbWlzVHlwZSk7Ci0gICAgICAgICAgICBib29rVHlwZSA9IGNtaXNUeXBlOwotCi0gICAgICAgICAgICByZXR1cm4gdHlwZURlZnM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gY3JlYXRpbmcgYnVpbHQtaW4gSW5NZW1vcnkgdHlwZXMuIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L0V2YWxRdWVyeVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L0V2YWxRdWVyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4OTlkOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9FdmFsUXVlcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5xdWVyeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5Vbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLkNPTVBMRVhfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX0JPT0xFQU47Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9EQVRFVElNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX0RFQ0lNQUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9JRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX0lOVDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5BYnN0cmFjdFNlcnZpY2VUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEV2YWxRdWVyeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFdmFsUXVlcnlUZXN0LmNsYXNzKTsKLSAgICBwcml2YXRlIFF1ZXJ5VGVzdERhdGFDcmVhdG9yIGRhdGFDcmVhdG9yOwotICAgIHN0YXRpYyBpbnQgQ09VTlQgPSAwOwotCi0gICAgQE92ZXJyaWRlCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICAvLyBpbml0aWFsaXplIHF1ZXJ5IG9iamVjdCB3aXRoIHR5cGUgbWFuYWdlcgotICAgICAgICBzdXBlci5zZXRUeXBlQ3JlYXRvckNsYXNzKFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgLy8gY3JlYXRlIHRlc3QgZGF0YQotICAgICAgICBkYXRhQ3JlYXRvciA9IG5ldyBRdWVyeVRlc3REYXRhQ3JlYXRvcihmUmVwb3NpdG9yeUlkLCBmUm9vdEZvbGRlcklkLCBmT2JqU3ZjLCBmVmVyU3ZjKTsKLSAgICAgICAgZGF0YUNyZWF0b3IuY3JlYXRlQmFzaWNUZXN0RGF0YSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBsb2cuZGVidWcoInRlYXJEb3duIHN0YXJ0ZWQuIik7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIGxvZy5kZWJ1ZygidGVhckRvd24gZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGwoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdEFsbC4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJhbHBoYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHRDb250YWlucygiamVucyIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdEFsbC4iKTsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEJvb2xlYW4gdGVzdHMKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5FcXVhbHMoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdEJvb2xlYW5FcXVhbHMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0JPT0xFQU4gKyAiPSB0cnVlIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImdhbW1hIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0Qm9vbGVhbkVxdWFscy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFuTm90RXF1YWxzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RCb29sZWFuTm90RXF1YWxzLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9CT09MRUFOICsgIj0gZmFsc2UiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYmV0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0Qm9vbGVhbk5vdEVxdWFscy4iKTsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEludGVnZXIgdGVzdHMKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJFcXVhbHMoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdEludGVnZXJFcXVhbHMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0lOVCArICI9IDEwMCI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0SW50ZWdlckVxdWFscy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyTm90RXF1YWxzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RJbnRlZ2VyTm90RXF1YWxzLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9JTlQgKyAiPD4gMTAwIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZGVsdGEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RJbnRlZ2VyTm90RXF1YWxzLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJMZXNzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RJbnRlZ2VyTGVzcy4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFBST1BfSURfSU5UICsgIjwgMCI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJhbHBoYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJiZXRhIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0SW50ZWdlckxlc3MuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlckxlc3NPckVxdWFsKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RJbnRlZ2VyTGVzc09yRXF1YWwuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0lOVCArICI8PSAwIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RJbnRlZ2VyTGVzc09yRXF1YWwuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlckdyZWF0ZXIoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdEludGVnZXJHcmVhdGVyLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9JTlQgKyAiPiAwIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RJbnRlZ2VyR3JlYXRlci4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyR3JlYXRlck9yRXF1YWwoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdEludGVnZXJHcmVhdGVyT3JFcXVhbC4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFBST1BfSURfSU5UICsgIj49IDAiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZGVsdGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZXBzaWxvbiIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdEludGVnZXJHcmVhdGVyT3JFcXVhbC4iKTsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIERlY2ltYWwgdGVzdHMKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlY2ltYWxFcXVhbHMoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdERlY2ltYWxFcXVhbHMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0RFQ0lNQUwgKyAiPSAxLjIzNDU2RS02IjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0RGVjaW1hbEVxdWFscy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsTm90RXF1YWxzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3REZWNpbWFsTm90RXF1YWxzLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9ERUNJTUFMICsgIjw+IDEuMjM0NTZFLTYiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYWxwaGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYmV0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJnYW1tYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0RGVjaW1hbE5vdEVxdWFscy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsTGVzcygpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0RGVjaW1hbExlc3MuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0RFQ0lNQUwgKyAiPCAxLjIzNDU2RS02IjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3REZWNpbWFsTGVzcy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsTGVzc09yRXF1YWwoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdERlY2ltYWxMZXNzT3JFcXVhbC4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFBST1BfSURfREVDSU1BTCArICI8PSAxLjIzNDU2RS02IjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZGVsdGEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3REZWNpbWFsTGVzc09yRXF1YWwuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjaW1hbEdyZWF0ZXIoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdERlY2ltYWxHcmVhdGVyLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9ERUNJTUFMICsgIj4gMS4yMzQ1NkUtNiI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJnYW1tYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0RGVjaW1hbEdyZWF0ZXIuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjaW1hbEdyZWF0ZXJPckVxdWFsKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3REZWNpbWFsR3JlYXRlck9yRXF1YWwuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0RFQ0lNQUwgKyAiPj0gMS4yMzQ1NkUtNiI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJnYW1tYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJkZWx0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0RGVjaW1hbEdyZWF0ZXJPckVxdWFsLiIpOwotICAgIH0KLQotICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gRGF0ZVRpbWUgdGVzdHMKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERhdGVFcXVhbHMoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdERhdGVFcXVhbHMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0RBVEVUSU1FCi0gICAgICAgICAgICAgICAgKyAiPSBUSU1FU1RBTVAgJzIwMzgtMDEtMjBUMDA6MDA6MDAuMDAwWiciOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZGVsdGEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3REYXRlRXF1YWxzLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERhdGVOb3RFcXVhbHMoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdERhdGVOb3RFcXVhbHMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0RBVEVUSU1FCi0gICAgICAgICAgICAgICAgKyAiPD4gVElNRVNUQU1QICcyMDM4LTAxLTIwVDAwOjAwOjAwLjAwMFonIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZXBzaWxvbiIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdERhdGVOb3RFcXVhbHMuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZUxlc3MoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdERhdGVMZXNzLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9EQVRFVElNRQotICAgICAgICAgICAgICAgICsgIjwgVElNRVNUQU1QICcyMDM4LTAxLTIwVDAwOjAwOjAwLjAwMFonIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3REYXRlTGVzcy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlTGVzc09yRXF1YWxzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3REYXRlTGVzc09yRXF1YWxzLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9EQVRFVElNRQotICAgICAgICAgICAgICAgICsgIjw9IFRJTUVTVEFNUCAnMjAzOC0wMS0yMFQwMDowMDowMC4wMDBaJyI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJhbHBoYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJiZXRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImdhbW1hIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0RGF0ZUxlc3NPckVxdWFscy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlZ3JlYXRlcigpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0RGF0ZUdyZWF0ZXJPckVxdWFsLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9EQVRFVElNRQotICAgICAgICAgICAgICAgICsgIj4gVElNRVNUQU1QICcyMDM4LTAxLTIwVDAwOjAwOjAwLjAwMFonIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3REYXRlR3JlYXRlck9yRXF1YWwuIik7Ci0gICAgfQotCi0gICAgLy8gQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZUdyZWF0ZXJPckVxdWFsKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3REYXRlR3JlYXRlck9yRXF1YWwuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0RBVEVUSU1FCi0gICAgICAgICAgICAgICAgKyAiPj0gVElNRVNUQU1QICcyMDM4LTAxLTIwVDAwOjAwOjAwLjAwMFonIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3REYXRlR3JlYXRlck9yRXF1YWwuIik7Ci0gICAgfQotCi0gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gU3RyaW5nIHRlc3RzCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdFcXVhbHMoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdFN0cmluZ0VxdWFscy4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkcKLSAgICAgICAgICAgICAgICArICI9ICdBbHBoYSciOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYWxwaGEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RTdHJpbmdFcXVhbHMuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTm90RXF1YWxzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RTdHJpbmdOb3RFcXVhbHMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiPD4gJ0dhbW1hJyI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJhbHBoYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJiZXRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RTdHJpbmdOb3RFcXVhbHMuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGVzcygpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0U3RyaW5nTGVzcy4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkcKLSAgICAgICAgICAgICAgICArICI8ICdEZWx0YSciOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYWxwaGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYmV0YSIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdFN0cmluZ0xlc3MuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGVzc09yRXF1YWxzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RTdHJpbmdMZXNzT3JFcXVhbHMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiPD0gJ0RlbHRhJyI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJhbHBoYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJiZXRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0U3RyaW5nTGVzc09yRXF1YWxzLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0dyZWF0ZXIoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdFN0cmluZ0dyZWF0ZXIuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiPiAnRGVsdGEnIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImdhbW1hIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RTdHJpbmdHcmVhdGVyLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0dyZWF0ZXJPckVxdWFscygpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0U3RyaW5nR3JlYXRlck9yRXF1YWxzLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklORwotICAgICAgICAgICAgICAgICsgIj49ICdEZWx0YSciOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZGVsdGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZXBzaWxvbiIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdFN0cmluZ0dyZWF0ZXJPckVxdWFscy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdFc2NhcGUoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdFN0cmluZ0VzY2FwZS4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpICsgIiBXSEVSRSAiICsgUHJvcGVydHlJZHMuTkFNRQotICAgICAgICAgICAgICAgICsgIj0nSm9oblxcJ3MgRG9jdW1lbnQnIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoICJKb2huJ3MgRG9jdW1lbnQiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RTdHJpbmdFc2NhcGUuIik7Ci0gICAgfQotICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEJvb2xlYW4gY29uZGl0aW9uIHRlc3RzCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmQoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdEFuZC4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFBST1BfSURfSU5UICsgIj0gNTAgQU5EICIgKyBQUk9QX0lEX0JPT0xFQU4KLSAgICAgICAgICAgICAgICArICI9IHRydWUiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZGVsdGEiLCByZXMpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9JTlQgKyAiPSA1MCBBTkQgIiArIFBST1BfSURfQk9PTEVBTgotICAgICAgICAgICAgICAgICsgIj0gZmFsc2UiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0QW5kLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9yKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RPci4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFBST1BfSURfSU5UICsgIj0gLTUwIE9SICIgKyBQUk9QX0lEX0JPT0xFQU4KLSAgICAgICAgICAgICAgICArICI9IGZhbHNlIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZXBzaWxvbiIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdE9yLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdCgpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0Tm90Li4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSBOT1QgIiArIFBST1BfSURfSU5UICsgIj0gNTAiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYWxwaGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYmV0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJnYW1tYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0Tm90LiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9yZGVyQnlTdHJpbmcoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdE9yZGVyQnlTdHJpbmcuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIE9SREVSIEJZICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJhbHBoYSIsIDAsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImJldGEiLCAxLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJkZWx0YSIsIDIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImVwc2lsb24iLCAzLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJnYW1tYSIsIDQsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIE9SREVSIEJZICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HICsgIiBERVNDIjsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImFscGhhIiwgNCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiYmV0YSIsIDMsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImRlbHRhIiwgMiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZXBzaWxvbiIsIDEsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImdhbW1hIiwgMCwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0T3JkZXJCeVN0cmluZy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlckJ5SW50ZWdlcigpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0T3JkZXJCeUludGVnZXIuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIE9SREVSIEJZICIgKyBQUk9QX0lEX0lOVDsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiYWxwaGEiLCAwLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJiZXRhIiwgMSwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZ2FtbWEiLCAyLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJkZWx0YSIsIDMsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImVwc2lsb24iLCA0LCByZXMpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBPUkRFUiBCWSAiICsgUFJPUF9JRF9JTlQgKyAiIERFU0MiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiYWxwaGEiLCA0LCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJiZXRhIiwgMywgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZ2FtbWEiLCAyLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJkZWx0YSIsIDEsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImVwc2lsb24iLCAwLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RPcmRlckJ5SW50ZWdlci4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlckJ5RGVjaW1hbCgpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0T3JkZXJCeURlY2ltYWwuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIE9SREVSIEJZICIgKyBQUk9QX0lEX0RFQ0lNQUw7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImFscGhhIiwgMCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiYmV0YSIsIDEsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImRlbHRhIiwgMiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZ2FtbWEiLCAzLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJlcHNpbG9uIiwgNCwgcmVzKSk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgT1JERVIgQlkgIiArIFBST1BfSURfREVDSU1BTCArICIgREVTQyI7Ci0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJhbHBoYSIsIDQsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImJldGEiLCAzLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJkZWx0YSIsIDIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImdhbW1hIiwgMSwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZXBzaWxvbiIsIDAsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdE9yZGVyQnlEZWNpbWFsLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9yZGVyQnlEYXRlKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RPcmRlckJ5RGF0ZS4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgT1JERVIgQlkgIiArIFBST1BfSURfREFURVRJTUU7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImJldGEiLCAwLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJhbHBoYSIsIDEsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImdhbW1hIiwgMiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZGVsdGEiLCAzLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJlcHNpbG9uIiwgNCwgcmVzKSk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgT1JERVIgQlkgIiArIFBST1BfSURfREFURVRJTUUgKyAiIERFU0MiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiYmV0YSIsIDQsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImFscGhhIiwgMywgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZ2FtbWEiLCAyLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJkZWx0YSIsIDEsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImVwc2lsb24iLCAwLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RPcmRlckJ5RGF0ZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlckJ5Qm9vbCgpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0T3JkZXJCeUJvb2wuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIE9SREVSIEJZICIgKyBQUk9QX0lEX0JPT0xFQU47Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImJldGEiLCAwLCByZXMpIHx8IHJlc3VsdENvbnRhaW5zQXRQb3MoImJldGEiLCAxLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJlcHNpbG9uIiwgMCwgcmVzKSB8fCByZXN1bHRDb250YWluc0F0UG9zKCJlcHNpbG9uIiwgMSwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiYWxwaGEiLCAyLCByZXMpIHx8IHJlc3VsdENvbnRhaW5zQXRQb3MoImFscGhhIiwgMywgcmVzKQotICAgICAgICAgICAgICAgIHx8IHJlc3VsdENvbnRhaW5zQXRQb3MoImFscGhhIiwgNCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZ2FtbWEiLCAyLCByZXMpIHx8IHJlc3VsdENvbnRhaW5zQXRQb3MoImdhbW1hIiwgMywgcmVzKQotICAgICAgICAgICAgICAgIHx8IHJlc3VsdENvbnRhaW5zQXRQb3MoImdhbW1hIiwgNCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZGVsdGEiLCAyLCByZXMpIHx8IHJlc3VsdENvbnRhaW5zQXRQb3MoImRlbHRhIiwgMywgcmVzKQotICAgICAgICAgICAgICAgIHx8IHJlc3VsdENvbnRhaW5zQXRQb3MoImRlbHRhIiwgNCwgcmVzKSk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgT1JERVIgQlkgIiArIFBST1BfSURfQk9PTEVBTiArICIgREVTQyI7Ci0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc0F0UG9zKCJiZXRhIiwgMywgcmVzKSB8fCByZXN1bHRDb250YWluc0F0UG9zKCJiZXRhIiwgNCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNBdFBvcygiZXBzaWxvbiIsIDMsIHJlcykgfHwgcmVzdWx0Q29udGFpbnNBdFBvcygiZXBzaWxvbiIsIDQsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImFscGhhIiwgMiwgcmVzKSB8fCByZXN1bHRDb250YWluc0F0UG9zKCJhbHBoYSIsIDEsIHJlcykKLSAgICAgICAgICAgICAgICB8fCByZXN1bHRDb250YWluc0F0UG9zKCJhbHBoYSIsIDAsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImdhbW1hIiwgMiwgcmVzKSB8fCByZXN1bHRDb250YWluc0F0UG9zKCJnYW1tYSIsIDEsIHJlcykKLSAgICAgICAgICAgICAgICB8fCByZXN1bHRDb250YWluc0F0UG9zKCJnYW1tYSIsIDAsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zQXRQb3MoImRlbHRhIiwgMiwgcmVzKSB8fCByZXN1bHRDb250YWluc0F0UG9zKCJkZWx0YSIsIDEsIHJlcykKLSAgICAgICAgICAgICAgICB8fCByZXN1bHRDb250YWluc0F0UG9zKCJkZWx0YSIsIDAsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdE9yZGVyQnlCb29sLiIpOwotICAgIH0KLQotICAgIC8vIHJlcG9ydGVkIEpJUkEgaXNzdWUgQ01JUy01MTAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlckJ5U3lzdGVtUHJvcGVydGllcygpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0T3JkZXJCeVN5c3RlbVByb3BlcnRpZXMuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgT1JERVIgQlkgIiArIFByb3BlcnR5SWRzLk5BTUU7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogZnJvbSBjbWlzOmRvY3VtZW50IE9SREVSIEJZICIgKyBQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFICsgIiBBU0MiOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogZnJvbSBjbWlzOmRvY3VtZW50IE9SREVSIEJZICIgKyBQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFICsgIiBERVNDIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RPcmRlckJ5U3lzdGVtUHJvcGVydGllcy4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdElzTnVsbC4uLiIpOwotCi0gICAgICAgIGRhdGFDcmVhdG9yLmNyZWF0ZU51bGxUZXN0RG9jdW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0lOVCArICIgSVMgTlVMTCI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJudWxsZG9jIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0SXNOdWxsLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElzTm90TnVsbCgpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0SXNOb3ROdWxsLi4uIik7Ci0gICAgICAgIGRhdGFDcmVhdG9yLmNyZWF0ZU51bGxUZXN0RG9jdW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0lOVCArICIgSVMgTk9UIE5VTEwiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYWxwaGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYmV0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJnYW1tYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJkZWx0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0SXNOb3ROdWxsLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcGF0dGVyblRlc3QoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgcGF0dGVyblRlc3QuLi4iKTsKLSAgICAgICAgU3RyaW5nIHJlcyA9IEluTWVtb3J5UXVlcnlQcm9jZXNzb3IudHJhbnNsYXRlUGF0dGVybigiQUJDJWRlZiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFCQy4qZGVmIiwgcmVzKTsKLSAgICAgICAgcmVzID0gSW5NZW1vcnlRdWVyeVByb2Nlc3Nvci50cmFuc2xhdGVQYXR0ZXJuKCIlYWJjIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiLiphYmMiLCByZXMpOwotICAgICAgICByZXMgPSBJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yLnRyYW5zbGF0ZVBhdHRlcm4oImFiYyUiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMuKiIsIHJlcyk7Ci0gICAgICAgIHJlcyA9IEluTWVtb3J5UXVlcnlQcm9jZXNzb3IudHJhbnNsYXRlUGF0dGVybigiQUJDXFwlZGVmIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQUJDXFwlZGVmIiwgcmVzKTsKLSAgICAgICAgcmVzID0gSW5NZW1vcnlRdWVyeVByb2Nlc3Nvci50cmFuc2xhdGVQYXR0ZXJuKCJcXCVhYmMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXCVhYmMiLCByZXMpOwotICAgICAgICByZXMgPSBJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yLnRyYW5zbGF0ZVBhdHRlcm4oImFiYyVkZWYlZ2hpIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWJjLipkZWYuKmdoaSIsIHJlcyk7Ci0gICAgICAgIHJlcyA9IEluTWVtb3J5UXVlcnlQcm9jZXNzb3IudHJhbnNsYXRlUGF0dGVybigiYWJjJWRlZlxcJWdoaSVqa2wiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMuKmRlZlxcJWdoaS4qamtsIiwgcmVzKTsKLQotICAgICAgICByZXMgPSBJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yLnRyYW5zbGF0ZVBhdHRlcm4oIkFCQ19kZWYiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQkMuZGVmIiwgcmVzKTsKLSAgICAgICAgcmVzID0gSW5NZW1vcnlRdWVyeVByb2Nlc3Nvci50cmFuc2xhdGVQYXR0ZXJuKCJfYWJjIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiLmFiYyIsIHJlcyk7Ci0gICAgICAgIHJlcyA9IEluTWVtb3J5UXVlcnlQcm9jZXNzb3IudHJhbnNsYXRlUGF0dGVybigiYWJjXyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFiYy4iLCByZXMpOwotICAgICAgICByZXMgPSBJbk1lbW9yeVF1ZXJ5UHJvY2Vzc29yLnRyYW5zbGF0ZVBhdHRlcm4oIkFCQ1xcX2RlZiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFCQ1xcX2RlZiIsIHJlcyk7Ci0gICAgICAgIHJlcyA9IEluTWVtb3J5UXVlcnlQcm9jZXNzb3IudHJhbnNsYXRlUGF0dGVybigiXFxfYWJjIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXFxfYWJjIiwgcmVzKTsKLSAgICAgICAgcmVzID0gSW5NZW1vcnlRdWVyeVByb2Nlc3Nvci50cmFuc2xhdGVQYXR0ZXJuKCJhYmNfZGVmX2doaSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFiYy5kZWYuZ2hpIiwgcmVzKTsKLSAgICAgICAgcmVzID0gSW5NZW1vcnlRdWVyeVByb2Nlc3Nvci50cmFuc2xhdGVQYXR0ZXJuKCJhYmNfZGVmXFxfZ2hpX2prbCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFiYy5kZWZcXF9naGkuamtsIiwgcmVzKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHBhdHRlcm5UZXN0LiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExpa2UoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdExpa2UuLi4iKTsKLSAgICAgICAgZGF0YUNyZWF0b3IuY3JlYXRlTGlrZVRlc3REb2N1bWVudHMoZlJvb3RGb2xkZXJJZCk7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklORwotICAgICAgICAgICAgICAgICsgIiBMSUtFICdBQkMlJyI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMiIsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiIExJS0UgJyVBQkMnIjsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMyIsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiIExJS0UgJyVBQkMlJyI7Ci0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygibGlrZWRvYzEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygibGlrZWRvYzIiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygibGlrZWRvYzMiLCByZXMpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklORwotICAgICAgICAgICAgICAgICsgIiBMSUtFICdBQl9ERUYnIjsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMSIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdExpa2UuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TGlrZSgpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0Tm90TGlrZS4uLiIpOwotICAgICAgICBkYXRhQ3JlYXRvci5jcmVhdGVMaWtlVGVzdERvY3VtZW50cyhmUm9vdEZvbGRlcklkKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiIE5PVCBMSUtFICdBQkMlJyI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMyIsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiIE5PVCBMSUtFICclYSciOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImxpa2Vkb2MxIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImxpa2Vkb2MxIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImxpa2Vkb2MzIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3ROb3RMaWtlLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEluRm9sZGVyKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RJbkZvbGRlci4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgSU5fRk9MREVSKCciICsgZlJvb3RGb2xkZXJJZCArICInKSI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJhbHBoYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJiZXRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImdhbW1hIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSBJTl9GT0xERVIoJyIgKyBkYXRhQ3JlYXRvci5nZXRGb2xkZXIxKCkgKyAiJykiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgSU5fRk9MREVSKCIgKyBDT01QTEVYX1RZUEUgKyAiLCAnIiArIGZSb290Rm9sZGVySWQgKyAiJykiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZGVsdGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZXBzaWxvbiIsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIElOX0ZPTERFUihVbmtub3duVHlwZSwgJyIgKyBkYXRhQ3JlYXRvci5nZXRGb2xkZXIyKCkKLSAgICAgICAgICAgICAgICArICInKSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmtub3duIHR5cGUgaW4gZm9sZGVyIHNob3VsZCB0aHJvdyBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS50b1N0cmluZygpLmNvbnRhaW5zKCJpcyBuZWl0aGVyIGEgdHlwZSBxdWVyeSBuYW1lIG5vciBhbiBhbGlhcyIpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZXhwZWN0ZWQgRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RJbkZvbGRlci4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJblRyZWUoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdEluVHJlZS4uLiIpOwotICAgICAgICBkYXRhQ3JlYXRvci5jcmVhdGVMaWtlVGVzdERvY3VtZW50cyhkYXRhQ3JlYXRvci5nZXRGb2xkZXIxMSgpKTsKLQotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgSU5fVFJFRSgiICsgQ09NUExFWF9UWVBFICsgIiwgJyIKLSAgICAgICAgICAgICAgICArIGRhdGFDcmVhdG9yLmdldEZvbGRlcjEoKSArICInKSI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMiIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJsaWtlZG9jMyIsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIElOX0ZPTERFUignIiArIGRhdGFDcmVhdG9yLmdldEZvbGRlcjEoKSArICInKSI7Ci0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSBJTl9UUkVFKCciICsgZGF0YUNyZWF0b3IuZ2V0Rm9sZGVyMigpICsgIicpIjsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIElOX1RSRUUoVW5rbm93blR5cGUsICciICsgZGF0YUNyZWF0b3IuZ2V0Rm9sZGVyMigpICsgIicpIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGZhaWwoIlVua25vd24gdHlwZSBpbiBmb2xkZXIgc2hvdWxkIHRocm93IGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLnRvU3RyaW5nKCkuY29udGFpbnMoImlzIG5laXRoZXIgYSB0eXBlIHF1ZXJ5IG5hbWUgbm9yIGFuIGFsaWFzIikpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJleHBlY3RlZCBFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdEluVHJlZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbigpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0Tm90SW4uLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HCi0gICAgICAgICAgICAgICAgKyAiIElOICgnQWxwaGEnLCAnQmV0YScsICdHYW1tYScpIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklORwotICAgICAgICAgICAgICAgICsgIiBJTiAoJ1RoZXRhJywgJ1BpJywgJ1JobycpIjsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdE5vdEluLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdEluKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3ROb3RJbi4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkcKLSAgICAgICAgICAgICAgICArICIgTk9UIElOICgnQWxwaGEnLCAnQmV0YScsICdHYW1tYScpIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklORwotICAgICAgICAgICAgICAgICsgIiBOT1QgSU4gKCdUaGV0YScsICdQaScsICdSaG8nKSI7Ci0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYWxwaGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYmV0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJnYW1tYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJkZWx0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJlcHNpbG9uIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0Tm90SW4uIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlWYWx1ZUluQW55KCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RNdWx0aVZhbHVlTm90SW5BbnkuLi4iKTsKLSAgICAgICAgZGF0YUNyZWF0b3IuY3JlYXRlTXVsdGlWYWx1ZURvY3VtZW50cygpOwotCi0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSBBTlkgIgotICAgICAgICAgICAgICAgICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklOR19NVUxUSV9WQUxVRSArICIgSU4gKCdyZWQnLCAnYmxhY2snLCAnZ3JleScpIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoIm12LWFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoIm12LWJldGEiLCByZXMpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSBBTlkgIgotICAgICAgICAgICAgICAgICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklOR19NVUxUSV9WQUxVRSArICIgSU4gKCdncmVlbicsICdibGFjaycsICdncmV5JykiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoIm12LWFscGhhIiwgcmVzKSk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgQU5ZICIKLSAgICAgICAgICAgICAgICArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkdfTVVMVElfVkFMVUUgKyAiIElOICgnd2hpdGUnLCAnYmxhY2snLCAnZ3JleScpIjsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdE11bHRpVmFsdWVOb3RJbkFueS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVZhbHVlTm90SW5BbnkoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdE11bHRpVmFsdWVOb3RJbkFueS4uLiIpOwotICAgICAgICBkYXRhQ3JlYXRvci5jcmVhdGVNdWx0aVZhbHVlRG9jdW1lbnRzKCk7Ci0KLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIEFOWSAiCi0gICAgICAgICAgICAgICAgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HX01VTFRJX1ZBTFVFICsgIiBOT1QgSU4gKCdyZWQnLCAnYmxhY2snLCAnZ3JleScpIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgQU5ZICIKLSAgICAgICAgICAgICAgICArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkdfTVVMVElfVkFMVUUgKyAiIE5PVCBJTiAoJ2dyZWVuJywgJ2JsYWNrJywgJ2dyZXknKSI7Ci0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygibXYtYmV0YSIsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIEFOWSAiCi0gICAgICAgICAgICAgICAgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HX01VTFRJX1ZBTFVFICsgIiBOT1QgSU4gKCd3aGl0ZScsICdibGFjaycsICdncmV5JykiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoIm12LWFscGhhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoIm12LWJldGEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RNdWx0aVZhbHVlTm90SW5BbnkuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlWYWx1ZUVxQW55KCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RNdWx0aVZhbHVlRXFBbnkuLi4iKTsKLSAgICAgICAgZGF0YUNyZWF0b3IuY3JlYXRlTXVsdGlWYWx1ZURvY3VtZW50cygpOwotCi0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAncmVkJyA9IEFOWSAiCi0gICAgICAgICAgICAgICAgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HX01VTFRJX1ZBTFVFOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygibXYtYWxwaGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygibXYtYmV0YSIsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICdibGFjaycgPSBBTlkgIgotICAgICAgICAgICAgICAgICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklOR19NVUxUSV9WQUxVRTsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICdibGFjaycgPSBBTlkgIgotICAgICAgICAgICAgICAgICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklORzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGZhaWwoIlVua25vd24gPSBBTlkgd2l0aCBzaW5nbGUgdmFsdWUgcHJvcCBzaG91bGQgdGhyb3cgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygib25seSBpcyBhbGxvd2VkIG9uIG11bHRpLXZhbHVlIHByb3BlcnRpZXMiKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImV4cGVjdGVkIEV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0TXVsdGlWYWx1ZUVxQW55LiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25zV2l0aFF1ZXJ5KCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RMYXN0ZXN0VmVyc2lvbnNXaXRoUXVlcnkuLi4iKTsKLSAgICAgICAgU3RyaW5nIGlkID0gZGF0YUNyZWF0b3IuY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5WRVJTSU9ORURfVFlQRTsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5QWxsVmVyc2lvbnMoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygidmVyMTIzIiwgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5WRVJTSU9OX1BST1BFUlRZX0lELCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygidmVyNDU2IiwgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5WRVJTSU9OX1BST1BFUlRZX0lELCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiMS4wIiwgUHJvcGVydHlJZHMuVkVSU0lPTl9MQUJFTCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoIjIuMCIsIFByb3BlcnR5SWRzLlZFUlNJT05fTEFCRUwsIHJlcykpOwotCi0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocmVzdWx0Q29udGFpbnMoIjEuMCIsIFByb3BlcnR5SWRzLlZFUlNJT05fTEFCRUwsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCIyLjAiLCBQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RMYXN0ZXN0VmVyc2lvbnNXaXRoUXVlcnkuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdGVzdFZlcnNpb25zV2l0aFF1ZXJ5KCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RMYXN0ZXN0VmVyc2lvbnNXaXRoUXVlcnkuLi4iKTsKLSAgICAgICAgU3RyaW5nIGlkID0gZGF0YUNyZWF0b3IuY3JlYXRlVmVyc2lvbmVkRG9jdW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5WRVJTSU9ORURfVFlQRTsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoInZlcjQ1NiIsIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTl9QUk9QRVJUWV9JRCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoIjIuMCIsIFByb3BlcnR5SWRzLlZFUlNJT05fTEFCRUwsIHJlcykpOwotCi0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocmVzdWx0Q29udGFpbnMoIjEuMCIsIFByb3BlcnR5SWRzLlZFUlNJT05fTEFCRUwsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCIyLjAiLCBQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RMYXN0ZXN0VmVyc2lvbnNXaXRoUXVlcnkuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNXb3JkKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RDb250YWluc1dvcmQuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIENPTlRBSU5TKCdjYXQnKSI7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJhbHBoYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJiZXRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0Q29udGFpbnNXb3JkLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zUGhyYXNlKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RDb250YWluc1BocmFzZS4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgQ09OVEFJTlMoJ1wiS2l0dHkgS2F0dHlcIicpIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImJldGEiLCByZXMpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RDb250YWluc1BocmFzZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc05vdCgpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0Q29udGFpbnNOb3QuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIENPTlRBSU5TKCctY2F0JykiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZ2FtbWEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiZXBzaWxvbiIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdENvbnRhaW5zTm90LiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT3IoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdENvbnRhaW5zT3IuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFIENPTlRBSU5TKCdjYXQgT1IgZG9nJykiOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYWxwaGEiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWlucygiYmV0YSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJnYW1tYSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJkZWx0YSIsIHJlcykpOwotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdENvbnRhaW5zT3IuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbmQoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgdGVzdENvbnRhaW5zQW5kLi4uIik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSBDT05UQUlOUygnY2F0IGRvZycpIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0Q29udGFpbnNBbmQuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbmRTY29yZSgpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0Q29udGFpbnNBbmRTY29yZS4uLiIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBjbWlzOm9iamVjdElkLGNtaXM6bmFtZSxTQ09SRSgpIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgQ09OVEFJTlMoJ2RvZycpIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImdhbW1hIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRlbHRhIiwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoMS4wLCAiU0VBUkNIX1NDT1JFIiwgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0Q29udGFpbnNBbmRTY29yZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RTZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3ROb3RTZXRQcm9wZXJ0aWVzLi4uIik7Ci0gICAgICAgIC8vIFBST1BfSURfSUQgaXMgbm90IHNldCBwcm9wZXJ0eQotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBjbWlzOm5hbWUsICIgKyBQUk9QX0lEX0lEICsgIiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIFdIRVJFICIgKyBQUk9QX0lEX0lOVAotICAgICAgICAgICAgICAgICsgIj0gMTAwIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc05vdFNldFByb3BlcnR5VmFsdWUoUFJPUF9JRF9JRCwgcmVzLmdldE9iamVjdHMoKS5nZXQoMCkpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiICsgUFJPUF9JRF9JTlQgKyAiPSAxMDAiOwotICAgICAgICByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImVwc2lsb24iLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc05vdFNldFByb3BlcnR5VmFsdWUoUFJPUF9JRF9JRCwgcmVzLmdldE9iamVjdHMoKS5nZXQoMCkpKTsKLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3ROb3RTZXRQcm9wZXJ0aWVzLiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlY29uZGFyeVR5cGVzKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RTZWNvbmRhcnlUeXBlcy4uLiIpOwotICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnRzIHdpdGggc2Vjb25kYXJ5IHR5cGVzIGluIGFkZGl0aW9uCi0gICAgICAgIGRhdGFDcmVhdG9yLmNyZWF0ZVNlY29uZGFyeVRlc3REb2N1bWVudHMoKTsKLQotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIENPTVBMRVhfVFlQRSArICIgV0hFUkUgIiArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkcKLSAgICAgICAgICAgICAgICArICI9ICdTZWNvbmRhcnknIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoImRvY3dpdGhzZWNvbmRhcnkiLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocmVzdWx0Q29udGFpbnMoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfU1RSSU5HX1BST1AsIHJlcykpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBTRUNPTkRBUllfVFlQRSArICIgV0hFUkUgIiArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX0lOVEVHRVJfUFJPUAotICAgICAgICAgICAgICAgICsgIj0gMTAwIjsKLSAgICAgICAgcmVzID0gZG9RdWVyeShzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmdldE9iamVjdHMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShyZXN1bHRDb250YWlucygiZG9jd2l0aHNlY29uZGFyeSIsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zKCJTZWNvbmRhcnkgUHJvcGVydHkgVmFsdWUiLCBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlNFQ09OREFSWV9TVFJJTkdfUFJPUCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnMoQmlnSW50ZWdlci52YWx1ZU9mKDEwMCksIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX0lOVEVHRVJfUFJPUCwgcmVzKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHJlc3VsdENvbnRhaW5zUHJvcGVydHkoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX1NUUklORywgcmVzKSk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiLi4uU3RvcCB0ZXN0U2Vjb25kYXJ5VHlwZXMuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vjb25kYXJ5Sm9pbigpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0U2Vjb25kYXJ5Sm9pbi4uLiIpOwotICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnRzIHdpdGggc2Vjb25kYXJ5IHR5cGVzIGluIGFkZGl0aW9uCi0gICAgICAgIGRhdGFDcmVhdG9yLmNyZWF0ZVNlY29uZGFyeVRlc3REb2N1bWVudHMoKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIExFRlQgSk9JTiAiICsgU0VDT05EQVJZX1RZUEUgKyAiIE9OICIgKyBDT01QTEVYX1RZUEUKLSAgICAgICAgICAgICAgICArICIuY21pczpvYmplY3RJZCA9ICIgKyBTRUNPTkRBUllfVFlQRSArICIuY21pczpvYmplY3RJZCBXSEVSRSBjbWlzOm5hbWUgTElLRSAnZG9jd2l0aHNlY29uZGFyeSUnIjsKLSAgICAgICAgT2JqZWN0TGlzdCByZXMgPSBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuZ2V0T2JqZWN0cygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNQcm9wZXJ0eShVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc1Byb3BlcnR5KFByb3BlcnR5SWRzLk5BTUUsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zUHJvcGVydHkoUHJvcGVydHlJZHMuT0JKRUNUX0lELCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc1Byb3BlcnR5KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc1Byb3BlcnR5KFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX1NUUklOR19QUk9QLCByZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc1Byb3BlcnR5KFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX0lOVEVHRVJfUFJPUCwgcmVzKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBhIHF1ZXJ5IHdpdGggc2Vjb25kYXJ5IHR5cGVzIG1hdGNoaW5nIG9ubHkgb25lIGRvY3VtZW50IG5vdAotICAgICAgICAvLyBoYXZpbmcgdGhpcyBzZWNvbmRhcnkgdHlwZQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBMRUZUIEpPSU4gIiArIFNFQ09OREFSWV9UWVBFICsgIiBPTiAiICsgQ09NUExFWF9UWVBFCi0gICAgICAgICAgICAgICAgKyAiLmNtaXM6b2JqZWN0SWQgPSAiICsgU0VDT05EQVJZX1RZUEUgKyAiLmNtaXM6b2JqZWN0SWQgV0hFUkUgY21pczpuYW1lID0gJ2FscGhhJyI7Ci0gICAgICAgIHJlcyA9IGRvUXVlcnkoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcy5nZXRPYmplY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHRDb250YWluc1Byb3BlcnR5KFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkcsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zUHJvcGVydHkoUHJvcGVydHlJZHMuTkFNRSwgcmVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0Q29udGFpbnNQcm9wZXJ0eShQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zUHJvcGVydHkoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zUHJvcGVydHkoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfU1RSSU5HX1BST1AsIHJlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdENvbnRhaW5zUHJvcGVydHkoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfSU5URUdFUl9QUk9QLCByZXMpKTsKLQotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdFNlY29uZGFyeUpvaW4uIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDb250YWlucygpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJTdGFydCB0ZXN0TXVsdGlwbGVDb250YWlucy4uLiIpOwotICAgICAgICBkYXRhQ3JlYXRvci5jcmVhdGVTZWNvbmRhcnlUZXN0RG9jdW1lbnRzKCk7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSAiICsgQ09NUExFWF9UWVBFICsgIiBXSEVSRSBDT05UQUlOUygnYWJjJykgQU5EIENPTlRBSU5TKCcxMjMnKSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBmYWlsKCJNdWx0aXBsZSBDT05UQUlOUyBjbGF1c2VzIHNob3VsZCB0aHJvdyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygiTW9yZSB0aGFuIG9uZSBDT05UQUlOUyIpKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIi4uLlN0b3AgdGVzdE11bHRpcGxlQ29udGFpbnMuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZGZpbmVkUXVlcnlOYW1lKCkgewotICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IHRlc3RQcmVkZmluZWRRdWVyeU5hbWUuLi4iKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgY21pczpuYW1lIGFzIGFiYywgU0NPUkUoKSBGUk9NICIgKyBDT01QTEVYX1RZUEUgKyAiIE9SREVSIEJZIFNFQVJDSF9TQ09SRSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkb1F1ZXJ5KHN0YXRlbWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJTRUFSQ0hfU0NPUkUgaW4gT1JERVJfQlkgbXVzdCBiZSBzdXBwb3J0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmRlYnVnKCIuLi5TdG9wIHRlc3RQcmVkZmluZWRRdWVyeU5hbWUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RMaXN0IGRvUXVlcnkoU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiXG5FeGVjdXRpbmcgcXVlcnk6ICIgKyBxdWVyeVN0cmluZyk7Ci0gICAgICAgIE9iamVjdExpc3QgcmVzID0gZkRpc2NTdmMucXVlcnkoZlJlcG9zaXRvcnlJZCwgcXVlcnlTdHJpbmcsIGZhbHNlLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgbG9nLmRlYnVnKCJRdWVyeSByZXN1bHQsIG51bWJlciBvZiBtYXRjaGluZyBvYmplY3RzOiAiICsgcmVzLmdldE51bUl0ZW1zKCkpOwotICAgICAgICBmb3IgKE9iamVjdERhdGEgb2QgOiByZXMuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcHJvcERhdGEgPSBvZC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHByb3BEYXRhKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBtYXRjaGluZyBvYmplY3Q6ICIgKyBwcm9wRGF0YS5nZXRGaXJzdFZhbHVlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIG1hdGNoaW5nIG9iamVjdDogKHVua25vd24sIG5vIG5hbWUpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdExpc3QgZG9RdWVyeUFsbFZlcnNpb25zKFN0cmluZyBxdWVyeVN0cmluZykgewotICAgICAgICBsb2cuZGVidWcoIlxuRXhlY3V0aW5nIHF1ZXJ5OiAiICsgcXVlcnlTdHJpbmcpOwotICAgICAgICBPYmplY3RMaXN0IHJlcyA9IGZEaXNjU3ZjLnF1ZXJ5KGZSZXBvc2l0b3J5SWQsIHF1ZXJ5U3RyaW5nLCB0cnVlLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgICAgbG9nLmRlYnVnKCJRdWVyeSByZXN1bHQsIG51bWJlciBvZiBtYXRjaGluZyBvYmplY3RzOiAiICsgcmVzLmdldE51bUl0ZW1zKCkpOwotICAgICAgICBmb3IgKE9iamVjdERhdGEgb2QgOiByZXMuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIG1hdGNoaW5nIG9iamVjdDogIgotICAgICAgICAgICAgICAgICAgICArIG9kLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpLmdldEZpcnN0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlc3VsdENvbnRhaW5zKE9iamVjdCB2YWx1ZSwgU3RyaW5nIHByb3BJZCwgT2JqZWN0TGlzdCByZXN1bHRzKSB7Ci0gICAgICAgIGZvciAoT2JqZWN0RGF0YSBvZCA6IHJlc3VsdHMuZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcHJvcERhdGEgPSBvZC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChwcm9wSWQpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJvcERhdGEpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgcHJvcFZhbCA9IHByb3BEYXRhLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKHByb3BWYWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZXN1bHRDb250YWlucyhEb3VibGUgdmFsLCBTdHJpbmcgcHJvcElkLCBPYmplY3RMaXN0IHJlc3VsdHMpIHsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIG9kIDogcmVzdWx0cy5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgYmQgPSAoQmlnRGVjaW1hbCkgb2QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQocHJvcElkKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsLmVxdWFscyhiZC5kb3VibGVWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlc3VsdENvbnRhaW5zKFN0cmluZyBuYW1lLCBPYmplY3RMaXN0IHJlc3VsdHMpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdENvbnRhaW5zKG5hbWUsIFByb3BlcnR5SWRzLk5BTUUsIHJlc3VsdHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVzdWx0Q29udGFpbnNBdFBvcyhTdHJpbmcgbmFtZSwgaW50IGluZGV4LCBPYmplY3RMaXN0IHJlc3VsdHMpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVQcm9wID0gKFN0cmluZykgcmVzdWx0cy5nZXRPYmplY3RzKCkuZ2V0KGluZGV4KS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5OQU1FKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBuYW1lLmVxdWFscyhuYW1lUHJvcCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlc3VsdENvbnRhaW5zTm90U2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcElkLCBPYmplY3REYXRhIG9kKSB7Ci0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wRGF0YSA9IG9kLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KHByb3BJZCk7Ci0gICAgICAgIHJldHVybiBwcm9wRGF0YSAhPSBudWxsICYmIHByb3BJZC5lcXVhbHMocHJvcERhdGEuZ2V0SWQoKSkgJiYgcHJvcERhdGEuZ2V0VmFsdWVzKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVzdWx0Q29udGFpbnNQcm9wZXJ0eShTdHJpbmcgcHJvcElkLCBPYmplY3RMaXN0IHJlc3VsdHMpIHsKLSAgICAgICAgZm9yIChPYmplY3REYXRhIG9kIDogcmVzdWx0cy5nZXRPYmplY3RzKCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wRGF0YSA9IG9kLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KHByb3BJZCk7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wRGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L1Byb2Nlc3NRdWVyeVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L1Byb2Nlc3NRdWVyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MzhkNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9Qcm9jZXNzUXVlcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnF1ZXJ5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVHlwZU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNhbGVuZGFySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlRleHRTZWFyY2hMZXhlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUXVlcnlUZXN0IGV4dGVuZHMgQWJzdHJhY3RRdWVyeVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3NRdWVyeVRlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFF1ZXJ5UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RRdWVyeUNvbmRpdGlvblByb2Nlc3NvciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX1NUQVJUID0gIm9uU3RhcnRXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fU1RPUCA9ICJvblN0b3BXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fRVFVQUxTID0gIm9uRXF1YWxzV2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX05PVF9FUVVBTFMgPSAib25Ob3RFcXVhbHNXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fR1JFQVRFUl9USEFOID0gIm9uR3JlYXRlclRoYW5XYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fR1JFQVRFUl9PUl9FUVVBTFMgPSAib25HcmVhdGVyT3JFcXVhbHNXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fTEVTU19USEFOID0gIm9uTGVzc1RoYW5XYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fTEVTU19PUl9FUVVBTFMgPSAib25MZXNzT3JFcXVhbHNXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fTk9UID0gIm9uTm90V2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0FORCA9ICJvbkFuZFdhc0NhbGxlZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTl9PUiA9ICJvbk9yV2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0lOID0gIm9uSW5XYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fTk9UX0lOID0gIm9uTm90SW5XYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fSU5fQU5ZID0gIm9uSW5BbnlXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fTk9UX0lOX0FOWSA9ICJvbk5vdEluQW55V2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0VRX0FOWSA9ICJvbkVxQW55V2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0lTX05VTEwgPSAib25Jc051bGxXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fSVNfTk9UX05VTEwgPSAib25Jc05vdE51bGxXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fSVNfTElLRSA9ICJvbklzTGlrZVdhc0NhbGxlZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTl9JU19OT1RfTElLRSA9ICJvbklzTm90TGlrZVdhc0NhbGxlZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTl9DT05UQUlOUyA9ICJvbkNvbnRhaW5zV2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0lOX0ZPTERFUiA9ICJvbkluRm9sZGVyV2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX0lOX1RSRUUgPSAib25JblRyZWVXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fU0NPUkUgPSAib25TY29yZVdhc0NhbGxlZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTl9URVhUX0FORCA9ICJvblRleHRBbmRXYXNDYWxsZWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05fVEVYVF9PUiA9ICJvblRleHRPcldhc0NhbGxlZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTl9URVhUX01JTlVTID0gIm9uVGV4dE1pbnVzV2FzQ2FsbGVkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9OX1RFWFRfUEhSQVNFID0gIm9uVGV4dFBocmFzZVdhc0NhbGxlZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTl9URVhUX1dPUkQgPSAib25UZXh0V29yZFdhc0NhbGxlZCI7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gcnVsZXNUcmFja2VyTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1dChPTl9TVEFSVCwgMCk7Ci0gICAgICAgICAgICAgICAgcHV0KE9OX1NUT1AsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9FUVVBTFMsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9OT1RfRVFVQUxTLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fR1JFQVRFUl9USEFOLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fR1JFQVRFUl9PUl9FUVVBTFMsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9MRVNTX1RIQU4sIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9MRVNTX09SX0VRVUFMUywgMCk7Ci0gICAgICAgICAgICAgICAgcHV0KE9OX05PVCwgMCk7Ci0gICAgICAgICAgICAgICAgcHV0KE9OX0FORCwgMCk7Ci0gICAgICAgICAgICAgICAgcHV0KE9OX09SLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fSU4sIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9OT1RfSU4sIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9JTl9BTlksIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9OT1RfSU5fQU5ZLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fRVFfQU5ZLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fSVNfTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgcHV0KE9OX0lTX05PVF9OVUxMLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fSVNfTElLRSwgMCk7Ci0gICAgICAgICAgICAgICAgcHV0KE9OX0lTX05PVF9MSUtFLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fQ09OVEFJTlMsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9JTl9GT0xERVIsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9JTl9UUkVFLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fU0NPUkUsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9URVhUX0FORCwgMCk7Ci0gICAgICAgICAgICAgICAgcHV0KE9OX1RFWFRfT1IsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9URVhUX01JTlVTLCAwKTsKLSAgICAgICAgICAgICAgICBwdXQoT05fVEVYVF9QSFJBU0UsIDApOwotICAgICAgICAgICAgICAgIHB1dChPTl9URVhUX1dPUkQsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXI7Ci0KLSAgICAgICAgcHVibGljIFRlc3RRdWVyeVByb2Nlc3NvcigpIHsKLSAgICAgICAgICAgIGNvdW50ZXIgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRQcm9jZXNzaW5nKFRyZWUgbm9kZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJUZXN0UXVlcnlQcm9jZXNzb3I6b25TdGFydFByb2Nlc3NpbmcoKSIpOwotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9TVEFSVCwgY291bnRlcisrKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5XSEVSRSwgbm9kZS5nZXRQYXJlbnQoKS5nZXRUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFByb2Nlc3NpbmcoKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlRlc3RRdWVyeVByb2Nlc3NvcjpvblN0b3BQcm9jZXNzaW5nKCkiKTsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fU1RPUCwgY291bnRlcisrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkVxdWFscyhUcmVlIGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fRVFVQUxTLCBjb3VudGVyKyspOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkVRLCBlcU5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQ21pc1FsU3RyaWN0TGV4ZXIuQ09MID09IGxlZnROb2RlLmdldFR5cGUoKSB8fCBDbWlzUWxTdHJpY3RMZXhlci5TQ09SRSA9PSBsZWZ0Tm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0xpdGVyYWwocmlnaHROb2RlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Ob3RFcXVhbHMoVHJlZSBuZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX05PVF9FUVVBTFMsIGNvdW50ZXIrKyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuTkVRLCBuZU5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5DT0wsIGxlZnROb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzTGl0ZXJhbChyaWdodE5vZGUpKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9uTGl0ZXJhbChyaWdodE5vZGUsIEludGVnZXIuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTGVzc09yRXF1YWxzKFRyZWUgbGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fTEVTU19PUl9FUVVBTFMsIGNvdW50ZXIrKyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuTFRFUSwgbGVxTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkNPTCwgbGVmdE5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNMaXRlcmFsKHJpZ2h0Tm9kZSkpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb25MaXRlcmFsKHJpZ2h0Tm9kZSwgSW50ZWdlci5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25MZXNzVGhhbihUcmVlIGx0Tm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fTEVTU19USEFOLCBjb3VudGVyKyspOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkxULCBsdE5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5DT0wsIGxlZnROb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzTGl0ZXJhbChyaWdodE5vZGUpKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9uTGl0ZXJhbChyaWdodE5vZGUsIEludGVnZXIuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uR3JlYXRlck9yRXF1YWxzKFRyZWUgZ2VOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9HUkVBVEVSX09SX0VRVUFMUywgY291bnRlcisrKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5HVEVRLCBnZU5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5DT0wsIGxlZnROb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzTGl0ZXJhbChyaWdodE5vZGUpKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9uTGl0ZXJhbChyaWdodE5vZGUsIEludGVnZXIuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uR3JlYXRlclRoYW4oVHJlZSBndE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX0dSRUFURVJfVEhBTiwgY291bnRlcisrKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5HVCwgZ3ROb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuQ09MLCBsZWZ0Tm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0xpdGVyYWwocmlnaHROb2RlKSk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvbkxpdGVyYWwocmlnaHROb2RlLCBJbnRlZ2VyLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDAsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSkgewotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9OT1QsIGNvdW50ZXIrKyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuTk9ULCBvcE5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkFuZChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5BTkQsIG9wTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9BTkQsIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25PcihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5PUiwgb3BOb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX09SLCBjb3VudGVyKyspOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSW4oVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLklOLCBvcE5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5DT0wsIGNvbE5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5JTl9MSVNULCBsaXN0Tm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb25MaXRlcmFsKGxpc3ROb2RlLmdldENoaWxkKDApLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCInSm9lJyIsIHZhbHVlKTsKLSAgICAgICAgICAgIHZhbHVlID0gb25MaXRlcmFsKGxpc3ROb2RlLmdldENoaWxkKDEpLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCInSmltJyIsIHZhbHVlKTsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fSU4sIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Ob3RJbihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLk5PVF9JTiwgbm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkNPTCwgY29sTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLklOX0xJU1QsIGxpc3ROb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvbkxpdGVyYWwobGlzdE5vZGUuZ2V0Q2hpbGQoMCksIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIidKb2UnIiwgdmFsdWUpOwotICAgICAgICAgICAgdmFsdWUgPSBvbkxpdGVyYWwobGlzdE5vZGUuZ2V0Q2hpbGQoMSksIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIidKaW0nIiwgdmFsdWUpOwotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9OT1RfSU4sIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25FcUFueShUcmVlIG5vZGUsIFRyZWUgbGl0ZXJhbE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkVRX0FOWSwgbm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkNPTCwgY29sTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0xpdGVyYWwobGl0ZXJhbE5vZGUpKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9uTGl0ZXJhbChsaXRlcmFsTm9kZSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiJ0pvZSciLCB2YWx1ZSk7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX0VRX0FOWSwgY291bnRlcisrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluQW55KFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuSU5fQU5ZLCBub2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuQ09MLCBjb2xOb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuSU5fTElTVCwgbGlzdE5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9uTGl0ZXJhbChsaXN0Tm9kZS5nZXRDaGlsZCgwKSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiJ0pvZSciLCB2YWx1ZSk7Ci0gICAgICAgICAgICB2YWx1ZSA9IG9uTGl0ZXJhbChsaXN0Tm9kZS5nZXRDaGlsZCgxKSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiJ0ppbSciLCB2YWx1ZSk7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX0lOX0FOWSwgY291bnRlcisrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk5vdEluQW55KFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuTk9UX0lOX0FOWSwgbm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkNPTCwgY29sTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLklOX0xJU1QsIGxpc3ROb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvbkxpdGVyYWwobGlzdE5vZGUuZ2V0Q2hpbGQoMCksIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIidKb2UnIiwgdmFsdWUpOwotICAgICAgICAgICAgdmFsdWUgPSBvbkxpdGVyYWwobGlzdE5vZGUuZ2V0Q2hpbGQoMSksIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIidKaW0nIiwgdmFsdWUpOwotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9OT1RfSU5fQU5ZLCBjb3VudGVyKyspOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXNOdWxsKFRyZWUgbnVsbE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkNPTCwgY29sTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLklTX05VTEwsIG51bGxOb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX0lTX05VTEwsIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Jc05vdE51bGwoVHJlZSBub3ROdWxsTm9kZSwgVHJlZSBjb2xOb2RlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuQ09MLCBjb2xOb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuSVNfTk9UX05VTEwsIG5vdE51bGxOb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX0lTX05PVF9OVUxMLCBjb3VudGVyKyspOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXNMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5MSUtFLCBub2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuQ09MLCBjb2xOb2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuU1RSSU5HX0xJVCwgc3RyaW5nTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb25MaXRlcmFsKHN0cmluZ05vZGUsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIidIYXJyeSUnIiwgdmFsdWUpOwotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9JU19MSUtFLCBjb3VudGVyKyspOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXNOb3RMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5OT1RfTElLRSwgbm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLkNPTCwgY29sTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLlNUUklOR19MSVQsIHN0cmluZ05vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9uTGl0ZXJhbChzdHJpbmdOb2RlLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCInSGFycnklJyIsIHZhbHVlKTsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fSVNfTk9UX0xJS0UsIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db250YWlucyhUcmVlIG5vZGUsIFRyZWUgdHlwZU5vZGUsIFRyZWUgc2VhcmNoRXhwck5vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5DT05UQUlOUywgbm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShudWxsICE9IHNlYXJjaEV4cHJOb2RlKTsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fQ09OVEFJTlMsIGNvdW50ZXIrKyk7Ci0gICAgICAgICAgICBzdXBlci5vbkNvbnRhaW5zKG5vZGUsIHR5cGVOb2RlLCBzZWFyY2hFeHByTm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JbkZvbGRlcihUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBwYXJhbU5vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5JTl9GT0xERVIsIG5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29sTm9kZSA9PSBudWxsIHx8IENtaXNRbFN0cmljdExleGVyLlNUUklOR19MSVQgPT0gcGFyYW1Ob2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuU1RSSU5HX0xJVCwgcGFyYW1Ob2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX0lOX0ZPTERFUiwgY291bnRlcisrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkluVHJlZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBwYXJhbU5vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5JTl9UUkVFLCBub2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbE5vZGUgPT0gbnVsbCB8fCBDbWlzUWxTdHJpY3RMZXhlci5TVFJJTkdfTElUID09IHBhcmFtTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENtaXNRbFN0cmljdExleGVyLlNUUklOR19MSVQsIHBhcmFtTm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgcnVsZXNUcmFja2VyTWFwLnB1dChPTl9JTl9UUkVFLCBjb3VudGVyKyspOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2NvcmUoVHJlZSBub2RlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ21pc1FsU3RyaWN0TGV4ZXIuU0NPUkUsIG5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fU0NPUkUsIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25UZXh0QW5kKFRyZWUgbm9kZSwgTGlzdDxUcmVlPiBjb25qdW5jdGlvbk5vZGVzLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXh0U2VhcmNoTGV4ZXIuVEVYVF9BTkQsIG5vZGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29uanVuY3Rpb25Ob2Rlcy5zaXplKCkgPj0gMik7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX1RFWFRfQU5ELCBjb3VudGVyKyspOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dE9yKFRyZWUgbm9kZSwgTGlzdDxUcmVlPiB0ZXJtTm9kZXMsIGludCBpbmRleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRleHRTZWFyY2hMZXhlci5URVhUX09SLCBub2RlLmdldFR5cGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlcm1Ob2Rlcy5zaXplKCkgPj0gMik7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX1RFWFRfT1IsIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25UZXh0TWludXMoVHJlZSBub2RlLCBUcmVlIG5vdE5vZGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhUZXh0U2VhcmNoTGV4ZXIuVEVYVF9NSU5VUywgbm9kZS5nZXRUeXBlKCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShub3ROb2RlLmdldFR5cGUoKSA9PSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfUEhSQVNFX1NUUklOR19MSVQKLSAgICAgICAgICAgICAgICAgICAgfHwgbm90Tm9kZS5nZXRUeXBlKCkgPT0gVGV4dFNlYXJjaExleGVyLlRFWFRfU0VBUkNIX1dPUkRfTElUKTsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fVEVYVF9NSU5VUywgY291bnRlcisrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRXb3JkKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdvcmQgIT0gbnVsbCAmJiB3b3JkLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgICAgICBydWxlc1RyYWNrZXJNYXAucHV0KE9OX1RFWFRfV09SRCwgY291bnRlcisrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRQaHJhc2UoU3RyaW5nIHBocmFzZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwaHJhc2UgIT0gbnVsbCAmJiBwaHJhc2UubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgICAgIHJ1bGVzVHJhY2tlck1hcC5wdXQoT05fVEVYVF9QSFJBU0UsIGNvdW50ZXIrKyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcml2YXRlIGhlbHBlciBmdW5jdGlvbnM6Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpdGVyYWwoVHJlZSBub2RlKSB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gQ21pc1FsU3RyaWN0TGV4ZXIuQk9PTF9MSVQgfHwgdHlwZSA9PSBDbWlzUWxTdHJpY3RMZXhlci5OVU1fTElUCi0gICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgPT0gQ21pc1FsU3RyaWN0TGV4ZXIuU1RSSU5HX0xJVCB8fCB0eXBlID09IENtaXNRbFN0cmljdExleGVyLlRJTUVfTElUOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG9uTGl0ZXJhbChUcmVlIG5vZGUsIENsYXNzPD8+IGNsYXp6KSB7Ci0gICAgICAgICAgICBpbnQgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkJPT0xfTElUOgotICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eiA9PSBCb29sZWFuLmNsYXNzID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4obm9kZS5nZXRUZXh0KCkpIDogbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTlVNX0xJVDoKLSAgICAgICAgICAgICAgICBpZiAoY2xhenogPT0gSW50ZWdlci5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChub2RlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBMb25nLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyhub2RlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBTaG9ydC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2hvcnQucGFyc2VTaG9ydChub2RlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBEb3VibGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5wYXJzZURvdWJsZShub2RlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGF6eiA9PSBGbG9hdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdChub2RlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5TVFJJTkdfTElUOgotICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eiA9PSBTdHJpbmcuY2xhc3MgPyBub2RlLmdldFRleHQoKSA6IG51bGw7Ci0gICAgICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlRJTUVfTElUOgotICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eiA9PSBHcmVnb3JpYW5DYWxlbmRhci5jbGFzcyA/IENhbGVuZGFySGVscGVyLmZyb21TdHJpbmcobm9kZS5nZXRUZXh0KCkpIDogbnVsbDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTE9HLmVycm9yKCJVbmtub3duIGxpdGVyYWwuICIgKyBub2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbE5vZGUoVHJlZSBub2RlKSB7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZU1hbmFnZXJJbXBsIHRtOwotICAgIHByaXZhdGUgVGVzdFF1ZXJ5UHJvY2Vzc29yIHF1ZXJ5UHJvY2Vzc29yOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICB0bSA9IG5ldyBUeXBlTWFuYWdlckltcGwoKTsKLSAgICAgICAgdG0uaW5pdFR5cGVTeXN0ZW0obnVsbCwgdHJ1ZSk7IC8vIGNyZWF0ZSBDTUlTIGRlZmF1bHQgdHlwZXMKLQotICAgICAgICAvLyBjcmVhdGUgc29tZSB0eXBlcyBmb3IgdGVzdGluZwotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uPiB0eXBlRGVmcyA9IHN1cGVyLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZURlZiA6IHR5cGVEZWZzKSB7Ci0gICAgICAgICAgICB0bS5hZGRUeXBlRGVmaW5pdGlvbih0eXBlRGVmLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluaXRpYWxpemUgcXVlcnkgb2JqZWN0IHdpdGggdHlwZSBtYW5hZ2VyCi0gICAgICAgIHF1ZXJ5UHJvY2Vzc29yID0gbmV3IFRlc3RRdWVyeVByb2Nlc3NvcigpOwotICAgICAgICBzdXBlci5zZXRVcCh0bSwgcXVlcnlQcm9jZXNzb3IpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0U3RvcFByb2Nlc3NpbmcoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOID0gMTAwIjsKLSAgICAgICAgdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOyAvLyBjYWxscyBxdWVyeSBwcm9jZXNzb3IKLSAgICAgICAgYXNzZXJ0VHJ1ZShxdWVyeVByb2Nlc3Nvci5ydWxlc1RyYWNrZXJNYXAuZ2V0KFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9TVEFSVCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShxdWVyeVByb2Nlc3Nvci5ydWxlc1RyYWNrZXJNYXAuZ2V0KFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9TVE9QKSA+IDApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVxKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgSVNCTiA9IDEwMCI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnQoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fRVFVQUxTKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXEoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOIDw+IDEwMCI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnQoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fTk9UX0VRVUFMUyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0THQoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOIDwgMTAwIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudChzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9MRVNTX1RIQU4pOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEx0ZXEoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOIDw9IDEwMCI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnQoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fTEVTU19PUl9FUVVBTFMpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEd0KCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgSVNCTiA+IDEwMCI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnQoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fR1JFQVRFUl9USEFOKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHdGVxKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgSVNCTiA+PSAxMDAiOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0dSRUFURVJfT1JfRVFVQUxTKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3QoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBOT1QgSVNCTiA9IDEwMCI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnRNdWx0aVJ1bGUoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fTk9UKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbmQoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOID0gMTAwIEFORCBUaXRsZSBMSUtFICdIYXJyeSUnIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudE11bHRpUnVsZShzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9BTkQpOwotICAgICAgICBhc3NlcnRUcnVlKHF1ZXJ5UHJvY2Vzc29yLnJ1bGVzVHJhY2tlck1hcC5nZXQoVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX1NUQVJUKSA9PSAxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShxdWVyeVByb2Nlc3Nvci5ydWxlc1RyYWNrZXJNYXAuZ2V0KFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9FUVVBTFMpID09IDIpOwotICAgICAgICBhc3NlcnRUcnVlKHF1ZXJ5UHJvY2Vzc29yLnJ1bGVzVHJhY2tlck1hcC5nZXQoVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0FORCkgPT0gMyk7Ci0gICAgICAgIGFzc2VydFRydWUocXVlcnlQcm9jZXNzb3IucnVsZXNUcmFja2VyTWFwLmdldChUZXN0UXVlcnlQcm9jZXNzb3IuT05fSVNfTElLRSkgPT0gNCk7Ci0gICAgICAgIGFzc2VydFRydWUocXVlcnlQcm9jZXNzb3IucnVsZXNUcmFja2VyTWFwLmdldChUZXN0UXVlcnlQcm9jZXNzb3IuT05fU1RPUCkgPT0gNSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3IoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOID0gMTAwIE9SIFRpdGxlIExJS0UgJ0hhcnJ5JSciOwotICAgICAgICB0ZXN0U3RhdGVtZW50TXVsdGlSdWxlKHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX09SKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShxdWVyeVByb2Nlc3Nvci5ydWxlc1RyYWNrZXJNYXAuZ2V0KFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9TVEFSVCkgPT0gMSk7Ci0gICAgICAgIGFzc2VydFRydWUocXVlcnlQcm9jZXNzb3IucnVsZXNUcmFja2VyTWFwLmdldChUZXN0UXVlcnlQcm9jZXNzb3IuT05fRVFVQUxTKSA9PSAyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShxdWVyeVByb2Nlc3Nvci5ydWxlc1RyYWNrZXJNYXAuZ2V0KFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9PUikgPT0gMyk7Ci0gICAgICAgIGFzc2VydFRydWUocXVlcnlQcm9jZXNzb3IucnVsZXNUcmFja2VyTWFwLmdldChUZXN0UXVlcnlQcm9jZXNzb3IuT05fSVNfTElLRSkgPT0gNCk7Ci0gICAgICAgIGFzc2VydFRydWUocXVlcnlQcm9jZXNzb3IucnVsZXNUcmFja2VyTWFwLmdldChUZXN0UXVlcnlQcm9jZXNzb3IuT05fU1RPUCkgPT0gNSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW4oKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBBdXRob3IgSU4gKCdKb2UnLCAnSmltJykiOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0lOKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RJbigpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQm9va1R5cGUuVGl0bGUsIEJvb2tUeXBlLkF1dGhvciBGUk9NIEJvb2tUeXBlIFdIRVJFIEF1dGhvciBOT1QgSU4gKCdKb2UnLCAnSmltJykiOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX05PVF9JTik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXFBbnkoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSAnSm9lJyA9IEFOWSBBdXRob3IiOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0VRX0FOWSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5BbnkoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBBTlkgQXV0aG9yIElOICgnSm9lJywgJ0ppbScpIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudChzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9JTl9BTlkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdEluQW55KCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgQU5ZIEF1dGhvciBOT1QgSU4gKCdKb2UnLCAnSmltJykiOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX05PVF9JTl9BTlkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uSXNOdWxsV2FzQ2FsbGVkKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgQXV0aG9yIElTIE5VTEwiOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0lTX05VTEwpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uSXNOb3ROdWxsV2FzQ2FsbGVkKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgQXV0aG9yIElTIE5PVCBOVUxMIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudChzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9JU19OT1RfTlVMTCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25MaWtlV2FzQ2FsbGVkKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgQXV0aG9yIExJS0UgJ0hhcnJ5JSciOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0lTX0xJS0UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uTm90TGlrZVdhc0NhbGxlZCgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQm9va1R5cGUuVGl0bGUsIEJvb2tUeXBlLkF1dGhvciBGUk9NIEJvb2tUeXBlIFdIRVJFIEF1dGhvciBOT1QgTElLRSAnSGFycnklJyI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnQoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fSVNfTk9UX0xJS0UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uQ29udGFpbnNXYXNDYWxsZWQxKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgQ09OVEFJTlMoJ0hlbGxvJykiOwotICAgICAgICB0ZXN0U3RhdGVtZW50TXVsdGlSdWxlKHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0NPTlRBSU5TKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPbkNvbnRhaW5zV2FzQ2FsbGVkMigpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQm9va1R5cGUuVGl0bGUsIEJvb2tUeXBlLkF1dGhvciBGUk9NIEJvb2tUeXBlIFdIRVJFIENPTlRBSU5TKEJvb2tUeXBlLCAnSGFycnknKSI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnRNdWx0aVJ1bGUoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fQ09OVEFJTlMpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uSW5Gb2xkZXJXYXNDYWxsZWQxKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgV0hFUkUgSU5fRk9MREVSKCdJRDEyMzQnKSI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnQoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fSU5fRk9MREVSKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPbkluRm9sZGVyV2FzQ2FsbGVkMigpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQm9va1R5cGUuVGl0bGUsIEJvb2tUeXBlLkF1dGhvciBGUk9NIEJvb2tUeXBlIFdIRVJFIElOX0ZPTERFUihCb29rVHlwZSwgJ0lEMTIzNCcpIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudChzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9JTl9GT0xERVIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uSW5UcmVlV2FzQ2FsbGVkMSgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQm9va1R5cGUuVGl0bGUsIEJvb2tUeXBlLkF1dGhvciBGUk9NIEJvb2tUeXBlIFdIRVJFIElOX1RyZWUoJ0lEMTIzNCcpIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudChzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9JTl9UUkVFKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPbkluVHJlZVdhc0NhbGxlZDIoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJTl9UcmVlKEJvb2tUeXBlLCAnSUQxMjM0JykiOwotICAgICAgICB0ZXN0U3RhdGVtZW50KHN0YXRlbWVudCwgVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX0lOX1RSRUUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uU2NvcmVDYWxsZWQoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBTQ09SRSgpPTEwMCI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnRNdWx0aVJ1bGUoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fU0NPUkUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uVGV4dFdvcmRMaXRlcmFsKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gQm9va1R5cGUgV0hFUkUgQ09OVEFJTlMoJ2FiYycpIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudE11bHRpUnVsZShzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9URVhUX1dPUkQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uVGV4dFBocmFzZUxpdGVyYWwoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSBCb29rVHlwZSBXSEVSRSBDT05UQUlOUygnXCJhYmNcIicpIjsKLSAgICAgICAgdGVzdFN0YXRlbWVudE11bHRpUnVsZShzdGF0ZW1lbnQsIFRlc3RRdWVyeVByb2Nlc3Nvci5PTl9URVhUX1BIUkFTRSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25UZXh0QW5kKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gQm9va1R5cGUgV0hFUkUgQ09OVEFJTlMoJ2FiYyBkZWYnKSI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnRNdWx0aVJ1bGUoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fVEVYVF9BTkQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9uVGV4dE9yKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gQm9va1R5cGUgV0hFUkUgQ09OVEFJTlMoJ2FiYyBPUiBkZWYnKSI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnRNdWx0aVJ1bGUoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fVEVYVF9PUik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25UZXh0TWludXMoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSBCb29rVHlwZSBXSEVSRSBDT05UQUlOUygnYWJjIC1kZWYnKSI7Ci0gICAgICAgIHRlc3RTdGF0ZW1lbnRNdWx0aVJ1bGUoc3RhdGVtZW50LCBUZXN0UXVlcnlQcm9jZXNzb3IuT05fVEVYVF9NSU5VUyk7Ci0gICAgfQotCi0gICAgLy8gcHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zCi0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0YXRlbWVudE11bHRpUnVsZShTdHJpbmcgc3RhdGVtZW50LCBTdHJpbmcgcnVsZUFzc2VydGlvbikgewotICAgICAgICB0cmF2ZXJzZVN0YXRlbWVudEFuZENhdGNoRXhjKHN0YXRlbWVudCk7IC8vIGNhbGxzIHF1ZXJ5IHByb2Nlc3NvcgotICAgICAgICBhc3NlcnRUcnVlKHF1ZXJ5UHJvY2Vzc29yLnJ1bGVzVHJhY2tlck1hcC5nZXQocnVsZUFzc2VydGlvbikgPiAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFN0YXRlbWVudChTdHJpbmcgc3RhdGVtZW50LCBTdHJpbmcgcnVsZUFzc2VydGlvbikgewotICAgICAgICB0ZXN0U3RhdGVtZW50TXVsdGlSdWxlKHN0YXRlbWVudCwgcnVsZUFzc2VydGlvbik7Ci0gICAgICAgIGNoZWNrT3RoZXJSdWxlc05vdENhbGxlZChydWxlQXNzZXJ0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tPdGhlclJ1bGVzTm90Q2FsbGVkKFN0cmluZyBydWxlQXNzZXJ0aW9uKSB7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlIDogcXVlcnlQcm9jZXNzb3IucnVsZXNUcmFja2VyTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmICghZS5nZXRLZXkoKS5lcXVhbHMocnVsZUFzc2VydGlvbikgJiYgIWUuZ2V0S2V5KCkuZXF1YWxzKCJvblByb3BlcnR5VmFsdWVXYXNDYWxsZWQiKQotICAgICAgICAgICAgICAgICAgICAmJiAhZS5nZXRLZXkoKS5lcXVhbHMoVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX1NUQVJUKQotICAgICAgICAgICAgICAgICAgICAmJiAhZS5nZXRLZXkoKS5lcXVhbHMoVGVzdFF1ZXJ5UHJvY2Vzc29yLk9OX1NUT1ApICYmICFlLmdldEtleSgpLmNvbnRhaW5zKCJMaXRlcmFsIikpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiUnVsZSAiICsgZS5nZXRLZXkoKSArICIgd2FzIGV4cGVjdGVkIG5vdCB0byBiZSBleGVjdXRlZCwgYnV0IHdhcyBleGVjdXRlZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQcm9jZXNzb3IucnVsZXNUcmFja2VyTWFwLmdldChlLmdldEtleSgpKSA+IDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9RdWVyeUNvbmRpdGlvblByb2Nlc3Nvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvUXVlcnlDb25kaXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNTBjMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9RdWVyeUNvbmRpdGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5xdWVyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuUHJlZGljYXRlV2Fsa2VyQmFzZTsNCi0NCi0vKioNCi0gKiBBbiBpbnRlcmZhY2UgdXNlZCBieSB0aGUgd2Fsa2VyIHdoZW4gdHJhdmVyc2luZyB0aGUgQVNUIGZyb20gdGhlIGdyYW1tYXIuIFRoZQ0KLSAqIGludGVyZmFjZSBjb25zaXN0cyBvZiBjYWxsYmFjayBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCB3aGVuIGEgcnVsZSBpcw0KLSAqIHByb2Nlc3NlZCAoYXMgcGFydCBvZiB0aGUgV0hFUkUgc3RhdGVtZW50KQ0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlDb25kaXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBQcmVkaWNhdGVXYWxrZXJCYXNlIHsNCi0NCi0gICAgdm9pZCBvblN0YXJ0UHJvY2Vzc2luZyhUcmVlIHdoZXJlTm9kZSk7DQotDQotICAgIHZvaWQgb25TdG9wUHJvY2Vzc2luZygpOw0KLQ0KLSAgICAvLyBDb21wYXJlIG9wZXJhdG9ycw0KLSAgICB2b2lkIG9uRXF1YWxzKFRyZWUgZXFOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7DQotDQotICAgIHZvaWQgb25Ob3RFcXVhbHMoVHJlZSBuZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsNCi0NCi0gICAgdm9pZCBvbkdyZWF0ZXJUaGFuKFRyZWUgZ3ROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7DQotDQotICAgIHZvaWQgb25HcmVhdGVyT3JFcXVhbHMoVHJlZSBnZU5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsNCi0NCi0gICAgdm9pZCBvbkxlc3NUaGFuKFRyZWUgbHROb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7DQotDQotICAgIHZvaWQgb25MZXNzT3JFcXVhbHMoVHJlZSBsZXFOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7DQotDQotICAgIC8vIEJvb2xlYW4gb3BlcmF0b3JzDQotICAgIHZvaWQgb25QcmVOb3QoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uTm90KFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlKTsNCi0NCi0gICAgdm9pZCBvblBvc3ROb3QoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uUHJlQW5kKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7DQotDQotICAgIHZvaWQgb25BbmQoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsNCi0NCi0gICAgdm9pZCBvblBvc3RBbmQoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsNCi0NCi0gICAgdm9pZCBvblByZU9yKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7DQotDQotICAgIHZvaWQgb25PcihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uUG9zdE9yKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7DQotDQotICAgIC8vIE11bHRpLXZhbHVlOg0KLSAgICB2b2lkIG9uSW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uTm90SW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uSW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uTm90SW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uRXFBbnkoVHJlZSBub2RlLCBUcmVlIGxpdGVyYWxOb2RlLCBUcmVlIGNvbE5vZGUpOw0KLQ0KLSAgICAvLyBOdWxsIGNvbXBhcmlzb25zOg0KLSAgICB2b2lkIG9uSXNOdWxsKFRyZWUgbnVsbE5vZGUsIFRyZWUgY29sTm9kZSk7DQotDQotICAgIHZvaWQgb25Jc05vdE51bGwoVHJlZSBub3ROdWxsTm9kZSwgVHJlZSBjb2xOb2RlKTsNCi0NCi0gICAgLy8gU3RyaW5nIG1hdGNoaW5nOg0KLSAgICB2b2lkIG9uSXNMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpOw0KLQ0KLSAgICB2b2lkIG9uSXNOb3RMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpOw0KLQ0KLSAgICAvLyBGdW5jdGlvbnM6DQotICAgIHZvaWQgb25Db250YWlucyhUcmVlIG5vZGUsIFRyZWUgdHlwZU5vZGUsIFRyZWUgc2VhcmNoRXhwck5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uSW5Gb2xkZXIoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKTsNCi0NCi0gICAgdm9pZCBvbkluVHJlZShUcmVlIG5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBwYXJhbU5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uU2NvcmUoVHJlZSBub2RlKTsNCi0NCi0gICAgLy8gZnVsbCB0ZXh0IHNlYXJjaA0KLSAgICB2b2lkIG9uVGV4dEFuZChUcmVlIG5vZGUsIExpc3Q8VHJlZT4gY29uanVuY3Rpb25Ob2Rlcyk7DQotDQotICAgIHZvaWQgb25UZXh0T3IoVHJlZSBub2RlLCBMaXN0PFRyZWU+IHRlcm1Ob2Rlcyk7DQotDQotICAgIHZvaWQgb25UZXh0TWludXMoVHJlZSBub2RlLCBUcmVlIG5vdE5vZGUpOw0KLQ0KLSAgICB2b2lkIG9uVGV4dFdvcmQoU3RyaW5nIHdvcmQpOw0KLQ0KLSAgICB2b2lkIG9uVGV4dFBocmFzZShTdHJpbmcgcGhyYXNlKTsNCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvUXVlcnlQYXJzZVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L1F1ZXJ5UGFyc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjY4MGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvUXVlcnlQYXJzZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LnF1ZXJ5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLlJlY29nbml0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZTsKLWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1F1ZXJ5V2Fsa2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNTZWxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5Db2x1bW5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuRnVuY3Rpb25SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuUXVlcnlPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuUXVlcnlPYmplY3QuU29ydFNwZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuUXVlcnlVdGlsU3RyaWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlRleHRTZWFyY2hMZXhlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeVBhcnNlVGVzdCBleHRlbmRzIEFic3RyYWN0UXVlcnlUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihRdWVyeVBhcnNlVGVzdC5jbGFzcyk7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcXVlcnkgb2JqZWN0LCB3ZSBkbyBub3QgbmVlZCBhIHR5cGUgbWFuYWdlciBmb3IganVzdAotICAgICAgICAvLyB0ZXN0aW5nIHBhcnNpbmcKLSAgICAgICAgc3VwZXIuc2V0VXAobnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaW1wbGVGYWlsVGVzdCgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBUTyBNeVR5cGUgT1JERVIgQlkgYWJjLmRlZiBBU0MiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJhdmVyc2VTdGF0ZW1lbnQoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGZhaWwoIkVycm9ybm91cyBzdGF0ZW1lbnQgc2hvdWxkIHRocm93IGV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRXhjZXB0aW9uIGluIHNpbXBsZUZhaWxUZXN0OiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaW1wbGVTZWxlY3RUZXN0MSgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgU0NPUkUoKSBGUk9NIGNtaXM6ZG9jdW1lbnQiOwotCi0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSB0cmF2ZXJzZVN0YXRlbWVudEFuZENhdGNoRXhjKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0V2Fsa2VyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpKTsKLSAgICAgICAgUXVlcnlPYmplY3QgcXVlcnlPYmogPSBxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKTsKLQotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gc2VsZWN0cyA9IHF1ZXJ5T2JqLmdldFNlbGVjdFJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgxID09IHNlbGVjdHMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzZWxlY3RzLmdldCgwKSBpbnN0YW5jZW9mIEZ1bmN0aW9uUmVmZXJlbmNlKTsKLQotICAgICAgICBGdW5jdGlvblJlZmVyZW5jZSBmdW5jUmVmID0gKChGdW5jdGlvblJlZmVyZW5jZSkgc2VsZWN0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRUcnVlKEZ1bmN0aW9uUmVmZXJlbmNlLkNtaXNRbEZ1bmN0aW9uLlNDT1JFID09IGZ1bmNSZWYuZ2V0RnVuY3Rpb24oKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaW1wbGVTZWxlY3RUZXN0MigpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgYWJjIEZST00gY21pczpkb2N1bWVudCI7Ci0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSB0cmF2ZXJzZVN0YXRlbWVudEFuZENhdGNoRXhjKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0V2Fsa2VyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpKTsKLSAgICAgICAgUXVlcnlPYmplY3QgcXVlcnlPYmogPSBxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKTsKLQotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gc2VsZWN0cyA9IHF1ZXJ5T2JqLmdldFNlbGVjdFJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgxID09IHNlbGVjdHMuc2l6ZSgpKTsKLSAgICAgICAgLy8gbm90aGluZyBzaG91bGQgYmUgaW4gd2hlcmUgcmVmZXJlbmNlcwotICAgICAgICBhc3NlcnRUcnVlKDAgPT0gcXVlcnlPYmouZ2V0V2hlcmVSZWZlcmVuY2VzKCkuc2l6ZSgpKTsKLQotICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdHMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzZWxlY3RzLmdldCgwKSBpbnN0YW5jZW9mIENvbHVtblJlZmVyZW5jZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYWJjIiwgY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2ltcGxlU2VsZWN0VGVzdDMoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHQxLmFiYyBGUk9NIGNtaXM6ZG9jdW1lbnQiOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFdhbGtlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKSk7Ci0gICAgICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqID0gcXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCk7Ci0KLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHNlbGVjdHMgPSBxdWVyeU9iai5nZXRTZWxlY3RSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSBzZWxlY3RzLnNpemUoKSk7Ci0gICAgICAgIC8vIG5vdGhpbmcgc2hvdWxkIGJlIGluIHdoZXJlIHJlZmVyZW5jZXMKLSAgICAgICAgYXNzZXJ0VHJ1ZSgwID09IHF1ZXJ5T2JqLmdldFdoZXJlUmVmZXJlbmNlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2VsZWN0cy5nZXQoMCkgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotCi0gICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgc2VsZWN0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInQxIiwgY29sUmVmLmdldFF1YWxpZmllcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBjb2xSZWYuZ2V0UHJvcGVydHlRdWVyeU5hbWUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaW1wbGVTZWxlY3RUZXN0NCgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQiOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFdhbGtlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKSk7Ci0gICAgICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqID0gcXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCk7Ci0KLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHNlbGVjdHMgPSBxdWVyeU9iai5nZXRTZWxlY3RSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSBzZWxlY3RzLnNpemUoKSk7Ci0gICAgICAgIC8vIG5vdGhpbmcgc2hvdWxkIGJlIGluIHdoZXJlIHJlZmVyZW5jZXMKLSAgICAgICAgYXNzZXJ0VHJ1ZSgwID09IHF1ZXJ5T2JqLmdldFdoZXJlUmVmZXJlbmNlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSBzZWxlY3RzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2VsZWN0cy5nZXQoMCkgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgY29sUmVmLmdldFF1YWxpZmllcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2ltcGxlU2VsZWN0VGVzdDUoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHQxLiogRlJPTSBjbWlzOmRvY3VtZW50IjsKLSAgICAgICAgUXVlcnlVdGlsU3RyaWN0IHF1ZXJ5VXRpbCA9IHRyYXZlcnNlU3RhdGVtZW50QW5kQ2F0Y2hFeGMoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCkpOwotICAgICAgICBRdWVyeU9iamVjdCBxdWVyeU9iaiA9IHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpOwotCi0gICAgICAgIExpc3Q8Q21pc1NlbGVjdG9yPiBzZWxlY3RzID0gcXVlcnlPYmouZ2V0U2VsZWN0UmVmZXJlbmNlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gc2VsZWN0cy5zaXplKCkpOwotICAgICAgICAvLyBub3RoaW5nIHNob3VsZCBiZSBpbiB3aGVyZSByZWZlcmVuY2VzCi0gICAgICAgIGFzc2VydFRydWUoMCA9PSBxdWVyeU9iai5nZXRXaGVyZVJlZmVyZW5jZXMoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNlbGVjdHMuZ2V0KDApIGluc3RhbmNlb2YgQ29sdW1uUmVmZXJlbmNlKTsKLQotICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdHMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0MSIsIGNvbFJlZi5nZXRRdWFsaWZpZXIoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiKiIsIGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNpbXBsZVNlbGVjdFRlc3Q2KCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCB0Mi5hYWEgbXlhbGlhcyBGUk9NIGNtaXM6ZG9jdW1lbnQiOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFdhbGtlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKSk7Ci0gICAgICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqID0gcXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCk7Ci0KLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHNlbGVjdHMgPSBxdWVyeU9iai5nZXRTZWxlY3RSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSBzZWxlY3RzLnNpemUoKSk7Ci0gICAgICAgIC8vIG5vdGhpbmcgc2hvdWxkIGJlIGluIHdoZXJlIHJlZmVyZW5jZXMKLSAgICAgICAgYXNzZXJ0VHJ1ZSgwID09IHF1ZXJ5T2JqLmdldFdoZXJlUmVmZXJlbmNlcygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2VsZWN0cy5nZXQoMCkgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotCi0gICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgc2VsZWN0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInQyIiwgY29sUmVmLmdldFF1YWxpZmllcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYWEiLCBjb2xSZWYuZ2V0UHJvcGVydHlRdWVyeU5hbWUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaW1wbGVTZWxlY3RUZXN0NygpIHsKLSAgICAgICAgLy8gZXJyb3IgcHJvY2Vzc2luZwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVFhYWCB0Mi5hYWEgbXlhbGlhcyBGUk9NIGNtaXM6ZG9jdW1lbnQgV0hFUkUgYSA8IHQxIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyYXZlcnNlU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBmYWlsKCJXYWxraW5nIG9mIHN0YXRlbWVudCBzaG91bGQgd2l0aCBSZWNvZ25pdGlvbkV4Y2VwdGlvbiBidXQgc3VjY2VlZGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2ltcGxlRnJvbVRlc3QxKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gTXlUeXBlIE15QWxpYXMiOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFdhbGtlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKSk7Ci0gICAgICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqID0gcXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlcyA9IHF1ZXJ5T2JqLmdldFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB0eXBlcy5zaXplKCkpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSB0eXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNeUFsaWFzIiwga2V5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNeVR5cGUiLCB0eXBlcy5nZXQoa2V5KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBzaW1wbGVGcm9tVGVzdDIoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSBNeVR5cGUiOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFdhbGtlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKSk7Ci0gICAgICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqID0gcXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlcyA9IHF1ZXJ5T2JqLmdldFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB0eXBlcy5zaXplKCkpOwotCi0gICAgICAgIFN0cmluZyBrZXkgPSB0eXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNeVR5cGUiLCBrZXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk15VHlwZSIsIHR5cGVzLmdldChrZXkpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNpbXBsZUZyb21UZXN0MygpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgdDIuYWFhIEZST00gTXlUeXBlIGFiYzEyMyI7Ci0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSB0cmF2ZXJzZVN0YXRlbWVudEFuZENhdGNoRXhjKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0V2Fsa2VyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpKTsKLSAgICAgICAgUXVlcnlPYmplY3QgcXVlcnlPYmogPSBxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHR5cGVzID0gcXVlcnlPYmouZ2V0VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgxID09IHR5cGVzLnNpemUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFiYzEyMyIsIGtleSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTXlUeXBlIiwgdHlwZXMuZ2V0KGtleSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2ltcGxlRnJvbVRlc3Q0KCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBYLmFhYSBGUk9NIE15VHlwZSBBUyBYIFdIRVJFIDEwID0gQU5ZIFguYWFhICI7Ci0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSB0cmF2ZXJzZVN0YXRlbWVudEFuZENhdGNoRXhjKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0V2Fsa2VyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpKTsKLSAgICAgICAgUXVlcnlPYmplY3QgcXVlcnlPYmogPSBxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHR5cGVzID0gcXVlcnlPYmouZ2V0VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgxID09IHR5cGVzLnNpemUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtleSA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlgiLCBrZXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk15VHlwZSIsIHR5cGVzLmdldChrZXkpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNpbXBsZVdoZXJlVGVzdCgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIE15VHlwZSBXSEVSRSBNeVByb3AxPTEyMyI7Ci0KLSAgICAgICAgUXVlcnlVdGlsU3RyaWN0IHF1ZXJ5VXRpbCA9IHRyYXZlcnNlU3RhdGVtZW50QW5kQ2F0Y2hFeGMoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCkpOwotICAgICAgICBRdWVyeU9iamVjdCBxdWVyeU9iaiA9IHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gcXVlcnlVdGlsLmdldFdhbGtlcigpOwotCi0gICAgICAgIExpc3Q8Q21pc1NlbGVjdG9yPiB3aGVyZVJlZnMgPSBxdWVyeU9iai5nZXRXaGVyZVJlZmVyZW5jZXMoKTsKLSAgICAgICAgTWFwPEludGVnZXIsIENtaXNTZWxlY3Rvcj4gY29sUmVmcyA9IHF1ZXJ5T2JqLmdldENvbHVtblJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgxID09IHdoZXJlUmVmcy5zaXplKCkpOwotCi0gICAgICAgIENtaXNTZWxlY3RvciB2YWx1ZSA9IHdoZXJlUmVmcy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZSBpbnN0YW5jZW9mIENvbHVtblJlZmVyZW5jZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTXlQcm9wMSIsICgoQ29sdW1uUmVmZXJlbmNlKSB2YWx1ZSkuZ2V0UHJvcGVydHlRdWVyeU5hbWUoKSk7Ci0gICAgICAgIC8vIG9ubHkgIioiIHNob3VsZCBiZSBpbiBzZWxlY3QgcmVmZXJlbmNlcwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gcXVlcnlPYmouZ2V0U2VsZWN0UmVmZXJlbmNlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgQ29tbW9uVHJlZSB0cmVlID0gKENvbW1vblRyZWUpIHdhbGtlci5nZXRUcmVlTm9kZVN0cmVhbSgpLmdldFRyZWVTb3VyY2UoKTsKLQotICAgICAgICAvLyBhc3NlcnRUcnVlKHRyYXZlcnNlVHJlZUFuZEZpbmROb2RlSW5Db2x1bW5NYXAodHJlZSwgY29sUmVmcykpOwotICAgICAgICB0cmF2ZXJzZVRyZWVBbmRGaW5kTm9kZUluQ29sdW1uTWFwMih0cmVlLCBjb2xSZWZzKTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBpZiB0aGUgbWFwIGNvbnRhaW5pbmcgYWxsIGNvbHVtbiByZWZlcmVuY2VzIGluIHRoZSB3aGVyZSBjbGF1c2UgaGFzCi0gICAgLy8gYW4gZXhpc3Rpbmcgbm9kZSBhcyBrZXkKLSAgICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VUcmVlQW5kRmluZE5vZGVJbkNvbHVtbk1hcChUcmVlIG5vZGUsIE1hcDxPYmplY3QsIENtaXNTZWxlY3Rvcj4gY29sUmVmcykgewotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gY29sUmVmcy5nZXQobm9kZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvdW50ID0gbm9kZS5nZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQgJiYgIWZvdW5kOyBpKyspIHsKLSAgICAgICAgICAgIFRyZWUgY2hpbGQgPSBub2RlLmdldENoaWxkKGkpOwotICAgICAgICAgICAgZm91bmQgPSB0cmF2ZXJzZVRyZWVBbmRGaW5kTm9kZUluQ29sdW1uTWFwKGNoaWxkLCBjb2xSZWZzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlVHJlZUFuZEZpbmROb2RlSW5Db2x1bW5NYXAyKFRyZWUgbm9kZSwgT2JqZWN0IGNvbFJlZikgewotICAgICAgICBpbnQgY291bnQgPSBub2RlLmdldENoaWxkQ291bnQoKTsKLSAgICAgICAgTE9HLmRlYnVnKCIgIGNoZWNraW5nIHdpdGg6ICIgKyBub2RlICsgIiBpZGVudGl0eSBoYXNoIGNvZGU6ICIgKyBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShub2RlKSk7Ci0gICAgICAgIGlmIChub2RlID09IGNvbFJlZikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50ICYmICFmb3VuZDsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlIGNoaWxkID0gbm9kZS5nZXRDaGlsZChpKTsKLSAgICAgICAgICAgIGZvdW5kID0gdHJhdmVyc2VUcmVlQW5kRmluZE5vZGVJbkNvbHVtbk1hcDIoY2hpbGQsIGNvbFJlZik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2ltcGxlU29ydFRlc3QxKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gTXlUeXBlIE9SREVSIEJZIGFiYy5kZWYgQVNDIjsKLQotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFdhbGtlcigpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKSk7Ci0gICAgICAgIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqID0gcXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCk7Ci0KLSAgICAgICAgTGlzdDxTb3J0U3BlYz4gb3JkZXJCeXMgPSBxdWVyeU9iai5nZXRPcmRlckJ5cygpOwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gb3JkZXJCeXMuc2l6ZSgpKTsKLQotICAgICAgICBTb3J0U3BlYyBzcCA9IG9yZGVyQnlzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzcC5pc0FzY2VuZGluZygpKTsKLQotICAgICAgICBDbWlzU2VsZWN0b3Igc29ydFNwZWMgPSBzcC5nZXRTZWxlY3RvcigpOwotICAgICAgICBhc3NlcnQgKHNvcnRTcGVjIGluc3RhbmNlb2YgQ29sdW1uUmVmZXJlbmNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCAoKENvbHVtblJlZmVyZW5jZSkgc29ydFNwZWMpLmdldFF1YWxpZmllcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYiLCAoKENvbHVtblJlZmVyZW5jZSkgc29ydFNwZWMpLmdldFByb3BlcnR5UXVlcnlOYW1lKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2ltcGxlU29ydFRlc3QyKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gTXlUeXBlIE9SREVSIEJZIGRlZiBERVNDIjsKLSAgICAgICAgUXVlcnlVdGlsU3RyaWN0IHF1ZXJ5VXRpbCA9IHRyYXZlcnNlU3RhdGVtZW50QW5kQ2F0Y2hFeGMoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCkpOwotICAgICAgICBRdWVyeU9iamVjdCBxdWVyeU9iaiA9IHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpOwotCi0gICAgICAgIExpc3Q8U29ydFNwZWM+IG9yZGVyQnlzID0gcXVlcnlPYmouZ2V0T3JkZXJCeXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgxID09IG9yZGVyQnlzLnNpemUoKSk7Ci0KLSAgICAgICAgU29ydFNwZWMgc3AgPSBvcmRlckJ5cy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNwLmlzQXNjZW5kaW5nKCkpOwotCi0gICAgICAgIENtaXNTZWxlY3RvciBzb3J0U3BlYyA9IHNwLmdldFNlbGVjdG9yKCk7Ci0gICAgICAgIGFzc2VydCAoc29ydFNwZWMgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICBhc3NlcnROdWxsKCgoQ29sdW1uUmVmZXJlbmNlKSBzb3J0U3BlYykuZ2V0UXVhbGlmaWVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiIsICgoQ29sdW1uUmVmZXJlbmNlKSBzb3J0U3BlYykuZ2V0UHJvcGVydHlRdWVyeU5hbWUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBwcmludFRyZWVUZXN0KCkgewotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByaW50VHJlZVRlc3QoKToiKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEsIHAyLCBwMy50MyBteWNvbCBGUk9NIE15VHlwZSBBUyBNeUFsaWFzIFdIRVJFIHAxPSdhYmMnIGFuZCBwMj0xMjMgT1JERVIgQlkgYWJjLmRlZiBBU0MiOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBUcmVlIHBhcnNlclRyZWUgPSAoVHJlZSkgd2Fsa2VyLmdldFRyZWVOb2RlU3RyZWFtKCkuZ2V0VHJlZVNvdXJjZSgpOwotICAgICAgICAgICAgcHJpbnRUcmVlKHBhcnNlclRyZWUsIHN0YXRlbWVudCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhbm5vdCBwYXJzZSBxdWVyeTogIiArIHN0YXRlbWVudCArICIgKCIgKyBlICsgIikiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZXh0cmFjdFdoZXJlVHJlZVRlc3QoKSB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXh0cmFjdFdoZXJlVHJlZVRlc3QoKToiKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEsIHAyLCBwMy50MyBteWNvbCBGUk9NIE15VHlwZSBBUyBNeUFsaWFzIFdIRVJFIHAxPSdhYmMnIGFuZCBwMj0xMjMgT1JERVIgQlkgYWJjLmRlZiBBU0MiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKTsKLSAgICAgICAgICAgIFRyZWUgd2hlcmVUcmVlID0gd2Fsa2VyLmdldFdoZXJlUHJlZGljYXRlVHJlZSgpOyAvLyBnZXRXaGVyZVRyZWUocGFyc2VyVHJlZSk7Ci0gICAgICAgICAgICBwcmludFRyZWUod2hlcmVUcmVlKTsKLSAgICAgICAgICAgIExPRy5pbmZvKCJFdmFsdWF0ZSBXSEVSRSBzdWJ0cmVlOiAuLi4iKTsKLSAgICAgICAgICAgIGV2YWxXaGVyZVRyZWUod2hlcmVUcmVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhbm5vdCBwYXJzZSBxdWVyeTogIiArIHN0YXRlbWVudCArICIgKCIgKyBlICsgIikiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0SW4oKSB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXh0cmFjdFdoZXJlVGVzdElOKCk6Iik7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIHAxIElOICgnUmVkJywgJ0dyZWVuJywgJ0JsdWUnLCAnQmxhY2snKSI7Ci0gICAgICAgIGNoZWNrVHJlZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3RFcSgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEgRlJPTSBNeVR5cGUgV0hFUkUgcDE9J2FiYyciOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0Tm90RXEoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIHAxIDw+IDEyMyI7Ci0gICAgICAgIGNoZWNrVHJlZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3RMVCgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEgRlJPTSBNeVR5cGUgV0hFUkUgcDEgPCAxMjMiOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0R1QoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIHAxID4gMTIzIjsKLSAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHdoZXJlVGVzdExURVEoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIHAxIDw9IDEyMyI7Ci0gICAgICAgIGNoZWNrVHJlZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3RHVEVRKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBwMSA+PSAxMjMiOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0QW5kKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBwMT0xIEFORCBwMj0yIjsKLSAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHdoZXJlVGVzdE9yKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBwMT0nYWJjJyBPUiBwMj0xMjMiOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0Tm90KCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBOT1QgcDEgPSAxMjMiOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0SW5Gb2xkZXIoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIElOX0ZPTERFUignbXlmb2xkZXInKSI7Ci0gICAgICAgIGNoZWNrVHJlZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3RJblRyZWUoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIElOX1RSRUUoJ215Zm9sZGVyJykiOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0QW55KCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSAnU21pdGgnID0gQU5ZIEF1dGhvcnMgIjsKLSAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHdoZXJlVGVzdEFueUluKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBBTlkgQ29sb3JzIElOICgnUmVkJywgJ0dyZWVuJywgJ0JsdWUnKSI7Ci0gICAgICAgIGNoZWNrVHJlZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3RMaWtlKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBwMSBMSUtFICdhYmMqJyAiOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0VG9rZW5zQWZ0ZXJTdGF0ZW1lbnQoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIHAxIExJS0UgJ2FiYyonIElOX0ZPTERFUignZGVmJykiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGZhaWwoIlBhcnNpbmcgcXVlcnkgd2l0aCB0b2tlbnMgYWZ0ZXIgZW5kIG9mIHN0YXRlbWVudCBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRXhjZXB0aW9uIGlzOiAiLCBlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibWlzc2luZyBFT0YgYXQgIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3ROb3RMaWtlKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBwMSBOT1QgTElLRSAnYWJjKiciOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0TnVsbCgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEgRlJPTSBNeVR5cGUgV0hFUkUgcDEgSVMgTlVMTCI7Ci0gICAgICAgIGNoZWNrVHJlZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3ROb3ROdWxsKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBwMSBJUyBOT1QgTlVMTCI7Ci0gICAgICAgIGNoZWNrVHJlZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3RDb250YWlucygpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEgRlJPTSBNeVR5cGUgV0hFUkUgQ09OVEFJTlMoJ0JlZXRob3ZlbicpIjsKLSAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICAgICAgVHJlZSB0cmVlID0gZmluZFNlYXJjaEV4cHJlc3Npb24oc3RhdGVtZW50KTsKLSAgICAgICAgcHJpbnRTZWFyY2hUcmVlKHRyZWUsIHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQmVldGhvdmVuIiwgdHJlZS5nZXRDaGlsZCgwKS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0Q29udGFpbnNOb0Z1bGx0ZXh0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEgRlJPTSBNeVR5cGUgV0hFUkUgQ09OVEFJTlMoJ0JlZXRob3ZlbicpIjsKLSAgICAgICAgUXVlcnlVdGlsU3RyaWN0IHF1ZXJ5VXRpbCA9IG5ldyBRdWVyeVV0aWxTdHJpY3Qoc3RhdGVtZW50LCB0eXBlTWFuYWdlciwgcHJlZGljYXRlV2Fsa2VyLCBmYWxzZSk7Ci0gICAgICAgIHF1ZXJ5VXRpbC5wYXJzZVN0YXRlbWVudCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsLmdldFF1ZXJ5T2JqZWN0KCkpOwotICAgICAgICBxdWVyeVV0aWwud2Fsa1N0YXRlbWVudCgpOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gcXVlcnlVdGlsLmdldFdhbGtlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKSk7Ci0gICAgICAgIFRyZWUgd2hlcmVUcmVlID0gd2Fsa2VyLmdldFdoZXJlUHJlZGljYXRlVHJlZSgpOwotICAgICAgICBUcmVlIHRyZWUgPSBmaW5kVGV4dFNlYXJjaE5vZGUod2hlcmVUcmVlKTsKLSAgICAgICAgcHJpbnRTZWFyY2hUcmVlKHRyZWUsIHN0YXRlbWVudCk7Ci0gICAgICAgIC8vIHVucGFyc2VkLCBzdGlsbCB3aXRoIHF1b3RlcwotICAgICAgICBhc3NlcnRFcXVhbHMoIidCZWV0aG92ZW4nIiwgdHJlZS5nZXRDaGlsZCgwKS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0U2NvcmUoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIFNDT1JFKCkgPSAxMDAiOwotICAgICAgICBjaGVja1RyZWVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0UGFyZW50aGVzZXMoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxIEZST00gTXlUeXBlIFdIRVJFIChwMSBJUyBOVUxMIE9SIFNDT1JFKCk9MTAwKSBBTkQgKHAyPTEyMyBPUiBwMz00NTYpIjsKLSAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGRvdWJsZUZyb21UZXN0KCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gTXlUeXBlIEpPSU4gWW91clR5cGUgV0hFUkUgYT0nMSciOwotCi0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSB0cmF2ZXJzZVN0YXRlbWVudEFuZENhdGNoRXhjKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlVdGlsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeVV0aWwuZ2V0V2Fsa2VyKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpKTsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZXMgPSBxdWVyeVV0aWwuZ2V0UXVlcnlPYmplY3QoKS5nZXRUeXBlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDIgPT0gdHlwZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZWRBbGlhc1Rlc3RTZWxlY3QoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIHAxLlQxIE15QWxpYXMsIHAyLlQxIEFTIE15QWxpYXMgRlJPTSBUMSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cmF2ZXJzZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibW9yZSB0aGFuIG9uY2UgYXMgYWxpYXMgaW4gYSBzZWxlY3QiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZWRBbGlhc1Rlc3RGcm9tKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gVDEgTXlBbGlhcyBKT0lOIFQyIEFTIE15QWxpYXMiOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHF1ZXJ5VXRpbCA9IG5ldyBRdWVyeVV0aWxTdHJpY3Qoc3RhdGVtZW50LCB0eXBlTWFuYWdlciwgcHJlZGljYXRlV2Fsa2VyKTsKLSAgICAgICAgICAgIHF1ZXJ5VXRpbC5wcm9jZXNzU3RhdGVtZW50KCk7Ci0gICAgICAgICAgICBmYWlsKCJQYXJzaW5nIHN0YXRlbWVudCAiICsgc3RhdGVtZW50ICsgIiBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKTsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiZHVwbGljYXRlZEFsaWFzVGVzdEZyb20oKSwgZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICAvLyB3YWxrZXIucmVwb3J0RXJyb3IoZSk7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gcXVlcnlVdGlsLmdldEVycm9yTWVzc2FnZShlKTsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiIik7Ci0gICAgICAgICAgICBMT0cuZGVidWcoImR1cGxpY2F0ZWRBbGlhc1Rlc3RGcm9tKCksIGVycm9yIG1lc3NhZ2U6ICIgKyBlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLnRvU3RyaW5nKCkuY29udGFpbnMoIm1vcmUgdGhhbiBvbmNlIGFzIGFsaWFzIGluIGEgZnJvbSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXJyb3JNZXNzYWdlLmNvbnRhaW5zKCJtb3JlIHRoYW4gb25jZSBhcyBhbGlhcyBpbiBhIGZyb20iKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJQYXJzaW5nIHN0YXRlbWVudCAiICsgc3RhdGVtZW50ICsgIiBzaG91bGQgZmFpbCB3aXRoIFJlY29nbml0aW9uRXhjZXB0aW9uLCBidXQgd2FzOiAiICsgZS5nZXRDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgd2hlcmVUZXN0Q29udGFpbnMyKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBwMSBGUk9NIE15VHlwZSBXSEVSRSBDT05UQUlOUygnQmVldGhvdmVuIE9SIFwiSm9oYW5uIFNlYmFzdGlhblwiIE1vemFydCAtQ2FnZSBBTkQgT3JmZicpIjsKLSAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICAgICAgVHJlZSB0cmVlID0gZmluZFNlYXJjaEV4cHJlc3Npb24oc3RhdGVtZW50KTsKLSAgICAgICAgcHJpbnRTZWFyY2hUcmVlKHRyZWUsIHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB3aGVyZVRlc3RNdWx0aXBsZUNvbnRhaW5zMigpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgcDEgRlJPTSBNeVR5cGUgV0hFUkUgQ09OVEFJTlMoJ0JlZXRob3ZlbicpIEFORCBDT05UQUlOUygnQmFjaCcpIjsKLSAgICAgICAgY2hlY2tUcmVlV2hlcmUoc3RhdGVtZW50KTsKLSAgICAgICAgaW50IG5vQ29udGFpbnMgPSBnZXROdW1iZXJPZlNlYXJjaEV4cHJlc3Npb24oc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgyID09IG5vQ29udGFpbnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1RyZWVXaGVyZShTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIExPRy5pbmZvKCJcbmNoZWNrVHJlZVdoZXJlOiAiICsgc3RhdGVtZW50KTsKLSAgICAgICAgUXVlcnlVdGlsU3RyaWN0IHF1ZXJ5VXRpbCA9IHRyYXZlcnNlU3RhdGVtZW50QW5kQ2F0Y2hFeGMoc3RhdGVtZW50KTsKLSAgICAgICAgVHJlZSB3aGVyZVRyZWUgPSBxdWVyeVV0aWwuZ2V0V2Fsa2VyKCkuZ2V0V2hlcmVQcmVkaWNhdGVUcmVlKCk7Ci0gICAgICAgIGV2YWxXaGVyZVRyZWUod2hlcmVUcmVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWUgZmluZFNlYXJjaEV4cHJlc3Npb24oU3RyaW5nIHN0YXRlbWVudCkgewotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhzdGF0ZW1lbnQpOwotICAgICAgICBUcmVlIHdoZXJlVHJlZSA9IHF1ZXJ5VXRpbC5nZXRXYWxrZXIoKS5nZXRXaGVyZVByZWRpY2F0ZVRyZWUoKTsKLSAgICAgICAgcmV0dXJuIGZpbmRUZXh0U2VhcmNoTm9kZSh3aGVyZVRyZWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldE51bWJlck9mU2VhcmNoRXhwcmVzc2lvbihTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIFF1ZXJ5VXRpbFN0cmljdCBxdWVyeVV0aWwgPSB0cmF2ZXJzZVN0YXRlbWVudEFuZENhdGNoRXhjKHN0YXRlbWVudCk7Ci0gICAgICAgIHJldHVybiBxdWVyeVV0aWwuZ2V0V2Fsa2VyKCkuZ2V0TnVtYmVyT2ZDb250YWluc0NsYXVzZXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWUgZmluZFRleHRTZWFyY2hOb2RlKFRyZWUgbm9kZSkgewotICAgICAgICBpbnQgY291bnQgPSBub2RlLmdldENoaWxkQ291bnQoKTsKLSAgICAgICAgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENtaXNRbFN0cmljdExleGVyLkNPTlRBSU5TKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFRyZWUgY2hpbGQgPSBub2RlLmdldENoaWxkKGkpOwotICAgICAgICAgICAgICAgIG5vZGUgPSBmaW5kVGV4dFNlYXJjaE5vZGUoY2hpbGQpOyAvLyByZWN1cnNpdmUgZGVzY2VudAotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG5vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXZhbFdoZXJlVHJlZShUcmVlIHJvb3QpIHsKLSAgICAgICAgaW50IGNvdW50ID0gcm9vdC5nZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGlmIChyb290LmdldFR5cGUoKSA9PSBDbWlzUWxTdHJpY3RMZXhlci5DT05UQUlOUykgewotICAgICAgICAgICAgZXZhbFNlYXJjaEV4cHJUcmVlKHJvb3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVHJlZSBjaGlsZCA9IHJvb3QuZ2V0Q2hpbGQoaSk7Ci0gICAgICAgICAgICAgICAgZXZhbHVhdGVXaGVyZU5vZGUoY2hpbGQpOwotICAgICAgICAgICAgICAgIGV2YWxXaGVyZVRyZWUoY2hpbGQpOyAvLyByZWN1cnNpdmUgZGVzY2VudAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV2YWxTZWFyY2hFeHByVHJlZShUcmVlIHJvb3QpIHsKLSAgICAgICAgaW50IGNvdW50ID0gcm9vdC5nZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgVHJlZSBjaGlsZCA9IHJvb3QuZ2V0Q2hpbGQoaSk7Ci0gICAgICAgICAgICBldmFsdWF0ZVNlYXJjaEV4cHJOb2RlKGNoaWxkKTsKLSAgICAgICAgICAgIGV2YWxTZWFyY2hFeHByVHJlZShjaGlsZCk7IC8vIHJlY3Vyc2l2ZSBkZXNjZW50Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRUcmVlKFRyZWUgdHJlZSwgU3RyaW5nIHN0YXRlbWVudCkgewotICAgICAgICBMT0cuaW5mbygiUHJpbnRpbmcgdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlIGZvciBzdGF0ZW1lbnQ6Iik7Ci0gICAgICAgIExPRy5pbmZvKCIgICIgKyBzdGF0ZW1lbnQpOwotICAgICAgICBwcmludFRyZWUodHJlZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgaW5kZW50ID0gMTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGluZGVudFN0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyArK2kpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiICAiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRUcmVlKFRyZWUgbm9kZSkgewotICAgICAgICBMT0cuaW5mbyhpbmRlbnRTdHJpbmcoKSArIHByaW50Tm9kZShub2RlKSk7Ci0gICAgICAgICsraW5kZW50OwotICAgICAgICBpbnQgY291bnQgPSBub2RlLmdldENoaWxkQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlIGNoaWxkID0gbm9kZS5nZXRDaGlsZChpKTsKLSAgICAgICAgICAgIHByaW50VHJlZShjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLS1pbmRlbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW50Tm9kZShUcmVlIG5vZGUpIHsKLSAgICAgICAgc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlRBQkxFOgotICAgICAgICAgICAgcmV0dXJuICIjVEFCTEUiOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkNPTDoKLSAgICAgICAgICAgIHJldHVybiAiI0NPTCI7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSU5fTElTVDoKLSAgICAgICAgICAgIHJldHVybiAiI0lOX0xJU1QiOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlNFTF9MSVNUOgotICAgICAgICAgICAgcmV0dXJuICIjU0VMX0xJU1QiOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkVRX0FOWToKLSAgICAgICAgICAgIHJldHVybiAiI0VRX0FOWSI7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTk9UX0xJS0U6Ci0gICAgICAgICAgICByZXR1cm4gIiNOT1RfTElLRSI7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTk9UX0lOOgotICAgICAgICAgICAgcmV0dXJuICIjTk9UX0lOIjsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9BTlk6Ci0gICAgICAgICAgICByZXR1cm4gIiNJTl9BTlkiOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk5PVF9JTl9BTlk6Ci0gICAgICAgICAgICByZXR1cm4gIiNOT1RfSU5fQU5ZIjsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JU19OVUxMOgotICAgICAgICAgICAgcmV0dXJuICIjSVNfTlVMTCI7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSVNfTk9UX05VTEw6Ci0gICAgICAgICAgICByZXR1cm4gIiNJU19OT1RfTlVMTCI7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuT1JERVJfQlk6Ci0gICAgICAgICAgICByZXR1cm4gIiNPUkRFUl9CWSI7Ci0KLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5XSEVSRToKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MVDoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5TVEFSOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkJPT0xfTElUOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOTkVSOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlRJTUVfTElUOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk9SREVSOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlNUUklOR19MSVQ6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQ09OVEFJTlM6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuRXhhY3ROdW1MaXQ6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTFRFUToKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OT1Q6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSUQ6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQU5EOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkVPRjoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5BUzoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTjoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MUEFSOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkRpZ2l0czoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5DT01NQToKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JUzoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MRUZUOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlNpZ246Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuRVE6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuRE9UOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk5VTV9MSVQ6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuU0VMRUNUOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkxJS0U6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuT1VURVI6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQlk6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQVNDOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk5VTEw6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuT046Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuUklHSFQ6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuR1RFUToKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5BcHByb3hOdW1MaXQ6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSk9JTjoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9GT0xERVI6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuV1M6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTkVROgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkFOWToKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5TQ09SRToKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9UUkVFOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk9SOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkdUOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlJQQVI6Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuREVTQzoKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5GUk9NOgotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlRJTUVTVEFNUDoKLSAgICAgICAgICAgIHJldHVybiBub2RlLnRvU3RyaW5nKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIltVbmtub3duIHRva2VuOiAiICsgbm9kZS50b1N0cmluZygpICsgIl0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50U2VhcmNoVHJlZShUcmVlIHRyZWUsIFN0cmluZyBzZWFyY2hFeHByKSB7Ci0gICAgICAgIExPRy5pbmZvKCJQcmludGhpbmcgdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlIGZvciB0aGUgc2VhcmNoIGV4cHJlc3Npb24gaW4gQ09OVEFJTlMgOiIpOwotICAgICAgICBMT0cuaW5mbyhzZWFyY2hFeHByKTsKLSAgICAgICAgcHJpbnRTZWFyY2hUcmVlKHRyZWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludFNlYXJjaFRyZWUoVHJlZSBub2RlKSB7Ci0gICAgICAgIExPRy5pbmZvKGluZGVudFN0cmluZygpICsgcHJpbnRTZWFyY2hOb2RlKG5vZGUpKTsKLSAgICAgICAgKytpbmRlbnQ7Ci0gICAgICAgIGludCBjb3VudCA9IG5vZGUuZ2V0Q2hpbGRDb3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFRyZWUgY2hpbGQgPSBub2RlLmdldENoaWxkKGkpOwotICAgICAgICAgICAgcHJpbnRTZWFyY2hUcmVlKGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgICAtLWluZGVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJpbnRTZWFyY2hOb2RlKFRyZWUgbm9kZSkgewotICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfQU5EOgotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX09SOgotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX1NFQVJDSF9QSFJBU0VfU1RSSU5HX0xJVDoKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfV09SRF9MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS50b1N0cmluZygpOwotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX01JTlVTOgotICAgICAgICAgICAgcmV0dXJuICJNSU5VUyI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIlVua25vd24gdG9rZW46ICIgKyBub2RlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBFbnN1cmUgdGhhdCB3ZSByZWNlaXZlIG9ubHkgdmFsaWQgdG9rZW5zIGFuZCBub2RlcyBpbiB0aGUgd2hlcmUgY2xhdXNlOgotICAgIHByaXZhdGUgdm9pZCBldmFsdWF0ZVdoZXJlTm9kZShUcmVlIG5vZGUpIHsKLSAgICAgICAgTE9HLmluZm8oImV2YWx1YXRpbmcgbm9kZTogIiArIG5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5XSEVSRToKLSAgICAgICAgICAgIGJyZWFrOyAvLyBpZ25vcmUKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5DT0w6Ci0gICAgICAgICAgICBldmFsQ29sdW1uKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSU5fTElTVDoKLSAgICAgICAgICAgIGV2YWxJbkxpc3Qobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9BTlk6Ci0gICAgICAgICAgICBldmFsSW5Bbnkobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5FUV9BTlk6Ci0gICAgICAgICAgICBldmFsRXFBbnkobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OT1RfTElLRToKLSAgICAgICAgICAgIGV2YWxOb3RMaWtlKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTk9UX0lOOgotICAgICAgICAgICAgZXZhbE5vdEluKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSVNfTlVMTDoKLSAgICAgICAgICAgIGV2YWxJc051bGwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JU19OT1RfTlVMTDoKLSAgICAgICAgICAgIGV2YWxJc05vdE51bGwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MVDoKLSAgICAgICAgICAgIGV2YWxMZXNzVGhhbihub2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkJPT0xfTElUOgotICAgICAgICAgICAgZXZhbEJvb2xlYW5MaXRlcmFsKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuVElNRV9MSVQ6Ci0gICAgICAgICAgICBldmFsVGltZUxpdGVyYWwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5TVFJJTkdfTElUOgotICAgICAgICAgICAgZXZhbFN0cmluZ0xpdGVyYWwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5DT05UQUlOUzoKLSAgICAgICAgICAgIGV2YWxDb250YWlucyhub2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkV4YWN0TnVtTGl0OgotICAgICAgICAgICAgZXZhbEV4YWN0TnVtTGl0ZXJhbChub2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkxURVE6Ci0gICAgICAgICAgICBldmFsTGVzc09yRXF1YWwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OT1Q6Ci0gICAgICAgICAgICBldmFsTm90KG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSUQ6Ci0gICAgICAgICAgICBldmFsSWQobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5BTkQ6Ci0gICAgICAgICAgICBldmFsQW5kKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSU46Ci0gICAgICAgICAgICBldmFsSW4obm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5FUToKLSAgICAgICAgICAgIGV2YWxFcXVhbHMobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OVU1fTElUOgotICAgICAgICAgICAgZXZhbE51bUxpdGVyYWwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MSUtFOgotICAgICAgICAgICAgZXZhbExpa2Uobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OVUxMOgotICAgICAgICAgICAgZXZhbE51bGwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5HVEVROgotICAgICAgICAgICAgZXZhbEdyZWF0ZXJUaGFuKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQXBwcm94TnVtTGl0OgotICAgICAgICAgICAgZXZhbEFwcHJveE51bUxpdGVyYWwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9GT0xERVI6Ci0gICAgICAgICAgICBldmFsSW5Gb2xkZXIobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5ORVE6Ci0gICAgICAgICAgICBldmFsTm90RXF1YWxzKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuU0NPUkU6Ci0gICAgICAgICAgICBldmFsU2NvcmUobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9UUkVFOgotICAgICAgICAgICAgZXZhbEluVHJlZShub2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk9SOgotICAgICAgICAgICAgZXZhbE9yKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuR1Q6Ci0gICAgICAgICAgICBldmFsR3JlYXRlclRoYW4obm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5USU1FU1RBTVA6Ci0gICAgICAgICAgICBldmFsVGltZUxpdGVyYWwobm9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZhaWwoIltVbmV4cGVjdGVkIG5vZGUgaW4gV0hFUkUgY2xhdXNlOiAiICsgbm9kZS50b1N0cmluZygpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEVuc3VyZSB0aGF0IHdlIHJlY2VpdmUgb25seSB2YWxpZCB0b2tlbnMgYW5kIG5vZGVzIGluIHRoZSB3aGVyZSBjbGF1c2U6Ci0gICAgcHJpdmF0ZSB2b2lkIGV2YWx1YXRlU2VhcmNoRXhwck5vZGUoVHJlZSBub2RlKSB7Ci0gICAgICAgIExPRy5pbmZvKCJldmFsdWF0aW5nIHRleHQgc2VhcmNoIGV4cHJlc3Npb24gbm9kZTogIiArIG5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9BTkQ6Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfT1I6Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID49IDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfTUlOVVM6Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZS5nZXRDaGlsZENvdW50KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfU0VBUkNIX1BIUkFTRV9TVFJJTkdfTElUOgotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX1NFQVJDSF9XT1JEX0xJVDoKLSAgICAgICAgICAgIGV2YWxTdHJpbmdMaXRlcmFsKG5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmYWlsKCJbVW5leHBlY3RlZCBub2RlIGluIHRleHQgc2VhcmNoIGV4cHJlc3Npb246ICIgKyBub2RlLnRvU3RyaW5nKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV2YWxJbkFueShUcmVlIG5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxDb2x1bW4oVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbWlzUWxTdHJpY3RMZXhlci5JRCwgbm9kZS5nZXRDaGlsZCgwKS5nZXRUeXBlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbEVxdWFscyhUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxJbkZvbGRlcihUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxBcHByb3hOdW1MaXRlcmFsKFRyZWUgbm9kZSkgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbE51bGwoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsTGlrZShUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxOdW1MaXRlcmFsKFRyZWUgbm9kZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZS5nZXRDaGlsZENvdW50KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbEluTGlzdChUcmVlIG5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxFcUFueShUcmVlIG5vZGUpIHsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxOb3RMaWtlKFRyZWUgbm9kZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZS5nZXRDaGlsZENvdW50KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbE5vdEluKFRyZWUgbm9kZSkgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbElzTnVsbChUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxJc05vdE51bGwoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsTGVzc1RoYW4oVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsQm9vbGVhbkxpdGVyYWwoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsU3RyaW5nTGl0ZXJhbChUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxDb250YWlucyhUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxFeGFjdE51bUxpdGVyYWwoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsTGVzc09yRXF1YWwoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsTm90KFRyZWUgbm9kZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZS5nZXRDaGlsZENvdW50KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbElkKFRyZWUgbm9kZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZS5nZXRDaGlsZENvdW50KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbEFuZChUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXZhbEluKFRyZWUgbm9kZSkgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXZhbE5vdEVxdWFscyhUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxTY29yZShUcmVlIG5vZGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV2YWxJblRyZWUoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsT3IoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsR3JlYXRlclRoYW4oVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBldmFsVGltZUxpdGVyYWwoVHJlZSBub2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlLmdldENoaWxkQ291bnQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9RdWVyeVRlc3REYXRhQ3JlYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvUXVlcnlUZXN0RGF0YUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlYzg4YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9pbm1lbW9yeS9xdWVyeS9RdWVyeVRlc3REYXRhQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5xdWVyeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5Vbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLkNPTVBMRVhfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5GT0xERVJfVFlQRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX0JPT0xFQU47Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9EQVRFVElNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5QUk9QX0lEX0RFQ0lNQUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9JTlQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkc7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuUFJPUF9JRF9TVFJJTkdfTVVMVElfVkFMVUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX0lOVEVHRVJfUFJPUDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfU1RSSU5HX1BST1A7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuVkVSU0lPTl9QUk9QRVJUWV9JRDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQmluZGluZ3NPYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5PYmplY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlZlcnNpb25pbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmlubWVtb3J5LlVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuc3RvcmVkb2JqLmltcGwuQ29udGVudFN0cmVhbURhdGFJbXBsOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBmaWxscyB0aGUgaW4tbWVtb3J5IHJlcG9zaXRvcnkgd2l0aCBzb21lIHRlc3Qgb2JqZWN0cyB0aGF0Ci0gKiBjYW4gYmUgdXNlZCBmb3IgcXVlcnkKLSAqIAotICogICAgICAgICBUaGlzIGNsYXNzIHVzZXMgdGhlIGZvbGxvd2luZyBkYXRhIGZvciBxdWVyeSB0ZXN0aW5nLiBXZSBoYXZlIG9uZQotICogICAgICAgICBkb2N1bWVudCB0eXBlICJDb21wbGV4VHlwZSIgYW5kIG9uZSBmb2xkZXIgdHlwZSAiRm9sZGVyVHlwZSIgVGhlCi0gKiAgICAgICAgIGRvY3VtZW50IHR5cGUgaGFzIG9uZSBwcm9wZXJ0eSBvZiBlYWNoIG9mIHRoZSB0eXBlcyBib29sZWFuLCBpbnRlZ2VyLAotICogICAgICAgICBkZWNpbWFsLCBzdHJpbmcgYW5kIGRhdGV0aW1lLiBpZCwgdXJpIGFuZCBodG1sIGFyZSB0cmVhdGVkIGxpa2UgYQotICogICAgICAgICBzdHJpbmcgYW5kIGRvIG5vdCBtYWtlIGEgZGlmZmVyZW5jZS4KLSAqIAotICogICAgICAgICBTdHJpbmcgSW50IERvdWJsZSBEYXRlVGltZSBCb29sZWFuCi0gKiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBbHBoYSAtMTAwIC0xLjZFLTUKLSAqICAgICAgICAgMjMuMDUuMTYxOCB0cnVlIEJldGEgLTUwIC00LjBFMjQgMDguMDUuMTk0NSBmYWxzZSBHYW1tYSAwIDMuMTQxNTkyCi0gKiAgICAgICAgIChub3cpIHRydWUgRGVsdGEgNTAgMS4yMzQ1NkUtNiAyMC4wMS4yMDM4IHRydWUgRXBzaWxvbiAxMDAgMS4yMzQ1RTEyCi0gKiAgICAgICAgIDE0LjA3LjIzNDUgZmFsc2UKLSAqIAotICogICAgICAgICBGb3IgZm9sZGVyIGFuZCB0cmVlIHRlc3RzIHRoaXMgc2VyaWVzIGlzIHB1dCBpbiBlYWNoIG9mIHRoZSB0aHJlZQotICogICAgICAgICB0ZXN0IGZvbGRlcnMKLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5VGVzdERhdGFDcmVhdG9yIHsKLQotICAgIHByaXZhdGUgZmluYWwgQmluZGluZ3NPYmplY3RGYWN0b3J5IGZGYWN0b3J5ID0gbmV3IEJpbmRpbmdzT2JqZWN0RmFjdG9yeUltcGwoKTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByb290Rm9sZGVySWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVwb3NpdG9yeUlkOwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0U2VydmljZSBmT2JqU3ZjOwotICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbmluZ1NlcnZpY2UgZlZlclN2YzsKLSAgICBwcml2YXRlIFN0cmluZyBkb2MxLCBkb2MyLCBkb2MzLCBkb2M0LCBkb2M1OwotICAgIHByaXZhdGUgU3RyaW5nIGZvbGRlcjE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZm9sZGVyMjsKLSAgICBwcml2YXRlIFN0cmluZyBmb2xkZXIxMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lWm9uZSBUWiA9IFRpbWVab25lLmdldFRpbWVab25lKCJadWx1Iik7Ci0KLSAgICBwdWJsaWMgUXVlcnlUZXN0RGF0YUNyZWF0b3IoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHJvb3RGb2xkZXJJZCwgT2JqZWN0U2VydmljZSBvYmpTdmMsIFZlcnNpb25pbmdTZXJ2aWNlIHZlclN2YykgewotICAgICAgICB0aGlzLnJvb3RGb2xkZXJJZCA9IHJvb3RGb2xkZXJJZDsKLSAgICAgICAgdGhpcy5yZXBvc2l0b3J5SWQgPSByZXBvc2l0b3J5SWQ7Ci0gICAgICAgIGZPYmpTdmMgPSBvYmpTdmM7Ci0gICAgICAgIGZWZXJTdmMgPSB2ZXJTdmM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXIxKCkgewotICAgICAgICByZXR1cm4gZm9sZGVyMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlcjIoKSB7Ci0gICAgICAgIHJldHVybiBmb2xkZXIyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyMTEoKSB7Ci0gICAgICAgIHJldHVybiBmb2xkZXIxMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVCYXNpY1Rlc3REYXRhKCkgewotICAgICAgICBjcmVhdGVUZXN0Rm9sZGVycygpOwotICAgICAgICBjcmVhdGVCYXNpY1Rlc3REb2N1bWVudHMoKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVCYXNpY1Rlc3REb2N1bWVudHMoKSB7Ci0KLSAgICAgICAgZmluYWwgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MxID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRaKTsKLSAgICAgICAgZ2MxLmNsZWFyKCk7Ci0gICAgICAgIGdjMS5zZXQoMTk0NSwgNCwgOCk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiQWxwaGEiKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9JTlQsIEludGVnZXIudmFsdWVPZigtMTAwKSk7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfREVDSU1BTCwgRG91YmxlLnZhbHVlT2YoLTQuMEUyNGQpKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9EQVRFVElNRSwgZ2MxKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9CT09MRUFOLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50MSA9IGNyZWF0ZUNvbnRlbnQoIkkgaGF2ZSBhIGNhdC4iKTsKLSAgICAgICAgZG9jMSA9IGNyZWF0ZURvY3VtZW50KCJhbHBoYSIsIHJvb3RGb2xkZXJJZCwgQ09NUExFWF9UWVBFLCBwcm9wZXJ0eU1hcDEsIGNvbnRlbnQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2MxKTsKLQotICAgICAgICBmaW5hbCBHcmVnb3JpYW5DYWxlbmRhciBnYzIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVFopOwotICAgICAgICBnYzIuY2xlYXIoKTsKLSAgICAgICAgZ2MyLnNldCgxNjE4LCA0LCAyMyk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiQmV0YSIpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0lOVCwgSW50ZWdlci52YWx1ZU9mKC01MCkpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0RFQ0lNQUwsIERvdWJsZS52YWx1ZU9mKC0xLjZFLTVkKSk7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfREFURVRJTUUsIGdjMik7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfQk9PTEVBTiwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQyID0gY3JlYXRlQ29udGVudCgiSSBoYXZlIGEgY2F0IG5hbWVkIEtpdHR5IEthdHR5LiIpOwotICAgICAgICBkb2MyID0gY3JlYXRlRG9jdW1lbnQoImJldGEiLCByb290Rm9sZGVySWQsIENPTVBMRVhfVFlQRSwgcHJvcGVydHlNYXAyLCBjb250ZW50Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZG9jMik7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiR2FtbWEiKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9JTlQsIEludGVnZXIudmFsdWVPZigwKSk7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfREVDSU1BTCwgRG91YmxlLnZhbHVlT2YoTWF0aC5QSSkpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0RBVEVUSU1FLCBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVFopKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9CT09MRUFOLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQzID0gY3JlYXRlQ29udGVudCgiSSBoYXZlIGEgZG9nLiIpOwotICAgICAgICBkb2MzID0gY3JlYXRlRG9jdW1lbnQoImdhbW1hIiwgcm9vdEZvbGRlcklkLCBDT01QTEVYX1RZUEUsIHByb3BlcnR5TWFwMywgY29udGVudDMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRvYzMpOwotCi0gICAgICAgIGZpbmFsIEdyZWdvcmlhbkNhbGVuZGFyIGdjNCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUWik7Ci0gICAgICAgIGdjNC5jbGVhcigpOwotICAgICAgICBnYzQuc2V0KDIwMzgsIDAsIDIwKTsKLQotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwNCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9TVFJJTkcsICJEZWx0YSIpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0lOVCwgSW50ZWdlci52YWx1ZU9mKDUwKSk7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfREVDSU1BTCwgRG91YmxlLnZhbHVlT2YoMS4yMzQ1NkUtNikpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0RBVEVUSU1FLCBnYzQpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0JPT0xFQU4sIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQ0ID0gY3JlYXRlQ29udGVudCgiSSBoYXZlIGEgY2F0IGFuZCBhIGRvZy4iKTsKLSAgICAgICAgZG9jNCA9IGNyZWF0ZURvY3VtZW50KCJkZWx0YSIsIHJvb3RGb2xkZXJJZCwgQ09NUExFWF9UWVBFLCBwcm9wZXJ0eU1hcDQsIGNvbnRlbnQ0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2M0KTsKLQotICAgICAgICBmaW5hbCBHcmVnb3JpYW5DYWxlbmRhciBnYzUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVFopOwotICAgICAgICBnYzUuY2xlYXIoKTsKLSAgICAgICAgZ2M1LnNldCgyMzQ1LCA2LCAxNCk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiRXBzaWxvbiIpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0lOVCwgSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0RFQ0lNQUwsIERvdWJsZS52YWx1ZU9mKDEuMjM0NUUxMikpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0RBVEVUSU1FLCBnYzUpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0JPT0xFQU4sIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50NSA9IGNyZWF0ZUNvbnRlbnQoIkkgaGF0ZSBoYXZpbmcgcGV0cy4iKTsKLSAgICAgICAgZG9jNSA9IGNyZWF0ZURvY3VtZW50KCJlcHNpbG9uIiwgcm9vdEZvbGRlcklkLCBDT01QTEVYX1RZUEUsIHByb3BlcnR5TWFwNSwgY29udGVudDUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRvYzUpOwotICAgICAgICAKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgZG9jNCA9IGNyZWF0ZURvY3VtZW50KCJKb2huJ3MgRG9jdW1lbnQiLCByb290Rm9sZGVySWQsIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpLCBwcm9wZXJ0eU1hcDYsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRvYzQpOwotCi0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTXVsdGlWYWx1ZURvY3VtZW50cygpIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG12UHJvcHMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZCgicmVkIik7Ci0gICAgICAgICAgICAgICAgYWRkKCJncmVlbiIpOwotICAgICAgICAgICAgICAgIGFkZCgiYmx1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAxID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX1NUUklOR19NVUxUSV9WQUxVRSwgbXZQcm9wczEpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0lOVCwgSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBjcmVhdGVEb2N1bWVudCgibXYtYWxwaGEiLCByb290Rm9sZGVySWQsIENPTVBMRVhfVFlQRSwgcHJvcGVydHlNYXAxKTsKLQotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbXZQcm9wczIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkKCJyZWQiKTsKLSAgICAgICAgICAgICAgICBhZGQoInBpbmsiKTsKLSAgICAgICAgICAgICAgICBhZGQoInZpb2xldCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX1NUUklOR19NVUxUSV9WQUxVRSwgbXZQcm9wczIpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0lOVCwgSW50ZWdlci52YWx1ZU9mKDIwMCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBjcmVhdGVEb2N1bWVudCgibXYtYmV0YSIsIHJvb3RGb2xkZXJJZCwgQ09NUExFWF9UWVBFLCBwcm9wZXJ0eU1hcDIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRlc3RGb2xkZXJzKCkgewotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwMSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9JTlQsIEludGVnZXIudmFsdWVPZigxMjM0KSk7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiQUJDRCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBmb2xkZXIxID0gY3JlYXRlRm9sZGVyKCJGb2xkZXIgMSIsIHJvb3RGb2xkZXJJZCwgRk9MREVSX1RZUEUsIHByb3BlcnR5TWFwMSk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfSU5ULCBJbnRlZ2VyLnZhbHVlT2YoLTIzNDUpKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9TVFJJTkcsICJkZWZnIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGZvbGRlcjIgPSBjcmVhdGVGb2xkZXIoIkZvbGRlciAyIiwgcm9vdEZvbGRlcklkLCBGT0xERVJfVFlQRSwgcHJvcGVydHlNYXAyKTsKLQotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwMyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9JTlQsIEludGVnZXIudmFsdWVPZigxMjMpKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9TVFJJTkcsICJaWlpaIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGZvbGRlcjExID0gY3JlYXRlRm9sZGVyKCJGb2xkZXIgMTEiLCBmb2xkZXIxLCBGT0xERVJfVFlQRSwgcHJvcGVydHlNYXAzKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVOdWxsVGVzdERvY3VtZW50KCkgewotCi0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHlNYXAxID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX1NUUklORywgIkRvY3VtZW50V2l0aE51bGxzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGNyZWF0ZURvY3VtZW50KCJudWxsZG9jIiwgcm9vdEZvbGRlcklkLCBDT01QTEVYX1RZUEUsIHByb3BlcnR5TWFwMSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0gICAgcHVibGljIHZvaWQgY3JlYXRlTGlrZVRlc3REb2N1bWVudHMoU3RyaW5nIGZvbGRlcklkKSB7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiQUJDREVGIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGNyZWF0ZURvY3VtZW50KCJsaWtlZG9jMSIsIGZvbGRlcklkLCBDT01QTEVYX1RZUEUsIHByb3BlcnR5TWFwMSk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiQUJDMTIzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGNyZWF0ZURvY3VtZW50KCJsaWtlZG9jMiIsIGZvbGRlcklkLCBDT01QTEVYX1RZUEUsIHByb3BlcnR5TWFwMik7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfU1RSSU5HLCAiMTIzQUJDIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGNyZWF0ZURvY3VtZW50KCJsaWtlZG9jMyIsIGZvbGRlcklkLCBDT01QTEVYX1RZUEUsIHByb3BlcnR5TWFwMyk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVWZXJzaW9uZWREb2N1bWVudCgpIHsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFZFUlNJT05fUFJPUEVSVFlfSUQsICJ2ZXIxMjMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBTdHJpbmcgdmVySWRWMSA9IGNyZWF0ZURvY3VtZW50KCJ2ZXJkb2MxIiwgcm9vdEZvbGRlcklkLCBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlZFUlNJT05FRF9UWVBFLAotICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwMSwgVmVyc2lvbmluZ1N0YXRlLk1BSk9SLCBudWxsKTsKLSAgICAgICAgT2JqZWN0RGF0YSB2ZXJzaW9uID0gZk9ialN2Yy5nZXRPYmplY3QocmVwb3NpdG9yeUlkLCB2ZXJJZFYxLCAiKiIsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gZ2V0IHZlcnNpb24gc2VyaWVzIGlkCi0gICAgICAgIFN0cmluZyB2ZXJJZFNlciA9IChTdHJpbmcpIHZlcnNpb24uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICAvLyBjcmVhdGUgc2Vjb25kIHZlcnNpb24KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcDIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHV0KFZFUlNJT05fUFJPUEVSVFlfSUQsICJ2ZXI0NTYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wc1YyID0gY3JlYXRlRG9jdW1lbnRQcm9wZXJ0aWVzKG51bGwsIG51bGwsIHByb3BlcnR5TWFwMik7Ci0KLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4odmVySWRWMSk7Ci0gICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkID0gbmV3IEhvbGRlcjxCb29sZWFuPihmYWxzZSk7Ci0gICAgICAgIGZWZXJTdmMuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgbnVsbCwgY29udGVudENvcGllZCk7Ci0KLSAgICAgICAgaWRIb2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4odmVySWRWMSk7Ci0gICAgICAgIC8vIFRlc3QgY2hlY2staW4gYW5kIHBhc3MgY29udGVudCBhbmQgcHJvcGVydGllcwotICAgICAgICBTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiSGVyZSBjb21lcyBuZXh0IHZlcnNpb24uIjsKLSAgICAgICAgZlZlclN2Yy5jaGVja0luKHJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIHRydWUsIHByb3BzVjIsIG51bGwsIGNoZWNraW5Db21tZW50LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgLy8gU3RyaW5nIHZlcklkVjIgPSBpZEhvbGRlci5nZXRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gdmVySWRTZXI7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU2Vjb25kYXJ5VGVzdERvY3VtZW50cygpIHsKLQotICAgICAgICBmaW5hbCBpbnQgaW50UHJvcFZhbDEgPSAxMDA7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmdQcm9wVmFsMSA9ICJTZWNvbmRhcnkgUHJvcGVydHkgVmFsdWUiOwotICAgICAgICBmaW5hbCBpbnQgaW50UHJvcFZhbDIgPSAyMDA7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmdQcm9wVmFsMiA9ICJTZWNvbmRhcnkgU3RyaW5nIjsKLQotICAgICAgICBmaW5hbCBHcmVnb3JpYW5DYWxlbmRhciBnYzEgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoVFopOwotICAgICAgICBnYzEuY2xlYXIoKTsKLSAgICAgICAgZ2MxLnNldCgxOTQ1LCA0LCA4KTsKLQotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwMSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9TVFJJTkcsICJTZWNvbmRhcnkiKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9JTlQsIEludGVnZXIudmFsdWVPZigtMTAwKSk7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfREVDSU1BTCwgRG91YmxlLnZhbHVlT2YoLTQuMEUyNGQpKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9EQVRFVElNRSwgZ2MxKTsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9CT09MRUFOLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBwdXQoU0VDT05EQVJZX1NUUklOR19QUk9QLCBzdHJpbmdQcm9wVmFsMSk7Ci0gICAgICAgICAgICAgICAgcHV0KFNFQ09OREFSWV9JTlRFR0VSX1BST1AsIGludFByb3BWYWwxKTsKLSAgICAgICAgICAgICAgICBwdXQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUywgU0VDT05EQVJZX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQxID0gY3JlYXRlQ29udGVudCgiU29tZSBtb3JlIGNvbnRlbnQuIik7Ci0gICAgICAgIGRvYzEgPSBjcmVhdGVEb2N1bWVudCgiZG9jd2l0aHNlY29uZGFyeSIsIHJvb3RGb2xkZXJJZCwgQ09NUExFWF9UWVBFLCBwcm9wZXJ0eU1hcDEsIGNvbnRlbnQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2MxKTsKLQotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5TWFwMiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdXQoUFJPUF9JRF9TVFJJTkcsICJTZWNvbmRhcnkgMiIpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0lOVCwgSW50ZWdlci52YWx1ZU9mKDEyMykpOwotICAgICAgICAgICAgICAgIHB1dChQUk9QX0lEX0RFQ0lNQUwsIERvdWJsZS52YWx1ZU9mKDEuMjNFMjRkKSk7Ci0gICAgICAgICAgICAgICAgcHV0KFBST1BfSURfQk9PTEVBTiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHB1dChTRUNPTkRBUllfU1RSSU5HX1BST1AsIHN0cmluZ1Byb3BWYWwyKTsKLSAgICAgICAgICAgICAgICBwdXQoU0VDT05EQVJZX0lOVEVHRVJfUFJPUCwgaW50UHJvcFZhbDIpOwotICAgICAgICAgICAgICAgIHB1dChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTLCBTRUNPTkRBUllfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudDIgPSBjcmVhdGVDb250ZW50KCJFdmVuIHN0aWxsIHNvbWUgbW9yZSBjb250ZW50LiIpOwotICAgICAgICBkb2MxID0gY3JlYXRlRG9jdW1lbnQoImRvY3dpdGhzZWNvbmRhcnkyIiwgcm9vdEZvbGRlcklkLCBDT01QTEVYX1RZUEUsIHByb3BlcnR5TWFwMiwgY29udGVudDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRvYzEpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUZvbGRlcihTdHJpbmcgZm9sZGVyTmFtZSwgU3RyaW5nIHBhcmVudEZvbGRlcklkLCBTdHJpbmcgdHlwZUlkLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGNyZWF0ZUZvbGRlclByb3BlcnRpZXMoZm9sZGVyTmFtZSwgdHlwZUlkLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlkID0gZk9ialN2Yy5jcmVhdGVGb2xkZXIocmVwb3NpdG9yeUlkLCBwcm9wcywgcGFyZW50Rm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gaWQpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJjcmVhdGVGb2xkZXIgZmFpbGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiY3JlYXRlRm9sZGVyKCkgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyB0eXBlSWQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgewotICAgICAgICByZXR1cm4gY3JlYXRlRG9jdW1lbnQobmFtZSwgZm9sZGVySWQsIHR5cGVJZCwgcHJvcGVydGllcywgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyB0eXBlSWQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcywKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSkgewotICAgICAgICByZXR1cm4gY3JlYXRlRG9jdW1lbnQobmFtZSwgZm9sZGVySWQsIHR5cGVJZCwgcHJvcGVydGllcywgVmVyc2lvbmluZ1N0YXRlLk5PTkUsIGNvbnRlbnRTdHJlYW0pOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyB0eXBlSWQsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcywKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJTdGF0ZSwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcyA9IG51bGw7Ci0gICAgICAgIEFjbCBhZGRBQ0VzID0gbnVsbDsKLSAgICAgICAgQWNsIHJlbW92ZUFDRXMgPSBudWxsOwotICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24gPSBudWxsOwotCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVEb2N1bWVudFByb3BlcnRpZXMobmFtZSwgdHlwZUlkLCBwcm9wZXJ0aWVzKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWQgPSBmT2JqU3ZjLmNyZWF0ZURvY3VtZW50KHJlcG9zaXRvcnlJZCwgcHJvcHMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLCB2ZXJTdGF0ZSwgcG9saWNpZXMsIGFkZEFDRXMsCi0gICAgICAgICAgICAgICAgICAgIHJlbW92ZUFDRXMsIGV4dGVuc2lvbik7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBpZCkgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZURvY3VtZW50IGZhaWxlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0ZURvY3VtZW50KCkgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGNyZWF0ZURvY3VtZW50UHJvcGVydGllcyhTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IHByb3BFbnRyeSA6IHByb3BlcnR5TWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IGNyZWF0ZVByb3BlcnR5RGF0YShwcm9wRW50cnkuZ2V0S2V5KCksIHByb3BFbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKHBkKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgY3JlYXRlRm9sZGVyUHJvcGVydGllcyhTdHJpbmcgZm9sZGVyTmFtZSwgU3RyaW5nIHR5cGVJZCwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eU1hcCkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5OQU1FLCBmb2xkZXJOYW1lKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlSWQpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IHByb3BFbnRyeSA6IHByb3BlcnR5TWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IGNyZWF0ZVByb3BlcnR5RGF0YShwcm9wRW50cnkuZ2V0S2V5KCksIHByb3BFbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKHBkKTsKLSAgICAgICAgfQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZkZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGlmaWVkIHByb3BlcnR5IGNyZWF0aW9uIG1ldGhvZCwgY3JlYXRlIFByb3BlcnR5IG9mIEJvb2xlYW4sIFN0cmluZywKLSAgICAgKiBJbnRlZ2VyLCBEZWNpbWFsLCBvciBEYXRhVGltZSBkZXBlbmRpbmcgb24gY2xhc3Mgb2YgdmFsdWUgKEJvb2xlYW4sCi0gICAgICogU3RyaW5nLCBJbnRlZ2VyLCBEb3VibGUsIG9yIEdyZWdvcmlhbkNhbGVuZGFyLiBJZCwgSHRtbCBhbmQgVVJJIGFyZSBub3QKLSAgICAgKiBzdXBwb3J0ZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcElkCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgUHJvcGVydHlEYXRhPD8+IGNyZWF0ZVByb3BlcnR5RGF0YShTdHJpbmcgcHJvcElkLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSB2YWx1ZS5nZXRDbGFzcygpOwotICAgICAgICBpZiAoY2xhenouZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlCb29sZWFuRGF0YShwcm9wSWQsIChCb29sZWFuKSB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xhenouZXF1YWxzKERvdWJsZS5jbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eURlY2ltYWxEYXRhKHByb3BJZCwgQmlnRGVjaW1hbC52YWx1ZU9mKChEb3VibGUpIHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xhenouZXF1YWxzKEludGVnZXIuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJbnRlZ2VyRGF0YShwcm9wSWQsIEJpZ0ludGVnZXIudmFsdWVPZigoSW50ZWdlcikgdmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGF6ei5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5U3RyaW5nRGF0YShwcm9wSWQsIChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGF6ei5lcXVhbHMoR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlEYXRlVGltZURhdGEocHJvcElkLCAoR3JlZ29yaWFuQ2FsZW5kYXIpIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgIGNsYXp6ID0gKChMaXN0PD8+KSB2YWx1ZSkuZ2V0KDApLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBpZiAoY2xhenouZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5Qm9vbGVhbkRhdGEocHJvcElkLCAoTGlzdDxCb29sZWFuPikgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjbGF6ei5lcXVhbHMoRG91YmxlLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eURlY2ltYWxEYXRhKHByb3BJZCwgKExpc3Q8QmlnRGVjaW1hbD4pIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenouZXF1YWxzKEludGVnZXIuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SW50ZWdlckRhdGEocHJvcElkLCAoTGlzdDxCaWdJbnRlZ2VyPikgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjbGF6ei5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEocHJvcElkLCAoTGlzdDxTdHJpbmc+KSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNsYXp6LmVxdWFscyhHcmVnb3JpYW5DYWxlbmRhci5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlEYXRlVGltZURhdGEocHJvcElkLCAoTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4pIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgidW5zdXBwb3J0ZWQgdHlwZSBpbiBwcm9wZXJ5IHZhbHVlOiAiICsgY2xhenopOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmFpbCgidW5zdXBwb3J0ZWQgdHlwZSBpbiBwcm9wZXJ5IHZhbHVlOiAiICsgY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29udGVudFN0cmVhbSBjcmVhdGVDb250ZW50KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW1EYXRhSW1wbCBjb250ZW50ID0gbmV3IENvbnRlbnRTdHJlYW1EYXRhSW1wbCgtMSk7Ci0gICAgICAgIGNvbnRlbnQuc2V0RmlsZU5hbWUoImRhdGEudHh0Iik7Ci0gICAgICAgIGNvbnRlbnQuc2V0TWltZVR5cGUoInRleHQvcGxhaW4iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGVudC5zZXRDb250ZW50KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBmaWxsIGNvbnRlbnQgc3RyZWFtIHdpdGggZGF0YSIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZW50OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvUXVlcnlUeXBlc1Rlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5L3F1ZXJ5L1F1ZXJ5VHlwZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGViMTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvaW5tZW1vcnkvcXVlcnkvUXVlcnlUeXBlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkucXVlcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5UeXBlTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnkuVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5BYnN0cmFjdFByZWRpY2F0ZVdhbGtlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUXVlcnlXYWxrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1NlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNvbHVtblJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5RdWVyeU9iamVjdC5Tb3J0U3BlYzsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUXVlcnlUeXBlc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFF1ZXJ5VGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUXVlcnlUeXBlc1Rlc3QuY2xhc3MpOwotICAgIHByaXZhdGUgVHlwZU1hbmFnZXJJbXBsIHRtOwotICAgIHByaXZhdGUgVGVzdFByZWRpY2F0ZVdhbGtlciBwdzsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFByZWRpY2F0ZVdhbGtlciBleHRlbmRzIEFic3RyYWN0UHJlZGljYXRlV2Fsa2VyIHsKLSAgICAgICAgTGlzdDxJbnRlZ2VyPiBpZHMgPSBuZXcgTGlua2VkTGlzdDxJbnRlZ2VyPigpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IHdhbGtJZChUcmVlIG5vZGUpIHsKLSAgICAgICAgICAgIGlkcy5hZGQobm9kZS5nZXRUb2tlblN0YXJ0SW5kZXgoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgdG0gPSBuZXcgVHlwZU1hbmFnZXJJbXBsKCk7Ci0gICAgICAgIHRtLmluaXRUeXBlU3lzdGVtKG51bGwsIHRydWUpOyAvLyBjcmVhdGUgQ01JUyBkZWZhdWx0IHR5cGVzCi0KLSAgICAgICAgLy8gY3JlYXRlIHNvbWUgdHlwZXMgZm9yIHRlc3RpbmcKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gdHlwZURlZnMgPSBzdXBlci5jcmVhdGVUeXBlcygpOwotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgOiB0eXBlRGVmcykgewotICAgICAgICAgICAgdG0uYWRkVHlwZURlZmluaXRpb24odHlwZURlZiwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbml0aWFsaXplIHF1ZXJ5IG9iamVjdCB3aXRoIHR5cGUgbWFuYWdlcgotICAgICAgICAvLyBhbmQgdGVzdCB0aGUgYWJzdHJhY3QgcHJlZGljYXRlIHdhbGtlcgotICAgICAgICBwdyA9IG5ldyBUZXN0UHJlZGljYXRlV2Fsa2VyKCk7Ci0gICAgICAgIHN1cGVyLnNldFVwKHRtLCBwdyk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNUZXN0MSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAiICsgVElUTEVfUFJPUCArICIsICIgKyBBVVRIT1JfUFJPUCArICIgRlJPTSAiICsgQk9PS19UWVBFICsgIiBBUyBCb29rc0FsaWFzIFdIRVJFICIKLSAgICAgICAgICAgICAgICArIElTQk5fUFJPUCArICIgPSAnMTAwJyI7Ci0gICAgICAgIHZlcmlmeVJlc29sdmVTZWxlY3Qoc3RhdGVtZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlc1Rlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOID0gJzEwMCciOwotICAgICAgICB2ZXJpZnlSZXNvbHZlU2VsZWN0KHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNUZXN0MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSwgQm9va1R5cGUuQXV0aG9yIEZST00gQm9va1R5cGUgQVMgQm9va3NBbGlhcyBXSEVSRSBJU0JOID0gJzEwMCciOwotICAgICAgICB2ZXJpZnlSZXNvbHZlU2VsZWN0KHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNUZXN0NCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rc0FsaWFzLlRpdGxlLCBCb29rc0FsaWFzLkF1dGhvciBGUk9NIEJvb2tUeXBlIEFTIEJvb2tzQWxpYXMgV0hFUkUgSVNCTiA9ICcxMDAnIjsKLSAgICAgICAgdmVyaWZ5UmVzb2x2ZVNlbGVjdChzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzVGVzdDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQm9va3NBbGlhcy5UaXRsZSBBUyBhYmMsIEJvb2tzQWxpYXMuQXV0aG9yIGRlZiBGUk9NIEJvb2tUeXBlIEFTIEJvb2tzQWxpYXMgV0hFUkUgSVNCTiA9ICcxMDAnIjsKLSAgICAgICAgdmVyaWZ5UmVzb2x2ZVNlbGVjdChzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzVGVzdDYoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlVua25vd25Qcm9wZXJ0eSBGUk9NIEJvb2tUeXBlIFdIRVJFIElTQk4gPSAnMTAwJyI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZXNvbHZlU2VsZWN0KHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBmYWlsKCJTZWxlY3Qgb2YgdW5rbm93biBwcm9wZXJ0eSBpbiB0eXBlIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBMT0cuZGVidWcoInJlc29sdmVUeXBlc1Rlc3Q2KCksIGU6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygiaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgcXVlcnkgbmFtZSBpbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzVGVzdDcoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIFVua25vd25Qcm9wZXJ0eSBGUk9NIEJvb2tUeXBlIFdIRVJFIElTQk4gPSAnMTAwJyI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2ZXJpZnlSZXNvbHZlU2VsZWN0KHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBmYWlsKCJTZWxlY3Qgb2YgdW5rbm93biBwcm9wZXJ0eSBpbiB0eXBlIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygiaXMgbm90IGEgcHJvcGVydHkgcXVlcnkgbmFtZSBpbiBhbnkiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlc1Rlc3Q4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBCb29rVHlwZS5BdXRob3IgRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOID0gJzEwMCciOwotICAgICAgICB2ZXJpZnlSZXNvbHZlU2VsZWN0KHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNUZXN0OSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5BdXRob3IsIFRpdGxlIFRpdGxlQWxpYXMgRlJPTSBCb29rVHlwZSBXSEVSRSBUaXRsZUFsaWFzIDw+ICdIYXJyeSBQb3R0ZXInIjsKLSAgICAgICAgdmVyaWZ5UmVzb2x2ZVNlbGVjdChzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzVGVzdDEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLkF1dGhvciwgQm9va1R5cGUuVGl0bGUgVGl0bGVBbGlhcyBGUk9NIEJvb2tUeXBlIFdIRVJFIFRpdGxlQWxpYXMgPD4gJ0hhcnJ5IFBvdHRlciciOwotICAgICAgICB2ZXJpZnlSZXNvbHZlU2VsZWN0KHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVJlc29sdmVTZWxlY3QoU3RyaW5nIHN0YXRlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNRdWVyeVdhbGtlciB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeU9iaik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlcyA9IHF1ZXJ5T2JqLmdldFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB0eXBlcy5zaXplKCkpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gc2VsZWN0cyA9IHF1ZXJ5T2JqLmdldFNlbGVjdFJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgyID09IHNlbGVjdHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igc2VsZWN0IDogc2VsZWN0cykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWxlY3QgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSBzZWxlY3QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJvb2tUeXBlLCBjb2xSZWYuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhUSVRMRV9QUk9QKQotICAgICAgICAgICAgICAgICAgICB8fCBjb2xSZWYuZ2V0UHJvcGVydHlRdWVyeU5hbWUoKS5lcXVhbHMoQVVUSE9SX1BST1ApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2l0aFR3b0Zyb21zUXVhbGlmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLlRpdGxlLCBNeURvY1R5cGUuTXlTdHJpbmdQcm9wIEZST00gQm9va1R5cGUgSk9JTiBNeURvY1R5cGUgV0hFUkUgQm9va1R5cGUuSVNCTiA9ICcxMDAnIjsKLQotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlcyA9IHF1ZXJ5T2JqLmdldFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMiA9PSB0eXBlcy5zaXplKCkpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gc2VsZWN0cyA9IHF1ZXJ5T2JqLmdldFNlbGVjdFJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgyID09IHNlbGVjdHMuc2l6ZSgpKTsKLQotICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdHMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpLCBib29rVHlwZSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkuZXF1YWxzKFRJVExFX1BST1ApKTsKLQotICAgICAgICBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgc2VsZWN0cy5nZXQoMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY29sUmVmLmdldFR5cGVEZWZpbml0aW9uKCksIG15VHlwZSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkuZXF1YWxzKFNUUklOR19QUk9QKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNXaXRoVHdvRnJvbXNTYW1lVHlwZUNvcnJlY3RseVF1YWxpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBBLlRpdGxlIEZST00gQm9va1R5cGUgQSBKT0lOIEJvb2tUeXBlIEIiOwotCi0gICAgICAgIENtaXNRdWVyeVdhbGtlciB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeU9iaik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlcyA9IHF1ZXJ5T2JqLmdldFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCB0eXBlcy5zaXplKCkpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gc2VsZWN0cyA9IHF1ZXJ5T2JqLmdldFNlbGVjdFJlZmVyZW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlbGVjdHMuc2l6ZSgpKTsKLSAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSBzZWxlY3RzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhib29rVHlwZSwgY29sUmVmLmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVElUTEVfUFJPUCwgY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkEiLCBjb2xSZWYuZ2V0UXVhbGlmaWVyKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2l0aFR3b0Zyb21zU2FtZVR5cGVBbWJpZ3VvdXNseVF1YWxpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCb29rVHlwZS5UaXRsZSBGUk9NIEJvb2tUeXBlIEEgSk9JTiBCb29rVHlwZSBCIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyYXZlcnNlU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBmYWlsKCJTZWxlY3Qgd2l0aCBhbiBhbWJpZ3VvdXNseSBxdWFsaWZpZWQgcHJvcGVydHkgc2hvdWxkIGZhaWwuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBSZWNvZ25pdGlvbkV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygiQm9va1R5cGUgaXMgYW4gYW1iaWd1b3VzIHR5cGUgcXVlcnkgbmFtZSIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2l0aFR3b0Zyb21zVW5xdWFsaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgVGl0bGUsIE15U3RyaW5nUHJvcCBGUk9NIEJvb2tUeXBlIEpPSU4gTXlEb2NUeXBlIEFTIE15RG9jQWxpYXMgV0hFUkUgQm9va1R5cGUuSVNCTiA9ICcxMDAnIjsKLQotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlPYmopOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdhbGtlcik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZXMgPSBxdWVyeU9iai5nZXRUeXBlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDIgPT0gdHlwZXMuc2l6ZSgpKTsKLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHNlbGVjdHMgPSBxdWVyeU9iai5nZXRTZWxlY3RSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMiA9PSBzZWxlY3RzLnNpemUoKSk7Ci0KLSAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSBzZWxlY3RzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjb2xSZWYuZ2V0VHlwZURlZmluaXRpb24oKSwgYm9va1R5cGUpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhUSVRMRV9QUk9QKSk7Ci0KLSAgICAgICAgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdHMuZ2V0KDEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpLCBteVR5cGUpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhTVFJJTkdfUFJPUCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2l0aFR3b0Zyb21zTm90VW5pcXVlKCkgewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBNeVN0cmluZ1Byb3AgRlJPTSBNeURvY1R5cGVDb3B5IEpPSU4gTXlEb2NUeXBlIjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJhdmVyc2VTdGF0ZW1lbnQoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGZhaWwoIlNlbGVjdCB3aXRoIGFuIHVucXVhbGlmaWVkIHByb3BlcnR5IHRoYXQgaXMgbm90IHVuaXF1ZSBzaG91bGQgZmFpbC4iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFJlY29nbml0aW9uRXhjZXB0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS50b1N0cmluZygpLmNvbnRhaW5zKCJpcyBub3QgYSB1bmlxdWUgcHJvcGVydHkgcXVlcnkgbmFtZSB3aXRoaW4gdGhlIHR5cGVzIGluIGZyb20iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlc1dpdGhUd29Gcm9tc1VuaXF1ZUJ5UXVhbGlmeWluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBNeURvY1R5cGUuTXlTdHJpbmdQcm9wIEZST00gTXlEb2NUeXBlQ29weSBKT0lOIE15RG9jVHlwZSI7Ci0KLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHR5cGVzID0gcXVlcnlPYmouZ2V0VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgyID09IHR5cGVzLnNpemUoKSk7Ci0gICAgICAgIExpc3Q8Q21pc1NlbGVjdG9yPiBzZWxlY3RzID0gcXVlcnlPYmouZ2V0U2VsZWN0UmVmZXJlbmNlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gc2VsZWN0cy5zaXplKCkpOwotICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdHMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG15VHlwZSwgY29sUmVmLmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhTVFJJTkdfUFJPUCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzVGVzdDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLiogRlJPTSBCb29rVHlwZSBXSEVSRSBJU0JOID0gJzEwMCciOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlPYmopOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdhbGtlcik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZXMgPSBxdWVyeU9iai5nZXRUeXBlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gdHlwZXMuc2l6ZSgpKTsKLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHNlbGVjdHMgPSBxdWVyeU9iai5nZXRTZWxlY3RSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSBzZWxlY3RzLnNpemUoKSk7Ci0gICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgc2VsZWN0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscygiKiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJvb2tUeXBlLCBjb2xSZWYuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNUZXN0MTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIE15RG9jVHlwZUNvcHkgSk9JTiBNeURvY1R5cGUiOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlPYmopOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdhbGtlcik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZXMgPSBxdWVyeU9iai5nZXRUeXBlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDIgPT0gdHlwZXMuc2l6ZSgpKTsKLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHNlbGVjdHMgPSBxdWVyeU9iai5nZXRTZWxlY3RSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSBzZWxlY3RzLnNpemUoKSk7Ci0gICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgc2VsZWN0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscygiKiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlc1doZXJlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gQm9va1R5cGUgV0hFUkUgSVNCTiA9ICcxMDAnIjsKLSAgICAgICAgdmVyaWZ5UmVzb2x2ZVdoZXJlKHN0YXRlbWVudCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNXaGVyZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIEJvb2tUeXBlIFdIRVJFIEJvb2tUeXBlLklTQk4gPSAnMTAwJyI7Ci0gICAgICAgIHZlcmlmeVJlc29sdmVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2hlcmUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSBCb29rVHlwZSBBcyBCb29rQWxpYXMgV0hFUkUgQm9va0FsaWFzLklTQk4gPSAnMTAwJyI7Ci0gICAgICAgIHZlcmlmeVJlc29sdmVXaGVyZShzdGF0ZW1lbnQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2hlcmU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIEJvb2tUeXBlLklTQk4gSXNibkFsaWFzIEZST00gQm9va1R5cGUgV0hFUkUgSXNibkFsaWFzIDwgJzEwMCciOwotICAgICAgICB2ZXJpZnlSZXNvbHZlV2hlcmUoc3RhdGVtZW50KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlc1doZXJlV2l0aFR3b0Zyb21zVW5xdWFsaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIEJvb2tUeXBlIEpPSU4gTXlEb2NUeXBlIFdIRVJFIElTQk4gPSAnMTAwJyI7Ci0gICAgICAgIENtaXNRdWVyeVdhbGtlciB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeU9iaik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHdoZXJlcyA9IHF1ZXJ5T2JqLmdldFdoZXJlUmVmZXJlbmNlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gd2hlcmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoQ21pc1NlbGVjdG9yIHdoZXJlIDogd2hlcmVzKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdoZXJlIGluc3RhbmNlb2YgQ29sdW1uUmVmZXJlbmNlKTsKLSAgICAgICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgd2hlcmUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpLCBib29rVHlwZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhJU0JOX1BST1ApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2hlcmVXaXRoVHdvRnJvbXNRdWFsaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIEJvb2tUeXBlIEpPSU4gTXlEb2NUeXBlIEFTIE15RG9jQWxpYXMgV0hFUkUgQm9va1R5cGUuSVNCTiA9ICcxMDAnIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gd2hlcmVzID0gcXVlcnlPYmouZ2V0V2hlcmVSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB3aGVyZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igd2hlcmUgOiB3aGVyZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2hlcmUgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSB3aGVyZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29sUmVmLmdldFR5cGVEZWZpbml0aW9uKCksIGJvb2tUeXBlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkuZXF1YWxzKElTQk5fUFJPUCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNXaGVyZVdpdGhUd29Gcm9tc1F1YWxpZmllZFdpdGhBbGlhcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gQm9va1R5cGUgQVMgTXlCb29rQWxpYXMgSk9JTiBNeURvY1R5cGUgIFdIRVJFIE15Qm9va0FsaWFzLklTQk4gPSAnMTAwJyI7Ci0gICAgICAgIENtaXNRdWVyeVdhbGtlciB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeU9iaik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgTGlzdDxDbWlzU2VsZWN0b3I+IHdoZXJlcyA9IHF1ZXJ5T2JqLmdldFdoZXJlUmVmZXJlbmNlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gd2hlcmVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoQ21pc1NlbGVjdG9yIHdoZXJlIDogd2hlcmVzKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdoZXJlIGluc3RhbmNlb2YgQ29sdW1uUmVmZXJlbmNlKTsKLSAgICAgICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgd2hlcmUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpLCBib29rVHlwZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhJU0JOX1BST1ApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2hlcmVXaXRoVHdvRnJvbXNRdWFsaWZpZWRXaXRoQWxpYXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIE15Qm9va0FsaWFzLlRpdGxlIEZST00gQm9va1R5cGUgQVMgTXlCb29rQWxpYXMgV0hFUkUgTXlCb29rQWxpYXMuSVNCTiA9ICcxMDAnIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gd2hlcmVzID0gcXVlcnlPYmouZ2V0V2hlcmVSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB3aGVyZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igd2hlcmUgOiB3aGVyZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2hlcmUgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSB3aGVyZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29sUmVmLmdldFR5cGVEZWZpbml0aW9uKCksIGJvb2tUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlSZXNvbHZlV2hlcmUoU3RyaW5nIHN0YXRlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENtaXNRdWVyeVdhbGtlciB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeU9iaik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0eXBlcyA9IHF1ZXJ5T2JqLmdldFR5cGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB0eXBlcy5zaXplKCkpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gd2hlcmVzID0gcXVlcnlPYmouZ2V0V2hlcmVSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB3aGVyZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igd2hlcmUgOiB3aGVyZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2hlcmUgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSB3aGVyZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYm9va1R5cGUsIGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkuZXF1YWxzKElTQk5fUFJPUCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNXaGVyZVdpdGhUd29Gcm9tc05vdFVuaXF1ZSgpIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIE15RG9jVHlwZUNvcHkgSk9JTiBNeURvY1R5cGUgV0hFUkUgTXlTdHJpbmdQcm9wID0gJzEwMCciOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cmF2ZXJzZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICAgICAgZmFpbCgiU2VsZWN0IHdpdGggYW4gdW5xdWFsaWZpZWQgcHJvcGVydHkgdGhhdCBpcyBub3QgdW5pcXVlIHNob3VsZCBmYWlsLiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgUmVjb2duaXRpb25FeGNlcHRpb24pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLnRvU3RyaW5nKCkuY29udGFpbnMoImlzIG5vdCBhIHVuaXF1ZSBwcm9wZXJ0eSBxdWVyeSBuYW1lIHdpdGhpbiB0aGUgdHlwZXMgaW4gZnJvbSIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzV2hlcmVXaXRoVHdvRnJvbXNVbmlxdWVCeVF1YWxpZnlpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIE15RG9jVHlwZUNvcHkgSk9JTiBNeURvY1R5cGUgV0hFUkUgTXlEb2NUeXBlLk15U3RyaW5nUHJvcCA9ICcxMDAnIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gd2hlcmVzID0gcXVlcnlPYmouZ2V0V2hlcmVSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSB3aGVyZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igd2hlcmUgOiB3aGVyZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2hlcmUgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSB3aGVyZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29sUmVmLmdldFR5cGVEZWZpbml0aW9uKCksIG15VHlwZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhTVFJJTkdfUFJPUCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXNPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIFRpdGxlIEFTIFRpdGxlQWxpYXMgRlJPTSBCb29rVHlwZSBXSEVSRSBBdXRob3IgPSAnSmltJyBPUkRFUiBCWSBUaXRsZUFsaWFzIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBMaXN0PFNvcnRTcGVjPiBzb3J0cyA9IHF1ZXJ5T2JqLmdldE9yZGVyQnlzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoMSA9PSBzb3J0cy5zaXplKCkpOwotICAgICAgICBmb3IgKFNvcnRTcGVjIHNvcnQgOiBzb3J0cykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3J0LmdldFNlbGVjdG9yKCkgaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSBzb3J0LmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpLCBib29rVHlwZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhUSVRMRV9QUk9QKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlc09yZGVyQnkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIFRpdGxlIEFTIFRpdGxlQWxpYXMgRlJPTSBCb29rVHlwZSBXSEVSRSBBdXRob3IgPSAnSmltJyBPUkRFUiBCWSBCb29rVHlwZS5BdXRob3IiOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlPYmopOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdhbGtlcik7Ci0gICAgICAgIExpc3Q8U29ydFNwZWM+IHNvcnRzID0gcXVlcnlPYmouZ2V0T3JkZXJCeXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgxID09IHNvcnRzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoU29ydFNwZWMgc29ydCA6IHNvcnRzKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvcnQuZ2V0U2VsZWN0b3IoKSBpbnN0YW5jZW9mIENvbHVtblJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNvcnQuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29sUmVmLmdldFR5cGVEZWZpbml0aW9uKCksIGJvb2tUeXBlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkuZXF1YWxzKEFVVEhPUl9QUk9QKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlc09yZGVyQnkzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIFRpdGxlIEZST00gQm9va1R5cGUgV0hFUkUgSVNCTiA8ICcxMDAnIE9SREVSIEJZIEF1dGhvciI7Ci0gICAgICAgIENtaXNRdWVyeVdhbGtlciB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeU9iaik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgTGlzdDxTb3J0U3BlYz4gc29ydHMgPSBxdWVyeU9iai5nZXRPcmRlckJ5cygpOwotICAgICAgICBhc3NlcnRUcnVlKDEgPT0gc29ydHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChTb3J0U3BlYyBzb3J0IDogc29ydHMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc29ydC5nZXRTZWxlY3RvcigpIGluc3RhbmNlb2YgQ29sdW1uUmVmZXJlbmNlKTsKLSAgICAgICAgICAgIENvbHVtblJlZmVyZW5jZSBjb2xSZWYgPSAoKENvbHVtblJlZmVyZW5jZSkgc29ydC5nZXRTZWxlY3RvcigpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb2xSZWYuZ2V0VHlwZURlZmluaXRpb24oKSwgYm9va1R5cGUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb2xSZWYuZ2V0UHJvcGVydHlRdWVyeU5hbWUoKS5lcXVhbHMoQVVUSE9SX1BST1ApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZUpvaW5UeXBlc1NpbXBsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gTXlEb2NUeXBlIEpPSU4gQm9va1R5cGUgT04gTXlEb2NUeXBlLk15U3RyaW5nUHJvcCA9IEJvb2tUeXBlLlRpdGxlIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gam9pbnMgPSBxdWVyeU9iai5nZXRKb2luUmVmZXJlbmNlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDIgPT0gam9pbnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igam9pbiA6IGpvaW5zKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGpvaW4gaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSBqb2luKTsKLSAgICAgICAgICAgIGlmIChteVR5cGUuZXF1YWxzKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpKSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkuZXF1YWxzKFNUUklOR19QUk9QKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJvb2tUeXBlLmVxdWFscyhjb2xSZWYuZ2V0VHlwZURlZmluaXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhUSVRMRV9QUk9QKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgdHlwZSBpbiBKT0lOIHJlZmVyZW5jZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlSm9pblR5cGVzV2l0aEFsaWFzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZW1lbnQgPSAiU0VMRUNUIFkuSVNCTiwgWC5NeUJvb2xlYW5Qcm9wLCBZLkF1dGhvciBGUk9NIChNeURvY1R5cGUgQVMgWCBKT0lOIEJvb2tUeXBlIEFTIFkgT04gWC5NeVN0cmluZ1Byb3AgPSBZLlRpdGxlKSAiCi0gICAgICAgICAgICAgICAgKyAiV0hFUkUgKCdKb2UnID0gQU5ZIFkuQXV0aG9yKSI7Ci0gICAgICAgIC8vICJTRUxFQ1QgICAgWS5DTEFJTV9OVU0sIFguUFJPUEVSVFlfQUREUkVTUywgWS5EQU1BR0VfRVNUSU1BVEVTICIgKwotICAgICAgICAvLyAiRlJPTSAgICggUE9MSUNZIEFTIFggSk9JTiBDTEFJTVMgQVMgWSBPTiBYLlBPTElDWV9OVU0gPSBZLlBPTElDWV9OVU0gKSAiCi0gICAgICAgIC8vICsKLSAgICAgICAgLy8gIldIRVJFICggMTAwMDAwID0gQU5ZIFkuREFNQUdFX0VTVElNQVRFUyApIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBMaXN0PENtaXNTZWxlY3Rvcj4gam9pbnMgPSBxdWVyeU9iai5nZXRKb2luUmVmZXJlbmNlcygpOwotICAgICAgICBhc3NlcnRUcnVlKDIgPT0gam9pbnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChDbWlzU2VsZWN0b3Igam9pbiA6IGpvaW5zKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGpvaW4gaW5zdGFuY2VvZiBDb2x1bW5SZWZlcmVuY2UpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9ICgoQ29sdW1uUmVmZXJlbmNlKSBqb2luKTsKLSAgICAgICAgICAgIGlmIChteVR5cGUuZXF1YWxzKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpKSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkuZXF1YWxzKFNUUklOR19QUk9QKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJvb2tUeXBlLmVxdWFscyhjb2xSZWYuZ2V0VHlwZURlZmluaXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhUSVRMRV9QUk9QKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgdHlwZSBpbiBKT0lOIHJlZmVyZW5jZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vjb25kYXJ5Sm9pbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5lZWRzIHNvbWUgc3BlY2lhbCB0eXBlczoKLSAgICAgICAgdG0gPSBuZXcgVHlwZU1hbmFnZXJJbXBsKCk7Ci0gICAgICAgIHRtLmluaXRUeXBlU3lzdGVtKG51bGwsIHRydWUpOyAvLyBjcmVhdGUgQ01JUyBkZWZhdWx0IHR5cGVzCi0KLSAgICAgICAgLy8gY3JlYXRlIHNvbWUgdHlwZXMgZm9yIHRlc3RpbmcKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gdHlwZURlZnMgPSBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLmdldFR5cGVzTGlzdCgpOwotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgOiB0eXBlRGVmcykgewotICAgICAgICAgICAgdG0uYWRkVHlwZURlZmluaXRpb24odHlwZURlZiwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0VXAodG0sIHB3KTsKLQotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBKT0lOICIgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlNFQ09OREFSWV9UWVBFCi0gICAgICAgICAgICAgICAgKyAiIFdIRVJFIFNlY29uZGFyeVN0cmluZ1Byb3A9J2dyb292eSciOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlPYmopOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdhbGtlcik7Ci0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHNlY29uZGFyeUpvaW5lZFR5cGVzID0gcXVlcnlPYmouZ2V0Sm9pbmVkU2Vjb25kYXJ5VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZWNvbmRhcnlKb2luZWRUeXBlcyk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBjbWlzOm5hbWU9J2dyb292eSciOwotICAgICAgICB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgc2Vjb25kYXJ5Sm9pbmVkVHlwZXMgPSBxdWVyeU9iai5nZXRKb2luZWRTZWNvbmRhcnlUeXBlcygpOwotICAgICAgICBhc3NlcnROdWxsKHNlY29uZGFyeUpvaW5lZFR5cGVzKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IEpPSU4gIiArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuQ09NUExFWF9UWVBFICsgIiBXSEVSRSAiCi0gICAgICAgICAgICAgICAgKyBVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlBST1BfSURfU1RSSU5HICsgIj0nZ3Jvb3Z5JyI7Ci0gICAgICAgIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBzZWNvbmRhcnlKb2luZWRUeXBlcyA9IHF1ZXJ5T2JqLmdldEpvaW5lZFNlY29uZGFyeVR5cGVzKCk7Ci0gICAgICAgIGFzc2VydE51bGwoc2Vjb25kYXJ5Sm9pbmVkVHlwZXMpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgSk9JTiAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfVFlQRQotICAgICAgICAgICAgICAgICsgIiBPTiBjbWlzOmRvY3VtZW50LmNtaXM6b2JqZWN0SWQgPSAiICsgVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfVFlQRQotICAgICAgICAgICAgICAgICsgIi5jbWlzOm9iamVjdElkIFdIRVJFIFNlY29uZGFyeVN0cmluZ1Byb3A9J2dyb292eSciOwotICAgICAgICB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgc2Vjb25kYXJ5Sm9pbmVkVHlwZXMgPSBxdWVyeU9iai5nZXRKb2luZWRTZWNvbmRhcnlUeXBlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2Vjb25kYXJ5Sm9pbmVkVHlwZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX1RZUEUsIHNlY29uZGFyeUpvaW5lZFR5cGVzLmdldCgwKS5nZXRJZCgpKTsKLQotICAgICAgICBzdGF0ZW1lbnQgPSAiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IEpPSU4gIiArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX1RZUEUgKyAiIE9OICIKLSAgICAgICAgICAgICAgICArIFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX1RZUEUKLSAgICAgICAgICAgICAgICArICIuY21pczpvYmplY3RJZCA9IGNtaXM6ZG9jdW1lbnQuY21pczpvYmplY3RJZCBXSEVSRSBTZWNvbmRhcnlTdHJpbmdQcm9wPSdncm9vdnknIjsKLSAgICAgICAgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIHNlY29uZGFyeUpvaW5lZFR5cGVzID0gcXVlcnlPYmouZ2V0Sm9pbmVkU2Vjb25kYXJ5VHlwZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlY29uZGFyeUpvaW5lZFR5cGVzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhVbml0VGVzdFR5cGVTeXN0ZW1DcmVhdG9yLlNFQ09OREFSWV9UWVBFLCBzZWNvbmRhcnlKb2luZWRUeXBlcy5nZXQoMCkuZ2V0SWQoKSk7Ci0KLSAgICAgICAgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCBKT0lOIE15U2Vjb25kYXJ5VHlwZSBPTiBjbWlzOmRvY3VtZW50LmNtaXM6b2JqZWN0SWQgPSBNeVNlY29uZGFyeVR5cGUuY21pczpvYmplY3RJZCBKT0lOIE15U2Vjb25kYXJ5VHlwZTIgT04gY21pczpkb2N1bWVudC5jbWlzOm9iamVjdElkID0gTXlTZWNvbmRhcnlUeXBlMi5jbWlzOm9iamVjdElkIFdIRVJFIFNlY29uZGFyeVN0cmluZ1Byb3A9J2dyb292eSciOwotICAgICAgICB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgc2Vjb25kYXJ5Sm9pbmVkVHlwZXMgPSBxdWVyeU9iai5nZXRKb2luZWRTZWNvbmRhcnlUeXBlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2Vjb25kYXJ5Sm9pbmVkVHlwZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX1RZUEUsIHNlY29uZGFyeUpvaW5lZFR5cGVzLmdldCgwKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFVuaXRUZXN0VHlwZVN5c3RlbUNyZWF0b3IuU0VDT05EQVJZX1RZUEVfMiwgc2Vjb25kYXJ5Sm9pbmVkVHlwZXMuZ2V0KDEpLmdldElkKCkpOwotCi0gICAgICAgIHN0YXRlbWVudCA9ICJTRUxFQ1QgYS5jbWlzOm9iamVjdElkLCBhLmNtaXM6bmFtZSwgYi5TZWNvbmRhcnlTdHJpbmdQcm9wIEZST00gY21pczpkb2N1bWVudCBBUyBhIEpPSU4gTXlTZWNvbmRhcnlUeXBlIEFTIGIgT04gYS5jbWlzOm9iamVjdElkID0gYi5jbWlzOm9iamVjdElkIFdIRVJFIGIuU2Vjb25kYXJ5U3RyaW5nUHJvcD0nZ3Jvb3Z5JyI7Ci0gICAgICAgIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBzZWNvbmRhcnlKb2luZWRUeXBlcyA9IHF1ZXJ5T2JqLmdldEpvaW5lZFNlY29uZGFyeVR5cGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZWNvbmRhcnlKb2luZWRUeXBlcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVW5pdFRlc3RUeXBlU3lzdGVtQ3JlYXRvci5TRUNPTkRBUllfVFlQRSwgc2Vjb25kYXJ5Sm9pbmVkVHlwZXMuZ2V0KDApLmdldElkKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVRdWFsaWZpZXJzMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBUaXRsZSBGUk9NIEJvb2tUeXBlIFdIRVJFIElOX1RSRUUoQm9va1R5cGUsICdmb28nKSI7Ci0gICAgICAgIENtaXNRdWVyeVdhbGtlciB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChxdWVyeU9iaik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2Fsa2VyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCb29rVHlwZSIsIHF1ZXJ5T2JqLmdldFR5cGVSZWZlcmVuY2UocHcuaWRzLmdldCgwKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVRdWFsaWZpZXJzMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBUaXRsZSBGUk9NIEJvb2tUeXBlIEIgV0hFUkUgSU5fVFJFRShCLCAnZm9vJykiOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlPYmopOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdhbGtlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQiIsIHF1ZXJ5T2JqLmdldFR5cGVSZWZlcmVuY2UocHcuaWRzLmdldCgwKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVRdWFsaWZpZXJzMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBUaXRsZSBGUk9NIEJvb2tUeXBlIEIgV0hFUkUgSU5fVFJFRShCb29rVHlwZSwgJ2ZvbycpIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkIiLCBxdWVyeU9iai5nZXRUeXBlUmVmZXJlbmNlKHB3Lmlkcy5nZXQoMCkpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlUXVhbGlmaWVyczQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgVGl0bGUgRlJPTSBCb29rVHlwZSBCIFdIRVJFIElOX1RSRUUoZHVtbXksICdmb28nKSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cmF2ZXJzZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotICAgICAgICAgICAgZmFpbCgiaW52YWxpZCBjb3JyZWxhdGlvbiBuYW1lIHNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBSZWNvZ25pdGlvbkV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygiZHVtbXkgaXMgbmVpdGhlciBhIHR5cGUgcXVlcnkgbmFtZSBub3IgYW4gYWxpYXMiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlUXVhbGlmaWVyczUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQjEuVGl0bGUgRlJPTSBCb29rVHlwZSBCMSBKT0lOIEJvb2tUeXBlIEIyIgotICAgICAgICAgICAgICAgICsgIiBXSEVSRSBJTl9UUkVFKEIxLCAnZm9vJykgT1IgSU5fVFJFRShCMiwgJ2JhcicpIjsKLSAgICAgICAgQ21pc1F1ZXJ5V2Fsa2VyIHdhbGtlciA9IGdldFdhbGtlcihzdGF0ZW1lbnQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHF1ZXJ5T2JqKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3YWxrZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkIxIiwgcXVlcnlPYmouZ2V0VHlwZVJlZmVyZW5jZShwdy5pZHMuZ2V0KDApKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQjIiLCBxdWVyeU9iai5nZXRUeXBlUmVmZXJlbmNlKHB3Lmlkcy5nZXQoMSkpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUeXBlUXVhbGlmaWVyczYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN0YXRlbWVudCA9ICJTRUxFQ1QgQi5UaXRsZSBGUk9NIEJvb2tUeXBlIEIgSk9JTiBNeURvY1R5cGUgRCIgKyAiIFdIRVJFIElOX1RSRUUoTXlEb2NUeXBlLCAnZm9vJykiOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gZ2V0V2Fsa2VyKHN0YXRlbWVudCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocXVlcnlPYmopOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdhbGtlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRCIsIHF1ZXJ5T2JqLmdldFR5cGVSZWZlcmVuY2UocHcuaWRzLmdldCgwKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVRdWFsaWZpZXJzNygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCBCMS5UaXRsZSBGUk9NIEJvb2tUeXBlIEIxIEpPSU4gQm9va1R5cGUgQjIiICsgIiBXSEVSRSBJTl9UUkVFKEJvb2tUeXBlLCAnZm9vJykiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJhdmVyc2VTdGF0ZW1lbnQoc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGZhaWwoImFtYmlndW91cyBjb3JyZWxhdGlvbiBuYW1lIHNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBSZWNvZ25pdGlvbkV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucygiQm9va1R5cGUgaXMgYW4gYW1iaWd1b3VzIHR5cGUgcXVlcnkgbmFtZSIpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5L3NyYy90ZXN0L3Jlc291cmNlcy9pbWFnZS5qcGcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvcmVzb3VyY2VzL2ltYWdlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5Mjg4Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvcmVzb3VyY2VzL2ltYWdlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1pbm1lbW9yeS9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNhOWI5OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnkvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgc2FtcGxlIGxvZzRqLnByb3BlcnRpZXMKLQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8KLQotIyBTdGRvdXQKLWxvZzRqLmFwcGVuZGVyLk89b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLQotIyBGaWxlCi1sb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuUi5GaWxlPXRhcmdldC9sb2dzL2xvZzRqLmxvZwotCi0jIENvbnRyb2wgdGhlIG1heGltdW0gbG9nIGZpbGUgc2l6ZQotbG9nNGouYXBwZW5kZXIuUi5NYXhGaWxlU2l6ZT0xMDBLQgotCi0jIEFyY2hpdmUgbG9nIGZpbGVzIChvbmUgYmFja3VwIGZpbGUgaGVyZSkKLWxvZzRqLmFwcGVuZGVyLlIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5PLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgWyV0XSAlYzogJW0lbgotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuCi0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucHJvdmlkZXIuc3BpPU8KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3IvUkVBRE1FLnR4dCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3IvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhNTJkNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1DTUlTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBvbiB0b3Agb2YgSkNSCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUdldHRpbmcgc3RhcnRlZAotLS0tLS0tLS0tLS0tLS0tCi1UbyBnZXQgYSBydW5uaW5nIGluc3RhbmNlIG9uIHRvcCBvZiBhIHRyYW5zaWVudCBKQ1IgcmVwb3NpdG9yeSAKLShBcGFjaGUgSmFja3JhYmJpdCkgdXNlIHRoZSBkZXZlbG9wIHByb2ZpbGU6Ci0KLSAgbXZuIC1vIC1EbG9nNGouY29uZmlndXJhdGlvbj1maWxlOi4vbG9nNGouY29uZmlnIC1QZGV2ZWxvcCBqZXR0eTpydW4KLSAgCi1UaGlzIGJ1aWxkcyB0aGUgd2ViIGFwcGxpY2F0aW9uIHdpdGggQXBhY2hlIEphY2tyYWJiaXQgaW5jbHVkZWQgYW5kIGRlcGxveXMgaXQgaW50bwotSmV0dHkuIFRoZSBKQ1IgcmVwb3NpdG9yeSBpcyBub3cgYXZhaWxhYmxlIHZpYSBDTUlTIGF0Ci0KLSAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL2F0b20KLSAgCi1Vc2UgYWRtaW4vYWRtaW4gdG8gbG9nIGluLiAKLQotCi1GZWF0dXJlcyBhbmQgbGltaXRhdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotR2VuZXJhbDoKLS0gTWFwcGluZyBpcyBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzOiBKQ1Igbm9kZSB0eXBlIG50OmZpbGUgd2l0aCBKQ1IgbWl4aW4gbWl4OnNpbXBsZVZlcnNpb25hYmxlIAotICBpcyBtYXBwZWQgdG8gQ01JUyBvYmplY3QgdHlwZSBjbWlzOmRvY3VtZW50LiBKQ1Igbm9kZSB0eXBlIG50OmZpbGUgd2l0aG91dCBKQ1IgbWl4aW4gCi0gIG1peDpzaW1wbGVWZXJzaW9uYWJsZSBpcyBtYXBwZWQgdG8gQ01JUyBvYmplY3QgdHlwZSBjbWlzOnVudmVyc2lvbmVkLWRvY3VtZW50LiBBbGwgb3RoZXIgSkNSCi0gIG5vZGUgdHlwZXMgYXJlIG1hcHBlZCB0byBDTUlTIG9iamVjdCB0eXBlIGNtaXM6Zm9sZGVyLgotICAKLVZlcnNpb25pbmc6IAotLSBFYWNoIHZlcnNpb24gb2YgYSBDTUlTIGRvY3VtZW50IGNvcnJlc3BvbmRzIHRvIGEgdmVyc2lvbiBpbiBKQ1IKLQotLSBBIHByaXZhdGUgd29ya2luZyBjb3B5IGluIENNSVMgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBub2RlIGluIEpDUgotCi0tIENNSVMgY2hlY2tvdXQvaW4gYXJlIG1hcHBlZCB0byBKQ1IgY2hlY2tvdXQvaW4gcmVzcGVjdGl2ZWx5Ci0KLS0gQ01JUyBjYW5jZWxDaGVja291dCBpcyBtYXBwZWQgdG8gYSByZXN0b3JlIG9wZXJhdGlvbiBvZiB0aGUgYmFzZSB2ZXJzaW9uIGluIEpDUi4gCi0gIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyB2ZXJzaW9uIHdoZW4gY2FuY2VsaW5nIGEgY2hlY2tvdXQuIAotCi0tIGNoZWNraW4gY29tbWVudCBpcyBub3Qgc3VwcG9ydGVkCi0KLS0gQWxsIHZlcnNpb25zIGFyZSBtYWpvcgotCi0tIFRoZSBKQ1IgdmVyc2lvbiBuYW1lIGlzIG1hcHBlZCB0byB0aGUgQ01JUyB2ZXJzaW9uIGxhYmVsIGFzIGZvbGxvd3M6IAotICBpZiB0aGUgSkNSIHZlcnNpb24gbmFtZSBtYXRjaGVzIChcZCspKFwuKFxkKykpPy4qIHRoZSB2YWx1ZSBvZiB0aGUgdGhpcmQgZ3JvdXAgCi0gIGlzIGFwcGVuZGVkIHdpdGggIi4wIiBhbmQgdGhlbiB1c2VkIGZvciB0aGUgQ01JUyB2ZXJzaW9uIGxhYmVsLiBPdGhlcndpc2UgdGhlIEpDUgotICB2ZXJzaW9uIG5hbWUgaXMgdXNlZCBmb3IgdGhlIENNSVMgdmVyc2lvbiBsYWJlbC4KLQotLSBEZWxldGluZyBvZiBzaW5nbGUgdmVyc2lvbnMgaXMgbm90IHN1cHBvcnRlZAotCi1RdWVyeToKLS0gQ01JUyBJTl9UUkVFIGFuZCBDTUlTIElOX0ZPTERFUiBwcmVkaWNhdGVzIG11c3Qgbm90IG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIHRoZSAKLSAgV0hFUkUgY2xhdXNlLiAKLSAgCi0tIENNSVMgSU5fVFJFRSBhbmQgQ01JUyBJTl9GT0xERVIgcHJlZGljYXRlcyBtYXkgb25seSBvY2N1ciBpbiBhZmZpcm1hdGl2ZSBwb3NpdGlvbiAKLSAgaW4gdGhlIFdIRVJFIGNsYXVzZS4gQSBsaXRlcmFsICdwJyBpbiBhIGJvb2xlYW4gZXhwcmVzc2lvbiAnWCdpcyBhZmZpcm1hdGl2ZSBpZiAKLSAgdGhlcmUgZXhpc3RzIGEgYm9vbGVhbiBleHByZXNzaW9uICdZJyBzdWNoIHRoYXQgJ3AnIEFORCBZID0gWCcuIAotICAKLS0gPD4sIDwsID4gY29tcGFyaXNvbiBvcGVyYXRvcnMgYXJlIG5vdCBhbGxvd2VkIG9uIGNtaXM6bmFtZQotCi0tIENSWCdzIEx1Y2VuZSBpbmRleCBoYXMgc29tZSBsYXRlbmN5IHVudGlsIGl0IGlzIHVwIHRvIGRhdGUuIFRoaXMgY2FuIGNhdXNlIHF1ZXJpZXMKLSAgdG8gbWlzcyBkb2N1bWVudHMgcmlnaHQgYWZ0ZXIgY3JlYXRpbmcgdGhlbS4KLSAgCi0tIENNSVMgSU4gYW5kIENNSVMgQU5ZIG9wZXJhdG9ycyBhcmUgbm90IHN1cHBvcnRlZC4gCi0KLS0gVGhlIGZvbGxvd2luZyBjb2x1bW5zIGFyZSBub3Qgc3VwcG9ydGVkIGluIHF1ZXJpZXM6IGNtaXM6YmFzZVR5cGVJZCwgCi0gIGNtaXM6Y2hhbmdlVG9rZW4KLSAgCi0tIFRoZSBmb2xsb3dpbmcgY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBxdWVyaWVzIGZvciBjbWlzOmRvY3VtZW50IGFuZCAKLSAgY21pczp1bnZlcnNpb25lZC1kb2N1bWVudDogY21pczppc0ltbXV0YWJsZSwgY21pczppc0xhdGVzdFZlcnNpb24sIGNtaXM6aXNNYWpvclZlcnNpb24sCi0gIGNtaXM6aXNMYXRlc3RNYWpvclZlcnNpb24sIGNtaXM6dmVyc2lvbkxhYmVsLCBjbWlzOnZlcnNpb25TZXJpZXNJZCwgCi0gIGNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCwgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkLCAKLSAgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5LCBjbWlzOmNoZWNraW5Db21tZW50LCBjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgsCi0gIGNtaXM6Y29udGVudFN0cmVhbUlkCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL2xvZzRqLmNvbmZpZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3IvbG9nNGouY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlhZmY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3IvbG9nNGouY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyAKLSMgIFN0YXJ0IGNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyIG9uIGEgQXBhY2hlIEphY2tyYWJiaXQgSkNSCi0jICByZXBvc2l0b3J5IHdpdGggSmV0dHkgYW5kIGxvZ2dpbmcgY29uZmlndXJlZCBpbiB0aGlzIGZpbGU6Ci0jCi0jICAgIG12biAtRGxvZzRqLmNvbmZpZ3VyYXRpb249ZmlsZTouL2xvZzRqLmNvbmZpZyAtUGRldmVsb3AgamV0dHk6cnVuCi0jCi0KLWxvZzRqLnJvb3RMb2dnZXI9V0FSTiwgQ29uc29sZSwgRmlsZQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY2hlbWlzdHJ5PURFQlVHCi0KLWxvZzRqLmFwcGVuZGVyLkNvbnNvbGU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkNvbnNvbGUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouRW5oYW5jZWRQYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5Db25zb2xlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCAlLTVwICVjIC0gJW0lbiAldGhyb3dhYmxlezB9Ci0KLWxvZzRqLmFwcGVuZGVyLkZpbGU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkZpbGUuRmlsZT1kZWJ1Zy5sb2cKLWxvZzRqLmFwcGVuZGVyLkZpbGUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouRW5oYW5jZWRQYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5GaWxlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCAlLTVwICVjIC0gJW0lbgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjVmMzBhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3IvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjcjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5PcGVuQ01JUyBKQ1IgU2VydmVyIEltcGxlbWVudGF0aW9uPC9uYW1lPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NHaSBCdW5kbGUgU3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtTmFtZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuamNyPC9CdW5kbGUtTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuamNyPC9CdW5kbGUtU3ltYm9saWNOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtVmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L0J1bmRsZS1WZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT5qYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cCxqYXZheC5zZXJ2bGV0LnJlc291cmNlczwvSW1wb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1DbGFzc3BhdGg+LjwvQnVuZGxlLUNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8V2ViLUNvbnRleHRQYXRoPmNtaXMtamNyPC9XZWItQ29udGV4dFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8b3ZlcmxheXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcmxheT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvb3ZlcmxheT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVybGF5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi9USElSRC1QQVJUWS1MSUNFTlNFUzwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9vdmVybGF5PgotICAgICAgICAgICAgICAgICAgICA8L292ZXJsYXlzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Ni4xLjIzPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnN1cmVmaXJlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3VyZWZpcmUtanVuaXQ0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xNC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmNsYXNzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgPG9yZy5hcGFjaGUuamFja3JhYmJpdC5yZXBvc2l0b3J5LmNvbmY+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvcmVwb3NpdG9yeS54bWw8L29yZy5hcGFjaGUuamFja3JhYmJpdC5yZXBvc2l0b3J5LmNvbmY+Ci0gICAgICAgICAgICAgICAgICAgICAgPG9yZy5hcGFjaGUuamFja3JhYmJpdC5yZXBvc2l0b3J5LmhvbWU+JHtiYXNlZGlyfS90YXJnZXQvamFja3JhYmJpdC1yZXBvPC9vcmcuYXBhY2hlLmphY2tyYWJiaXQucmVwb3NpdG9yeS5ob21lPgotICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+IAotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPiAgICAgICAgICAgIAotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3Mtd2FyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvbGxlY3Rpb25zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuMi4xPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50bHItcnVudGltZTwvYXJ0aWZhY3RJZD4gICAgICAgICAgICAKLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguamNyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amNyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7anVuaXQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuamFja3JhYmJpdDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+amFja3JhYmJpdC1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjUuMTwvdmVyc2lvbj4KLSAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmRldmVsb3A8L2lkPgotICAgICAgICAgICAgPCEtLSBUaGlzIHByb2ZpbGUgaW5jbHVkZXMgYW4gY29sbG9jYXRlZCBBcGFjaGUgSmFja3JhYmJpdCBKQ1IgcmVwb3NpdG9yeSBpbnRvCi0gICAgICAgICAgICAgICAgIHRoZSB3ZWIgYXBwbGljYXRpb25zIG1ha2luZyBpdCBzZWxmIGNvbnRhaW5lZC4gLS0+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5qY3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpjcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYWNrcmFiYml0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrcmFiYml0LWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3NsZjRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyQmluYXJ5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjckJpbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ2MWQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyQmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKLQotaW1wb3J0IGphdmF4Lmpjci5CaW5hcnk7Ci1pbXBvcnQgamF2YXguamNyLlJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLS8qKgotICogPGNvZGU+SmNyQmluYXJ5PC9jb2RlPiBpbXBsZW1lbnRzIHRoZSBKQ1IgPGNvZGU+QmluYXJ5PC9jb2RlPiBpbnRlcmZhY2UuIFRoaXMKLSAqIGlzIG1vc3RseSBhIGNvcHkgZnJvbSBvcmcuYXBhY2hlLmphY2tyYWJiaXQudmFsdWUuQmluYXJ5SW1wbCBpbiBBcGFjaGUKLSAqIEphY2tyYWJiaXQncyBqY3ItY29tbW9ucyBtb2R1bGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKY3JCaW5hcnkgaW1wbGVtZW50cyBCaW5hcnkgewotCi0gICAgLyoqCi0gICAgICogZW1wdHkgYXJyYXkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfQllURV9BUlJBWSA9IG5ldyBieXRlWzBdOwotCi0gICAgLyoqCi0gICAgICogbWF4IHNpemUgZm9yIGtlZXBpbmcgdG1wIGRhdGEgaW4gbWVtb3J5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZGRVJfU0laRSA9IDB4MTAwMDA7Ci0KLSAgICAvKioKLSAgICAgKiB1bmRlcmx5aW5nIHRtcCBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHRtcEZpbGU7Ci0KLSAgICAvKioKLSAgICAgKiBidWZmZXIgZm9yIHNtYWxsLXNpemVkIGRhdGEKLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBidWZmZXIgPSBFTVBUWV9CWVRFX0FSUkFZOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaW5hcnkgRU1QVFkgPSBuZXcgSmNyQmluYXJ5KEVNUFRZX0JZVEVfQVJSQVkpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KY3JCaW5hcnk8L2NvZGU+IGluc3RhbmNlIGZyb20gYW4KLSAgICAgKiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4uIFRoZSBjb250ZW50cyBvZiB0aGUgc3RyZWFtIGlzIHNwb29sZWQgdG8gYQotICAgICAqIHRlbXBvcmFyeSBmaWxlIG9yIHRvIGEgYnl0ZSBidWZmZXIgaWYgaXRzIHNpemUgaXMgc21hbGxlciB0aGFuCi0gICAgICoge0BsaW5rICNNQVhfQlVGRkVSX1NJWkV9LiBUaGUgaW5wdXQgc3RyZWFtIGlzIGNsb3NlZCBieSB0aGlzCi0gICAgICogaW1wbGVtZW50YXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGluCi0gICAgICogICAgICAgICAgICBzdHJlYW0gdG8gYmUgcmVwcmVzZW50ZWQgYXMgYSA8Y29kZT5KY3JCaW5hcnk8L2NvZGU+IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSByZWFkaW5nIGZyb20gdGhlIHN0cmVhbSBvciB3cml0aW5nCi0gICAgICogICAgICAgICAgICAgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIEpjckJpbmFyeShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIHNwb29sQnVmZmVyID0gbmV3IGJ5dGVbMHgyMDAwXTsKLSAgICAgICAgaW50IHJlYWQ7Ci0gICAgICAgIGludCBsZW4gPSAwOwotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgRmlsZSBzcG9vbEZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChzcG9vbEJ1ZmZlcikpID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzcG9vbCB0byB0ZW1wIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHNwb29sQnVmZmVyLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgbGVuICs9IHJlYWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZW4gKyByZWFkID4gTUFYX0JVRkZFUl9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRocmVzaG9sZCBmb3Iga2VlcGluZyBkYXRhIGluIG1lbW9yeSBleGNlZWRlZDsKLSAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRlbXAgZmlsZSBhbmQgc3Bvb2wgYnVmZmVyIGNvbnRlbnRzCi0KLSAgICAgICAgICAgICAgICAgICAgc3Bvb2xGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYmluIiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNwb29sRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShzcG9vbEJ1ZmZlciwgMCwgcmVhZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiArPSByZWFkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgbmV3IGJ1ZmZlciBhbmQgc3Bvb2wgb2xkIGJ1ZmZlciBjb250ZW50cwotICAgICAgICAgICAgICAgICAgICBieXRlW10gbmV3QnVmZmVyID0gbmV3IGJ5dGVbbGVuICsgcmVhZF07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3Bvb2xCdWZmZXIsIDAsIG5ld0J1ZmZlciwgbGVuLCByZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3QnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBsZW4gKz0gcmVhZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbml0IGZpZWxkcwotICAgICAgICB0bXBGaWxlID0gc3Bvb2xGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmNyQmluYXJ5PC9jb2RlPiBpbnN0YW5jZSBmcm9tIGEgPGNvZGU+Ynl0ZVtdPC9jb2RlPgotICAgICAqIGFycmF5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXkgdG8gYmUgcmVwcmVzZW50ZWQgYXMgYSA8Y29kZT5KY3JCaW5hcnk8L2NvZGU+Ci0gICAgICogICAgICAgICAgICBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBKY3JCaW5hcnkoYnl0ZVtdIGJ1ZmZlcikgewotICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJ1ZmZlciBtdXN0IGJlIG5vbi1udWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgIHRtcEZpbGUgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW0oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0bXBGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW5jZSBpcyBiYWNrZWQgYnkgYSB0ZW1wIGZpbGUKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbSh0bXBGaWxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oImFscmVhZHkgZGlzcG9zZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaW5zdGFuY2UgaXMgYmFja2VkIGJ5IGFuIGluLW1lbW9yeSBidWZmZXIKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgbG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRtcEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW5jZSBpcyBiYWNrZWQgYnkgYSB0ZW1wIGZpbGUKLSAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUodG1wRmlsZSwgInIiKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmFmLnNlZWsocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiByYWYucmVhZChiKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgcmFmLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGluc3RhbmNlIGlzIGJhY2tlZCBieSBhbiBpbi1tZW1vcnkgYnVmZmVyCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gTWF0aC5taW4oYi5sZW5ndGgsIGJ1ZmZlci5sZW5ndGggLSAoaW50KSBwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAoaW50KSBwb3NpdGlvbiwgYiwgMCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBpZiAodG1wRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGluc3RhbmNlIGlzIGJhY2tlZCBieSBhIHRlbXAgZmlsZQotICAgICAgICAgICAgcmV0dXJuIHRtcEZpbGUuZXhpc3RzKCkgPyB0bXBGaWxlLmxlbmd0aCgpIDogLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGluc3RhbmNlIGlzIGJhY2tlZCBieSBhbiBpbi1tZW1vcnkgYnVmZmVyCi0gICAgICAgICAgICByZXR1cm4gYnVmZmVyLmxlbmd0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmICh0bXBGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaW5zdGFuY2UgaXMgYmFja2VkIGJ5IGEgdGVtcCBmaWxlCi0gICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdGhpcyBpbnN0YW5jZSBpcyBiYWNrZWQgYnkgYW4gaW4tbWVtb3J5IGJ1ZmZlcgotICAgICAgICAgICAgYnVmZmVyID0gRU1QVFlfQllURV9BUlJBWTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JDb252ZXJ0ZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjA1NDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC5qY3IuTm9kZTsKLWltcG9ydCBqYXZheC5qY3IuUHJvcGVydHk7Ci1pbXBvcnQgamF2YXguamNyLlByb3BlcnR5VHlwZTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5qY3IuVmFsdWU7Ci1pbXBvcnQgamF2YXguamNyLlZhbHVlRmFjdG9yeTsKLWltcG9ydCBqYXZheC5qY3IuVmFsdWVGb3JtYXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLm5vZGV0eXBlLk5vZGVUeXBlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlCb29sZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGVjaW1hbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlIdG1sOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5U3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eVVyaTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGF0ZVRpbWVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURlY2ltYWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5VXJpSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBwcm92aWRpbmcgbWV0aG9kcyBmb3IgY29udmVydGluZyB2YXJpb3VzIGVudGl0aWVzIGZyb20vdG8gdGhlaXIKLSAqIHJlc3BlY3RpdmUgcmVwcmVzZW50YXRpb24gaW4gSkNSL0NNSVMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKY3JDb252ZXJ0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpjckNvbnZlcnRlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBRVUFMSUZJRURfTkFNRSA9IFBhdHRlcm4uY29tcGlsZSgiXFx7KFtefV0qKVxcfSguKikiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBSRUZJWEVEX05BTUUgPSBQYXR0ZXJuLmNvbXBpbGUoIigoW146L10rKTopPyhbXjpdKikiKTsKLQotICAgIHByaXZhdGUgSmNyQ29udmVydGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVzY2FwZXMgYWxsIGlsbGVnYWwgZm9yIEpDUiBsb2NhbCBuYW1lIGNoYXJhY3RlcnMgb2YgYSBzdHJpbmcuIFRoZQotICAgICAqIGVuY29kaW5nIGlzIGxvb3NlbHkgbW9kZWxlZCBhZnRlciBVUkkgZW5jb2RpbmcsIGJ1dCBvbmx5IGVuY29kZXMgdGhlCi0gICAgICogY2hhcmFjdGVycyBpdCBhYnNvbHV0ZWx5IG5lZWRzIHRvIGluIG9yZGVyIHRvIG1ha2UgdGhlIHJlc3VsdGluZyBzdHJpbmcgYQotICAgICAqIHZhbGlkIEpDUiBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBRTmFtZSBFQk5GOjxicj4KLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIHNpbXBsZW5hbWUgOjo9IG9uZWNoYXJzaW1wbGVuYW1lIHwgdHdvY2hhcnNpbXBsZW5hbWUgfCB0aHJlZW9ybW9yZWNoYXJuYW1lCi0gICAgICogb25lY2hhcnNpbXBsZW5hbWUgOjo9ICgqIEFueSBVbmljb2RlIGNoYXJhY3RlciBleGNlcHQ6ICcuJywgJy8nLCAnOicsICdbJywgJ10nLCAnKicsICd8JyBvciBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgKikKLSAgICAgKiB0d29jaGFyc2ltcGxlbmFtZSA6Oj0gJy4nIG9uZWNoYXJzaW1wbGVuYW1lIHwgb25lY2hhcnNpbXBsZW5hbWUgJy4nIHwgb25lY2hhcnNpbXBsZW5hbWUgb25lY2hhcnNpbXBsZW5hbWUKLSAgICAgKiB0aHJlZW9ybW9yZWNoYXJuYW1lIDo6PSBub25zcGFjZSBzdHJpbmcgbm9uc3BhY2UKLSAgICAgKiBzdHJpbmcgOjo9IGNoYXIgfCBzdHJpbmcgY2hhcgotICAgICAqIGNoYXIgOjo9IG5vbnNwYWNlIHwgJyAnCi0gICAgICogbm9uc3BhY2UgOjo9ICgqIEFueSBVbmljb2RlIGNoYXJhY3RlciBleGNlcHQ6ICcvJywgJzonLCAnWycsICddJywgJyonLCAnfCcgb3IgYW55IHdoaXRlc3BhY2UgY2hhcmFjdGVyICopCi0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtIGNtaXNOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSB0byBlc2NhcGUKLSAgICAgKiBAcmV0dXJuIHRoZSBlc2NhcGVkIG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlRm9ySmNyKFN0cmluZyBjbWlzTmFtZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGNtaXNOYW1lLmxlbmd0aCgpICogMTYgKyAzMik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY21pc05hbWUubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgY2hhciBjaCA9IGNtaXNOYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnJScgfHwgY2ggPT0gJy8nIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnWycgfHwgY2ggPT0gJ10nIHx8IGNoID09ICcqJyB8fCBjaCA9PSAnfCcgfHwgY2ggPT0gJ1x0JwotICAgICAgICAgICAgICAgICAgICB8fCBjaCA9PSAnXHInIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJy4nICYmIGNtaXNOYW1lLmxlbmd0aCgpIDwgMyB8fCBjaCA9PSAnICcKLSAgICAgICAgICAgICAgICAgICAgJiYgKGkgPT0gMCB8fCBpID09IGNtaXNOYW1lLmxlbmd0aCgpIC0gMSkpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCclJyk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoQ2hhcmFjdGVyLmZvckRpZ2l0KGNoIC8gMTYsIDE2KSkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKENoYXJhY3Rlci5mb3JEaWdpdChjaCAlIDE2LCAxNikpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBKU1ItMjgzLCAzLjIgTmFtZXMgQSBKQ1IgbmFtZSBpcyBhbiBvcmRlcmVkIHBhaXIgb2Ygc3RyaW5nczogKE4sIEwpCi0gICAgICogd2hlcmUgTiBpcyBhIEpDUiBuYW1lc3BhY2UgYW5kIEwgaXMgYSBKQ1IgbG9jYWwgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY21pc05hbWUKLSAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIGVzY2FwZQotICAgICAqIEByZXR1cm4gdGhlIGVzY2FwZWQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmNyTmFtZShTdHJpbmcgY21pc05hbWUpIHsKLSAgICAgICAgaWYgKGNtaXNOYW1lID09IG51bGwgfHwgY21pc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNtaXNOYW1lLmNoYXJBdCgwKSA9PSAneycpIHsKLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFFVQUxJRklFRF9OQU1FLm1hdGNoZXIoY21pc05hbWUpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVyaSA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG1hdGNoZXIuZ3JvdXAoMik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoY21pc05hbWUubGVuZ3RoKCkgKiAxNiArIDMyKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVXJpICE9IG51bGwgJiYgbmFtZXNwYWNlVXJpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgdmFsaWQgVVJJCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVcmkgPSBuZXcgVVJJKG5hbWVzcGFjZVVyaSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCd7Jyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ30nKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIFVSSQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUxLmdldE1lc3NhZ2UoKSwgZTEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVzY2FwZUZvckpjcihsb2NhbE5hbWUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUFJFRklYRURfTkFNRS5tYXRjaGVyKGNtaXNOYW1lKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBtYXRjaGVyLmdyb3VwKDIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBtYXRjaGVyLmdyb3VwKDMpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGNtaXNOYW1lLmxlbmd0aCgpICogMTYgKyAzMik7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZXNjYXBlRm9ySmNyKHByZWZpeCkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnOicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChlc2NhcGVGb3JKY3IobG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXNjYXBlRm9ySmNyKGNtaXNOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgSkNSIDxjb2RlPlByb3BlcnR5PC9jb2RlPiB0byBhIENNSVMgPGNvZGU+UHJvcGVydHlEYXRhPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gamNyUHJvcGVydHkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURhdGE8Pz4gY29udmVydChQcm9wZXJ0eSBqY3JQcm9wZXJ0eSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBBYnN0cmFjdFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eURhdGE7Ci0KLSAgICAgICAgc3dpdGNoIChqY3JQcm9wZXJ0eS5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuQklOQVJZOgotICAgICAgICBjYXNlIFByb3BlcnR5VHlwZS5OQU1FOgotICAgICAgICBjYXNlIFByb3BlcnR5VHlwZS5QQVRIOgotICAgICAgICBjYXNlIFByb3BlcnR5VHlwZS5SRUZFUkVOQ0U6Ci0gICAgICAgIGNhc2UgUHJvcGVydHlUeXBlLldFQUtSRUZFUkVOQ0U6Ci0gICAgICAgIGNhc2UgUHJvcGVydHlUeXBlLlNUUklORzoKLSAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGpjclByb3BlcnR5LmlzTXVsdGlwbGUoKSA/IG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoamNyUHJvcGVydHkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICB0b1N0cmluZ3MoamNyUHJvcGVydHkuZ2V0VmFsdWVzKCkpKSA6IG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoamNyUHJvcGVydHkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBqY3JQcm9wZXJ0eS5nZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFByb3BlcnR5VHlwZS5MT05HOgotICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gamNyUHJvcGVydHkuaXNNdWx0aXBsZSgpID8gbmV3IFByb3BlcnR5SW50ZWdlckltcGwoamNyUHJvcGVydHkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICB0b0ludHMoamNyUHJvcGVydHkuZ2V0VmFsdWVzKCkpKSA6IG5ldyBQcm9wZXJ0eUludGVnZXJJbXBsKGpjclByb3BlcnR5LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKGpjclByb3BlcnR5LmdldExvbmcoKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuREVDSU1BTDoKLSAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGpjclByb3BlcnR5LmlzTXVsdGlwbGUoKSA/IG5ldyBQcm9wZXJ0eURlY2ltYWxJbXBsKGpjclByb3BlcnR5LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdG9EZWNzKGpjclByb3BlcnR5LmdldFZhbHVlcygpKSkgOiBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbChqY3JQcm9wZXJ0eS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGpjclByb3BlcnR5LmdldERlY2ltYWwoKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFByb3BlcnR5VHlwZS5ET1VCTEU6Ci0gICAgICAgICAgICBwcm9wZXJ0eURhdGEgPSBqY3JQcm9wZXJ0eS5pc011bHRpcGxlKCkgPyBuZXcgUHJvcGVydHlEZWNpbWFsSW1wbChqY3JQcm9wZXJ0eS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGRvdWJsZXNUb0RlY3MoamNyUHJvcGVydHkuZ2V0VmFsdWVzKCkpKSA6IG5ldyBQcm9wZXJ0eURlY2ltYWxJbXBsKGpjclByb3BlcnR5LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKGpjclByb3BlcnR5LmdldERvdWJsZSgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFByb3BlcnR5VHlwZS5EQVRFOgotICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gamNyUHJvcGVydHkuaXNNdWx0aXBsZSgpID8gbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKGpjclByb3BlcnR5LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdG9EYXRlcyhqY3JQcm9wZXJ0eS5nZXRWYWx1ZXMoKSkpIDogbmV3IFByb3BlcnR5RGF0ZVRpbWVJbXBsKGpjclByb3BlcnR5LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgVXRpbC50b0NhbGVuZGFyKGpjclByb3BlcnR5LmdldERhdGUoKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuQk9PTEVBTjoKLSAgICAgICAgICAgIHByb3BlcnR5RGF0YSA9IGpjclByb3BlcnR5LmlzTXVsdGlwbGUoKSA/IG5ldyBQcm9wZXJ0eUJvb2xlYW5JbXBsKGpjclByb3BlcnR5LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdG9Cb29scyhqY3JQcm9wZXJ0eS5nZXRWYWx1ZXMoKSkpIDogbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwoamNyUHJvcGVydHkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBqY3JQcm9wZXJ0eS5nZXRCb29sZWFuKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBQcm9wZXJ0eVR5cGUuVVJJOgotICAgICAgICAgICAgcHJvcGVydHlEYXRhID0gamNyUHJvcGVydHkuaXNNdWx0aXBsZSgpID8gbmV3IFByb3BlcnR5VXJpSW1wbChqY3JQcm9wZXJ0eS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHRvU3RyaW5ncyhqY3JQcm9wZXJ0eS5nZXRWYWx1ZXMoKSkpIDogbmV3IFByb3BlcnR5VXJpSW1wbChqY3JQcm9wZXJ0eS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIGpjclByb3BlcnR5LmdldFN0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eSB0eXBlOiAiICsgamNyUHJvcGVydHkuZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3BlcnR5RGF0YS5zZXREaXNwbGF5TmFtZShqY3JQcm9wZXJ0eS5nZXROYW1lKCkpOwotICAgICAgICBwcm9wZXJ0eURhdGEuc2V0TG9jYWxOYW1lKGpjclByb3BlcnR5LmdldE5hbWUoKSk7Ci0gICAgICAgIHByb3BlcnR5RGF0YS5zZXRRdWVyeU5hbWUoamNyUHJvcGVydHkuZ2V0TmFtZSgpKTsKLQotICAgICAgICByZXR1cm4gcHJvcGVydHlEYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIHByb3BlcnR5IG9uIGEgSkNSIG5vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIHRvIHNldCB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEYXRhCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdG8gc2V0Ci0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KE5vZGUgbm9kZSwgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5RGF0YSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBWYWx1ZVtdIHZhbHVlczsKLSAgICAgICAgaW50IHByb3BlcnR5VHlwZTsKLQotICAgICAgICBpZiAocHJvcGVydHlEYXRhIGluc3RhbmNlb2YgUHJvcGVydHlCb29sZWFuKSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSB0b1ZhbHVlKChQcm9wZXJ0eUJvb2xlYW4pIHByb3BlcnR5RGF0YSwgbm9kZS5nZXRTZXNzaW9uKCkuZ2V0VmFsdWVGYWN0b3J5KCkpOwotICAgICAgICAgICAgcHJvcGVydHlUeXBlID0gUHJvcGVydHlUeXBlLkJPT0xFQU47Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlEYXRhIGluc3RhbmNlb2YgUHJvcGVydHlEYXRlVGltZSkgewotICAgICAgICAgICAgdmFsdWVzID0gdG9WYWx1ZSgoUHJvcGVydHlEYXRlVGltZSkgcHJvcGVydHlEYXRhLCBub2RlLmdldFNlc3Npb24oKS5nZXRWYWx1ZUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBQcm9wZXJ0eVR5cGUuREFURTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURhdGEgaW5zdGFuY2VvZiBQcm9wZXJ0eURlY2ltYWwpIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IHRvVmFsdWUoKFByb3BlcnR5RGVjaW1hbCkgcHJvcGVydHlEYXRhLCBub2RlLmdldFNlc3Npb24oKS5nZXRWYWx1ZUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBQcm9wZXJ0eVR5cGUuREVDSU1BTDsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURhdGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUh0bWwpIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IHRvVmFsdWUoKFByb3BlcnR5SHRtbCkgcHJvcGVydHlEYXRhLCBub2RlLmdldFNlc3Npb24oKS5nZXRWYWx1ZUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBQcm9wZXJ0eVR5cGUuU1RSSU5HOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5RGF0YSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IHRvVmFsdWUoKFByb3BlcnR5SWQpIHByb3BlcnR5RGF0YSwgbm9kZS5nZXRTZXNzaW9uKCkuZ2V0VmFsdWVGYWN0b3J5KCkpOwotICAgICAgICAgICAgcHJvcGVydHlUeXBlID0gUHJvcGVydHlUeXBlLlNUUklORzsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURhdGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXIpIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IHRvVmFsdWUoKFByb3BlcnR5SW50ZWdlcikgcHJvcGVydHlEYXRhLCBub2RlLmdldFNlc3Npb24oKS5nZXRWYWx1ZUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBQcm9wZXJ0eVR5cGUuREVDSU1BTDsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURhdGEgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZykgewotICAgICAgICAgICAgdmFsdWVzID0gdG9WYWx1ZSgoUHJvcGVydHlTdHJpbmcpIHByb3BlcnR5RGF0YSwgbm9kZS5nZXRTZXNzaW9uKCkuZ2V0VmFsdWVGYWN0b3J5KCkpOwotICAgICAgICAgICAgcHJvcGVydHlUeXBlID0gUHJvcGVydHlUeXBlLlNUUklORzsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eURhdGEgaW5zdGFuY2VvZiBQcm9wZXJ0eVVyaSkgewotICAgICAgICAgICAgdmFsdWVzID0gdG9WYWx1ZSgoUHJvcGVydHlVcmkpIHByb3BlcnR5RGF0YSwgbm9kZS5nZXRTZXNzaW9uKCkuZ2V0VmFsdWVGYWN0b3J5KCkpOwotICAgICAgICAgICAgcHJvcGVydHlUeXBlID0gUHJvcGVydHlUeXBlLlVSSTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IHR5cGU6ICIgKyBwcm9wZXJ0eURhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gcHJvcGVydHlEYXRhLmdldElkKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBpZiAoUHJvcGVydHlJZHMuTkFNRS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICBub2RlLmFkZE1peGluKE5vZGVUeXBlLk1JWF9USVRMRSk7Ci0gICAgICAgICAgICBuYW1lID0gUHJvcGVydHkuSkNSX1RJVExFOwotICAgICAgICB9IGVsc2UgaWYgKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICBuYW1lID0gUHJvcGVydHkuSkNSX01JTUVUWVBFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmFtZSA9IHRvSmNyTmFtZShwcm9wZXJ0eURhdGEuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICBub2RlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlc1swXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub2RlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlcywgcHJvcGVydHlUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHByb3BlcnR5IGZyb20gYSBKQ1Igbm9kZQotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogICAgICAgICAgICB0aGUgbm9kZSBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgcHJvcGVydHkKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEYXRhCi0gICAgICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdG8gcmVtb3ZlCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByb3BlcnR5KE5vZGUgbm9kZSwgUHJvcGVydHlEYXRhPD8+IHByb3BlcnR5RGF0YSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaWQgPSBwcm9wZXJ0eURhdGEuZ2V0SWQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBQcm9wZXJ0eUlkcy5OQU1FLmVxdWFscyhpZCkgPyBQcm9wZXJ0eS5KQ1JfVElUTEUgOiB0b0pjck5hbWUocHJvcGVydHlEYXRhLmdldElkKCkpOwotCi0gICAgICAgIGlmIChub2RlLmhhc1Byb3BlcnR5KG5hbWUpKSB7Ci0gICAgICAgICAgICBub2RlLmdldFByb3BlcnR5KG5hbWUpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcml2YXRlID4tLS0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgPGNvZGU+VmFsdWU8L2NvZGU+cyB0byBhIGxpc3Qgb2YgPGNvZGU+U3RyaW5nPC9jb2RlPgotICAgICAqIHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHRvU3RyaW5ncyhWYWx1ZVtdIHZhbHVlcykgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHZhbHVlcy5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoVmFsdWUgdiA6IHZhbHVlcykgewotICAgICAgICAgICAgc3RyaW5ncy5hZGQodi5nZXRTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RyaW5nczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGFuIGFycmF5IG9mIDxjb2RlPlZhbHVlPC9jb2RlPnMgdG8gYSBsaXN0IG9mCi0gICAgICogPGNvZGU+QmlnSW50ZWdlcjwvY29kZT5zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QmlnSW50ZWdlcj4gdG9JbnRzKFZhbHVlW10gdmFsdWVzKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxCaWdJbnRlZ2VyPiBpbnRzID0gbmV3IEFycmF5TGlzdDxCaWdJbnRlZ2VyPih2YWx1ZXMubGVuZ3RoKTsKLQotICAgICAgICBmb3IgKFZhbHVlIHYgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGludHMuYWRkKEJpZ0ludGVnZXIudmFsdWVPZih2LmdldExvbmcoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGludHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhbiBhcnJheSBvZiA8Y29kZT5WYWx1ZTwvY29kZT5zIHRvIGEgbGlzdCBvZgotICAgICAqIDxjb2RlPkJpZ0RlY2ltYWw8L2NvZGU+cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEJpZ0RlY2ltYWw+IHRvRGVjcyhWYWx1ZVtdIHZhbHVlcykgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Q8QmlnRGVjaW1hbD4gZGVjcyA9IG5ldyBBcnJheUxpc3Q8QmlnRGVjaW1hbD4odmFsdWVzLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChWYWx1ZSB2IDogdmFsdWVzKSB7Ci0gICAgICAgICAgICBkZWNzLmFkZCh2LmdldERlY2ltYWwoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVjczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGFuIGFycmF5IG9mIGRvdWJsZSA8Y29kZT5WYWx1ZTwvY29kZT5zIHRvIGEgbGlzdCBvZgotICAgICAqIDxjb2RlPkJpZ0ludGVnZXI8L2NvZGU+cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEJpZ0RlY2ltYWw+IGRvdWJsZXNUb0RlY3MoVmFsdWVbXSB2YWx1ZXMpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0PEJpZ0RlY2ltYWw+IGRlY3MgPSBuZXcgQXJyYXlMaXN0PEJpZ0RlY2ltYWw+KHZhbHVlcy5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoVmFsdWUgdiA6IHZhbHVlcykgewotICAgICAgICAgICAgZGVjcy5hZGQoQmlnRGVjaW1hbC52YWx1ZU9mKHYuZ2V0RG91YmxlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZWNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYW4gYXJyYXkgb2YgPGNvZGU+VmFsdWU8L2NvZGU+cyB0byBhIGxpc3Qgb2YKLSAgICAgKiA8Y29kZT5Cb29sZWFuczwvY29kZT5zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Qm9vbGVhbj4gdG9Cb29scyhWYWx1ZVtdIHZhbHVlcykgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Q8Qm9vbGVhbj4gYm9vbHMgPSBuZXcgQXJyYXlMaXN0PEJvb2xlYW4+KHZhbHVlcy5sZW5ndGgpOwotCi0gICAgICAgIGZvciAoVmFsdWUgdiA6IHZhbHVlcykgewotICAgICAgICAgICAgYm9vbHMuYWRkKHYuZ2V0Qm9vbGVhbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBib29sczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGFuIGFycmF5IG9mIDxjb2RlPlZhbHVlPC9jb2RlPnMgdG8gYSBsaXN0IG9mCi0gICAgICogPGNvZGU+R3JlZ29yaWFuQ2FsZW5kYXI8L2NvZGU+cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPiB0b0RhdGVzKFZhbHVlW10gdmFsdWVzKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPih2YWx1ZXMubGVuZ3RoKTsKLQotICAgICAgICBmb3IgKFZhbHVlIHYgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIGRhdGVzLmFkZChVdGlsLnRvQ2FsZW5kYXIodi5nZXREYXRlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkYXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgPGNvZGU+UHJvcGVydHlCb29sZWFuPC9jb2RlPiB0byBhbiBhcnJheSBvZiBKQ1IKLSAgICAgKiA8Y29kZT5WYWx1ZXM8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlW10gdG9WYWx1ZShQcm9wZXJ0eUJvb2xlYW4gcHJvcGVydHlEYXRhLCBWYWx1ZUZhY3RvcnkgdmFsdWVGYWN0b3J5KSB7Ci0gICAgICAgIExpc3Q8Qm9vbGVhbj4gdmFsdWVzID0gcHJvcGVydHlEYXRhLmdldFZhbHVlcygpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBWYWx1ZVtdIHJlc3VsdCA9IG5ldyBWYWx1ZVt2YWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGsgPSAwOwotICAgICAgICBmb3IgKEJvb2xlYW4gdiA6IHZhbHVlcykgewotICAgICAgICAgICAgcmVzdWx0W2srK10gPSB2YWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUodik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSA8Y29kZT5Qcm9wZXJ0eURhdGVUaW1lPC9jb2RlPiB0byBhbiBhcnJheSBvZiBKQ1IKLSAgICAgKiA8Y29kZT5WYWx1ZXM8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlW10gdG9WYWx1ZShQcm9wZXJ0eURhdGVUaW1lIHByb3BlcnR5RGF0YSwgVmFsdWVGYWN0b3J5IHZhbHVlRmFjdG9yeSkgewotICAgICAgICBMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPiB2YWx1ZXMgPSBwcm9wZXJ0eURhdGEuZ2V0VmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZVswXTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbHVlW10gcmVzdWx0ID0gbmV3IFZhbHVlW3ZhbHVlcy5zaXplKCldOwotICAgICAgICBpbnQgayA9IDA7Ci0gICAgICAgIGZvciAoR3JlZ29yaWFuQ2FsZW5kYXIgdiA6IHZhbHVlcykgewotICAgICAgICAgICAgcmVzdWx0W2srK10gPSB2YWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUodik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSA8Y29kZT5Qcm9wZXJ0eURlY2ltYWw8L2NvZGU+IHRvIGFuIGFycmF5IG9mIEpDUgotICAgICAqIDxjb2RlPlZhbHVlczwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVbXSB0b1ZhbHVlKFByb3BlcnR5RGVjaW1hbCBwcm9wZXJ0eURhdGEsIFZhbHVlRmFjdG9yeSB2YWx1ZUZhY3RvcnkpIHsKLSAgICAgICAgTGlzdDxCaWdEZWNpbWFsPiB2YWx1ZXMgPSBwcm9wZXJ0eURhdGEuZ2V0VmFsdWVzKCk7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZVswXTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbHVlW10gcmVzdWx0ID0gbmV3IFZhbHVlW3ZhbHVlcy5zaXplKCldOwotICAgICAgICBpbnQgayA9IDA7Ci0gICAgICAgIGZvciAoQmlnRGVjaW1hbCB2IDogdmFsdWVzKSB7Ci0gICAgICAgICAgICByZXN1bHRbaysrXSA9IHZhbHVlRmFjdG9yeS5jcmVhdGVWYWx1ZSh2KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIDxjb2RlPlByb3BlcnR5SHRtbDwvY29kZT4gdG8gYW4gYXJyYXkgb2YgSkNSCi0gICAgICogPGNvZGU+VmFsdWVzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBWYWx1ZVtdIHRvVmFsdWUoUHJvcGVydHlIdG1sIHByb3BlcnR5RGF0YSwgVmFsdWVGYWN0b3J5IHZhbHVlRmFjdG9yeSkgewotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gcHJvcGVydHlEYXRhLmdldFZhbHVlcygpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBWYWx1ZVtdIHJlc3VsdCA9IG5ldyBWYWx1ZVt2YWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGsgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyB2IDogdmFsdWVzKSB7Ci0gICAgICAgICAgICByZXN1bHRbaysrXSA9IHZhbHVlRmFjdG9yeS5jcmVhdGVWYWx1ZSh2KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIDxjb2RlPlByb3BlcnR5SWQ8L2NvZGU+IHRvIGFuIGFycmF5IG9mIEpDUiA8Y29kZT5WYWx1ZXM8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlW10gdG9WYWx1ZShQcm9wZXJ0eUlkIHByb3BlcnR5RGF0YSwgVmFsdWVGYWN0b3J5IHZhbHVlRmFjdG9yeSkgewotICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gcHJvcGVydHlEYXRhLmdldFZhbHVlcygpOwotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBWYWx1ZVtdIHJlc3VsdCA9IG5ldyBWYWx1ZVt2YWx1ZXMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGsgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyB2IDogdmFsdWVzKSB7Ci0gICAgICAgICAgICByZXN1bHRbaysrXSA9IHZhbHVlRmFjdG9yeS5jcmVhdGVWYWx1ZSh2KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIDxjb2RlPlByb3BlcnR5SW50ZWdlcjwvY29kZT4gdG8gYW4gYXJyYXkgb2YgSkNSCi0gICAgICogPGNvZGU+VmFsdWVzPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBWYWx1ZVtdIHRvVmFsdWUoUHJvcGVydHlJbnRlZ2VyIHByb3BlcnR5RGF0YSwgVmFsdWVGYWN0b3J5IHZhbHVlRmFjdG9yeSkgewotICAgICAgICBMaXN0PEJpZ0ludGVnZXI+IHZhbHVlcyA9IHByb3BlcnR5RGF0YS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsdWVbXSByZXN1bHQgPSBuZXcgVmFsdWVbdmFsdWVzLnNpemUoKV07Ci0gICAgICAgIGludCBrID0gMDsKLSAgICAgICAgZm9yIChCaWdJbnRlZ2VyIHYgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIHJlc3VsdFtrKytdID0gdmFsdWVGYWN0b3J5LmNyZWF0ZVZhbHVlKG5ldyBCaWdEZWNpbWFsKHYpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIDxjb2RlPlByb3BlcnR5U3RyaW5nPC9jb2RlPiB0byBhbiBhcnJheSBvZiBKQ1IKLSAgICAgKiA8Y29kZT5WYWx1ZXM8L2NvZGU+LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFZhbHVlW10gdG9WYWx1ZShQcm9wZXJ0eVN0cmluZyBwcm9wZXJ0eURhdGEsIFZhbHVlRmFjdG9yeSB2YWx1ZUZhY3RvcnkpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHByb3BlcnR5RGF0YS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsdWVbXSByZXN1bHQgPSBuZXcgVmFsdWVbdmFsdWVzLnNpemUoKV07Ci0gICAgICAgIGludCBrID0gMDsKLSAgICAgICAgZm9yIChTdHJpbmcgdiA6IHZhbHVlcykgewotICAgICAgICAgICAgcmVzdWx0W2srK10gPSB2YWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUodik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSA8Y29kZT5Qcm9wZXJ0eVVyaTwvY29kZT4gdG8gYW4gYXJyYXkgb2YgSkNSIDxjb2RlPlZhbHVlczwvY29kZT4KLSAgICAgKiAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVmFsdWVbXSB0b1ZhbHVlKFByb3BlcnR5VXJpIHByb3BlcnR5RGF0YSwgVmFsdWVGYWN0b3J5IHZhbHVlRmFjdG9yeSkgdGhyb3dzIFZhbHVlRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHByb3BlcnR5RGF0YS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsdWVbXSByZXN1bHQgPSBuZXcgVmFsdWVbdmFsdWVzLnNpemUoKV07Ci0gICAgICAgIGludCBrID0gMDsKLSAgICAgICAgZm9yIChTdHJpbmcgdiA6IHZhbHVlcykgewotICAgICAgICAgICAgcmVzdWx0W2srK10gPSB2YWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUodiwgUHJvcGVydHlUeXBlLlVSSSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JEb2N1bWVudC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI3NTQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5qY3IuQmluYXJ5OwotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotaW1wb3J0IGphdmF4Lmpjci5QYXRoTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLlByb3BlcnR5OwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb250ZW50QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLk9iamVjdEluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci50eXBlLkpjclR5cGVIYW5kbGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIGNtaXM6ZG9jdW1lbnQgYmFja2VkIGJ5IGFuIHVuZGVybHlpbmcgSkNSCi0gKiA8Y29kZT5Ob2RlPC9jb2RlPi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpjckRvY3VtZW50IGV4dGVuZHMgSmNyTm9kZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpjckRvY3VtZW50LmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVU5LTk9XTiA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwotCi0gICAgcHJvdGVjdGVkIEpjckRvY3VtZW50KE5vZGUgbm9kZSwgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIsIFBhdGhNYW5hZ2VyIHBhdGhNYW5hZ2VyLAotICAgICAgICAgICAgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlcikgewotICAgICAgICBzdXBlcihub2RlLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhlIGRvY3VtZW50IGlzIGNoZWNrZWQgb3V0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudENoZWNrZWRPdXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Tm9kZSgpLmlzQ2hlY2tlZE91dCgpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTAgZ2V0Q29udGVudFN0cmVhbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbWlzUnVudGltZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBOb2RlIGNvbnRlbnROb2RlID0gZ2V0Q29udGV4dE5vZGUoKTsKLSAgICAgICAgICAgIFByb3BlcnR5IGRhdGEgPSBjb250ZW50Tm9kZS5nZXRQcm9wZXJ0eShQcm9wZXJ0eS5KQ1JfREFUQSk7Ci0KLSAgICAgICAgICAgIC8vIGNvbXBpbGUgZGF0YQotICAgICAgICAgICAgQ29udGVudFN0cmVhbUltcGwgcmVzdWx0ID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0RmlsZU5hbWUoZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0TGVuZ3RoKEJpZ0ludGVnZXIudmFsdWVPZihkYXRhLmdldExlbmd0aCgpKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0TWltZVR5cGUoZ2V0UHJvcGVydHlPckVsc2UoY29udGVudE5vZGUsIFByb3BlcnR5LkpDUl9NSU1FVFlQRSwgTUlNRV9VTktOT1dOKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGRhdGEuZ2V0QmluYXJ5KCkuZ2V0U3RyZWFtKCkpKTsgLy8gc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdW1lcgotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChQYXRoTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTYgc2V0Q29udGVudFN0cmVhbQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc1N0b3JhZ2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSmNyTm9kZSBzZXRDb250ZW50U3RyZWFtKENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgYm9vbGVhbiBvdmVyd3JpdGVGbGFnKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgY29udGVudCBub2RlLiBGb3IgdmVyc2lvbiBzZXJpZXMgdGhpcyBpcyAqbm90KiB0aGUgc2FtZSBhcwotICAgICAgICAgICAgLy8gdGhlCi0gICAgICAgICAgICAvLyBjb250ZXh0IG5vZGUuIFNlZSBDTUlTLTQzOC4KLSAgICAgICAgICAgIE5vZGUgY29udGVudE5vZGUgPSBnZXROb2RlKCkuZ2V0Tm9kZShOb2RlLkpDUl9DT05URU5UKTsKLSAgICAgICAgICAgIFByb3BlcnR5IGRhdGEgPSBjb250ZW50Tm9kZS5nZXRQcm9wZXJ0eShQcm9wZXJ0eS5KQ1JfREFUQSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG92ZXJ3cml0ZQotICAgICAgICAgICAgaWYgKCFvdmVyd3JpdGVGbGFnICYmIGRhdGEuZ2V0TGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29udGVudEFscmVhZHlFeGlzdHNFeGNlcHRpb24oIkNvbnRlbnQgYWxyZWFkeSBleGlzdHMhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEpjclZlcnNpb25CYXNlIGpjclZlcnNpb24gPSBpc1ZlcnNpb25hYmxlKCkgPyBhc1ZlcnNpb24oKSA6IG51bGw7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b0NoZWNrb3V0ID0gamNyVmVyc2lvbiAhPSBudWxsICYmICFqY3JWZXJzaW9uLmlzQ2hlY2tlZE91dCgpOwotICAgICAgICAgICAgaWYgKGF1dG9DaGVja291dCkgewotICAgICAgICAgICAgICAgIGpjclZlcnNpb24uY2hlY2tvdXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgY29udGVudCwgaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICBCaW5hcnkgYmluYXJ5ID0gY29udGVudFN0cmVhbSA9PSBudWxsIHx8IGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkgPT0gbnVsbCA/IEpjckJpbmFyeS5FTVBUWQotICAgICAgICAgICAgICAgICAgICA6IG5ldyBKY3JCaW5hcnkobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb250ZW50Tm9kZS5zZXRQcm9wZXJ0eShQcm9wZXJ0eS5KQ1JfREFUQSwgYmluYXJ5KTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsICYmIGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnROb2RlLnNldFByb3BlcnR5KFByb3BlcnR5LkpDUl9NSU1FVFlQRSwgY29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGJpbmFyeS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnRlbnROb2RlLmdldFNlc3Npb24oKS5zYXZlKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdXRvQ2hlY2tvdXQpIHsKLSAgICAgICAgICAgICAgICAvLyBhdXRvIHZlcnNpb25pbmcgLT4gcmV0dXJuIG5ldyB2ZXJzaW9uIGNyZWF0ZWQgYnkgY2hlY2tpbgotICAgICAgICAgICAgICAgIHJldHVybiBqY3JWZXJzaW9uLmNoZWNraW4obnVsbCwgbnVsbCwgImF1dG8gY2hlY2tvdXQiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoamNyVmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIG5vZGUgaXMgY2hlY2tlZCBvdXQgLT4gcmV0dXJuIHB3Yy4KLSAgICAgICAgICAgICAgICByZXR1cm4gamNyVmVyc2lvbi5nZXRQd2MoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbm9uIHZlcnNpb25hYmxlIC0+IHJldHVybiB0aGlzCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByb3RlY3RlZCA+LS0tCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Y21pczppc0xhdGVzdFZlcnNpb248L2NvZGU+IHByb3BlcnR5Ci0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Y21pczppc01ham9yVmVyc2lvbjwvY29kZT4gcHJvcGVydHkKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc01ham9yVmVyc2lvbigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmNtaXM6aXNMYXRlc3RNYWpvclZlcnNpb248L2NvZGU+IHByb3BlcnR5Ci0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNMYXRlc3RNYWpvclZlcnNpb24oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5jbWlzOnZlcnNpb25MYWJlbDwvY29kZT4gcHJvcGVydHkKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZlcnNpb25MYWJlbCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dDwvY29kZT4KLSAgICAgKiAgICAgICAgIHByb3BlcnR5Ci0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Y21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkPC9jb2RlPgotICAgICAqICAgICAgICAgcHJvcGVydHkKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENoZWNrZWRPdXRJZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRCeTwvY29kZT4KLSAgICAgKiAgICAgICAgIHByb3BlcnR5Ci0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDaGVja2VkT3V0QnkoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5jbWlzOmNoZWNraW5Db21tZW50PC9jb2RlPiBwcm9wZXJ0eQotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2hlY2tJbkNvbW1lbnQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGdldElzSW1tdXRhYmxlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGlsZVByb3BlcnRpZXMoUHJvcGVydGllc0ltcGwgcHJvcGVydGllcywgU2V0PFN0cmluZz4gZmlsdGVyLCBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvKQotICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotCi0gICAgICAgIHN1cGVyLmNvbXBpbGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIGZpbHRlciwgb2JqZWN0SW5mbyk7Ci0KLSAgICAgICAgb2JqZWN0SW5mby5zZXRIYXNDb250ZW50KHRydWUpOwotICAgICAgICBvYmplY3RJbmZvLnNldEhhc1BhcmVudCh0cnVlKTsKLSAgICAgICAgb2JqZWN0SW5mby5zZXRTdXBwb3J0c0Rlc2NlbmRhbnRzKGZhbHNlKTsKLSAgICAgICAgb2JqZWN0SW5mby5zZXRTdXBwb3J0c0ZvbGRlclRyZWUoZmFsc2UpOwotCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBnZXRUeXBlSWRJbnRlcm5hbCgpOwotICAgICAgICBOb2RlIGNvbnRleHROb2RlID0gZ2V0Q29udGV4dE5vZGUoKTsKLQotICAgICAgICAvLyBtdXRhYmlsaXR5Ci0gICAgICAgIGFkZFByb3BlcnR5Qm9vbGVhbihwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuSVNfSU1NVVRBQkxFLCBnZXRJc0ltbXV0YWJsZSgpKTsKLQotICAgICAgICAvLyBjb250ZW50IHN0cmVhbQotICAgICAgICBsb25nIGxlbmd0aCA9IGdldFByb3BlcnR5TGVuZ3RoKGNvbnRleHROb2RlLCBQcm9wZXJ0eS5KQ1JfREFUQSk7Ci0gICAgICAgIGFkZFByb3BlcnR5SW50ZWdlcihwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RILCBsZW5ndGgpOwotCi0gICAgICAgIC8vIG1pbWUgdHlwZQotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBnZXRQcm9wZXJ0eU9yRWxzZShjb250ZXh0Tm9kZSwgUHJvcGVydHkuSkNSX01JTUVUWVBFLCBNSU1FX1VOS05PV04pOwotICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFLCBtaW1lVHlwZSk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0Q29udGVudFR5cGUobWltZVR5cGUpOwotCi0gICAgICAgIC8vIGZpbGUgbmFtZQotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBnZXROb2RlTmFtZSgpOwotICAgICAgICBhZGRQcm9wZXJ0eVN0cmluZyhwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FLCBmaWxlTmFtZSk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCi0gICAgICAgIGFkZFByb3BlcnR5SWQocHJvcGVydGllcywgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0lELCBnZXRPYmplY3RJZCgpICsgIi9zdHJlYW0iKTsKLQotICAgICAgICAvLyB2ZXJzaW9uaW5nCi0gICAgICAgIGFkZFByb3BlcnR5Qm9vbGVhbihwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuSVNfTEFURVNUX1ZFUlNJT04sIGlzTGF0ZXN0VmVyc2lvbigpKTsKLSAgICAgICAgYWRkUHJvcGVydHlCb29sZWFuKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5JU19NQUpPUl9WRVJTSU9OLCBpc01ham9yVmVyc2lvbigpKTsKLSAgICAgICAgYWRkUHJvcGVydHlCb29sZWFuKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTiwgaXNMYXRlc3RNYWpvclZlcnNpb24oKSk7Ci0gICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCBnZXRWZXJzaW9uTGFiZWwoKSk7Ci0gICAgICAgIGFkZFByb3BlcnR5SWQocHJvcGVydGllcywgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0lELCBnZXRWZXJzaW9uU2VyaWVzSWQoKSk7Ci0gICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQsIGdldENoZWNrSW5Db21tZW50KCkpOwotCi0gICAgICAgIGJvb2xlYW4gaXNDaGVja2VkT3V0ID0gaXNDaGVja2VkT3V0KCk7Ci0gICAgICAgIGFkZFByb3BlcnR5Qm9vbGVhbihwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsIGlzQ2hlY2tlZE91dCk7Ci0KLSAgICAgICAgaWYgKGlzQ2hlY2tlZE91dCkgewotICAgICAgICAgICAgYWRkUHJvcGVydHlJZChwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsIGdldENoZWNrZWRPdXRJZCgpKTsKLSAgICAgICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwgZ2V0Q2hlY2tlZE91dEJ5KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNldDxBY3Rpb24+IGNvbXBpbGVBbGxvd2FibGVBY3Rpb25zKFNldDxBY3Rpb24+IGFhcykgewotICAgICAgICBTZXQ8QWN0aW9uPiByZXN1bHQgPSBzdXBlci5jb21waWxlQWxsb3dhYmxlQWN0aW9ucyhhYXMpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0dFVF9DT05URU5UX1NUUkVBTSwgdHJ1ZSk7Ci0gICAgICAgIHNldEFjdGlvbihyZXN1bHQsIEFjdGlvbi5DQU5fU0VUX0NPTlRFTlRfU1RSRUFNLCB0cnVlKTsKLSAgICAgICAgc2V0QWN0aW9uKHJlc3VsdCwgQWN0aW9uLkNBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0sIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0dFVF9SRU5ESVRJT05TLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEJhc2VUeXBlSWQgZ2V0QmFzZVR5cGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyRm9sZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjckZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjE4NzY1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5TZXNzaW9uOwotaW1wb3J0IGphdmF4Lmpjci5xdWVyeS5RdWVyeTsKLWltcG9ydCBqYXZheC5qY3IucXVlcnkuUXVlcnlNYW5hZ2VyOwotaW1wb3J0IGphdmF4Lmpjci5xdWVyeS5RdWVyeVJlc3VsdDsKLWltcG9ydCBqYXZheC5qY3IudmVyc2lvbi5WZXJzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkZhaWxlZFRvRGVsZXRlRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuT2JqZWN0SW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyVHlwZUhhbmRsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci51dGlsLkZpbHRlckl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci51dGlsLlByZWRpY2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgY21pczpmb2xkZXIgYmFja2VkIGJ5IGFuIHVuZGVybHlpbmcgSkNSCi0gKiA8Y29kZT5Ob2RlPC9jb2RlPi4KLSAqLwotcHVibGljIGNsYXNzIEpjckZvbGRlciBleHRlbmRzIEpjck5vZGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihKY3JGb2xkZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEpjckZvbGRlcihOb2RlIG5vZGUsIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyLCBQYXRoTWFuYWdlciBwYXRoTWFuYWdlciwKLSAgICAgICAgICAgIEpjclR5cGVIYW5kbGVyTWFuYWdlciB0eXBlSGFuZGxlck1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIobm9kZSwgdHlwZU1hbmFnZXIsIHBhdGhNYW5hZ2VyLCB0eXBlSGFuZGxlck1hbmFnZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi4zLjEgZ2V0Q2hpbGRyZW4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9mIDxjb2RlPkpjck5vZGU8L2NvZGU+LiBDaGlsZHJlbiB3aGljaCBhcmUgY3JlYXRlZCBpbgotICAgICAqICAgICAgICAgdGhlIGNoZWNrZWQgb3V0IHN0YXRlIGFyZSBsZWZ0IG91dCBmcm9tIHRoZSBpdGVyYXRvci4KLSAgICAgKiBAdGhyb3dzIENtaXNSdW50aW1lRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yPEpjck5vZGU+IGdldE5vZGVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgRmlsdGVySXRlcmF0b3I8Tm9kZT4gbm9kZXMgPSBuZXcgRmlsdGVySXRlcmF0b3I8Tm9kZT4oZ2V0Tm9kZSgpLmdldE5vZGVzKCksCi0gICAgICAgICAgICAgICAgICAgIHR5cGVIYW5kbGVyTWFuYWdlci5nZXROb2RlUHJlZGljYXRlKCkpOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxKY3JOb2RlPiBqY3JOb2RlcyA9IG5ldyBJdGVyYXRvcjxKY3JOb2RlPigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZXMuaGFzTmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBKY3JOb2RlIG5leHQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGUobm9kZXMubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgbm9kZXMgd2hpY2ggYXJlIGNoZWNrZWQgb3V0IGFuZCBkbyBub3QgaGF2ZSBhIHZlcnNpb24KLSAgICAgICAgICAgIC8vIGhpc3RvcnkgKGkuZS4gb25seSBhIHJvb3QgdmVyc2lvbikKLSAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBjcmVhdGVkIHdpdGggVmVyc2lvbmluZ1N0YXRlIGNoZWNrZWRvdXQgYW5kIG5vdCB5ZXQKLSAgICAgICAgICAgIC8vIGNoZWNrZWQgaW4uCi0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlckl0ZXJhdG9yPEpjck5vZGU+KGpjck5vZGVzLCBuZXcgUHJlZGljYXRlPEpjck5vZGU+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKEpjck5vZGUgbm9kZSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuaXNWZXJzaW9uYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiBiYXNlVmVyc2lvbiA9IGdldEJhc2VWZXJzaW9uKG5vZGUuZ2V0Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVZlcnNpb24uZ2V0UHJlZGVjZXNzb3JzKCkubGVuZ3RoID4gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMiBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIENtaXNTdG9yYWdlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEpjck5vZGUgYWRkTm9kZUZyb21Tb3VyY2UoSmNyRG9jdW1lbnQgc291cmNlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBkZXN0UGF0aCA9IFBhdGhNYW5hZ2VyLmNyZWF0ZUNtaXNQYXRoKGdldE5vZGUoKS5nZXRQYXRoKCksIHNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0Tm9kZSgpLmdldFNlc3Npb24oKTsKLQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRXb3Jrc3BhY2UoKS5jb3B5KHNvdXJjZS5nZXROb2RlKCkuZ2V0UGF0aCgpLCBkZXN0UGF0aCk7Ci0gICAgICAgICAgICBKY3JOb2RlIGpjck5vZGUgPSBjcmVhdGUoc2Vzc2lvbi5nZXROb2RlKGRlc3RQYXRoKSk7Ci0KLSAgICAgICAgICAgIC8vIG92ZXJsYXkgbmV3IHByb3BlcnRpZXMKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMoamNyTm9kZS5nZXROb2RlKCksIGpjck5vZGUuZ2V0VHlwZUlkKCksIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXNzaW9uLnNhdmUoKTsKLSAgICAgICAgICAgIHJldHVybiBqY3JOb2RlOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTQgZGVsZXRlT2JqZWN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzUnVudGltZUV4Y2VwdGlvbgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShib29sZWFuIGFsbFZlcnNpb25zLCBib29sZWFuIGlzUHdjKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Tm9kZSgpLmhhc05vZGVzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIkZvbGRlciBpcyBub3QgZW1wdHkhIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1cGVyLmRlbGV0ZShhbGxWZXJzaW9ucywgaXNQd2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTUgZGVsZXRlVHJlZQotICAgICAqLwotICAgIHB1YmxpYyBGYWlsZWRUb0RlbGV0ZURhdGFJbXBsIGRlbGV0ZVRyZWUoKSB7Ci0gICAgICAgIEZhaWxlZFRvRGVsZXRlRGF0YUltcGwgcmVzdWx0ID0gbmV3IEZhaWxlZFRvRGVsZXRlRGF0YUltcGwoKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBnZXRJZCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotICAgICAgICAgICAgaWYgKGhhc0NoZWNrT3V0cyhub2RlKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRJZHMoQ29sbGVjdGlvbnMuPFN0cmluZz4gc2luZ2xldG9uTGlzdChpZCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBub2RlLmdldFNlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBub2RlLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uc2F2ZSgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRJZHMoQ29sbGVjdGlvbnMuPFN0cmluZz4gZW1wdHlMaXN0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJZHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByb3RlY3RlZCA+LS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21waWxlUHJvcGVydGllcyhQcm9wZXJ0aWVzSW1wbCBwcm9wZXJ0aWVzLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIE9iamVjdEluZm9JbXBsIG9iamVjdEluZm8pCi0gICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc3VwZXIuY29tcGlsZVByb3BlcnRpZXMocHJvcGVydGllcywgZmlsdGVyLCBvYmplY3RJbmZvKTsKLQotICAgICAgICBvYmplY3RJbmZvLnNldEhhc0NvbnRlbnQoZmFsc2UpOwotICAgICAgICBvYmplY3RJbmZvLnNldFN1cHBvcnRzRGVzY2VuZGFudHModHJ1ZSk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0U3VwcG9ydHNGb2xkZXJUcmVlKHRydWUpOwotCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSBnZXRUeXBlSWRJbnRlcm5hbCgpOwotCi0gICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5QQVRILCBwYXRoTWFuYWdlci5nZXRQYXRoKGdldE5vZGUoKSkpOwotCi0gICAgICAgIC8vIGZvbGRlciBwcm9wZXJ0aWVzCi0gICAgICAgIGlmIChwYXRoTWFuYWdlci5pc1Jvb3QoZ2V0Tm9kZSgpKSkgewotICAgICAgICAgICAgb2JqZWN0SW5mby5zZXRIYXNQYXJlbnQoZmFsc2UpOwotICAgICAgICAgICAgYWRkUHJvcGVydHlMaXN0KHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5QQVJFTlRfSUQsIENvbGxlY3Rpb25zLjxTdHJpbmc+IGVtcHR5TGlzdCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iamVjdEluZm8uc2V0SGFzUGFyZW50KHRydWUpOwotICAgICAgICAgICAgYWRkUHJvcGVydHlJZChwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuUEFSRU5UX0lELCBnZXRQYXJlbnQoKS5nZXRPYmplY3RJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZFByb3BlcnR5QWxsb3dlZENoaWxkT2JqZWN0VHlwZUlkcyhwcm9wZXJ0aWVzLCBmaWx0ZXIsIHR5cGVJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNldDxBY3Rpb24+IGNvbXBpbGVBbGxvd2FibGVBY3Rpb25zKFNldDxBY3Rpb24+IGFhcykgewotICAgICAgICBTZXQ8QWN0aW9uPiByZXN1bHQgPSBzdXBlci5jb21waWxlQWxsb3dhYmxlQWN0aW9ucyhhYXMpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0dFVF9ERVNDRU5EQU5UUywgdHJ1ZSk7Ci0gICAgICAgIHNldEFjdGlvbihyZXN1bHQsIEFjdGlvbi5DQU5fR0VUX0NISUxEUkVOLCB0cnVlKTsKLSAgICAgICAgc2V0QWN0aW9uKHJlc3VsdCwgQWN0aW9uLkNBTl9HRVRfRk9MREVSX1BBUkVOVCwgIXBhdGhNYW5hZ2VyLmlzUm9vdChnZXROb2RlKCkpKTsKLSAgICAgICAgc2V0QWN0aW9uKHJlc3VsdCwgQWN0aW9uLkNBTl9HRVRfT0JKRUNUX1BBUkVOVFMsICFwYXRoTWFuYWdlci5pc1Jvb3QoZ2V0Tm9kZSgpKSk7Ci0gICAgICAgIHNldEFjdGlvbihyZXN1bHQsIEFjdGlvbi5DQU5fR0VUX0ZPTERFUl9UUkVFLCB0cnVlKTsKLSAgICAgICAgc2V0QWN0aW9uKHJlc3VsdCwgQWN0aW9uLkNBTl9DUkVBVEVfRE9DVU1FTlQsIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0NSRUFURV9GT0xERVIsIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0RFTEVURV9UUkVFLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTm9kZSBnZXRDb250ZXh0Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldE5vZGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9iamVjdElkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gaXNSb290KCkgPyBQYXRoTWFuYWdlci5DTUlTX1JPT1RfSUQgOiBzdXBlci5nZXRPYmplY3RJZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBCYXNlVHlwZUlkIGdldEJhc2VUeXBlSWQoKSB7Ci0gICAgICAgIHJldHVybiBCYXNlVHlwZUlkLkNNSVNfRk9MREVSOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUlkSW50ZXJuYWwoKSB7Ci0gICAgICAgIHJldHVybiBKY3JUeXBlTWFuYWdlci5GT0xERVJfVFlQRV9JRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllcyhOb2RlIG5vZGUsIFR5cGVEZWZpbml0aW9uIHR5cGUsIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiTm8gcHJvcGVydGllcyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldDxTdHJpbmc+IGFkZGVkUHJvcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGFyZSB0aGVyZQotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURhdGE8Pz4gcHJvcCA6IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgPSB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcC5nZXRJZCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIGRvIHdlIGtub3cgdGhhdCBwcm9wZXJ0eT8KLSAgICAgICAgICAgICAgICBpZiAocHJvcERlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBpcyB1bmtub3duISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHNraXAgdHlwZSBpZAotICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldElkKCkuZXF1YWxzKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQ2Fubm90IHNldCAiICsgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQgKyAiLiBJZ25vcmluZyIpOwotICAgICAgICAgICAgICAgICAgICBhZGRlZFByb3BzLmFkZChwcm9wLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBza2lwIGNvbnRlbnQgc3RyZWFtIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldElkKCkuZXF1YWxzKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBzZXQgIiArIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSArICIuIElnbm9yaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkUHJvcHMuYWRkKHByb3AuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNhbiBpdCBiZSBzZXQ/Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkgPT0gVXBkYXRhYmlsaXR5LlJFQURPTkxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBpcyByZWFkb25seSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBlbXB0eSBwcm9wZXJ0aWVzIGFyZSBpbnZhbGlkCi0gICAgICAgICAgICAgICAgaWYgKFByb3BlcnR5SGVscGVyLmlzUHJvcGVydHlFbXB0eShwcm9wKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgcHJvcC5nZXRJZCgpICsgIicgbXVzdCBub3QgYmUgZW1wdHkhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYWRkIGl0Ci0gICAgICAgICAgICAgICAgSmNyQ29udmVydGVyLnNldFByb3BlcnR5KG5vZGUsIHByb3ApOwotICAgICAgICAgICAgICAgIGFkZGVkUHJvcHMuYWRkKHByb3AuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHJlcXVpcmVkIHByb3BlcnRpZXMgYXJlIG1pc3NpbmcgYW5kIHRyeSB0byBhZGQgZGVmYXVsdAotICAgICAgICAgICAgLy8gdmFsdWVzIGlmIGRlZmluZWQKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICghYWRkZWRQcm9wcy5jb250YWlucyhwcm9wRGVmLmdldElkKCkpICYmIHByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkgIT0gVXBkYXRhYmlsaXR5LlJFQURPTkxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wID0gUHJvcGVydHlIZWxwZXIuZ2V0RGVmYXVsdFZhbHVlKHByb3BEZWYpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSBudWxsICYmIHByb3BEZWYuaXNSZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgcHJvcERlZi5nZXRJZCgpICsgIicgaXMgcmVxdWlyZWQhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKY3JDb252ZXJ0ZXIuc2V0UHJvcGVydHkobm9kZSwgcHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByaXZhdGUgPi0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDaGVja091dHMoTm9kZSBub2RlKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEJ1aWxkIHhwYXRoIHF1ZXJ5IG9mIHRoZSBmb3JtCi0gICAgICAgIC8vICcvL3BhdGgvdG8vbm9kZS8vKltqY3I6aXNDaGVja2VkT3V0PSd0cnVlJ10nCi0gICAgICAgIFN0cmluZyB4UGF0aCA9ICIvKltqY3I6aXNDaGVja2VkT3V0PSd0cnVlJ10iOwotICAgICAgICBTdHJpbmcgcGF0aCA9IG5vZGUuZ2V0UGF0aCgpOwotICAgICAgICBpZiAoIi8iLmVxdWFscyhwYXRoKSkgewotICAgICAgICAgICAgcGF0aCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIHhQYXRoID0gJy8nICsgVXRpbC5lc2NhcGUocGF0aCkgKyB4UGF0aDsKLQotICAgICAgICAvLyBFeGVjdXRlIHF1ZXJ5Ci0gICAgICAgIFF1ZXJ5TWFuYWdlciBxdWVyeU1hbmFnZXIgPSBub2RlLmdldFNlc3Npb24oKS5nZXRXb3Jrc3BhY2UoKS5nZXRRdWVyeU1hbmFnZXIoKTsKLSAgICAgICAgUXVlcnkgcXVlcnkgPSBxdWVyeU1hbmFnZXIuY3JlYXRlUXVlcnkoeFBhdGgsIFF1ZXJ5LlhQQVRIKTsKLSAgICAgICAgUXVlcnlSZXN1bHQgcXVlcnlSZXN1bHQgPSBxdWVyeS5leGVjdXRlKCk7Ci0gICAgICAgIHJldHVybiBxdWVyeVJlc3VsdC5nZXROb2RlcygpLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgcHJvcGVydHkgImNtaXM6YWxsb3dlZENoaWxkT2JqZWN0VHlwZUlkcyIgdG8gdGhlIENNSVMgb2JqZWN0LiBTZWUKLSAgICAgKiBDTUlTIHNwZWNpZmljYXRpb24gdi4xLjAsIDIuMS41LjQuMiBQcm9wZXJ0eSBEZWZpbml0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgLSB0aGUgcHJvcGVydGllcyBvZiB0aGUgQ01JUyBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcwotICAgICAqICAgICAgICAgICAgaW5zdGFuY2UuCi0gICAgICogQHBhcmFtIGZpbHRlcgotICAgICAqIEBwYXJhbSB0eXBlSWQKLSAgICAgKiAgICAgICAgICAgIC0gdHlwZSBJRCBvZiB0aGUgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5QWxsb3dlZENoaWxkT2JqZWN0VHlwZUlkcyhQcm9wZXJ0aWVzSW1wbCBwcm9wZXJ0aWVzLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgSXRlcmF0b3I8VHlwZURlZmluaXRpb25Db250YWluZXI+IHR5cGVEZWZJdGVyYXRvciA9IHN1cGVyLnR5cGVNYW5hZ2VyLmdldFR5cGVEZWZpbml0aW9uTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB0eXBlSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHN1cGVyLnR5cGVNYW5hZ2VyLmdldFR5cGVEZWZpbml0aW9uTGlzdCgpLnNpemUoKSk7Ci0gICAgICAgIHdoaWxlICh0eXBlRGVmSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBkZWZpbml0aW9uID0gdHlwZURlZkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHR5cGVJZHMuYWRkKGRlZmluaXRpb24uZ2V0VHlwZURlZmluaXRpb24oKS5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgICBhZGRQcm9wZXJ0eUxpc3QocHJvcGVydGllcywgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkFMTE9XRURfQ0hJTERfT0JKRUNUX1RZUEVfSURTLCB0eXBlSWRzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyTm9kZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMjcyNjEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmpjci5JdGVtTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLk5vZGU7Ci1pbXBvcnQgamF2YXguamNyLlBhdGhOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5qY3IuUHJvcGVydHk7Ci1pbXBvcnQgamF2YXguamNyLlJlcG9zaXRvcnlFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLlNlc3Npb247Ci1pbXBvcnQgamF2YXguamNyLnZlcnNpb24uVmVyc2lvbjsKLWltcG9ydCBqYXZheC5qY3IudmVyc2lvbi5WZXJzaW9uSGlzdG9yeTsKLWltcG9ydCBqYXZheC5qY3IudmVyc2lvbi5WZXJzaW9uTWFuYWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RvcmFnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BbGxvd2FibGVBY3Rpb25zSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0RGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUJvb2xlYW5JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SW50ZWdlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLk9iamVjdEluZm9JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLk9iamVjdEluZm9IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci50eXBlLkpjclR5cGVIYW5kbGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBKQ1IgPGNvZGU+Tm9kZTwvY29kZT5zIHRvIGJlIHJlcHJlc2VudGVkIGFzIENNSVMKLSAqIG9iamVjdHMuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSByZXNwb25zaWJsZSBmb3IgbWFwcGluZyBmcm9tIENNSVMgdG8gSkNSCi0gKiBhbmQgdmljZSB2ZXJzYS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpjck5vZGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpjck5vZGUuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgbGFzdCBjbWlzOmNyZWF0ZWRCeSBhbmQgY21pczptb2RpZmllZEJ5Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9VTktOT1dOID0gInVua25vd24iOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgY21pczpjcmVhdGVkQnkgYW5kIGNtaXM6bGFzdE1vZGlmaWVkRGF0ZSAoVGh1IEphbiAwMQotICAgICAqIDAxOjAwOjAwIENFVCAxOTcwKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3JlZ29yaWFuQ2FsZW5kYXIgREFURV9VTktOT1dOOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgREFURV9VTktOT1dOID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgIERBVEVfVU5LTk9XTi5zZXRUaW1lSW5NaWxsaXMoMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBOb2RlIG5vZGU7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyOwotICAgIHByb3RlY3RlZCBmaW5hbCBQYXRoTWFuYWdlciBwYXRoTWFuYWdlcjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3cmFwcGluZyBhIEpDUiA8Y29kZT5ub2RlPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqICAgICAgICAgICAgdGhlIEpDUiA8Y29kZT5ub2RlPC9jb2RlPiB0byByZXByZXNlbnQKLSAgICAgKiBAcGFyYW0gdHlwZU1hbmFnZXIKLSAgICAgKiBAcGFyYW0gcGF0aE1hbmFnZXIKLSAgICAgKiBAcGFyYW0gdHlwZUhhbmRsZXJNYW5hZ2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEpjck5vZGUoTm9kZSBub2RlLCBKY3JUeXBlTWFuYWdlciB0eXBlTWFuYWdlciwgUGF0aE1hbmFnZXIgcGF0aE1hbmFnZXIsCi0gICAgICAgICAgICBKY3JUeXBlSGFuZGxlck1hbmFnZXIgdHlwZUhhbmRsZXJNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubm9kZSA9IG5vZGU7Ci0gICAgICAgIHRoaXMudHlwZU1hbmFnZXIgPSB0eXBlTWFuYWdlcjsKLSAgICAgICAgdGhpcy5wYXRoTWFuYWdlciA9IHBhdGhNYW5hZ2VyOwotICAgICAgICB0aGlzLnR5cGVIYW5kbGVyTWFuYWdlciA9IHR5cGVIYW5kbGVyTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBKQ1IgPGNvZGU+bm9kZTwvY29kZT4gcmVwcmVzZW50ZWQgYnkgdGhpcyBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBub2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIENNSVMgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIENtaXNSdW50aW1lRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgQ01JUyBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgQ21pc1J1bnRpbWVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldE9iamVjdElkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlSWQgb2YgdGhlIENNSVMgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFR5cGVJZEludGVybmFsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgdGhpcyBpbnN0YW5jZSByZXByZXNlbnQgdGhlIHJvb3Qgb2YgdGhlCi0gICAgICogICAgICAgICBDTUlTIGZvbGRlciBoaWVyYXJjaHkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb290KCkgewotICAgICAgICByZXR1cm4gcGF0aE1hbmFnZXIuaXNSb290KG5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGNtaXM6ZG9jdW1lbnQKLSAgICAgKiAgICAgICAgIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotICAgICAgICByZXR1cm4gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UID09IGdldEJhc2VUeXBlSWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSBjbWlzOmZvbGRlciB0eXBlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiBCYXNlVHlwZUlkLkNNSVNfRk9MREVSID09IGdldEJhc2VUeXBlSWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGlzIGluc3RhbmNlIHJlcHJlc2VudHMgYSB2ZXJzaW9uYWJsZSBDTUlTCi0gICAgICogICAgICAgICBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcnNpb25hYmxlKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlRGVmID0gdHlwZU1hbmFnZXIuZ2V0VHlwZShnZXRUeXBlSWRJbnRlcm5hbCgpKTsKLSAgICAgICAgcmV0dXJuIHR5cGVEZWYgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGVEZWZpbml0aW9uID8gKChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlRGVmKS5pc1ZlcnNpb25hYmxlKCkgOiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoaXMgaW5zdGFuY2UgYXMgYSA8Y29kZT5KY3JEb2N1bWVudDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIENtaXNDb25zdHJhaW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+dGhpcy5pc0RvY3VtZW50KCkgPT0gZmFsc2U8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEpjckRvY3VtZW50IGFzRG9jdW1lbnQoKSB7Ci0gICAgICAgIGlmIChpc0RvY3VtZW50KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoSmNyRG9jdW1lbnQpIHRoaXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIk5vdCBhIGRvY3VtZW50OiAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoaXMgaW5zdGFuY2UgYXMgYSA8Y29kZT5KY3JGb2xkZXI8L2NvZGU+Ci0gICAgICogQHRocm93cyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPnRoaXMuaXNGb2xkZXIoKSA9PSBmYWxzZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSmNyRm9sZGVyIGFzRm9sZGVyKCkgewotICAgICAgICBpZiAoaXNGb2xkZXIoKSkgewotICAgICAgICAgICAgcmV0dXJuIChKY3JGb2xkZXIpIHRoaXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJOb3QgYSBmb2xkZXI6ICIgKyB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZSBhcyBhIDxjb2RlPkpjclZlcnNpb25CYXNlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT50aGlzLmlzVmVyc2lvbmFibGUoKSA9PSBmYWxzZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSmNyVmVyc2lvbkJhc2UgYXNWZXJzaW9uKCkgewotICAgICAgICBpZiAoaXNWZXJzaW9uYWJsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEpjclZlcnNpb25CYXNlKSB0aGlzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiTm90IGEgdmVyc2lvbjogIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgY3JlYXRpbmcgYSBuZXcgPGNvZGU+SmNyTm9kZTwvY29kZT4gZnJvbSBhIG5vZGUgYXQgYSBnaXZlbgotICAgICAqIEpDUiBwYXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXRoCi0gICAgICogICAgICAgICAgICBKQ1IgcGF0aCBvZiB0aGUgbm9kZQotICAgICAqIEByZXR1cm4gQSBuZXcgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZSBKQ1Igbm9kZSBhdCA8Y29kZT5wYXRoPC9jb2RlPgotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+cGF0aDwvY29kZT4gZG9lcyBub3QgaWRlbnRpZnkgYSBKQ1Igbm9kZQotICAgICAqIEB0aHJvd3MgQ21pc1J1bnRpbWVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSmNyTm9kZSBnZXROb2RlKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlKG5vZGUuZ2V0Tm9kZShwYXRoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhdGhOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlIHRoZSA8Y29kZT5PYmplY3REYXRhPC9jb2RlPiBmb3IgdGhpcyBub2RlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdERhdGEgY29tcGlsZU9iamVjdFR5cGUoU2V0PFN0cmluZz4gZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsIGJvb2xlYW4gcmVxdWlyZXNPYmplY3RJbmZvKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdERhdGFJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3REYXRhSW1wbCgpOwotICAgICAgICAgICAgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbyA9IG5ldyBPYmplY3RJbmZvSW1wbCgpOwotCi0gICAgICAgICAgICBQcm9wZXJ0aWVzSW1wbCBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0gICAgICAgICAgICBmaWx0ZXIgPSBmaWx0ZXIgPT0gbnVsbCA/IG51bGwgOiBuZXcgSGFzaFNldDxTdHJpbmc+KGZpbHRlcik7Ci0gICAgICAgICAgICBjb21waWxlUHJvcGVydGllcyhwcm9wZXJ0aWVzLCBmaWx0ZXIsIG9iamVjdEluZm8pOwotICAgICAgICAgICAgcmVzdWx0LnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwgJiYgIWZpbHRlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVua25vd24gZmlsdGVyIHByb3BlcnRpZXM6ICIgKyBmaWx0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRBbGxvd2FibGVBY3Rpb25zKGdldEFsbG93YWJsZUFjdGlvbnMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXF1aXJlc09iamVjdEluZm8pIHsKLSAgICAgICAgICAgICAgICBvYmplY3RJbmZvLnNldE9iamVjdChyZXN1bHQpOwotICAgICAgICAgICAgICAgIG9iamVjdEluZm9zLmFkZE9iamVjdEluZm8ob2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNC42IGdldEFsbG93YWJsZUFjdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKCkgewotICAgICAgICBBbGxvd2FibGVBY3Rpb25zSW1wbCBhYXMgPSBuZXcgQWxsb3dhYmxlQWN0aW9uc0ltcGwoKTsKLSAgICAgICAgYWFzLnNldEFsbG93YWJsZUFjdGlvbnMoY29tcGlsZUFsbG93YWJsZUFjdGlvbnMobmV3IEhhc2hTZXQ8QWN0aW9uPigpKSk7Ci0gICAgICAgIHJldHVybiBhYXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjMuNSBnZXRPYmplY3RQYXJlbnRzCi0gICAgICogCi0gICAgICogQHJldHVybiBwYXJlbnQgb2YgdGhpcyBvYmplY3QKLSAgICAgKiBAdGhyb3dzIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgaXMgdGhlIHJvb3QgZm9sZGVyCi0gICAgICogQHRocm93cyBDbWlzUnVudGltZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBKY3JGb2xkZXIgZ2V0UGFyZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZShub2RlLmdldFBhcmVudCgpKS5hc0ZvbGRlcigpOwotICAgICAgICB9IGNhdGNoIChJdGVtTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTIgdXBkYXRlUHJvcGVydGllcwotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc1N0b3JhZ2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSmNyTm9kZSB1cGRhdGVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICAvLyBnZXQgYW5kIGNoZWNrIHRoZSBuZXcgbmFtZQotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IEpjckNvbnZlcnRlci50b0pjck5hbWUoUHJvcGVydHlIZWxwZXIuZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydGllcywgUHJvcGVydHlJZHMuTkFNRSkpOwotICAgICAgICBib29sZWFuIHJlbmFtZSA9IG5ld05hbWUgIT0gbnVsbCAmJiAhZ2V0TmFtZSgpLmVxdWFscyhuZXdOYW1lKTsKLSAgICAgICAgaWYgKHJlbmFtZSAmJiBpc1Jvb3QoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbigiQ2Fubm90IHJlbmFtZSByb290IG5vZGUiKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gcmVuYW1lIGZpbGUgb3IgZm9sZGVyIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0Tm9kZSgpLmdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIE5vZGUgbmV3Tm9kZTsKLSAgICAgICAgICAgIGlmIChyZW5hbWUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVzdFBhdGggPSBQYXRoTWFuYWdlci5jcmVhdGVDbWlzUGF0aChub2RlLmdldFBhcmVudCgpLmdldFBhdGgoKSwgbmV3TmFtZSk7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5tb3ZlKG5vZGUuZ2V0UGF0aCgpLCBkZXN0UGF0aCk7Ci0gICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHNlc3Npb24uZ2V0Tm9kZShkZXN0UGF0aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld05vZGUgPSBub2RlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBcmUgdGhlcmUgcHJvcGVydGllcyB0byB1cGRhdGU/Ci0gICAgICAgICAgICBQcm9wZXJ0eVVwZGF0ZXIgcHJvcGVydHlVcGRhdGVyID0gUHJvcGVydHlVcGRhdGVyLmNyZWF0ZSh0eXBlTWFuYWdlciwgZ2V0VHlwZUlkKCksIHByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICBKY3JWZXJzaW9uQmFzZSBqY3JWZXJzaW9uID0gaXNWZXJzaW9uYWJsZSgpID8gYXNWZXJzaW9uKCkgOiBudWxsOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcy4gQ2hlY2tvdXQgaWYgcmVxdWlyZWQKLSAgICAgICAgICAgIGJvb2xlYW4gYXV0b0NoZWNrb3V0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnR5VXBkYXRlci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvQ2hlY2tvdXQgPSBqY3JWZXJzaW9uICE9IG51bGwgJiYgIWpjclZlcnNpb24uaXNDaGVja2VkT3V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF1dG9DaGVja291dCkgewotICAgICAgICAgICAgICAgICAgICBqY3JWZXJzaW9uLmNoZWNrb3V0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgcHJvcGVydHlVcGRhdGVyLmFwcGx5KG5vZGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXNzaW9uLnNhdmUoKTsKLQotICAgICAgICAgICAgaWYgKGF1dG9DaGVja291dCkgewotICAgICAgICAgICAgICAgIC8vIGF1dG8gdmVyc2lvbmluZyAtPiByZXR1cm4gbmV3IHZlcnNpb24gY3JlYXRlZCBieSBjaGVja2luCi0gICAgICAgICAgICAgICAgcmV0dXJuIGpjclZlcnNpb24uY2hlY2tpbihudWxsLCBudWxsLCAiYXV0byBjaGVja291dCIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChqY3JWZXJzaW9uICE9IG51bGwgJiYgamNyVmVyc2lvbi5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgICAgIC8vIHRoZSBub2RlIGlzIGNoZWNrZWQgb3V0IC0+IHJldHVybiBwd2MuCi0gICAgICAgICAgICAgICAgSmNyVmVyc2lvbkJhc2UgamNyTmV3VmVyc2lvbiA9IGNyZWF0ZShuZXdOb2RlKS5hc1ZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gamNyTmV3VmVyc2lvbi5nZXRQd2MoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbm9uIHZlcnNpb25hYmxlIG9yIG5vdCBhIG5ldyBub2RlIC0+IHJldHVybiB0aGlzCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZShuZXdOb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNTdG9yYWdlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTQgZGVsZXRlT2JqZWN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzUnVudGltZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShib29sZWFuIGFsbFZlcnNpb25zLCBib29sZWFuIGlzUHdjKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXROb2RlKCkuZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgZ2V0Tm9kZSgpLnJlbW92ZSgpOwotICAgICAgICAgICAgc2Vzc2lvbi5zYXZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNC4xMyBtb3ZlT2JqZWN0Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzU3RvcmFnZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBKY3JOb2RlIG1vdmUoSmNyRm9sZGVyIHBhcmVudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gbW92ZSBpdCBpZiB0YXJnZXQgbG9jYXRpb24gaXMgbm90IHNhbWUgYXMgc291cmNlIGxvY2F0aW9uCi0gICAgICAgICAgICBTdHJpbmcgZGVzdFBhdGggPSBQYXRoTWFuYWdlci5jcmVhdGVDbWlzUGF0aChwYXJlbnQuZ2V0Tm9kZSgpLmdldFBhdGgoKSwgbm9kZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3RyaW5nIHNyY1BhdGggPSBub2RlLmdldFBhdGgoKTsKLSAgICAgICAgICAgIE5vZGUgbmV3Tm9kZTsKLSAgICAgICAgICAgIGlmIChzcmNQYXRoLmVxdWFscyhkZXN0UGF0aCkpIHsKLSAgICAgICAgICAgICAgICBuZXdOb2RlID0gbm9kZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0Tm9kZSgpLmdldFNlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLm1vdmUoc3JjUGF0aCwgZGVzdFBhdGgpOwotICAgICAgICAgICAgICAgIG5ld05vZGUgPSBzZXNzaW9uLmdldE5vZGUoZGVzdFBhdGgpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uc2F2ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlKG5ld05vZGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldFBhdGgoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgcmV0dXJuIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcm90ZWN0ZWQgPi0tLQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIGNvbnRleHQgbm9kZSBvZiB0aGUgQ01JUyBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcwotICAgICAqIGluc3RhbmNlLiBUaGUgY29udGV4dCBub2RlIGlzIHRoZSBub2RlIHdoaWNoIGlzIHVzZWQgdG8gZGVyaXZlIHRoZSBjb21tb24KLSAgICAgKiBwcm9wZXJ0aWVzIGZyb20gKGNyZWF0aW9uIGRhdGUsIG1vZGlmaWNhdGlvbiBkYXRlLCAuLi4pCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY29udGV4dCBub2RlCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE5vZGUgZ2V0Q29udGV4dE5vZGUoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5jbWlzOmJhc2VUeXBlSWQ8L2NvZGU+IHByb3BlcnR5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEJhc2VUeXBlSWQgZ2V0QmFzZVR5cGVJZCgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmNtaXM6b2JqZWN0VHlwZUlkPC9jb2RlPiBwcm9wZXJ0eQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZUlkSW50ZXJuYWwoKTsKLQotICAgIC8qKgotICAgICAqIENvbXBpbGUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIENNSVMgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2UuCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuNyBnZXRPYmplY3QKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgY29tcGlsYXRpb24gb2YgcHJvcGVydGllcwotICAgICAqIEBwYXJhbSBmaWx0ZXIKLSAgICAgKiBAcGFyYW0gb2JqZWN0SW5mbwotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBpbGVQcm9wZXJ0aWVzKFByb3BlcnRpZXNJbXBsIHByb3BlcnRpZXMsIFNldDxTdHJpbmc+IGZpbHRlciwgT2JqZWN0SW5mb0ltcGwgb2JqZWN0SW5mbykKLSAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gZ2V0VHlwZUlkSW50ZXJuYWwoKTsKLSAgICAgICAgQmFzZVR5cGVJZCBiYXNlVHlwZUlkID0gZ2V0QmFzZVR5cGVJZCgpOwotCi0gICAgICAgIG9iamVjdEluZm8uc2V0QmFzZVR5cGUoYmFzZVR5cGVJZCk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0VHlwZUlkKHR5cGVJZCk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0SGFzQWNsKGZhbHNlKTsKLSAgICAgICAgb2JqZWN0SW5mby5zZXRWZXJzaW9uU2VyaWVzSWQoZ2V0VmVyc2lvblNlcmllc0lkKCkpOwotICAgICAgICBvYmplY3RJbmZvLnNldFJlbGF0aW9uc2hpcFNvdXJjZUlkcyhudWxsKTsKLSAgICAgICAgb2JqZWN0SW5mby5zZXRSZWxhdGlvbnNoaXBUYXJnZXRJZHMobnVsbCk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0UmVuZGl0aW9uSW5mb3MobnVsbCk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0U3VwcG9ydHNQb2xpY2llcyhmYWxzZSk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0U3VwcG9ydHNSZWxhdGlvbnNoaXBzKGZhbHNlKTsKLQotICAgICAgICAvLyBpZAotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBnZXRPYmplY3RJZCgpOwotICAgICAgICBhZGRQcm9wZXJ0eUlkKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQsIG9iamVjdElkKTsKLSAgICAgICAgb2JqZWN0SW5mby5zZXRJZChvYmplY3RJZCk7Ci0KLSAgICAgICAgLy8gbmFtZQotICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5vZGVOYW1lKCk7Ci0gICAgICAgIGlmIChQYXRoTWFuYWdlci5DTUlTX1JPT1RfSUQuZXF1YWxzKG9iamVjdElkKSAmJiAiIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IG5hbWUgZm9yIHRoZSByb290IG5vZGUKLSAgICAgICAgICAgIG5hbWUgPSBQYXRoTWFuYWdlci5DTUlTX1JPT1RfSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcocHJvcGVydGllcywgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpOwotICAgICAgICBvYmplY3RJbmZvLnNldE5hbWUobmFtZSk7Ci0KLSAgICAgICAgLy8gYmFzZSB0eXBlIGFuZCB0eXBlIG5hbWUKLSAgICAgICAgYWRkUHJvcGVydHlJZChwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lELCBiYXNlVHlwZUlkLnZhbHVlKCkpOwotICAgICAgICBhZGRQcm9wZXJ0eUlkKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKTsKLQotICAgICAgICAvLyBjcmVhdGVkIGFuZCBtb2RpZmllZCBieQotICAgICAgICBTdHJpbmcgY3JlYXRlZEJ5ID0gZ2V0Q3JlYXRlZEJ5KCk7Ci0gICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZLCBjcmVhdGVkQnkpOwotICAgICAgICBvYmplY3RJbmZvLnNldENyZWF0ZWRCeShjcmVhdGVkQnkpOwotCi0gICAgICAgIGFkZFByb3BlcnR5U3RyaW5nKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUVEX0JZLCBnZXRMYXN0TW9kaWZpZWRCeSgpKTsKLQotICAgICAgICAvLyBjcmVhdGlvbiBhbmQgbW9kaWZpY2F0aW9uIGRhdGUKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY3JlYXRlZCA9IGdldENyZWF0ZWQoKTsKLSAgICAgICAgYWRkUHJvcGVydHlEYXRlVGltZShwcm9wZXJ0aWVzLCB0eXBlSWQsIGZpbHRlciwgUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSwgY3JlYXRlZCk7Ci0gICAgICAgIG9iamVjdEluZm8uc2V0Q3JlYXRpb25EYXRlKGNyZWF0ZWQpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGxhc3RNb2RpZmllZCA9IGdldExhc3RNb2RpZmllZCgpOwotICAgICAgICBhZGRQcm9wZXJ0eURhdGVUaW1lKHByb3BlcnRpZXMsIHR5cGVJZCwgZmlsdGVyLCBQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFLCBsYXN0TW9kaWZpZWQpOwotICAgICAgICBvYmplY3RJbmZvLnNldExhc3RNb2RpZmljYXRpb25EYXRlKGxhc3RNb2RpZmllZCk7Ci0KLSAgICAgICAgYWRkUHJvcGVydHlTdHJpbmcocHJvcGVydGllcywgdHlwZUlkLCBmaWx0ZXIsIFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTiwgZ2V0Q2hhbmdlVG9rZW4oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZSB0aGUgYWxsb3dlZCBhY3Rpb25zIG9uIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzCi0gICAgICogaW5zdGFuY2UgU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuNiBnZXRBbGxvd2FibGVBY3Rpb25zCi0gICAgICogCi0gICAgICogQHBhcmFtIGFhcwotICAgICAqICAgICAgICAgICAgY29tcGlsYXRpb24gb2YgYWxsb3dlZCBhY3Rpb25zCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXQ8QWN0aW9uPiBjb21waWxlQWxsb3dhYmxlQWN0aW9ucyhTZXQ8QWN0aW9uPiBhYXMpIHsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9HRVRfT0JKRUNUX1BBUkVOVFMsIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0dFVF9QUk9QRVJUSUVTLCB0cnVlKTsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9VUERBVEVfUFJPUEVSVElFUywgdHJ1ZSk7Ci0gICAgICAgIHNldEFjdGlvbihhYXMsIEFjdGlvbi5DQU5fTU9WRV9PQkpFQ1QsIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0RFTEVURV9PQkpFQ1QsIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX0dFVF9BQ0wsIGZhbHNlKTsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9BUFBMWV9BQ0wsIGZhbHNlKTsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9HRVRfT0JKRUNUX1JFTEFUSU9OU0hJUFMsIGZhbHNlKTsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9BRERfT0JKRUNUX1RPX0ZPTERFUiwgZmFsc2UpOwotICAgICAgICBzZXRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX1JFTU9WRV9PQkpFQ1RfRlJPTV9GT0xERVIsIGZhbHNlKTsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9BUFBMWV9QT0xJQ1ksIGZhbHNlKTsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9HRVRfQVBQTElFRF9QT0xJQ0lFUywgZmFsc2UpOwotICAgICAgICBzZXRBY3Rpb24oYWFzLCBBY3Rpb24uQ0FOX1JFTU9WRV9QT0xJQ1ksIGZhbHNlKTsKLSAgICAgICAgc2V0QWN0aW9uKGFhcywgQWN0aW9uLkNBTl9DUkVBVEVfUkVMQVRJT05TSElQLCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiBhYXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY2hhbmdlIHRva2VuIG9mIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIGluc3RhbmNlCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFuZ2VUb2tlbigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbGFzdCBtb2RpZmllciBvZiB0aGUgQ01JUyBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFzdE1vZGlmaWVkQnkoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU9yRWxzZShnZXRDb250ZXh0Tm9kZSgpLCBQcm9wZXJ0eS5KQ1JfTEFTVF9NT0RJRklFRF9CWSwgVVNFUl9VTktOT1dOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzCi0gICAgICogICAgICAgICBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBHcmVnb3JpYW5DYWxlbmRhciBnZXRMYXN0TW9kaWZpZWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU9yRWxzZShnZXRDb250ZXh0Tm9kZSgpLCBQcm9wZXJ0eS5KQ1JfTEFTVF9NT0RJRklFRCwgREFURV9VTktOT1dOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIGluc3RhbmNlCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEdyZWdvcmlhbkNhbGVuZGFyIGdldENyZWF0ZWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU9yRWxzZShnZXRDb250ZXh0Tm9kZSgpLCBQcm9wZXJ0eS5KQ1JfQ1JFQVRFRCwgREFURV9VTktOT1dOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdG9yIG9mIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIGluc3RhbmNlCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDcmVhdGVkQnkoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eU9yRWxzZShnZXRDb250ZXh0Tm9kZSgpLCBQcm9wZXJ0eS5KQ1JfQ1JFQVRFRF9CWSwgVVNFUl9VTktOT1dOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB1bmRlcmx5aW5nIEpDUiA8Y29kZT5ub2RlPC9jb2RlPi4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vZGVOYW1lKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbm9kZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgb2JqZWN0IGlkIG9mIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIGluc3RhbmNlCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPYmplY3RJZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFZlcnNpb25TZXJpZXNJZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb25zIHNlcmllcyBpZCBvZiB0aGUgQ01JUyBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcwotICAgICAqICAgICAgICAgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25TZXJpZXNJZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0SWRlbnRpZmllcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBhIG5ldyA8Y29kZT5KY3JOb2RlPC9jb2RlPiBpbnN0YW5jZSBmcm9tIGEKLSAgICAgKiBKQ1IgPGNvZGU+Tm9kZTwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqICAgICAgICAgICAgdGhlIEpDUiA8Y29kZT5Ob2RlPC9jb2RlPgotICAgICAqIEByZXR1cm4gYSBuZXcgPGNvZGU+SmNyTm9kZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgSmNyTm9kZSBjcmVhdGUoTm9kZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlSGFuZGxlck1hbmFnZXIuY3JlYXRlKG5vZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBJZCBwcm9wZXJ0eSB0byB0aGUgQ01JUyBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBpbnN0YW5jZQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFByb3BlcnR5SWQoUHJvcGVydGllc0ltcGwgcHJvcHMsIFN0cmluZyB0eXBlSWQsIFNldDxTdHJpbmc+IGZpbHRlciwgU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWNoZWNrQWRkUHJvcGVydHkocHJvcHMsIHR5cGVJZCwgZmlsdGVyLCBpZCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5SWRJbXBsIHByb3AgPSBuZXcgUHJvcGVydHlJZEltcGwoaWQsIHZhbHVlKTsKLSAgICAgICAgcHJvcC5zZXRRdWVyeU5hbWUoaWQpOwotICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShwcm9wKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgc3RyaW5nIHByb3BlcnR5IHRvIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIGluc3RhbmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUHJvcGVydHlTdHJpbmcoUHJvcGVydGllc0ltcGwgcHJvcHMsIFN0cmluZyB0eXBlSWQsIFNldDxTdHJpbmc+IGZpbHRlciwgU3RyaW5nIGlkLAotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICghY2hlY2tBZGRQcm9wZXJ0eShwcm9wcywgdHlwZUlkLCBmaWx0ZXIsIGlkKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlTdHJpbmdJbXBsIHByb3AgPSBuZXcgUHJvcGVydHlTdHJpbmdJbXBsKGlkLCB2YWx1ZSk7Ci0gICAgICAgIHByb3Auc2V0UXVlcnlOYW1lKGlkKTsKLSAgICAgICAgcHJvcHMuYWRkUHJvcGVydHkocHJvcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGludGVnZXIgcHJvcGVydHkgdG8gdGhlIENNSVMgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRQcm9wZXJ0eUludGVnZXIoUHJvcGVydGllc0ltcGwgcHJvcHMsIFN0cmluZyB0eXBlSWQsIFNldDxTdHJpbmc+IGZpbHRlciwgU3RyaW5nIGlkLAotICAgICAgICAgICAgbG9uZyB2YWx1ZSkgewotICAgICAgICBpZiAoIWNoZWNrQWRkUHJvcGVydHkocHJvcHMsIHR5cGVJZCwgZmlsdGVyLCBpZCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5SW50ZWdlckltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eUludGVnZXJJbXBsKGlkLCBCaWdJbnRlZ2VyLnZhbHVlT2YodmFsdWUpKTsKLSAgICAgICAgcHJvcC5zZXRRdWVyeU5hbWUoaWQpOwotICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShwcm9wKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYm9vbGVhbiBwcm9wZXJ0eSB0byB0aGUgQ01JUyBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBpbnN0YW5jZQotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFByb3BlcnR5Qm9vbGVhbihQcm9wZXJ0aWVzSW1wbCBwcm9wcywgU3RyaW5nIHR5cGVJZCwgU2V0PFN0cmluZz4gZmlsdGVyLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmICghY2hlY2tBZGRQcm9wZXJ0eShwcm9wcywgdHlwZUlkLCBmaWx0ZXIsIGlkKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlCb29sZWFuSW1wbCBwcm9wID0gbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwoaWQsIHZhbHVlKTsKLSAgICAgICAgcHJvcC5zZXRRdWVyeU5hbWUoaWQpOwotICAgICAgICBwcm9wcy5hZGRQcm9wZXJ0eShwcm9wKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZGF0ZS10aW1lIHByb3BlcnR5IHRvIHRoZSBDTUlTIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGlzIGluc3RhbmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUHJvcGVydHlEYXRlVGltZShQcm9wZXJ0aWVzSW1wbCBwcm9wcywgU3RyaW5nIHR5cGVJZCwgU2V0PFN0cmluZz4gZmlsdGVyLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSkgewotCi0gICAgICAgIGlmICghY2hlY2tBZGRQcm9wZXJ0eShwcm9wcywgdHlwZUlkLCBmaWx0ZXIsIGlkKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydHlEYXRlVGltZUltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lSW1wbChpZCwgdmFsdWUpOwotICAgICAgICBwcm9wLnNldFF1ZXJ5TmFtZShpZCk7Ci0gICAgICAgIHByb3BzLmFkZFByb3BlcnR5KHByb3ApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFByb3BlcnR5TGlzdChQcm9wZXJ0aWVzSW1wbCBwcm9wcywgU3RyaW5nIHR5cGVJZCwgU2V0PFN0cmluZz4gZmlsdGVyLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzKSB7Ci0KLSAgICAgICAgaWYgKCFjaGVja0FkZFByb3BlcnR5KHByb3BzLCB0eXBlSWQsIGZpbHRlciwgaWQpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eVN0cmluZ0ltcGwgcHJvcCA9IG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoaWQsIHZhbHVlcyk7Ci0gICAgICAgIHByb3Auc2V0UXVlcnlOYW1lKGlkKTsKLSAgICAgICAgcHJvcHMuYWRkUHJvcGVydHkocHJvcCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSBhIHNldCBvZiBwcm9wZXJ0aWVzIGFnYWluc3QgYSBmaWx0ZXIgYW5kIGl0cyBkZWZpbml0aW9ucwotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNoZWNrQWRkUHJvcGVydHkoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdHlwZUlkLCBTZXQ8U3RyaW5nPiBmaWx0ZXIsIFN0cmluZyBpZCkgewotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnRpZXMgbXVzdCBub3QgYmUgbnVsbCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJZCBtdXN0IG5vdCBiZSBudWxsISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHR5cGVNYW5hZ2VyLmdldFR5cGUodHlwZUlkKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB0eXBlOiAiICsgdHlwZUlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmNvbnRhaW5zS2V5KGlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBwcm9wZXJ0eTogIiArIGlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoaWQpLmdldFF1ZXJ5TmFtZSgpOwotCi0gICAgICAgIGlmIChxdWVyeU5hbWUgIT0gbnVsbCAmJiBmaWx0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGZpbHRlci5jb250YWlucyhxdWVyeU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyLnJlbW92ZShxdWVyeU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHVuayBmb3Ige0BsaW5rIEpjck5vZGUjdXBkYXRlUHJvcGVydGllcyhOb2RlLCBTdHJpbmcsIFByb3BlcnRpZXMpfQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcGVydHlVcGRhdGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcmVtb3ZlUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHlEYXRhPD8+PiB1cGRhdGVQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBQcm9wZXJ0eVVwZGF0ZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5VXBkYXRlciBjcmVhdGUoSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIsIFN0cmluZyB0eXBlSWQsIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiTm8gcHJvcGVydGllcyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucwotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHR5cGVNYW5hZ2VyLmdldFR5cGUodHlwZUlkKTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUHJvcGVydHlVcGRhdGVyIHByb3BlcnR5VXBkYXRlciA9IG5ldyBQcm9wZXJ0eVVwZGF0ZXIoKTsKLSAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wIDogcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChwcm9wLmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gZG8gd2Uga25vdyB0aGF0IHByb3BlcnR5PwotICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5ICciICsgcHJvcC5nZXRJZCgpICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBza2lwIGNvbnRlbnQgc3RyZWFtIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldElkKCkuZXF1YWxzKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBzZXQgIiArIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSArICIuIElnbm9yaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHNpbGVudGx5IHNraXAgbmFtZQotICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldElkKCkuZXF1YWxzKFByb3BlcnR5SWRzLk5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNhbiBpdCBiZSBzZXQ/Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkgPT0gVXBkYXRhYmlsaXR5LlJFQURPTkxZKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkgKyAiJyBpcyByZWFkb25seSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvcERlZi5nZXRVcGRhdGFiaWxpdHkoKSA9PSBVcGRhdGFiaWxpdHkuT05DUkVBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAnIiArIHByb3AuZ2V0SWQoKSArICInIGNhbiBvbmx5IGJlIHNldCBvbiBjcmVhdGUhIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBvciB2YWx1ZQotICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBuZXdQcm9wOwotICAgICAgICAgICAgICAgIG5ld1Byb3AgPSBQcm9wZXJ0eUhlbHBlci5pc1Byb3BlcnR5RW1wdHkocHJvcCkgPyBQcm9wZXJ0eUhlbHBlci5nZXREZWZhdWx0VmFsdWUocHJvcERlZikgOiBwcm9wOwotCi0gICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgZm9yIHJlbW92ZSBvciB1cGRhdGUKLSAgICAgICAgICAgICAgICBpZiAobmV3UHJvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VXBkYXRlci5yZW1vdmVQcm9wZXJ0aWVzLmFkZChwcm9wKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVVwZGF0ZXIudXBkYXRlUHJvcGVydGllcy5hZGQobmV3UHJvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlVcGRhdGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgIHJldHVybiByZW1vdmVQcm9wZXJ0aWVzLmlzRW1wdHkoKSAmJiB1cGRhdGVQcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KE5vZGUgbm9kZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wIDogcmVtb3ZlUHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICBKY3JDb252ZXJ0ZXIucmVtb3ZlUHJvcGVydHkobm9kZSwgcHJvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3AgOiB1cGRhdGVQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEpjckNvbnZlcnRlci5zZXRQcm9wZXJ0eShub2RlLCBwcm9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIENNSVMgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKE5vZGUgbm9kZSwgU3RyaW5nIHR5cGVJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFByb3BlcnR5VXBkYXRlci5jcmVhdGUodHlwZU1hbmFnZXIsIHR5cGVJZCwgcHJvcGVydGllcykuYXBwbHkobm9kZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdmVyc2lvbiBoaXN0b3J5IG9mIGEgSkNSCi0gICAgICogPGNvZGU+Tm9kZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgdmVyc2lvbiBoaXN0b3J5Ci0gICAgICogQHJldHVybiB2ZXJzaW9uIGhpc3Rvcnkgb2YgPGNvZGU+bm9kZTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5ub2RlPC9jb2RlPiBpcyBub3QgdmVyc2lvbmFibGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFZlcnNpb25IaXN0b3J5IGdldFZlcnNpb25IaXN0b3J5KE5vZGUgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0VmVyc2lvbk1hbmFnZXIobm9kZSkuZ2V0VmVyc2lvbkhpc3Rvcnkobm9kZS5nZXRQYXRoKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHZlcnNpb24gbWFuYWdlciBmcm9tIGEgSkNSCi0gICAgICogPGNvZGU+Tm9kZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBWZXJzaW9uTWFuYWdlciBnZXRWZXJzaW9uTWFuYWdlcihOb2RlIG5vZGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5vZGUuZ2V0U2Vzc2lvbigpLmdldFdvcmtzcGFjZSgpLmdldFZlcnNpb25NYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgYmFzZSB2ZXJzaW9uIG9mIGEgSkNSCi0gICAgICogPGNvZGU+Tm9kZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBub2RlIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgYmFzZSB2ZXJzaW9uCi0gICAgICogQHJldHVybiB2ZXJzaW9uIGJhc2UgdmVyc2lvbiBvZiA8Y29kZT5ub2RlPC9jb2RlPgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPm5vZGU8L2NvZGU+IGlzIG5vdCB2ZXJzaW9uYWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgVmVyc2lvbiBnZXRCYXNlVmVyc2lvbihOb2RlIG5vZGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFZlcnNpb25NYW5hZ2VyKG5vZGUpLmdldEJhc2VWZXJzaW9uKG5vZGUuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBsZW5ndGggb2YgYSBwcm9wZXJ0eSBvZiBhIEpDUgotICAgICAqIDxjb2RlPk5vZGU8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0UHJvcGVydHlMZW5ndGgoTm9kZSBub2RlLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBub2RlLmhhc1Byb3BlcnR5KHByb3BlcnR5TmFtZSkgPyBub2RlLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkuZ2V0TGVuZ3RoKCkgOiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIGEgc3RyaW5nIHByb3BlcnR5IGZyb20gYSBKQ1IKLSAgICAgKiA8Y29kZT5Ob2RlPC9jb2RlPiBvciBhIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSBvZiBhbiBlcnJvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5T3JFbHNlKE5vZGUgbm9kZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLQotICAgICAgICByZXR1cm4gbm9kZS5oYXNQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpID8gbm9kZS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLmdldFN0cmluZygpIDogZGVmYXVsdFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgYSBkYXRlIHByb3BlcnR5IGZyb20gYSBKQ1IKLSAgICAgKiA8Y29kZT5Ob2RlPC9jb2RlPiBvciBhIGRlZmF1bHQgdmFsdWUgaW4gY2FzZSBvZiBhbiBlcnJvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbm9kZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLSAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0UHJvcGVydHlPckVsc2UoTm9kZSBub2RlLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBHcmVnb3JpYW5DYWxlbmRhciBkZWZhdWx0VmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKG5vZGUuaGFzUHJvcGVydHkocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgQ2FsZW5kYXIgZGF0ZSA9IG5vZGUuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKS5nZXREYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gVXRpbC50b0NhbGVuZGFyKGRhdGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCA8Y29kZT5hY3Rpb248L2NvZGU+IHRvIDxjb2RlPmFjdGlvbnM8L2NvZGU+IGlmZgotICAgICAqIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4gaXMgdHJ1ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYWN0aW9ucwotICAgICAqIEBwYXJhbSBhY3Rpb24KLSAgICAgKiBAcGFyYW0gY29uZGl0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEFjdGlvbihTZXQ8QWN0aW9uPiBhY3Rpb25zLCBBY3Rpb24gYWN0aW9uLCBib29sZWFuIGNvbmRpdGlvbikgewotICAgICAgICBpZiAoY29uZGl0aW9uKSB7Ci0gICAgICAgICAgICBhY3Rpb25zLmFkZChhY3Rpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWN0aW9ucy5yZW1vdmUoYWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyUHJpdmF0ZVdvcmtpbmdDb3B5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjclByaXZhdGVXb3JraW5nQ29weS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjkyYmQzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyUHJpdmF0ZVdvcmtpbmdDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBqYXZheC5qY3IuTm9kZTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyVHlwZUhhbmRsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcHJpdmF0ZSB3b3JraW5nIGNvcHkgb2YgYSBjbWlzOmRvY3VtZW50Ci0gKiBiYWNrZWQgYnkgYW4gdW5kZXJseWluZyBKQ1IgPGNvZGU+Tm9kZTwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBKY3JQcml2YXRlV29ya2luZ0NvcHkgZXh0ZW5kcyBKY3JWZXJzaW9uQmFzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpjclByaXZhdGVXb3JraW5nQ29weS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGEgcHJpdmF0ZSB3b3JraW5nIGNvcHkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQV0NfTkFNRSA9ICJwd2MiOwotCi0gICAgcHVibGljIEpjclByaXZhdGVXb3JraW5nQ29weShOb2RlIG5vZGUsIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyLCBQYXRoTWFuYWdlciBwYXRoTWFuYWdlciwKLSAgICAgICAgICAgIEpjclR5cGVIYW5kbGVyTWFuYWdlciB0eXBlSGFuZGxlck1hbmFnZXIpIHsKLQotICAgICAgICBzdXBlcihub2RlLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgPGNvZGU+dmVyc2lvbk5hbWU8L2NvZGU+IGlzIHRoZSBuYW1lIG9mCi0gICAgICogICAgICAgICBwcml2YXRlIHdvcmtpbmcgY29weS4KLSAgICAgKiBAc2VlIEpjclByaXZhdGVXb3JraW5nQ29weSNQV0NfTkFNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZW5vdGVzUHdjKFN0cmluZyB2ZXJzaW9uTmFtZSkgewotICAgICAgICByZXR1cm4gUFdDX05BTUUuZXF1YWxzKHZlcnNpb25OYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb2JqZWN0SWQKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiA8Y29kZT5vYmplY3RJZDwvY29kZT4gaXMgdGhlIGlkIG9mIGEKLSAgICAgKiAgICAgICAgIHByaXZhdGUgd29ya2luZyBjb3B5LgotICAgICAqIEBzZWUgSmNyUHJpdmF0ZVdvcmtpbmdDb3B5I1BXQ19OQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHdjKFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICByZXR1cm4gb2JqZWN0SWQuZXF1YWxzKFBXQ19OQU1FKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByb3RlY3RlZCA+LS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTm9kZSBnZXRDb250ZXh0Tm9kZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXROb2RlKCkuZ2V0Tm9kZShOb2RlLkpDUl9DT05URU5UKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFB3Y0lkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0SWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9iamVjdElkKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0VmVyc2lvblNlcmllc0lkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWZXJzaW9uTGFiZWwoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBQV0NfTkFNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhdGVzdFZlcnNpb24oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01ham9yVmVyc2lvbigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTGF0ZXN0TWFqb3JWZXJzaW9uKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDaGVja0luQ29tbWVudCgpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JSZXBvc2l0b3J5LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjclJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlNjgyYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjclJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguamNyLkNyZWRlbnRpYWxzOwotaW1wb3J0IGphdmF4Lmpjci5JdGVtTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLkxvZ2luRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5Ob1N1Y2hXb3Jrc3BhY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLk5vZGU7Ci1pbXBvcnQgamF2YXguamNyLk5vZGVJdGVyYXRvcjsKLWltcG9ydCBqYXZheC5qY3IuUGF0aE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5OwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5TZXNzaW9uOwotaW1wb3J0IGphdmF4Lmpjci5xdWVyeS5RdWVyeTsKLWltcG9ydCBqYXZheC5qY3IucXVlcnkuUXVlcnlNYW5hZ2VyOwotaW1wb3J0IGphdmF4Lmpjci5xdWVyeS5RdWVyeVJlc3VsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5QWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNoYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Sm9pbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlSZW5kaXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckRhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RJbkZvbGRlckxpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5PYmplY3RMaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuT2JqZWN0UGFyZW50RGF0YUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5SZXBvc2l0b3J5SW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuT2JqZWN0SW5mb0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5xdWVyeS5RdWVyeVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudHlwZS5KY3JGb2xkZXJUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudHlwZS5KY3JUeXBlSGFuZGxlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIEpDUiBiYWNrLWVuZCBmb3IgQ01JUyBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKY3JSZXBvc2l0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSmNyUmVwb3NpdG9yeS5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5OwotICAgIHByb3RlY3RlZCBmaW5hbCBKY3JUeXBlTWFuYWdlciB0eXBlTWFuYWdlcjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgUGF0aE1hbmFnZXIgcGF0aE1hbmFnZXI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIEpjclR5cGVIYW5kbGVyTWFuYWdlciB0eXBlSGFuZGxlck1hbmFnZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+SmNyUmVwb3NpdG9yeTwvY29kZT4gaW5zdGFuY2UgYmFja2VkIGJ5IGEgSkNSCi0gICAgICogcmVwb3NpdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVwb3NpdG9yeQotICAgICAqICAgICAgICAgICAgdGhlIEpDUiByZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIHBhdGhNYW5hZ2VyCi0gICAgICogQHBhcmFtIHR5cGVNYW5hZ2VyCi0gICAgICogQHBhcmFtIHR5cGVIYW5kbGVyTWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBKY3JSZXBvc2l0b3J5KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgUGF0aE1hbmFnZXIgcGF0aE1hbmFnZXIsIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyLAotICAgICAgICAgICAgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlcikgewotICAgICAgICB0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotICAgICAgICB0aGlzLnR5cGVNYW5hZ2VyID0gdHlwZU1hbmFnZXI7Ci0gICAgICAgIHRoaXMudHlwZUhhbmRsZXJNYW5hZ2VyID0gdHlwZUhhbmRsZXJNYW5hZ2VyOwotICAgICAgICB0aGlzLnBhdGhNYW5hZ2VyID0gcGF0aE1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9nZ2VyIGludG8gdGhlIHVuZGVybHlpbmcgSkNSIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNyZWRlbnRpYWxzCi0gICAgICogQHBhcmFtIHdvcmtzcGFjZU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBMb2dpbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTm9TdWNoV29ya3NwYWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb24gbG9naW4oQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMsIFN0cmluZyB3b3Jrc3BhY2VOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5sb2dpbihjcmVkZW50aWFscywgd29ya3NwYWNlTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hXb3Jrc3BhY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjIuMiBnZXRSZXBvc2l0b3J5SW5mbwotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mbyBnZXRSZXBvc2l0b3J5SW5mbyhTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXRSZXBvc2l0b3J5SW5mbyIpOwotCi0gICAgICAgIHJldHVybiBjb21waWxlUmVwb3NpdG9yeUluZm8oc2Vzc2lvbi5nZXRXb3Jrc3BhY2UoKS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi4yLjIgZ2V0UmVwb3NpdG9yeUluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0PFJlcG9zaXRvcnlJbmZvPiBpbmZvcyA9IG5ldyBBcnJheUxpc3Q8UmVwb3NpdG9yeUluZm8+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB3c3BOYW1lIDogc2Vzc2lvbi5nZXRXb3Jrc3BhY2UoKS5nZXRBY2Nlc3NpYmxlV29ya3NwYWNlTmFtZXMoKSkgewotICAgICAgICAgICAgICAgIGluZm9zLmFkZChjb21waWxlUmVwb3NpdG9yeUluZm8od3NwTmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gaW5mb3M7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuMi4zIGdldFR5cGVDaGlsZHJlbgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkxpc3QgZ2V0VHlwZUNoaWxkcmVuKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHR5cGVJZCwgYm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50KSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJnZXRUeXBlc0NoaWxkcmVuIik7Ci0gICAgICAgIHJldHVybiB0eXBlTWFuYWdlci5nZXRUeXBlQ2hpbGRyZW4odHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsIHNraXBDb3VudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjIuNSBnZXRUeXBlRGVmaW5pdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTZXNzaW9uIHNlc3Npb24sIFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXRUeXBlRGVmaW5pdGlvbiIpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSB0eXBlTWFuYWdlci5nZXRUeXBlKHR5cGVJZCk7Ci0gICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIlR5cGUgJyIgKyB0eXBlSWQgKyAiJyBpcyB1bmtub3duISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpjclR5cGVNYW5hZ2VyLmNvcHlUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuMi40IGdldFR5cGVEZXNjZW5kYW50cwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlc0Rlc2NlbmRhbnRzKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHR5cGVJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLQotICAgICAgICBMT0cuZGVidWcoImdldFR5cGVzRGVzY2VuZGFudHMiKTsKLSAgICAgICAgcmV0dXJuIHR5cGVNYW5hZ2VyLmdldFR5cGVzRGVzY2VuZGFudHModHlwZUlkLCBkZXB0aCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi40LjEgY3JlYXRlRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFNlc3Npb24gc2Vzc2lvbiwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpIHsKLQotICAgICAgICBMT0cuZGVidWcoImNyZWF0ZURvY3VtZW50Iik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcHJvcGVydGllcwotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gUHJvcGVydHlIZWxwZXIuZ2V0VHlwZUlkKHByb3BlcnRpZXMpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gdHlwZU1hbmFnZXIuZ2V0VHlwZSh0eXBlSWQpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNWZXJzaW9uYWJsZSA9IEpjclR5cGVNYW5hZ2VyLmlzVmVyc2lvbmFibGUodHlwZSk7Ci0gICAgICAgIGlmICghaXNWZXJzaW9uYWJsZSAmJiB2ZXJzaW9uaW5nU3RhdGUgIT0gVmVyc2lvbmluZ1N0YXRlLk5PTkUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiVmVyc2lvbmluZyBub3Qgc3VwcG9ydGVkIGZvciAiICsgdHlwZUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1ZlcnNpb25hYmxlICYmIHZlcnNpb25pbmdTdGF0ZSA9PSBWZXJzaW9uaW5nU3RhdGUuTk9ORSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJWZXJzaW9uaW5nIHJlcXVpcmVkIGZvciAiICsgdHlwZUlkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbmFtZQotICAgICAgICBTdHJpbmcgbmFtZSA9IFByb3BlcnR5SGVscGVyLmdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnRpZXMsIFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICAvLyBnZXQgcGFyZW50IE5vZGUgYW5kIGNyZWF0ZSBjaGlsZAotICAgICAgICBKY3JGb2xkZXIgcGFyZW50ID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBmb2xkZXJJZCkuYXNGb2xkZXIoKTsKLSAgICAgICAgSmNyRG9jdW1lbnRUeXBlSGFuZGxlciB0eXBlSGFuZGxlciA9IHR5cGVIYW5kbGVyTWFuYWdlci5nZXREb2N1bWVudFR5cGVIYW5kbGVyKHR5cGVJZCk7Ci0gICAgICAgIEpjck5vZGUgamNyTm9kZSA9IHR5cGVIYW5kbGVyLmNyZWF0ZURvY3VtZW50KHBhcmVudCwgSmNyQ29udmVydGVyLnRvSmNyTmFtZShuYW1lKSwgcHJvcGVydGllcywgY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUpOwotICAgICAgICByZXR1cm4gamNyTm9kZS5nZXRJZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi40LjIgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgc291cmNlSWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSkgewotCi0gICAgICAgIExPRy5kZWJ1ZygiY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlIik7Ci0KLSAgICAgICAgLy8gZ2V0IHBhcmVudCBmb2xkZXIgTm9kZQotICAgICAgICBKY3JGb2xkZXIgcGFyZW50ID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBmb2xkZXJJZCkuYXNGb2xkZXIoKTsKLQotICAgICAgICAvLyBnZXQgc291cmNlIGRvY3VtZW50IE5vZGUKLSAgICAgICAgSmNyRG9jdW1lbnQgc291cmNlID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBzb3VyY2VJZCkuYXNEb2N1bWVudCgpOwotCi0gICAgICAgIGJvb2xlYW4gaXNWZXJzaW9uYWJsZSA9IHNvdXJjZS5pc1ZlcnNpb25hYmxlKCk7Ci0gICAgICAgIGlmICghaXNWZXJzaW9uYWJsZSAmJiB2ZXJzaW9uaW5nU3RhdGUgIT0gVmVyc2lvbmluZ1N0YXRlLk5PTkUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiVmVyc2lvbmluZyBub3Qgc3VwcG9ydGVkIGZvciAiICsgc291cmNlSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzVmVyc2lvbmFibGUgJiYgdmVyc2lvbmluZ1N0YXRlID09IFZlcnNpb25pbmdTdGF0ZS5OT05FKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIlZlcnNpb25pbmcgcmVxdWlyZWQgZm9yICIgKyBzb3VyY2VJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgY2hpbGQgZnJvbSBzb3VyY2UKLSAgICAgICAgSmNyTm9kZSBqY3JOb2RlID0gcGFyZW50LmFkZE5vZGVGcm9tU291cmNlKHNvdXJjZSwgcHJvcGVydGllcyk7Ci0gICAgICAgIHJldHVybiBqY3JOb2RlLmdldElkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMyBjcmVhdGVGb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUZvbGRlcihTZXNzaW9uIHNlc3Npb24sIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiY3JlYXRlRm9sZGVyIik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcHJvcGVydGllcwotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0aWVzIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBTdHJpbmcgdHlwZUlkID0gUHJvcGVydHlIZWxwZXIuZ2V0VHlwZUlkKHByb3BlcnRpZXMpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gdHlwZU1hbmFnZXIuZ2V0VHlwZSh0eXBlSWQpOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbmFtZQotICAgICAgICBTdHJpbmcgbmFtZSA9IFByb3BlcnR5SGVscGVyLmdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnRpZXMsIFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICAvLyBnZXQgcGFyZW50IE5vZGUKLSAgICAgICAgSmNyRm9sZGVyIHBhcmVudCA9IGdldEpjck5vZGUoc2Vzc2lvbiwgZm9sZGVySWQpLmFzRm9sZGVyKCk7Ci0gICAgICAgIEpjckZvbGRlclR5cGVIYW5kbGVyIHR5cGVIYW5kbGVyID0gdHlwZUhhbmRsZXJNYW5hZ2VyLmdldEZvbGRlclR5cGVIYW5kbGVyKHR5cGVJZCk7Ci0gICAgICAgIEpjck5vZGUgamNyTm9kZSA9IHR5cGVIYW5kbGVyLmNyZWF0ZUZvbGRlcihwYXJlbnQsIEpjckNvbnZlcnRlci50b0pjck5hbWUobmFtZSksIHByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gamNyTm9kZS5nZXRJZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi40LjEzIG1vdmVPYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBtb3ZlT2JqZWN0KFNlc3Npb24gc2Vzc2lvbiwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIFN0cmluZyB0YXJnZXRGb2xkZXJJZCwKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLCBib29sZWFuIHJlcXVpcmVzT2JqZWN0SW5mbykgewotCi0gICAgICAgIExPRy5kZWJ1ZygibW92ZU9iamVjdCIpOwotCi0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsIHx8IG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIklkIGlzIG5vdCB2YWxpZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbm9kZSBhbmQgcGFyZW50Ci0gICAgICAgIEpjck5vZGUgamNyTm9kZSA9IGdldEpjck5vZGUoc2Vzc2lvbiwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIEpjckZvbGRlciBwYXJlbnQgPSBnZXRKY3JOb2RlKHNlc3Npb24sIHRhcmdldEZvbGRlcklkKS5hc0ZvbGRlcigpOwotICAgICAgICBqY3JOb2RlID0gamNyTm9kZS5tb3ZlKHBhcmVudCk7Ci0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKGpjck5vZGUuZ2V0SWQoKSk7Ci0gICAgICAgIHJldHVybiBqY3JOb2RlLmNvbXBpbGVPYmplY3RUeXBlKG51bGwsIGZhbHNlLCBvYmplY3RJbmZvcywgcmVxdWlyZXNPYmplY3RJbmZvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNC4xNiBzZXRDb250ZW50U3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFN0cmVhbShTZXNzaW9uIHNlc3Npb24sIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0pIHsKLQotICAgICAgICBMT0cuZGVidWcoInNldENvbnRlbnRTdHJlYW0gb3IgZGVsZXRlQ29udGVudFN0cmVhbSIpOwotCi0gICAgICAgIGlmIChvYmplY3RJZCA9PSBudWxsIHx8IG9iamVjdElkLmdldFZhbHVlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIklkIGlzIG5vdCB2YWxpZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEpjckRvY3VtZW50IGpjckRvY3VtZW50ID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBvYmplY3RJZC5nZXRWYWx1ZSgpKS5hc0RvY3VtZW50KCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IGpjckRvY3VtZW50LnNldENvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbSwgQm9vbGVhbi5UUlVFLmVxdWFscyhvdmVyd3JpdGVGbGFnKSkuZ2V0SWQoKTsKLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUoaWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi40LjE0IGRlbGV0ZU9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucykgewotICAgICAgICBMT0cuZGVidWcoImRlbGV0ZU9iamVjdCIpOwotCi0gICAgICAgIC8vIGdldCB0aGUgbm9kZQotICAgICAgICBKY3JOb2RlIGpjck5vZGUgPSBnZXRKY3JOb2RlKHNlc3Npb24sIG9iamVjdElkKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNoZWNrIG9uIHByaXZhdGUgY29weQotICAgICAgICAgICAgYm9vbGVhbiBpc1B3YyA9IGpjck5vZGUuaXNWZXJzaW9uYWJsZSgpCi0gICAgICAgICAgICAgICAgICAgICYmIEpjclByaXZhdGVXb3JraW5nQ29weS5pc1B3YyhqY3JOb2RlLmFzVmVyc2lvbigpLmdldFZlcnNpb25MYWJlbCgpKTsKLSAgICAgICAgICAgIGpjck5vZGUuZGVsZXRlKEJvb2xlYW4uVFJVRS5lcXVhbHMoYWxsVmVyc2lvbnMpLCBpc1B3Yyk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gcmV4KSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcocmV4LmdldE1lc3NhZ2UoKSwgcmV4KTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihyZXguZ2V0TWVzc2FnZSgpLCByZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTUgZGVsZXRlVHJlZQotICAgICAqLwotICAgIHB1YmxpYyBGYWlsZWRUb0RlbGV0ZURhdGEgZGVsZXRlVHJlZShTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBmb2xkZXJJZCkgewotICAgICAgICBMT0cuZGVidWcoImRlbGV0ZVRyZWUiKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGZvbGRlcgotICAgICAgICBKY3JGb2xkZXIgamNyRm9sZGVyID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBmb2xkZXJJZCkuYXNGb2xkZXIoKTsKLSAgICAgICAgcmV0dXJuIGpjckZvbGRlci5kZWxldGVUcmVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTIgdXBkYXRlUHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIHVwZGF0ZVByb3BlcnRpZXMoU2Vzc2lvbiBzZXNzaW9uLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsIGJvb2xlYW4gb2JqZWN0SW5mb1JlcXVpcmVkKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJ1cGRhdGVQcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJZCBpcyBub3QgdmFsaWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG5vZGUKLSAgICAgICAgSmNyTm9kZSBqY3JOb2RlID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBvYmplY3RJZC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgU3RyaW5nIGlkID0gamNyTm9kZS51cGRhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpLmdldElkKCk7Ci0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKGlkKTsKLSAgICAgICAgcmV0dXJuIGpjck5vZGUuY29tcGlsZU9iamVjdFR5cGUobnVsbCwgZmFsc2UsIG9iamVjdEluZm9zLCBvYmplY3RJbmZvUmVxdWlyZWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi40LjcgZ2V0T2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0KFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsIGJvb2xlYW4gcmVxdWlyZXNPYmplY3RJbmZvKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJnZXRPYmplY3QiKTsKLQotICAgICAgICAvLyBjaGVjayBpZAotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJZCBtdXN0IGJlIHNldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbm9kZQotICAgICAgICBKY3JOb2RlIGpjck5vZGUgPSBnZXRKY3JOb2RlKHNlc3Npb24sIG9iamVjdElkKTsKLQotICAgICAgICAvLyBnYXRoZXIgcHJvcGVydGllcwotICAgICAgICByZXR1cm4gamNyTm9kZS5jb21waWxlT2JqZWN0VHlwZShzcGxpdEZpbHRlcihmaWx0ZXIpLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgb2JqZWN0SW5mb3MsIHJlcXVpcmVzT2JqZWN0SW5mbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuOCBnZXRQcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLCBib29sZWFuIHJlcXVpcmVzT2JqZWN0SW5mbykgewotCi0gICAgICAgIE9iamVjdERhdGEgb2JqZWN0ID0gZ2V0T2JqZWN0KHNlc3Npb24sIG9iamVjdElkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBvYmplY3RJbmZvcywKLSAgICAgICAgICAgICAgICByZXF1aXJlc09iamVjdEluZm8pOwotICAgICAgICByZXR1cm4gb2JqZWN0LmdldFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNC42IGdldEFsbG93YWJsZUFjdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0QWxsb3dhYmxlQWN0aW9ucyIpOwotCi0gICAgICAgIEpjck5vZGUgamNyTm9kZSA9IGdldEpjck5vZGUoc2Vzc2lvbiwgb2JqZWN0SWQpOwotICAgICAgICByZXR1cm4gamNyTm9kZS5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMTAgZ2V0Q29udGVudFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgb2JqZWN0SWQsIEJpZ0ludGVnZXIgb2Zmc2V0LCBCaWdJbnRlZ2VyIGxlbmd0aCkgewotICAgICAgICBMT0cuZGVidWcoImdldENvbnRlbnRTdHJlYW0iKTsKLQotICAgICAgICBpZiAob2Zmc2V0ICE9IG51bGwgfHwgbGVuZ3RoICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPZmZzZXQgYW5kIExlbmd0aCBhcmUgbm90IHN1cHBvcnRlZCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbm9kZQotICAgICAgICBKY3JEb2N1bWVudCBqY3JEb2N1bWVudCA9IGdldEpjck5vZGUoc2Vzc2lvbiwgb2JqZWN0SWQpLmFzRG9jdW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIGpjckRvY3VtZW50LmdldENvbnRlbnRTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuMy4xIGdldENoaWxkcmVuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwKLSAgICAgICAgICAgIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLCBib29sZWFuIHJlcXVpcmVzT2JqZWN0SW5mbykgewotCi0gICAgICAgIExPRy5kZWJ1ZygiZ2V0Q2hpbGRyZW4iKTsKLQotICAgICAgICAvLyBza2lwIGFuZCBtYXgKLSAgICAgICAgaW50IHNraXAgPSBza2lwQ291bnQgPT0gbnVsbCA/IDAgOiBza2lwQ291bnQuaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKHNraXAgPCAwKSB7Ci0gICAgICAgICAgICBza2lwID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtYXggPSBtYXhJdGVtcyA9PSBudWxsID8gSW50ZWdlci5NQVhfVkFMVUUgOiBtYXhJdGVtcy5pbnRWYWx1ZSgpOwotICAgICAgICBpZiAobWF4IDwgMCkgewotICAgICAgICAgICAgbWF4ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGZvbGRlcgotICAgICAgICBKY3JGb2xkZXIgamNyRm9sZGVyID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBmb2xkZXJJZCkuYXNGb2xkZXIoKTsKLQotICAgICAgICAvLyBzZXQgb2JqZWN0IGluZm8gb2YgdGhlIHRoZSBmb2xkZXIKLSAgICAgICAgaWYgKHJlcXVpcmVzT2JqZWN0SW5mbykgewotICAgICAgICAgICAgamNyRm9sZGVyLmNvbXBpbGVPYmplY3RUeXBlKG51bGwsIGZhbHNlLCBvYmplY3RJbmZvcywgcmVxdWlyZXNPYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByZXBhcmUgcmVzdWx0Ci0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdEltcGwgcmVzdWx0ID0gbmV3IE9iamVjdEluRm9sZGVyTGlzdEltcGwoKTsKLSAgICAgICAgcmVzdWx0LnNldE9iamVjdHMobmV3IEFycmF5TGlzdDxPYmplY3RJbkZvbGRlckRhdGE+KCkpOwotICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKGZhbHNlKTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggY2hpbGRyZW4KLSAgICAgICAgU2V0PFN0cmluZz4gc3BsaXRGaWx0ZXIgPSBzcGxpdEZpbHRlcihmaWx0ZXIpOwotICAgICAgICBJdGVyYXRvcjxKY3JOb2RlPiBjaGlsZE5vZGVzID0gamNyRm9sZGVyLmdldE5vZGVzKCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZE5vZGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgSmNyTm9kZSBjaGlsZCA9IGNoaWxkTm9kZXMubmV4dCgpOwotICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgaWYgKHNraXAgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2tpcC0tOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVzdWx0LmdldE9iamVjdHMoKS5zaXplKCkgPj0gbWF4KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyh0cnVlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYnVpbGQgYW5kIGFkZCBjaGlsZCBvYmplY3QKLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyRGF0YUltcGwgb2JqZWN0SW5Gb2xkZXIgPSBuZXcgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCgpOwotICAgICAgICAgICAgb2JqZWN0SW5Gb2xkZXIuc2V0T2JqZWN0KGNoaWxkLmNvbXBpbGVPYmplY3RUeXBlKHNwbGl0RmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzT2JqZWN0SW5mbykpOwotCi0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhpbmNsdWRlUGF0aFNlZ21lbnQpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0SW5Gb2xkZXIuc2V0UGF0aFNlZ21lbnQoY2hpbGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQob2JqZWN0SW5Gb2xkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKEJpZ0ludGVnZXIudmFsdWVPZihjb3VudCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi4zLjIgZ2V0RGVzY2VuZGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICBib29sZWFuIHJlcXVpcmVzT2JqZWN0SW5mbywgYm9vbGVhbiBmb2xkZXJzT25seSkgewotCi0gICAgICAgIExPRy5kZWJ1ZygiZ2V0RGVzY2VuZGFudHMgb3IgZ2V0Rm9sZGVyVHJlZSIpOwotCi0gICAgICAgIC8vIGNoZWNrIGRlcHRoCi0gICAgICAgIGludCBkID0gZGVwdGggPT0gbnVsbCA/IDIgOiBkZXB0aC5pbnRWYWx1ZSgpOwotICAgICAgICBpZiAoZCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiRGVwdGggbXVzdCBub3QgYmUgMCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZCA8IC0xKSB7Ci0gICAgICAgICAgICBkID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGZvbGRlcgotICAgICAgICBKY3JGb2xkZXIgamNyRm9sZGVyID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBmb2xkZXJJZCkuYXNGb2xkZXIoKTsKLQotICAgICAgICAvLyBzZXQgb2JqZWN0IGluZm8gb2YgdGhlIHRoZSBmb2xkZXIKLSAgICAgICAgaWYgKHJlcXVpcmVzT2JqZWN0SW5mbykgewotICAgICAgICAgICAgamNyRm9sZGVyLmNvbXBpbGVPYmplY3RUeXBlKG51bGwsIGZhbHNlLCBvYmplY3RJbmZvcywgcmVxdWlyZXNPYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgdHJlZQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPigpOwotICAgICAgICBnYXRoZXJEZXNjZW5kYW50cyhqY3JGb2xkZXIsIHJlc3VsdCwgZm9sZGVyc09ubHksIGQsIHNwbGl0RmlsdGVyKGZpbHRlciksIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVQYXRoU2VnbWVudCwgb2JqZWN0SW5mb3MsIHJlcXVpcmVzT2JqZWN0SW5mbyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuMy40IGdldEZvbGRlclBhcmVudAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldEZvbGRlclBhcmVudChTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICBib29sZWFuIHJlcXVpcmVzT2JqZWN0SW5mbykgewotCi0gICAgICAgIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gcGFyZW50cyA9IGdldE9iamVjdFBhcmVudHMoc2Vzc2lvbiwgZm9sZGVySWQsIGZpbHRlciwgZmFsc2UsIGZhbHNlLCBvYmplY3RJbmZvcywKLSAgICAgICAgICAgICAgICByZXF1aXJlc09iamVjdEluZm8pOwotCi0gICAgICAgIGlmIChwYXJlbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlRoZSByb290IGZvbGRlciBoYXMgbm8gcGFyZW50ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmVudHMuZ2V0KDApLmdldE9iamVjdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi4zLjUgZ2V0T2JqZWN0UGFyZW50cwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBPYmplY3RJbmZvSGFuZGxlciBvYmplY3RJbmZvcywKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZXNPYmplY3RJbmZvKSB7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJnZXRPYmplY3RQYXJlbnRzIik7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBmaWxlIG9yIGZvbGRlcgotICAgICAgICBKY3JOb2RlIGpjck5vZGUgPSBnZXRKY3JOb2RlKHNlc3Npb24sIG9iamVjdElkKTsKLQotICAgICAgICAvLyBkb24ndCBjbGltYiBhYm92ZSB0aGUgcm9vdCBmb2xkZXIKLSAgICAgICAgaWYgKGpjck5vZGUuaXNSb290KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBvYmplY3QgaW5mbyBvZiB0aGUgdGhlIG9iamVjdAotICAgICAgICBpZiAocmVxdWlyZXNPYmplY3RJbmZvKSB7Ci0gICAgICAgICAgICBqY3JOb2RlLmNvbXBpbGVPYmplY3RUeXBlKG51bGwsIGZhbHNlLCBvYmplY3RJbmZvcywgcmVxdWlyZXNPYmplY3RJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCBwYXJlbnQKLSAgICAgICAgSmNyTm9kZSBwYXJlbnQgPSBqY3JOb2RlLmdldFBhcmVudCgpOwotICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IHBhcmVudC5jb21waWxlT2JqZWN0VHlwZShzcGxpdEZpbHRlcihmaWx0ZXIpLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICAgICAgcmVxdWlyZXNPYmplY3RJbmZvKTsKLQotICAgICAgICBPYmplY3RQYXJlbnREYXRhSW1wbCByZXN1bHQgPSBuZXcgT2JqZWN0UGFyZW50RGF0YUltcGwoKTsKLSAgICAgICAgcmVzdWx0LnNldE9iamVjdChvYmplY3QpOwotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRSZWxhdGl2ZVBhdGhTZWdtZW50KHBhcmVudC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoKE9iamVjdFBhcmVudERhdGEpIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuOSBnZXRPYmplY3RCeVBhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgZm9sZGVyUGF0aCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGJvb2xlYW4gaW5jbHVkZUFDTCwgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICBib29sZWFuIHJlcXVpcmVzT2JqZWN0SW5mbykgewotCi0gICAgICAgIExPRy5kZWJ1ZygiZ2V0T2JqZWN0QnlQYXRoIik7Ci0KLSAgICAgICAgLy8gY2hlY2sgcGF0aAotICAgICAgICBpZiAoZm9sZGVyUGF0aCA9PSBudWxsIHx8ICFQYXRoTWFuYWdlci5pc0Fic29sdXRlKGZvbGRlclBhdGgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmb2xkZXIgcGF0aCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIEpjck5vZGUgcm9vdCA9IGdldEpjck5vZGUoc2Vzc2lvbiwgUGF0aE1hbmFnZXIuQ01JU19ST09UX0lEKTsKLSAgICAgICAgSmNyTm9kZSBqY3JOb2RlOwotICAgICAgICBpZiAoUGF0aE1hbmFnZXIuaXNSb290KGZvbGRlclBhdGgpKSB7Ci0gICAgICAgICAgICBqY3JOb2RlID0gcm9vdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gUGF0aE1hbmFnZXIucmVsYXRpdml6ZShQYXRoTWFuYWdlci5DTUlTX1JPT1RfUEFUSCwgZm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICBqY3JOb2RlID0gcm9vdC5nZXROb2RlKHBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGpjck5vZGUuY29tcGlsZU9iamVjdFR5cGUoc3BsaXRGaWx0ZXIoZmlsdGVyKSwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIG9iamVjdEluZm9zLCByZXF1aXJlc09iamVjdEluZm8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi4zLjYgZ2V0Q2hlY2tlZE91dERvY3MKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDaGVja2VkT3V0RG9jcyhTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCkgewotCi0gICAgICAgIExPRy5kZWJ1ZygiZ2V0Q2hlY2tlZE91dERvY3MiKTsKLQotICAgICAgICAvLyBza2lwIGFuZCBtYXgKLSAgICAgICAgaW50IHNraXAgPSBza2lwQ291bnQgPT0gbnVsbCA/IDAgOiBza2lwQ291bnQuaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKHNraXAgPCAwKSB7Ci0gICAgICAgICAgICBza2lwID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtYXggPSBtYXhJdGVtcyA9PSBudWxsID8gSW50ZWdlci5NQVhfVkFMVUUgOiBtYXhJdGVtcy5pbnRWYWx1ZSgpOwotICAgICAgICBpZiAobWF4IDwgMCkgewotICAgICAgICAgICAgbWF4ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQnVpbGQgeHBhdGggcXVlcnkgb2YgdGhlIGZvcm0KLSAgICAgICAgICAgIC8vICcvL3BhdGgvdG8vZm9sZGVySWQvLypbamNyOmlzQ2hlY2tlZE91dD0ndHJ1ZScgYW5kCi0gICAgICAgICAgICAvLyAobm90KEBqY3I6Y3JlYXRlZEJ5KSBvciBAamNyOmNyZWF0ZWRCeT0nYWRtaW4nKV0nCi0gICAgICAgICAgICBTdHJpbmcgeFBhdGggPSAiLypbamNyOmlzQ2hlY2tlZE91dD0ndHJ1ZScgIiArICJhbmQgKG5vdChAamNyOmNyZWF0ZWRCeSkgb3IgQGpjcjpjcmVhdGVkQnk9JyIKLSAgICAgICAgICAgICAgICAgICAgKyBzZXNzaW9uLmdldFVzZXJJRCgpICsgIicpXSI7Ci0KLSAgICAgICAgICAgIGlmIChmb2xkZXJJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSmNyRm9sZGVyIGpjckZvbGRlciA9IGdldEpjck5vZGUoc2Vzc2lvbiwgZm9sZGVySWQpLmFzRm9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBqY3JGb2xkZXIuZ2V0Tm9kZSgpLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICBpZiAoIi8iLmVxdWFscyhwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBwYXRoID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhQYXRoID0gJy8nICsgVXRpbC5lc2NhcGUocGF0aCkgKyB4UGF0aDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeFBhdGggPSAnLycgKyB4UGF0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRXhlY3V0ZSBxdWVyeQotICAgICAgICAgICAgUXVlcnlNYW5hZ2VyIHF1ZXJ5TWFuYWdlciA9IHNlc3Npb24uZ2V0V29ya3NwYWNlKCkuZ2V0UXVlcnlNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBRdWVyeSBxdWVyeSA9IHF1ZXJ5TWFuYWdlci5jcmVhdGVRdWVyeSh4UGF0aCwgUXVlcnkuWFBBVEgpOwotICAgICAgICAgICAgUXVlcnlSZXN1bHQgcXVlcnlSZXN1bHQgPSBxdWVyeS5leGVjdXRlKCk7Ci0KLSAgICAgICAgICAgIC8vIHByZXBhcmUgcmVzdWx0cwotICAgICAgICAgICAgT2JqZWN0TGlzdEltcGwgcmVzdWx0ID0gbmV3IE9iamVjdExpc3RJbXBsKCk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0T2JqZWN0cyhuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbgotICAgICAgICAgICAgU2V0PFN0cmluZz4gc3BsaXRGaWx0ZXIgPSBzcGxpdEZpbHRlcihmaWx0ZXIpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIE5vZGVJdGVyYXRvciBub2RlcyA9IHF1ZXJ5UmVzdWx0LmdldE5vZGVzKCk7Ci0gICAgICAgICAgICB3aGlsZSAobm9kZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gbm9kZXMubmV4dE5vZGUoKTsKLSAgICAgICAgICAgICAgICBKY3JOb2RlIGpjck5vZGUgPSB0eXBlSGFuZGxlck1hbmFnZXIuY3JlYXRlKG5vZGUpOwotICAgICAgICAgICAgICAgIGlmICghamNyTm9kZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIGlmIChza2lwID4gMCkgewotICAgICAgICAgICAgICAgICAgICBza2lwLS07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0T2JqZWN0cygpLnNpemUoKSA+PSBtYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYnVpbGQgYW5kIGFkZCBjaGlsZCBvYmplY3QKLSAgICAgICAgICAgICAgICBKY3JQcml2YXRlV29ya2luZ0NvcHkgamNyVmVyc2lvbiA9IGpjck5vZGUuYXNWZXJzaW9uKCkuZ2V0UHdjKCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3REYXRhID0gamNyVmVyc2lvbi5jb21waWxlT2JqZWN0VHlwZShzcGxpdEZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuZ2V0T2JqZWN0cygpLmFkZChvYmplY3REYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LnNldE51bUl0ZW1zKEJpZ0ludGVnZXIudmFsdWVPZihjb3VudCkpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi43LjEgY2hlY2tPdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja091dChTZXNzaW9uIHNlc3Npb24sIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCkgewotICAgICAgICBMT0cuZGVidWcoImNoZWNrb3V0Iik7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWQKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwgfHwgb2JqZWN0SWQuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT2JqZWN0IElkIG11c3QgYmUgc2V0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBub2RlCi0gICAgICAgIEpjck5vZGUgamNyTm9kZSA9IGdldEpjck5vZGUoc2Vzc2lvbiwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGlmICghamNyTm9kZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24oIk5vdCBhIHZlcnNpb246ICIgKyBqY3JOb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrb3V0Ci0gICAgICAgIEpjclByaXZhdGVXb3JraW5nQ29weSBwd2MgPSBqY3JOb2RlLmFzVmVyc2lvbigpLmNoZWNrb3V0KCk7Ci0gICAgICAgIG9iamVjdElkLnNldFZhbHVlKHB3Yy5nZXRJZCgpKTsKLSAgICAgICAgaWYgKGNvbnRlbnRDb3BpZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudENvcGllZC5zZXRWYWx1ZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi43LjIgY2FuY2VsQ2hlY2tvdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja291dChTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBMT0cuZGVidWcoImNhbmNlbENoZWNrb3V0Iik7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWQKLSAgICAgICAgaWYgKG9iamVjdElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgSWQgbXVzdCBiZSBzZXQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG5vZGUKLSAgICAgICAgSmNyTm9kZSBqY3JOb2RlID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBvYmplY3RJZCk7Ci0gICAgICAgIGlmICghamNyTm9kZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzVXBkYXRlQ29uZmxpY3RFeGNlcHRpb24oIk5vdCBhIHZlcnNpb246ICIgKyBqY3JOb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhbmNlbENoZWNrb3V0Ci0gICAgICAgIGpjck5vZGUuYXNWZXJzaW9uKCkuY2FuY2VsQ2hlY2tvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNy4zIGNoZWNrZWRJbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoZWNrSW4oU2Vzc2lvbiBzZXNzaW9uLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBtYWpvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hlY2tpbkNvbW1lbnQpIHsKLQotICAgICAgICBMT0cuZGVidWcoImNoZWNraW4iKTsKLQotICAgICAgICAvLyBjaGVjayBpZAotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCB8fCBvYmplY3RJZC5nZXRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgSWQgbXVzdCBiZSBzZXQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIG5vZGUKLSAgICAgICAgSmNyTm9kZSBqY3JOb2RlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamNyTm9kZSA9IGdldEpjck5vZGUoc2Vzc2lvbiwgb2JqZWN0SWQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCksIGUuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWpjck5vZGUuaXNWZXJzaW9uYWJsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uKCJOb3QgYSB2ZXJzaW9uOiAiICsgamNyTm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVja2luCi0gICAgICAgIEpjclZlcnNpb24gY2hlY2tlZEluID0gamNyTm9kZS5hc1ZlcnNpb24oKS5jaGVja2luKHByb3BlcnRpZXMsIGNvbnRlbnRTdHJlYW0sIGNoZWNraW5Db21tZW50KTsKLSAgICAgICAgb2JqZWN0SWQuc2V0VmFsdWUoY2hlY2tlZEluLmdldElkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi43LjYgZ2V0QWxsVmVyc2lvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBbGxWZXJzaW9ucyhTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIE9iamVjdEluZm9IYW5kbGVyIG9iamVjdEluZm9zLCBib29sZWFuIHJlcXVpcmVzT2JqZWN0SW5mbykgewotCi0gICAgICAgIExPRy5kZWJ1ZygiZ2V0QWxsVmVyc2lvbnMiKTsKLQotICAgICAgICAvLyBjaGVjayBpZAotICAgICAgICBpZiAob2JqZWN0SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBJZCBtdXN0IGJlIHNldC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldDxTdHJpbmc+IHNwbGl0RmlsdGVyID0gc3BsaXRGaWx0ZXIoZmlsdGVyKTsKLQotICAgICAgICAvLyBnZXQgdGhlIG5vZGUKLSAgICAgICAgSmNyTm9kZSBqY3JOb2RlID0gZ2V0SmNyTm9kZShzZXNzaW9uLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgLy8gQ29sbGVjdCB2ZXJzaW9ucwotICAgICAgICBpZiAoamNyTm9kZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgIEpjclZlcnNpb25CYXNlIGpjclZlcnNpb24gPSBqY3JOb2RlLmFzVmVyc2lvbigpOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxKY3JWZXJzaW9uPiB2ZXJzaW9ucyA9IGpjclZlcnNpb24uZ2V0VmVyc2lvbnMoKTsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9ucy5uZXh0KCk7IC8vIHNraXAgcm9vdCB2ZXJzaW9uCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gYWxsVmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdERhdGE+KCk7Ci0gICAgICAgICAgICB3aGlsZSAodmVyc2lvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSmNyVmVyc2lvbiB2ZXJzaW9uID0gdmVyc2lvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0RGF0YSA9IHZlcnNpb24uY29tcGlsZU9iamVjdFR5cGUoc3BsaXRGaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBvYmplY3RJbmZvcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzT2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICAgICAgYWxsVmVyc2lvbnMuYWRkKG9iamVjdERhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgcHdjIGlmIGNoZWNrZWQgb3V0Ci0gICAgICAgICAgICBpZiAoamNyVmVyc2lvbi5pc0RvY3VtZW50Q2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICAgICAgSmNyUHJpdmF0ZVdvcmtpbmdDb3B5IHB3YyA9IGpjclZlcnNpb24uZ2V0UHdjKCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0RGF0YSBvYmplY3REYXRhID0gcHdjLmNvbXBpbGVPYmplY3RUeXBlKHNwbGl0RmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc09iamVjdEluZm8pOwotCi0gICAgICAgICAgICAgICAgYWxsVmVyc2lvbnMuYWRkKG9iamVjdERhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDTUlTIG1hbmRhdGVzIGRlc2NlbmRpbmcgb3JkZXIKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoYWxsVmVyc2lvbnMpOwotICAgICAgICAgICAgcmV0dXJuIGFsbFZlcnNpb25zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2luZ2xlIHZlcnNpb24KLSAgICAgICAgICAgIE9iamVjdERhdGEgb2JqZWN0RGF0YSA9IGpjck5vZGUuY29tcGlsZU9iamVjdFR5cGUoc3BsaXRGaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBvYmplY3RJbmZvcywKLSAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNPYmplY3RJbmZvKTsKLQotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JqZWN0RGF0YSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlZSBDTUlTIDEuMCBzZWN0aW9uIDIuMi42LjEgcXVlcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBxdWVyeShmaW5hbCBTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBzdGF0ZW1lbnQsIEJvb2xlYW4gc2VhcmNoQWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCkgewotCi0gICAgICAgIExPRy5kZWJ1ZygicXVlcnkiKTsKLQotICAgICAgICBpZiAoc2VhcmNoQWxsVmVyc2lvbnMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkOiBxdWVyeSBmb3IgYWxsIHZlcnNpb25zIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBza2lwIGFuZCBtYXgKLSAgICAgICAgaW50IHNraXAgPSBza2lwQ291bnQgPT0gbnVsbCA/IDAgOiBza2lwQ291bnQuaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKHNraXAgPCAwKSB7Ci0gICAgICAgICAgICBza2lwID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtYXggPSBtYXhJdGVtcyA9PSBudWxsID8gSW50ZWdlci5NQVhfVkFMVUUgOiBtYXhJdGVtcy5pbnRWYWx1ZSgpOwotICAgICAgICBpZiAobWF4IDwgMCkgewotICAgICAgICAgICAgbWF4ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBRdWVyeVRyYW5zbGF0b3IgcXVlcnlUcmFuc2xhdG9yID0gbmV3IFF1ZXJ5VHJhbnNsYXRvcih0eXBlTWFuYWdlcikgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclBhdGhGcm9tSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSmNyRm9sZGVyIGZvbGRlciA9IGdldEpjck5vZGUoc2Vzc2lvbiwgaWQpLmFzRm9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZm9sZGVyLmdldE5vZGUoKS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBVdGlsLmVzY2FwZShwYXRoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBqY3JQYXRoRnJvbUNvbChUeXBlRGVmaW5pdGlvbiBmcm9tVHlwZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZUhhbmRsZXJNYW5hZ2VyLmdldElkZW50aWZpZXJNYXAoZnJvbVR5cGUuZ2V0SWQoKSkuamNyUGF0aEZyb21Db2wobmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBqY3JUeXBlTmFtZShUeXBlRGVmaW5pdGlvbiBmcm9tVHlwZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlSGFuZGxlck1hbmFnZXIuZ2V0SWRlbnRpZmllck1hcChmcm9tVHlwZS5nZXRJZCgpKS5qY3JUeXBlTmFtZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgamNyVHlwZUNvbmRpdGlvbihUeXBlRGVmaW5pdGlvbiBmcm9tVHlwZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlSGFuZGxlck1hbmFnZXIuZ2V0SWRlbnRpZmllck1hcChmcm9tVHlwZS5nZXRJZCgpKS5qY3JUeXBlQ29uZGl0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgU3RyaW5nIHhQYXRoID0gcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoc3RhdGVtZW50KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEV4ZWN1dGUgcXVlcnkKLSAgICAgICAgICAgIFF1ZXJ5TWFuYWdlciBxdWVyeU1hbmFnZXIgPSBzZXNzaW9uLmdldFdvcmtzcGFjZSgpLmdldFF1ZXJ5TWFuYWdlcigpOwotICAgICAgICAgICAgUXVlcnkgcXVlcnkgPSBxdWVyeU1hbmFnZXIuY3JlYXRlUXVlcnkoeFBhdGgsIFF1ZXJ5LlhQQVRIKTsKLQotICAgICAgICAgICAgaWYgKHNraXAgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcXVlcnkuc2V0T2Zmc2V0KHNraXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgcXVlcnkuc2V0TGltaXQobWF4ICsgMSk7IC8vIE9uZSBtb3JlIGluIG9yZGVyIHRvIGRldGVjdCB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBtb3JlIGl0ZW1zCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFF1ZXJ5UmVzdWx0IHF1ZXJ5UmVzdWx0ID0gcXVlcnkuZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICAvLyBwcmVwYXJlIHJlc3VsdHMKLSAgICAgICAgICAgIE9iamVjdExpc3RJbXBsIHJlc3VsdCA9IG5ldyBPYmplY3RMaXN0SW1wbCgpOwotICAgICAgICAgICAgcmVzdWx0LnNldE9iamVjdHMobmV3IEFycmF5TGlzdDxPYmplY3REYXRhPigpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggY2hpbGRyZW4KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBOb2RlSXRlcmF0b3Igbm9kZXMgPSBxdWVyeVJlc3VsdC5nZXROb2RlcygpOwotICAgICAgICAgICAgd2hpbGUgKG5vZGVzLmhhc05leHQoKSAmJiByZXN1bHQuZ2V0T2JqZWN0cygpLnNpemUoKSA8IG1heCkgewotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLm5leHROb2RlKCk7Ci0gICAgICAgICAgICAgICAgSmNyTm9kZSBqY3JOb2RlID0gdHlwZUhhbmRsZXJNYW5hZ2VyLmNyZWF0ZShub2RlKTsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHB3YyBpZiB0aGlzIG5vZGUgaXMgdmVyc2lvbmFibGUgYW5kIGNoZWNrZWQgb3V0Ci0gICAgICAgICAgICAgICAgaWYgKGpjck5vZGUuaXNWZXJzaW9uYWJsZSgpICYmIGpjck5vZGUuYXNWZXJzaW9uKCkuaXNDaGVja2VkT3V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgamNyTm9kZSA9IGpjck5vZGUuYXNWZXJzaW9uKCkuZ2V0UHdjKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYnVpbGQgYW5kIGFkZCBjaGlsZCBvYmplY3QKLSAgICAgICAgICAgICAgICBPYmplY3REYXRhIG9iamVjdERhdGEgPSBqY3JOb2RlLmNvbXBpbGVPYmplY3RUeXBlKG51bGwsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmdldE9iamVjdHMoKS5hZGQob2JqZWN0RGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXMobm9kZXMuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2YoY291bnQpKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByb3RlY3RlZCA+LS0tCi0KLSAgICBwcm90ZWN0ZWQgUmVwb3NpdG9yeUluZm8gY29tcGlsZVJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm9JbXBsIGZSZXBvc2l0b3J5SW5mbyA9IG5ldyBSZXBvc2l0b3J5SW5mb0ltcGwoKTsKLQotICAgICAgICBmUmVwb3NpdG9yeUluZm8uc2V0SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZlJlcG9zaXRvcnlJbmZvLnNldE5hbWUoZ2V0UmVwb3NpdG9yeU5hbWUoKSk7Ci0gICAgICAgIGZSZXBvc2l0b3J5SW5mby5zZXREZXNjcmlwdGlvbihnZXRSZXBvc2l0b3J5RGVzY3JpcHRpb24oKSk7Ci0KLSAgICAgICAgZlJlcG9zaXRvcnlJbmZvLnNldENtaXNWZXJzaW9uU3VwcG9ydGVkKCIxLjAiKTsKLQotICAgICAgICBmUmVwb3NpdG9yeUluZm8uc2V0UHJvZHVjdE5hbWUoIk9wZW5DTUlTIEpDUiIpOwotICAgICAgICBmUmVwb3NpdG9yeUluZm8uc2V0UHJvZHVjdFZlcnNpb24oIjAuMyIpOwotICAgICAgICBmUmVwb3NpdG9yeUluZm8uc2V0VmVuZG9yTmFtZSgiT3BlbkNNSVMiKTsKLQotICAgICAgICBmUmVwb3NpdG9yeUluZm8uc2V0Um9vdEZvbGRlcihQYXRoTWFuYWdlci5DTUlTX1JPT1RfSUQpOwotICAgICAgICBmUmVwb3NpdG9yeUluZm8uc2V0VGhpbkNsaWVudFVyaSgiIik7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllc0ltcGwgY2FwYWJpbGl0aWVzID0gbmV3IFJlcG9zaXRvcnlDYXBhYmlsaXRpZXNJbXBsKCk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5QWNsKENhcGFiaWxpdHlBY2wuTk9ORSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRBbGxWZXJzaW9uc1NlYXJjaGFibGUoZmFsc2UpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q2FwYWJpbGl0eUpvaW4oQ2FwYWJpbGl0eUpvaW4uTk9ORSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRTdXBwb3J0c011bHRpZmlsaW5nKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldFN1cHBvcnRzVW5maWxpbmcoZmFsc2UpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0U3VwcG9ydHNWZXJzaW9uU3BlY2lmaWNGaWxpbmcoZmFsc2UpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0SXNQd2NTZWFyY2hhYmxlKGZhbHNlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldElzUHdjVXBkYXRhYmxlKHRydWUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q2FwYWJpbGl0eVF1ZXJ5KENhcGFiaWxpdHlRdWVyeS5CT1RIQ09NQklORUQpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0Q2FwYWJpbGl0eUNoYW5nZXMoQ2FwYWJpbGl0eUNoYW5nZXMuT0JKRUNUSURTT05MWSk7Ci0gICAgICAgIGNhcGFiaWxpdGllcy5zZXRDYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXMoQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLkFOWVRJTUUpOwotICAgICAgICBjYXBhYmlsaXRpZXMuc2V0U3VwcG9ydHNHZXREZXNjZW5kYW50cyh0cnVlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldFN1cHBvcnRzR2V0Rm9sZGVyVHJlZSh0cnVlKTsKLSAgICAgICAgY2FwYWJpbGl0aWVzLnNldENhcGFiaWxpdHlSZW5kaXRpb24oQ2FwYWJpbGl0eVJlbmRpdGlvbnMuTk9ORSk7Ci0gICAgICAgIGZSZXBvc2l0b3J5SW5mby5zZXRDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKTsKLQotICAgICAgICByZXR1cm4gZlJlcG9zaXRvcnlJbmZvOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVwb3NpdG9yeU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldERlc2NyaXB0b3IoUmVwb3NpdG9yeS5SRVBfTkFNRV9ERVNDKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcG9zaXRvcnlEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogcmVwb3NpdG9yeS5nZXREZXNjcmlwdG9yS2V5cygpKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbi5hcHBlbmQoa2V5KS5hcHBlbmQoJz0nKS5hcHBlbmQocmVwb3NpdG9yeS5nZXREZXNjcmlwdG9yKGtleSkpLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBKY3JOb2RlIGdldEpjck5vZGUoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBvciBlbXB0eSBpZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaWQuZXF1YWxzKFBhdGhNYW5hZ2VyLkNNSVNfUk9PVF9JRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHlwZUhhbmRsZXJNYW5hZ2VyLmNyZWF0ZShnZXRSb290Tm9kZShzZXNzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IHNlc3Npb24uZ2V0Tm9kZUJ5SWRlbnRpZmllcihpZCk7Ci0gICAgICAgICAgICBKY3JOb2RlIGpjck5vZGUgPSB0eXBlSGFuZGxlck1hbmFnZXIuY3JlYXRlKG5vZGUpOwotCi0gICAgICAgICAgICAvLyBpZiBub2RlIGlzbid0IHVuZGVyIHZlcnNpb25pbmcsIHRoZW4gcmV0dXJuIHJldHJpZXZlZCBvYmplY3QKLSAgICAgICAgICAgIGlmICghamNyTm9kZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamNyTm9kZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSmNyVmVyc2lvbkJhc2UgdmVyc2lvbk5vZGUgPSBqY3JOb2RlLmFzVmVyc2lvbigpOwotICAgICAgICAgICAgaWYgKEpjclByaXZhdGVXb3JraW5nQ29weS5kZW5vdGVzUHdjKHZlcnNpb25Ob2RlLmdldFZlcnNpb25MYWJlbCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uTm9kZS5nZXRQd2MoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSmNyVmVyc2lvbiB2ZXJzaW9uID0gdmVyc2lvbk5vZGUuZ2V0VmVyc2lvbigoKEpjclZlcnNpb24pIHZlcnNpb25Ob2RlKS5nZXRWZXJzaW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChJdGVtTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE5vZGUgZ2V0Um9vdE5vZGUoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXROb2RlKHBhdGhNYW5hZ2VyLmdldEpjclJvb3RQYXRoKCkpOwotICAgICAgICB9IGNhdGNoIChQYXRoTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChJdGVtTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcml2YXRlID4tLS0KLQotICAgIC8qKgotICAgICAqIFRyYW5zaXRpdmVseSBnYXRoZXIgdGhlIGNoaWxkcmVuIG9mIGEgbm9kZSBkb3duIHRvIGEgc3BlY2lmaWMgZGVwdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdhdGhlckRlc2NlbmRhbnRzKEpjckZvbGRlciBqY3JGb2xkZXIsIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGxpc3QsIGJvb2xlYW4gZm9sZGVyc09ubHksCi0gICAgICAgICAgICBpbnQgZGVwdGgsIFNldDxTdHJpbmc+IGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnRzLAotICAgICAgICAgICAgT2JqZWN0SW5mb0hhbmRsZXIgb2JqZWN0SW5mb3MsIGJvb2xlYW4gcmVxdWlyZXNPYmplY3RJbmZvKSB7Ci0KLSAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGNoaWxkcmVuCi0gICAgICAgIEl0ZXJhdG9yPEpjck5vZGU+IGNoaWxkTm9kZXMgPSBqY3JGb2xkZXIuZ2V0Tm9kZXMoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkTm9kZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBKY3JOb2RlIGNoaWxkID0gY2hpbGROb2Rlcy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIGZvbGRlcnMgb25seT8KLSAgICAgICAgICAgIGlmIChmb2xkZXJzT25seSAmJiAhY2hpbGQuaXNGb2xkZXIoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdG8gbGlzdAotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJEYXRhSW1wbCBvYmplY3RJbkZvbGRlciA9IG5ldyBPYmplY3RJbkZvbGRlckRhdGFJbXBsKCk7Ci0gICAgICAgICAgICBvYmplY3RJbkZvbGRlci5zZXRPYmplY3QoY2hpbGQuY29tcGlsZU9iamVjdFR5cGUoZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgb2JqZWN0SW5mb3MsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzT2JqZWN0SW5mbykpOwotCi0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhpbmNsdWRlUGF0aFNlZ21lbnRzKSkgewotICAgICAgICAgICAgICAgIG9iamVjdEluRm9sZGVyLnNldFBhdGhTZWdtZW50KGNoaWxkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyQ29udGFpbmVySW1wbCBjb250YWluZXIgPSBuZXcgT2JqZWN0SW5Gb2xkZXJDb250YWluZXJJbXBsKCk7Ci0gICAgICAgICAgICBjb250YWluZXIuc2V0T2JqZWN0KG9iamVjdEluRm9sZGVyKTsKLQotICAgICAgICAgICAgbGlzdC5hZGQoY29udGFpbmVyKTsKLQotICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGxldmVsCi0gICAgICAgICAgICBpZiAoZGVwdGggIT0gMSAmJiBjaGlsZC5pc0ZvbGRlcigpKSB7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVyLnNldENoaWxkcmVuKG5ldyBBcnJheUxpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+KCkpOwotICAgICAgICAgICAgICAgIGdhdGhlckRlc2NlbmRhbnRzKGNoaWxkLmFzRm9sZGVyKCksIGNvbnRhaW5lci5nZXRDaGlsZHJlbigpLCBmb2xkZXJzT25seSwgZGVwdGggLSAxLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVBhdGhTZWdtZW50cywgb2JqZWN0SW5mb3MsIHJlcXVpcmVzT2JqZWN0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTcGxpdHMgYSBmaWx0ZXIgc3RhdGVtZW50IGludG8gYSBjb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gc3BsaXRGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbHRlci50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHMgOiBmaWx0ZXIuc3BsaXQoIiwiKSkgewotICAgICAgICAgICAgcyA9IHMudHJpbSgpOwotICAgICAgICAgICAgaWYgKHMuZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IGEgZmV3IGJhc2UgcHJvcGVydGllcwotICAgICAgICAvLyBxdWVyeSBuYW1lID09IGlkIChmb3IgYmFzZSB0eXBlIHByb3BlcnRpZXMpCi0gICAgICAgIHJlc3VsdC5hZGQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLSAgICAgICAgcmVzdWx0LmFkZChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgIHJlc3VsdC5hZGQoUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lEKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBKY3JUeXBlTWFuYWdlciBnZXRUeXBlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXRoTWFuYWdlciBnZXRQYXRoTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHBhdGhNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBKY3JUeXBlSGFuZGxlck1hbmFnZXIgZ2V0VHlwZUhhbmRsZXJNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gdHlwZUhhbmRsZXJNYW5hZ2VyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyU2VydmljZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmIxN2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5qY3IuQ3JlZGVudGlhbHM7Ci1pbXBvcnQgamF2YXguamNyLlNlc3Npb247Ci1pbXBvcnQgamF2YXguamNyLlNpbXBsZUNyZWRlbnRpYWxzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuQWJzdHJhY3RDbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci0KLS8qKgotICogSkNSIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKY3JTZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKY3JSZXBvc2l0b3J5IGpjclJlcG9zaXRvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTZXNzaW9uPiBzZXNzaW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2Vzc2lvbj4oKTsKLQotICAgIHByaXZhdGUgQ2FsbENvbnRleHQgY29udGV4dDsKLQotICAgIHB1YmxpYyBKY3JTZXJ2aWNlKEpjclJlcG9zaXRvcnkgamNyUmVwb3NpdG9yeSkgewotICAgICAgICB0aGlzLmpjclJlcG9zaXRvcnkgPSBqY3JSZXBvc2l0b3J5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBmb3IgKFNlc3Npb24gc2Vzc2lvbiA6IHNlc3Npb25zLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uLmxvZ291dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsQ29udGV4dChDYWxsQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIENhbGxDb250ZXh0IGdldENhbGxDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHJlcG9zaXRvcnkgc2VydmljZSA+LS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmdldFJlcG9zaXRvcnlJbmZvKGxvZ2luKHJlcG9zaXRvcnlJZCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PFJlcG9zaXRvcnlJbmZvPiBnZXRSZXBvc2l0b3J5SW5mb3MoRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmdldFJlcG9zaXRvcnlJbmZvcyhsb2dpbihudWxsKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBnZXRUeXBlQ2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICByZXR1cm4gamNyUmVwb3NpdG9yeS5nZXRUeXBlQ2hpbGRyZW4obG9naW4ocmVwb3NpdG9yeUlkKSwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgc2tpcENvdW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmdldFR5cGVEZWZpbml0aW9uKGxvZ2luKHJlcG9zaXRvcnlJZCksIHR5cGVJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0VHlwZXNEZXNjZW5kYW50cyhsb2dpbihyZXBvc2l0b3J5SWQpLCB0eXBlSWQsIGRlcHRoLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucyk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBuYXZpZ2F0aW9uIHNlcnZpY2UgPi0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmdldENoaWxkcmVuKGxvZ2luKHJlcG9zaXRvcnlJZCksIGZvbGRlcklkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVQYXRoU2VnbWVudCwgbWF4SXRlbXMsIHNraXBDb3VudCwgdGhpcywgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0RGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0RGVzY2VuZGFudHMobG9naW4ocmVwb3NpdG9yeUlkKSwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVQYXRoU2VnbWVudCwgdGhpcywgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmdldEZvbGRlclBhcmVudChsb2dpbihyZXBvc2l0b3J5SWQpLCBmb2xkZXJJZCwgZmlsdGVyLCB0aGlzLAotICAgICAgICAgICAgICAgIGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldEZvbGRlclRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0RGVzY2VuZGFudHMobG9naW4ocmVwb3NpdG9yeUlkKSwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVQYXRoU2VnbWVudCwgdGhpcywgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBnZXRPYmplY3RQYXJlbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0T2JqZWN0UGFyZW50cyhsb2dpbihyZXBvc2l0b3J5SWQpLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgdGhpcywgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDaGVja2VkT3V0RG9jcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0Q2hlY2tlZE91dERvY3MobG9naW4ocmVwb3NpdG9yeUlkKSwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBvYmplY3Qgc2VydmljZSA+LS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmNyZWF0ZURvY3VtZW50KGxvZ2luKHJlcG9zaXRvcnlJZCksIHByb3BlcnRpZXMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBzb3VyY2VJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShsb2dpbihyZXBvc2l0b3J5SWQpLCBzb3VyY2VJZCwgcHJvcGVydGllcywgZm9sZGVySWQsCi0gICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBqY3JSZXBvc2l0b3J5LnNldENvbnRlbnRTdHJlYW0obG9naW4ocmVwb3NpdG9yeUlkKSwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGNvbnRlbnRTdHJlYW0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgamNyUmVwb3NpdG9yeS5zZXRDb250ZW50U3RyZWFtKGxvZ2luKHJlcG9zaXRvcnlJZCksIG9iamVjdElkLCB0cnVlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICByZXR1cm4gamNyUmVwb3NpdG9yeS5jcmVhdGVGb2xkZXIobG9naW4ocmVwb3NpdG9yeUlkKSwgcHJvcGVydGllcywgZm9sZGVySWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdE9yQ2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgamNyUmVwb3NpdG9yeS5kZWxldGVPYmplY3QobG9naW4ocmVwb3NpdG9yeUlkKSwgb2JqZWN0SWQsIGFsbFZlcnNpb25zKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmFpbGVkVG9EZWxldGVEYXRhIGRlbGV0ZVRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmRlbGV0ZVRyZWUobG9naW4ocmVwb3NpdG9yeUlkKSwgZm9sZGVySWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0QWxsb3dhYmxlQWN0aW9ucyhsb2dpbihyZXBvc2l0b3J5SWQpLCBvYmplY3RJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBzdHJlYW1JZCwgQmlnSW50ZWdlciBvZmZzZXQsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIGxlbmd0aCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0Q29udGVudFN0cmVhbShsb2dpbihyZXBvc2l0b3J5SWQpLCBvYmplY3RJZCwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICByZXR1cm4gamNyUmVwb3NpdG9yeS5nZXRPYmplY3QobG9naW4ocmVwb3NpdG9yeUlkKSwgb2JqZWN0SWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIHRoaXMsCi0gICAgICAgICAgICAgICAgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICByZXR1cm4gamNyUmVwb3NpdG9yeS5nZXRPYmplY3RCeVBhdGgobG9naW4ocmVwb3NpdG9yeUlkKSwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZUFjbCwKLSAgICAgICAgICAgICAgICB0aGlzLCBjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcyhsb2dpbihyZXBvc2l0b3J5SWQpLCBvYmplY3RJZCwgZmlsdGVyLCBmYWxzZSwgdGhpcywKLSAgICAgICAgICAgICAgICBjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1vdmVPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIFN0cmluZyB0YXJnZXRGb2xkZXJJZCwgU3RyaW5nIHNvdXJjZUZvbGRlcklkLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgamNyUmVwb3NpdG9yeS5tb3ZlT2JqZWN0KGxvZ2luKHJlcG9zaXRvcnlJZCksIG9iamVjdElkLCB0YXJnZXRGb2xkZXJJZCwgdGhpcywgY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgamNyUmVwb3NpdG9yeS51cGRhdGVQcm9wZXJ0aWVzKGxvZ2luKHJlcG9zaXRvcnlJZCksIG9iamVjdElkLCBwcm9wZXJ0aWVzLCB0aGlzLCBjb250ZXh0LmlzT2JqZWN0SW5mb1JlcXVpcmVkKCkpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgdmVyc2lvbmluZyBzZXJ2aWNlID4tLS0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sCi0gICAgICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCkgewotCi0gICAgICAgIGpjclJlcG9zaXRvcnkuY2hlY2tPdXQobG9naW4ocmVwb3NpdG9yeUlkKSwgb2JqZWN0SWQsIGNvbnRlbnRDb3BpZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNhbmNlbENoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGpjclJlcG9zaXRvcnkuY2FuY2VsQ2hlY2tvdXQobG9naW4ocmVwb3NpdG9yeUlkKSwgb2JqZWN0SWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNoZWNrSW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gbWFqb3IsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoZWNraW5Db21tZW50LCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIGpjclJlcG9zaXRvcnkuY2hlY2tJbihsb2dpbihyZXBvc2l0b3J5SWQpLCBvYmplY3RJZCwgbWFqb3IsIHByb3BlcnRpZXMsIGNvbnRlbnRTdHJlYW0sIGNoZWNraW5Db21tZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBbGxWZXJzaW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICByZXR1cm4gamNyUmVwb3NpdG9yeS5nZXRBbGxWZXJzaW9ucyhsb2dpbihyZXBvc2l0b3J5SWQpLCB2ZXJzaW9uU2VyaWVzSWQgPT0gbnVsbCA/IG9iamVjdElkIDogdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIHRoaXMsIGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotCi0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5LmdldE9iamVjdChsb2dpbihyZXBvc2l0b3J5SWQpLCB2ZXJzaW9uU2VyaWVzSWQgPT0gbnVsbCA/IG9iamVjdElkIDogdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgICAgIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIHRoaXMsIGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllc09mTGF0ZXN0VmVyc2lvbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsCi0gICAgICAgICAgICBCb29sZWFuIG1ham9yLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLQotICAgICAgICBPYmplY3REYXRhIG9iamVjdCA9IGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsIG1ham9yLCBmaWx0ZXIsIGZhbHNlLAotICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgZXh0ZW5zaW9uKTsKLQotICAgICAgICByZXR1cm4gb2JqZWN0LmdldFByb3BlcnRpZXMoKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gZGlzY292ZXJ5IHNlcnZpY2UgLS0tCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc3RhdGVtZW50LCBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0KLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnkucXVlcnkobG9naW4ocmVwb3NpdG9yeUlkKSwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgbWF4SXRlbXMsIHNraXBDb3VudCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcm90ZWN0ZWQgPi0tLQotCi0gICAgcHJvdGVjdGVkIFNlc3Npb24gbG9naW4oU3RyaW5nIHdvcmtzcGFjZU5hbWUpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJObyB1c2VyIGNvbnRleHQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzZXNzaW9ucy5nZXQod29ya3NwYWNlTmFtZSk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB1c2VyTmFtZSA9IGNvbnRleHQuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGNvbnRleHQuZ2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICAgIENyZWRlbnRpYWxzIGNyZWRlbnRpYWxzID0gdXNlck5hbWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgU2ltcGxlQ3JlZGVudGlhbHModXNlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkID09IG51bGwgPyAiIi50b0NoYXJBcnJheSgpIDogcGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgIHNlc3Npb24gPSBqY3JSZXBvc2l0b3J5LmxvZ2luKGNyZWRlbnRpYWxzLCB3b3Jrc3BhY2VOYW1lKTsKLSAgICAgICAgICAgIHNlc3Npb25zLnB1dCh3b3Jrc3BhY2VOYW1lLCBzZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyU2VydmljZUZhY3RvcnkuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyU2VydmljZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkN2U3Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjclNlcnZpY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjcjsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zcGkuU2VydmljZVJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5OwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuc2VydmVyLkFic3RyYWN0U2VydmljZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsLkRlZmF1bHREb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsLkRlZmF1bHRGb2xkZXJUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuaW1wbC5EZWZhdWx0VW52ZXJzaW9uZWREb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci50eXBlLkpjclR5cGVIYW5kbGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyLkNvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogQSB7QGxpbmsgQ21pc1NlcnZpY2VGYWN0b3J5fSBpbXBsZW1lbnRhdGlvbiB3aGljaCByZXR1cm5zIHtAbGluayBKY3JTZXJ2aWNlfQotICogaW5zdGFuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgSmNyU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSmNyU2VydmljZUZhY3RvcnkuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9VTlRfUEFUSF9DT05GSUcgPSAibW91bnQtcGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0pDUl9DT05GSUcgPSAiamNyLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9NQVhfSVRFTVNfVFlQRVMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoNTApOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX0RFUFRIX1RZUEVTID0gQmlnSW50ZWdlci52YWx1ZU9mKC0xKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9NQVhfSVRFTVNfT0JKRUNUUyA9IEJpZ0ludGVnZXIudmFsdWVPZigyMDApOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBERUZBVUxUX0RFUFRIX09CSkVDVFMgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTApOwotCi0gICAgcHJvdGVjdGVkIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyOwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGpjckNvbmZpZzsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1vdW50UGF0aDsKLSAgICBwcm90ZWN0ZWQgSmNyUmVwb3NpdG9yeSBqY3JSZXBvc2l0b3J5OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgdHlwZU1hbmFnZXIgPSBjcmVhdGVUeXBlTWFuYWdlcigpOwotICAgICAgICByZWFkQ29uZmlndXJhdGlvbihwYXJhbWV0ZXJzKTsKLSAgICAgICAgUGF0aE1hbmFnZXIgcGF0aE1hbmdlciA9IG5ldyBQYXRoTWFuYWdlcihtb3VudFBhdGgpOwotICAgICAgICBKY3JUeXBlSGFuZGxlck1hbmFnZXIgdHlwZUhhbmRsZXJNYW5hZ2VyID0gY3JlYXRlVHlwZUhhbmRsZXJNYW5hZ2VyKHBhdGhNYW5nZXIsIHR5cGVNYW5hZ2VyKTsKLSAgICAgICAgamNyUmVwb3NpdG9yeSA9IG5ldyBKY3JSZXBvc2l0b3J5KGFjcXVpcmVKY3JSZXBvc2l0b3J5KGpjckNvbmZpZyksIHBhdGhNYW5nZXIsIHR5cGVNYW5hZ2VyLCB0eXBlSGFuZGxlck1hbmFnZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIGpjclJlcG9zaXRvcnkgPSBudWxsOwotICAgICAgICB0eXBlTWFuYWdlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNTZXJ2aWNlIGdldFNlcnZpY2UoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBKY3JTZXJ2aWNlIHNlcnZpY2UgPSBjcmVhdGVKY3JTZXJ2aWNlKGpjclJlcG9zaXRvcnksIGNvbnRleHQpOwotICAgICAgICBzZXJ2aWNlLnNldENhbGxDb250ZXh0KGNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIgc2VydmljZVdyYXBwZXIgPSBuZXcgQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIoc2VydmljZSwgCi0gICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfSVRFTVNfVFlQRVMsIERFRkFVTFRfREVQVEhfVFlQRVMsIERFRkFVTFRfTUFYX0lURU1TX09CSkVDVFMsIERFRkFVTFRfREVQVEhfT0JKRUNUUyk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VXcmFwcGVyOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgZmFjdG9yaWVzID4tLS0KLQotICAgIC8qKgotICAgICAqIEFjcXVpcmUgdGhlIEpDUiByZXBvc2l0b3J5IGdpdmVuIGEgY29uZmlndXJhdGlvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbgotICAgICAqIHVzZWQge0BsaW5rIGphdmF4LmltYWdlaW8uc3BpLlNlcnZpY2VSZWdpc3RyeSNsb29rdXBQcm92aWRlcnMoQ2xhc3MpfSBmb3IKLSAgICAgKiBsb2NhdGluZyA8Y29kZT5SZXBvc2l0b3J5RmFjdG9yeTwvY29kZT4gaW5zdGFuY2VzLiBUaGUgZmlyc3QgaW5zdGFuY2UKLSAgICAgKiB3aGljaCBjYW4gaGFuZGxlIHRoZSA8Y29kZT5qY3JDb25maWc8L2NvZGU+IHBhcmFtZXRlcnMgaXMgdXNlZCB0byBhY3F1aXJlCi0gICAgICogdGhlIHJlcG9zaXRvcnkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGpjckNvbmZpZwotICAgICAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiBkZXRlcm1pbmluZyB0aGUgSkNSIHJlcG9zaXRvcnkgdG8gYmUgcmV0dXJuZWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlcG9zaXRvcnkgYWNxdWlyZUpjclJlcG9zaXRvcnkoTWFwPFN0cmluZywgU3RyaW5nPiBqY3JDb25maWcpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPFJlcG9zaXRvcnlGYWN0b3J5PiBmYWN0b3JpZXMgPSBTZXJ2aWNlUmVnaXN0cnkubG9va3VwUHJvdmlkZXJzKFJlcG9zaXRvcnlGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIHdoaWxlIChmYWN0b3JpZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgUmVwb3NpdG9yeUZhY3RvcnkgZmFjdG9yeSA9IGZhY3Rvcmllcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gYWNxdWlyZSBKQ1IgcmVwb3NpdG9yeSBmcm9tIGZhY3RvcnkgIiArIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IGZhY3RvcnkuZ2V0UmVwb3NpdG9yeShqY3JDb25maWcpOwotICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdWNjZXNzZnVsbHkgYWNxdWlyZWQgSkNSIHJlcG9zaXRvcnkgZnJvbSBmYWN0b3J5ICIgKyBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgYWNxdWlyZSBKQ1IgcmVwb3NpdG9yeSBmcm9tIGZhY3RvcnkgIiArIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbigiTm8gSkNSIHJlcG9zaXRvcnkgZmFjdG9yeSBmb3IgY29uZmlndXJlZCBwYXJhbWV0ZXJzIik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSA8Y29kZT5KY3JTZXJ2aWNlPC9jb2RlPiBmcm9tIGEgPGNvZGU+SmNyUmVwb3NpdG9yeTwvY29kZT4KLSAgICAgKiBKY3JSZXBvc2l0b3J5PiBhbmQgPGNvZGU+Q2FsbENvbnRleHQ8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBqY3JSZXBvc2l0b3J5Ci0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEpjclNlcnZpY2UgY3JlYXRlSmNyU2VydmljZShKY3JSZXBvc2l0b3J5IGpjclJlcG9zaXRvcnksIENhbGxDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKY3JTZXJ2aWNlKGpjclJlcG9zaXRvcnkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBKY3JUeXBlTWFuYWdlciBjcmVhdGVUeXBlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKY3JUeXBlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBKY3JUeXBlSGFuZGxlck1hbmFnZXIgY3JlYXRlVHlwZUhhbmRsZXJNYW5hZ2VyKFBhdGhNYW5hZ2VyIHBhdGhNYW5hZ2VyLCBKY3JUeXBlTWFuYWdlciB0eXBlTWFuYWdlcikgewotICAgICAgICBKY3JUeXBlSGFuZGxlck1hbmFnZXIgdHlwZUhhbmRsZXJNYW5hZ2VyID0gbmV3IEpjclR5cGVIYW5kbGVyTWFuYWdlcihwYXRoTWFuYWdlciwgdHlwZU1hbmFnZXIpOwotICAgICAgICB0eXBlSGFuZGxlck1hbmFnZXIuYWRkSGFuZGxlcihuZXcgRGVmYXVsdEZvbGRlclR5cGVIYW5kbGVyKCkpOwotICAgICAgICB0eXBlSGFuZGxlck1hbmFnZXIuYWRkSGFuZGxlcihuZXcgRGVmYXVsdERvY3VtZW50VHlwZUhhbmRsZXIoKSk7Ci0gICAgICAgIHR5cGVIYW5kbGVyTWFuYWdlci5hZGRIYW5kbGVyKG5ldyBEZWZhdWx0VW52ZXJzaW9uZWREb2N1bWVudFR5cGVIYW5kbGVyKCkpOwotICAgICAgICByZXR1cm4gdHlwZUhhbmRsZXJNYW5hZ2VyOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgcHJpdmF0ZSA+LS0tCi0KLSAgICBwcml2YXRlIHZvaWQgcmVhZENvbmZpZ3VyYXRpb24oTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHBhcmFtZXRlcnMua2V5U2V0KCkpOwotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGtleXMpOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChQUkVGSVhfSkNSX0NPTkZJRykpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgamNyS2V5ID0ga2V5LnN1YnN0cmluZyhQUkVGSVhfSkNSX0NPTkZJRy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGpjclZhbHVlID0gcmVwbGFjZVN5c3RlbVByb3BlcnRpZXMocGFyYW1ldGVycy5nZXQoa2V5KSk7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChqY3JLZXksIGpjclZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAoTU9VTlRfUEFUSF9DT05GSUcuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBtb3VudFBhdGggPSBwYXJhbWV0ZXJzLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlndXJhdGlvbjogIiArIE1PVU5UX1BBVEhfQ09ORklHICsgJz0nICsgbW91bnRQYXRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIkNvbmZpZ3VyYXRpb246IHVucmVjb2duaXplZCBrZXk6ICIgKyBrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgamNyQ29uZmlnID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG1hcCk7Ci0gICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlndXJhdGlvbjogamNyPSIgKyBqY3JDb25maWcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlU3lzdGVtUHJvcGVydGllcyhTdHJpbmcgcykgewotICAgICAgICBpZiAocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBwcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaW5Qcm9wZXJ0eSA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKLQotICAgICAgICAgICAgaWYgKGluUHJvcGVydHkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnfScpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjID09ICd7JykgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHkgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBKY3JUeXBlTWFuYWdlciBnZXRUeXBlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBKY3JSZXBvc2l0b3J5IGdldEpjclJlcG9zaXRvcnkoKSB7Ci0gICAgICAgIHJldHVybiBqY3JSZXBvc2l0b3J5OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JUeXBlTWFuYWdlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JUeXBlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBkY2ZjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyVHlwZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5XU0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkFic3RyYWN0VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkRvY3VtZW50VHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Gb2xkZXJUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5UeXBlRGVmaW5pdGlvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogVHlwZSBNYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgSmNyVHlwZU1hbmFnZXIgaW1wbGVtZW50cyBUeXBlTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpjclR5cGVNYW5hZ2VyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1RZUEVfSUQgPSAiY21pczpkb2N1bWVudCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9MREVSX1RZUEVfSUQgPSAiY21pczpmb2xkZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEFUSU9OU0hJUF9UWVBFX0lEID0gImNtaXM6cmVsYXRpb25zaGlwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJQ1lfVFlQRV9JRCA9ICJjbWlzOnBvbGljeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9vcGVuY21pcy5vcmcvamNyIjsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsPiBmVHlwZXM7Ci0KLSAgICBwdWJsaWMgSmNyVHlwZU1hbmFnZXIoKSB7Ci0gICAgICAgIGZUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsPigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0eXBlIHRvIGNvbGxlY3Rpb24gd2l0aCBpbmhlcml0aW5nIGJhc2UgdHlwZSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogICAgICAgICAgICB0eXBlIHRvIGFkZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSB0eXBlIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRUeXBlKFR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZUeXBlcy5jb250YWluc0tleSh0eXBlLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBvdmVyd3JpdGUgYSB0eXBlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBBYnN0cmFjdFR5cGVEZWZpbml0aW9uIG5ld1R5cGUgPSAoQWJzdHJhY3RUeXBlRGVmaW5pdGlvbikgY29weVR5cGVEZWZpbml0aW9uKHR5cGUpOwotCi0gICAgICAgIGlmICghbmV3VHlwZS5nZXRCYXNlVHlwZUlkKCkudmFsdWUoKS5lcXVhbHMobmV3VHlwZS5nZXRJZCgpKSkgewotCi0gICAgICAgICAgICAvLyBmaW5kIGJhc2UgdHlwZQotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gYmFzZVR5cGU7Ci0gICAgICAgICAgICBpZiAobmV3VHlwZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBjb3B5VHlwZURlZmluaXRpb24oZlR5cGVzLmdldChET0NVTUVOVF9UWVBFX0lEKS5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3VHlwZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX0ZPTERFUikgewotICAgICAgICAgICAgICAgIGJhc2VUeXBlID0gY29weVR5cGVEZWZpbml0aW9uKGZUeXBlcy5nZXQoRk9MREVSX1RZUEVfSUQpLmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdUeXBlLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQKSB7Ci0gICAgICAgICAgICAgICAgYmFzZVR5cGUgPSBjb3B5VHlwZURlZmluaXRpb24oZlR5cGVzLmdldChSRUxBVElPTlNISVBfVFlQRV9JRCkuZ2V0VHlwZURlZmluaXRpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1R5cGUuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kpIHsKLSAgICAgICAgICAgICAgICBiYXNlVHlwZSA9IGNvcHlUeXBlRGVmaW5pdGlvbihmVHlwZXMuZ2V0KFBPTElDWV9UWVBFX0lEKS5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjb3B5IHByb3BlcnR5IGRlZmluaXRpb24KLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiBiYXNlVHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAoKEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+KSBwcm9wRGVmKS5zZXRJc0luaGVyaXRlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBuZXdUeXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihwcm9wRGVmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIGl0Ci0gICAgICAgIGFkZFR5cGVJbnRlcm5hbChuZXdUeXBlKTsKLQotICAgICAgICBMT0cuaW5mbygiQWRkZWQgdHlwZSAnIiArIG5ld1R5cGUuZ2V0SWQoKSArICInLiIpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdGMgPSBmVHlwZXMuZ2V0KHR5cGVJZCk7Ci0gICAgICAgIHJldHVybiB0YyA9PSBudWxsID8gbnVsbCA6IHRjLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmVyc2lvbmFibGUoVHlwZURlZmluaXRpb24gdHlwZURlZikgewotICAgICAgICByZXR1cm4gdHlwZURlZiBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24gPyAoKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGVEZWYpLmlzVmVyc2lvbmFibGUoKSA6IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb24gY29weVR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIFdTQ29udmVydGVyLmNvbnZlcnQoV1NDb252ZXJ0ZXIuY29udmVydCh0eXBlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjIuMyBnZXRUeXBlQ2hpbGRyZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGdldFR5cGVDaGlsZHJlbihTdHJpbmcgdHlwZUlkLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBza2lwQ291bnQpIHsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsIHJlc3VsdCA9IG5ldyBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsKG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb24+KCkpOwotCi0gICAgICAgIGludCBza2lwID0gc2tpcENvdW50ID09IG51bGwgPyAwIDogc2tpcENvdW50LmludFZhbHVlKCk7Ci0gICAgICAgIGlmIChza2lwIDwgMCkgewotICAgICAgICAgICAgc2tpcCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWF4ID0gbWF4SXRlbXMgPT0gbnVsbCA/IEludGVnZXIuTUFYX1ZBTFVFIDogbWF4SXRlbXMuaW50VmFsdWUoKTsKLSAgICAgICAgaWYgKG1heCA8IDEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChza2lwIDwgMSkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRMaXN0KCkuYWRkKGNvcHlUeXBlRGVmaW5pdGlvbihmVHlwZXMuZ2V0KEZPTERFUl9UWVBFX0lEKS5nZXRUeXBlRGVmaW5pdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgbWF4LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2tpcCA8IDIgJiYgbWF4ID4gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRMaXN0KCkuYWRkKGNvcHlUeXBlRGVmaW5pdGlvbihmVHlwZXMuZ2V0KERPQ1VNRU5UX1RZUEVfSUQpLmdldFR5cGVEZWZpbml0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhyZXN1bHQuZ2V0TGlzdCgpLnNpemUoKSArIHNraXAgPCAyKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2YoMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXIgdGMgPSBmVHlwZXMuZ2V0KHR5cGVJZCk7Ci0gICAgICAgICAgICBpZiAodGMgPT0gbnVsbCB8fCB0Yy5nZXRDaGlsZHJlbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIGNoaWxkIDogdGMuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIGlmIChza2lwID4gMCkgewotICAgICAgICAgICAgICAgICAgICBza2lwLS07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRMaXN0KCkuYWRkKGNvcHlUeXBlRGVmaW5pdGlvbihjaGlsZC5nZXRUeXBlRGVmaW5pdGlvbigpKSk7Ci0KLSAgICAgICAgICAgICAgICBtYXgtLTsKLSAgICAgICAgICAgICAgICBpZiAobWF4ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKHJlc3VsdC5nZXRMaXN0KCkuc2l6ZSgpICsgc2tpcCA8IHRjLmdldENoaWxkcmVuKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLnZhbHVlT2YodGMuZ2V0Q2hpbGRyZW4oKS5zaXplKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZSA6IHJlc3VsdC5nZXRMaXN0KCkpIHsKLSAgICAgICAgICAgICAgICB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuMi40IGdldFR5cGVEZXNjZW5kYW50cwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlc0Rlc2NlbmRhbnRzKFN0cmluZyB0eXBlSWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0KLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4oKTsKLQotICAgICAgICAvLyBjaGVjayBkZXB0aAotICAgICAgICBpbnQgZCA9IGRlcHRoID09IG51bGwgPyAtMSA6IGRlcHRoLmludFZhbHVlKCk7Ci0gICAgICAgIGlmIChkID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJEZXB0aCBtdXN0IG5vdCBiZSAwISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHByb3BlcnR5IGRlZmluaXRpb24gZmxhZyB0byBkZWZhdWx0IHZhbHVlIGlmIG5vdCBzZXQKLSAgICAgICAgYm9vbGVhbiBpcGQgPSBCb29sZWFuLlRSVUUuZXF1YWxzKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLQotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoZ2V0VHlwZXNEZXNjZW5kYW50cyhkLCBmVHlwZXMuZ2V0KEZPTERFUl9UWVBFX0lEKSwgaXBkKSk7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKGdldFR5cGVzRGVzY2VuZGFudHMoZCwgZlR5cGVzLmdldChET0NVTUVOVF9UWVBFX0lEKSwgaXBkKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciB0YyA9IGZUeXBlcy5nZXQodHlwZUlkKTsKLSAgICAgICAgICAgIGlmICh0YyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChnZXRUeXBlc0Rlc2NlbmRhbnRzKGQsIHRjLCBpcGQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBKY3JUeXBlTWFuYWdlciA+LS0tCi0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25Db250YWluZXIgZ2V0VHlwZUJ5SWQoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICByZXR1cm4gZlR5cGVzLmdldCh0eXBlSWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlQnlRdWVyeU5hbWUoU3RyaW5nIHR5cGVRdWVyeU5hbWUpIHsKLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwgdHlwZSA6IGZUeXBlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZURlZiA9IHR5cGUuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgICAgIGlmICh0eXBlRGVmLmdldFF1ZXJ5TmFtZSgpLmVxdWFscyh0eXBlUXVlcnlOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlRGVmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZWZpbml0aW9uTGlzdCgpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPihmVHlwZXMuc2l6ZSgpKTsKLSAgICAgICAgdHlwZXMuYWRkQWxsKGZUeXBlcy52YWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiB0eXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0Um9vdFR5cGVzKCkgewotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+KDIpOwotICAgICAgICB0eXBlcy5hZGQoZlR5cGVzLmdldChGT0xERVJfVFlQRV9JRCkpOwotICAgICAgICB0eXBlcy5hZGQoZlR5cGVzLmdldChET0NVTUVOVF9UWVBFX0lEKSk7Ci0gICAgICAgIHJldHVybiB0eXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5SWRGb3JRdWVyeU5hbWUoVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24sIFN0cmluZyBwcm9wUXVlcnlOYW1lKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkIDogdHlwZURlZmluaXRpb24uZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAocGQuZ2V0UXVlcnlOYW1lKCkuZXF1YWxzKHByb3BRdWVyeU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBkLmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQmFzZVByb3BlcnR5RGVmaW5pdGlvbnMoQWJzdHJhY3RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lELCAiQmFzZSBUeXBlIElkIiwgIkJhc2UgVHlwZSBJZCIsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsIHRydWUpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLk9CSkVDVF9JRCwgIk9iamVjdCBJZCIsICJPYmplY3QgSWQiLCBQcm9wZXJ0eVR5cGUuSUQsCi0gICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCB0cnVlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcERlZihQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgIlR5cGUgSWQiLCAiVHlwZSBJZCIsIFByb3BlcnR5VHlwZS5JRCwKLSAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5PTkNSRUFURSwgZmFsc2UsIHRydWUpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLk5BTUUsICJOYW1lIiwgIk5hbWUiLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLAotICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURXUklURSwgZmFsc2UsIHRydWUpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLkNSRUFURURfQlksICJDcmVhdGVkIEJ5IiwgIkNyZWF0ZWQgQnkiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgdHJ1ZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSwgIkNyZWF0aW9uIERhdGUiLCAiQ3JlYXRpb24gRGF0ZSIsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkRBVEVUSU1FLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsIHRydWUpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlksICJMYXN0IE1vZGlmaWVkIEJ5IiwgIkxhc3QgTW9kaWZpZWQgQnkiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgdHJ1ZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURSwgIkxhc3QgTW9kaWZpY2F0aW9uIERhdGUiLAotICAgICAgICAgICAgICAgICJMYXN0IE1vZGlmaWNhdGlvbiBEYXRlIiwgUHJvcGVydHlUeXBlLkRBVEVUSU1FLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsIHRydWUpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLkNIQU5HRV9UT0tFTiwgIkNoYW5nZSBUb2tlbiIsICJDaGFuZ2UgVG9rZW4iLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRm9sZGVyUHJvcGVydHlEZWZpbml0aW9ucyhGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwgdHlwZSkgewotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLlBBUkVOVF9JRCwgIlBhcmVudCBJZCIsICJQYXJlbnQgSWQiLCBQcm9wZXJ0eVR5cGUuSUQsCi0gICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFMsCi0gICAgICAgICAgICAgICAgIkFsbG93ZWQgQ2hpbGQgT2JqZWN0IFR5cGUgSWRzIiwgIkFsbG93ZWQgQ2hpbGQgT2JqZWN0IFR5cGUgSWRzIiwgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5NVUxUSSwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuUEFUSCwgIlBhdGgiLCAiUGF0aCIsIFByb3BlcnR5VHlwZS5TVFJJTkcsCi0gICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCBmYWxzZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGREb2N1bWVudFByb3BlcnR5RGVmaW5pdGlvbnMoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgdHlwZSkgewotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLklTX0lNTVVUQUJMRSwgIklzIEltbXV0YWJsZSIsICJJcyBJbW11dGFibGUiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5CT09MRUFOLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcERlZihQcm9wZXJ0eUlkcy5JU19MQVRFU1RfVkVSU0lPTiwgIklzIExhdGVzdCBWZXJzaW9uIiwKLSAgICAgICAgICAgICAgICAiSXMgTGF0ZXN0IFZlcnNpb24iLCBQcm9wZXJ0eVR5cGUuQk9PTEVBTiwgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuSVNfTUFKT1JfVkVSU0lPTiwgIklzIE1ham9yIFZlcnNpb24iLCAiSXMgTWFqb3IgVmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkJPT0xFQU4sIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLklTX0xBVEVTVF9NQUpPUl9WRVJTSU9OLCAiSXMgTGF0ZXN0IE1ham9yIFZlcnNpb24iLAotICAgICAgICAgICAgICAgICJJcyBMYXRlc3QgTWFqb3IgVmVyc2lvbiIsIFByb3BlcnR5VHlwZS5CT09MRUFOLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLlZFUlNJT05fTEFCRUwsICJWZXJzaW9uIExhYmVsIiwgIlZlcnNpb24gTGFiZWwiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0lELCAiVmVyc2lvbiBTZXJpZXMgSWQiLAotICAgICAgICAgICAgICAgICJWZXJzaW9uIFNlcmllcyBJZCIsIFByb3BlcnR5VHlwZS5JRCwgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCB0cnVlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcERlZihQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCwKLSAgICAgICAgICAgICAgICAiSXMgVmVyc2lvbiBTZXJpZXMgQ2hlY2tlZCBPdXQiLCAiSXMgVmVyc2lvbiBTZXJpZXMgQ2hlY2tlZCBPdXQiLCBQcm9wZXJ0eVR5cGUuQk9PTEVBTiwKLSAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsIHRydWUpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lELAotICAgICAgICAgICAgICAgICJWZXJzaW9uIFNlcmllcyBDaGVja2VkIE91dCBJZCIsICJWZXJzaW9uIFNlcmllcyBDaGVja2VkIE91dCBJZCIsIFByb3BlcnR5VHlwZS5JRCwgQ2FyZGluYWxpdHkuU0lOR0xFLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcERlZihQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwKLSAgICAgICAgICAgICAgICAiVmVyc2lvbiBTZXJpZXMgQ2hlY2tlZCBPdXQgQnkiLCAiVmVyc2lvbiBTZXJpZXMgQ2hlY2tlZCBPdXQgQnkiLCBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5LlNJTkdMRSwKLSAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5ULCAiQ2hlY2tpbiBDb21tZW50IiwgIkNoZWNraW4gQ29tbWVudCIsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLlNUUklORywgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BEZWYoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RILCAiQ29udGVudCBTdHJlYW0gTGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAiQ29udGVudCBTdHJlYW0gTGVuZ3RoIiwgUHJvcGVydHlUeXBlLklOVEVHRVIsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSwgIk1JTUUgVHlwZSIsICJNSU1FIFR5cGUiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wRGVmKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSwgIkZpbGVuYW1lIiwgIkZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcERlZihQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9JRCwgIkNvbnRlbnQgU3RyZWFtIElkIiwKLSAgICAgICAgICAgICAgICAiQ29udGVudCBTdHJlYW0gSWQiLCBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBmYWxzZSwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcHJvcGVydHkgZGVmaW5pdGlvbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eURlZmluaXRpb248Pz4gY3JlYXRlUHJvcERlZihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgUHJvcGVydHlUeXBlIGRhdGF0eXBlLCBDYXJkaW5hbGl0eSBjYXJkaW5hbGl0eSwgVXBkYXRhYmlsaXR5IHVwZGF0ZWFiaWxpdHksIGJvb2xlYW4gaW5oZXJpdGVkLAotICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlZCkgewotCi0gICAgICAgIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IHJlc3VsdDsKLQotICAgICAgICBzd2l0Y2ggKGRhdGF0eXBlKSB7Ci0gICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBERUNJTUFMOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBIVE1MOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SHRtbERlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJRDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVUkk6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBkYXRhdHlwZSEgU3BlYyBjaGFuZ2U/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SWQoaWQpOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lKGlkKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgcmVzdWx0LnNldFByb3BlcnR5VHlwZShkYXRhdHlwZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXJkaW5hbGl0eShjYXJkaW5hbGl0eSk7Ci0gICAgICAgIHJlc3VsdC5zZXRVcGRhdGFiaWxpdHkodXBkYXRlYWJpbGl0eSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0luaGVyaXRlZChpbmhlcml0ZWQpOwotICAgICAgICByZXN1bHQuc2V0SXNSZXF1aXJlZChyZXF1aXJlZCk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1F1ZXJ5YWJsZShmYWxzZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUoaWQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcml2YXRlID4tLS0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0eXBlIHRvIGNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFR5cGVJbnRlcm5hbChBYnN0cmFjdFR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsIHRjID0gbmV3IFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCgpOwotICAgICAgICB0Yy5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLQotICAgICAgICAvLyBhZGQgdG8gcGFyZW50Ci0gICAgICAgIGlmICh0eXBlLmdldFBhcmVudFR5cGVJZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCB0ZGMgPSBmVHlwZXMuZ2V0KHR5cGUuZ2V0UGFyZW50VHlwZUlkKCkpOwotICAgICAgICAgICAgaWYgKHRkYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRkYy5nZXRDaGlsZHJlbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGRjLnNldENoaWxkcmVuKG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ZGMuZ2V0Q2hpbGRyZW4oKS5hZGQodGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZlR5cGVzLnB1dCh0eXBlLmdldElkKCksIHRjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXJzIHRoZSB0eXBlIGRlc2NlbmRhbnRzIHRyZWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVHlwZURlZmluaXRpb25Db250YWluZXIgZ2V0VHlwZXNEZXNjZW5kYW50cyhpbnQgZGVwdGgsIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHRjLAotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucykgewotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCByZXN1bHQgPSBuZXcgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsKCk7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IGNvcHlUeXBlRGVmaW5pdGlvbih0Yy5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLSAgICAgICAgaWYgKCFpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucykgewotICAgICAgICAgICAgdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLQotICAgICAgICBpZiAoZGVwdGggIT0gMCkgewotICAgICAgICAgICAgaWYgKHRjLmdldENoaWxkcmVuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRDaGlsZHJlbihuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPigpKTsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uQ29udGFpbmVyIHRkYyA6IHRjLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldENoaWxkcmVuKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVzRGVzY2VuZGFudHMoZGVwdGggPCAwID8gLTEgOiBkZXB0aCAtIDEsIHRkYywgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uLCBib29sZWFuIGFkZEluaGVyaXRlZFByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlVHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyVW52ZXJzaW9uZWREb2N1bWVudC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JVbnZlcnNpb25lZERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYmI1YjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JVbnZlcnNpb25lZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguamNyLk5vZGU7Ci1pbXBvcnQgamF2YXguamNyLlJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuaW1wbC5EZWZhdWx0VW52ZXJzaW9uZWREb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci50eXBlLkpjclR5cGVIYW5kbGVyTWFuYWdlcjsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBub24gdmVyc2lvbmFibGUgY21pczpkb2N1bWVudCBiYWNrZWQgYnkKLSAqIGFuIHVuZGVybHlpbmcgSkNSIDxjb2RlPk5vZGU8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgSmNyVW52ZXJzaW9uZWREb2N1bWVudCBleHRlbmRzIEpjckRvY3VtZW50IHsKLQotICAgIHB1YmxpYyBKY3JVbnZlcnNpb25lZERvY3VtZW50KE5vZGUgbm9kZSwgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIsIFBhdGhNYW5hZ2VyIHBhdGhNYW5hZ2VyLAotICAgICAgICAgICAgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlcikgewotICAgICAgICBzdXBlcihub2RlLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcm90ZWN0ZWQgPi0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE5vZGUgZ2V0Q29udGV4dE5vZGUoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXROb2RlKCkuZ2V0Tm9kZShOb2RlLkpDUl9DT05URU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2V0PEFjdGlvbj4gY29tcGlsZUFsbG93YWJsZUFjdGlvbnMoU2V0PEFjdGlvbj4gYWFzKSB7Ci0gICAgICAgIFNldDxBY3Rpb24+IHJlc3VsdCA9IHN1cGVyLmNvbXBpbGVBbGxvd2FibGVBY3Rpb25zKGFhcyk7Ci0gICAgICAgIHNldEFjdGlvbihyZXN1bHQsIEFjdGlvbi5DQU5fR0VUX0FMTF9WRVJTSU9OUywgZmFsc2UpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0NIRUNLX09VVCwgZmFsc2UpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0NBTkNFTF9DSEVDS19PVVQsIGZhbHNlKTsKLSAgICAgICAgc2V0QWN0aW9uKHJlc3VsdCwgQWN0aW9uLkNBTl9DSEVDS19JTiwgZmFsc2UpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZUlkSW50ZXJuYWwoKSB7Ci0gICAgICAgIHJldHVybiBEZWZhdWx0VW52ZXJzaW9uZWREb2N1bWVudFR5cGVIYW5kbGVyLkRPQ1VNRU5UX1VOVkVSU0lPTkVEX1RZUEVfSUQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01ham9yVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMYXRlc3RNYWpvclZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCkgewotICAgICAgICByZXR1cm4gIjAuMCI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGVja2VkT3V0KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDaGVja2VkT3V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2hlY2tlZE91dEJ5KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENoZWNrSW5Db21tZW50KCkgewotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjclZlcnNpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmI0OWM1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBqYXZheC5qY3IuTm9kZTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5qY3IudmVyc2lvbi5WZXJzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyVHlwZUhhbmRsZXJNYW5hZ2VyOwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBjbWlzOmRvY3VtZW50Ci0gKiBiYWNrZWQgYnkgYW4gdW5kZXJseWluZyBKQ1IgPGNvZGU+Tm9kZTwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBKY3JWZXJzaW9uIGV4dGVuZHMgSmNyVmVyc2lvbkJhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gVkVSU0lPTl9MQUJFTF9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCIoXFxkKykoXFwuKFxcZCspKT8uKiIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUk9VUF9NQUpPUiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdST1VQX01JTk9SID0gMzsKLQotICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbiB2ZXJzaW9uOwotCi0gICAgcHVibGljIEpjclZlcnNpb24oTm9kZSBub2RlLCBWZXJzaW9uIHZlcnNpb24sIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyLCBQYXRoTWFuYWdlciBwYXRoTWFuYWdlciwKLSAgICAgICAgICAgIEpjclR5cGVIYW5kbGVyTWFuYWdlciB0eXBlSGFuZGxlck1hbmFnZXIpIHsKLQotICAgICAgICBzdXBlcihub2RlLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcm90ZWN0ZWQgPi0tLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE5vZGUgZ2V0Q29udGV4dE5vZGUoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIE5vZGUgZnJvemVuID0gdmVyc2lvbi5nZXRGcm96ZW5Ob2RlKCk7Ci0gICAgICAgIGlmIChmcm96ZW4uaGFzTm9kZShOb2RlLkpDUl9DT05URU5UKSkgewotICAgICAgICAgICAgcmV0dXJuIGZyb3plbi5nZXROb2RlKE5vZGUuSkNSX0NPTlRFTlQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldE5vZGUoKS5nZXROb2RlKE5vZGUuSkNSX0NPTlRFTlQpOyAvLyByb290IHZlcnNpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T2JqZWN0SWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRWZXJzaW9uU2VyaWVzSWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhdGVzdFZlcnNpb24oKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIFZlcnNpb24gYmFzZVZlcnNpb24gPSBnZXRCYXNlVmVyc2lvbihnZXROb2RlKCkpOwotICAgICAgICByZXR1cm4gYmFzZVZlcnNpb24uaXNTYW1lKHZlcnNpb24pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWFqb3JWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xhdGVzdE1ham9yVmVyc2lvbigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGlzTGF0ZXN0VmVyc2lvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvbkxhYmVsKCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbmFtZSA9IHZlcnNpb24uZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgbWFqb3IgPSBwYXJzZVZlcnNpb24obmFtZSwgR1JPVVBfTUlOT1IpOwotCi0gICAgICAgIHJldHVybiBtYWpvciA9PSBudWxsID8gbmFtZSA6IChJbnRlZ2VyLnBhcnNlSW50KG1ham9yKSArIDEpICsgIi4wIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENoZWNrSW5Db21tZW50KCkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICAvLyB0b2RvIHNldCBjaGVja2luQ29tbWVudAotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcml2YXRlID4tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZVZlcnNpb24oU3RyaW5nIG5hbWUsIGludCBncm91cCkgewotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBWRVJTSU9OX0xBQkVMX1BBVFRFUk4ubWF0Y2hlcihuYW1lKTsKLSAgICAgICAgcmV0dXJuIG1hdGNoZXIubWF0Y2hlcygpID8gbWF0Y2hlci5ncm91cChncm91cCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHZlcnNpb24gbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHZlcnNpb24gbmFtZQotICAgICAqIEB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbk5hbWUoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uLmdldE5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyVmVyc2lvbkJhc2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyVmVyc2lvbkJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMDI5OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjclZlcnNpb25CYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5VbnN1cHBvcnRlZFJlcG9zaXRvcnlPcGVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXguamNyLnZlcnNpb24uVmVyc2lvbjsKLWltcG9ydCBqYXZheC5qY3IudmVyc2lvbi5WZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci52ZXJzaW9uLlZlcnNpb25IaXN0b3J5OwotaW1wb3J0IGphdmF4Lmpjci52ZXJzaW9uLlZlcnNpb25JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuT2JqZWN0SW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyVHlwZUhhbmRsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmVyc2lvbmFibGUgY21pczpkb2N1bWVudCBhbmQgaXRzCi0gKiB2ZXJzaW9ucyBiYWNrZWQgYnkgYW4gdW5kZXJseWluZyBKQ1IgPGNvZGU+Tm9kZTwvY29kZT4uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKY3JWZXJzaW9uQmFzZSBleHRlbmRzIEpjckRvY3VtZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSmNyVmVyc2lvbkJhc2UuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIEpjclZlcnNpb25CYXNlKE5vZGUgbm9kZSwgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIsIFBhdGhNYW5hZ2VyIHBhdGhNYW5hZ2VyLAotICAgICAgICAgICAgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlcikgewotICAgICAgICBzdXBlcihub2RlLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjcuNiBnZXRBbGxWZXJzaW9ucwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvcjxKY3JWZXJzaW9uPiBnZXRWZXJzaW9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFZlcnNpb25IaXN0b3J5IHZlcnNpb25IaXN0b3J5ID0gZ2V0VmVyc2lvbkhpc3RvcnkoZ2V0Tm9kZSgpKTsKLSAgICAgICAgICAgIGZpbmFsIFZlcnNpb25JdGVyYXRvciB2ZXJzaW9ucyA9IHZlcnNpb25IaXN0b3J5LmdldEFsbExpbmVhclZlcnNpb25zKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8SmNyVmVyc2lvbj4oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb25zLmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgSmNyVmVyc2lvbiBuZXh0KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpjclZlcnNpb24oZ2V0Tm9kZSgpLCB2ZXJzaW9ucy5uZXh0VmVyc2lvbigpLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUhhbmRsZXJNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoYm9vbGVhbiBhbGxWZXJzaW9ucywgYm9vbGVhbiBpc1B3YykgewotICAgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobm9kZS5pc0NoZWNrZWRPdXQoKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1B3YykgewotICAgICAgICAgICAgICAgICAgICBjYW5jZWxDaGVja291dChub2RlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24oIkNhbm5vdCBkZWxldGUgY2hlY2tlZCBvdXQgZG9jdW1lbnQ6ICIgKyBnZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFZlcnNpb25zKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tvdXQobm9kZSk7Ci0gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBub2RlLmdldFNlc3Npb24oKS5zYXZlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSBhIHNpbmdsZSB2ZXJzaW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNy4xIGNoZWNrT3V0Ci0gICAgICogCi0gICAgICogQHRocm93cyBDbWlzUnVudGltZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBKY3JQcml2YXRlV29ya2luZ0NvcHkgY2hlY2tvdXQoKSB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IGdldE5vZGUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChub2RlLmlzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJEb2N1bWVudCBpcyBhbHJlYWR5IGNoZWNrZWQgb3V0ICIgKyBnZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2hlY2tvdXQobm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UHdjKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNy4zIGNoZWNrZWRJbgotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc1J1bnRpbWVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSmNyVmVyc2lvbiBjaGVja2luKFByb3BlcnRpZXMgcHJvcGVydGllcywgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hlY2tpbkNvbW1lbnQpIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIW5vZGUuaXNDaGVja2VkT3V0KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1N0b3JhZ2VFeGNlcHRpb24oIk5vdCBjaGVja2VkIG91dDogIiArIGdldElkKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmdldFByb3BlcnR5TGlzdCgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRDb250ZW50U3RyZWFtKGNvbnRlbnRTdHJlYW0sIHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0b2RvIGhhbmRsZSBjaGVja2luQ29tbWVudAotICAgICAgICAgICAgY2hlY2tpbihub2RlKTsKLSAgICAgICAgICAgIHJldHVybiAoSmNyVmVyc2lvbikgY3JlYXRlKG5vZGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjcuMiBjYW5jZWxDaGVja291dAotICAgICAqIAotICAgICAqIEB0aHJvd3MgQ21pc1J1bnRpbWVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja291dCgpIHsKLSAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2FuY2VsQ2hlY2tvdXQobm9kZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByaXZhdGUgd29ya2luZyBjb3B5IG9mIHRoZSB2ZXJzaW9ucyBzZXJpZXMgb3IgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICogaWYgbm90IGNoZWNrZWQgb3V0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSB7QGxpbmsgSmNyUHJpdmF0ZVdvcmtpbmdDb3B5fSBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgbm90IGNoZWNrZWQgb3V0Ci0gICAgICogQHRocm93cyBDbWlzUnVudGltZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBKY3JQcml2YXRlV29ya2luZ0NvcHkgZ2V0UHdjKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotICAgICAgICAgICAgaWYgKG5vZGUuaXNDaGVja2VkT3V0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpjclByaXZhdGVXb3JraW5nQ29weShnZXROb2RlKCksIHR5cGVNYW5hZ2VyLCBwYXRoTWFuYWdlciwgdHlwZUhhbmRsZXJNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiTm90IGNoZWNrZWQgb3V0IGRvY3VtZW50IGhhcyBubyBwcml2YXRlIHdvcmtpbmcgY29weSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3BlY2lmaWMgdmVyc2lvbiBieSBuYW1lCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHZlcnNpb24gdG8gZ2V0Ci0gICAgICogQHJldHVybiBhIHtAbGluayBKY3JWZXJzaW9ufSBpbnN0YW5jZSBmb3IgPGNvZGU+bmFtZTwvY29kZT4KLSAgICAgKiBAdGhyb3dzIENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGEgdmVyc2lvbiA8Y29kZT5uYW1lPC9jb2RlPiBkb2VzIG5vdCBleGlzdAotICAgICAqIEB0aHJvd3MgQ21pc1J1bnRpbWVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgSmNyVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0gICAgICAgICAgICBWZXJzaW9uSGlzdG9yeSB2ZXJzaW9uSGlzdG9yeSA9IGdldFZlcnNpb25IaXN0b3J5KG5vZGUpOwotICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gdmVyc2lvbkhpc3RvcnkuZ2V0VmVyc2lvbihuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmNyVmVyc2lvbihub2RlLCB2ZXJzaW9uLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkUmVwb3NpdG9yeU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFZlcnNpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcm90ZWN0ZWQgPi0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBJZCBvZiB0aGUgdmVyc2lvbiByZXByZXNlbnRpbmcgdGhlIGJhc2Ugb2YgdGhpcyB2ZXJzaW9ucyBzZXJpZXMKLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VOb2RlSWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIFZlcnNpb24gYmFzZVZlcnNpb24gPSBnZXRCYXNlVmVyc2lvbihnZXROb2RlKCkpOwotICAgICAgICBKY3JOb2RlIGJhc2VOb2RlID0gbmV3IEpjclZlcnNpb24oZ2V0Tm9kZSgpLCBiYXNlVmVyc2lvbiwgdHlwZU1hbmFnZXIsIHBhdGhNYW5hZ2VyLCB0eXBlSGFuZGxlck1hbmFnZXIpOwotICAgICAgICByZXR1cm4gYmFzZU5vZGUuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIElkIG9mIHRoZSBwcml2YXRlIHdvcmtpbmcgY29weSBvZiB0aGlzIHZlcnNpb24gc2VyaWVzCi0gICAgICogQHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQd2NJZCgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGlsZVByb3BlcnRpZXMoUHJvcGVydGllc0ltcGwgcHJvcGVydGllcywgU2V0PFN0cmluZz4gZmlsdGVyLCBPYmplY3RJbmZvSW1wbCBvYmplY3RJbmZvKQotICAgICAgICAgICAgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotCi0gICAgICAgIHN1cGVyLmNvbXBpbGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIGZpbHRlciwgb2JqZWN0SW5mbyk7Ci0KLSAgICAgICAgb2JqZWN0SW5mby5zZXRXb3JraW5nQ29weU9yaWdpbmFsSWQoZ2V0QmFzZU5vZGVJZCgpKTsKLSAgICAgICAgb2JqZWN0SW5mby5zZXRXb3JraW5nQ29weUlkKGdldFB3Y0lkKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTZXQ8QWN0aW9uPiBjb21waWxlQWxsb3dhYmxlQWN0aW9ucyhTZXQ8QWN0aW9uPiBhYXMpIHsKLSAgICAgICAgU2V0PEFjdGlvbj4gcmVzdWx0ID0gc3VwZXIuY29tcGlsZUFsbG93YWJsZUFjdGlvbnMoYWFzKTsKLSAgICAgICAgc2V0QWN0aW9uKHJlc3VsdCwgQWN0aW9uLkNBTl9HRVRfQUxMX1ZFUlNJT05TLCB0cnVlKTsKLSAgICAgICAgc2V0QWN0aW9uKHJlc3VsdCwgQWN0aW9uLkNBTl9DSEVDS19PVVQsIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0NBTkNFTF9DSEVDS19PVVQsIHRydWUpOwotICAgICAgICBzZXRBY3Rpb24ocmVzdWx0LCBBY3Rpb24uQ0FOX0NIRUNLX0lOLCB0cnVlKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVJZEludGVybmFsKCkgewotICAgICAgICByZXR1cm4gSmNyVHlwZU1hbmFnZXIuRE9DVU1FTlRfVFlQRV9JRDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NoZWNrZWRPdXQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXROb2RlKCkuaXNDaGVja2VkT3V0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDaGVja2VkT3V0SWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBpc0NoZWNrZWRPdXQoKSA/IGdldFZlcnNpb25TZXJpZXNJZCgpICsgIi9wd2MiIDogbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENoZWNrZWRPdXRCeSgpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGlzQ2hlY2tlZE91dCgpID8gZ2V0Tm9kZSgpLmdldFNlc3Npb24oKS5nZXRVc2VySUQoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcml2YXRlID4tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tvdXQoTm9kZSBub2RlKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFZlcnNpb25NYW5hZ2VyKG5vZGUpLmNoZWNrb3V0KG5vZGUuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNraW4oTm9kZSBub2RlKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFZlcnNpb25NYW5hZ2VyKG5vZGUpLmNoZWNraW4obm9kZS5nZXRQYXRoKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2FuY2VsQ2hlY2tvdXQoTm9kZSBub2RlKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgIFZlcnNpb24gYmFzZSA9IGdldEJhc2VWZXJzaW9uKG5vZGUpOwotICAgICAgICBnZXRWZXJzaW9uTWFuYWdlcihub2RlKS5yZXN0b3JlKGJhc2UsIHRydWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9QYXRoTWFuYWdlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9QYXRoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGU2ODAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvUGF0aE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjcjsKLQotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgbWFwcGluZyBKQ1IgcGF0aHMgdG8gQ01JUyBwYXRocwotICovCi1wdWJsaWMgY2xhc3MgUGF0aE1hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQYXRoTWFuYWdlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSByb290IGZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNSVNfUk9PVF9JRCA9ICJbcm9vdF0iOwotCi0gICAgLyoqCi0gICAgICogUm9vdCBwYXRoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ01JU19ST09UX1BBVEggPSAiLyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBqY3JSb290UGF0aDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyA8Y29kZT5QYXRoTWFuYWdlcjwvY29kZT4gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBKQ1Igcm9vdAotICAgICAqIHBhdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIGpjclJvb3RQYXRoCi0gICAgICovCi0gICAgcHVibGljIFBhdGhNYW5hZ2VyKFN0cmluZyBqY3JSb290UGF0aCkgewotICAgICAgICB0aGlzLmpjclJvb3RQYXRoID0gbm9ybWFsaXplKGpjclJvb3RQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBKQ1Igcm9vdCBwYXRoCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKY3JSb290UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGpjclJvb3RQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciBhIEpDUiA8Y29kZT5Ob2RlPC9jb2RlPiBpcyB0aGUgcm9vdCBub2RlIHdydC4gdG8gdGhpcwotICAgICAqIDxjb2RlPlBhdGhNYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZS4gVGhhdCBpcywgd2hldGhlciB0aGUgcGF0aCBvZiB0aGUgbm9kZQotICAgICAqIGlzIGVxdWFsIHRvIHRoaXMgaW5zdGFuY2UncyBKQ1Igcm9vdCBwYXRoLgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgPGNvZGU+bm9kZTwvY29kZT4gaXMgdGhlIHJvb3Qgbm9kZSB3cnQuIHRvCi0gICAgICogICAgICAgICB0aGlzIDxjb2RlPlBhdGhNYW5hZ2VyPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoTm9kZSBub2RlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXRoKCkuZXF1YWxzKGpjclJvb3RQYXRoKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB0aGUgQ01JUyBwYXRoIGdpdmVuIGEgSkNSIDxjb2RlPk5vZGU8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBub2RlCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgd2hlbiA8Y29kZT5ub2RlPC9jb2RlPiBpcyBub3QgcGFydCBvZiB0aGUgaGllcmFyY2h5Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRoKE5vZGUgbm9kZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGpjclJvb3RQYXRoLmxlbmd0aCgpID4gbm9kZS5nZXRQYXRoKCkubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb2RlIGlzIG5vdCBwYXJ0IG9mIHRoZSBoaWVyYXJjaHk6ICIgKyBub2RlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbm9kZS5nZXRQYXRoKCkuc3Vic3RyaW5nKGpjclJvb3RQYXRoLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIHJldHVybiBwYXRoLnN0YXJ0c1dpdGgoIi8iKSA/IHBhdGggOiAnLycgKyBwYXRoOwotICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNtaXNQYXRoCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZmYgPGNvZGU+Y21pc1BhdGg8L2NvZGU+IGVxdWFscwotICAgICAqICAgICAgICAge0BsaW5rIFBhdGhNYW5hZ2VyI0NNSVNfUk9PVF9QQVRIfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3QoU3RyaW5nIGNtaXNQYXRoKSB7Ci0gICAgICAgIHJldHVybiBDTUlTX1JPT1RfUEFUSC5lcXVhbHMoY21pc1BhdGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbWlzUGF0aAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIDxjb2RlPmNtaXNQYXRoPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fic29sdXRlKFN0cmluZyBjbWlzUGF0aCkgewotICAgICAgICByZXR1cm4gY21pc1BhdGguc3RhcnRzV2l0aChDTUlTX1JPT1RfUEFUSCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQ01JUyBwYXRoIGZyb20gYSBwYXJlbnQgcGF0aCBhbmQgYSBjaGlsZCBlbGVtZW50Ci0gICAgICogCi0gICAgICogQHBhcmFtIGNtaXNQYXRoCi0gICAgICogICAgICAgICAgICBwYXJlbnQgcGF0aAotICAgICAqIEBwYXJhbSBjaGlsZAotICAgICAqICAgICAgICAgICAgY2hpbGQgZWxlbWVudAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDbWlzUGF0aChTdHJpbmcgY21pc1BhdGgsIFN0cmluZyBjaGlsZCkgewotICAgICAgICByZXR1cm4gY21pc1BhdGgubGVuZ3RoKCkgPiAwICYmIGNtaXNQYXRoLmNoYXJBdChjbWlzUGF0aC5sZW5ndGgoKSAtIDEpID09ICcvJyA/IGNtaXNQYXRoICsgY2hpbGQgOiBjbWlzUGF0aAotICAgICAgICAgICAgICAgICsgJy8nICsgY2hpbGQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsYXRpdml6ZSBhbiBDTUlTIHBhdGggd3J0LiB0byBhIHByZWZpeC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogQHBhcmFtIGNtaXNQYXRoCi0gICAgICogQHJldHVybiBhIHN0cmluZyA8Y29kZT5yPC9jb2RlPiBzdWNoIHRoYXQgPGNvZGU+cHJlZml4PC9jb2RlPiArCi0gICAgICogICAgICAgICA8Y29kZT5yPC9jb2RlPiA9IDxjb2RlPmNtaXNQYXRoPC9jb2RlPgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+cHJlZml4PC9jb2RlPiBpcyBub3QgYSBwcmVmaXggb2YKLSAgICAgKiAgICAgICAgICAgICA8Y29kZT5jbWlzUGF0aDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWxhdGl2aXplKFN0cmluZyBwcmVmaXgsIFN0cmluZyBjbWlzUGF0aCkgewotICAgICAgICBpZiAoY21pc1BhdGguc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY21pc1BhdGguc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByZWZpeCArICIgaXMgbm90IGEgcHJlZml4IG9mICIgKyBjbWlzUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByaXZhdGUgPi0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgewotICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuICIvIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJSb290IHBhdGggbXVzdCBiZSBhYnNvbHV0ZS4gR290OiAiICsgcGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAocGF0aC5sZW5ndGgoKSA+IDEgJiYgcGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvUHJvcGVydHlIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvUHJvcGVydHlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZGJiMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL1Byb3BlcnR5SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5U3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlCb29sZWFuSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlEYXRlVGltZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SHRtbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5SWRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eVN0cmluZ0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5VXJpSW1wbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3Mgd2l0aCB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcge0BsaW5rIFByb3BlcnRpZXN9LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlIZWxwZXIgewotICAgIHByaXZhdGUgUHJvcGVydHlIZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYSBzdHJpbmcgdmFsdWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHZhbHVlIHRvIHJldHJpZXZlCi0gICAgICogQHJldHVybiB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIGdpdmVuIDxjb2RlPm5hbWU8L2NvZGU+IG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBlaXRoZXIgdGhlc2UgYXJlIG5vIHN0cmluZyBwcm9wZXJ0aWVzIG9yIG5vCi0gICAgICogICAgICAgICBwcm9wZXJ0eSBvZiA8Y29kZT5uYW1lPC9jb2RlPiBleGlzdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nUHJvcGVydHkoUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBQcm9wZXJ0eURhdGE8Pz4gcHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQobmFtZSk7Ci0gICAgICAgIGlmICghKHByb3BlcnR5IGluc3RhbmNlb2YgUHJvcGVydHlTdHJpbmcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoKFByb3BlcnR5U3RyaW5nKSBwcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgaWQgZnJvbSBhIHNldCBvZiBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVJZChQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgUHJvcGVydHlEYXRhPD8+IHR5cGVQcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk7Ci0gICAgICAgIGlmICghKHR5cGVQcm9wZXJ0eSBpbnN0YW5jZW9mIFByb3BlcnR5SWQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBpZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0eXBlSWQgPSAoKFByb3BlcnR5SWQpIHR5cGVQcm9wZXJ0eSkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICBpZiAodHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIGlkIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHR5cGVJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvcAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIDxjb2RlPnByb3A8L2NvZGU+IGRlbm90ZXMgYW4gZW1wdHkgcHJvcGVydHkKLSAgICAgKiAgICAgICAgIGRhdGEgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVtcHR5KFByb3BlcnR5RGF0YTw/PiBwcm9wKSB7Ci0gICAgICAgIHJldHVybiBwcm9wID09IG51bGwgfHwgcHJvcC5nZXRWYWx1ZXMoKSA9PSBudWxsIHx8IHByb3AuZ2V0VmFsdWVzKCkuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB0aGUgZGVmYXVsdCBwcm9wZXJ0eSBkYXRhIHZhbHVlIGZvciBhIGdpdmVuIHByb3BlcnR5Ci0gICAgICogZGVmaW5pdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcERlZgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIENtaXNSdW50aW1lRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgaWYgPGNvZGU+cHJvcERlZjwvY29kZT4gaXMgaW52YWxpZCBvciB1bmtub3duLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlEYXRhPD8+IGdldERlZmF1bHRWYWx1ZShQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZikgewotICAgICAgICBpZiAocHJvcERlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Pz4gZGVmYXVsdFZhbHVlID0gcHJvcERlZi5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmICFkZWZhdWx0VmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5Qm9vbGVhbkltcGwocHJvcERlZi5nZXRJZCgpLCAoTGlzdDxCb29sZWFuPikgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eURhdGVUaW1lSW1wbChwcm9wRGVmLmdldElkKCksIChMaXN0PEdyZWdvcmlhbkNhbGVuZGFyPikgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5RGVjaW1hbEltcGwocHJvcERlZi5nZXRJZCgpLCAoTGlzdDxCaWdEZWNpbWFsPikgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgSFRNTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SHRtbEltcGwocHJvcERlZi5nZXRJZCgpLCAoTGlzdDxTdHJpbmc+KSBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgY2FzZSBJRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SWRJbXBsKHByb3BEZWYuZ2V0SWQoKSwgKExpc3Q8U3RyaW5nPikgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5SW50ZWdlckltcGwocHJvcERlZi5nZXRJZCgpLCAoTGlzdDxCaWdJbnRlZ2VyPikgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlTdHJpbmdJbXBsKHByb3BEZWYuZ2V0SWQoKSwgKExpc3Q8U3RyaW5nPikgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlVcmlJbXBsKHByb3BEZWYuZ2V0SWQoKSwgKExpc3Q8U3RyaW5nPikgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGRhdGF0eXBlOiAiICsgcHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL2ltcGwvQWJzdHJhY3RKY3JUeXBlSGFuZGxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0Fic3RyYWN0SmNyVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0ZGEwZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL2ltcGwvQWJzdHJhY3RKY3JUeXBlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLkpjclR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5QYXRoTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudHlwZS5KY3JUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudHlwZS5KY3JUeXBlSGFuZGxlck1hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyB0YWtlcyBjYXJlIG9mIGNvbGxlY3RpbmcgcmVmZXJlbmNlcyBzZXQgd2hlbiB0aGUgaGFuZGxlcgotICogaXMgYWRkZWQgdG8ge0BsaW5rIEpjclR5cGVIYW5kbGVyTWFuYWdlcn0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpjclR5cGVIYW5kbGVyIGltcGxlbWVudHMgSmNyVHlwZUhhbmRsZXIgewotCi0gICAgcHJvdGVjdGVkIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyOwotICAgIHByb3RlY3RlZCBQYXRoTWFuYWdlciBwYXRoTWFuYWdlcjsKLSAgICBwcm90ZWN0ZWQgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoUGF0aE1hbmFnZXIgcGF0aE1hbmFnZXIsIEpjclR5cGVNYW5hZ2VyIHR5cGVNYW5hZ2VyLCBKY3JUeXBlSGFuZGxlck1hbmFnZXIgdHlwZUhhbmRsZXJNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMudHlwZU1hbmFnZXIgPSB0eXBlTWFuYWdlcjsKLSAgICAgICAgdGhpcy5wYXRoTWFuYWdlciA9IHBhdGhNYW5hZ2VyOwotICAgICAgICB0aGlzLnR5cGVIYW5kbGVyTWFuYWdlciA9IHR5cGVIYW5kbGVyTWFuYWdlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL2ltcGwvRGVmYXVsdERvY3VtZW50SWRlbnRpZmllck1hcC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHREb2N1bWVudElkZW50aWZpZXJNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlZTQyYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL2ltcGwvRGVmYXVsdERvY3VtZW50SWRlbnRpZmllck1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLQotLyoqCi0gKiBQcm92aWRlcyBtYXBwaW5ncyB0byBzdGFuZGFyZCBqY3IgcHJvcGVydGllcyBmb3IgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdERvY3VtZW50SWRlbnRpZmllck1hcCBleHRlbmRzIERlZmF1bHRJZGVudGlmaWVyTWFwQmFzZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNWZXJzaW9uYWJsZTsKLQotICAgIHB1YmxpYyBEZWZhdWx0RG9jdW1lbnRJZGVudGlmaWVyTWFwKGJvb2xlYW4gaXNWZXJzaW9uYWJsZSkgewotICAgICAgICBzdXBlcigibnQ6ZmlsZSIpOwotICAgICAgICB0aGlzLmlzVmVyc2lvbmFibGUgPSBpc1ZlcnNpb25hYmxlOwotICAgICAgICBjbWlzMkpjci5wdXQoUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSwgImpjcjpjb250ZW50L0BqY3I6Y3JlYXRlZEJ5Iik7Ci0gICAgICAgIGNtaXMySmNyLnB1dChQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLCAiamNyOmNvbnRlbnQvQGpjcjpjcmVhdGVkIik7Ci0gICAgICAgIGNtaXMySmNyLnB1dChQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUVEX0JZLCAiamNyOmNvbnRlbnQvQGpjcjpsYXN0TW9kaWZpZWRCeSIpOwotICAgICAgICBjbWlzMkpjci5wdXQoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURSwgImpjcjpjb250ZW50L0BqY3I6bGFzdE1vZGlmaWVkIik7Ci0gICAgICAgIGNtaXMySmNyLnB1dChQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUsICJqY3I6Y29udGVudC9AamNyOm1pbWVUeXBlIik7Ci0gICAgICAgIGNtaXMySmNyLnB1dChQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUsICJmbjpuYW1lKCkiKTsKLSAgICAgICAgLy8geHh4IG5vdCBzdXBwb3J0ZWQ6IElTX0lNTVVUQUJMRSwgSVNfTEFURVNUX1ZFUlNJT04sIElTX01BSk9SX1ZFUlNJT04sIElTX0xBVEVTVF9NQUpPUl9WRVJTSU9OLAotICAgICAgICAvLyBWRVJTSU9OX0xBQkVMLCBWRVJTSU9OX1NFUklFU19JRCwgSVNfVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVQsIFZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lECi0gICAgICAgIC8vIFZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0JZLCBDSEVDS0lOX0NPTU1FTlQsIENPTlRFTlRfU1RSRUFNX0lELCBDT05URU5UX1NUUkVBTV9MRU5HVEgKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGpjclR5cGVDb25kaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoaXNWZXJzaW9uYWJsZSA/ICIiIDogIm5vdCIpICsgIihAamNyOm1peGluVHlwZXMgPSAnbWl4OnNpbXBsZVZlcnNpb25hYmxlJykiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvaW1wbC9EZWZhdWx0RG9jdW1lbnRUeXBlSGFuZGxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHREb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDdmNTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHREb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5qY3IuQmluYXJ5OwotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotaW1wb3J0IGphdmF4Lmpjci5Qcm9wZXJ0eTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5qY3Iubm9kZXR5cGUuTm9kZVR5cGU7Ci1pbXBvcnQgamF2YXguamNyLnZlcnNpb24uVmVyc2lvbjsKLWltcG9ydCBqYXZheC5qY3IudmVyc2lvbi5WZXJzaW9uTWFuYWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ29udGVudFN0cmVhbUFsbG93ZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNTdG9yYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyQmluYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyVmVyc2lvbkJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnF1ZXJ5LklkZW50aWZpZXJNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogVHlwZSBoYW5kbGVyIHRoYXQgcHJvdmlkZXMgY21pczpkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHREb2N1bWVudFR5cGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RKY3JUeXBlSGFuZGxlciBpbXBsZW1lbnRzIEpjckRvY3VtZW50VHlwZUhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpjckZvbGRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbigpIHsKLSAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgZG9jdW1lbnRUeXBlID0gbmV3IERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRCYXNlVHlwZUlkKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc0NvbnRyb2xsYWJsZUFjbChmYWxzZSk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc0NvbnRyb2xsYWJsZVBvbGljeShmYWxzZSk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc0NyZWF0YWJsZSh0cnVlKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldERlc2NyaXB0aW9uKCJEb2N1bWVudCIpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0RGlzcGxheU5hbWUoIkRvY3VtZW50Iik7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc0ZpbGVhYmxlKHRydWUpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0SXNGdWxsdGV4dEluZGV4ZWQoZmFsc2UpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0SXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkodHJ1ZSk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRMb2NhbE5hbWUoIkRvY3VtZW50Iik7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRMb2NhbE5hbWVzcGFjZShKY3JUeXBlTWFuYWdlci5OQU1FU1BBQ0UpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0SXNRdWVyeWFibGUodHJ1ZSk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRRdWVyeU5hbWUoSmNyVHlwZU1hbmFnZXIuRE9DVU1FTlRfVFlQRV9JRCk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJZChKY3JUeXBlTWFuYWdlci5ET0NVTUVOVF9UWVBFX0lEKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldElzVmVyc2lvbmFibGUodHJ1ZSk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChDb250ZW50U3RyZWFtQWxsb3dlZC5BTExPV0VEKTsKLQotICAgICAgICBKY3JUeXBlTWFuYWdlci5hZGRCYXNlUHJvcGVydHlEZWZpbml0aW9ucyhkb2N1bWVudFR5cGUpOwotICAgICAgICBKY3JUeXBlTWFuYWdlci5hZGREb2N1bWVudFByb3BlcnR5RGVmaW5pdGlvbnMoZG9jdW1lbnRUeXBlKTsKLQotICAgICAgICByZXR1cm4gZG9jdW1lbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBJZGVudGlmaWVyTWFwIGdldElkZW50aWZpZXJNYXAoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdERvY3VtZW50SWRlbnRpZmllck1hcCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmNyRG9jdW1lbnQgZ2V0SmNyTm9kZShOb2RlIG5vZGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgVmVyc2lvbk1hbmFnZXIgdmVyc2lvbk1hbmFnZXIgPSBub2RlLmdldFNlc3Npb24oKS5nZXRXb3Jrc3BhY2UoKS5nZXRWZXJzaW9uTWFuYWdlcigpOwotICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSB2ZXJzaW9uTWFuYWdlci5nZXRCYXNlVmVyc2lvbihub2RlLmdldFBhdGgoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgSmNyVmVyc2lvbihub2RlLCB2ZXJzaW9uLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlKE5vZGUgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbm9kZS5pc05vZGVUeXBlKE5vZGVUeXBlLk5UX0ZJTEUpICYmIG5vZGUuaXNOb2RlVHlwZShzdXBwb3J0ZWRWZXJzaW9uaW5nVHlwZShub2RlKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzdXBwb3J0ZWRWZXJzaW9uaW5nVHlwZShOb2RlIG5vZGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFV0aWwuc3VwcG9ydE9wdGlvbihub2RlLCBSZXBvc2l0b3J5Lk9QVElPTl9TSU1QTEVfVkVSU0lPTklOR19TVVBQT1JURUQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTm9kZVR5cGUuTUlYX1NJTVBMRV9WRVJTSU9OQUJMRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChVdGlsLnN1cHBvcnRPcHRpb24obm9kZSwgUmVwb3NpdG9yeS5PUFRJT05fVkVSU0lPTklOR19TVVBQT1JURUQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTm9kZVR5cGUuTUlYX1ZFUlNJT05BQkxFOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlFeGNlcHRpb24oIlRoZSByZXBvc2l0b3J5IGRvZXMgbm90IHN1cHBvcnQgdmVyc2lvbmluZyEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmNyTm9kZSBjcmVhdGVEb2N1bWVudChKY3JGb2xkZXIgcGFyZW50Rm9sZGVyLCBTdHJpbmcgbmFtZSwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBOb2RlIGZpbGVOb2RlID0gcGFyZW50Rm9sZGVyLmdldE5vZGUoKS5hZGROb2RlKG5hbWUsIE5vZGVUeXBlLk5UX0ZJTEUpOwotICAgICAgICAgICAgYWRkRmlsZU5vZGVNaXhpbnMoZmlsZU5vZGUsIHZlcnNpb25pbmdTdGF0ZSk7Ci0gICAgICAgICAgICBOb2RlIGNvbnRlbnROb2RlID0gZmlsZU5vZGUuYWRkTm9kZShOb2RlLkpDUl9DT05URU5ULCBOb2RlVHlwZS5OVF9SRVNPVVJDRSk7Ci0gICAgICAgICAgICBhZGRDb250ZW50Tm9kZU1peGlucyhjb250ZW50Tm9kZSk7Ci0gICAgICAgICAgICAvLyBjb21waWxlIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBzZXRDb250ZW50Tm9kZVByb3BlcnRpZXMoY29udGVudE5vZGUsIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgLy8gd3JpdGUgY29udGVudCwgaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICB1cGRhdGVDb250ZW50Tm9kZShjb250ZW50U3RyZWFtLCBjb250ZW50Tm9kZSk7Ci0gICAgICAgICAgICAvLyBzYXZlIGNoYW5nZXMKLSAgICAgICAgICAgIGZpbGVOb2RlLmdldFNlc3Npb24oKS5zYXZlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SmNyTm9kZShmaWxlTm9kZSwgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNTdG9yYWdlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzU3RvcmFnZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSmNyTm9kZSBnZXRKY3JOb2RlKE5vZGUgZmlsZU5vZGUsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgSmNyTm9kZSBqY3JGaWxlTm9kZSA9IGdldEpjck5vZGUoZmlsZU5vZGUpOwotICAgICAgICBpZiAodmVyc2lvbmluZ1N0YXRlID09IFZlcnNpb25pbmdTdGF0ZS5OT05FKSB7Ci0gICAgICAgICAgICByZXR1cm4gamNyRmlsZU5vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBKY3JWZXJzaW9uQmFzZSBqY3JWZXJzaW9uID0gamNyRmlsZU5vZGUuYXNWZXJzaW9uKCk7Ci0gICAgICAgIGlmICh2ZXJzaW9uaW5nU3RhdGUgPT0gVmVyc2lvbmluZ1N0YXRlLk1JTk9SIHx8IHZlcnNpb25pbmdTdGF0ZSA9PSBWZXJzaW9uaW5nU3RhdGUuTUFKT1IpIHsKLSAgICAgICAgICAgIHJldHVybiBqY3JWZXJzaW9uLmNoZWNraW4obnVsbCwgbnVsbCwgImF1dG8gY2hlY2tpbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGpjclZlcnNpb24uZ2V0UHdjKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZW50Tm9kZShDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIE5vZGUgY29udGVudE5vZGUpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBCaW5hcnkgYmluYXJ5ID0gY29udGVudFN0cmVhbSA9PSBudWxsIHx8IGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCkgPT0gbnVsbCA/IEpjckJpbmFyeS5FTVBUWSA6IG5ldyBKY3JCaW5hcnkoCi0gICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGVudE5vZGUuc2V0UHJvcGVydHkoUHJvcGVydHkuSkNSX0RBVEEsIGJpbmFyeSk7Ci0gICAgICAgICAgICBpZiAoY29udGVudFN0cmVhbSAhPSBudWxsICYmIGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudE5vZGUuc2V0UHJvcGVydHkoUHJvcGVydHkuSkNSX01JTUVUWVBFLCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgYmluYXJ5LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldENvbnRlbnROb2RlUHJvcGVydGllcyhOb2RlIGNvbnRlbnROb2RlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgSmNyRm9sZGVyLnNldFByb3BlcnRpZXMoY29udGVudE5vZGUsIGdldFR5cGVEZWZpbml0aW9uKCksIHByb3BlcnRpZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnROb2RlTWl4aW5zKE5vZGUgY29udGVudE5vZGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgY29udGVudE5vZGUuYWRkTWl4aW4oTm9kZVR5cGUuTUlYX0NSRUFURUQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpbGVOb2RlTWl4aW5zKE5vZGUgZmlsZU5vZGUsIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZlcnNpb25pbmdTdGF0ZSAhPSBWZXJzaW9uaW5nU3RhdGUuTk9ORSkgewotICAgICAgICAgICAgZmlsZU5vZGUuYWRkTWl4aW4oc3VwcG9ydGVkVmVyc2lvbmluZ1R5cGUoZmlsZU5vZGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHRGb2xkZXJUeXBlSGFuZGxlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHRGb2xkZXJUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFmM2RhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvaW1wbC9EZWZhdWx0Rm9sZGVyVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLmltcGw7Ci0KLWltcG9ydCBqYXZheC5qY3IuTm9kZTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5qY3Iubm9kZXR5cGUuTm9kZVR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkZvbGRlclR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IucXVlcnkuSWRlbnRpZmllck1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudHlwZS5KY3JGb2xkZXJUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIFR5cGUgaGFuZGxlciB0aGF0IHByb3ZpZGVzIGNtaXM6Zm9sZGVyLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZvbGRlclR5cGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RKY3JUeXBlSGFuZGxlciBpbXBsZW1lbnRzIEpjckZvbGRlclR5cGVIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEZWZhdWx0Rm9sZGVyVHlwZUhhbmRsZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9sZGVySWRlbnRpZmllck1hcCBleHRlbmRzIERlZmF1bHRJZGVudGlmaWVyTWFwQmFzZSB7Ci0KLSAgICAgICAgcHVibGljIEZvbGRlcklkZW50aWZpZXJNYXAoKSB7Ci0gICAgICAgICAgICBzdXBlcigibnQ6Zm9sZGVyIik7Ci0gICAgICAgICAgICAvLyB4eHggbm90IHN1cHBvcnRlZDogUEFSRU5UX0lELCBBTExPV0VEX0NISUxEX09CSkVDVF9UWVBFX0lEUywgUEFUSAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKSB7Ci0gICAgICAgIHJldHVybiBCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCkgewotICAgICAgICBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwgZm9sZGVyVHlwZSA9IG5ldyBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRCYXNlVHlwZUlkKEJhc2VUeXBlSWQuQ01JU19GT0xERVIpOwotICAgICAgICBmb2xkZXJUeXBlLnNldElzQ29udHJvbGxhYmxlQWNsKGZhbHNlKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRJc0NvbnRyb2xsYWJsZVBvbGljeShmYWxzZSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0SXNDcmVhdGFibGUodHJ1ZSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0RGVzY3JpcHRpb24oIkZvbGRlciIpOwotICAgICAgICBmb2xkZXJUeXBlLnNldERpc3BsYXlOYW1lKCJGb2xkZXIiKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRJc0ZpbGVhYmxlKHRydWUpOwotICAgICAgICBmb2xkZXJUeXBlLnNldElzRnVsbHRleHRJbmRleGVkKGZhbHNlKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSh0cnVlKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRMb2NhbE5hbWUoIkZvbGRlciIpOwotICAgICAgICBmb2xkZXJUeXBlLnNldExvY2FsTmFtZXNwYWNlKEpjclR5cGVNYW5hZ2VyLk5BTUVTUEFDRSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0SXNRdWVyeWFibGUodHJ1ZSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0UXVlcnlOYW1lKEpjclR5cGVNYW5hZ2VyLkZPTERFUl9UWVBFX0lEKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRJZChKY3JUeXBlTWFuYWdlci5GT0xERVJfVFlQRV9JRCk7Ci0KLSAgICAgICAgSmNyVHlwZU1hbmFnZXIuYWRkQmFzZVByb3BlcnR5RGVmaW5pdGlvbnMoZm9sZGVyVHlwZSk7Ci0gICAgICAgIEpjclR5cGVNYW5hZ2VyLmFkZEZvbGRlclByb3BlcnR5RGVmaW5pdGlvbnMoZm9sZGVyVHlwZSk7Ci0KLSAgICAgICAgcmV0dXJuIGZvbGRlclR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIElkZW50aWZpZXJNYXAgZ2V0SWRlbnRpZmllck1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGb2xkZXJJZGVudGlmaWVyTWFwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEpjckZvbGRlciBnZXRKY3JOb2RlKE5vZGUgbm9kZSkgewotICAgICAgICByZXR1cm4gbmV3IEpjckZvbGRlcihub2RlLCB0eXBlTWFuYWdlciwgcGF0aE1hbmFnZXIsIHR5cGVIYW5kbGVyTWFuYWdlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlKE5vZGUgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbm9kZS5pc05vZGVUeXBlKE5vZGVUeXBlLk5UX0ZPTERFUikgfHwgbm9kZS5nZXREZXB0aCgpID09IDA7Ci0gICAgfQotCi0gICAgcHVibGljIEpjckZvbGRlciBjcmVhdGVGb2xkZXIoSmNyRm9sZGVyIHBhcmVudEZvbGRlciwgU3RyaW5nIG5hbWUsIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTm9kZSBub2RlID0gcGFyZW50Rm9sZGVyLmdldE5vZGUoKS5hZGROb2RlKG5hbWUsIE5vZGVUeXBlLk5UX0ZPTERFUik7Ci0gICAgICAgICAgICBhZGRNaXhpbnMobm9kZSk7Ci0gICAgICAgICAgICAvLyBjb21waWxlIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICB1cGRhdGVQcm9wZXJ0aWVzKG5vZGUsIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgLy8gc2F2ZSBjaGFuZ2VzCi0gICAgICAgICAgICBub2RlLmdldFNlc3Npb24oKS5zYXZlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0SmNyTm9kZShub2RlKTsKLSAgICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNTdG9yYWdlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb3BlcnRpZXMoTm9kZSBub2RlLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgSmNyRm9sZGVyLnNldFByb3BlcnRpZXMobm9kZSwgZ2V0VHlwZURlZmluaXRpb24oKSwgcHJvcGVydGllcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTWl4aW5zKE5vZGUgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICBub2RlLmFkZE1peGluKE5vZGVUeXBlLk1JWF9DUkVBVEVEKTsKLSAgICAgICAgbm9kZS5hZGRNaXhpbihOb2RlVHlwZS5NSVhfTEFTVF9NT0RJRklFRCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHRJZGVudGlmaWVyTWFwQmFzZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHRJZGVudGlmaWVyTWFwQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmUzYjQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvaW1wbC9EZWZhdWx0SWRlbnRpZmllck1hcEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnF1ZXJ5LklkZW50aWZpZXJNYXBCYXNlOwotCi0vKioKLSAqIFByb3ZpZGVzIG1hcHBpbmdzIHRvIHN0YW5kYXJkIGpjciBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdElkZW50aWZpZXJNYXBCYXNlIGV4dGVuZHMgSWRlbnRpZmllck1hcEJhc2UgewotCi0gICAgcHVibGljIERlZmF1bHRJZGVudGlmaWVyTWFwQmFzZShTdHJpbmcgamNyVHlwZU5hbWUpIHsKLSAgICAgICAgc3VwZXIoamNyVHlwZU5hbWUpOwotICAgICAgICBjbWlzMkpjci5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX0lELCAiQGpjcjp1dWlkIik7Ci0gICAgICAgIGNtaXMySmNyLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiZm46bmFtZSgpIik7Ci0gICAgICAgIGNtaXMySmNyLnB1dChQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZLCAiQGpjcjpjcmVhdGVkQnkiKTsKLSAgICAgICAgY21pczJKY3IucHV0KFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUsICJAamNyOmNyZWF0ZWQiKTsKLSAgICAgICAgY21pczJKY3IucHV0KFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJRURfQlksICJAamNyOmxhc3RNb2RpZmllZEJ5Iik7Ci0gICAgICAgIGNtaXMySmNyLnB1dChQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFLCAiQGpjcjpsYXN0TW9kaWZpZWQiKTsKLSAgICAgICAgLy8geHh4IG5vdCBzdXBwb3J0ZWQ6IEJBU0VfVFlQRV9JRCwgQ0hBTkdFX1RPS0VOCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHRVbnZlcnNpb25lZERvY3VtZW50VHlwZUhhbmRsZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvaW1wbC9EZWZhdWx0VW52ZXJzaW9uZWREb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ODc2NDguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9pbXBsL0RlZmF1bHRVbnZlcnNpb25lZERvY3VtZW50VHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuaW1wbDsKLQotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5ub2RldHlwZS5Ob2RlVHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Db250ZW50U3RyZWFtQWxsb3dlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLkpjckRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyVW52ZXJzaW9uZWREb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IucXVlcnkuSWRlbnRpZmllck1hcDsKLQotLyoqCi0gKiBUeXBlIGhhbmRsZXIgdGhhdCBwcm92aWRlcyBjbWlzOnVudmVyc2lvbmVkLWRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFVudmVyc2lvbmVkRG9jdW1lbnRUeXBlSGFuZGxlciBleHRlbmRzIERlZmF1bHREb2N1bWVudFR5cGVIYW5kbGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UX1VOVkVSU0lPTkVEX1RZUEVfSUQgPSAiY21pczp1bnZlcnNpb25lZC1kb2N1bWVudCI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UX1VOVkVSU0lPTkVEX1RZUEVfSUQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCkgewotCi0gICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsIHVudmVyc2lvbmVkRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgdW52ZXJzaW9uZWREb2N1bWVudC5pbml0aWFsaXplKHN1cGVyLmdldFR5cGVEZWZpbml0aW9uKCkpOwotCi0gICAgICAgIHVudmVyc2lvbmVkRG9jdW1lbnQuc2V0RGVzY3JpcHRpb24oIlVudmVyc2lvbmVkIGRvY3VtZW50Iik7Ci0gICAgICAgIHVudmVyc2lvbmVkRG9jdW1lbnQuc2V0RGlzcGxheU5hbWUoIlVudmVyc2lvbmVkIGRvY3VtZW50Iik7Ci0gICAgICAgIHVudmVyc2lvbmVkRG9jdW1lbnQuc2V0TG9jYWxOYW1lKCJVbnZlcnNpb25lZCBkb2N1bWVudCIpOwotICAgICAgICB1bnZlcnNpb25lZERvY3VtZW50LnNldElzUXVlcnlhYmxlKHRydWUpOwotICAgICAgICB1bnZlcnNpb25lZERvY3VtZW50LnNldFF1ZXJ5TmFtZShET0NVTUVOVF9VTlZFUlNJT05FRF9UWVBFX0lEKTsKLSAgICAgICAgdW52ZXJzaW9uZWREb2N1bWVudC5zZXRJZChET0NVTUVOVF9VTlZFUlNJT05FRF9UWVBFX0lEKTsKLSAgICAgICAgdW52ZXJzaW9uZWREb2N1bWVudC5zZXRQYXJlbnRUeXBlSWQoSmNyVHlwZU1hbmFnZXIuRE9DVU1FTlRfVFlQRV9JRCk7Ci0KLSAgICAgICAgdW52ZXJzaW9uZWREb2N1bWVudC5zZXRJc1ZlcnNpb25hYmxlKGZhbHNlKTsKLSAgICAgICAgdW52ZXJzaW9uZWREb2N1bWVudC5zZXRDb250ZW50U3RyZWFtQWxsb3dlZChDb250ZW50U3RyZWFtQWxsb3dlZC5BTExPV0VEKTsKLQotICAgICAgICBKY3JUeXBlTWFuYWdlci5hZGRCYXNlUHJvcGVydHlEZWZpbml0aW9ucyh1bnZlcnNpb25lZERvY3VtZW50KTsKLSAgICAgICAgSmNyVHlwZU1hbmFnZXIuYWRkRG9jdW1lbnRQcm9wZXJ0eURlZmluaXRpb25zKHVudmVyc2lvbmVkRG9jdW1lbnQpOwotCi0gICAgICAgIHJldHVybiB1bnZlcnNpb25lZERvY3VtZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJZGVudGlmaWVyTWFwIGdldElkZW50aWZpZXJNYXAoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdERvY3VtZW50SWRlbnRpZmllck1hcChmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlKE5vZGUgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbm9kZS5pc05vZGVUeXBlKE5vZGVUeXBlLk5UX0ZJTEUpICYmICFub2RlLmlzTm9kZVR5cGUoc3VwcG9ydGVkVmVyc2lvbmluZ1R5cGUobm9kZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBKY3JEb2N1bWVudCBnZXRKY3JOb2RlKE5vZGUgbm9kZSkgewotICAgICAgICByZXR1cm4gbmV3IEpjclVudmVyc2lvbmVkRG9jdW1lbnQobm9kZSwgdHlwZU1hbmFnZXIsIHBhdGhNYW5hZ2VyLCB0eXBlSGFuZGxlck1hbmFnZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvRXZhbHVhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L0V2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDE5YjJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvRXZhbHVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IucXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRXZhbHVhdG9yIGZvciBDTUlTIHF1ZXJ5IHBhcnNlIHRyZWVzLgotICoKLSAqIEBwYXJhbSA8VD4gIFRoZSByZXN1bHQgdHlwZSBvZiB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgcGFyc2UgdHJlZS4KLSAqIEBzZWUgUGFyc2VUcmVlV2Fsa2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXZhbHVhdG9yPFQ+IHsKLQotICAgIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5FdmFsdWF0b3I8L2NvZGU+LiAqLwotICAgIEV2YWx1YXRvcjxUPiBvcCgpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjTk9UfSBub2Rlcy4gKi8KLSAgICBUIG5vdChUIG9wKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI0FORH0gbm9kZXMuICovCi0gICAgVCBhbmQoVCBvcDEsIFQgb3AyKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI09SfSBub2Rlcy4gKi8KLSAgICBUIG9yKFQgb3AxLCBUIG9wMik7Ci0KLSAgICAvKiogSGFuZGxlIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUWxTdHJpY3RMZXhlciNFUX0gbm9kZXMuICovCi0gICAgVCBlcShUIG9wMSwgVCBvcDIpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjTkVRfSBub2Rlcy4gKi8KLSAgICBUIG5lcShUIG9wMSwgVCBvcDIpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjR1R9IG5vZGVzLiAqLwotICAgIFQgZ3QoVCBvcDEsIFQgb3AyKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI0dURVF9IG5vZGVzLiAqLwotICAgIFQgZ3RlcShUIG9wMSwgVCBvcDIpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjTFR9IG5vZGVzLiAqLwotICAgIFQgbHQoVCBvcDEsIFQgb3AyKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI0xURVF9IG5vZGVzLiAqLwotICAgIFQgbHRlcShUIG9wMSwgVCBvcDIpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjSU59IG5vZGVzLiAqLwotICAgIFQgaW4oVCBvcDEsIFQgb3AyKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI05PVF9JTn0gbm9kZXMuICovCi0gICAgVCBub3RJbihUIG9wMSwgVCBvcDIpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjSU5fQU5ZfSBub2Rlcy4gKi8KLSAgICBUIGluQW55KFQgb3AxLCBUIG9wMik7Ci0KLSAgICAvKiogSGFuZGxlIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUWxTdHJpY3RMZXhlciNOT1RfSU5fQU5ZfSBub2Rlcy4gKi8KLSAgICBUIG5vdEluQW55KFQgb3AxLCBUIG9wMik7Ci0KLSAgICAvKiogSGFuZGxlIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUWxTdHJpY3RMZXhlciNFUV9BTll9IG5vZGVzLiAqLwotICAgIFQgZXFBbnkoVCBvcDEsIFQgb3AyKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI0lTX05VTEx9IG5vZGVzLiAqLwotICAgIFQgaXNOdWxsKFQgb3ApOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjSVNfTk9UX05VTEx9IG5vZGVzLiAqLwotICAgIFQgbm90SXNOdWxsKFQgb3ApOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjTElLRX0gbm9kZXMuICovCi0gICAgVCBsaWtlKFQgb3AxLCBUIG9wMik7Ci0KLSAgICAvKiogSGFuZGxlIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUWxTdHJpY3RMZXhlciNOT1RfTElLRX0gbm9kZXMuICovCi0gICAgVCBub3RMaWtlKFQgb3AxLCBUIG9wMik7Ci0KLSAgICAvKiogSGFuZGxlIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUWxTdHJpY3RMZXhlciNDT05UQUlOU30gbm9kZXMuICovCi0gICAgVCBjb250YWlucyhUIG9wMSwgVCBvcDIpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjSU5fRk9MREVSfSBub2Rlcy4gKi8KLSAgICBUIGluRm9sZGVyKFQgb3AxLCBUIG9wMik7Ci0KLSAgICAvKiogSGFuZGxlIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUWxTdHJpY3RMZXhlciNJTl9UUkVFfSBub2Rlcy4gKi8KLSAgICBUIGluVHJlZShUIG9wMSwgVCBvcDIpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjSU5fTElTVH0gbm9kZXMuICovCi0gICAgVCBsaXN0KExpc3Q8VD4gb3BzKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI0JPT0xfTElUfSBub2Rlcy4gKi8KLSAgICBUIHZhbHVlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjTlVNX0xJVH0gbm9kZXMuICovCi0gICAgVCB2YWx1ZShkb3VibGUgdmFsdWUpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0TGV4ZXIjTlVNX0xJVH0gbm9kZXMuICovCi0gICAgVCB2YWx1ZShsb25nIHZhbHVlKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI1NUUklOR19MSVR9IG5vZGVzLiAqLwotICAgIFQgdmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI1RJTUVfTElUfSBub2Rlcy4gKi8KLSAgICBUIHZhbHVlKEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyI0NPTH0gbm9kZXMuICovCi0gICAgVCBjb2woU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuVGV4dFNlYXJjaExleGVyI1RFWFRfQU5EfS4gKi8KLSAgICBUIHRleHRBbmQoTGlzdDxUPiBvcHMpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuVGV4dFNlYXJjaExleGVyI1RFWFRfT1J9LiAqLwotICAgIFQgdGV4dE9yKExpc3Q8VD4gb3BzKTsKLQotICAgIC8qKiBIYW5kbGUge0BsaW5rIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlRleHRTZWFyY2hMZXhlciNURVhUX01JTlVTfS4gKi8KLSAgICBUIHRleHRNaW51cyhTdHJpbmcgdGV4dCk7Ci0KLSAgICAvKiogSGFuZGxlIHtAbGluayBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5UZXh0U2VhcmNoTGV4ZXIjVEVYVF9TRUFSQ0hfV09SRF9MSVR9LiAqLwotICAgIFQgdGV4dFdvcmQoU3RyaW5nIHdvcmQpOwotCi0gICAgLyoqIEhhbmRsZSB7QGxpbmsgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuVGV4dFNlYXJjaExleGVyI1RFWFRfU0VBUkNIX1BIUkFTRV9TVFJJTkdfTElUfS4gKi8KLSAgICBUIHRleHRQaHJhc2UoU3RyaW5nIHBocmFzZSk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L0V2YWx1YXRvckJhc2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvRXZhbHVhdG9yQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmEzMjAzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvRXZhbHVhdG9yQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnF1ZXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBiYXNlIGNsYXNzIGltcGxlbWVudHMgYWxsIG1ldGhvZHMgb2YgdGhlIHtAbGluayBFdmFsdWF0b3J9IGludGVyZmFjZQotICogYnkgdGhyb3dpbmcgYSB7QGxpbmsgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbn0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFdmFsdWF0b3JCYXNlPFQ+IGltcGxlbWVudHMgRXZhbHVhdG9yPFQ+IHsKLSAgICBwdWJsaWMgRXZhbHVhdG9yPFQ+IG9wKCkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIG5vdChUIG9wKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiBub3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBhbmQoVCBvcDEsIFQgb3AyKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiBhbmQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBvcihUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IG9yIik7Ci0gICAgfQotCi0gICAgcHVibGljIFQgZXEoVCBvcDEsIFQgb3AyKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiA9Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFQgbmVxKFQgb3AxLCBUIG9wMikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogIT0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBndChUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6ID4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBndGVxKFQgb3AxLCBUIG9wMikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogPj0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBsdChUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IDwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBsdGVxKFQgb3AxLCBUIG9wMikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogPD0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBpbihUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IGluIik7Ci0gICAgfQotCi0gICAgcHVibGljIFQgbm90SW4oVCBvcDEsIFQgb3AyKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiBub3QgaW4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBpbkFueShUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IGluIik7Ci0gICAgfQotCi0gICAgcHVibGljIFQgbm90SW5BbnkoVCBvcDEsIFQgb3AyKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiBub3QgaW4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBlcUFueShUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6ID0gQU5ZIik7Ci0gICAgfQotCi0gICAgcHVibGljIFQgaXNOdWxsKFQgb3ApIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IGlzIG51bGwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBub3RJc051bGwoVCBvcCkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogaXMgbm90IG51bGwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBsaWtlKFQgb3AxLCBUIG9wMikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogbGlrZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIG5vdExpa2UoVCBvcDEsIFQgb3AyKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiBub3QgbGlrZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIGNvbnRhaW5zKFQgb3AxLCBUIG9wMikgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogY29udGFpbnMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBpbkZvbGRlcihUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IGluX2ZvbGRlciIpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIGluVHJlZShUIG9wMSwgVCBvcDIpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IGluX3RyZWUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBsaXN0KExpc3Q8VD4gb3BzKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiBsaXN0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFQgdmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogYm9vbGVhbiB2YWx1ZSAiICsgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIHZhbHVlKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogZG91YmxlIHZhbHVlICIgKyB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFQgdmFsdWUobG9uZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogbG9uZyB2YWx1ZSAiICsgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIHZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogc3RyaW5nIHZhbHVlICIgKyB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFQgdmFsdWUoR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IGRhdGUgdmFsdWUgIiArIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBjb2woU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IGNvbHVtbiBuYW1lICIgKyBuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCB0ZXh0QW5kKExpc3Q8VD4gb3BzKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiB0ZXh0IGFuZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIHRleHRPcihMaXN0PFQ+IG9wcykgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogdGV4dCBvciIpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIHRleHRNaW51cyhTdHJpbmcgdGV4dCkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCBpbiBxdWVyeTogdGV4dCBtaW51cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBUIHRleHRXb3JkKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgIHRocm93IG5ldyBDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIGluIHF1ZXJ5OiB0ZXh0IHdvcmQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCB0ZXh0UGhyYXNlKFN0cmluZyBwaHJhc2UpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gcXVlcnk6IHRleHQgcGhyYXNlIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9FdmFsdWF0b3JYUGF0aC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9FdmFsdWF0b3JYUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIwYTMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvRXZhbHVhdG9yWFBhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5xdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci51dGlsLklTTzg2MDE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnV0aWwuSXRlcmFibGVzOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEV2YWx1YXRvcn0gcmVzdWx0cyBpbiBhbiBpbnN0YW5jZSBvZiBhCi0gKiB7QGxpbmsgWFBhdGhCdWlsZGVyfSB3aGljaCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZWQgdGhlIHdoZXJlIGNsYXVzZSBvZiB0aGUKLSAqIG9yaWdpbmFsIENNSVMgcXVlcnkgYW5kIHRyYW5zbGF0ZSBpdCB0byBhIGNvcnJlc3BvbmRpbmcgKGkuZS4gc2VtYW50aWNhbGx5Ci0gKiBlcXVhbCkgWFBhdGggY29uZGl0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRXZhbHVhdG9yWFBhdGggZXh0ZW5kcyBFdmFsdWF0b3JCYXNlPFhQYXRoQnVpbGRlcj4gewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV2YWx1YXRvcjxYUGF0aEJ1aWxkZXI+IG9wKCkgewotICAgICAgICAvLyBOZXcgaW5zdGFuY2UgZGVsZWdhdGVzIHRoZXNlIG1ldGhvZHMgdG8gdGhpcyBpbnN0YW5jZSBpbiBvcmRlcgotICAgICAgICAvLyB0byBhY2NvdW50IGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBtZXRob2RzIGFyZSBvdmVycmlkZGVuLgotICAgICAgICByZXR1cm4gbmV3IEV2YWx1YXRvclhQYXRoKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclBhdGhGcm9tSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV2YWx1YXRvclhQYXRoLnRoaXMuamNyUGF0aEZyb21JZChpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBqY3JQYXRoRnJvbUNvbChTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFdmFsdWF0b3JYUGF0aC50aGlzLmpjclBhdGhGcm9tQ29sKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgbm90KGZpbmFsIFhQYXRoQnVpbGRlciBvcCkgewotICAgICAgICByZXR1cm4gbmV3IFhQYXRoQnVpbGRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgeFBhdGgoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2YWwodHJ1ZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbCh0cnVlKSA/ICJ0cnVlKCkiIDogImZhbHNlKCkiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAibm90KCIgKyBvcC54UGF0aCgpICsgIikiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gZXZhbChCb29sZWFuIGZvbGRlclByZWRpY2F0ZVZhbHVhdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiBub3Qob3AuZXZhbChmb2xkZXJQcmVkaWNhdGVWYWx1YXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEl0ZXJhYmxlPFhQYXRoQnVpbGRlcj4gZm9sZGVyUHJlZGljYXRlcygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3AuZm9sZGVyUHJlZGljYXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgYW5kKGZpbmFsIFhQYXRoQnVpbGRlciBvcDEsIGZpbmFsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYUGF0aEJ1aWxkZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHhQYXRoKCkgewotICAgICAgICAgICAgICAgIGlmIChldmFsKHRydWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwodHJ1ZSkgPyAidHJ1ZSgpIiA6ICJmYWxzZSgpIjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wMS5ldmFsKHRydWUpICE9IG51bGwpIHsgLy8gaWYgbm90IG51bGwsIG9wMSBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgLT4gc2hvcnRjdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZhbHVhdGlvbiB0byBvcDIKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wMi54UGF0aCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AyLmV2YWwodHJ1ZSkgIT0gbnVsbCkgeyAvLyBpZiBub3QgbnVsbCwgb3AyIG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSAtPiBzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW9uIHRvIG9wMQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AxLnhQYXRoKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wMS54UGF0aCgpICsgIiBhbmQgIiArIG9wMi54UGF0aCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gZXZhbChCb29sZWFuIGZvbGRlclByZWRpY2F0ZVZhbHVhdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiBhbmQob3AxLmV2YWwoZm9sZGVyUHJlZGljYXRlVmFsdWF0aW9uKSwgb3AyLmV2YWwoZm9sZGVyUHJlZGljYXRlVmFsdWF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxYUGF0aEJ1aWxkZXI+IGZvbGRlclByZWRpY2F0ZXMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5jb25jYXQob3AxLmZvbGRlclByZWRpY2F0ZXMoKSwgb3AyLmZvbGRlclByZWRpY2F0ZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBvcihmaW5hbCBYUGF0aEJ1aWxkZXIgb3AxLCBmaW5hbCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWFBhdGhCdWlsZGVyKCkgewotICAgICAgICAgICAgcHVibGljIFN0cmluZyB4UGF0aCgpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZhbCh0cnVlKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKHRydWUpID8gInRydWUoKSIgOiAiZmFsc2UoKSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcDEuZXZhbCh0cnVlKSAhPSBudWxsKSB7IC8vIGlmIG5vdCBudWxsLCBvcDEgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSAtPiBzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW9uIHRvIG9wMgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AyLnhQYXRoKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcDIuZXZhbCh0cnVlKSAhPSBudWxsKSB7IC8vIGlmIG5vdCBudWxsLCBvcDIgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSAtPiBzaG9ydGN1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmFsdWF0aW9uIHRvIG9wMgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AxLnhQYXRoKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIoIiArIG9wMS54UGF0aCgpICsgIiBvciAiICsgb3AyLnhQYXRoKCkgKyAiKSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBldmFsKEJvb2xlYW4gZm9sZGVyUHJlZGljYXRlVmFsdWF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9yKG9wMS5ldmFsKGZvbGRlclByZWRpY2F0ZVZhbHVhdGlvbiksIG9wMi5ldmFsKGZvbGRlclByZWRpY2F0ZVZhbHVhdGlvbikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSXRlcmFibGU8WFBhdGhCdWlsZGVyPiBmb2xkZXJQcmVkaWNhdGVzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZXMuY29uY2F0KG9wMS5mb2xkZXJQcmVkaWNhdGVzKCksIG9wMi5mb2xkZXJQcmVkaWNhdGVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgZXEoWFBhdGhCdWlsZGVyIG9wMSwgWFBhdGhCdWlsZGVyIG9wMikgewotICAgICAgICByZXR1cm4gbmV3IFJlbE9wQnVpbGRlcihvcDEsICIgPSAiLCBvcDIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgbmVxKFhQYXRoQnVpbGRlciBvcDEsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWxPcEJ1aWxkZXIob3AxLCAiICE9ICIsIG9wMik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBndChYUGF0aEJ1aWxkZXIgb3AxLCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVsT3BCdWlsZGVyKG9wMSwgIiA+ICIsIG9wMik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBndGVxKFhQYXRoQnVpbGRlciBvcDEsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWxPcEJ1aWxkZXIob3AxLCAiID49ICIsIG9wMik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBsdChYUGF0aEJ1aWxkZXIgb3AxLCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVsT3BCdWlsZGVyKG9wMSwgIiA8ICIsIG9wMik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBsdGVxKFhQYXRoQnVpbGRlciBvcDEsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZWxPcEJ1aWxkZXIob3AxLCAiIDw9ICIsIG9wMik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBpbihYUGF0aEJ1aWxkZXIgb3AxLCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5pbihvcDEsIG9wMik7IC8vIHRvZG8gaW1wbGVtZW50IGluCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBub3RJbihYUGF0aEJ1aWxkZXIgb3AxLCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5ub3RJbihvcDEsIG9wMik7IC8vIHRvZG8gaW1wbGVtZW50IG5vdEluCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBpbkFueShYUGF0aEJ1aWxkZXIgb3AxLCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5pbkFueShvcDEsIG9wMik7IC8vIHRvZG8gaW1wbGVtZW50IGluQW55Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBub3RJbkFueShYUGF0aEJ1aWxkZXIgb3AxLCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5ub3RJbkFueShvcDEsIG9wMik7IC8vIHRvZG8gaW1wbGVtZW50IG5vdEluQW55Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBlcUFueShYUGF0aEJ1aWxkZXIgb3AxLCBYUGF0aEJ1aWxkZXIgb3AyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5lcUFueShvcDEsIG9wMik7IC8vIHRvZG8gaW1wbGVtZW50IGVxQW55Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBpc051bGwoWFBhdGhCdWlsZGVyIG9wKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25CdWlsZGVyKG9wKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgWFBhdGhCdWlsZGVyIG5vdElzTnVsbChYUGF0aEJ1aWxkZXIgb3ApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkJ1aWxkZXIoIm5vdCIsIG9wKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgWFBhdGhCdWlsZGVyIGxpa2UoWFBhdGhCdWlsZGVyIG9wMSwgWFBhdGhCdWlsZGVyIG9wMikgewotICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uQnVpbGRlcigiamNyOmxpa2UiLCBvcDEsIG9wMik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBub3RMaWtlKFhQYXRoQnVpbGRlciBvcDEsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkJ1aWxkZXIoImpjcjpsaWtlIiwgb3AxLCBvcDIpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyB4UGF0aCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIm5vdCgiICsgc3VwZXIueFBhdGgoKSArICIpIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgWFBhdGhCdWlsZGVyIGNvbnRhaW5zKFhQYXRoQnVpbGRlciBvcDEsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb250YWluc0J1aWxkZXIob3AyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgWFBhdGhCdWlsZGVyIGluRm9sZGVyKFhQYXRoQnVpbGRlciBvcDEsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGb2xkZXJQcmVkaWNhdGVCdWlsZGVyKG9wMi54UGF0aCgpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBpblRyZWUoWFBhdGhCdWlsZGVyIG9wMSwgWFBhdGhCdWlsZGVyIG9wMikgewotICAgICAgICByZXR1cm4gbmV3IEZvbGRlclByZWRpY2F0ZUJ1aWxkZXIob3AyLnhQYXRoKCksIHRydWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgbGlzdChMaXN0PFhQYXRoQnVpbGRlcj4gb3BzKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5saXN0KG9wcyk7IC8vIHRvZG8gaW1wbGVtZW50IGxpc3QKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgWFBhdGhCdWlsZGVyIHZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQnVpbGRlcih2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciB2YWx1ZShkb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQnVpbGRlcih2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciB2YWx1ZShsb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEJ1aWxkZXIodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgdmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbEJ1aWxkZXIodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgdmFsdWUoR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsQnVpbGRlcih2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciBjb2woU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2xSZWZCdWlsZGVyKG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgdGV4dEFuZChMaXN0PFhQYXRoQnVpbGRlcj4gb3BzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dE9wQnVpbGRlcihvcHMsICIgIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFhQYXRoQnVpbGRlciB0ZXh0T3IoTGlzdDxYUGF0aEJ1aWxkZXI+IG9wcykgewotICAgICAgICByZXR1cm4gbmV3IFRleHRPcEJ1aWxkZXIob3BzLCAiIE9SICIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgdGV4dE1pbnVzKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dE1pbnVzQnVpbGRlcih0ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgWFBhdGhCdWlsZGVyIHRleHRXb3JkKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dFdvcmRCdWlsZGVyKHdvcmQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBYUGF0aEJ1aWxkZXIgdGV4dFBocmFzZShTdHJpbmcgcGhyYXNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dFBocmFzZUJ1aWxkZXIocGhyYXNlKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByb3RlY3RlZCA+LS0tCi0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIGZyb20gYSBDTUlTIG9iamVjdCBpZCB0byB0aGUgY29ycmVzcG9uZGluZyBhYnNvbHV0ZSBKQ1IgcGF0aC4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIHNpbXBseSByZXR1cm5zIDxjb2RlPmlkPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclBhdGhGcm9tSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIGZyb20gYSBjb2x1bW4gbmFtZSBpbiB0aGUgcXVlcnkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVsYXRpdmUgSkNSCi0gICAgICogcGF0aC4gVGhlIHBhdGggbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgY29udGV4dCBub2RlLiBUaGlzIGRlZmF1bHQKLSAgICAgKiBpbXBsZW1lbnRhdGlvbnMgc2ltcGx5IHJldHVybnMgPGNvZGU+bmFtZTwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBqY3JQYXRoRnJvbUNvbChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByaXZhdGUgPi0tLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiA8Y29kZT5iPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICAgKiAgICAgICAgIDxjb2RlPiFiPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBub3QoQm9vbGVhbiBiKSB7Ci0gICAgICAgIHJldHVybiBiID09IG51bGwgPyBudWxsIDogIWI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiA8dWw+Ci0gICAgICogICAgICAgICA8bGk+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgZWl0aGVyIG9mIDxjb2RlPmIxPC9jb2RlPiBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPmIyPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiw8L2xpPgotICAgICAqICAgICAgICAgPGxpPjxjb2RlPmZhbHNlPC9jb2RlPiBpZiBib3RoIDxjb2RlPmIxPC9jb2RlPiBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPmIyPC9jb2RlPiBhcmUgPGNvZGU+ZmFsc2U8L2NvZGU+LDwvbGk+Ci0gICAgICogICAgICAgICA8bGk+PGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLjwvbGk+Ci0gICAgICogICAgICAgICA8L3VsPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gb3IoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhiMSkgfHwgQm9vbGVhbi5UUlVFLmVxdWFscyhiMikgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFLmVxdWFscyhiMSkKLSAgICAgICAgICAgICAgICAmJiBCb29sZWFuLkZBTFNFLmVxdWFscyhiMikgPyBCb29sZWFuLkZBTFNFIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIDx1bD4KLSAgICAgKiAgICAgICAgIDxsaT48Y29kZT5mYWxzZTwvY29kZT4gaWYgZWl0aGVyIG9mIDxjb2RlPmIxPC9jb2RlPiBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPmIyPC9jb2RlPiBpcyA8Y29kZT5mYWxzZTwvY29kZT4sPC9saT4KLSAgICAgKiAgICAgICAgIDxsaT48Y29kZT50cnVlPC9jb2RlPiBpZiBib3RoIDxjb2RlPmIxPC9jb2RlPiBhbmQgPGNvZGU+YjI8L2NvZGU+Ci0gICAgICogICAgICAgICBhcmUgPGNvZGU+dHJ1ZTwvY29kZT4sPC9saT4KLSAgICAgKiAgICAgICAgIDxsaT48Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuPC9saT4KLSAgICAgKiAgICAgICAgIDwvdWw+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBhbmQoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRS5lcXVhbHMoYjEpIHx8IEJvb2xlYW4uRkFMU0UuZXF1YWxzKGIyKSA/IEJvb2xlYW4uRkFMU0UgOiBCb29sZWFuLlRSVUUuZXF1YWxzKGIxKQotICAgICAgICAgICAgICAgICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMoYjIpID8gQm9vbGVhbi5UUlVFIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWxPcEJ1aWxkZXIgaW1wbGVtZW50cyBYUGF0aEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZWxPcDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBYUGF0aEJ1aWxkZXIgb3AxOwotICAgICAgICBwcml2YXRlIGZpbmFsIFhQYXRoQnVpbGRlciBvcDI7Ci0KLSAgICAgICAgcHVibGljIFJlbE9wQnVpbGRlcihYUGF0aEJ1aWxkZXIgb3AxLCBTdHJpbmcgcmVsT3AsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgICAgIHRoaXMucmVsT3AgPSByZWxPcDsKLSAgICAgICAgICAgIHRoaXMub3AxID0gb3AxOwotICAgICAgICAgICAgdGhpcy5vcDIgPSBvcDI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHhQYXRoKCkgewotICAgICAgICAgICAgcmV0dXJuIG9wMS54UGF0aCgpICsgcmVsT3AgKyBvcDIueFBhdGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIGV2YWwoQm9vbGVhbiBmb2xkZXJQcmVkaWNhdGVWYWx1YXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhYmxlPFhQYXRoQnVpbGRlcj4gZm9sZGVyUHJlZGljYXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZXMuY29uY2F0KG9wMS5mb2xkZXJQcmVkaWNhdGVzKCksIG9wMi5mb2xkZXJQcmVkaWNhdGVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGb2xkZXJQcmVkaWNhdGVCdWlsZGVyIGltcGxlbWVudHMgWFBhdGhCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZm9sZGVySWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpbmNsdWRlRGVzY2VuZGFudHM7Ci0KLSAgICAgICAgcHVibGljIEZvbGRlclByZWRpY2F0ZUJ1aWxkZXIoU3RyaW5nIGZvbGRlcklkLCBib29sZWFuIGluY2x1ZGVEZXNjZW5kYW50cykgewotICAgICAgICAgICAgdGhpcy5mb2xkZXJJZCA9IHN0cmlwUXVvdGVzKGZvbGRlcklkKTsKLSAgICAgICAgICAgIHRoaXMuaW5jbHVkZURlc2NlbmRhbnRzID0gaW5jbHVkZURlc2NlbmRhbnRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB4UGF0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBqY3JQYXRoRnJvbUlkKGZvbGRlcklkKSArIChpbmNsdWRlRGVzY2VuZGFudHMgPyAiLy8iIDogIi8iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCb29sZWFuIGV2YWwoQm9vbGVhbiBmb2xkZXJQcmVkaWNhdGVWYWx1YXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBmb2xkZXJQcmVkaWNhdGVWYWx1YXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmFibGU8WFBhdGhCdWlsZGVyPiBmb2xkZXJQcmVkaWNhdGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5zaW5nbGV0b24oKFhQYXRoQnVpbGRlcikgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBzdHJpcFF1b3RlcyhTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHN0cmluZy5zdGFydHNXaXRoKCInIikgfHwgc3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikpICYmIHN0cmluZy5sZW5ndGgoKSA+PSAyID8gc3RyaW5nLnN1YnN0cmluZygxLAotICAgICAgICAgICAgICAgICAgICBzdHJpbmcubGVuZ3RoKCkgLSAxKSA6IHN0cmluZzsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUHJpbWl0aXZlQnVpbGRlciBpbXBsZW1lbnRzIFhQYXRoQnVpbGRlciB7Ci0gICAgICAgIHB1YmxpYyBCb29sZWFuIGV2YWwoQm9vbGVhbiBmb2xkZXJQcmVkaWNhdGVWYWx1YXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhYmxlPFhQYXRoQnVpbGRlcj4gZm9sZGVyUHJlZGljYXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZXMuZW1wdHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpdGVyYWxCdWlsZGVyIGV4dGVuZHMgUHJpbWl0aXZlQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHhQYXRoOwotCi0gICAgICAgIHB1YmxpYyBMaXRlcmFsQnVpbGRlcihTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHhQYXRoID0gIiciICsgdmFsdWUgKyAiJyI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGl0ZXJhbEJ1aWxkZXIoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICAgICAgeFBhdGggPSBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXRlcmFsQnVpbGRlcihsb25nIHZhbHVlKSB7Ci0gICAgICAgICAgICB4UGF0aCA9IExvbmcudG9TdHJpbmcodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpdGVyYWxCdWlsZGVyKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICAgICAgeFBhdGggPSBEb3VibGUudG9TdHJpbmcodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpdGVyYWxCdWlsZGVyKEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgICAgICB4UGF0aCA9ICJ4czpkYXRlVGltZSgnIiArIElTTzg2MDEuZm9ybWF0KHZhbHVlKSArICInKSI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHhQYXRoKCkgewotICAgICAgICAgICAgcmV0dXJuIHhQYXRoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDb2xSZWZCdWlsZGVyIGV4dGVuZHMgUHJpbWl0aXZlQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbFJlZjsKLQotICAgICAgICBwdWJsaWMgQ29sUmVmQnVpbGRlcihTdHJpbmcgY29sUmVmKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbFJlZiA9IGNvbFJlZjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgeFBhdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gamNyUGF0aEZyb21Db2woY29sUmVmKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRnVuY3Rpb25CdWlsZGVyIGV4dGVuZHMgUHJpbWl0aXZlQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bmN0aW9uOwotICAgICAgICBwcml2YXRlIGZpbmFsIFhQYXRoQnVpbGRlciBvcDE7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgWFBhdGhCdWlsZGVyIG9wMjsKLQotICAgICAgICBwcml2YXRlIEZ1bmN0aW9uQnVpbGRlcihTdHJpbmcgZnVuY3Rpb24sIFhQYXRoQnVpbGRlciBvcDEsIFhQYXRoQnVpbGRlciBvcDIpIHsKLSAgICAgICAgICAgIHRoaXMuZnVuY3Rpb24gPSBmdW5jdGlvbjsKLSAgICAgICAgICAgIHRoaXMub3AxID0gb3AxOwotICAgICAgICAgICAgdGhpcy5vcDIgPSBvcDI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRnVuY3Rpb25CdWlsZGVyKFN0cmluZyBmdW5jdGlvbiwgWFBhdGhCdWlsZGVyIG9wMSkgewotICAgICAgICAgICAgdGhpcyhmdW5jdGlvbiwgb3AxLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGdW5jdGlvbkJ1aWxkZXIoWFBhdGhCdWlsZGVyIG9wMSkgewotICAgICAgICAgICAgdGhpcyhudWxsLCBvcDEsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB4UGF0aCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiA9PSBudWxsID8gb3AxLnhQYXRoKCkgOiBmdW5jdGlvbiArICIoIiArIG9wMS54UGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICsgKG9wMiA9PSBudWxsID8gIiIgOiAiLCAiICsgb3AyLnhQYXRoKCkpICsgIikiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGFpbnNCdWlsZGVyIGV4dGVuZHMgUHJpbWl0aXZlQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgWFBhdGhCdWlsZGVyIG9wOwotCi0gICAgICAgIHB1YmxpYyBDb250YWluc0J1aWxkZXIoWFBhdGhCdWlsZGVyIG9wKSB7Ci0gICAgICAgICAgICB0aGlzLm9wID0gb3A7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHhQYXRoKCkgewotICAgICAgICAgICAgcmV0dXJuICJqY3I6Y29udGFpbnMoamNyOmNvbnRlbnQsICciICsgb3AueFBhdGgoKSArICInKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXh0T3BCdWlsZGVyIGV4dGVuZHMgUHJpbWl0aXZlQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxYUGF0aEJ1aWxkZXI+IG9wczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVsT3A7Ci0KLSAgICAgICAgcHVibGljIFRleHRPcEJ1aWxkZXIoTGlzdDxYUGF0aEJ1aWxkZXI+IG9wcywgU3RyaW5nIHJlbE9wKSB7Ci0gICAgICAgICAgICB0aGlzLm9wcyA9IG9wczsKLSAgICAgICAgICAgIHRoaXMucmVsT3AgPSByZWxPcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgeFBhdGgoKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiIjsKLSAgICAgICAgICAgIGZvciAoWFBhdGhCdWlsZGVyIG9wIDogb3BzKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNlcCkuYXBwZW5kKG9wLnhQYXRoKCkpOwotICAgICAgICAgICAgICAgIHNlcCA9IHJlbE9wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRleHRNaW51c0J1aWxkZXIgZXh0ZW5kcyBQcmltaXRpdmVCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGV4dDsKLQotICAgICAgICBwdWJsaWMgVGV4dE1pbnVzQnVpbGRlcihTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgeFBhdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIi0iICsgZXNjYXBlKHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGV4dFdvcmRCdWlsZGVyIGV4dGVuZHMgUHJpbWl0aXZlQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHdvcmQ7Ci0KLSAgICAgICAgcHVibGljIFRleHRXb3JkQnVpbGRlcihTdHJpbmcgd29yZCkgewotICAgICAgICAgICAgdGhpcy53b3JkID0gd29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgeFBhdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXNjYXBlKHdvcmQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGV4dFBocmFzZUJ1aWxkZXIgZXh0ZW5kcyBQcmltaXRpdmVCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGhyYXNlOwotCi0gICAgICAgIHB1YmxpYyBUZXh0UGhyYXNlQnVpbGRlcihTdHJpbmcgcGhyYXNlKSB7Ci0gICAgICAgICAgICB0aGlzLnBocmFzZSA9IHBocmFzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgeFBhdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlwiIiArIGVzY2FwZShwaHJhc2Uuc3Vic3RyaW5nKDEsIHBocmFzZS5sZW5ndGgoKSAtIDEpKSArICJcIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaXRoaW4gdGhlIHNlYXJjaGV4cCBsaXRlcmFsIGluc3RhbmNlcyBvZiBzaW5nbGUgcXVvdGUgKCcpLCBkb3VibGUgcXVvdGUKLSAgICAgKiAoIikgYW5kIGh5cGhlbiAoLSkgbXVzdCBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2ggKFwpLiBCYWNrc2xhc2ggaXRzZWxmCi0gICAgICogbXVzdCB0aGVyZWZvcmUgYWxzbyBiZSBlc2NhcGVkLCBlbmRpbmcgdXAgYXMgZG91YmxlIGJhY2tzbGFzaCAoXFwpLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA9IHMucmVwbGFjZUFsbCgiJyIsICJcXCciKTsKLSAgICAgICAgcyA9IHMucmVwbGFjZUFsbCgiXCIiLCAiXFxcIiIpOwotICAgICAgICBzID0gcy5yZXBsYWNlQWxsKCItIiwgIlxcLSIpOwotICAgICAgICBzID0gcy5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcXFxcXFxcIik7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvSWRlbnRpZmllck1hcC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9JZGVudGlmaWVyTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjBjMDUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9JZGVudGlmaWVyTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5xdWVyeTsKLQotLyoqCi0gKiBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIG1hcCBDTUlTIGlkZW50aWZpZXJzIHRvIEpDUiBpZGVudGlmaWVycy4gRWFjaCBpbXBsZW1lbnRhdGlvbgotICogb2YgdGhpcyBpbnRlcmZhY2UgaXMgYm91bmQgdG8gYSBzcGVjaWZpYyBDTUlTIG9iamVjdCB0eXBlLiBUaGF0IGlzLCBpdCBpbXBsZW1lbnRzIHRoZQotICogaWRlbnRpZmllciBtYXBzIGZvciB0aGF0IG9iamVjdCB0eXBlLiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJZGVudGlmaWVyTWFwIHsKLQotICAgIC8qKgotICAgICAqIE1hcCBhIGNvbHVtbiBuYW1lIGluIHRoZSBDTUlTIHF1ZXJ5IHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlbGF0aXZlIEpDUiBwYXRoLgotICAgICAqIFRoZSBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRleHQgbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lICBjb2x1bW4gbmFtZQotICAgICAqIEByZXR1cm4gIHJlbGF0aXZlIEpDUiBwYXRoCi0gICAgICovCi0gICAgU3RyaW5nIGpjclBhdGhGcm9tQ29sKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEpDUiB0eXBlIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgQ01JUyB0eXBlIGJvdW5kIHRvIHRoaXMgaW5zdGFuY2UuCi0gICAgICogQHNlZSAjamNyVHlwZUNvbmRpdGlvbigpCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBuYW1lIG9mIHRoZSBKQ1IgdHlwZQotICAgICAqLwotICAgIFN0cmluZyBqY3JUeXBlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBhZGRpdGlvbmFsIGNvbmRpdGlvbiBpbiBvcmRlciBmb3IgdGhlIHF1ZXJ5IHRvIG9ubHkgcmV0dXJuIG5vZGVzCi0gICAgICogb2YgdGhlIHJpZ2h0IHR5cGUuIFRoaXMgY29uZGl0aW9uIGFuZC1lZCB0byB0aGUgY29uZGl0aW9uIGRldGVybWluZWQgYnkgdGhlCi0gICAgICogQ01JUyBxdWVyeSdzIHdoZXJlIGNsYXVzZS4KLSAgICAgKiA8cC8+Ci0gICAgICogQSBDTUlTIHF1ZXJ5IGZvciBub24gdmVyc2lvbmFibGUgZG9jdW1lbnRzIHNob3VsZCBmb3IgZXhhbXBsZSByZXN1bHQgaW4gdGhlCi0gICAgICogZm9sbG93aW5nIFhQYXRoIHF1ZXJ5OgotICAgICAqIDxwLz4KLSAgICAgKiA8cHJlPgotICAgICAqICAgZWxlbWVudCgqLCBudDpmaWxlKVtub3QoQGpjcjptaXhpblR5cGVzID0gJ21peDpzaW1wbGVWZXJzaW9uYWJsZScpXQotICAgICAqIDwvcHJlPgotICAgICAqIEhlcmUgdGhlIGVsZW1lbnQgdGVzdCBpcyBjb3ZlcmVkIGJ5IHtAbGluayAjamNyVHlwZU5hbWUoKX0KLSAgICAgKiB3aGlsZSB0aGUgcHJlZGljYXRlIGlzIGNvdmVyZWQgYnkgdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAc2VlICNqY3JUeXBlTmFtZSgpCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICBBZGRpdGlvbmFsIGNvbmRpdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotICAgICAqLwotICAgIFN0cmluZyBqY3JUeXBlQ29uZGl0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L0lkZW50aWZpZXJNYXBCYXNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L0lkZW50aWZpZXJNYXBCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGRiMWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9JZGVudGlmaWVyTWFwQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5xdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBiYXNlIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgSWRlbnRpZmllck1hcH0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJZGVudGlmaWVyTWFwQmFzZSBpbXBsZW1lbnRzIElkZW50aWZpZXJNYXAgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgamNyVHlwZU5hbWU7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gY21pczJKY3IgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIHByb3RlY3RlZCBJZGVudGlmaWVyTWFwQmFzZShTdHJpbmcgamNyVHlwZU5hbWUpIHsKLSAgICAgICAgdGhpcy5qY3JUeXBlTmFtZSA9IGpjclR5cGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgamNyUGF0aEZyb21Db2woU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGpjclBhdGggPSBjbWlzMkpjci5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChqY3JQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZDogcXVlcnkgb24gY29sdW1uICIgKyBuYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBqY3JQYXRoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBqY3JUeXBlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGpjclR5cGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgamNyVHlwZUNvbmRpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9QYXJzZVRyZWVXYWxrZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvUGFyc2VUcmVlV2Fsa2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjRhMTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9QYXJzZVRyZWVXYWxrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5xdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNhbGVuZGFySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LkNtaXNRbFN0cmljdExleGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlByZWRpY2F0ZVdhbGtlckJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuVGV4dFNlYXJjaExleGVyOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFByZWRpY2F0ZVdhbGtlckJhc2V9IHRyYXZlcnNlcyB0aGUgcGFyc2UgdHJlZQotICogb2YgYSBDTUlTIHF1ZXJ5LiBJdCB1c2VzIGFuIHtAbGluayBFdmFsdWF0b3J9IHRvIGFjY3VtdWxhdGUgdGhlIHJlc3VsdCBvZiB0aGUKLSAqIHRyYXZlcnNhbC4gPGNvZGU+RXZhbHVhdG9yPC9jb2RlPiBoYXMgYSBjb3JyZXNwb25kaW5nIG1ldGhvZCBmb3IgZWFjaAotICoge0BsaW5rIFRyZWUjZ2V0VHlwZSgpIG5vZGUgdHlwZX0gaW4gdGhlIHBhcnNlIHRyZWUuCi0gKiA8Y29kZT5QYXJzZVRyZWVXYWxrZXI8L2NvZGU+IGNhbGxzIHRoZXNlIG1ldGhvZHMgd2hpbGUgdHJhdmVyc2luZyB0aGUgcGFyc2UKLSAqIHRyZWUgcGFzc2luZyBhbiA8Y29kZT5FdmFsdWF0b3I8L2NvZGU+IGZvciBlYWNoIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBvcGVyYXRpb24ncyBhcmd1bWVudHMuIDwvYnI+IFRoZSB7QGxpbmsgI3dhbGtQcmVkaWNhdGUoVHJlZSl9IHNlcnZlcyBhcyBlbnRyeQotICogcG9pbnQgZm9yIHRyYXZlcnNpbmcgYSBwYXJzZSB0cmVlLiBBZnRlciBzdWNjZXNzZnVsIHRyYXZlcnNhbCwgdGhlIHJlc3VsdCBpcwotICogb2J0YWluZWQgZnJvbSB0aGUge0BsaW5rICNnZXRSZXN1bHQoKX0gbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPFQ+Ci0gKiAgICAgICAgICAgIHR5cGUgb2YgdGhlIHJlc3VsdCBkZXRlcm1pbmVkIGJ5IHRoZSA8Y29kZT5FdmFsdWF0b3I8L2NvZGU+IHVzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVRyZWVXYWxrZXI8VD4gaW1wbGVtZW50cyBQcmVkaWNhdGVXYWxrZXJCYXNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgRXZhbHVhdG9yPFQ+IGV2YWx1YXRvcjsKLSAgICBwcml2YXRlIFQgcmVzdWx0OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZvciB0cmF2ZXJzaW5nIENNSVMgcXVlcnkgcGFyc2UgdHJlZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2YWx1YXRvcgotICAgICAqICAgICAgICAgICAgPGNvZGU+RXZhbHVhdG9yPC9jb2RlPiBmb3IgZXZhbHVhdGluZyB0aGUgbm9kZXMgb2YgdGhlIHBhcnNlCi0gICAgICogICAgICAgICAgICB0cmVlCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlVHJlZVdhbGtlcihFdmFsdWF0b3I8VD4gZXZhbHVhdG9yKSB7Ci0gICAgICAgIHRoaXMuZXZhbHVhdG9yID0gZXZhbHVhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSByZXN1bHQgb2YgYSBzdWNjZXNzZnVsIHRyYXZlcnNhbC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0cmF2ZXJzYWwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZWl0aGVyIG5vdCB5ZXQKLSAgICAgKiAgICAgICAgIHRyYXZlcnNlZCwgYW4gZXJyb3Igb2NjdXJyZWQgb24gdHJhdmVyc2FsIG9yIHRoZSBxdWVyeSBoYXMgYW4KLSAgICAgKiAgICAgICAgIGVtcHR5IHdoZXJlIGNsYXVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVCBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBQcmVkaWNhdGVXYWxrZXJCYXNlID4tLS0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtQcmVkaWNhdGUoVHJlZSBub2RlKSB7Ci0gICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIHJlc3VsdCA9IHdhbGtQcmVkaWNhdGUoZXZhbHVhdG9yLCBub2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZXR1cm4gdmFsdWUgaXMgaWdub3JlZCBieSBjYWxsZXIKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByb3RlY3RlZCA+LS0tCi0KLSAgICAvKiogRm9yIGV4dGVuc2liaWxpdHkuICovCi0gICAgcHJvdGVjdGVkIFQgd2Fsa090aGVyRXhwcihFdmFsdWF0b3I8Pz4gZXZhbHVhdG9yLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIG5vZGUgdHlwZTogIiArIG5vZGUuZ2V0VHlwZSgpICsgIiAoIiArIG5vZGUuZ2V0VGV4dCgpICsgIikiKTsKLSAgICB9Ci0KLSAgICAvKiogRm9yIGV4dGVuc2liaWxpdHkuICovCi0gICAgcHJvdGVjdGVkIFQgd2Fsa090aGVyUHJlZGljYXRlKEV2YWx1YXRvcjw/PiBldmFsdWF0b3IsIFRyZWUgbm9kZSkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlVua25vd24gbm9kZSB0eXBlOiAiICsgbm9kZS5nZXRUeXBlKCkgKyAiICgiICsgbm9kZS5nZXRUZXh0KCkgKyAiKSIpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgcHJpdmF0ZSA+LS0tCi0KLSAgICBwcml2YXRlIFQgd2Fsa1ByZWRpY2F0ZShFdmFsdWF0b3I8VD4gZXZhbHVhdG9yLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk5PVDoKLSAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3Iubm90KHdhbGtQcmVkaWNhdGUoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMCkpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5BTkQ6Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmFuZCh3YWxrUHJlZGljYXRlKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwKLSAgICAgICAgICAgICAgICAgICAgd2Fsa1ByZWRpY2F0ZShldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgxKSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk9SOgotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5vcih3YWxrUHJlZGljYXRlKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwKLSAgICAgICAgICAgICAgICAgICAgd2Fsa1ByZWRpY2F0ZShldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgxKSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkVROgotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5lcSh3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSksIHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDEpKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTkVROgotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvcgotICAgICAgICAgICAgICAgICAgICAubmVxKHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwgd2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMSkpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5HVDoKLSAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuZ3Qod2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMCkpLCB3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgxKSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkdURVE6Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmd0ZXEod2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMCkpLAotICAgICAgICAgICAgICAgICAgICB3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgxKSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkxUOgotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5sdCh3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSksIHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDEpKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTFRFUToKLSAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IubHRlcSh3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSksCi0gICAgICAgICAgICAgICAgICAgIHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDEpKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSU46Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmluKHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwgd2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMSkpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OT1RfSU46Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLm5vdEluKHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwKLSAgICAgICAgICAgICAgICAgICAgd2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMSkpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9BTlk6Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmluQW55KHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwKLSAgICAgICAgICAgICAgICAgICAgd2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMSkpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OT1RfSU5fQU5ZOgotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5ub3RJbkFueSh3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSksCi0gICAgICAgICAgICAgICAgICAgIHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDEpKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuRVFfQU5ZOgotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5lcUFueSh3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSksCi0gICAgICAgICAgICAgICAgICAgIHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDEpKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSVNfTlVMTDoKLSAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IuaXNOdWxsKHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSVNfTk9UX05VTEw6Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLm5vdElzTnVsbCh3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkxJS0U6Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmxpa2Uod2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMCkpLAotICAgICAgICAgICAgICAgICAgICB3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgxKSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk5PVF9MSUtFOgotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5ub3RMaWtlKHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwKLSAgICAgICAgICAgICAgICAgICAgd2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMSkpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5DT05UQUlOUzoKLSAgICAgICAgICAgIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5jb250YWlucyhudWxsLCB3YWxrRXhwclRleHRTZWFyY2goZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5jb250YWlucyh3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICB3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgxKSkpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOX0ZPTERFUjoKLSAgICAgICAgICAgIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5pbkZvbGRlcihudWxsLCB3YWxrRXhwcihldmFsdWF0b3Iub3AoKSwgbm9kZS5nZXRDaGlsZCgwKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmluRm9sZGVyKHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKDEpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSU5fVFJFRToKLSAgICAgICAgICAgIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5pblRyZWUobnVsbCwgd2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5pblRyZWUod2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa0V4cHIoZXZhbHVhdG9yLm9wKCksIG5vZGUuZ2V0Q2hpbGQoMSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrT3RoZXJQcmVkaWNhdGUoZXZhbHVhdG9yLCBub2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVCB3YWxrRXhwcihFdmFsdWF0b3I8VD4gZXZhbHVhdG9yLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkJPT0xfTElUOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtCb29sZWFuKGV2YWx1YXRvciwgbm9kZSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTlVNX0xJVDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrTnVtYmVyKGV2YWx1YXRvciwgbm9kZSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuU1RSSU5HX0xJVDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrU3RyaW5nKGV2YWx1YXRvciwgbm9kZSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuVElNRV9MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa1RpbWVzdGFtcChldmFsdWF0b3IsIG5vZGUpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOX0xJU1Q6Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLmxpc3Qod2Fsa0xpc3QoZXZhbHVhdG9yLCBub2RlKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQ09MOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtDb2woZXZhbHVhdG9yLCBub2RlKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrT3RoZXJFeHByKGV2YWx1YXRvciwgbm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgd2Fsa0V4cHJUZXh0U2VhcmNoKEV2YWx1YXRvcjxUPiBldmFsdWF0b3IsIFRyZWUgbm9kZSkgewotICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfQU5EOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtUZXh0QW5kKGV2YWx1YXRvciwgbm9kZSk7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfT1I6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa1RleHRPcihldmFsdWF0b3IsIG5vZGUpOwotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX01JTlVTOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtUZXh0TWludXMoZXZhbHVhdG9yLCBub2RlKTsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfV09SRF9MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa1RleHRXb3JkKGV2YWx1YXRvciwgbm9kZSk7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfU0VBUkNIX1BIUkFTRV9TVFJJTkdfTElUOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtUZXh0UGhyYXNlKGV2YWx1YXRvciwgbm9kZSk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa090aGVyRXhwcihldmFsdWF0b3IsIG5vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFQ+IHdhbGtMaXN0KEV2YWx1YXRvcjxUPiBldmFsdWF0b3IsIFRyZWUgbm9kZSkgewotICAgICAgICBpbnQgbiA9IG5vZGUuZ2V0Q2hpbGRDb3VudCgpOwotICAgICAgICBMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8VD4obik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHdhbGtFeHByKGV2YWx1YXRvci5vcCgpLCBub2RlLmdldENoaWxkKGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgd2Fsa0Jvb2xlYW4oRXZhbHVhdG9yPFQ+IGV2YWx1YXRvciwgVHJlZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBzID0gbm9kZS5nZXRUZXh0KCk7Ci0KLSAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXZhbHVhdG9yLnZhbHVlKHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkgewotICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRvci52YWx1ZShmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTm90IGEgYm9vbGVhbjogIiArIHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUIHdhbGtOdW1iZXIoRXZhbHVhdG9yPFQ+IGV2YWx1YXRvciwgVHJlZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBzID0gbm9kZS5nZXRUZXh0KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcy5jb250YWlucygiLiIpIHx8IHMuY29udGFpbnMoImUiKSB8fCBzLmNvbnRhaW5zKCJFIikgPyBldmFsdWF0b3IudmFsdWUoRG91YmxlLnZhbHVlT2YocykpCi0gICAgICAgICAgICAgICAgICAgIDogZXZhbHVhdG9yLnZhbHVlKExvbmcudmFsdWVPZihzKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTm90IGEgbnVtYmVyOiAiICsgcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgd2Fsa1N0cmluZyhFdmFsdWF0b3I8VD4gZXZhbHVhdG9yLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgU3RyaW5nIHMgPSBub2RlLmdldFRleHQoKTsKLSAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgcmV0dXJuIGV2YWx1YXRvci52YWx1ZShzLnJlcGxhY2UoIicnIiwgIiciKSk7IC8vIHVuLWVzY2FwZSBxdW90ZXMKLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgd2Fsa1RpbWVzdGFtcChFdmFsdWF0b3I8VD4gZXZhbHVhdG9yLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgU3RyaW5nIHMgPSBub2RlLmdldFRleHQoKTsKLSAgICAgICAgcyA9IHMuc3Vic3RyaW5nKHMuaW5kZXhPZignXCcnKSArIDEsIHMubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBldmFsdWF0b3IudmFsdWUoQ2FsZW5kYXJIZWxwZXIuZnJvbVN0cmluZyhzKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiTm90IGEgZGF0ZSB0aW1lIHZhbHVlOiAiICsgcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgd2Fsa0NvbChFdmFsdWF0b3I8VD4gZXZhbHVhdG9yLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGV2YWx1YXRvci5jb2wobm9kZS5nZXRDaGlsZCgwKS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgVCB3YWxrVGV4dEFuZChFdmFsdWF0b3I8VD4gZXZhbHVhdG9yLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgTGlzdDxUPiB0ZXJtcyA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKLSAgICAgICAgZm9yIChUcmVlIHRlcm0gOiBnZXRDaGlsZHJlbkFzTGlzdChub2RlKSkgewotICAgICAgICAgICAgdGVybXMuYWRkKHdhbGtFeHByVGV4dFNlYXJjaChldmFsdWF0b3IsIHRlcm0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBldmFsdWF0b3IudGV4dEFuZCh0ZXJtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUIHdhbGtUZXh0T3IoRXZhbHVhdG9yPFQ+IGV2YWx1YXRvciwgVHJlZSBub2RlKSB7Ci0gICAgICAgIExpc3Q8VD4gdGVybXMgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0gICAgICAgIGZvciAoVHJlZSB0ZXJtIDogZ2V0Q2hpbGRyZW5Bc0xpc3Qobm9kZSkpIHsKLSAgICAgICAgICAgIHRlcm1zLmFkZCh3YWxrRXhwclRleHRTZWFyY2goZXZhbHVhdG9yLCB0ZXJtKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXZhbHVhdG9yLnRleHRPcih0ZXJtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUIHdhbGtUZXh0TWludXMoRXZhbHVhdG9yPFQ+IGV2YWx1YXRvciwgVHJlZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBldmFsdWF0b3IudGV4dE1pbnVzKG5vZGUuZ2V0Q2hpbGQoMCkuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgd2Fsa1RleHRXb3JkKEV2YWx1YXRvcjxUPiBldmFsdWF0b3IsIFRyZWUgbm9kZSkgewotICAgICAgICByZXR1cm4gZXZhbHVhdG9yLnRleHRXb3JkKG5vZGUuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgd2Fsa1RleHRQaHJhc2UoRXZhbHVhdG9yPFQ+IGV2YWx1YXRvciwgVHJlZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBldmFsdWF0b3IudGV4dFBocmFzZShub2RlLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUcmVlPiBnZXRDaGlsZHJlbkFzTGlzdChUcmVlIG5vZGUpIHsKLSAgICAgICAgTGlzdDxUcmVlPiByZXMgPSBuZXcgQXJyYXlMaXN0PFRyZWU+KG5vZGUuZ2V0Q2hpbGRDb3VudCgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Q2hpbGQoaSk7Ci0gICAgICAgICAgICByZXMuYWRkKGNoaWxkTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvUXVlcnlUcmFuc2xhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L1F1ZXJ5VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWVlYTVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvUXVlcnlUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IucXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLkpjclR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5T2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5T2JqZWN0LlNvcnRTcGVjOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5LlF1ZXJ5VXRpbFN0cmljdDsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0cmFuc2xhdGluZyBhIENNSVMgcXVlcnkgc3RhdGVtZW50IHRvIGEgSkNSIFhQYXRoCi0gKiBxdWVyeSBzdGF0ZW1lbnQuIE92ZXJyaWRpbmcgY2xhc3MgbmVlZCB0byBpbXBsZW1lbnQgbWV0aG9kcyBmb3IgbWFwcGluZyBDTUlTCi0gKiBpZHMgdG8gSkNSIHBhdGhzLCBDTUlTIHByb3BlcnR5IG5hbWVzIHRvIEpDUiBwcm9wZXJ0eSBuYW1lcywgQ01JUyB0eXBlIG5hbWVzCi0gKiB0byBKQ1IgdHlwZSBuYW1lIGFuZCBpbiBhZGRpdGlvbiBhIG1ldGhvZCBmb3IgYWRkaW5nIGZ1cnRoZXIgY29uc3RyYWludHMgdG8gYQotICogcXVlcnkgYmFzZWQgb24gYSBDTUlTIHR5cGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBRdWVyeVRyYW5zbGF0b3IgewotICAgIHByaXZhdGUgZmluYWwgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFdmFsdWF0b3JYUGF0aCBldmFsdWF0b3I7Ci0gICAgcHJpdmF0ZSBRdWVyeU9iamVjdCBxdWVyeU9iamVjdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBxdWVyeSB0cmFuc2xhdG9yIHdoaWNoIHVzZXMgdGhlIHByb3ZpZGVkCi0gICAgICogPGNvZGU+dHlwZU1hbmFnZXI8L2NvZGU+IHRvIHJlc29sdmUgQ01JUyB0eXBlIG5hbWVzIHRvIENNSVMgdHlwZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVNYW5hZ2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFF1ZXJ5VHJhbnNsYXRvcihKY3JUeXBlTWFuYWdlciB0eXBlTWFuYWdlcikgewotICAgICAgICB0aGlzLnR5cGVNYW5hZ2VyID0gdHlwZU1hbmFnZXI7Ci0gICAgICAgIGV2YWx1YXRvciA9IG5ldyBFdmFsdWF0b3JYUGF0aCgpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclBhdGhGcm9tSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFF1ZXJ5VHJhbnNsYXRvci50aGlzLmpjclBhdGhGcm9tSWQoaWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgamNyUGF0aEZyb21Db2woU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUXVlcnlUcmFuc2xhdG9yLnRoaXMuamNyUGF0aEZyb21Db2wocXVlcnlPYmplY3QuZ2V0TWFpbkZyb21OYW1lKCksIG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBRdWVyeU9iamVjdH0gZnJvbSB0aGUgbGFzdCB0cmFuc2xhdGlvbiBwZXJmb3JtZWQKLSAgICAgKiAgICAgICAgIHRocm91Z2gge0BsaW5rIFF1ZXJ5VHJhbnNsYXRvciN0cmFuc2xhdGVUb1hQYXRoKFN0cmluZyl9LgotICAgICAqLwotICAgIHB1YmxpYyBRdWVyeU9iamVjdCBnZXRRdWVyeU9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5T2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZSBhIENNSVMgcXVlcnkgc3RhdGVtZW50IHRvIGEgSkNSIFhQYXRoIHF1ZXJ5IHN0YXRlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc3RhdGVtZW50Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNsYXRlVG9YUGF0aChTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIFBhcnNlVHJlZVdhbGtlcjxYUGF0aEJ1aWxkZXI+IHBhcnNlVHJlZVdhbGtlciA9IG5ldyBQYXJzZVRyZWVXYWxrZXI8WFBhdGhCdWlsZGVyPihldmFsdWF0b3IpOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gbmV3IFF1ZXJ5VXRpbFN0cmljdChzdGF0ZW1lbnQsIHR5cGVNYW5hZ2VyLCBwYXJzZVRyZWVXYWxrZXIsIHRydWUpOwotICAgICAgICBxdWVyeVV0aWwucHJvY2Vzc1N0YXRlbWVudFVzaW5nQ21pc0V4Y2VwdGlvbnMoKTsKLSAgICAgICAgWFBhdGhCdWlsZGVyIHBhcnNlUmVzdWx0ID0gcGFyc2VUcmVlV2Fsa2VyLmdldFJlc3VsdCgpOwotICAgICAgICBxdWVyeU9iamVjdCA9IHF1ZXJ5VXRpbC5nZXRRdWVyeU9iamVjdCgpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiBmcm9tVHlwZSA9IGdldEZyb21OYW1lKHF1ZXJ5T2JqZWN0KTsKLQotICAgICAgICBTdHJpbmcgcGF0aEV4cHJlc3Npb24gPSBidWlsZFBhdGhFeHByZXNzaW9uKGZyb21UeXBlLCBnZXRGb2xkZXJQcmVkaWNhdGUocGFyc2VSZXN1bHQpKTsKLSAgICAgICAgU3RyaW5nIGVsZW1lbnRUZXN0ID0gYnVpbGRFbGVtZW50VGVzdChmcm9tVHlwZSk7Ci0gICAgICAgIFN0cmluZyBwcmVkaWNhdGVzID0gYnVpbGRQcmVkaWNhdGVzKGZyb21UeXBlLCBnZXRDb25kaXRpb24ocGFyc2VSZXN1bHQpKTsKLSAgICAgICAgU3RyaW5nIG9yZGVyQnlDbGF1c2UgPSBidWlsZE9yZGVyQnlDbGF1c2UoZnJvbVR5cGUsIHF1ZXJ5T2JqZWN0LmdldE9yZGVyQnlzKCkpOwotICAgICAgICByZXR1cm4gIi9qY3I6cm9vdCIgKyBwYXRoRXhwcmVzc2lvbiArIGVsZW1lbnRUZXN0ICsgcHJlZGljYXRlcyArIG9yZGVyQnlDbGF1c2U7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPCBwcm90ZWN0ZWQgPi0tLQotCi0gICAgLyoqCi0gICAgICogTWFwIGEgQ01JUyBvYmplY3RJZCB0byBhbiBhYnNvbHV0ZSBKQ1IgcGF0aC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvCi0gICAgICogcmVzb2x2ZSB0aGUgZm9sZGVyIGlmIG9mIGZvbGRlciBwcmVkaWNhdGVzIChpLmUuIElOX0ZPTERFUiwgSU5fVFJFRSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlkCi0gICAgICogICAgICAgICAgICBvYmplY3RJZAotICAgICAqIEByZXR1cm4gYWJzb2x1dGUgSkNSIHBhdGggY29ycmVzcG9uZGluZyB0byA8Y29kZT5pZDwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBqY3JQYXRoRnJvbUlkKFN0cmluZyBpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBNYXAgYSBjb2x1bW4gbmFtZSBpbiB0aGUgQ01JUyBxdWVyeSB0byB0aGUgY29ycmVzcG9uZGluZyByZWxhdGl2ZSBKQ1IKLSAgICAgKiBwYXRoLiBUaGUgcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0IG5vZGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyb21UeXBlCi0gICAgICogICAgICAgICAgICBUeXBlIG9uIHdoaWNoIHRoZSBDTUlTIHF1ZXJ5IGlzIHBlcmZvcm1lZAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICBjb2x1bW4gbmFtZQotICAgICAqIEByZXR1cm4gcmVsYXRpdmUgSkNSIHBhdGgKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGpjclBhdGhGcm9tQ29sKFR5cGVEZWZpbml0aW9uIGZyb21UeXBlLCBTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBNYXAgYSBDTUlTIHR5cGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgSkNSIHR5cGUgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNqY3JUeXBlQ29uZGl0aW9uKFR5cGVEZWZpbml0aW9uKQotICAgICAqIAotICAgICAqIEBwYXJhbSBmcm9tVHlwZQotICAgICAqICAgICAgICAgICAgQ01JUyB0eXBlCi0gICAgICogQHJldHVybiBuYW1lIG9mIHRoZSBKQ1IgdHlwZSBjb3JyZXNwb25kaW5nIHRvIDxjb2RlPmZyb21UeXBlPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgamNyVHlwZU5hbWUoVHlwZURlZmluaXRpb24gZnJvbVR5cGUpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBhZGRpdGlvbmFsIGNvbmRpdGlvbiBpbiBvcmRlciBmb3IgdGhlIHF1ZXJ5IHRvIG9ubHkgcmV0dXJuCi0gICAgICogbm9kZXMgb2YgdGhlIHJpZ2h0IHR5cGUuIFRoaXMgY29uZGl0aW9uIGFuZC1lZCB0byB0aGUgY29uZGl0aW9uCi0gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgQ01JUyBxdWVyeSdzIHdoZXJlIGNsYXVzZS4KLSAgICAgKiA8cC8+Ci0gICAgICogQSBDTUlTIHF1ZXJ5IGZvciBub24gdmVyc2lvbmFibGUgZG9jdW1lbnRzIHNob3VsZCBmb3IgZXhhbXBsZSByZXN1bHQgaW4KLSAgICAgKiB0aGUgZm9sbG93aW5nIFhQYXRoIHF1ZXJ5OgotICAgICAqIDxwLz4KLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqICAgZWxlbWVudCgqLCBudDpmaWxlKVtub3QoQGpjcjptaXhpblR5cGVzID0gJ21peDpzaW1wbGVWZXJzaW9uYWJsZScpXQotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIEhlcmUgdGhlIGVsZW1lbnQgdGVzdCBpcyBjb3ZlcmVkIGJ5IHtAbGluayAjamNyVHlwZU5hbWUoVHlwZURlZmluaXRpb24pfQotICAgICAqIHdoaWxlIHRoZSBwcmVkaWNhdGUgaXMgY292ZXJlZCBieSB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNqY3JUeXBlTmFtZShUeXBlRGVmaW5pdGlvbikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJvbVR5cGUKLSAgICAgKiBAcmV0dXJuIEFkZGl0aW9uYWwgY29uZGl0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBqY3JUeXBlQ29uZGl0aW9uKFR5cGVEZWZpbml0aW9uIGZyb21UeXBlKTsKLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGEgWFBhdGggcGF0aCBleHByZXNzaW9uIGZvciB0aGUgQ01JUyB0eXBlIHF1ZXJpZWQgZm9yIGFuZCBhIGZvbGRlcgotICAgICAqIHByZWRpY2F0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZnJvbVR5cGUKLSAgICAgKiAgICAgICAgICAgIENNSVMgdHlwZSBxdWVyaWVkIGZvcgotICAgICAqIEBwYXJhbSBmb2xkZXJQcmVkaWNhdGUKLSAgICAgKiAgICAgICAgICAgIGZvbGRlciBwcmVkaWNhdGUKLSAgICAgKiBAcmV0dXJuIGEgdmFsaWQgWFBhdGggcGF0aCBleHByZXNzaW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBidWlsZFBhdGhFeHByZXNzaW9uKFR5cGVEZWZpbml0aW9uIGZyb21UeXBlLCBTdHJpbmcgZm9sZGVyUHJlZGljYXRlKSB7Ci0gICAgICAgIHJldHVybiBmb2xkZXJQcmVkaWNhdGUgPT0gbnVsbCA/ICIvLyIgOiBmb2xkZXJQcmVkaWNhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgYSBYUGF0aCBlbGVtZW50IHRlc3QgZm9yIHRoZSBnaXZlbiBDTUlTIHR5cGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyb21UeXBlCi0gICAgICogICAgICAgICAgICBDTUlTIHR5cGUgcXVlcmllZCBmb3IKLSAgICAgKiBAcmV0dXJuIGEgdmFsaWQgWFBhdGggZWxlbWVudCB0ZXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgYnVpbGRFbGVtZW50VGVzdChUeXBlRGVmaW5pdGlvbiBmcm9tVHlwZSkgewotICAgICAgICByZXR1cm4gImVsZW1lbnQoKiwiICsgamNyVHlwZU5hbWUoZnJvbVR5cGUpICsgIikiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGEgWFBhdGggcHJlZGljYXRlIGZvciB0aGUgZ2l2ZW4gQ01JUyB0eXBlIGFuZCBhbiBhZGRpdGlvbmFsCi0gICAgICogY29uZGl0aW9uLiBUaGUgYWRkaXRpb25hbCBjb25kaXRpb24gc2hvdWxkIGJlIGFuZC1lZCB0byB0aGUgY29uZGl0aW9uCi0gICAgICogcmVzdWx0aW5nIGZyb20gZXZhbHVhdGluZyA8Y29kZT5mcm9tVHlwZTwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyb21UeXBlCi0gICAgICogICAgICAgICAgICBDTUlTIHR5cGUgcXVlcmllZCBmb3IKLSAgICAgKiBAcGFyYW0gY29uZGl0aW9uCi0gICAgICogICAgICAgICAgICBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KLSAgICAgKiBAcmV0dXJuIGEgdmFsaWQgWFBhdGggcHJlZGljYXRlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBidWlsZFByZWRpY2F0ZXMoVHlwZURlZmluaXRpb24gZnJvbVR5cGUsIFN0cmluZyBjb25kaXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHR5cGVDb25kaXRpb24gPSBqY3JUeXBlQ29uZGl0aW9uKGZyb21UeXBlKTsKLQotICAgICAgICBpZiAodHlwZUNvbmRpdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uID09IG51bGwgPyAiIiA6ICJbIiArIGNvbmRpdGlvbiArICJdIjsKLSAgICAgICAgfSBlbHNlIGlmIChjb25kaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICJbIiArIHR5cGVDb25kaXRpb24gKyAiXSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIlsiICsgdHlwZUNvbmRpdGlvbiArICIgYW5kICIgKyBjb25kaXRpb24gKyAiXSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZCBhIFhQYXRoIG9yZGVyIGJ5IGNsYXVzZSBmb3IgdGhlIGdpdmVuIENNSVMgdHlwZSBhbmQgYSBsaXN0IG9mCi0gICAgICoge0BsaW5rIFNvcnRTcGVjfXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZyb21UeXBlCi0gICAgICogICAgICAgICAgICBDTUlTIHR5cGUgcXVlcmllZCBmb3IKLSAgICAgKiBAcGFyYW0gb3JkZXJCeXMKLSAgICAgKiAgICAgICAgICAgIDxjb2RlPlNvcnRTcGVjPC9jb2RlPnMKLSAgICAgKiBAcmV0dXJuIGEgdmFsaWQgWFBhdGggb3JkZXIgYnkgY2xhdXNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBidWlsZE9yZGVyQnlDbGF1c2UoVHlwZURlZmluaXRpb24gZnJvbVR5cGUsIExpc3Q8U29ydFNwZWM+IG9yZGVyQnlzKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgb3JkZXJTcGVjcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgZm9yIChTb3J0U3BlYyBvcmRlckJ5IDogb3JkZXJCeXMpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZWxlY3RvciA9IGpjclBhdGhGcm9tQ29sKGZyb21UeXBlLCBvcmRlckJ5LmdldFNlbGVjdG9yKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYXNjZW5kaW5nID0gb3JkZXJCeS5pc0FzY2VuZGluZygpOwotCi0gICAgICAgICAgICBpZiAob3JkZXJTcGVjcy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBvcmRlclNwZWNzLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcmRlclNwZWNzLmFwcGVuZChzZWxlY3RvcikuYXBwZW5kKCcgJykuYXBwZW5kKGFzY2VuZGluZyA/ICJhc2NlbmRpbmciIDogImRlc2NlbmRpbmciKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcmRlclNwZWNzLmxlbmd0aCgpID4gMCA/ICJvcmRlciBieSAiICsgb3JkZXJTcGVjcyA6ICIiOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwgcHJpdmF0ZSA+LS0tCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rm9sZGVyUHJlZGljYXRlKFhQYXRoQnVpbGRlciBwYXJzZVJlc3VsdCkgewotICAgICAgICBpZiAocGFyc2VSZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZm9sZGVyUHJlZGljYXRlID0gbnVsbDsKLSAgICAgICAgZm9yIChYUGF0aEJ1aWxkZXIgcCA6IHBhcnNlUmVzdWx0LmZvbGRlclByZWRpY2F0ZXMoKSkgewotICAgICAgICAgICAgaWYgKGZvbGRlclByZWRpY2F0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9sZGVyUHJlZGljYXRlID0gcC54UGF0aCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUXVlcnkgbWF5IG9ubHkgY29udGFpbiBhIHNpbmdsZSBmb2xkZXIgcHJlZGljYXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgdGhlIGNsYXNzIGNvbW1lbnQgb24gWFBhdGhCdWlsZGVyIGZvciBkZXRhaWxzIG9uIGFmZmlybWF0aXZlCi0gICAgICAgIC8vIGxpdGVyYWxzCi0gICAgICAgIGlmIChmb2xkZXJQcmVkaWNhdGUgIT0gbnVsbCAmJiAvLyBJRiBoYXMgc2luZ2xlIGZvbGRlciBwcmVkaWNhdGUKLSAgICAgICAgICAgICAgICAhQm9vbGVhbi5GQUxTRS5lcXVhbHMocGFyc2VSZXN1bHQuZXZhbChmYWxzZSkpKSB7IC8vIEFORCBmb2xkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWRpY2F0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZmZpcm1hdGl2ZQotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkZvbGRlciBwcmVkaWNhdGUgIiArIGZvbGRlclByZWRpY2F0ZSArICIgaXMgbm90IGFmZmlybWF0aXZlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZvbGRlclByZWRpY2F0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUeXBlRGVmaW5pdGlvbiBnZXRGcm9tTmFtZShRdWVyeU9iamVjdCBxdWVyeU9iamVjdCkgewotICAgICAgICBpZiAocXVlcnlPYmplY3QuZ2V0VHlwZXMoKS5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkZyb20gbXVzdCBjb250YWluIG9uZSBzaW5nbGUgcmVmZXJlbmNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHF1ZXJ5T2JqZWN0LmdldE1haW5Gcm9tTmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb25kaXRpb24oWFBhdGhCdWlsZGVyIHBhcnNlUmVzdWx0KSB7Ci0gICAgICAgIC8vIE5vIGNvbmRpdGlvbiBpZiBlaXRoZXIgcGFyc2VSZXN1bHQgaXMgbnVsbCBvciB3aGVuIGl0IGV2YWx1YXRlcyB0bwotICAgICAgICAvLyB0cnVlIHVuZGVyCi0gICAgICAgIC8vIHRoZSB2YWx1YXRpb24gd2hpY2ggYXNzaWducyB0cnVlIHRvIHRoZSBmb2xkZXIgcHJlZGljYXRlLgotICAgICAgICByZXR1cm4gcGFyc2VSZXN1bHQgPT0gbnVsbCB8fCBCb29sZWFuLlRSVUUuZXF1YWxzKHBhcnNlUmVzdWx0LmV2YWwodHJ1ZSkpID8gbnVsbCA6IHBhcnNlUmVzdWx0LnhQYXRoKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L1hQYXRoQnVpbGRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9YUGF0aEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NDlkMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L1hQYXRoQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IucXVlcnk7Ci0KLS8qKgotICogVGhpcyByZXN1bHQgdHlwZSBvZiB7QGxpbmsgRXZhbHVhdG9yWFBhdGh9IHByb3ZpZGVzIG1lYW5zIGZvciBwYXJ0aWFsbHkKLSAqIGV2YWx1YXRpbmcgdGhlIHVuZGVybHlpbmcgcXVlcnkncyBjb25kaXRpb24uIFRoaXMgYWxsb3dzIHRvIGRldGVybWluZSB3aGV0aGVyCi0gKiB0aGVyZSBpcyBhIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRyYW5zbGF0aW9uIGZyb20gdGhlIENNSVMgcXVlcnkncyB3aGVyZQotICogY2xhdXNlIHRvIGFuIFhQYXRoIGNvbmRpdGlvbi4gPGJyLz4KLSAqIFNwZWNpZmljYWxseSA8Y29kZT5FdmFsdWF0b3JYUGF0aDwvY29kZT4gb25seSBzdXBwb3J0cyBhIHNpbmdsZSBmb2xkZXIKLSAqIHByZWRpY2F0ZS4gVGhhdCBpcyB0aGUgb3JpZ2luYWwgQ01JUyBxdWVyeSBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUKLSAqIElOX1RSRUUgb3IgSU5fRk9MREVSIHByZWRpY2F0ZSByZXNwZWN0aXZlbHkuIEZ1cnRoZXJtb3JlIHRoYXQgc2luZ2xlIGZvbGRlcgotICogcHJlZGljYXRlIG11c3QgYmUgYWZmaXJtYXRpdmUuIEEgbGl0ZXJhbCA8Y29kZT5wPC9jb2RlPiBpbiBhIGJvb2xlYW4KLSAqIGV4cHJlc3Npb24gPGNvZGU+WDwvY29kZT4gaXMgYWZmaXJtYXRpdmUgaWYgdGhlcmUgZXhpc3RzIGEgYm9vbGVhbiBleHByZXNzaW9uCi0gKiA8Y29kZT5ZPC9jb2RlPiBzdWNoIHRoYXQgPGNvZGU+cCAmYW5kOyBZID0gWDwvY29kZT4uIDxlbT5Ob3RlPC9lbT46IGEgc2luZ2xlCi0gKiBmb2xkZXIgcHJlZGljYXRlIGlzIGFmZmlybWF0aXZlIGlmIGFueSBvbmx5IGlmIHtAbGluayAjZXZhbChCb29sZWFuKQotICogPGNvZGU+ZXZhbChmYWxzZSk8L2NvZGU+fSByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+LiA8YnIvPgotICogT25seSBpZiBib3RoIGNvbmRpdGlvbnMgaG9sZCB3aWxsIHRoZSBYUGF0aCB0cmFuc2xhdGlvbiBwcm92aWRlZCB0aGUKLSAqIHtAbGluayAjeFBhdGgoKX0gbWV0aG9kIGJlIHZhbGlkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhQYXRoQnVpbGRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBUcmFuc2xhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBDTUlTIHF1ZXJ5J3Mgd2hlcmUgY2xhdXNlIHRvIGEgWFBhdGgKLSAgICAgKiBjb25kaXRpb24uIFRoZSBzdHJpbmcgaXMgb25seSB2YWxpZCBpZiB0aGVyZSBpcyBubyBtb3JlIHRoYW4gb25lIGZvbGRlcgotICAgICAqIHByZWRpY2F0ZSBhbmQgdGhlIGZvbGRlciBwcmVkaWNhdGUgaXMgaW4gYWZmaXJtYXRpdmUgcG9zaXRpb24uCi0gICAgICovCi0gICAgU3RyaW5nIHhQYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZSB0aGUgcXVlcnkgY29uZGl0aW9uIGZvciBhIGdpdmVuIHZhbHVhdGlvbiBvZiB0aGUgZm9sZGVyCi0gICAgICogcHJlZGljYXRlIHRlcm1zLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmb2xkZXJQcmVkaWNhdGVWYWx1YXRpb24KLSAgICAgKiAgICAgICAgICAgIHZhbHVhdGlvbiBmb3IgdGhlIGZvbGRlciBwcmVkaWNhdGUgdGVybXMuIFVzZQotICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vbmUuCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIHBhcnRpYWwgZXZhbHVhdGlvbi4gPGNvZGU+bnVsbDwvY29kZT4gbWVhbnMgdGhhdAotICAgICAqICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBxdWVyeSBjb25kaXRpb24gaXMgbm90IGRldGVybWluZWQgdGhlIHZhbHVlCi0gICAgICogICAgICAgICBwYXNzZWQgZm9yIDxjb2RlPmZvbGRlclByZWRpY2F0ZVZhbHVhdGlvbjwvY29kZT4uCi0gICAgICovCi0gICAgQm9vbGVhbiBldmFsKEJvb2xlYW4gZm9sZGVyUHJlZGljYXRlVmFsdWF0aW9uKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmb2xkZXIgcHJlZGljYXRlcyBjb250YWluZWQgaW4gdGhpcyBxdWVyeSdzIGNvbmRpdGlvbi4KLSAgICAgKi8KLSAgICBJdGVyYWJsZTxYUGF0aEJ1aWxkZXI+IGZvbGRlclByZWRpY2F0ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdHlwZS9KY3JEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3R5cGUvSmNyRG9jdW1lbnRUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzI5OTliLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdHlwZS9KY3JEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGU7Ci0KLWltcG9ydCBqYXZheC5qY3IuTm9kZTsKLWltcG9ydCBqYXZheC5qY3IuUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JOb2RlOwotCi0vKioKLSAqIEltcGxlbWVudGVkIGJ5IHR5cGUgaGFuZGxlcnMgdGhhdCBwcm92aWRlcyBhIHR5cGUgdGhhdCBpcyBvciBpbmhlcml0cyBmcm9tCi0gKiBjbWlzOmRvY3VtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpjckRvY3VtZW50VHlwZUhhbmRsZXIgZXh0ZW5kcyBKY3JUeXBlSGFuZGxlciB7Ci0KLSAgICBKY3JEb2N1bWVudCBnZXRKY3JOb2RlKE5vZGUgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZWUgQ01JUyAxLjAgc2VjdGlvbiAyLjIuNC4xIGNyZWF0ZURvY3VtZW50Ci0gICAgICogCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1N0b3JhZ2VFeGNlcHRpb24KLSAgICAgKiAKLSAgICAgKi8KLSAgICBKY3JOb2RlIGNyZWF0ZURvY3VtZW50KEpjckZvbGRlciBwYXJlbnRGb2xkZXIsIFN0cmluZyBuYW1lLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci90eXBlL0pjckZvbGRlclR5cGVIYW5kbGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3R5cGUvSmNyRm9sZGVyVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1YmM2MS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3R5cGUvSmNyRm9sZGVyVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudHlwZTsKLQotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLkpjckZvbGRlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRlZCBieSB0eXBlIGhhbmRsZXJzIHRoYXQgcHJvdmlkZXMgYSB0eXBlIHRoYXQgaXMgb3IgaW5oZXJpdHMgZnJvbQotICogY21pczpmb2xkZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmNyRm9sZGVyVHlwZUhhbmRsZXIgZXh0ZW5kcyBKY3JUeXBlSGFuZGxlciB7Ci0KLSAgICBKY3JGb2xkZXIgZ2V0SmNyTm9kZShOb2RlIG5vZGUpOwotCi0gICAgLyoqCi0gICAgICogU2VlIENNSVMgMS4wIHNlY3Rpb24gMi4yLjQuMyBjcmVhdGVGb2xkZXIKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzU3RvcmFnZUV4Y2VwdGlvbgotICAgICAqIAotICAgICAqLwotICAgIEpjckZvbGRlciBjcmVhdGVGb2xkZXIoSmNyRm9sZGVyIHBhcmVudEZvbGRlciwgU3RyaW5nIG5hbWUsIFByb3BlcnRpZXMgcHJvcGVydGllcyk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3R5cGUvSmNyVHlwZUhhbmRsZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdHlwZS9KY3JUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY1YmYzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdHlwZS9KY3JUeXBlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci50eXBlOwotCi1pbXBvcnQgamF2YXguamNyLk5vZGU7Ci1pbXBvcnQgamF2YXguamNyLlJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JOb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuUGF0aE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnF1ZXJ5LklkZW50aWZpZXJNYXA7Ci0KLS8qKgotICogUHJvdmlkZXMgb3BlcmF0aW9ucyBmb3IgYSBzcGVjaWZpYyBDTUlTIG9iamVjdCB0eXBlLgotICogCi0gKiBAc2VlIEpjclR5cGVIYW5kbGVyTWFuYWdlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpjclR5cGVIYW5kbGVyIHsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB7QGxpbmsgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyfSB3aGVuIHRoZSBoYW5kbGVyIGlzIGFkZGVkLgotICAgICAqLwotICAgIHZvaWQgaW5pdGlhbGl6ZShQYXRoTWFuYWdlciBwYXRoTWFuYWdlciwgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIsIEpjclR5cGVIYW5kbGVyTWFuYWdlciB0eXBlSGFuZGxlck1hbmFnZXIpOwotCi0gICAgU3RyaW5nIGdldFR5cGVJZCgpOwotCi0gICAgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oKTsKLQotICAgIGJvb2xlYW4gY2FuSGFuZGxlKE5vZGUgbm9kZSkgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLSAgICBKY3JOb2RlIGdldEpjck5vZGUoTm9kZSBub2RlKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFVzZWQgYnkgUXVlcnlUcmFuc2xhdG9yIHRvIHRyYW5zbGF0ZSBDTUlTIHF1ZXJpZXMgdG8gSkNSIHF1ZXJpZXMuCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IucXVlcnkuUXVlcnlUcmFuc2xhdG9yCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuSmNyUmVwb3NpdG9yeSNxdWVyeShqYXZheC5qY3IuU2Vzc2lvbiwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuQm9vbGVhbiwKLSAgICAgKiAgICAgIGphdmEubWF0aC5CaWdJbnRlZ2VyLCBqYXZhLm1hdGguQmlnSW50ZWdlcikKLSAgICAgKi8KLSAgICBJZGVudGlmaWVyTWFwIGdldElkZW50aWZpZXJNYXAoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdHlwZS9KY3JUeXBlSGFuZGxlck1hbmFnZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdHlwZS9KY3JUeXBlSGFuZGxlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlZGQ1ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3R5cGUvSmNyVHlwZUhhbmRsZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci50eXBlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4Lmpjci5Ob2RlOwotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLkpjck5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLkpjclR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5QYXRoTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IucXVlcnkuSWRlbnRpZmllck1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IudXRpbC5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgc2V0IG9mIHJlZ2lzdGVyZWQgdHlwZSBoYW5kbGVycy4KLSAqLwotcHVibGljIGNsYXNzIEpjclR5cGVIYW5kbGVyTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSmNyVHlwZUhhbmRsZXJNYW5hZ2VyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgZmluYWwgUGF0aE1hbmFnZXIgcGF0aE1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKY3JUeXBlTWFuYWdlciB0eXBlTWFuYWdlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEpjclR5cGVIYW5kbGVyPiB0eXBlSGFuZGxlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpjclR5cGVIYW5kbGVyPigpOwotCi0gICAgcHVibGljIEpjclR5cGVIYW5kbGVyTWFuYWdlcihQYXRoTWFuYWdlciBwYXRoTWFuYWdlciwgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5wYXRoTWFuYWdlciA9IHBhdGhNYW5hZ2VyOwotICAgICAgICB0aGlzLnR5cGVNYW5hZ2VyID0gdHlwZU1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihKY3JUeXBlSGFuZGxlciB0eXBlSGFuZGxlcikgewotICAgICAgICBpZiAodHlwZU1hbmFnZXIuYWRkVHlwZSh0eXBlSGFuZGxlci5nZXRUeXBlRGVmaW5pdGlvbigpKSkgewotICAgICAgICAgICAgdHlwZUhhbmRsZXJzLnB1dCh0eXBlSGFuZGxlci5nZXRUeXBlSWQoKSwgdHlwZUhhbmRsZXIpOwotICAgICAgICAgICAgdHlwZUhhbmRsZXIuaW5pdGlhbGl6ZShwYXRoTWFuYWdlciwgdHlwZU1hbmFnZXIsIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEpjclR5cGVIYW5kbGVyIGdldFR5cGVIYW5kbGVyKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgSmNyVHlwZUhhbmRsZXIgdHlwZUhhbmRsZXIgPSB0eXBlSGFuZGxlcnMuZ2V0KHR5cGVJZCk7Ci0gICAgICAgIGlmICh0eXBlSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgdW5rbm93biEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZUhhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEpjckZvbGRlclR5cGVIYW5kbGVyIGdldEZvbGRlclR5cGVIYW5kbGVyKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgSmNyVHlwZUhhbmRsZXIgdHlwZUhhbmRsZXIgPSBnZXRUeXBlSGFuZGxlcih0eXBlSWQpOwotICAgICAgICBpZiAoISh0eXBlSGFuZGxlciBpbnN0YW5jZW9mIEpjckZvbGRlclR5cGVIYW5kbGVyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVHlwZSAnIiArIHR5cGVJZCArICInIGlzIG5vdCBhIGZvbGRlciEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEpjckZvbGRlclR5cGVIYW5kbGVyKSB0eXBlSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmNyRG9jdW1lbnRUeXBlSGFuZGxlciBnZXREb2N1bWVudFR5cGVIYW5kbGVyKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgSmNyVHlwZUhhbmRsZXIgdHlwZUhhbmRsZXIgPSBnZXRUeXBlSGFuZGxlcih0eXBlSWQpOwotICAgICAgICBpZiAoISh0eXBlSGFuZGxlciBpbnN0YW5jZW9mIEpjckRvY3VtZW50VHlwZUhhbmRsZXIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgaXMgbm90IGEgZG9jdW1lbnQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChKY3JEb2N1bWVudFR5cGVIYW5kbGVyKSB0eXBlSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJlZGljYXRlPE5vZGU+IGdldE5vZGVQcmVkaWNhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlPE5vZGU+KCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoTm9kZSBub2RlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChKY3JUeXBlSGFuZGxlciB0eXBlSGFuZGxlciA6IHR5cGVIYW5kbGVycy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVIYW5kbGVyLmNhbkhhbmRsZShub2RlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIElkZW50aWZpZXJNYXAgZ2V0SWRlbnRpZmllck1hcChTdHJpbmcgdHlwZUlkKSB7Ci0gICAgICAgIEpjclR5cGVIYW5kbGVyIHR5cGVIYW5kbGVyID0gZ2V0VHlwZUhhbmRsZXIodHlwZUlkKTsKLSAgICAgICAgSWRlbnRpZmllck1hcCBpZGVudGlmaWVyTWFwID0gdHlwZUhhbmRsZXIuZ2V0SWRlbnRpZmllck1hcCgpOwotICAgICAgICBpZiAoaWRlbnRpZmllck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQ6IHF1ZXJ5IGZvciB0eXBlICIgKyB0eXBlSWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZGVudGlmaWVyTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBKY3JOb2RlIGNyZWF0ZShOb2RlIG5vZGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoSmNyVHlwZUhhbmRsZXIgdHlwZUhhbmRsZXIgOiB0eXBlSGFuZGxlcnMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZUhhbmRsZXIuY2FuSGFuZGxlKG5vZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlSGFuZGxlci5nZXRKY3JOb2RlKG5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oIk5vIG9iamVjdCB0eXBlIGZvciBvYmplY3QgJyIgKyBub2RlLmdldElkZW50aWZpZXIoKSArICInIik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci91dGlsL0ZpbHRlckl0ZXJhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3V0aWwvRmlsdGVySXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiZTY4Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3V0aWwvRmlsdGVySXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogSXRlcmF0b3IgZmlsdGVyaW5nIG91dCBpdGVtcyB3aGljaCBkbyBub3QgbWF0Y2ggYSBnaXZlbiBwcmVkaWNhdGUuCi0gKiAKLSAqIEBwYXJhbSA8VD4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlckl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewotICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGU8VD4gcHJlZGljYXRlOwotCi0gICAgcHJpdmF0ZSBUIG5leHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZmlsdGVyZWQgaXRlcmF0b3IgYmFzZWQgb24gdGhlIGdpdmVuIDxjb2RlPml0ZXJhdG9yPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IKLSAgICAgKiAgICAgICAgICAgIGl0ZXJhdG9yIHRvIGZpbHRlcgotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUKLSAgICAgKiAgICAgICAgICAgIG9ubHkgaXRlbSBtYXRjaGluZyB0aGlzIHByZWRpY2F0ZSBhcmUgaW5jbHVkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsdGVySXRlcmF0b3IoSXRlcmF0b3I8VD4gaXRlcmF0b3IsIFByZWRpY2F0ZTxUPiBwcmVkaWNhdGUpIHsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICB3aGlsZSAobmV4dCA9PSBudWxsICYmIGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgVCBlID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5ldmFsdWF0ZShlKSkgewotICAgICAgICAgICAgICAgIG5leHQgPSBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBuZXh0KCkgewotICAgICAgICBpZiAoaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBUIGUgPSBuZXh0OwotICAgICAgICAgICAgbmV4dCA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci91dGlsL0lTTzg2MDEuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdXRpbC9JU084NjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Yzg3MmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci91dGlsL0lTTzg2MDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLS8qKgotICogVGhlIDxjb2RlPklTTzg2MDE8L2NvZGU+IHV0aWxpdHkgY2xhc3MgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZGVhbCB3aXRoCi0gKiBkYXRlL3RpbWUgZm9ybWF0dGluZyB1c2luZyBhIHNwZWNpZmljIElTTzg2MDEtY29tcGxpYW50IGZvcm1hdCAoc2VlIDxhCi0gKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lIj5JU08gODYwMTwvYT4pLgotICogPHAvPgotICogVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9ybWF0IGlzOgotICogCi0gKiA8cHJlPgotICogICAmcGx1c21uO1lZWVktTU0tRERUaGg6bW06c3MuU1NTVFpECi0gKiA8L3ByZT4KLSAqIAotICogd2hlcmU6Ci0gKiAKLSAqIDxwcmU+Ci0gKiAgICZwbHVzbW47WVlZWSA9IGZvdXItZGlnaXQgeWVhciB3aXRoIG9wdGlvbmFsIHNpZ24gd2hlcmUgdmFsdWVzIDw9IDAgYXJlCi0gKiAgICAgICAgICAgZGVub3RpbmcgeWVhcnMgQkNFIGFuZCB2YWx1ZXMgPiAwIGFyZSBkZW5vdGluZyB5ZWFycyBDRSwKLSAqICAgICAgICAgICBlLmcuIC0wMDAxIGRlbm90ZXMgdGhlIHllYXIgMiBCQ0UsIDAwMDAgZGVub3RlcyB0aGUgeWVhciAxIEJDRSwKLSAqICAgICAgICAgICAwMDAxIGRlbm90ZXMgdGhlIHllYXIgMSBDRSwgYW5kIHNvIG9uLi4uCi0gKiAgIE1NICAgID0gdHdvLWRpZ2l0IG1vbnRoICgwMT1KYW51YXJ5LCBldGMuKQotICogICBERCAgICA9IHR3by1kaWdpdCBkYXkgb2YgbW9udGggKDAxIHRocm91Z2ggMzEpCi0gKiAgIGhoICAgID0gdHdvIGRpZ2l0cyBvZiBob3VyICgwMCB0aHJvdWdoIDIzKSAoYW0vcG0gTk9UIGFsbG93ZWQpCi0gKiAgIG1tICAgID0gdHdvIGRpZ2l0cyBvZiBtaW51dGUgKDAwIHRocm91Z2ggNTkpCi0gKiAgIHNzICAgID0gdHdvIGRpZ2l0cyBvZiBzZWNvbmQgKDAwIHRocm91Z2ggNTkpCi0gKiAgIFNTUyAgID0gdGhyZWUgZGlnaXRzIG9mIG1pbGxpc2Vjb25kcyAoMDAwIHRocm91Z2ggOTk5KQotICogICBUWkQgICA9IHRpbWUgem9uZSBkZXNpZ25hdG9yLCBaIGZvciBadWx1IChpLmUuIFVUQykgb3IgYW4gb2Zmc2V0IGZyb20gVVRDCi0gKiAgICAgICAgICAgaW4gdGhlIGZvcm0gb2YgK2hoOm1tIG9yIC1oaDptbQotICogPC9wcmU+Ci0gKiA8cC8+Ci0gKiA8ZW0+Tm90ZTo8L2VtPiBUaGlzIGNsYXNzIGlzIGNvcGllZCBmcm9tIG9yZy5hcGFjaGUuamFja3JhYmJpdC51dGlsLklTTzg2MDEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElTTzg2MDEgewotICAgIHByaXZhdGUgSVNPODYwMSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYW4gSVNPODYwMS1jb21wbGlhbnQgZGF0ZS90aW1lIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGV4dAotICAgICAqICAgICAgICAgICAgdGhlIGRhdGUvdGltZSBzdHJpbmcgdG8gYmUgcGFyc2VkCi0gICAgICogQHJldHVybiBhIDxjb2RlPkNhbGVuZGFyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlucHV0IGNvdWxkCi0gICAgICogICAgICAgICBub3QgYmUgcGFyc2VkCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIDxjb2RlPm51bGw8L2NvZGU+IGFyZ3VtZW50IGlzIHBhc3NlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2FsZW5kYXIgcGFyc2UoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJndW1lbnQgY2FuIG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBvcHRpb25hbCBsZWFkaW5nIHNpZ24KLSAgICAgICAgY2hhciBzaWduOwotICAgICAgICBpbnQgc3RhcnQ7Ci0gICAgICAgIGlmICh0ZXh0LnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgc2lnbiA9ICctJzsKLSAgICAgICAgICAgIHN0YXJ0ID0gMTsKLSAgICAgICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgc2lnbiA9ICcrJzsKLSAgICAgICAgICAgIHN0YXJ0ID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpZ24gPSAnKyc7IC8vIG5vIHNpZ24gc3BlY2lmaWVkLCBpbXBsaWVkICcrJwotICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHRoZSBleHBlY3RlZCBmb3JtYXQgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nIGlzOgotICAgICAgICAgKiBZWVlZLU1NLUREVGhoOm1tOnNzLlNTU1RaRAotICAgICAgICAgKiAKLSAgICAgICAgICogbm90ZSB0aGF0IHdlIGNhbm5vdCB1c2UgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQgZm9yIHBhcnNpbmcKLSAgICAgICAgICogYmVjYXVzZSBpdCBjYW4ndCBoYW5kbGUgeWVhcnMgPD0gMCBhbmQgVFpEJ3MKLSAgICAgICAgICovCi0KLSAgICAgICAgaW50IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjLCBtczsKLSAgICAgICAgU3RyaW5nIHR6SUQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB5ZWFyIChZWVlZKQotICAgICAgICAgICAgeWVhciA9IEludGVnZXIucGFyc2VJbnQodGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgNCkpOwotICAgICAgICAgICAgc3RhcnQgKz0gNDsKLSAgICAgICAgICAgIC8vIGRlbGltaXRlciAnLScKLSAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChzdGFydCkgIT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCsrOwotICAgICAgICAgICAgLy8gbW9udGggKE1NKQotICAgICAgICAgICAgbW9udGggPSBJbnRlZ2VyLnBhcnNlSW50KHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydCArIDIpKTsKLSAgICAgICAgICAgIHN0YXJ0ICs9IDI7Ci0gICAgICAgICAgICAvLyBkZWxpbWl0ZXIgJy0nCi0gICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoc3RhcnQpICE9ICctJykgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQrKzsKLSAgICAgICAgICAgIC8vIGRheSAoREQpCi0gICAgICAgICAgICBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBzdGFydCArIDIpKTsKLSAgICAgICAgICAgIHN0YXJ0ICs9IDI7Ci0gICAgICAgICAgICAvLyBkZWxpbWl0ZXIgJ1QnCi0gICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoc3RhcnQpICE9ICdUJykgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQrKzsKLSAgICAgICAgICAgIC8vIGhvdXIgKGhoKQotICAgICAgICAgICAgaG91ciA9IEludGVnZXIucGFyc2VJbnQodGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgMikpOwotICAgICAgICAgICAgc3RhcnQgKz0gMjsKLSAgICAgICAgICAgIC8vIGRlbGltaXRlciAnOicKLSAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChzdGFydCkgIT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCsrOwotICAgICAgICAgICAgLy8gbWludXRlIChtbSkKLSAgICAgICAgICAgIG1pbiA9IEludGVnZXIucGFyc2VJbnQodGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgMikpOwotICAgICAgICAgICAgc3RhcnQgKz0gMjsKLSAgICAgICAgICAgIC8vIGRlbGltaXRlciAnOicKLSAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChzdGFydCkgIT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCsrOwotICAgICAgICAgICAgLy8gc2Vjb25kIChzcykKLSAgICAgICAgICAgIHNlYyA9IEludGVnZXIucGFyc2VJbnQodGV4dC5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0ICsgMikpOwotICAgICAgICAgICAgc3RhcnQgKz0gMjsKLSAgICAgICAgICAgIC8vIGRlbGltaXRlciAnLicKLSAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChzdGFydCkgIT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydCsrOwotICAgICAgICAgICAgLy8gbWlsbGlzZWNvbmQgKFNTUykKLSAgICAgICAgICAgIG1zID0gSW50ZWdlci5wYXJzZUludCh0ZXh0LnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyAzKSk7Ci0gICAgICAgICAgICBzdGFydCArPSAzOwotICAgICAgICAgICAgLy8gdGltZSB6b25lIGRlc2lnbmF0b3IgKFogb3IgKzAwOjAwIG9yIC0wMDowMCkKLSAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJBdChzdGFydCkgPT0gJysnIHx8IHRleHQuY2hhckF0KHN0YXJ0KSA9PSAnLScpIHsKLSAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gVVRDIHNwZWNpZmllZCBpbiB0aGUgZm9ybWF0ICswMDowMC8tMDA6MDAKLSAgICAgICAgICAgICAgICB0eklEID0gIkdNVCIgKyB0ZXh0LnN1YnN0cmluZyhzdGFydCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuc3Vic3RyaW5nKHN0YXJ0KS5lcXVhbHMoIloiKSkgewotICAgICAgICAgICAgICAgIHR6SUQgPSAiR01UIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaW52YWxpZCB0aW1lIHpvbmUgZGVzaWduYXRvcgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBUaW1lWm9uZSB0eiA9IFRpbWVab25lLmdldFRpbWVab25lKHR6SUQpOwotICAgICAgICAvLyB2ZXJpZnkgaWQgb2YgcmV0dXJuZWQgdGltZSB6b25lIChnZXRUaW1lWm9uZSBkZWZhdWx0cyB0byAiR01UIikKLSAgICAgICAgaWYgKCF0ei5nZXRJRCgpLmVxdWFscyh0eklEKSkgewotICAgICAgICAgICAgLy8gaW52YWxpZCB0aW1lIHpvbmUKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSBDYWxlbmRhciBvYmplY3QKLSAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UodHopOwotICAgICAgICBjYWwuc2V0TGVuaWVudChmYWxzZSk7Ci0gICAgICAgIC8vIHllYXIgYW5kIGVyYQotICAgICAgICBpZiAoc2lnbiA9PSAnLScgfHwgeWVhciA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBub3QgQ0UsIG5lZWQgdG8gc2V0IGVyYSAoQkNFKSBhbmQgYWRqdXN0IHllYXIKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhciArIDEpOwotICAgICAgICAgICAgY2FsLnNldChDYWxlbmRhci5FUkEsIEdyZWdvcmlhbkNhbGVuZGFyLkJDKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhcik7Ci0gICAgICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkVSQSwgR3JlZ29yaWFuQ2FsZW5kYXIuQUQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIG1vbnRoICgwLWJhc2VkISkKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NT05USCwgbW9udGggLSAxKTsKLSAgICAgICAgLy8gZGF5IG9mIG1vbnRoCi0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCBkYXkpOwotICAgICAgICAvLyBob3VyCi0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGhvdXIpOwotICAgICAgICAvLyBtaW51dGUKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSU5VVEUsIG1pbik7Ci0gICAgICAgIC8vIHNlY29uZAotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgc2VjKTsKLSAgICAgICAgLy8gbWlsbGlzZWNvbmQKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgbXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIHRoZSBmb2xsb3dpbmcgY2FsbCB3aWxsIHRyaWdnZXIgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmCi0gICAgICAgICAgICAgKiBhbnkgb2YgdGhlIHNldCB2YWx1ZXMgYXJlIGlsbGVnYWwgb3Igb3V0IG9mIHJhbmdlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhbC5nZXRUaW1lKCk7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIGluIGFkZGl0aW9uIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgeWVhcgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBnZXRZZWFyKGNhbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9ybWF0cyBhIDxjb2RlPkNhbGVuZGFyPC9jb2RlPiB2YWx1ZSBpbnRvIGFuIElTTzg2MDEtY29tcGxpYW50IGRhdGUvdGltZQotICAgICAqIHN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICB0aGUgdGltZSB2YWx1ZSB0byBiZSBmb3JtYXR0ZWQgaW50byBhIGRhdGUvdGltZSBzdHJpbmcuCi0gICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUvdGltZSBzdHJpbmcuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhIDxjb2RlPm51bGw8L2NvZGU+IGFyZ3VtZW50IGlzIHBhc3NlZCBvciB0aGUgY2FsZW5kYXIKLSAgICAgKiAgICAgICAgICAgICBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgZGVmaW5lZCBieSBJU08gODYwMSAoaS5lLiB5ZWFyIHdpdGgKLSAgICAgKiAgICAgICAgICAgICBtb3JlIHRoYW4gZm91ciBkaWdpdHMpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChDYWxlbmRhciBjYWwpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2FsID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFyZ3VtZW50IGNhbiBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGUvdGltZSBzdHJpbmcgaXM6IFlZWVktTU0tRERUaGg6bW06c3MuU1NTVFpECi0gICAgICAgICAqIAotICAgICAgICAgKiBub3RlIHRoYXQgd2UgY2Fubm90IHVzZSBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCBmb3IgZm9ybWF0dGluZwotICAgICAgICAgKiBiZWNhdXNlIGl0IGNhbid0IGhhbmRsZSB5ZWFycyA8PSAwIGFuZCBUWkQncwotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgLy8geWVhciAoWy1dWVlZWSkKLSAgICAgICAgYXBwZW5kWmVyb1BhZGRlZEludChidWYsIGdldFllYXIoY2FsKSwgNCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoJy0nKTsKLSAgICAgICAgLy8gbW9udGggKE1NKQotICAgICAgICBhcHBlbmRaZXJvUGFkZGVkSW50KGJ1ZiwgY2FsLmdldChDYWxlbmRhci5NT05USCkgKyAxLCAyKTsKLSAgICAgICAgYnVmLmFwcGVuZCgnLScpOwotICAgICAgICAvLyBkYXkgKEREKQotICAgICAgICBhcHBlbmRaZXJvUGFkZGVkSW50KGJ1ZiwgY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpLCAyKTsKLSAgICAgICAgYnVmLmFwcGVuZCgnVCcpOwotICAgICAgICAvLyBob3VyIChoaCkKLSAgICAgICAgYXBwZW5kWmVyb1BhZGRlZEludChidWYsIGNhbC5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpLCAyKTsKLSAgICAgICAgYnVmLmFwcGVuZCgnOicpOwotICAgICAgICAvLyBtaW51dGUgKG1tKQotICAgICAgICBhcHBlbmRaZXJvUGFkZGVkSW50KGJ1ZiwgY2FsLmdldChDYWxlbmRhci5NSU5VVEUpLCAyKTsKLSAgICAgICAgYnVmLmFwcGVuZCgnOicpOwotICAgICAgICAvLyBzZWNvbmQgKHNzKQotICAgICAgICBhcHBlbmRaZXJvUGFkZGVkSW50KGJ1ZiwgY2FsLmdldChDYWxlbmRhci5TRUNPTkQpLCAyKTsKLSAgICAgICAgYnVmLmFwcGVuZCgnLicpOwotICAgICAgICAvLyBtaWxsaXNlY29uZCAoU1NTKQotICAgICAgICBhcHBlbmRaZXJvUGFkZGVkSW50KGJ1ZiwgY2FsLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCksIDMpOwotICAgICAgICAvLyB0aW1lIHpvbmUgZGVzaWduYXRvciAoWiBvciArMDA6MDAgb3IgLTAwOjAwKQotICAgICAgICBUaW1lWm9uZSB0eiA9IGNhbC5nZXRUaW1lWm9uZSgpOwotICAgICAgICAvLyBkZXRlcm1pbmUgb2Zmc2V0IG9mIHRpbWV6b25lIGZyb20gVVRDIChpbmNsLiBkYXlsaWdodCBzYXZpbmcpCi0gICAgICAgIGludCBvZmZzZXQgPSB0ei5nZXRPZmZzZXQoY2FsLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCdaJyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgaG91cnMgPSBNYXRoLmFicyhvZmZzZXQgLyAoNjAgKiAxMDAwKSAvIDYwKTsKLSAgICAgICAgICAgIGludCBtaW51dGVzID0gTWF0aC5hYnMob2Zmc2V0IC8gKDYwICogMTAwMCkgJSA2MCk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG9mZnNldCA8IDAgPyAnLScgOiAnKycpOwotICAgICAgICAgICAgYXBwZW5kWmVyb1BhZGRlZEludChidWYsIGhvdXJzLCAyKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzonKTsKLSAgICAgICAgICAgIGFwcGVuZFplcm9QYWRkZWRJbnQoYnVmLCBtaW51dGVzLCAyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXN0cm9ub21pY2FsIHllYXIgb2YgdGhlIGdpdmVuIGNhbGVuZGFyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEgY2FsZW5kYXIgaW5zdGFuY2UuCi0gICAgICogQHJldHVybiB0aGUgYXN0cm9ub21pY2FsIHllYXIuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBjYWxlbmRhciBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgZGVmaW5lZCBieSBJU08gODYwMQotICAgICAqICAgICAgICAgICAgIChpLmUuIHllYXIgd2l0aCBtb3JlIHRoYW4gZm91ciBkaWdpdHMpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFllYXIoQ2FsZW5kYXIgY2FsKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGVyYSBhbmQgYWRqdXN0IHllYXIgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGludCB5ZWFyID0gY2FsLmdldChDYWxlbmRhci5ZRUFSKTsKLSAgICAgICAgaWYgKGNhbC5pc1NldChDYWxlbmRhci5FUkEpICYmIGNhbC5nZXQoQ2FsZW5kYXIuRVJBKSA9PSBHcmVnb3JpYW5DYWxlbmRhci5CQykgewotCi0gICAgICAgICAgICAvLyBjYWxjdWxhdGUgeWVhciB1c2luZyBhc3Ryb25vbWljYWwgc3lzdGVtOgotICAgICAgICAgICAgLy8geWVhciBuIEJDRSA9PiBhc3Ryb25vbWljYWwgeWVhciAtbiArIDEKLSAgICAgICAgICAgIHllYXIgPSAwIC0geWVhciArIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeWVhciA+IDk5OTkgfHwgeWVhciA8IC05OTk5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYWxlbmRhciBoYXMgbW9yZSB0aGFuIGZvdXIgIgotICAgICAgICAgICAgICAgICAgICArICJ5ZWFyIGRpZ2l0cywgY2Fubm90IGJlIGZvcm1hdHRlZCBhcyBJU084NjAxOiAiICsgeWVhcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHllYXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhIHplcm8tcGFkZGVkIG51bWJlciB0byB0aGUgZ2l2ZW4gc3RyaW5nIGJ1ZmZlci4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIgbWV0aG9kIHdoaWNoIGRvZXNuJ3QgcGVyZm9ybSBhbnkgdmFsaWRhdGlvbiBvbgotICAgICAqIHRoZSBnaXZlbiBhcmd1bWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGJ1ZgotICAgICAqICAgICAgICAgICAgU3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdG8KLSAgICAgKiBAcGFyYW0gbgotICAgICAqICAgICAgICAgICAgbnVtYmVyIHRvIGFwcGVuZAotICAgICAqIEBwYXJhbSBwcmVjaXNpb24KLSAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBkaWdpdHMgdG8gYXBwZW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRaZXJvUGFkZGVkSW50KFN0cmluZ0J1ZmZlciBidWYsIGludCBuLCBpbnQgcHJlY2lzaW9uKSB7Ci0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgnLScpOwotICAgICAgICAgICAgbiA9IC1uOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgZXhwID0gcHJlY2lzaW9uIC0gMTsgZXhwID4gMDsgZXhwLS0pIHsKLSAgICAgICAgICAgIGlmIChuIDwgTWF0aC5wb3coMTAsIGV4cCkpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcwJyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5hcHBlbmQobik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci91dGlsL0l0ZXJhYmxlcy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci91dGlsL0l0ZXJhYmxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTIxMWFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdXRpbC9JdGVyYWJsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9ycy5JdGVyYXRvckNoYWluOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5pdGVyYXRvcnMuU2luZ2xldG9uSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJdGVyYWJsZXMgewotICAgIHByaXZhdGUgSXRlcmFibGVzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGNvbmNhdChmaW5hbCBJdGVyYWJsZTxUPiBpdDEsIGZpbmFsIEl0ZXJhYmxlPFQ+IGl0MikgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFQ+KCkgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvckNoYWluKGl0MS5pdGVyYXRvcigpLCBpdDIuaXRlcmF0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gc2luZ2xldG9uKGZpbmFsIFQgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFQ+KCkgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25JdGVyYXRvcihlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBlbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZTxUPigpIHsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eUl0ZXJhdG9yLklOU1RBTkNFOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdXRpbC9QcmVkaWNhdGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdXRpbC9QcmVkaWNhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzZWEzNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3V0aWwvUHJlZGljYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci51dGlsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgcHJlZGljYXRlcyBvZiB0eXBlIDxjb2RlPlQ8L2NvZGU+LCBpLmUuIGZ1bmN0aW9ucyBmcm9tCi0gKiA8Y29kZT5UPC9jb2RlPiB0byA8Y29kZT5ib29sZWFuPC9jb2RlPi4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVkaWNhdGU8VD4gewotCi0gICAgLyoqCi0gICAgICogRXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgZm9yIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIHQKLSAgICAgKiAgICAgICAgICAgIHNvbWUgb2JqZWN0Ci0gICAgICogQHJldHVybiBwcmVkaWNhdGUgcmVzdWx0Ci0gICAgICovCi0gICAgYm9vbGVhbiBldmFsdWF0ZShUIHQpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgcHJlZGljYXRlIHRoYXQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYWxsIG9iamVjdHMuCi0gICAgICovCi0gICAgUHJlZGljYXRlPD8+IFRSVUUgPSBuZXcgUHJlZGljYXRlPE9iamVjdD4oKSB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENvbnN0YW50IHByZWRpY2F0ZSB0aGF0IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBhbGwgb2JqZWN0cy4KLSAgICAgKi8KLSAgICBQcmVkaWNhdGU8Pz4gRkFMU0UgPSBuZXcgUHJlZGljYXRlPE9iamVjdD4oKSB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdXRpbC9VdGlsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3V0aWwvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjg5YWRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvdXRpbC9VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi1pbXBvcnQgamF2YXguamNyLk5vZGU7Ci1pbXBvcnQgamF2YXguamNyLlJlcG9zaXRvcnlFeGNlcHRpb247Ci0KLS8qKgotICogTWlzY2VsbGFuZW91cyB1dGlsaXR5IGZ1bmN0aW9ucwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbCB7Ci0gICAgcHJpdmF0ZSBVdGlsKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgZnJvbSA8Y29kZT5DYWxlbmRhcjwvY29kZT4gdG8gYSA8Y29kZT5HcmVnb3JpYW5DYWxlbmRhcjwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIGRhdGUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPmRhdGU8L2NvZGU+IGlmIGl0IGlzIGFuIGluc3RhbmNlIG9mCi0gICAgICogICAgICAgICA8Y29kZT5HcmVnb3JpYW5DYWxlbmRhcjwvY29kZT4uIE90aGVyd2lzZSBhIG5ldwotICAgICAqICAgICAgICAgPGNvZGU+R3JlZ29yaWFuQ2FsZW5kYXI8L2NvZGU+IGluc3RhbmNlIGZvciA8Y29kZT5kYXRlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEdyZWdvcmlhbkNhbGVuZGFyIHRvQ2FsZW5kYXIoQ2FsZW5kYXIgZGF0ZSkgewotICAgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIEdyZWdvcmlhbkNhbGVuZGFyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEdyZWdvcmlhbkNhbGVuZGFyKSBkYXRlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsZW5kYXIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldFRpbWVab25lKGRhdGUuZ2V0VGltZVpvbmUoKSk7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lSW5NaWxsaXMoZGF0ZS5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gY2FsZW5kYXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIGV2ZXJ5IG9jY3VycmVuY2Ugb2YgPGNvZGU+dGFyZ2V0PC9jb2RlPiBpbiA8Y29kZT5zdHJpbmc8L2NvZGU+Ci0gICAgICogd2l0aCA8Y29kZT5yZXBsYWNlbWVudDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqICAgICAgICAgICAgc3RyaW5nIHRvIGRvIHJlcGxhY2VtZW50IG9uCi0gICAgICogQHBhcmFtIHRhcmdldAotICAgICAqICAgICAgICAgICAgc3RyaW5nIHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQKLSAgICAgKiAgICAgICAgICAgIHN0cmluZyB0byByZXBsYWNlIHdpdGgKLSAgICAgKiBAcmV0dXJuIHN0cmluZyB3aXRoIHJlcGxhY2luZyBkb25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgcmVwbGFjZW1lbnQpIHsKLSAgICAgICAgaWYgKCIiLmVxdWFscyh0YXJnZXQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0YXJnZXQgc3RyaW5nIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCIiLmVxdWFscyhyZXBsYWNlbWVudCkgfHwgdGFyZ2V0LmVxdWFscyhyZXBsYWNlbWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGludCBkID0gdGFyZ2V0Lmxlbmd0aCgpOwotICAgICAgICBpbnQgayA9IDA7Ci0gICAgICAgIGludCBqOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBqID0gc3RyaW5nLmluZGV4T2YodGFyZ2V0LCBrKTsKLSAgICAgICAgICAgIGlmIChqIDwgMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZyhrKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZyhrLCBqKSkuYXBwZW5kKHJlcGxhY2VtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgayA9IGogKyBkOwotICAgICAgICB9IHdoaWxlIChqID49IDApOwotCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFc2NhcGVzIGEgSkNSIHBhdGggc3VjaCB0aGF0IGl0IGNhbiBiZSB1c2VkIGluIGEgWFBhdGggcXVlcnkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqIEByZXR1cm4gZXNjYXBlZCBwYXRoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiByZXBsYWNlKHBhdGgsICIgIiwgIl94MDAyMF8iKTsgLy8gZml4bWUgZG8gbW9yZSB0aG9yb3VnaCBlc2NhcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHBhdGgKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcmVwb3NpdG9yeSdzIHN1cHBvcnQgb3B0aW9uIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiAgICAgICAgICAgIEpDUiBub2RlCi0gICAgICogQHBhcmFtIG9wdGlvbgotICAgICAqICAgICAgICAgICAgcmVxdWVzdGVkIHJlcG9zaXRvcnkncyBvcHRpb24KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmVwb3NpdG9yeSBzdXBwb3J0cyBvcHRpb24sIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgKiBAdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICB0aHJvd24gd2hlbiBhbnkgZXJyb3Igd2l0aCByZXBvc2l0b3J5IHdhcyBvY2N1cnJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3VwcG9ydE9wdGlvbihOb2RlIG5vZGUsIFN0cmluZyBvcHRpb24pIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihub2RlLmdldFNlc3Npb24oKS5nZXRSZXBvc2l0b3J5KCkuZ2V0RGVzY3JpcHRvcihvcHRpb24pKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL0xJQ0VOU0UgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL3dlYmFwcC9NRVRBLUlORi9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2UzYWZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUGxlYXNlIHNlZSBhbHNvIFRIUklELVBBUlRZLUxJQ0VOU0VTLgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTk9USUNFIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi93ZWJhcHAvTUVUQS1JTkYvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWRjMGQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL21haW4vd2ViYXBwL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotT3BlbkNNSVMgSkNSIEJyaWRnZQotQ29weXJpZ2h0IDIwMDktMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotCi1PcGVuQ01JUyBjb250YWlucyBjb2RlIGZyb20gdGhlIGZvbGxvd2luZyBPcGVuIFNvdXJjZSBwcm9qZWN0czoKLQotLSBCYXNlNjQgCi0gIENvcHlyaWdodCAoYykgMjAxMCBSb2JlcnQgSGFyZGVyCi0gIFB1YmxpYyBEb21haW4sIDxodHRwOi8vaWhhcmRlci5uZXQvYmFzZTY0PgotCi0tIEpTT04uc2ltcGxlCi0gIENvcHlyaWdodCAoYykgMjAxMiBZaWRvbmcgRmFuZwotICBBcGFjaGUgTGljZW5zZSAyLjAsIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPgotICAKLSAgCi1PcGVuQ01JUyBjb250YWlucyBPQVNJUyBDTUlTIDEuMCBhbmQgQ01JUyAxLjEgc2NoZW1hIGFuZCBXU0RMIGZpbGVzLgotQ29weXJpZ2h0IChjKSAyMDEwIGFuZCAyMDEzIE9BU0lTIE9wZW4KLTxodHRwczovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2NtaXM+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3JlcG9zaXRvcnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxMGZlZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvcmVwb3NpdG9yeS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWNsYXNzPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JTZXJ2aWNlRmFjdG9yeQotCi1tb3VudC1wYXRoPS8KLQotIyBQcm9wZXJ0aWVzIHByZWZpeGVkIGJ5ICdqY3IuJyBhcmUgcGFzc2VkIHRvIHRoZSByZXBvc2l0b3J5IGZhY3RvcnkgdmVyYmF0aW0KLSMgYWZ0ZXIgcmVtb3ZpbmcgdGhlICdqY3IuJyBwcmVmaXguCi1qY3Iub3JnLmFwYWNoZS5qYWNrcmFiYml0LnJlcG9zaXRvcnkudXJpPWZpbGU6Ly8ve3VzZXIuaG9tZX0vamNyLXJlcG9zaXRvcnkKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvQWJzdHJhY3RKY3JTZXNzaW9uVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9BYnN0cmFjdEpjclNlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmMwODIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9BYnN0cmFjdEpjclNlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyOwotCi1pbXBvcnQgamF2YXguamNyLlNlc3Npb247Ci1pbXBvcnQgamF2YXguamNyLlNpbXBsZUNyZWRlbnRpYWxzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLmltcGwuRGVmYXVsdERvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLmltcGwuRGVmYXVsdEZvbGRlclR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsLkRlZmF1bHRVbnZlcnNpb25lZERvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyVHlwZUhhbmRsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuamFja3JhYmJpdC5hcGkuSmFja3JhYmJpdFNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuVHJhbnNpZW50UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgdGhlIHRlc3QgY2FzZXMgYXJlIGNvdmVyaW5nIEpDUiBjb21wbGlhbmNlLgotICogVGhlIEphY2tyYWJiaXQncyBUcmFuc2llbnRSZXBvc2l0b3J5IGNsYXNzIHVzZXMgYXMgY29udGVudCByZXBvc2l0b3J5LiAgIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKY3JTZXNzaW9uVGVzdCB7Ci0gICAgcHJpdmF0ZSBUcmFuc2llbnRSZXBvc2l0b3J5IHRyYW5zaWVudFJlcG9zaXRvcnk7Ci0gICAgcHJpdmF0ZSBKY3JSZXBvc2l0b3J5IGpjclJlcG9zaXRvcnk7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJpdmF0ZSBKY3JUeXBlTWFuYWdlciB0eXBlTWFuYWdlcjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9VTlRfUEFUSCA9ICIvIjsKLQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyYW5zaWVudFJlcG9zaXRvcnkgPSBuZXcgVHJhbnNpZW50UmVwb3NpdG9yeSgpOwotICAgICAgICBzZXNzaW9uID0gdHJhbnNpZW50UmVwb3NpdG9yeS5sb2dpbihuZXcgU2ltcGxlQ3JlZGVudGlhbHMoImFkbWluSWQiLCAiYWRtaW4iLnRvQ2hhckFycmF5KCkpKTsKLSAgICAgICAgdHlwZU1hbmFnZXIgPSBuZXcgSmNyVHlwZU1hbmFnZXIoKTsKLSAgICAgICAgUGF0aE1hbmFnZXIgcGF0aE1hbmdlciA9IG5ldyBQYXRoTWFuYWdlcihNT1VOVF9QQVRIKTsKLSAgICAgICAgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlciA9IGNyZWF0ZVR5cGVIYW5kbGVyTWFuYWdlcihwYXRoTWFuZ2VyLCB0eXBlTWFuYWdlcik7Ci0gICAgICAgIGpjclJlcG9zaXRvcnkgPSBuZXcgSmNyUmVwb3NpdG9yeSh0cmFuc2llbnRSZXBvc2l0b3J5LCBwYXRoTWFuZ2VyLCB0eXBlTWFuYWdlciwgdHlwZUhhbmRsZXJNYW5hZ2VyKTsKLSAgICB9Ci0KLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cmFuc2llbnRSZXBvc2l0b3J5LnNodXRkb3duKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIGNyZWF0ZVR5cGVIYW5kbGVyTWFuYWdlcihQYXRoTWFuYWdlciBwYXRoTWFuYWdlciwgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIpIHsKLSAgICAgICAgSmNyVHlwZUhhbmRsZXJNYW5hZ2VyIHR5cGVIYW5kbGVyTWFuYWdlciA9IG5ldyBKY3JUeXBlSGFuZGxlck1hbmFnZXIocGF0aE1hbmFnZXIsIHR5cGVNYW5hZ2VyKTsKLSAgICAgICAgdHlwZUhhbmRsZXJNYW5hZ2VyLmFkZEhhbmRsZXIobmV3IERlZmF1bHRGb2xkZXJUeXBlSGFuZGxlcigpKTsKLSAgICAgICAgdHlwZUhhbmRsZXJNYW5hZ2VyLmFkZEhhbmRsZXIobmV3IERlZmF1bHREb2N1bWVudFR5cGVIYW5kbGVyKCkpOwotICAgICAgICB0eXBlSGFuZGxlck1hbmFnZXIuYWRkSGFuZGxlcihuZXcgRGVmYXVsdFVudmVyc2lvbmVkRG9jdW1lbnRUeXBlSGFuZGxlcigpKTsKLSAgICAgICAgcmV0dXJuIHR5cGVIYW5kbGVyTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU2Vzc2lvbiBnZXRTZXNzaW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9pbml0aWFsaXphdGlvbiBvZiB0aGUgVXNlck1hbmFnZXIKLSAgICAgICAgICAgICgoSmFja3JhYmJpdFNlc3Npb24pIHNlc3Npb24pLmdldFVzZXJNYW5hZ2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEpjclJlcG9zaXRvcnkgZ2V0SmNyUmVwb3NpdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGpjclJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdERhdGEgZ2V0Um9vdEZvbGRlcigpewotICAgICAgICByZXR1cm4gZ2V0SmNyUmVwb3NpdG9yeSgpLmdldE9iamVjdEJ5UGF0aChnZXRTZXNzaW9uKCksCi0gICAgICAgICAgICAgICAgTU9VTlRfUEFUSCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JGb2xkZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjckZvbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjZDQ0ZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL0pjckZvbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0aWVzSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5U3RyaW5nSW1wbDsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLS8qKgotICogVGhlIHRlc3QgY292ZXJzIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JSZXBvc2l0b3J5IGNsYXNzLgotICovCi1ASWdub3JlCi1wdWJsaWMgY2xhc3MgSmNyRm9sZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0SmNyU2Vzc2lvblRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGVzdCBvZiB0aGUgcm9vdCBmb2xkZXIKLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSb290Rm9sZGVyKCl7Ci0gICAgICAgIE9iamVjdERhdGEgb2JqRGF0YSA9IGdldFJvb3RGb2xkZXIoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwob2JqRGF0YSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBvZiB0aGUgPGNvZGU+UHJvcGVydHlJZHMuQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFM8L2NvZGU+IG9mIHRoZSBDTUlTIG9iamVjdC4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKY3JUeXBlUHJvcGVydHkoKXsKLSAgICAgICAgZ2V0Um9vdEZvbGRlcigpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgUHJvcGVydGllc0ltcGwgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzSW1wbCgpOwotCi0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5SWRJbXBsKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiY21pczpmb2xkZXIiKSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5U3RyaW5nSW1wbChQcm9wZXJ0eUlkcy5OQU1FLCAiVGVzdEZvbGRlciIpKTsKLSAgICAgICAgU3RyaW5nIHRlc3RGb2xkZXJJZCA9IGdldEpjclJlcG9zaXRvcnkoKS5jcmVhdGVGb2xkZXIoZ2V0U2Vzc2lvbigpLCBwcm9wZXJ0aWVzLCBnZXRSb290Rm9sZGVyKCkuZ2V0SWQoKSk7Ci0gICAgICAgIE9iamVjdERhdGEgdGVzdEZvbGRlciA9IGdldEpjclJlcG9zaXRvcnkoKS5nZXRPYmplY3QoZ2V0U2Vzc2lvbigpLCB0ZXN0Rm9sZGVySWQsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodGVzdEZvbGRlci5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5BTExPV0VEX0NISUxEX09CSkVDVF9UWVBFX0lEUykuZ2V0VmFsdWVzKCkpOwotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvSmNyT2JzZXJ2YXRpb25Kb3VybmFsVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JPYnNlcnZhdGlvbkpvdXJuYWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzlhMjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9KY3JPYnNlcnZhdGlvbkpvdXJuYWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ2hhbmdlRXZlbnRJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNoYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnRpZXNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUlkSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdJbXBsOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQElnbm9yZQotcHVibGljIGNsYXNzIEpjck9ic2VydmF0aW9uSm91cm5hbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpjclNlc3Npb25UZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBBR0VfU0laRSA9IG5ldyBCaWdJbnRlZ2VyKCI0Iik7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKENhcGFiaWxpdHlDaGFuZ2VzLk9CSkVDVElEU09OTFksIGdldEpjclJlcG9zaXRvcnkoKQotICAgICAgICAgICAgICAgIC5nZXRSZXBvc2l0b3J5SW5mbyhnZXRTZXNzaW9uKCkpLmdldENhcGFiaWxpdGllcygpCi0gICAgICAgICAgICAgICAgLmdldENoYW5nZXNDYXBhYmlsaXR5KCkpOwotCi0gICAgICAgIGZpbGxPYnNlcnZhdGlvbkpvdXJuYWwoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPYnNlcnZhdGlvbkpvdXJuYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRklYTUUgbm90IHN1Y2ggbWV0aG9kOiBKY3JSZXBvc2l0b3J5LmdldENvbnRlbnRDaGFuZ2VzKCkKLS8vICAgICAgICBPYmplY3RMaXN0IG9iakxpc3QgPSBnZXRKY3JSZXBvc2l0b3J5KCkuZ2V0Q29udGVudENoYW5nZXMoZ2V0U2Vzc2lvbigpLAotLy8gICAgICAgICAgICAgICAgbnVsbCwgZmFsc2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgUEFHRV9TSVpFLCBudWxsKTsKLSAgICAgICAgT2JqZWN0TGlzdCBvYmpMaXN0ID0gbnVsbDsKLQotICAgICAgICAvL1RoZSByZXBvc2l0b3J5IHN1cHBvcnRzIGpvdXJuYWxlZCBvYnNlcnZhdGlvbgotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChvYmpMaXN0KTsKLQotICAgICAgICAvL2V2ZW50IGxpc3QgaXNuJ3QgZW1wdHkKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlLCAhb2JqTGlzdC5nZXRPYmplY3RzKCkuaXNFbXB0eSgpKTsKLQotICAgICAgICBDaGFuZ2VFdmVudEluZm8gbGF0ZXN0Q2hhbmdlRXZlbnQgPSBvYmpMaXN0LmdldE9iamVjdHMoKQotICAgICAgICAgICAgICAgIC5nZXQob2JqTGlzdC5nZXROdW1JdGVtcygpLmludFZhbHVlKCkgLSAxKS5nZXRDaGFuZ2VFdmVudEluZm8oKTsKLSAgICAgICAgbG9uZyBwcmV2aW91c0NoYW5nZUxvZ1Rva2VuID0gbGF0ZXN0Q2hhbmdlRXZlbnQuZ2V0Q2hhbmdlVGltZSgpLmdldFRpbWVJbk1pbGxpcygpOwotICAgICAgICAvLyBGSVhNRSBub3Qgc3VjaCBtZXRob2Q6IEpjclJlcG9zaXRvcnkuZ2V0Q29udGVudENoYW5nZXMoKQotLy8gICAgICAgIG9iakxpc3QgPSBnZXRKY3JSZXBvc2l0b3J5KCkuZ2V0Q29udGVudENoYW5nZXMoZ2V0U2Vzc2lvbigpLAotLy8gICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YocHJldmlvdXNDaGFuZ2VMb2dUb2tlbiksIGZhbHNlLCBudWxsLCBmYWxzZSwgZmFsc2UsIFBBR0VfU0laRSwgbnVsbCk7Ci0KLSAgICAgICAgbGF0ZXN0Q2hhbmdlRXZlbnQgPSBvYmpMaXN0LmdldE9iamVjdHMoKQotICAgICAgICAgICAgICAgIC5nZXQob2JqTGlzdC5nZXROdW1JdGVtcygpLmludFZhbHVlKCkgLSAxKS5nZXRDaGFuZ2VFdmVudEluZm8oKTsKLQotICAgICAgICBsb25nIGxhdGVzdENoYW5nZUxvZ1Rva2VuID0gbGF0ZXN0Q2hhbmdlRXZlbnQuZ2V0Q2hhbmdlVGltZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCi0gICAgICAgIC8vRW5zdXJlIHRoZSBsYXRlc3QgY2hhbmdlIGxvZyB0b2tlbiBpcyB0aGUgcmVhbGx5IGxhdGVzdCBvbmUuCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgbGF0ZXN0Q2hhbmdlTG9nVG9rZW4gPiBwcmV2aW91c0NoYW5nZUxvZ1Rva2VuKTsKLQotICAgICAgICAvL0luIGpvdXJuYWwgbXVzdCByZW1haW4gc29tZSBldmVudHMuCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvYmpMaXN0Lmhhc01vcmVJdGVtcygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbE9ic2VydmF0aW9uSm91cm5hbCgpIHsKLSAgICAgICAgUHJvcGVydGllc0ltcGwgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzSW1wbCgpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eVN0cmluZ0ltcGwoUHJvcGVydHlJZHMuTkFNRSwgIk9CU0VSVkFUSU9OX1RFU1RfRk9MREVSIikpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZFByb3BlcnR5KG5ldyBQcm9wZXJ0eUlkSW1wbChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgImNtaXM6Zm9sZGVyIikpOwotCi0gICAgICAgIFN0cmluZyB0ZXN0Rm9sZGVySWQgPSBnZXRKY3JSZXBvc2l0b3J5KCkuY3JlYXRlRm9sZGVyKGdldFNlc3Npb24oKSwgcHJvcGVydGllcywgZ2V0Um9vdEZvbGRlcigpLmdldElkKCkpOwotICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNJbXBsKCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkUHJvcGVydHkobmV3IFByb3BlcnR5U3RyaW5nSW1wbChQcm9wZXJ0eUlkcy5OQU1FLCAiTkVXX05BTUVfVEVTVF9GT0xERVIiKSk7Ci0gICAgICAgIGdldEpjclJlcG9zaXRvcnkoKS5nZXRKY3JOb2RlKGdldFNlc3Npb24oKSwgdGVzdEZvbGRlcklkKQotICAgICAgICAgICAgLnVwZGF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgIGdldEpjclJlcG9zaXRvcnkoKS5kZWxldGVPYmplY3QoZ2V0U2Vzc2lvbigpLCB0ZXN0Rm9sZGVySWQsIHRydWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjci9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci9xdWVyeS9RdWVyeVRyYW5zbGF0b3JUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L1F1ZXJ5VHJhbnNsYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxYzAyOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L1F1ZXJ5VHJhbnNsYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5xdWVyeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuUGF0aE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLmltcGwuRGVmYXVsdERvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLmltcGwuRGVmYXVsdEZvbGRlclR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsLkRlZmF1bHRVbnZlcnNpb25lZERvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyVHlwZUhhbmRsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci51dGlsLklTTzg2MDE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ2FsZW5kYXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFF1ZXJ5VHJhbnNsYXRvclRlc3QgewotICAgIHByaXZhdGUgU3RyaW5nIGpjclR5cGVDb25kaXRpb247Ci0KLSAgICBwcml2YXRlIFF1ZXJ5VHJhbnNsYXRvciBxdWVyeVRyYW5zbGF0b3I7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXIgPSBuZXcgSmNyVHlwZU1hbmFnZXIoKTsKLSAgICAgICAgUGF0aE1hbmFnZXIgcGF0aE1hbmFnZXIgPSBuZXcgUGF0aE1hbmFnZXIoUGF0aE1hbmFnZXIuQ01JU19ST09UX1BBVEgpOwotICAgICAgICBKY3JUeXBlSGFuZGxlck1hbmFnZXIgdHlwZUhhbmRsZXJNYW5hZ2VyID0gbmV3IEpjclR5cGVIYW5kbGVyTWFuYWdlcihwYXRoTWFuYWdlciwgdHlwZU1hbmFnZXIpOwotICAgICAgICB0eXBlSGFuZGxlck1hbmFnZXIuYWRkSGFuZGxlcihuZXcgRGVmYXVsdEZvbGRlclR5cGVIYW5kbGVyKCkpOwotICAgICAgICB0eXBlSGFuZGxlck1hbmFnZXIuYWRkSGFuZGxlcihuZXcgRGVmYXVsdERvY3VtZW50VHlwZUhhbmRsZXIoKSk7Ci0gICAgICAgIHR5cGVIYW5kbGVyTWFuYWdlci5hZGRIYW5kbGVyKG5ldyBEZWZhdWx0VW52ZXJzaW9uZWREb2N1bWVudFR5cGVIYW5kbGVyKCkpOwotCi0gICAgICAgIHF1ZXJ5VHJhbnNsYXRvciA9IG5ldyBRdWVyeVRyYW5zbGF0b3IodHlwZU1hbmFnZXIpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclBhdGhGcm9tSWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIvamNyOiIgKyBpZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclBhdGhGcm9tQ29sKFR5cGVEZWZpbml0aW9uIGZyb21UeXBlLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZnJvbVR5cGUpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgiY21pczoiLCAiQGpjcjoiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclR5cGVOYW1lKFR5cGVEZWZpbml0aW9uIGZyb21UeXBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmcm9tVHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZyb21UeXBlLmdldFF1ZXJ5TmFtZSgpLnJlcGxhY2UoImNtaXM6IiwgImpjcjoiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGpjclR5cGVDb25kaXRpb24oVHlwZURlZmluaXRpb24gZnJvbVR5cGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZyb21UeXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gamNyVHlwZUNvbmRpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVRyYW5zbGF0b3IoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290Ly9lbGVtZW50KCosamNyOmRvY3VtZW50KSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbQGpjcjppc0xhdGVzdFZlcnNpb24gPSAnZm9vJ10iLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgY21pczppc0xhdGVzdFZlcnNpb249J2ZvbyciKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpW2pjcjpsaWtlKEBqY3I6aXNMYXRlc3RWZXJzaW9uLCAnZm9vJyldIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNtaXM6aXNMYXRlc3RWZXJzaW9uIExJS0UgJ2ZvbyciKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpW25vdChqY3I6bGlrZShAamNyOmlzTGF0ZXN0VmVyc2lvbiwgJ2ZvbycpKV0iLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOmlzTGF0ZXN0VmVyc2lvbiBOT1QgTElLRSAnZm9vJyIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbQGpjcjppc0xhdGVzdFZlcnNpb24gPSAnZm9vJyBhbmQgQGpjcjpuYW1lICE9ICdiYXonXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNtaXM6aXNMYXRlc3RWZXJzaW9uPSdmb28nIEFORCBjbWlzOm5hbWU8PidiYXonIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290Ly9lbGVtZW50KCosamNyOmRvY3VtZW50KVtub3QoKEBqY3I6aXNMYXRlc3RWZXJzaW9uID4gJ2Zvbycgb3IgQGpjcjpuYW1lIDwgMS4wKSldIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgTk9UIChjbWlzOmlzTGF0ZXN0VmVyc2lvbj4nZm9vJyBPUiBjbWlzOm5hbWU8IDEuMCkiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpWyhAamNyOm5hbWUgPSAnZm9vJyBvciBAamNyOm9iamVjdElkID0gJ2JheicgYW5kIEBqY3I6Y3JlYXRlZEJ5ID0gJ2JhcicpXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNtaXM6bmFtZSA9ICdmb28nIG9yIGNtaXM6b2JqZWN0SWQgPSAnYmF6JyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBjbWlzOmNyZWF0ZWRCeSA9ICdiYXInIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290Ly9lbGVtZW50KCosamNyOmRvY3VtZW50KVsoQGpjcjpuYW1lID0gJ2ZvbycgYW5kIEBqY3I6b2JqZWN0SWQgPSAnYmF6JyBvciBAamNyOmNyZWF0ZWRCeSA9ICdiYXInKV0iLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOm5hbWUgPSAnZm9vJyBhbmQgY21pczpvYmplY3RJZCA9ICdiYXonICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgY21pczpjcmVhdGVkQnkgPSAnYmFyJyIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbQGpjcjpuYW1lID0gJ2ZvbycgYW5kIChAamNyOm9iamVjdElkID0gJ2Jheicgb3IgQGpjcjpjcmVhdGVkQnkgPSAnYmFyJyldIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgY21pczpuYW1lID0gJ2ZvbycgYW5kIChjbWlzOm9iamVjdElkID0gJ2JheicgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBjbWlzOmNyZWF0ZWRCeSA9ICdiYXInKSIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC9qY3I6Zm9sZGVySWQvZWxlbWVudCgqLGpjcjpkb2N1bWVudCkiLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9GT0xERVIoJ2ZvbGRlcklkJykiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIG5vdChub3QoSU5fRk9MREVSKCdmb2xkZXJJZCcpKSkiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkLy9lbGVtZW50KCosamNyOmRvY3VtZW50KSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9UUkVFKCdmb2xkZXJJZCcpIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290L2pjcjpmb2xkZXJJZC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudCkiLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgbm90KG5vdChJTl9UUkVFKCdmb2xkZXJJZCcpKSkiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpW0BqY3I6bmFtZSA8PSAxXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIElOX0ZPTERFUignZm9sZGVySWQnKSBBTkQgY21pczpuYW1lIDw9IDEiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkLy9lbGVtZW50KCosamNyOmRvY3VtZW50KVtAamNyOm5hbWUgPj0gJ25hbWUnIGFuZCBAamNyOm5hbWUgPSB0cnVlXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIElOX1RSRUUoJ2ZvbGRlcklkJykgQU5EIGNtaXM6bmFtZSA+PSAnbmFtZScgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBTkQgY21pczpuYW1lID0gVFJVRSIpKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBkYXRlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290L2pjcjpmb2xkZXJJZC9lbGVtZW50KCosamNyOmRvY3VtZW50KVtub3QoQGpjcjpjcmVhdGlvbkRhdGUgPSB4czpkYXRlVGltZSgnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBJU084NjAxLmZvcm1hdChkYXRlKSArICInKSldIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgTk9UKE5PVCBJTl9GT0xERVIoJ2ZvbGRlcklkJykgT1IgY21pczpjcmVhdGlvbkRhdGUgPSBUSU1FU1RBTVAgJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhckhlbHBlci50b1N0cmluZyhkYXRlKSArICInKSIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbamNyOmNvbnRhaW5zKGpjcjpjb250ZW50LCAnXHU0RTJEXHU2NTg3JyldIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNvbnRhaW5zKCdcdTRFMkRcdTY1ODcnKSIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbamNyOmNvbnRhaW5zKGpjcjpjb250ZW50LCAnZm9vIGJhcicpXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjb250YWlucygnZm9vIEFORCBiYXInKSIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbamNyOmNvbnRhaW5zKGpjcjpjb250ZW50LCAnZm9vIE9SIGJhcicpXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjb250YWlucygnZm9vIE9SIGJhcicpIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290Ly9lbGVtZW50KCosamNyOmRvY3VtZW50KVtqY3I6Y29udGFpbnMoamNyOmNvbnRlbnQsICdmb28gLWJhcicpXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjb250YWlucygnZm9vIC1iYXInKSIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbamNyOmNvbnRhaW5zKGpjcjpjb250ZW50LCAnZm9vIFwiYmFyIHBocmFzZVwiJyldIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNvbnRhaW5zKCdmb28gXCJiYXIgcGhyYXNlXCInKSIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbamNyOmNvbnRhaW5zKGpjcjpjb250ZW50LCAnZm9vIC1cImJhciBwaHJhc2VcIicpXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjb250YWlucygnZm9vIC1cImJhciBwaHJhc2VcIicpIikpOwotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlXaXRoT3JkZXJCeSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpb3JkZXIgYnkgQGpjcjpuYW1lIGFzY2VuZGluZyIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCBvcmRlciBieSBjbWlzOm5hbWUiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpW0BqY3I6aXNMYXRlc3RWZXJzaW9uID0gJ2Zvbyddb3JkZXIgYnkgQGpjcjpuYW1lIGRlc2NlbmRpbmciLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOmlzTGF0ZXN0VmVyc2lvbj0nZm9vJyBvcmRlciBieSBjbWlzOm5hbWUgZGVzYyIpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbamNyOmxpa2UoQGpjcjppc0xhdGVzdFZlcnNpb24sICdmb28nKV1vcmRlciBieSBAamNyOm5hbWUgYXNjZW5kaW5nLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIkBqY3I6b2JqZWN0SWQgZGVzY2VuZGluZyIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNtaXM6aXNMYXRlc3RWZXJzaW9uIExJS0UgJ2Zvbycgb3JkZXIgYnkgY21pczpuYW1lIGFzYywgY21pczpvYmplY3RJZCBkZXNjIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5VHJhbnNsYXRvcldpdGhUeXBlQ29uZGl0aW9uKCkgewotICAgICAgICBqY3JUeXBlQ29uZGl0aW9uID0gIkBqY3I6cHJpbWFyeVR5cGUgPSBudDpiYXNlIjsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIi9qY3I6cm9vdC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbQGpjcjpwcmltYXJ5VHlwZSA9IG50OmJhc2VdIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290Ly9lbGVtZW50KCosamNyOmRvY3VtZW50KVtAamNyOnByaW1hcnlUeXBlID0gbnQ6YmFzZSBhbmQgQGpjcjppc0xhdGVzdFZlcnNpb24gPSAnZm9vJ10iLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgY21pczppc0xhdGVzdFZlcnNpb249J2ZvbyciKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpW0BqY3I6cHJpbWFyeVR5cGUgPSBudDpiYXNlXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9GT0xERVIoJ2ZvbGRlcklkJykiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpW0BqY3I6cHJpbWFyeVR5cGUgPSBudDpiYXNlXSIsCi0gICAgICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBub3Qobm90KElOX0ZPTERFUignZm9sZGVySWQnKSkpIikpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiL2pjcjpyb290L2pjcjpmb2xkZXJJZC8vZWxlbWVudCgqLGpjcjpkb2N1bWVudClbQGpjcjpwcmltYXJ5VHlwZSA9IG50OmJhc2VdIiwKLSAgICAgICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIElOX1RSRUUoJ2ZvbGRlcklkJykiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkLy9lbGVtZW50KCosamNyOmRvY3VtZW50KVtAamNyOnByaW1hcnlUeXBlID0gbnQ6YmFzZV0iLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgbm90KG5vdChJTl9UUkVFKCdmb2xkZXJJZCcpKSkiKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICIvamNyOnJvb3QvamNyOmZvbGRlcklkL2VsZW1lbnQoKixqY3I6ZG9jdW1lbnQpW0BqY3I6cHJpbWFyeVR5cGUgPSBudDpiYXNlIGFuZCBAamNyOm5hbWUgPD0gMV0iLAotICAgICAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9GT0xERVIoJ2ZvbGRlcklkJykgQU5EIGNtaXM6bmFtZSA8PSAxIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5VHJhbnNsYXRvclF1ZXJ5VG9vU3BlY2lmaWMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBOT1QgSU5fRk9MREVSKCdmb2xkZXJJZCcpIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgKLSAgICAgICAgICAgICAgICAgICAgInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBOT1QoTk9UIElOX0ZPTERFUignZm9sZGVySWQnKSBBTkQgY21pczpuYW1lID0gJ25hbWUnKSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7IH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgSU5fRk9MREVSKCdmb2xkZXJJZCcpIE9SIGNtaXM6bmFtZSA9ICduYW1lJyIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7IH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgTk9UKElOX0ZPTERFUignZm9sZGVySWQnKSBBTkQgY21pczpuYW1lID0gJ25hbWUnKSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7IH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgSU5fRk9MREVSKCdmb2xkZXIxSWQnKSBPUiBJTl9UUkVFKCdmb2xkZXIySWQnKSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7IH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoCi0gICAgICAgICAgICAgICAgICAgICJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgSU5fRk9MREVSKCdmb2xkZXIxSWQnKSBBTkQgTk9UIElOX1RSRUUoJ2ZvbGRlcjJJZCcpIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vdEltcGxlbWVudGVkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcXVlcnlUcmFuc2xhdG9yLnRyYW5zbGF0ZVRvWFBhdGgoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOm5hbWUgaW4gKDEsMiwzKSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlICdmb28nID0gQU5ZIGNtaXM6bmFtZSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRRdWVyeSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKCIiKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHF1ZXJ5VHJhbnNsYXRvci50cmFuc2xhdGVUb1hQYXRoKCJzZWxlY3QgKiBmcm9tIGNtaXM6c29tZXRoaW5nIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IFdIRVJFIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBxdWVyeVRyYW5zbGF0b3IudHJhbnNsYXRlVG9YUGF0aCgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IFdIRVJFIGNtaXM6c29tZXRoaW5nID0gJ2ZvbyciKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvamNyL3F1ZXJ5L1hQYXRoQnVpbGRlclRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvWFBhdGhCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTE4ZTAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9qY3IvcXVlcnkvWFBhdGhCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnF1ZXJ5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5qY3IuUGF0aE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLmltcGwuRGVmYXVsdERvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLmltcGwuRGVmYXVsdEZvbGRlclR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5pbXBsLkRlZmF1bHRVbnZlcnNpb25lZERvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuamNyLnR5cGUuSmNyVHlwZUhhbmRsZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci51dGlsLklTTzg2MDE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ2FsZW5kYXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuUXVlcnlPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuUXVlcnlVdGlsU3RyaWN0OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYUGF0aEJ1aWxkZXJUZXN0IHsKLQotICAgIHByaXZhdGUgSmNyVHlwZU1hbmFnZXIgdHlwZU1hbmFnZXI7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHlwZU1hbmFnZXIgPSBuZXcgSmNyVHlwZU1hbmFnZXIoKTsKLSAgICAgICAgUGF0aE1hbmFnZXIgcGF0aE1hbmFnZXIgPSBuZXcgUGF0aE1hbmFnZXIoUGF0aE1hbmFnZXIuQ01JU19ST09UX1BBVEgpOwotICAgICAgICBKY3JUeXBlSGFuZGxlck1hbmFnZXIgdHlwZUhhbmRsZXJNYW5hZ2VyID0gbmV3IEpjclR5cGVIYW5kbGVyTWFuYWdlcihwYXRoTWFuYWdlciwgdHlwZU1hbmFnZXIpOwotICAgICAgICB0eXBlSGFuZGxlck1hbmFnZXIuYWRkSGFuZGxlcihuZXcgRGVmYXVsdEZvbGRlclR5cGVIYW5kbGVyKCkpOwotICAgICAgICB0eXBlSGFuZGxlck1hbmFnZXIuYWRkSGFuZGxlcihuZXcgRGVmYXVsdERvY3VtZW50VHlwZUhhbmRsZXIoKSk7Ci0gICAgICAgIHR5cGVIYW5kbGVyTWFuYWdlci5hZGRIYW5kbGVyKG5ldyBEZWZhdWx0VW52ZXJzaW9uZWREb2N1bWVudFR5cGVIYW5kbGVyKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkUXVlcnkoKSB7Ci0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQiLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbGlzdCgpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgY21pczppc0xhdGVzdFZlcnNpb249J2ZvbyciLAotICAgICAgICAgICAgICAgICJjbWlzOmlzTGF0ZXN0VmVyc2lvbiA9ICdmb28nIiwKLSAgICAgICAgICAgICAgICBsaXN0KCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOmlzTGF0ZXN0VmVyc2lvbiBMSUtFICdmb28nIiwKLSAgICAgICAgICAgICAgICAiamNyOmxpa2UoY21pczppc0xhdGVzdFZlcnNpb24sICdmb28nKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgY21pczppc0xhdGVzdFZlcnNpb24gTk9UIExJS0UgJ2ZvbyciLAotICAgICAgICAgICAgICAgICJub3QoamNyOmxpa2UoY21pczppc0xhdGVzdFZlcnNpb24sICdmb28nKSkiLAotICAgICAgICAgICAgICAgIGxpc3QoKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNtaXM6aXNMYXRlc3RWZXJzaW9uPSdmb28nIEFORCBjbWlzOm5hbWU8PidiYXonIiwKLSAgICAgICAgICAgICAgICAiY21pczppc0xhdGVzdFZlcnNpb24gPSAnZm9vJyBhbmQgY21pczpuYW1lICE9ICdiYXonIiwKLSAgICAgICAgICAgICAgICBsaXN0KCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBOT1QgKGNtaXM6aXNMYXRlc3RWZXJzaW9uPidmb28nIE9SIGNtaXM6bmFtZTwgMS4wKSIsCi0gICAgICAgICAgICAgICAgIm5vdCgoY21pczppc0xhdGVzdFZlcnNpb24gPiAnZm9vJyBvciBjbWlzOm5hbWUgPCAxLjApKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgY21pczpuYW1lID0gJ2Zvbycgb3IgY21pczpvYmplY3RJZCA9ICdiYXonIGFuZCBjbWlzOmNyZWF0ZWRCeSA9ICdiYXInIiwKLSAgICAgICAgICAgICAgICAiKGNtaXM6bmFtZSA9ICdmb28nIG9yIGNtaXM6b2JqZWN0SWQgPSAnYmF6JyBhbmQgY21pczpjcmVhdGVkQnkgPSAnYmFyJykiLAotICAgICAgICAgICAgICAgIGxpc3QoKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIGNtaXM6bmFtZSA9ICdmb28nIGFuZCBjbWlzOm9iamVjdElkID0gJ2Jheicgb3IgY21pczpjcmVhdGVkQnkgPSAnYmFyJyIsCi0gICAgICAgICAgICAgICAgIihjbWlzOm5hbWUgPSAnZm9vJyBhbmQgY21pczpvYmplY3RJZCA9ICdiYXonIG9yIGNtaXM6Y3JlYXRlZEJ5ID0gJ2JhcicpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOm5hbWUgPSAnZm9vJyBhbmQgKGNtaXM6b2JqZWN0SWQgPSAnYmF6JyBvciBjbWlzOmNyZWF0ZWRCeSA9ICdiYXInKSIsCi0gICAgICAgICAgICAgICAgImNtaXM6bmFtZSA9ICdmb28nIGFuZCAoY21pczpvYmplY3RJZCA9ICdiYXonIG9yIGNtaXM6Y3JlYXRlZEJ5ID0gJ2JhcicpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9GT0xERVIoJ2ZvbGRlcklkJykiLAotICAgICAgICAgICAgICAgICJmb2xkZXJJZC8iLAotICAgICAgICAgICAgICAgIGxpc3QoImZvbGRlcklkLyIpLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIG5vdChub3QoSU5fRk9MREVSKCdmb2xkZXJJZCcpKSkiLAotICAgICAgICAgICAgICAgICJ0cnVlKCkiLAotICAgICAgICAgICAgICAgIGxpc3QoImZvbGRlcklkLyIpLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIElOX1RSRUUoJ2ZvbGRlcklkJykiLAotICAgICAgICAgICAgICAgICJmb2xkZXJJZC8vIiwKLSAgICAgICAgICAgICAgICBsaXN0KCJmb2xkZXJJZC8vIiksCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgbm90KG5vdChJTl9UUkVFKCdmb2xkZXJJZCcpKSkiLAotICAgICAgICAgICAgICAgICJ0cnVlKCkiLAotICAgICAgICAgICAgICAgIGxpc3QoImZvbGRlcklkLy8iKSwKLSAgICAgICAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9GT0xERVIoJ2ZvbGRlcklkJykgQU5EIGNtaXM6bmFtZSA8PSAxIiwKLSAgICAgICAgICAgICAgICAiY21pczpuYW1lIDw9IDEiLAotICAgICAgICAgICAgICAgIGxpc3QoImZvbGRlcklkLyIpLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIElOX1RSRUUoJ2ZvbGRlcklkJykgQU5EIGNtaXM6bmFtZSA+PSAnbmFtZScgQU5EIGNtaXM6bmFtZSA9IFRSVUUiLAotICAgICAgICAgICAgICAgICJjbWlzOm5hbWUgPj0gJ25hbWUnIGFuZCBjbWlzOm5hbWUgPSB0cnVlIiwKLSAgICAgICAgICAgICAgICBsaXN0KCJmb2xkZXJJZC8vIiksCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGRhdGUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBOT1QoTk9UIElOX0ZPTERFUignZm9sZGVySWQnKSBPUiBjbWlzOm5hbWUgPSBUSU1FU1RBTVAgJyIgKwotICAgICAgICAgICAgICAgIENhbGVuZGFySGVscGVyLnRvU3RyaW5nKGRhdGUpICsgIicpIiwKLSAgICAgICAgICAgICAgICAibm90KGNtaXM6bmFtZSA9IHhzOmRhdGVUaW1lKCciICsgSVNPODYwMS5mb3JtYXQoZGF0ZSkgKyAiJykpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCJmb2xkZXJJZC8iKSwKLSAgICAgICAgICAgICAgICBmYWxzZSk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOm5hbWUgSVMgTlVMTCIsCi0gICAgICAgICAgICAgICAgImNtaXM6bmFtZSIsCi0gICAgICAgICAgICAgICAgbGlzdCgpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgY21pczpuYW1lIElTIE5PVCBOVUxMIiwKLSAgICAgICAgICAgICAgICAibm90KGNtaXM6bmFtZSkiLAotICAgICAgICAgICAgICAgIGxpc3QoKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIENPTlRBSU5TKCdmb28nKSIsCi0gICAgICAgICAgICAgICAgImpjcjpjb250YWlucyhqY3I6Y29udGVudCwgJ2ZvbycpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBDT05UQUlOUygnZm9vIEFORCBiYXInKSIsCi0gICAgICAgICAgICAgICAgImpjcjpjb250YWlucyhqY3I6Y29udGVudCwgJ2ZvbyBiYXInKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgQ09OVEFJTlMoJ2ZvbyBPUiBiYXInKSIsCi0gICAgICAgICAgICAgICAgImpjcjpjb250YWlucyhqY3I6Y29udGVudCwgJ2ZvbyBPUiBiYXInKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgQ09OVEFJTlMoJ2ZvbyAtYmFyJykiLAotICAgICAgICAgICAgICAgICJqY3I6Y29udGFpbnMoamNyOmNvbnRlbnQsICdmb28gLWJhcicpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBDT05UQUlOUygnZm9vIEFORCBcImJhciBwaHJhc2VcIicpIiwKLSAgICAgICAgICAgICAgICAiamNyOmNvbnRhaW5zKGpjcjpjb250ZW50LCAnZm9vIFwiYmFyIHBocmFzZVwiJykiLAotICAgICAgICAgICAgICAgIGxpc3QoKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIENPTlRBSU5TKCdmb28gQU5EIC1cImJhciBwaHJhc2VcIicpIiwKLSAgICAgICAgICAgICAgICAiamNyOmNvbnRhaW5zKGpjcjpjb250ZW50LCAnZm9vIC1cImJhciBwaHJhc2VcIicpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9vU3BlY2lmaWNRdWVyeSgpIHsKLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBOT1QgSU5fRk9MREVSKCdmb2xkZXJJZCcpIiwKLSAgICAgICAgICAgICAgICAiZmFsc2UoKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgiZm9sZGVySWQvIiksCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBOT1QoTk9UIElOX0ZPTERFUignZm9sZGVySWQnKSBBTkQgY21pczpuYW1lID0gJ25hbWUnKSIsCi0gICAgICAgICAgICAgICAgInRydWUoKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgiZm9sZGVySWQvIiksCi0gICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9GT0xERVIoJ2ZvbGRlcklkJykgT1IgY21pczpuYW1lID0gJ25hbWUnIiwKLSAgICAgICAgICAgICAgICAidHJ1ZSgpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCJmb2xkZXJJZC8iKSwKLSAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICBjaGVjaygic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IHdoZXJlIE5PVChJTl9GT0xERVIoJ2ZvbGRlcklkJykgQU5EIGNtaXM6bmFtZSA9ICduYW1lJykiLAotICAgICAgICAgICAgICAgICJub3QoY21pczpuYW1lID0gJ25hbWUnKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgiZm9sZGVySWQvIiksCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgY2hlY2soInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBJTl9GT0xERVIoJ2ZvbGRlcjFJZCcpIE9SIElOX1RSRUUoJ2ZvbGRlcjJJZCcpIiwKLSAgICAgICAgICAgICAgICAidHJ1ZSgpIiwKLSAgICAgICAgICAgICAgICBsaXN0KCJmb2xkZXIxSWQvIiwgImZvbGRlcjJJZC8vIiksCi0gICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIGNoZWNrKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgSU5fRk9MREVSKCdmb2xkZXIxSWQnKSBBTkQgTk9UIElOX1RSRUUoJ2ZvbGRlcjJJZCcpIiwKLSAgICAgICAgICAgICAgICAiZmFsc2UoKSIsCi0gICAgICAgICAgICAgICAgbGlzdCgiZm9sZGVyMUlkLyIsICJmb2xkZXIySWQvLyIpLAotICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RJbXBsZW1lbnRlZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGUoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCB3aGVyZSBjbWlzOm5hbWUgaW4gKDEsMiwzKSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlKCJzZWxlY3QgKiBmcm9tIGNtaXM6ZG9jdW1lbnQgd2hlcmUgJ2ZvbycgPSBBTlkgY21pczpuYW1lIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFF1ZXJ5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZSgiIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGUoInNlbGVjdCAqIGZyb20gY21pczpzb21ldGhpbmciKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkge30KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBjbWlzOmRvY3VtZW50IFdIRVJFIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGUoInNlbGVjdCAqIGZyb20gY21pczpkb2N1bWVudCBXSEVSRSBjbWlzOnNvbWV0aGluZyA9ICdmb28nIik7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHt9Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08IHByaXZhdGUgPi0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGxpc3QoU3RyaW5nLi4uIGVsZW1lbnRzKSB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGVsZW1lbnRzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhQYXRoQnVpbGRlciBleGVjdXRlKFN0cmluZyBzdGF0ZW1lbnQpIHsKLSAgICAgICAgUXVlcnlPYmplY3QgcXVlcnlPYmplY3QgPSBuZXcgUXVlcnlPYmplY3QodHlwZU1hbmFnZXIpOwotICAgICAgICBQYXJzZVRyZWVXYWxrZXI8WFBhdGhCdWlsZGVyPiBwYXJzZVRyZWVXYWxrZXIgPSBuZXcgUGFyc2VUcmVlV2Fsa2VyPFhQYXRoQnVpbGRlcj4obmV3IEV2YWx1YXRvclhQYXRoKCkpOwotICAgICAgICBRdWVyeVV0aWxTdHJpY3QgcXVlcnlVdGlsID0gbmV3IFF1ZXJ5VXRpbFN0cmljdChzdGF0ZW1lbnQsIHR5cGVNYW5hZ2VyLCBwYXJzZVRyZWVXYWxrZXIpOwotICAgICAgICBxdWVyeVV0aWwucHJvY2Vzc1N0YXRlbWVudFVzaW5nQ21pc0V4Y2VwdGlvbnMoKTsKLSAgICAgICAgcmV0dXJuIHBhcnNlVHJlZVdhbGtlci5nZXRSZXN1bHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2soU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgcmVzdWx0LCBMaXN0PFN0cmluZz4gZm9sZGVyUHJlZGljYXRlcywgQm9vbGVhbiBldmFsdWF0aW9uKSB7Ci0gICAgICAgIFhQYXRoQnVpbGRlciBxdWVyeUJ1aWxkZXIgPSBleGVjdXRlKHF1ZXJ5KTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcXVlcnlCdWlsZGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIHF1ZXJ5QnVpbGRlci54UGF0aCgpKTsKLQotICAgICAgICAgICAgSXRlcmF0b3I8WFBhdGhCdWlsZGVyPiBmb2xkZXJQcmVkaWNhdGVzQnVpbGRlciA9IHF1ZXJ5QnVpbGRlci5mb2xkZXJQcmVkaWNhdGVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGZvbGRlclByZWRpY2F0ZSA6IGZvbGRlclByZWRpY2F0ZXMpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZvbGRlclByZWRpY2F0ZXNCdWlsZGVyLmhhc05leHQoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbGRlclByZWRpY2F0ZSwgZm9sZGVyUHJlZGljYXRlc0J1aWxkZXIubmV4dCgpLnhQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZm9sZGVyUHJlZGljYXRlc0J1aWxkZXIuaGFzTmV4dCgpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV2YWx1YXRpb24sIHF1ZXJ5QnVpbGRlci5ldmFsKGZhbHNlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phY2tyYWJiaXQvY29yZS9zZWN1cml0eS9UZXN0U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYWNrcmFiYml0L2NvcmUvc2VjdXJpdHkvVGVzdFNlY3VyaXR5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTlhNDQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phY2tyYWJiaXQvY29yZS9zZWN1cml0eS9UZXN0U2VjdXJpdHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLQotaW1wb3J0IGphdmF4Lmpjci5SZXBvc2l0b3J5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lmpjci5TZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5qYWNrcmFiYml0LmFwaS5zZWN1cml0eS51c2VyLkF1dGhvcml6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmphY2tyYWJiaXQuYXBpLnNlY3VyaXR5LnVzZXIuVXNlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuU2Vzc2lvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuc2VjdXJpdHkuc2ltcGxlLlNpbXBsZVNlY3VyaXR5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5zZWN1cml0eS51c2VyLlVzZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLnNlY3VyaXR5LnVzZXIuVXNlck1hbmFnZXJJbXBsOwotCi0vKioKLSAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgb2JzZXJ2YXRpb24gam91cm5hbC4gSXQgcmVwcmVzZW50cyBjdXJyZW50IHVzZXIgYXMgYWRtaW5pc3RyYXRvci4gIAotICogVGhlIHJlYXNvbiB0byB1c2Ugb25lIGlzIFNpbXBsZVNlY3VyaXR5TWFuYWdlciBkb2Vzbid0IHN1cHBvcnQgVXNlck1hbmFnZXIgb2YgYSBzZXNzaW9uLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFNlY3VyaXR5TWFuYWdlciBleHRlbmRzIFNpbXBsZVNlY3VyaXR5TWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrQWRtaW4gZXh0ZW5kcyBVc2VySW1wbCB7Ci0KLSAgICAgICAgcHJvdGVjdGVkIE1vY2tBZG1pbihVc2VyTWFuYWdlckltcGwgdXNlck1hbmFnZXIpIHsKLSAgICAgICAgICAgIHN1cGVyKG51bGwsIHVzZXJNYW5hZ2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0dyb3VwKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlzYWJsZWQoKSB0aHJvd3MgUmVwb3NpdG9yeUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBZG1pbigpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1vY2tVc2VyTWFuYWdlciBleHRlbmRzIFVzZXJNYW5hZ2VySW1wbCB7Ci0KLSAgICAgICAgcHVibGljIE1vY2tVc2VyTWFuYWdlcigpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKChTZXNzaW9uSW1wbCkgZ2V0U3lzdGVtU2Vzc2lvbigpLCAiYWRtaW4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXV0aG9yaXphYmxlIGdldEF1dGhvcml6YWJsZShTdHJpbmcgaWQpIHRocm93cyBSZXBvc2l0b3J5RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTW9ja0FkbWluKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVzZXJNYW5hZ2VyIGdldFVzZXJNYW5hZ2VyKFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIFJlcG9zaXRvcnlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IE1vY2tVc2VyTWFuYWdlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTZXNzaW9uIGdldFN5c3RlbVNlc3Npb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWVsZCBzZXNzaW9uRmllbGQ7Ci0gICAgICAgICAgICBzZXNzaW9uRmllbGQgPSBTaW1wbGVTZWN1cml0eU1hbmFnZXIuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic3lzdGVtU2Vzc2lvbiIpOwotICAgICAgICAgICAgc2Vzc2lvbkZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gKFNlc3Npb24pIHNlc3Npb25GaWVsZC5nZXQodGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyL3NyYy90ZXN0L3Jlc291cmNlcy9yZXBvc2l0b3J5LnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3JlcG9zaXRvcnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ1ZTgyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3JlcG9zaXRvcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IURPQ1RZUEUgUmVwb3NpdG9yeQotICAgICAgICAgIFBVQkxJQyAiLS8vVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9EVEQgSmFja3JhYmJpdCAyLjAvL0VOIgotICAgICAgICAgICJodHRwOi8vamFja3JhYmJpdC5hcGFjaGUub3JnL2R0ZC9yZXBvc2l0b3J5LTIuMC5kdGQiPgotCi08IS0tIEV4YW1wbGUgUmVwb3NpdG9yeSBDb25maWd1cmF0aW9uIEZpbGUKLSAgICAgVXNlZCBieQotICAgICAtIG9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLmNvbmZpZy5SZXBvc2l0b3J5Q29uZmlnVGVzdC5qYXZhCi0gICAgIC0KLS0tPgotPFJlcG9zaXRvcnk+Ci0gICAgPCEtLQotICAgICAgICB2aXJ0dWFsIGZpbGUgc3lzdGVtIHdoZXJlIHRoZSByZXBvc2l0b3J5IHN0b3JlcyBnbG9iYWwgc3RhdGUKLSAgICAgICAgKGUuZy4gcmVnaXN0ZXJlZCBuYW1lc3BhY2VzLCBjdXN0b20gbm9kZSB0eXBlcywgZXRjLikKLSAgICAtLT4KLSAgICA8RmlsZVN5c3RlbSBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuZnMubG9jYWwuTG9jYWxGaWxlU3lzdGVtIj4KLSAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSIke3JlcC5ob21lfS9yZXBvc2l0b3J5Ii8+Ci0gICAgPC9GaWxlU3lzdGVtPgotCi0gICAgPCEtLQotICAgICAgICBkYXRhIHN0b3JlIGNvbmZpZ3VyYXRpb24KLSAgICAtLT4KLSAgICA8RGF0YVN0b3JlIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5kYXRhLkZpbGVEYXRhU3RvcmUiLz4KLQotICAgIDwhLS0KLSAgICAgICAgc2VjdXJpdHkgY29uZmlndXJhdGlvbgotICAgIC0tPgotICAgIDxTZWN1cml0eSBhcHBOYW1lPSJKYWNrcmFiYml0Ij4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgc2VjdXJpdHkgbWFuYWdlcjoKLSAgICAgICAgICAgIGNsYXNzOiBGUU4gb2YgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBKYWNrcmFiYml0U2VjdXJpdHlNYW5hZ2VyIGludGVyZmFjZQotICAgICAgICAtLT4KLQotICAgICAgICA8IS0tICA8U2VjdXJpdHlNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5zZWN1cml0eS5zaW1wbGUuU2ltcGxlU2VjdXJpdHlNYW5hZ2VyIiB3b3Jrc3BhY2VOYW1lPSJzZWN1cml0eSI+IC0tPiAKLSAgICAgICAgIDxTZWN1cml0eU1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLnNlY3VyaXR5LlRlc3RTZWN1cml0eU1hbmFnZXIiIHdvcmtzcGFjZU5hbWU9InNlY3VyaXR5Ij4gCi0KLSAgICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgIHdvcmtzcGFjZSBhY2Nlc3M6Ci0gICAgICAgICAgICBjbGFzczogRlFOIG9mIGNsYXNzIGltcGxlbWVudGluZyB0aGUgV29ya3NwYWNlQWNjZXNzTWFuYWdlciBpbnRlcmZhY2UKLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSA8V29ya3NwYWNlQWNjZXNzTWFuYWdlciBjbGFzcz0iLi4uIi8+IC0tPgotICAgICAgICAgICAgPCEtLSA8cGFyYW0gbmFtZT0iY29uZmlnIiB2YWx1ZT0iJHtyZXAuaG9tZX0vc2VjdXJpdHkueG1sIi8+IC0tPgotICAgICAgICA8L1NlY3VyaXR5TWFuYWdlcj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBhY2Nlc3MgbWFuYWdlcjoKLSAgICAgICAgICAgIGNsYXNzOiBGUU4gb2YgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBBY2Nlc3NNYW5hZ2VyIGludGVyZmFjZQotICAgICAgICAtLT4KLSAgICAgICAgPEFjY2Vzc01hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLnNlY3VyaXR5LnNpbXBsZS5TaW1wbGVBY2Nlc3NNYW5hZ2VyIj4KLSAgICAgICAgICAgIDwhLS0gPHBhcmFtIG5hbWU9ImNvbmZpZyIgdmFsdWU9IiR7cmVwLmhvbWV9L2FjY2Vzcy54bWwiLz4gLS0+Ci0gICAgICAgIDwvQWNjZXNzTWFuYWdlcj4KLQotICAgICAgICA8TG9naW5Nb2R1bGUgY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLnNlY3VyaXR5LnNpbXBsZS5TaW1wbGVMb2dpbk1vZHVsZSI+Ci0gICAgICAgICAgIDwhLS0gCi0gICAgICAgICAgICAgIGFub255bW91cyB1c2VyIG5hbWUgKCdhbm9ueW1vdXMnIGlzIHRoZSBkZWZhdWx0IHZhbHVlKQotICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgIDxwYXJhbSBuYW1lPSJhbm9ueW1vdXNJZCIgdmFsdWU9ImFub255bW91cyIvPgotICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgIGFkbWluaXN0cmF0b3IgdXNlciBpZCAoZGVmYXVsdCB2YWx1ZSBpZiBwYXJhbSBpcyBtaXNzaW5nIGlzICdhZG1pbicpCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFkbWluSWQiIHZhbHVlPSJhZG1pbiIvPgotICAgICAgICA8L0xvZ2luTW9kdWxlPgotICAgIDwvU2VjdXJpdHk+Ci0KLSAgICA8IS0tCi0gICAgICAgIGxvY2F0aW9uIG9mIHdvcmtzcGFjZXMgcm9vdCBkaXJlY3RvcnkgYW5kIG5hbWUgb2YgZGVmYXVsdCB3b3Jrc3BhY2UKLSAgICAtLT4KLSAgICA8V29ya3NwYWNlcyByb290UGF0aD0iJHtyZXAuaG9tZX0vd29ya3NwYWNlcyIgZGVmYXVsdFdvcmtzcGFjZT0iZGVmYXVsdCIvPgotICAgIDwhLS0KLSAgICAgICAgd29ya3NwYWNlIGNvbmZpZ3VyYXRpb24gdGVtcGxhdGU6Ci0gICAgICAgIHVzZWQgdG8gY3JlYXRlIHRoZSBpbml0aWFsIHdvcmtzcGFjZSBpZiB0aGVyZSdzIG5vIHdvcmtzcGFjZSB5ZXQKLSAgICAtLT4KLSAgICA8V29ya3NwYWNlIG5hbWU9IiR7d3NwLm5hbWV9Ij4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgdmlydHVhbCBmaWxlIHN5c3RlbSBvZiB0aGUgd29ya3NwYWNlOgotICAgICAgICAgICAgY2xhc3M6IEZRTiBvZiBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIEZpbGVTeXN0ZW0gaW50ZXJmYWNlCi0gICAgICAgIC0tPgotICAgICAgICA8RmlsZVN5c3RlbSBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuZnMubG9jYWwuTG9jYWxGaWxlU3lzdGVtIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iJHt3c3AuaG9tZX0iLz4KLSAgICAgICAgPC9GaWxlU3lzdGVtPgotICAgICAgICA8IS0tCi0gICAgICAgICAgICBwZXJzaXN0ZW5jZSBtYW5hZ2VyIG9mIHRoZSB3b3Jrc3BhY2U6Ci0gICAgICAgICAgICBjbGFzczogRlFOIG9mIGNsYXNzIGltcGxlbWVudGluZyB0aGUgUGVyc2lzdGVuY2VNYW5hZ2VyIGludGVyZmFjZQotICAgICAgICAtLT4KLSAgICAgICAgPFBlcnNpc3RlbmNlTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUucGVyc2lzdGVuY2UucG9vbC5EZXJieVBlcnNpc3RlbmNlTWFuYWdlciI+Ci0gICAgICAgICAgPHBhcmFtIG5hbWU9InVybCIgdmFsdWU9ImpkYmM6ZGVyYnk6JHt3c3AuaG9tZX0vZGI7Y3JlYXRlPXRydWUiLz4KLSAgICAgICAgICA8cGFyYW0gbmFtZT0ic2NoZW1hT2JqZWN0UHJlZml4IiB2YWx1ZT0iJHt3c3AubmFtZX1fIi8+Ci0gICAgICAgIDwvUGVyc2lzdGVuY2VNYW5hZ2VyPgotICAgICAgICA8IS0tCi0gICAgICAgICAgICBTZWFyY2ggaW5kZXggYW5kIHRoZSBmaWxlIHN5c3RlbSBpdCB1c2VzLgotICAgICAgICAgICAgY2xhc3M6IEZRTiBvZiBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIFF1ZXJ5SGFuZGxlciBpbnRlcmZhY2UKLSAgICAgICAgLS0+Ci0gICAgICAgIDxTZWFyY2hJbmRleCBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUucXVlcnkubHVjZW5lLlNlYXJjaEluZGV4Ij4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iJHt3c3AuaG9tZX0vaW5kZXgiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzdXBwb3J0SGlnaGxpZ2h0aW5nIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L1NlYXJjaEluZGV4PgotCi0gICAgPC9Xb3Jrc3BhY2U+Ci0KLSAgICA8IS0tCi0gICAgICAgIENvbmZpZ3VyZXMgdGhlIHZlcnNpb25pbmcKLSAgICAtLT4KLSAgICA8VmVyc2lvbmluZyByb290UGF0aD0iJHtyZXAuaG9tZX0vdmVyc2lvbiI+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIENvbmZpZ3VyZXMgdGhlIGZpbGVzeXN0ZW0gdG8gdXNlIGZvciB2ZXJzaW9uaW5nIGZvciB0aGUgcmVzcGVjdGl2ZQotICAgICAgICAgICAgcGVyc2lzdGVuY2UgbWFuYWdlcgotICAgICAgICAtLT4KLSAgICAgICAgPEZpbGVTeXN0ZW0gY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLmZzLmxvY2FsLkxvY2FsRmlsZVN5c3RlbSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9IiR7cmVwLmhvbWV9L3ZlcnNpb24iIC8+Ci0gICAgICAgIDwvRmlsZVN5c3RlbT4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBDb25maWd1cmVzIHRoZSBwZXJzaXN0ZW5jZSBtYW5hZ2VyIHRvIGJlIHVzZWQgZm9yIHBlcnNpc3RpbmcgdmVyc2lvbiBzdGF0ZS4KLSAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbmluZyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbgotICAgICAgICAgICAgYSAnbm9ybWFsJyBwZXJzaXN0ZW5jZSBtYW5hZ2VyLCBidXQgdGhpcyBjb3VsZCBjaGFuZ2UgaW4gZnV0dXJlCi0gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICAgIC0tPgotICAgICAgICA8UGVyc2lzdGVuY2VNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5wZXJzaXN0ZW5jZS5wb29sLkRlcmJ5UGVyc2lzdGVuY2VNYW5hZ2VyIj4KLSAgICAgICAgICA8cGFyYW0gbmFtZT0idXJsIiB2YWx1ZT0iamRiYzpkZXJieToke3JlcC5ob21lfS92ZXJzaW9uL2RiO2NyZWF0ZT10cnVlIi8+Ci0gICAgICAgICAgPHBhcmFtIG5hbWU9InNjaGVtYU9iamVjdFByZWZpeCIgdmFsdWU9InZlcnNpb25fIi8+Ci0gICAgICAgIDwvUGVyc2lzdGVuY2VNYW5hZ2VyPgotICAgIDwvVmVyc2lvbmluZz4KLQotICAgIDwhLS0KLSAgICAgICAgU2VhcmNoIGluZGV4IGZvciBjb250ZW50IHRoYXQgaXMgc2hhcmVkIHJlcG9zaXRvcnkgd2lkZQotICAgICAgICAoL2pjcjpzeXN0ZW0gdHJlZSwgY29udGFpbnMgbWFpbmx5IHZlcnNpb25zKQotICAgIC0tPgotICAgIDxTZWFyY2hJbmRleCBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUucXVlcnkubHVjZW5lLlNlYXJjaEluZGV4Ij4KLSAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSIke3JlcC5ob21lfS9yZXBvc2l0b3J5L2luZGV4Ii8+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJzdXBwb3J0SGlnaGxpZ2h0aW5nIiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvU2VhcmNoSW5kZXg+Ci0KLSAgICA8IS0tCi0gICAgICAgIFJ1biB3aXRoIGEgY2x1c3RlciBqb3VybmFsCi0gICAgLS0+Ci0gICAgPENsdXN0ZXIgaWQ9Im5vZGUxIj4KLSAgICAgICAgICA8Sm91cm5hbCBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuam91cm5hbC5GaWxlSm91cm5hbCI+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJyZXZpc2lvbiIgdmFsdWU9IiR7cmVwLmhvbWV9L3JldmlzaW9uLmxvZyIgLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9ImRpcmVjdG9yeSIgdmFsdWU9IiR7cmVwLmhvbWV9L215am91cm5hbCIgLz4KLSAgICAgIDwvSm91cm5hbD4KLSAgICA8L0NsdXN0ZXI+Ci08L1JlcG9zaXRvcnk+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0NzNmOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0PC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIFNlcnZlciBTdXBwb3J0PC9uYW1lPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8cGFyZW50QmFzZWRpcj4uLi8uLi88L3BhcmVudEJhc2VkaXI+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50bHItcnVudGltZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuNTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRhcmdldC9nZW5lcmF0ZWQtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNS4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9DbWlzQmFzZSouZzwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0phdmEqLmc8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkZWZhdWx0IHBoYXNlOiBwcm9jZXNzLXNvdXJjZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YW50bHI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4gPCEtLSBhZnRlciBwcm9jZXNzLXNvdXJjZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weS1yZXNvdXJjZXM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvYW50bHIzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkb24ndCBpbmNsdWRlIGxleGVyIHRva2Vucywgd2hpY2ggYXJlIGlkZW50aWNhbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qUGFyc2VyLnRva2VuczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT50YXJnZXQvZ2VuZXJhdGVkLXJlc291cmNlcy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzQmFzZUdyYW1tYXIuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzQmFzZUdyYW1tYXIuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmZGJkNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9hbnRscjMvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ21pc0Jhc2VHcmFtbWFyLmcKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgICAgU3RlZmFuZSBGZXJtaWdpZXIsIE51eGVvCi0gKiAgICAgRmxvcmVudCBHdWlsbGF1bWUsIE51eGVvCi0gKi8KLSAKLXBhcnNlciBncmFtbWFyIENtaXNCYXNlR3JhbW1hcjsKLQotLy8gTm90ZTogVGhlIGZvbGxvd2luZyB0b2tlblZvY2FiIG9wdGlvbiBnZW5lcmF0ZXMgYSB3YXJuaW5nOiAKLS8vIHdhcm5pbmcoMTYwKTogQ01JU0Jhc2VHcmFtbWFyLmc6Mjc6NTogdG9rZW5Wb2NhYiBvcHRpb24gaWdub3JlZCBpbiBpbXBvcnRlZCBncmFtCi0vLyBtYXIgQ01JU0Jhc2VHcmFtbWFyCi0vLyBJZiB5b3Ugb21pdCB0aGlzIGl0IHJlc3VsdHMgaW4gY29tcGlsYXRpb24gZXJyb3JzLCBtYXkgYmUgYSBtYXZlbiBpc3N1ZSAobm90IHN1cmUKLS8vIG9mIG91dHNpZGUgb2YgbWF2ZW4gdGhpcyBuZWVkcyBmaWxlIG5lZWRzIHRvIGJlIGNvbXBpbGFibGUKLS8vIG9wdGlvbnMgbXVzdCBoYXZlIEFTVCBvcHRpb25zIG90aGVyd2lzZSAKLQotb3B0aW9ucyB7Ci0gICAgdG9rZW5Wb2NhYiA9IENtaXNRbFN0cmljdExleGVyOwotICAgIG91dHB1dCA9IEFTVDsKLX0KLQotQG1lbWJlcnMgewotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGVycm9yTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0gICAgCXJldHVybiBlcnJvck1lc3NhZ2VzLnNpemUoKSA+IDA7Ci0gICAgfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2VzKCkgewotCQlTdHJpbmdCdWZmZXIgYWxsTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQotCQlmb3IgKFN0cmluZyBtc2cgOiBlcnJvck1lc3NhZ2VzKQotCQkJYWxsTWVzc2FnZXMuYXBwZW5kKG1zZykuYXBwZW5kKCdcbicpOwotCQkJCi0JCXJldHVybiBhbGxNZXNzYWdlcy50b1N0cmluZygpOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIC8vIEluc3RlYWQgb2Ygc2VuZGluZyBhbGwgZXJyb3JzIHRvIFN5c3RlbS5lcnIgY29sbGVjdCB0aGVtIGluIGEgbGlzdAotCXB1YmxpYyB2b2lkIGVtaXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQllcnJvck1lc3NhZ2VzLmFkZChtc2cpOwotCX0KLQkKLX0KLQotcXVlcnk6IAotCVNFTEVDVCBzZWxlY3RfbGlzdCBmcm9tX2NsYXVzZSB3aGVyZV9jbGF1c2U/IG9yZGVyX2J5X2NsYXVzZT8KLQkJLT4gXihTRUxFQ1Qgc2VsZWN0X2xpc3QgZnJvbV9jbGF1c2Ugb3JkZXJfYnlfY2xhdXNlPyB3aGVyZV9jbGF1c2U/KQotCTsKLQotc2VsZWN0X2xpc3QKLSAgICA6IFNUQVIKLSAgICB8IHNlbGVjdF9zdWJsaXN0ICggQ09NTUEgc2VsZWN0X3N1Ymxpc3QgKSoKLSAgICAgIC0+IF4oU0VMX0xJU1Qgc2VsZWN0X3N1Ymxpc3QrKQotICAgIDsKLQotc2VsZWN0X3N1Ymxpc3QKLSAgICA6IHZhbHVlX2V4cHJlc3Npb24gKCBBUyE/IGNvbHVtbl9uYW1lICk/Ci0gICAgfCBxdWFsaWZpZXIgRE9UIFNUQVIKLSAgICAvL3wgbXVsdGlfdmFsdWVkX2NvbHVtbl9yZWZlcmVuY2UKLSAgICA7Ci0KLXZhbHVlX2V4cHJlc3Npb246Ci0gICAgICBjb2x1bW5fcmVmZXJlbmNlCi0gICAgfCBudW1lcmljX3ZhbHVlX2Z1bmN0aW9uCi0gICAgOwotCi1jb2x1bW5fcmVmZXJlbmNlOgotICAgICggcXVhbGlmaWVyIERPVCApPyBjb2x1bW5fbmFtZQotICAgICAgLT4gXihDT0wgcXVhbGlmaWVyPyBjb2x1bW5fbmFtZSkKLSAgICA7Ci0KLW11bHRpX3ZhbHVlZF9jb2x1bW5fcmVmZXJlbmNlOgotICAgICggcXVhbGlmaWVyIERPVCApPyBtdWx0aV92YWx1ZWRfY29sdW1uX25hbWUKLSAgICAgIC0+IF4oQ09MIHF1YWxpZmllcj8gbXVsdGlfdmFsdWVkX2NvbHVtbl9uYW1lKQotICAgIDsKLQotbnVtZXJpY192YWx1ZV9mdW5jdGlvbjoKLSAgICBTQ09SRSBMUEFSIFJQQVIgLT4gXihTQ09SRSk7Ci0KLXF1YWxpZmllcjoKLSAgICAgIHRhYmxlX25hbWUKLSAgICAvL3wgY29ycmVsYXRpb25fbmFtZQotICAgIDsKLQotZnJvbV9jbGF1c2U6IEZST01eIHRhYmxlX3JlZmVyZW5jZTsKLQotdGFibGVfcmVmZXJlbmNlOgotICAgIG9uZV90YWJsZSB0YWJsZV9qb2luKgotICAgIDsKLQotdGFibGVfam9pbjoKLSAgICBqb2luX2tpbmQgb25lX3RhYmxlIGpvaW5fc3BlY2lmaWNhdGlvbj8KLSAgICAtPiBeKEpPSU4gam9pbl9raW5kIG9uZV90YWJsZSBqb2luX3NwZWNpZmljYXRpb24/KQotICAgIDsKLQotb25lX3RhYmxlOgotICAgICAgTFBBUiEgdGFibGVfcmVmZXJlbmNlIFJQQVIhCi0gICAgfCB0YWJsZV9uYW1lCi0gICAgICAgIC0+IF4oVEFCTEUgdGFibGVfbmFtZSkKLSAgICB8IHRhYmxlX25hbWUgQVM/IGNvcnJlbGF0aW9uX25hbWUKLSAgICAgICAgLT4gXihUQUJMRSB0YWJsZV9uYW1lIGNvcnJlbGF0aW9uX25hbWUpCi0gICAgOwotCi1qb2luX2tpbmQ6Ci0gICAgICBKT0lOCi0gICAgICAgIC0+IElOTkVSCi0gICAgfCBJTk5FUiBKT0lOCi0gICAgICAgIC0+IElOTkVSCi0gICAgfCBMRUZUIE9VVEVSPyBKT0lOCi0gICAgICAgIC0+IExFRlQKLSAgICB8IFJJR0hUIE9VVEVSPyBKT0lOCi0gICAgICAgIC0+IFJJR0hUCi0gICAgOwotCi1qb2luX3NwZWNpZmljYXRpb246Ci0gICAgT05eIGNvbHVtbl9yZWZlcmVuY2UgRVEgY29sdW1uX3JlZmVyZW5jZQotICAgIDsKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJlZ2luIFdoZXJlCi0KLXdoZXJlX2NsYXVzZTogV0hFUkVeIHNlYXJjaF9jb25kaXRpb247Ci0KLXNlYXJjaF9jb25kaXRpb246Ci0gICAgYm9vbGVhbl90ZXJtIChPUl4gYm9vbGVhbl90ZXJtKSo7Ci0KLWJvb2xlYW5fdGVybToKLSAgICBib29sZWFuX2ZhY3RvciAoQU5EXiBib29sZWFuX2ZhY3RvcikqOwotCi1ib29sZWFuX2ZhY3RvcjoKLSAgICBOT1ReIGJvb2xlYW5fdGVzdAotICAgIHwgYm9vbGVhbl90ZXN0Ci0JOwotCQotYm9vbGVhbl90ZXN0OgotICAgICAgcHJlZGljYXRlCi0gICAgfCBMUEFSIHNlYXJjaF9jb25kaXRpb24gUlBBUiAtPiBzZWFyY2hfY29uZGl0aW9uCi0gICAgOwotCi1wcmVkaWNhdGU6Ci0gICAgICBjb21wYXJpc29uX3ByZWRpY2F0ZQotICAgIHwgaW5fcHJlZGljYXRlCi0gICAgfCBsaWtlX3ByZWRpY2F0ZQotICAgIHwgbnVsbF9wcmVkaWNhdGUKLSAgICB8IHF1YW50aWZpZWRfY29tcGFyaXNvbl9wcmVkaWNhdGUKLSAgICB8IHF1YW50aWZpZWRfaW5fcHJlZGljYXRlCi0gICAgfCB0ZXh0X3NlYXJjaF9wcmVkaWNhdGUKLSAgICB8IGZvbGRlcl9wcmVkaWNhdGUKLSAgICA7Ci0KLWNvbXBhcmlzb25fcHJlZGljYXRlOgotICAgIHZhbHVlX2V4cHJlc3Npb24gRVEgbGl0ZXJhbAotICAgICAgLT4gXihFUSB2YWx1ZV9leHByZXNzaW9uIGxpdGVyYWwpCi0gICAgfCB2YWx1ZV9leHByZXNzaW9uIE5FUSBsaXRlcmFsCi0gICAgICAtPiBeKE5FUSB2YWx1ZV9leHByZXNzaW9uIGxpdGVyYWwpCi0gICAgfCB2YWx1ZV9leHByZXNzaW9uIExUIGxpdGVyYWwKLSAgICAgIC0+IF4oTFQgdmFsdWVfZXhwcmVzc2lvbiBsaXRlcmFsKQotICAgIHwgdmFsdWVfZXhwcmVzc2lvbiBHVCBsaXRlcmFsCi0gICAgICAtPiBeKEdUIHZhbHVlX2V4cHJlc3Npb24gbGl0ZXJhbCkKLSAgICB8IHZhbHVlX2V4cHJlc3Npb24gTFRFUSBsaXRlcmFsCi0gICAgICAtPiBeKExURVEgdmFsdWVfZXhwcmVzc2lvbiBsaXRlcmFsKQotICAgIHwgdmFsdWVfZXhwcmVzc2lvbiBHVEVRIGxpdGVyYWwKLSAgICAgIC0+IF4oR1RFUSB2YWx1ZV9leHByZXNzaW9uIGxpdGVyYWwpCi0gICAgOwotCi1saXRlcmFsOgotICAgICAgTlVNX0xJVAotICAgIHwgU1RSSU5HX0xJVAotICAgIHwgVElNRV9MSVQKLSAgICB8IEJPT0xfTElUCi0gICAgOwotCi1pbl9wcmVkaWNhdGU6Ci0gICAgICBjb2x1bW5fcmVmZXJlbmNlIElOIExQQVIgaW5fdmFsdWVfbGlzdCBSUEFSCi0gICAgICAgIC0+IF4oSU4gY29sdW1uX3JlZmVyZW5jZSBpbl92YWx1ZV9saXN0KQotICAgIHwgY29sdW1uX3JlZmVyZW5jZSBOT1QgSU4gTFBBUiBpbl92YWx1ZV9saXN0IFJQQVIKLSAgICAgICAgLT4gXihOT1RfSU4gY29sdW1uX3JlZmVyZW5jZSBpbl92YWx1ZV9saXN0KQotICAgIDsKLQotaW5fdmFsdWVfbGlzdDoKLSAgICBsaXRlcmFsICggQ09NTUEgbGl0ZXJhbCApKgotICAgICAgLT4gXihJTl9MSVNUIGxpdGVyYWwrKQotICAgIDsKLQotbGlrZV9wcmVkaWNhdGU6Ci0gICAgICBjb2x1bW5fcmVmZXJlbmNlIExJS0UgU1RSSU5HX0xJVAotICAgICAgICAtPiBeKExJS0UgY29sdW1uX3JlZmVyZW5jZSBTVFJJTkdfTElUKQotICAgIHwgY29sdW1uX3JlZmVyZW5jZSBOT1QgTElLRSBTVFJJTkdfTElUCi0gICAgICAgIC0+IF4oTk9UX0xJS0UgY29sdW1uX3JlZmVyZW5jZSBTVFJJTkdfTElUKQotICAgIDsKLQotbnVsbF9wcmVkaWNhdGU6Ci0gICAgLy8gc2Vjb25kIGFsdGVybmF0aXZlIGNvbW1lbnRlZCBvdXQgdG8gcmVtb3ZlIGxlZnQgcmVjdXJzaW9uIGZvciBub3cuCi0gICAgLy8oIGNvbHVtbl9yZWZlcmVuY2UgfCBtdWx0aV92YWx1ZWRfY29sdW1uX3JlZmVyZW5jZSApICdJUycgJ05PVCc/ICdOVUxMJzsKLSAgICBjb2x1bW5fcmVmZXJlbmNlIElTCi0gICAgICAoIE5PVCBOVUxMIC0+IF4oSVNfTk9UX05VTEwgY29sdW1uX3JlZmVyZW5jZSkKLSAgICAgIHwgTlVMTCAgICAgLT4gXihJU19OVUxMICAgICBjb2x1bW5fcmVmZXJlbmNlKQotICAgICAgKQotICAgIDsKLQotcXVhbnRpZmllZF9jb21wYXJpc29uX3ByZWRpY2F0ZToKLSAgICBsaXRlcmFsIEVRIEFOWSBtdWx0aV92YWx1ZWRfY29sdW1uX3JlZmVyZW5jZQotICAgICAgLT4gXihFUV9BTlkgbGl0ZXJhbCBtdWx0aV92YWx1ZWRfY29sdW1uX3JlZmVyZW5jZSkKLSAgICA7Ci0KLXF1YW50aWZpZWRfaW5fcHJlZGljYXRlOgotICAgIEFOWSBtdWx0aV92YWx1ZWRfY29sdW1uX3JlZmVyZW5jZQotICAgICAgKCBOT1QgSU4gTFBBUiBpbl92YWx1ZV9saXN0IFJQQVIKLSAgICAgICAgICAtPiBeKE5PVF9JTl9BTlkgbXVsdGlfdmFsdWVkX2NvbHVtbl9yZWZlcmVuY2UgaW5fdmFsdWVfbGlzdCApCi0gICAgICB8IElOICAgICBMUEFSIGluX3ZhbHVlX2xpc3QgUlBBUgotICAgICAgICAgIC0+IF4oSU5fQU5ZICAgIG11bHRpX3ZhbHVlZF9jb2x1bW5fcmVmZXJlbmNlIGluX3ZhbHVlX2xpc3QgKQotICAgICAgKQotICAgIDsKLQotdGV4dF9zZWFyY2hfcHJlZGljYXRlIDovLyByZXR1cm5zIFtDb21tb25UcmVlIHJlc3VsdF06Ci0gICAgQ09OVEFJTlMgTFBBUiAocXVhbGlmaWVyIENPTU1BKT8gdGV4dF9zZWFyY2hfZXhwcmVzc2lvbiBSUEFSCi0gICAgICAtPiBeKENPTlRBSU5TIHF1YWxpZmllcj8gdGV4dF9zZWFyY2hfZXhwcmVzc2lvbikgLy97IAotLy8gICAgICAkcmVzdWx0ID0gU3RyaW5nVXRpbC5wYXJzZVRleHRTZWFyY2hQcmVkaWNhdGUoJHRleHRfc2VhcmNoX2V4cHJlc3Npb24udGV4dCkKLS8vICAgIH0KLSAgICA7Ci0KLS8vIGVuZCB3aGVyZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotZm9sZGVyX3ByZWRpY2F0ZToKLSAgICAoIGY9SU5fRk9MREVSIHwgZj1JTl9UUkVFICkgTFBBUiAocXVhbGlmaWVyIENPTU1BKT8gZm9sZGVyX2lkIFJQQVIKLSAgICAgIC0+IF4oJGYgcXVhbGlmaWVyPyBmb2xkZXJfaWQpCi0gICAgOwotCi1vcmRlcl9ieV9jbGF1c2U6Ci0gICAgT1JERVIgQlkgc29ydF9zcGVjaWZpY2F0aW9uICggQ09NTUEgc29ydF9zcGVjaWZpY2F0aW9uICkqCi0gICAgICAtPiBeKE9SREVSX0JZIHNvcnRfc3BlY2lmaWNhdGlvbispCi0gICAgOwotCi1zb3J0X3NwZWNpZmljYXRpb246Ci0gICAgICBjb2x1bW5fcmVmZXJlbmNlIC0+IGNvbHVtbl9yZWZlcmVuY2UgQVNDCi0gICAgfCBjb2x1bW5fcmVmZXJlbmNlICggQVNDIHwgREVTQyApCi0gICAgOwotCi1jb3JyZWxhdGlvbl9uYW1lOgotICAgIElEOwotCi10YWJsZV9uYW1lOgotICAgIElEOwotCi1jb2x1bW5fbmFtZToKLSAgICBJRDsKLQotbXVsdGlfdmFsdWVkX2NvbHVtbl9uYW1lOgotICAgIElEOwotCi1mb2xkZXJfaWQ6Ci0gICAgU1RSSU5HX0xJVDsKLQotdGV4dF9zZWFyY2hfZXhwcmVzc2lvbjoKLSAgICBTVFJJTkdfTElUOwpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNCYXNlTGV4ZXIuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzQmFzZUxleGVyLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjQyY2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNCYXNlTGV4ZXIuZworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQXV0aG9yczoKLSAqICAgICBTdGVmYW5lIEZlcm1pZ2llciwgTnV4ZW8KLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqLwotIAotIAotLyoqCi0gKiBDTUlTUUwgbGV4ZXIuCi0gKi8KLWxleGVyIGdyYW1tYXIgQ21pc0Jhc2VMZXhlcjsKLQotdG9rZW5zIHsKLSAgICBUQUJMRTsKLSAgICBDT0w7Ci0gICAgU0VMX0xJU1Q7Ci0gICAgSU5fTElTVDsKLSAgICBJTl9BTlk7Ci0gICAgTk9UX0lOX0FOWTsKLSAgICBFUV9BTlk7Ci0gICAgTk9UX0lOOwotICAgIE5PVF9MSUtFOwotICAgIElTX05VTEw7Ci0gICAgSVNfTk9UX05VTEw7Ci0gICAgT1JERVJfQlk7Ci19Ci0KLUBtZW1iZXJzIHsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBlcnJvck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkgewotICAgIAlyZXR1cm4gIWVycm9yTWVzc2FnZXMuaXNFbXB0eSgpOwotICAgIH0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLQkJU3RyaW5nQnVpbGRlciBhbGxNZXNzYWdlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQotCQlmb3IgKFN0cmluZyBtc2cgOiBlcnJvck1lc3NhZ2VzKSB7Ci0JCQlhbGxNZXNzYWdlcy5hcHBlbmQobXNnKS5hcHBlbmQoJ1xuJyk7Ci0JCX0KLQkJCQotCQlyZXR1cm4gYWxsTWVzc2FnZXMudG9TdHJpbmcoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICAvLyBJbnN0ZWFkIG9mIHNlbmRpbmcgYWxsIGVycm9ycyB0byBTeXN0ZW0uZXJyIGNvbGxlY3QgdGhlbSBpbiBhIGxpc3QKLQlwdWJsaWMgdm9pZCBlbWl0RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJZXJyb3JNZXNzYWdlcy5hZGQobXNnKTsKLQl9Ci0JCi19Ci0KLS8vIC0tLS0tIEdlbmVyaWMgU1FMIC0tLS0tCi0KLVNFTEVDVCA6ICgnUyd8J3MnKSgnRSd8J2UnKSgnTCd8J2wnKSgnRSd8J2UnKSgnQyd8J2MnKSgnVCd8J3QnKTsKLS8vRElTVElOQ1QgOiAoJ0QnfCdkJykoJ0knfCdpJykoJ1MnfCdzJykoJ1QnfCd0JykoJ0knfCdpJykoJ04nfCduJykoJ0MnfCdjJykoJ1QnfCd0Jyk7Ci1GUk9NIDogKCdGJ3wnZicpKCdSJ3wncicpKCdPJ3wnbycpKCdNJ3wnbScpOwotQVMgOiAoJ0EnfCdhJykoJ1MnfCdzJyk7Ci1KT0lOIDogKCdKJ3wnaicpKCdPJ3wnbycpKCdJJ3wnaScpKCdOJ3wnbicpOwotSU5ORVIgOiAoJ0knfCdpJykoJ04nfCduJykoJ04nfCduJykoJ0UnfCdlJykoJ1InfCdyJyk7Ci1PVVRFUiA6ICgnTyd8J28nKSgnVSd8J3UnKSgnVCd8J3QnKSgnRSd8J2UnKSgnUid8J3InKTsKLUxFRlQgOiAoJ0wnfCdsJykoJ0UnfCdlJykoJ0YnfCdmJykoJ1QnfCd0Jyk7Ci1SSUdIVCA6ICgnUid8J3InKSgnSSd8J2knKSgnRyd8J2cnKSgnSCd8J2gnKSgnVCd8J3QnKTsKLU9OIDogKCdPJ3wnbycpKCdOJ3wnbicpOwotV0hFUkUgOiAoJ1cnfCd3JykoJ0gnfCdoJykoJ0UnfCdlJykoJ1InfCdyJykoJ0UnfCdlJyk7Ci1PUkRFUiA6ICgnTyd8J28nKSgnUid8J3InKSgnRCd8J2QnKSgnRSd8J2UnKSgnUid8J3InKTsKLUJZIDogKCdCJ3wnYicpKCdZJ3wneScpOwotQVNDIDogKCdBJ3wnYScpKCdTJ3wncycpKCdDJ3wnYycpOwotREVTQyA6ICgnRCd8J2QnKSgnRSd8J2UnKSgnUyd8J3MnKSgnQyd8J2MnKTsKLQotLy8gLS0tLS0gT3BlcmF0b3JzIC0tLS0tCi0KLUlTIDogKCdJJ3wnaScpKCdTJ3wncycpOwotTlVMTCA6ICgnTid8J24nKSgnVSd8J3UnKSgnTCd8J2wnKSgnTCd8J2wnKTsKLUFORCA6ICgnQSd8J2EnKSgnTid8J24nKSgnRCd8J2QnKTsKLU9SIDogKCdPJ3wnbycpKCdSJ3wncicpOwotTk9UIDogKCdOJ3wnbicpKCdPJ3wnbycpKCdUJ3wndCcpOwotSU4gOiAoJ0knfCdpJykoJ04nfCduJyk7Ci1MSUtFIDogKCdMJ3wnbCcpKCdJJ3wnaScpKCdLJ3wnaycpKCdFJ3wnZScpOwotQU5ZIDogKCdBJ3wnYScpKCdOJ3wnbicpKCdZJ3wneScpOwotQ09OVEFJTlMgOiAoJ0MnfCdjJykoJ08nfCdvJykoJ04nfCduJykoJ1QnfCd0JykoJ0EnfCdhJykoJ0knfCdpJykoJ04nfCduJykoJ1MnfCdzJyk7Ci1TQ09SRSA6ICgnUyd8J3MnKSgnQyd8J2MnKSgnTyd8J28nKSgnUid8J3InKSgnRSd8J2UnKTsKLUlOX0ZPTERFUiA6ICgnSSd8J2knKSgnTid8J24nKSdfJygnRid8J2YnKSgnTyd8J28nKSgnTCd8J2wnKSgnRCd8J2QnKSgnRSd8J2UnKSgnUid8J3InKTsKLUlOX1RSRUUgOiAoJ0knfCdpJykoJ04nfCduJyknXycoJ1QnfCd0JykoJ1InfCdyJykoJ0UnfCdlJykoJ0UnfCdlJyk7Ci1USU1FU1RBTVAgOiAnVElNRVNUQU1QJ3wndGltZXN0YW1wJzsKLQotU1RBUiA6ICcqJzsKLUxQQVIgOiAnKCc7Ci1SUEFSIDogJyknOwotQ09NTUEgOiAnLCc7Ci1ET1QgOiAnLic7Ci1FUSA6ICc9JzsKLU5FUSA6ICc8Pic7Ci1MVCA6ICc8JzsKLUdUIDogJz4nOwotTFRFUSA6ICc8PSc7Ci1HVEVRIDogJz49JzsKLQotLy8gLS0tLS0gTGl0ZXJhbHMgLS0tLS0KLQotQk9PTF9MSVQgOiAnVFJVRScgfCAndHJ1ZScgfCAnRkFMU0UnIHwgJ2ZhbHNlJzsKLQotZnJhZ21lbnQgU2lnbiA6ICgnKyd8Jy0nKT87Ci1mcmFnbWVudCBEaWdpdHMgOiAoJzAnLi4nOScpKzsKLWZyYWdtZW50IEV4YWN0TnVtTGl0IDogRGlnaXRzIERPVCBEaWdpdHMgfCBEaWdpdHMgRE9UIHwgRE9UIERpZ2l0cyB8IERpZ2l0czsKLWZyYWdtZW50IEFwcHJveE51bUxpdCA6IEV4YWN0TnVtTGl0ICgnZSd8J0UnKSBTaWduIERpZ2l0czsKLU5VTV9MSVQgOiBTaWduIChFeGFjdE51bUxpdCB8IEFwcHJveE51bUxpdCk7Ci0KLWZyYWdtZW50IFFVT1RFOiAnXCcnOwotZnJhZ21lbnQgQkFDS1NMOiAnXFwnOwotZnJhZ21lbnQgVU5ERVJTQ09SRTogJ18nOwotZnJhZ21lbnQgUEVSQ0VOVDogJyUnOwotCi0vLyBBbiBlc2NhcGUgc2VxdWVuY2UgaXMgdHdvIGJhY2tzbGFzaGVzIGZvciBiYWNrc2xhc2gsIGJhY2tzbGFzaCBzaW5nbGUgcXVvdGUgZm9yIHNpbmdsZSBxdW90ZQotLy8gb3Igc2luZ2xlIHF1b3RlIHNpbmdsZSBxdW90ZSBmb3Igc2luZ2xlIHF1b3RlCi1mcmFnbWVudAotRVNDIAotCTogQkFDS1NMIChRVU9URSB8IEJBQ0tTTCB8IFBFUkNFTlQgfCBVTkRFUlNDT1JFKQotCXwgUVVPVEUgUVVPVEUKLQk7Ci0JCi1TVFJJTkdfTElUCi0gICAgOiAgUVVPVEUgKCBFU0MgfCB+KEJBQ0tTTHxRVU9URSkgKSogUVVPVEUKLQk7Ci0KLVdTIDogKCAnICcgfCAnXHQnIHwgJ1xyJz8gJ1xuJyApKyB7ICRjaGFubmVsPUhJRERFTjsgfTsKLQotVElNRV9MSVQgOiBUSU1FU1RBTVAgV1MgU1RSSU5HX0xJVDsKLQotSUQgOgotICAgICgnYScuLid6J3wnQScuLidaJ3wnXycpCi0gICAgKCdhJy4uJ3onfCdBJy4uJ1onfCdfJ3wnMCcuLic5J3wnOicpKgotICAgIDsKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzQmFzZVdhbGtlci5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNCYXNlV2Fsa2VyLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDI0MTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNCYXNlV2Fsa2VyLmcKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgICAgRmxvcmVudCBHdWlsbGF1bWUsIE51eGVvCi0gKi8KLS8qKgotICogQ01JU1FMIHRyZWUgZ3JhbW1hciwgd2Fsa2VyIGZvciB0aGUgaW5tZW1vcnkgaW1wbGVtZW50YXRpb24uCi0gKiBUaGlzIGFpbXMgYXQgaW1wbGVtZW50aW5nIHByb3BlciBzZW1hbnRpY3Mgd2l0aG91dCBhbnkgc3BlZWQKLSAqIG9wdGltaXphdGlvbi4KLSAqLwotdHJlZSBncmFtbWFyIENtaXNCYXNlV2Fsa2VyOwotCi1vcHRpb25zIHsKLSAgICB0b2tlblZvY2FiID0gQ21pc1FsU3RyaWN0TGV4ZXI7Ci0gICAgQVNUTGFiZWxUeXBlID0gQ29tbW9uVHJlZTsKLSAgICBvdXRwdXQgPSBBU1Q7Ci19Ci0KLUBtZW1iZXJzIHsKLSAgICBwcml2YXRlIFF1ZXJ5T2JqZWN0IHF1ZXJ5T2JqOwotICAgIHByaXZhdGUgVHJlZSB3aGVyZVByZWRpY2F0ZVRyZWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRvRnVsbFRleHRQYXJzZSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBpbnQgbm9Db250YWlucyA9IDA7Ci0KLSAgICBwdWJsaWMgVHJlZSBnZXRXaGVyZVByZWRpY2F0ZVRyZWUoKSB7Ci0gICAgICAgIHJldHVybiB3aGVyZVByZWRpY2F0ZVRyZWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbWlzbWF0Y2goSW50U3RyZWFtIGlucHV0LCBpbnQgdHR5cGUsIEJpdFNldCBmb2xsb3cpCi0gICAgICAgIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IE1pc21hdGNoZWRUb2tlbkV4Y2VwdGlvbih0dHlwZSwgaW5wdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlY292ZXJGcm9tTWlzbWF0Y2hlZFNldChJbnRTdHJlYW0gaW5wdXQsIFJlY29nbml0aW9uRXhjZXB0aW9uIGUsIGFudGxyLmNvbGxlY3Rpb25zLmltcGwuQml0U2V0IGZvbGxvdykKLSAgICAgICAgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBlOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHNldERvRnVsbFRleHRQYXJzZShib29sZWFuIHZhbHVlKSB7Ci0JCWRvRnVsbFRleHRQYXJzZSA9IHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXREb0Z1bGxUZXh0UGFyc2UoKSB7Ci0JCXJldHVybiBkb0Z1bGxUZXh0UGFyc2U7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZDb250YWluc0NsYXVzZXMoKSB7Ci0JICAgIHJldHVybiBub0NvbnRhaW5zOwotCX0KLQkKLSAgICBwcml2YXRlIHN0YXRpYyBDb21tb25UcmVlIHBhcnNlVGV4dFNlYXJjaFByZWRpY2F0ZShTdHJpbmcgZXhwcikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHVuZXNjYXBlZEV4cHIgPSBTdHJpbmdVdGlsLnVuZXNjYXBlKGV4cHIuc3Vic3RyaW5nKDEsIGV4cHIubGVuZ3RoKCktMSksIG51bGwpOwotICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKHVuZXNjYXBlZEV4cHIpOwotICAgICAgICBUb2tlblNvdXJjZSBsZXhlciA9IG5ldyBUZXh0U2VhcmNoTGV4ZXIoaW5wdXQpOwotICAgICAgICBUb2tlblN0cmVhbSB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpOwotICAgICAgICBUZXh0U2VhcmNoUGFyc2VyIHBhcnNlciA9IG5ldyBUZXh0U2VhcmNoUGFyc2VyKHRva2Vucyk7Ci0KLSAgICAgICAgVGV4dFNlYXJjaFBhcnNlci50ZXh0X3NlYXJjaF9leHByZXNzaW9uX3JldHVybiBwYXJzZWRTdGF0ZW1lbnQgPSBwYXJzZXIudGV4dF9zZWFyY2hfZXhwcmVzc2lvbigpOwotICAgICAgICByZXR1cm4gKENvbW1vblRyZWUpIHBhcnNlZFN0YXRlbWVudC5nZXRUcmVlKCk7Ci0gICAgfQotCi19Ci0KLQotLy8gRm9yIENNSVMgU1FMIGl0IHdpbGwgYmUgc3VmZmljaWVudCB0byBzdG9wIG9uIGZpcnN0IGVycm9yOgotQHJ1bGVjYXRjaCB7Ci0gICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZTsKLSAgICB9Ci19Ci0KLXF1ZXJ5IFtRdWVyeU9iamVjdCBxbywgUHJlZGljYXRlV2Fsa2VyQmFzZSBwd10KLSAgICBAaW5pdCB7Ci0gICAgICAgIHF1ZXJ5T2JqID0gcW87Ci0gICAgfToKLSAgICBeKFNFTEVDVCBzZWxlY3RfbGlzdCBmcm9tX2NsYXVzZSBvcmRlcl9ieV9jbGF1c2U/IHdoZXJlX2NsYXVzZSkKLSAgICB7Ci0gICAgICAgIHdoZXJlUHJlZGljYXRlVHJlZSA9ICR3aGVyZV9jbGF1c2UudHJlZT09bnVsbCA/IG51bGwgOiAkd2hlcmVfY2xhdXNlLnRyZWUuZ2V0Q2hpbGQoMCk7Ci0gICAgICAgIGJvb2xlYW4gcmVzb2x2ZWQgPSBxdWVyeU9iai5yZXNvbHZlVHlwZXMoKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcHcgJiYgbnVsbCAhPSAkd2hlcmVfY2xhdXNlLnRyZWUpCi0gICAgICAgICAgICBwdy53YWxrUHJlZGljYXRlKHdoZXJlUHJlZGljYXRlVHJlZSk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgcmVzb2x2ZWQKLSAgICB9PwotICAgIDsKLSAgICBjYXRjaFtGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24gZV0KLSAgICB7Ci0gICAgICAgIC8vIGNoYW5nZSBkZWZhdWx0IHRleHQgdG8gcHJlc2VydmVkIHRleHQgd2hpY2ggaXMgdXNlZnVsCi0gICAgICAgIGUucHJlZGljYXRlVGV4dCA9IHF1ZXJ5T2JqLmdldEVycm9yTWVzc2FnZSgpOwotICAgICAgICB0aHJvdyBlOwotICAgIH0KLQotc2VsZWN0X2xpc3Q6Ci0gICAgICBTVEFSCi0gICAgICB7Ci0gICAgICAgICAgICBxdWVyeU9iai5hZGRTZWxlY3RSZWZlcmVuY2UoJFNUQVIsIG5ldyBDb2x1bW5SZWZlcmVuY2UoJFNUQVIudGV4dCkpOwotICAgICAgfQotICAgIHwgXihTRUxfTElTVCBzZWxlY3Rfc3VibGlzdCspCi0gICAgOwotCi1zZWxlY3Rfc3VibGlzdAotICAgIHNjb3BlIHsgU3RyaW5nIGN1cnJlbnQ7IH0KLSAgICA6Ci0gICAgICB2YWx1ZV9leHByZXNzaW9uIGNvbHVtbl9uYW1lPwotICAgICAgewotICAgICAgICAgIC8vIGFkZCBzZWxlY3RvcgotICAgICAgICAgIHF1ZXJ5T2JqLmFkZFNlbGVjdFJlZmVyZW5jZSgkdmFsdWVfZXhwcmVzc2lvbi5zdGFydCwgJHZhbHVlX2V4cHJlc3Npb24ucmVzdWx0KTsKLSAgICAgICAgICAvLyBhZGQgYWxpYXMgZm9yIGNvbHVtbgotICAgICAgICAgIGlmICgkY29sdW1uX25hbWUudGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgcXVlcnlPYmouYWRkQWxpYXMoJGNvbHVtbl9uYW1lLnRleHQsICR2YWx1ZV9leHByZXNzaW9uLnJlc3VsdCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIHwgcz1xdWFsaWZpZXIgRE9UIFNUQVIKLSAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5T2JqLmFkZFNlbGVjdFJlZmVyZW5jZSgkcy5zdGFydCwgbmV3IENvbHVtblJlZmVyZW5jZSgkcXVhbGlmaWVyLnZhbHVlLCAkU1RBUi50ZXh0KSk7Ci0gICAgICB9Ci0gICAgOwotCi0KLXZhbHVlX2V4cHJlc3Npb24gcmV0dXJucyBbQ21pc1NlbGVjdG9yIHJlc3VsdF06Ci0gICAgICBjb2x1bW5fcmVmZXJlbmNlCi0gICAgICB7Ci0gICAgICAgICAgJHJlc3VsdCA9ICRjb2x1bW5fcmVmZXJlbmNlLnJlc3VsdDsKLSAgICAgIH0KLSAgICB8IFNDT1JFXgotICAgICAgICB7Ci0gICAgICAgICAgICAkcmVzdWx0ID0gbmV3IEZ1bmN0aW9uUmVmZXJlbmNlKEZ1bmN0aW9uUmVmZXJlbmNlLkNtaXNRbEZ1bmN0aW9uLlNDT1JFKTsKLSAgICAgICAgfQotICAgIDsKLQotY29sdW1uX3JlZmVyZW5jZSByZXR1cm5zIFtDb2x1bW5SZWZlcmVuY2UgcmVzdWx0XToKLSAgICBeKENPTCBxdWFsaWZpZXI/IGNvbHVtbl9uYW1lKQotICAgICAgewotICAgICAgICAgICRyZXN1bHQgPSBuZXcgQ29sdW1uUmVmZXJlbmNlKCRxdWFsaWZpZXIudmFsdWUsICRjb2x1bW5fbmFtZS50ZXh0KTsKLSAgICAgIH0KLSAgICA7Ci0KLW11bHRpX3ZhbHVlZF9jb2x1bW5fcmVmZXJlbmNlIHJldHVybnMgW0NvbHVtblJlZmVyZW5jZSByZXN1bHRdOgotICAgIF4oQ09MIHF1YWxpZmllcj8gY29sdW1uX25hbWUpCi0gICAgICB7Ci0gICAgICAgICAgJHJlc3VsdCA9IG5ldyBDb2x1bW5SZWZlcmVuY2UoJHF1YWxpZmllci52YWx1ZSwgJGNvbHVtbl9uYW1lLnRleHQpOwotICAgICAgfQotICAgIDsKLQotcXVhbGlmaWVyIHJldHVybnMgW1N0cmluZyB2YWx1ZV06Ci0gICAgICB0YWJsZV9uYW1lCi0vLyAgICB8IGNvcnJlbGF0aW9uX25hbWUKLSAgICB7Ci0gICAgICAkdmFsdWUgPSAkdGFibGVfbmFtZS50ZXh0OwotICAgIH0KLSAgICA7Ci0KLWZyb21fY2xhdXNlOgotICAgIF4oRlJPTSB0YWJsZV9yZWZlcmVuY2UpCi0gICAgOwotCi10YWJsZV9yZWZlcmVuY2U6Ci0gICAgb25lX3RhYmxlIHRhYmxlX2pvaW4qCi0gICAgOwotCi10YWJsZV9qb2luOgotICAgIF4oSk9JTiBqb2luX2tpbmQgb25lX3RhYmxlIGpvaW5fc3BlY2lmaWNhdGlvbj8pCi0gICAgewotICAgICAgICBib29sZWFuIGhhc1NwZWMgPSAkam9pbl9zcGVjaWZpY2F0aW9uLnRyZWUgIT0gbnVsbDsKLSAgICAgICAgcXVlcnlPYmouYWRkSm9pbigkam9pbl9raW5kLmtpbmQsICRvbmVfdGFibGUuYWxpYXMsIGhhc1NwZWMpOwotICAgIH0KLSAgICA7Ci0KLW9uZV90YWJsZSByZXR1cm5zIFtTdHJpbmcgYWxpYXNdOgotICAgIF4oVEFCTEUgdGFibGVfbmFtZSBjb3JyZWxhdGlvbl9uYW1lPykKLSAgICAgIHsKLSAgICAgICAgICAoJGFsaWFzID0gcXVlcnlPYmouYWRkVHlwZSgkY29ycmVsYXRpb25fbmFtZS50ZXh0LCAkdGFibGVfbmFtZS50ZXh0KSkgIT0gbnVsbAotICAgICAgfT8KLSAgICA7Ci0gICAgY2F0Y2hbRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uIGVdCi0gICAgewotICAgICAgICAvLyBjaGFuZ2UgZGVmYXVsdCB0ZXh0IHRvIHByZXNlcnZlZCB0ZXh0IHdoaWNoIGlzIHVzZWZ1bAotICAgICAgICBlLnByZWRpY2F0ZVRleHQgPSBxdWVyeU9iai5nZXRFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgdGhyb3cgZTsKLSAgICB9Ci0KLWpvaW5fa2luZCByZXR1cm5zIFtTdHJpbmcga2luZF06Ci0gICAgICBJTk5FUiB7ICRraW5kID0gIklOTkVSIjsgfQotICAgIHwgTEVGVCAgeyAka2luZCA9ICJMRUZUIjsgfQotICAgIHwgUklHSFQgeyAka2luZCA9ICJSSUdIVCI7IH0KLSAgICA7Ci0KLWpvaW5fc3BlY2lmaWNhdGlvbjoKLSAgICBeKE9OIGNyMT1jb2x1bW5fcmVmZXJlbmNlIEVRIGNyMj1jb2x1bW5fcmVmZXJlbmNlKQotICAgIHsKLSAgICAgICAgcXVlcnlPYmouYWRkSm9pblJlZmVyZW5jZSgkY3IxLnN0YXJ0LCAkY3IxLnJlc3VsdCk7Ci0gICAgICAgIHF1ZXJ5T2JqLmFkZEpvaW5SZWZlcmVuY2UoJGNyMi5zdGFydCwgJGNyMi5yZXN1bHQpOwotICAgIH0KLSAgICA7Ci0KLXdoZXJlX2NsYXVzZToKLSAgICAgIF4oV0hFUkUgc2VhcmNoX2NvbmRpdGlvbikKLSAgICB8IC8qIG5vdGhpbmcgKi8KLSAgICA7Ci0KLXNlYXJjaF9jb25kaXRpb24KLUBpbml0IHsKLSAgICBMaXN0PE9iamVjdD4gbGlzdExpdGVyYWxzOwotfToKLSAgICBeKE9SIHMxPXNlYXJjaF9jb25kaXRpb24gczI9c2VhcmNoX2NvbmRpdGlvbikKLSAgICB8IF4oQU5EIHMxPXNlYXJjaF9jb25kaXRpb24gczI9c2VhcmNoX2NvbmRpdGlvbikKLSAgICB8IF4oTk9UIHNlYXJjaF9jb25kaXRpb24pCi0gICAgfCBeKEVRIHNlYXJjaF9jb25kaXRpb24gc2VhcmNoX2NvbmRpdGlvbikKLSAgICB8IF4oTkVRIHNlYXJjaF9jb25kaXRpb24gc2VhcmNoX2NvbmRpdGlvbikKLSAgICB8IF4oTFQgc2VhcmNoX2NvbmRpdGlvbiBzZWFyY2hfY29uZGl0aW9uKQotICAgIHwgXihHVCBzZWFyY2hfY29uZGl0aW9uIHNlYXJjaF9jb25kaXRpb24pCi0gICAgfCBeKEdURVEgc2VhcmNoX2NvbmRpdGlvbiBzZWFyY2hfY29uZGl0aW9uKQotICAgIHwgXihMVEVRIHNlYXJjaF9jb25kaXRpb24gc2VhcmNoX2NvbmRpdGlvbikKLSAgICB8IF4oTElLRSBzZWFyY2hfY29uZGl0aW9uIHNlYXJjaF9jb25kaXRpb24pCi0gICAgfCBeKE5PVF9MSUtFIHNlYXJjaF9jb25kaXRpb24gc2VhcmNoX2NvbmRpdGlvbikKLSAgICB8IF4oSVNfTlVMTCBzZWFyY2hfY29uZGl0aW9uKQotICAgIHwgXihJU19OT1RfTlVMTCBzZWFyY2hfY29uZGl0aW9uKQotICAgIHwgXihFUV9BTlkgbGl0ZXJhbCBtdmNyPW11bHRpX3ZhbHVlZF9jb2x1bW5fcmVmZXJlbmNlKQotICAgICAgewotICAgICAgICAgICAgcXVlcnlPYmouYWRkV2hlcmVSZWZlcmVuY2UoJG12Y3Iuc3RhcnQsICRtdmNyLnJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfCBeKElOX0FOWSBtdmNyPW11bHRpX3ZhbHVlZF9jb2x1bW5fcmVmZXJlbmNlIGluX3ZhbHVlX2xpc3QgKQotICAgICAgewotICAgICAgICAgICAgcXVlcnlPYmouYWRkV2hlcmVSZWZlcmVuY2UoJG12Y3Iuc3RhcnQsICRtdmNyLnJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfCBeKE5PVF9JTl9BTlkgbXZjcj1tdWx0aV92YWx1ZWRfY29sdW1uX3JlZmVyZW5jZSBpbl92YWx1ZV9saXN0KQotICAgICAgewotICAgICAgICAgICAgcXVlcnlPYmouYWRkV2hlcmVSZWZlcmVuY2UoJG12Y3Iuc3RhcnQsICRtdmNyLnJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfCBeKENPTlRBSU5TIHF1YWxpZmllcj8gdGV4dF9zZWFyY2hfZXhwcmVzc2lvbikKLSAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5T2JqLmFkZFdoZXJlVHlwZVJlZmVyZW5jZSgkcXVhbGlmaWVyLnN0YXJ0LCAkcXVhbGlmaWVyLnZhbHVlKTsKLSAgICAgICAgICAgICsrbm9Db250YWluczsKLSAgICAgIH0KLSAgICB8IF4oSU5fRk9MREVSIHF1YWxpZmllcj8gc2VhcmNoX2NvbmRpdGlvbikKLSAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5T2JqLmFkZFdoZXJlVHlwZVJlZmVyZW5jZSgkcXVhbGlmaWVyLnN0YXJ0LCAkcXVhbGlmaWVyLnZhbHVlKTsKLSAgICAgIH0KLSAgICB8IF4oSU5fVFJFRSBxdWFsaWZpZXI/IHNlYXJjaF9jb25kaXRpb24pCi0gICAgICB7Ci0gICAgICAgICAgICBxdWVyeU9iai5hZGRXaGVyZVR5cGVSZWZlcmVuY2UoJHF1YWxpZmllci5zdGFydCwgJHF1YWxpZmllci52YWx1ZSk7Ci0gICAgICB9Ci0gICAgfCBeKElOIGNvbHVtbl9yZWZlcmVuY2UgaW5fdmFsdWVfbGlzdCkKLSAgICAgIHsKLSAgICAgICAgICAgIHF1ZXJ5T2JqLmFkZFdoZXJlUmVmZXJlbmNlKCRjb2x1bW5fcmVmZXJlbmNlLnN0YXJ0LCAkY29sdW1uX3JlZmVyZW5jZS5yZXN1bHQpOwotICAgICAgfQotICAgIHwgXihOT1RfSU4gY29sdW1uX3JlZmVyZW5jZSBpbl92YWx1ZV9saXN0KQotICAgICAgewotICAgICAgICAgICAgcXVlcnlPYmouYWRkV2hlcmVSZWZlcmVuY2UoJGNvbHVtbl9yZWZlcmVuY2Uuc3RhcnQsICRjb2x1bW5fcmVmZXJlbmNlLnJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfCB2YWx1ZV9leHByZXNzaW9uCi0gICAgICB7Ci0gICAgICAgICAgcXVlcnlPYmouYWRkV2hlcmVSZWZlcmVuY2UoJHZhbHVlX2V4cHJlc3Npb24uc3RhcnQsICR2YWx1ZV9leHByZXNzaW9uLnJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfCBsaXRlcmFsCi0gICAgOwotCi1pbl92YWx1ZV9saXN0IHJldHVybnMgW09iamVjdCBpbkxpc3RdCi1AaW5pdCB7Ci0gICAgTGlzdDxPYmplY3Q+IGluTGl0ZXJhbHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLX06Ci0gICAgXihJTl9MSVNUIChsPWxpdGVyYWwge2luTGl0ZXJhbHMuYWRkKCRsLnZhbHVlKTt9KSsgKQotICAgIHsKLSAgICAgICAgJGluTGlzdCA9IGluTGl0ZXJhbHM7Ci0gICAgfQotICAgIDsKLQotdGV4dF9zZWFyY2hfZXhwcmVzc2lvbgotQGluaXQgewotICAgIENvbW1vblRyZWUgdHNlID0gbnVsbDsKLX0KLUBhZnRlciB7Ci0gICBpZiAoZG9GdWxsVGV4dFBhcnNlKSB7Ci0gICAgICAgJHRyZWUgPSB0c2U7Ci0gICB9Ci19IDoKLSAgICBTVFJJTkdfTElUCi0gICAgewotICAgICAgICBpZiAoZG9GdWxsVGV4dFBhcnNlKSB7Ci0gICAgICAgICAgICB0c2UgPSBwYXJzZVRleHRTZWFyY2hQcmVkaWNhdGUoJFNUUklOR19MSVQudGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgOwotCi0KLWxpdGVyYWwgcmV0dXJucyBbT2JqZWN0IHZhbHVlXToKLSAgICAgIE5VTV9MSVQKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAkdmFsdWUgPSBMb25nLnZhbHVlT2YoJE5VTV9MSVQudGV4dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICR2YWx1ZSA9IG5ldyBCaWdEZWNpbWFsKCROVU1fTElULnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfCBTVFJJTkdfTElUCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gJFNUUklOR19MSVQudGV4dDsKLSAgICAgICAgICAgICR2YWx1ZSA9IHMhPSBudWxsID8gcy5zdWJzdHJpbmcoMSwgcy5sZW5ndGgoKSAtIDEpIDogbnVsbDsKLSAgICAgICAgfQotICAgIHwgVElNRV9MSVQKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAkVElNRV9MSVQudGV4dDsKLSAgICAgICAgICAgIHMgPSBzIT0gbnVsbCA/IHMuc3Vic3RyaW5nKHMuaW5kZXhPZignXCcnKSArIDEsIHMubGVuZ3RoKCkgLSAxKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICB8IEJPT0xfTElUCi0gICAgICAgIHsKLSAgICAgICAgICAgICR2YWx1ZSA9IEJvb2xlYW4udmFsdWVPZigkQk9PTF9MSVQudGV4dCk7Ci0gICAgICAgIH0KLSAgICA7Ci0KLW9yZGVyX2J5X2NsYXVzZToKLSAgICBeKE9SREVSX0JZIHNvcnRfc3BlY2lmaWNhdGlvbispCi0gICAgOwotCi1zb3J0X3NwZWNpZmljYXRpb246Ci0gICAgY29sdW1uX3JlZmVyZW5jZSBBU0MKLSAgICB7Ci0gICAgICAgcXVlcnlPYmouYWRkU29ydENyaXRlcml1bSgkY29sdW1uX3JlZmVyZW5jZS5zdGFydCwgJGNvbHVtbl9yZWZlcmVuY2UucmVzdWx0LCB0cnVlKTsKLSAgICB9Ci0gICAgfCBjb2x1bW5fcmVmZXJlbmNlIERFU0MKLSAgICB7Ci0gICAgICAgcXVlcnlPYmouYWRkU29ydENyaXRlcml1bSgkY29sdW1uX3JlZmVyZW5jZS5zdGFydCwgJGNvbHVtbl9yZWZlcmVuY2UucmVzdWx0LCBmYWxzZSk7Ci0gICAgfQotICAgIDsKLQotY29ycmVsYXRpb25fbmFtZToKLSAgICBJRDsKLQotdGFibGVfbmFtZToKLSAgICBJRDsKLQotY29sdW1uX25hbWU6Ci0gICAgSUQ7CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9hbnRscjMvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ21pc1FsRXh0TGV4ZXIuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUWxFeHRMZXhlci5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDdjMDNhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUWxFeHRMZXhlci5nCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQXV0aG9yczoKLSAqICAgICBTdGVmYW5lIEZlcm1pZ2llciwgTnV4ZW8KLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqLwotIAotbGV4ZXIgZ3JhbW1hciBDbWlzUWxFeHRMZXhlcjsKLQotaW1wb3J0IENtaXNCYXNlTGV4ZXI7Ci0KLXRva2VucyB7Ci0gICAgRlVOQzsKLSAgICBPUF9BTlk7Ci19Ci0KLUBoZWFkZXIgewotLyoKLSAqIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCwgRE8gTk9UIEVESVQuCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQXV0aG9yczoKLSAqICAgICBTdGVmYW5lIEZlcm1pZ2llciwgTnV4ZW8KLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqCi0gKiBUSElTIEZJTEUgSVMgQVVUTy1HRU5FUkFURUQsIERPIE5PVCBFRElULgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci0KLX0KLQotQG1lbWJlcnMgewotICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpIHsKLSAgICAJcmV0dXJuIGdDbWlzQmFzZUxleGVyLmhhc0Vycm9ycygpOwotICAgIH0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLSAgICAJcmV0dXJuIGdDbWlzQmFzZUxleGVyLmdldEVycm9yTWVzc2FnZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbWl0RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLSAgICAJZ0NtaXNCYXNlTGV4ZXIuZW1pdEVycm9yTWVzc2FnZShtc2cpOwotCX0KLX0KLURJU1RJTkNUIDogKCdEJ3wnZCcpKCdJJ3wnaScpKCdTJ3wncycpKCdUJ3wndCcpKCdJJ3wnaScpKCdOJ3wnbicpKCdDJ3wnYycpKCdUJ3wndCcpOwpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNRbEV4dFBhcnNlci5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNRbEV4dFBhcnNlci5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTEzYWIzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUWxFeHRQYXJzZXIuZworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgIFN0ZWZhbmUgRmVybWlnaWVyLCBOdXhlbwotICogICAgIEZsb3JlbnQgR3VpbGxhdW1lLCBOdXhlbwotICovCi0vKioKLSAqIENNSVNRTCBwYXJzZXIuCi0gKi8KLXBhcnNlciBncmFtbWFyIENtaXNRbEV4dFBhcnNlcjsKLQotb3B0aW9ucyB7Ci0gICAgdG9rZW5Wb2NhYiA9IENtaXNRbEV4dExleGVyOwotICAgIG91dHB1dCA9IEFTVDsKLX0KLQotaW1wb3J0IENtaXNCYXNlR3JhbW1hcjsKLQotQGhlYWRlciB7Ci0vKgotICogVEhJUyBGSUxFIElTIEFVVE8tR0VORVJBVEVELCBETyBOT1QgRURJVC4KLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgIFN0ZWZhbmUgRmVybWlnaWVyLCBOdXhlbwotICogICAgIEZsb3JlbnQgR3VpbGxhdW1lLCBOdXhlbwotICoKLSAqIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCwgRE8gTk9UIEVESVQuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci19Ci0KLUBtZW1iZXJzIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0gICAgCXJldHVybiBnQ21pc0Jhc2VHcmFtbWFyLmhhc0Vycm9ycygpOwotICAgIH0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlcygpIHsKLSAgICAJcmV0dXJuIGdDbWlzQmFzZUdyYW1tYXIuZ2V0RXJyb3JNZXNzYWdlcygpOwotCX0KLX0KLQotcXVlcnk6IFNFTEVDVF4gRElTVElOQ1Q/IHNlbGVjdF9saXN0IGZyb21fY2xhdXNlIHdoZXJlX2NsYXVzZT8gb3JkZXJfYnlfY2xhdXNlPzsKLQotdmFsdWVfZXhwcmVzc2lvbjoKLSAgICAgIGNvbHVtbl9yZWZlcmVuY2UKLSAgICB8IHN0cmluZ192YWx1ZV9mdW5jdGlvbgotICAgIHwgbnVtZXJpY192YWx1ZV9mdW5jdGlvbgotICAgIDsKLQotcXVhbnRpZmllZF9jb21wYXJpc29uX3ByZWRpY2F0ZToKLSAgICBsaXRlcmFsIGNvbXBfb3AgQU5ZIG11bHRpX3ZhbHVlZF9jb2x1bW5fcmVmZXJlbmNlCi0gICAgICAtPiBeKE9QX0FOWSBjb21wX29wIGxpdGVyYWwgbXVsdGlfdmFsdWVkX2NvbHVtbl9yZWZlcmVuY2UpCi0gICAgOwotCi1jb21wX29wOgotICAgIEVRIHwgTkVRIHwgTFQgfCBHVCB8IExURVEgfCBHVEVRCi0gICAgOwotCi1zdHJpbmdfdmFsdWVfZnVuY3Rpb246Ci0gICAgSUQgTFBBUiBjb2x1bW5fcmVmZXJlbmNlIFJQQVIKLSAgICAgIC0+IF4oRlVOQyBJRCBjb2x1bW5fcmVmZXJlbmNlKQotICAgIDsKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUWxTdHJpY3RMZXhlci5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNRbFN0cmljdExleGVyLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4M2E5OWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNRbFN0cmljdExleGVyLmcKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQXV0aG9yczoKLSAqICAgICBTdGVmYW5lIEZlcm1pZ2llciwgTnV4ZW8KLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqLwotIAotbGV4ZXIgZ3JhbW1hciBDbWlzUWxTdHJpY3RMZXhlcjsKLQotaW1wb3J0IENtaXNCYXNlTGV4ZXI7Ci0KLUBoZWFkZXIgewotLyoKLSAqIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCwgRE8gTk9UIEVESVQuCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQXV0aG9yczoKLSAqICAgICBTdGVmYW5lIEZlcm1pZ2llciwgTnV4ZW8KLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqCi0gKiBUSElTIEZJTEUgSVMgQVVUTy1HRU5FUkFURUQsIERPIE5PVCBFRElULgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci19Ci0KLUBtZW1iZXJzIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0gICAgCXJldHVybiBnQ21pc0Jhc2VMZXhlci5oYXNFcnJvcnMoKTsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZXMoKSB7Ci0gICAgCXJldHVybiBnQ21pc0Jhc2VMZXhlci5nZXRFcnJvck1lc3NhZ2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGVtaXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1zZykgewotICAgIAlnQ21pc0Jhc2VMZXhlci5lbWl0RXJyb3JNZXNzYWdlKG1zZyk7Ci0JfQotfQotCi0vLyBhbGwgbGV4ZXIgcnVsZXMgZm9yIGEgc3RyaWN0IENNSVMgcGFyc2VyIGFyZSBpbiB0aGUgYmFzZSBsZXhlciBkZWZpbmVkCi0KLS8vIHdlIG5lZWQgYSBkdW1teSBydWxlIHRvIG1ha2UgQW50TFIgaGFwcHkgKGFuIGVtcHR5IGZpbGUgd2lsbCBub3QgY29tcGlsZSkKLWZyYWdtZW50IERVTU1ZOiAneHl6JzsKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUWxTdHJpY3RQYXJzZXIuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUWxTdHJpY3RQYXJzZXIuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5MTMwZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9hbnRscjMvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ21pc1FsU3RyaWN0UGFyc2VyLmcKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotKi8KLQotcGFyc2VyIGdyYW1tYXIgQ21pc1FsU3RyaWN0UGFyc2VyOwotCi0vLyBOb3RlOiBBTlRMUiBpcyB2ZXJ5IHNlbnNpdGl2ZSB0byBjb21waWxhdGlvbiBlcnJvcnMsIHlvdSBtdXN0Ci0vLyBoYXZlIGZpcnN0IG9wdGlvbnMsIHRoZW4gaW1wb3J0IGFuZCB0aGVuIEBoZWFkZXIuCi0vLyBAaGVhZGVyIG11c3Qgb25seSBiZSBpbiBkZXJpdmVkIGdyYW1tYXJzIG5vdCBpbiBiYXNlIGdyYW1tYXJzCi0vLyBubyBwYWNrYWdlIGRlY2xhcmF0aW9ucyBpbiBiYXNlIGdyYW1tYXJzCi0KLQotb3B0aW9ucyB7Ci0gICAgdG9rZW5Wb2NhYiA9IENtaXNRbFN0cmljdExleGVyOwotICAgIG91dHB1dCA9IEFTVDsKLX0KLQotaW1wb3J0IENtaXNCYXNlR3JhbW1hcjsKLQotQGhlYWRlciB7Ci0vKgotICogVEhJUyBGSUxFIElTIEFVVE8tR0VORVJBVEVELCBETyBOT1QgRURJVC4KLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgIFN0ZWZhbmUgRmVybWlnaWVyLCBOdXhlbwotICogICAgIEZsb3JlbnQgR3VpbGxhdW1lLCBOdXhlbwotICoKLSAqIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCwgRE8gTk9UIEVESVQuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci19Ci0KLUBtZW1iZXJzIHsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBlcnJvck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7Ci0gICAgCXJldHVybiBlcnJvck1lc3NhZ2VzLnNpemUoKSA+IDAgfHwgIGdDbWlzQmFzZUdyYW1tYXIuaGFzRXJyb3JzKCk7Ci0gICAgfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpY3RQYXJzZXJFcnJvck1lc3NhZ2VzKCkgewotCQlTdHJpbmdCdWZmZXIgYWxsTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQotCQlmb3IgKFN0cmluZyBtc2cgOiBlcnJvck1lc3NhZ2VzKQotCQkJYWxsTWVzc2FnZXMuYXBwZW5kKG1zZykuYXBwZW5kKCdcbicpOwotCQkJCi0JCXJldHVybiBhbGxNZXNzYWdlcy50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZXMoKSB7Ci0JICAgIGlmIChlcnJvck1lc3NhZ2VzLnNpemUoKSA+IDApIHsKLQkgICAgICAgIHJldHVybiBnZXRTdHJpY3RQYXJzZXJFcnJvck1lc3NhZ2VzKCk7Ci0JICAgIH0gZWxzZSB7Ci0gICAgCSAgICByZXR1cm4gZ0NtaXNCYXNlR3JhbW1hci5nZXRFcnJvck1lc3NhZ2VzKCk7Ci0gICAgCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0gICAgLy8gSW5zdGVhZCBvZiBzZW5kaW5nIGFsbCBlcnJvcnMgdG8gU3lzdGVtLmVyciBjb2xsZWN0IHRoZW0gaW4gYSBsaXN0Ci0JcHVibGljIHZvaWQgZW1pdEVycm9yTWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0JCWVycm9yTWVzc2FnZXMuYWRkKG1zZyk7Ci0JfQotCQotfQotCi0gIC8vIFJ1bGVzIGNhbid0IGJlIGVtcHR5IHNvIHdlIGhhdmUgb25lIGR1bW15IHJ1bGUgaGVyZQotcm9vdCA6IHF1ZXJ5IEVPRjsKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUXVlcnlXYWxrZXIuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUXVlcnlXYWxrZXIuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNzQ3NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9hbnRscjMvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ21pc1F1ZXJ5V2Fsa2VyLmcKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgICAgRmxvcmVudCBHdWlsbGF1bWUsIE51eGVvCi0gKi8KLS8qKgotICogQ01JU1FMIHRyZWUgZ3JhbW1hciwgd2Fsa2VyIGZvciB0aGUgaW5tZW1vcnkgaW1wbGVtZW50YXRpb24uCi0gKiBUaGlzIGFpbXMgYXQgaW1wbGVtZW50aW5nIHByb3BlciBzZW1hbnRpY3Mgd2l0aG91dCBhbnkgc3BlZWQKLSAqIG9wdGltaXphdGlvbi4KLSAqLwotdHJlZSBncmFtbWFyIENtaXNRdWVyeVdhbGtlcjsKLQotb3B0aW9ucyB7Ci0gICAgdG9rZW5Wb2NhYiA9IENtaXNRbFN0cmljdExleGVyOwotICAgIEFTVExhYmVsVHlwZSA9IENvbW1vblRyZWU7Ci0gICAgb3V0cHV0ID0gQVNUOwotfQotCi1pbXBvcnQgQ21pc0Jhc2VXYWxrZXI7Ci0KLUBoZWFkZXIgewotLyoKLSAqIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCwgRE8gTk9UIEVESVQuCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQXV0aG9yczoKLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqCi0gKiBUSElTIEZJTEUgSVMgQVVUTy1HRU5FUkFURUQsIERPIE5PVCBFRElULgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLX0KLQotCi1AbWVtYmVycyB7Ci0gICAgcHVibGljIFRyZWUgZ2V0V2hlcmVQcmVkaWNhdGVUcmVlKCkgewotICAgICAgICByZXR1cm4gZ0NtaXNCYXNlV2Fsa2VyLmdldFdoZXJlUHJlZGljYXRlVHJlZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIG1pc21hdGNoKEludFN0cmVhbSBpbnB1dCwgaW50IHR0eXBlLCBCaXRTZXQgZm9sbG93KSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdDbWlzQmFzZVdhbGtlci5taXNtYXRjaChpbnB1dCwgdHR5cGUsIGZvbGxvdyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVjb3ZlckZyb21NaXNtYXRjaGVkU2V0KEludFN0cmVhbSBpbnB1dCwgUmVjb2duaXRpb25FeGNlcHRpb24gZSwgYW50bHIuY29sbGVjdGlvbnMuaW1wbC5CaXRTZXQgZm9sbG93KSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdDbWlzQmFzZVdhbGtlci5yZWNvdmVyRnJvbU1pc21hdGNoZWRTZXQoaW5wdXQsIGUsIGZvbGxvdyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG9GdWxsVGV4dFBhcnNlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgZ0NtaXNCYXNlV2Fsa2VyLnNldERvRnVsbFRleHRQYXJzZSh2YWx1ZSk7Ci0gICAgfQotCQotICAgIHB1YmxpYyBib29sZWFuIGdldERvRnVsbFRleHRQYXJzZSgpIHsKLSAgICAgICAgcmV0dXJuIGdDbWlzQmFzZVdhbGtlci5nZXREb0Z1bGxUZXh0UGFyc2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXROdW1iZXJPZkNvbnRhaW5zQ2xhdXNlcygpIHsKLSAgICAgICAgcmV0dXJuIGdDbWlzQmFzZVdhbGtlci5nZXROdW1iZXJPZkNvbnRhaW5zQ2xhdXNlcygpOwotICAgIH0KLQkKLX0KLQotLy8gRm9yIENNSVMgU1FMIGl0IHdpbGwgYmUgc3VmZmljaWVudCB0byBzdG9wIG9uIGZpcnN0IGVycm9yOgotQHJ1bGVjYXRjaCB7Ci0gICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZTsKLSAgICB9Ci19Ci0KLXJvb3QgW1F1ZXJ5T2JqZWN0IGdvLCBQcmVkaWNhdGVXYWxrZXJCYXNlIHB3XSB0aHJvd3MgQ21pc1F1ZXJ5RXhjZXB0aW9uOgotICAgICAgcXVlcnkgW2dvLCBwd107ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1RleHRTZWFyY2guZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2FudGxyMy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9UZXh0U2VhcmNoLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDliYzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vYW50bHIzL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1RleHRTZWFyY2guZworKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogVEhJUyBGSUxFIElTIEFVVE8tR0VORVJBVEVELCBETyBOT1QgRURJVC4KLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBBdXRob3JzOiBKZW5zCi0gKi8KLQotLyoqCi0gKiBDTUlTUUwgcGFyc2VyLgotIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTA0NDAyL2hvdy10by1oYW5kbGUtZXNjYXBlLXNlcXVlbmNlcy1pbi1zdHJpbmctbGl0ZXJhbHMtaW4tYW50bHItMwotICovCi1ncmFtbWFyIFRleHRTZWFyY2g7Ci0KLW9wdGlvbnMgewotICAgIEFTVExhYmVsVHlwZSA9IENvbW1vblRyZWU7Ci0gICAgb3V0cHV0ID0gQVNUOwotfQotCi10b2tlbnMgewotICAgIFRFWFRfQU5EOwotCVRFWFRfT1I7Ci0JVEVYVF9NSU5VUzsKLX0KLQotQGhlYWRlciB7Ci0vKgotICogVEhJUyBGSUxFIElTIEFVVE8tR0VORVJBVEVELCBETyBOT1QgRURJVC4KLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBUSElTIEZJTEUgSVMgQVVUTy1HRU5FUkFURUQsIERPIE5PVCBFRElULgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci19Ci0KLUBsZXhlcjo6aGVhZGVyIHsKLS8qCi0gKiBUSElTIEZJTEUgSVMgQVVUTy1HRU5FUkFURUQsIERPIE5PVCBFRElULgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCwgRE8gTk9UIEVESVQuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeTsKLX0KLQotQGxleGVyOjptZW1iZXJzIHsKLQlwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihSZWNvZ25pdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JICAgc3VwZXIucmVwb3J0RXJyb3IoZSk7Ci0JICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JfQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLzcKLS8vIExleGVyIFBhcnQKLQotQU5EIDogKCdBJ3wnYScpKCdOJ3wnbicpKCdEJ3wnZCcpOwotT1IgOiAoJ08nfCdvJykoJ1InfCdyJyk7Ci1URVhUX01JTlVTIDogJy0nOwotCi0vLyB0ZXN0IHNlYXJjaCByZWxhdGVkIHRva2VucwotCi1mcmFnbWVudCAKLVFVT1RFOiAnXCcnOwotCi1mcmFnbWVudCAKLURPVUJMRV9RVU9URTogJ1wiJzsKLQotZnJhZ21lbnQgCi1CQUNLU0w6ICdcXCc7Ci0KLS8vIEFuIGVzY2FwZSBzZXF1ZW5jZSBpcyB0d28gYmFja3NsYXNoZXMgZm9yIGJhY2tzbGFzaCwgYmFja3NsYXNoIHNpbmdsZSBxdW90ZSBmb3Igc2luZ2xlIHF1b3RlCi0vLyBzaW5nbGUgcXVvdGUgc2luZ2xlIHF1b3RlIGZvciBzaW5nbGUgcXVvdGUKLWZyYWdtZW50Ci1FU0MgCi0JOiBCQUNLU0wgKFFVT1RFIHwgRE9VQkxFX1FVT1RFIHwgQkFDS1NMIHwgVEVYVF9NSU5VUyB8ICcqJyB8ICc/JykKLS8vIGFkZCB0aGlzIGxpbmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBkb3VibGUgc2luZ2xlIHF1b3RlIGFzIGVzY2FwZWQgcXVvdGUgZm9yIGZ1bGwgdGV4dCBhcyBpbiBTUUwtOTIJCi0vLwl8IHsgKChDaGFyU3RyZWFtKWlucHV0KS5MVCgyKT09J1wnJyB9PyA9PiBRVU9URSBRVU9URQotCTsKLQkKLVdTIDogKCAnICcgfCAnXHQnIHwgJ1xyJz8gJ1xuJyApKyB7ICRjaGFubmVsPUhJRERFTjsgfTsKLQotZnJhZ21lbnQKLVRFWFRfU0VBUkNIX1BIUkFTRV9TVFJJTkcgCi0gICA6IAotICAgICAoIEVTQyAKLSAgICAgICB8IH4oQkFDS1NMIHwgRE9VQkxFX1FVT1RFIHwgVEVYVF9NSU5VUyB8IFFVT1RFKQotICAgICApKwotICAgOwotICAgCi1URVhUX1NFQVJDSF9QSFJBU0VfU1RSSU5HX0xJVAotICAgIDogRE9VQkxFX1FVT1RFIFRFWFRfU0VBUkNIX1BIUkFTRV9TVFJJTkcgRE9VQkxFX1FVT1RFCi0JOwotCi0JLy8gYSBsaXRlcmFsIGZvciB0ZXh0IHNlYXJjaCBpcyBhIHZlcnkgZ2VuZXJpYyBydWxlIGFuZCBtYXRjaGVzIGFsbW9zdCBhbnl0aGluZwotVEVYVF9TRUFSQ0hfV09SRF9MSVQgCi0gICA6IAotICAgICAoIEVTQyAKLSAgICAgICB8IH4oQkFDS1NMIHwgUVVPVEUgfCAnICcgfCAnXHQnIHwgJ1xyJyB8ICdcbicgfCAnLScpCi0gICAgICkrCi0gICA7Ci0KLS8vIC0tLS0tIFBhcnNlciAtLS0tLQotCQotdGV4dF9zZWFyY2hfZXhwcmVzc2lvbgotICAgIDogY29uanVuY3QgKE9SIGNvbmp1bmN0KSsKLQkgICAgLT4gXihURVhUX09SIGNvbmp1bmN0KykKLQl8IGNvbmp1bmN0Ci0JOwotCi1jb25qdW5jdAotICAgIDogdGVybSAoQU5EPyB0ZXJtKSsKLQkgICAgLT4gXihURVhUX0FORCB0ZXJtKykKLQkgIHwgdGVybQotCTsKLQkKLXRlcm0KLSAgICA6IFRFWFRfTUlOVVNePyAod29yZCB8IHBocmFzZSkKLQk7Ci0JCi1waHJhc2UKLSAgICA6IFRFWFRfU0VBUkNIX1BIUkFTRV9TVFJJTkdfTElUCi0JOwotCi13b3JkCi0gICAgOiBURVhUX1NFQVJDSF9XT1JEX0xJVCAKLQk7Ci0JCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L0NhbGxDb250ZXh0V3JhcHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9DYWxsQ29udGV4dFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwZjlmZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L0NhbGxDb250ZXh0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLQotLyoqCi0gKiBQcm92aWRlcyBhIGNvbnZlbmllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBDYWxsQ29udGV4dH0gaW50ZXJmYWNlIHRoYXQgY2FuIGJlCi0gKiBzdWJjbGFzc2VkIGJ5IGRldmVsb3BlcnMgd2lzaGluZyB0byBjaGFuZ2UsIGFkZCwgb3IgaGlkZSBjYWxsIGNvbnRleHQgZGF0YS4KLSAqIAotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBXcmFwcGVyIG9yIERlY29yYXRvciBwYXR0ZXJuLiBNZXRob2RzIGRlZmF1bHQgdG8KLSAqIGNhbGxpbmcgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCByZXF1ZXN0IG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIENhbGxDb250ZXh0V3JhcHBlciBpbXBsZW1lbnRzIENhbGxDb250ZXh0IHsKLQotICAgIHByaXZhdGUgZmluYWwgQ2FsbENvbnRleHQgY29udGV4dDsKLQotICAgIHB1YmxpYyBDYWxsQ29udGV4dFdyYXBwZXIoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0QmluZGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0SW5mb1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5pc09iamVjdEluZm9SZXF1aXJlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KFN0cmluZyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNWZXJzaW9uIGdldENtaXNWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDbWlzVmVyc2lvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeUlkKCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXBvc2l0b3J5SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRVc2VybmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFBhc3N3b3JkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldExvY2FsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0T2Zmc2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZW1wRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUZW1wRGlyZWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZW5jcnlwdFRlbXBGaWxlcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZW5jcnlwdFRlbXBGaWxlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TWVtb3J5VGhyZXNob2xkKCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRNZW1vcnlUaHJlc2hvbGQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhDb250ZW50U2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TWF4Q29udGVudFNpemUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L0NtaXNTZXJ2aWNlV3JhcHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9DbWlzU2VydmljZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlOGIwOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L0NtaXNTZXJ2aWNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQud3JhcHBlci5Db25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlcjsKLQotLyoqCi0gKiBTZXJ2aWNlIHdyYXBwZXIuCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXJ9IGluc3RlYWQKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBDbWlzU2VydmljZVdyYXBwZXI8VCBleHRlbmRzIENtaXNTZXJ2aWNlPiBleHRlbmRzIENvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU2VydmljZVdyYXBwZXIoVCBzZXJ2aWNlLCBCaWdJbnRlZ2VyIGRlZmF1bHRUeXBlc01heEl0ZW1zLCBCaWdJbnRlZ2VyIGRlZmF1bHRUeXBlc0RlcHRoLAotICAgICAgICAgICAgQmlnSW50ZWdlciBkZWZhdWx0TWF4SXRlbXMsIEJpZ0ludGVnZXIgZGVmYXVsdERlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHNlcnZpY2UsIGRlZmF1bHRUeXBlc01heEl0ZW1zLCBkZWZhdWx0VHlwZXNEZXB0aCwgZGVmYXVsdE1heEl0ZW1zLCBkZWZhdWx0RGVwdGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBUIGdldFdyYXBwZWRTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gKFQpIHN1cGVyLmdldFdyYXBwZWRTZXJ2aWNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9NdXRhYmxlQ2FsbENvbnRleHRXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L011dGFibGVDYWxsQ29udGV4dFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzNzZjNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L011dGFibGVDYWxsQ29udGV4dFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuTXV0YWJsZUNhbGxDb250ZXh0OwotCi0vKioKLSAqIFByb3ZpZGVzIGEgY29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE11dGFibGVDYWxsQ29udGV4dH0KLSAqIGludGVyZmFjZSB0aGF0IGNhbiBiZSBzdWJjbGFzc2VkIGJ5IGRldmVsb3BlcnMgd2lzaGluZyB0byBjaGFuZ2UsIGFkZCwgb3IKLSAqIGhpZGUgY2FsbCBjb250ZXh0IGRhdGEuCi0gKiAKLSAqIElmIHRoZSBwcm92aWRlZCB7QGxpbmsgQ2FsbENvbnRleHR9IG9iamVjdCBpbXBsZW1lbnRzIHRoZQotICoge0BsaW5rIE11dGFibGVDYWxsQ29udGV4dH0gaW50ZXJmYWNlLCBhbGwge0BsaW5rICNnZXQoU3RyaW5nKX0sCi0gKiB7QGxpbmsgI3B1dChTdHJpbmcsIE9iamVjdCl9LCBhbmQge0BsaW5rICNyZW1vdmUoU3RyaW5nKX0gY2FsbHMgYXJlIGZvcndhcmRlZAotICogdG8gdGhpcyBjYWxsIGNvbnRleHQgb2JqZWN0LiBJZiB0aGlzIHtAbGluayBDYWxsQ29udGV4dH0gb2JqZWN0IGRvZXMgbm90Ci0gKiBpbXBsZW1lbnQgdGhlIHtAbGluayBNdXRhYmxlQ2FsbENvbnRleHR9IGludGVyZmFjZSwgdGhlIGtleS12YWx1ZSBwYWlycyBhcmUKLSAqIHN0b3JlZCBoZXJlIGFuZCBoaWRlIHRoZSB2YWx1ZXMgb2YgdGhlIHByb3ZpZGVkIHtAbGluayBDYWxsQ29udGV4dH0gb2JqZWN0LgotICogVGhhdCBpcywgdGhlIGZpcnN0IHtAbGluayBNdXRhYmxlQ2FsbENvbnRleHR9IG9iamVjdCBpbiB0aGUgY2hhaW4gb2YKLSAqIHtAbGluayBNdXRhYmxlQ2FsbENvbnRleHRXcmFwcGVyfSBvYmplY3RzIG1hbmFnZXMgdGhlIGRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBNdXRhYmxlQ2FsbENvbnRleHRXcmFwcGVyIGltcGxlbWVudHMgTXV0YWJsZUNhbGxDb250ZXh0IHsKLQotICAgIHByaXZhdGUgZmluYWwgQ2FsbENvbnRleHQgY29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVzOwotCi0gICAgcHVibGljIE11dGFibGVDYWxsQ29udGV4dFdyYXBwZXIoQ2FsbENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIE11dGFibGVDYWxsQ29udGV4dCkgewotICAgICAgICAgICAgdmFsdWVzID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldChrZXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5nZXQoa2V5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0KGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgKChNdXRhYmxlQ2FsbENvbnRleHQpIGNvbnRleHQpLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICgoTXV0YWJsZUNhbGxDb250ZXh0KSBjb250ZXh0KS5yZW1vdmUoa2V5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbnRleHQuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGhpZGUgdmFsdWUgb2Ygb3JpZ2luIGNhbGwgY29udGV4dAotICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoa2V5LCBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldEJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdEluZm9SZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuaXNPYmplY3RJbmZvUmVxdWlyZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAoQ21pc1ZlcnNpb24pIGdldChDTUlTX1ZFUlNJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeUlkKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0KFJFUE9TSVRPUllfSUQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXQoVVNFUk5BTUUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBnZXQoUEFTU1dPUkQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0KExPQ0FMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0T2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gKEJpZ0ludGVnZXIpIGdldChPRkZTRVQpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIChCaWdJbnRlZ2VyKSBnZXQoTEVOR1RIKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZW1wRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gKEZpbGUpIGdldChURU1QX0RJUik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZW5jcnlwdFRlbXBGaWxlcygpIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoZ2V0KEVOQ1JZUFRfVEVNUF9GSUxFKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNZW1vcnlUaHJlc2hvbGQoKSB7Ci0gICAgICAgIHJldHVybiAoSW50ZWdlcikgZ2V0KE1FTU9SWV9USFJFU0hPTEQpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldE1heENvbnRlbnRTaXplKCkgewotICAgICAgICByZXR1cm4gKExvbmcpIGdldChNQVhfQ09OVEVOVF9TSVpFKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L1R5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9UeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5ZjQ1Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L1R5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2MSArMCwwIEBACi0vKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZUZvbGRlclR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLk11dGFibGVQcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5NdXRhYmxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEYXRlVGltZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlIdG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5SWREZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5VXJpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVNdXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Db250ZW50U3RyZWFtQWxsb3dlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ2hvaWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRm9sZGVyVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5JdGVtVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qb2xpY3lUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5TZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZURlZmluaXRpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuVHlwZU11dGFiaWxpdHlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlcG9zaXRvcnlTZXJ2aWNlOwotCi0vKioKLSAqIFR5cGUgZGVmaW5pdGlvbiBmYWN0b3J5LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZURlZmluaXRpb25GYWN0b3J5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IE5FV19DTUlTMTFfUFJPUEVSVElFUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICBzdGF0aWMgewotICAgICAgICBORVdfQ01JUzExX1BST1BFUlRJRVMuYWRkKFByb3BlcnR5SWRzLkRFU0NSSVBUSU9OKTsKLSAgICAgICAgTkVXX0NNSVMxMV9QUk9QRVJUSUVTLmFkZChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKTsKLSAgICAgICAgTkVXX0NNSVMxMV9QUk9QRVJUSUVTLmFkZChQcm9wZXJ0eUlkcy5JU19QUklWQVRFX1dPUktJTkdfQ09QWSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24+IGRvY3VtZW50VHlwZURlZmluaXRpb25DbGFzczsKLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBNdXRhYmxlRm9sZGVyVHlwZURlZmluaXRpb24+IGZvbGRlclR5cGVEZWZpbml0aW9uQ2xhc3M7Ci0gICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgTXV0YWJsZVBvbGljeVR5cGVEZWZpbml0aW9uPiBwb2xpY3lUeXBlRGVmaW5pdGlvbkNsYXNzOwotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIE11dGFibGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbj4gcmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25DbGFzczsKLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBNdXRhYmxlSXRlbVR5cGVEZWZpbml0aW9uPiBpdGVtVHlwZURlZmluaXRpb25DbGFzczsKLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24+IHNlY29uZGFyeVR5cGVEZWZpbml0aW9uQ2xhc3M7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Q29udHJvbGxhYmxlQWNsOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWZhdWx0SXNGdWxsVGV4dEluZGV4ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRDb250cm9sbGFibGVQb2xpY3k7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRRdWVyeWFibGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRGdWxsdGV4dEluZGV4ZWQ7Ci0gICAgcHJpdmF0ZSBUeXBlTXV0YWJpbGl0eSBkZWZhdWx0VHlwZU11dGFiaWxpdHk7Ci0KLSAgICBwcml2YXRlIFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgZG9jdW1lbnRUeXBlRGVmaW5pdGlvbkNsYXNzID0gRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwuY2xhc3M7Ci0gICAgICAgIGZvbGRlclR5cGVEZWZpbml0aW9uQ2xhc3MgPSBGb2xkZXJUeXBlRGVmaW5pdGlvbkltcGwuY2xhc3M7Ci0gICAgICAgIHBvbGljeVR5cGVEZWZpbml0aW9uQ2xhc3MgPSBQb2xpY3lUeXBlRGVmaW5pdGlvbkltcGwuY2xhc3M7Ci0gICAgICAgIHJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uQ2xhc3MgPSBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkltcGwuY2xhc3M7Ci0gICAgICAgIGl0ZW1UeXBlRGVmaW5pdGlvbkNsYXNzID0gSXRlbVR5cGVEZWZpbml0aW9uSW1wbC5jbGFzczsKLSAgICAgICAgc2Vjb25kYXJ5VHlwZURlZmluaXRpb25DbGFzcyA9IFNlY29uZGFyeVR5cGVEZWZpbml0aW9uSW1wbC5jbGFzczsKLQotICAgICAgICBkZWZhdWx0TmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgZGVmYXVsdENvbnRyb2xsYWJsZUFjbCA9IGZhbHNlOwotICAgICAgICBkZWZhdWx0Q29udHJvbGxhYmxlUG9saWN5ID0gZmFsc2U7Ci0gICAgICAgIGRlZmF1bHRRdWVyeWFibGUgPSB0cnVlOwotICAgICAgICBkZWZhdWx0RnVsbHRleHRJbmRleGVkID0gZmFsc2U7Ci0KLSAgICAgICAgVHlwZU11dGFiaWxpdHlJbXBsIHR5cGVNdXRhYmlsaXR5ID0gbmV3IFR5cGVNdXRhYmlsaXR5SW1wbCgpOwotICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5DcmVhdGUoZmFsc2UpOwotICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5VcGRhdGUoZmFsc2UpOwotICAgICAgICB0eXBlTXV0YWJpbGl0eS5zZXRDYW5EZWxldGUoZmFsc2UpOwotICAgICAgICBkZWZhdWx0VHlwZU11dGFiaWxpdHkgPSB0eXBlTXV0YWJpbGl0eTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZURlZmluaXRpb25GYWN0b3J5IG5ld0luc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIC8vIC0tLSBkZWZpbml0aW9uIGNsYXNzZXMgLS0tCi0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uPiBnZXREb2N1bWVudFR5cGVEZWZpbml0aW9uQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudFR5cGVEZWZpbml0aW9uQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRUeXBlRGVmaW5pdGlvbkNsYXNzKAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uPiBkb2N1bWVudFR5cGVEZWZpbml0aW9uQ2xhc3MpIHsKLSAgICAgICAgY2hlY2tDbGFzcyhkb2N1bWVudFR5cGVEZWZpbml0aW9uQ2xhc3MpOwotICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURlZmluaXRpb25DbGFzcyA9IGRvY3VtZW50VHlwZURlZmluaXRpb25DbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbk9iamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBkb2N1bWVudFR5cGVEZWZpbml0aW9uQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSB0eXBlIGRlZmludGlvbiBvYmplY3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbj4gZ2V0Rm9sZGVyVHlwZURlZmluaXRpb25DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGZvbGRlclR5cGVEZWZpbml0aW9uQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9sZGVyVHlwZURlZmluaXRpb25DbGFzcyhDbGFzczw/IGV4dGVuZHMgTXV0YWJsZUZvbGRlclR5cGVEZWZpbml0aW9uPiBmb2xkZXJUeXBlRGVmaW5pdGlvbkNsYXNzKSB7Ci0gICAgICAgIGNoZWNrQ2xhc3MoZm9sZGVyVHlwZURlZmluaXRpb25DbGFzcyk7Ci0gICAgICAgIHRoaXMuZm9sZGVyVHlwZURlZmluaXRpb25DbGFzcyA9IGZvbGRlclR5cGVEZWZpbml0aW9uQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBjcmVhdGVGb2xkZXJUeXBlRGVmaW5pdGlvbk9iamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBmb2xkZXJUeXBlRGVmaW5pdGlvbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgdHlwZSBkZWZpbnRpb24gb2JqZWN0OiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBNdXRhYmxlUG9saWN5VHlwZURlZmluaXRpb24+IGdldFBvbGljeVR5cGVEZWZpbml0aW9uQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBwb2xpY3lUeXBlRGVmaW5pdGlvbkNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeVR5cGVEZWZpbml0aW9uQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIE11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbj4gcG9saWN5VHlwZURlZmluaXRpb25DbGFzcykgewotICAgICAgICBjaGVja0NsYXNzKHBvbGljeVR5cGVEZWZpbml0aW9uQ2xhc3MpOwotICAgICAgICB0aGlzLnBvbGljeVR5cGVEZWZpbml0aW9uQ2xhc3MgPSBwb2xpY3lUeXBlRGVmaW5pdGlvbkNsYXNzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNdXRhYmxlUG9saWN5VHlwZURlZmluaXRpb24gY3JlYXRlUG9saWN5VHlwZURlZmluaXRpb25PYmplY3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcG9saWN5VHlwZURlZmluaXRpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIHR5cGUgZGVmaW50aW9uIG9iamVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uPiBnZXRSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkNsYXNzKCkgewotICAgICAgICByZXR1cm4gcmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkNsYXNzKAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE11dGFibGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbj4gcmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25DbGFzcykgewotICAgICAgICBjaGVja0NsYXNzKHJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uQ2xhc3MpOwotICAgICAgICB0aGlzLnJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uQ2xhc3MgPSByZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbkNsYXNzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gY3JlYXRlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25PYmplY3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIHR5cGUgZGVmaW50aW9uIG9iamVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbj4gZ2V0SXRlbVR5cGVEZWZpbml0aW9uQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBpdGVtVHlwZURlZmluaXRpb25DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJdGVtVHlwZURlZmluaXRpb25DbGFzcyhDbGFzczw/IGV4dGVuZHMgTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbj4gaXRlbVR5cGVEZWZpbml0aW9uQ2xhc3MpIHsKLSAgICAgICAgY2hlY2tDbGFzcyhpdGVtVHlwZURlZmluaXRpb25DbGFzcyk7Ci0gICAgICAgIHRoaXMuaXRlbVR5cGVEZWZpbml0aW9uQ2xhc3MgPSBpdGVtVHlwZURlZmluaXRpb25DbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbiBjcmVhdGVJdGVtVHlwZURlZmluaXRpb25PYmplY3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbVR5cGVEZWZpbml0aW9uQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSB0eXBlIGRlZmludGlvbiBvYmplY3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIE11dGFibGVTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbj4gZ2V0U2Vjb25kYXJ5VHlwZURlZmluaXRpb25DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIHNlY29uZGFyeVR5cGVEZWZpbml0aW9uQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2Vjb25kYXJ5VHlwZURlZmluaXRpb25DbGFzcygKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24+IHNlY29uZGFyeVR5cGVEZWZpbml0aW9uQ2xhc3MpIHsKLSAgICAgICAgY2hlY2tDbGFzcyhzZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkNsYXNzKTsKLSAgICAgICAgdGhpcy5zZWNvbmRhcnlUeXBlRGVmaW5pdGlvbkNsYXNzID0gc2Vjb25kYXJ5VHlwZURlZmluaXRpb25DbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTXV0YWJsZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uIGNyZWF0ZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uT2JqZWN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNlY29uZGFyeVR5cGVEZWZpbml0aW9uQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSB0eXBlIGRlZmludGlvbiBvYmplY3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tDbGFzcyhDbGFzczw/IGV4dGVuZHMgTXV0YWJsZVR5cGVEZWZpbml0aW9uPiBjbGF6eikgewotICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2xhc3MgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBmb3IgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xhenouZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzWzBdKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXNzIGhhcyBubyBhY2Nlc3NpYmxlIGRlZmF1bHQgY29uc3RydWN0b3IhIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gZGVmYXVsdCB2YWx1ZXMgLS0tCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2UoU3RyaW5nIGRlZmF1bHROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0TmFtZXNwYWNlID0gZGVmYXVsdE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0SXNGdWxsdGV4dEluZGV4ZWQoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0SXNGdWxsVGV4dEluZGV4ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdElzRnVsbHRleHRJbmRleGVkKGJvb2xlYW4gZGVmYXVsdElzRnVsbFRleHRJbmRleGVkKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdElzRnVsbFRleHRJbmRleGVkID0gZGVmYXVsdElzRnVsbFRleHRJbmRleGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRDb250cm9sbGFibGVBY2woKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Q29udHJvbGxhYmxlQWNsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRDb250cm9sbGFibGVBY2woYm9vbGVhbiBkZWZhdWx0Q29udHJvbGxhYmxlQWNsKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdENvbnRyb2xsYWJsZUFjbCA9IGRlZmF1bHRDb250cm9sbGFibGVBY2w7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRDb250cm9sbGFibGVQb2xpY3k7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeShib29sZWFuIGRlZmF1bHRDb250cm9sbGFibGVQb2xpY3kpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0Q29udHJvbGxhYmxlUG9saWN5ID0gZGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0UXVlcnlhYmxlKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdFF1ZXJ5YWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UXVlcnlhYmxlKGJvb2xlYW4gZGVmYXVsdFF1ZXJ5YWJsZSkgewotICAgICAgICB0aGlzLmRlZmF1bHRRdWVyeWFibGUgPSBkZWZhdWx0UXVlcnlhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRGdWxsdGV4dEluZGV4ZWQoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0RnVsbHRleHRJbmRleGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRGdWxsdGV4dEluZGV4ZWQoYm9vbGVhbiBkZWZhdWx0RnVsbHRleHRJbmRleGVkKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdEZ1bGx0ZXh0SW5kZXhlZCA9IGRlZmF1bHRGdWxsdGV4dEluZGV4ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVNdXRhYmlsaXR5IGdldERlZmF1bHRUeXBlTXV0YWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRUeXBlTXV0YWJpbGl0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VHlwZU11dGFiaWxpdHkoVHlwZU11dGFiaWxpdHkgZGVmYXVsdFR5cGVNdXRhYmlsaXR5KSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFR5cGVNdXRhYmlsaXR5ID0gZGVmYXVsdFR5cGVNdXRhYmlsaXR5OwotICAgIH0KLQotICAgIC8vIC0tLSBjcmVhdGUgbWV0aG9kcyAtLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgdHlwZSBtdXRhYmlsaXR5IG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZU11dGFiaWxpdHkgY3JlYXRlVHlwZU11dGFiaWxpdHkoYm9vbGVhbiBjYW5DcmVhdGUsIGJvb2xlYW4gY2FuVXBkYXRlLCBib29sZWFuIGNhbkRlbGV0ZSkgewotICAgICAgICBUeXBlTXV0YWJpbGl0eUltcGwgcmVzdWx0ID0gbmV3IFR5cGVNdXRhYmlsaXR5SW1wbCgpOwotCi0gICAgICAgIHJlc3VsdC5zZXRDYW5DcmVhdGUoY2FuQ3JlYXRlKTsKLSAgICAgICAgcmVzdWx0LnNldENhblVwZGF0ZShjYW5VcGRhdGUpOwotICAgICAgICByZXN1bHQuc2V0Q2FuRGVsZXRlKGNhbkRlbGV0ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGFibGUgYmFzZSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gaW5jbHVkaW5nIGFsbAotICAgICAqIHByb3BlcnR5IGRlZmluaXRpb25zIGRlZmluZWQgaW4gdGhlIENNSVMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gY3JlYXRlQmFzZURvY3VtZW50VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURvY3VtZW50VHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24sIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YWJsZSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gaW5jbHVkaW5nIGFsbCBiYXNlCi0gICAgICogcHJvcGVydHkgZGVmaW5pdGlvbnMgZGVmaW5lZCBpbiB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBjcmVhdGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgTXV0YWJsZURvY3VtZW50VHlwZURlZmluaXRpb24gZG9jdW1lbnRUeXBlID0gY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbk9iamVjdCgpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0QmFzZVR5cGVJZChCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0UGFyZW50VHlwZUlkKHBhcmVudElkKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldElzQ29udHJvbGxhYmxlQWNsKGRlZmF1bHRDb250cm9sbGFibGVBY2wpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0SXNDb250cm9sbGFibGVQb2xpY3koZGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeSk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc0NyZWF0YWJsZSh0cnVlKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldERlc2NyaXB0aW9uKCJEb2N1bWVudCIpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0RGlzcGxheU5hbWUoIkRvY3VtZW50Iik7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc0ZpbGVhYmxlKHRydWUpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0SXNGdWxsdGV4dEluZGV4ZWQoZGVmYXVsdEZ1bGx0ZXh0SW5kZXhlZCk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSh0cnVlKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldExvY2FsTmFtZSgiRG9jdW1lbnQiKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldExvY2FsTmFtZXNwYWNlKGRlZmF1bHROYW1lc3BhY2UpOwotICAgICAgICBkb2N1bWVudFR5cGUuc2V0SXNRdWVyeWFibGUoZGVmYXVsdFF1ZXJ5YWJsZSk7Ci0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRRdWVyeU5hbWUoImNtaXM6ZG9jdW1lbnQiKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldElkKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKTsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBkb2N1bWVudFR5cGUuc2V0VHlwZU11dGFiaWxpdHkoZGVmYXVsdFR5cGVNdXRhYmlsaXR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvY3VtZW50VHlwZS5zZXRJc1ZlcnNpb25hYmxlKGZhbHNlKTsKLSAgICAgICAgZG9jdW1lbnRUeXBlLnNldENvbnRlbnRTdHJlYW1BbGxvd2VkKENvbnRlbnRTdHJlYW1BbGxvd2VkLkFMTE9XRUQpOwotCi0gICAgICAgIGFkZEJhc2VQcm9wZXJ0eURlZmluaXRpb25zKGRvY3VtZW50VHlwZSwgY21pc1ZlcnNpb24sIHBhcmVudElkICE9IG51bGwpOwotICAgICAgICBhZGREb2N1bWVudFByb3BlcnR5RGVmaW5pdGlvbnMoZG9jdW1lbnRUeXBlLCBjbWlzVmVyc2lvbiwgcGFyZW50SWQgIT0gbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGFibGUgYmFzZSBmb2xkZXIgdHlwZSBkZWZpbml0aW9uIGluY2x1ZGluZyBhbGwgcHJvcGVydHkKLSAgICAgKiBkZWZpbml0aW9ucyBkZWZpbmVkIGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBjcmVhdGVCYXNlRm9sZGVyVHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZvbGRlclR5cGVEZWZpbml0aW9uKGNtaXNWZXJzaW9uLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGFibGUgZm9sZGVyIHR5cGUgZGVmaW5pdGlvbiBpbmNsdWRpbmcgYWxsIGJhc2UgcHJvcGVydHkKLSAgICAgKiBkZWZpbml0aW9ucyBkZWZpbmVkIGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBjcmVhdGVGb2xkZXJUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiBmb2xkZXJUeXBlID0gY3JlYXRlRm9sZGVyVHlwZURlZmluaXRpb25PYmplY3QoKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRCYXNlVHlwZUlkKEJhc2VUeXBlSWQuQ01JU19GT0xERVIpOwotICAgICAgICBmb2xkZXJUeXBlLnNldFBhcmVudFR5cGVJZChwYXJlbnRJZCk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0SXNDb250cm9sbGFibGVBY2woZGVmYXVsdENvbnRyb2xsYWJsZUFjbCk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0SXNDb250cm9sbGFibGVQb2xpY3koZGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0SXNDcmVhdGFibGUodHJ1ZSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0RGVzY3JpcHRpb24oIkZvbGRlciIpOwotICAgICAgICBmb2xkZXJUeXBlLnNldERpc3BsYXlOYW1lKCJGb2xkZXIiKTsKLSAgICAgICAgZm9sZGVyVHlwZS5zZXRJc0ZpbGVhYmxlKHRydWUpOwotICAgICAgICBmb2xkZXJUeXBlLnNldElzRnVsbHRleHRJbmRleGVkKGRlZmF1bHRGdWxsdGV4dEluZGV4ZWQpOwotICAgICAgICBmb2xkZXJUeXBlLnNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KHRydWUpOwotICAgICAgICBmb2xkZXJUeXBlLnNldExvY2FsTmFtZSgiRm9sZGVyIik7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0TG9jYWxOYW1lc3BhY2UoZGVmYXVsdE5hbWVzcGFjZSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0SXNRdWVyeWFibGUoZGVmYXVsdFF1ZXJ5YWJsZSk7Ci0gICAgICAgIGZvbGRlclR5cGUuc2V0UXVlcnlOYW1lKCJjbWlzOmZvbGRlciIpOwotICAgICAgICBmb2xkZXJUeXBlLnNldElkKEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSk7Ci0gICAgICAgIGlmIChjbWlzVmVyc2lvbiAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgZm9sZGVyVHlwZS5zZXRUeXBlTXV0YWJpbGl0eShkZWZhdWx0VHlwZU11dGFiaWxpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQmFzZVByb3BlcnR5RGVmaW5pdGlvbnMoZm9sZGVyVHlwZSwgY21pc1ZlcnNpb24sIHBhcmVudElkICE9IG51bGwpOwotICAgICAgICBhZGRGb2xkZXJQcm9wZXJ0eURlZmluaXRpb25zKGZvbGRlclR5cGUsIGNtaXNWZXJzaW9uLCBwYXJlbnRJZCAhPSBudWxsKTsKLQotICAgICAgICByZXR1cm4gZm9sZGVyVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGFibGUgYmFzZSBwb2xpY3kgdHlwZSBkZWZpbml0aW9uIGluY2x1ZGluZyBhbGwgcHJvcGVydHkKLSAgICAgKiBkZWZpbml0aW9ucyBkZWZpbmVkIGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIE11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbiBjcmVhdGVCYXNlUG9saWN5VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVBvbGljeVR5cGVEZWZpbml0aW9uKGNtaXNWZXJzaW9uLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGFibGUgcG9saWN5IHR5cGUgZGVmaW5pdGlvbiBpbmNsdWRpbmcgYWxsIGJhc2UgcHJvcGVydHkKLSAgICAgKiBkZWZpbml0aW9ucyBkZWZpbmVkIGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIE11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbiBjcmVhdGVQb2xpY3lUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIE11dGFibGVQb2xpY3lUeXBlRGVmaW5pdGlvbiBwb2xpY3lUeXBlID0gY3JlYXRlUG9saWN5VHlwZURlZmluaXRpb25PYmplY3QoKTsKLSAgICAgICAgcG9saWN5VHlwZS5zZXRCYXNlVHlwZUlkKEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kpOwotICAgICAgICBwb2xpY3lUeXBlLnNldFBhcmVudFR5cGVJZChwYXJlbnRJZCk7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0SXNDb250cm9sbGFibGVBY2woZGVmYXVsdENvbnRyb2xsYWJsZUFjbCk7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0SXNDb250cm9sbGFibGVQb2xpY3koZGVmYXVsdENvbnRyb2xsYWJsZVBvbGljeSk7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0SXNDcmVhdGFibGUoZmFsc2UpOwotICAgICAgICBwb2xpY3lUeXBlLnNldERlc2NyaXB0aW9uKCJQb2xpY3kiKTsKLSAgICAgICAgcG9saWN5VHlwZS5zZXREaXNwbGF5TmFtZSgiUG9saWN5Iik7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0SXNGaWxlYWJsZShmYWxzZSk7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0SXNGdWxsdGV4dEluZGV4ZWQoZGVmYXVsdEZ1bGx0ZXh0SW5kZXhlZCk7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0SXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkodHJ1ZSk7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0TG9jYWxOYW1lKCJQb2xpY3kiKTsKLSAgICAgICAgcG9saWN5VHlwZS5zZXRMb2NhbE5hbWVzcGFjZShkZWZhdWx0TmFtZXNwYWNlKTsKLSAgICAgICAgcG9saWN5VHlwZS5zZXRJc1F1ZXJ5YWJsZShkZWZhdWx0UXVlcnlhYmxlKTsKLSAgICAgICAgcG9saWN5VHlwZS5zZXRRdWVyeU5hbWUoImNtaXM6cG9saWN5Iik7Ci0gICAgICAgIHBvbGljeVR5cGUuc2V0SWQoQmFzZVR5cGVJZC5DTUlTX1BPTElDWS52YWx1ZSgpKTsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBwb2xpY3lUeXBlLnNldFR5cGVNdXRhYmlsaXR5KGRlZmF1bHRUeXBlTXV0YWJpbGl0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRCYXNlUHJvcGVydHlEZWZpbml0aW9ucyhwb2xpY3lUeXBlLCBjbWlzVmVyc2lvbiwgcGFyZW50SWQgIT0gbnVsbCk7Ci0gICAgICAgIGFkZFBvbGljeVByb3BlcnR5RGVmaW5pdGlvbnMocG9saWN5VHlwZSwgY21pc1ZlcnNpb24sIHBhcmVudElkICE9IG51bGwpOwotCi0gICAgICAgIHJldHVybiBwb2xpY3lUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YWJsZSBiYXNlIHJlbGF0aW9uc2hpcCB0eXBlIGRlZmluaXRpb24gaW5jbHVkaW5nIGFsbAotICAgICAqIHByb3BlcnR5IGRlZmluaXRpb25zIGRlZmluZWQgaW4gdGhlIENNSVMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIGNyZWF0ZUJhc2VSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgewotICAgICAgICByZXR1cm4gY3JlYXRlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24sIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YWJsZSByZWxhdGlvbnNoaXAgdHlwZSBkZWZpbml0aW9uIGluY2x1ZGluZyBhbGwgYmFzZQotICAgICAqIHByb3BlcnR5IGRlZmluaXRpb25zIGRlZmluZWQgaW4gdGhlIENNSVMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIGNyZWF0ZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uIHJlbGF0aW9uc2hpcFR5cGUgPSBjcmVhdGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbk9iamVjdCgpOwotICAgICAgICByZWxhdGlvbnNoaXBUeXBlLnNldEJhc2VUeXBlSWQoQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUCk7Ci0gICAgICAgIHJlbGF0aW9uc2hpcFR5cGUuc2V0UGFyZW50VHlwZUlkKHBhcmVudElkKTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRJc0NvbnRyb2xsYWJsZUFjbChkZWZhdWx0Q29udHJvbGxhYmxlQWNsKTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRJc0NvbnRyb2xsYWJsZVBvbGljeShkZWZhdWx0Q29udHJvbGxhYmxlUG9saWN5KTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRJc0NyZWF0YWJsZShmYWxzZSk7Ci0gICAgICAgIHJlbGF0aW9uc2hpcFR5cGUuc2V0RGVzY3JpcHRpb24oIlJlbGF0aW9uc2hpcCIpOwotICAgICAgICByZWxhdGlvbnNoaXBUeXBlLnNldERpc3BsYXlOYW1lKCJSZWxhdGlvbnNoaXAiKTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRJc0ZpbGVhYmxlKGZhbHNlKTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRJc0Z1bGx0ZXh0SW5kZXhlZChkZWZhdWx0RnVsbHRleHRJbmRleGVkKTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSh0cnVlKTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRMb2NhbE5hbWUoIlJlbGF0aW9uc2hpcCIpOwotICAgICAgICByZWxhdGlvbnNoaXBUeXBlLnNldExvY2FsTmFtZXNwYWNlKGRlZmF1bHROYW1lc3BhY2UpOwotICAgICAgICByZWxhdGlvbnNoaXBUeXBlLnNldElzUXVlcnlhYmxlKGRlZmF1bHRRdWVyeWFibGUpOwotICAgICAgICByZWxhdGlvbnNoaXBUeXBlLnNldFF1ZXJ5TmFtZSgiY21pczpyZWxhdGlvbnNoaXAiKTsKLSAgICAgICAgcmVsYXRpb25zaGlwVHlwZS5zZXRJZChCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQLnZhbHVlKCkpOwotICAgICAgICBpZiAoY21pc1ZlcnNpb24gIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHJlbGF0aW9uc2hpcFR5cGUuc2V0VHlwZU11dGFiaWxpdHkoZGVmYXVsdFR5cGVNdXRhYmlsaXR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZEJhc2VQcm9wZXJ0eURlZmluaXRpb25zKHJlbGF0aW9uc2hpcFR5cGUsIGNtaXNWZXJzaW9uLCBwYXJlbnRJZCAhPSBudWxsKTsKLSAgICAgICAgYWRkUmVsYXRpb25zaGlwUHJvcGVydHlEZWZpbml0aW9ucyhyZWxhdGlvbnNoaXBUeXBlLCBjbWlzVmVyc2lvbiwgcGFyZW50SWQgIT0gbnVsbCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBtdXRhYmxlIGJhc2UgaXRlbSB0eXBlIGRlZmluaXRpb24gaW5jbHVkaW5nIGFsbCBwcm9wZXJ0eQotICAgICAqIGRlZmluaXRpb25zIGRlZmluZWQgaW4gdGhlIENNSVMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZUl0ZW1UeXBlRGVmaW5pdGlvbiBjcmVhdGVCYXNlSXRlbVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJdGVtVHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24sIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YWJsZSBpdGVtIHR5cGUgZGVmaW5pdGlvbiBpbmNsdWRpbmcgYWxsIGJhc2UgcHJvcGVydHkKLSAgICAgKiBkZWZpbml0aW9ucyBkZWZpbmVkIGluIHRoZSBDTUlTIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIE11dGFibGVJdGVtVHlwZURlZmluaXRpb24gY3JlYXRlSXRlbVR5cGVEZWZpbml0aW9uKENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDTUlTIDEuMCBkb2Vzbid0IHN1cHBvcnQgaXRlbSB0eXBlcyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE11dGFibGVJdGVtVHlwZURlZmluaXRpb24gaXRlbVR5cGUgPSBjcmVhdGVJdGVtVHlwZURlZmluaXRpb25PYmplY3QoKTsKLSAgICAgICAgaXRlbVR5cGUuc2V0QmFzZVR5cGVJZChCYXNlVHlwZUlkLkNNSVNfSVRFTSk7Ci0gICAgICAgIGl0ZW1UeXBlLnNldFBhcmVudFR5cGVJZChwYXJlbnRJZCk7Ci0gICAgICAgIGl0ZW1UeXBlLnNldElzQ29udHJvbGxhYmxlQWNsKGRlZmF1bHRDb250cm9sbGFibGVBY2wpOwotICAgICAgICBpdGVtVHlwZS5zZXRJc0NvbnRyb2xsYWJsZVBvbGljeShkZWZhdWx0Q29udHJvbGxhYmxlUG9saWN5KTsKLSAgICAgICAgaXRlbVR5cGUuc2V0SXNDcmVhdGFibGUodHJ1ZSk7Ci0gICAgICAgIGl0ZW1UeXBlLnNldERlc2NyaXB0aW9uKCJJdGVtIik7Ci0gICAgICAgIGl0ZW1UeXBlLnNldERpc3BsYXlOYW1lKCJJdGVtIik7Ci0gICAgICAgIGl0ZW1UeXBlLnNldElzRmlsZWFibGUodHJ1ZSk7Ci0gICAgICAgIGl0ZW1UeXBlLnNldElzRnVsbHRleHRJbmRleGVkKGRlZmF1bHRGdWxsdGV4dEluZGV4ZWQpOwotICAgICAgICBpdGVtVHlwZS5zZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSh0cnVlKTsKLSAgICAgICAgaXRlbVR5cGUuc2V0TG9jYWxOYW1lKCJJdGVtIik7Ci0gICAgICAgIGl0ZW1UeXBlLnNldExvY2FsTmFtZXNwYWNlKGRlZmF1bHROYW1lc3BhY2UpOwotICAgICAgICBpdGVtVHlwZS5zZXRJc1F1ZXJ5YWJsZShkZWZhdWx0UXVlcnlhYmxlKTsKLSAgICAgICAgaXRlbVR5cGUuc2V0UXVlcnlOYW1lKCJjbWlzOml0ZW0iKTsKLSAgICAgICAgaXRlbVR5cGUuc2V0SWQoQmFzZVR5cGVJZC5DTUlTX0lURU0udmFsdWUoKSk7Ci0gICAgICAgIGl0ZW1UeXBlLnNldFR5cGVNdXRhYmlsaXR5KGRlZmF1bHRUeXBlTXV0YWJpbGl0eSk7Ci0KLSAgICAgICAgYWRkQmFzZVByb3BlcnR5RGVmaW5pdGlvbnMoaXRlbVR5cGUsIGNtaXNWZXJzaW9uLCBwYXJlbnRJZCAhPSBudWxsKTsKLQotICAgICAgICByZXR1cm4gaXRlbVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBtdXRhYmxlIGJhc2Ugc2Vjb25kYXJ5IHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uIGNyZWF0ZUJhc2VTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbikgewotICAgICAgICByZXR1cm4gY3JlYXRlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24sIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YWJsZSBzZWNvbmRhcnkgdHlwZSBkZWZpbml0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gY3JlYXRlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24oQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNNSVMgMS4wIGRvZXNuJ3Qgc3VwcG9ydCBzZWNvbmRhcnkgdHlwZXMhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBNdXRhYmxlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24gc2Vjb25kYXJ5VHlwZSA9IGNyZWF0ZVNlY29uZGFyeVR5cGVEZWZpbml0aW9uT2JqZWN0KCk7Ci0gICAgICAgIHNlY29uZGFyeVR5cGUuc2V0QmFzZVR5cGVJZChCYXNlVHlwZUlkLkNNSVNfU0VDT05EQVJZKTsKLSAgICAgICAgc2Vjb25kYXJ5VHlwZS5zZXRQYXJlbnRUeXBlSWQocGFyZW50SWQpOwotICAgICAgICBzZWNvbmRhcnlUeXBlLnNldElzQ29udHJvbGxhYmxlQWNsKGRlZmF1bHRDb250cm9sbGFibGVBY2wpOwotICAgICAgICBzZWNvbmRhcnlUeXBlLnNldElzQ29udHJvbGxhYmxlUG9saWN5KGRlZmF1bHRDb250cm9sbGFibGVQb2xpY3kpOwotICAgICAgICBzZWNvbmRhcnlUeXBlLnNldElzQ3JlYXRhYmxlKHRydWUpOwotICAgICAgICBzZWNvbmRhcnlUeXBlLnNldERlc2NyaXB0aW9uKCJTZWNvbmRhcnkiKTsKLSAgICAgICAgc2Vjb25kYXJ5VHlwZS5zZXREaXNwbGF5TmFtZSgiU2Vjb25kYXJ5Iik7Ci0gICAgICAgIHNlY29uZGFyeVR5cGUuc2V0SXNGaWxlYWJsZShmYWxzZSk7Ci0gICAgICAgIHNlY29uZGFyeVR5cGUuc2V0SXNGdWxsdGV4dEluZGV4ZWQoZmFsc2UpOwotICAgICAgICBzZWNvbmRhcnlUeXBlLnNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KHRydWUpOwotICAgICAgICBzZWNvbmRhcnlUeXBlLnNldExvY2FsTmFtZSgiU2Vjb25kYXJ5Iik7Ci0gICAgICAgIHNlY29uZGFyeVR5cGUuc2V0TG9jYWxOYW1lc3BhY2UoZGVmYXVsdE5hbWVzcGFjZSk7Ci0gICAgICAgIHNlY29uZGFyeVR5cGUuc2V0SXNRdWVyeWFibGUoZGVmYXVsdFF1ZXJ5YWJsZSk7Ci0gICAgICAgIHNlY29uZGFyeVR5cGUuc2V0UXVlcnlOYW1lKCJjbWlzOnNlY29uZGFyeSIpOwotICAgICAgICBzZWNvbmRhcnlUeXBlLnNldElkKEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkudmFsdWUoKSk7Ci0gICAgICAgIHNlY29uZGFyeVR5cGUuc2V0VHlwZU11dGFiaWxpdHkoZGVmYXVsdFR5cGVNdXRhYmlsaXR5KTsKLQotICAgICAgICByZXR1cm4gc2Vjb25kYXJ5VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IG11dGFibGUgdHlwZSBkZWZpbml0aW9uLCB3aGljaCBpcyBhIGNoaWxkIG9mIHRoZSBwcm92aWRlZAotICAgICAqIHR5cGUgZGVmaW5pdGlvbi4gUHJvcGVydHkgZGVmaW5pdGlvbnMgYXJlIGNvcGllZCBmcm9tIHRoZSBwYXJlbnQgYW5kCi0gICAgICogbWFya2VkIGFzIGluaGVyaXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50VHlwZURlZmluaXRpb24KLSAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIGRlZmluaXRpb24gb2YgdGhlIHBhcmVudAotICAgICAqIEBwYXJhbSBpZAotICAgICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBjaGlsZCB0eXBlIGRlZmluaXRpb24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbXV0YWJsZSBjaGlsZCB0eXBlIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZVR5cGVEZWZpbml0aW9uIGNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gcGFyZW50VHlwZURlZmluaXRpb24sIFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihwYXJlbnRUeXBlRGVmaW5pdGlvbiwgaWQsIGlkLCBpZCwgaWQsIG51bGwsIHRydWUsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgbXV0YWJsZSB0eXBlIGRlZmluaXRpb24sIHdoaWNoIGlzIGEgY2hpbGQgb2YgdGhlIHByb3ZpZGVkCi0gICAgICogdHlwZSBkZWZpbml0aW9uLiBJZiB0aGUgcGFyYW1ldGVyIHtAY29kZSBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9uc30gaXMKLSAgICAgKiBzZXQgdG8ge0Bjb2RlIHRydWV9IHByb3BlcnR5IGRlZmluaXRpb25zIGFyZSBjb3BpZWQgZnJvbSB0aGUgcGFyZW50IGFuZAotICAgICAqIG1hcmtlZCBhcyBpbmhlcml0ZWQuCi0gICAgICovCi0gICAgcHVibGljIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHBhcmVudFR5cGVEZWZpbml0aW9uLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcXVlcnlOYW1lLCBTdHJpbmcgZGlzcGxheU5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChwYXJlbnRUeXBlRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJlbnQgdHlwZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDaGlsZCBpZCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiBjaGlsZFR5cGUgPSBjb3B5KHBhcmVudFR5cGVEZWZpbml0aW9uLCBmYWxzZSk7Ci0KLSAgICAgICAgY2hpbGRUeXBlLnNldFBhcmVudFR5cGVJZChwYXJlbnRUeXBlRGVmaW5pdGlvbi5nZXRJZCgpKTsKLSAgICAgICAgY2hpbGRUeXBlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgY2hpbGRUeXBlLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgY2hpbGRUeXBlLnNldExvY2FsTmFtZShsb2NhbE5hbWUpOwotICAgICAgICBjaGlsZFR5cGUuc2V0UXVlcnlOYW1lKHF1ZXJ5TmFtZSk7Ci0gICAgICAgIGNoaWxkVHlwZS5zZXRJZChpZCk7Ci0KLSAgICAgICAgaWYgKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICBjb3B5UHJvcGVydHlEZWZpbml0aW9ucyhwYXJlbnRUeXBlRGVmaW5pdGlvbiwgY2hpbGRUeXBlLCBjbWlzVmVyc2lvbiwgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2hpbGRUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBkZWZpbml0aW9uIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBJRCwgbm90IHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGRpc3BsYXkgbmFtZSwgbWF5IGJlIHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0aW9uLCBtYXkgYmUge0Bjb2RlIG51bGx9Ci0gICAgICogQHBhcmFtIGRhdGF0eXBlCi0gICAgICogICAgICAgICAgICB0aGUgZGF0YXR5cGUsIG5vdCB7QGNvZGUgbnVsbH0KLSAgICAgKiBAcGFyYW0gY2FyZGluYWxpdHkKLSAgICAgKiAgICAgICAgICAgIHRoZSBjYXJkaW5hbGl0eSwgbm90IHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSB1cGRhdGVhYmlsaXR5Ci0gICAgICogICAgICAgICAgICB0aGUgdXBkYXRlYWJpbGl0eSwgbm90IHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSBpbmhlcml0ZWQKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpcyBpbmhlcml0ZWQsCi0gICAgICogICAgICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqIEBwYXJhbSByZXF1aXJlZAotICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIGEgcHJvcGVydHkgdmFsdWUgaXMgcmVxdWlyZWQsIHtAY29kZSBmYWxzZX0KLSAgICAgKiAgICAgICAgICAgIG90aGVyd2lzZQotICAgICAqIEBwYXJhbSBxdWVyeWFibGUKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSBpZiB0aGUgcHJvcGVydHkgY2FuIGJlIHVzZWQgaW4gdGhlIFdIRVJFIGNsYXVzZQotICAgICAqICAgICAgICAgICAgb2YgYSBxdWVyeSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKLSAgICAgKiBAcGFyYW0gb3JkZXJhYmxlCi0gICAgICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHByb3BlcnR5IGNhbiBiZSB1c2VkIGluIHRoZSBPUkRFUiBCWQotICAgICAqICAgICAgICAgICAgY2xhdXNlIG9mIGEgcXVlcnksIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICogCi0gICAgICogQHJldHVybiBhIG11dGFibGUgcHJvcGVydHkgZGVmaW5pdGlvbiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbjw/PiBjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oU3RyaW5nIGlkLCBTdHJpbmcgZGlzcGxheU5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIFByb3BlcnR5VHlwZSBkYXRhdHlwZSwgQ2FyZGluYWxpdHkgY2FyZGluYWxpdHksIFVwZGF0YWJpbGl0eSB1cGRhdGVhYmlsaXR5LCBib29sZWFuIGluaGVyaXRlZCwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVxdWlyZWQsIGJvb2xlYW4gcXVlcnlhYmxlLCBib29sZWFuIG9yZGVyYWJsZSkgewotICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSUQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRhdGF0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRhdGF0eXBlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYXJkaW5hbGl0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYXJkaW5hbGl0eSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlYWJpbGl0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVcGRhdGVhYmlsaXR5IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbjw/PiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAoZGF0YXR5cGUpIHsKLSAgICAgICAgY2FzZSBCT09MRUFOOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVRFVElNRToKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFQ0lNQUw6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElEOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVSSToKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVVyaURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZGF0YXR5cGUhIFNwZWMgY2hhbmdlPyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldElkKGlkKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShpZCk7Ci0gICAgICAgIHJlc3VsdC5zZXREaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7Ci0gICAgICAgIHJlc3VsdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIHJlc3VsdC5zZXRQcm9wZXJ0eVR5cGUoZGF0YXR5cGUpOwotICAgICAgICByZXN1bHQuc2V0Q2FyZGluYWxpdHkoY2FyZGluYWxpdHkpOwotICAgICAgICByZXN1bHQuc2V0VXBkYXRhYmlsaXR5KHVwZGF0ZWFiaWxpdHkpOwotICAgICAgICByZXN1bHQuc2V0SXNJbmhlcml0ZWQoaW5oZXJpdGVkKTsKLSAgICAgICAgcmVzdWx0LnNldElzUmVxdWlyZWQocmVxdWlyZWQpOwotICAgICAgICByZXN1bHQuc2V0SXNRdWVyeWFibGUocXVlcnlhYmxlKTsKLSAgICAgICAgcmVzdWx0LnNldElzT3JkZXJhYmxlKG9yZGVyYWJsZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUoaWQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHNpbmdsZSB2YWx1ZSBDaG9pY2Ugb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGNob2ljZSBkaXNwbGF5IG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIENob2ljZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IENob2ljZTxUPiBjcmVhdGVDaG9pY2UoU3RyaW5nIGRpc3BsYXlOYW1lLCBUIHZhbHVlKSB7Ci0gICAgICAgIENob2ljZUltcGw8VD4gcmVzdWx0ID0gbmV3IENob2ljZUltcGw8VD4oKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgcmVzdWx0LnNldFZhbHVlKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtdWx0aSB2YWx1ZSBDaG9pY2Ugb2JqZWN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGNob2ljZSBkaXNwbGF5IG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIENob2ljZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgPFQ+IENob2ljZTxUPiBjcmVhdGVDaG9pY2UoU3RyaW5nIGRpc3BsYXlOYW1lLCBMaXN0PFQ+IHZhbHVlKSB7Ci0gICAgICAgIENob2ljZUltcGw8VD4gcmVzdWx0ID0gbmV3IENob2ljZUltcGw8VD4oKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgcmVzdWx0LnNldFZhbHVlKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBDaG9pY2Ugb2JqZWN0IHdpdGggc3ViIGNob2ljZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpc3BsYXlOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgY2hvaWNlIGRpc3BsYXkgbmFtZQotICAgICAqIEBwYXJhbSBzdWJDaG9pY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBzdWIgY2hvaWNlIGxpc3QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBDaG9pY2Ugb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIDxUPiBDaG9pY2U8VD4gY3JlYXRlQ2hvaWNlV2l0aFN1YkNob2ljZXMoU3RyaW5nIGRpc3BsYXlOYW1lLCBMaXN0PENob2ljZTxUPj4gc3ViQ2hvaWNlKSB7Ci0gICAgICAgIENob2ljZUltcGw8VD4gcmVzdWx0ID0gbmV3IENob2ljZUltcGw8VD4oKTsKLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgcmVzdWx0LnNldENob2ljZShzdWJDaG9pY2UpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHR5cGUgZGVmaW5pdGlvbiBsaXN0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0Ci0gICAgICogICAgICAgICAgICB0aGUgbGlzdCBvZiB0eXBlIGRlZmluaXRpb25zLCBub3Qge0Bjb2RlIG51bGx9Ci0gICAgICogQHBhcmFtIGhhc01vcmVJdGVtcwotICAgICAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGFyZSBtb3JlIGl0ZW1zLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQotICAgICAqIEBwYXJhbSBudW1JdGVtcwotICAgICAqICAgICAgICAgICAgdGhlIHRvdGFsIChwb3NpdGl2ZSkgbnVtYmVyIG9mIHR5cGVzIGF0IHRoaXMgbGV2ZWwgb3IKLSAgICAgKiAgICAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGUgbnVtYmVyIGlzIHVua25vd24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUeXBlRGVmaW5pdGlvbkxpc3Qgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uTGlzdCBjcmVhdGVUeXBlRGVmaW5pdGlvbkxpc3QoTGlzdDxUeXBlRGVmaW5pdGlvbj4gbGlzdCwgYm9vbGVhbiBoYXNNb3JlSXRlbXMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG51bUl0ZW1zKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxpc3QgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bUl0ZW1zICE9IG51bGwgJiYgbnVtSXRlbXMuc2lnbnVtKCkgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdW1iZXIgb2YgaXRlbXMgaXMgbmVnYXRpdmUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsIHJlc3VsdCA9IG5ldyBUeXBlRGVmaW5pdGlvbkxpc3RJbXBsKGxpc3QpOwotICAgICAgICByZXN1bHQuc2V0SGFzTW9yZUl0ZW1zKGhhc01vcmVJdGVtcyk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhudW1JdGVtcyk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFR5cGVEZWZpbml0aW9uTGlzdH0gZm9yCi0gICAgICoge0BsaW5rIFJlcG9zaXRvcnlTZXJ2aWNlI2dldFR5cGVDaGlsZHJlbihTdHJpbmcsIFN0cmluZywgQm9vbGVhbiwgQmlnSW50ZWdlciwgQmlnSW50ZWdlciwgRXh0ZW5zaW9uc0RhdGEpfQotICAgICAqIC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGNyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdChNYXA8U3RyaW5nLCBUeXBlRGVmaW5pdGlvbj4gYWxsVHlwZXMsIFN0cmluZyB0eXBlSWQsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCkgewotICAgICAgICByZXR1cm4gY3JlYXRlVHlwZURlZmluaXRpb25MaXN0KGFsbFR5cGVzLCB0eXBlSWQsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBtYXhJdGVtcywgc2tpcENvdW50LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFR5cGVEZWZpbml0aW9uTGlzdH0gZm9yCi0gICAgICoge0BsaW5rIFJlcG9zaXRvcnlTZXJ2aWNlI2dldFR5cGVDaGlsZHJlbihTdHJpbmcsIFN0cmluZywgQm9vbGVhbiwgQmlnSW50ZWdlciwgQmlnSW50ZWdlciwgRXh0ZW5zaW9uc0RhdGEpfQotICAgICAqIC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGNyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdChNYXA8U3RyaW5nLCBUeXBlRGVmaW5pdGlvbj4gYWxsVHlwZXMsIFN0cmluZyB0eXBlSWQsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgaWYgKGFsbFR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR5cGVzIG1hcCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0eXBlSWQgIT0gbnVsbCAmJiAhYWxsVHlwZXMuY29udGFpbnNLZXkodHlwZUlkKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbigiVHlwZSAnIiArIHR5cGVJZCArICInIGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25MaXN0SW1wbCByZXN1bHQgPSBuZXcgVHlwZURlZmluaXRpb25MaXN0SW1wbChDb2xsZWN0aW9ucy48VHlwZURlZmluaXRpb24+IGVtcHR5TGlzdCgpKTsKLSAgICAgICAgcmVzdWx0LnNldEhhc01vcmVJdGVtcyhmYWxzZSk7Ci0gICAgICAgIHJlc3VsdC5zZXROdW1JdGVtcyhCaWdJbnRlZ2VyLlpFUk8pOwotCi0gICAgICAgIGlmIChhbGxUeXBlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWF4SXRlbXNJbnQgPSAobWF4SXRlbXMgPT0gbnVsbCA/IEludGVnZXIuTUFYX1ZBTFVFIDogbWF4SXRlbXMuaW50VmFsdWUoKSk7Ci0gICAgICAgIGlmIChtYXhJdGVtc0ludCA8IDApIHsKLSAgICAgICAgICAgIG1heEl0ZW1zSW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBza2lwQ291bnRJbnQgPSAoc2tpcENvdW50ID09IG51bGwgPyAwIDogc2tpcENvdW50LmludFZhbHVlKCkpOwotICAgICAgICBpZiAoc2tpcENvdW50SW50IDwgMCkgewotICAgICAgICAgICAgc2tpcENvdW50SW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnNCb29sID0gKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID09IG51bGwgPyBmYWxzZQotICAgICAgICAgICAgICAgIDogaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMuYm9vbGVhblZhbHVlKCkpOwotCi0gICAgICAgIExpc3Q8VHlwZURlZmluaXRpb24+IHRhcmdldExpc3QgPSBuZXcgQXJyYXlMaXN0PFR5cGVEZWZpbml0aW9uPigpOwotICAgICAgICBmb3IgKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYgOiBhbGxUeXBlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKCh0eXBlSWQgPT0gbnVsbCAmJiB0eXBlRGVmLmdldFBhcmVudFR5cGVJZCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHx8ICh0eXBlSWQgIT0gbnVsbCAmJiB0eXBlSWQuZXF1YWxzKHR5cGVEZWYuZ2V0UGFyZW50VHlwZUlkKCkpKSkgewotICAgICAgICAgICAgICAgIHRhcmdldExpc3QuYWRkKGNvcHkodHlwZURlZiwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnNCb29sLCBjbWlzVmVyc2lvbikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0YXJnZXRMaXN0LCBuZXcgQ29tcGFyYXRvcjxUeXBlRGVmaW5pdGlvbj4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoVHlwZURlZmluaXRpb24gdGQxLCBUeXBlRGVmaW5pdGlvbiB0ZDIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGlkMSA9IHRkMS5nZXRQYXJlbnRUeXBlSWQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGlkMiA9IHRkMi5nZXRQYXJlbnRUeXBlSWQoKTsKLSAgICAgICAgICAgICAgICBpZiAocGlkMSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaWQyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZDEuZ2V0SWQoKS5jb21wYXJlVG8odGQyLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpZDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IHBpZDEuY29tcGFyZVRvKHBpZDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZDEuZ2V0SWQoKS5jb21wYXJlVG8odGQyLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmVzdWx0LnNldExpc3QodGFyZ2V0TGlzdC5zdWJMaXN0KHNraXBDb3VudEludCwgTWF0aC5taW4oc2tpcENvdW50SW50ICsgbWF4SXRlbXNJbnQsIHRhcmdldExpc3Quc2l6ZSgpKSkpOwotICAgICAgICByZXN1bHQuc2V0TnVtSXRlbXMoQmlnSW50ZWdlci52YWx1ZU9mKHRhcmdldExpc3Quc2l6ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRIYXNNb3JlSXRlbXModGFyZ2V0TGlzdC5zaXplKCkgPiBza2lwQ291bnRJbnQgKyBtYXhJdGVtc0ludCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgdHlwZSBkZWZpbml0aW9uIGNvbnRhaW5lci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZURlZgotICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgZGVmaW5pdGlvbiwgbm90IHtAY29kZSBudWxsfQotICAgICAqIEBwYXJhbSBjaGlsZHJlbgotICAgICAqICAgICAgICAgICAgdGhlIGNoaWxkIHR5cGUgZGVmaW5pdGlvbnMsIG1heSBiZSB7QGNvZGUgbnVsbH0KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lciBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25Db250YWluZXIgY3JlYXRlVHlwZURlZmluaXRpb25Db250YWluZXIoVHlwZURlZmluaXRpb24gdHlwZURlZiwKLSAgICAgICAgICAgIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGNoaWxkcmVuKSB7Ci0gICAgICAgIGlmICh0eXBlRGVmID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR5cGUgZGVmaW5pdGlvbiBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uQ29udGFpbmVySW1wbCByZXN1bHQgPSBuZXcgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsKHR5cGVEZWYpOwotICAgICAgICByZXN1bHQuc2V0Q2hpbGRyZW4oY2hpbGRyZW4pOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxpc3Qgb2Yge0BsaW5rIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyfSBmb3IKLSAgICAgKiB7QGxpbmsgUmVwb3NpdG9yeVNlcnZpY2UjZ2V0VHlwZURlc2NlbmRhbnRzKFN0cmluZywgU3RyaW5nLCBCaWdJbnRlZ2VyLCBCb29sZWFuLCBFeHRlbnNpb25zRGF0YSl9Ci0gICAgICogLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBjcmVhdGVUeXBlRGVzY2VuZGFudHMoTWFwPFN0cmluZywgVHlwZURlZmluaXRpb24+IGFsbFR5cGVzLCBTdHJpbmcgdHlwZUlkLAotICAgICAgICAgICAgQmlnSW50ZWdlciBkZXB0aCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucykgewotICAgICAgICByZXR1cm4gY3JlYXRlVHlwZURlc2NlbmRhbnRzKGFsbFR5cGVzLCB0eXBlSWQsIGRlcHRoLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxpc3Qgb2Yge0BsaW5rIFR5cGVEZWZpbml0aW9uQ29udGFpbmVyfSBmb3IKLSAgICAgKiB7QGxpbmsgUmVwb3NpdG9yeVNlcnZpY2UjZ2V0VHlwZURlc2NlbmRhbnRzKFN0cmluZywgU3RyaW5nLCBCaWdJbnRlZ2VyLCBCb29sZWFuLCBFeHRlbnNpb25zRGF0YSl9Ci0gICAgICogLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBjcmVhdGVUeXBlRGVzY2VuZGFudHMoTWFwPFN0cmluZywgVHlwZURlZmluaXRpb24+IGFsbFR5cGVzLCBTdHJpbmcgdHlwZUlkLAotICAgICAgICAgICAgQmlnSW50ZWdlciBkZXB0aCwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgaWYgKGFsbFR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlR5cGVzIG1hcCBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkZXB0aEludCA9IChkZXB0aCA9PSBudWxsID8gLTEgOiBkZXB0aC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKGRlcHRoSW50ID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRlcHRoIG11c3Qgbm90IGJlIDAhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXB0aEludCA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGVJZCAhPSBudWxsICYmICFhbGxUeXBlcy5jb250YWluc0tleSh0eXBlSWQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uKCJUeXBlICciICsgdHlwZUlkICsgIicgZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWxsVHlwZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBlbXB0eUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnNCb29sID0gKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID09IG51bGwgPyBmYWxzZQotICAgICAgICAgICAgICAgIDogaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMuYm9vbGVhblZhbHVlKCkpOwotCi0gICAgICAgIC8vIGdhdGhlciBwYXJlbnQgaWRzCi0gICAgICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiB0eXBlRGVmQ2hpbGRyZW4gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOwotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZURlZiA6IGFsbFR5cGVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBjaGlsZHJlbiA9IHR5cGVEZWZDaGlsZHJlbi5nZXQodHlwZURlZi5nZXRQYXJlbnRUeXBlSWQoKSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIHR5cGVEZWZDaGlsZHJlbi5wdXQodHlwZURlZi5nZXRQYXJlbnRUeXBlSWQoKSwgY2hpbGRyZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHR5cGVEZWYuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXQ8U3RyaW5nPiBjaGlsZHJlbiA9IHR5cGVEZWZDaGlsZHJlbi5nZXQodHlwZUlkKTsKLSAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48VHlwZURlZmluaXRpb25Db250YWluZXI+IGVtcHR5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYnVpbGQgY29udGFpbmVyIHRyZWUKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgcmVzdWx0LmFkZChjcmVhdGVUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcihhbGxUeXBlcywgdHlwZURlZkNoaWxkcmVuLCBjaGlsZCwgZGVwdGhJbnQgLSAxLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9uc0Jvb2wsIGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgVHlwZURlZmluaXRpb25Db250YWluZXIgY3JlYXRlVHlwZURlZmluaXRpb25Db250YWluZXIoTWFwPFN0cmluZywgVHlwZURlZmluaXRpb24+IGFsbFR5cGVzLAotICAgICAgICAgICAgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IHR5cGVEZWZDaGlsZHJlbiwgU3RyaW5nIHR5cGVJZCwgaW50IGRlcHRoLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25Db250YWluZXJJbXBsIHJlc3VsdCA9IG5ldyBUeXBlRGVmaW5pdGlvbkNvbnRhaW5lckltcGwoKTsKLSAgICAgICAgcmVzdWx0LnNldFR5cGVEZWZpbml0aW9uKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID8gY29weShhbGxUeXBlcy5nZXQodHlwZUlkKSwgdHJ1ZSwgY21pc1ZlcnNpb24pIDogY29weSgKLSAgICAgICAgICAgICAgICBhbGxUeXBlcy5nZXQodHlwZUlkKSwgZmFsc2UsIGNtaXNWZXJzaW9uKSk7Ci0KLSAgICAgICAgaWYgKGRlcHRoICE9IDApIHsKLSAgICAgICAgICAgIGlmICh0eXBlRGVmQ2hpbGRyZW4uY29udGFpbnNLZXkodHlwZUlkKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNoaWxkIDogdHlwZURlZkNoaWxkcmVuLmdldCh0eXBlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRDaGlsZHJlbigpLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcihhbGxUeXBlcywgdHlwZURlZkNoaWxkcmVuLCBjaGlsZCwgZGVwdGggPCAwID8gLTEgOiBkZXB0aCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgY21pc1ZlcnNpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIC0tLSBjb3B5IG1ldGhvZHMgLS0tCi0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGdpdmVuIHR5cGUgZGVmaW5pdGlvbiBhbmQgcmV0dXJucyBhIG11dGFibGUgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBNdXRhYmxlVHlwZURlZmluaXRpb24gY29weShUeXBlRGVmaW5pdGlvbiBzb3VyY2VUeXBlRGVmaW50aW9uLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKSB7Ci0gICAgICAgIHJldHVybiBjb3B5KHNvdXJjZVR5cGVEZWZpbnRpb24sIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGdpdmVuIHR5cGUgZGVmaW5pdGlvbiBhbmQgcmV0dXJucyBhIG11dGFibGUgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBNdXRhYmxlVHlwZURlZmluaXRpb24gY29weShUeXBlRGVmaW5pdGlvbiBzb3VyY2VUeXBlRGVmaW50aW9uLCBib29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24pIHsKLSAgICAgICAgaWYgKHNvdXJjZVR5cGVEZWZpbnRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIHR5cGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlVHlwZURlZmludGlvbi5nZXRCYXNlVHlwZUlkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIHR5cGUgaGFzIG5vIGJhc2UgdHlwZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE11dGFibGVUeXBlRGVmaW5pdGlvbiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAoc291cmNlVHlwZURlZmludGlvbi5nZXRCYXNlVHlwZUlkKCkpIHsKLSAgICAgICAgY2FzZSBDTUlTX0RPQ1VNRU5UOgotICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbk9iamVjdCgpOwotICAgICAgICAgICAgKChNdXRhYmxlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgcmVzdWx0KS5zZXRJc1ZlcnNpb25hYmxlKCgoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgc291cmNlVHlwZURlZmludGlvbikKLSAgICAgICAgICAgICAgICAgICAgLmlzVmVyc2lvbmFibGUoKSk7Ci0gICAgICAgICAgICAoKE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50U3RyZWFtQWxsb3dlZCgoKERvY3VtZW50VHlwZURlZmluaXRpb24pIHNvdXJjZVR5cGVEZWZpbnRpb24pLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ01JU19GT0xERVI6Ci0gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVGb2xkZXJUeXBlRGVmaW5pdGlvbk9iamVjdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ01JU19QT0xJQ1k6Ci0gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVQb2xpY3lUeXBlRGVmaW5pdGlvbk9iamVjdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ01JU19SRUxBVElPTlNISVA6Ci0gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbk9iamVjdCgpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNvdXJjZVR5cGVJZHMgPSAoKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSBzb3VyY2VUeXBlRGVmaW50aW9uKS5nZXRBbGxvd2VkU291cmNlVHlwZUlkcygpOwotICAgICAgICAgICAgaWYgKHNvdXJjZVR5cGVJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICgoTXV0YWJsZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QWxsb3dlZFNvdXJjZVR5cGVzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzb3VyY2VUeXBlSWRzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gdGFyZ2V0VHlwZUlkcyA9ICgoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHNvdXJjZVR5cGVEZWZpbnRpb24pLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0VHlwZUlkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgKChNdXRhYmxlUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24pIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbGxvd2VkVGFyZ2V0VHlwZXMobmV3IEFycmF5TGlzdDxTdHJpbmc+KHRhcmdldFR5cGVJZHMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENNSVNfSVRFTToKLSAgICAgICAgICAgIGlmIChjbWlzVmVyc2lvbiA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNNSVMgMS4wIGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIHR5cGVzISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlSXRlbVR5cGVEZWZpbml0aW9uT2JqZWN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTUlTX1NFQ09OREFSWToKLSAgICAgICAgICAgIGlmIChjbWlzVmVyc2lvbiA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNNSVMgMS4wIGRvZXNuJ3Qgc3VwcG9ydCBzZWNvbmRhcnkgdHlwZXMhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVTZWNvbmRhcnlUeXBlRGVmaW5pdGlvbk9iamVjdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBiYXNlIHR5cGUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuc2V0SWQoc291cmNlVHlwZURlZmludGlvbi5nZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShzb3VyY2VUeXBlRGVmaW50aW9uLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZXNwYWNlKHNvdXJjZVR5cGVEZWZpbnRpb24uZ2V0TG9jYWxOYW1lc3BhY2UoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXREaXNwbGF5TmFtZShzb3VyY2VUeXBlRGVmaW50aW9uLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0UXVlcnlOYW1lKHNvdXJjZVR5cGVEZWZpbnRpb24uZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24oc291cmNlVHlwZURlZmludGlvbi5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgcmVzdWx0LnNldEJhc2VUeXBlSWQoc291cmNlVHlwZURlZmludGlvbi5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICByZXN1bHQuc2V0UGFyZW50VHlwZUlkKHNvdXJjZVR5cGVEZWZpbnRpb24uZ2V0UGFyZW50VHlwZUlkKCkpOwotICAgICAgICByZXN1bHQuc2V0SXNDcmVhdGFibGUoc291cmNlVHlwZURlZmludGlvbi5pc0NyZWF0YWJsZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzRmlsZWFibGUoc291cmNlVHlwZURlZmludGlvbi5pc0ZpbGVhYmxlKCkpOwotICAgICAgICByZXN1bHQuc2V0SXNRdWVyeWFibGUoc291cmNlVHlwZURlZmludGlvbi5pc1F1ZXJ5YWJsZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzRnVsbHRleHRJbmRleGVkKHNvdXJjZVR5cGVEZWZpbnRpb24uaXNGdWxsdGV4dEluZGV4ZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeShzb3VyY2VUeXBlRGVmaW50aW9uLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCkpOwotICAgICAgICByZXN1bHQuc2V0SXNDb250cm9sbGFibGVQb2xpY3koc291cmNlVHlwZURlZmludGlvbi5pc0NvbnRyb2xsYWJsZVBvbGljeSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzQ29udHJvbGxhYmxlQWNsKHNvdXJjZVR5cGVEZWZpbnRpb24uaXNDb250cm9sbGFibGVBY2woKSk7Ci0KLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlVHlwZURlZmludGlvbi5nZXRUeXBlTXV0YWJpbGl0eSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0VHlwZU11dGFiaWxpdHkoY3JlYXRlVHlwZU11dGFiaWxpdHkoc291cmNlVHlwZURlZmludGlvbi5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhbkNyZWF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVHlwZURlZmludGlvbi5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhblVwZGF0ZSgpLCBzb3VyY2VUeXBlRGVmaW50aW9uLmdldFR5cGVNdXRhYmlsaXR5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbkRlbGV0ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb3B5RXh0ZW5zaW9ucyhzb3VyY2VUeXBlRGVmaW50aW9uLCByZXN1bHQpOwotCi0gICAgICAgIGlmIChpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucykgewotICAgICAgICAgICAgY29weVByb3BlcnR5RGVmaW5pdGlvbnMoc291cmNlVHlwZURlZmludGlvbiwgcmVzdWx0LCBjbWlzVmVyc2lvbiwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGdpdmVuIHByb3BlcnR5IGRlZmluaXRpb24gYW5kIHJldHVybnMgYSBtdXRhYmxlIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXV0YWJsZVByb3BlcnR5RGVmaW5pdGlvbjw/PiBjb3B5KFByb3BlcnR5RGVmaW5pdGlvbjw/PiBzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24pIHsKLSAgICAgICAgaWYgKHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgZGVmaW5pdGlvbiBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24uZ2V0UHJvcGVydHlUeXBlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIGRlZmluaXRpb24gcHJvcGVydHkgdHlwZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE11dGFibGVQcm9wZXJ0eURlZmluaXRpb248Pz4gcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBzd2l0Y2ggKHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbi5nZXRQcm9wZXJ0eVR5cGUoKSkgewotICAgICAgICBjYXNlIEJPT0xFQU46Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRWYWx1ZShjb3B5RGVmYXVsdFZhbHVlKChQcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uKSBzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24pKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlCb29sZWFuRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldENob2ljZXMoY29weUNob2ljZXMoKFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlEYXRlVGltZURlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0RGF0ZVRpbWVSZXNvbHV0aW9uKCgoUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGF0ZVRpbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRWYWx1ZShjb3B5RGVmYXVsdFZhbHVlKChQcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbikgc291cmNlUHJvcGVydHlEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0Q2hvaWNlcyhjb3B5Q2hvaWNlcygoUHJvcGVydHlEYXRlVGltZURlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRNaW5WYWx1ZSgoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1pblZhbHVlKCkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRNYXhWYWx1ZSgoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1heFZhbHVlKCkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0UHJlY2lzaW9uKCgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgc291cmNlUHJvcGVydHlEZWZpbml0aW9uKS5nZXRQcmVjaXNpb24oKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREZWZhdWx0VmFsdWUoY29weURlZmF1bHRWYWx1ZSgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgc291cmNlUHJvcGVydHlEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaG9pY2VzKGNvcHlDaG9pY2VzKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uKSBzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlIdG1sRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRWYWx1ZShjb3B5RGVmYXVsdFZhbHVlKChQcm9wZXJ0eUh0bWxEZWZpbml0aW9uKSBzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24pKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElEOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRWYWx1ZShjb3B5RGVmYXVsdFZhbHVlKChQcm9wZXJ0eUlkRGVmaW5pdGlvbikgc291cmNlUHJvcGVydHlEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5SWREZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0Q2hvaWNlcyhjb3B5Q2hvaWNlcygoUHJvcGVydHlJZERlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5URUdFUjoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRNaW5WYWx1ZSgoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1pblZhbHVlKCkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcmVzdWx0KS5zZXRNYXhWYWx1ZSgoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1heFZhbHVlKCkpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdFZhbHVlKGNvcHlEZWZhdWx0VmFsdWUoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikpOwotICAgICAgICAgICAgKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0Q2hvaWNlcyhjb3B5Q2hvaWNlcygoUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbikgc291cmNlUHJvcGVydHlEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKSByZXN1bHQpLnNldE1heExlbmd0aCgoKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1heExlbmd0aCgpKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERlZmF1bHRWYWx1ZShjb3B5RGVmYXVsdFZhbHVlKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikpOwotICAgICAgICAgICAgKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb25JbXBsKSByZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRDaG9pY2VzKGNvcHlDaG9pY2VzKChQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgICgoUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbCkgcmVzdWx0KQotICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdFZhbHVlKGNvcHlEZWZhdWx0VmFsdWUoKFByb3BlcnR5VXJpRGVmaW5pdGlvbikgc291cmNlUHJvcGVydHlEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICAoKFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwpIHJlc3VsdCkKLSAgICAgICAgICAgICAgICAgICAgLnNldENob2ljZXMoY29weUNob2ljZXMoKFByb3BlcnR5VXJpRGVmaW5pdGlvbikgc291cmNlUHJvcGVydHlEZWZpbml0aW9uKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIGRhdGF0eXBlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldElkKHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbi5nZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZShzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24uZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lc3BhY2Uoc291cmNlUHJvcGVydHlEZWZpbml0aW9uLmdldExvY2FsTmFtZXNwYWNlKCkpOwotICAgICAgICByZXN1bHQuc2V0RGlzcGxheU5hbWUoc291cmNlUHJvcGVydHlEZWZpbml0aW9uLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICByZXN1bHQuc2V0RGVzY3JpcHRpb24oc291cmNlUHJvcGVydHlEZWZpbml0aW9uLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXN1bHQuc2V0UHJvcGVydHlUeXBlKHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbi5nZXRQcm9wZXJ0eVR5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRDYXJkaW5hbGl0eShzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24uZ2V0Q2FyZGluYWxpdHkoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRVcGRhdGFiaWxpdHkoc291cmNlUHJvcGVydHlEZWZpbml0aW9uLmdldFVwZGF0YWJpbGl0eSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzSW5oZXJpdGVkKHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbi5pc0luaGVyaXRlZCgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzUmVxdWlyZWQoc291cmNlUHJvcGVydHlEZWZpbml0aW9uLmlzUmVxdWlyZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1F1ZXJ5YWJsZShzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24uaXNRdWVyeWFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc09yZGVyYWJsZShzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24uaXNPcmRlcmFibGUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRRdWVyeU5hbWUoc291cmNlUHJvcGVydHlEZWZpbml0aW9uLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldElzT3BlbkNob2ljZShzb3VyY2VQcm9wZXJ0eURlZmluaXRpb24uaXNPcGVuQ2hvaWNlKCkpOwotCi0gICAgICAgIGNvcHlFeHRlbnNpb25zKHNvdXJjZVByb3BlcnR5RGVmaW5pdGlvbiwgcmVzdWx0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIC0tLSBpbnRlcm5hbCBtZXRob2RzIC0tLQotCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBwcm9wZXJ0eSBkZWZpbml0aW9ucyBmcm9tIGEgc291cmNlIHR5cGUgdG8gYSB0YXJnZXQgdHlwZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5UHJvcGVydHlEZWZpbml0aW9ucyhUeXBlRGVmaW5pdGlvbiBzb3VyY2UsIE11dGFibGVUeXBlRGVmaW5pdGlvbiB0YXJnZXQsCi0gICAgICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwgYm9vbGVhbiBtYXJrQXNJbmhlcml0ZWQpIHsKLSAgICAgICAgYXNzZXJ0IHNvdXJjZSAhPSBudWxsOwotICAgICAgICBhc3NlcnQgdGFyZ2V0ICE9IG51bGw7Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA6IHNvdXJjZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY21pc1ZlcnNpb24gPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE5FV19DTUlTMTFfUFJPUEVSVElFUy5jb250YWlucyhwcm9wRGVmLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE11dGFibGVQcm9wZXJ0eURlZmluaXRpb248Pz4gbmV3UHJvcERlZiA9IGNvcHkocHJvcERlZik7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcmtBc0luaGVyaXRlZCkgewotICAgICAgICAgICAgICAgICAgICBuZXdQcm9wRGVmLnNldElzSW5oZXJpdGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXJnZXQuYWRkUHJvcGVydHlEZWZpbml0aW9uKG5ld1Byb3BEZWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvcHkgb2YgYSBkZWZhdWx0IHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCA8VD4gTGlzdDxUPiBjb3B5RGVmYXVsdFZhbHVlKFByb3BlcnR5RGVmaW5pdGlvbjxUPiBzb3VyY2UpIHsKLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFQ+KHNvdXJjZS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvcHkgb2YgYSBjaG9pY2UgdHJlZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgPFQ+IExpc3Q8Q2hvaWNlPFQ+PiBjb3B5Q2hvaWNlcyhQcm9wZXJ0eURlZmluaXRpb248VD4gc291cmNlKSB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UuZ2V0Q2hvaWNlcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxDaG9pY2U8VD4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Q2hvaWNlPFQ+PigpOwotCi0gICAgICAgIGZvciAoQ2hvaWNlPFQ+IGMgOiBzb3VyY2UuZ2V0Q2hvaWNlcygpKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKGNvcHlDaG9pY2UoYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIDxUPiBDaG9pY2U8VD4gY29weUNob2ljZShDaG9pY2U8VD4gc291cmNlKSB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBDaG9pY2VJbXBsPFQ+IHJlc3VsdCA9IG5ldyBDaG9pY2VJbXBsPFQ+KCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldERpc3BsYXlOYW1lKHNvdXJjZS5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgaWYgKHNvdXJjZS5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRWYWx1ZShuZXcgQXJyYXlMaXN0PFQ+KHNvdXJjZS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRDaG9pY2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PENob2ljZTxUPj4gY2hvaWNlcyA9IG5ldyBBcnJheUxpc3Q8Q2hvaWNlPFQ+PigpOwotICAgICAgICAgICAgZm9yIChDaG9pY2U8VD4gYyA6IHNvdXJjZS5nZXRDaG9pY2UoKSkgewotICAgICAgICAgICAgICAgIGNob2ljZXMuYWRkKGNvcHlDaG9pY2UoYykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LnNldENob2ljZShjaG9pY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZXMgYSBkZWVwIGNvcHkgb2YgZXh0ZW5zaW9uIG9mIGEgc291cmNlIG9iamVjdCBhbmQgYWRkcyB0aGVtIHRvIGEKLSAgICAgKiB0YXJnZXQgb2JqZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlFeHRlbnNpb25zKEV4dGVuc2lvbnNEYXRhIHNvdXJjZSwgRXh0ZW5zaW9uc0RhdGEgdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5nZXRFeHRlbnNpb25zKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0LnNldEV4dGVuc2lvbnMobnVsbCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0gICAgICAgIGZvciAoQ21pc0V4dGVuc2lvbkVsZW1lbnQgZWxlbWVudCA6IHNvdXJjZS5nZXRFeHRlbnNpb25zKCkpIHsKLSAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChjb3B5KGVsZW1lbnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRhcmdldC5zZXRFeHRlbnNpb25zKGVsZW1lbnRMaXN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlcyBhIGRlZXAgY29weSBvZiBhbiBleHRlbnNpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIENtaXNFeHRlbnNpb25FbGVtZW50IGNvcHkoQ21pc0V4dGVuc2lvbkVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cnMgPSAoZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCA/IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigKLSAgICAgICAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSkgOiBudWxsKTsKLQotICAgICAgICBpZiAoZWxlbWVudC5nZXRDaGlsZHJlbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnQuZ2V0TmFtZSgpLCBhdHRycywgZWxlbWVudC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4oKTsKLQotICAgICAgICAgICAgZm9yIChDbWlzRXh0ZW5zaW9uRWxlbWVudCBjaGlsZCA6IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChjb3B5KGNoaWxkKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKGVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnQuZ2V0TmFtZSgpLCBhdHRycywgY2hpbGRyZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgYmFzZSBwcm9wZXJ0eSBkZWZpbml0aW9ucyB0byBhIHR5cGUgZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRCYXNlUHJvcGVydHlEZWZpbml0aW9ucyhNdXRhYmxlVHlwZURlZmluaXRpb24gdHlwZSwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sIGJvb2xlYW4gaW5oZXJpdGVkKSB7Ci0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5OQU1FLCAiTmFtZSIsICJOYW1lIiwgUHJvcGVydHlUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUsIGluaGVyaXRlZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSkpOwotCi0gICAgICAgIGlmIChjbWlzVmVyc2lvbiAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLkRFU0NSSVBUSU9OLCAiRGVzY3JpcHRpb24iLCAiRGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUsIGluaGVyaXRlZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLk9CSkVDVF9JRCwgIk9iamVjdCBJZCIsICJPYmplY3QgSWQiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5JRCwgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGluaGVyaXRlZCwgZmFsc2UsIHRydWUsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRCwgIkJhc2UgVHlwZSBJZCIsICJCYXNlIFR5cGUgSWQiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5JRCwgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGluaGVyaXRlZCwgZmFsc2UsIHRydWUsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCAiT2JqZWN0IFR5cGUgSWQiLAotICAgICAgICAgICAgICAgICJPYmplY3QgVHlwZSBJZCIsIFByb3BlcnR5VHlwZS5JRCwgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuT05DUkVBVEUsIGluaGVyaXRlZCwgdHJ1ZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICBmYWxzZSkpOwotCi0gICAgICAgIGlmIChjbWlzVmVyc2lvbiAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsCi0gICAgICAgICAgICAgICAgICAgICJTZWNvbmRhcnkgVHlwZSBJZHMiLCAiU2Vjb25kYXJ5IFR5cGUgSWRzIiwgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5NVUxUSSwKLSAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNSRUFURURfQlksICJDcmVhdGVkIEJ5IiwgIkNyZWF0ZWQgQnkiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLCB0cnVlLCB0cnVlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUsICJDcmVhdGlvbiBEYXRlIiwKLSAgICAgICAgICAgICAgICAiQ3JlYXRpb24gRGF0ZSIsIFByb3BlcnR5VHlwZS5EQVRFVElNRSwgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGluaGVyaXRlZCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUVEX0JZLCAiTGFzdCBNb2RpZmllZCBCeSIsCi0gICAgICAgICAgICAgICAgIkxhc3QgTW9kaWZpZWQgQnkiLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICB0cnVlLCB0cnVlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUsCi0gICAgICAgICAgICAgICAgIkxhc3QgTW9kaWZpY2F0aW9uIERhdGUiLCAiTGFzdCBNb2RpZmljYXRpb24gRGF0ZSIsIFByb3BlcnR5VHlwZS5EQVRFVElNRSwgQ2FyZGluYWxpdHkuU0lOR0xFLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4sICJDaGFuZ2UgVG9rZW4iLCAiQ2hhbmdlIFRva2VuIiwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkRG9jdW1lbnRQcm9wZXJ0eURlZmluaXRpb25zKE11dGFibGVEb2N1bWVudFR5cGVEZWZpbml0aW9uIHR5cGUsIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uLAotICAgICAgICAgICAgYm9vbGVhbiBpbmhlcml0ZWQpIHsKLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX0lNTVVUQUJMRSwgIklzIEltbXV0YWJsZSIsICJJcyBJbW11dGFibGUiLAotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5CT09MRUFOLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OLCAiSXMgTGF0ZXN0IFZlcnNpb24iLAotICAgICAgICAgICAgICAgICJJcyBMYXRlc3QgVmVyc2lvbiIsIFByb3BlcnR5VHlwZS5CT09MRUFOLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuSVNfTUFKT1JfVkVSU0lPTiwgIklzIE1ham9yIFZlcnNpb24iLAotICAgICAgICAgICAgICAgICJJcyBNYWpvciBWZXJzaW9uIiwgUHJvcGVydHlUeXBlLkJPT0xFQU4sIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAiSXMgTGF0ZXN0IE1ham9yIFZlcnNpb24iLCAiSXMgTGF0ZXN0IE1ham9yIFZlcnNpb24iLCBQcm9wZXJ0eVR5cGUuQk9PTEVBTiwgQ2FyZGluYWxpdHkuU0lOR0xFLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgaWYgKGNtaXNWZXJzaW9uICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuSVNfUFJJVkFURV9XT1JLSU5HX0NPUFksCi0gICAgICAgICAgICAgICAgICAgICJJcyBQcml2YXRlIFdvcmtpbmcgQ29weSIsICJJcyBQcml2YXRlIFdvcmtpbmcgQ29weSIsIFByb3BlcnR5VHlwZS5CT09MRUFOLCBDYXJkaW5hbGl0eS5TSU5HTEUsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCAiVmVyc2lvbiBMYWJlbCIsCi0gICAgICAgICAgICAgICAgIlZlcnNpb24gTGFiZWwiLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCwgIlZlcnNpb24gU2VyaWVzIElkIiwKLSAgICAgICAgICAgICAgICAiVmVyc2lvbiBTZXJpZXMgSWQiLCBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLAotICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLklTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VULAotICAgICAgICAgICAgICAgICJJcyBWZXJpc29uIFNlcmllcyBDaGVja2VkIE91dCIsICJJcyBWZXJpc29uIFNlcmllcyBDaGVja2VkIE91dCIsIFByb3BlcnR5VHlwZS5CT09MRUFOLAotICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLCB0cnVlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVF9CWSwKLSAgICAgICAgICAgICAgICAiVmVyc2lvbiBTZXJpZXMgQ2hlY2tlZCBPdXQgQnkiLCAiVmVyc2lvbiBTZXJpZXMgQ2hlY2tlZCBPdXQgQnkiLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLAotICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsCi0gICAgICAgICAgICAgICAgIlZlcnNpb24gU2VyaWVzIENoZWNrZWQgT3V0IElkIiwgIlZlcnNpb24gU2VyaWVzIENoZWNrZWQgT3V0IElkIiwgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5TSU5HTEUsCi0gICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5ULCAiQ2hlY2tpbiBDb21tZW50IiwKLSAgICAgICAgICAgICAgICAiQ2hlY2tpbiBDb21tZW50IiwgUHJvcGVydHlUeXBlLlNUUklORywgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGluaGVyaXRlZCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwgIkNvbnRlbnQgU3RyZWFtIExlbmd0aCIsCi0gICAgICAgICAgICAgICAgIkNvbnRlbnQgU3RyZWFtIExlbmd0aCIsIFByb3BlcnR5VHlwZS5JTlRFR0VSLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFLCAiTUlNRSBUeXBlIiwKLSAgICAgICAgICAgICAgICAiTUlNRSBUeXBlIiwgUHJvcGVydHlUeXBlLlNUUklORywgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGluaGVyaXRlZCwgZmFsc2UsIGZhbHNlLAotICAgICAgICAgICAgICAgIGZhbHNlKSk7Ci0KLSAgICAgICAgdHlwZS5hZGRQcm9wZXJ0eURlZmluaXRpb24oY3JlYXRlUHJvcGVydHlEZWZpbml0aW9uKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0ZJTEVfTkFNRSwgIkZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICAiRmlsZW5hbWUiLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fSUQsICJDb250ZW50IFN0cmVhbSBJZCIsCi0gICAgICAgICAgICAgICAgIkNvbnRlbnQgU3RyZWFtIElkIiwgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRGb2xkZXJQcm9wZXJ0eURlZmluaXRpb25zKE11dGFibGVGb2xkZXJUeXBlRGVmaW5pdGlvbiB0eXBlLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwKLSAgICAgICAgICAgIGJvb2xlYW4gaW5oZXJpdGVkKSB7Ci0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5QQVJFTlRfSUQsICJQYXJlbnQgSWQiLCAiUGFyZW50IElkIiwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBpbmhlcml0ZWQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuUEFUSCwgIlBhdGgiLCAiUGF0aCIsIFByb3BlcnR5VHlwZS5TVFJJTkcsCi0gICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIGluaGVyaXRlZCwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5BTExPV0VEX0NISUxEX09CSkVDVF9UWVBFX0lEUywKLSAgICAgICAgICAgICAgICAiQWxsb3dlZCBDaGlsZCBPYmplY3QgVHlwZSBJZHMiLCAiQWxsb3dlZCBDaGlsZCBPYmplY3QgVHlwZSBJZHMiLCBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5Lk1VTFRJLAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgaW5oZXJpdGVkLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUG9saWN5UHJvcGVydHlEZWZpbml0aW9ucyhNdXRhYmxlUG9saWN5VHlwZURlZmluaXRpb24gdHlwZSwgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24sCi0gICAgICAgICAgICBib29sZWFuIGluaGVyaXRlZCkgewotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQsICJQb2xpY3kgVGV4dCIsICJQb2xpY3kgVGV4dCIsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLlNUUklORywgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFLCBpbmhlcml0ZWQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRSZWxhdGlvbnNoaXBQcm9wZXJ0eURlZmluaXRpb25zKE11dGFibGVSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiB0eXBlLCBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiwKLSAgICAgICAgICAgIGJvb2xlYW4gaW5oZXJpdGVkKSB7Ci0gICAgICAgIHR5cGUuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQsICJTb3VyY2UgSWQiLCAiU291cmNlIElkIiwKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURXUklURSwgaW5oZXJpdGVkLCB0cnVlLCBmYWxzZSwgZmFsc2UpKTsKLQotICAgICAgICB0eXBlLmFkZFByb3BlcnR5RGVmaW5pdGlvbihjcmVhdGVQcm9wZXJ0eURlZmluaXRpb24oUHJvcGVydHlJZHMuVEFSR0VUX0lELCAiVGFyZ2V0IElkIiwgIlRhcmdldCBJZCIsCi0gICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUsIGluaGVyaXRlZCwgdHJ1ZSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9UeXBlTWFuYWdlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9UeXBlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODJiNjQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvVHlwZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLQotcHVibGljIGludGVyZmFjZSBUeXBlTWFuYWdlciB7Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gYSB0eXBlIGRlZmluaXRpb24gZnJvbSB0aGUgdHlwZSBkZWZpbml0aW9uIGlkCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVJZAotICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHR5cGUgZGVmaW5pdGlvbgotICAgICAqIEByZXR1cm4gdHlwZSBkZWZpbml0aW9uIGZvciB0aGlzIGlkCi0gICAgICovCi0gICAgVHlwZURlZmluaXRpb25Db250YWluZXIgZ2V0VHlwZUJ5SWQoU3RyaW5nIHR5cGVJZCk7Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gYSB0eXBlIGRlZmluaXRpb24gZnJvbSB0aGUgdHlwZSBxdWVyeSBuYW1lIG9yIG51bGwgaWYgbm90IGZvdW5kCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVRdWVyeU5hbWUKLSAgICAgKiAgICAgICAgICAgIHF1ZXJ5IG5hbWUgb2YgdGhlIHR5cGUgZGVmaW5pdGlvbgotICAgICAqIEByZXR1cm4gdHlwZSBkZWZpbml0aW9uIGZvciB0aGlzIHF1ZXJ5IG5hbWUKLSAgICAgKi8KLSAgICBUeXBlRGVmaW5pdGlvbiBnZXRUeXBlQnlRdWVyeU5hbWUoU3RyaW5nIHR5cGVRdWVyeU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIGEgbGlzdCBvZiBhbGwgdHlwZXMga25vd24gaW4gdGhpcyByZXBvc2l0b3J5Ci0gICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHF1ZXJ5IHBhcnNlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgICBsaXN0IG9mIHR5cGUgZGVmaW5pdGlvbnMKLSAgICAgKi8KLSAgICBDb2xsZWN0aW9uPFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVmaW5pdGlvbkxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIHJldHVybiBhIGxpc3Qgb2YgdGhlIHJvb3QgdHlwZXMgYXMgZGVmaW5lZCBpbiB0aGUgQ01JUyBzcGVjIChmb3IKLSAgICAgKiBkb2N1bWVudCwgZm9sZGVyLCBwb2xpY3kgYW5kIHJlbGF0aW9uc2hpcAotICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBxdWVyeSBwYXJzZXIuCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqICAgICAgbGlzdCBvZiB0eXBlIGRlZmluaXRpb25zCi0gICAgICovCi0gICAgTGlzdDxUeXBlRGVmaW5pdGlvbkNvbnRhaW5lcj4gZ2V0Um9vdFR5cGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiByZXRyaWV2ZSB0aGUgcHJvcGVydHkgaWQgZnJvbSBhIHR5cGUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgcXVlcnkgbmFtZSAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZURlZmluaXRpb24KLSAgICAgKiAgICAgIHR5cGUgZGVmaW5pdGlvbiBjb250YWluaW5nIHF1ZXJ5IG5hbWUKLSAgICAgKiBAcGFyYW0gcHJvcFF1ZXJ5TmFtZQotICAgICAqICAgICAgcXVlcnkgbmFtZSBvZiBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgIHByb3BlcnR5IGlkIG9mIHByb3BlcnR5IG9yIG51bGwgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgU3RyaW5nIGdldFByb3BlcnR5SWRGb3JRdWVyeU5hbWUoVHlwZURlZmluaXRpb24gdHlwZURlZmluaXRpb24sIFN0cmluZyBwcm9wUXVlcnlOYW1lKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIHR5cGUgdG8gdGhlIHR5cGUgc3lzdGVtLiBBZGQgYWxsIHByb3BlcnRpZXMgZnJvbSBpbmhlcml0ZWQgdHlwZXMsCi0gICAgICogYWRkIHR5cGUgdG8gY2hpbGRyZW4gb2YgcGFyZW50IHR5cGVzLgotICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBxdWVyeSBwYXJzZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHR5cGVEZWZpbml0aW9uCi0gICAgICogICAgICAgICAgICBuZXcgdHlwZSB0byBhZGQKLSAgICAgKiBAcGFyYW0gYWRkSW5oZXJpdGVkUHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgYWRkIHByb3BlcnRpZXMgZnJvbSBzdXBlcnR5cGUgdG8gdHlwZSBkZWZpbml0aW9uCi0gICAgICovCi0gICAgdm9pZCBhZGRUeXBlRGVmaW5pdGlvbihUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiwgYm9vbGVhbiBhZGRJbmhlcml0ZWRQcm9wZXJ0aWVzKTsKLQotICAgIC8qKgotICAgICAqIE1vZGlmeSBhbiBleGlzdGluZyB0eXBlIGRlZmluaXRpb24uCi0gICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHF1ZXJ5IHBhcnNlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZURlZmluaXRpb24KLSAgICAgKiAgICAgICAgICAgIHR5cGUgdG8gYmUgbW9kaWZpZWQKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHR5cGVEZWZpbml0aW9uKTsKLQotICAgIC8qKgotICAgICAqIERlbGV0ZSBhIHR5cGUgZnJvbSB0aGUgdHlwZSBzeXN0ZW0uIERlbGV0ZSB3aWxsIHN1Y2NlZWQgb25seSBpZiB0eXBlIGlzCi0gICAgICogbm90IGluIHVzZS4gT3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHF1ZXJ5IHBhcnNlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHlwZUlkCi0gICAgICogICAgICAgICAgICBpZCBvZiB0eXBlIHRvIGJlIGRlbGV0ZWQKLSAgICAgKi8KLSAgICB2b2lkIGRlbGV0ZVR5cGVEZWZpbml0aW9uKFN0cmluZyB0eXBlSWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvVHlwZVZhbGlkYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9UeXBlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzQwZDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9UeXBlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db2xsZWN0aW9uc0hlbHBlci4qOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXJkaW5hbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFR5cGVWYWxpZGF0b3IgewotCi0gICAgcHJpdmF0ZSBUeXBlVmFsaWRhdG9yKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZVJlcXVpcmVkU3lzdGVtUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBvYmplY3QsIG5vIHByb3BlcnRpZXMgYXJlIGdpdmVuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lEKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgb2JqZWN0LCB0eXBlIGlkIGlzIG1pc3NpbmciKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYW5kYXRvcnlTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlJZCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHN0YXRpYyA8VD4gUHJvcGVydHlWYWxpZGF0b3I8VD4gY3JlYXRlUHJvcGVydHlWYWxpZGF0b3IoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYpIHsKLSAgICAgICAgUHJvcGVydHlWYWxpZGF0b3I8VD4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKHByb3BEZWYgaW5zdGFuY2VvZiBQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoUHJvcGVydHlWYWxpZGF0b3I8VD4pIG5ldyBQcm9wZXJ0eVZhbGlkYXRvckludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wRGVmIGluc3RhbmNlb2YgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gKFByb3BlcnR5VmFsaWRhdG9yPFQ+KSBuZXcgUHJvcGVydHlWYWxpZGF0b3JEZWNpbWFsKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcERlZiBpbnN0YW5jZW9mIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbikgewotICAgICAgICAgICAgcmVzdWx0ID0gKFByb3BlcnR5VmFsaWRhdG9yPFQ+KSBuZXcgUHJvcGVydHlWYWxpZGF0b3JTdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eVZhbGlkYXRvcjxUPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBwcm9wZXJ0eSB2YWxpZGF0aW9uczogbm90IHJlYWRvbmx5LCBhbGwgcmVxdWlyZWQgYXJlIGdpdmVuLCBhbGwgYXJlIGtub3duCi0gICAgICogaW4gdHlwZSBjYXJkaW5hbGl0eTogbm8gbXVsdGkgdmFsdWVzIGZvciBzaW5nbGUgdmFsdWUsIGRlZiBtaW4gbWF4IGNoZWNrCi0gICAgICogZm9yIEludGVnZXIgYW5kIERlY2ltYWwsIGNob2ljZXMgYW5kIGluIGxpc3QgU3RyaW5ncywgbWF4IGxlbmd0aCBzZXQKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGZvciBvbWl0dGVkIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0b3I8VD4gewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKFByb3BlcnR5RGVmaW5pdGlvbjxUPiBwcm9wRGVmLCBQcm9wZXJ0eURhdGE8VD4gcHJvcCkgewotCi0gICAgICAgICAgICAvLyBjaGVjayBnZW5lcmFsIGNvbnN0cmFpbnRzIGZvciBhbGwgcHJvcGVydHkgdHlwZXMKLSAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldENhcmRpbmFsaXR5KCkgPT0gQ2FyZGluYWxpdHkuU0lOR0xFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3AuZ2V0VmFsdWVzKCkgIT0gbnVsbCAmJiBwcm9wLmdldFZhbHVlcygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJUaGUgcHJvcGVydHkgd2l0aCBpZCAiICsgcHJvcERlZi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIHNpbmdsZSB2YWx1ZWQsIGJ1dCBtdWx0aXBsZSB2YWx1ZXMgYXJlIHBhc3NlZCAiICsgcHJvcC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNOb3RFbXB0eShwcm9wRGVmLmdldENob2ljZXMoKSkpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZUNob2ljZXMocHJvcERlZiwgcHJvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDaG9pY2VzKFByb3BlcnR5RGVmaW5pdGlvbjxUPiBwcm9wRGVmLCBQcm9wZXJ0eURhdGE8VD4gcHJvcCkgewotICAgICAgICAgICAgYm9vbGVhbiBpc0FsbG93ZWRWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICBib29sZWFuIGhhc011bHRpVmFsdWVDaG9pY2VMaXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChDaG9pY2U8Pz4gYWxsb3dlZFZhbHVlIDogcHJvcERlZi5nZXRDaG9pY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFZhbHVlLmdldFZhbHVlKCkgIT0gbnVsbCAmJiBhbGxvd2VkVmFsdWUuZ2V0VmFsdWUoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc011bHRpVmFsdWVDaG9pY2VMaXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcERlZi5pc09wZW5DaG9pY2UoKSAhPSBudWxsICYmIHByb3BEZWYuaXNPcGVuQ2hvaWNlKCkpIHsKLSAgICAgICAgICAgIAlpc0FsbG93ZWRWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc011bHRpVmFsdWVDaG9pY2VMaXN0cykgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHZhbHVlIGlzIGluIGxpc3QKLQotICAgICAgICAgICAgCS8vIGRvIGEgY29tcGxleCBjaGVjayBpZiB0aGlzIGNvbWJpbmF0aW9uIG9mIGFjdHVhbCB2YWx1ZXMgaXMKLSAgICAgICAgICAgICAgICAvLyBhbGxvd2VkIGNoZWNrIGlmIHZhbHVlIGlzIGluIGxpc3QKLSAgICAgICAgICAgICAgICBpc0FsbG93ZWRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIExpc3Q8Pz4gYWN0dWFsVmFsdWVzID0gcHJvcC5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKENob2ljZTw/PiBhbGxvd2VkVmFsdWUgOiBwcm9wRGVmLmdldENob2ljZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFZhbHVlLmdldFZhbHVlKCkuc2l6ZSgpID09IGFjdHVhbFZhbHVlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbGlzdFZhbHVlc0FyZUVxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8+IGl0ID0gYWxsb3dlZFZhbHVlLmdldFZhbHVlKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGFjdHVhbFZhbHVlIDogYWN0dWFsVmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWxWYWx1ZS5lcXVhbHMoaXQubmV4dCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0VmFsdWVzQXJlRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RWYWx1ZXNBcmVFcXVhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxsb3dlZFZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0FsbG93ZWRWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxUPiBhbGxvd2VkVmFsdWVzID0gZ2V0QWxsb3dlZFZhbHVlcyhwcm9wRGVmLmdldENob2ljZXMoKSk7Ci0gICAgICAgICAgICAgICAgLy8gZG8gYSBzaW1wbGVyIGNoZWNrIGlmIGFsbCB2YWx1ZXMgYXJlIGNob2ljZSBlbGVtZW50cwotCi0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYWN0dWFsVmFsdWUgOiBwcm9wLmdldFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYWxsb3dlZFZhbHVlcy5jb250YWlucyhhY3R1YWxWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxsb3dlZFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFpc0FsbG93ZWRWYWx1ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiVGhlIHByb3BlcnR5IHdpdGggaWQgIiArIHByb3BEZWYuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBhIGZpeGVkIHNldCBvZiB2YWx1ZXMuIFZhbHVlKHMpICIgKyBwcm9wLmdldFZhbHVlcygpICsgIiBhcmUgbm90IGxpc3RlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGxpc3Qgb2YgYWxsb3dlZCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgZGVmaW5pdGlvbiBieQotICAgICAgICAgKiByZWN1cnNpdmVseSBjb2xsZWN0aW5nIGFsbCBjaG9pY2UgdmFsdWVzIGZyb20gcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICAgKiAKLSAgICAgICAgICogQHBhcmFtIHByb3BEZWYKLSAgICAgICAgICogICAgICAgICAgICBwcm9wZXJ0eSBkZWZpbml0aW9uCi0gICAgICAgICAqIEByZXR1cm4gbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgaW4gY29tcGxldGUgaGllcmFyY2h5Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIExpc3Q8VD4gZ2V0QWxsb3dlZFZhbHVlcyhMaXN0PENob2ljZTxUPj4gY2hvaWNlcykgewotICAgICAgICAgICAgTGlzdDxUPiBhbGxvd2VkVmFsdWVzID0gbmV3IEFycmF5TGlzdDxUPihjaG9pY2VzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKENob2ljZTxUPiBjaG9pY2UgOiBjaG9pY2VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoY2hvaWNlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXMuYWRkKGNob2ljZS5nZXRWYWx1ZSgpLmdldCgwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KGNob2ljZS5nZXRDaG9pY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxDaG9pY2U8VD4+IHggPSBjaG9pY2UuZ2V0Q2hvaWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXMuYWRkQWxsKGdldEFsbG93ZWRWYWx1ZXMoeCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhbGxvd2VkVmFsdWVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdG9ySW50ZWdlciBleHRlbmRzIFByb3BlcnR5VmFsaWRhdG9yPEJpZ0ludGVnZXI+IHsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoUHJvcGVydHlEZWZpbml0aW9uPEJpZ0ludGVnZXI+IHByb3BEZWYsIFByb3BlcnR5RGF0YTxCaWdJbnRlZ2VyPiBwcm9wZXJ0eSkgewotCi0gICAgICAgICAgICBzdXBlci52YWxpZGF0ZShwcm9wRGVmLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgICAgIEJpZ0ludGVnZXIgcHJvcFZhbCA9IHByb3BlcnR5LmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWluVmFsID0gKChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSBwcm9wRGVmKS5nZXRNaW5WYWx1ZSgpOwotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhWYWwgPSAoKFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHByb3BEZWYpLmdldE1heFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG1pbiBhbmQgbWF4Ci0gICAgICAgICAgICBpZiAobWluVmFsICE9IG51bGwgJiYgcHJvcFZhbCAhPSBudWxsICYmIHByb3BWYWwuY29tcGFyZVRvKG1pblZhbCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIkZvciBwcm9wZXJ0eSB3aXRoIGlkICIgKyBwcm9wRGVmLmdldElkKCkgKyAiIHRoZSB2YWx1ZSAiICsgcHJvcFZhbAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAiICsgbWluVmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYXhWYWwgIT0gbnVsbCAmJiBwcm9wVmFsICE9IG51bGwgJiYgcHJvcFZhbC5jb21wYXJlVG8obWF4VmFsKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJGb3IgcHJvcGVydHkgd2l0aCBpZCAiICsgcHJvcERlZi5nZXRJZCgpICsgIiB0aGUgdmFsdWUgIiArIHByb3BWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBiaWdnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSAiICsgbWF4VmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRvckRlY2ltYWwgZXh0ZW5kcyBQcm9wZXJ0eVZhbGlkYXRvcjxCaWdEZWNpbWFsPiB7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKFByb3BlcnR5RGVmaW5pdGlvbjxCaWdEZWNpbWFsPiBwcm9wRGVmLCBQcm9wZXJ0eURhdGE8QmlnRGVjaW1hbD4gcHJvcGVydHkpIHsKLQotICAgICAgICAgICAgc3VwZXIudmFsaWRhdGUocHJvcERlZiwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICBCaWdEZWNpbWFsIHByb3BWYWwgPSBwcm9wZXJ0eS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgICAgICBCaWdEZWNpbWFsIG1pblZhbCA9ICgoUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgcHJvcERlZikuZ2V0TWluVmFsdWUoKTsKLSAgICAgICAgICAgIEJpZ0RlY2ltYWwgbWF4VmFsID0gKChQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uKSBwcm9wRGVmKS5nZXRNYXhWYWx1ZSgpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBtaW4gYW5kIG1heAotICAgICAgICAgICAgaWYgKG1pblZhbCAhPSBudWxsICYmIHByb3BWYWwgIT0gbnVsbCAmJiBwcm9wVmFsLmNvbXBhcmVUbyhtaW5WYWwpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJGb3IgcHJvcGVydHkgd2l0aCBpZCAiICsgcHJvcERlZi5nZXRJZCgpICsgIiB0aGUgdmFsdWUgIiArIHByb3BWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gdmFsdWUgIiArIG1pblZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF4VmFsICE9IG51bGwgJiYgcHJvcFZhbCAhPSBudWxsICYmIHByb3BWYWwuY29tcGFyZVRvKG1heFZhbCkgPT0gMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiRm9yIHByb3BlcnR5IHdpdGggaWQgIiArIHByb3BEZWYuZ2V0SWQoKSArICIgdGhlIHZhbHVlICIgKyBwcm9wVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgYmlnZ2VyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgIiArIG1heFZhbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0b3JTdHJpbmcgZXh0ZW5kcyBQcm9wZXJ0eVZhbGlkYXRvcjxTdHJpbmc+IHsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoUHJvcGVydHlEZWZpbml0aW9uPFN0cmluZz4gcHJvcERlZiwgUHJvcGVydHlEYXRhPFN0cmluZz4gcHJvcGVydHkpIHsKLQotICAgICAgICAgICAgc3VwZXIudmFsaWRhdGUocHJvcERlZiwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICBsb25nIG1heExlbiA9ICgoUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uKSBwcm9wRGVmKS5nZXRNYXhMZW5ndGgoKSA9PSBudWxsID8gLTEKLSAgICAgICAgICAgICAgICAgICAgOiAoKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbikgcHJvcERlZikuZ2V0TWF4TGVuZ3RoKCkubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICBsb25nIGxlbiA9IHByb3BlcnR5LmdldEZpcnN0VmFsdWUoKSA9PSBudWxsID8gLTEgOiBwcm9wZXJ0eS5nZXRGaXJzdFZhbHVlKCkubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG1heCBsZW5ndGgKLSAgICAgICAgICAgIGlmIChtYXhMZW4gPj0gMCAmJiBsZW4gPj0gMCAmJiBtYXhMZW4gPCBsZW4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIkZvciBwcm9wZXJ0eSB3aXRoIGlkICIgKyBwcm9wRGVmLmdldElkKCkgKyAiIHRoZSBsZW5ndGggb2YgIiArIGxlbgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoICAiICsgbWF4TGVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgdmFsaWRhdGVQcm9wZXJ0aWVzKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYsIFByb3BlcnRpZXMgcHJvcGVydGllcywgYm9vbGVhbiBjaGVja01hbmRhdG9yeSkgewotICAgICAgICB2YWxpZGF0ZVByb3BlcnRpZXModHlwZURlZiwgcHJvcGVydGllcywgY2hlY2tNYW5kYXRvcnksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIHZhbGlkYXRlUHJvcGVydGllcyhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIGJvb2xlYW4gY2hlY2tNYW5kYXRvcnksCi0gICAgICAgICAgICBib29sZWFuIGNtaXMxMSkgewotICAgICAgICBMaXN0PFN0cmluZz4gcHJvcERlZnNSZXF1aXJlZCA9IGdldE1hbmRhdG9yeVByb3BEZWZzKHR5cGVEZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpKTsKLQotICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wIDogcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlJZCA9IHByb3AuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wZXJ0eUlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSBpZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCYXNlVHlwZUlkIGJhc2VUeXBlSWQgPSB0eXBlRGVmLmdldEJhc2VUeXBlSWQoKTsKLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrTWFuZGF0b3J5ICYmIHByb3BEZWZzUmVxdWlyZWQuY29udGFpbnMocHJvcGVydHlJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcERlZnNSZXF1aXJlZC5yZW1vdmUocHJvcGVydHlJZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzU3lzdGVtUHJvcGVydHkoYmFzZVR5cGVJZCwgcHJvcGVydHlJZCwgY21pczExKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYWxsIHByb3BlcnRpZXMgYXJlIGtub3duIGluIHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgaWYgKHR5cGVDb250YWluc1Byb3BlcnR5KHR5cGVEZWYsIHByb3BlcnR5SWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGFsbCB0eXBlIHNwZWNpZmljIGNvbnN0cmFpbnRzOgotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248VD4gcHJvcERlZiA9IGdldFByb3BlcnR5RGVmaW5pdGlvbih0eXBlRGVmLCBwcm9wZXJ0eUlkKTsKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWxpZGF0b3I8VD4gdmFsaWRhdG9yID0gY3JlYXRlUHJvcGVydHlWYWxpZGF0b3IocHJvcERlZik7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShwcm9wRGVmLCAoUHJvcGVydHlEYXRhPFQ+KSBwcm9wKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oIlVua25vd24gcHJvcGVydHkgIiArIHByb3BlcnR5SWQgKyAiIGluIHR5cGUgIiArIHR5cGVEZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoZWNrTWFuZGF0b3J5ICYmICFwcm9wRGVmc1JlcXVpcmVkLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJUaGUgZm9sbG93aW5nIG1hbmRhdG9yeSBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nOiAiICsgcHJvcERlZnNSZXF1aXJlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIHZhbGlkYXRlUHJvcGVydGllcyhMaXN0PFR5cGVEZWZpbml0aW9uPiB0eXBlRGVmcywgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgYm9vbGVhbiBjaGVja01hbmRhdG9yeSkgewotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBjaGVja2VkUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQm9vbGVhbj4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcElkIDogcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGNoZWNrZWRQcm9wZXJ0aWVzLnB1dChwcm9wSWQsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZURlZiA6IHR5cGVEZWZzKSB7Ci0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wRGVmc1JlcXVpcmVkID0gZ2V0TWFuZGF0b3J5UHJvcERlZnModHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkpOwotCi0gICAgICAgICAgICBmb3IgKFByb3BlcnR5RGF0YTw/PiBwcm9wIDogcHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlJZCA9IHByb3AuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wZXJ0eUlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSBpZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCYXNlVHlwZUlkIGJhc2VUeXBlSWQgPSB0eXBlRGVmLmdldEJhc2VUeXBlSWQoKTsKLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrTWFuZGF0b3J5ICYmIHByb3BEZWZzUmVxdWlyZWQuY29udGFpbnMocHJvcGVydHlJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcERlZnNSZXF1aXJlZC5yZW1vdmUocHJvcGVydHlJZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzU3lzdGVtUHJvcGVydHkoYmFzZVR5cGVJZCwgcHJvcGVydHlJZCwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFByb3BlcnRpZXMucHV0KHByb3AuZ2V0SWQoKSwgdHJ1ZSk7IC8vIGlnbm9yZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQ29udGFpbnNQcm9wZXJ0eSh0eXBlRGVmLCBwcm9wZXJ0eUlkKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbGwgcHJvcGVydGllcyBhcmUga25vd24gaW4gdGhlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbWFya2VkIHRoZSBwcm9wZXJ0eSBhcyBmb3VuZCBpbiBhIHR5cGUgb2YgcHJpbWFyeSBvcgotICAgICAgICAgICAgICAgICAgICAvLyBzZWNvbmRhcnkgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFByb3BlcnRpZXMucHV0KHByb3AuZ2V0SWQoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYWxsIHR5cGUgc3BlY2lmaWMgY29uc3RyYWludHM6Ci0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjxUPiBwcm9wRGVmID0gZ2V0UHJvcGVydHlEZWZpbml0aW9uKHR5cGVEZWYsIHByb3BlcnR5SWQpOwotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRvcjxUPiB2YWxpZGF0b3IgPSBjcmVhdGVQcm9wZXJ0eVZhbGlkYXRvcihwcm9wRGVmKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHByb3BEZWYsIChQcm9wZXJ0eURhdGE8VD4pIHByb3ApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoZWNrTWFuZGF0b3J5ICYmICFwcm9wRGVmc1JlcXVpcmVkLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiVGhlIGZvbGxvd2luZyBtYW5kYXRvcnkgcHJvcGVydGllcyBhcmUgbWlzc2luZzogIiArIHByb3BEZWZzUmVxdWlyZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgYWxsIHByb3BlcnRpZXMgYXJlIGtub3duIGluIGEgdHlwZSBkZWZpbml0aW9uCi0gICAgICAgIExpc3Q8U3RyaW5nPiB1bmtub3duUHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBwcm9wSWQgOiBwcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5rZXlTZXQoKSkgewotICAgICAgICAgICAgaWYgKCFjaGVja2VkUHJvcGVydGllcy5nZXQocHJvcElkKSkgewotICAgICAgICAgICAgICAgIHVua25vd25Qcm9wZXJ0aWVzLmFkZChwcm9wSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghdW5rbm93blByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIG5vdCBrbm93biBpbiBhbnkgb2YgdGhlIHR5cGVzIG9mIHRoaXMgb2JqZWN0OiAiICsgdW5rbm93blByb3BlcnRpZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlVmVyc2lvblN0YXRlRm9yQ3JlYXRlKERvY3VtZW50VHlwZURlZmluaXRpb24gdHlwZURlZiwgVmVyc2lvbmluZ1N0YXRlIHZlclN0YXRlKSB7Ci0gICAgICAgIGlmIChudWxsID09IHZlclN0YXRlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVEZWYuaXNWZXJzaW9uYWJsZSgpICYmIHZlclN0YXRlLmVxdWFscyhWZXJzaW9uaW5nU3RhdGUuTk9ORSkgfHwgIXR5cGVEZWYuaXNWZXJzaW9uYWJsZSgpCi0gICAgICAgICAgICAgICAgJiYgIXZlclN0YXRlLmVxdWFscyhWZXJzaW9uaW5nU3RhdGUuTk9ORSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiVGhlIHZlcnNpb25pbmcgc3RhdGUgZmxhZyBpcyBpbWNvbXBhdGlibGUgdG8gdGhlIHR5cGUgZGVmaW5pdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQWxsb3dlZENoaWxkT2JqZWN0VHlwZXMoVHlwZURlZmluaXRpb24gY2hpbGRUeXBlRGVmLCBMaXN0PFN0cmluZz4gYWxsb3dlZENoaWxkVHlwZXMpIHsKLQotICAgICAgICB2YWxpZGF0ZUFsbG93ZWRUeXBlcyhjaGlsZFR5cGVEZWYsIGFsbG93ZWRDaGlsZFR5cGVzLCAiaW4gdGhpcyBmb2xkZXIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVBbGxvd2VkUmVsYXRpb25zaGlwVHlwZXMoUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gcmVsYXRpb25zaGlwVHlwZURlZiwKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHNvdXJjZVR5cGVEZWYsIFR5cGVEZWZpbml0aW9uIHRhcmdldFR5cGVEZWYpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGFsbG93ZWRTb3VyY2VUeXBlcyA9IHJlbGF0aW9uc2hpcFR5cGVEZWYuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKTsKLSAgICAgICAgdmFsaWRhdGVBbGxvd2VkVHlwZXMoc291cmNlVHlwZURlZiwgYWxsb3dlZFNvdXJjZVR5cGVzLCAiIGFzIHNvdXJjZSB0eXBlIGluIHRoaXMgcmVsYXRpb25zaGlwIik7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBhbGxvd2VkVGFyZ2V0VHlwZXMgPSByZWxhdGlvbnNoaXBUeXBlRGVmLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCk7Ci0gICAgICAgIHZhbGlkYXRlQWxsb3dlZFR5cGVzKHRhcmdldFR5cGVEZWYsIGFsbG93ZWRUYXJnZXRUeXBlcywgIiBhcyB0YXJnZXQgdHlwZSBpbiB0aGlzIHJlbGF0aW9uc2hpcCIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB2YWxpZGF0ZUFsbG93ZWRUeXBlcyhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmLCBMaXN0PFN0cmluZz4gYWxsb3dlZFR5cGVzLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoYWxsb3dlZFR5cGVzKSkgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBhbGwgdHlwZXMgYXJlIGFsbG93ZWQKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoU3RyaW5nIGFsbG93ZWRUeXBlIDogYWxsb3dlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZFR5cGUuZXF1YWxzKHR5cGVEZWYuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJUaGUgcmVxdWVzdGVkIHR5cGUgIiArIHR5cGVEZWYuZ2V0SWQoKSArICIgaXMgbm90IGFsbG93ZWQgIiArIGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVBY2woVHlwZURlZmluaXRpb24gdHlwZURlZiwgQWNsIGFkZEFDRXMsIEFjbCByZW1vdmVBQ0VzKSB7Ci0gICAgICAgIGlmICghdHlwZURlZi5pc0NvbnRyb2xsYWJsZUFjbCgpICYmIChhZGRBQ0VzICE9IG51bGwgfHwgcmVtb3ZlQUNFcyAhPSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNDb25zdHJhaW50RXhjZXB0aW9uKCJhY2wgc2V0IGZvciB0eXBlOiAiICsgdHlwZURlZi5nZXREaXNwbGF5TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIG5vdCBjb250cm9sbGFibGVBQ0wiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNvbnRlbnRBbGxvd2VkKERvY3VtZW50VHlwZURlZmluaXRpb24gdHlwZURlZiwgYm9vbGVhbiBoYXNDb250ZW50KSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW1BbGxvd2VkIGNvbnRlbnRBbGxvd2VkID0gdHlwZURlZi5nZXRDb250ZW50U3RyZWFtQWxsb3dlZCgpOwotICAgICAgICBpZiAoQ29udGVudFN0cmVhbUFsbG93ZWQuUkVRVUlSRUQgPT0gY29udGVudEFsbG93ZWQgJiYgIWhhc0NvbnRlbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiVHlwZSAiICsgdHlwZURlZi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiByZXF1aXJlcyBjb250ZW50IGJ1dCBkb2N1bWVudCBoYXMgbm8gY29udGVudC4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChDb250ZW50U3RyZWFtQWxsb3dlZC5OT1RBTExPV0VEID09IGNvbnRlbnRBbGxvd2VkICYmIGhhc0NvbnRlbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbigiVHlwZSAiICsgdHlwZURlZi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBhbGxvdyBjb250ZW50IGJ1dCBkb2N1bWVudCBoYXMgY29udGVudC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRNYW5kYXRvcnlQcm9wRGVmcyhNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BEZWZzKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiByZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgaWYgKG51bGwgIT0gcHJvcERlZnMpIHsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiBwcm9wRGVmcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmLmlzUmVxdWlyZWQoKSAmJiAhaXNNYW5kYXRvcnlTeXN0ZW1Qcm9wZXJ0eShwcm9wRGVmLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5hZGQocHJvcERlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUNvbnRhaW5zUHJvcGVydHkoVHlwZURlZmluaXRpb24gdHlwZURlZiwgU3RyaW5nIHByb3BlcnR5SWQpIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BEZWZzID0gdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgIGlmIChudWxsID09IHByb3BEZWZzKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IHByb3BEZWZzLmdldChwcm9wZXJ0eUlkKTsKLQotICAgICAgICByZXR1cm4gcHJvcERlZiAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlQ29udGFpbnNQcm9wZXJ0eVdpdGhRdWVyeU5hbWUoVHlwZURlZmluaXRpb24gdHlwZURlZiwgU3RyaW5nIHByb3BlcnR5UXVlcnlOYW1lKSB7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmcyA9IHR5cGVEZWYuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotICAgICAgICBpZiAobnVsbCA9PSBwcm9wRGVmcykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA6IHByb3BEZWZzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRRdWVyeU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnR5UXVlcnlOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB1bmtub3duIHByb3BlcnR5IHF1ZXJ5IG5hbWUgaW4gdGhpcyB0eXBlCi0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFByb3BlcnR5RGVmaW5pdGlvbjxUPiBnZXRQcm9wZXJ0eURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZURlZiwgU3RyaW5nIHByb3BlcnR5SWQpIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlZmluaXRpb248Pz4+IHByb3BEZWZzID0gdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgIGlmIChudWxsID09IHByb3BEZWZzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmID0gcHJvcERlZnMuZ2V0KHByb3BlcnR5SWQpOwotCi0gICAgICAgIGlmIChudWxsID09IHByb3BEZWYpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoUHJvcGVydHlEZWZpbml0aW9uPFQ+KSBwcm9wRGVmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbVByb3BlcnR5KEJhc2VUeXBlSWQgYmFzZVR5cGVJZCwgU3RyaW5nIHByb3BlcnR5SWQsIGJvb2xlYW4gY21pczExKSB7Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLk5BTUUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkNSRUFURURfQlkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkxBU1RfTU9ESUZJQ0FUSU9OX0RBVEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5DSEFOR0VfVE9LRU4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjbWlzMTEgJiYgcHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuREVTQ1JJUFRJT04pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjbWlzMTEgJiYgcHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhc2VUeXBlSWQuZXF1YWxzKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCkpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5JU19NQUpPUl9WRVJTSU9OKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5WRVJTSU9OX1NFUklFU19JRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuSVNfTEFURVNUX01BSk9SX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLlZFUlNJT05fTEFCRUwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLlZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5DSEVDS0lOX0NPTU1FTlQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGVJZC5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0ZPTERFUikpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5QQVJFTlRfSUQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLkFMTE9XRURfQ0hJTERfT0JKRUNUX1RZUEVfSURTKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5QQVRIKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGVJZC5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX1BPTElDWSkpIHsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlkLmVxdWFscyhQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SWQuZXF1YWxzKFByb3BlcnR5SWRzLlRBUkdFVF9JRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsgLy8gcmVsYXRpb25zaGlwCi0gICAgICAgICAgICBpZiAocHJvcGVydHlJZC5lcXVhbHMoUHJvcGVydHlJZHMuUE9MSUNZX1RFWFQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvZmlsdGVyL0pzb25QcmV0dHlQcmludGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L2ZpbHRlci9Kc29uUHJldHR5UHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmU1ODM2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvZmlsdGVyL0pzb25QcmV0dHlQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuZmlsdGVyOw0KLQ0KLS8qKg0KLSAqIEEgc3VwZXIgc2ltcGxlIEpTT04gcHJldHR5IHByaW50ZXINCi0gKi8NCi1wdWJsaWMgY2xhc3MgSnNvblByZXR0eVByaW50ZXIgew0KLQ0KLSAgICBwcml2YXRlIGludCBpbmRlbnQgPSAwOw0KLSAgICBwcml2YXRlIFN0cmluZyBpbmRlbnRTdHI7DQotICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotDQotICAgIHB1YmxpYyBKc29uUHJldHR5UHJpbnRlcigpIHsNCi0gICAgICAgIGluaXQoMyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEpzb25QcmV0dHlQcmludGVyKGludCBpbmRlbnQpIHsNCi0gICAgICAgIGluaXQoaW5kZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdChmaW5hbCBpbnQgaW5kZW50KSB7DQotICAgICAgICBTdHJpbmdCdWlsZGVyIGluZGVudEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihpbmRlbnQpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgew0KLSAgICAgICAgICAgIGluZGVudEJ1aWxkZXIuYXBwZW5kKCcgJyk7DQotICAgICAgICB9DQotICAgICAgICBpbmRlbnRTdHIgPSBpbmRlbnRCdWlsZGVyLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBwcmV0dHlQcmludChmaW5hbCBTdHJpbmcganNvblN0cikgew0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqc29uU3RyLmxlbmd0aCgpOyBpKyspIHsNCi0gICAgICAgICAgICBjaGFyIGMgPSBqc29uU3RyLmNoYXJBdChpKTsNCi0gICAgICAgICAgICB3cml0ZUNoYXIoYyk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVDaGFyKGNoYXIgYykgew0KLSAgICAgICAgaWYgKGMgPT0gJ1snIHx8IGMgPT0gJ3snKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKGMpOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsNCi0gICAgICAgICAgICBpbmRlbnQrKzsNCi0gICAgICAgICAgICBhZGRJbmRlbnQoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLCcpIHsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoYyk7DQotICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOw0KLSAgICAgICAgICAgIGFkZEluZGVudCgpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjID09ICddJyB8fCBjID09ICd9Jykgew0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsNCi0gICAgICAgICAgICBpbmRlbnQtLTsNCi0gICAgICAgICAgICBhZGRJbmRlbnQoKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoYyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHNiLmFwcGVuZChjKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkSW5kZW50KCkgew0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykgew0KLSAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnRTdHIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KLS8vICAgICAgICBhcmdzID0gbmV3IFN0cmluZ1syXTsNCi0vLyAgICAgICAgYXJnc1swXSA9ICJbMCx7XCIxXCI6e1wiMlwiOntcIjNcIjp7XCI0XCI6WzUse1wiNlwiOjd9XX19fX1dIjsNCi0vLyAgICAgICAgYXJnc1sxXSA9ICJ7XCJhYmNcIjp7XCJkZWZcIjp7XCJnaGlcIjp7XCJqa2xcIjpbNSx7XCJtbm9cIjo3fV19fX19IjsNCi0vLyAgICAgICAgZm9yIChTdHJpbmcgcyA6IGFyZ3MpIHsNCi0vLyAgICAgICAgICAgIEpzb25QcmV0dHlQcmludGVyIHBwID0gbmV3IEpzb25QcmV0dHlQcmludGVyKCk7DQotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByZXR0eSBQcmludGluZyBKU09OIFN0cmluZzogIiArIHMpOw0KLS8vICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHBwLnByZXR0eVByaW50KHMpOw0KLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmV0dHkgUHJpbnRlZCBKU09OOiAiICsgcmVzdWx0KTsNCi0vLyAgICAgICAgfQ0KLS8vICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9maWx0ZXIvTG9nZ2luZ0ZpbHRlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9maWx0ZXIvTG9nZ2luZ0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzlmYTViLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvZmlsdGVyL0xvZ2dpbmdGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuZmlsdGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1J1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkRhdGVUaW1lSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBMb2dnaW5nRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMb2dnaW5nRmlsdGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVxdWVzdE5vID0gMDsKLSAgICBwcml2YXRlIFN0cmluZyBsb2dEaXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHByZXR0eVByaW50ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbG9nSGVhZGVycyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBpbnQgaW5kZW50ID0gLTE7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjZmcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdmFsOwotICAgICAgICBsb2dEaXIgPSBjZmcuZ2V0SW5pdFBhcmFtZXRlcigiTG9nRGlyIik7Ci0gICAgICAgIGlmIChudWxsID09IGxvZ0RpciB8fCBsb2dEaXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbG9nRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsID09IGxvZ0RpciB8fCBsb2dEaXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbG9nRGlyID0gIi4iICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWxvZ0Rpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgIGxvZ0RpciArPSBGaWxlLnNlcGFyYXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGNmZy5nZXRJbml0UGFyYW1ldGVyKCJJbmRlbnQiKTsKLSAgICAgICAgaWYgKG51bGwgIT0gdmFsKSB7Ci0gICAgICAgICAgICBpbmRlbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZGVudCA8IDApIHsKLSAgICAgICAgICAgIGluZGVudCA9IDQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBjZmcuZ2V0SW5pdFBhcmFtZXRlcigiUHJldHR5UHJpbnQiKTsKLSAgICAgICAgaWYgKG51bGwgIT0gdmFsKSB7Ci0gICAgICAgICAgICBwcmV0dHlQcmludCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBjZmcuZ2V0SW5pdFBhcmFtZXRlcigiTG9nSGVhZGVycyIpOwotICAgICAgICBpZiAobnVsbCAhPSB2YWwpIHsKLSAgICAgICAgICAgIGxvZ0hlYWRlcnMgPSBCb29sZWFuLnBhcnNlQm9vbGVhbih2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXEsIFNlcnZsZXRSZXNwb25zZSByZXNwLCBGaWx0ZXJDaGFpbiBjaGFpbikgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIExPRy5kZWJ1ZygiTG9nZ2luZyBmaWx0ZXIgZG9GaWx0ZXIiKTsKLQotICAgICAgICBpZiAocmVzcCBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UgJiYgcmVxIGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBMb2dnaW5nUmVxdWVzdFdyYXBwZXIgbG9nUmVxID0gbmV3IExvZ2dpbmdSZXF1ZXN0V3JhcHBlcigoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXEpOwotICAgICAgICAgICAgTG9nZ2luZ1Jlc3BvbnNlV3JhcHBlciBsb2dSZXNwb25zZSA9IG5ldyBMb2dnaW5nUmVzcG9uc2VXcmFwcGVyKChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwKTsKLQotICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIobG9nUmVxLCBsb2dSZXNwb25zZSk7Ci0KLSAgICAgICAgICAgIGludCByZXFObyA9IGdldE5leHRSZXF1ZXN0TnVtYmVyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdEZpbGVOYW1lID0gZ2V0UmVxdWVzdEZpbGVOYW1lKHJlcU5vKTsKLSAgICAgICAgICAgIFN0cmluZyBjVHlwZSA9IGxvZ1JlcS5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgU3RyaW5nIHhtbFJlcXVlc3QgPSBsb2dSZXEuZ2V0UGF5bG9hZCgpOwotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChsb2dIZWFkZXJzKSB7Ci0gICAgICAgICAgICAgICAgbG9nSGVhZGVycyhsb2dSZXEsIHNiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHhtbFJlcXVlc3QgPT0gbnVsbCB8fCB4bWxSZXF1ZXN0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICB4bWxSZXF1ZXN0ID0gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmV0dHlQcmludCAmJiBjVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNUeXBlLnN0YXJ0c1dpdGgoIm11bHRpcGFydCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFJlcXVlc3QgPSBwcm9jZXNzTXVsdGlwYXJ0KGNUeXBlLCB4bWxSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNUeXBlLmNvbnRhaW5zKCJ4bWwiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxSZXF1ZXN0ID0gcHJldHR5UHJpbnRYbWwoeG1sUmVxdWVzdCwgaW5kZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHhtbFJlcXVlc3QgPSBzYi50b1N0cmluZygpICsgeG1sUmVxdWVzdDsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgcmVxdWVzdDogIiArIHJlcXVlc3RGaWxlTmFtZSArICI6ICIgKyB4bWxSZXF1ZXN0KTsKLSAgICAgICAgICAgIHdyaXRlVGV4dFRvRmlsZShyZXF1ZXN0RmlsZU5hbWUsIHhtbFJlcXVlc3QpOwotCi0gICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBjVHlwZSA9IGxvZ1Jlc3BvbnNlLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgeG1sUmVzcG9uc2UgPSBsb2dSZXNwb25zZS5nZXRQYXlsb2FkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VGaWxlTmFtZSA9IGdldFJlc3BvbnNlRmlsZU5hbWUocmVxTm8pOwotCi0gICAgICAgICAgICBpZiAobG9nSGVhZGVycykgewotICAgICAgICAgICAgICAgIGxvZ0hlYWRlcnMobG9nUmVzcG9uc2UsIHJlcS5nZXRQcm90b2NvbCgpLCBzYik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh4bWxSZXNwb25zZSA9PSBudWxsIHx8IHhtbFJlc3BvbnNlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICB4bWxSZXNwb25zZSA9ICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJldHR5UHJpbnQgJiYgY1R5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjVHlwZS5zdGFydHNXaXRoKCJtdWx0aXBhcnQiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxSZXNwb25zZSA9IHByb2Nlc3NNdWx0aXBhcnQoY1R5cGUsIHhtbFJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNUeXBlLmNvbnRhaW5zKCJ4bWwiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxSZXNwb25zZSA9IHByZXR0eVByaW50WG1sKHhtbFJlc3BvbnNlLCBpbmRlbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY1R5cGUuY29udGFpbnMoImpzb24iKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxSZXNwb25zZSA9IHByZXR0eVByaW50SnNvbih4bWxSZXNwb25zZSwgaW5kZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHhtbFJlc3BvbnNlID0gc2IudG9TdHJpbmcoKSArIHhtbFJlc3BvbnNlOwotICAgICAgICAgICAgTE9HLmRlYnVnKCJGb3VuZCByZXNwb25zZTogIiArIHJlc3BvbnNlRmlsZU5hbWUgKyAiOiAiICsgeG1sUmVzcG9uc2UpOwotICAgICAgICAgICAgd3JpdGVUZXh0VG9GaWxlKHJlc3BvbnNlRmlsZU5hbWUsIHhtbFJlc3BvbnNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcSwgcmVzcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVUZXh0VG9GaWxlKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSwgSU9VdGlscy5VVEY4KTsKLSAgICAgICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKGZ3KTsKLQotICAgICAgICAgICAgU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoY29udGVudCk7Ci0gICAgICAgICAgICB3aGlsZSAoc2Nhbm5lci5oYXNOZXh0TGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBzY2FubmVyLm5leHRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbihsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYW5uZXIuY2xvc2UoKTsKLQotICAgICAgICAgICAgcHcuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHB3KTsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGZ3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwcmV0dHlQcmludFhtbChTdHJpbmcgaW5wdXQsIGludCBpbmRlbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNvdXJjZSB4bWxJbnB1dCA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOwotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIFN0cmVhbVJlc3VsdCB4bWxPdXRwdXQgPSBuZXcgU3RyZWFtUmVzdWx0KHN0cmluZ1dyaXRlcik7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lckZhY3Rvcnkuc2V0QXR0cmlidXRlKCJpbmRlbnQtbnVtYmVyIiwgaW5kZW50KTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbElucHV0LCB4bWxPdXRwdXQpOwotICAgICAgICAgICAgcmV0dXJuIHhtbE91dHB1dC5nZXRXcml0ZXIoKS50b1N0cmluZygpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IC8vIHNpbXBsZSBleGNlcHRpb24gaGFuZGxpbmcsIHBsZWFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldmlldyBpdAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByZXR0eVByaW50SnNvbihTdHJpbmcgaW5wdXQsIGludCBpbmRlbnQpIHsKLSAgICAgICAgSnNvblByZXR0eVByaW50ZXIgcHAgPSBuZXcgSnNvblByZXR0eVByaW50ZXIoaW5kZW50KTsKLSAgICAgICAgcmV0dXJuIHBwLnByZXR0eVByaW50KGlucHV0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9jZXNzTXVsdGlwYXJ0KFN0cmluZyBjVHlwZSwgU3RyaW5nIG1lc3NhZ2VCb2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgYmVnaW5JbmRleCA9IGNUeXBlLmluZGV4T2YoImJvdW5kYXJ5PVwiIikgKyAxMDsKLSAgICAgICAgaW50IGVuZEluZGV4ID0gY1R5cGUuaW5kZXhPZignXCInLCBiZWdpbkluZGV4KTsKLSAgICAgICAgaWYgKGVuZEluZGV4IDwgMCkgewotICAgICAgICAgICAgZW5kSW5kZXggPSBjVHlwZS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSAiLS0iICsgY1R5cGUuc3Vic3RyaW5nKGJlZ2luSW5kZXgsIGVuZEluZGV4KTsKLSAgICAgICAgTE9HLmRlYnVnKCJCb3VuZGFyeSA9ICIgKyBib3VuZGFyeSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIobWVzc2FnZUJvZHkpKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB4bWxCb2R5QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgzMiAqIDEwMjQpOwotICAgICAgICBib29sZWFuIGJvdW5kYXJ5Rm91bmQ7Ci0KLSAgICAgICAgYm9vbGVhbiBpblhtbE9ySnNvbkJvZHkgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBpblhtbE9ySnNvblBhcnQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBpc1htbDsKLSAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGluWG1sT3JKc29uUGFydCkgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIjw/eG1sIikgfHwgbGluZS5zdGFydHNXaXRoKCJ7IikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5YbWxPckpzb25Cb2R5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNYbWwgPSBsaW5lLnN0YXJ0c1dpdGgoIjw/eG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsaWVuQnl0ZXMgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICB4bWxCb2R5QnVmZmVyLndyaXRlKGxpZW5CeXRlcywgMCwgbGllbkJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpblhtbE9ySnNvbkJvZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBpbi5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnlGb3VuZCA9IGxpbmUuc3RhcnRzV2l0aChib3VuZGFyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRhcnlGb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiTGVhdmluZyBYTUwgYm9keTogIiArIGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluWG1sT3JKc29uQm9keSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluWG1sT3JKc29uUGFydCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1htbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHByZXR0eVByaW50WG1sKHhtbEJvZHlCdWZmZXIudG9TdHJpbmcoSU9VdGlscy5VVEY4KSwgaW5kZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChwcmV0dHlQcmludEpzb24oeG1sQm9keUJ1ZmZlci50b1N0cmluZyhJT1V0aWxzLlVURjgpLCBpbmRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKS5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbEJvZHlCdWZmZXIud3JpdGUobGllbkJ5dGVzLCAwLCBsaWVuQnl0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiaW4gWE1MIHBhcnQgaXM6ICIgKyBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKS5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1Zygibm90IGluIFhNTCBwYXJ0OiAiICsgbGluZSk7Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKS5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgYm91bmRhcnlGb3VuZCA9IGxpbmUuc3RhcnRzV2l0aChib3VuZGFyeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJvdW5kYXJ5Rm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJCb3VuZGFyZHkgZm91bmQhIik7Ci0gICAgICAgICAgICAgICAgICAgIGluWG1sT3JKc29uUGFydCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiRW5kIHBhcnNpbmcgbXVsdGlwYXJ0LiIpOwotCi0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHByaXZhdGUgdm9pZCBsb2dIZWFkZXJzKExvZ2dpbmdSZXF1ZXN0V3JhcHBlciByZXEsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLSAgICAgICAgc2IuYXBwZW5kKHJlcS5nZXRNZXRob2QoKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICBzYi5hcHBlbmQocmVxLmdldFJlcXVlc3RVUkkoKSk7Ci0gICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHJlcS5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICBpZiAobnVsbCAhPSBxdWVyeVN0cmluZyAmJiBxdWVyeVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnPycpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgc2IuYXBwZW5kKHJlcS5nZXRQcm90b2NvbCgpKTsKLSAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICBFbnVtZXJhdGlvbiBoZWFkZXJOYW1lcyA9IHJlcS5nZXRIZWFkZXJOYW1lcygpOwotICAgICAgICB3aGlsZSAoaGVhZGVyTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZXMubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgaGVhZGVyTmFtZSA9IGhlYWRlck5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBoZWFkZXJOYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChoZWFkZXJOYW1lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChyZXEuZ2V0SGVhZGVyKGhlYWRlck5hbWUpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvZ0hlYWRlcnMoTG9nZ2luZ1Jlc3BvbnNlV3JhcHBlciByZXNwLCBTdHJpbmcgcHJvdG9jb2wsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLSAgICAgICAgc2IuYXBwZW5kKHByb3RvY29sKTsKLSAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgIHNiLmFwcGVuZChTdHJpbmcudmFsdWVPZihyZXNwLmdldFN0YXR1cygpKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gcmVzcC5nZXRIZWFkZXJzKCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChoZWFkZXIuZ2V0S2V5KCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCI6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVxdWVzdEZpbGVOYW1lKGludCBubykgewotICAgICAgICByZXR1cm4gbG9nRGlyICsgU3RyaW5nLmZvcm1hdCgiJTA1ZC1yZXF1ZXN0LmxvZyIsIG5vKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZXNwb25zZUZpbGVOYW1lKGludCBubykgewotICAgICAgICByZXR1cm4gbG9nRGlyICsgU3RyaW5nLmZvcm1hdCgiJTA1ZC1yZXNwb25zZS5sb2ciLCBubyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGludCBnZXROZXh0UmVxdWVzdE51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuIHJlcXVlc3RObysrOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ2dpbmdSZXF1ZXN0V3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgewotCi0gICAgICAgIHByaXZhdGUgTG9nZ2luZ0lucHV0U3RyZWFtIGlzOwotCi0gICAgICAgIHB1YmxpYyBMb2dnaW5nUmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdXBlcihyZXF1ZXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2VydmxldElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRoaXMuaXMgPSBuZXcgTG9nZ2luZ0lucHV0U3RyZWFtKHN1cGVyLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gaXMgPyAiIiA6IGlzLmdldFBheWxvYWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ2dpbmdJbnB1dFN0cmVhbSBleHRlbmRzIFNlcnZsZXRJbnB1dFN0cmVhbSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvdXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIHByaXZhdGUgU2VydmxldElucHV0U3RyZWFtIGlzOwotCi0gICAgICAgIHB1YmxpYyBMb2dnaW5nSW5wdXRTdHJlYW0oU2VydmxldElucHV0U3RyZWFtIGlzKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5pcyA9IGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBzdXJlIHdoaWNoIG1ldGhvZCBpcyB1c2VkIGp1c3Qgb3ZlcndyaXRlIGFsbCA0IG9mCi0gICAgICAgIC8vIHRoZW06Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaW50IGNoID0gaXMucmVhZCgpOwotICAgICAgICAgICAgaWYgKGNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYmFvdXMud3JpdGUoY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGludCBjaCA9IGlzLnJlYWQoYik7Ci0gICAgICAgICAgICBpZiAoY2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBiYW91cy53cml0ZShiLCAwLCBjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2g7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgbywgaW50IGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgY2ggPSBpcy5yZWFkKGIsIG8sIGwpOwotICAgICAgICAgICAgaWYgKGNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYmFvdXMud3JpdGUoYiwgbywgY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZExpbmUoYnl0ZVtdIGIsIGludCBvLCBpbnQgbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGludCBjaCA9IGlzLnJlYWRMaW5lKGIsIG8sIGwpOwotICAgICAgICAgICAgaWYgKGNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYmFvdXMud3JpdGUoYiwgbywgY2gpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXlsb2FkKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFvdXMudG9TdHJpbmcoSU9VdGlscy5VVEY4KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2RpbmcgJ1VURi04JyEiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ2dpbmdSZXNwb25zZVdyYXBwZXIgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBMb2dnaW5nT3V0cHV0U3RyZWFtIG9zOwotICAgICAgICBwcml2YXRlIFByaW50V3JpdGVyIHdyaXRlcjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgc3RhdHVzQ29kZTsKLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7Ci0KLSAgICAgICAgcHVibGljIExvZ2dpbmdSZXNwb25zZVdyYXBwZXIoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIHRoaXMub3MgPSBuZXcgTG9nZ2luZ091dHB1dFN0cmVhbShyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gd3JpdGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHRoaXMuZ2V0T3V0cHV0U3RyZWFtKCksIElPVXRpbHMuVVRGOCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gd3JpdGVyOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExPRy5lcnJvcigiRmFpbGVkIHRvIGdldCBQcmludFdyaXRlciBpbiBMb2dnaW5nRmlsdGVyOiAiICsgZSwgZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNlcnZsZXRPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBvczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBvcy5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQ29va2llKENvb2tpZSBjb29raWUpIHsKLSAgICAgICAgICAgIHN1cGVyLmFkZENvb2tpZShjb29raWUpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICAgICAgaWYgKGhlYWRlcnMuY29udGFpbnNLZXkoIkNvb2tpZSIpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBoZWFkZXJzLmdldCgiQ29va2llIikgKyAiOyAiICsgY29va2llLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHZhbHVlID0gY29va2llLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoZWFkZXJzLnB1dCgiQ29va2llIiwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRDb250ZW50VHlwZSh0eXBlKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXJzLmNvbnRhaW5zS2V5KCJDb250ZW50LVR5cGUiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjVHlwZSA9IGhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiKTsKLSAgICAgICAgICAgICAgICBpbnQgcG9zID0gY1R5cGUuaW5kZXhPZigiO2NoYXJzZXQ9Iik7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA8IDAgJiYgZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gY1R5cGUgKyAiO2NoYXJzZXQ9IiArIGVuY29kaW5nOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhlYWRlcnMucHV0KCJDb250ZW50LVR5cGUiLCB0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIGNoYXJzZXQpIHsKLSAgICAgICAgICAgIHN1cGVyLnNldENoYXJhY3RlckVuY29kaW5nKGNoYXJzZXQpOwotICAgICAgICAgICAgZW5jb2RpbmcgPSBjaGFyc2V0OwotICAgICAgICAgICAgaWYgKGhlYWRlcnMuY29udGFpbnNLZXkoIkNvbnRlbnQtVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNUeXBlID0gaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpOwotICAgICAgICAgICAgICAgIGludCBwb3MgPSBjVHlwZS5pbmRleE9mKCI7Y2hhcnNldD0iKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY1R5cGUgPSBjVHlwZS5zdWJzdHJpbmcoMCwgcG9zKSArICI7Y2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY1R5cGUgPSBjVHlwZSArICI7Y2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KCJDb250ZW50LVR5cGUiLCBjVHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRDb250ZW50TGVuZ3RoKGxlbik7Ci0gICAgICAgICAgICBoZWFkZXJzLnB1dCgiQ29udGVudC1MZW5ndGgiLCBTdHJpbmcudmFsdWVPZihsZW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldERhdGVTdHJpbmcobG9uZyBkYXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gRGF0ZVRpbWVIZWxwZXIuZm9ybWF0WG1sRGF0ZVRpbWUoZGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXREYXRlSGVhZGVyKG5hbWUsIGRhdGUpOwotICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgZ2V0RGF0ZVN0cmluZyhkYXRlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgbmFtZSwgbG9uZyBkYXRlKSB7Ci0gICAgICAgICAgICBzdXBlci5hZGREYXRlSGVhZGVyKG5hbWUsIGRhdGUpOwotICAgICAgICAgICAgaWYgKGhlYWRlcnMuY29udGFpbnNLZXkobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBoZWFkZXJzLnB1dChuYW1lLCBoZWFkZXJzLmdldChuYW1lKSArICI7ICIgKyBnZXREYXRlU3RyaW5nKGRhdGUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgZ2V0RGF0ZVN0cmluZyhkYXRlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHN1cGVyLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBoZWFkZXJzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIHN1cGVyLmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVycy5jb250YWluc0tleShuYW1lKSkgewotICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KG5hbWUsIGhlYWRlcnMuZ2V0KG5hbWUpICsgIjsgIiArIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEludEhlYWRlcihTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRJbnRIZWFkZXIobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbnRIZWFkZXIoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgICAgICAgICAgc3VwZXIuYWRkSW50SGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXJzLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgaGVhZGVycy5nZXQobmFtZSkgKyAiOyAiICsgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoZWFkZXJzLnB1dChuYW1lLCBTdHJpbmcudmFsdWVPZih2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdGF0dXNDb2RlID0gc2M7Ci0gICAgICAgICAgICBzdXBlci5zZW5kRXJyb3Ioc2MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdGF0dXNDb2RlID0gc2M7Ci0gICAgICAgICAgICBzdXBlci5zZW5kRXJyb3Ioc2MsIG1zZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2VuZFJlZGlyZWN0KFN0cmluZyBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN0YXR1c0NvZGUgPSAzMDI7Ci0gICAgICAgICAgICBzdXBlci5zZW5kUmVkaXJlY3QobG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MpIHsKLSAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBzYzsKLSAgICAgICAgICAgIHN1cGVyLnNldFN0YXR1cyhzYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXNDb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SGVhZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXJzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9nZ2luZ091dHB1dFN0cmVhbSBleHRlbmRzIFNlcnZsZXRPdXRwdXRTdHJlYW0gewotICAgICAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW91cyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgcHJpdmF0ZSBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zOwotCi0gICAgICAgIHB1YmxpYyBMb2dnaW5nT3V0cHV0U3RyZWFtKFNlcnZsZXRPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLm9zID0gb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBheWxvYWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU9VdGlscy50b1VURjhTdHJpbmcoYmFvdXMudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmFvdXMud3JpdGUoYiwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgICAgIG9zLndyaXRlKGIsIG9mZiwgbGVuKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiYW91cy53cml0ZShiKTsKLSAgICAgICAgICAgICAgICBvcy53cml0ZShiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBiYW91cy53cml0ZShjaCk7Ci0gICAgICAgICAgICBvcy53cml0ZShjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0Fic3RyYWN0UHJlZGljYXRlV2Fsa2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0Fic3RyYWN0UHJlZGljYXRlV2Fsa2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjQyMTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9BYnN0cmFjdFByZWRpY2F0ZVdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgRmxvcmVudCBHdWlsbGF1bWUsIE51eGVvCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiB3YWxraW5nIGEgcHJlZGljYXRlIGluIGxleGljYWwgb3JkZXIuCi0gKiA8cD4KLSAqIFRoZSB7QGNvZGUgd2Fsa1hZWn0gbWV0aG9kcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjaGFuZ2UgdGhlIHdhbGtpbmcgb3JkZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByZWRpY2F0ZVdhbGtlciBpbXBsZW1lbnRzIFByZWRpY2F0ZVdhbGtlciB7Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrUHJlZGljYXRlKFRyZWUgbm9kZSkgewotICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTk9UOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtOb3Qobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQU5EOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtBbmQobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuT1I6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa09yKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkVROgotICAgICAgICAgICAgcmV0dXJuIHdhbGtFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTkVROgotICAgICAgICAgICAgcmV0dXJuIHdhbGtOb3RFcXVhbHMobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuR1Q6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa0dyZWF0ZXJUaGFuKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkdURVE6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa0dyZWF0ZXJPckVxdWFscyhub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MVDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrTGVzc1RoYW4obm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTFRFUToKLSAgICAgICAgICAgIHJldHVybiB3YWxrTGVzc09yRXF1YWxzKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtJbihub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OT1RfSU46Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa05vdEluKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOX0FOWToKLSAgICAgICAgICAgIHJldHVybiB3YWxrSW5Bbnkobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTk9UX0lOX0FOWToKLSAgICAgICAgICAgIHJldHVybiB3YWxrTm90SW5Bbnkobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuRVFfQU5ZOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtFcUFueShub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JU19OVUxMOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtJc051bGwobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSVNfTk9UX05VTEw6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa0lzTm90TnVsbChub2RlLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5MSUtFOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtMaWtlKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLk5PVF9MSUtFOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtOb3RMaWtlKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkNPTlRBSU5TOgotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa0NvbnRhaW5zKG5vZGUsIG51bGwsIG5vZGUuZ2V0Q2hpbGQoMCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa0NvbnRhaW5zKG5vZGUsIG5vZGUuZ2V0Q2hpbGQoMCksIG5vZGUuZ2V0Q2hpbGQoMSkpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOX0ZPTERFUjoKLSAgICAgICAgICAgIGlmIChub2RlLmdldENoaWxkQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtJbkZvbGRlcihub2RlLCBudWxsLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtJbkZvbGRlcihub2RlLCBub2RlLmdldENoaWxkKDApLCBub2RlLmdldENoaWxkKDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5JTl9UUkVFOgotICAgICAgICAgICAgaWYgKG5vZGUuZ2V0Q2hpbGRDb3VudCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa0luVHJlZShub2RlLCBudWxsLCBub2RlLmdldENoaWxkKDApKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtJblRyZWUobm9kZSwgbm9kZS5nZXRDaGlsZCgwKSwgbm9kZS5nZXRDaGlsZCgxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQk9PTF9MSVQ6Ci0gICAgICAgICAgICB3YWxrQm9vbGVhbihub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5OVU1fTElUOgotICAgICAgICAgICAgd2Fsa051bWJlcihub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5TVFJJTkdfTElUOgotICAgICAgICAgICAgd2Fsa1N0cmluZyhub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5USU1FX0xJVDoKLSAgICAgICAgICAgIHdhbGtUaW1lc3RhbXAobm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSU5fTElTVDoKLSAgICAgICAgICAgIHdhbGtMaXN0KG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLkNPTDoKLSAgICAgICAgICAgIHdhbGtDb2wobm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSUQ6Ci0gICAgICAgICAgICB3YWxrSWQobm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuU0NPUkU6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa1Njb3JlKG5vZGUpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHdhbGtPdGhlclByZWRpY2F0ZShub2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqIEZvciBleHRlbnNpYmlsaXR5LiAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuIHdhbGtPdGhlclByZWRpY2F0ZShUcmVlIG5vZGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIG5vZGUgdHlwZTogIiArIG5vZGUuZ2V0VHlwZSgpICsgIiAoIiArIG5vZGUuZ2V0VGV4dCgpICsgIikiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTm90KFRyZWUgb3BOb2RlLCBUcmVlIG5vZGUpIHsKLSAgICAgICAgd2Fsa1ByZWRpY2F0ZShub2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtBbmQoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIHdhbGtQcmVkaWNhdGUobGVmdE5vZGUpOwotICAgICAgICB3YWxrUHJlZGljYXRlKHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrT3IoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIHdhbGtQcmVkaWNhdGUobGVmdE5vZGUpOwotICAgICAgICB3YWxrUHJlZGljYXRlKHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHdhbGtFeHByKFRyZWUgbm9kZSkgewotICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQk9PTF9MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa0Jvb2xlYW4obm9kZSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuTlVNX0xJVDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrTnVtYmVyKG5vZGUpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLlNUUklOR19MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa1N0cmluZyhub2RlKTsKLSAgICAgICAgY2FzZSBDbWlzUWxTdHJpY3RMZXhlci5USU1FX0xJVDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrVGltZXN0YW1wKG5vZGUpOwotICAgICAgICBjYXNlIENtaXNRbFN0cmljdExleGVyLklOX0xJU1Q6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa0xpc3Qobm9kZSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuQ09MOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtDb2wobm9kZSk7Ci0gICAgICAgIGNhc2UgQ21pc1FsU3RyaWN0TGV4ZXIuSUQ6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa0lkKG5vZGUpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHdhbGtPdGhlckV4cHIobm9kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrU2VhcmNoRXhwcihUcmVlIG5vZGUpIHsKLSAgICAgICAgc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX0FORDoKLSAgICAgICAgICAgIHJldHVybiB3YWxrVGV4dEFuZChub2RlKTsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9PUjoKLSAgICAgICAgICAgIHJldHVybiB3YWxrVGV4dE9yKG5vZGUpOwotICAgICAgICBjYXNlIFRleHRTZWFyY2hMZXhlci5URVhUX01JTlVTOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtUZXh0TWludXMobm9kZSk7Ci0gICAgICAgIGNhc2UgVGV4dFNlYXJjaExleGVyLlRFWFRfU0VBUkNIX1dPUkRfTElUOgotICAgICAgICAgICAgcmV0dXJuIHdhbGtUZXh0V29yZChub2RlKTsKLSAgICAgICAgY2FzZSBUZXh0U2VhcmNoTGV4ZXIuVEVYVF9TRUFSQ0hfUEhSQVNFX1NUUklOR19MSVQ6Ci0gICAgICAgICAgICByZXR1cm4gd2Fsa1RleHRQaHJhc2Uobm9kZSk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB3YWxrT3RoZXJFeHByKG5vZGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRm9yIGV4dGVuc2liaWxpdHkuICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCB3YWxrT3RoZXJFeHByKFRyZWUgbm9kZSkgewotICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlVua25vd24gbm9kZSB0eXBlOiAiICsgbm9kZS5nZXRUeXBlKCkgKyAiICgiICsgbm9kZS5nZXRUZXh0KCkgKyAiKSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtFcXVhbHMoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIHdhbGtFeHByKGxlZnROb2RlKTsKLSAgICAgICAgd2Fsa0V4cHIocmlnaHROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtOb3RFcXVhbHMoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKSB7Ci0gICAgICAgIHdhbGtFeHByKGxlZnROb2RlKTsKLSAgICAgICAgd2Fsa0V4cHIocmlnaHROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtHcmVhdGVyVGhhbihUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgd2Fsa0V4cHIobGVmdE5vZGUpOwotICAgICAgICB3YWxrRXhwcihyaWdodE5vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa0dyZWF0ZXJPckVxdWFscyhUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpIHsKLSAgICAgICAgd2Fsa0V4cHIobGVmdE5vZGUpOwotICAgICAgICB3YWxrRXhwcihyaWdodE5vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa0xlc3NUaGFuKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICB3YWxrRXhwcihsZWZ0Tm9kZSk7Ci0gICAgICAgIHdhbGtFeHByKHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTGVzc09yRXF1YWxzKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSkgewotICAgICAgICB3YWxrRXhwcihsZWZ0Tm9kZSk7Ci0gICAgICAgIHdhbGtFeHByKHJpZ2h0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrSW4oVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgICAgICB3YWxrRXhwcihjb2xOb2RlKTsKLSAgICAgICAgd2Fsa0V4cHIobGlzdE5vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa05vdEluKFRyZWUgb3BOb2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpIHsKLSAgICAgICAgd2Fsa0V4cHIoY29sTm9kZSk7Ci0gICAgICAgIHdhbGtFeHByKGxpc3ROb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJbkFueShUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIGxpc3ROb2RlKSB7Ci0gICAgICAgIHdhbGtFeHByKGNvbE5vZGUpOwotICAgICAgICB3YWxrRXhwcihsaXN0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTm90SW5BbnkoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSwgVHJlZSBsaXN0Tm9kZSkgewotICAgICAgICB3YWxrRXhwcihjb2xOb2RlKTsKLSAgICAgICAgd2Fsa0V4cHIobGlzdE5vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa0VxQW55KFRyZWUgb3BOb2RlLCBUcmVlIGxpdGVyYWxOb2RlLCBUcmVlIGNvbE5vZGUpIHsKLSAgICAgICAgd2Fsa0V4cHIobGl0ZXJhbE5vZGUpOwotICAgICAgICB3YWxrRXhwcihjb2xOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJc051bGwoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgICAgICB3YWxrRXhwcihjb2xOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJc05vdE51bGwoVHJlZSBvcE5vZGUsIFRyZWUgY29sTm9kZSkgewotICAgICAgICB3YWxrRXhwcihjb2xOb2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtMaWtlKFRyZWUgb3BOb2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSkgewotICAgICAgICB3YWxrRXhwcihjb2xOb2RlKTsKLSAgICAgICAgd2Fsa0V4cHIoc3RyaW5nTm9kZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrTm90TGlrZShUcmVlIG9wTm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpIHsKLSAgICAgICAgd2Fsa0V4cHIoY29sTm9kZSk7Ci0gICAgICAgIHdhbGtFeHByKHN0cmluZ05vZGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gd2Fsa0NvbnRhaW5zKFRyZWUgb3BOb2RlLCBUcmVlIHF1YWxOb2RlLCBUcmVlIHF1ZXJ5Tm9kZSkgewotICAgICAgICBpZiAocXVhbE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHdhbGtTZWFyY2hFeHByKHF1YWxOb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2Fsa1NlYXJjaEV4cHIocXVlcnlOb2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiB3YWxrSW5Gb2xkZXIoVHJlZSBvcE5vZGUsIFRyZWUgcXVhbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgIGlmIChxdWFsTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3YWxrRXhwcihxdWFsTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2Fsa0V4cHIocGFyYW1Ob2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sZWFuIHdhbGtJblRyZWUoVHJlZSBvcE5vZGUsIFRyZWUgcXVhbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKSB7Ci0gICAgICAgIGlmIChxdWFsTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3YWxrRXhwcihxdWFsTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgd2Fsa0V4cHIocGFyYW1Ob2RlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgd2Fsa0xpc3QoVHJlZSBub2RlKSB7Ci0gICAgICAgIGludCBuID0gbm9kZS5nZXRDaGlsZENvdW50KCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiByZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4obik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICByZXMuYWRkKHdhbGtFeHByKG5vZGUuZ2V0Q2hpbGQoaSkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgd2Fsa0Jvb2xlYW4oVHJlZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBzID0gbm9kZS5nZXRUZXh0KCk7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2Yocyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB3YWxrTnVtYmVyKFRyZWUgbm9kZSkgewotICAgICAgICBTdHJpbmcgcyA9IG5vZGUuZ2V0VGV4dCgpOwotICAgICAgICBpZiAocy5jb250YWlucygiLiIpIHx8IHMuY29udGFpbnMoImUiKSB8fCBzLmNvbnRhaW5zKCJFIikpIHsKLSAgICAgICAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZihzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLnZhbHVlT2Yocyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHdhbGtTdHJpbmcoVHJlZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBzID0gbm9kZS5nZXRUZXh0KCk7Ci0gICAgICAgIHMgPSBzLnN1YnN0cmluZygxLCBzLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIHMgPSBzLnJlcGxhY2UoIicnIiwgIiciKTsgLy8gdW5lc2NhcGUgcXVvdGVzCi0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgd2Fsa1RpbWVzdGFtcChUcmVlIG5vZGUpIHsKLSAgICAgICAgU3RyaW5nIHMgPSBub2RlLmdldFRleHQoKTsKLSAgICAgICAgcyA9IHMuc3Vic3RyaW5nKHMuaW5kZXhPZignXCcnKSArIDEsIHMubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgcmV0dXJuIENhbGVuZGFySGVscGVyLmZyb21TdHJpbmcocyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB3YWxrQ29sKFRyZWUgbm9kZSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHdhbGtJZChUcmVlIG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBCb29sZWFuIHdhbGtUZXh0QW5kKFRyZWUgbm9kZSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEJvb2xlYW4gd2Fsa1RleHRPcihUcmVlIG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBCb29sZWFuIHdhbGtUZXh0TWludXMoVHJlZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiB3YWxrVGV4dFdvcmQoVHJlZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiB3YWxrVGV4dFBocmFzZShUcmVlIG5vZGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBCb29sZWFuIHdhbGtTY29yZShUcmVlIG5vZGUpIHsKLSAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ2FsZW5kYXJIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ2FsZW5kYXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhYWE0Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NhbGVuZGFySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEF1dGhvcnM6Ci0gKiAgICAgRmxvcmVudCBHdWlsbGF1bWUsIE51eGVvCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBIZWxwZXIgZGVhbGluZyB3aXRoIGNvbnZlcnNpb24gb2Yge0BsaW5rIENhbGVuZGFyfSB0byBhbmQgZnJvbSB0aGUgc3RyaW5nCi0gKiBmb3JtYXQgc3BlY2lmaWVkIGJ5IENNSVNRTC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENhbGVuZGFySGVscGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gQ01JU1FMX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIC8vCi0gICAgICAgICAgICAiKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlbVHRdIiArICIoXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KSg/OlxcLihcXGQrKSk/IgotICAgICAgICAgICAgICAgICAgICArICIoPzpbWnpdfChbKy1dXFxkezJ9OlxcZHsyfSkpPyIpOwotCi0gICAgcHJpdmF0ZSBDYWxlbmRhckhlbHBlcigpIHsKLSAgICAgICAgLy8gdXRpbGl0eSBjbGFzcwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgQ01JU1FMIGRhdGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRvIGEKLSAgICAgKiB7QGxpbmsgR3JlZ29yaWFuQ2FsZW5kYXJ9LgotICAgICAqIDxwPgotICAgICAqIFBhcnNlcyB7QGNvZGUgWVlZWS1ISC1NTVRoaDptbTpzcy5zc3MraGg6bW19LCBvciBhIHtAY29kZSBafSBmb3IgdGhlCi0gICAgICogdGltZXpvbmUsIGFuZCB3aXRoIHtAY29kZSAuc3NzfSBiZWluZyBvcHRpb25hbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRldGltZQotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpbiBDTUlTUUwgZm9ybWF0Ci0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgR3JlZ29yaWFuQ2FsZW5kYXIgZnJvbVN0cmluZyhTdHJpbmcgZGF0ZXRpbWUpIHsKLSAgICAgICAgTWF0Y2hlciBtID0gQ01JU1FMX1BBVFRFUk4ubWF0Y2hlcihkYXRldGltZSk7Ci0gICAgICAgIGlmICghbS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGF0ZXRpbWUgZm9ybWF0OiAiICsgZGF0ZXRpbWUpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB0eiA9IG0uZ3JvdXAoOCk7Ci0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IChHcmVnb3JpYW5DYWxlbmRhcikgR3JlZ29yaWFuQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIKLSAgICAgICAgICAgICAgICArICh0eiA9PSBudWxsID8gIiIgOiB0eikpKTsKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5ZRUFSLCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMSkpKTsKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NT05USCwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDIpKSAtIDEpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkRBVEUsIEludGVnZXIucGFyc2VJbnQobS5ncm91cCgzKSkpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoNCkpKTsKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSU5VVEUsIEludGVnZXIucGFyc2VJbnQobS5ncm91cCg1KSkpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDYpKSk7Ci0gICAgICAgIFN0cmluZyBkZWNpbWFscyA9IG0uZ3JvdXAoNyk7Ci0gICAgICAgIGludCBtcyA9IGRlY2ltYWxzID09IG51bGwgPyAwIDogSW50ZWdlci5wYXJzZUludCgoZGVjaW1hbHMgKyAiMDAiKS5zdWJzdHJpbmcoMCwgMykpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCBtcyk7Ci0gICAgICAgIHJldHVybiBjYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBDYWxlbmRhciB0byBpdHMgQ01JU1FMIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWwKLSAgICAgKiAgICAgICAgICAgIGEge0BsaW5rIENhbGVuZGFyfQotICAgICAqIEByZXR1cm4gdGhlIENNSVNRTCBzdHJpbmcgcmVwcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhDYWxlbmRhciBjYWwpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigyOCk7Ci0gICAgICAgIHRvU3RyaW5nKGNhbCwgYnVmKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgQ2FsZW5kYXIgdG8gaXRzIENNSVNRTCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsCi0gICAgICogICAgICAgICAgICBhIHtAbGluayBDYWxlbmRhcn0KLSAgICAgKiBAcGFyYW0gYnVmCi0gICAgICogICAgICAgICAgICBhIGJ1ZmZlciBpbiB3aGljaCB0byBhZGQgdGhlIENNSVNRTCBzdHJpbmcgcmVwcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdG9TdHJpbmcoQ2FsZW5kYXIgY2FsLCBTdHJpbmdCdWlsZGVyIGJ1ZikgewotICAgICAgICBidWYuYXBwZW5kKGNhbC5nZXQoQ2FsZW5kYXIuWUVBUikpOwotICAgICAgICBidWYuYXBwZW5kKCctJyk7Ci0gICAgICAgIGludCBmID0gY2FsLmdldChDYWxlbmRhci5NT05USCk7Ci0gICAgICAgIGlmIChmIDwgOSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgnMCcpOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5hcHBlbmQoZiArIDEpOwotICAgICAgICBidWYuYXBwZW5kKCctJyk7Ci0gICAgICAgIGYgPSBjYWwuZ2V0KENhbGVuZGFyLkRBVEUpOwotICAgICAgICBpZiAoZiA8IDEwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCcwJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZChmKTsKLSAgICAgICAgYnVmLmFwcGVuZCgnVCcpOwotICAgICAgICBmID0gY2FsLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7Ci0gICAgICAgIGlmIChmIDwgMTApIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBidWYuYXBwZW5kKGYpOwotICAgICAgICBidWYuYXBwZW5kKCc6Jyk7Ci0gICAgICAgIGYgPSBjYWwuZ2V0KENhbGVuZGFyLk1JTlVURSk7Ci0gICAgICAgIGlmIChmIDwgMTApIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBidWYuYXBwZW5kKGYpOwotICAgICAgICBidWYuYXBwZW5kKCc6Jyk7Ci0gICAgICAgIGYgPSBjYWwuZ2V0KENhbGVuZGFyLlNFQ09ORCk7Ci0gICAgICAgIGlmIChmIDwgMTApIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBidWYuYXBwZW5kKGYpOwotICAgICAgICBidWYuYXBwZW5kKCcuJyk7Ci0gICAgICAgIGYgPSBjYWwuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKTsKLSAgICAgICAgaWYgKGYgPCAxMDApIHsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZiA8IDEwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCcwJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZChmKTsKLSAgICAgICAgaW50IG9mZnNldCA9IGNhbC5nZXRUaW1lWm9uZSgpLmdldE9mZnNldChjYWwuZ2V0VGltZUluTWlsbGlzKCkpIC8gNjAwMDA7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgnWicpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciBzaWduOwotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0OwotICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNpZ24gPSAnKyc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHNpZ24pOwotICAgICAgICAgICAgZiA9IG9mZnNldCAvIDYwOwotICAgICAgICAgICAgaWYgKGYgPCAxMCkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBmID0gb2Zmc2V0ICUgNjA7Ci0gICAgICAgICAgICBpZiAoZiA8IDEwKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnMCcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChmKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUXVlcnlFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ21pc1F1ZXJ5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTU0ZjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DbWlzUXVlcnlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQ21pc1F1ZXJ5RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwdWJsaWMgQ21pc1F1ZXJ5RXhjZXB0aW9uKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ21pc1F1ZXJ5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ21pc1F1ZXJ5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ21pc1F1ZXJ5RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIoY2F1c2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ21pc1NlbGVjdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0NtaXNTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhmMmQ5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ21pc1NlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbWlzU2VsZWN0b3IgewotCi0gICAgLyoqIEFsaWFzIG5hbWUgZm9yIGEgY29sdW1uIChvbmx5IGluIFNFTEVDVCBwYXJ0IHNldCkuICovCi0gICAgcHVibGljIFN0cmluZyBhbGlhc05hbWU7Ci0KLSAgICAvKiogQXJiaXRyYXJ5IGluZm8gZm9yIHRoaXMgc2VsZWN0b3IgKHVzZWQgYnkgc2VydmVycyBkdXJpbmcgcGFyc2luZykuICovCi0gICAgcHVibGljIE9iamVjdCBpbmZvOwotCi0gICAgcHVibGljIHZvaWQgc2V0QWxpYXNOYW1lKFN0cmluZyBhbGlhcykgewotICAgICAgICBhbGlhc05hbWUgPSBhbGlhczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFsaWFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGFsaWFzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvKE9iamVjdCBpbmZvKSB7Ci0gICAgICAgIHRoaXMuaW5mbyA9IGluZm87Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRJbmZvKCkgewotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9Db2x1bW5SZWZlcmVuY2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ29sdW1uUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTcxZTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9Db2x1bW5SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb2x1bW5SZWZlcmVuY2UgZXh0ZW5kcyBDbWlzU2VsZWN0b3IgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcXVhbGlmaWVyOyAgICAgIC8vIHR5cGUgcXVhbGlmaWVyIGNvbWluZyBmcm9tIHF1ZXJ5IHN0YXRlbWVudAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BRdWVyeU5hbWU7ICAvLyBwcm9wZXJ0eSBxdWVyeSBuYW1lIGNvbWluZyBmcm9tIHF1ZXJ5IHN0YXRlbWVudAotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHNldCB3aGVuIHRoZSB0eXBlcyBhcmUgcmVzb2x2ZWQ6Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlJZDsKLSAgICBwcml2YXRlIFR5cGVEZWZpbml0aW9uIHR5cGVEZWY7Ci0KLSAgICBwdWJsaWMgQ29sdW1uUmVmZXJlbmNlKFN0cmluZyBxdWFsaWZpZXIsIFN0cmluZyBwcm9wUXVlcnlOYW1lKSB7Ci0gICAgICAgIHRoaXMucXVhbGlmaWVyID0gcXVhbGlmaWVyOwotICAgICAgICB0aGlzLnByb3BRdWVyeU5hbWUgPSBwcm9wUXVlcnlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2x1bW5SZWZlcmVuY2UoU3RyaW5nIHByb3BRdWVyeU5hbWUpIHsKLSAgICAgICAgdGhpcy5xdWFsaWZpZXIgPSBudWxsOwotICAgICAgICB0aGlzLnByb3BRdWVyeU5hbWUgPSBwcm9wUXVlcnlOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkgewotICAgICAgICByZXR1cm4gcXVhbGlmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlRdWVyeU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wUXVlcnlOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BRdWVyeU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHByb3BlcnR5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGVEZWYpIHsKLSAgICAgICAgdGhpcy50eXBlRGVmID0gdHlwZURlZjsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eUlkID0gcHJvcGVydHlJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0eXBlRGVmOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eURlZmluaXRpb248Pz4gZ2V0UHJvcGVydHlEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KGdldFByb3BlcnR5SWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUlkKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlJZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkNvbHVtblJlZmVyZW5jZSgiCi0gICAgICAgICAgICAgICAgKyAocXVhbGlmaWVyID09IG51bGwgPyAiIiA6IHF1YWxpZmllciArICIuIikKLSAgICAgICAgICAgICAgICArIHByb3BRdWVyeU5hbWUgKyAoYWxpYXNOYW1lID09IG51bGwgPyAiIiA6ICIgQVMgIiArIGFsaWFzTmFtZSkKLSAgICAgICAgICAgICAgICArICIpIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0Z1bmN0aW9uUmVmZXJlbmNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0Z1bmN0aW9uUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2N2M1NjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9GdW5jdGlvblJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5OwotCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25SZWZlcmVuY2UgZXh0ZW5kcyBDbWlzU2VsZWN0b3IgewotCi0gICAgcHVibGljIGVudW0gQ21pc1FsRnVuY3Rpb24gewotICAgICAgICBTQ09SRQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQ21pc1FsRnVuY3Rpb24gZnVuY3Rpb247Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25SZWZlcmVuY2UoQ21pc1FsRnVuY3Rpb24gZnVuYykgewotICAgICAgICB0aGlzLmZ1bmN0aW9uID0gZnVuYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc1FsRnVuY3Rpb24gZ2V0RnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkZ1bmN0aW9uUmVmZXJlbmNlKCIgKyBmdW5jdGlvbi50b1N0cmluZygpICsgIikiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1ByZWRpY2F0ZVdhbGtlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9QcmVkaWNhdGVXYWxrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ2MjNlYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1ByZWRpY2F0ZVdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBGbG9yZW50IEd1aWxsYXVtZSwgTnV4ZW8KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeTsKLQotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgdHJlZSB3YWxrZXIgb2YgYSBXSEVSRSBjbGF1c2UuCi0gKiA8cD4KLSAqIENhbiBiZSB1c2VkIHRvIGJ1aWxkIGFub3RoZXIgZGF0YXN0cnVjdHVyZSwgb3IgZm9yIGRpcmVjdCB2YWx1ZSBldmFsdWF0aW9uCi0gKiAodGh1cyB0aGUgYm9vbGVhbiByZXR1cm4gdmFsdWVzIGZvciBjbGF1c2VzLCBhbmQgT2JqZWN0IGZvciB2YWx1ZXMpLgotICogPHA+Ci0gKiBUaGUgbWV0aG9kIHtAbGluayAjd2Fsa0V4cHJ9IGlzIHRoZSBlbnRyeSBwb2ludC4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcmVkaWNhdGVXYWxrZXIgZXh0ZW5kcyBQcmVkaWNhdGVXYWxrZXJCYXNlIHsKLQotICAgIEJvb2xlYW4gd2Fsa05vdChUcmVlIG9wTm9kZSwgVHJlZSBsZWZ0Tm9kZSk7Ci0KLSAgICBCb29sZWFuIHdhbGtBbmQoVHJlZSBvcE5vZGUsIFRyZWUgbGVmdE5vZGUsIFRyZWUgcmlnaHROb2RlKTsKLQotICAgIEJvb2xlYW4gd2Fsa09yKFRyZWUgb3BOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7Ci0KLSAgICBPYmplY3Qgd2Fsa0V4cHIoVHJlZSBub2RlKTsKLQotICAgIEJvb2xlYW4gd2Fsa0VxdWFscyhUcmVlIGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrTm90RXF1YWxzKFRyZWUgbmVOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7Ci0KLSAgICBCb29sZWFuIHdhbGtHcmVhdGVyVGhhbihUcmVlIGd0Tm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrR3JlYXRlck9yRXF1YWxzKFRyZWUgZ2VOb2RlLCBUcmVlIGxlZnROb2RlLCBUcmVlIHJpZ2h0Tm9kZSk7Ci0KLSAgICBCb29sZWFuIHdhbGtMZXNzVGhhbihUcmVlIGx0Tm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrTGVzc09yRXF1YWxzKFRyZWUgbGVxTm9kZSwgVHJlZSBsZWZ0Tm9kZSwgVHJlZSByaWdodE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrSW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrTm90SW4oVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrSW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrTm90SW5BbnkoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgbGlzdE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrRXFBbnkoVHJlZSBub2RlLCBUcmVlIGxpdGVyYWxOb2RlLCBUcmVlIGNvbE5vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrSXNOdWxsKFRyZWUgbnVsbE5vZGUsIFRyZWUgY29sTm9kZSk7Ci0KLSAgICBCb29sZWFuIHdhbGtJc05vdE51bGwoVHJlZSBub3ROdWxsTm9kZSwgVHJlZSBjb2xOb2RlKTsKLQotICAgIEJvb2xlYW4gd2Fsa0xpa2UoVHJlZSBub2RlLCBUcmVlIGNvbE5vZGUsIFRyZWUgc3RyaW5nTm9kZSk7Ci0KLSAgICBCb29sZWFuIHdhbGtOb3RMaWtlKFRyZWUgbm9kZSwgVHJlZSBjb2xOb2RlLCBUcmVlIHN0cmluZ05vZGUpOwotCi0gICAgQm9vbGVhbiB3YWxrQ29udGFpbnMoVHJlZSBub2RlLCBUcmVlIHF1YWxOb2RlLCBUcmVlIHBhcmFtTm9kZSk7Ci0KLSAgICBCb29sZWFuIHdhbGtJbkZvbGRlcihUcmVlIG5vZGUsIFRyZWUgcXVhbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKTsKLQotICAgIEJvb2xlYW4gd2Fsa0luVHJlZShUcmVlIG5vZGUsIFRyZWUgcXVhbE5vZGUsIFRyZWUgcGFyYW1Ob2RlKTsKLQotICAgIE9iamVjdCB3YWxrTGlzdChUcmVlIG5vZGUpOwotCi0gICAgT2JqZWN0IHdhbGtCb29sZWFuKFRyZWUgbm9kZSk7Ci0KLSAgICBPYmplY3Qgd2Fsa051bWJlcihUcmVlIG5vZGUpOwotCi0gICAgT2JqZWN0IHdhbGtTdHJpbmcoVHJlZSBub2RlKTsKLQotICAgIE9iamVjdCB3YWxrVGltZXN0YW1wKFRyZWUgbm9kZSk7Ci0KLSAgICBPYmplY3Qgd2Fsa0NvbChUcmVlIG5vZGUpOwotCi0gICAgT2JqZWN0IHdhbGtJZChUcmVlIG5vZGUpOwotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1ByZWRpY2F0ZVdhbGtlckJhc2UuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvUHJlZGljYXRlV2Fsa2VyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2FiNGFjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvUHJlZGljYXRlV2Fsa2VyQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5Ow0KLQ0KLWltcG9ydCBvcmcuYW50bHIucnVudGltZS50cmVlLlRyZWU7DQotDQotLyoqDQotICogQmFzZSBpbnRlcmZhY2UgZm9yIGEgdHJlZSB3YWxrZXIgb2YgYSBXSEVSRSBjbGF1c2UuDQotICogPHA+DQotICogQ09udGFpbnMgb25seSBhIHNpbmdsZSBtZXRob2QgdXNlZCBieSB0aGUgQU5UTFIgcXVlcnkgd2Fsa2VyIHRvDQotICogaW5pdGlhdGUgYSB0cmVlIHdhbGsgZm9yIGV2YWx1YXRpbmcgdGhlIHF1ZXJ5LiBZb3UgY2FuIGluaGVyaXQgZnJvbQ0KLSAqIHRoaXMgaW50ZXJmYWNlIGlmIHlvdSB3YW50IHRvIGhhdmUgeW91ciBvd24gd2Fsa2luZyBtZWNoYW5pc20NCi0gKiA8cD4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIFByZWRpY2F0ZVdhbGtlckJhc2Ugew0KLQ0KLSAgICBCb29sZWFuIHdhbGtQcmVkaWNhdGUoVHJlZSB3aGVyZU5vZGUpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1F1ZXJ5T2JqZWN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1F1ZXJ5T2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjYwNjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9RdWVyeU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LlR5cGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBRdWVyeU9iamVjdCBpcyBhIGNsYXNzIHVzZWQgdG8gZW5jYXBzdWxhdGUgYSBDTUlTIHF1ZXJ5LiBJdCBpcyBjcmVhdGVkIGZyb20KLSAqIGFuIEFOVExSIHBhcnNlciBvbiBhbiBpbmNvbWluZyBxdWVyeSBzdHJpbmcuIER1cmluZyBwYXJzaW5nIHZhcmlvdXMKLSAqIGluZm9ybWF0aW9ucyBhcmUgY29sbGVjdGVkIGFuZCBzdG9yZWQgaW4gb2JqZWN0cyBzdWl0YWJsZSBmb3IgZXZhbHVhdGluZyB0aGUKLSAqIHF1ZXJ5IChsaWtlIHNlbGVjdGVkIHByb3BlcnRpZXMsIGVmZmVjdGVkIHR5cGVzIGFuZCBvcmRlciBzdGF0ZW1lbnRzLiBBIHF1ZXJ5Ci0gKiBldmFsdWF0b3IgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIHBlcmZvcm0gdGhlIHF1ZXJ5IGFuZCBidWlsZCB0aGUgcmVzdWx0LgotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlPYmplY3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFF1ZXJ5T2JqZWN0LmNsYXNzKTsKLQotICAgIC8vIEZvciBlcnJvciBoYW5kbGluZyBzZWU6Ci0gICAgLy8gaHR0cDovL3d3dy5hbnRsci5vcmcvcGlwZXJtYWlsL2FudGxyLWludGVyZXN0LzIwMDgtQXByaWwvMDI3NjAwLmh0bWwKLSAgICAvLyBzZWxlY3QgcGFydAotICAgIHByb3RlY3RlZCBUeXBlTWFuYWdlciB0eXBlTWdyOwotICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PENtaXNTZWxlY3Rvcj4gc2VsZWN0UmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8Q21pc1NlbGVjdG9yPigpOwotICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PENtaXNTZWxlY3Rvcj4gd2hlcmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxDbWlzU2VsZWN0b3I+KCk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8Q21pc1NlbGVjdG9yPiBqb2luUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8Q21pc1NlbGVjdG9yPigpOwotICAgIC8vIC0tPiBKb2luIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPFN0cmluZywgQ21pc1NlbGVjdG9yPiBjb2xPckZ1bmNBbGlhcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ21pc1NlbGVjdG9yPigpOwotCi0gICAgLy8gZnJvbSBwYXJ0Ci0gICAgLyoqIG1hcCBmcm9tIGFsaWFzIG5hbWUgdG8gdHlwZSBxdWVyeSBuYW1lICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZnJvbXMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIC8qKiBtYWluIGZyb20gYWxpYXMgbmFtZSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZnJvbSA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdDxKb2luU3BlYz4gam9pblNwZWNzID0gbmV3IEFycmF5TGlzdDxKb2luU3BlYz4oKTsKLQotICAgIC8vIHdoZXJlIHBhcnQKLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPEludGVnZXIsIENtaXNTZWxlY3Rvcj4gY29sdW1uUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIENtaXNTZWxlY3Rvcj4oKTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gdHlwZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0KLSAgICAvLyBvcmRlciBieSBwYXJ0Ci0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8U29ydFNwZWM+IHNvcnRTcGVjcyA9IG5ldyBBcnJheUxpc3Q8U29ydFNwZWM+KCk7Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLSAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHByZWRlZmluZWRRdWVyeU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkgewotICAgICAgICB7Ci0gICAgICAgICAgICBhZGQoIlNFQVJDSF9TQ09SRSIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSm9pblNwZWMgewotCi0gICAgICAgIC8qKiBJTk5FUiAvIExFRlQgLyBSSUdIVCAqLwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGtpbmQ7Ci0KLSAgICAgICAgLyoqIEFsaWFzIG9yIGZ1bGwgdGFibGUgdHlwZSAqLwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGFsaWFzOwotCi0gICAgICAgIHB1YmxpYyBDb2x1bW5SZWZlcmVuY2Ugb25MZWZ0OwotCi0gICAgICAgIHB1YmxpYyBDb2x1bW5SZWZlcmVuY2Ugb25SaWdodDsKLQotICAgICAgICBwdWJsaWMgSm9pblNwZWMoU3RyaW5nIGtpbmQsIFN0cmluZyBhbGlhcykgewotICAgICAgICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdG9ycyhDb2x1bW5SZWZlcmVuY2Ugb25MZWZ0LCBDb2x1bW5SZWZlcmVuY2Ugb25SaWdodCkgewotICAgICAgICAgICAgdGhpcy5vbkxlZnQgPSBvbkxlZnQ7Ci0gICAgICAgICAgICB0aGlzLm9uUmlnaHQgPSBvblJpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkpvaW5SZWZlcmVuY2UoIiArIGtpbmQgKyAiLCIgKyBhbGlhcyArICIsIiArIG9uTGVmdCArICIsIiArIG9uUmlnaHQgKyAiKSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgU29ydFNwZWMgewotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhc2NlbmRpbmc7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBJbnRlZ2VyIGNvbFJlZktleTsgLy8ga2V5IGluIGNvbHVtblJlZmVyZW5jZXNNYXAgcG9pbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW4KLQotICAgICAgICAvLyBkZXNjcmlwdGlvbnMKLQotICAgICAgICBwdWJsaWMgU29ydFNwZWMoSW50ZWdlciBrZXksIGJvb2xlYW4gYXNjZW5kaW5nKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbFJlZktleSA9IGtleTsKLSAgICAgICAgICAgIHRoaXMuYXNjZW5kaW5nID0gYXNjZW5kaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENtaXNTZWxlY3RvciBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBjb2x1bW5SZWZlcmVuY2VzLmdldChjb2xSZWZLZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBc2NlbmRpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXNjZW5kaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFF1ZXJ5T2JqZWN0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBRdWVyeU9iamVjdChUeXBlTWFuYWdlciB0bSkgewotICAgICAgICB0eXBlTWdyID0gdG07Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxJbnRlZ2VyLCBDbWlzU2VsZWN0b3I+IGdldENvbHVtblJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoY29sdW1uUmVmZXJlbmNlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNTZWxlY3RvciBnZXRDb2x1bW5SZWZlcmVuY2UoSW50ZWdlciB0b2tlbikgewotICAgICAgICByZXR1cm4gY29sdW1uUmVmZXJlbmNlcy5nZXQodG9rZW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVJlZmVyZW5jZShJbnRlZ2VyIHRva2VuKSB7Ci0gICAgICAgIHJldHVybiB0eXBlUmVmZXJlbmNlcy5nZXQodG9rZW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlOwotICAgIH0KLQotICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBTRUxFQ1QgcGFydAotCi0gICAgLy8gcHVibGljIGFjY2Vzc29yIG1ldGhvZHMKLSAgICBwdWJsaWMgTGlzdDxDbWlzU2VsZWN0b3I+IGdldFNlbGVjdFJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3RSZWZlcmVuY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdFJlZmVyZW5jZShUcmVlIG5vZGUsIENtaXNTZWxlY3RvciBzZWxSZWYpIHsKLSAgICAgICAgc2VsZWN0UmVmZXJlbmNlcy5hZGQoc2VsUmVmKTsKLSAgICAgICAgY29sdW1uUmVmZXJlbmNlcy5wdXQobm9kZS5nZXRUb2tlblN0YXJ0SW5kZXgoKSwgc2VsUmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBbGlhcyhTdHJpbmcgYWxpYXNOYW1lLCBDbWlzU2VsZWN0b3IgYWxpYXNSZWYpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJhZGQgYWxpYXM6ICIgKyBhbGlhc05hbWUgKyAiIGZvcjogIiArIGFsaWFzUmVmKTsKLSAgICAgICAgaWYgKGNvbE9yRnVuY0FsaWFzLmNvbnRhaW5zS2V5KGFsaWFzTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUXVlcnlFeGNlcHRpb24oIllvdSBjYW5ub3QgdXNlIG5hbWUgIiArIGFsaWFzTmFtZSArICIgbW9yZSB0aGFuIG9uY2UgYXMgYWxpYXMgaW4gYSBzZWxlY3QuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhbGlhc1JlZi5zZXRBbGlhc05hbWUoYWxpYXNOYW1lKTsKLSAgICAgICAgICAgIGNvbE9yRnVuY0FsaWFzLnB1dChhbGlhc05hbWUsIGFsaWFzUmVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzU2VsZWN0b3IgZ2V0U2VsZWN0QWxpYXMoU3RyaW5nIGFsaWFzTmFtZSkgewotICAgICAgICByZXR1cm4gY29sT3JGdW5jQWxpYXMuZ2V0KGFsaWFzTmFtZSk7Ci0gICAgfQotCi0gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEZST00gcGFydAotCi0gICAgcHVibGljIFN0cmluZyBhZGRUeXBlKFN0cmluZyBhbGlhc05hbWUsIFN0cmluZyB0eXBlUXVlcnlOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoImFkZCBhbGlhczogIiArIGFsaWFzTmFtZSArICIgZm9yOiAiICsgdHlwZVF1ZXJ5TmFtZSk7Ci0gICAgICAgICAgICBpZiAoZnJvbXMuY29udGFpbnNLZXkoYWxpYXNOYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUXVlcnlFeGNlcHRpb24oIllvdSBjYW5ub3QgdXNlIG5hbWUgIiArIGFsaWFzTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1vcmUgdGhhbiBvbmNlIGFzIGFsaWFzIGluIGEgZnJvbSBwYXJ0LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFsaWFzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWxpYXNOYW1lID0gdHlwZVF1ZXJ5TmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyb21zLnB1dChhbGlhc05hbWUsIHR5cGVRdWVyeU5hbWUpOwotICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZyb20gPSBhbGlhc05hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYWxpYXNOYW1lOwotICAgICAgICB9IGNhdGNoIChDbWlzUXVlcnlFeGNlcHRpb24gY3FlKSB7Ci0gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBjcWUuZ2V0TWVzc2FnZSgpOyAvLyBwcmVzZXJ2ZSBtZXNzYWdlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gaW5kaWNhdGUgYW4gZXJyb3IgdG8gQU5UTFIgc28gdGhhdCBpdCBnZW5lcmF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblR5cGVBbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIGZyb207Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0VHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoZnJvbXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZVF1ZXJ5TmFtZShTdHJpbmcgcXVhbGlmaWVyKSB7Ci0gICAgICAgIHJldHVybiBmcm9tcy5nZXQocXVhbGlmaWVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb25Gcm9tUXVlcnlOYW1lKFN0cmluZyBxdWVyeU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVNZ3IuZ2V0VHlwZUJ5UXVlcnlOYW1lKHF1ZXJ5TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFBhcmVudFR5cGUoVHlwZURlZmluaXRpb24gdGQpIHsKLSAgICAgICAgU3RyaW5nIHBhcmVudFR5cGUgPSB0ZC5nZXRQYXJlbnRUeXBlSWQoKTsKLSAgICAgICAgcmV0dXJuIHBhcmVudFR5cGUgPT0gbnVsbCA/IG51bGwgOiB0eXBlTWdyLmdldFR5cGVCeUlkKHBhcmVudFR5cGUpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFBhcmVudFR5cGUoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0ZCA9IHR5cGVNZ3IuZ2V0VHlwZUJ5SWQodHlwZUlkKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBTdHJpbmcgcGFyZW50VHlwZSA9IHRkID09IG51bGwgPyBudWxsIDogdGQuZ2V0UGFyZW50VHlwZUlkKCk7Ci0gICAgICAgIHJldHVybiBwYXJlbnRUeXBlID09IG51bGwgPyBudWxsIDogdHlwZU1nci5nZXRUeXBlQnlJZChwYXJlbnRUeXBlKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBnZXRNYWluRnJvbU5hbWUoKSB7Ci0gICAgICAgIC8vIGFzIHdlIGRvbid0IHN1cHBvcnQgSk9JTlMgdGFrZSBmaXJzdCB0eXBlCi0gICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSBmcm9tcy52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdGQgPSBnZXRUeXBlRGVmaW5pdGlvbkZyb21RdWVyeU5hbWUocXVlcnlOYW1lKTsKLSAgICAgICAgcmV0dXJuIHRkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybiBhIG1hcCBvZiBhbGwgY29sdW1ucyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgaW4gdGhlIFNFTEVDVCBwYXJ0Ci0gICAgICogb2YgdGhlIHN0YXRlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbWFwIHdpdGggYSBTdHJpbmcgYXMgYSBrZXkgYW5kIHZhbHVlLiBrZXkgaXMgdGhlIGFsaWFzIGlmIGFuCi0gICAgICogICAgICAgICBhbGlhcyB3YXMgZ2l2ZW4gb3IgdGhlIHF1ZXJ5IG5hbWUgb3RoZXJ3aXNlLiB2YWx1ZSBpcyB0aGUgcXVlcnkKLSAgICAgKiAgICAgICAgIG5hbWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFJlcXVlc3RlZFByb3BlcnRpZXNCeUFsaWFzKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVxdWVzdGVkUHJvcGVydGllcyh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVxdWVzdGVkUHJvcGVydGllcyhib29sZWFuIGJ5QWxpYXMpIHsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBmb3IgKENtaXNTZWxlY3RvciBzZWwgOiBzZWxlY3RSZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgQ29sdW1uUmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiA9IChDb2x1bW5SZWZlcmVuY2UpIHNlbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gY29sUmVmLmdldFByb3BlcnR5SWQoKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBrZXkpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCk7IC8vIGhhcHBlbnMgZm9yICoKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BEZXNjciA9IGNvbFJlZi5nZXRBbGlhc05hbWUoKSA9PSBudWxsID8gY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkgOiBjb2xSZWYKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBbGlhc05hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnlBbGlhcykgewotICAgICAgICAgICAgICAgICAgICByZXMucHV0KHByb3BEZXNjciwga2V5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXMucHV0KGtleSwgcHJvcERlc2NyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gYSBtYXAgb2YgYWxsIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQgaW4gdGhlIFNFTEVDVCBwYXJ0Ci0gICAgICogb2YgdGhlIHN0YXRlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbWFwIHdpdGggYSBTdHJpbmcgYXMgYSBrZXkgYW5kIHZhbHVlLiBrZXkgaXMgdGhlIGFsaWFzIGlmIGFuCi0gICAgICogICAgICAgICBhbGlhcyB3YXMgZ2l2ZW4gb3IgdGhlIGZ1bmN0aW9uIG5hbWUgb3RoZXJ3aXNlLCB2YWx1ZSBpcyB0aGUgYQotICAgICAqICAgICAgICAgbmFtZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVxdWVzdGVkRnVuY3NCeUFsaWFzKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVxdWVzdGVkRnVuY3ModHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFJlcXVlc3RlZEZ1bmNzKGJvb2xlYW4gYnlBbGlhcykgewotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoQ21pc1NlbGVjdG9yIHNlbCA6IHNlbGVjdFJlZmVyZW5jZXMpIHsKLSAgICAgICAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBGdW5jdGlvblJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIEZ1bmN0aW9uUmVmZXJlbmNlIGZ1bmNSZWYgPSAoRnVuY3Rpb25SZWZlcmVuY2UpIHNlbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcERlc2NyID0gZnVuY1JlZi5nZXRBbGlhc05hbWUoKSA9PSBudWxsID8gZnVuY1JlZi5nZXROYW1lKCkgOiBmdW5jUmVmLmdldEFsaWFzTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChieUFsaWFzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5wdXQocHJvcERlc2NyLCBmdW5jUmVmLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzLnB1dChmdW5jUmVmLmdldE5hbWUoKSwgcHJvcERlc2NyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gSk9JTlMKLQotICAgIHB1YmxpYyB2b2lkIGFkZEpvaW5SZWZlcmVuY2UoVHJlZSBub2RlLCBDbWlzU2VsZWN0b3IgcmVmZXJlbmNlKSB7Ci0gICAgICAgIGNvbHVtblJlZmVyZW5jZXMucHV0KG5vZGUuZ2V0VG9rZW5TdGFydEluZGV4KCksIHJlZmVyZW5jZSk7Ci0gICAgICAgIGpvaW5SZWZlcmVuY2VzLmFkZChyZWZlcmVuY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNTZWxlY3Rvcj4gZ2V0Sm9pblJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGpvaW5SZWZlcmVuY2VzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRKb2luKFN0cmluZyBraW5kLCBTdHJpbmcgYWxpYXMsIGJvb2xlYW4gaGFzU3BlYykgewotICAgICAgICBKb2luU3BlYyBqb2luID0gbmV3IEpvaW5TcGVjKGtpbmQsIGFsaWFzKTsKLSAgICAgICAgaWYgKGhhc1NwZWMpIHsKLSAgICAgICAgICAgIC8vIGdldCBjb2x1bW5zIGZyb20gbGFzdCBhZGRlZCByZWZlcmVuY2VzCi0gICAgICAgICAgICBpbnQgbiA9IGpvaW5SZWZlcmVuY2VzLnNpemUoKTsKLSAgICAgICAgICAgIENvbHVtblJlZmVyZW5jZSBvbkxlZnQgPSAoQ29sdW1uUmVmZXJlbmNlKSBqb2luUmVmZXJlbmNlcy5nZXQobiAtIDIpOwotICAgICAgICAgICAgQ29sdW1uUmVmZXJlbmNlIG9uUmlnaHQgPSAoQ29sdW1uUmVmZXJlbmNlKSBqb2luUmVmZXJlbmNlcy5nZXQobiAtIDEpOwotICAgICAgICAgICAgam9pbi5zZXRTZWxlY3RvcnMob25MZWZ0LCBvblJpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICBqb2luU3BlY3MuYWRkKGpvaW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEpvaW5TcGVjPiBnZXRKb2lucygpIHsKLSAgICAgICAgcmV0dXJuIGpvaW5TcGVjczsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gV0hFUkUgcGFydAotCi0gICAgcHVibGljIHZvaWQgYWRkV2hlcmVSZWZlcmVuY2UoVHJlZSBub2RlLCBDbWlzU2VsZWN0b3IgcmVmZXJlbmNlKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiYWRkIG5vZGUgdG8gd2hlcmU6ICIgKyBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShub2RlKSk7Ci0gICAgICAgIGNvbHVtblJlZmVyZW5jZXMucHV0KG5vZGUuZ2V0VG9rZW5TdGFydEluZGV4KCksIHJlZmVyZW5jZSk7Ci0gICAgICAgIHdoZXJlUmVmZXJlbmNlcy5hZGQocmVmZXJlbmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDbWlzU2VsZWN0b3I+IGdldFdoZXJlUmVmZXJlbmNlcygpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qod2hlcmVSZWZlcmVuY2VzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaGVyZVR5cGVSZWZlcmVuY2UoVHJlZSBub2RlLCBTdHJpbmcgcXVhbGlmaWVyKSB7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGVSZWZlcmVuY2VzLnB1dChub2RlLmdldFRva2VuU3RhcnRJbmRleCgpLCBxdWFsaWZpZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIE9SREVSX0JZIHBhcnQKLQotICAgIHB1YmxpYyBMaXN0PFNvcnRTcGVjPiBnZXRPcmRlckJ5cygpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc29ydFNwZWNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTb3J0Q3JpdGVyaXVtKFRyZWUgbm9kZSwgQ29sdW1uUmVmZXJlbmNlIGNvbFJlZiwgYm9vbGVhbiBhc2NlbmRpbmcpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJhZGRTb3J0Q3JpdGVyaXVtOiAiICsgY29sUmVmICsgIiBhc2NlbmRpbmc6ICIgKyBhc2NlbmRpbmcpOwotICAgICAgICBjb2x1bW5SZWZlcmVuY2VzLnB1dChub2RlLmdldFRva2VuU3RhcnRJbmRleCgpLCBjb2xSZWYpOwotICAgICAgICBzb3J0U3BlY3MuYWRkKG5ldyBTb3J0U3BlYyhub2RlLmdldFRva2VuU3RhcnRJbmRleCgpLCBhc2NlbmRpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBpZiB0aGUgcXVlcnkgaGFzIGEgSk9JTiBmcm9tIG9uZSBwcmltYXJ5IHR5cGUgdG8gb25seSBzZWNvbmRhcnkKLSAgICAgKiB0eXBlcyAoVGhpcyBKT0lOIGRvZXMgbm90IHJlcXVpcmUgYSBKT0lOIGNhcGFiaWxpdHkgaW4gQ01JUykuCi0gICAgICogCi0gICAgICogQHJldHVybiBsaXN0IG9mIHNlY29uZGFyeSB0eXBlIGlkcyB0aGF0IGFyZSBqb2luZWQgb3IgbnVsbCBpZiB0aGUgcXVlcnkKLSAgICAgKiAgICAgICAgIGhhcyBubyBKT0lOcyBvciBoYXMgam9pbnMgdG8gcHJpbWFyeSB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uPiBnZXRKb2luZWRTZWNvbmRhcnlUeXBlcygpIHsKLSAgICAgICAgTGlzdDxUeXBlRGVmaW5pdGlvbj4gc2Vjb25kYXJ5VHlwZUlkcyA9IG5ldyBBcnJheUxpc3Q8VHlwZURlZmluaXRpb24+KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gZnJvbXMgPSBnZXRUeXBlcygpOwotICAgICAgICBpZiAoZnJvbXMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBubyBKT0lOIGluIHF1ZXJ5Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG1haW5UeXBlUXVlcnlOYW1lID0gZnJvbXMuZ2V0KGdldE1haW5UeXBlQWxpYXMoKSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5TmFtZSA6IGZyb21zLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0ZCA9IGdldFR5cGVEZWZpbml0aW9uRnJvbVF1ZXJ5TmFtZShxdWVyeU5hbWUpOwotICAgICAgICAgICAgaWYgKHF1ZXJ5TmFtZS5lcXVhbHMobWFpblR5cGVRdWVyeU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGQuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkpIHsKLSAgICAgICAgICAgICAgICBzZWNvbmRhcnlUeXBlSWRzLmFkZCh0ZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoSm9pblNwZWMgam9pbiA6IGdldEpvaW5zKCkpIHsKLSAgICAgICAgICAgIGlmICghKG51bGwgIT0gam9pbi5vbkxlZnQgJiYgbnVsbCAhPSBqb2luLm9uUmlnaHQgJiYgKChqb2luLm9uUmlnaHQuZ2V0UHJvcGVydHlJZCgpID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgam9pbi5vblJpZ2h0LmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkgJiYgam9pbi5vbkxlZnQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5SWQoKS5lcXVhbHMoUHJvcGVydHlJZHMuT0JKRUNUX0lEKSkgfHwgKGpvaW4ub25MZWZ0LmdldFByb3BlcnR5SWQoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGpvaW4ub25MZWZ0LmdldFR5cGVEZWZpbml0aW9uKCkuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkgJiYgam9pbi5vblJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eUlkKCkuZXF1YWxzKFByb3BlcnR5SWRzLk9CSkVDVF9JRCkpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Vjb25kYXJ5VHlwZUlkczsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gcmVzb2x2ZSB0eXBlcyBhZnRlciBmaXJzdCBwYXNzIHRyYXZlcnNpbmcgdGhlIEFTVCBpcyBjb21wbGV0ZQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVzb2x2ZVR5cGVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJGaXJzdCBwYXNzIG9mIHF1ZXJ5IHRyYXZlcnNhbCBpcyBjb21wbGV0ZSwgcmVzb2x2aW5nIHR5cGVzIik7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSB0eXBlTWdyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpcnN0IHJlc29sdmUgYWxsIGFsaWFzIG5hbWVzIGRlZmluZWQgaW4gU0VMRUNUOgotICAgICAgICAgICAgZm9yIChDbWlzU2VsZWN0b3IgYWxpYXMgOiBjb2xPckZ1bmNBbGlhcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChhbGlhcyBpbnN0YW5jZW9mIENvbHVtblJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIGFsaWFzKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVR5cGVGb3JBbGlhcyhjb2xSZWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhlbiByZXBsYWNlIGFsbCBhbGlhc2VzIHVzZWQgc29tZXdoZXJlIGJ5IHRoZWlyIHJlc29sdmVkIGNvbHVtbgotICAgICAgICAgICAgLy8gcmVmZXJlbmNlOgotICAgICAgICAgICAgZm9yIChJbnRlZ2VyIG9iaiA6IGNvbHVtblJlZmVyZW5jZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBDbWlzU2VsZWN0b3Igc2VsZWN0b3IgPSBjb2x1bW5SZWZlcmVuY2VzLmdldChvYmopOwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBzZWxlY3Rvci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbE9yRnVuY0FsaWFzLmNvbnRhaW5zS2V5KGtleSkpIHsgLy8gaXQgaXMgYW4gYWxpYXMKLSAgICAgICAgICAgICAgICAgICAgQ21pc1NlbGVjdG9yIHJlc29sdmVkUmVmZXJlbmNlID0gY29sT3JGdW5jQWxpYXMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbHVtblJlZmVyZW5jZXMucHV0KG9iaiwgcmVzb2x2ZWRSZWZlcmVuY2UpOwotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBeIFRoaXMgbWF5IHJlcGxhY2UgdGhlIHZhbHVlIGluIHRoZSBtYXAgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2FtZQotICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSwgYnV0IHRoaXMgZG9lcyBub3QgaGFybS4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgcmVzb2x2ZWQgb3Igbm90IHdoaWNoCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhdXNlcyB0d28gbW9yZSBpZnM6Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIENvbHVtblJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGNvbFJlZi5nZXRUeXBlRGVmaW5pdGlvbigpID09IG51bGwpIC8vIGl0IGlzIG5vdCB5ZXQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gLy8gcmVwbGFjZSB1bnJlc29sdmVkIGNvbHVtbiByZWZlcmVuY2UgYnkgcmVzb2x2ZWQgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gZnJvbQotICAgICAgICAgICAgICAgICAgICAvLyBhbGlhcyBtYXAKLSAgICAgICAgICAgICAgICAgICAgLy8gY29sdW1uUmVmZXJlbmNlcy5wdXQob2JqLAotICAgICAgICAgICAgICAgICAgICAvLyBjb2xPckZ1bmNBbGlhcy5nZXQoc2VsZWN0b3IuZ2V0QWxpYXNOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGNvbHVtblJlZmVyZW5jZXMucHV0KG9iaiwKLSAgICAgICAgICAgICAgICAgICAgLy8gY29sT3JGdW5jQWxpYXMuZ2V0KHNlbGVjdG9yLmdldEFsaWFzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGVyZVJlZmVyZW5jZXMucmVtb3ZlKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB1bnJlc29sdmVkIGJ5IHJlc29sdmVkIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVSZWZlcmVuY2VzLmFkZChyZXNvbHZlZFJlZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW5SZWZlcmVuY2VzLnJlbW92ZShzZWxlY3RvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdW5yZXNvbHZlZCBieSByZXNvbHZlZCByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5SZWZlcmVuY2VzLmFkZChyZXNvbHZlZFJlZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSByZXBsYWNlIGFsbCByZW1haW5pbmcgY29sdW1uIHJlZmVyZW5jZXMgbm90IHVzaW5nIGFuIGFsaWFzCi0gICAgICAgICAgICBmb3IgKENtaXNTZWxlY3RvciBzZWxlY3QgOiBjb2x1bW5SZWZlcmVuY2VzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGZ1bmN0aW9ucyBoZXJlCi0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdCBpbnN0YW5jZW9mIENvbHVtblJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgICAgICBDb2x1bW5SZWZlcmVuY2UgY29sUmVmID0gKChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2xSZWYuZ2V0VHlwZURlZmluaXRpb24oKSA9PSBudWxsKSB7IC8vIG5vdCB5ZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xSZWYuZ2V0UXVhbGlmaWVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVucXVhbGlmaWVkIHNlbGVjdDogU0VMRUNUIHAgRlJPTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVUeXBlRm9yQ29sdW1uUmVmZXJlbmNlKGNvbFJlZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1YWxpZmllZCBzZWxlY3Q6IFNFTEVDVCB0LnAgRlJPTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uUmVmZXJlbmNlQW5kUmVzb2x2ZVR5cGUoY29sUmVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVwbGFjZSB0eXBlcyB1c2VkIGFzIHF1YWxpZmllcnMgKElOX1RSRUUsIElOX0ZPTERFUiwKLSAgICAgICAgICAgIC8vIENPTlRBSU5TKSBieSB0aGVpciBjb3JyZXNwb25kaW5nIGFsaWFzIChjb3JyZWxhdGlvbiBuYW1lKQotICAgICAgICAgICAgZm9yIChFbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IGVuIDogdHlwZVJlZmVyZW5jZXMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIEludGVnZXIgb2JqID0gZW4uZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllciA9IGVuLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVRdWVyeU5hbWUgPSBnZXRSZWZlcmVuY2VkVHlwZVF1ZXJ5TmFtZShxdWFsaWZpZXIpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlUXVlcnlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNRdWVyeUV4Y2VwdGlvbihxdWFsaWZpZXIgKyAiIGlzIG5laXRoZXIgYSB0eXBlIHF1ZXJ5IG5hbWUgbm9yIGFuIGFsaWFzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodHlwZVF1ZXJ5TmFtZS5lcXVhbHMocXVhbGlmaWVyKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCBhbiBhbGlhcyBmb3IgaXQKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFsaWFzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGZyb21zLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cW4gPSBlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRxbi5lcXVhbHMocSkgJiYgdHlwZVF1ZXJ5TmFtZS5lcXVhbHModHFuKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzID0gcTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYWxpYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVJlZmVyZW5jZXMucHV0KG9iaiwgYWxpYXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc1F1ZXJ5RXhjZXB0aW9uIGNxZSkgewotICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3FlLmdldE1lc3NhZ2UoKTsgLy8gcHJlc2VydmUgbWVzc2FnZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBpbmRpY2F0ZSBhbiBlcnJvciB0byBBTlRMUiBzbyB0aGF0IGl0IGdlbmVyYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlc29sdmVUeXBlRm9yQWxpYXMoQ29sdW1uUmVmZXJlbmNlIGNvbFJlZikgewotICAgICAgICBTdHJpbmcgYWxpYXNOYW1lID0gY29sUmVmLmdldEFsaWFzTmFtZSgpOwotCi0gICAgICAgIGlmIChjb2xPckZ1bmNBbGlhcy5jb250YWluc0tleShhbGlhc05hbWUpKSB7Ci0gICAgICAgICAgICBDbWlzU2VsZWN0b3Igc2VsZWN0b3IgPSBjb2xPckZ1bmNBbGlhcy5nZXQoYWxpYXNOYW1lKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIENvbHVtblJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIGNvbFJlZiA9IChDb2x1bW5SZWZlcmVuY2UpIHNlbGVjdG9yOyAvLyBhbGlhcyB0YXJnZXQKLSAgICAgICAgICAgICAgICBpZiAoY29sUmVmLmdldFF1YWxpZmllcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdW5xdWFsaWZpZWQgc2VsZWN0OiBTRUxFQ1QgcCBGUk9NCi0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVUeXBlRm9yQ29sdW1uUmVmZXJlbmNlKGNvbFJlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcXVhbGlmaWVkIHNlbGVjdDogU0VMRUNUIHQucCBGUk9NCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQ29sdW1uUmVmZXJlbmNlQW5kUmVzb2x2ZVR5cGUoY29sUmVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBlbHNlIC0tPiBpZ25vcmUgRnVuY3Rpb25SZWZlcmVuY2UKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGZvciBhIHNlbGVjdCB4IGZyb20geSwgeiAuLi4gZmluZCB0aGUgdHlwZSBpbiB0eXBlIG1hbmFnZXIgZm9yIHgKLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNvbHZlVHlwZUZvckNvbHVtblJlZmVyZW5jZShDb2x1bW5SZWZlcmVuY2UgY29sUmVmKSB7Ci0gICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpOwotICAgICAgICBib29sZWFuIGlzU3RhciA9IHByb3BOYW1lLmVxdWFscygiKiIpOwotCi0gICAgICAgIC8vIGl0IGlzIHByb3BlcnR5IHF1ZXJ5IG5hbWUgd2l0aG91dCBhIHR5cGUsIHNvIGZpbmQgdHlwZQotICAgICAgICBpbnQgbm9Gb3VuZCA9IDA7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIHRkRm91bmQgPSBudWxsOwotCi0gICAgICAgIGlmIChpc1ByZWRmaW5lZFF1ZXJ5TmFtZShwcm9wTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoU3RyaW5nIHR5cGVRdWVyeU5hbWUgOiBmcm9tcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdGQgPSB0eXBlTWdyLmdldFR5cGVCeVF1ZXJ5TmFtZSh0eXBlUXVlcnlOYW1lKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHRkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNRdWVyeUV4Y2VwdGlvbih0eXBlUXVlcnlOYW1lICsgIiBpcyBuZWl0aGVyIGEgdHlwZSBxdWVyeSBuYW1lIG5vciBhbiBhbGlhcy4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdGFyKSB7Ci0gICAgICAgICAgICAgICAgKytub0ZvdW5kOwotICAgICAgICAgICAgICAgIHRkRm91bmQgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIGlmIChUeXBlVmFsaWRhdG9yLnR5cGVDb250YWluc1Byb3BlcnR5V2l0aFF1ZXJ5TmFtZSh0ZCwgcHJvcE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgKytub0ZvdW5kOwotICAgICAgICAgICAgICAgIHRkRm91bmQgPSB0ZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobm9Gb3VuZCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1F1ZXJ5RXhjZXB0aW9uKHByb3BOYW1lICsgIiBpcyBub3QgYSBwcm9wZXJ0eSBxdWVyeSBuYW1lIGluIGFueSBvZiB0aGUgdHlwZXMgaW4gZnJvbSAuLi4iKTsKLSAgICAgICAgfSBlbHNlIGlmIChub0ZvdW5kID4gMSAmJiAhaXNTdGFyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1F1ZXJ5RXhjZXB0aW9uKHByb3BOYW1lICsgIiBpcyBub3QgYSB1bmlxdWUgcHJvcGVydHkgcXVlcnkgbmFtZSB3aXRoaW4gdGhlIHR5cGVzIGluIGZyb20gLi4uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB0ZEZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVDb2x1bW5SZWZlcmVuY2VBbmRSZXNvbHZlVHlwZSh0ZEZvdW5kLCBjb2xSZWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcmVkZmluZWRRdWVyeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHByZWRlZmluZWRRdWVyeU5hbWVzLmNvbnRhaW5zKG5hbWUpOwotICAgIH0KLQotICAgIC8vIGZvciBhIHNlbGVjdCB4LnkgZnJvbSB4IC4uLiBjaGVjayB0aGF0IHggaGFzIHByb3BlcnR5IHkgYW5kIHRoYXQgeCBpcyBpbgotICAgIC8vIGZyb20KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbHVtblJlZmVyZW5jZUFuZFJlc29sdmVUeXBlKENvbHVtblJlZmVyZW5jZSBjb2xSZWYpIHsKLSAgICAgICAgLy8gZWl0aGVyIHNhbWUgbmFtZSBvciBtYXBwZWQgYWxpYXMKLSAgICAgICAgU3RyaW5nIHR5cGVRdWVyeU5hbWUgPSBnZXRSZWZlcmVuY2VkVHlwZVF1ZXJ5TmFtZShjb2xSZWYuZ2V0UXVhbGlmaWVyKCkpOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiB0ZCA9IHR5cGVNZ3IuZ2V0VHlwZUJ5UXVlcnlOYW1lKHR5cGVRdWVyeU5hbWUpOwotICAgICAgICBpZiAobnVsbCA9PSB0ZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNRdWVyeUV4Y2VwdGlvbihjb2xSZWYuZ2V0UXVhbGlmaWVyKCkgKyAiIGlzIG5laXRoZXIgYSB0eXBlIHF1ZXJ5IG5hbWUgbm9yIGFuIGFsaWFzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVDb2x1bW5SZWZlcmVuY2VBbmRSZXNvbHZlVHlwZSh0ZCwgY29sUmVmKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbHVtblJlZmVyZW5jZUFuZFJlc29sdmVUeXBlKFR5cGVEZWZpbml0aW9uIHRkLCBDb2x1bW5SZWZlcmVuY2UgY29sUmVmKSB7Ci0KLSAgICAgICAgLy8gdHlwZSBmb3VuZCwgY2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzCi0gICAgICAgIGJvb2xlYW4gaGFzUHJvcDsKLSAgICAgICAgaWYgKGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscygiKiIpKSB7Ci0gICAgICAgICAgICBoYXNQcm9wID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhc1Byb3AgPSBUeXBlVmFsaWRhdG9yLnR5cGVDb250YWluc1Byb3BlcnR5V2l0aFF1ZXJ5TmFtZSh0ZCwgY29sUmVmLmdldFByb3BlcnR5UXVlcnlOYW1lKCkpOwotICAgICAgICAgICAgaWYgKCFoYXNQcm9wICYmIHRkLmdldEJhc2VUeXBlSWQoKSA9PSBCYXNlVHlwZUlkLkNNSVNfU0VDT05EQVJZCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpLmVxdWFscyhQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpKSB7Ci0gICAgICAgICAgICAgICAgaGFzUHJvcCA9IHRydWU7IC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG9iamVjdCBpZCBvbiBzZWNvbmRhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZXMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvciBKT0lOUwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzUHJvcCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNRdWVyeUV4Y2VwdGlvbihjb2xSZWYuZ2V0UHJvcGVydHlRdWVyeU5hbWUoKSArICIgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgcXVlcnkgbmFtZSBpbiB0eXBlICIKLSAgICAgICAgICAgICAgICAgICAgKyB0ZC5nZXRJZCgpICsgIi4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbFJlZi5zZXRUeXBlRGVmaW5pdGlvbih0eXBlTWdyLmdldFByb3BlcnR5SWRGb3JRdWVyeU5hbWUodGQsIGNvbFJlZi5nZXRQcm9wZXJ0eVF1ZXJ5TmFtZSgpKSwgdGQpOwotICAgIH0KLQotICAgIC8vIHJldHVybiB0eXBlIHF1ZXJ5IG5hbWUgZm9yIGEgcmVmZXJlbmNlZCBjb2x1bW4gKHdoaWNoIGNhbiBiZSB0aGUgbmFtZQotICAgIC8vIGl0c2VsZiBvciBhbiBhbGlhcwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlZFR5cGVRdWVyeU5hbWUoU3RyaW5nIHF1YWxpZmllcikgewotICAgICAgICBTdHJpbmcgdHlwZVF1ZXJ5TmFtZSA9IGZyb21zLmdldChxdWFsaWZpZXIpOwotICAgICAgICBpZiAobnVsbCA9PSB0eXBlUXVlcnlOYW1lKSB7Ci0gICAgICAgICAgICAvLyBpZiBhbiBhbGlhcyB3YXMgZGVmaW5lZCBidXQgc3RpbGwgdGhlIG9yaWdpbmFsIGlzIHVzZWQgd2UgaGF2ZSB0bwotICAgICAgICAgICAgLy8gc2VhcmNoIGNhc2U6IFNFTEVDVCBULnAgRlJPTSBUIEFTIFRBbGlhcwotICAgICAgICAgICAgU3RyaW5nIHEgPSBudWxsOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgdHFuIDogZnJvbXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVyLmVxdWFscyh0cW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUXVlcnlFeGNlcHRpb24ocXVhbGlmaWVyICsgIiBpcyBhbiBhbWJpZ3VvdXMgdHlwZSBxdWVyeSBuYW1lLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHEgPSB0cW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZVF1ZXJ5TmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9RdWVyeVV0aWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvUXVlcnlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTcyOWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9RdWVyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeS5DbWlzUWxTdHJpY3RQYXJzZXJfQ21pc0Jhc2VHcmFtbWFyLnF1ZXJ5X3JldHVybjsKLQotLyoqCi0gKiBTdXBwb3J0IGNsYXNzIHRvIGFzc2lzdCBpbiBwYXJzaW5nIGFuZCBwcm9jZXNzaW5nIENNSVMgcXVlcmllcy4KLSAqIFRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSBRdWVyeVV0aWxCYXNlIHRvIHVzZSB0aGUgZXJyb3IgaGFuZGxpbmcKLSAqIG1ldGhvZHMuIEl0IGRvZXMgbm90IGZvbGxvdyBpdHMgZGVzaWduIGFuZCBpcyBvbmx5IG1haW50YWluZWQgZm9yCi0gKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAqIAotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBRdWVyeVV0aWxCYXNlfSBpbnN0ZWFkLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFF1ZXJ5VXRpbCBleHRlbmRzIFF1ZXJ5VXRpbEJhc2U8Q21pc1F1ZXJ5V2Fsa2VyPiB7Ci0gICAgCi0gICAgcHVibGljIFF1ZXJ5VXRpbCgpIHsKLSAgICAgICAgc3VwZXIobnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb21tb25UcmVlIHBhcnNlU3RhdGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLCB1c2UgZ2V0V2Fsa2VyIHRvIHBhcnNlIGEgcXVlcnkgdXNpbmcgdGhpcyBsZWdhY3kgY2xhc3MuIik7ICAgICAgICAKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3YWxrU3RhdGVtZW50KCkgdGhyb3dzIENtaXNRdWVyeUV4Y2VwdGlvbiwgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQsIHVzZSBnZXRXYWxrZXIgdG8gcGFyc2UgYSBxdWVyeSB1c2luZyB0aGlzIGxlZ2FjeSBjbGFzcy4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIENNSVNRTCBzdGF0ZW1lbnQgYW5kIHJldHVybiBhIHRyZWUgdGhhdCBjYW4gYmUgd2Fsa2VkIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uCi0gICAgICogb2YgdGhlIHF1ZXJ5ICh1c3VhbGx5IG5vdCB1c2VkIGRpcmVjdGx5IGJ1dCB0aHJvdWdoIHRyYXZlcnNlU3RhdGVtZW50KQotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGF0ZW1lbnQKLSAgICAgKiAgICAgIENNSVNRTCBzdGF0ZW1lbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgICBhbiBBbnRMUiB0cmVlIGdyYW1tYXIgdGhhdCBjYW4gYmUgdHJhdmVyc2VkIHRvIGV2YWx1YXRlIHRoZSBxdWVyeQotICAgICAqICAgICAgCi0gICAgICogQHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ21pc1F1ZXJ5V2Fsa2VyIGdldFdhbGtlcihTdHJpbmcgc3RhdGVtZW50KSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICBDaGFyU3RyZWFtIGlucHV0ID0gbmV3IEFOVExSU3RyaW5nU3RyZWFtKHN0YXRlbWVudCk7Ci0gICAgICAgIENtaXNRbFN0cmljdExleGVyIGxleGVyID0gbmV3IENtaXNRbFN0cmljdExleGVyKGlucHV0KTsKLSAgICAgICAgVG9rZW5TdHJlYW0gdG9rZW5zID0gbmV3IENvbW1vblRva2VuU3RyZWFtKGxleGVyKTsKLSAgICAgICAgQ21pc1FsU3RyaWN0UGFyc2VyIHBhcnNlciA9IG5ldyBDbWlzUWxTdHJpY3RQYXJzZXIodG9rZW5zKTsKLSAgICAgICAgQ29tbW9uVHJlZSBwYXJzZXJUcmVlOyAvLyB0aGUgQU5UTFIgdHJlZSBhZnRlciBwYXJzaW5nIHBoYXNlCi0KLSAgICAgICAgcXVlcnlfcmV0dXJuIHBhcnNlZFN0YXRlbWVudCA9IHBhcnNlci5xdWVyeSgpOwotICAgICAgICBpZiAobGV4ZXIuaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKGxleGVyLmdldEVycm9yTWVzc2FnZXMoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmhhc0Vycm9ycygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihwYXJzZXIuZ2V0RXJyb3JNZXNzYWdlcygpKTsKLSAgICAgICAgfSBlbHNlIGlmICggdG9rZW5zLmluZGV4KCkhPXRva2Vucy5zaXplKCkgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlF1ZXJ5IFN0cmluZyBoYXMgaWxsZWdhbCB0b2tlbnMgYWZ0ZXIgZW5kIG9mIHN0YXRlbWVudDogIiArIHRva2Vucy5nZXQodG9rZW5zLmluZGV4KCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcGFyc2VyVHJlZSA9IChDb21tb25UcmVlKSBwYXJzZWRTdGF0ZW1lbnQuZ2V0VHJlZSgpOwotCi0gICAgICAgIENvbW1vblRyZWVOb2RlU3RyZWFtIG5vZGVzID0gbmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKHBhcnNlclRyZWUpOwotICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpOwotICAgICAgICBDbWlzUXVlcnlXYWxrZXIgd2Fsa2VyID0gbmV3IENtaXNRdWVyeVdhbGtlcihub2Rlcyk7Ci0gICAgICAgIHJldHVybiB3YWxrZXI7ICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBwcm9jZXNzIGEgQ01JU1FMIHN0YXRlbWVudCB1c2luZyB0aGUgaGlnaGVyIGxldmVsIHN1cHBvcnQgY2xhc3NlcwotICAgICAqIAotICAgICAqIEBwYXJhbSBzdGF0ZW1lbnQKLSAgICAgKiAgICAgIENNSVNRTCBzdGF0ZW1lbnQKLSAgICAgKiBAcGFyYW0gcXVlcnlPYmoKLSAgICAgKiAgICAgIENNSVMgcXVlcnkgb2JqZWN0IGZpbGxlZCB3aXRoIGluZm9ybWF0aW9uIHdoYXQgZGF0YSBuZWVkIHRvIGJlIHJldHJpZXZlZAotICAgICAqIEBwYXJhbSBwdwotICAgICAqICAgICAgcHJlZGljYXRlIHdhbGtlciB0aGF0IGV2YWx1YXRlcyB0aGUgd2hlcmUgY2xhdXNlCi0gICAgICogQHJldHVybgotICAgICAqICAgICAgQW50TFIgdHJlZSBncmFtbWFyIGNyZWF0ZWQgYnkgdGhpcyBzdGF0ZW1lbnQKLSAgICAgKiAgICAgIAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIENtaXNRdWVyeVdhbGtlciB0cmF2ZXJzZVN0YXRlbWVudChTdHJpbmcgc3RhdGVtZW50LCBRdWVyeU9iamVjdCBxdWVyeU9iaiwgUHJlZGljYXRlV2Fsa2VyQmFzZSBwdykKLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUmVjb2duaXRpb25FeGNlcHRpb24gewotICAgICAgICB3YWxrZXIgPSBnZXRXYWxrZXIoc3RhdGVtZW50KTsKLSAgICAgICAgd2Fsa2VyLnF1ZXJ5KHF1ZXJ5T2JqLCBwdyk7Ci0gICAgICAgIHdhbGtlci5nZXRXaGVyZVByZWRpY2F0ZVRyZWUoKTsKLSAgICAgICAgcmV0dXJuIHdhbGtlcjsgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzUXVlcnlXYWxrZXIgdHJhdmVyc2VTdGF0ZW1lbnRBbmRDYXRjaEV4YyhTdHJpbmcgc3RhdGVtZW50LCBRdWVyeU9iamVjdCBxdWVyeU9iaiwgUHJlZGljYXRlV2Fsa2VyQmFzZSBwdykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRyYXZlcnNlU3RhdGVtZW50KHN0YXRlbWVudCwgcXVlcnlPYmosIHB3KTsKLSAgICAgICAgfSBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gcXVlcnlPYmouZ2V0RXJyb3JNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiV2Fsa2luZyBvZiBzdGF0ZW1lbnQgZmFpbGVkIHdpdGggUmVjb2duaXRpb25FeGNlcHRpb24gZXJyb3I6IFxuICAgIiArIGVycm9yTXNnLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJXYWxraW5nIG9mIHN0YXRlbWVudCBmYWlsZWQgd2l0aCBleGNlcHRpb246IFxuICAgIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvUXVlcnlVdGlsQmFzZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9RdWVyeVV0aWxCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWFkMmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9RdWVyeVV0aWxCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5OwotCi1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQmFzZVJlY29nbml6ZXI7Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuVHJlZVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoZWxwIHBhcnNpbmcgYW5kIHByb2Nlc3NpbmcgYSBxdWVyeSBzdGF0ZW1lbnQgdXNpbmcgdGhlCi0gKiBBbnRMUiBwYXJzZXIgU3ViY2xhc3NlcyBoYXZlIHRvIGltcGxlbWVudCBtZXRob2RzIHRoYXQgc2V0dXAgcGFyc2VyIGFuZCBxdWVyeQotICogd2Fsa2VyIGFuZCBwYXJzZSBhbmQgcHJvY2VzcyBhIHF1ZXJ5LiBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbW1vbiBtZXRob2RzIGZvcgotICogZXJyb3IgaGFuZGxpbmcgYW5kIGZvciBzdG9yaW5nIHRoZSBuZWNlc3Nhcnkgb3BlbmNtaXMgb2JqZWN0cyBmb3IgcXVlcnkKLSAqIHN1cHBvcnQKLSAqIAotICogQHBhcmFtIDxUPgotICogICAgICAgICAgICBBbnRMUiB0cmVlIGdyYW1tYXIsIHdpbGwgdXN1YWxseSBiZSBhIENtaXNRdWVyeVdhbGtlciBidXQgY2FuIGJlCi0gKiAgICAgICAgICAgIGN1c3RvbSBjbGFzcyBmb3IgY3VzdG9taXplZCAoZXh0ZW5kZWQpIHBhcnNlcnMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFF1ZXJ5VXRpbEJhc2U8VCBleHRlbmRzIFRyZWVQYXJzZXI+IHsKLQotICAgIHByb3RlY3RlZCBUIHdhbGtlcjsKLSAgICBwcm90ZWN0ZWQgUXVlcnlPYmplY3QgcXVlcnlPYmo7Ci0gICAgcHJvdGVjdGVkIFByZWRpY2F0ZVdhbGtlckJhc2UgcHJlZGljYXRlV2Fsa2VyOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RhdGVtZW50OwotCi0gICAgcHJvdGVjdGVkIENvbW1vblRyZWUgcGFyc2VyVHJlZTsgLy8gdGhlIEFOVExSIHRyZWUgYWZ0ZXIgcGFyc2luZyBwaGFzZQotICAgIHByb3RlY3RlZCBUb2tlblN0cmVhbSB0b2tlbnM7IC8vIHRoZSBBTlRMUiB0b2tlbiBzdHJlYW0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIGZpcnN0IHBoYXNlIG9mIHF1ZXJ5IHByb2Nlc3NpbmcuIFNldHVwIGxleGVyIGFuZCBwYXJzZXIsCi0gICAgICogcGFyc2UgdGhlIHN0YXRlbWVudCwgY2hlY2sgZm9yIHN5bnRheCBlcnJvcnMgYW5kIGNyZWF0ZSBhbiBBU1QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZSBvZiB0aGUgcGFyc2VkIHN0YXRlbWVudAotICAgICAqIAotICAgICAqIEB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29tbW9uVHJlZSBwYXJzZVN0YXRlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gdGhlIHNlY29uZCBwaGFzZSBvZiBxdWVyeSBwcm9jZXNzaW5nLCBhbmFseXplcyB0aGUgc2VsZWN0IHBhcnQsCi0gICAgICogY2hlY2sgZm9yIHNlbWFudGljIGVycm9ycywgZmlsbCB0aGUgcXVlcnkgb2JqZWN0LiBVc3VhbGx5IGEgd2Fsa2VyIHdpbGwKLSAgICAgKiBiZSBDbWlzUXVlcnlXYWxrZXIgKG9yIHN1YmNsYXNzKSBpZiB0aGUgc3VwcG9ydGluZyBPcGVuQ01JUyBxdWVyeSBjbGFzc2VzCi0gICAgICogYXJlIHVzZWQuCi0gICAgICogCi0gICAgICogQHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdhbGtTdGF0ZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBGdWxseSBwcm9jZXNzIGEgcXVlcnkgYnkgcGFyc2luZyBhbmQgd2Fsa2luZyBpdCBhbmQgc2V0dGluZyB1cCB0aGUKLSAgICAgKiBzdXBwb3J0aW5nIG9iamVjdHMKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1N0YXRlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHBhcnNlU3RhdGVtZW50KCk7Ci0gICAgICAgIHdhbGtTdGF0ZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUXVlcnlVdGlsQmFzZShTdHJpbmcgc3RhdGVtZW50LCBUeXBlTWFuYWdlciB0bSwgUHJlZGljYXRlV2Fsa2VyQmFzZSBwdykgewotICAgICAgICB3YWxrZXIgPSBudWxsOwotICAgICAgICBxdWVyeU9iaiA9IG5ldyBRdWVyeU9iamVjdCh0bSk7Ci0gICAgICAgIHByZWRpY2F0ZVdhbGtlciA9IHB3OwotICAgICAgICB0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVCBnZXRXYWxrZXIoKSB7Ci0gICAgICAgIHJldHVybiB3YWxrZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFByZWRpY2F0ZVdhbGtlckJhc2UgZ2V0UHJlZGljYXRlV2Fsa2VyKCkgewotICAgICAgICByZXR1cm4gcHJlZGljYXRlV2Fsa2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBRdWVyeU9iamVjdCBnZXRRdWVyeU9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJ5T2JqOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGVtZW50KCkgewotICAgICAgICByZXR1cm4gc3RhdGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhbWUgYXMgdHJhdmVyc2VTdGF0ZW1lbnQgYnV0IHRocm93cyBvbmx5IENNSVMgRXhjZXB0aW9ucwotICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1N0YXRlbWVudFVzaW5nQ21pc0V4Y2VwdGlvbnMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9jZXNzU3RhdGVtZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBlcnJvck1zZyA9IHF1ZXJ5T2JqLmdldEVycm9yTWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIldhbGtpbmcgb2Ygc3RhdGVtZW50IGZhaWxlZCB3aXRoIFJlY29nbml0aW9uRXhjZXB0aW9uIGVycm9yOiBcbiAgICIKLSAgICAgICAgICAgICAgICAgICAgKyBlcnJvck1zZywgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiV2Fsa2luZyBvZiBzdGF0ZW1lbnQgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiBcbiAgICIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoUmVjb2duaXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICBpZiAobnVsbCA9PSB3YWxrZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKHdhbGtlciwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIsIFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3RyaW5nW10gdG9rZW5OYW1lcyA9IHJlY29nbml6ZXIuZ2V0VG9rZW5OYW1lcygpOwotICAgICAgICBTdHJpbmcgaGRyID0gIkxpbmUgIiArIGUubGluZSArICI6IiArIGUuY2hhclBvc2l0aW9uSW5MaW5lOwotICAgICAgICBTdHJpbmcgbXNnID0gcmVjb2duaXplci5nZXRFcnJvck1lc3NhZ2UoZSwgdG9rZW5OYW1lcyk7Ci0gICAgICAgIHJldHVybiBoZHIgKyAiICIgKyBtc2c7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9RdWVyeVV0aWxTdHJpY3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvUXVlcnlVdGlsU3RyaWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTQ4MTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9RdWVyeVV0aWxTdHJpY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC5xdWVyeTsKLQotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLnRyZWUuQ29tbW9uVHJlZU5vZGVTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQuVHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnkuQ21pc1FsU3RyaWN0UGFyc2VyLnJvb3RfcmV0dXJuOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlVdGlsU3RyaWN0IGV4dGVuZHMgUXVlcnlVdGlsQmFzZTxDbWlzUXVlcnlXYWxrZXI+IHsKLQotICAgIC8qIHRoZSBBTlRMUiB0cmVlIGFmdGVyIHBhcnNpbmcgcGhhc2UgKi8KLSAgICBwcml2YXRlIENvbW1vblRyZWUgcGFyc2VyVHJlZTsKLSAgICAvKiB0aGUgQU5UTFIgdG9rZW4gc3RyZWFtICovCi0gICAgcHJpdmF0ZSBUb2tlblN0cmVhbSB0b2tlbnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlRnVsbHRleHQgPSB0cnVlOwotCi0gICAgcHVibGljIFF1ZXJ5VXRpbFN0cmljdChTdHJpbmcgc3RhdGVtZW50LCBUeXBlTWFuYWdlciB0bSwgUHJlZGljYXRlV2Fsa2VyQmFzZSBwdykgewotICAgICAgICBzdXBlcihzdGF0ZW1lbnQsIHRtLCBwdyk7Ci0gICAgfQotCi0gICAgcHVibGljIFF1ZXJ5VXRpbFN0cmljdChTdHJpbmcgc3RhdGVtZW50LCBUeXBlTWFuYWdlciB0bSwgUHJlZGljYXRlV2Fsa2VyQmFzZSBwdywgYm9vbGVhbiBwYXJzZUZ1bGx0ZXh0KSB7Ci0gICAgICAgIHN1cGVyKHN0YXRlbWVudCwgdG0sIHB3KTsKLSAgICAgICAgdGhpcy5wYXJzZUZ1bGx0ZXh0ID0gcGFyc2VGdWxsdGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29tbW9uVHJlZSBwYXJzZVN0YXRlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIENoYXJTdHJlYW0gaW5wdXQgPSBuZXcgQU5UTFJTdHJpbmdTdHJlYW0oc3RhdGVtZW50KTsKLSAgICAgICAgQ21pc1FsU3RyaWN0TGV4ZXIgbGV4ZXIgPSBuZXcgQ21pc1FsU3RyaWN0TGV4ZXIoaW5wdXQpOwotICAgICAgICB0b2tlbnMgPSBuZXcgQ29tbW9uVG9rZW5TdHJlYW0obGV4ZXIpOwotICAgICAgICBDbWlzUWxTdHJpY3RQYXJzZXIgcGFyc2VyID0gbmV3IENtaXNRbFN0cmljdFBhcnNlcih0b2tlbnMpOwotCi0gICAgICAgIHJvb3RfcmV0dXJuIHBhcnNlZFN0YXRlbWVudCA9IHBhcnNlci5yb290KCk7Ci0gICAgICAgIGlmIChsZXhlci5oYXNFcnJvcnMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obGV4ZXIuZ2V0RXJyb3JNZXNzYWdlcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJzZXIuaGFzRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHBhcnNlci5nZXRFcnJvck1lc3NhZ2VzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyc2VyVHJlZSA9IChDb21tb25UcmVlKSBwYXJzZWRTdGF0ZW1lbnQuZ2V0VHJlZSgpOwotICAgICAgICByZXR1cm4gcGFyc2VyVHJlZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3YWxrU3RhdGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobnVsbCA9PSBwYXJzZXJUcmVlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1F1ZXJ5RXhjZXB0aW9uKCJZb3UgbXVzdCBwYXJzZSB0aGUgcXVlcnkgYmVmb3JlIHlvdSBjYW4gd2FsayBpdC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbW1vblRyZWVOb2RlU3RyZWFtIG5vZGVzID0gbmV3IENvbW1vblRyZWVOb2RlU3RyZWFtKHBhcnNlclRyZWUpOwotICAgICAgICBub2Rlcy5zZXRUb2tlblN0cmVhbSh0b2tlbnMpOwotICAgICAgICB3YWxrZXIgPSBuZXcgQ21pc1F1ZXJ5V2Fsa2VyKG5vZGVzKTsKLSAgICAgICAgd2Fsa2VyLnNldERvRnVsbFRleHRQYXJzZShwYXJzZUZ1bGx0ZXh0KTsKLSAgICAgICAgd2Fsa2VyLnF1ZXJ5KHF1ZXJ5T2JqLCBwcmVkaWNhdGVXYWxrZXIpOwotICAgICAgICB3YWxrZXIuZ2V0V2hlcmVQcmVkaWNhdGVUcmVlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1N0cmluZ1V0aWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvU3RyaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDI5ZWUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvU3RyaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5Ow0KLQ0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdVdGlsIHsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmdVdGlsKCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZW1vdmVzIGFsbCBlc2NhcGUgc2VxdWVuY2VzIGluIGEgc3RyaW5nIGFuZCByZXR1cm4gdW5lc2NhcGVkIHN0cmluZw0KLSAgICAgKiBlc2NhcGUgY2hhcmFjdGVyIGlzIGJhY2tzbGFzaCBcLCBzbyBcXCAtLT4gXCwgXCcgLS0+ICcgYWRkaXRpb25hbCBlc2NhcGVkDQotICAgICAqIGNoYXJhY3RlcnMgY2FuIGJlIGFsbG93ZWQgaW4gZXNjYXBlZENoYXJzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGxpdGVyYWwNCi0gICAgICogICAgICAgICAgICBTdHJpbmcgdG8gdW5lc2NhcGUNCi0gICAgICogQHBhcmFtIGVzY2FwZWRDaGFycw0KLSAgICAgKiAgICAgICAgICAgIHNldCBvZiBhbGxvd2VkIGNoYXJhY3RlcnMgdG8gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCBpZg0KLSAgICAgKiAgICAgICAgICAgIHNldCB0byBudWxsIHRoZW4gJyAocXVvdGUpIGFuZCBcIChiYWNrc2xhc2gpIGFyZSBhbGxvd2VkIHRvIGJlDQotICAgICAqICAgICAgICAgICAgZXNjYXBlZA0KLSAgICAgKiBAcmV0dXJuIHVuZXNjYXBlZCBsaXRlcmFsIG9yIG51bGwgaWYgdGhlIGxpdGVyYWwgaXMgaWxsZWdhbA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIGxpdGVyYWwsIFN0cmluZyBlc2NhcGVkQ2hhcnMpIHsNCi0gICAgICAgIGNoYXIgYyA9ICc/JzsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KLQ0KLSAgICAgICAgaWYgKG51bGwgPT0gZXNjYXBlZENoYXJzKSB7DQotICAgICAgICAgICAgZXNjYXBlZENoYXJzID0gIlxcJyI7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobnVsbCA9PSBsaXRlcmFsKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpbnQgbGVuID0gbGl0ZXJhbC5sZW5ndGgoKTsNCi0NCi0gICAgICAgIGlmIChsZW4gPT0gMSAmJiBsaXRlcmFsLmNoYXJBdCgwKSA9PSAnXFwnKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobGVuID4gMSAmJiBsaXRlcmFsLmNoYXJBdChsZW4gLSAyKSAhPSAnXFwnICYmIGxpdGVyYWwuY2hhckF0KGxlbiAtIDEpID09ICdcXCcpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgew0KLSAgICAgICAgICAgIGMgPSBsaXRlcmFsLmNoYXJBdChpKTsNCi0gICAgICAgICAgICBpZiAoYyA9PSAnXFwnKSB7DQotICAgICAgICAgICAgICAgIGNoYXIgZXNjQ2hhciA9IGxpdGVyYWwuY2hhckF0KGkgKyAxKTsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXNjYXBlZENoYXJzLmxlbmd0aCgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChlc2NDaGFyID09IGVzY2FwZWRDaGFycy5jaGFyQXQoaikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXNjQ2hhcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgKytpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobGl0ZXJhbC5jaGFyQXQoaSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9BYnN0cmFjdEJpbmRpbmdDbWlzU2VydmljZVdyYXBwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9BYnN0cmFjdEJpbmRpbmdDbWlzU2VydmljZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ0MjM1ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3dyYXBwZXIvQWJzdHJhY3RCaW5kaW5nQ21pc1NlcnZpY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LndyYXBwZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5EYXRlVGltZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IHNlcnZpY2Ugd3JhcHBlciBpcyBpbnRlbmRlZCBmb3IgbWFuaXB1bGF0aW5nIGFuZCByZXBsYWNpbmcKLSAqIHNlcnZlciByZXNwb25zZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJpbmRpbmdDbWlzU2VydmljZVdyYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlciB7Ci0KLSAgICBwcml2YXRlIFByb2dyZXNzIGJlZm9yZUNhbGwgPSBQcm9ncmVzcy5DT05USU5VRTsKLSAgICBwcml2YXRlIFByb2dyZXNzIGFmdGVyQ2FsbCA9IFByb2dyZXNzLkNPTlRJTlVFOwotCi0gICAgcHVibGljIEFic3RyYWN0QmluZGluZ0NtaXNTZXJ2aWNlV3JhcHBlcihDbWlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHN1cGVyKHNlcnZpY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQcm9ncmVzcyBiZWZvcmVTZXJ2aWNlQ2FsbCgpIHsKLSAgICAgICAgcmV0dXJuIGJlZm9yZUNhbGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFByb2dyZXNzIGFmdGVyU2VydmljZUNhbGwoKSB7Ci0gICAgICAgIHJldHVybiBhZnRlckNhbGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBzZXJ2ZXIgZnJhbWV3b3JrIHNob3VsZCBjb250aW51ZSBiZWZvcmUgdGhlIHNlcnZpY2UgaXMKLSAgICAgKiBjYWxsZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2dyZXNzCi0gICAgICogICAgICAgICAgICB7QGxpbmsgUHJvZ3Jlc3MjQ09OVElOVUV9IGlmIHRoZSBzZXJ2ZXIgZnJhbWV3b3JrIHNob3VsZAotICAgICAqICAgICAgICAgICAgY29udGludWUsIHtAbGluayBQcm9ncmVzcyNTVE9QfSBpZiB0aGUgc2VydmVyIGZyYW1ld29yayBzaG91bGQKLSAgICAgKiAgICAgICAgICAgIHN0b3AKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWZvcmVTZXJ2aWNlQ2FsbChQcm9ncmVzcyBwcm9ncmVzcykgewotICAgICAgICBiZWZvcmVDYWxsID0gcHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB3aGV0aGVyIHRoZSBzZXJ2ZXIgZnJhbWV3b3JrIHNob3VsZCBjb250aW51ZSBhZnRlciB0aGUgc2VydmljZSBpcwotICAgICAqIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvZ3Jlc3MKLSAgICAgKiAgICAgICAgICAgIHtAbGluayBQcm9ncmVzcyNDT05USU5VRX0gaWYgdGhlIHNlcnZlciBmcmFtZXdvcmsgc2hvdWxkCi0gICAgICogICAgICAgICAgICBjb250aW51ZSwge0BsaW5rIFByb2dyZXNzI1NUT1B9IGlmIHRoZSBzZXJ2ZXIgZnJhbWV3b3JrIHNob3VsZAotICAgICAqICAgICAgICAgICAgc3RvcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyU2VydmljZUNhbGwoUHJvZ3Jlc3MgcHJvZ3Jlc3MpIHsKLSAgICAgICAgYWZ0ZXJDYWxsID0gcHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZyB0eXBlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGJpbmRpbmcgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nVHlwZSBnZXRCaW5kaW5nVHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIGJpbmRpbmcgPSBnZXRDYWxsQ29udGV4dCgpLmdldEJpbmRpbmcoKTsKLQotICAgICAgICBpZiAoQ2FsbENvbnRleHQuQklORElOR19BVE9NUFVCLmVxdWFscyhiaW5kaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIEJpbmRpbmdUeXBlLkFUT01QVUI7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ2FsbENvbnRleHQuQklORElOR19CUk9XU0VSLmVxdWFscyhiaW5kaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIEJpbmRpbmdUeXBlLkJST1dTRVI7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ2FsbENvbnRleHQuQklORElOR19XRUJTRVJWSUNFUy5lcXVhbHMoYmluZGluZykpIHsKLSAgICAgICAgICAgIHJldHVybiBCaW5kaW5nVHlwZS5XRUJTRVJWSUNFUzsKLSAgICAgICAgfSBlbHNlIGlmIChDYWxsQ29udGV4dC5CSU5ESU5HX0xPQ0FMLmVxdWFscyhiaW5kaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIEJpbmRpbmdUeXBlLkxPQ0FMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJpbmRpbmdUeXBlLkNVU1RPTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQotICAgICAqICAgICAgICAgYmluZGluZyBpcyBhIG5vbi1IVFRQIGJpbmRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpIHsKLSAgICAgICAgcmV0dXJuIChIdHRwU2VydmxldFJlcXVlc3QpIGdldENhbGxDb250ZXh0KCkuZ2V0KENhbGxDb250ZXh0LkhUVFBfU0VSVkxFVF9SRVFVRVNUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQotICAgICAqICAgICAgICAgYmluZGluZyBpcyBhIG5vbi1IVFRQIGJpbmRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZSBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldENhbGxDb250ZXh0KCkuZ2V0KENhbGxDb250ZXh0LkhUVFBfU0VSVkxFVF9SRVNQT05TRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHJlcXVlc3QgaGVhZGVyIHZhbHVlIGFzIFN0cmluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGhlYWRlciBuYW1lCi0gICAgICogQHJldHVybiB0aGUgaGVhZGVyIHZhbHVlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgaGVhZGVyIGlzbid0IHNldCBvciBpZgotICAgICAqICAgICAgICAgdGhlIGJpbmRpbmcgaXMgYSBub24tSFRUUCBiaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0SGVhZGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEgPSBnZXRIdHRwU2VydmxldFJlcXVlc3QoKTsKLSAgICAgICAgaWYgKHJlcSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXEuZ2V0SGVhZGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSByZXF1ZXN0IGhlYWRlciB2YWx1ZSBhcyBEYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWFkZXIgdmFsdWUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBoZWFkZXIgaXNuJ3Qgc2V0IG9yIGlmCi0gICAgICogICAgICAgICB0aGUgYmluZGluZyBpcyBhIG5vbi1IVFRQIGJpbmRpbmcgb3IgaWYgdGhlIGRhdGUgY2Fubm90IGJlIHBhcnNlZAotICAgICAqLwotICAgIHB1YmxpYyBEYXRlIGdldERhdGVSZXF1ZXN0SGVhZGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBEYXRlVGltZUhlbHBlci5wYXJzZUh0dHBEYXRlVGltZShnZXRSZXF1ZXN0SGVhZGVyKG5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgU3RyaW5nIHJlc3BvbnNlIGhlYWRlci4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgYmluZGluZyBpcyBhIG5vbi1IVFRQIGJpbmRpbmcsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGhlYWRlciBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3AgPSBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCk7Ci0gICAgICAgIGlmIChyZXNwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3Auc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBEYXRlIHJlc3BvbnNlIGhlYWRlci4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgYmluZGluZyBpcyBhIG5vbi1IVFRQIGJpbmRpbmcsIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIGhlYWRlciBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgaGVhZGVyIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VIZWFkZXIoU3RyaW5nIG5hbWUsIERhdGUgdmFsdWUpIHsKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwID0gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpOwotICAgICAgICBpZiAocmVzcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwLnNldEhlYWRlcihuYW1lLCBEYXRlVGltZUhlbHBlci5mb3JtYXRIdHRwRGF0ZVRpbWUodmFsdWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSBwcm92aWRlZCBkYXRlIHdpdGggdGhlICJJZi1Nb2RpZmllZC1TaW5jZSIgSFRUUCBoZWFkZXIgKGlmCi0gICAgICogcHJlc2VudCkgYW5kIHJldHVybnMgd2hldGhlciB0aGUgcmVzb3VyY2UgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LgotICAgICAqIAotICAgICAqIEBwYXJhbSBkYXRlCi0gICAgICogICAgICAgICAgICBkYXRlIHRvIGNvbXBhcmUgdGhlICJJZi1Nb2RpZmllZC1TaW5jZSIgSFRUUCBoZWFkZXIgdG8KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgIklmLU1vZGlmaWVkLVNpbmNlIiBIVFRQIGhlYWRlciBpcyBzZXQgYW5kICwKLSAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOb3RNb2RpZmllZChEYXRlIGRhdGUpIHsKLSAgICAgICAgaWYgKGRhdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgRGF0ZSBtb2RpZmllZFNpbmNlID0gZ2V0RGF0ZVJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIik7Ci0gICAgICAgIGlmIChtb2RpZmllZFNpbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgZGF0ZVNlY3MgPSAobG9uZykgTWF0aC5mbG9vcigoZG91YmxlKSBkYXRlLmdldFRpbWUoKSAvIDEwMDApOwotICAgICAgICBsb25nIG1vZGlmaWVkU2luY2VTZWNzID0gKGxvbmcpIE1hdGguZmxvb3IoKGRvdWJsZSkgbW9kaWZpZWRTaW5jZS5nZXRUaW1lKCkgLyAxMDAwKTsKLQotICAgICAgICByZXR1cm4gZGF0ZVNlY3MgPiBtb2RpZmllZFNpbmNlU2VjczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3dyYXBwZXIvQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9BYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2QwZjE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9BYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BbGxvd2FibGVBY3Rpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkZhaWxlZFRvRGVsZXRlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVuZGl0aW9uRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWNsUHJvcGFnYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5PYmplY3RJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyLlByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBDTUlTIHNlcnZpY2Ugd3JhcHBlci4KLSAqIDxwPgotICogQWxsIHNlcnZpY2Ugd3JhcHBlcnMgbWFuYWdlZCBieSB7QGxpbmsgQ21pc1NlcnZpY2VXcmFwcGVyTWFuYWdlcn0gbXVzdCBiZQotICogZGVyaXZlZCBmcm9tIHRoaXMgY2xhc3MgYW5kIG11c3QgcHJvdmlkZSBhIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYQotICoge0BsaW5rIENtaXNTZXJ2aWNlfSBvYmplY3QgYXMgdGhlIHNvbGUgcGFyYW1ldGVyLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIgaW1wbGVtZW50cyBDYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2UsIFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgQ21pc1NlcnZpY2Ugc2VydmljZTsKLSAgICBwcml2YXRlIENhbGxDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXJ2aWNlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGUgd3JhcHBlciB3aXRoIGEgc2V0IG9mIHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3RbXSBwYXJhbXMpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3cmFwcGVkIHNlcnZpY2Ugb3IgdGhlIG5leHQgc2VydmljZSB3cmFwcGVyLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgc2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBDbWlzU2VydmljZSBnZXRXcmFwcGVkU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2FsbCBjb250ZXh0IGFuZCBwcm9wYWdhdGVzIGl0IGRvd24gdG8gdGhlIG5leHQgc2VydmljZSB3cmFwcGVyCi0gICAgICogb3Igc2VydmljZSBpZiBpdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQ2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlfQotICAgICAqIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsQ29udGV4dChDYWxsQ29udGV4dCBjYWxsQ29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjYWxsQ29udGV4dDsKLQotICAgICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIENhbGxDb250ZXh0QXdhcmVDbWlzU2VydmljZSkgewotICAgICAgICAgICAgKChDYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2UpIHNlcnZpY2UpLnNldENhbGxDb250ZXh0KGNhbGxDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgY2FsbCBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBDYWxsQ29udGV4dCBnZXRDYWxsQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tIHByb2Nlc3NpbmcgLS0tCi0KLSAgICBwdWJsaWMgUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UuUHJvZ3Jlc3MgYmVmb3JlU2VydmljZUNhbGwoKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlIGluc3RhbmNlb2YgUHJvZ3Jlc3NDb250cm9sQ21pc1NlcnZpY2UpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlKSBzZXJ2aWNlKS5iZWZvcmVTZXJ2aWNlQ2FsbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlLlByb2dyZXNzLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZS5Qcm9ncmVzcyBhZnRlclNlcnZpY2VDYWxsKCkgewotICAgICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQcm9ncmVzc0NvbnRyb2xDbWlzU2VydmljZSkgc2VydmljZSkuYWZ0ZXJTZXJ2aWNlQ2FsbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFByb2dyZXNzQ29udHJvbENtaXNTZXJ2aWNlLlByb2dyZXNzLkNPTlRJTlVFOwotICAgIH0KLQotICAgIC8vIC0tLSBzZXJ2aWNlIG1ldGhvZHMgLS0tCi0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5SW5mbz4gZ2V0UmVwb3NpdG9yeUluZm9zKEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRSZXBvc2l0b3J5SW5mb3MoZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oU3RyaW5nIHJlcG9zaXRvcnlJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldFJlcG9zaXRvcnlJbmZvKHJlcG9zaXRvcnlJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb25MaXN0IGdldFR5cGVDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZQotICAgICAgICAgICAgICAgIC5nZXRUeXBlQ2hpbGRyZW4ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRUeXBlRGVzY2VuZGFudHMocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGRlcHRoLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiBjcmVhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5jcmVhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZSwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZURlZmluaXRpb24gdXBkYXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBUeXBlRGVmaW5pdGlvbiB0eXBlLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UudXBkYXRlVHlwZShyZXBvc2l0b3J5SWQsIHR5cGUsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlVHlwZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgc2VydmljZS5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RJbkZvbGRlckxpc3QgZ2V0Q2hpbGRyZW4oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBTdHJpbmcgb3JkZXJCeSwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q2hpbGRyZW4ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBvcmRlckJ5LCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldERlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXREZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBkZXB0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldEZvbGRlclRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldEZvbGRlclRyZWUocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZGVwdGgsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdFBhcmVudERhdGE+IGdldE9iamVjdFBhcmVudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0T2JqZWN0UGFyZW50cyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgICAgICByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldEZvbGRlclBhcmVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRGb2xkZXJQYXJlbnQocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENoZWNrZWRPdXREb2NzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q2hlY2tlZE91dERvY3MocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBvcmRlckJ5LCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmNyZWF0ZURvY3VtZW50KHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc291cmNlSWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKHJlcG9zaXRvcnlJZCwgc291cmNlSWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCB2ZXJzaW9uaW5nU3RhdGUsCi0gICAgICAgICAgICAgICAgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVGb2xkZXIoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywKLSAgICAgICAgICAgIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmNyZWF0ZUZvbGRlcihyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVJlbGF0aW9uc2hpcChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsCi0gICAgICAgICAgICBBY2wgcmVtb3ZlQWNlcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmNyZWF0ZVJlbGF0aW9uc2hpcChyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5jcmVhdGVQb2xpY3kocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVJdGVtKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5jcmVhdGVJdGVtKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0QWxsb3dhYmxlQWN0aW9ucyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0T2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldFByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFJlbmRpdGlvbkRhdGE+IGdldFJlbmRpdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRSZW5kaXRpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RCeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0T2JqZWN0QnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICAgICAgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc3RyZWFtSWQsIEJpZ0ludGVnZXIgb2Zmc2V0LAotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHN0cmVhbUlkLCBvZmZzZXQsIGxlbmd0aCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHNlcnZpY2UudXBkYXRlUHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjaGFuZ2VUb2tlbiwgcHJvcGVydGllcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkc0FuZENoYW5nZVRva2VucywgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFkZFNlY29uZGFyeVR5cGVJZHMsIExpc3Q8U3RyaW5nPiByZW1vdmVTZWNvbmRhcnlUeXBlSWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuYnVsa1VwZGF0ZVByb3BlcnRpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZHNBbmRDaGFuZ2VUb2tlbnMsIHByb3BlcnRpZXMsIGFkZFNlY29uZGFyeVR5cGVJZHMsCi0gICAgICAgICAgICAgICAgcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3ZlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBTdHJpbmcgdGFyZ2V0Rm9sZGVySWQsIFN0cmluZyBzb3VyY2VGb2xkZXJJZCwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBzZXJ2aWNlLm1vdmVPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdGFyZ2V0Rm9sZGVySWQsIHNvdXJjZUZvbGRlcklkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBzZXJ2aWNlLmRlbGV0ZU9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFpbGVkVG9EZWxldGVEYXRhIGRlbGV0ZVRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5kZWxldGVUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLCB1bmZpbGVPYmplY3RzLCBjb250aW51ZU9uRmFpbHVyZSwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgc2VydmljZS5zZXRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGNoYW5nZVRva2VuLCBjb250ZW50U3RyZWFtLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHNlcnZpY2UuZGVsZXRlQ29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjaGFuZ2VUb2tlbiwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgYm9vbGVhbiBpc0xhc3RDaHVuaywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHNlcnZpY2UuYXBwZW5kQ29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjaGFuZ2VUb2tlbiwgY29udGVudFN0cmVhbSwgaXNMYXN0Q2h1bmssIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKSB7Ci0gICAgICAgIHNlcnZpY2UuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uLCBjb250ZW50Q29waWVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBzZXJ2aWNlLmNhbmNlbENoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tJbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBtYWpvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hlY2tpbkNvbW1lbnQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHNlcnZpY2UuY2hlY2tJbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBtYWpvciwgcHJvcGVydGllcywgY29udGVudFN0cmVhbSwgY2hlY2tpbkNvbW1lbnQsIHBvbGljaWVzLCBhZGRBY2VzLAotICAgICAgICAgICAgICAgIHJlbW92ZUFjZXMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3RPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBtYWpvciwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBtYWpvciwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdERhdGE+IGdldEFsbFZlcnNpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRBbGxWZXJzaW9ucyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc3RhdGVtZW50LCBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLnF1ZXJ5KHJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBzZWFyY2hBbGxWZXJzaW9ucywgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgICAgIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VMb2dUb2tlbiwgQm9vbGVhbiBpbmNsdWRlUHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywgQm9vbGVhbiBpbmNsdWRlQWNsLCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q29udGVudENoYW5nZXMocmVwb3NpdG9yeUlkLCBjaGFuZ2VMb2dUb2tlbiwgaW5jbHVkZVByb3BlcnRpZXMsIGZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgICAgICBpbmNsdWRlQWNsLCBtYXhJdGVtcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPYmplY3RUb0ZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBzZXJ2aWNlLmFkZE9iamVjdFRvRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RGcm9tRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgc2VydmljZS5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldE9iamVjdFJlbGF0aW9uc2hpcHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcywKLSAgICAgICAgICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbiByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIFN0cmluZyB0eXBlSWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldE9iamVjdFJlbGF0aW9uc2hpcHMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcERpcmVjdGlvbiwgdHlwZUlkLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgZ2V0QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBvbmx5QmFzaWNQZXJtaXNzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldEFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5hcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBhY2xQcm9wYWdhdGlvbiwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIHNlcnZpY2UuYXBwbHlQb2xpY3kocmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgc2VydmljZS5yZW1vdmVQb2xpY3kocmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QXBwbGllZFBvbGljaWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkUG9saWNpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5jcmVhdGUocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBzZXJ2aWNlLmRlbGV0ZU9iamVjdE9yQ2FuY2VsQ2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWxsVmVyc2lvbnMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBhcHBseUFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEFjbCBhY2VzLCBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbikgewotICAgICAgICByZXR1cm4gc2VydmljZS5hcHBseUFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhY2VzLCBhY2xQcm9wYWdhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEluZm8gZ2V0T2JqZWN0SW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0T2JqZWN0SW5mbyhyZXBvc2l0b3J5SWQsIG9iamVjdElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgc2VydmljZS5jbG9zZSgpOwotICAgICAgICBjb250ZXh0ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3dyYXBwZXIvQ2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3dyYXBwZXIvQ2FsbENvbnRleHRBd2FyZUNtaXNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzczNDcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC93cmFwcGVyL0NhbGxDb250ZXh0QXdhcmVDbWlzU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LndyYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DYWxsQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLQotLyoqCi0gKiBJZGVudGlmaWVzIGEgQ01JUyBzZXJ2aWNlIG9iamVjdCB0aGF0IGNhbiBoYW5kbGUgY2FsbCBjb250ZXh0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxsQ29udGV4dEF3YXJlQ21pc1NlcnZpY2UgZXh0ZW5kcyBDbWlzU2VydmljZSB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNhbGwgY29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjYWxsIGNvbnRleHQKLSAgICAgKi8KLSAgICBDYWxsQ29udGV4dCBnZXRDYWxsQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIG5ldyBjYWxsIGNvbnRleHQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhbGxDb250ZXh0Ci0gICAgICogICAgICAgICAgICB0aGUgbmV3IGNhbGwgY29udGV4dAotICAgICAqLwotICAgIHZvaWQgc2V0Q2FsbENvbnRleHQoQ2FsbENvbnRleHQgY2FsbENvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC93cmFwcGVyL0NtaXNTZXJ2aWNlV3JhcHBlck1hbmFnZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9DbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhM2ZkNWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC93cmFwcGVyL0NtaXNTZXJ2aWNlV3JhcHBlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQud3JhcHBlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5DbGFzc0xvYWRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgbGlzdCBvZiBDTUlTIHNlcnZpY2Ugd3JhcHBlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVNfU0VSVklDRV9XUkFQUEVSX1BSRUZJWCA9ICJzZXJ2aWNld3JhcHBlci4iOwotCi0gICAgcHJpdmF0ZSBXcmFwcGVyRGVmaW5pdGlvbiBvdXRlck1vc3Q7Ci0gICAgcHJpdmF0ZSBXcmFwcGVyRGVmaW5pdGlvbiBpbm5lck1vc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ21pc1NlcnZpY2VXcmFwcGVyTWFuYWdlcigpIHsKLSAgICAgICAgb3V0ZXJNb3N0ID0gbnVsbDsKLSAgICAgICAgaW5uZXJNb3N0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIG91dGVyLW1vc3QgKGNhbGxlZCBmaXJzdCkgd3JhcHBlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3JhcHBlckNsYXNzCi0gICAgICogICAgICAgICAgICB0aGUgd3JhcHBlciBjbGFzcwotICAgICAqIEBwYXJhbSBwYXJhbXMKLSAgICAgKiAgICAgICAgICAgIHdyYXBwZXIgcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE91dGVyV3JhcHBlcihDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXI+IHdyYXBwZXJDbGFzcywgT2JqZWN0Li4uIHBhcmFtcykgewotICAgICAgICBXcmFwcGVyRGVmaW5pdGlvbiB3ZCA9IG5ldyBXcmFwcGVyRGVmaW5pdGlvbih3cmFwcGVyQ2xhc3MsIHBhcmFtcyk7Ci0gICAgICAgIGlmIChvdXRlck1vc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0ZXJNb3N0ID0gd2Q7Ci0gICAgICAgICAgICBpbm5lck1vc3QgPSB3ZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dGVyTW9zdC5zZXRPdXRlcldyYXBwZXIod2QpOwotICAgICAgICAgICAgb3V0ZXJNb3N0ID0gd2Q7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0cuZGVidWcoIkFkZGVkIG91dGVyIHNlcnZpY2Ugd3JhcHBlcjoge30iLCB3cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGlubmVyLW1vc3QgKGNhbGxlZCBsYXN0KSB3cmFwcGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3cmFwcGVyQ2xhc3MKLSAgICAgKiAgICAgICAgICAgIHRoZSB3cmFwcGVyIGNsYXNzCi0gICAgICogQHBhcmFtIHBhcmFtcwotICAgICAqICAgICAgICAgICAgd3JhcHBlciBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSW5uZXJXcmFwcGVyKENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcj4gd3JhcHBlckNsYXNzLCBPYmplY3QuLi4gcGFyYW1zKSB7Ci0gICAgICAgIFdyYXBwZXJEZWZpbml0aW9uIHdkID0gbmV3IFdyYXBwZXJEZWZpbml0aW9uKHdyYXBwZXJDbGFzcywgcGFyYW1zKTsKLSAgICAgICAgaWYgKGlubmVyTW9zdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRlck1vc3QgPSB3ZDsKLSAgICAgICAgICAgIGlubmVyTW9zdCA9IHdkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5uZXJNb3N0LnNldElubmVyV3JhcHBlcih3ZCk7Ci0gICAgICAgICAgICBpbm5lck1vc3QgPSB3ZDsKLSAgICAgICAgfQotCi0gICAgICAgIExPRy5kZWJ1ZygiQWRkZWQgaW5uZXIgc2VydmljZSB3cmFwcGVyOiB7fSIsIHdyYXBwZXJDbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd3JhcHBlciBzZXR0aW5ncyBmcm9tIHRoZSBzZXJ2aWNlIGZhY3RvcnkgcGFyYW1ldGVycyBhbmQgYWRkcyB0aGVtCi0gICAgICogdG8gdGhlIHdyYXBwZXJzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBmYWN0b3J5IHBhcmFtZXRlcnMgcHJvcGVydGllcyBmaWxlIHNob3VsZCBsb29rIGxpa2UgdGhpczoKLSAgICAgKiAKLSAgICAgKiA8cHJlPgotICAgICAqIHNlcnZpY2V3cmFwcGVyLjE9Y29tLmV4YW1wbGUubXkuU2ltcGxlV3JhcHBlcgotICAgICAqIHNlcnZpY2V3cmFwcGVyLjI9Y29tLmV4YW1wbGUubXkuQWR2YW5jZWRXcmFwcGVyLDEsY21pczpkb2N1bWVudHMKLSAgICAgKiBzZXJ2aWNld3JhcHBlci4zPWNvbS5leGFtcGxlLm15LkRlYnVnZ2luZ1dyYXBwZXIsdGVzdFJlcG9zaXRvcnlJZAotICAgICAqIDwvcHJlPgotICAgICAqIAotICAgICAqIFN5bnRheDoKLSAgICAgKiB7QGNvZGUgc2VydmljZXdyYXBwZXIuJmx0O3Bvc2l0aW9uPj0mbHQ7Y2xhc3NuYW1lPlsscGFyYW1ldGVyMVsscGFyYW1ldGVyMlsuLi5dXV19Ci0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgIHNlcnZpY2UgZmFjdG9yeSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgYWRkV3JhcHBlcnNGcm9tU2VydmljZUZhY3RvcnlQYXJhbWV0ZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBUcmVlTWFwPEludGVnZXIsIFdyYXBwZXJEZWZpbml0aW9uPiB3cmFwcGVycyA9IG5ldyBUcmVlTWFwPEludGVnZXIsIFdyYXBwZXJEZWZpbml0aW9uPigpOwotCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHBhcmFtZXRlcnMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpLnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoUEFSQU1TX1NFUlZJQ0VfV1JBUFBFUl9QUkVGSVgpICYmIGVudHJ5LmdldEtleSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gSW50ZWdlci52YWx1ZU9mKGtleS5zdWJzdHJpbmcoUEFSQU1TX1NFUlZJQ0VfV1JBUFBFUl9QUkVGSVgubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgc2VydmljZSB3cmFwcGVyIGNvbmZpZ3VyYXRpb246ICIgKyBrZXksIGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKS50cmltKCkuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB3cmFwcGVyQ2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlckNsYXNzID0gQ2xhc3NMb2FkZXJVdGlsLmxvYWRDbGFzcyh2YWx1ZVswXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJTZXJ2aWNlIHdyYXBwZXIgY2xhc3Mgbm90IGZvdW5kOiAiICsgdmFsdWVbMF0sIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHdyYXBwZXJDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ2xhc3MgaXMgbm90IGEgc2VydmljZSB3cmFwcGVyOiAiICsgdmFsdWVbMF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcGFyYW1zID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBPYmplY3RbdmFsdWUubGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCAxLCBwYXJhbXMsIDAsIHBhcmFtcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdyYXBwZXJzLmNvbnRhaW5zS2V5KGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJNb3JlIHRoYW4gb25lIHNlcnZpY2Ugd3JhcHBlciBhdCB0aGUgc2FtZSBwb3NpdGlvbjogIiArIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HLnRyYWNlKCJGb3VuZCB3cmFwcGVyIGF0IGluZGV4IHt9OiB7fXt9IiwgaW5kZXgsIHdyYXBwZXJDbGFzcy5nZXROYW1lKCksIHBhcmFtcyA9PSBudWxsID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBcnJheXMuYXNMaXN0KHBhcmFtcykudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB3cmFwcGVycy5wdXQoaW5kZXgsIG5ldyBXcmFwcGVyRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyPikgd3JhcHBlckNsYXNzLCBwYXJhbXMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXdyYXBwZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgV3JhcHBlckRlZmluaXRpb24gZmlyc3QgPSBudWxsOwotICAgICAgICAgICAgV3JhcHBlckRlZmluaXRpb24gcHJldiA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKFdyYXBwZXJEZWZpbml0aW9uIGRlZiA6IHdyYXBwZXJzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgZGVmLnNldE91dGVyV3JhcHBlcihwcmV2KTsKLSAgICAgICAgICAgICAgICBwcmV2ID0gZGVmOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZGVmOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQWRkZWQgc2VydmljZSB3cmFwcGVyOiB7fSIsIGRlZi5nZXRXcmFwcGVyQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob3V0ZXJNb3N0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXRlck1vc3QgPSBmaXJzdDsKLSAgICAgICAgICAgICAgICBpbm5lck1vc3QgPSBwcmV2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRlck1vc3Quc2V0T3V0ZXJXcmFwcGVyKHByZXYpOwotICAgICAgICAgICAgICAgIG91dGVyTW9zdCA9IGZpcnN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgb3V0ZXItbW9zdCB3cmFwcGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU91dGVyV3JhcHBlcigpIHsKLSAgICAgICAgaWYgKG91dGVyTW9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRlck1vc3QgPSBvdXRlck1vc3QuZ2V0SW5uZXJXcmFwcGVyKCk7Ci0gICAgICAgICAgICBpZiAob3V0ZXJNb3N0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbm5lck1vc3QgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRlck1vc3Quc2V0T3V0ZXJXcmFwcGVyKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgaW5uZXItbW9zdCB3cmFwcGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUlubmVyV3JhcHBlcigpIHsKLSAgICAgICAgaWYgKGlubmVyTW9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbm5lck1vc3QgPSBpbm5lck1vc3QuZ2V0T3V0ZXJXcmFwcGVyKCk7Ci0gICAgICAgICAgICBpZiAoaW5uZXJNb3N0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXRlck1vc3QgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbm5lck1vc3Quc2V0SW5uZXJXcmFwcGVyKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JhcHMgYSBzZXJ2aWNlIHdpdGggYWxsIGNvbmZpZ3VyZWQgd3JhcHBlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZpY2UKLSAgICAgKiAgICAgICAgICAgIHRoZSBDTUlTIHNlcnZpY2Ugb2JqZWN0Ci0gICAgICogQHJldHVybiB0aGUgd3JhcHBlZCBzZXJ2aWNlCi0gICAgICovCi0gICAgcHVibGljIENtaXNTZXJ2aWNlIHdyYXAoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBDbWlzU2VydmljZSByZXN1bHQgPSBzZXJ2aWNlOwotCi0gICAgICAgIFdyYXBwZXJEZWZpbml0aW9uIGRlZiA9IGlubmVyTW9zdDsKLSAgICAgICAgd2hpbGUgKGRlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBkZWYuY3JlYXRlV3JhcHBlck9iamVjdChyZXN1bHQpOwotICAgICAgICAgICAgZGVmID0gZGVmLmdldE91dGVyV3JhcHBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBXcmFwcGVyRGVmaW5pdGlvbiBkZWYgPSBvdXRlck1vc3Q7Ci0gICAgICAgIHdoaWxlIChkZWYgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBzYi5hcHBlbmQoJ1snKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChkZWYudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLQotICAgICAgICAgICAgZGVmID0gZGVmLmdldElubmVyV3JhcHBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JhcHBlciBEZWZpbml0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdyYXBwZXJEZWZpbml0aW9uIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIENPTlNUUlVDVE9SX1BBUkFNRVRFUlMgPSBuZXcgQ2xhc3M8Pz5bXSB7IENtaXNTZXJ2aWNlLmNsYXNzIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXI+IHdyYXBwZXJDbGFzczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXI+IHdyYXBwZXJDb25zdHJ1Y3RvcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBwYXJhbXM7Ci0KLSAgICAgICAgcHJpdmF0ZSBXcmFwcGVyRGVmaW5pdGlvbiBvdXRlcjsKLSAgICAgICAgcHJpdmF0ZSBXcmFwcGVyRGVmaW5pdGlvbiBpbm5lcjsKLQotICAgICAgICBwdWJsaWMgV3JhcHBlckRlZmluaXRpb24oQ2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyPiB3cmFwcGVyQ2xhc3MsIE9iamVjdC4uLiBwYXJhbXMpIHsKLSAgICAgICAgICAgIHRoaXMud3JhcHBlckNsYXNzID0gd3JhcHBlckNsYXNzOwotICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7Ci0KLSAgICAgICAgICAgIGlmICh3cmFwcGVyQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiV3JhcHBlciBjbGFzcyBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyQ29uc3RydWN0b3IgPSB3cmFwcGVyQ2xhc3MuZ2V0Q29uc3RydWN0b3IoQ09OU1RSVUNUT1JfUEFSQU1FVEVSUyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VzcyBjb25zdHJ1Y3RvciBvZiBzZXJ2aWNlIHdyYXBwZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB3cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpICsgIjogIiArIGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyPiBnZXRXcmFwcGVyQ2xhc3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlckNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyIGNyZWF0ZVdyYXBwZXJPYmplY3QoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlciB3cmFwcGVyID0gd3JhcHBlckNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgIHdyYXBwZXIuaW5pdGlhbGl6ZShwYXJhbXMpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGluc3RhbnRpYXRlIHNlcnZpY2Ugd3JhcHBlciAiICsgd3JhcHBlckNsYXNzLmdldE5hbWUoKSArICI6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE91dGVyV3JhcHBlcihXcmFwcGVyRGVmaW5pdGlvbiB3cmFwcGVyKSB7Ci0gICAgICAgICAgICBvdXRlciA9IHdyYXBwZXI7Ci0gICAgICAgICAgICBpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3JhcHBlci5pbm5lciA9IHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgV3JhcHBlckRlZmluaXRpb24gZ2V0T3V0ZXJXcmFwcGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG91dGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5uZXJXcmFwcGVyKFdyYXBwZXJEZWZpbml0aW9uIHdyYXBwZXIpIHsKLSAgICAgICAgICAgIGlubmVyID0gd3JhcHBlcjsKLSAgICAgICAgICAgIGlmICh3cmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyLm91dGVyID0gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXcmFwcGVyRGVmaW5pdGlvbiBnZXRJbm5lcldyYXBwZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5uZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih3cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFyYW1zW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC93cmFwcGVyL0NvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3dyYXBwZXIvQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc0MjA2ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3dyYXBwZXIvQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNzMgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRmFpbGVkVG9EZWxldGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3REYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5SZWxhdGlvbnNoaXBEaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5Ib2xkZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBTZXJ2aWNlIHdyYXBwZXIgdGhhdCBjaGVja3MgaW4gaW5jb21pbmcgY2FsbHMgZm9yIHNwZWNpZmljYXRpb24gY29uZm9ybWFuY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlciBleHRlbmRzIEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNSU5VU19PTkUgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQmlnSW50ZWdlciBkZWZhdWx0VHlwZXNNYXhJdGVtcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGRlZmF1bHRUeXBlc0RlcHRoID0gTUlOVVNfT05FOwotCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGRlZmF1bHRNYXhJdGVtcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGRlZmF1bHREZXB0aCA9IE1JTlVTX09ORTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHVzZWQgYnkge0BsaW5rIENtaXNTZXJ2aWNlV3JhcHBlck1hbmFnZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlcihDbWlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHN1cGVyKHNlcnZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsdGVybmF0aXZlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlcihDbWlzU2VydmljZSBzZXJ2aWNlLCBCaWdJbnRlZ2VyIGRlZmF1bHRUeXBlc01heEl0ZW1zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBkZWZhdWx0VHlwZXNEZXB0aCwgQmlnSW50ZWdlciBkZWZhdWx0TWF4SXRlbXMsIEJpZ0ludGVnZXIgZGVmYXVsdERlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHNlcnZpY2UpOwotCi0gICAgICAgIHRoaXMuZGVmYXVsdFR5cGVzTWF4SXRlbXMgPSBkZWZhdWx0VHlwZXNNYXhJdGVtczsKLSAgICAgICAgdGhpcy5kZWZhdWx0VHlwZXNEZXB0aCA9IGRlZmF1bHRUeXBlc0RlcHRoOwotICAgICAgICB0aGlzLmRlZmF1bHRNYXhJdGVtcyA9IGRlZmF1bHRNYXhJdGVtczsKLSAgICAgICAgdGhpcy5kZWZhdWx0RGVwdGggPSBkZWZhdWx0RGVwdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3RbXSBwYXJhbXMpIHsKLSAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGRlZmF1bHRUeXBlc01heEl0ZW1zID0gY29udmVydFRvQmlnSW50ZWdlcihwYXJhbXNbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICBkZWZhdWx0VHlwZXNEZXB0aCA9IGNvbnZlcnRUb0JpZ0ludGVnZXIocGFyYW1zWzFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMikgewotICAgICAgICAgICAgZGVmYXVsdE1heEl0ZW1zID0gY29udmVydFRvQmlnSW50ZWdlcihwYXJhbXNbMl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAzKSB7Ci0gICAgICAgICAgICBkZWZhdWx0RGVwdGggPSBjb252ZXJ0VG9CaWdJbnRlZ2VyKHBhcmFtc1szXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJpZ0ludGVnZXIgY29udmVydFRvQmlnSW50ZWdlcihPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoQmlnSW50ZWdlcikgb2JqOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoKFN0cmluZykgb2JqKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZigoKE51bWJlcikgb2JqKS5sb25nVmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgbnVtYmVyOiAiICsgb2JqLnRvU3RyaW5nKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gLS0tIHdyYXBwZXIgb3BlcmF0aW9ucyAtLS0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCBtYXhJdGVtcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VHlwZXNNYXhJdGVtcyhCaWdJbnRlZ2VyIGRlZmF1bHRUeXBlc01heEl0ZW1zKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdFR5cGVzTWF4SXRlbXMgPSBkZWZhdWx0VHlwZXNNYXhJdGVtczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZGVwdGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFR5cGVzRGVwdGgoQmlnSW50ZWdlciBkZWZhdWx0VHlwZXNEZXB0aCkgewotICAgICAgICB0aGlzLmRlZmF1bHRUeXBlc0RlcHRoID0gZGVmYXVsdFR5cGVzRGVwdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZWZhdWx0IG1heEl0ZW1zLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNYXhJdGVtcyhCaWdJbnRlZ2VyIGRlZmF1bHRNYXhJdGVtcykgewotICAgICAgICB0aGlzLmRlZmF1bHRNYXhJdGVtcyA9IGRlZmF1bHRNYXhJdGVtczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZGVwdGguCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERlcHRoKEJpZ0ludGVnZXIgZGVmYXVsdERlcHRoKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdERlcHRoID0gZGVmYXVsdERlcHRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiBleGNlcHRpb24gaW50byBhIENNSVMgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDbWlzQmFzZUV4Y2VwdGlvbiBjcmVhdGVDbWlzRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGlmIChlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgICAgIC8vIGlmIGl0IGhhcHBlbnMgaXRzIHRoZSBmYXVsdCBvZiB0aGUgZnJhbWV3b3JrLi4uCi0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ21pc1J1bnRpbWVFeGNlcHRpb24oIlVua25vd24gZXhjZXB0aW9uISIpOwotICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDbWlzQmFzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIChDbWlzQmFzZUV4Y2VwdGlvbikgZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIGlmIHRoZSBjb25uZWN0b3Igd29ya3MgY29ycmVjdGx5Ci0gICAgICAgICAgICAvLyBpdCdzIGFsYXJtaW5nIGVub3VnaCB0byBsb2cgdGhlIGV4Y2VwdGlvbgotICAgICAgICAgICAgTE9HLndhcm4oZS50b1N0cmluZygpLCBlKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDbWlzUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBpZCBpcyB7QGNvZGUgbnVsbH0gb3IgZW1wdHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tJZChTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKSB7Ci0gICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpZC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiBtdXN0IG5vdCBiZSBlbXB0eSEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGdpdmVuIGlkcyBhcmUgYWxsIHtAY29kZSBudWxsfSBvciBlbXB0eS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0lkcyhTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIGlkcykgewotICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGlkcykgewotICAgICAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obmFtZSArICIgbXVzdCBiZSBzZXQhIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gaG9sZGVyIG9yIGlkIGlzIHtAY29kZSBudWxsfSBvciBlbXB0eS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0hvbGRlcklkKFN0cmluZyBuYW1lLCBIb2xkZXI8U3RyaW5nPiBob2xkZXIpIHsKLSAgICAgICAgaWYgKGhvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoZWNrSWQobmFtZSwgaG9sZGVyLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIHJlcG9zaXRvcnkgaWQgaXMge0Bjb2RlIG51bGx9IG9yIGVtcHR5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUmVwb3NpdG9yeUlkKFN0cmluZyByZXBvc2l0b3J5SWQpIHsKLSAgICAgICAgY2hlY2tJZCgiUmVwb3NpdG9yeSBJZCIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyB7QGNvZGUgbnVsbH0gb3IgaW52YWxpZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1BhdGgoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUgKyAiIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obmFtZSArICIgbXVzdCBub3QgYmUgZW1wdHkhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGF0aC5jaGFyQXQoMCkgIT0gJy8nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiBtdXN0IHN0YXJ0IHdpdGggJy8nISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcHJvcGVydGllcyBzZXQgaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnRpZXMgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBwcm9wZXJ0eSBpc24ndCBzZXQgb3Igb2YgdGhlIHdyb25nIHR5cGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tQcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBwcm9wZXJ0eUlkLCBDbGFzczw/PiBjbGF6eikgewotICAgICAgICBpZiAocHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wZXJ0eUlkICsgIiBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGF0YTw/PiBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmdldChwcm9wZXJ0eUlkKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgcHJvcGVydHlJZCArICIgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgdmFsdWUgPSBwcm9wZXJ0eS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgIiArIHByb3BlcnR5SWQgKyAiIG11c3QgaGF2ZSBhIHZhbHVlISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjbGF6ei5pc0Fzc2lnbmFibGVGcm9tKHZhbHVlLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiUHJvcGVydHkgIiArIHByb3BlcnR5SWQgKyAiIGhhcyB0aGUgd3JvbmcgdHlwZSEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGdpdmVuIGNvbnRlbnQgb2JqZWN0IGlzIHtAY29kZSBudWxsfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbnRlbnRTdHJlYW0oQ29udGVudFN0cmVhbSBjb250ZW50KSB7Ci0gICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZW50IG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gcXVlcnkgc3RhdGVtZW50IGlzIHtAY29kZSBudWxsfSBvcgotICAgICAqIGVtcHR5LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrUXVlcnlTdGF0ZW1lbnQoU3RyaW5nIHN0YXRlbWVudCkgewotICAgICAgICBpZiAoc3RhdGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTdGF0ZW1lbnQgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdGVtZW50Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTdGF0ZW1lbnQgbXVzdCBub3QgYmUgZW1wdHkhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB0eXBlIGRlZmluaXRpb24gaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZURlZikgewotICAgICAgICBpZiAodHlwZURlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVHlwZSBkZWZpbml0aW9uIG11c3QgYmUgc2V0ISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gbGlzdCBpcyB7QGNvZGUgbnVsbH0gb3IgZW1wdHkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tMaXN0KFN0cmluZyBuYW1lLCBMaXN0PD8+IGxpc3QpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obmFtZSArICIgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUgKyAiIG11c3Qgbm90IGJlIGVtcHR5ISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT52YWx1ZTwvY29kZT4gaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHByb3RlY3RlZCBCb29sZWFuIGdldERlZmF1bHRUcnVlKEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIHtAY29kZSBudWxsfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBnZXREZWZhdWx0RmFsc2UoQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+SW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORTwvY29kZT4gaWYgPGNvZGU+dmFsdWU8L2NvZGU+Ci0gICAgICogaXMge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHByb3RlY3RlZCBJbmNsdWRlUmVsYXRpb25zaGlwcyBnZXREZWZhdWx0KEluY2x1ZGVSZWxhdGlvbnNoaXBzIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5VbmZpbGVPYmplY3RzLkRFTEVURTwvY29kZT4gaWYgPGNvZGU+dmFsdWU8L2NvZGU+IGlzCi0gICAgICoge0Bjb2RlIG51bGx9LgotICAgICAqLwotICAgIHByb3RlY3RlZCBVbmZpbGVPYmplY3QgZ2V0RGVmYXVsdChVbmZpbGVPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBVbmZpbGVPYmplY3QuREVMRVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxjb2RlPkFjbFByb3BhZ2F0aW9uLlJFUE9TSVRPUllERVRFUk1JTkVEPC9jb2RlPiBpZgotICAgICAqIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyB7QGNvZGUgbnVsbH0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFjbFByb3BhZ2F0aW9uIGdldERlZmF1bHQoQWNsUHJvcGFnYXRpb24gdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBBY2xQcm9wYWdhdGlvbi5SRVBPU0lUT1JZREVURVJNSU5FRDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5SZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFPC9jb2RlPiBpZgotICAgICAqIDxjb2RlPnZhbHVlPC9jb2RlPiBpcyB7QGNvZGUgbnVsbH0gLgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gZ2V0RGVmYXVsdChSZWxhdGlvbnNoaXBEaXJlY3Rpb24gdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBSZWxhdGlvbnNoaXBEaXJlY3Rpb24uU09VUkNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIDxjb2RlPiJjbWlzOm5vbmUiPC9jb2RlPiBpZiA8Y29kZT52YWx1ZTwvY29kZT4gaXMKLSAgICAgKiB7QGNvZGUgbnVsbH0uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UmVuZGl0aW9uRmlsdGVyKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoKHZhbHVlID09IG51bGwpIHx8ICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuICJjbWlzOm5vbmUiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgbWF4SXRlbXMgaWYgPGNvZGU+bWF4SXRlbXM8L2NvZGU+ID09IHtAY29kZSBudWxsfSwKLSAgICAgKiB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIDxjb2RlPm1heEl0ZW1zPC9jb2RlPiAmbHQ7IDAsIHJldHVybnMKLSAgICAgKiA8Y29kZT5tYXhJdGVtczwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyIGdldFR5cGVzTWF4SXRlbXMoQmlnSW50ZWdlciBtYXhJdGVtcykgewotICAgICAgICBpZiAobWF4SXRlbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRUeXBlc01heEl0ZW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1heEl0ZW1zLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigibWF4SXRlbXMgbXVzdCBub3QgYmUgbmVnYXRpdmUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWF4SXRlbXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaWYgaXQgY29tcGxpZXMgd2l0aCBDTUlTIHNwZWNpZmljYXRpb24gYW5kCi0gICAgICogcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB7QGNvZGUgZGVwdGh9IGlzIHtAY29kZSBudWxsfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBnZXRUeXBlc0RlcHRoKEJpZ0ludGVnZXIgZGVwdGgpIHsKLSAgICAgICAgaWYgKGRlcHRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VHlwZXNEZXB0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXB0aC5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiZGVwdGggbXVzdCBub3QgYmUgMCEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXB0aC5jb21wYXJlVG8oTUlOVVNfT05FKSA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oImRlcHRoIG11c3Qgbm90IGJlIDwtMSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZXB0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG1heEl0ZW1zIGlmIDxjb2RlPm1heEl0ZW1zPC9jb2RlPiA9PSB7QGNvZGUgbnVsbH0sCi0gICAgICogdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiA8Y29kZT5tYXhJdGVtczwvY29kZT4gJmx0OyAwLCByZXR1cm5zCi0gICAgICogPGNvZGU+bWF4SXRlbXM8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBnZXRNYXhJdGVtcyhCaWdJbnRlZ2VyIG1heEl0ZW1zKSB7Ci0gICAgICAgIGlmIChtYXhJdGVtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdE1heEl0ZW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1heEl0ZW1zLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigibWF4SXRlbXMgbXVzdCBub3QgYmUgbmVnYXRpdmUhIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWF4SXRlbXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyAwIGlmIDxjb2RlPnNraXBDb3VudDwvY29kZT4gPT0ge0Bjb2RlIG51bGx9LCB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAgICogaWYgPGNvZGU+c2tpcENvdW50PC9jb2RlPiAmbHQ7IDAsIHJldHVybnMgPGNvZGU+c2tpcENvdW50PC9jb2RlPgotICAgICAqIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBnZXRTa2lwQ291bnQoQmlnSW50ZWdlciBza2lwQ291bnQpIHsKLSAgICAgICAgaWYgKHNraXBDb3VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQmlnSW50ZWdlci5aRVJPOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNraXBDb3VudC5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oInNraXBDb3VudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZSEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBza2lwQ291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBkZXB0aCBwYXJhbWV0ZXIgaWYgaXQgY29tcGxpZXMgd2l0aCBDTUlTIHNwZWNpZmljYXRpb24gYW5kCi0gICAgICogcmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB7QGNvZGUgZGVwdGh9IGlzIHtAY29kZSBudWxsfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciBnZXREZXB0aChCaWdJbnRlZ2VyIGRlcHRoKSB7Ci0gICAgICAgIGlmIChkZXB0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdERlcHRoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlcHRoLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLlpFUk8pID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJkZXB0aCBtdXN0IG5vdCBiZSAwISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlcHRoLmNvbXBhcmVUbyhNSU5VU19PTkUpID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiZGVwdGggbXVzdCBub3QgYmUgPC0xISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlcHRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG5lZ2F0aXZlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrTnVsbE9yUG9zaXRpdmUoU3RyaW5nIG5hbWUsIEJpZ0ludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24obmFtZSArICIgbXVzdCBub3QgYmUgbmVnYXRpdmUhIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gcmVwb3NpdG9yeSBzZXJ2aWNlIC0tLQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5SWQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldFJlcG9zaXRvcnlJbmZvcyhleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkxpc3QgZ2V0VHlwZUNoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgbWF4SXRlbXMgPSBnZXRUeXBlc01heEl0ZW1zKG1heEl0ZW1zKTsKLSAgICAgICAgc2tpcENvdW50ID0gZ2V0U2tpcENvdW50KHNraXBDb3VudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldFR5cGVDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHR5cGVJZCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIG1heEl0ZW1zLAotICAgICAgICAgICAgICAgICAgICBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJUeXBlIElkIiwgdHlwZUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8VHlwZURlZmluaXRpb25Db250YWluZXI+IGdldFR5cGVEZXNjZW5kYW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgdHlwZUlkLCBCaWdJbnRlZ2VyIGRlcHRoLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zKTsKLSAgICAgICAgZGVwdGggPSBnZXRUeXBlc0RlcHRoKGRlcHRoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0VHlwZURlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBkZXB0aCwgaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGNyZWF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrVHlwZURlZmluaXRpb24odHlwZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiB1cGRhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja1R5cGVEZWZpbml0aW9uKHR5cGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS51cGRhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJUeXBlIElkIiwgdHlwZUlkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5kZWxldGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBuYXZpZ2F0aW9uIHNlcnZpY2UgLS0tCi0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRDaGVja2VkT3V0RG9jcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXREZWZhdWx0KGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVuZGl0aW9uRmlsdGVyID0gZ2V0RGVmYXVsdFJlbmRpdGlvbkZpbHRlcihyZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICBtYXhJdGVtcyA9IGdldE1heEl0ZW1zKG1heEl0ZW1zKTsKLSAgICAgICAgc2tpcENvdW50ID0gZ2V0U2tpcENvdW50KHNraXBDb3VudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldENoZWNrZWRPdXREb2NzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJGb2xkZXIgSWQiLCBmb2xkZXJJZCk7Ci0gICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXREZWZhdWx0KGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVuZGl0aW9uRmlsdGVyID0gZ2V0RGVmYXVsdFJlbmRpdGlvbkZpbHRlcihyZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICBpbmNsdWRlUGF0aFNlZ21lbnQgPSBnZXREZWZhdWx0RmFsc2UoaW5jbHVkZVBhdGhTZWdtZW50KTsKLSAgICAgICAgbWF4SXRlbXMgPSBnZXRNYXhJdGVtcyhtYXhJdGVtcyk7Ci0gICAgICAgIHNraXBDb3VudCA9IGdldFNraXBDb3VudChza2lwQ291bnQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRDaGlsZHJlbihyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBmaWx0ZXIsIG9yZGVyQnksIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldERlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJGb2xkZXIgSWQiLCBmb2xkZXJJZCk7Ci0gICAgICAgIGRlcHRoID0gZ2V0RGVwdGgoZGVwdGgpOwotICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RGVmYXVsdChpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHJlbmRpdGlvbkZpbHRlciA9IGdldERlZmF1bHRSZW5kaXRpb25GaWx0ZXIocmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgaW5jbHVkZVBhdGhTZWdtZW50ID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVQYXRoU2VnbWVudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldERlc2NlbmRhbnRzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0Rm9sZGVyUGFyZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIkZvbGRlciBJZCIsIGZvbGRlcklkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0Rm9sZGVyUGFyZW50KHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RJbkZvbGRlckNvbnRhaW5lcj4gZ2V0Rm9sZGVyVHJlZShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIEJpZ0ludGVnZXIgZGVwdGgsCi0gICAgICAgICAgICBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywKLSAgICAgICAgICAgIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tJZCgiRm9sZGVyIElkIiwgZm9sZGVySWQpOwotICAgICAgICBkZXB0aCA9IGdldERlcHRoKGRlcHRoKTsKLSAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXREZWZhdWx0RmFsc2UoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcyA9IGdldERlZmF1bHQoaW5jbHVkZVJlbGF0aW9uc2hpcHMpOwotICAgICAgICByZW5kaXRpb25GaWx0ZXIgPSBnZXREZWZhdWx0UmVuZGl0aW9uRmlsdGVyKHJlbmRpdGlvbkZpbHRlcik7Ci0gICAgICAgIGluY2x1ZGVQYXRoU2VnbWVudCA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlUGF0aFNlZ21lbnQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRGb2xkZXJUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0UGFyZW50RGF0YT4gZ2V0T2JqZWN0UGFyZW50cyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJPYmplY3QgSWQiLCBvYmplY3RJZCk7Ci0gICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXREZWZhdWx0KGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVuZGl0aW9uRmlsdGVyID0gZ2V0RGVmYXVsdFJlbmRpdGlvbkZpbHRlcihyZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldE9iamVjdFBhcmVudHMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVJlbGF0aXZlUGF0aFNlZ21lbnQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tIG9iamVjdCBzZXJ2aWNlIC0tLQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgZm9sZGVySWQsIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLSAgICAgICAgY2hlY2tQcm9wZXJ0eShwcm9wZXJ0aWVzLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgU3RyaW5nLmNsYXNzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuY3JlYXRlKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgcG9saWNpZXMsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSwgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywKLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgICAgICBjaGVja1Byb3BlcnR5KHByb3BlcnRpZXMsIFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBTdHJpbmcuY2xhc3MpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5jcmVhdGVEb2N1bWVudChyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBzb3VyY2VJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJTb3VyY2UgSWQiLCBzb3VyY2VJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShyZXBvc2l0b3J5SWQsIHNvdXJjZUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgICAgICBjaGVja1Byb3BlcnR5KHByb3BlcnRpZXMsIFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBTdHJpbmcuY2xhc3MpOwotICAgICAgICBjaGVja0lkKCJGb2xkZXIgSWQiLCBmb2xkZXJJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZUZvbGRlcihyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVBvbGljeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgICAgICBjaGVja1Byb3BlcnR5KHByb3BlcnRpZXMsIFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBTdHJpbmcuY2xhc3MpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5jcmVhdGVQb2xpY3kocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVJdGVtKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja1Byb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgIGNoZWNrUHJvcGVydHkocHJvcGVydGllcywgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIFN0cmluZy5jbGFzcyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZUl0ZW0ocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVSZWxhdGlvbnNoaXAoU3RyaW5nIHJlcG9zaXRvcnlJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja1Byb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgIGNoZWNrUHJvcGVydHkocHJvcGVydGllcywgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIC8vIGNoZWNrUHJvcGVydHkocHJvcGVydGllcywgUHJvcGVydHlJZHMuU09VUkNFX0lELCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAvLyBjaGVja1Byb3BlcnR5KHByb3BlcnRpZXMsIFByb3BlcnR5SWRzLlRBUkdFVF9JRCwgU3RyaW5nLmNsYXNzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuY3JlYXRlUmVsYXRpb25zaGlwKHJlcG9zaXRvcnlJZCwgcHJvcGVydGllcywgcG9saWNpZXMsIGFkZEFjZXMsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tIb2xkZXJJZCgiT2JqZWN0IElkIiwgb2JqZWN0SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLmRlbGV0ZUNvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY2hhbmdlVG9rZW4sIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlT2JqZWN0KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgYWxsVmVyc2lvbnMgPSBnZXREZWZhdWx0VHJ1ZShhbGxWZXJzaW9ucyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkuZGVsZXRlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9iamVjdE9yQ2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgYWxsVmVyc2lvbnMgPSBnZXREZWZhdWx0VHJ1ZShhbGxWZXJzaW9ucyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkuZGVsZXRlT2JqZWN0T3JDYW5jZWxDaGVja091dChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFpbGVkVG9EZWxldGVEYXRhIGRlbGV0ZVRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJGb2xkZXIgSWQiLCBmb2xkZXJJZCk7Ci0gICAgICAgIGFsbFZlcnNpb25zID0gZ2V0RGVmYXVsdFRydWUoYWxsVmVyc2lvbnMpOwotICAgICAgICB1bmZpbGVPYmplY3RzID0gZ2V0RGVmYXVsdCh1bmZpbGVPYmplY3RzKTsKLSAgICAgICAgY29udGludWVPbkZhaWx1cmUgPSBnZXREZWZhdWx0RmFsc2UoY29udGludWVPbkZhaWx1cmUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5kZWxldGVUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLCB1bmZpbGVPYmplY3RzLAotICAgICAgICAgICAgICAgICAgICBjb250aW51ZU9uRmFpbHVyZSwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsb3dhYmxlQWN0aW9ucyBnZXRBbGxvd2FibGVBY3Rpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc3RyZWFtSWQsIEJpZ0ludGVnZXIgb2Zmc2V0LAotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJPYmplY3QgSWQiLCBvYmplY3RJZCk7Ci0gICAgICAgIGNoZWNrTnVsbE9yUG9zaXRpdmUoIk9mZnNldCIsIG9mZnNldCk7Ci0gICAgICAgIGNoZWNrTnVsbE9yUG9zaXRpdmUoIkxlbmd0aCIsIGxlbmd0aCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldENvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgc3RyZWFtSWQsIG9mZnNldCwgbGVuZ3RoLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tJZCgiT2JqZWN0IElkIiwgb2JqZWN0SWQpOwotICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RGVmYXVsdChpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHJlbmRpdGlvbkZpbHRlciA9IGdldERlZmF1bHRSZW5kaXRpb25GaWx0ZXIocmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgaW5jbHVkZVBvbGljeUlkcyA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlUG9saWN5SWRzKTsKLSAgICAgICAgaW5jbHVkZUFjbCA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlQWNsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0T2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQb2xpY3lJZHMsIGluY2x1ZGVBY2wsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwYXRoLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrUGF0aCgiUGF0aCIsIHBhdGgpOwotICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RGVmYXVsdChpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHJlbmRpdGlvbkZpbHRlciA9IGdldERlZmF1bHRSZW5kaXRpb25GaWx0ZXIocmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgaW5jbHVkZVBvbGljeUlkcyA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlUG9saWN5SWRzKTsKLSAgICAgICAgaW5jbHVkZUFjbCA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlQWNsKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0T2JqZWN0QnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0UHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgcmVuZGl0aW9uRmlsdGVyID0gZ2V0RGVmYXVsdFJlbmRpdGlvbkZpbHRlcihyZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICBtYXhJdGVtcyA9IGdldE1heEl0ZW1zKG1heEl0ZW1zKTsKLSAgICAgICAgc2tpcENvdW50ID0gZ2V0U2tpcENvdW50KHNraXBDb3VudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldFJlbmRpdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LAotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdmVPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIFN0cmluZyB0YXJnZXRGb2xkZXJJZCwgU3RyaW5nIHNvdXJjZUZvbGRlcklkLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSG9sZGVySWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgY2hlY2tJZCgiVGFyZ2V0IEZvbGRlciBJZCIsIHRhcmdldEZvbGRlcklkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5tb3ZlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHRhcmdldEZvbGRlcklkLCBzb3VyY2VGb2xkZXJJZCwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG92ZXJ3cml0ZUZsYWcsCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tIb2xkZXJJZCgiT2JqZWN0IElkIiwgb2JqZWN0SWQpOwotICAgICAgICBvdmVyd3JpdGVGbGFnID0gZ2V0RGVmYXVsdFRydWUob3ZlcndyaXRlRmxhZyk7Ci0gICAgICAgIGNoZWNrQ29udGVudFN0cmVhbShjb250ZW50U3RyZWFtKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5zZXRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG92ZXJ3cml0ZUZsYWcsIGNoYW5nZVRva2VuLCBjb250ZW50U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBib29sZWFuIGlzTGFzdENodW5rLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tIb2xkZXJJZCgiT2JqZWN0IElkIiwgb2JqZWN0SWQpOwotICAgICAgICBjaGVja0NvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkuYXBwZW5kQ29udGVudFN0cmVhbShyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjaGFuZ2VUb2tlbiwgY29udGVudFN0cmVhbSwgaXNMYXN0Q2h1bmssCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0hvbGRlcklkKCJPYmplY3QgSWQiLCBvYmplY3RJZCk7Ci0gICAgICAgIGNoZWNrUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS51cGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGNoYW5nZVRva2VuLCBwcm9wZXJ0aWVzLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiBidWxrVXBkYXRlUHJvcGVydGllcyhTdHJpbmcgcmVwb3NpdG9yeUlkLAotICAgICAgICAgICAgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFkZFNlY29uZGFyeVR5cGVJZHMsIExpc3Q8U3RyaW5nPiByZW1vdmVTZWNvbmRhcnlUeXBlSWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tMaXN0KCJPYmplY3QgSWQgbGlzdCIsIG9iamVjdElkQW5kQ2hhbmdlVG9rZW4pOwotICAgICAgICBjaGVja1Byb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmJ1bGtVcGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRBbmRDaGFuZ2VUb2tlbiwgcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgYWRkU2Vjb25kYXJ5VHlwZUlkcywgcmVtb3ZlU2Vjb25kYXJ5VHlwZUlkcywgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gdmVyc2lvbmluZyBzZXJ2aWNlIC0tLQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tJZCgiT2JqZWN0IElkIiwgb2JqZWN0SWQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLmNhbmNlbENoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tJbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgQm9vbGVhbiBtYWpvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hlY2tpbkNvbW1lbnQsIExpc3Q8U3RyaW5nPiBwb2xpY2llcywgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSG9sZGVySWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgbWFqb3IgPSBnZXREZWZhdWx0VHJ1ZShtYWpvcik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkuY2hlY2tJbihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBtYWpvciwgcHJvcGVydGllcywgY29udGVudFN0cmVhbSwgY2hlY2tpbkNvbW1lbnQsCi0gICAgICAgICAgICAgICAgICAgIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoZWNrT3V0KFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24sCi0gICAgICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gY29udGVudENvcGllZCkgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0hvbGRlcklkKCJPYmplY3QgSWQiLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uLCBjb250ZW50Q29waWVkKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWRzKCJWZXJzaW9uIFNlcmllcyBJZCIsIG9iamVjdElkLCB2ZXJzaW9uU2VyaWVzSWQpOwotICAgICAgICBtYWpvciA9IGdldERlZmF1bHRGYWxzZShtYWpvcik7Ci0gICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLSAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMgPSBnZXREZWZhdWx0KGluY2x1ZGVSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVuZGl0aW9uRmlsdGVyID0gZ2V0RGVmYXVsdFJlbmRpdGlvbkZpbHRlcihyZW5kaXRpb25GaWx0ZXIpOwotICAgICAgICBpbmNsdWRlUG9saWN5SWRzID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVQb2xpY3lJZHMpOwotICAgICAgICBpbmNsdWRlQWNsID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVBY2wpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRPYmplY3RPZkxhdGVzdFZlcnNpb24ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBtYWpvciwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBvbGljeUlkcywgaW5jbHVkZUFjbCwKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkcygiVmVyc2lvbiBTZXJpZXMgSWQiLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkKTsKLSAgICAgICAgbWFqb3IgPSBnZXREZWZhdWx0RmFsc2UobWFqb3IpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgIGZpbHRlciwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3REYXRhPiBnZXRBbGxWZXJzaW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyB2ZXJzaW9uU2VyaWVzSWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tJZHMoIlZlcnNpb24gU2VyaWVzIElkIiwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCk7Ci0gICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0QWxsVmVyc2lvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBkaXNjb3Zlcnkgc2VydmljZSAtLS0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBpbmNsdWRlUHJvcGVydGllcyA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlUHJvcGVydGllcyk7Ci0gICAgICAgIGluY2x1ZGVQb2xpY3lJZHMgPSBnZXREZWZhdWx0RmFsc2UoaW5jbHVkZVBvbGljeUlkcyk7Ci0gICAgICAgIGluY2x1ZGVBY2wgPSBnZXREZWZhdWx0RmFsc2UoaW5jbHVkZUFjbCk7Ci0gICAgICAgIG1heEl0ZW1zID0gZ2V0TWF4SXRlbXMobWF4SXRlbXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRDb250ZW50Q2hhbmdlcyhyZXBvc2l0b3J5SWQsIGNoYW5nZUxvZ1Rva2VuLCBpbmNsdWRlUHJvcGVydGllcywgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBtYXhJdGVtcywgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBxdWVyeShTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgc3RhdGVtZW50LCBCb29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrUXVlcnlTdGF0ZW1lbnQoc3RhdGVtZW50KTsKLSAgICAgICAgc2VhcmNoQWxsVmVyc2lvbnMgPSBnZXREZWZhdWx0RmFsc2Uoc2VhcmNoQWxsVmVyc2lvbnMpOwotICAgICAgICBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyA9IGdldERlZmF1bHRGYWxzZShpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyk7Ci0gICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzID0gZ2V0RGVmYXVsdChpbmNsdWRlUmVsYXRpb25zaGlwcyk7Ci0gICAgICAgIHJlbmRpdGlvbkZpbHRlciA9IGdldERlZmF1bHRSZW5kaXRpb25GaWx0ZXIocmVuZGl0aW9uRmlsdGVyKTsKLSAgICAgICAgbWF4SXRlbXMgPSBnZXRNYXhJdGVtcyhtYXhJdGVtcyk7Ci0gICAgICAgIHNraXBDb3VudCA9IGdldFNraXBDb3VudChza2lwQ291bnQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5xdWVyeShyZXBvc2l0b3J5SWQsIHN0YXRlbWVudCwgc2VhcmNoQWxsVmVyc2lvbnMsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBtdWx0aSBmaWxpbmcgc2VydmljZSAtLS0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9iamVjdFRvRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgY2hlY2tJZCgiRm9sZGVyIElkIiwgZm9sZGVySWQpOwotICAgICAgICBhbGxWZXJzaW9ucyA9IGdldERlZmF1bHRUcnVlKGFsbFZlcnNpb25zKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5hZGRPYmplY3RUb0ZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgYWxsVmVyc2lvbnMsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGZvbGRlcklkLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSByZWxhdGlvbnNoaXAgc2VydmljZSAtLS0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldE9iamVjdFJlbGF0aW9uc2hpcHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcywKLSAgICAgICAgICAgIFJlbGF0aW9uc2hpcERpcmVjdGlvbiByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIFN0cmluZyB0eXBlSWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzID0gZ2V0RGVmYXVsdEZhbHNlKGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcyk7Ci0gICAgICAgIHJlbGF0aW9uc2hpcERpcmVjdGlvbiA9IGdldERlZmF1bHQocmVsYXRpb25zaGlwRGlyZWN0aW9uKTsKLSAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgPSBnZXREZWZhdWx0RmFsc2UoaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMpOwotICAgICAgICBtYXhJdGVtcyA9IGdldE1heEl0ZW1zKG1heEl0ZW1zKTsKLSAgICAgICAgc2tpcENvdW50ID0gZ2V0U2tpcENvdW50KHNraXBDb3VudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldE9iamVjdFJlbGF0aW9uc2hpcHMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgaW5jbHVkZVN1YlJlbGF0aW9uc2hpcFR5cGVzLAotICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIHR5cGVJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNyZWF0ZUNtaXNFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gQUNMIHNlcnZpY2UgLS0tCi0KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFjZXMsIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgYWNsUHJvcGFnYXRpb24gPSBnZXREZWZhdWx0KGFjbFByb3BhZ2F0aW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuYXBwbHlBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWNlcywgYWNsUHJvcGFnYXRpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBBY2xQcm9wYWdhdGlvbiBhY2xQcm9wYWdhdGlvbiwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeUlkKHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGNoZWNrSWQoIk9iamVjdCBJZCIsIG9iamVjdElkKTsKLSAgICAgICAgYWNsUHJvcGFnYXRpb24gPSBnZXREZWZhdWx0KGFjbFByb3BhZ2F0aW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuYXBwbHlBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWRkQWNlcywgcmVtb3ZlQWNlcywgYWNsUHJvcGFnYXRpb24sIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFjbCBnZXRBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIG9ubHlCYXNpY1Blcm1pc3Npb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tJZCgiT2JqZWN0IElkIiwgb2JqZWN0SWQpOwotICAgICAgICBvbmx5QmFzaWNQZXJtaXNzaW9ucyA9IGdldERlZmF1bHRUcnVlKG9ubHlCYXNpY1Blcm1pc3Npb25zKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG9ubHlCYXNpY1Blcm1pc3Npb25zLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBwb2xpY3kgc2VydmljZSAtLS0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tJZCgiUG9saWN5IElkIiwgcG9saWN5SWQpOwotICAgICAgICBjaGVja0lkKCJPYmplY3QgSWQiLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkuYXBwbHlQb2xpY3kocmVwb3NpdG9yeUlkLCBwb2xpY3lJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0RGF0YT4gZ2V0QXBwbGllZFBvbGljaWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBjaGVja1JlcG9zaXRvcnlJZChyZXBvc2l0b3J5SWQpOwotICAgICAgICBjaGVja0lkKCJPYmplY3QgSWQiLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldEFwcGxpZWRQb2xpY2llcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBjcmVhdGVDbWlzRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwb2xpY3lJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgY2hlY2tSZXBvc2l0b3J5SWQocmVwb3NpdG9yeUlkKTsKLSAgICAgICAgY2hlY2tJZCgiUG9saWN5IElkIiwgcG9saWN5SWQpOwotICAgICAgICBjaGVja0lkKCJPYmplY3QgSWQiLCBvYmplY3RJZCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkucmVtb3ZlUG9saWN5KHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgY3JlYXRlQ21pc0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9TaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3dyYXBwZXIvU2ltcGxlTG9nZ2luZ0NtaXNTZXJ2aWNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQ2OWE3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9TaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIixyZXBvc2l0b3J5SWQpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5GYWlsZWRUb0RlbGV0ZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdExpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdFBhcmVudERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlbmRpdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5SZWxhdGlvbnNoaXBEaXJlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ2FsbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zZXJ2ZXIuQ21pc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuSG9sZGVyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogQSBzaW1wbGUgQ01JUyBzZXJ2aWNlIHdyYXBwZXIgdGhhdCBsb2dzIENNSVMgY2FsbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyIGV4dGVuZHMgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIuY2xhc3MpOwotCi0gICAgcHVibGljIFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIoQ21pc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2dzIGEgY2FsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIHJlcG9zaXRvcnlJZCkgewotICAgICAgICBpZiAocmVwb3NpdG9yeUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlcG9zaXRvcnlJZCA9ICI8bm9uZT4iOwotICAgICAgICB9Ci0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRDYWxsQ29udGV4dCgpLmdldChDYWxsQ29udGV4dC5IVFRQX1NFUlZMRVRfUkVRVUVTVCk7Ci0gICAgICAgIFN0cmluZyB1c2VyQWdlbnQgPSByZXF1ZXN0LmdldEhlYWRlcigiVXNlci1BZ2VudCIpOwotICAgICAgICBpZiAodXNlckFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHVzZXJBZ2VudCA9ICI8dW5rbm93bj4iOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmcgPSBnZXRDYWxsQ29udGV4dCgpLmdldEJpbmRpbmcoKTsKLQotICAgICAgICBMT0cuaW5mbygiT3BlcmF0aW9uOiB7fSwgUmVwb3NpdG9yeSBJRDoge30sIEJpbmRpbmc6IHt9LCBVc2VyIEFnZW50OiB7fSIsIG9wZXJhdGlvbiwgcmVwb3NpdG9yeUlkLCBiaW5kaW5nLAotICAgICAgICAgICAgICAgIHVzZXJBZ2VudCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJnZXRSZXBvc2l0b3J5SW5mb3MiLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0UmVwb3NpdG9yeUluZm9zKGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFN0cmluZyByZXBvc2l0b3J5SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldFJlcG9zaXRvcnlJbmZvIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkxpc3QgZ2V0VHlwZUNoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygiZ2V0VHlwZUNoaWxkcmVuIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgbWF4SXRlbXMsCi0gICAgICAgICAgICAgICAgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiBnZXRUeXBlRGVzY2VuZGFudHMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHR5cGVJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldFR5cGVEZXNjZW5kYW50cyIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldFR5cGVEZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgZGVwdGgsIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldFR5cGVEZWZpbml0aW9uIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0VHlwZURlZmluaXRpb24ocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGNyZWF0ZVR5cGUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgVHlwZURlZmluaXRpb24gdHlwZSwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygiY3JlYXRlVHlwZSIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbiB1cGRhdGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFR5cGVEZWZpbml0aW9uIHR5cGUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coInVwZGF0ZVR5cGUiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS51cGRhdGVUeXBlKHJlcG9zaXRvcnlJZCwgdHlwZSwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVUeXBlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImRlbGV0ZVR5cGUiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLmRlbGV0ZVR5cGUocmVwb3NpdG9yeUlkLCB0eXBlSWQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVQYXRoU2VnbWVudCwgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldENoaWxkcmVuIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0Q2hpbGRyZW4ocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBvcmRlckJ5LCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUGF0aFNlZ21lbnQsIG1heEl0ZW1zLCBza2lwQ291bnQsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0SW5Gb2xkZXJDb250YWluZXI+IGdldERlc2NlbmRhbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldERlc2NlbmRhbnRzIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0RGVzY2VuZGFudHMocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZGVwdGgsIGZpbHRlciwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgaW5jbHVkZVBhdGhTZWdtZW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdEluRm9sZGVyQ29udGFpbmVyPiBnZXRGb2xkZXJUcmVlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgQmlnSW50ZWdlciBkZXB0aCwKLSAgICAgICAgICAgIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLAotICAgICAgICAgICAgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUGF0aFNlZ21lbnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldEZvbGRlclRyZWUiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRGb2xkZXJUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGRlcHRoLCBmaWx0ZXIsIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgICAgIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCByZW5kaXRpb25GaWx0ZXIsIGluY2x1ZGVQYXRoU2VnbWVudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBnZXRPYmplY3RQYXJlbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygiZ2V0T2JqZWN0UGFyZW50cyIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldE9iamVjdFBhcmVudHMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUmVsYXRpdmVQYXRoU2VnbWVudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRGb2xkZXJQYXJlbnQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJnZXRGb2xkZXJQYXJlbnQiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRGb2xkZXJQYXJlbnQocmVwb3NpdG9yeUlkLCBmb2xkZXJJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENoZWNrZWRPdXREb2NzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIGZpbHRlciwgU3RyaW5nIG9yZGVyQnksCi0gICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEJpZ0ludGVnZXIgc2tpcENvdW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJnZXRDaGVja2VkT3V0RG9jcyIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldENoZWNrZWRPdXREb2NzKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGZpbHRlciwgb3JkZXJCeSwgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICAgICAgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIHJlbmRpdGlvbkZpbHRlciwgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLAotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLAotICAgICAgICAgICAgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImNyZWF0ZURvY3VtZW50IiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuY3JlYXRlRG9jdW1lbnQocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlLAotICAgICAgICAgICAgICAgIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRG9jdW1lbnRGcm9tU291cmNlKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBzb3VyY2VJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEFjbCBhZGRBY2VzLCBBY2wgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShyZXBvc2l0b3J5SWQsIHNvdXJjZUlkLCBwcm9wZXJ0aWVzLCBmb2xkZXJJZCwKLSAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLCBhZGRBY2VzLCByZW1vdmVBY2VzLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlRm9sZGVyKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImNyZWF0ZUZvbGRlciIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZUZvbGRlcihyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUmVsYXRpb25zaGlwKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywKLSAgICAgICAgICAgIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJjcmVhdGVSZWxhdGlvbnNoaXAiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5jcmVhdGVSZWxhdGlvbnNoaXAocmVwb3NpdG9yeUlkLCBwcm9wZXJ0aWVzLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlUG9saWN5KFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsCi0gICAgICAgICAgICBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImNyZWF0ZVBvbGljeSIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZVBvbGljeShyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlSXRlbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyBmb2xkZXJJZCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLAotICAgICAgICAgICAgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJjcmVhdGVJdGVtIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuY3JlYXRlSXRlbShyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBwb2xpY2llcywgYWRkQWNlcywgcmVtb3ZlQWNlcywKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxvd2FibGVBY3Rpb25zIGdldEFsbG93YWJsZUFjdGlvbnMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJnZXRBbGxvd2FibGVBY3Rpb25zIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsCi0gICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLAotICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWNsLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJnZXRPYmplY3QiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRPYmplY3QocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgZmlsdGVyLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJnZXRQcm9wZXJ0aWVzIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0UHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmaWx0ZXIsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UmVuZGl0aW9uRGF0YT4gZ2V0UmVuZGl0aW9ucyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygiZ2V0UmVuZGl0aW9ucyIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldFJlbmRpdGlvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdERhdGEgZ2V0T2JqZWN0QnlQYXRoKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBwYXRoLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsIEJvb2xlYW4gaW5jbHVkZVBvbGljeUlkcywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygiZ2V0T2JqZWN0QnlQYXRoIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0T2JqZWN0QnlQYXRoKHJlcG9zaXRvcnlJZCwgcGF0aCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgc3RyZWFtSWQsIEJpZ0ludGVnZXIgb2Zmc2V0LAotICAgICAgICAgICAgQmlnSW50ZWdlciBsZW5ndGgsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldENvbnRlbnRTdHJlYW0iLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRDb250ZW50U3RyZWFtKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHN0cmVhbUlkLCBvZmZzZXQsIGxlbmd0aCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQcm9wZXJ0aWVzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcywgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygidXBkYXRlUHJvcGVydGllcyIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkudXBkYXRlUHJvcGVydGllcyhyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBjaGFuZ2VUb2tlbiwgcHJvcGVydGllcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxCdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbj4gYnVsa1VwZGF0ZVByb3BlcnRpZXMoU3RyaW5nIHJlcG9zaXRvcnlJZCwKLSAgICAgICAgICAgIExpc3Q8QnVsa1VwZGF0ZU9iamVjdElkQW5kQ2hhbmdlVG9rZW4+IG9iamVjdElkc0FuZENoYW5nZVRva2VucywgUHJvcGVydGllcyBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFkZFNlY29uZGFyeVR5cGVJZHMsIExpc3Q8U3RyaW5nPiByZW1vdmVTZWNvbmRhcnlUeXBlSWRzLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJidWxrVXBkYXRlUHJvcGVydGllcyIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmJ1bGtVcGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWRzQW5kQ2hhbmdlVG9rZW5zLCBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgIGFkZFNlY29uZGFyeVR5cGVJZHMsIHJlbW92ZVNlY29uZGFyeVR5cGVJZHMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW92ZU9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgU3RyaW5nIHRhcmdldEZvbGRlcklkLCBTdHJpbmcgc291cmNlRm9sZGVySWQsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJtb3ZlT2JqZWN0IiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5tb3ZlT2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHRhcmdldEZvbGRlcklkLCBzb3VyY2VGb2xkZXJJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVPYmplY3QoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBCb29sZWFuIGFsbFZlcnNpb25zLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJkZWxldGVPYmplY3QiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLmRlbGV0ZU9iamVjdChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBhbGxWZXJzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmFpbGVkVG9EZWxldGVEYXRhIGRlbGV0ZVRyZWUoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIGZvbGRlcklkLCBCb29sZWFuIGFsbFZlcnNpb25zLAotICAgICAgICAgICAgVW5maWxlT2JqZWN0IHVuZmlsZU9iamVjdHMsIEJvb2xlYW4gY29udGludWVPbkZhaWx1cmUsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImRlbGV0ZVRyZWUiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5kZWxldGVUcmVlKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIGFsbFZlcnNpb25zLCB1bmZpbGVPYmplY3RzLCBjb250aW51ZU9uRmFpbHVyZSwKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJlYW0oU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEJvb2xlYW4gb3ZlcndyaXRlRmxhZywKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coInNldENvbnRlbnRTdHJlYW0iLCByZXBvc2l0b3J5SWQpOwotICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLnNldENvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgb3ZlcndyaXRlRmxhZywgY2hhbmdlVG9rZW4sIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50U3RyZWFtKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VUb2tlbiwKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImRlbGV0ZUNvbnRlbnRTdHJlYW0iLCByZXBvc2l0b3J5SWQpOwotICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLmRlbGV0ZUNvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY2hhbmdlVG9rZW4sIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kQ29udGVudFN0cmVhbShTdHJpbmcgcmVwb3NpdG9yeUlkLCBIb2xkZXI8U3RyaW5nPiBvYmplY3RJZCwgSG9sZGVyPFN0cmluZz4gY2hhbmdlVG9rZW4sCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIGJvb2xlYW4gaXNMYXN0Q2h1bmssIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImFwcGVuZENvbnRlbnRTdHJlYW0iLCByZXBvc2l0b3J5SWQpOwotICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLmFwcGVuZENvbnRlbnRTdHJlYW0ocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgY2hhbmdlVG9rZW4sIGNvbnRlbnRTdHJlYW0sIGlzTGFzdENodW5rLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgSG9sZGVyPFN0cmluZz4gb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbiwKLSAgICAgICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkKSB7Ci0gICAgICAgIGxvZygiY2hlY2tPdXQiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICBnZXRXcmFwcGVkU2VydmljZSgpLmNoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGV4dGVuc2lvbiwgY29udGVudENvcGllZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2FuY2VsQ2hlY2tPdXQoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJjYW5jZWxDaGVja091dCIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkuY2FuY2VsQ2hlY2tPdXQocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja0luKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IG9iamVjdElkLCBCb29sZWFuIG1ham9yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sIFN0cmluZyBjaGVja2luQ29tbWVudCwgTGlzdDxTdHJpbmc+IHBvbGljaWVzLCBBY2wgYWRkQWNlcywgQWNsIHJlbW92ZUFjZXMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJjaGVja0luIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5jaGVja0luKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG1ham9yLCBwcm9wZXJ0aWVzLCBjb250ZW50U3RyZWFtLCBjaGVja2luQ29tbWVudCwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgYWRkQWNlcywgcmVtb3ZlQWNlcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0RGF0YSBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24oU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBTdHJpbmcgdmVyc2lvblNlcmllc0lkLAotICAgICAgICAgICAgQm9vbGVhbiBtYWpvciwgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsCi0gICAgICAgICAgICBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLCBCb29sZWFuIGluY2x1ZGVQb2xpY3lJZHMsIEJvb2xlYW4gaW5jbHVkZUFjbCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygiZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwKLSAgICAgICAgICAgIEJvb2xlYW4gbWFqb3IsIFN0cmluZyBmaWx0ZXIsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldFByb3BlcnRpZXNPZkxhdGVzdFZlcnNpb24iLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRQcm9wZXJ0aWVzT2ZMYXRlc3RWZXJzaW9uKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHZlcnNpb25TZXJpZXNJZCwgbWFqb3IsIGZpbHRlciwKLSAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdERhdGE+IGdldEFsbFZlcnNpb25zKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIHZlcnNpb25TZXJpZXNJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldEFsbFZlcnNpb25zIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0QWxsVmVyc2lvbnMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdmVyc2lvblNlcmllc0lkLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdExpc3QgcXVlcnkoU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHN0YXRlbWVudCwgQm9vbGVhbiBzZWFyY2hBbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coInF1ZXJ5IiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkucXVlcnkocmVwb3NpdG9yeUlkLCBzdGF0ZW1lbnQsIHNlYXJjaEFsbFZlcnNpb25zLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywKLSAgICAgICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zaGlwcywgcmVuZGl0aW9uRmlsdGVyLCBtYXhJdGVtcywgc2tpcENvdW50LCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RMaXN0IGdldENvbnRlbnRDaGFuZ2VzKFN0cmluZyByZXBvc2l0b3J5SWQsIEhvbGRlcjxTdHJpbmc+IGNoYW5nZUxvZ1Rva2VuLCBCb29sZWFuIGluY2x1ZGVQcm9wZXJ0aWVzLAotICAgICAgICAgICAgU3RyaW5nIGZpbHRlciwgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEJpZ0ludGVnZXIgbWF4SXRlbXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldENvbnRlbnRDaGFuZ2VzIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuZ2V0Q29udGVudENoYW5nZXMocmVwb3NpdG9yeUlkLCBjaGFuZ2VMb2dUb2tlbiwgaW5jbHVkZVByb3BlcnRpZXMsIGZpbHRlciwKLSAgICAgICAgICAgICAgICBpbmNsdWRlUG9saWN5SWRzLCBpbmNsdWRlQWNsLCBtYXhJdGVtcywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPYmplY3RUb0ZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgQm9vbGVhbiBhbGxWZXJzaW9ucywKLSAgICAgICAgICAgIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImFkZE9iamVjdFRvRm9sZGVyIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5hZGRPYmplY3RUb0ZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgYWxsVmVyc2lvbnMsIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmb2xkZXJJZCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGxvZygicmVtb3ZlT2JqZWN0RnJvbUZvbGRlciIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkucmVtb3ZlT2JqZWN0RnJvbUZvbGRlcihyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBmb2xkZXJJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0TGlzdCBnZXRPYmplY3RSZWxhdGlvbnNoaXBzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQm9vbGVhbiBpbmNsdWRlU3ViUmVsYXRpb25zaGlwVHlwZXMsCi0gICAgICAgICAgICBSZWxhdGlvbnNoaXBEaXJlY3Rpb24gcmVsYXRpb25zaGlwRGlyZWN0aW9uLCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgZmlsdGVyLCBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLAotICAgICAgICAgICAgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldE9iamVjdFJlbGF0aW9uc2hpcHMiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRPYmplY3RSZWxhdGlvbnNoaXBzKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGluY2x1ZGVTdWJSZWxhdGlvbnNoaXBUeXBlcywKLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBEaXJlY3Rpb24sIHR5cGVJZCwgZmlsdGVyLCBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgbWF4SXRlbXMsIHNraXBDb3VudCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGdldEFjbChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gb25seUJhc2ljUGVybWlzc2lvbnMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImdldEFjbCIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmdldEFjbChyZXBvc2l0b3J5SWQsIG9iamVjdElkLCBvbmx5QmFzaWNQZXJtaXNzaW9ucywgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNsIGFwcGx5QWNsKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgQWNsIGFkZEFjZXMsIEFjbCByZW1vdmVBY2VzLAotICAgICAgICAgICAgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24sIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImFwcGx5QWNsIiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgcmV0dXJuIGdldFdyYXBwZWRTZXJ2aWNlKCkuYXBwbHlBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWRkQWNlcywgcmVtb3ZlQWNlcywgYWNsUHJvcGFnYXRpb24sIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImFwcGx5UG9saWN5IiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5hcHBseVBvbGljeShyZXBvc2l0b3J5SWQsIHBvbGljeUlkLCBvYmplY3RJZCwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQb2xpY3koU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIHBvbGljeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coInJlbW92ZVBvbGljeSIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIGdldFdyYXBwZWRTZXJ2aWNlKCkucmVtb3ZlUG9saWN5KHJlcG9zaXRvcnlJZCwgcG9saWN5SWQsIG9iamVjdElkLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE9iamVjdERhdGE+IGdldEFwcGxpZWRQb2xpY2llcyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJnZXRSZXBvc2l0b3J5SW5mb3MiLCByZXBvc2l0b3J5SWQpOwotICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFNlcnZpY2UoKS5nZXRBcHBsaWVkUG9saWNpZXMocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgZmlsdGVyLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlKFN0cmluZyByZXBvc2l0b3J5SWQsIFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGZvbGRlcklkLCBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0sCi0gICAgICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBMaXN0PFN0cmluZz4gcG9saWNpZXMsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICBsb2coImNyZWF0ZSIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmNyZWF0ZShyZXBvc2l0b3J5SWQsIHByb3BlcnRpZXMsIGZvbGRlcklkLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUsIHBvbGljaWVzLAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVsZXRlT2JqZWN0T3JDYW5jZWxDaGVja091dChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIEJvb2xlYW4gYWxsVmVyc2lvbnMsCi0gICAgICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgbG9nKCJkZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0IiwgcmVwb3NpdG9yeUlkKTsKLSAgICAgICAgZ2V0V3JhcHBlZFNlcnZpY2UoKS5kZWxldGVPYmplY3RPckNhbmNlbENoZWNrT3V0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFsbFZlcnNpb25zLCBleHRlbnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2wgYXBwbHlBY2woU3RyaW5nIHJlcG9zaXRvcnlJZCwgU3RyaW5nIG9iamVjdElkLCBBY2wgYWNlcywgQWNsUHJvcGFnYXRpb24gYWNsUHJvcGFnYXRpb24pIHsKLSAgICAgICAgbG9nKCJhcHBseUFjbCIsIHJlcG9zaXRvcnlJZCk7Ci0gICAgICAgIHJldHVybiBnZXRXcmFwcGVkU2VydmljZSgpLmFwcGx5QWNsKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIGFjZXMsIGFjbFByb3BhZ2F0aW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvdGVzdC9ndW5pdC9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DTUlTUUwudGVzdHN1aXRlIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvZ3VuaXQvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQ01JU1FMLnRlc3RzdWl0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlOGE2Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvdGVzdC9ndW5pdC9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9DTUlTUUwudGVzdHN1aXRlCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgIFN0ZWZhbmUgRmVybWlnaWVyLCBOdXhlbwotICogICAgIEZsb3JlbnQgR3VpbGxhdW1lLCBOdXhlbwotICovCi1ndW5pdCBDTUlTUUw7Ci0KLUBoZWFkZXJ7Ci1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5OwotfQotCi0vLyAtLS0tLSBMZXhlciB0ZXN0cyAtLS0tLQotCi1JRDoKLSJhIiBPSwotIiEiIEZBSUwKLSJ0b3RvIiBPSwotInRvdG8xMjMiIE9LCi0idG90bzEyM18iIE9LCi0iX2ZvbyIgT0sKLSJmb286YmFyIiBPSwotIjEyMyIgRkFJTAotIjEyM2FiYyIgRkFJTAotCi1OVU1fTElUOgotIjEyMyIgT0sKLSIwIiBPSwotIi0wIiBPSwotIjEiIE9LCi0iLTEiIE9LCi0iLTEyMyIgT0sKLSIwMTIzIiBPSwotIi0wMTIzIiBPSwotIjEyM2FiYyIgRkFJTAotIjEyM0UiIEZBSUwKLSIxMjMuNDU2IiBPSwotIisxMjMuNDU2IiBPSwotIi0xMjMuNDU2IiBPSwotIi40NTYiIE9LCi0iKy40NTYiIE9LCi0iLS40NTYiIE9LCi0iMTIzLiIgT0sKLSIrMTIzLiIgT0sKLSItMTIzLiIgT0sKLSIrMTIzLjQ1NkU3OCIgT0sKLSItMTIzLjQ1NkUtNzgiIE9LCi0iLjQ1NkU3OCIgT0sKLSIrMTIzLkUrNzgiIE9LCi0KLVNUUklOR19MSVQ6Ci0iJ2FiYyciIE9LCi0iJ2EnJ2JjJyIgT0sKLSInYWJjIiBGQUlMCi0iYWJjJyIgRkFJTAotIidhYidjJyIgRkFJTAotCi1CT09MX0xJVDoKLSJUUlVFIiBPSwotInRydWUiIE9LCi0iRkFMU0UiIE9LCi0iZmFsc2UiIE9LCi0KLVRJTUVfTElUOgotIlRJTUVTVEFNUCAnMjAxMC0wMS0wMVowMTowMTowMS4wMDBaJyIgT0sKLSJ0aW1lc3RhbXAgICAnMTIzJyIgT0sKLSJUSU1FU1RBTVAgMTIzIiBGQUlMCi0KLS8vIC0tLS0tIFBhcnNlciB0ZXN0cyAtLS0tLQotCi1saXRlcmFsOgotIjEyMyIgT0sKLSItMTIzIiBPSwotIjAiIE9LCi0iMDEyMyIgT0sKLSJhYmMxMjMiIE9LCi0iMTIzYWJjIiBGQUlMCi0iJ2FiYyciIE9LCi0iMTIzLjM0NUU3OCIgT0sKLQotb3JkZXJfYnlfY2xhdXNlOgotIk9SREVSIEJZIGZvbyIgLT4gKE9SREVSX0JZIChDT0wgZm9vKSBBU0MpCi0iT1JERVIgQlkgZm9vIEFTQyIgLT4gKE9SREVSX0JZIChDT0wgZm9vKSBBU0MpCi0iT1JERVIgQlkgZm9vIERFU0MiIC0+IChPUkRFUl9CWSAoQ09MIGZvbykgREVTQykKLSJPUkRFUiBCWSB0LmZvbywgYmFyIERFU0MiIC0+IChPUkRFUl9CWSAoQ09MIHQgZm9vKSBBU0MgKENPTCBiYXIpIERFU0MpCi0KLWNvbHVtbl9yZWZlcmVuY2U6Ci0iZm9vIiAtPiAoQ09MIGZvbykKLSJiYXIuZm9vIiAtPiAoQ09MIGJhciBmb28pCi0KLWZyb21fY2xhdXNlOgotIkZST00gZm9vIEpPSU4gYmFyIE9OIHggPSB5IiAtPiAoRlJPTSAoVEFCTEUgZm9vKSAoSk9JTiBJTk5FUiAoVEFCTEUgYmFyKSAoT04gKENPTCB4KSA9IChDT0wgeSkpKSkKLQotdGFibGVfam9pbjoKLSJMRUZUIE9VVEVSIEpPSU4gZm9vIE9OIHggPSB5IiAtPiAoSk9JTiBMRUZUIChUQUJMRSBmb28pIChPTiAoQ09MIHgpID0gKENPTCB5KSkpCi0iSU5ORVIgSk9JTiBmb28iIC0+IChKT0lOIElOTkVSIChUQUJMRSBmb28pKQotCi1vbmVfdGFibGU6Ci0iZm9vIiAtPiAoVEFCTEUgZm9vKQotImZvbyBiYXIiIC0+IChUQUJMRSBmb28gYmFyKQotImZvbyBBUyBiYXIiIC0+IChUQUJMRSBmb28gYmFyKQotIihmb28pIiAtPiAoVEFCTEUgZm9vKQotCi1pbl9wcmVkaWNhdGU6Ci0iZm9vIElOICggJ2EnLCAnYicsICdjJykiIC0+IChCSU5fT1AgSU4gKENPTCBmb28pIChMSVNUICdhJyAnYicgJ2MnKSkKLSJmb28gTk9UIElOICggMSwgMiwgMykiIC0+IChCSU5fT1AgTk9UX0lOIChDT0wgZm9vKSAoTElTVCAxIDIgMykpCi0KLXF1YW50aWZpZWRfaW5fcHJlZGljYXRlOgotIkFOWSBmb28gSU4gKCdhJywgMSkiIC0+IChCSU5fT1BfQU5ZIElOIChMSVNUICdhJyAxKSAoQ09MIGZvbykpCi0KLWNvbXBhcmlzb25fcHJlZGljYXRlOgotImZvbyA9IDEiIC0+IChCSU5fT1AgPSAoQ09MIGZvbykgMSkKLSJmb28gPD4gMSIgLT4gKEJJTl9PUCA8PiAoQ09MIGZvbykgMSkKLQotcHJlZGljYXRlOgotImZvbyA9IDEiIC0+IChCSU5fT1AgPSAoQ09MIGZvbykgMSkKLSJmb28gSU4gKCdiYXInKSIgLT4gKEJJTl9PUCBJTiAoQ09MIGZvbykgKExJU1QgJ2JhcicpKQotImZvbyBJUyBOVUxMIiAtPiAoVU5fT1AgSVNfTlVMTCAoQ09MIGZvbykpCi0iZm9vIElTIE5PVCBOVUxMIiAtPiAoVU5fT1AgSVNfTk9UX05VTEwgKENPTCBmb28pKQotIjEgPSBBTlkgZm9vIiAtPiAoQklOX09QX0FOWSA9IDEgKENPTCBmb28pKQotIkxPV0VSKGZvbykgPSAnYmFyJyIgLT4gKEJJTl9PUCA9IChGVU5DIExPV0VSIChDT0wgZm9vKSkgJ2JhcicpCi0icXV1eChmb28pID0gJ2JhciciIC0+IChCSU5fT1AgPSAoRlVOQyBxdXV4IChDT0wgZm9vKSkgJ2JhcicpCi0KLWZvbGRlcl9wcmVkaWNhdGU6Ci0iSU5fRk9MREVSKGZvbywnSUQxMjMnKSIgLT4gKEZVTkMgSU5fRk9MREVSIGZvbyAnSUQxMjMnKQotIklOX0ZPTERFUignSUQxMjMnKSIgLT4gKEZVTkMgSU5fRk9MREVSICdJRDEyMycpCi0iSU5fVFJFRShmb28sJ0lEMTIzJykiIC0+IChGVU5DIElOX1RSRUUgZm9vICdJRDEyMycpCi0iSU5fVFJFRSgnSUQxMjMnKSIgLT4gKEZVTkMgSU5fVFJFRSAnSUQxMjMnKQotCi10ZXh0X3NlYXJjaF9wcmVkaWNhdGU6Ci0iQ09OVEFJTlMoJ2ZvbycpIiAtPiAoRlVOQyBDT05UQUlOUyAnZm9vJykKLSJDT05UQUlOUyhiYXIsICdmb28nKSIgLT4gKEZVTkMgQ09OVEFJTlMgYmFyICdmb28nKQotCi13aGVyZV9jbGF1c2U6Ci0iV0hFUkUgZm9vID0gMSIgLT4gKFdIRVJFIChCSU5fT1AgPSAoQ09MIGZvbykgMSkpCi0iV0hFUkUgYSA9IDEgQU5EIGIgPD4gMiBPUiBjID49IDMgQU5EIE5PVCBkIDw9IDQiIC0+IChXSEVSRSAoQklOX09QID0gKENPTCBhKSAxKSBBTkQgKEJJTl9PUCA8PiAoQ09MIGIpIDIpIE9SIChCSU5fT1AgPj0gKENPTCBjKSAzKSBBTkQgTk9UIChCSU5fT1AgPD0gKENPTCBkKSA0KSkKLQotcXVlcnk6Ci0iU0VMRUNUICogRlJPTSBEb2N1bWVudCIgLT4gKFNFTEVDVCAqIChGUk9NIChUQUJMRSBEb2N1bWVudCkpKQotIlNFTEVDVCBhLCBiLCBjIEZST00gRG9jdW1lbnQiIC0+IChTRUxFQ1QgKExJU1QgKENPTCBhKSAoQ09MIGIpIChDT0wgYykpIChGUk9NIChUQUJMRSBEb2N1bWVudCkpKQotIlNFTEVDVCBhLCBiIEZST00gRG9jdW1lbnQgT1JERVIgQlkgYSwgYiIgLT4gKFNFTEVDVCAoTElTVCAoQ09MIGEpIChDT0wgYikpIChGUk9NIChUQUJMRSBEb2N1bWVudCkpIChPUkRFUl9CWSAoQ09MIGEpIEFTQyAoQ09MIGIpIEFTQykpCi0iU0VMRUNUIERJU1RJTkNUIGEsIGIsIGMgRlJPTSBEb2N1bWVudCIgLT4gKFNFTEVDVCBESVNUSU5DVCAoTElTVCAoQ09MIGEpIChDT0wgYikgKENPTCBjKSkgKEZST00gKFRBQkxFIERvY3VtZW50KSkpCi0KLQotLy8gRXhhbXBsZXMgZnJvbSB0aGUgc3BlY3MuCi0KLTw8Ci1TRUxFQ1QgVElUTEUsIEFVVEhPUlMsIERBVEUKLUZST00gV0hJVEVfUEFQRVIKLVdIRVJFICggSU5fVFJFRSgnSUQwMDA5Mzg1NDc2MycpICkgQU5EICggJ1NNSVRIJyA9IEFOWSBBVVRIT1JTICkKLT4+IC0+IChTRUxFQ1QgKExJU1QgKENPTCBUSVRMRSkgKENPTCBBVVRIT1JTKSAoQ09MIERBVEUpKSAoRlJPTSAoVEFCTEUgV0hJVEVfUEFQRVIpKSAoV0hFUkUgKCAoRlVOQyBJTl9UUkVFICdJRDAwMDkzODU0NzYzJykgKSBBTkQgKCAoQklOX09QX0FOWSA9ICdTTUlUSCcgKENPTCBBVVRIT1JTKSkgKSkpCi0KLTw8Ci1TRUxFQ1QgT0JKRUNUX0lELCBTQ09SRSgpIEFTIFgsIERFU1RJTkFUSU9OLCBERVBBUlRVUkVfREFURVMKLUZST00gVFJBVkVMX0JST0NIVVJFCi1XSEVSRSAoIENPTlRBSU5TKCdDQVJJQkJFQU4gQ0VOVFJBTCBBTUVSSUNBIENSVUlTRSBUT1VSJykgKSBBTkQKLSAgKCAnMjAxMC0xLTEnIDwgQU5ZIERFUEFSVFVSRV9EQVRFUyApCi1PUkRFUiBCWSBYIERFU0MKLT4+IE9LCi0KLTw8Ci1TRUxFQ1QgKgotRlJPTSBDQVJfUkVWSUVXCi1XSEVSRSAoIExPV0VSKE1BS0UpID0gJ2J1aWNrJyApIE9SCi0gICggQU5ZIEZFQVRVUkVTIElOICgnTkFWSUdBVElPTiBTWVNURU0nLCAnU0FURUxMSVRFIFJBRElPJywgJ01QMycgKSApCi0+PiBPSwotCi08PAotU0VMRUNUIFkuQ0xBSU1fTlVNLCBYLlBST1BFUlRZX0FERFJFU1MsIFkuREFNQUdFX0VTVElNQVRFUwotRlJPTSBQT0xJQ1kgQVMgWCBKT0lOIENMQUlNUyBBUyBZIE9OIFguUE9MSUNZX05VTSA9IFkuUE9MSUNZX05VTQotV0hFUkUgKCAxMDAwMDAgPD0gQU5ZIFkuREFNQUdFX0VTVElNQVRFUyApIEFORCAoIFkuQ0FVU0UgTk9UIExJS0UgJyVLYXRyaW5hJScgKQotPj4gT0sKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvVHlwZURlZmluaXRpb25GYWN0b3J5VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9UeXBlRGVmaW5pdGlvbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDVmYzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9UeXBlRGVmaW5pdGlvbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlRGVmaW5pdGlvbkZhY3RvcnlUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFR5cGVEZWZpbml0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25GYWN0b3J5IHRkZiA9IFR5cGVEZWZpbml0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRkZik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGRmLmdldERvY3VtZW50VHlwZURlZmluaXRpb25DbGFzcygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZGYuZ2V0Rm9sZGVyVHlwZURlZmluaXRpb25DbGFzcygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZGYuZ2V0UG9saWN5VHlwZURlZmluaXRpb25DbGFzcygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZGYuZ2V0UmVsYXRpb25zaGlwVHlwZURlZmluaXRpb25DbGFzcygpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZGYuZ2V0SXRlbVR5cGVEZWZpbml0aW9uQ2xhc3MoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGRmLmdldFNlY29uZGFyeVR5cGVEZWZpbml0aW9uQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQmFzZVR5cGVzKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdGRmID0gVHlwZURlZmluaXRpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gQ21pc1ZlcnNpb24uQ01JU18xXzE7Ci0KLSAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb24odGRmLmNyZWF0ZUJhc2VEb2N1bWVudFR5cGVEZWZpbml0aW9uKGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgIGFzc2VydFR5cGVEZWZpbml0aW9uKHRkZi5jcmVhdGVCYXNlRm9sZGVyVHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24pKTsKLSAgICAgICAgYXNzZXJ0VHlwZURlZmluaXRpb24odGRmLmNyZWF0ZUJhc2VQb2xpY3lUeXBlRGVmaW5pdGlvbihjbWlzVmVyc2lvbikpOwotICAgICAgICBhc3NlcnRUeXBlRGVmaW5pdGlvbih0ZGYuY3JlYXRlQmFzZVJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgIGFzc2VydFR5cGVEZWZpbml0aW9uKHRkZi5jcmVhdGVCYXNlSXRlbVR5cGVEZWZpbml0aW9uKGNtaXNWZXJzaW9uKSk7Ci0gICAgICAgIGFzc2VydFR5cGVEZWZpbml0aW9uKHRkZi5jcmVhdGVCYXNlU2Vjb25kYXJ5VHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24pKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5MTEoKSB7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uRmFjdG9yeSB0ZGYgPSBUeXBlRGVmaW5pdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgQ21pc1ZlcnNpb24gY21pc1ZlcnNpb24gPSBDbWlzVmVyc2lvbi5DTUlTXzFfMTsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbiBkb2NUeXBlMSA9IHRkZi5jcmVhdGVCYXNlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihjbWlzVmVyc2lvbik7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIGRvY1R5cGUyID0gdGRmLmNvcHkoZG9jVHlwZTEsIGZhbHNlLCBjbWlzVmVyc2lvbik7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIGRvY1R5cGUzID0gdGRmLmNvcHkoZG9jVHlwZTEsIHRydWUsIGNtaXNWZXJzaW9uKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGRvY1R5cGUyLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5pc0VtcHR5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZG9jVHlwZTEuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnNpemUoKSwgZG9jVHlwZTMuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnNpemUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weTEwKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdGRmID0gVHlwZURlZmluaXRpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gQ21pc1ZlcnNpb24uQ01JU18xXzA7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gZG9jVHlwZTEgPSB0ZGYuY3JlYXRlQmFzZURvY3VtZW50VHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24pOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiBkb2NUeXBlMiA9IHRkZi5jb3B5KGRvY1R5cGUxLCBmYWxzZSwgY21pc1ZlcnNpb24pOwotICAgICAgICBUeXBlRGVmaW5pdGlvbiBkb2NUeXBlMyA9IHRkZi5jb3B5KGRvY1R5cGUxLCB0cnVlLCBjbWlzVmVyc2lvbik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkb2NUeXBlMi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRvY1R5cGUxLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCksIGRvY1R5cGUzLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdCgpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25GYWN0b3J5IHRkZiA9IFR5cGVEZWZpbml0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBDbWlzVmVyc2lvbiBjbWlzVmVyc2lvbiA9IENtaXNWZXJzaW9uLkNNSVNfMV8xOwotICAgICAgICBNYXA8U3RyaW5nLCBUeXBlRGVmaW5pdGlvbj4gdHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFR5cGVEZWZpbml0aW9uPigpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGU7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIGRvY1R5cGU7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIGZvbGRlclR5cGU7Ci0KLSAgICAgICAgZG9jVHlwZSA9IHRkZi5jcmVhdGVCYXNlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihjbWlzVmVyc2lvbik7Ci0gICAgICAgIHR5cGVzLnB1dChkb2NUeXBlLmdldElkKCksIGRvY1R5cGUpOwotCi0gICAgICAgIHR5cGUgPSB0ZGYuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihkb2NUeXBlLCAidGVzdDpkb2NUeXBlMSIpOwotICAgICAgICB0eXBlcy5wdXQodHlwZS5nZXRJZCgpLCB0eXBlKTsKLQotICAgICAgICB0eXBlID0gdGRmLmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oZG9jVHlwZSwgInRlc3Q6ZG9jVHlwZTIiKTsKLSAgICAgICAgdHlwZXMucHV0KHR5cGUuZ2V0SWQoKSwgdHlwZSk7Ci0KLSAgICAgICAgdHlwZSA9IHRkZi5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGRvY1R5cGUsICJ0ZXN0OmRvY1R5cGUzIik7Ci0gICAgICAgIHR5cGVzLnB1dCh0eXBlLmdldElkKCksIHR5cGUpOwotCi0gICAgICAgIHR5cGUgPSB0ZGYuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihkb2NUeXBlLCAidGVzdDpkb2NUeXBlNCIpOwotICAgICAgICB0eXBlcy5wdXQodHlwZS5nZXRJZCgpLCB0eXBlKTsKLQotICAgICAgICB0eXBlID0gdGRmLmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24oZG9jVHlwZSwgInRlc3Q6ZG9jVHlwZTUiKTsKLSAgICAgICAgdHlwZXMucHV0KHR5cGUuZ2V0SWQoKSwgdHlwZSk7Ci0KLSAgICAgICAgZm9sZGVyVHlwZSA9IHRkZi5jcmVhdGVCYXNlRm9sZGVyVHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24pOwotICAgICAgICB0eXBlcy5wdXQoZm9sZGVyVHlwZS5nZXRJZCgpLCBmb2xkZXJUeXBlKTsKLQotICAgICAgICBUeXBlRGVmaW5pdGlvbkxpc3QgdGRsMSA9IHRkZi5jcmVhdGVUeXBlRGVmaW5pdGlvbkxpc3QodHlwZXMsIG51bGwsIHRydWUsIG51bGwsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRkbDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdGRsMS5nZXRMaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHRkbDEuZ2V0TnVtSXRlbXMoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRkbDEuaGFzTW9yZUl0ZW1zKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiY21pczpkb2N1bWVudCIsIHRkbDEuZ2V0TGlzdCgpLmdldCgwKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbWlzOmZvbGRlciIsIHRkbDEuZ2V0TGlzdCgpLmdldCgxKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDI2LCB0ZGwxLmdldExpc3QoKS5nZXQoMCkuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxNCwgdGRsMS5nZXRMaXN0KCkuZ2V0KDEpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCkpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdCB0ZGwyID0gdGRmLmNyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdCh0eXBlcywgImNtaXM6ZG9jdW1lbnQiLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGRsMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCB0ZGwyLmdldExpc3QoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgdGRsMi5nZXROdW1JdGVtcygpLmludFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdGRsMi5oYXNNb3JlSXRlbXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUodGRsMi5nZXRMaXN0KCkuZ2V0KDApLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdCB0ZGwzID0gdGRmLmNyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdCh0eXBlcywgImNtaXM6ZG9jdW1lbnQiLCB0cnVlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMyksCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci5aRVJPKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZGwzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHRkbDMuZ2V0TGlzdCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCB0ZGwzLmdldE51bUl0ZW1zKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHRkbDMuaGFzTW9yZUl0ZW1zKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSh0ZGwzLmdldExpc3QoKS5nZXQoMCkuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb25MaXN0IHRkbDQgPSB0ZGYuY3JlYXRlVHlwZURlZmluaXRpb25MaXN0KHR5cGVzLCAiY21pczpkb2N1bWVudCIsIHRydWUsIEJpZ0ludGVnZXIudmFsdWVPZigzKSwKLSAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRkbDQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgdGRsNC5nZXRMaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHRkbDQuZ2V0TnVtSXRlbXMoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRkbDQuaGFzTW9yZUl0ZW1zKCkpOwotCi0gICAgICAgIFR5cGVEZWZpbml0aW9uTGlzdCB0ZGw1ID0gdGRmLmNyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdCh0eXBlcywgImNtaXM6ZG9jdW1lbnQiLCB0cnVlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMiksCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKDIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZGw1KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHRkbDUuZ2V0TGlzdCgpLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCB0ZGw1LmdldE51bUl0ZW1zKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHRkbDUuaGFzTW9yZUl0ZW1zKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygidGVzdDpkb2NUeXBlMSIsIHRkbDIuZ2V0TGlzdCgpLmdldCgwKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0OmRvY1R5cGUyIiwgdGRsMi5nZXRMaXN0KCkuZ2V0KDEpLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Q6ZG9jVHlwZTMiLCB0ZGwyLmdldExpc3QoKS5nZXQoMikuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdDpkb2NUeXBlNCIsIHRkbDIuZ2V0TGlzdCgpLmdldCgzKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0OmRvY1R5cGU1IiwgdGRsMi5nZXRMaXN0KCkuZ2V0KDQpLmdldElkKCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh0ZGwyLmdldExpc3QoKS5nZXQoMCkuZ2V0SWQoKSwgdGRsMy5nZXRMaXN0KCkuZ2V0KDApLmdldElkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModGRsMi5nZXRMaXN0KCkuZ2V0KDIpLmdldElkKCksIHRkbDQuZ2V0TGlzdCgpLmdldCgwKS5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRkbDIuZ2V0TGlzdCgpLmdldCgyKS5nZXRJZCgpLCB0ZGw1LmdldExpc3QoKS5nZXQoMCkuZ2V0SWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZGw0LmdldExpc3QoKS5nZXQoMCkuZ2V0SWQoKSwgdGRsNS5nZXRMaXN0KCkuZ2V0KDApLmdldElkKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdE9iamVjdCgpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25GYWN0b3J5IHRkZiA9IFR5cGVEZWZpbml0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwodGRmLmNyZWF0ZVR5cGVEZWZpbml0aW9uTGlzdChDb2xsZWN0aW9ucy48VHlwZURlZmluaXRpb24+IGVtcHR5TGlzdCgpLCB0cnVlLCBudWxsKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRkZi5jcmVhdGVUeXBlRGVmaW5pdGlvbkxpc3QobnVsbCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRkZi5jcmVhdGVUeXBlRGVmaW5pdGlvbkxpc3QoQ29sbGVjdGlvbnMuPFR5cGVEZWZpbml0aW9uPiBlbXB0eUxpc3QoKSwgdHJ1ZSwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVHlwZURlc2NlbmRhbnRzKCkgewotICAgICAgICBUeXBlRGVmaW5pdGlvbkZhY3RvcnkgdGRmID0gVHlwZURlZmluaXRpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIENtaXNWZXJzaW9uIGNtaXNWZXJzaW9uID0gQ21pc1ZlcnNpb24uQ01JU18xXzE7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFR5cGVEZWZpbml0aW9uPiB0eXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHlwZURlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZTsKLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZTI7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIGRvY1R5cGU7Ci0gICAgICAgIFR5cGVEZWZpbml0aW9uIGZvbGRlclR5cGU7Ci0KLSAgICAgICAgZG9jVHlwZSA9IHRkZi5jcmVhdGVCYXNlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihjbWlzVmVyc2lvbik7Ci0gICAgICAgIHR5cGVzLnB1dChkb2NUeXBlLmdldElkKCksIGRvY1R5cGUpOwotCi0gICAgICAgIHR5cGUgPSB0ZGYuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbihkb2NUeXBlLCAidGVzdDpkb2NUeXBlMSIpOwotICAgICAgICB0eXBlcy5wdXQodHlwZS5nZXRJZCgpLCB0eXBlKTsKLQotICAgICAgICB0eXBlMiA9IHRkZi5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKGRvY1R5cGUsICJ0ZXN0OmRvY1R5cGUyIik7Ci0gICAgICAgIHR5cGVzLnB1dCh0eXBlMi5nZXRJZCgpLCB0eXBlMik7Ci0KLSAgICAgICAgdHlwZSA9IHRkZi5jcmVhdGVDaGlsZFR5cGVEZWZpbml0aW9uKHR5cGUyLCAidGVzdDpkb2NUeXBlMi0xIik7Ci0gICAgICAgIHR5cGVzLnB1dCh0eXBlLmdldElkKCksIHR5cGUpOwotCi0gICAgICAgIHR5cGUgPSB0ZGYuY3JlYXRlQ2hpbGRUeXBlRGVmaW5pdGlvbih0eXBlMiwgInRlc3Q6ZG9jVHlwZTItMiIpOwotICAgICAgICB0eXBlcy5wdXQodHlwZS5nZXRJZCgpLCB0eXBlKTsKLQotICAgICAgICB0eXBlID0gdGRmLmNyZWF0ZUNoaWxkVHlwZURlZmluaXRpb24odHlwZTIsICJ0ZXN0OmRvY1R5cGUyLTMiKTsKLSAgICAgICAgdHlwZXMucHV0KHR5cGUuZ2V0SWQoKSwgdHlwZSk7Ci0KLSAgICAgICAgZm9sZGVyVHlwZSA9IHRkZi5jcmVhdGVCYXNlRm9sZGVyVHlwZURlZmluaXRpb24oY21pc1ZlcnNpb24pOwotICAgICAgICB0eXBlcy5wdXQoZm9sZGVyVHlwZS5nZXRJZCgpLCBmb2xkZXJUeXBlKTsKLQotICAgICAgICBMaXN0PFR5cGVEZWZpbml0aW9uQ29udGFpbmVyPiB0eXBlRGVmczsKLQotICAgICAgICB0eXBlRGVmcyA9IHRkZi5jcmVhdGVUeXBlRGVzY2VuZGFudHModHlwZXMsIG51bGwsIEJpZ0ludGVnZXIudmFsdWVPZigtMSksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVEZWZzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHR5cGVEZWZzLnNpemUoKSk7Ci0KLSAgICAgICAgdHlwZURlZnMgPSB0ZGYuY3JlYXRlVHlwZURlc2NlbmRhbnRzKHR5cGVzLCBudWxsLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHR5cGVEZWZzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHR5cGVEZWZzLnNpemUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVHlwZUNvbnRhaW5lck9iamVjdCgpIHsKLSAgICAgICAgVHlwZURlZmluaXRpb25GYWN0b3J5IHRkZiA9IFR5cGVEZWZpbml0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwodGRmLmNyZWF0ZVR5cGVEZWZpbml0aW9uQ29udGFpbmVyKHRkZi5jcmVhdGVCYXNlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihDbWlzVmVyc2lvbi5DTUlTXzFfMSksCi0gICAgICAgICAgICAgICAgbnVsbCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZGYuY3JlYXRlVHlwZURlZmluaXRpb25Db250YWluZXIobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFR5cGVEZWZpbml0aW9uKFR5cGVEZWZpbml0aW9uIHR5cGVEZWYpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0eXBlRGVmLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodHlwZURlZi5nZXRJZCgpKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQWJzdHJhY3RQYXJzZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L0Fic3RyYWN0UGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWM5NzBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvQWJzdHJhY3RQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkFOVExSU3RyaW5nU3RyZWFtOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkJhc2VSZWNvZ25pemVyOwotaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLkNoYXJTdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuQ29tbW9uVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuTGV4ZXI7Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW47Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUudHJlZS5Db21tb25UcmVlOwotaW1wb3J0IG9yZy5hbnRsci5zdHJpbmd0ZW1wbGF0ZS5TdHJpbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgY2xvbmUgb2Ygb3JnLmFudGxyLmd1bml0LmdVbml0QmFzZSBjbGFzcyBhZGFwdGVkIHRvIEphdmEgc3R5bGUKLSAqIEJlY2F1c2UgdGhlIG9yaWdpbmFsIGNsYXNzIGNhbid0IGRlYWwgd2l0aCBjb21wb3NpdGUgZ3JhbW1hciB0aGlzIGlzIGEKLSAqIHJlcGxhY2VtZW50IHdvcmtpbmcgYXJvdW5kIHRoaXMgYW50bHIgYnVnLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFBhcnNlclRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFic3RyYWN0UGFyc2VyVGVzdC5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHN1cGVyR3JhbW1hck5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBiYXNlTGV4ZXJOYW1lOwotICAgIENsYXNzPD8+IGxleGVyOwotICAgIENsYXNzPD8+IHBhcnNlcjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRyZWVQYXJzZXJQYXRoOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoQ2xhc3M8Pz4gbGV4ZXJDbGFzcywgQ2xhc3M8Pz4gcGFyc2VyQ2xhc3MsIFN0cmluZyBiYXNlR3JhbW1hciwgU3RyaW5nIGJhc2VMZXhlcikgewotICAgICAgICBsZXhlciA9IGxleGVyQ2xhc3M7Ci0gICAgICAgIHBhcnNlciA9IHBhcnNlckNsYXNzOwotICAgICAgICB0aGlzLnN1cGVyR3JhbW1hck5hbWUgPSBiYXNlR3JhbW1hcjsKLSAgICAgICAgdGhpcy5iYXNlTGV4ZXJOYW1lID0gYmFzZUxleGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RMZXhlck9rKFN0cmluZyBydWxlLCBTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIC8vIHRlc3QgaW5wdXQ6ICJhIgotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHJldHZhbCA9IGV4ZWNMZXhlcihydWxlLCBzdGF0ZW1lbnQpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0ZXN0aW5nIHJ1bGUgIiArIHJ1bGUgKyAiIHBhcnNlZCB0bzogIiArIHJldHZhbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJ0ZXN0aW5nIHJ1bGUgIiArIHJ1bGUgKyAiOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RMZXhlckZhaWwoU3RyaW5nIHJ1bGUsIFN0cmluZyBzdGF0ZW1lbnQpIHsKLSAgICAgICAgLy8gdGVzdCBpbnB1dDogImEiCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dmFsID0gZXhlY0xleGVyKHJ1bGUsIHN0YXRlbWVudCk7Ci0gICAgICAgICAgICBmYWlsKCJ0ZXN0aW5nIHJ1bGUgc2hvdWxkIGZhaWwgIiArIHJ1bGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0ZXN0aW5nIHJ1bGUgIiArIHJ1bGUgKyAiIHBhcnNlZCB3aXRoIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVzdFBhcnNlck9rKFN0cmluZyBydWxlLCBTdHJpbmcgc3RhdGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dmFsID0gZXhlY1BhcnNlcihydWxlLCBzdGF0ZW1lbnQpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0ZXN0aW5nIHJ1bGUgIiArIHJ1bGUgKyAiIHBhcnNlZCB0bzogIiArIHJldHZhbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJ0ZXN0aW5nIHJ1bGUgIiArIHJ1bGUgKyAiIGZhaWxlZDogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0UGFyc2VyRmFpbChTdHJpbmcgcnVsZSwgU3RyaW5nIHN0YXRlbWVudCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHJldHZhbCA9IGV4ZWNQYXJzZXIocnVsZSwgc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGZhaWwoInRlc3RpbmcgcnVsZSBzaG91bGQgZmFpbCAiICsgcnVsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInRlc3RpbmcgcnVsZSAiICsgcnVsZSArICIgZmFpbGVkOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RQYXJzZXIoU3RyaW5nIHJ1bGUsIFN0cmluZyBzdGF0ZW1lbnQsIFN0cmluZyBleHBlY3RlZFJlc3VsdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IGFjdHVhbCA9IGV4ZWNQYXJzZXIocnVsZSwgc3RhdGVtZW50KTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidGVzdGluZyBydWxlICIgKyBydWxlICsgIiBwYXJzZWQgdG86ICIgKyBhY3R1YWwpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgidGVzdGluZyBydWxlICIgKyBydWxlICsgIiBmYWlsZWQ6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEludm9rZSB0YXJnZXQgbGV4ZXIucnVsZQotICAgIHB1YmxpYyBTdHJpbmcgZXhlY0xleGVyKFN0cmluZyB0ZXN0UnVsZU5hbWUsIFN0cmluZyB0ZXN0SW5wdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgQ2hhclN0cmVhbSBpbnB1dDsKLSAgICAgICAgLyoqIFNldCB1cCBBTlRMUiBpbnB1dCBzdHJlYW0gYmFzZWQgb24gaW5wdXQgc291cmNlLCBmaWxlIG9yIFN0cmluZyAqLwotICAgICAgICBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSh0ZXN0SW5wdXQpOwotCi0gICAgICAgIC8qKiBVc2UgUmVmbGVjdGlvbiB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGxleGVyIGFuZCBwYXJzZXIgKi8KLSAgICAgICAgQ2xhc3M8Pz5bXSBsZXhBcmdUeXBlcyA9IG5ldyBDbGFzc1tdIHsgQ2hhclN0cmVhbS5jbGFzcyB9OyAvLyBhc3NpZ24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV4ZXIncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ3MKLSAgICAgICAgQ29uc3RydWN0b3I8Pz4gbGV4Q29uc3RydWN0b3IgPSBsZXhlci5nZXRDb25zdHJ1Y3RvcihsZXhBcmdUeXBlcyk7Ci0gICAgICAgIE9iamVjdFtdIGxleEFyZ3MgPSBuZXcgT2JqZWN0W10geyBpbnB1dCB9OyAvLyBhc3NpZ24gdmFsdWUgdG8gbGV4ZXIncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJncwotICAgICAgICBPYmplY3QgbGV4T2JqID0gbGV4Q29uc3RydWN0b3IubmV3SW5zdGFuY2UobGV4QXJncyk7IC8vIG1ha2VzIG5ldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV4ZXIKLSAgICAgICAgTWV0aG9kIHJ1bGVOYW1lID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVsZU5hbWUgPSBsZXhlci5nZXRNZXRob2QoIm0iICsgdGVzdFJ1bGVOYW1lLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdHJ5IHN1cGVyY2xhc3MgbGV4ZXJzCi0gICAgICAgICAgICBDbGFzczw/PiBsZXhlclN1cGVyID0gQ2xhc3MuZm9yTmFtZShsZXhlci5nZXROYW1lKCkgKyAiXyIgKyBiYXNlTGV4ZXJOYW1lKTsKLSAgICAgICAgICAgIHJ1bGVOYW1lID0gbGV4ZXJTdXBlci5nZXRNZXRob2QoIm0iICsgdGVzdFJ1bGVOYW1lLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICAgICAgbGV4QXJnVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IENoYXJTdHJlYW0uY2xhc3MsIENtaXNRbFN0cmljdExleGVyLmNsYXNzIH07Ci0gICAgICAgICAgICBsZXhBcmdzID0gbmV3IE9iamVjdFtdIHsgaW5wdXQsIGxleE9iaiB9OwotICAgICAgICAgICAgbGV4Q29uc3RydWN0b3IgPSBsZXhlclN1cGVyLmdldENvbnN0cnVjdG9yKGxleEFyZ1R5cGVzKTsKLSAgICAgICAgICAgIGxleE9iaiA9IGxleENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGxleEFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIC8qKiBJbnZva2UgbGV4ZXIgcnVsZSwgYW5kIGdldCB0aGUgY3VycmVudCBpbmRleCBpbiBDaGFyU3RyZWFtICovCi0gICAgICAgIHJ1bGVOYW1lLmludm9rZShsZXhPYmosIG5ldyBPYmplY3RbMF0pOwotICAgICAgICBNZXRob2QgcnVsZU5hbWUyID0gbGV4ZXIuZ2V0TWV0aG9kKCJnZXRDaGFySW5kZXgiLCBuZXcgQ2xhc3NbMF0pOwotICAgICAgICBpbnQgY3VycmVudEluZGV4ID0gKEludGVnZXIpIHJ1bGVOYW1lMi5pbnZva2UobGV4T2JqLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgaWYgKGN1cnJlbnRJbmRleCAhPSBpbnB1dC5zaXplKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJleHRyYSB0ZXh0IGZvdW5kLCAnIiArIGlucHV0LnN1YnN0cmluZyhjdXJyZW50SW5kZXgsIGlucHV0LnNpemUoKSAtIDEpICsgIiciKTsKLSAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXh0cmEgdGV4dCBmb3VuZCwgJyIraW5wdXQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCwKLSAgICAgICAgICAgIC8vIGlucHV0LnNpemUoKS0xKSsiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBJbnZva2UgdGFyZ2V0IHBhcnNlci5ydWxlCi0gICAgcHVibGljIE9iamVjdCBleGVjUGFyc2VyKFN0cmluZyB0ZXN0UnVsZU5hbWUsIFN0cmluZyB0ZXN0SW5wdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgQ2hhclN0cmVhbSBpbnB1dDsKLSAgICAgICAgLyoqIFNldCB1cCBBTlRMUiBpbnB1dCBzdHJlYW0gYmFzZWQgb24gaW5wdXQgc291cmNlLCBmaWxlIG9yIFN0cmluZyAqLwotICAgICAgICBpbnB1dCA9IG5ldyBBTlRMUlN0cmluZ1N0cmVhbSh0ZXN0SW5wdXQpOwotCi0gICAgICAgIC8qKiBVc2UgUmVmbGVjdGlvbiB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGxleGVyIGFuZCBwYXJzZXIgKi8KLSAgICAgICAgLy8gYXNzaWduIHR5cGUgdG8gbGV4ZXIncyBhcmdzCi0gICAgICAgIENsYXNzPD8+W10gbGV4QXJnVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IENoYXJTdHJlYW0uY2xhc3MgfTsKLSAgICAgICAgQ29uc3RydWN0b3I8Pz4gbGV4Q29uc3RydWN0b3IgPSBsZXhlci5nZXRDb25zdHJ1Y3RvcihsZXhBcmdUeXBlcyk7Ci0KLSAgICAgICAgLy8gYXNzaWduIHZhbHVlIHRvIGxleGVyJ3MgYXJncwotICAgICAgICBPYmplY3RbXSBsZXhBcmdzID0gbmV3IE9iamVjdFtdIHsgaW5wdXQgfTsKLQotICAgICAgICAvLyBtYWtlcyBuZXcgaW5zdGFuY2Ugb2YgbGV4ZXIKLSAgICAgICAgT2JqZWN0IGxleE9iaiA9IGxleENvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGxleEFyZ3MpOwotCi0gICAgICAgIENvbW1vblRva2VuU3RyZWFtIHRva2VucyA9IG5ldyBDb21tb25Ub2tlblN0cmVhbSgoTGV4ZXIpIGxleE9iaik7Ci0gICAgICAgIAotICAgICAgICAvLyBhc3NpZ24gdHlwZSB0byBwYXJzZXIncyBhcmdzCi0gICAgICAgIENsYXNzPD8+W10gcGFyQXJnVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IFRva2VuU3RyZWFtLmNsYXNzIH07Ci0gICAgICAgIENvbnN0cnVjdG9yPD8+IHBhckNvbnN0cnVjdG9yID0gcGFyc2VyLmdldENvbnN0cnVjdG9yKHBhckFyZ1R5cGVzKTsKLQotICAgICAgICAvLyBhc3NpZ24gdmFsdWUgdG8gcGFyc2VyJ3MgYXJncwotICAgICAgICBPYmplY3RbXSBwYXJBcmdzID0gbmV3IE9iamVjdFtdIHsgdG9rZW5zIH07Ci0KLSAgICAgICAgLy8gbWFrZXMgbmV3IGluc3RhbmNlIG9mIHBhcnNlcgotICAgICAgICBPYmplY3QgcGFyT2JqID0gcGFyQ29uc3RydWN0b3IubmV3SW5zdGFuY2UocGFyQXJncyk7Ci0KLSAgICAgICAgTWV0aG9kIHJ1bGVOYW1lID0gcGFyc2VyLmdldE1ldGhvZCh0ZXN0UnVsZU5hbWUpOwotCi0gICAgICAgIC8qKiBJbnZva2UgZ3JhbW1hciBydWxlLCBhbmQgc3RvcmUgaWYgdGhlcmUgaXMgYSByZXR1cm4gdmFsdWUgKi8KLSAgICAgICAgT2JqZWN0IHJ1bGVSZXR1cm4gPSBydWxlTmFtZS5pbnZva2UocGFyT2JqKTsKLQotICAgICAgICAvKiogSWYgcnVsZSBoYXMgcmV0dXJuIHZhbHVlLCBkZXRlcm1pbmUgaWYgaXQgY29udGFpbnMgYW4gQVNUIG9yIGEgU1QgKi8KLSAgICAgICAgaWYgKHJ1bGVSZXR1cm4gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJ1bGVSZXR1cm4uZ2V0Q2xhc3MoKS50b1N0cmluZygpLmluZGV4T2YodGVzdFJ1bGVOYW1lICsgIl9yZXR1cm4iKSA+IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgeyAvLyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBtYXkgaGFwcGVuIGhlcmUuLi4KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzUGF0aCA9IHBhcnNlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHN1cGVyR3JhbW1hck5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzUGF0aCArPSAiXyIgKyBzdXBlckdyYW1tYXJOYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IF9yZXR1cm4gPSBDbGFzcy5mb3JOYW1lKGNsYXNzUGF0aCArICIkIiArIHRlc3RSdWxlTmFtZSArICJfcmV0dXJuIik7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBfcmV0dXJuLmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFRyZWUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCByZXR1cm5OYW1lID0gX3JldHVybi5nZXRNZXRob2QoImdldFRyZWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25UcmVlIHRyZWUgPSAoQ29tbW9uVHJlZSkgcmV0dXJuTmFtZS5pbnZva2UocnVsZVJldHVybik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJlZS50b1N0cmluZ1RyZWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImdldFRlbXBsYXRlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgcmV0dXJuTmFtZSA9IF9yZXR1cm4uZ2V0TWV0aG9kKCJnZXRUZW1wbGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1RlbXBsYXRlIHN0ID0gKFN0cmluZ1RlbXBsYXRlKSByZXR1cm5OYW1lLmludm9rZShydWxlUmV0dXJuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzdC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMsIHRoZSB0ZXN0IGlzIHZpZXdlZCBhcwotICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQuCi0gICAgICAgICAgICAgICAgICAgIHRocm93IChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogSW52YWxpZCBpbnB1dCAqLwotICAgICAgICAvLyBTaW5jZSBBbnRMUiAzLjMgd2UgaGF2ZSB0byBza2lwIEVPRiB0b2tlbnMgYXQgdGhlIGVuZCAKLSAgICAgICAgLy8gVGhpcyByZXF1aXJlcyBtb2RpZmljYXRpb24gb2YgdGhlIGRlZmF1bHQgY29kZSAKLSAgICAgICAgLy8gaWYgKHRva2Vucy5pbmRleCgpICE9IHRva2Vucy5zaXplKCkpIHsKLSAgICAgICAgLy8gdG8KLSAgICAgICAgaWYgKHRva2Vucy5nZXQodG9rZW5zLmluZGV4KCkpLmdldFR5cGUoKSAhPSBUb2tlbi5FT0YpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIGlucHV0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIENoZWNrIGZvciBzeW50YXggZXJyb3JzICovCi0gICAgICAgIGlmICgoKEJhc2VSZWNvZ25pemVyKSBwYXJPYmopLmdldE51bWJlck9mU3ludGF4RXJyb3JzKCkgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU3ludGF4IGVycm9yIG9jY3VyZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9TdHJpbmdVdGlsVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9TdHJpbmdVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTZjZGUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvU3RyaW5nVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsNCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsNCi0NCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7DQotDQotcHVibGljIGNsYXNzIFN0cmluZ1V0aWxUZXN0IHsNCi0gICAgDQotICAgIEBUZXN0DQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmVzY2FwZSgpIHsNCi0gICAgICAgIFN0cmluZyBzID0gImFiYyI7DQotICAgICAgICBTdHJpbmcgcmVzID0gU3RyaW5nVXRpbC51bmVzY2FwZShzLCBudWxsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiYWJjIiwgcmVzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcz0iYWJcXFxcYyI7DQotICAgICAgICByZXMgPSBTdHJpbmdVdGlsLnVuZXNjYXBlKHMsIG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYlxcYyIsIHJlcyk7DQotDQotICAgICAgICBzPSJhYlxcJ2MiOw0KLSAgICAgICAgcmVzID0gU3RyaW5nVXRpbC51bmVzY2FwZShzLCBudWxsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiYWInYyIsIHJlcyk7DQotICAgICAgICANCi0gICAgICAgIHM9ImFiXFwnIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImFiJyIsIHJlcyk7DQotDQotICAgICAgICBzPSJcXFxcYWJjIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIlxcYWJjIiwgcmVzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcz0iYWJjXFxcXCI7DQotICAgICAgICByZXMgPSBTdHJpbmdVdGlsLnVuZXNjYXBlKHMsIG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmNcXCIsIHJlcyk7DQotICAgICAgICANCi0gICAgICAgIHM9ImFiY1xcIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnROdWxsKHJlcyk7DQotDQotICAgICAgICBzPSJhYlxceGMiOw0KLSAgICAgICAgcmVzID0gU3RyaW5nVXRpbC51bmVzY2FwZShzLCBudWxsKTsNCi0gICAgICAgIGFzc2VydE51bGwocmVzKTsNCi0gICAgDQotICAgICAgICBzPSJhYlxceGMiOw0KLSAgICAgICAgcmVzID0gU3RyaW5nVXRpbC51bmVzY2FwZShzLCAiXFwneCIpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYnhjIiwgcmVzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcz0iYWJjXFx4IjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgIlxcJ3giKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiYWJjeCIsIHJlcyk7DQotDQotICAgICAgICBzPSJhYlxceWMiOw0KLSAgICAgICAgcmVzID0gU3RyaW5nVXRpbC51bmVzY2FwZShzLCAiXFwneCIpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChyZXMpOw0KLQ0KLSAgICAgICAgLy8gZG91YmxlIGVzY2FwaW5nDQotICAgICAgICBzPSJhYlxcXFxcXFxcYyI7DQotICAgICAgICByZXMgPSBTdHJpbmdVdGlsLnVuZXNjYXBlKHMsIG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYlxcXFxjIiwgcmVzKTsNCi0NCi0gICAgICAgIHM9ImFiXFxcXCdjIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImFiXFwnYyIsIHJlcyk7DQotICAgICAgICANCi0gICAgICAgIHM9ImFiXFwnSm9obm55XFwnYyI7DQotICAgICAgICByZXMgPSBTdHJpbmdVdGlsLnVuZXNjYXBlKHMsIG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYidKb2hubnknYyIsIHJlcyk7DQotDQotICAgICAgICBzPSJhYlxcXFwnSm9obm55XFxcXCdjIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImFiXFwnSm9obm55XFwnYyIsIHJlcyk7DQotDQotICAgICAgICBzPSJcXFxcIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIlxcIiwgcmVzKTsNCi0NCi0gICAgICAgIHM9IlxcIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnROdWxsKHJlcyk7DQotDQotICAgICAgICBzPSJhIjsNCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUocywgbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZXMpOw0KLSAgICAgICAgDQotICAgICAgICBzPSIiOw0KLSAgICAgICAgcmVzID0gU3RyaW5nVXRpbC51bmVzY2FwZShzLCBudWxsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgcmVzKTsNCi0NCi0gICAgICAgIHJlcyA9IFN0cmluZ1V0aWwudW5lc2NhcGUobnVsbCwgbnVsbCk7DQotICAgICAgICBhc3NlcnROdWxsKHJlcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9UZXN0Q2FsZW5kYXJIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvVGVzdENhbGVuZGFySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDdjZjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9UZXN0Q2FsZW5kYXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBBdXRob3JzOgotICogICAgIEZsb3JlbnQgR3VpbGxhdW1lLCBOdXhlbwotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFRlc3RDYWxlbmRhckhlbHBlciB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZzEoKSB7Ci0gICAgICAgIENhbGVuZGFyIGNhbCA9IEdyZWdvcmlhbkNhbGVuZGFyLmdldEluc3RhbmNlKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMDc6MzAiKSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgMjAwOSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTU9OVEgsIDApOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkRBVEUsIDIpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCAzKTsKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSU5VVEUsIDQpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgNSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDYpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDktMDEtMDJUMDM6MDQ6MDUuMDA2KzA3OjMwIiwgQ2FsZW5kYXJIZWxwZXIudG9TdHJpbmcoY2FsKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcyKCkgewotICAgICAgICBDYWxlbmRhciBjYWwgPSBHcmVnb3JpYW5DYWxlbmRhci5nZXRJbnN0YW5jZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01ULTA2OjAwIikpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLllFQVIsIDIwMDgpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1PTlRILCAxMSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuREFURSwgMzEpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCAyMyk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCA1OSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuU0VDT05ELCA1OSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDk5OSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAwOC0xMi0zMVQyMzo1OTo1OS45OTktMDY6MDAiLCBDYWxlbmRhckhlbHBlci50b1N0cmluZyhjYWwpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZzMoKSB7Ci0gICAgICAgIENhbGVuZGFyIGNhbCA9IEdyZWdvcmlhbkNhbGVuZGFyLmdldEluc3RhbmNlKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgMjAwOCk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTU9OVEgsIDApOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkRBVEUsIDEpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCAxKTsKLSAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSU5VVEUsIDEpOwotICAgICAgICBjYWwuc2V0KENhbGVuZGFyLlNFQ09ORCwgMSk7Ci0gICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDgtMDEtMDFUMDE6MDE6MDEuMDAxWiIsIENhbGVuZGFySGVscGVyLnRvU3RyaW5nKGNhbCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZyb21TdHJpbmcoKSB7Ci0gICAgICAgIENhbGVuZGFyIGNhbDsKLSAgICAgICAgY2FsID0gQ2FsZW5kYXJIZWxwZXIuZnJvbVN0cmluZygiMjAwOS0wNy0xNFQxMjowMDowMC4xMjMtMDY6MzAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDA5LTA3LTE0VDEyOjAwOjAwLjEyMy0wNjozMCIsIENhbGVuZGFySGVscGVyLnRvU3RyaW5nKGNhbCkpOwotICAgICAgICBjYWwgPSBDYWxlbmRhckhlbHBlci5mcm9tU3RyaW5nKCIyMDA5LTA3LTE0VDEyOjAwOjAwWiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDktMDctMTRUMTI6MDA6MDAuMDAwWiIsIENhbGVuZGFySGVscGVyLnRvU3RyaW5nKGNhbCkpOwotICAgICAgICBjYWwgPSBDYWxlbmRhckhlbHBlci5mcm9tU3RyaW5nKCIyMDA5LTA3LTE0VDEyOjAwOjAwLjVaIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAwOS0wNy0xNFQxMjowMDowMC41MDBaIiwgQ2FsZW5kYXJIZWxwZXIudG9TdHJpbmcoY2FsKSk7Ci0gICAgICAgIGNhbCA9IENhbGVuZGFySGVscGVyLmZyb21TdHJpbmcoIjIwMDktMDctMTRUMTI6MDA6MDAuNDRaIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAwOS0wNy0xNFQxMjowMDowMC40NDBaIiwgQ2FsZW5kYXJIZWxwZXIudG9TdHJpbmcoY2FsKSk7Ci0gICAgICAgIGNhbCA9IENhbGVuZGFySGVscGVyLmZyb21TdHJpbmcoIjIwMDktMDctMTRUMTI6MDA6MDAuMzMzWiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDktMDctMTRUMTI6MDA6MDAuMzMzWiIsIENhbGVuZGFySGVscGVyLnRvU3RyaW5nKGNhbCkpOwotICAgICAgICAvLyBubyB0aW1lem9uZQotICAgICAgICBjYWwgPSBDYWxlbmRhckhlbHBlci5mcm9tU3RyaW5nKCIyMDA5LTA3LTE0VDEyOjAwOjAwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAwOS0wNy0xNFQxMjowMDowMC4wMDBaIiwgQ2FsZW5kYXJIZWxwZXIudG9TdHJpbmcoY2FsKSk7Ci0gICAgICAgIGNhbCA9IENhbGVuZGFySGVscGVyLmZyb21TdHJpbmcoIjIwMDktMDctMTRUMTI6MDA6MDAuNSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMDktMDctMTRUMTI6MDA6MDAuNTAwWiIsIENhbGVuZGFySGVscGVyLnRvU3RyaW5nKGNhbCkpOwotICAgICAgICBjYWwgPSBDYWxlbmRhckhlbHBlci5mcm9tU3RyaW5nKCIyMDA5LTA3LTE0VDEyOjAwOjAwLjQ0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAwOS0wNy0xNFQxMjowMDowMC40NDBaIiwgQ2FsZW5kYXJIZWxwZXIudG9TdHJpbmcoY2FsKSk7Ci0gICAgICAgIGNhbCA9IENhbGVuZGFySGVscGVyLmZyb21TdHJpbmcoIjIwMDktMDctMTRUMTI6MDA6MDAuMzMzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAwOS0wNy0xNFQxMjowMDowMC4zMzNaIiwgQ2FsZW5kYXJIZWxwZXIudG9TdHJpbmcoY2FsKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1Rlc3RQYXJzZXJFeHQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvVGVzdFBhcnNlckV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2VlNzU2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvVGVzdFBhcnNlckV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LnF1ZXJ5OwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UGFyc2VyRXh0IGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJUZXN0IHsKLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcChDbWlzUWxFeHRMZXhlci5jbGFzcywgQ21pc1FsRXh0UGFyc2VyLmNsYXNzLCBudWxsLCAiQ21pc0Jhc2VMZXhlciIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wcmVkaWNhdGUxKCkgewotICAgICAgICB0ZXN0UGFyc2VyKCJ2YWx1ZV9leHByZXNzaW9uIiwgIkxPV0VSKGZvbykiLCAiKEZVTkMgTE9XRVIgKENPTCBmb28pKSIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9xdWVyeTEoKSB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInF1ZXJ5IiwgIlNFTEVDVCBESVNUSU5DVCBhLCBiLCBjIEZST00gRG9jdW1lbnQiLAotICAgICAgICAgICAgICAgICIoU0VMRUNUIERJU1RJTkNUIChMSVNUIChDT0wgYSkgKENPTCBiKSAoQ09MIGMpKSAoRlJPTSAoVEFCTEUgRG9jdW1lbnQpKSkiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfcXVlcnkyKCkgewotICAgICAgICB0ZXN0UGFyc2VyT2soInF1ZXJ5IiwgIlNFTEVDVCBZLkNMQUlNX05VTSwgWC5QUk9QRVJUWV9BRERSRVNTLCBZLkRBTUFHRV9FU1RJTUFURVMgIgotICAgICAgICAgICAgICAgICsgIkZST00gUE9MSUNZIEFTIFggSk9JTiBDTEFJTVMgQVMgWSBPTiBYLlBPTElDWV9OVU0gPSBZLlBPTElDWV9OVU0gIgotICAgICAgICAgICAgICAgICsgIiAgICBXSEVSRSAoIDEwMDAwMCA8PSBBTlkgWS5EQU1BR0VfRVNUSU1BVEVTICkgQU5EICggWS5DQVVTRSBOT1QgTElLRSAnJUthdHJpbmElJyApIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3F1ZXJ5MygpIHsKLSAgICAgICAgdGVzdFBhcnNlck9rKCJxdWVyeSIsICJTRUxFQ1QgT0JKRUNUX0lELCBTQ09SRSgpIEFTIFgsIERFU1RJTkFUSU9OLCBERVBBUlRVUkVfREFURVMgIiArICJGUk9NIFRSQVZFTF9CUk9DSFVSRSAiCi0gICAgICAgICAgICAgICAgKyAiV0hFUkUgKCBDT05UQUlOUygnQ0FSSUJCRUFOIENFTlRSQUwgQU1FUklDQSBDUlVJU0UgVE9VUicpICkgQU5EKCAnMjAxMC0xLTEnIDwgQU5ZIERFUEFSVFVSRV9EQVRFUyApIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9UZXN0UGFyc2VyU3RyaWN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1Rlc3RQYXJzZXJTdHJpY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhNTU0Yy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3NlcnZlci9zdXBwb3J0L3F1ZXJ5L1Rlc3RQYXJzZXJTdHJpY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFRlc3RQYXJzZXJTdHJpY3QgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclRlc3QgewotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBzdXBlci5zZXRVcChDbWlzUWxTdHJpY3RMZXhlci5jbGFzcywgQ21pc1FsU3RyaWN0UGFyc2VyLmNsYXNzLCAiQ21pc0Jhc2VHcmFtbWFyIiwgIkNtaXNCYXNlTGV4ZXIiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLSBMZXhlciB0ZXN0cyAtLS0tLQotCi0gICAgLy8gSUQ6Ci0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SUQxKCkgewotICAgICAgICB0ZXN0TGV4ZXJPaygiSUQiLCAiYSIpOwotICAgIH0KLQotICAgIC8vICJ0b3RvIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElEMigpIHsKLSAgICAgICAgdGVzdExleGVyRmFpbCgiSUQiLCAiISIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElEMygpIHsKLSAgICAgICAgdGVzdExleGVyT2soIklEIiwgInRvdG8iKTsKLSAgICB9Ci0KLSAgICAvLyAidG90bzEyMyIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJRDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIklEIiwgInRvdG8xMjMiKTsKLSAgICB9Ci0KLSAgICAvLyAidG90bzEyM18iIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SUQ1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJJRCIsICJ0b3RvMTIzXyIpOwotICAgIH0KLQotICAgIC8vICJfZm9vIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElENigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiSUQiLCAiX2ZvbyIpOwotICAgIH0KLQotICAgIC8vICJmb286YmFyIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElENygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiSUQiLCAiZm9vOmJhciIpOwotICAgIH0KLQotICAgIC8vICIxMjMiIEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJRDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyRmFpbCgiSUQiLCAiMTIzIik7Ci0gICAgfQotCi0gICAgLy8gIjEyM2FiYyIgRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElEOSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJGYWlsKCJJRCIsICIxMjNhYmMiKTsKLSAgICB9Ci0KLSAgICAvLyBOVU1fTElUOgotICAgIC8vICIxMjMiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TlVNX0xJVDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIk5VTV9MSVQiLCAiMTIzIik7Ci0gICAgfQotCi0gICAgLy8gIjAiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TlVNX0xJVDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIk5VTV9MSVQiLCAiMCIpOwotICAgIH0KLQotICAgIC8vICItMCIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICItMCIpOwotICAgIH0KLQotICAgIC8vICIxIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJOVU1fTElUIiwgIjEiKTsKLSAgICB9Ci0KLSAgICAvLyAiLTEiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TlVNX0xJVDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIk5VTV9MSVQiLCAiLTEiKTsKLSAgICB9Ci0KLSAgICAvLyAiLTEyMyIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUNigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICIxMjMiKTsKLSAgICB9Ci0KLSAgICAvLyAiMDEyMyIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUNygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICIwMTIzIik7Ci0gICAgfQotCi0gICAgLy8gIi0wMTIzIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQ4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJOVU1fTElUIiwgIi0wMTIzIik7Ci0gICAgfQotCi0gICAgLy8gIjEyM2FiYyIgRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlckZhaWwoIk5VTV9MSVQiLCAiMTIzYWJjIik7Ci0gICAgfQotCi0gICAgLy8gIjEyM0UiIEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyRmFpbCgiTlVNX0xJVCIsICIxMjNFIik7Ci0gICAgfQotCi0gICAgLy8gIjEyMy40NTYiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TlVNX0xJVDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJOVU1fTElUIiwgIjEyMy40NTYiKTsKLSAgICB9Ci0KLSAgICAvLyAiKzEyMy40NTYiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TlVNX0xJVDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJOVU1fTElUIiwgIisxMjMuNDU2Iik7Ci0gICAgfQotCi0gICAgLy8gIi0xMjMuNDU2IiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQxMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICItMTIzLjQ1NiIpOwotICAgIH0KLQotICAgIC8vICIuNDU2IiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQxNCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICIuNDU2Iik7Ci0gICAgfQotCi0gICAgLy8gIisuNDU2IiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQxNSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICIrLjQ1NiIpOwotICAgIH0KLQotICAgIC8vICItLjQ1NiIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIk5VTV9MSVQiLCAiLS40NTYiKTsKLSAgICB9Ci0KLSAgICAvLyAiMTIzLiIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIk5VTV9MSVQiLCAiMTIzLiIpOwotICAgIH0KLQotICAgIC8vICIrMTIzLiIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIk5VTV9MSVQiLCAiKzEyMy4iKTsKLSAgICB9Ci0KLSAgICAvLyAiLTEyMy4iIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TlVNX0xJVDE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJOVU1fTElUIiwgIi0xMjMuIik7Ci0gICAgfQotCi0gICAgLy8gIisxMjMuNDU2RTc4IiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQyMCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICIrMTIzLjQ1NkU3OCIpOwotICAgIH0KLQotICAgIC8vICItMTIzLjQ1NkUtNzgiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TlVNX0xJVDIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJOVU1fTElUIiwgIi0xMjMuNDU2RS03OCIpOwotICAgIH0KLQotICAgIC8vICIuNDU2RTc4IiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5VTV9MSVQyMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiTlVNX0xJVCIsICIuNDU2RTc4Iik7Ci0gICAgfQotCi0gICAgLy8gIisxMjMuRSs3OCIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROVU1fTElUMjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIk5VTV9MSVQiLCAiKzEyMy5FKzc4Iik7Ci0gICAgfQotCi0gICAgLy8gU1RSSU5HX0xJVDoKLSAgICAvLyAiJ2FiYyciIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U1RSSU5HX0xJVDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIlNUUklOR19MSVQiLCAiJ2FiYyciKTsKLSAgICB9Ci0KLSAgICAvLyAiJ2EnJ2JjJyIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTVFJJTkdfTElUMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiU1RSSU5HX0xJVCIsICInYScnYmMnIik7Ci0gICAgfQotCi0gICAgLy8gIidhYmMiIEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTVFJJTkdfTElUMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJGYWlsKCJTVFJJTkdfTElUIiwgIidhYmMiKTsKLSAgICB9Ci0KLSAgICAvLyAiYWJjJyIgRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNUUklOR19MSVQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlckZhaWwoIlNUUklOR19MSVQiLCAiYWJjJyIpOwotICAgIH0KLQotICAgIC8vICInYWInYyciIEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTVFJJTkdfTElUNSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJGYWlsKCJTVFJJTkdfTElUIiwgIidhYidjJyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNUUklOR19MSVQ2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJTVFJJTkdfTElUIiwgIidUaGF0JydzJyIpOwotICAgICAgICB0ZXN0TGV4ZXJPaygiU1RSSU5HX0xJVCIsICInR3VzJycnIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U1RSSU5HX0xJVDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIlNUUklOR19MSVQiLCAiJ1RoYXRcXFwncyciKTsKLSAgICAgICAgdGVzdExleGVyT2soIlNUUklOR19MSVQiLCAiJ0d1c1xcXCdcJyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNUUklOR19MSVQ4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJTVFJJTkdfTElUIiwgIidjOlxcXFx0ZW1wJyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNUUklOR19MSVQ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJTVFJJTkdfTElUIiwgIidMaWtlJVN0cmluZyciKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTVFJJTkdfTElUMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIlNUUklOR19MSVQiLCAiJ0xpa2VfU3RyaW5nJyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNUUklOR19MSVQxMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiU1RSSU5HX0xJVCIsICInTGlrZVxcJVN0cmluZyciKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTVFJJTkdfTElUMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIlNUUklOR19MSVQiLCAiJ0xpa2VcXF9TdHJpbmcnIik7Ci0gICAgfQotCi0gICAgLy8gQk9PTF9MSVQ6Ci0gICAgLy8gIlRSVUUiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qk9PTF9MSVQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RMZXhlck9rKCJCT09MX0xJVCIsICJUUlVFIik7Ci0gICAgfQotCi0gICAgLy8gInRydWUiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0JPT0xfTElUMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiQk9PTF9MSVQiLCAidHJ1ZSIpOwotICAgIH0KLQotICAgIC8vICJGQUxTRSIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCT09MX0xJVDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdExleGVyT2soIkJPT0xfTElUIiwgIkZBTFNFIik7Ci0gICAgfQotCi0gICAgLy8gImZhbHNlIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJPT0xfTElUNCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiQk9PTF9MSVQiLCAiZmFsc2UiKTsKLSAgICB9Ci0KLSAgICAvLyBUSU1FX0xJVDoKLSAgICAvLyAiVElNRVNUQU1QICcyMDEwLTAxLTAxWjAxOjAxOjAxLjAwMFonIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRJTUVfTElUMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiVElNRV9MSVQiLCAiVElNRVNUQU1QICcyMDEwLTAxLTAxWjAxOjAxOjAxLjAwMFonIik7Ci0gICAgfQotCi0gICAgLy8gInRpbWVzdGFtcCAgICcxMjMnIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRJTUVfTElUMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJPaygiVElNRV9MSVQiLCAidGltZXN0YW1wICAgJzEyMyciKTsKLSAgICB9Ci0KLSAgICAvLyAiVElNRVNUQU1QIDEyMyIgRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRJTUVfTElUMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0TGV4ZXJGYWlsKCJUSU1FX0xJVCIsICJUSU1FU1RBTVAgMTIzIik7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0gUGFyc2VyIHRlc3RzIC0tLS0tCi0KLSAgICAvLyBsaXRlcmFsOgotICAgIC8vICIxMjMiIE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlck9rKCJsaXRlcmFsIiwgIjEyMyIpOwotICAgIH0KLQotICAgIC8vICItMTIzIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygibGl0ZXJhbCIsICIxMjMiKTsKLSAgICB9Ci0KLSAgICAvLyAiMCIgT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyT2soImxpdGVyYWwiLCAiMCIpOwotICAgIH0KLQotICAgIC8vICIwMTIzIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWw0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygibGl0ZXJhbCIsICIwMTIzIik7Ci0gICAgfQotCi0gICAgLy8gImFiYzEyMyIgT0sKLSAgICAvLyAiMTIzYWJjIiBGQUlMCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZXJhbDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlckZhaWwoImxpdGVyYWwiLCAiMTIzYWJjIik7Ci0gICAgfQotCi0gICAgLy8gIidhYmMnIiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWw2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygibGl0ZXJhbCIsICInYWJjJyIpOwotICAgIH0KLQotICAgIC8vICIxMjMuMzQ1RTc4IiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWw3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygibGl0ZXJhbCIsICIxMjMuMzQ1RTc4Iik7Ci0gICAgfQotCi0gICAgLy8gb3JkZXJfYnlfY2xhdXNlOgotICAgIC8vICJPUkRFUiBCWSBmb28iIC0+IChPUkRFUl9CWSAoQ09MIGZvbykgQVNDKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9yZGVyQnkxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoIm9yZGVyX2J5X2NsYXVzZSIsICJPUkRFUiBCWSBmb28iLCAiKE9SREVSX0JZIChDT0wgZm9vKSBBU0MpIik7Ci0gICAgfQotCi0gICAgLy8gIk9SREVSIEJZIGZvbyBBU0MiIC0+IChPUkRFUl9CWSAoQ09MIGZvbykgQVNDKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9yZGVyQnkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoIm9yZGVyX2J5X2NsYXVzZSIsICJPUkRFUiBCWSBmb28gQVNDIiwgIk9SREVSX0JZIChDT0wgZm9vKSBBU0MpIik7Ci0gICAgfQotCi0gICAgLy8gIk9SREVSIEJZIGZvbyBERVNDIiAtPiAoT1JERVJfQlkgKENPTCBmb28pIERFU0MpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXJCeTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigib3JkZXJfYnlfY2xhdXNlIiwgIk9SREVSIEJZIGZvbyBERVNDIiwgIihPUkRFUl9CWSAoQ09MIGZvbykgREVTQykiKTsKLSAgICB9Ci0KLSAgICAvLyAiT1JERVIgQlkgdC5mb28sIGJhciBERVNDIiAtPiAoT1JERVJfQlkgKENPTCB0IGZvbykgQVNDIChDT0wgYmFyKSBERVNDKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9yZGVyQnk0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoIm9yZGVyX2J5X2NsYXVzZSIsICJPUkRFUiBCWSB0LmZvbywgYmFyIERFU0MiLCAiKE9SREVSX0JZIChDT0wgdCBmb28pIEFTQyAoQ09MIGJhcikgREVTQykiKTsKLSAgICB9Ci0KLSAgICAvLyBjb2x1bW5fcmVmZXJlbmNlOgotICAgIC8vICJmb28iIC0+IChDT0wgZm9vKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jb2x1bW5fcmVmZXJlbmNlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJjb2x1bW5fcmVmZXJlbmNlIiwgImZvbyIsICIoQ09MIGZvbykiKTsKLSAgICB9Ci0KLSAgICAvLyAiYmFyLmZvbyIgLT4gKENPTCBiYXIgZm9vKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jb2x1bW5fcmVmZXJlbmNlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJjb2x1bW5fcmVmZXJlbmNlIiwgImJhci5mb28iLCAiKENPTCBiYXIgZm9vKSIpOwotICAgIH0KLQotICAgIC8vIGZyb21fY2xhdXNlOgotICAgIC8vICJGUk9NIGZvbyBKT0lOIGJhciBPTiB4ID0geSIgLT4gKEZST00gKFRBQkxFIGZvbykgKEpPSU4gSU5ORVIgKFRBQkxFIGJhcikKLSAgICAvLyAoT04gKENPTCB4KSA9IChDT0wgeSkpKSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoImZyb21fY2xhdXNlIiwgIkZST00gZm9vIEpPSU4gYmFyIE9OIHggPSB5IiwKLSAgICAgICAgICAgICAgICAiKEZST00gKFRBQkxFIGZvbykgKEpPSU4gSU5ORVIgKFRBQkxFIGJhcikgKE9OIChDT0wgeCkgPSAoQ09MIHkpKSkpIik7Ci0gICAgfQotCi0gICAgLy8gdGFibGVfam9pbjoKLSAgICAvLyAiTEVGVCBPVVRFUiBKT0lOIGZvbyBPTiB4ID0geSIgLT4gKEpPSU4gTEVGVCAoVEFCTEUgZm9vKSAoT04gKENPTCB4KSA9Ci0gICAgLy8gKENPTCB5KSkpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbHVtbl9yZWZlcmVuY2UxMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJ0YWJsZV9qb2luIiwgIkxFRlQgT1VURVIgSk9JTiBmb28gT04geCA9IHkiLCAiKEpPSU4gTEVGVCAoVEFCTEUgZm9vKSAoT04gKENPTCB4KSA9IChDT0wgeSkpKSIpOwotICAgIH0KLQotICAgIC8vICJJTk5FUiBKT0lOIGZvbyIgLT4gKEpPSU4gSU5ORVIgKFRBQkxFIGZvbykpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbHVtbl9yZWZlcmVuY2UxMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJ0YWJsZV9qb2luIiwgIklOTkVSIEpPSU4gZm9vIiwgIihKT0lOIElOTkVSIChUQUJMRSBmb28pKSIpOwotICAgIH0KLQotICAgIC8vIG9uZV90YWJsZToKLSAgICAvLyAiZm9vIiAtPiAoVEFCTEUgZm9vKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jb2x1bW5fcmVmZXJlbmNlMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJvbmVfdGFibGUiLCAiZm9vIiwgIihUQUJMRSBmb28pIik7Ci0gICAgfQotCi0gICAgLy8gImZvbyBiYXIiIC0+IChUQUJMRSBmb28gYmFyKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jb2x1bW5fcmVmZXJlbmNlNCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJvbmVfdGFibGUiLCAiZm9vIGJhciIsICIoVEFCTEUgZm9vIGJhcikiKTsKLSAgICB9Ci0KLSAgICAvLyAiZm9vIEFTIGJhciIgLT4gKFRBQkxFIGZvbyBiYXIpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbHVtbl9yZWZlcmVuY2U1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoIm9uZV90YWJsZSIsICJmb28gQVMgYmFyIiwgIihUQUJMRSBmb28gYmFyKSIpOwotICAgIH0KLQotICAgIC8vICIoZm9vKSIgLT4gKFRBQkxFIGZvbykKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29sdW1uX3JlZmVyZW5jZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigib25lX3RhYmxlIiwgIihmb28pIiwgIihUQUJMRSBmb28pIik7Ci0gICAgfQotCi0gICAgLy8gaW5fcHJlZGljYXRlOgotICAgIC8vICJmb28gSU4gKCAnYScsICdiJywgJ2MnKSIgLT4gKElOIChDT0wgZm9vKSAoSU5fTElTVCAnYScgJ2InICdjJykpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2luX3ByZWRpY2F0ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigiaW5fcHJlZGljYXRlIiwgImZvbyBJTiAoICdhJywgJ2InLCAnYycpIiwgIihJTiAoQ09MIGZvbykgKElOX0xJU1QgJ2EnICdiJyAnYycpKSIpOwotICAgIH0KLQotICAgIC8vICJmb28gTk9UIElOICggMSwgMiwgMykiIC0+IChOT1RfSU4gKENPTCBmb28pIChJTl9MSVNUIDEgMiAzKSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5fcHJlZGljYXRlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJpbl9wcmVkaWNhdGUiLCAiZm9vIE5PVCBJTiAoIDEsIDIsIDMpIiwgIihOT1RfSU4gKENPTCBmb28pIChJTl9MSVNUIDEgMiAzKSkiKTsKLSAgICB9Ci0KLSAgICAvLyBxdWFudGlmaWVkX2luX3ByZWRpY2F0ZToKLSAgICAvLyAiQU5ZIGZvbyBJTiAoJ2EnLCAxKSIgLT4gKElOX0FOWSAoQ09MIGZvbykgKElOX0xJU1QgJ2EnIDEpKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzX3F1YW50aWZpZWRfaW5fcHJlZGljYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInF1YW50aWZpZWRfaW5fcHJlZGljYXRlIiwgIkFOWSBmb28gSU4gKCdhJywgMSkiLCAiKElOX0FOWSAoQ09MIGZvbykgKElOX0xJU1QgJ2EnIDEpKSIpOwotICAgIH0KLQotICAgIC8vIGNvbXBhcmlzb25fcHJlZGljYXRlOgotICAgIC8vICJmb28gPSAxIiAtPiAoPSAoQ09MIGZvbykgMSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfY29tcGFyaXNvbl9wcmVkaWNhdGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoImNvbXBhcmlzb25fcHJlZGljYXRlIiwgImZvbyA9IDEiLCAiKD0gKENPTCBmb28pIDEpIik7Ci0gICAgfQotCi0gICAgLy8gImZvbyA8PiAxIiAtPiAoPD4gKENPTCBmb28pIDEpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbXBhcmlzb25fcHJlZGljYXRlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJjb21wYXJpc29uX3ByZWRpY2F0ZSIsICJmb28gPD4gMSIsICIoPD4gKENPTCBmb28pIDEpIik7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBwcmVkaWNhdGU6Ci0gICAgLy8gImZvbyA9IDEiIC0+ICg9IChDT0wgZm9vKSAxKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wcmVkaWNhdGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInByZWRpY2F0ZSIsICJmb28gPSAxIiwgIig9IChDT0wgZm9vKSAxKSIpOwotICAgIH0KLQotICAgIC8vICJmb28gSU4gKCdiYXInKSIgLT4gKElOIChDT0wgZm9vKSAoSU5fTElTVCAnYmFyJykpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3ByZWRpY2F0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigicHJlZGljYXRlIiwgImZvbyBJTiAoJ2JhcicpIiwgIihJTiAoQ09MIGZvbykgKElOX0xJU1QgJ2JhcicpKSIpOwotICAgIH0KLQotICAgIC8vICJmb28gSVMgTlVMTCIgLT4gKElTX05VTEwgKENPTCBmb28pKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wcmVkaWNhdGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInByZWRpY2F0ZSIsICJmb28gSVMgTlVMTCIsICIoSVNfTlVMTCAoQ09MIGZvbykpIik7Ci0gICAgfQotCi0gICAgLy8gImZvbyBJUyBOT1QgTlVMTCIgLT4gKElTX05PVF9OVUxMIChDT0wgZm9vKSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfcHJlZGljYXRlNCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJwcmVkaWNhdGUiLCAiZm9vIElTIE5PVCBOVUxMIiwgIihJU19OT1RfTlVMTCAoQ09MIGZvbykpIik7Ci0gICAgfQotCi0gICAgLy8gIjEgPSBBTlkgZm9vIiAtPiAoRVFfQU5ZIDEgKENPTCBmb28pKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wcmVkaWNhdGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInByZWRpY2F0ZSIsICIxID0gQU5ZIGZvbyIsICIoRVFfQU5ZIDEgKENPTCBmb28pKSIpOwotICAgIH0KLQotICAgIC8vICJTQ09SRSgpID0gJ2JhciciIC0+ICg9IFNDT1JFICdiYXInKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9wcmVkaWNhdGU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInByZWRpY2F0ZSIsICJTQ09SRSgpID0gJ2JhciciLCAiKD0gU0NPUkUgJ2JhcicpIik7Ci0gICAgfQotCi0gICAgLy8gYm9vbGVhbl90ZXJtOgotICAgIC8vICJjID49IDMgQU5EIGQgPD0gNCIgLT4gKEFORCAoPj0gKENPTCBjKSAzKSAoPD0gKENPTCBkKSA0KSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGJvb2xlYW5fdGVybTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigiYm9vbGVhbl90ZXJtIiwgImMgPj0gMyBBTkQgZCA8PSA0IiwgIihBTkQgKD49IChDT0wgYykgMykgKDw9IChDT0wgZCkgNCkpIik7Ci0gICAgfQotCi0gICAgLy8gImMgPj0gMyBBTkQgTk9UIGQgPD0gNCIgLT4gKEFORCAoPj0gKENPTCBjKSAzKSAoTk9UICg8PSAoQ09MIGQpIDQpKSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGJvb2xlYW5fdGVybTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigiYm9vbGVhbl90ZXJtIiwgImMgPj0gMyBBTkQgTk9UIGQgPD0gNCIsICIoQU5EICg+PSAoQ09MIGMpIDMpIChOT1QgKDw9IChDT0wgZCkgNCkpKSIpOwotICAgIH0KLQotICAgIC8vIGZvbGRlcl9wcmVkaWNhdGU6Ci0gICAgLy8gIklOX0ZPTERFUihmb28sJ0lEMTIzJykiIC0+IChJTl9GT0xERVIgZm9vICdJRDEyMycpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBmb2xkZXJfcHJlZGljYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJmb2xkZXJfcHJlZGljYXRlIiwgIklOX0ZPTERFUihmb28sJ0lEMTIzJykiLCAiKElOX0ZPTERFUiBmb28gJ0lEMTIzJykiKTsKLSAgICB9Ci0KLSAgICAvLyAiSU5fRk9MREVSKCdJRDEyMycpIiAtPiAoSU5fRk9MREVSICdJRDEyMycpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBmb2xkZXJfcHJlZGljYXRlMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJmb2xkZXJfcHJlZGljYXRlIiwgIklOX0ZPTERFUignSUQxMjMnKSIsICIoSU5fRk9MREVSICdJRDEyMycpIik7Ci0gICAgfQotCi0gICAgLy8gIklOX1RSRUUoZm9vLCdJRDEyMycpIiAtPiAoSU5fVFJFRSBmb28gJ0lEMTIzJykKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGZvbGRlcl9wcmVkaWNhdGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoImZvbGRlcl9wcmVkaWNhdGUiLCAiSU5fVFJFRShmb28sJ0lEMTIzJykiLCAiKElOX0ZPTERFUiAnSUQxMjMnKSIpOwotICAgIH0KLQotICAgIC8vICJJTl9UUkVFKCdJRDEyMycpIiAtPiAoSU5fVFJFRSAnSUQxMjMnKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZm9sZGVyX3ByZWRpY2F0ZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigiZm9sZGVyX3ByZWRpY2F0ZSIsICJJTl9UUkVFKCdJRDEyMycpIiwgIiAoSU5fVFJFRSAnSUQxMjMnKSIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZm9sZGVyX3ByZWRpY2F0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJzZWFyY2hfY29uZGl0aW9uIiwgImlkNDU2IExJS0UgJ0ZvbyUnIEFORCBJTl9GT0xERVIoJ2FiYycpIiwKLSAgICAgICAgICAgICAgICAiKEFORCAoTElLRSAnaWQ0NTYnICdGb28lJykgKElOX0ZPTERFUiAnYWJjJykiKTsKLSAgICB9Ci0KLSAgICAvLyB0ZXh0X3NlYXJjaF9wcmVkaWNhdGU6Ci0gICAgLy8gIkNPTlRBSU5TKCdmb28nKSIgLT4gKENPTlRBSU5TICdmb28nKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGV4dF9zZWFyY2hfcHJlZGljYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJ0ZXh0X3NlYXJjaF9wcmVkaWNhdGUiLCAiQ09OVEFJTlMoJ2ZvbycpIiwgIihDT05UQUlOUyAnZm9vJykiKTsKLSAgICB9Ci0KLSAgICAvLyAiQ09OVEFJTlMoYmFyLCAnZm9vJykiIC0+IChDT05UQUlOUyBiYXIgJ2ZvbycpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXh0X3NlYXJjaF9wcmVkaWNhdGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInRleHRfc2VhcmNoX3ByZWRpY2F0ZSIsICJDT05UQUlOUyhiYXIsICdmb28nKSIsICIoQ09OVEFJTlMgYmFyICdmb28nKSIpOwotICAgIH0KLQotICAgIC8vIHdoZXJlX2NsYXVzZToKLSAgICAvLyAiV0hFUkUgZm9vID0gMSIgLT4gKFdIRVJFICg9IChDT0wgZm9vKSAxKSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfd2hlcmVfY2xhdXNlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJ3aGVyZV9jbGF1c2UiLCAiV0hFUkUgZm9vID0gMSIsICIoV0hFUkUgKD0gKENPTCBmb28pIDEpKSIpOwotICAgIH0KLQotICAgIC8vICJXSEVSRSBhID0gMSBBTkQgYiA8PiAyIE9SIGMgPj0gMyIgLT4gKFdIRVJFIChPUiAoQU5EICg9IChDT0wgYSkgMSkgKDw+Ci0gICAgLy8gKENPTCBiKSAyKSkgKD49IChDT0wgYykgMykpKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF93aGVyZV9jbGF1c2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoIndoZXJlX2NsYXVzZSIsICJXSEVSRSBhID0gMSBBTkQgYiA8PiAyIE9SIGMgPj0gMyIsCi0gICAgICAgICAgICAgICAgIihXSEVSRSAoT1IgKEFORCAoPSAoQ09MIGEpIDEpICg8PiAoQ09MIGIpIDIpKSAoPj0gKENPTCBjKSAzKSkpIik7Ci0gICAgfQotCi0gICAgLy8gIldIRVJFIGEgPSAxIEFORCBiIDw+IDIgT1IgYyA+PSAzIEFORCBkIDw9IDQiIC0+IChXSEVSRSAoT1IgKEFORCAoPSAoQ09MCi0gICAgLy8gYSkgMSkgKDw+IChDT0wgYikgMikpIChBTkQgKD49IChDT0wgYykgMykgKDw9IChDT0wgZCkgNCkpKSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfd2hlcmVfY2xhdXNlMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyKCJ3aGVyZV9jbGF1c2UiLCAiV0hFUkUgYSA9IDEgQU5EIGIgPD4gMiBPUiBjID49IDMgQU5EIGQgPD0gNCIsCi0gICAgICAgICAgICAgICAgIihXSEVSRSAoT1IgKEFORCAoPSAoQ09MIGEpIDEpICg8PiAoQ09MIGIpIDIpKSAoQU5EICg+PSAoQ09MIGMpIDMpICg8PSAoQ09MIGQpIDQpKSkpIik7Ci0gICAgfQotCi0gICAgLy8gIldIRVJFIGEgPSAxIEFORCBiIDw+IDIgT1IgYyA+PSAzIEFORCBOT1QgZCA8PSA0IiAtPiAoV0hFUkUgKE9SIChBTkQgKD0KLSAgICAvLyAoQ09MIGEpIDEpICg8PiAoQ09MIGIpIDIpKSAoQU5EICg+PSAoQ09MIGMpIDMpIChOT1QgKDw9IChDT0wgZCkgNCkpKSkpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3doZXJlX2NsYXVzZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigid2hlcmVfY2xhdXNlIiwgIldIRVJFIGEgPSAxIEFORCBiIDw+IDIgT1IgYyA+PSAzIEFORCBOT1QgZCA8PSA0IiwKLSAgICAgICAgICAgICAgICAiKFdIRVJFIChPUiAoQU5EICg9IChDT0wgYSkgMSkgKDw+IChDT0wgYikgMikpIChBTkQgKD49IChDT0wgYykgMykgKE5PVCAoPD0gKENPTCBkKSA0KSkpKSkiKTsKLSAgICB9Ci0KLSAgICAvLyBxdWVyeToKLSAgICAvLyAiU0VMRUNUICogRlJPTSBEb2N1bWVudCIgLT4gKFNFTEVDVCAqIChGUk9NIChUQUJMRSBEb2N1bWVudCkpKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9xdWVyeTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigicXVlcnkiLCAiU0VMRUNUICogRlJPTSBEb2N1bWVudCIsICIoU0VMRUNUICogKEZST00gKFRBQkxFIERvY3VtZW50KSkpIik7Ci0gICAgfQotCi0gICAgLy8gIlNFTEVDVCBhLCBiLCBjIEZST00gRG9jdW1lbnQiIC0+IChTRUxFQ1QgKFNFTF9MSVNUIChDT0wgYSkgKENPTCBiKSAoQ09MCi0gICAgLy8gYykpIChGUk9NIChUQUJMRSBEb2N1bWVudCkpKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9xdWVyeTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigicXVlcnkiLCAiU0VMRUNUIGEsIGIsIGMgRlJPTSBEb2N1bWVudCIsCi0gICAgICAgICAgICAgICAgIihTRUxFQ1QgKFNFTF9MSVNUIChDT0wgYSkgKENPTCBiKSAoQ09MIGMpKSAoRlJPTSAoVEFCTEUgRG9jdW1lbnQpKSkiKTsKLSAgICB9Ci0KLSAgICAvLyAiU0VMRUNUIGEsIGIgRlJPTSBEb2N1bWVudCBPUkRFUiBCWSBhLCBiIiAtPiAoU0VMRUNUIChTRUxfTElTVCAoQ09MIGEpCi0gICAgLy8gKENPTCBiKSkgKEZST00gKFRBQkxFIERvY3VtZW50KSkgKE9SREVSX0JZIChDT0wgYSkgQVNDIChDT0wgYikgQVNDKSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfcXVlcnkzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInF1ZXJ5IiwgIlNFTEVDVCBhLCBiIEZST00gRG9jdW1lbnQgT1JERVIgQlkgYSwgYiIsCi0gICAgICAgICAgICAgICAgIihTRUxFQ1QgKFNFTF9MSVNUIChDT0wgYSkgKENPTCBiKSkgKEZST00gKFRBQkxFIERvY3VtZW50KSkgKE9SREVSX0JZIChDT0wgYSkgQVNDIChDT0wgYikgQVNDKSkiKTsKLSAgICB9Ci0KLSAgICAvLyB3aGVyZV9jbGF1c2U6Ci0gICAgLy8gIldIRVJFIElOX1RSRUUoJ0lEMDAwOTM4NTQ3NjMnKSBBTkQgKCdTTUlUSCcgPSBBTlkgQVVUSE9SUykiIC0+IChXSEVSRQotICAgIC8vIChBTkQgKElOX1RSRUUgJ0lEMDAwOTM4NTQ3NjMnKSAoRVFfQU5ZICdTTUlUSCcgKENPTCBBVVRIT1JTKSkpKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF93aGVyZV9jbGF1c2U1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoIndoZXJlX2NsYXVzZSIsICJXSEVSRSBJTl9UUkVFKCdJRDAwMDkzODU0NzYzJykgQU5EICgnU01JVEgnID0gQU5ZIEFVVEhPUlMpIiwKLSAgICAgICAgICAgICAgICAiKFdIRVJFIChBTkQgKElOX1RSRUUgJ0lEMDAwOTM4NTQ3NjMnKSAoRVFfQU5ZICdTTUlUSCcgKENPTCBBVVRIT1JTKSkpKSIpOwotICAgIH0KLQotICAgIC8vIHF1ZXJ5OgotICAgIC8vCi0gICAgLy8gPDwKLSAgICAvLyBTRUxFQ1QgKiBGUk9NIERvY3VtZW50IFdIRVJFIGZvbyA9IDEKLSAgICAvLyA+PiAtPiAoU0VMRUNUICogKEZST00gKFRBQkxFIERvY3VtZW50KSkgKFdIRVJFICg9IChDT0wgZm9vKSAxKSkpCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBxdWVyeTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlcigicXVlcnkiLCAiU0VMRUNUICogRlJPTSBEb2N1bWVudCBXSEVSRSBmb28gPSAxIiwKLSAgICAgICAgICAgICAgICAiKFNFTEVDVCAqIChGUk9NIChUQUJMRSBEb2N1bWVudCkpIChXSEVSRSAoPSAoQ09MIGZvbykgMSkpKSIpOwotICAgIH0KLQotICAgIC8vIEV4YW1wbGVzIGZyb20gb2xkZXIgdmVyc2lvbnMgb2YgdGhlIHNwZWNzLgotCi0gICAgLy8gPDwKLSAgICAvLyBTRUxFQ1QgKiBGUk9NIFdISVRFX1BBUEVSCi0gICAgLy8gPj4gLT4gKFNFTEVDVCAqIChGUk9NIChUQUJMRSBXSElURV9QQVBFUikpKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcXVlcnkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoInF1ZXJ5IiwgIlNFTEVDVCAqIEZST00gV0hJVEVfUEFQRVIiLCAiKFNFTEVDVCAqIChGUk9NIChUQUJMRSBXSElURV9QQVBFUikpKSIpOwotICAgIH0KLQotICAgIC8vIDw8Ci0gICAgLy8gU0VMRUNUIFRJVExFLCBBVVRIT1JTLCBEQVRFCi0gICAgLy8gRlJPTSBXSElURV9QQVBFUgotICAgIC8vIFdIRVJFICggSU5fVFJFRSgnSUQwMDA5Mzg1NDc2MycpICkgQU5EICggJ1NNSVRIJyA9IEFOWSBBVVRIT1JTICkKLSAgICAvLyA+PiAtPiAoU0VMRUNUIChTRUxfTElTVCAoQ09MIFRJVExFKSAoQ09MIEFVVEhPUlMpIChDT0wgREFURSkpIChGUk9NCi0gICAgLy8gKFRBQkxFIFdISVRFX1BBUEVSKSkgKFdIRVJFIChBTkQgKElOX1RSRUUgJ0lEMDAwOTM4NTQ3NjMnKSAoRVFfQU5ZCi0gICAgLy8gJ1NNSVRIJyAoQ09MIEFVVEhPUlMpKSkpKQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcXVlcnkzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXIoCi0gICAgICAgICAgICAgICAgInF1ZXJ5IiwKLSAgICAgICAgICAgICAgICAiU0VMRUNUIFRJVExFLCBBVVRIT1JTLCBEQVRFICIgKyAiRlJPTSBXSElURV9QQVBFUiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJXSEVSRSAoIElOX1RSRUUoJ0lEMDAwOTM4NTQ3NjMnKSApIEFORCAoICdTTUlUSCcgPSBBTlkgQVVUSE9SUyApIiwKLSAgICAgICAgICAgICAgICAiKFNFTEVDVCAoU0VMX0xJU1QgKENPTCBUSVRMRSkgKENPTCBBVVRIT1JTKSAoQ09MIERBVEUpKSAoRlJPTSAoVEFCTEUgV0hJVEVfUEFQRVIpKSAoV0hFUkUgKEFORCAoSU5fVFJFRSAnSUQwMDA5Mzg1NDc2MycpIChFUV9BTlkgJ1NNSVRIJyAoQ09MIEFVVEhPUlMpKSkpKSIpOwotICAgIH0KLQotICAgIC8vIDw8Ci0gICAgLy8gU0VMRUNUIFkuQ0xBSU1fTlVNLCBYLlBST1BFUlRZX0FERFJFU1MsIFkuREFNQUdFX0VTVElNQVRFUwotICAgIC8vIEZST00gUE9MSUNZIEFTIFggSk9JTiBDTEFJTVMgQVMgWSBPTiBYLlBPTElDWV9OVU0gPSBZLlBPTElDWV9OVU0KLSAgICAvLyBXSEVSRSAoIDEwMDAwMCA9IEFOWSBZLkRBTUFHRV9FU1RJTUFURVMgKSBBTkQgKCBZLkNBVVNFIE5PVCBMSUtFCi0gICAgLy8gJyVLYXRyaW5hJScgKQotICAgIC8vID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBxdWVyeTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlck9rKCJxdWVyeSIsICJTRUxFQ1QgWS5DTEFJTV9OVU0sIFguUFJPUEVSVFlfQUREUkVTUywgWS5EQU1BR0VfRVNUSU1BVEVTICIKLSAgICAgICAgICAgICAgICArICJGUk9NIFBPTElDWSBBUyBYIEpPSU4gQ0xBSU1TIEFTIFkgT04gWC5QT0xJQ1lfTlVNID0gWS5QT0xJQ1lfTlVNICIKLSAgICAgICAgICAgICAgICArICJXSEVSRSAoIDEwMDAwMCA9IEFOWSBZLkRBTUFHRV9FU1RJTUFURVMgKSBBTkQgKCBZLkNBVVNFIE5PVCBMSUtFICclS2F0cmluYSUnICkiKTsKLSAgICB9Ci0KLSAgICAvLyA8PAotICAgIC8vIFNFTEVDVCBZLkNMQUlNX05VTSwgWC5QUk9QRVJUWV9BRERSRVNTLCBZLkRBTUFHRV9FU1RJTUFURVMKLSAgICAvLyBGUk9NIFBPTElDWSBBUyBYIEpPSU4gQ0xBSU1TIEFTIFkgT04gWC5QT0xJQ1lfTlVNID0gWS5QT0xJQ1lfTlVNCi0gICAgLy8gV0hFUkUgKCAxMDAwMDAgPD0gQU5ZIFkuREFNQUdFX0VTVElNQVRFUyApIEFORCAoIFkuQ0FVU0UgTk9UIExJS0UKLSAgICAvLyAnJUthdHJpbmElJyApCi0gICAgLy8gPj4gRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgcXVlcnk1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RQYXJzZXJGYWlsKCJxdWVyeSIsICJTRUxFQ1QgWS5DTEFJTV9OVU0sIFguUFJPUEVSVFlfQUREUkVTUywgWS5EQU1BR0VfRVNUSU1BVEVTICIKLSAgICAgICAgICAgICAgICArICJGUk9NIFBPTElDWSBBUyBYIEpPSU4gQ0xBSU1TIEFTIFkgT04gWC5QT0xJQ1lfTlVNID0gWS5QT0xJQ1lfTlVNICIKLSAgICAgICAgICAgICAgICArICIgICAgV0hFUkUgKCAxMDAwMDAgPD0gQU5ZIFkuREFNQUdFX0VTVElNQVRFUyApIEFORCAoIFkuQ0FVU0UgTk9UIExJS0UgJyVLYXRyaW5hJScgKSIpOwotICAgIH0KLQotICAgIC8vIDw8Ci0gICAgLy8gU0VMRUNUICoKLSAgICAvLyBGUk9NIENBUl9SRVZJRVcKLSAgICAvLyBXSEVSRSBBTlkgRkVBVFVSRVMgSU4gKCdOQVZJR0FUSU9OIFNZU1RFTScsICdTQVRFTExJVEUgUkFESU8nLCAnTVAzJyApCi0gICAgLy8gPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHF1ZXJ5NigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0UGFyc2VyT2soInF1ZXJ5IiwKLSAgICAgICAgICAgICAgICAiIFNFTEVDVCAqIEZST00gQ0FSX1JFVklFVyBXSEVSRSBBTlkgRkVBVFVSRVMgSU4gKCdOQVZJR0FUSU9OIFNZU1RFTScsICdTQVRFTExJVEUgUkFESU8nLCAnTVAzJyApIik7Ci0gICAgfQotCi0gICAgLy8gPDwKLSAgICAvLyBTRUxFQ1QgT0JKRUNUX0lELCBTQ09SRSgpIEFTIFgsIERFU1RJTkFUSU9OLCBERVBBUlRVUkVfREFURVMKLSAgICAvLyBGUk9NIFRSQVZFTF9CUk9DSFVSRQotICAgIC8vIFdIRVJFICggQ09OVEFJTlMoJ0NBUklCQkVBTiBDRU5UUkFMIEFNRVJJQ0EgQ1JVSVNFIFRPVVInKSApIEFORAotICAgIC8vICggJzIwMTAtMS0xJyA9IEFOWSBERVBBUlRVUkVfREFURVMgKQotICAgIC8vIE9SREVSIEJZIFggREVTQwotICAgIC8vID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBxdWVyeTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlck9rKCJxdWVyeSIsICJTRUxFQ1QgT0JKRUNUX0lELCBTQ09SRSgpIEFTIFgsIERFU1RJTkFUSU9OLCBERVBBUlRVUkVfREFURVMgIiArICJGUk9NIFRSQVZFTF9CUk9DSFVSRSAiCi0gICAgICAgICAgICAgICAgKyAiV0hFUkUgKCBDT05UQUlOUygnQ0FSSUJCRUFOIENFTlRSQUwgQU1FUklDQSBDUlVJU0UgVE9VUicpICkgQU5EKCAnMjAxMC0xLTEnID0gQU5ZIERFUEFSVFVSRV9EQVRFUyApIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBxdWVyeUVzYzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdFBhcnNlck9rKCJxdWVyeSIsICJTRUxFQ1QgKiBGUk9NIGNtaXM6ZG9jdW1lbnQgIiArICJXSEVSRSBjbWlzOm5hbWUgTElLRSAnYWJjXFwlJyIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9UZXN0UGFyc2VyVGV4dFNlYXJjaC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9xdWVyeS9UZXN0UGFyc2VyVGV4dFNlYXJjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODY2MWE5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvcXVlcnkvVGVzdFBhcnNlclRleHRTZWFyY2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFRlc3RQYXJzZXJUZXh0U2VhcmNoIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJUZXN0ewotCi0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGVzdFBhcnNlclRleHRTZWFyY2guY2xhc3MpOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBzdXBlci5zZXRVcChUZXh0U2VhcmNoTGV4ZXIuY2xhc3MsIFRleHRTZWFyY2hQYXJzZXIuY2xhc3MsIG51bGwsICJDbWlzQmFzZUxleGVyIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgLy8gZnVsbCB0ZXh0IHNlYXJjaCBwYXJzZXIKLSAgICAvLyAgICBPUjoKLSAgICAvLyAgICA8PAotICAgIC8vICAgIE9SCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPUjEoKSB7Ci0gICAgICB0ZXN0TGV4ZXJPaygiT1IiLCAiT1IiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICBURVhUX1NFQVJDSF9XT1JEX0xJVDoKLSAgICAvLyAgICA8PAotICAgIC8vICAgIGFiYwotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VEVYVF9TRUFSQ0hfV09SRF9MSVQyKCkgewotICAgICAgdGVzdExleGVyT2soIlRFWFRfU0VBUkNIX1dPUkRfTElUIiwgImFiYyIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgYWIgYwotICAgIC8vICAgID4+IEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RURVhUX1NFQVJDSF9XT1JEX0xJVDMoKSB7Ci0gICAgICAgIHRlc3RMZXhlckZhaWwoIlRFWFRfU0VBUkNIX1dPUkRfTElUIiwgImFiIGMiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgICdhYmMnIAotICAgIC8vICAgID4+IEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RURVhUX1NFQVJDSF9XT1JEX0xJVDQoKSB7Ci0gICAgICAgIHRlc3RMZXhlckZhaWwoIlRFWFRfU0VBUkNIX1dPUkRfTElUIiwgIlwnYWJjXCciKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgIGFiXCdjCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JkTGl0ZXJhbFdpdGhTaW5nbGVRdW90ZSgpIHsKLSAgICAgICAgdGVzdExleGVyT2soIlRFWFRfU0VBUkNIX1dPUkRfTElUIiwgImFiXFwnYyIpOwotICAgICAgICB0ZXN0TGV4ZXJGYWlsKCJURVhUX1NFQVJDSF9XT1JEX0xJVCIsICJhYidjIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYWJcXGMiCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2VXaXRoQmFja3NsYXNoKCkgewotICAgICAgdGVzdExleGVyT2soIlRFWFRfU0VBUkNIX1BIUkFTRV9TVFJJTkdfTElUIiwgIlwiYWJcXFxcY1wiIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgcGhyYXNlOgotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICBcJ2FiY1wnCi0gICAgLy8gICAgPj4gRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBocmFzZTEoKSB7Ci0gICAgICAgIHRlc3RQYXJzZXJGYWlsKCJwaHJhc2UiLCAiXFwnYWJjXFwnIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYWJjIgotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhyYXNlMigpIHsKLSAgICAgICAgdGVzdFBhcnNlck9rKCJwaHJhc2UiLCAiXCJhYmNcIiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgIidhYmMnIgotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhyYXNlMygpIHsKLSAgICAgIHRlc3RQYXJzZXJGYWlsKCJwaHJhc2UiLCAiJ2FiYyciKTsKLSAgICAgIHRlc3RQYXJzZXJPaygicGhyYXNlIiwgIlwiXFwnYWJjXFwnXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgICJhYmMgZGVmIgotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhyYXNlNCgpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygicGhyYXNlIiwgIlwiYWJjIGRlZlwiIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYWJcXGMiCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2U2KCkgewotICAgICAgdGVzdFBhcnNlck9rKCJwaHJhc2UiLCAiXCJhYlxcXFxjXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgICJhYlxjIgotICAgIC8vICAgID4+IEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2VFc2NhcGVkQmFja3NsYXNoKCkgewotICAgICAgICB0ZXN0UGFyc2VyRmFpbCgicGhyYXNlIiwgIlwiYWJcXGNcIiIpOwotICAgICAgICB0ZXN0UGFyc2VyT2soInBocmFzZSIsICJcImFiXFxcXGNcIiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgImFiXFxcYyIKLSAgICAvLyAgICA+PiBGQUlMCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhyYXNlOCgpIHsKLSAgICAgICAgdGVzdFBhcnNlckZhaWwoInBocmFzZSIsICJcImFiXFxcXFxcY1wiIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYWJcJ2MiCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2VTaW5nbGVRdW90ZSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYidjIiwgImFiXCdjIik7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygicGhyYXNlIiwgIlwiYWJcXCdjXCIiKTsKLSAgICAgICAgdGVzdFBhcnNlckZhaWwoInBocmFzZSIsICJcImFiJ2NcIiIpOyAvLyEhCi0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYWJcLWMiCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2VIeXBoZW4oKSB7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygicGhyYXNlIiwgIlwiYWJcXC1jXCIiKTsKLSAgICAgICAgdGVzdFBhcnNlckZhaWwoInBocmFzZSIsICJcImFiLWNcIiIpOyAgICAgLy8gISEhCi0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwgCi0gICAgLy8gICAgImFiYyoiCi0gICAgLy8gICAgImFiY1wqIgotICAgIC8vICAgICJhYmM/IgotICAgIC8vICAgICJhYmNcPyIKLSAgICAvLyAgICA+PiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBocmFzZVdpbGRjYXJkcygpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygicGhyYXNlIiwgIlwiYWJjKlwiIik7Ci0gICAgICB0ZXN0UGFyc2VyT2soInBocmFzZSIsICJcImFiY1xcKlwiIik7Ci0gICAgICB0ZXN0UGFyc2VyT2soInBocmFzZSIsICJcImFiYz9cIiIpOwotICAgICAgdGVzdFBhcnNlck9rKCJwaHJhc2UiLCAiXCJhYmNcXD9cIiIpOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYWJjIGRlZiIKLSAgICAvLyAgICA+PiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBocmFzZTEwKCkgewotICAgICAgdGVzdFBhcnNlck9rKCJwaHJhc2UiLCAiXCJhYmMgZGVmXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgICJcJ2FiY1wnIgotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhyYXNlMTEoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInBocmFzZSIsICJcIlxcJ2FiY1xcJ1wiIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYWJjIEFORCBkZWYiCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2UxMigpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygicGhyYXNlIiwgIlwiYWJjIEFORCBkZWZcIiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8IAotICAgIC8vICAgICJBTkQiCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQaHJhc2UxMygpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygicGhyYXNlIiwgIlwiQU5EXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICB3b3JkOgotICAgIC8vCi0gICAgLy8gICAgPDwgCi0gICAgLy8gICAgYWJjCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JkMSgpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygid29yZCIsICJhYmMiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PCAKLSAgICAvLyAgICAzMTIjKyEmYWJjCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JkMigpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygid29yZCIsICIzMTIjKyEmYWJjIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwgCi0gICAgLy8gICAgXCdhYmNcJwotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V29yZDMoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soIndvcmQiLCAiXFwnYWJjXFwnIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwgCi0gICAgLy8gICAgJ2FiYycKLSAgICAvLyAgICA+PiBGQUlMCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V29yZDQoKSB7Ci0gICAgICAgIHRlc3RQYXJzZXJGYWlsKCJ3b3JkIiwgIidhYmMnIik7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgYWJcLWMKLSAgICAvLyAgICA+PiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdvcmQ2KCkgewotICAgICAgICB0ZXN0UGFyc2VyT2soIndvcmQiLCAiYWJcXC1jIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICBhYlxcYwotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V29yZDcoKSB7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygid29yZCIsICJhYlxcXFxjIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICBhYlwnYwotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V29yZDgoKSB7Ci0gICAgICAgIHRlc3RQYXJzZXJPaygid29yZCIsICJhYlxcJ2MiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgIE9SCi0gICAgLy8gICAgPj4gRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdvcmQ5KCkgewotICAgICAgICB0ZXN0UGFyc2VyRmFpbCgid29yZCIsICJPUiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgQU5ECi0gICAgLy8gICAgPj4gRkFJTAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdvcmQxMCgpIHsKLSAgICAgICAgdGVzdFBhcnNlckZhaWwoIndvcmQiLCAiQU5EIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8KLSAgICAvLyAgICB0ZXJtOgotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAtYWJjCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JkMTEoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInRlcm0iLCAiLWFiYyIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgYWJjCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXb3JkMTIoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInRlcm0iLCAiYWJjIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAnYWJjIGRlZicKLSAgICAvLyAgICA+PiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdvcmQxMygpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygidGVybSIsICJcImFiYyBkZWZcIiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgLSdhYmMgZGVmJwotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V29yZDE0KCkgewotICAgICAgdGVzdFBhcnNlck9rKCJ0ZXJtIiwgIi1cImFiYyBkZWZcIiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIGNvbmp1bmN0OgotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICBhYmMgZGVmCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25qdW5jdDEoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soImNvbmp1bmN0IiwgImFiYyBkZWYiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgIGFiYyBBTkQgZGVmCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25qdW5jdDIoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soImNvbmp1bmN0IiwgImFiYyBBTkQgZGVmIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICBhYmMgQU5EIGRlZiBnaGkgSm9oblwncwotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uanVuY3QzKCkgewotICAgICAgdGVzdFBhcnNlck9rKCJjb25qdW5jdCIsICJhYmMgQU5EIGRlZiBnaGkgSm9oblxcJ3MiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICB0ZXh0X3NlYXJjaF9leHByZXNzaW9uOgotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICBjYXQgbW91c2UgZG9nCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjEoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiY2F0IG1vdXNlIGRvZyIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgY2F0IEFORCBtb3VzZSBBTkQgZG9nCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjIoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiY2F0IEFORCBtb3VzZSBBTkQgZG9nIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICBjYXQgT1IgbW91c2UgT1IgZG9nCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjMoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiY2F0IE9SIG1vdXNlIE9SIGRvZyIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgY2F0IG1vdXNlIE9SIGRvZwotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFNlYXJjaEV4cHJlc3Npb240KCkgewotICAgICAgdGVzdFBhcnNlck9rKCJ0ZXh0X3NlYXJjaF9leHByZXNzaW9uIiwgImNhdCBtb3VzZSBPUiBkb2ciKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgIGNhdCBBTkQgbW91c2UgT1IgZG9nIEFORCBKb2huXCdzCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjUoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiY2F0IEFORCBtb3VzZSBPUiBkb2cgQU5EIEpvaG5cXCdzIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiY2F0IEFORCBtb3VzZSIKLSAgICAvLyAgICA+PiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRleHRTZWFyY2hFeHByZXNzaW9uNigpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygidGV4dF9zZWFyY2hfZXhwcmVzc2lvbiIsICJcImNhdCBBTkQgbW91c2VcIiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgInRleHQgc2VhcmNoIGV4cHJlc3Npb24iCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjcoKSB7Ci0gICAgICB0ZXN0UGFyc2VyT2soInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiXCJ0ZXh0IHNlYXJjaCBleHByZXNzaW9uXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgICJKb2huXCdzIHByZXNlbnRhdGlvbiIKLSAgICAvLyAgICA+PiBPSwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRleHRTZWFyY2hFeHByZXNzaW9uOCgpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygidGV4dF9zZWFyY2hfZXhwcmVzc2lvbiIsICJcIkpvaG5cXCdzIHByZXNlbnRhdGlvblwiIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiSm9oblxcJ3MgcHJlc2VudGF0aW9uIgotICAgIC8vICAgID4+IEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjkoKSB7Ci0gICAgICAgIHRlc3RQYXJzZXJGYWlsKCJ0ZXh0X3NlYXJjaF9leHByZXNzaW9uIiwgIlwiSm9oblxcXFwncyBwcmVzZW50YXRpb25cIiIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgQVwtMQotICAgIC8vICAgID4+IE9LCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFNlYXJjaEV4cHJlc3Npb24xMCgpIHsKLSAgICAgIHRlc3RQYXJzZXJPaygidGV4dF9zZWFyY2hfZXhwcmVzc2lvbiIsICJBXFwtMSIpOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIC8vICAgIDw8Ci0gICAgLy8gICAgImM6XFxNeSBEb2N1bWVudHMiCi0gICAgLy8gICAgPj4gT0sKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjExKCkgewotICAgICAgdGVzdFBhcnNlck9rKCJ0ZXh0X3NlYXJjaF9leHByZXNzaW9uIiwgIlwiYzpcXFxcTXkgRG9jdW1lbnRzXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgICJjOlxcXE15IERvY3VtZW50cyIKLSAgICAvLyAgICA+PiBGQUlMCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFNlYXJjaEV4cHJlc3Npb24xMygpIHsKLSAgICAgICAgdGVzdFBhcnNlckZhaWwoInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiXCJjOlxcXFxcXE15IERvY3VtZW50c1wiIik7Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgLy8gICAgPDwKLSAgICAvLyAgICAiYzpcTXkgRG9jdW1lbnRzIgotICAgIC8vICAgID4+IEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjE0KCkgewotICAgICAgdGVzdFBhcnNlckZhaWwoInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiXCJjOlxcTXkgRG9jdW1lbnRzXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICAvLyAgICA8PAotICAgIC8vICAgIGM6XE15IERvY3VtZW50cwotICAgIC8vICAgID4+IEZBSUwKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0U2VhcmNoRXhwcmVzc2lvbjE1KCkgewotICAgICAgdGVzdFBhcnNlckZhaWwoInRleHRfc2VhcmNoX2V4cHJlc3Npb24iLCAiYzpcXE15IERvY3VtZW50cyIpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQvd3JhcHBlci9DbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC93cmFwcGVyL0NtaXNTZXJ2aWNlV3JhcHBlck1hbmFnZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzhmMzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC93cmFwcGVyL0NtaXNTZXJ2aWNlV3JhcHBlck1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc3VwcG9ydC53cmFwcGVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuRXh0ZW5zaW9uc0RhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0UGFyZW50RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXIuQWJzdHJhY3RDbWlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNlcnZlci5DbWlzU2VydmljZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENtaXNTZXJ2aWNlV3JhcHBlck1hbmFnZXJUZXN0IHsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZXJNYW5hZ2VyKCkgewotICAgICAgICBDbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQ21pc1NlcnZpY2VXcmFwcGVyTWFuYWdlcigpOwotCi0gICAgICAgIG1hbmFnZXIuYWRkT3V0ZXJXcmFwcGVyKFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIuY2xhc3MpOwotICAgICAgICBtYW5hZ2VyLmFkZE91dGVyV3JhcHBlcihDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlci5jbGFzcywgLTEsIDEwMCwgLTEsIDEwMDApOwotICAgICAgICBtYW5hZ2VyLmFkZE91dGVyV3JhcHBlcihTaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyLmNsYXNzLCAib3V0ZXIiKTsKLSAgICAgICAgbWFuYWdlci5hZGRJbm5lcldyYXBwZXIoU2ltcGxlTG9nZ2luZ0NtaXNTZXJ2aWNlV3JhcHBlci5jbGFzcywgImlubmVyIik7Ci0KLSAgICAgICAgRHVtbXlTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRHVtbXlTZXJ2aWNlKCk7Ci0gICAgICAgIENtaXNTZXJ2aWNlIHdyYXBwZXJlZFNlcnZpY2UgPSBtYW5hZ2VyLndyYXAoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydFRydWUod3JhcHBlcmVkU2VydmljZSBpbnN0YW5jZW9mIEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICBBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlciB3cmFwcGVyID0gKEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKSB3cmFwcGVyZWRTZXJ2aWNlOwotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXIgaW5zdGFuY2VvZiBTaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICB3cmFwcGVyID0gKEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKSB3cmFwcGVyLmdldFdyYXBwZWRTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydFRydWUod3JhcHBlciBpbnN0YW5jZW9mIENvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICB3cmFwcGVyID0gKEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKSB3cmFwcGVyLmdldFdyYXBwZWRTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydFRydWUod3JhcHBlciBpbnN0YW5jZW9mIFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIpOwotCi0gICAgICAgIHdyYXBwZXIgPSAoQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIpIHdyYXBwZXIuZ2V0V3JhcHBlZFNlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyIGluc3RhbmNlb2YgU2ltcGxlTG9nZ2luZ0NtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyLmdldFdyYXBwZWRTZXJ2aWNlKCkgaW5zdGFuY2VvZiBEdW1teVNlcnZpY2UpOwotCi0gICAgICAgIC8vIHJlbW92aW5nIG91dGVyIHdyYXBwZXIKLSAgICAgICAgbWFuYWdlci5yZW1vdmVPdXRlcldyYXBwZXIoKTsKLQotICAgICAgICBzZXJ2aWNlID0gbmV3IER1bW15U2VydmljZSgpOwotICAgICAgICB3cmFwcGVyZWRTZXJ2aWNlID0gbWFuYWdlci53cmFwKHNlcnZpY2UpOwotCi0gICAgICAgIGFzc2VydFRydWUod3JhcHBlcmVkU2VydmljZSBpbnN0YW5jZW9mIEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICB3cmFwcGVyID0gKEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKSB3cmFwcGVyZWRTZXJ2aWNlOwotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXIgaW5zdGFuY2VvZiBDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgd3JhcHBlciA9IChBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcikgd3JhcHBlci5nZXRXcmFwcGVkU2VydmljZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXIgaW5zdGFuY2VvZiBTaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICB3cmFwcGVyID0gKEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKSB3cmFwcGVyLmdldFdyYXBwZWRTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydFRydWUod3JhcHBlciBpbnN0YW5jZW9mIFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIpOwotCi0gICAgICAgIGFzc2VydFRydWUod3JhcHBlci5nZXRXcmFwcGVkU2VydmljZSgpIGluc3RhbmNlb2YgRHVtbXlTZXJ2aWNlKTsKLQotICAgICAgICAvLyByZW1vdmluZyBpbm5lciB3cmFwcGVyCi0gICAgICAgIG1hbmFnZXIucmVtb3ZlSW5uZXJXcmFwcGVyKCk7Ci0KLSAgICAgICAgc2VydmljZSA9IG5ldyBEdW1teVNlcnZpY2UoKTsKLSAgICAgICAgd3JhcHBlcmVkU2VydmljZSA9IG1hbmFnZXIud3JhcChzZXJ2aWNlKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXJlZFNlcnZpY2UgaW5zdGFuY2VvZiBBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgd3JhcHBlciA9IChBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcikgd3JhcHBlcmVkU2VydmljZTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyIGluc3RhbmNlb2YgQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIpOwotCi0gICAgICAgIHdyYXBwZXIgPSAoQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIpIHdyYXBwZXIuZ2V0V3JhcHBlZFNlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyIGluc3RhbmNlb2YgU2ltcGxlTG9nZ2luZ0NtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyLmdldFdyYXBwZWRTZXJ2aWNlKCkgaW5zdGFuY2VvZiBEdW1teVNlcnZpY2UpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZXJNYW5hZ2VyRnJvbVBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KCJkdW1teSIsICJzb21ldGhpbmciKTsKLQotICAgICAgICBwYXJhbWV0ZXJzLnB1dCgic2VydmljZXdyYXBwZXIuMSIsIFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpICsgIiwxIik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KCJzZXJ2aWNld3JhcHBlci4yIiwgQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpICsgIiwyIik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KCJzZXJ2aWNld3JhcHBlci4zIiwgU2ltcGxlTG9nZ2luZ0NtaXNTZXJ2aWNlV3JhcHBlci5jbGFzcy5nZXROYW1lKCkgKyAiLDMiKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoInNlcnZpY2V3cmFwcGVyLjQiLCBTaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyLmNsYXNzLmdldE5hbWUoKSArICIsNCIpOwotCi0gICAgICAgIENtaXNTZXJ2aWNlV3JhcHBlck1hbmFnZXIgbWFuYWdlciA9IG5ldyBDbWlzU2VydmljZVdyYXBwZXJNYW5hZ2VyKCk7Ci0gICAgICAgIG1hbmFnZXIuYWRkV3JhcHBlcnNGcm9tU2VydmljZUZhY3RvcnlQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwotCi0gICAgICAgIER1bW15U2VydmljZSBzZXJ2aWNlID0gbmV3IER1bW15U2VydmljZSgpOwotICAgICAgICBDbWlzU2VydmljZSB3cmFwcGVyZWRTZXJ2aWNlID0gbWFuYWdlci53cmFwKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXJlZFNlcnZpY2UgaW5zdGFuY2VvZiBBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIgd3JhcHBlciA9IChBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcikgd3JhcHBlcmVkU2VydmljZTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyIGluc3RhbmNlb2YgU2ltcGxlTG9nZ2luZ0NtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgd3JhcHBlciA9IChBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcikgd3JhcHBlci5nZXRXcmFwcGVkU2VydmljZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXIgaW5zdGFuY2VvZiBDb25mb3JtYW5jZUNtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgd3JhcHBlciA9IChBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcikgd3JhcHBlci5nZXRXcmFwcGVkU2VydmljZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXIgaW5zdGFuY2VvZiBTaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICB3cmFwcGVyID0gKEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKSB3cmFwcGVyLmdldFdyYXBwZWRTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydFRydWUod3JhcHBlciBpbnN0YW5jZW9mIFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIpOwotCi0gICAgICAgIGFzc2VydFRydWUod3JhcHBlci5nZXRXcmFwcGVkU2VydmljZSgpIGluc3RhbmNlb2YgRHVtbXlTZXJ2aWNlKTsKLQotICAgICAgICAvLyByZW1vdmluZyBvdXRlciB3cmFwcGVyCi0gICAgICAgIG1hbmFnZXIucmVtb3ZlT3V0ZXJXcmFwcGVyKCk7Ci0KLSAgICAgICAgc2VydmljZSA9IG5ldyBEdW1teVNlcnZpY2UoKTsKLSAgICAgICAgd3JhcHBlcmVkU2VydmljZSA9IG1hbmFnZXIud3JhcChzZXJ2aWNlKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXJlZFNlcnZpY2UgaW5zdGFuY2VvZiBBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgd3JhcHBlciA9IChBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcikgd3JhcHBlcmVkU2VydmljZTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyIGluc3RhbmNlb2YgQ29uZm9ybWFuY2VDbWlzU2VydmljZVdyYXBwZXIpOwotCi0gICAgICAgIHdyYXBwZXIgPSAoQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIpIHdyYXBwZXIuZ2V0V3JhcHBlZFNlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyIGluc3RhbmNlb2YgU2ltcGxlTG9nZ2luZ0NtaXNTZXJ2aWNlV3JhcHBlcik7Ci0KLSAgICAgICAgd3JhcHBlciA9IChBYnN0cmFjdENtaXNTZXJ2aWNlV3JhcHBlcikgd3JhcHBlci5nZXRXcmFwcGVkU2VydmljZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXIgaW5zdGFuY2VvZiBTaW1wbGVMb2dnaW5nQ21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHdyYXBwZXIuZ2V0V3JhcHBlZFNlcnZpY2UoKSBpbnN0YW5jZW9mIER1bW15U2VydmljZSk7Ci0KLSAgICAgICAgLy8gcmVtb3ZpbmcgaW5uZXIgd3JhcHBlcgotICAgICAgICBtYW5hZ2VyLnJlbW92ZUlubmVyV3JhcHBlcigpOwotCi0gICAgICAgIHNlcnZpY2UgPSBuZXcgRHVtbXlTZXJ2aWNlKCk7Ci0gICAgICAgIHdyYXBwZXJlZFNlcnZpY2UgPSBtYW5hZ2VyLndyYXAoc2VydmljZSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cmFwcGVyZWRTZXJ2aWNlIGluc3RhbmNlb2YgQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIpOwotCi0gICAgICAgIHdyYXBwZXIgPSAoQWJzdHJhY3RDbWlzU2VydmljZVdyYXBwZXIpIHdyYXBwZXJlZFNlcnZpY2U7Ci0gICAgICAgIGFzc2VydFRydWUod3JhcHBlciBpbnN0YW5jZW9mIENvbmZvcm1hbmNlQ21pc1NlcnZpY2VXcmFwcGVyKTsKLQotICAgICAgICB3cmFwcGVyID0gKEFic3RyYWN0Q21pc1NlcnZpY2VXcmFwcGVyKSB3cmFwcGVyLmdldFdyYXBwZWRTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydFRydWUod3JhcHBlciBpbnN0YW5jZW9mIFNpbXBsZUxvZ2dpbmdDbWlzU2VydmljZVdyYXBwZXIpOwotCi0gICAgICAgIGFzc2VydFRydWUod3JhcHBlci5nZXRXcmFwcGVkU2VydmljZSgpIGluc3RhbmNlb2YgRHVtbXlTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEdW1teVNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdENtaXNTZXJ2aWNlIHsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExpc3Q8UmVwb3NpdG9yeUluZm8+IGdldFJlcG9zaXRvcnlJbmZvcyhFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkxpc3QgZ2V0VHlwZUNoaWxkcmVuKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsCi0gICAgICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUHJvcGVydHlEZWZpbml0aW9ucywgQmlnSW50ZWdlciBtYXhJdGVtcywgQmlnSW50ZWdlciBza2lwQ291bnQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyB0eXBlSWQsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdEluRm9sZGVyTGlzdCBnZXRDaGlsZHJlbihTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgZm9sZGVySWQsIFN0cmluZyBmaWx0ZXIsIFN0cmluZyBvcmRlckJ5LAotICAgICAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGluY2x1ZGVSZWxhdGlvbnNoaXBzLCBTdHJpbmcgcmVuZGl0aW9uRmlsdGVyLAotICAgICAgICAgICAgICAgIEJvb2xlYW4gaW5jbHVkZVBhdGhTZWdtZW50LCBCaWdJbnRlZ2VyIG1heEl0ZW1zLCBCaWdJbnRlZ2VyIHNraXBDb3VudCwgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBnZXRPYmplY3RQYXJlbnRzKFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyBvYmplY3RJZCwgU3RyaW5nIGZpbHRlciwKLSAgICAgICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zLCBJbmNsdWRlUmVsYXRpb25zaGlwcyBpbmNsdWRlUmVsYXRpb25zaGlwcywgU3RyaW5nIHJlbmRpdGlvbkZpbHRlciwKLSAgICAgICAgICAgICAgICBCb29sZWFuIGluY2x1ZGVSZWxhdGl2ZVBhdGhTZWdtZW50LCBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3REYXRhIGdldE9iamVjdChTdHJpbmcgcmVwb3NpdG9yeUlkLCBTdHJpbmcgb2JqZWN0SWQsIFN0cmluZyBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucywgSW5jbHVkZVJlbGF0aW9uc2hpcHMgaW5jbHVkZVJlbGF0aW9uc2hpcHMsIFN0cmluZyByZW5kaXRpb25GaWx0ZXIsCi0gICAgICAgICAgICAgICAgQm9vbGVhbiBpbmNsdWRlUG9saWN5SWRzLCBCb29sZWFuIGluY2x1ZGVBY2wsIEV4dGVuc2lvbnNEYXRhIGV4dGVuc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQ5NzVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1zdXBwb3J0L3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBzYW1wbGUgbG9nNGoucHJvcGVydGllcwotCi1sb2c0ai5yb290Q2F0ZWdvcnk9V0FSTiwgUiwgTwotCi0jIFN0ZG91dAotbG9nNGouYXBwZW5kZXIuTz1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotCi0jIEZpbGUKLWxvZzRqLmFwcGVuZGVyLlI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5SLkZpbGU9dGFyZ2V0L2xvZ3MvbG9nNGoubG9nCi0KLSMgQ29udHJvbCB0aGUgbWF4aW11bSBsb2cgZmlsZSBzaXplCi1sb2c0ai5hcHBlbmRlci5SLk1heEZpbGVTaXplPTEwMEtCCi0KLSMgQXJjaGl2ZSBsb2cgZmlsZXMgKG9uZSBiYWNrdXAgZmlsZSBoZXJlKQotbG9nNGouYXBwZW5kZXIuUi5NYXhCYWNrdXBJbmRleD0xCi1sb2c0ai5hcHBlbmRlci5SLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLk8ubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuCi1sb2c0ai5hcHBlbmRlci5PLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWM6ICVtJW4KLQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0PVdBUk4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3BvbS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzY1ZWMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi0gICAgPCEtLQotICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgICAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcwotICAgICAgICByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gICAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC4xMy4wPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHA8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+T3BlbkNNSVMgQnJvd3NlciBBcHBsaWNhdGlvbjwvbmFtZT4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotICAgIAotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8cGFyZW50QmFzZWRpcj4uLi8uLi88L3BhcmVudEJhc2VkaXI+Ci0gICAgPC9wcm9wZXJ0aWVzPgotICAgIAotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TR2kgQnVuZGxlIFN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLU5hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJvd3NlcjwvQnVuZGxlLU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJvd3NlcjwvQnVuZGxlLVN5bWJvbGljTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVZlcnNpb24+MC4wLjE8L0J1bmRsZS1WZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT5qYXZheC5zZXJ2bGV0LGphdmF4LnNlcnZsZXQuaHR0cCxqYXZheC5zZXJ2bGV0LnJlc291cmNlczwvSW1wb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1DbGFzc3BhdGg+LjwvQnVuZGxlLUNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8V2ViLUNvbnRleHRQYXRoPmJyb3dzZXI8L1dlYi1Db250ZXh0UGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL2FjbC54c2wgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy9hY2wueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWQxMDM3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL2FjbC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmFwcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNy9hcHAiCi0JeG1sbnM6YXRvbT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczpjbWlzcmE9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4LyI+Ci0KLQk8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIC8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImJyb3dzZVVybCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXV4Um9vdCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPkFDTDwvdGl0bGU+Ci0JCQkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ieyRhdXhSb290fWJyb3dzZXIuY3NzIiAvPgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQkJPGgxPkFDTDwvaDE+Ci0JCQkJPHRhYmxlIGNsYXNzPSJlbnRyeXRhYmxlIj4KLQkJCQk8dHI+Ci0JCQkJCTx0aD5QcmluY2lwYWwgSWQ8L3RoPgotCQkJCQk8dGg+UGVybWlzc2lvbnM8L3RoPgotCQkJCQk8dGg+RGlyZWN0PC90aD4KLQkJCQk8L3RyPgotCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjbWlzOmFjbC9jbWlzOnBlcm1pc3Npb24iPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXM6cHJpbmNpcGFsL2NtaXM6cHJpbmNpcGFsSWQiIC8+PC90ZD4KLQkJCQkJCTx0ZD48eHNsOmZvci1lYWNoIHNlbGVjdD0iY21pczpwZXJtaXNzaW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY3VycmVudCgpIiAvPjxici8+PC94c2w6Zm9yLWVhY2g+PC90ZD4KLQkJCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pczpkaXJlY3QiIC8+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3R5bGVzaGVldHMvYWN0aW9ucy54c2wgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy9hY3Rpb25zLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwZGU0ZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy9hY3Rpb25zLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAKLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6YXBwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA3L2FwcCIKLQl4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmNtaXNyYT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9yZXN0YXRvbS8yMDA5MDgvIj4KLQotCTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0iYnJvd3NlVXJsIi8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhdXhSb290Ii8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+QWxsb3dhYmxlIEFjdGlvbnM8L3RpdGxlPgotCQkJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InskYXV4Um9vdH1icm93c2VyLmNzcyIgLz4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJCTxoMT5BbGxvd2FibGUgQWN0aW9uczwvaDE+Ci0JCQkJPHRhYmxlIGNsYXNzPSJlbnRyeXRhYmxlIj4KLQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iY21pczphbGxvd2FibGVBY3Rpb25zLypbbm90KCopXSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibG9jYWwtbmFtZSgpIiAvPjwvdGQ+Ci0JCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImN1cnJlbnQoKSIgLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3R5bGVzaGVldHMvZW50cnkueHNsIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3R5bGVzaGVldHMvZW50cnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODY3NWFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL2VudHJ5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmFwcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNy9hcHAiCi0JeG1sbnM6YXRvbT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczpjbWlzcmE9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4LyI+Ci0KLQk8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIC8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImJyb3dzZVVybCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXV4Um9vdCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYnJvd3NlT3ZlcnJpZGVTdHlsZXNoZWV0Ii8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0b206ZW50cnkvYXRvbTp0aXRsZSIgLz48L3RpdGxlPgotCQkJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InskYXV4Um9vdH1icm93c2VyLmNzcyIgLz4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Y21pcy5wbmciIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiAvPgotCQkJCTxoMT4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKGF0b206ZW50cnkvY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6ZG9jdW1lbnQnKSI+Ci0JCQkJCQk8aW1nIHNyYz0ieyRhdXhSb290fWRvY3VtZW50LnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOmZvbGRlcicpIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Zm9sZGVyLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOnJlbGF0aW9uc2hpcCcpIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9cmVsYXRpb25zaGlwLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOnBvbGljeScpIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9cG9saWN5LnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJhdG9tOmVudHJ5L2NtaXNyYTp0eXBlIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9dHlwZS5wbmciIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IiAvPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9dW5rbm93bi5wbmciIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IiAvPgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOmVudHJ5L2F0b206dGl0bGUiIC8+PC9oMT4KLQotCQkJCTxkaXYgY2xhc3M9Im5hdmlnYXRpb25ib3giPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J3NlcnZpY2UnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nc2VydmljZSddL0BocmVmfSI+U2VydmljZTwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSd1cCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSd1cCddL0BocmVmfSI+VXA8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nZG93biddIj4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXtAaHJlZn0iPkRvd24gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIgLz4pPC9hPiAtCi0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9mb2xkZXJ0cmVlJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvZm9sZGVydHJlZSddL0BocmVmfSI+Rm9sZGVyIFRyZWU8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmNvbnRlbnQiPgotCQkJCQkJPGEgaHJlZj0ie2F0b206ZW50cnkvYXRvbTpjb250ZW50L0BzcmN9Ij5Eb3dubG9hZDwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSd2ZXJzaW9uLWhpc3RvcnknXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0ndmVyc2lvbi1oaXN0b3J5J10vQGhyZWZ9Ij5BbGwgVmVyc2lvbnM8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nYWx0ZXJuYXRlJ10iPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2FsdGVybmF0ZSddIj4KLQkJCQkJCQk8YSBocmVmPSJ7QGhyZWZ9Ij5SZW5kaXRpb24gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY21pc3JhOnJlbmRpdGlvbktpbmQiPjwveHNsOnZhbHVlLW9mPik8L2E+IC0KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L3JlbGF0aW9uc2hpcHMnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9yZWxhdGlvbnNoaXBzJ10vQGhyZWZ9JmFtcDtyZWxhdGlvbnNoaXBEaXJlY3Rpb249ZWl0aGVyeyRicm93c2VPdmVycmlkZVN0eWxlc2hlZXR9cmVsYXRpb25zaGlwcyI+UmVsYXRpb25zaGlwczwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FsbG93YWJsZWFjdGlvbnMnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hbGxvd2FibGVhY3Rpb25zJ10vQGhyZWZ9Ij5BbGxvd2FibGUgQWN0aW9uczwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FjbCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FjbCddL0BocmVmfSI+QUNMPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvcG9saWNpZXMnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9wb2xpY2llcyddL0BocmVmfSI+UG9saWNpZXM8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nZGVzY3JpYmVkYnknXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nZGVzY3JpYmVkYnknXS9AaHJlZn0iPlR5cGU8L2E+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvZGl2PgotCi0JCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206c3VtbWFyeSI+Ci0JCQkJPGgyPlN1bW1hcnk8L2gyPgotCQkJCTxkaXYgY2xhc3M9ImVudHJ5c3VtbWFyeSI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOmVudHJ5L2F0b206c3VtbWFyeSIgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIvPgotCQkJCTwvZGl2PgotCQkJCTwveHNsOmlmPgotCi0JCQkJPHhzbDppZiB0ZXN0PSJjb250YWlucyhhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOnJlbGF0aW9uc2hpcCcpIj4KLQkJCQk8aDI+UmVsYXRpb25zaGlwPC9oMj4KLQkJCQk8dGFibGUgY2xhc3M9ImVudHJ5dGFibGUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGg+U291cmNlIElkPC90aD4KLQkJCQkJCTx0aD5UYXJnZXQgSWQ8L3RoPgotCQkJCQk8L3RyPgotCQkJCQk8dHI+Ci0JCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9iamVjdElkIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXRvbTplbnRyeS9jbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOm9iamVjdElkJ10vY21pczp2YWx1ZSI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQk8L3hzbDp2YXJpYWJsZT4KLQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW50cnlVcmwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdzZWxmJ10vQGhyZWYiPjwveHNsOnZhbHVlLW9mPgotCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNvdXJjZUlkIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXRvbTplbnRyeS9jbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOnNvdXJjZUlkJ10vY21pczp2YWx1ZSI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQk8L3hzbDp2YXJpYWJsZT4KLQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idGFyZ2V0SWQiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6dGFyZ2V0SWQnXS9jbWlzOnZhbHVlIj48L3hzbDp2YWx1ZS1vZj4KLQkJCQkJCTwveHNsOnZhcmlhYmxlPgotCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VFbnRyeVVybCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGVudHJ5VXJsLCAkb2JqZWN0SWQpIj48L3hzbDp2YWx1ZS1vZj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvdXJjZUlkIj48L3hzbDp2YWx1ZS1vZj4KLQkJCQkJCTwveHNsOnZhcmlhYmxlPgotCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YXJnZXRFbnRyeVVybCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGVudHJ5VXJsLCAkb2JqZWN0SWQpIj48L3hzbDp2YWx1ZS1vZj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldElkIj48L3hzbDp2YWx1ZS1vZj4KLQkJCQkJCTwveHNsOnZhcmlhYmxlPgotCi0JCQkJCQk8dGQgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PGEgaHJlZj0ieyRicm93c2VVcmx9eyRzb3VyY2VFbnRyeVVybH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc291cmNlSWQiPjwveHNsOnZhbHVlLW9mPjwvYT48L3RkPgotCQkJCQkJPHRkIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPjxhIGhyZWY9InskYnJvd3NlVXJsfXskdGFyZ2V0RW50cnlVcmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldElkIj48L3hzbDp2YWx1ZS1vZj48L2E+PC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJCTwveHNsOmlmPgotCi0JCQkJPGgyPlByb3BlcnRpZXM8L2gyPgotCQkJCTx0YWJsZSBjbGFzcz0iZW50cnl0YWJsZSI+Ci0JCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZW50cnkvY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvKiI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByb3BlcnR5RGVmaW5pdGlvbklkIiAvPjwvdGQ+Ci0JCQkJCQk8dGQ+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iY21pczp2YWx1ZSI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImN1cnJlbnQoKSIgLz48YnIvPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdG9tOmVudHJ5L2NtaXNyYTp0eXBlLypbbm90KCopXSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0ibG9jYWwtbmFtZSgpIiAvPjwvdGQ+Ci0JCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImN1cnJlbnQoKSIgLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9jbWlzcmE6cGF0aFNlZ21lbnQiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXN0eWxlOml0YWxpYzsiPlBhdGggU2VnbWVudDwvdGQ+Ci0JCQkJCQk8dGQgc3R5bGU9ImZvbnQtc3R5bGU6aXRhbGljOyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0b206ZW50cnkvY21pc3JhOnBhdGhTZWdtZW50IiAvPjwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQotCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9jbWlzcmE6dHlwZSI+Ci0JCQkJCTxoMj5Qcm9wZXJ0eSBEZWZpbml0aW9uczwvaDI+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdG9tOmVudHJ5L2NtaXNyYTp0eXBlLypbKl0iPgotCQkJCQkJPGgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzOmlkIi8+PC9oMz4KLQkJCQkJCTx0YWJsZSBjbGFzcz0iZW50cnl0YWJsZSI+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iKiI+Ci0JCQkJCQkJPHRyPgotCQkJCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImxvY2FsLW5hbWUoKSIgLz48L3RkPgotCQkJCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImN1cnJlbnQoKSIgLz48L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdGFibGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJPC9ib2R5PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy9mZWVkLnhzbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL2ZlZWQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzVlMTA3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL2ZlZWQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAKLS0tPgotPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczphcHA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvYXBwIiB4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIiB4bWxuczpjbWlzcmE9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4LyIgdmVyc2lvbj0iMS4wIj4KLQk8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJyb3dzZVVybCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXV4Um9vdCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYnJvd3NlT3ZlcnJpZGVTdHlsZXNoZWV0Ii8+Ci0JCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWx0ZXIiPgotCQk8eHNsOnRleHQ+Y21pczpiYXNlVHlwZUlkLGNtaXM6bmFtZSxjbWlzOm9iamVjdFR5cGVJZCxjbWlzOmNvbnRlbnRTdHJlYW1NaW1lVHlwZSxjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgsY21pczpjcmVhdGVkQnksY21pczpjcmVhdGlvbkRhdGUsY21pczp2ZXJzaW9uTGFiZWwsY21pczppc01ham9yVmVyc2lvbixjbWlzOmxhc3RNb2RpZmllZEJ5LGNtaXM6bGFzdE1vZGlmaWNhdGlvbkRhdGUsY21pczppc0xhdGVzdFZlcnNpb248L3hzbDp0ZXh0PgotCTwveHNsOnZhcmlhYmxlPgotCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotCQk8aHRtbD4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0b206ZmVlZC9hdG9tOnRpdGxlIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJ7JGF1eFJvb3R9YnJvd3Nlci5jc3MiLz4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Y21pcy5wbmciIHN0eWxlPSJmbG9hdDogcmlnaHQ7Ii8+Ci0JCQkJPGgxPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXRvbTpmZWVkL2F0b206dGl0bGUiLz4KLQkJCQk8L2gxPgotCQkJCTxkaXYgY2xhc3M9Im5hdmlnYXRpb25ib3giPgotCQkJCQk8Zm9ybSBuYW1lPSJ1cmxmb3JtIj4KLQkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ1cmwiIHZhbHVlPSIiIHNpemU9IjEwMCIvPgotCQkJCQkJPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iYnJvd3NlVXJsIiB2YWx1ZT0ieyRicm93c2VVcmx9Ii8+Ci0JCQkJCQk8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iR28iIG9uQ2xpY2s9ImxvYWQoKSIvPgotCQkJCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkF0b20iIG9uQ2xpY2s9ImxvYWRBdG9tKCkiLz4KLQkJCQkJPC9mb3JtPgotCQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+IHZhciB4ID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCI9Iik7IGlmKHggPiAtMSkgeyBkb2N1bWVudC5mb3Jtcy51cmxmb3JtLnVybC52YWx1ZSA9IGRlY29kZVVSSSh3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZyh4KzEpKTsgfSBmdW5jdGlvbiBsb2FkKCkgeyB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvY3VtZW50LmZvcm1zLnVybGZvcm0uYnJvd3NlVXJsLnZhbHVlICsgZG9jdW1lbnQuZm9ybXMudXJsZm9ybS51cmwudmFsdWU7IH0gZnVuY3Rpb24gbG9hZEF0b20oKSB7IHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZG9jdW1lbnQuZm9ybXMudXJsZm9ybS51cmwudmFsdWU7IH08L3NjcmlwdD4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3NlcnZpY2UnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdzZXJ2aWNlJ10vQGhyZWZ9Ij5TZXJ2aWNlPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nc2VsZiddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iPkVudHJ5PC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0ndXAnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSd1cCddL0BocmVmfSI+VXA8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nZG93biddIj4KLQkJCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17QGhyZWZ9Ij5Eb3duICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4pPC9hPiAtCi0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdmaXJzdCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2ZpcnN0J10vQGhyZWZ9Ij5GaXJzdDwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3ByZXZpb3VzJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0ncHJldmlvdXMnXS9AaHJlZn0iPlByZXZpb3VzPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nbmV4dCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J25leHQnXS9AaHJlZn0iPk5leHQ8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdsYXN0J10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nbGFzdCddL0BocmVmfSI+TGFzdDwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvZm9sZGVydHJlZSddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvZm9sZGVydHJlZSddL0BocmVmfSI+Rm9sZGVyIFRyZWU8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FsbG93YWJsZWFjdGlvbnMnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FsbG93YWJsZWFjdGlvbnMnXS9AaHJlZn0iPkFsbG93YWJsZSBBY3Rpb25zPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hY2wnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FjbCddL0BocmVmfSI+QUNMPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9wb2xpY2llcyddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvcG9saWNpZXMnXS9AaHJlZn0iPlBvbGljaWVzPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nZGVzY3JpYmVkYnknXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddL0BocmVmfSI+IFR5cGU8L2E+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvZGl2PgotCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206ZW50cnkvY21pc3JhOm9iamVjdCI+Ci0JCQkJCTx0YWJsZSBjbGFzcz0iZmVlZHRhYmxlIj4KLQkJCQkJCTx0cj4KLQkJCQkJCQk8dGgvPgotCQkJCQkJCTx0aD5OYW1lPC90aD4KLQkJCQkJCQk8dGg+VHlwZTwvdGg+Ci0JCQkJCQkJPHRoPk1JTUUgVHlwZTwvdGg+Ci0JCQkJCQkJPHRoPlNpemU8L3RoPgotCQkJCQkJCTx0aD5DcmVhdGVkIEJ5IC88YnIvPkxhc3QgTW9kaWZpZWQgQnk8L3RoPgotCQkJCQkJCTx0aD5DcmVhdGlvbiBEYXRlIC88YnIvPkxhc3QgTW9kaWZpY2F0aW9uIERhdGU8L3RoPgotCQkJCQkJCTx0aD5WZXJzaW9uIExhYmVsPC90aD4KLQkJCQkJCQk8dGg+TWFqb3IgLzxici8+IExhdGVzdDwvdGg+Ci0JCQkJCQk8L3RyPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZmVlZC9hdG9tOmVudHJ5Ij4KLQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSIvPgotCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6bmFtZSddIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im9iamVjdCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXB0aCI+IDA8L3hzbDp3aXRoLXBhcmFtPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC90YWJsZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmVudHJ5L2NtaXNyYTp0eXBlIj4KLQkJCQkJPHRhYmxlIGNsYXNzPSJmZWVkdGFibGUiPgotCQkJCQkJPHRyPgotCQkJCQkJCTx0aC8+Ci0JCQkJCQkJPHRoPklkPC90aD4KLQkJCQkJCQk8dGg+TG9jYWwgTmFtZTwvdGg+Ci0JCQkJCQkJPHRoPkxvY2FsIE5hbWVzcGFjZTwvdGg+Ci0JCQkJCQkJPHRoPkRpc3BsYXkgTmFtZTwvdGg+Ci0JCQkJCQkJPHRoPlF1ZXJ5IE5hbWU8L3RoPgotCQkJCQkJCTx0aD5CYXNlIElkPC90aD4KLQkJCQkJCQk8dGg+RGVzY3JpcHRpb248L3RoPgotCQkJCQkJPC90cj4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdG9tOmZlZWQvYXRvbTplbnRyeSI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InR5cGUiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVwdGgiPiAwPC94c2w6d2l0aC1wYXJhbT4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdGFibGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ib2JqZWN0Ij4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXB0aCIvPgotCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib2RkIj4KLQkJCTx4c2w6aWYgdGVzdD0iKHBvc2l0aW9uKCkgbW9kIDIpICE9IDEiLz4KLQkJCTx4c2w6aWYgdGVzdD0iKHBvc2l0aW9uKCkgbW9kIDIpID0gMSI+LW9kZDwveHNsOmlmPgotCQk8L3hzbDp2YXJpYWJsZT4KLQotCQk8dHI+Ci0JCQk8dGQgY2xhc3M9InRkbGlua3N7JG9kZH0iIHJvd3NwYW49IjIiPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6ZG9jdW1lbnQnKSI+Ci0JCQkJCQk8aW1nIHNyYz0ieyRhdXhSb290fWRvY3VtZW50LnBuZyIvPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6Zm9sZGVyJykiPgotCQkJCQkJPGltZyBzcmM9InskYXV4Um9vdH1mb2xkZXIucG5nIi8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSwnY21pczpyZWxhdGlvbnNoaXAnKSI+Ci0JCQkJCQk8aW1nIHNyYz0ieyRhdXhSb290fXJlbGF0aW9uc2hpcC5wbmciLz4KLQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKGNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOnBvbGljeScpIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9cG9saWN5LnBuZyIvPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9dW5rbm93bi5wbmciLz4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSIgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+Ci0JCQkJPHhzbDppZiB0ZXN0PSIkZGVwdGggJmd0OyAwIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZygnKioqKioqKioqKioqKioqKioqKionLCAxLCAkZGVwdGgpIi8+PHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPiZhbXA7bmJzcDs8L3hzbDp0ZXh0PgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6ZG9jdW1lbnQnKSI+Ci0JCQkJCQk8YSBocmVmPSJ7YXRvbTpjb250ZW50L0BzcmN9Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eVN0cmluZ1tAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6bmFtZSddIi8+Ci0JCQkJCQk8L2E+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSwnY21pczpmb2xkZXInKSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J2Rvd24nXS9AaHJlZn0mYW1wO2ZpbHRlcj17JGZpbHRlcn0iPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5U3RyaW5nW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpuYW1lJ10iLz4KLQkJCQkJCTwvYT4KLQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5U3RyaW5nW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpuYW1lJ10iLz4KLQkJCQkJCTwvYT4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+Ci0JCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddL0BocmVmfSI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOm9iamVjdFR5cGVJZCddIi8+Ci0JCQkJPC9hPgotCQkJPC90ZD4KLQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eVN0cmluZ1tAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6Y29udGVudFN0cmVhbU1pbWVUeXBlJ10iLz4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSIgYWxpZ249InJpZ2h0Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUludGVnZXJbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgnXSIvPgotCQkJPC90ZD4KLQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eVN0cmluZ1tAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6Y3JlYXRlZEJ5J10iLz4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlEYXRlVGltZVtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6Y3JlYXRpb25EYXRlJ10iLz4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlTdHJpbmdbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOnZlcnNpb25MYWJlbCddIi8+Ci0JCQk8L3RkPgotCQkJPHRkIGNsYXNzPSJ0ZGluZm97JG9kZH0iPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5Qm9vbGVhbltAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6aXNNYWpvclZlcnNpb24nXSIvPgotCQkJPC90ZD4KLQkJPC90cj4KLQkJPHRyPgotCQkJPHRkIGNsYXNzPSJ0ZGxpbmtzeyRvZGR9IiBjb2xzcGFuPSI0Ij4KLQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5FbnRyeTwvYT4gLQotCQkJCTx4c2w6aWYgdGVzdD0iY29udGFpbnMoY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6ZG9jdW1lbnQnKSI+Ci0JCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0nc2VsZiddL0BocmVmfSZhbXA7cmVuZGl0aW9uRmlsdGVyPSp7JGJyb3dzZU92ZXJyaWRlU3R5bGVzaGVldH1yZW5kaXRpb25zIiBjbGFzcz0iYWN0aW9ubGluayI+UmVuZGl0aW9uczwvYT4gLQotCQkJCTwveHNsOmlmPgotCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0nZGVzY3JpYmVkYnknXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5UeXBlIEluZm88L2E+IC0KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYXRvbTpsaW5rW0ByZWw9J2Rvd24nXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17QGhyZWZ9IiBjbGFzcz0iYWN0aW9ubGluayI+RG93biAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+KTwvYT4gLQotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206Y29udGVudCI+Ci0JCQkJCTxhIGhyZWY9InthdG9tOmNvbnRlbnQvQHNyY30iIGNsYXNzPSJhY3Rpb25saW5rIj5Eb3dubG9hZDwvYT4gLQotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpsaW5rW0ByZWw9J3ZlcnNpb24taGlzdG9yeSddIj4KLQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSd2ZXJzaW9uLWhpc3RvcnknXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5BbGwgVmVyc2lvbnM8L2E+IC0KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206bGlua1tAcmVsPSdhbHRlcm5hdGUnXSI+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdG9tOmxpbmtbQHJlbD0nYWx0ZXJuYXRlJ10iPgotCQkJCQkJPGEgaHJlZj0ie0BocmVmfSIgY2xhc3M9ImFjdGlvbmxpbmsiPlJlbmRpdGlvbiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbWlzcmE6cmVuZGl0aW9uS2luZCIvPik8L2E+IC0KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9yZWxhdGlvbnNoaXBzJ10iPgotCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvcmVsYXRpb25zaGlwcyddL0BocmVmfSZhbXA7cmVsYXRpb25zaGlwRGlyZWN0aW9uPWVpdGhlcnskYnJvd3NlT3ZlcnJpZGVTdHlsZXNoZWV0fXJlbGF0aW9uc2hpcHMiIGNsYXNzPSJhY3Rpb25saW5rIj5SZWxhdGlvbnNoaXBzPC9hPiAtCi0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hbGxvd2FibGVhY3Rpb25zJ10iPgotCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWxsb3dhYmxlYWN0aW9ucyddL0BocmVmfSIgY2xhc3M9ImFjdGlvbmxpbmsiPkFsbG93YWJsZSBBY3Rpb25zPC9hPiAtCi0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hY2wnXSI+Ci0JCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hY2wnXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5BQ0w8L2E+IC0KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvbnRhaW5zKGNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOmZvbGRlcicpIj4KLQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdkb3duJ10vQGhyZWZ9JmFtcDtmaWx0ZXI9eyRmaWx0ZXJ9JmFtcDtyZW5kaXRpb25GaWx0ZXI9Y21pczp0aHVtYm5haWx7JGJyb3dzZU92ZXJyaWRlU3R5bGVzaGVldH10aHVtYm5haWxzIiBjbGFzcz0iYWN0aW9ubGluayI+VGh1bWJuYWlsczwvYT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mbzJ7JG9kZH0iPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5U3RyaW5nW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpsYXN0TW9kaWZpZWRCeSddIi8+Ci0JCQk8L3RkPgotCQkJPHRkIGNsYXNzPSJ0ZGluZm8yeyRvZGR9Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eURhdGVUaW1lW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZSddIi8+Ci0JCQk8L3RkPgotCQkJPHRkIGNsYXNzPSJ0ZGluZm8yeyRvZGR9Ii8+Ci0JCQk8dGQgY2xhc3M9InRkaW5mbzJ7JG9kZH0iPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5Qm9vbGVhbltAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6aXNMYXRlc3RWZXJzaW9uJ10iLz4KLQkJCTwvdGQ+Ci0JCTwvdHI+Ci0KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNtaXNyYTpjaGlsZHJlbi9hdG9tOmZlZWQvYXRvbTplbnRyeSI+Ci0JCQk8eHNsOnNvcnQgc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSIvPgotCQkJPHhzbDpzb3J0IHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpuYW1lJ10iLz4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvYmplY3QiPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXB0aCIgc2VsZWN0PSIkZGVwdGggKyAxIi8+Ci0JCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQk8L3hzbDpmb3ItZWFjaD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idHlwZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVwdGgiLz4KLQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9kZCI+Ci0JCQk8eHNsOmlmIHRlc3Q9Iihwb3NpdGlvbigpIG1vZCAyKSAhPSAxIi8+Ci0JCQk8eHNsOmlmIHRlc3Q9Iihwb3NpdGlvbigpIG1vZCAyKSA9IDEiPi1vZGQ8L3hzbDppZj4KLQkJPC94c2w6dmFyaWFibGU+Ci0KLQkJPHRyPgotCQkJPHRkIGNsYXNzPSJ0ZGxpbmtzeyRvZGR9IiByb3dzcGFuPSIyIj4KLQkJCQk8aW1nIHNyYz0ieyRhdXhSb290fXR5cGUucG5nIi8+Ci0JCQk8L3RkPgotCQkJPHRkIGNsYXNzPSJ0ZGluZm97JG9kZH0iPgotCQkJCTx4c2w6aWYgdGVzdD0iJGRlcHRoICZndDsgMCI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmcoJyoqKioqKioqKioqKioqKioqKioqJywgMSwgJGRlcHRoKSIvPjx4c2w6dGV4dCBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIj4mYW1wO25ic3A7PC94c2w6dGV4dD4KLQkJCQk8L3hzbDppZj4KLQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0nc2VsZiddL0BocmVmfSIgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6dHlwZS9jbWlzOmlkIi8+Ci0JCQkJPC9hPgotCQkJPC90ZD4KLQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOnR5cGUvY21pczpsb2NhbE5hbWUiLz4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTp0eXBlL2NtaXM6bG9jYWxOYW1lc3BhY2UiLz4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTp0eXBlL2NtaXM6ZGlzcGxheU5hbWUiLz4KLQkJCTwvdGQ+Ci0JCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTp0eXBlL2NtaXM6cXVlcnlOYW1lIi8+Ci0JCQk8L3RkPgotCQkJPHRkIGNsYXNzPSJ0ZGluZm97JG9kZH0iPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6dHlwZS9jbWlzOmJhc2VJZCIvPgotCQkJPC90ZD4KLQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9Ij4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOnR5cGUvY21pczpkZXNjcmlwdGlvbiIvPgotCQkJPC90ZD4KLQkJPC90cj4KLQkJPHRyPgotCQkJPHRkIGNsYXNzPSJ0ZGxpbmtzeyRvZGR9IiBjb2xzcGFuPSI3Ij4KLQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5FbnRyeTwvYT4gLQotCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0nZGVzY3JpYmVkYnknXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5UeXBlIEluZm88L2E+IC0KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J2Rvd24nXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5Eb3duPC9hPgotCQkJCTwveHNsOmlmPgotCQkJPC90ZD4KLQkJPC90cj4KLQotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iY21pc3JhOmNoaWxkcmVuL2F0b206ZmVlZC9hdG9tOmVudHJ5Ij4KLQkJCTx4c2w6c29ydCBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6bmFtZSddIi8+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idHlwZSI+Ci0JCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlcHRoIiBzZWxlY3Q9IiRkZXB0aCArIDEiLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCTwveHNsOmZvci1lYWNoPgotCTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL3JlbGF0aW9uc2hpcHMueHNsIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3R5bGVzaGVldHMvcmVsYXRpb25zaGlwcy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzQ4ZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3R5bGVzaGVldHMvcmVsYXRpb25zaGlwcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuIAotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczphcHA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvYXBwIgotCXhtbG5zOmF0b209Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvQXRvbSIgeG1sbnM6Y21pcz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9jb3JlLzIwMDkwOC8iCi0JeG1sbnM6Y21pc3JhPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3Jlc3RhdG9tLzIwMDkwOC8iPgotCi0JPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiAvPgotCi0JPHhzbDpwYXJhbSBuYW1lPSJicm93c2VVcmwiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImF1eFJvb3QiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJyb3dzZU92ZXJyaWRlU3R5bGVzaGVldCIvPgotCi0JPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWx0ZXIiPgotCQk8eHNsOnRleHQ+Y21pczpiYXNlVHlwZUlkLGNtaXM6bmFtZSxjbWlzOm9iamVjdFR5cGVJZCxjbWlzOmNvbnRlbnRTdHJlYW1NaW1lVHlwZSxjbWlzOmNvbnRlbnRTdHJlYW1MZW5ndGgsY21pczpjcmVhdGVkQnksY21pczpjcmVhdGlvbkRhdGUsY21pczp2ZXJzaW9uTGFiZWwsY21pczppc01ham9yVmVyc2lvbixjbWlzOmxhc3RNb2RpZmllZEJ5LGNtaXM6bGFzdE1vZGlmaWNhdGlvbkRhdGUsY21pczppc0xhdGVzdFZlcnNpb248L3hzbDp0ZXh0PgotCTwveHNsOnZhcmlhYmxlPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOmZlZWQvYXRvbTp0aXRsZSIgLz48L3RpdGxlPgotCQkJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InskYXV4Um9vdH1icm93c2VyLmNzcyIgLz4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Y21pcy5wbmciIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiAvPgotCQkJCTxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXRvbTpmZWVkL2F0b206dGl0bGUiIC8+PC9oMT4KLQkJCQk8ZGl2IGNsYXNzPSJuYXZpZ2F0aW9uYm94Ij4KLQkJCQkJPGZvcm0gbmFtZT0idXJsZm9ybSI+Ci0JCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idXJsIiB2YWx1ZT0iIiBzaXplPSIxMDAiLz4KLQkJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImJyb3dzZVVybCIgdmFsdWU9InskYnJvd3NlVXJsfSIgLz4KLQkJCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJHbyIgb25DbGljaz0ibG9hZCgpIiAvPgotCQkJCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkF0b20iIG9uQ2xpY2s9ImxvYWRBdG9tKCkiIC8+Ci0JCQkJCTwvZm9ybT4KLQkJCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQkJdmFyIHggPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoIj0iKTsKLQkJCQkJCWlmKHggPiAtMSkgewotCQkJCQkJCWRvY3VtZW50LmZvcm1zLnVybGZvcm0udXJsLnZhbHVlID0gZGVjb2RlVVJJKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKHgrMSkpOwotCQkJCQkJfQotCQkJCQkJZnVuY3Rpb24gbG9hZCgpIHsgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5mb3Jtcy51cmxmb3JtLmJyb3dzZVVybC52YWx1ZSArIGRvY3VtZW50LmZvcm1zLnVybGZvcm0udXJsLnZhbHVlOyB9Ci0JCQkJCQlmdW5jdGlvbiBsb2FkQXRvbSgpIHsgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5mb3Jtcy51cmxmb3JtLnVybC52YWx1ZTsgfQotCQkJCQk8L3NjcmlwdD4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3NlcnZpY2UnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdzZXJ2aWNlJ10vQGhyZWZ9Ij5TZXJ2aWNlPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nc2VsZiddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iPkVudHJ5PC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0ndXAnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSd1cCddL0BocmVmfSI+VXA8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nZG93biddIj4KLQkJCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17QGhyZWZ9Ij5Eb3duICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiIC8+KTwvYT4gLQotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nZmlyc3QnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdmaXJzdCddL0BocmVmfSI+Rmlyc3Q8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdwcmV2aW91cyddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3ByZXZpb3VzJ10vQGhyZWZ9Ij5QcmV2aW91czwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J25leHQnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSduZXh0J10vQGhyZWZ9Ij5OZXh0PC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nbGFzdCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2xhc3QnXS9AaHJlZn0iPkxhc3Q8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2ZvbGRlcnRyZWUnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2ZvbGRlcnRyZWUnXS9AaHJlZn0iPkZvbGRlciBUcmVlPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hbGxvd2FibGVhY3Rpb25zJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hbGxvd2FibGVhY3Rpb25zJ10vQGhyZWZ9Ij5BbGxvd2FibGUgQWN0aW9uczwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWNsJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hY2wnXS9AaHJlZn0iPkFDTDwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvcG9saWNpZXMnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L3BvbGljaWVzJ10vQGhyZWZ9Ij5Qb2xpY2llczwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2Rlc2NyaWJlZGJ5J10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nZGVzY3JpYmVkYnknXS9AaHJlZn0iPlR5cGU8L2E+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvZGl2PgotCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206ZW50cnkvY21pc3JhOm9iamVjdCI+Ci0JCQkJCTxoMj5SZWxhdGlvbnNoaXBzPC9oMj4KLQkJCQkJPHRhYmxlIGNsYXNzPSJmZWVkdGFibGUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGg+PC90aD4KLQkJCQkJCTx0aD5OYW1lPC90aD4KLQkJCQkJCTx0aD5UeXBlPC90aD4KLQkJCQkJCTx0aD5Tb3VyY2U8L3RoPgotCQkJCQkJPHRoPlRhcmdldDwvdGg+Ci0JCQkJCQk8dGg+Q3JlYXRpb24gRGF0ZSAvPGJyLz4gTGFzdCBNb2RpZmljYXRpb24gRGF0ZTwvdGg+Ci0JCQkJCTwvdHI+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdG9tOmZlZWQvYXRvbTplbnRyeSI+Ci0JCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSIgLz4KLQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6bmFtZSddIiAvPgotCi0JCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9kZCI+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgIT0gMSI+PC94c2w6aWY+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAxIj4tb2RkPC94c2w6aWY+Ci0JCQkJCQk8L3hzbDp2YXJpYWJsZT4KLQotCQkJCQkJPHRyPgotCQkJCQkJCTx0ZCBjbGFzcz0idGRsaW5rc3skb2RkfSIgcm93c3Bhbj0iMiI+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKGNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOmRvY3VtZW50JykiPgotCQkJCQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9ZG9jdW1lbnQucG5nIiAvPgotCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSwnY21pczpmb2xkZXInKSI+Ci0JCQkJCQkJCQkJPGltZyBzcmM9InskYXV4Um9vdH1mb2xkZXIucG5nIiAvPgotCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSwnY21pczpyZWxhdGlvbnNoaXAnKSI+Ci0JCQkJCQkJCQkJPGltZyBzcmM9InskYXV4Um9vdH1yZWxhdGlvbnNoaXAucG5nIiAvPgotCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSwnY21pczpwb2xpY3knKSI+Ci0JCQkJCQkJCQkJPGltZyBzcmM9InskYXV4Um9vdH1wb2xpY3kucG5nIiAvPgotCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9dW5rbm93bi5wbmciIC8+Ci0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9IiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6ZG9jdW1lbnQnKSI+Ci0JCQkJCQkJCQkJPGEgaHJlZj0ie2F0b206Y29udGVudC9Ac3JjfSI+Ci0JCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlTdHJpbmdbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOm5hbWUnXSIgLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKGNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOmZvbGRlcicpIj4KLQkJCQkJCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J2Rvd24nXS9AaHJlZn0mYW1wO2ZpbHRlcj17JGZpbHRlcn0iPgotCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5U3RyaW5nW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpuYW1lJ10iIC8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0nc2VsZiddL0BocmVmfSI+Ci0JCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlTdHJpbmdbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOm5hbWUnXSIgLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9Ij4KLQkJCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddL0BocmVmfSI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOm9iamVjdFR5cGVJZCddIiAvPgotCQkJCQkJCQk8L2E+Ci0JCQkJCQkJPC90ZD4KLQotCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0ib2JqZWN0SWQiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpvYmplY3RJZCddL2NtaXM6dmFsdWUiPjwveHNsOnZhbHVlLW9mPgotCQkJCQkJCTwveHNsOnZhcmlhYmxlPgotCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW50cnlVcmwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZiI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VJZCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOnNvdXJjZUlkJ10vY21pczp2YWx1ZSI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YXJnZXRJZCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOnRhcmdldElkJ10vY21pczp2YWx1ZSI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VFbnRyeVVybCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRlbnRyeVVybCwgJG9iamVjdElkKSI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc291cmNlSWQiPjwveHNsOnZhbHVlLW9mPgotCQkJCQkJCTwveHNsOnZhcmlhYmxlPgotCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idGFyZ2V0RW50cnlVcmwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZW50cnlVcmwsICRvYmplY3RJZCkiPjwveHNsOnZhbHVlLW9mPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldElkIj48L3hzbDp2YWx1ZS1vZj4KLQkJCQkJCQk8L3hzbDp2YXJpYWJsZT4KLQotCQkJCQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9Ij48YSBocmVmPSJ7JGJyb3dzZVVybH17JHNvdXJjZUVudHJ5VXJsfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzb3VyY2VJZCI+PC94c2w6dmFsdWUtb2Y+PC9hPjwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJ0ZGluZm97JG9kZH0iPjxhIGhyZWY9InskYnJvd3NlVXJsfXskdGFyZ2V0RW50cnlVcmx9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldElkIj48L3hzbDp2YWx1ZS1vZj48L2E+PC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlEYXRlVGltZVtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6Y3JlYXRpb25EYXRlJ10iIC8+PC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCQk8dHI+Ci0JCQkJCQkJPHRkIGNsYXNzPSJ0ZGxpbmtzeyRvZGR9IiBjb2xzcGFuPSI0Ij4KLQkJCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdzZWxmJ10vQGhyZWZ9IiBjbGFzcz0iYWN0aW9ubGluayI+RW50cnk8L2E+IC0KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb250YWlucyhjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSwnY21pczpkb2N1bWVudCcpIj4KLQkJCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0nc2VsZiddL0BocmVmfSZhbXA7cmVuZGl0aW9uRmlsdGVyPSp7JGJyb3dzZU92ZXJyaWRlU3R5bGVzaGVldH1yZW5kaXRpb25zIiBjbGFzcz0iYWN0aW9ubGluayI+UmVuZGl0aW9uczwvYT4gLQotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddL0BocmVmfSIgY2xhc3M9ImFjdGlvbmxpbmsiPlR5cGUgSW5mbzwvYT4gLQotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXtAaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5Eb3duICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiIC8+KTwvYT4gLQotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206Y29udGVudCI+Ci0JCQkJCQkJCQk8YSBocmVmPSJ7YXRvbTpjb250ZW50L0BzcmN9IiBjbGFzcz0iYWN0aW9ubGluayI+RG93bmxvYWQ8L2E+IC0KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpsaW5rW0ByZWw9J3ZlcnNpb24taGlzdG9yeSddIj4KLQkJCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0ndmVyc2lvbi1oaXN0b3J5J10vQGhyZWZ9IiBjbGFzcz0iYWN0aW9ubGluayI+QWxsIFZlcnNpb25zPC9hPiAtCi0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206bGlua1tAcmVsPSdhbHRlcm5hdGUnXSI+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYXRvbTpsaW5rW0ByZWw9J2FsdGVybmF0ZSddIj4KLQkJCQkJCQkJCQk8YSBocmVmPSJ7QGhyZWZ9IiBjbGFzcz0iYWN0aW9ubGluayI+UmVuZGl0aW9uICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNtaXNyYTpyZW5kaXRpb25LaW5kIj48L3hzbDp2YWx1ZS1vZj4pPC9hPiAtCi0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvcmVsYXRpb25zaGlwcyddIj4KLQkJCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9yZWxhdGlvbnNoaXBzJ10vQGhyZWZ9eyRicm93c2VPdmVycmlkZVN0eWxlc2hlZXR9cmVsYXRpb25zaGlwcyI+UmVsYXRpb25zaGlwczwvYT4gLQotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hbGxvd2FibGVhY3Rpb25zJ10iPgotCQkJCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FsbG93YWJsZWFjdGlvbnMnXS9AaHJlZn0iIGNsYXNzPSJhY3Rpb25saW5rIj5BbGxvd2FibGUgQWN0aW9uczwvYT4gLQotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9hY2wnXSI+Ci0JCQkJCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWNsJ10vQGhyZWZ9IiBjbGFzcz0iYWN0aW9ubGluayI+QUNMPC9hPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0idGRpbmZvMnskb2RkfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlEYXRlVGltZVtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6bGFzdE1vZGlmaWNhdGlvbkRhdGUnXSIgLz48L3RkPgotCQkJCQk8L3RyPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC90YWJsZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmVudHJ5L2NtaXNyYTp0eXBlIj4KLQotCQkJCQk8dGFibGUgY2xhc3M9ImZlZWR0YWJsZSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0aD48L3RoPgotCQkJCQkJPHRoPklkPC90aD4KLQkJCQkJCTx0aD5Mb2NhbCBOYW1lPC90aD4KLQkJCQkJCTx0aD5Mb2NhbCBOYW1lc3BhY2U8L3RoPgotCQkJCQkJPHRoPkRpc3BsYXkgTmFtZTwvdGg+Ci0JCQkJCQk8dGg+UXVlcnkgTmFtZTwvdGg+Ci0JCQkJCQk8dGg+QmFzZSBJZDwvdGg+Ci0JCQkJCQk8dGg+RGVzY3JpcHRpb248L3RoPgotCQkJCQk8L3RyPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYXRvbTpmZWVkL2F0b206ZW50cnkiPgotCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9kZCI+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgIT0gMSI+PC94c2w6aWY+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAxIj4tb2RkPC94c2w6aWY+Ci0JCQkJCQk8L3hzbDp2YXJpYWJsZT4KLQotCQkJCQkJPHRyPgotCQkJCQkJCTx0ZCBjbGFzcz0idGRsaW5rc3skb2RkfSIgcm93c3Bhbj0iMiI+Ci0JCQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9dHlwZS5wbmciIC8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+Ci0JCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmxpbmtbQHJlbD0nc2VsZiddL0BocmVmfSIgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6dHlwZS9jbWlzOmlkIiAvPgotCQkJCQkJCQk8L2E+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTp0eXBlL2NtaXM6bG9jYWxOYW1lIiAvPjwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJ0ZGluZm97JG9kZH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6dHlwZS9jbWlzOmxvY2FsTmFtZXNwYWNlIiAvPjwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJ0ZGluZm97JG9kZH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6dHlwZS9jbWlzOmRpc3BsYXlOYW1lIiAvPjwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJ0ZGluZm97JG9kZH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6dHlwZS9jbWlzOnF1ZXJ5TmFtZSIgLz48L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0idGRpbmZveyRvZGR9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOnR5cGUvY21pczpiYXNlSWQiIC8+PC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InRkaW5mb3skb2RkfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTp0eXBlL2NtaXM6ZGVzY3JpcHRpb24iIC8+PC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCQk8dHI+Ci0JCQkJCQkJPHRkIGNsYXNzPSJ0ZGxpbmtzeyRvZGR9IiBjb2xzcGFuPSI3Ij4KLQkJCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdzZWxmJ10vQGhyZWZ9IiBjbGFzcz0iYWN0aW9ubGluayI+RW50cnk8L2E+IC0KLQkJCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddL0BocmVmfSIgY2xhc3M9ImFjdGlvbmxpbmsiPlR5cGUgSW5mbzwvYT4gLQotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdkb3duJ10vQGhyZWZ9IiBjbGFzcz0iYWN0aW9ubGluayI+RG93bjwvYT4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3RhYmxlPgotCQkJCTwveHNsOmlmPgotCQkJPC9ib2R5PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy9yZW5kaXRpb25zLnhzbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL3JlbmRpdGlvbnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTExYmUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3N0eWxlc2hlZXRzL3JlbmRpdGlvbnMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLiAKLS0tPgotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6YXBwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA3L2FwcCIKLQl4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHhtbG5zOmNtaXM9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvY29yZS8yMDA5MDgvIgotCXhtbG5zOmNtaXNyYT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9yZXN0YXRvbS8yMDA5MDgvIj4KLQotCTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0iYnJvd3NlVXJsIi8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhdXhSb290Ii8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLQkJPGh0bWw+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0b206ZW50cnkvYXRvbTp0aXRsZSIgLz48L3RpdGxlPgotCQkJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InskYXV4Um9vdH1icm93c2VyLmNzcyIgLz4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Y21pcy5wbmciIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiAvPgotCQkJCTxoMT4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKGF0b206ZW50cnkvY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6ZG9jdW1lbnQnKSI+Ci0JCQkJCQk8aW1nIHNyYz0ieyRhdXhSb290fWRvY3VtZW50LnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOmZvbGRlcicpIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Zm9sZGVyLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOnJlbGF0aW9uc2hpcCcpIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9cmVsYXRpb25zaGlwLnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhhdG9tOmVudHJ5L2NtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOnBvbGljeScpIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9cG9saWN5LnBuZyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsgcGFkZGluZy1yaWdodDogMTBweDsiIC8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSJhdG9tOmVudHJ5L2NtaXNyYTp0eXBlIj4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9dHlwZS5wbmciIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IiAvPgotCQkJCQk8L3hzbDp3aGVuPgotCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9dW5rbm93bi5wbmciIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IiAvPgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOmVudHJ5L2F0b206dGl0bGUiIC8+PC9oMT4KLQotCQkJCTxkaXYgY2xhc3M9Im5hdmlnYXRpb25ib3giPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J3NlcnZpY2UnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nc2VydmljZSddL0BocmVmfSI+U2VydmljZTwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSd1cCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSd1cCddL0BocmVmfSI+VXA8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nZG93biddIj4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXtAaHJlZn0iPkRvd24gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIgLz4pPC9hPiAtCi0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9mb2xkZXJ0cmVlJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvZm9sZGVydHJlZSddL0BocmVmfSI+Rm9sZGVyIFRyZWU8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmNvbnRlbnQiPgotCQkJCQkJPGEgaHJlZj0ie2F0b206ZW50cnkvYXRvbTpjb250ZW50L0BzcmN9Ij5Eb3dubG9hZDwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSd2ZXJzaW9uLWhpc3RvcnknXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0ndmVyc2lvbi1oaXN0b3J5J10vQGhyZWZ9Ij5BbGwgVmVyc2lvbnM8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nYWx0ZXJuYXRlJ10iPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2FsdGVybmF0ZSddIj4KLQkJCQkJCQk8YSBocmVmPSJ7QGhyZWZ9Ij5SZW5kaXRpb24gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY21pc3JhOnJlbmRpdGlvbktpbmQiPjwveHNsOnZhbHVlLW9mPik8L2E+IC0KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L3JlbGF0aW9uc2hpcHMnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9yZWxhdGlvbnNoaXBzJ10vQGhyZWZ9Ij5SZWxhdGlvbnNoaXBzPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWxsb3dhYmxlYWN0aW9ucyddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FsbG93YWJsZWFjdGlvbnMnXS9AaHJlZn0iPkFsbG93YWJsZSBBY3Rpb25zPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWNsJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWNsJ10vQGhyZWZ9Ij5BQ0w8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9wb2xpY2llcyddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L3BvbGljaWVzJ10vQGhyZWZ9Ij5Qb2xpY2llczwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddL0BocmVmfSI+VHlwZTwvYT4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC9kaXY+Ci0KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZW50cnkvYXRvbTpzdW1tYXJ5Ij4KLQkJCQk8aDI+U3VtbWFyeTwvaDI+Ci0JCQkJPGRpdiBjbGFzcz0iZW50cnlzdW1tYXJ5Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0b206ZW50cnkvYXRvbTpzdW1tYXJ5IiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIi8+Ci0JCQkJPC9kaXY+Ci0JCQkJPC94c2w6aWY+Ci0KLQotCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nYWx0ZXJuYXRlJ10iPgotCQkJCTxoMj5SZW5kaXRpb25zPC9oMj4KLQkJCQk8dGFibGU+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZD4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTplbnRyeS9hdG9tOmxpbmtbQHJlbD0nYWx0ZXJuYXRlJyBhbmQgQGNtaXNyYTpyZW5kaXRpb25LaW5kPSdjbWlzOnRodW1ibmFpbCddIj4KLQkJCQkJCQk8aW1nIHNyYz0ie2F0b206ZW50cnkvYXRvbTpsaW5rW0ByZWw9J2FsdGVybmF0ZScgYW5kIEBjbWlzcmE6cmVuZGl0aW9uS2luZD0nY21pczp0aHVtYm5haWwnXS9AaHJlZn0iIC8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTwvdGQ+Ci0JCQkJCQk8dGQ+Ci0JCQkJCQkJPHRhYmxlIGNsYXNzPSJlbnRyeXRhYmxlIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRoPktpbmQ8L3RoPgotCQkJCQkJCQkJPHRoPk1JTUUgVHlwZTwvdGg+Ci0JCQkJCQkJCQk8dGg+U2l6ZTwvdGg+Ci0JCQkJCQkJCQk8dGg+SGVpZ2h0PC90aD4KLQkJCQkJCQkJCTx0aD5XaWR0aDwvdGg+Ci0JCQkJCQkJCTwvdHI+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZW50cnkvY21pc3JhOm9iamVjdC9jbWlzOnJlbmRpdGlvbiI+Ci0JCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0ib2RkIj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iKHBvc2l0aW9uKCkgbW9kIDIpICE9IDEiPjwveHNsOmlmPgotCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAxIj4tb2RkPC94c2w6aWY+Ci0JCQkJCQkJCTwveHNsOnZhcmlhYmxlPgotCQkJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbmRpdGlvbktpbmQiPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXM6a2luZCI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQkJCTwveHNsOnZhcmlhYmxlPgotCQkJCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbmRpdGlvblVSTCI+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iLy9hdG9tOmVudHJ5L2F0b206bGlua1tAcmVsPSdhbHRlcm5hdGUnXSI+Ci0JCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJAY21pc3JhOnJlbmRpdGlvbktpbmQgPSAkcmVuZGl0aW9uS2luZCI+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaHJlZiI+PC94c2w6dmFsdWUtb2Y+Ci0JCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJ0ZGxpbmtzeyRvZGR9Ij48YSBocmVmPSJ7JHJlbmRpdGlvblVSTH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVuZGl0aW9uS2luZCI+PC94c2w6dmFsdWUtb2Y+PC9hPjwvdGQ+Ci0JCQkJCQkJCQk8dGQgY2xhc3M9InRkbGlua3N7JG9kZH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzOm1pbWV0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3RkPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJ0ZGxpbmtzeyRvZGR9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pczpsZW5ndGgiPjwveHNsOnZhbHVlLW9mPjwvdGQ+Ci0JCQkJCQkJCQk8dGQgY2xhc3M9InRkbGlua3N7JG9kZH0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzOmhlaWdodCI+PC94c2w6dmFsdWUtb2Y+PC90ZD4KLQkJCQkJCQkJCTx0ZCBjbGFzcz0idGRsaW5rc3skb2RkfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXM6d2lkdGgiPjwveHNsOnZhbHVlLW9mPjwvdGQ+Ci0JCQkJCQkJCTwvdHI+Ci0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC90YWJsZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvYm9keT4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3R5bGVzaGVldHMvc2VydmljZS54c2wgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy9zZXJ2aWNlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhZWVlNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy9zZXJ2aWNlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmFwcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNy9hcHAiCi0JeG1sbnM6YXRvbT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczpjbWlzcmE9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4LyI+Ci0KLQk8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIC8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImJyb3dzZVVybCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXV4Um9vdCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPlNlcnZpY2U8L3RpdGxlPgotCQkJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InskYXV4Um9vdH1icm93c2VyLmNzcyIgLz4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Y21pcy5wbmciIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiAvPgotCQkJCTxIMT5SZXBvc2l0b3JpZXM8L0gxPgotCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhcHA6c2VydmljZS9hcHA6d29ya3NwYWNlIj4KLQkJCQkJPGRpdiBjbGFzcz0ic2VydmljZWJveCI+Ci0JCQkJCQk8aDI+UmVwb3NpdG9yeSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOnJlcG9zaXRvcnlJbmZvL2NtaXM6cmVwb3NpdG9yeUlkIiAvPjwvaDI+Ci0JCQkJCQk8aDM+Q29sbGVjdGlvbnM6PC9oMz48dWw+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJhcHA6Y29sbGVjdGlvbiIgLz48L3VsPgotCQkJCQkJPGgzPkxpbmtzOjwvaDM+PHVsPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYXRvbTpsaW5rIiAvPjwvdWw+Ci0JCQkJCQk8aDM+VVJJIFRlbXBsYXRlczo8L2gzPjx1bD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNtaXNyYTp1cml0ZW1wbGF0ZSIgLz48L3VsPgotCQkJCQkJPHRhYmxlIHN0eWxlPSJib3JkZXItc3BhY2luZzo1cHgiPgotCQkJCQkJCTx0cj4KLQkJCQkJCQkJPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7Ij48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImNtaXNyYTpyZXBvc2l0b3J5SW5mbyIgLz48L3RkPgotCQkJCQkJCQk8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDsiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iY21pc3JhOnJlcG9zaXRvcnlJbmZvL2NtaXM6Y2FwYWJpbGl0aWVzIiAvPjwvdGQ+Ci0JCQkJCQkJCTx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wOyI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJjbWlzcmE6cmVwb3NpdG9yeUluZm8vY21pczphY2xDYXBhYmlsaXR5IiAvPjwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwvdGFibGU+Ci0JCQkJCTwvZGl2PgotCQkJCTwveHNsOmZvci1lYWNoPgotCQkJPC9ib2R5PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbWlzcmE6cmVwb3NpdG9yeUluZm8iPgotCQk8ZGl2PgotCQk8aDM+SW5mbzwvaDM+Ci0JCTx0YWJsZSBjbGFzcz0ic2VydmljZXRhYmxlIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIqW25vdCgqKV0iPgotCQkJCTx0cj4KLQkJCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJsb2NhbC1uYW1lKCkiIC8+PC90ZD4KLQkJCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjdXJyZW50KCkiIC8+PC90ZD4KLQkJCQk8L3RyPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY21pczpjYXBhYmlsaXRpZXMiPgotCQk8ZGl2PgotCQk8aDM+Q2FwYWJpbGl0aWVzPC9oMz4KLQkJPHRhYmxlIGNsYXNzPSJzZXJ2aWNldGFibGUiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Iipbbm90KCopXSI+Ci0JCQkJPHRyPgotCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcihsb2NhbC1uYW1lKCksICdjYXBhYmlsaXR5JykiIC8+PC90ZD4KLQkJCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjdXJyZW50KCkiIC8+PC90ZD4KLQkJCQk8L3RyPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY21pczphY2xDYXBhYmlsaXR5Ij4KLQkJPGRpdj4KLQkJPGgzPkFDTCBDYXBhYmlsaXRpZXM8L2gzPgotCQk8dGFibGUgY2xhc3M9InNlcnZpY2V0YWJsZSI+Ci0JCQk8dHI+Ci0JCQkJPHRkPlN1cHBvcnRlZCBQZXJtaXNzaW9uczwvdGQ+PHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzOnN1cHBvcnRlZFBlcm1pc3Npb25zIiAvPjwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZD5Qcm9wYWdhdGlvbjwvdGQ+PHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzOnByb3BhZ2F0aW9uIiAvPjwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCQk8aDQ+UGVybWlzc2lvbnM8L2g0PgotCQk8dGFibGUgY2xhc3M9InNlcnZpY2V0YWJsZSI+Ci0JCQk8dHI+PHRoPlBlcm1pc3Npb248L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90cj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJjbWlzOnBlcm1pc3Npb25zIj4KLQkJCQk8dHI+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pczpwZXJtaXNzaW9uIiAvPjwvdGQ+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pczpkZXNjcmlwdGlvbiIgLz48L3RkPgotCQkJCTwvdHI+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC90YWJsZT4KLQkJPGg0Pk1hcHBpbmdzPC9oND4KLQkJPHRhYmxlIGNsYXNzPSJzZXJ2aWNldGFibGUiPgotCQkJPHRyPjx0aD5LZXk8L3RoPjx0aD5QZXJtaXNzaW9uPC90aD48L3RyPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNtaXM6bWFwcGluZyI+Ci0JCQkJPHRyPgotCQkJCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXM6a2V5IiAvPjwvdGQ+Ci0JCQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pczpwZXJtaXNzaW9uIiAvPjwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFwcDpjb2xsZWN0aW9uIj4KLQkJPGxpPjxhIGhyZWY9InskYnJvd3NlVXJsfXtAaHJlZn0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOnRpdGxlIiAvPiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpjb2xsZWN0aW9uVHlwZSIgLz4pPC9hPjwvbGk+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJhdG9tOmxpbmsiPgotCQk8bGk+PGEgaHJlZj0ieyRicm93c2VVcmx9e0BocmVmfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZWwiIC8+PC9hPiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIiAvPik8L2xpPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNtaXNyYTp1cml0ZW1wbGF0ZSI+Ci0JCTxsaT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOnR5cGUiIC8+ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm1lZGlhdHlwZSIgLz4pOiAKLQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2NtaXNyYTp0ZW1wbGF0ZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjbWlzcmE6dGVtcGxhdGUiIC8+PC9hPjwvbGk+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvc3R5bGVzaGVldHMvdGh1bWJuYWlscy54c2wgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy90aHVtYm5haWxzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjODBkZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9zdHlsZXNoZWV0cy90aHVtYm5haWxzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmFwcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNy9hcHAiCi0JeG1sbnM6YXRvbT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB4bWxuczpjbWlzPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLQl4bWxuczpjbWlzcmE9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4LyI+Ci0KLQk8eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIC8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImJyb3dzZVVybCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXV4Um9vdCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYnJvd3NlT3ZlcnJpZGVTdHlsZXNoZWV0Ii8+Ci0KLQk8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbHRlciI+Ci0JCTx4c2w6dGV4dD5jbWlzOmJhc2VUeXBlSWQsY21pczpuYW1lLGNtaXM6b2JqZWN0VHlwZUlkLGNtaXM6Y29udGVudFN0cmVhbU1pbWVUeXBlLGNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCxjbWlzOmNyZWF0ZWRCeSxjbWlzOmNyZWF0aW9uRGF0ZSxjbWlzOnZlcnNpb25MYWJlbCxjbWlzOmlzTWFqb3JWZXJzaW9uLGNtaXM6bGFzdE1vZGlmaWVkQnksY21pczpsYXN0TW9kaWZpY2F0aW9uRGF0ZSxjbWlzOmlzTGF0ZXN0VmVyc2lvbjwveHNsOnRleHQ+Ci0JPC94c2w6dmFyaWFibGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aWR0aCI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnJlbmRpdGlvbi9jbWlzOmtpbmRbdGV4dCgpID0gJ2NtaXM6dGh1bWJuYWlsJ10vLi4vY21pczp3aWR0aCI+PC94c2w6dmFsdWUtb2Y+Ci0JCTwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImhlaWdodCI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY21pc3JhOm9iamVjdC9jbWlzOnJlbmRpdGlvbi9jbWlzOmtpbmRbdGV4dCgpID0gJ2NtaXM6dGh1bWJuYWlsJ10vLi4vY21pczpoZWlnaHQiPjwveHNsOnZhbHVlLW9mPgotCQk8L3hzbDp2YXJpYWJsZT4KLQotCQk8dGFibGUgY2xhc3M9ImZlZWR0YWJsZSI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJ0ZHRodW1iIj4KLQkJCQkgICAgPHhzbDpjaG9vc2U+Ci0JCQkJCSAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoY21pc3JhOm9iamVjdC9jbWlzOnByb3BlcnRpZXMvY21pczpwcm9wZXJ0eUlkW0Bwcm9wZXJ0eURlZmluaXRpb25JZD0nY21pczpiYXNlVHlwZUlkJ10sJ2NtaXM6ZG9jdW1lbnQnKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0ie2F0b206Y29udGVudC9Ac3JjfSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImF0b206bGlua1tAcmVsPSdhbHRlcm5hdGUnIGFuZCBAY21pc3JhOnJlbmRpdGlvbktpbmQ9J2NtaXM6dGh1bWJuYWlsJ10vQGhyZWYiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7YXRvbTpsaW5rW0ByZWw9J2FsdGVybmF0ZScgYW5kIEBjbWlzcmE6cmVuZGl0aW9uS2luZD0nY21pczp0aHVtYm5haWwnXS9AaHJlZn0iIHdpZHRoPSJ7JHdpZHRofXB4IiBoZWlnaHQ9InskaGVpZ2h0fXB4Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9InskYXV4Um9vdH11bmtub3duLnBuZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwveHNsOmNob29zZT4KLQkJCQkJCSAgICA8L2E+Ci0JCQkJCSAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKGNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlJZFtAcHJvcGVydHlEZWZpbml0aW9uSWQ9J2NtaXM6YmFzZVR5cGVJZCddLCdjbWlzOmZvbGRlcicpIj4KLQkJCQkJCSAgICA8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J2Rvd24nXS9AaHJlZn0mYW1wO2ZpbHRlcj17JGZpbHRlcn0iPgotCQkJCQkJCSAgICA8aW1nIHNyYz0ieyRhdXhSb290fWZvbGRlci5wbmciLz4KLQkJCQkJCSAgICA8L2E+Ci0JCQkJCQk8L3hzbDp3aGVuPiAgICAKLQkJCQkJICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhjbWlzcmE6b2JqZWN0L2NtaXM6cHJvcGVydGllcy9jbWlzOnByb3BlcnR5SWRbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOmJhc2VUeXBlSWQnXSwnY21pczpwb2xpY3knKSI+Ci0JCQkJCSAgICAgICAgPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206bGlua1tAcmVsPSdzZWxmJ10vQGhyZWZ9Ij4KLQkJCQkJCSAgICAgICAgPGltZyBzcmM9InskYXV4Um9vdH1wb2xpY3kucG5nIi8+Ci0JCQkJCQkgICAgPC9hPiAgICAKLQkJCQkJICAgIDwveHNsOndoZW4+Ci0JCQkJCSAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iPgotCQkJCQkJICAgICAgICA8aW1nIHNyYz0ieyRhdXhSb290fXVua25vd24ucG5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJ0ZHRodW1iSWQiPgotCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNtaXNyYTpvYmplY3QvY21pczpwcm9wZXJ0aWVzL2NtaXM6cHJvcGVydHlTdHJpbmdbQHByb3BlcnR5RGVmaW5pdGlvbklkPSdjbWlzOm5hbWUnXSIgLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0JCTxodG1sPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdG9tOmZlZWQvYXRvbTp0aXRsZSIgLz48L3RpdGxlPgotCQkJCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InskYXV4Um9vdH1icm93c2VyLmNzcyIgLz4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJCTxpbWcgc3JjPSJ7JGF1eFJvb3R9Y21pcy5wbmciIHN0eWxlPSJmbG9hdDogcmlnaHQ7IiAvPgotCQkJCTxoMT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXRvbTpmZWVkL2F0b206dGl0bGUiIC8+PC9oMT4KLQkJCQk8ZGl2IGNsYXNzPSJuYXZpZ2F0aW9uYm94Ij4KLQkJCQkJPGZvcm0gbmFtZT0idXJsZm9ybSI+Ci0JCQkJCQk8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idXJsIiB2YWx1ZT0iIiBzaXplPSIxMDAiLz4KLQkJCQkJCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImJyb3dzZVVybCIgdmFsdWU9InskYnJvd3NlVXJsfSIgLz4KLQkJCQkJCTxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJHbyIgb25DbGljaz0ibG9hZCgpIiAvPgotCQkJCQkJPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkF0b20iIG9uQ2xpY2s9ImxvYWRBdG9tKCkiIC8+Ci0JCQkJCTwvZm9ybT4KLQkJCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQkJdmFyIHggPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluZGV4T2YoIj0iKTsKLQkJCQkJCWlmKHggPiAtMSkgewotCQkJCQkJCWRvY3VtZW50LmZvcm1zLnVybGZvcm0udXJsLnZhbHVlID0gZGVjb2RlVVJJKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKHgrMSkpOwotCQkJCQkJfQotCQkJCQkJZnVuY3Rpb24gbG9hZCgpIHsgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5mb3Jtcy51cmxmb3JtLmJyb3dzZVVybC52YWx1ZSArIGRvY3VtZW50LmZvcm1zLnVybGZvcm0udXJsLnZhbHVlOyB9Ci0JCQkJCQlmdW5jdGlvbiBsb2FkQXRvbSgpIHsgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5mb3Jtcy51cmxmb3JtLnVybC52YWx1ZTsgfQotCQkJCQk8L3NjcmlwdD4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3NlcnZpY2UnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdzZXJ2aWNlJ10vQGhyZWZ9Ij5TZXJ2aWNlPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nc2VsZiddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J3NlbGYnXS9AaHJlZn0iPkVudHJ5PC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0ndXAnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSd1cCddL0BocmVmfSI+VXA8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdkb3duJ10iPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nZG93biddIj4KLQkJCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17QGhyZWZ9Ij5Eb3duICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiIC8+KTwvYT4gLQotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nZmlyc3QnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdmaXJzdCddL0BocmVmfXskYnJvd3NlT3ZlcnJpZGVTdHlsZXNoZWV0fXRodW1ibmFpbHMiPkZpcnN0PC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0ncHJldmlvdXMnXSI+Ci0JCQkJCQk8YSBocmVmPSJ7JGJyb3dzZVVybH17YXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdwcmV2aW91cyddL0BocmVmfXskYnJvd3NlT3ZlcnJpZGVTdHlsZXNoZWV0fXRodW1ibmFpbHMiPlByZXZpb3VzPC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nbmV4dCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J25leHQnXS9AaHJlZn17JGJyb3dzZU92ZXJyaWRlU3R5bGVzaGVldH10aHVtYm5haWxzIj5OZXh0PC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0nbGFzdCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2xhc3QnXS9AaHJlZn17JGJyb3dzZU92ZXJyaWRlU3R5bGVzaGVldH10aHVtYm5haWxzIj5MYXN0PC9hPiAtCi0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImF0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9mb2xkZXJ0cmVlJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9mb2xkZXJ0cmVlJ10vQGhyZWZ9Ij5Gb2xkZXIgVHJlZTwvYT4gLQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJhdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWxsb3dhYmxlYWN0aW9ucyddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWxsb3dhYmxlYWN0aW9ucyddL0BocmVmfSI+QWxsb3dhYmxlIEFjdGlvbnM8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L2FjbCddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2h0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvbGluay8yMDA5MDgvYWNsJ10vQGhyZWZ9Ij5BQ0w8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2xpbmsvMjAwOTA4L3BvbGljaWVzJ10iPgotCQkJCQkJPGEgaHJlZj0ieyRicm93c2VVcmx9e2F0b206ZmVlZC9hdG9tOmxpbmtbQHJlbD0naHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvbnMvY21pcy9saW5rLzIwMDkwOC9wb2xpY2llcyddL0BocmVmfSI+UG9saWNpZXM8L2E+IC0KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206bGlua1tAcmVsPSdkZXNjcmliZWRieSddIj4KLQkJCQkJCTxhIGhyZWY9InskYnJvd3NlVXJsfXthdG9tOmZlZWQvYXRvbTpsaW5rW0ByZWw9J2Rlc2NyaWJlZGJ5J10vQGhyZWZ9Ij5UeXBlPC9hPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L2Rpdj4KLQotCQkJCTx4c2w6aWYgdGVzdD0iYXRvbTpmZWVkL2F0b206ZW50cnkvY21pc3JhOm9iamVjdCI+Ci0JCQkJCTx0YWJsZT4KLQkJCQkJCTx0cj4KLQkJCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCQk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImF0b206ZmVlZC9hdG9tOmVudHJ5W3Bvc2l0aW9uKCkgbW9kIDMgPSAxXSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJhdG9tOmZlZWQvYXRvbTplbnRyeVtwb3NpdGlvbigpIG1vZCAzID0gMl0iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJCTx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iYXRvbTpmZWVkL2F0b206ZW50cnlbcG9zaXRpb24oKSBtb2QgMyA9IDBdIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwvdGFibGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY2YjQ4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gCi0tLT4KLTx3ZWItYXBwIGlkPSJPcGVuQ01JU0Jyb3dzZXJJRCIgdmVyc2lvbj0iMi40IgotCXhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCI+Ci0KLQk8ZGlzcGxheS1uYW1lPk9wZW5DTUlTIEJyb3dzZXI8L2Rpc3BsYXktbmFtZT4KLQotCTx3ZWxjb21lLWZpbGUtbGlzdD4KLQkJPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0JPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotCTxzZXJ2bGV0PgotCQk8c2VydmxldC1uYW1lPmJyb3dzZTwvc2VydmxldC1uYW1lPgotCQk8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icm93c2VyLkJyb3dzZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0JCTxpbml0LXBhcmFtPgotCQkJPHBhcmFtLW5hbWU+YXV4cm9vdDwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT57Y3R4fS9icm93c2VyLzwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8cGFyYW0tbmFtZT5hbGxvdzwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT5odHRwLio8L3BhcmFtLXZhbHVlPgotCQk8L2luaXQtcGFyYW0+Ci0JCTxpbml0LXBhcmFtPgotCQkJPHBhcmFtLW5hbWU+c3R5bGVzaGVldDphcHBsaWNhdGlvbi9hdG9tc3ZjK3htbDwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT4vV0VCLUlORi9zdHlsZXNoZWV0cy9zZXJ2aWNlLnhzbDwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8cGFyYW0tbmFtZT5zdHlsZXNoZWV0OmFwcGxpY2F0aW9uL2F0b20reG1sO3R5cGU9ZmVlZDwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT4vV0VCLUlORi9zdHlsZXNoZWV0cy9mZWVkLnhzbDwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8cGFyYW0tbmFtZT5zdHlsZXNoZWV0OmFwcGxpY2F0aW9uL2NtaXN0cmVlK3htbDwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT4vV0VCLUlORi9zdHlsZXNoZWV0cy9mZWVkLnhzbDwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8cGFyYW0tbmFtZT5zdHlsZXNoZWV0OmFwcGxpY2F0aW9uL2F0b20reG1sO3R5cGU9ZW50cnk8L3BhcmFtLW5hbWU+Ci0JCQk8cGFyYW0tdmFsdWU+L1dFQi1JTkYvc3R5bGVzaGVldHMvZW50cnkueHNsPC9wYXJhbS12YWx1ZT4KLQkJPC9pbml0LXBhcmFtPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxwYXJhbS1uYW1lPnN0eWxlc2hlZXQ6YXBwbGljYXRpb24vY21pc2FsbG93YWJsZWFjdGlvbnMreG1sPC9wYXJhbS1uYW1lPgotCQkJPHBhcmFtLXZhbHVlPi9XRUItSU5GL3N0eWxlc2hlZXRzL2FjdGlvbnMueHNsPC9wYXJhbS12YWx1ZT4KLQkJPC9pbml0LXBhcmFtPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxwYXJhbS1uYW1lPnN0eWxlc2hlZXQ6YXBwbGljYXRpb24vY21pc2FjbCt4bWw8L3BhcmFtLW5hbWU+Ci0JCQk8cGFyYW0tdmFsdWU+L1dFQi1JTkYvc3R5bGVzaGVldHMvYWNsLnhzbDwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8cGFyYW0tbmFtZT5vdmVycmlkZS1zdHlsZXNoZWV0OnJlbmRpdGlvbnM8L3BhcmFtLW5hbWU+Ci0JCQk8cGFyYW0tdmFsdWU+L1dFQi1JTkYvc3R5bGVzaGVldHMvcmVuZGl0aW9ucy54c2w8L3BhcmFtLXZhbHVlPgotCQk8L2luaXQtcGFyYW0+Ci0JCTxpbml0LXBhcmFtPgotCQkJPHBhcmFtLW5hbWU+b3ZlcnJpZGUtc3R5bGVzaGVldDpyZWxhdGlvbnNoaXBzPC9wYXJhbS1uYW1lPgotCQkJPHBhcmFtLXZhbHVlPi9XRUItSU5GL3N0eWxlc2hlZXRzL3JlbGF0aW9uc2hpcHMueHNsPC9wYXJhbS12YWx1ZT4KLQkJPC9pbml0LXBhcmFtPgotCQk8aW5pdC1wYXJhbT4KLQkJCTxwYXJhbS1uYW1lPm92ZXJyaWRlLXN0eWxlc2hlZXQ6dGh1bWJuYWlsczwvcGFyYW0tbmFtZT4KLQkJCTxwYXJhbS12YWx1ZT4vV0VCLUlORi9zdHlsZXNoZWV0cy90aHVtYm5haWxzLnhzbDwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQk8L3NlcnZsZXQ+Ci0KLQk8c2VydmxldC1tYXBwaW5nPgotCQk8c2VydmxldC1uYW1lPmJyb3dzZTwvc2VydmxldC1uYW1lPgotCQk8dXJsLXBhdHRlcm4+L2Jyb3dzZTwvdXJsLXBhdHRlcm4+Ci0JPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLQk8c2Vzc2lvbi1jb25maWc+Ci0JCTxzZXNzaW9uLXRpbWVvdXQ+NjA8L3Nlc3Npb24tdGltZW91dD4KLQk8L3Nlc3Npb24tY29uZmlnPgotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvYnJvd3Nlci5jc3MgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvYnJvd3Nlci9icm93c2VyLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2MzA2Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvYnJvd3Nlci9icm93c2VyLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLUBDSEFSU0VUICJVVEYtOCI7Ci0KLWJvZHkgeyAKLQlmb250LWZhbWlseTogYXJpYWwsc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7IAotfQotCi1oMSB7Ci0JZm9udC1mYW1pbHk6IEdlb3JnaWE7Ci19Ci0KLWgyIHsKLQlmb250LWZhbWlseTogR2VvcmdpYTsKLX0KLQotaDMgewotCWZvbnQtZmFtaWx5OiBHZW9yZ2lhOwotfQotCi1hOmxpbmsgewotCWNvbG9yOiAjMjA0YTg3OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLWE6dmlzaXRlZCB7Ci0JY29sb3I6ICMyMDRhODc7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hOmhvdmVyIHsKLQljb2xvcjogIzIwNGE4NzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYTphY3RpdmUgewotCWNvbG9yOiBhNDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWRpdi5uYXZpZ2F0aW9uYm94IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmMWRlOwotCW1hcmdpbi10b3A6IDEwcHg7Ci0JbWFyZ2luLWJvdHRvbTogMTBweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCXBhZGRpbmc6IDVweDsKLQlib3JkZXItc3R5bGU6IHNvbGlkOwotCWJvcmRlci13aWR0aDogMXB4OwotCWJvcmRlci1jb2xvcjogIzg4OGE4NTsKLX0KLQotdGFibGUuc2VydmljZXRhYmxlIHsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotfQotCi10YWJsZS5zZXJ2aWNldGFibGUgdGh7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLQlwYWRkaW5nOiA1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdGFibGUuc2VydmljZXRhYmxlIHRkIHsKLQlmb250LXNpemU6IDEwcHQ7IAotCXBhZGRpbmc6IDVweDsKLQlib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItY29sb3I6ICNkZGRkZGQ7Ci0JYm9yZGVyLXdpZHRoOiAxcHg7Ci19Ci0KLS5zZXJ2aWNlYm94IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmMWRlOwotCWZvbnQtc2l6ZTogMTBwdDsgCi0JcGFkZGluZzogMTBweDsKLQltYXJnaW46IDEwcHg7Ci0JYm9yZGVyLWNvbG9yOiAjODg4YTg1OwotCWJvcmRlci1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiAycHg7Ci19Ci0KLXRhYmxlLmZlZWR0YWJsZSB7Ci0JYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLX0KLQotdGFibGUuZmVlZHRhYmxlIHRoIHsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7CQotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS50ZGluZm8gewotCWZvbnQtc2l6ZTogMTBwdDsgCi0JcGFkZGluZy1sZWZ0OiAzcHg7Ci0JcGFkZGluZy10b3A6IDNweDsKLQlwYWRkaW5nLWJvdHRvbTogMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci19Ci0KLS50ZGluZm8yIHsKLQlmb250LXNpemU6IDEwcHQ7IAotCXBhZGRpbmc6IDNweDsKLQlib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItY29sb3I6ICNkM2Q3Y2Y7Ci0JYm9yZGVyLXdpZHRoOiAxcHg7Ci19Ci0KLS50ZGxpbmtzIHsKLQlmb250LXNpemU6IDhwdDsgCi0JcGFkZGluZzogM3B4OwotCWJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOwotCWJvcmRlci1jb2xvcjogI2QzZDdjZjsKLQlib3JkZXItd2lkdGg6IDFweDsKLX0KLQotLnRkbW9yZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlYzsKLQlmb250LXNpemU6IDEwcHQ7IAotCXBhZGRpbmctbGVmdDogM3B4OwotCXBhZGRpbmctdG9wOiAzcHg7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotfQotCi0udGRpbmZvLW9kZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZjZjlkZjsKLQlmb250LXNpemU6IDEwcHQ7IAotCXBhZGRpbmctbGVmdDogM3B4OwotCXBhZGRpbmctdG9wOiAzcHg7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotfQotCi0udGRpbmZvMi1vZGQgewotCWJhY2tncm91bmQtY29sb3I6ICNmY2Y5ZGY7Ci0JZm9udC1zaXplOiAxMHB0OyAKLQlwYWRkaW5nOiAzcHg7Ci0JYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLWNvbG9yOiAjZDNkN2NmOwotCWJvcmRlci13aWR0aDogMXB4OwotfQotCi0udGRsaW5rcy1vZGQgewotCWJhY2tncm91bmQtY29sb3I6ICNmY2Y5ZGY7Ci0JZm9udC1zaXplOiA4cHQ7IAotCXBhZGRpbmc6IDNweDsKLQlib3JkZXItYm90dG9tLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItY29sb3I6ICNkM2Q3Y2Y7Ci0JYm9yZGVyLXdpZHRoOiAxcHg7Ci19Ci0KLS50ZG1vcmUtb2RkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmNlOTRmOwotCWZvbnQtc2l6ZTogMTBwdDsgCi0JcGFkZGluZzogM3B4OwotCWJvcmRlci1ib3R0b20tc3R5bGU6IHNvbGlkOwotCWJvcmRlci1jb2xvcjogI2QzZDdjZjsKLQlib3JkZXItd2lkdGg6IDFweDsKLX0KLQotYS5hY3Rpb25saW5rOmxpbmsgewotCWNvbG9yOiAjODg4YTg1OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLWEuYWN0aW9ubGluazp2aXNpdGVkIHsKLQljb2xvcjogIzg4OGE4NTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYWN0aW9ubGluazpob3ZlciB7Ci0JY29sb3I6ICMyZTM0MzY7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuYWN0aW9ubGluazphY3RpdmUgewotCWNvbG9yOiByZWQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXRhYmxlLmVudHJ5dGFibGUgewotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci19Ci0KLXRhYmxlLmVudHJ5dGFibGUgdGggewotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsJCi0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotdGFibGUuZW50cnl0YWJsZSB0ZCB7Ci0JZm9udC1zaXplOiAxMHB0OyAKLQlwYWRkaW5nOiA1cHg7Ci0JYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLWNvbG9yOiAjZDNkN2NmOwotCWJvcmRlci13aWR0aDogMXB4OwotfQotCi1kaXYuZW50cnlzdW1tYXJ5IHsKLQltYXJnaW4tdG9wOiAxMHB4OwotCW1hcmdpbi1ib3R0b206IDEwcHg7Ci0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweDsKLQlwYWRkaW5nOiA1cHg7Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IDFweDsKLQlib3JkZXItY29sb3I6ICM4ODhhODU7CQotCWhlaWdodDogMTUwcHg7Ci0Jb3ZlcmZsb3c6IGF1dG87Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvYnJvd3Nlci9jbWlzLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL2NtaXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzE3MTdhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL2NtaXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvZG9jdW1lbnQucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvZG9jdW1lbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhhNjc5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL2RvY3VtZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL2ZvbGRlci5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvYnJvd3Nlci9mb2xkZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI0ODRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL2ZvbGRlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvYnJvd3Nlci9wb2xpY3kucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvcG9saWN5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5NzJkMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvYnJvd3Nlci9wb2xpY3kucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvcmVsYXRpb25zaGlwLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL3JlbGF0aW9uc2hpcC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZWYwMzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvcmVsYXRpb25zaGlwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL3R5cGUucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvdHlwZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGRlNzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci1hcHAvc3JjL21haW4vd2ViYXBwL2Jyb3dzZXIvdHlwZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcC9zcmMvbWFpbi93ZWJhcHAvYnJvd3Nlci91bmtub3duLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL3Vua25vd24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA0MjVmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXItYXBwL3NyYy9tYWluL3dlYmFwcC9icm93c2VyL3Vua25vd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYThjYmM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLSAgICA8IS0tCi0gICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzCi0gICAgICAgIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIAotICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXI8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+T3BlbkNNSVMgQnJvd3NlcjwvbmFtZT4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2Jyb3dzZXIvQnJvd3NlU2VydmxldC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtYnJvd3Nlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2Jyb3dzZXIvQnJvd3NlU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDMzN2Y0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icm93c2VyL0Jyb3dzZVNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYnJvd3NlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBDTUlTIEJyb3dzZXIgU2VydmxldC4KLSAqLwotcHVibGljIGNsYXNzIEJyb3dzZVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCcm93c2VTZXJ2bGV0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1BSRUZJWCA9ICJ7Y3R4fSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VSTCA9ICJ1cmwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9PVkVSUklERV9TVFlMRVNIRUVUID0gIm92ZXJyaWRlU3R5bGVzaGVldCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUkFNX1VSTF9NSU5fTEVOID0gUEFSQU1fVVJMLmxlbmd0aCgpICsgIj0iLmxlbmd0aCgpICsgImh0dHAiLmxlbmd0aCgpICsgIjovLyIubGVuZ3RoKCkKLSAgICAgICAgICAgICsgMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9QQVJBTV9BVVhST09UID0gImF1eHJvb3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTklUX1BBUkFNX0FMTE9XID0gImFsbG93IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9QQVJBTV9TVFlMRVNIRUVUID0gInN0eWxlc2hlZXQ6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9QQVJBTV9PVkVSUklERV9TVFlMRVNIRUVUID0gIm92ZXJyaWRlLXN0eWxlc2hlZXQ6IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDY0ICogMTAyNDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZBdXhSb290ID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZkFsbG93ID0gIi4qIjsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFNvdXJjZT4gZlN0eWxlU2hlZXRzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU291cmNlPiBmT3ZlcnJpZGVTdHlsZVNoZWV0czsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBicm93c2VyIHNlcnZsZXQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBmU3R5bGVTaGVldHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNvdXJjZT4oKTsKLSAgICAgICAgZk92ZXJyaWRlU3R5bGVTaGVldHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNvdXJjZT4oKTsKLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgYnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBpbml0UGFyYW1zID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXJOYW1lcygpOwotICAgICAgICB3aGlsZSAoaW5pdFBhcmFtcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gaW5pdFBhcmFtcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIHN0eWxlc2hlZXRLZXkgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBpc092ZXJyaWRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbS5zdGFydHNXaXRoKElOSVRfUEFSQU1fU1RZTEVTSEVFVCkpIHsKLSAgICAgICAgICAgICAgICBzdHlsZXNoZWV0S2V5ID0gcGFyYW0uc3Vic3RyaW5nKElOSVRfUEFSQU1fU1RZTEVTSEVFVC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLnN0YXJ0c1dpdGgoSU5JVF9QQVJBTV9PVkVSUklERV9TVFlMRVNIRUVUKSkgewotICAgICAgICAgICAgICAgIHN0eWxlc2hlZXRLZXkgPSBwYXJhbS5zdWJzdHJpbmcoSU5JVF9QQVJBTV9PVkVSUklERV9TVFlMRVNIRUVULmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBpc092ZXJyaWRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN0eWxlc2hlZXRLZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZXNoZWV0RmlsZU5hbWUgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShzdHlsZXNoZWV0RmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgeHNsRG9jID0gYnVpbGRlci5wYXJzZShzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkU3R5bGVzaGVldChzdHlsZXNoZWV0S2V5LCBuZXcgRE9NU291cmNlKHhzbERvYyksIGlzT3ZlcnJpZGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBMT0cuaW5mbygiU3R5bGVzaGVldDogJyIgKyBzdHlsZXNoZWV0S2V5ICsgIicgLT4gJyIgKyBzdHlsZXNoZWV0RmlsZU5hbWUgKyAiJyIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBpbml0QXV4Um9vdCA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKElOSVRfUEFSQU1fQVVYUk9PVCk7Ci0gICAgICAgIGlmIChpbml0QXV4Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmQXV4Um9vdCA9IGluaXRBdXhSb290OwotICAgICAgICAgICAgTE9HLmluZm8oIkF1eGlsaWFyeSByb290OiAiICsgZkF1eFJvb3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGluaXRBbGxvdyA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKElOSVRfUEFSQU1fQUxMT1cpOwotICAgICAgICBpZiAoaW5pdEFsbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZBbGxvdyA9IGluaXRBbGxvdzsKLSAgICAgICAgICAgIExPRy5pbmZvKCJBbGxvdyBwYXR0ZXJuOiAiICsgZkFsbG93KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgR0VUIHJlcXVlc3RzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJyb3dzZVVybCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvdmVycmlkZVN0eWxlc2hlZXQgPSBudWxsOwotCi0gICAgICAgIC8vIFRoZSB1cmwgcGFyYW1ldGVyIG11c3QgY29tZSBmaXJzdCEKLSAgICAgICAgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxLmdldFF1ZXJ5U3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKChxdWVyeVN0cmluZyAhPSBudWxsKSAmJiAocXVlcnlTdHJpbmcuc3RhcnRzV2l0aChQQVJBTV9VUkwpKSkgewotICAgICAgICAgICAgaW50IHVybEVuZCA9IHF1ZXJ5U3RyaW5nLmluZGV4T2YoUEFSQU1fT1ZFUlJJREVfU1RZTEVTSEVFVCArICI9Iik7Ci0gICAgICAgICAgICBpZiAodXJsRW5kID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgdXJsRW5kID0gcXVlcnlTdHJpbmcubGVuZ3RoKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG92ZXJyaWRlU3R5bGVzaGVldCA9IHF1ZXJ5U3RyaW5nLnN1YnN0cmluZyh1cmxFbmQgKyBQQVJBTV9PVkVSUklERV9TVFlMRVNIRUVULmxlbmd0aCgpICsgMSk7Ci0gICAgICAgICAgICAgICAgLS11cmxFbmQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyb3dzZVVybCA9IHF1ZXJ5U3RyaW5nLnN1YnN0cmluZyhQQVJBTV9VUkwubGVuZ3RoKCkgKyAxLCB1cmxFbmQpOwotCi0gICAgICAgICAgICBpZiAoYnJvd3NlVXJsLmxlbmd0aCgpIDwgUEFSQU1fVVJMX01JTl9MRU4pIHsKLSAgICAgICAgICAgICAgICBicm93c2VVcmwgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJyb3dzZVVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludElucHV0KHJlcSwgcmVzcCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBkb0Jyb3dzZShyZXEsIHJlc3AsIGJyb3dzZVVybCwgb3ZlcnJpZGVTdHlsZXNoZWV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWluIG1ldGhvZCBvZiB0aGUgYnJvd3Nlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0Jyb3dzZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3AsIFN0cmluZyBicm93c2VVcmwsCi0gICAgICAgICAgICBTdHJpbmcgb3ZlcnJpZGVTdHlsZXNoZWV0KSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAvLyBjaGVjayBpZiBkZWNvZGluZyBpcyBuZWNlc3NhcnkKLSAgICAgICAgLy8gKGlmIHRoZSBjaGFyIGFmdGVyICdodHRwJyBvciAnaHR0cHMnIGlzIG5vdCBhIGNvbG9uLCB0aGVuIGl0IG11c3QgYmUKLSAgICAgICAgLy8gZGVjb2RlZCkKLSAgICAgICAgaWYgKGJyb3dzZVVybC5jaGFyQXQoNCkgIT0gJzonICYmIGJyb3dzZVVybC5jaGFyQXQoNSkgIT0gJzonKSB7Ci0gICAgICAgICAgICBicm93c2VVcmwgPSBVUkxEZWNvZGVyLmRlY29kZShicm93c2VVcmwsICJVVEYtOCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgVVJMCi0gICAgICAgIGlmICghYnJvd3NlVXJsLm1hdGNoZXMoZkFsbG93KSkgewotICAgICAgICAgICAgcHJpbnRFcnJvcihyZXEsIHJlc3AsICJQcm9oaWJpdGVkIFVSTCEiLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgY29udGVudAotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoYnJvd3NlVXJsKTsKLSAgICAgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgY29ubi5zZXREb0lucHV0KHRydWUpOwotICAgICAgICAgICAgY29ubi5zZXREb091dHB1dChmYWxzZSk7Ci0gICAgICAgICAgICBjb25uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOwotICAgICAgICAgICAgU3RyaW5nIGF1dGhIZWFkZXIgPSByZXEuZ2V0SGVhZGVyKCJBdXRob3JpemF0aW9uIik7Ci0gICAgICAgICAgICBpZiAoYXV0aEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRSZXF1ZXN0UHJvcGVydHkoIkF1dGhvcml6YXRpb24iLCBhdXRoSGVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpOwotCi0gICAgICAgICAgICAvLyBhc2sgZm9yIGxvZ2luCi0gICAgICAgICAgICBpZiAoY29ubi5nZXRSZXNwb25zZUNvZGUoKSA9PSBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX1VOQVVUSE9SSVpFRCkgewotICAgICAgICAgICAgICAgIHJlc3Auc2V0SGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgY29ubi5nZXRIZWFkZXJGaWVsZCgiV1dXLUF1dGhlbnRpY2F0ZSIpKTsKLSAgICAgICAgICAgICAgICByZXNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRCwgIkF1dGhvcml6YXRpb24gUmVxdWlyZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGRlYnVnIG1lc3NhZ2VzCi0gICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIiciICsgYnJvd3NlVXJsICsgIicgLT4gJyIgKyBjb25uLmdldENvbnRlbnRUeXBlKCkgKyAiJyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaW5kIHN0eWxlc2hlZXQKLSAgICAgICAgICAgIFNvdXJjZSBzdHlsZXNoZWV0ID0gZ2V0U3R5bGVzaGVldChjb25uLmdldENvbnRlbnRUeXBlKCksIG92ZXJyaWRlU3R5bGVzaGVldCk7Ci0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCksIEJVRkZFUl9TSVpFKTsKLQotICAgICAgICAgICAgaWYgKHN0eWxlc2hlZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIG5vIHN0eWxlc2hlZXQgZm91bmQgLT4gY29uZHVjdCBjb250ZW50Ci0gICAgICAgICAgICAgICAgcmVzcC5zZXRDb250ZW50VHlwZShjb25uLmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShyZXNwLmdldE91dHB1dFN0cmVhbSgpLCBCVUZGRVJfU0laRSk7Ci0KLSAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICAgICAgICAgIGludCBiOwotICAgICAgICAgICAgICAgIHdoaWxlICgoYiA9IGluLnJlYWQoYnVmZmVyKSkgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0eWxlc2hlZXQKLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHQgPSBmLm5ld1RyYW5zZm9ybWVyKHN0eWxlc2hlZXQpOwotICAgICAgICAgICAgICAgIHQuc2V0UGFyYW1ldGVyKCJicm93c2VVcmwiLCBnZXRTZXJ2bGV0VXJsKHJlcSkgKyAiPyIgKyBQQVJBTV9VUkwgKyAiPSIpOwotICAgICAgICAgICAgICAgIHQuc2V0UGFyYW1ldGVyKCJhdXhSb290IiwgZ2V0QXV4Um9vdChyZXEsIGZBdXhSb290KSk7Ci0gICAgICAgICAgICAgICAgdC5zZXRQYXJhbWV0ZXIoImJyb3dzZU92ZXJyaWRlU3R5bGVzaGVldCIsICImIiArIFBBUkFNX09WRVJSSURFX1NUWUxFU0hFRVQgKyAiPSIpOwotCi0gICAgICAgICAgICAgICAgcmVzcC5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHJlc3AuZ2V0T3V0cHV0U3RyZWFtKCksIEJVRkZFUl9TSVpFKTsKLQotICAgICAgICAgICAgICAgIFNvdXJjZSBzID0gbmV3IFN0cmVhbVNvdXJjZShpbik7Ci0gICAgICAgICAgICAgICAgUmVzdWx0IHIgPSBuZXcgU3RyZWFtUmVzdWx0KG91dCk7Ci0gICAgICAgICAgICAgICAgdC50cmFuc2Zvcm0ocywgcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSwgdGhlcmUgaXNuJ3QgYW55dGhpbmcgd2UgY2FuIGRvCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlLCB0aGVyZSBpc24ndCBhbnl0aGluZyB3ZSBjYW4gZG8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IocmVxLCByZXNwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tIHV0aWxpdGllcyAtLS0tCi0KLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIGEgc3R5bGVzaGVldCB0byBhIGNvbnRlbnQgdHlwZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkU3R5bGVzaGVldChTdHJpbmcgY29udGVudFR5cGUsIFNvdXJjZSBzb3VyY2UsIGJvb2xlYW4gb3ZlcnJpZGUpIHsKLSAgICAgICAgaWYgKChjb250ZW50VHlwZSA9PSBudWxsKSB8fCAoc291cmNlID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3ZlcnJpZGUpIHsKLSAgICAgICAgICAgIGZPdmVycmlkZVN0eWxlU2hlZXRzLnB1dChjb250ZW50VHlwZS50cmltKCkudG9Mb3dlckNhc2UoKSwgc291cmNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZTdHlsZVNoZWV0cy5wdXQoY29udGVudFR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCksIHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgZ2l2ZW4gb3ZlcnJpZGUgc3R5bGVzaGVldCwgaWYgdGhlcmUgaXMgaXMKLSAgICAgKiBub3Qgb3ZlcnJpZGUgc3R5bGVzaGVldCBnaXZlbiB0aGVuIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgZ2l2ZW4gY29udGVudAotICAgICAqIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3R5bGVzaGVldCBpcyBhc3NpZ25lZCB0byBjb250ZW50IHR5cGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTb3VyY2UgZ2V0U3R5bGVzaGVldChTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBvdmVycmlkZVN0eWxlc2hlZXQpIHsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYW4gb3ZlcnJpZGUgZ2l2ZW4gYW5kIGl0IGhhcyBhIG1hdGNoLgotICAgICAgICBpZiAob3ZlcnJpZGVTdHlsZXNoZWV0ICE9IG51bGwgJiYgb3ZlcnJpZGVTdHlsZXNoZWV0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgc291cmNlID0gZk92ZXJyaWRlU3R5bGVTaGVldHMuZ2V0KG92ZXJyaWRlU3R5bGVzaGVldCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBub3QgbWF0Y2ggdGhlbiBjaGVjayB0aGUgY29udGVudCB0eXBlIG1hcC4KLSAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjdHAgPSBjb250ZW50VHlwZS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgiOyIpOwotCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG1hdGNoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzb3VyY2UgPT0gbnVsbCAmJiBpIDwgY3RwLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBtYXRjaC5hcHBlbmQoIjsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWF0Y2guYXBwZW5kKGN0cFtpXSk7Ci0gICAgICAgICAgICAgICAgc291cmNlID0gZlN0eWxlU2hlZXRzLmdldChtYXRjaC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRleHQgVVJMIG9mIHRoaXMgc2VydmxldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb250ZXh0VXJsKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWUgPSByZXF1ZXN0LmdldFNjaGVtZSgpOwotICAgICAgICBpbnQgcG9ydCA9IHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOwotCi0gICAgICAgIGlmICgiaHR0cCIuZXF1YWxzKHNjaGVtZSkgJiYgKHBvcnQgPT0gODApKSB7Ci0gICAgICAgICAgICBwb3J0ID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJodHRwcyIuZXF1YWxzKHNjaGVtZSkgJiYgKHBvcnQgPT0gNDQzKSkgewotICAgICAgICAgICAgcG9ydCA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjaGVtZSArICI6Ly8iICsgcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkgKyAocG9ydCA+IDAgPyAiOiIgKyBwb3J0IDogIiIpICsgcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGlzIHNlcnZsZXQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmxldFVybChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICByZXR1cm4gZ2V0Q29udGV4dFVybChyZXF1ZXN0KSArIHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByb290IFVSTCBvZiBhdXhpbGlhcnkgZmlsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXV4Um9vdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIGF1eFJvb3QpIHsKLSAgICAgICAgaWYgKGF1eFJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRleHRVcmwocmVxdWVzdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXV4Um9vdC5zdGFydHNXaXRoKENPTlRFWFRfUFJFRklYKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRleHRVcmwocmVxdWVzdCkgKyBhdXhSb290LnN1YnN0cmluZyhDT05URVhUX1BSRUZJWC5sZW5ndGgoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYXV4Um9vdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBIVE1MIG1ldGhvZHMgLS0tLQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgSFRNTCBoZWFkZXIgd2l0aCBzdHlsZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50SGVhZGVyKFByaW50V3JpdGVyIHB3LCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgcHcucHJpbnQoIjwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOXCIiKTsKLSAgICAgICAgcHcucHJpbnRsbigiXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkXCI+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8aGVhZD4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPHRpdGxlPiIgKyB0aXRsZSArICI8L3RpdGxlPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8bWV0YSBodHRwLWVxdWl2PVwiY29udGVudC10eXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiIC8+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiYm9keSB7IGZvbnQtZmFtaWx5OiBhcmlhbCxzYW5zLXNlcmlmOyBmb250LXNpemU6IDEwcHQ7IH0iKTsKLSAgICAgICAgcHcucHJpbnRsbigiZGl2LmJveCB7IGJhY2tncm91bmQtY29sb3I6ICNmNmYxZGU7IG1hcmdpbi10b3A6IDEwcHg7IgotICAgICAgICAgICAgICAgICsgIiBtYXJnaW4tYm90dG9tOiAxMHB4OyBtYXJnaW4tbGVmdDogMHB4OyBtYXJnaW4tcmlnaHQ6IDBweDsiCi0gICAgICAgICAgICAgICAgKyAiIHBhZGRpbmc6IDVweDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiAxcHg7IGJvcmRlci1jb2xvcjogIzg4OGE4NTsgfSIpOwotICAgICAgICBwdy5wcmludGxuKCI8L3N0eWxlPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8L2hlYWQ+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjxib2R5PiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIEhUTUwgZm9vdGVyLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcmludEZvb3RlcihQcmludFdyaXRlciBwdykgewotICAgICAgICBwdy5wcmludGxuKCI8L2JvZHk+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjwvaHRtbD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYSBIVE1MIGVycm9yIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50RXJyb3IoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwLCBTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIpOwotICAgICAgICBQcmludFdyaXRlciBwdyA9IHJlc3AuZ2V0V3JpdGVyKCk7Ci0KLSAgICAgICAgcHJpbnRIZWFkZXIocHcsICJFcnJvciIpOwotICAgICAgICBwdy5wcmludGxuKCI8ZGl2IGNsYXNzPVwiYm94XCI+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjxoMz4iICsgbWVzc2FnZSArICI8L2gzPiIpOwotCi0gICAgICAgIGlmIChlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHB3LnByaW50KCI8cHJlPiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiPC9wcmU+Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdy5wcmludGxuKCI8L2Rpdj4iKTsKLSAgICAgICAgcHJpbnRGb290ZXIocHcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhbiBIVE1MIGlucHV0IGJveC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRJbnB1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc3Auc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04Iik7Ci0gICAgICAgIFByaW50V3JpdGVyIHB3ID0gcmVzcC5nZXRXcml0ZXIoKTsKLQotICAgICAgICBwcmludEhlYWRlcihwdywgIk9wZW5DTUlTIEJyb3dzZXIiKTsKLSAgICAgICAgcHcucHJpbnRsbigiPGltZyBzcmM9XCIiICsgZ2V0QXV4Um9vdChyZXEsIGZBdXhSb290KSArICJjbWlzLnBuZ1wiICIgKyAic3R5bGU9XCJmbG9hdDogcmlnaHQ7XCIgLz4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPGgxIHN0eWxlPVwiZm9udC1mYW1pbHk6IEdlb3JnaWE7XCI+T3BlbkNNSVMgQnJvd3NlcjwvaDE+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjxkaXYgY2xhc3M9XCJib3hcIj4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPGZvcm0gYWN0aW9uPVwiXCIgbWV0aG9kPVwiR0VUXCI+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIkNNSVMgQXRvbVB1YiBVUkw6ICIpOwotICAgICAgICBwdy5wcmludGxuKCI8aW5wdXQgbmFtZT1cInVybFwiIHR5cGU9XCJ0ZXh0XCIgc2l6ZT1cIjEwMFwiIHZhbHVlPVwiXCIvPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIHZhbHVlPVwiIEdPIFwiLz4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPC9mb3JtPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8L2Rpdj4iKTsKLSAgICAgICAgcHJpbnRGb290ZXIocHcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjRkOGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IAotCW1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiAKLQlhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyAKLQlyZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgCi0JdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIAotCU9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgCi0JdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotCTxwYXJlbnQ+Ci0JCTxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotCQk8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0JCTx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLQkJPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0JPC9wYXJlbnQ+Ci0KLQotCTxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdDwvYXJ0aWZhY3RJZD4KLQk8bmFtZT5PcGVuQ01JUyBGdWxsIEludGVncmF0aW9uIFRlc3RzPC9uYW1lPgotCTxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0KLQk8cHJvcGVydGllcz4KLQkJPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotCQk8bW9kZXNoYXBlLnZlcnNpb24+My4yLjAuRmluYWw8L21vZGVzaGFwZS52ZXJzaW9uPgotICAgICAgICA8amFja3JhYmJpdC1jb3JlLnZlcnNpb24+Mi42LjE8L2phY2tyYWJiaXQtY29yZS52ZXJzaW9uPgotICAgICAgICA8bWF2ZW4tZmFpbHNhZmUtcGx1Z2luLnZlcnNpb24+Mi4xNzwvbWF2ZW4tZmFpbHNhZmUtcGx1Z2luLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi1qZXR0eS1wbHVnaW4udmVyc2lvbj42LjEuMjI8L21hdmVuLWpldHR5LXBsdWdpbi52ZXJzaW9uPgotICAgICAgICA8amNyLnZlcnNpb24+Mi4wPC9qY3IudmVyc2lvbj4KLSAgICAgICAgPG92ZXJsYXkuZ3JvdXBJZCAvPgotICAgICAgICA8b3ZlcmxheS5hcnRpZmFjdElkIC8+Ci0gICAgICAgIDxmYWN0b3J5LmNsYXNzIC8+Ci0gICAgICAgIDwhLS0gVXNlZCBpbiBTZXJ2aWNlTG9hZGVyIHRvIGxvb2sgdXAgaW1wbC4gLS0+Ci0gICAgICAgIDxzZXJ2aWNlLmZhY3RvcnkuY2xhc3MgLz4KLSAgICAgICAgPHJlcG9zaXRvcnkgLz4KLSAgICAgICAgPHVzZXIgLz4KLSAgICAgICAgPHBhc3N3b3JkIC8+Ci0gICAgICAgIDxkZWZhdWx0LmRvY3VtZW50VHlwZT5jbWlzOmRvY3VtZW50PC9kZWZhdWx0LmRvY3VtZW50VHlwZT4KLSAgICAgICAgPGRlZmF1bHQudmVyc2lvbmFibGVEb2N1bWVudFR5cGU+VmVyc2lvbmFibGVUeXBlPC9kZWZhdWx0LnZlcnNpb25hYmxlRG9jdW1lbnRUeXBlPgotICAgICAgICA8dGVzdC52ZXJzaW9uYWJsZT50cnVlPC90ZXN0LnZlcnNpb25hYmxlPgotICAgICAgICA8dGVzdC5ub3RWZXJzaW9uYWJsZT50cnVlPC90ZXN0Lm5vdFZlcnNpb25hYmxlPgotICAgIDwvcHJvcGVydGllcz4KLQotCi0JPGJ1aWxkPgotCQk8dGVzdFJlc291cmNlcz4KLQkJCTx0ZXN0UmVzb3VyY2U+Ci0JCQkJPGRpcmVjdG9yeT5zcmMvdGVzdC9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLQkJCQk8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KLQkJCTwvdGVzdFJlc291cmNlPgotCQk8L3Rlc3RSZXNvdXJjZXM+Ci0JCTxwbHVnaW5zPgotCQkJPHBsdWdpbj4KLQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8Y29uZmlndXJhdGlvbj4KLQkJCQkJPG92ZXJsYXlzPgotCQkJCQkJPG92ZXJsYXk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+JHtvdmVybGF5Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPiR7b3ZlcmxheS5hcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KLQkJCQkJCTwvb3ZlcmxheT4KLQkJCQkJPC9vdmVybGF5cz4KLQkJCQkgICA8d2ViUmVzb3VyY2VzPgotCQkJCSAgICAgICAgPHJlc291cmNlPgotCQkJICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GPC9kaXJlY3Rvcnk+Ci0JCQkgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+Ci0JCQkgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+V0VCLUlORjwvdGFyZ2V0UGF0aD4KLQkJCSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLio8L2luY2x1ZGU+Ci0JCQkgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLQkJCQkgICAgICAgIDwvcmVzb3VyY2U+Ci0JCQkJICAgIDwvd2ViUmVzb3VyY2VzPgkJCQkKLQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQk8L3BsdWdpbj4KLQkJCTxwbHVnaW4+Ci0JCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8dmVyc2lvbj4ke21hdmVuLWZhaWxzYWZlLXBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLQkJCQk8Y29uZmlndXJhdGlvbj4KLQkJCQkJPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KLQkJCQkJPHJldXNlRm9ya3M+dHJ1ZTwvcmV1c2VGb3Jrcz4KLQkJCQkJPGZvcmtlZFByb2Nlc3NUaW1lb3V0SW5TZWNvbmRzPjE4MDA8L2ZvcmtlZFByb2Nlc3NUaW1lb3V0SW5TZWNvbmRzPgotCQkJCQk8YXJnTGluZT4tWG14NTEybSAtZWE6b3JnLmFwYWNoZS5jaGVtaXN0cnk8L2FyZ0xpbmU+CQotCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCQk8ZXhlY3V0aW9ucz4KLQkJCQkJPGV4ZWN1dGlvbj4KLQkJCQkJCTxpZD5pbnRlZ3JhdGlvbi10ZXN0PC9pZD4KLQkJCQkJCTxnb2Fscz4KLQkJCQkJCQk8Z29hbD5pbnRlZ3JhdGlvbi10ZXN0PC9nb2FsPgotCQkJCQkJPC9nb2Fscz4KLQkJCQkJPC9leGVjdXRpb24+Ci0JCQkJCTxleGVjdXRpb24+Ci0JCQkJCQk8aWQ+dmVyaWZ5PC9pZD4KLQkJCQkJCTxnb2Fscz4KLQkJCQkJCQk8Z29hbD52ZXJpZnk8L2dvYWw+Ci0JCQkJCQk8L2dvYWxzPgotCQkJCQk8L2V4ZWN1dGlvbj4KLQkJCQk8L2V4ZWN1dGlvbnM+Ci0JCQk8L3BsdWdpbj4KLQkJCTxwbHVnaW4+Ci0JCQkJPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotCQkJCTx2ZXJzaW9uPiR7bWF2ZW4tamV0dHktcGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotCQkJCTxjb25maWd1cmF0aW9uPgotCQkJCQk8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLQkJCQkJPHN0b3BQb3J0PjE5OTY2PC9zdG9wUG9ydD4KLQkJCQkJPHN0b3BLZXk+Zm9vPC9zdG9wS2V5PgotCQkJCQk8Y29ubmVjdG9ycz4KLQkJCQkJCTxjb25uZWN0b3IgaW1wbGVtZW50YXRpb249Im9yZy5tb3J0YmF5LmpldHR5Lm5pby5TZWxlY3RDaGFubmVsQ29ubmVjdG9yIj4KLQkJCQkJCQk8cG9ydD4xOTA4MDwvcG9ydD4KLQkJCQkJCQk8aG9zdD4wLjAuMC4wPC9ob3N0PgotCQkJCQkJPC9jb25uZWN0b3I+Ci0JCQkJCTwvY29ubmVjdG9ycz4KLQkJCQkJPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+Ci0JCQkgICAgICAgICAgICAgIDxuYW1lPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlc3Npb24ucmVwb3NpdG9yeS5pZDwvbmFtZT4KLQkJCSAgICAgICAgICAgICAgPHZhbHVlPiR7cmVwb3NpdG9yeX08L3ZhbHVlPgotCQkJICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcjwvbmFtZT4KLQkJCSAgICAgICAgICAgICAgPHZhbHVlPiR7dXNlcn08L3ZhbHVlPgotCQkJICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ8L25hbWU+Ci0JCQkgICAgICAgICAgICAgIDx2YWx1ZT4ke3Bhc3N3b3JkfTwvdmFsdWU+Ci0JCQkgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgotCQkJICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotCQkJICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suZGVmYXVsdC5kb2N1bWVudFR5cGU8L25hbWU+Ci0JCQkgICAgICAgICAgICAgIDx2YWx1ZT4ke2RlZmF1bHQuZG9jdW1lbnRUeXBlfTwvdmFsdWU+Ci0JCQkgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgotCQkJICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotCQkJICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suZGVmYXVsdC52ZXJzaW9uYWJsZURvY3VtZW50VHlwZTwvbmFtZT4KLQkJCSAgICAgICAgICAgICAgPHZhbHVlPiR7ZGVmYXVsdC52ZXJzaW9uYWJsZURvY3VtZW50VHlwZX08L3ZhbHVlPgotCQkJICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3ROb3RWZXJzaW9uYWJsZTwvbmFtZT4KLQkJCSAgICAgICAgICAgICAgPHZhbHVlPiR7dGVzdC5ub3RWZXJzaW9uYWJsZX08L3ZhbHVlPgotCQkJICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLQkJCSAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RWZXJzaW9uYWJsZTwvbmFtZT4KLQkJCSAgICAgICAgICAgICAgPHZhbHVlPiR7dGVzdC52ZXJzaW9uYWJsZX08L3ZhbHVlPgotCQkJICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4JCQkgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgCTxzeXN0ZW1Qcm9wZXJ0eT4KLQkgICAgICAgICAgICAgICAgCQk8bmFtZT5wcm9qZWN0LmJhc2VkaXI8L25hbWU+Ci0JICAgICAgICAgICAgICAgIAkJPHZhbHVlPiR7cHJvamVjdC5iYXNlZGlyfTwvdmFsdWU+Ci0JICAgICAgICAgICAgICAgIAk8L3N5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotCSAgICAgICAgICAgICAgICAJCTxuYW1lPnByb2plY3QuYnVpbGQuZGlyZWN0b3J5PC9uYW1lPgotCSAgICAgICAgICAgICAgICAJCTx2YWx1ZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fTwvdmFsdWU+Ci0JICAgICAgICAgICAgICAgIAk8L3N5c3RlbVByb3BlcnR5PgotCQkgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CQkJCQkKLQkJCQkJPHdlYkFwcENvbmZpZz4KLQkJCQkJCTxjb250ZXh0UGF0aD4vb3BlbmNtaXM8L2NvbnRleHRQYXRoPgotCQkJCQk8L3dlYkFwcENvbmZpZz4KLQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQkJPGV4ZWN1dGlvbnM+Ci0JCQkJCTxleGVjdXRpb24+Ci0JCQkJCQk8aWQ+c3RhcnQtamV0dHk8L2lkPgotCQkJCQkJPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KLQkJCQkJCTxnb2Fscz4KLQkJCQkJCQk8Z29hbD5ydW4td2FyPC9nb2FsPgotCQkJCQkJPC9nb2Fscz4KLQkJCQkJCTxjb25maWd1cmF0aW9uPgotCQkJCQkJCTxzY2FuSW50ZXJ2YWxTZWNvbmRzPjA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0JCQkJCQkJPGRhZW1vbj50cnVlPC9kYWVtb24+Ci0JCQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQkJCTwvZXhlY3V0aW9uPgotCQkJCQk8ZXhlY3V0aW9uPgotCQkJCQkJPGlkPnN0b3AtamV0dHk8L2lkPgotCQkJCQkJPHBoYXNlPnBvc3QtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+Ci0JCQkJCQk8Z29hbHM+Ci0JCQkJCQkJPGdvYWw+c3RvcDwvZ29hbD4KLQkJCQkJCTwvZ29hbHM+Ci0JCQkJCTwvZXhlY3V0aW9uPgotCQkJCTwvZXhlY3V0aW9ucz4KLQkJCTwvcGx1Z2luPiAgCQkJCQotCQk8L3BsdWdpbnM+Ci0JPC9idWlsZD4KLQotCTxkZXBlbmRlbmNpZXM+Ci0JCTxkZXBlbmRlbmN5PgotCQkJPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotCQkJPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrPC9hcnRpZmFjdElkPgotCQkJPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotCQk8L2RlcGVuZGVuY3k+Ci0JCTxkZXBlbmRlbmN5PgotCQkJPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotCQkJPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbDwvYXJ0aWZhY3RJZD4KLQkJCTx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLQkJCTx0eXBlPmphcjwvdHlwZT4KLQkJCTxzY29wZT5jb21waWxlPC9zY29wZT4KLQkJPC9kZXBlbmRlbmN5PgotCTwvZGVwZW5kZW5jaWVzPgotCQotCTxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+amNyLW1vZGVzaGFwZS1pbm1lbW9yeTwvaWQ+Ci0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgIAk8b3ZlcmxheS5ncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9vdmVybGF5Lmdyb3VwSWQ+Ci0gICAgICAgICAgICAJPG92ZXJsYXkuYXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWpjcjwvb3ZlcmxheS5hcnRpZmFjdElkPgotICAgICAgICAgICAgCTxmYWN0b3J5LmNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JTZXJ2aWNlRmFjdG9yeTwvZmFjdG9yeS5jbGFzcz4KLSAgICAgICAgICAgIAk8IS0tIFVzZWQgaW4gU2VydmljZUxvYWRlciB0byBsb29rIHVwIGltcGwuIC0tPgotICAgICAgICAgICAgCTxzZXJ2aWNlLmZhY3RvcnkuY2xhc3M+b3JnLm1vZGVzaGFwZS5qY3IuSmNyUmVwb3NpdG9yeUZhY3Rvcnk8L3NlcnZpY2UuZmFjdG9yeS5jbGFzcz4KLSAgICAgICAgICAgIAk8cmVwb3NpdG9yeT50ZXN0PC9yZXBvc2l0b3J5PgotICAgICAgICAgICAgCTxkZWZhdWx0LmRvY3VtZW50VHlwZT5jbWlzOmRvY3VtZW50PC9kZWZhdWx0LmRvY3VtZW50VHlwZT4KLSAgICAgICAgICAgIAk8ZGVmYXVsdC52ZXJzaW9uYWJsZURvY3VtZW50VHlwZT5jbWlzOmRvY3VtZW50PC9kZWZhdWx0LnZlcnNpb25hYmxlRG9jdW1lbnRUeXBlPgotICAgICAgICAgICAgCTx0ZXN0LnZlcnNpb25hYmxlPnRydWU8L3Rlc3QudmVyc2lvbmFibGU+Ci0gICAgICAgICAgICAgICAgPHRlc3Qubm90VmVyc2lvbmFibGU+ZmFsc2U8L3Rlc3Qubm90VmVyc2lvbmFibGU+Ci0gICAgICAgICAgICAJPGZvcmtNb2RlPm5ldmVyPC9mb3JrTW9kZT4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLQkgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0JCSAgICAgICAgPGRlcGVuZGVuY3k+Ci0JCSAgICAgICAgICAgIDxncm91cElkPm9yZy5tb2Rlc2hhcGU8L2dyb3VwSWQ+Ci0JCSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1vZGVzaGFwZS1qY3I8L2FydGlmYWN0SWQ+Ci0JCSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bW9kZXNoYXBlLnZlcnNpb259PC92ZXJzaW9uPgotCQkgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGlrYS1wYXJzZXJzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGlrYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0JCSAgICAgICAgPC9kZXBlbmRlbmN5PgotCQkgICAgICAgIDxkZXBlbmRlbmN5PgotCQkgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLQkJICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3I8L2FydGlmYWN0SWQ+Ci0JCSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLQkJICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotCQkgICAgICAgIDwvZGVwZW5kZW5jeT4KLQkJICAgICAgICA8ZGVwZW5kZW5jeT4KLQkJICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0JCSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3M8L2FydGlmYWN0SWQ+Ci0JCSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLQkJICAgICAgICA8L2RlcGVuZGVuY3k+CQkKLQkJICAgICAgICA8ZGVwZW5kZW5jeT4KLQkJICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0JCSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyPC9hcnRpZmFjdElkPgotCQkgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0JCSAgICAgICAgICAgIDxjbGFzc2lmaWVyPmNsYXNzZXM8L2NsYXNzaWZpZXI+Ci0JCSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2xmNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bG9nNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgICAgICAgICAKLQkgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmNoZW1pc3RyeS1pbm1lbW9yeTwvaWQ+Ci0gICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAJPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+IAotICAgICAgICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgICAgICAJPG92ZXJsYXkuZ3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L292ZXJsYXkuZ3JvdXBJZD4KLSAgICAgICAgICAgIAk8b3ZlcmxheS5hcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnk8L292ZXJsYXkuYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIAk8ZmFjdG9yeS5jbGFzcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS5zZXJ2ZXIuSW5NZW1vcnlTZXJ2aWNlRmFjdG9yeUltcGw8L2ZhY3RvcnkuY2xhc3M+Ci0gICAgICAgICAgICAJPCEtLSBVc2VkIGluIFNlcnZpY2VMb2FkZXIgdG8gbG9vayB1cCBpbXBsLiAtLT4KLSAgICAgICAgICAgIAk8c2VydmljZS5mYWN0b3J5LmNsYXNzPiR7ZmFjdG9yeS5jbGFzc308L3NlcnZpY2UuZmFjdG9yeS5jbGFzcz4KLSAgICAgICAgICAgIAk8cmVwb3NpdG9yeT50ZXN0PC9yZXBvc2l0b3J5PgotICAgICAgICAgICAgICAgIDxkZWZhdWx0LmRvY3VtZW50VHlwZT5jbWlzOmRvY3VtZW50PC9kZWZhdWx0LmRvY3VtZW50VHlwZT4KLSAgICAgICAgICAgICAgICA8ZGVmYXVsdC52ZXJzaW9uYWJsZURvY3VtZW50VHlwZT5WZXJzaW9uYWJsZVR5cGU8L2RlZmF1bHQudmVyc2lvbmFibGVEb2N1bWVudFR5cGU+Ci0gICAgICAgICAgICAgICAgPHRlc3QudmVyc2lvbmFibGU+dHJ1ZTwvdGVzdC52ZXJzaW9uYWJsZT4KLSAgICAgICAgICAgICAgICA8dGVzdC5ub3RWZXJzaW9uYWJsZT50cnVlPC90ZXN0Lm5vdFZlcnNpb25hYmxlPgotICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotCSAgICAgICAgPGRlcGVuZGVuY2llcz4KLQkgICAgICAgIAk8ZGVwZW5kZW5jeT4KLQkJCQkJPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotCQkJCQk8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWlubWVtb3J5PC9hcnRpZmFjdElkPgotCQkJCQk8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0JCQkJCTx0eXBlPndhcjwvdHlwZT4KLQkJCQk8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzbGY0ai52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtsb2c0ai52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotCSAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmpjci1qYWNrcmFiYml0LWlubWVtb3J5PC9pZD4KLSAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgICAgCTxvdmVybGF5Lmdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9vdmVybGF5Lmdyb3VwSWQ+Ci0gICAgICAgICAgICAJPG92ZXJsYXkuYXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyLWJpbmRpbmdzLXdhcjwvb3ZlcmxheS5hcnRpZmFjdElkPgotICAgICAgICAgICAgCTxmYWN0b3J5LmNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjci5KY3JTZXJ2aWNlRmFjdG9yeTwvZmFjdG9yeS5jbGFzcz4KLSAgICAgICAgICAgIAk8IS0tIFVzZWQgaW4gU2VydmljZUxvYWRlciB0byBsb29rIHVwIGltcGwuICAtLT4KLSAgICAgICAgICAgIAk8c2VydmljZS5mYWN0b3J5LmNsYXNzPm9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLlJlcG9zaXRvcnlGYWN0b3J5SW1wbDwvc2VydmljZS5mYWN0b3J5LmNsYXNzPgotICAgICAgICAgICAgCTxyZXBvc2l0b3J5PmRlZmF1bHQ8L3JlcG9zaXRvcnk+ICAKLSAgICAgICAgICAgIAk8dXNlcj5hZG1pbjwvdXNlcj4KLSAgICAgICAgICAgIAk8cGFzc3dvcmQ+YWRtaW48L3Bhc3N3b3JkPgotICAgICAgICAgICAgCTxkZWZhdWx0LmRvY3VtZW50VHlwZT5jbWlzOmRvY3VtZW50PC9kZWZhdWx0LmRvY3VtZW50VHlwZT4KLSAgICAgICAgICAgIAk8ZGVmYXVsdC52ZXJzaW9uYWJsZURvY3VtZW50VHlwZT5jbWlzOmRvY3VtZW50PC9kZWZhdWx0LnZlcnNpb25hYmxlRG9jdW1lbnRUeXBlPgotICAgICAgICAgICAgCTx0ZXN0LnZlcnNpb25hYmxlPnRydWU8L3Rlc3QudmVyc2lvbmFibGU+Ci0gICAgICAgICAgICAgICAgPHRlc3Qubm90VmVyc2lvbmFibGU+ZmFsc2U8L3Rlc3Qubm90VmVyc2lvbmFibGU+Ci0gICAgICAgICAgICAJPGZvcmtNb2RlPm5ldmVyPC9mb3JrTW9kZT4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLQkgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5qY3I8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpjcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqY3IudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphY2tyYWJiaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tyYWJiaXQtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrcmFiYml0LWNvcmUudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2xmNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bG9nNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotCQkgICAgICAgIDxkZXBlbmRlbmN5PgotCQkgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLQkJICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1qY3I8L2FydGlmYWN0SWQ+Ci0JCSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLQkJICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotCQkgICAgICAgIDwvZGVwZW5kZW5jeT4KLQkJICAgICAgICA8ZGVwZW5kZW5jeT4KLQkJICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0JCSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItYmluZGluZ3M8L2FydGlmYWN0SWQ+Ci0JCSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLQkJICAgICAgICA8L2RlcGVuZGVuY3k+CQkKLQkJICAgICAgICA8ZGVwZW5kZW5jeT4KLQkJICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0JCSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyPC9hcnRpZmFjdElkPgotCQkgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0JCSAgICAgICAgICAgIDxjbGFzc2lmaWVyPmNsYXNzZXM8L2NsYXNzaWZpZXI+Ci0JCSAgICAgICAgPC9kZXBlbmRlbmN5PgkJICAgICAgICAgICAgCSAgICAgICAgCi0JICAgICAgICA8L2RlcGVuZGVuY2llcz4KLQkgICAgPC9wcm9maWxlPgkgICAgCi0gICAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9yZWFkbWUudHh0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNWM0NzQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoZXJlIGFyZSB0aHJlZSBwcm9maWxlczogY2hlbWlzdHJ5LWlubWVtb3J5LCBqY3ItbW9kZXNoYXBlLWlubWVtb3J5LCAgamNyLWphY2tyYWJiaXQtaW5tZW1vcnkKLVBsZWFzZSwgdXNlIG12biBjbGVhbiBpbnN0YWxsIC1QIDxwcm9maWxlTmFtZT4gZm9yIHRlc3Rpbmcgb25lIG9mIHRoZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9ucy4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4Lmpjci5SZXBvc2l0b3J5RmFjdG9yeSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4Lmpjci5SZXBvc2l0b3J5RmFjdG9yeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5OWU1MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5qY3IuUmVwb3NpdG9yeUZhY3RvcnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0ke3NlcnZpY2UuZmFjdG9yeS5jbGFzc30gIyBKQ1IgSW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3JlcG9zaXRvcnkucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL3JlcG9zaXRvcnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhZGJlMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9yZXBvc2l0b3J5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWNsYXNzPSR7ZmFjdG9yeS5jbGFzc30KLQotIyBJbiBNZW1vcnkgU2V0dGluZ3MKLUluTWVtb3J5U2VydmVyLlJlcG9zaXRvcnlJZD0ke3JlcG9zaXRvcnl9Ci0jIEluTWVtb3J5U2VydmVyLlJlcG9zaXRvcnlJbmZvQ3JlYXRvckNsYXNzPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5wcm92aWRlci5pbm1lbW9yeS5Vbml0VGVzdFJlcG9zaXRvcnlJbmZvCi1Jbk1lbW9yeVNlcnZlci5Vc2VyPSR7dXNlcn0KLUluTWVtb3J5U2VydmVyLlBhc3N3b3JkPSR7cGFzc3dvcmR9Ci1Jbk1lbW9yeVNlcnZlci5UeXBlc0NyZWF0b3JDbGFzcz1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeS50eXBlcy5EZWZhdWx0VHlwZVN5c3RlbUNyZWF0b3IKLQotIyBzZXR0aW5ncyBmb3IgaW5pdCByZXBvc2l0b3J5IHdpdGggZGF0YQotICAjIGVuYWJsZSBvciBkaXNhYmxlCi1SZXBvc2l0b3J5RmlsbGVyLkVuYWJsZT1mYWxzZQotICAjIFR5cGUgaWQgb2YgZG9jdW1lbnRzIHRoYXQgYXJlIGNyZWF0ZWQKLVJlcG9zaXRvcnlGaWxsZXIuRG9jdW1lbnRUeXBlSWQ9Q29tcGxleFR5cGUKLSAgIyBUeXBlIGlkIG9mIGZvbGRlcnMgdGhhdCBhcmUgY3JlYXRlZAotUmVwb3NpdG9yeUZpbGxlci5Gb2xkZXJUeXBlSWQ9Y21pczpmb2xkZXIKLSAgIyBOdW1iZXIgb2YgZG9jdW1lbnRzIGNyZWF0ZWQgcGVyIGZvbGRlcgotUmVwb3NpdG9yeUZpbGxlci5Eb2NzUGVyRm9sZGVyPTMKLSAgIyBOdW1iZXIgb2YgZm9sZGVycyBjcmVhdGVkIHBlciBmb2xkZXIKLVJlcG9zaXRvcnlGaWxsZXIuRm9sZGVyUGVyRm9sZGVyPTIKLSAgIyBudW1iZXIgb2YgZm9sZGVyIGxldmVscyBjcmVhdGVkIChkZXB0aCBvZiBoaWVyYXJjaHkpCi1SZXBvc2l0b3J5RmlsbGVyLkRlcHRoPTMKLSAgIyBTaXplIG9mIGNvbnRlbnQgZm9yIGRvY3VtZW50cyAoMD1kbyBub3QgY3JlYXRlIGNvbnRlbnQpLCBkZWZhdWx0PTAKLVJlcG9zaXRvcnlGaWxsZXIuQ29udGVudFNpemVJbktCPTMyCi0gICMgcHJvcGVydGllcyB0byBzZXQgZm9yIGEgZG9jdW1lbnQKLVJlcG9zaXRvcnlGaWxsZXIuRG9jdW1lbnRQcm9wZXJ0eS4wPVN0cmluZ1Byb3AKLSNSZXBvc2l0b3J5RmlsbGVyLkRvY3VtZW50UHJvcGVydHkuMT1TdHJpbmdQcm9wTVYKLSAgIyBwcm9wZXJ0aWVzIHRvIHNldCBmb3IgYSBmb2xkZXIKLSNSZXBvc2l0b3J5RmlsbGVyLkZvbGRlclByb3BlcnR5LjA9U3RyaW5nRm9sZGVyUHJvcAotICAKLW1vdW50LXBhdGg9LwotCi0jSmFja3JhYmJpdCBwcm9wZXJ0aWVzCi0jamNyLm9yZy5hcGFjaGUuamFja3JhYmJpdC5yZXBvc2l0b3J5LnVyaT1maWxlOi8vL3twcm9qZWN0LmJhc2VkaXJ9L3RhcmdldC9qY3ItcmVwb3NpdG9yeQotamNyLm9yZy5hcGFjaGUuamFja3JhYmJpdC5yZXBvc2l0b3J5LmhvbWU9e3Byb2plY3QuYmFzZWRpcn0vdGFyZ2V0L2phY2tyYWJiaXQtcmVwbwotamNyLm9yZy5hcGFjaGUuamFja3JhYmJpdC5yZXBvc2l0b3J5LmNvbmY9e3Byb2plY3QuYmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL2phY2tyYWJiaXQtcmVwb3NpdG9yeS1tZW1vcnkueG1sCi0KLSNNb2Rlc2hhcGUgcHJvcGVydGllcwotamNyLm9yZy5tb2Rlc2hhcGUuamNyLlVSTD1maWxlOi8vL3twcm9qZWN0LmJhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9tb2Rlc2hhcGUtcmVwb3NpdG9yeS1tZW1vcnkuanNvbgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QwZTlhZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgQ29uZmlndXJlIFBVQkxJQyAiLS8vTW9ydCBCYXkgQ29uc3VsdGluZy8vIERURCBDb25maWd1cmUvL0VOIiAiaHR0cDovL2pldHR5Lm1vcnRiYXkub3JnL2NvbmZpZ3VyZS5kdGQiPgotPCEtLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPENvbmZpZ3VyZSBjbGFzcz0ib3JnLm1vcnRiYXkuamV0dHkud2ViYXBwLldlYkFwcENvbnRleHQiPgotCi0gIDxTZXQgbmFtZT0icGFyZW50TG9hZGVyUHJpb3JpdHkiPnRydWU8L1NldD4KLQotICA8U2V0IG5hbWU9InN5c3RlbUNsYXNzZXMiPgotICAgIDxBcnJheSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICAgIDxJdGVtPmphdmEuPC9JdGVtPgotICAgICAgPEl0ZW0+amF2YXguc2VydmxldC48L0l0ZW0+Ci0gICAgICA8SXRlbT5vcmcubW9ydGJheS48L0l0ZW0+Ci0gICAgICA8SXRlbT5vcmcueG1sLjwvSXRlbT4KLSAgICAgIDxJdGVtPm9yZy53M2MuPC9JdGVtPgotICAgIDwvQXJyYXk+Ci0gIDwvU2V0PgotCi08L0NvbmZpZ3VyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL0Fic3RyYWN0QXRvbVB1YlRja0lULmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL0Fic3RyYWN0QXRvbVB1YlRja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzBmMzYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BYnN0cmFjdEF0b21QdWJUY2tJVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC50Y2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmluZGluZ1R5cGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEF0b21QdWJUY2tJVCBleHRlbmRzIEFic3RyYWN0VGNrSVQgewotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRBdG9tUHViUGF0aCgpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IGdldEJhc2VTZXNzaW9uUGFyYW1ldGVycygpOwotCi0gICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovLyIgKyBIT1NUICsgIjoiICsgUE9SVCArIGdldEF0b21QdWJQYXRoKCk7Ci0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUsIEJpbmRpbmdUeXBlLkFUT01QVUIudmFsdWUoKSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkwsIHVybCk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJpbmRpbmdUeXBlIGdldEJpbmRpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gQmluZGluZ1R5cGUuQVRPTVBVQjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL0Fic3RyYWN0QnJvd3NlclRja0lULmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL0Fic3RyYWN0QnJvd3NlclRja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDFjYzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BYnN0cmFjdEJyb3dzZXJUY2tJVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC50Y2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmluZGluZ1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QnJvd3NlclRja0lUIGV4dGVuZHMgQWJzdHJhY3RUY2tJVCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VSX1BBVEggPSAiL29wZW5jbWlzL2Jyb3dzZXIiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IGdldEJhc2VTZXNzaW9uUGFyYW1ldGVycygpOwotCi0gICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovLyIgKyBIT1NUICsgIjoiICsgUE9SVCArIEJST1dTRVJfUEFUSDsKLQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQlJPV1NFUi52YWx1ZSgpKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX1VSTCwgdXJsKTsKLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQmluZGluZ1R5cGUgZ2V0QmluZGluZ1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBCaW5kaW5nVHlwZS5CUk9XU0VSOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQWJzdHJhY3RUY2tJVC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BYnN0cmFjdFRja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OGJjNTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BYnN0cmFjdFRja0lULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC50Y2s7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5UZXN0UGFyYW1ldGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sucmVwb3J0LlRleHRSZXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJ1bm5lci5BYnN0cmFjdFJ1bm5lcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUY2tJVCBleHRlbmRzIEFic3RyYWN0UnVubmVyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NNSVNfMV8wID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0Q21pczEwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NNSVNfMV8xID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0Q21pczExIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUT01QVUIgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RBdG9tUHViIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1dFQlNFUlZJQ0VTID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0V2ViU2VydmljZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQlJPV1NFUiA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdEJyb3dzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTk9UX1ZFUlNJT05BQkxFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0Tm90VmVyc2lvbmFibGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVkVSU0lPTkFCTEUgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RWZXJzaW9uYWJsZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZFUlNJT05BQkxFX0RPQ1VNRU5UX1RZUEUgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmRlZmF1bHQudmVyc2lvbmFibGVEb2N1bWVudFR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkVSU0lPTkFCTEVfRE9DVU1FTlRfVFlQRV9WQUxVRSA9ICJWZXJzaW9uYWJsZVR5cGUiOyAvLyBJbk1lbW9yeQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlQgPSAxOTA4MDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAidGVzdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJ0ZXN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJ0ZXN0IjsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFNlc3Npb25QYXJhbWV0ZXJzKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQmluZGluZ1R5cGUgZ2V0QmluZGluZ1R5cGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdXNlc1ZlcnNpb25hYmxlRG9jdW1lbnRUeXBlKCk7Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRCYXNlU2Vzc2lvblBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuUkVQT1NJVE9SWV9JRCwKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoU2Vzc2lvblBhcmFtZXRlci5SRVBPU0lUT1JZX0lELCBSRVBPU0lUT1JZX0lEKSk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgU3lzdGVtLmdldFByb3BlcnR5KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgVVNFUikpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCBTeXN0ZW0uZ2V0UHJvcGVydHkoU2Vzc2lvblBhcmFtZXRlci5QQVNTV09SRCwgUEFTU1dPUkQpKTsKLQotICAgICAgICBpZiAodXNlc1ZlcnNpb25hYmxlRG9jdW1lbnRUeXBlKCkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfRE9DVU1FTlRfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KERFRkFVTFRfVkVSU0lPTkFCTEVfRE9DVU1FTlRfVFlQRSwgREVGQVVMVF9WRVJTSU9OQUJMRV9ET0NVTUVOVF9UWVBFX1ZBTFVFKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0RPQ1VNRU5UX1RZUEUsIFN5c3RlbS5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgVGVzdFBhcmFtZXRlcnMuREVGQVVMVF9ET0NVTUVOVF9UWVBFLCBUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0RPQ1VNRU5UX1RZUEVfVkFMVUUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfRk9MREVSX1RZUEUsCi0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfRk9MREVSX1RZUEUsICJjbWlzOmZvbGRlciIpKTsKLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgY2hlY2tUZXN0KCkgewotICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyBhbGwgVENLIHRlc3RzLiIsIGdldFN5c3RlbVByb3BlcnR5Qm9vbGVhbihURVNUKSk7Ci0KLSAgICAgICAgaWYgKGdldENtaXNWZXJzaW9uKCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIENNSVMgMS4wIFRDSyB0ZXN0cy4iLCBnZXRTeXN0ZW1Qcm9wZXJ0eUJvb2xlYW4oVEVTVF9DTUlTXzFfMCkpOwotICAgICAgICB9IGVsc2UgaWYgKGdldENtaXNWZXJzaW9uKCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzEpIHsKLSAgICAgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIENNSVMgMS4xIFRDSyB0ZXN0cy4iLCBnZXRTeXN0ZW1Qcm9wZXJ0eUJvb2xlYW4oVEVTVF9DTUlTXzFfMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldEJpbmRpbmdUeXBlKCkgPT0gQmluZGluZ1R5cGUuQVRPTVBVQikgewotICAgICAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgQXRvbVB1YiBiaW5kaW5nIFRDSyB0ZXN0cy4iLCBnZXRTeXN0ZW1Qcm9wZXJ0eUJvb2xlYW4oVEVTVF9BVE9NUFVCKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0QmluZGluZ1R5cGUoKSA9PSBCaW5kaW5nVHlwZS5XRUJTRVJWSUNFUykgewotICAgICAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgV2ViIFNlcnZpY2VzIGJpbmRpbmcgVENLIHRlc3RzLiIsIGdldFN5c3RlbVByb3BlcnR5Qm9vbGVhbihURVNUX1dFQlNFUlZJQ0VTKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0QmluZGluZ1R5cGUoKSA9PSBCaW5kaW5nVHlwZS5CUk9XU0VSKSB7Ci0gICAgICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyBCcm93c2VyIGJpbmRpbmcgVENLIHRlc3RzLiIsIGdldFN5c3RlbVByb3BlcnR5Qm9vbGVhbihURVNUX0JST1dTRVIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1c2VzVmVyc2lvbmFibGVEb2N1bWVudFR5cGUoKSkgewotICAgICAgICAgICAgYXNzdW1lVHJ1ZSgiU2tpcHBpbmcgVENLIHRlc3RzIHdpdGggdmVyc2lvbmFibGUgZG9jdW1lbnQgdHlwZXMuIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3lzdGVtUHJvcGVydHlCb29sZWFuKFRFU1RfVkVSU0lPTkFCTEUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc3VtZVRydWUoIlNraXBwaW5nIFRDSyB0ZXN0cyB3aXRoIG5vbi12ZXJzaW9uYWJsZSBkb2N1bWVudCB0eXBlcy4iLAotICAgICAgICAgICAgICAgICAgICBnZXRTeXN0ZW1Qcm9wZXJ0eUJvb2xlYW4oVEVTVF9OT1RfVkVSU0lPTkFCTEUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGdldFN5c3RlbVByb3BlcnR5Qm9vbGVhbihTdHJpbmcgcHJvcE5hbWUpIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wTmFtZSwgInRydWUiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBydW5UY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2V0IHVwIFRDSyBhbmQgcnVuIGl0Ci0gICAgICAgIHNldFBhcmFtZXRlcnMoZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSk7Ci0gICAgICAgIGxvYWREZWZhdWx0VGNrR3JvdXBzKCk7Ci0KLSAgICAgICAgcnVuKG5ldyBUZXN0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0gICAgICAgIC8vIHdyaXRlIHJlcG9ydAotICAgICAgICBGaWxlIHRhcmdldCA9IG5ldyBGaWxlKCJ0YXJnZXQiKTsKLSAgICAgICAgdGFyZ2V0Lm1rZGlyKCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXBvcnQgcmVwb3J0ID0gbmV3IFRleHRSZXBvcnQoKTsKLSAgICAgICAgcmVwb3J0LmNyZWF0ZVJlcG9ydChnZXRQYXJhbWV0ZXJzKCksIGdldEdyb3VwcygpLCBuZXcgRmlsZSh0YXJnZXQsICJ0Y2stcmVzdWx0LSIgKyBnZXRCaW5kaW5nVHlwZSgpLnZhbHVlKCkKLSAgICAgICAgICAgICAgICArICItIiArIGdldENtaXNWZXJzaW9uKCkudmFsdWUoKSArICItIgotICAgICAgICAgICAgICAgICsgKHVzZXNWZXJzaW9uYWJsZURvY3VtZW50VHlwZSgpID8gInZlcnNpb25hYmxlIiA6ICJub252ZXJzaW9uYWJsZSIpICsgIi50eHQiKSk7Ci0KLSAgICAgICAgLy8gZmluZCBmYWlsdXJlcwotICAgICAgICBmb3IgKENtaXNUZXN0R3JvdXAgZ3JvdXAgOiBnZXRHcm91cHMoKSkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdCB0ZXN0IDogZ3JvdXAuZ2V0VGVzdHMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogdGVzdC5nZXRSZXN1bHRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIHRlc3QgJyIgKyB0ZXN0LmdldE5hbWUoKSArICInIHJldHVybmVkIGFuIGludmFsaWQgcmVzdWx0LiIsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSB0ZXN0ICciICsgdGVzdC5nZXROYW1lKCkgKyAiJyByZXR1cm5lZCBhIGZhaWx1cmU6ICIgKyByZXN1bHQuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRTdGF0dXMoKSAhPSBDbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHRlc3QgJyIgKyB0ZXN0LmdldE5hbWUoKSArICInIHJldHVybmVkIGF0IGFuIHVuZXhjZXB0ZWQgZXhjZXB0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc3VsdC5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFN0YXR1cygpICE9IENtaXNUZXN0UmVzdWx0U3RhdHVzLlVORVhQRUNURURfRVhDRVBUSU9OKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENtaXNUZXN0UmVzdWx0U3RhdHVzIGdldFdvcnN0KExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMpIHsKLSAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkocmVzdWx0cykpIHsKLSAgICAgICAgICAgIHJldHVybiBDbWlzVGVzdFJlc3VsdFN0YXR1cy5PSzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtYXggPSAwOwotCi0gICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgaWYgKG1heCA8IHJlc3VsdC5nZXRTdGF0dXMoKS5nZXRMZXZlbCgpKSB7Ci0gICAgICAgICAgICAgICAgbWF4ID0gcmVzdWx0LmdldFN0YXR1cygpLmdldExldmVsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ21pc1Rlc3RSZXN1bHRTdGF0dXMuZnJvbUxldmVsKG1heCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFByb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIHsKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRHcm91cChDbWlzVGVzdEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihncm91cC5nZXROYW1lKCkgKyAiICgiICsgZ3JvdXAuZ2V0VGVzdHMoKS5zaXplKCkgKyAiIHRlc3RzKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kR3JvdXAoQ21pc1Rlc3RHcm91cCBncm91cCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoQ21pc1Rlc3QgdGVzdCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICAiICsgdGVzdC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kVGVzdChDbWlzVGVzdCB0ZXN0KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgKCIgKyB0ZXN0LmdldFRpbWUoKSArICJtcyk6ICIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldFdvcnN0KHRlc3QuZ2V0UmVzdWx0cygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlKFN0cmluZyBtc2cpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BYnN0cmFjdFdlYlNlcnZpY2VzVGNrSVQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQWJzdHJhY3RXZWJTZXJ2aWNlc1Rja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTc4ZGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BYnN0cmFjdFdlYlNlcnZpY2VzVGNrSVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQudGNrOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlc1Rja0lUIGV4dGVuZHMgQWJzdHJhY3RUY2tJVCB7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFdlYlNlcnZpY2VzUGF0aCgpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IGdldEJhc2VTZXNzaW9uUGFyYW1ldGVycygpOwotCi0gICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovLyIgKyBIT1NUICsgIjoiICsgUE9SVCArIGdldFdlYlNlcnZpY2VzUGF0aCgpICsgIi8iOwotCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFLCBCaW5kaW5nVHlwZS5XRUJTRVJWSUNFUy52YWx1ZSgpKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0UsIHVybCArICJSZXBvc2l0b3J5U2VydmljZT93c2RsIik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfTkFWSUdBVElPTl9TRVJWSUNFLCB1cmwgKyAiTmF2aWdhdGlvblNlcnZpY2U/d3NkbCIpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX09CSkVDVF9TRVJWSUNFLCB1cmwgKyAiT2JqZWN0U2VydmljZT93c2RsIik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfVkVSU0lPTklOR19TRVJWSUNFLCB1cmwgKyAiVmVyc2lvbmluZ1NlcnZpY2U/d3NkbCIpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0RJU0NPVkVSWV9TRVJWSUNFLCB1cmwgKyAiRGlzY292ZXJ5U2VydmljZT93c2RsIik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVMQVRJT05TSElQX1NFUlZJQ0UsIHVybCArICJSZWxhdGlvbnNoaXBTZXJ2aWNlP3dzZGwiKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFLCB1cmwgKyAiTXVsdGlGaWxpbmdTZXJ2aWNlP3dzZGwiKTsKLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRSwgdXJsICsgIlBvbGljeVNlcnZpY2U/d3NkbCIpOwotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0FDTF9TRVJWSUNFLCB1cmwgKyAiQUNMU2VydmljZT93c2RsIik7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJpbmRpbmdUeXBlIGdldEJpbmRpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gQmluZGluZ1R5cGUuV0VCU0VSVklDRVM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BdG9tUHViMTBOb25WZXJzVGNrSVQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQXRvbVB1YjEwTm9uVmVyc1Rja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODQxZjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9BdG9tUHViMTBOb25WZXJzVGNrSVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQudGNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEF0b21QdWIxME5vblZlcnNUY2tJVCBleHRlbmRzIEFic3RyYWN0QXRvbVB1YlRja0lUIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXRvbVB1YlBhdGgoKSB7Ci0gICAgICAgIHJldHVybiAiL29wZW5jbWlzL2F0b20iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHVzZXNWZXJzaW9uYWJsZURvY3VtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQXRvbVB1YjEwVmVyc1Rja0lULmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL0F0b21QdWIxMFZlcnNUY2tJVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUyM2RiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQXRvbVB1YjEwVmVyc1Rja0lULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnRjazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBdG9tUHViMTBWZXJzVGNrSVQgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJUY2tJVCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0b21QdWJQYXRoKCkgewotICAgICAgICByZXR1cm4gIi9vcGVuY21pcy9hdG9tIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBDbWlzVmVyc2lvbi5DTUlTXzFfMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VzVmVyc2lvbmFibGVEb2N1bWVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQXRvbVB1YjExTm9uVmVyc1Rja0lULmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL0F0b21QdWIxMU5vblZlcnNUY2tJVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNhOWE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQXRvbVB1YjExTm9uVmVyc1Rja0lULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnRjazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBdG9tUHViMTFOb25WZXJzVGNrSVQgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJUY2tJVCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0b21QdWJQYXRoKCkgewotICAgICAgICByZXR1cm4gIi9vcGVuY21pcy9hdG9tMTEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8xOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHVzZXNWZXJzaW9uYWJsZURvY3VtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQXRvbVB1YjExVmVyc1Rja0lULmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL0F0b21QdWIxMVZlcnNUY2tJVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTM5Y2UxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQXRvbVB1YjExVmVyc1Rja0lULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnRjazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBdG9tUHViMTFWZXJzVGNrSVQgZXh0ZW5kcyBBYnN0cmFjdEF0b21QdWJUY2tJVCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0b21QdWJQYXRoKCkgewotICAgICAgICByZXR1cm4gIi9vcGVuY21pcy9hdG9tMTEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8xOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHVzZXNWZXJzaW9uYWJsZURvY3VtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9Ccm93c2VyMTFOb25WZXJzVGNrSVQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQnJvd3NlcjExTm9uVmVyc1Rja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODFiMzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9Ccm93c2VyMTFOb25WZXJzVGNrSVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQudGNrOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjExTm9uVmVyc1Rja0lUIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyVGNrSVQgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdXNlc1ZlcnNpb25hYmxlRG9jdW1lbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9Ccm93c2VyMTFWZXJzVGNrSVQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svQnJvd3NlcjExVmVyc1Rja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTlmZmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9Ccm93c2VyMTFWZXJzVGNrSVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQudGNrOwotCi1wdWJsaWMgY2xhc3MgQnJvd3NlcjExVmVyc1Rja0lUIGV4dGVuZHMgQWJzdHJhY3RCcm93c2VyVGNrSVQgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdXNlc1ZlcnNpb25hYmxlRG9jdW1lbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL1dlYlNlcnZpY2VzMTBOb25WZXJzVGNrSVQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svV2ViU2VydmljZXMxME5vblZlcnNUY2tJVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBlNDJjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svV2ViU2VydmljZXMxME5vblZlcnNUY2tJVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC50Y2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXMxME5vblZlcnNUY2tJVCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZXNUY2tJVCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VzUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuICIvb3BlbmNtaXMvc2VydmljZXMiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHVzZXNWZXJzaW9uYWJsZURvY3VtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svV2ViU2VydmljZXMxMFZlcnNUY2tJVC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9XZWJTZXJ2aWNlczEwVmVyc1Rja0lULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDNmOWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9XZWJTZXJ2aWNlczEwVmVyc1Rja0lULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnRjazsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlczEwVmVyc1Rja0lUIGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlc1Rja0lUIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZXNQYXRoKCkgewotICAgICAgICByZXR1cm4gIi9vcGVuY21pcy9zZXJ2aWNlcyI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNWZXJzaW9uIGdldENtaXNWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gQ21pc1ZlcnNpb24uQ01JU18xXzA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdXNlc1ZlcnNpb25hYmxlRG9jdW1lbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL1dlYlNlcnZpY2VzMTFOb25WZXJzVGNrSVQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svV2ViU2VydmljZXMxMU5vblZlcnNUY2tJVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzIwODllLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2ZpdC90Y2svV2ViU2VydmljZXMxMU5vblZlcnNUY2tJVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC50Y2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZXMxMU5vblZlcnNUY2tJVCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZXNUY2tJVCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VzUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuICIvb3BlbmNtaXMvc2VydmljZXMxMSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENtaXNWZXJzaW9uIGdldENtaXNWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gQ21pc1ZlcnNpb24uQ01JU18xXzE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdXNlc1ZlcnNpb25hYmxlRG9jdW1lbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0L3Rjay9XZWJTZXJ2aWNlczExVmVyc1Rja0lULmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL1dlYlNlcnZpY2VzMTFWZXJzVGNrSVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjNzViMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9maXQvdGNrL1dlYlNlcnZpY2VzMTFWZXJzVGNrSVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQudGNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzMTFWZXJzVGNrSVQgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VzVGNrSVQgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlc1BhdGgoKSB7Ci0gICAgICAgIHJldHVybiAiL29wZW5jbWlzL3NlcnZpY2VzMTEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbWlzVmVyc2lvbiBnZXRDbWlzVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8xOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHVzZXNWZXJzaW9uYWJsZURvY3VtZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L3Jlc291cmNlcy9pbm1lbW9yeS5hdG9tLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2lubWVtb3J5LmF0b20ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5OGVjOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2lubWVtb3J5LmF0b20ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj10ZXN0Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD10ZXN0Ci0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1YgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly9sb2NhbGhvc3Q6MTkwODAvb3BlbmNtaXMvYXRvbQotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXNzaW9uLnJlcG9zaXRvcnkuaWQ9dGVzdAotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQucnVudGltZS5kb2N1bWVudC50eXBlLmlkPWNtaXM6ZG9jdW1lbnQKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC5ydW50aW1lLmZvbGRlci50eXBlLmlkPWNtaXM6Zm9sZGVyCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC5ydW50aW1lLmRvY3VtZW50MS5uYW1lPU15X0RvY3VtZW50LTAtMAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnJ1bnRpbWUuZG9jdW1lbnQyLm5hbWU9TXlfRG9jdW1lbnQtMC0xCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQucnVudGltZS5mb2xkZXIxLm5hbWU9TXlfRm9sZGVyLTAtMAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnJ1bnRpbWUuZm9sZGVyMi5uYW1lPU15X0ZvbGRlci0wLTEKLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L3Jlc291cmNlcy9pbm1lbW9yeS5icm93c2VyLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2lubWVtb3J5LmJyb3dzZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwY2ExNS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2lubWVtb3J5LmJyb3dzZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj10ZXN0Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD10ZXN0Ci0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YnJvd3NlcgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmJyb3dzZXIudXJsPWh0dHA6Ly9sb2NhbGhvc3Q6MTkwODAvb3BlbmNtaXMvYnJvd3NlcgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXNzaW9uLnJlcG9zaXRvcnkuaWQ9dGVzdAotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQucnVudGltZS5kb2N1bWVudC50eXBlLmlkPWNtaXM6ZG9jdW1lbnQKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC5ydW50aW1lLmZvbGRlci50eXBlLmlkPWNtaXM6Zm9sZGVyCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC5ydW50aW1lLmRvY3VtZW50MS5uYW1lPU15X0RvY3VtZW50LTAtMAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnJ1bnRpbWUuZG9jdW1lbnQyLm5hbWU9TXlfRG9jdW1lbnQtMC0xCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQucnVudGltZS5mb2xkZXIxLm5hbWU9TXlfRm9sZGVyLTAtMAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnJ1bnRpbWUuZm9sZGVyMi5uYW1lPU15X0ZvbGRlci0wLTEKLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L3Jlc291cmNlcy9pbm1lbW9yeS53cy5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L3Jlc291cmNlcy9pbm1lbW9yeS53cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjJiNDNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9yZXNvdXJjZXMvaW5tZW1vcnkud3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj10ZXN0Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD10ZXN0Ci0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9d2Vic2VydmljZXMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZXBvc2l0b3J5U2VydmljZT1odHRwOi8vbG9jYWxob3N0OjE5MDgwL29wZW5jbWlzL3NlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdDoxOTA4MC9vcGVuY21pcy9zZXJ2aWNlcy9OYXZpZ2F0aW9uU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk9iamVjdFNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdDoxOTA4MC9vcGVuY21pcy9zZXJ2aWNlcy9PYmplY3RTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuVmVyc2lvbmluZ1NlcnZpY2U9aHR0cDovL2xvY2FsaG9zdDoxOTA4MC9vcGVuY21pcy9zZXJ2aWNlcy9WZXJzaW9uaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdDoxOTA4MC9vcGVuY21pcy9zZXJ2aWNlcy9EaXNjb3ZlcnlTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVsYXRpb25zaGlwU2VydmljZT1odHRwOi8vbG9jYWxob3N0OjE5MDgwL29wZW5jbWlzL3NlcnZpY2VzL1JlbGF0aW9uc2hpcFNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5NdWx0aUZpbGluZ1NlcnZpY2U9aHR0cDovL2xvY2FsaG9zdDoxOTA4MC9vcGVuY21pcy9zZXJ2aWNlcy9NdWx0aUZpbGluZ1NlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5Qb2xpY3lTZXJ2aWNlPWh0dHA6Ly9sb2NhbGhvc3Q6MTkwODAvb3BlbmNtaXMvc2VydmljZXMvUG9saWN5U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkFDTFNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdDoxOTA4MC9vcGVuY21pcy9zZXJ2aWNlcy9BQ0xTZXJ2aWNlP3dzZGwKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2Vzc2lvbi5yZXBvc2l0b3J5LmlkPXRlc3QKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnJ1bnRpbWUuZG9jdW1lbnQudHlwZS5pZD1jbWlzOmRvY3VtZW50Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQucnVudGltZS5mb2xkZXIudHlwZS5pZD1jbWlzOmZvbGRlcgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQucnVudGltZS5kb2N1bWVudDEubmFtZT1NeV9Eb2N1bWVudC0wLTAKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC5ydW50aW1lLmRvY3VtZW50Mi5uYW1lPU15X0RvY3VtZW50LTAtMQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0LnJ1bnRpbWUuZm9sZGVyMS5uYW1lPU15X0ZvbGRlci0wLTAKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpdC5ydW50aW1lLmZvbGRlcjIubmFtZT1NeV9Gb2xkZXItMC0xCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2phY2tyYWJiaXQtcmVwb3NpdG9yeS1tZW1vcnkueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtZml0L3NyYy90ZXN0L3Jlc291cmNlcy9qYWNrcmFiYml0LXJlcG9zaXRvcnktbWVtb3J5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyYjRiOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2phY2tyYWJiaXQtcmVwb3NpdG9yeS1tZW1vcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSBSZXBvc2l0b3J5Ci0gICAgICAgIFBVQkxJQyAiLS8vVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9EVEQgSmFja3JhYmJpdCAyLjAvL0VOIgotICAgICAgICAiaHR0cDovL2phY2tyYWJiaXQuYXBhY2hlLm9yZy9kdGQvcmVwb3NpdG9yeS0yLjAuZHRkIj4KLQotPCEtLSBFeGFtcGxlIFJlcG9zaXRvcnkgQ29uZmlndXJhdGlvbiBGaWxlCi0gICAgIFVzZWQgYnkKLSAgICAgLSBvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5jb25maWcuUmVwb3NpdG9yeUNvbmZpZ1Rlc3QuamF2YQotICAgICAtCi0tLT4KLTxSZXBvc2l0b3J5PgotICAgIDxGaWxlU3lzdGVtIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5mcy5tZW0uTWVtb3J5RmlsZVN5c3RlbSI+PC9GaWxlU3lzdGVtPgotICAgIDxEYXRhU3RvcmUgY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLmRhdGEuRmlsZURhdGFTdG9yZSIvPgotICAgIDxTZWN1cml0eSBhcHBOYW1lPSJKYWNrcmFiYml0Ij4KLSAgICAgICAgPFNlY3VyaXR5TWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuRGVmYXVsdFNlY3VyaXR5TWFuYWdlciIgd29ya3NwYWNlTmFtZT0ic2VjdXJpdHkiPgotICAgICAgICAgICAgPCEtLSA8V29ya3NwYWNlQWNjZXNzTWFuYWdlciBjbGFzcz0iLi4uIi8+IC0tPgotICAgICAgICAgICAgPCEtLSA8cGFyYW0gbmFtZT0iY29uZmlnIiB2YWx1ZT0iJHtyZXAuaG9tZX0vc2VjdXJpdHkueG1sIi8+IC0tPgotICAgICAgICA8L1NlY3VyaXR5TWFuYWdlcj4KLSAgICAgICAgPEFjY2Vzc01hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLnNlY3VyaXR5LkRlZmF1bHRBY2Nlc3NNYW5hZ2VyIj4KLSAgICAgICAgICAgIDwhLS0gPHBhcmFtIG5hbWU9ImNvbmZpZyIgdmFsdWU9IiR7cmVwLmhvbWV9L2FjY2Vzcy54bWwiLz4gLS0+Ci0gICAgICAgIDwvQWNjZXNzTWFuYWdlcj4KLSAgICAgICAgPExvZ2luTW9kdWxlIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5zZWN1cml0eS5hdXRoZW50aWNhdGlvbi5EZWZhdWx0TG9naW5Nb2R1bGUiPgotICAgICAgICAgICAgPCEtLQotICAgICAgICAgICAgICBhbm9ueW1vdXMgdXNlciBuYW1lICgnYW5vbnltb3VzJyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSkKLSAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImFub255bW91c0lkIiB2YWx1ZT0iYW5vbnltb3VzIi8+Ci0gICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgIGFkbWluaXN0cmF0b3IgdXNlciBpZCAoZGVmYXVsdCB2YWx1ZSBpZiBwYXJhbSBpcyBtaXNzaW5nIGlzICdhZG1pbicpCi0gICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJhZG1pbklkIiB2YWx1ZT0iYWRtaW4iLz4KLSAgICAgICAgPC9Mb2dpbk1vZHVsZT4KLSAgICA8L1NlY3VyaXR5PgotICAgIDxXb3Jrc3BhY2VzIHJvb3RQYXRoPSIke3JlcC5ob21lfS93b3Jrc3BhY2VzIiBkZWZhdWx0V29ya3NwYWNlPSJkZWZhdWx0Ii8+Ci0gICAgPFdvcmtzcGFjZSBuYW1lPSIke3dzcC5uYW1lfSI+Ci0gICAgICAgIDxGaWxlU3lzdGVtIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5mcy5tZW0uTWVtb3J5RmlsZVN5c3RlbSIvPgotICAgICAgICA8UGVyc2lzdGVuY2VNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5wZXJzaXN0ZW5jZS5idW5kbGUuQnVuZGxlRnNQZXJzaXN0ZW5jZU1hbmFnZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImJsb2JGU0Jsb2NrU2l6ZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwhLS0gc3RvcmUgaW4gbWVtb3J5IC0tPgotICAgICAgICA8L1BlcnNpc3RlbmNlTWFuYWdlcj4KLSAgICAgICAgPFNlYXJjaEluZGV4IGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5xdWVyeS5sdWNlbmUuU2VhcmNoSW5kZXgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSIke3dzcC5ob21lfS9pbmRleCIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InN1cHBvcnRIaWdobGlnaHRpbmciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZGlyZWN0b3J5TWFuYWdlckNsYXNzIiB2YWx1ZT0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUucXVlcnkubHVjZW5lLmRpcmVjdG9yeS5SQU1EaXJlY3RvcnlNYW5hZ2VyIi8+Ci0gICAgICAgICAgICA8RmlsZVN5c3RlbSBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuZnMubWVtLk1lbW9yeUZpbGVTeXN0ZW0iPjwvRmlsZVN5c3RlbT4KLSAgICAgICAgPC9TZWFyY2hJbmRleD4KLSAgICA8L1dvcmtzcGFjZT4KLSAgICA8VmVyc2lvbmluZyByb290UGF0aD0iJHtyZXAuaG9tZX0vdmVyc2lvbiI+Ci0gICAgICAgIDxGaWxlU3lzdGVtIGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5mcy5tZW0uTWVtb3J5RmlsZVN5c3RlbSI+Ci0gICAgICAgIDwvRmlsZVN5c3RlbT4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgQ29uZmlndXJlcyB0aGUgcGVyc2lzdGVuY2UgbWFuYWdlciB0byBiZSB1c2VkIGZvciBwZXJzaXN0aW5nIHZlcnNpb24gc3RhdGUuCi0gICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBjdXJyZW50IHZlcnNpb25pbmcgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24KLSAgICAgICAgICAgIGEgJ25vcm1hbCcgcGVyc2lzdGVuY2UgbWFuYWdlciwgYnV0IHRoaXMgY291bGQgY2hhbmdlIGluIGZ1dHVyZQotICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLgotICAgICAgICAtLT4KLSAgICAgICAgPFBlcnNpc3RlbmNlTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUucGVyc2lzdGVuY2UuYnVuZGxlLkJ1bmRsZUZzUGVyc2lzdGVuY2VNYW5hZ2VyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJibG9iRlNCbG9ja1NpemUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8IS0tIHN0b3JlIGluIG1lbW9yeSAtLT4KLSAgICAgICAgPC9QZXJzaXN0ZW5jZU1hbmFnZXI+Ci0gICAgPC9WZXJzaW9uaW5nPgotCi0gICAgPCEtLQotICAgICAgICBTZWFyY2ggaW5kZXggZm9yIGNvbnRlbnQgdGhhdCBpcyBzaGFyZWQgcmVwb3NpdG9yeSB3aWRlCi0gICAgICAgICgvamNyOnN5c3RlbSB0cmVlLCBjb250YWlucyBtYWlubHkgdmVyc2lvbnMpCi0gICAgLS0+Ci0gICAgPFNlYXJjaEluZGV4IGNsYXNzPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5xdWVyeS5sdWNlbmUuU2VhcmNoSW5kZXgiPgotICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9IiR7cmVwLmhvbWV9L3JlcG9zaXRvcnkvaW5kZXgiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9InN1cHBvcnRIaWdobGlnaHRpbmciIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnlNYW5hZ2VyQ2xhc3MiIHZhbHVlPSJvcmcuYXBhY2hlLmphY2tyYWJiaXQuY29yZS5xdWVyeS5sdWNlbmUuZGlyZWN0b3J5LlJBTURpcmVjdG9yeU1hbmFnZXIiLz4KLSAgICAgICAgPEZpbGVTeXN0ZW0gY2xhc3M9Im9yZy5hcGFjaGUuamFja3JhYmJpdC5jb3JlLmZzLm1lbS5NZW1vcnlGaWxlU3lzdGVtIj48L0ZpbGVTeXN0ZW0+Ci0gICAgPC9TZWFyY2hJbmRleD4KLQotICAgIDwhLS0KLSAgICAgICAgUnVuIHdpdGggYSBjbHVzdGVyIGpvdXJuYWwKLSAgICAtLT4KLSAgICA8Q2x1c3RlciBpZD0ibm9kZTEiPgotICAgICAgICA8Sm91cm5hbCBjbGFzcz0ib3JnLmFwYWNoZS5qYWNrcmFiYml0LmNvcmUuam91cm5hbC5GaWxlSm91cm5hbCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0icmV2aXNpb24iIHZhbHVlPSIke3JlcC5ob21lfS9yZXZpc2lvbi5sb2ciLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkaXJlY3RvcnkiIHZhbHVlPSIke3JlcC5ob21lfS9teWpvdXJuYWwiLz4KLSAgICAgICAgPC9Kb3VybmFsPgotICAgIDwvQ2x1c3Rlcj4KLTwvUmVwb3NpdG9yeT4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxMjdkMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLWxvZzRqLnJvb3RDYXRlZ29yeT1XQVJOLCBSLCBPCi0KLSMgU3Rkb3V0Ci1sb2c0ai5hcHBlbmRlci5PPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi0KLSMgRmlsZQotbG9nNGouYXBwZW5kZXIuUj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLlIuRmlsZT0ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9sb2c0ai5sb2cKLQotIyBDb250cm9sIHRoZSBtYXhpbXVtIGxvZyBmaWxlIHNpemUKLWxvZzRqLmFwcGVuZGVyLlIuTWF4RmlsZVNpemU9MTAwS0IKLQotIyBBcmNoaXZlIGxvZyBmaWxlcyAob25lIGJhY2t1cCBmaWxlIGhlcmUpCi1sb2c0ai5hcHBlbmRlci5SLk1heEJhY2t1cEluZGV4PTEKLWxvZzRqLmFwcGVuZGVyLlIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5SLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWM6ICVtJW4KLWxvZzRqLmFwcGVuZGVyLk8ubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgWyV0XSAlYzogJW0lbgotCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZml0PVdBUk4KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5pbm1lbW9yeT1XQVJOCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXRpbD1XQVJOCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50PVdBUk4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9yZXNvdXJjZXMvbW9kZXNoYXBlLXJlcG9zaXRvcnktbWVtb3J5Lmpzb24gYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1maXQvc3JjL3Rlc3QvcmVzb3VyY2VzL21vZGVzaGFwZS1yZXBvc2l0b3J5LW1lbW9yeS5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWIwZDUzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdC9zcmMvdGVzdC9yZXNvdXJjZXMvbW9kZXNoYXBlLXJlcG9zaXRvcnktbWVtb3J5Lmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi17Ci0gICAgIm5hbWUiIDogInRlc3QiLAotICAgICJqbmRpTmFtZSIgOiAiIiwKLSAgICAid29ya3NwYWNlcyIgOiB7Ci0gICAgICAgICJwcmVkZWZpbmVkIiA6IFsidGVzdCJdLAotICAgICAgICAiZGVmYXVsdCIgOiAidGVzdCIsCi0gICAgICAgICJhbGxvd0NyZWF0aW9uIiA6IHRydWUKLSAgICB9LAotICAgICJzZWN1cml0eSIgOiB7Ci0gICAgICAgICJhbm9ueW1vdXMiIDogewotICAgICAgICAgICAgInJvbGVzIiA6IFsicmVhZG9ubHkiLCJyZWFkd3JpdGUiLCJhZG1pbiJdLAotICAgICAgICAgICAgInVzZU9uRmFpbGVkTG9naW4iIDogdHJ1ZQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3BvbS54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0MWM5YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLSAgICA8IS0tCi0gICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzCi0gICAgICAgIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPk9wZW5DTUlTIFRlc3QgQ29tcGF0aWJpbGl0eSBLaXQ8L25hbWU+Ci0gICAgCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwYXJlbnRCYXNlZGlyPi4uLy4uLzwvcGFyZW50QmFzZWRpcj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0gICAgCi0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHttYXZlbi52ZXJzaW9ufSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRpbWVzdGFtcCIgdmFsdWU9IiR7dGltZXN0YW1wfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJldmlzaW9uIiB2YWx1ZT0iJHtidWlsZE51bWJlcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXRkaXIiIHZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBidWlsZCB0aW1lc3RhbXAgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobyBmaWxlPSIke3RhcmdldGRpcn0vZ2VuZXJhdGVkLXJlc291cmNlcy9NRVRBLUlORi9idWlsZC10aW1lc3RhbXAudHh0Ij5WZXJzaW9uOiAke3Byb2plY3QudmVyc2lvbn0gLyBSZXZpc2lvbjogJHtyZXZpc2lvbn0gLyBCdWlsZDogJHt0aW1lc3RhbXB9PC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gZmlsZT0iJHt0YXJnZXRkaXJ9L2dlbmVyYXRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvdGNrLXJldmlzaW9uLnR4dCI+JHtyZXZpc2lvbn08L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIAotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuOC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2p1bml0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL0NtaXNUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNDkzMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIENNSVMgVENLIFRlc3QuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ21pc1Rlc3QgewotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIHRlc3Qgd2l0aCB0ZXN0IHBhcmFtZXRlcnMuCi0gICAgICovCi0gICAgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRlc3QuCi0gICAgICovCi0gICAgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IGdyb3VwLgotICAgICAqLwotICAgIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFJ1bnMgdGhlIHRlc3QuCi0gICAgICovCi0gICAgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZiB0aGUgdGVzdCBpcyBlbmFibGVkIG9yIG5vdC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgdGVzdC4KLSAgICAgKi8KLSAgICB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3QgYWZ0ZXIge0BsaW5rICNydW4oKX0gaGFzIGJlIGNhbGxlZC4KLSAgICAgKi8KLSAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiBnZXRSZXN1bHRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lIChpbiBtaWxsaXNlY29uZHMpIHRoYXQgdGhlIHRlc3QgdG9vayB0byBydW4uCi0gICAgICovCi0gICAgbG9uZyBnZXRUaW1lKCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3RHcm91cC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL0NtaXNUZXN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExM2Q4YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3RHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjazsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQ01JUyBUQ0sgVGVzdCBHcm91cC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDbWlzVGVzdEdyb3VwIHsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSB0ZXN0IGdyb3VwIHdpdGggdGVzdCBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgZHVyaW5nIGEgcnVuLgotICAgICAqLwotICAgIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGdyb3VwLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QgZ3JvdXAuCi0gICAgICovCi0gICAgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhbGwgdGVzdHMgaW4gdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBMaXN0PENtaXNUZXN0PiBnZXRUZXN0cygpOwotCi0gICAgLyoqCi0gICAgICogUnVucyBhbGwgZW5hYmxlZCB0ZXN0cyBpbiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIHRlc3QgZ3JvdXAgaXMgZW5hYmxlZCBvciBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhpcyB0ZXN0IGdyb3VwLgotICAgICAqLwotICAgIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL0NtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3RQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlMjU2My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3RQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2s7Ci0KLS8qKgotICogQ01JUyBQcm9ncmVzcyBNb25pdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIHsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBiZWZvcmUgYSBuZXcgZ3JvdXAgcnVuIHN0YXJ0cy4KLSAgICAgKi8KLSAgICB2b2lkIHN0YXJ0R3JvdXAoQ21pc1Rlc3RHcm91cCBncm91cCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYWZ0ZXIgYSBncm91cCBydW4gZW5kZWQuCi0gICAgICovCi0gICAgdm9pZCBlbmRHcm91cChDbWlzVGVzdEdyb3VwIGdyb3VwKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCBiZWZvcmUgYSBuZXcgdGVzdCBydW4gc3RhcnRzLgotICAgICAqLwotICAgIHZvaWQgc3RhcnRUZXN0KENtaXNUZXN0IHRlc3QpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGFmdGVyIGEgdGVzdCBydW4gZW5kZWQuCi0gICAgICovCi0gICAgdm9pZCBlbmRUZXN0KENtaXNUZXN0IHRlc3QpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYSBncm91cCBvciB0ZXN0IHdhbnRzIHRvIHByaW50IG91dCBhIG1lc3NhZ2UuCi0gICAgICovCi0gICAgdm9pZCBtZXNzYWdlKFN0cmluZyBtc2cpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL0NtaXNUZXN0UmVwb3J0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3RSZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmZjA5Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3RSZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2s7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBDTUlTIFRDSyBUZXN0IFJlcG9ydC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDbWlzVGVzdFJlcG9ydCB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHJlcG9ydCBhbmQgd3JpdGVzIGl0IHRvIGEgd3JpdGVyLgotICAgICAqLwotICAgIHZvaWQgY3JlYXRlUmVwb3J0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgTGlzdDxDbWlzVGVzdEdyb3VwPiBncm91cHMsIFdyaXRlciB3cml0ZXIpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHJlcG9ydCBhbmQgd3JpdGVzIGl0IHRvIGEgZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGNyZWF0ZVJlcG9ydChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIExpc3Q8Q21pc1Rlc3RHcm91cD4gZ3JvdXBzLCBGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svQ21pc1Rlc3RSZXN1bHQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9DbWlzVGVzdFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNkNGNlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9DbWlzVGVzdFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjazsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIENNSVMgVENLIFRlc3QgUmVzdWx0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENtaXNUZXN0UmVzdWx0IHsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGdyb3VwIG5hbWUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEdyb3VwTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGVzdCBuYW1lLgotICAgICAqLwotICAgIFN0cmluZyBnZXRUZXN0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hlY2sgc3RhdHVzLgotICAgICAqLwotICAgIENtaXNUZXN0UmVzdWx0U3RhdHVzIGdldFN0YXR1cygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2hlY2sgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0TWVzc2FnZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIGlmIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdGFjayB0cmFjZS4gVGhlIGZpcnN0IGVsZW1lbnQgc2hvdWxkIHBvaW50IHRvIGNoZWNrLgotICAgICAqLwotICAgIFN0YWNrVHJhY2VFbGVtZW50W10gZ2V0U3RhY2tUcmFjZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSByZXF1ZXN0IGlmIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VXJsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0IGJvZHkgaWYgYXZhaWxhYmxlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRSZXF1ZXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBib2R5IGlmIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UmVzcG9uc2UoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgY2hpbGRyZW4gb2YgdGhlIHJlc3VsdCB0aGF0IGNvbnRhaW4gbW9yZSBkZXRhaWxzLgotICAgICAqLwotICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IGdldENoaWxkcmVuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlmIHRoZSByZXN1bHQgd2FzIGZhdGFsIGZvciB0aGUgdGVzdC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzRmF0YWwoKTsKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9DbWlzVGVzdFJlc3VsdFN0YXR1cy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL0NtaXNUZXN0UmVzdWx0U3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTZkZjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL0NtaXNUZXN0UmVzdWx0U3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrOwotCi0vKioKLSAqIENNSVMgVENLIFRlc3QgUmVzdWx0IFN0YXR1cy4KLSAqLwotcHVibGljIGVudW0gQ21pc1Rlc3RSZXN1bHRTdGF0dXMgewotCi0gICAgSU5GTygwKSwgLy8gbm8gY2hlY2ssIGp1c3QgZm9yIHJlcG9ydHMKLSAgICBTS0lQUEVEKDEpLCAvLyBjaGVjayBoYXMgYmVlbiBza2lwcGVkCi0gICAgT0soMiksIC8vIGNoZWNrIHBhc3NlZAotICAgIFdBUk5JTkcoMyksIC8vIGNoZWNrIGZhaWxlZCBidXQgaXQgaXMgbm90IHNwZWNpZmljYXRpb24gdmlvbGF0aW9uCi0gICAgRkFJTFVSRSg0KSwgLy8gY2hlY2sgZmFpbGVkIGFuZCBpdCBpcyBzcGVjaWZpY2F0aW9uIHZpb2xhdGlvbgotICAgIFVORVhQRUNURURfRVhDRVBUSU9OKDUpOyAvLyBleGNlcHRpb24gY2F1Z2h0IHRoYXQgaXMgbm90IGhhbmRsZWQgYnkgdGhlIHRlc3QKLQotICAgIHByaXZhdGUgZmluYWwgaW50IGxldmVsOwotCi0gICAgQ21pc1Rlc3RSZXN1bHRTdGF0dXMoaW50IGxldmVsKSB7Ci0gICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExldmVsKCkgewotICAgICAgICByZXR1cm4gbGV2ZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbWlzVGVzdFJlc3VsdFN0YXR1cyBmcm9tTGV2ZWwoaW50IGxldmVsKSB7Ci0gICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHRTdGF0dXMgYyA6IENtaXNUZXN0UmVzdWx0U3RhdHVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYy5sZXZlbCA9PSBsZXZlbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YobGV2ZWwpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9BYnN0cmFjdENtaXNUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9BYnN0cmFjdENtaXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWQzMmQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL2ltcGwvQWJzdHJhY3RDbWlzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRlc3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbWlzVGVzdCBpbXBsZW1lbnRzIENtaXNUZXN0IHsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzOwotICAgIHByaXZhdGUgQWJzdHJhY3RDbWlzVGVzdEdyb3VwIGdyb3VwOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCA9IHRydWU7Ci0gICAgcHJpdmF0ZSBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzOwotICAgIHByaXZhdGUgbG9uZyB0aW1lOwotCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICAgICAgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R3JvdXAoQWJzdHJhY3RDbWlzVGVzdEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RDbWlzVGVzdEdyb3VwIGdldEdyb3VwKCkgewotICAgICAgICByZXR1cm4gZ3JvdXA7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQganVuaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSlVuaXRIZWxwZXIucnVuKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNUZXN0UmVzdWx0PiBnZXRSZXN1bHRzKCkgewotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0VuYWJsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgdGhpcy5pc0VuYWJsZWQgPSBlbmFibGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRpbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWUobG9uZyB0aW1lKSB7Ci0gICAgICAgIHRoaXMudGltZSA9IHRpbWU7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNUZXN0UmVzdWx0SW1wbCBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbiwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNGYXRhbCkgewotICAgICAgICByZXR1cm4gbmV3IENtaXNUZXN0UmVzdWx0SW1wbChncm91cC5nZXROYW1lKCksIG5hbWUsIG1lc3NhZ2UsIHN0YXR1cywgZXhjZXB0aW9uLCBpc0ZhdGFsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc1Rlc3RSZXN1bHRJbXBsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cyBzdGF0dXMsIFN0cmluZyBtZXNzYWdlLCBib29sZWFuIGlzRmF0YWwpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDbWlzVGVzdFJlc3VsdEltcGwoZ3JvdXAuZ2V0TmFtZSgpLCBuYW1lLCBtZXNzYWdlLCBzdGF0dXMsIG51bGwsIGlzRmF0YWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzVGVzdFJlc3VsdEltcGwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDbWlzVGVzdFJlc3VsdEltcGwoZ3JvdXAuZ2V0TmFtZSgpLCBuYW1lLCBtZXNzYWdlLCBzdGF0dXMsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc1Rlc3RSZXN1bHRJbXBsIGNyZWF0ZUluZm9SZXN1bHQoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDbWlzVGVzdFJlc3VsdEltcGwoZ3JvdXAuZ2V0TmFtZSgpLCBuYW1lLCBtZXNzYWdlLCBDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUmVzdWx0KENtaXNUZXN0UmVzdWx0IHJlc3VsdCkgewotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBDbWlzVGVzdFJlc3VsdEltcGwpIHsKLSAgICAgICAgICAgICAgICAoKENtaXNUZXN0UmVzdWx0SW1wbCkgcmVzdWx0KS5zZXRTdGFja1RyYWNlKGdldFN0YWNrVHJhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmlzRmF0YWwoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXRhbFRlc3RFeGNlcHRpb24ocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RhY2tUcmFjZUVsZW1lbnRbXSBnZXRTdGFja1RyYWNlKCkgewotICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrVHJhY2UgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnRbXSBzaG9ydFN0YWNrVHJhY2UgPSBuZXcgU3RhY2tUcmFjZUVsZW1lbnRbMF07Ci0gICAgICAgIGlmIChzdGFja1RyYWNlLmxlbmd0aCA+IDMpIHsKLSAgICAgICAgICAgIHNob3J0U3RhY2tUcmFjZSA9IG5ldyBTdGFja1RyYWNlRWxlbWVudFtzdGFja1RyYWNlLmxlbmd0aCAtIDNdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShzdGFja1RyYWNlLCAzLCBzaG9ydFN0YWNrVHJhY2UsIDAsIHN0YWNrVHJhY2UubGVuZ3RoIC0gMyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2hvcnRTdGFja1RyYWNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhZGRSZXN1bHRDaGlsZChDbWlzVGVzdFJlc3VsdCByZXN1bHQsIENtaXNUZXN0UmVzdWx0IGNoaWxkKSB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQuZ2V0Q2hpbGRyZW4oKS5hZGQoY2hpbGQpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gLS0tIGhlbHBlcnMgLS0tLQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRWYWx1ZShPYmplY3QgbykgewotICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIm51bGwiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAiJyIgKyBvICsgIiciOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBDYWxlbmRhcikgewotICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1oiKTsKLSAgICAgICAgICAgIHJldHVybiBzZGYuZm9ybWF0KCgoQ2FsZW5kYXIpIG8pLmdldFRpbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8vIC0tLSBhc3NlcnRzIC0tLS0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRXF1YWwoT2JqZWN0IGV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCAhPSBudWxsICYmIGV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0SXNUcnVlKEJvb2xlYW4gdGVzdCwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSkgewotICAgICAgICBpZiAodGVzdCAhPSBudWxsICYmIHRlc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRlc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiTnVsbCEiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJGYWxzZSEiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0SXNGYWxzZShCb29sZWFuIHRlc3QsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLSAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCAmJiAhdGVzdCkgewotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJOdWxsISIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgIlRydWUhIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydE51bGwoT2JqZWN0IG9iamVjdCwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiT2JqZWN0IGlzIG5vdCBudWxsISIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0Tm90TnVsbChPYmplY3Qgb2JqZWN0LCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLCBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0gICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJPYmplY3QgaXMgbnVsbCEiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydFN0cmluZ051bGxPckVtcHR5KFN0cmluZyBzdHIsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLSAgICAgICAgaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgIlN0cmluZyBoYXMgdGhpcyB2YWx1ZTogIiArIHN0cikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRTdHJpbmdOb3RFbXB0eShTdHJpbmcgc3RyLCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLCBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0gICAgICAgIGlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiU3RyaW5nIGlzIG51bGwhIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiU3RyaW5nIGlzIGVtcHR5ISIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRMaXN0Tm90RW1wdHkoTGlzdDw/PiBsaXN0LCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLCBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgIkxpc3QgaXMgbnVsbCEiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJMaXN0IGlzIGVtcHR5ISIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRMaXN0TnVsbE9yRW1wdHkoTGlzdDw/PiBsaXN0LCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLCBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiTGlzdCBpcyBub3QgZW1wdHkhIikpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydEVxdWFscyhPYmplY3QgZXhwZWN0ZWQsIE9iamVjdCBhY3R1YWwsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLSAgICAgICAgaWYgKGlzRXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKAotICAgICAgICAgICAgICAgIGZhaWx1cmUsCi0gICAgICAgICAgICAgICAgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJleHBlY3RlZDogIiArIGZvcm1hdFZhbHVlKGV4cGVjdGVkKSArICIgLyBhY3R1YWw6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZm9ybWF0VmFsdWUoYWN0dWFsKSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRDb250YWlucyhDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdCB2YWx1ZSwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLSAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiQ29sbGVjdGlvbiBpcyBudWxsISIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKHZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwKLSAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgIkNvbGxlY3Rpb24gZG9lcyBub3QgY29udGFpbiAiICsgZm9ybWF0VmFsdWUodmFsdWUpKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydEVxdWFsTGlzdHMoTGlzdDw/PiBleHBlY3RlZCwgTGlzdDw/PiBhY3R1YWwsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsCi0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJFeHBlY3RlZCBsaXN0IGlzIG51bGwhIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJBY3R1YWwgbGlzdCBpcyBudWxsISIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZC5zaXplKCkgIT0gYWN0dWFsLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKAotICAgICAgICAgICAgICAgICAgICBmYWlsdXJlLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgIkxpc3Qgc2l6ZXMgZG9uJ3QgbWF0Y2ghIGV4cGVjdGVkOiAiICsgZXhwZWN0ZWQuc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC8gYWN0dWFsOiAiICsgYWN0dWFsLnNpemUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKCFpc0VxdWFsKGV4cGVjdGVkLmdldChpKSwgYWN0dWFsLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJleHBlY3RlZCBsaXN0IGl0ZW1bIiArIGkgKyAiXTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZvcm1hdFZhbHVlKGV4cGVjdGVkLmdldChpKSkgKyAiIC8gYWN0dWFsIGxpc3QgaXRlbVsiICsgaSArICJdOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZm9ybWF0VmFsdWUoYWN0dWFsLmdldChpKSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRFcXVhbFNldChTZXQ8Pz4gZXhwZWN0ZWQsIFNldDw/PiBhY3R1YWwsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsCi0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJFeHBlY3RlZCBzZXQgaXMgbnVsbCEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgIkFjdHVhbCBzZXQgaXMgbnVsbCEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQuc2l6ZSgpICE9IGFjdHVhbC5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRSZXN1bHRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJTZXQgc2l6ZXMgZG9uJ3QgbWF0Y2ghIGV4cGVjdGVkOiAiICsgZXhwZWN0ZWQuc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC8gYWN0dWFsOiAiICsgYWN0dWFsLnNpemUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChPYmplY3QgbyA6IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICBpZiAoIWFjdHVhbC5jb250YWlucyhvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJJdGVtIG5vdCBpbiBhY3R1YWwgc2V0OiAiICsgZm9ybWF0VmFsdWUobykpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0Fic3RyYWN0Q21pc1Rlc3RHcm91cC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL2ltcGwvQWJzdHJhY3RDbWlzVGVzdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTk5MTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL2ltcGwvQWJzdHJhY3RDbWlzVGVzdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciB0ZXN0IGdyb3Vwcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q21pc1Rlc3RHcm91cCBpbXBsZW1lbnRzIENtaXNUZXN0R3JvdXAgewotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q21pc1Rlc3Q+IHRlc3RzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdD4oKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkID0gdHJ1ZTsKLSAgICBwcml2YXRlIENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxDbWlzVGVzdD4gZ2V0VGVzdHMoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRUZXN0KENtaXNUZXN0IHRlc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAodGVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXN0cy5hZGQodGVzdCk7Ci0gICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIEFic3RyYWN0Q21pc1Rlc3QpIHsKLSAgICAgICAgICAgICAgICAoKEFic3RyYWN0Q21pc1Rlc3QpIHRlc3QpLnNldEdyb3VwKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVzdC5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotICAgICAgICB0aGlzLnByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9ncmVzc01vbml0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yLnN0YXJ0R3JvdXAodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJlUnVuKCk7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0IHRlc3QgOiB0ZXN0cykgewotICAgICAgICAgICAgICAgIGlmICh0ZXN0ID09IG51bGwgfHwgIXRlc3QuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc01vbml0b3Iuc3RhcnRUZXN0KHRlc3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJlVGVzdCh0ZXN0KTsKLQotICAgICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGVzdC5ydW4oKTsKLQotICAgICAgICAgICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIEFic3RyYWN0Q21pc1Rlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoQWJzdHJhY3RDbWlzVGVzdCkgdGVzdCkuc2V0VGltZShlbmQgLSBzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRmF0YWxUZXN0RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc3RUZXN0KHRlc3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NNb25pdG9yLmVuZFRlc3QodGVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3N0UnVuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2dyZXNzTW9uaXRvci5lbmRHcm91cCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQganVuaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSlVuaXRIZWxwZXIucnVuKHRoaXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZVJ1bigpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0UnVuKCkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZVRlc3QoQ21pc1Rlc3QgdGVzdCkgewotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvc3RUZXN0KENtaXNUZXN0IHRlc3QpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0VuYWJsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgdGhpcy5pc0VuYWJsZWQgPSBlbmFibGVkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0Fic3RyYWN0U2Vzc2lvblRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0Fic3RyYWN0U2Vzc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2MWEwMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9BYnN0cmFjdFNlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTnVsbE9yRW1wdHk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLk9LOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlVORVhQRUNURURfRVhDRVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRmlsZWFibGVDbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlbmRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuT3BlcmF0aW9uQ29udGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuU2Vzc2lvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWxsb3dhYmxlQWN0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlDYXBhYmlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlPcmRlckJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXM7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgdGVzdHMgdGhhdCByZXF1aXJlIGFuIE9wZW5DTUlTIHNlc3Npb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlc3Npb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RDbWlzVGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9wZXJhdGlvbkNvbnRleHQgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyA9IG5ldyBPcGVyYXRpb25Db250ZXh0SW1wbCgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3BlcmF0aW9uQ29udGV4dCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DX09SREVSX0JZX05BTUU7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgU0VMRUNUX0FMTF9OT19DQUNIRV9PQy5zZXRGaWx0ZXJTdHJpbmcoIioiKTsKLSAgICAgICAgU0VMRUNUX0FMTF9OT19DQUNIRV9PQy5zZXRDYWNoZUVuYWJsZWQoZmFsc2UpOwotICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DLnNldEluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKHRydWUpOwotICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DLnNldEluY2x1ZGVBY2xzKHRydWUpOwotICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DLnNldEluY2x1ZGVQYXRoU2VnbWVudHModHJ1ZSk7Ci0gICAgICAgIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0Muc2V0SW5jbHVkZVBvbGljaWVzKHRydWUpOwotICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DLnNldEluY2x1ZGVSZWxhdGlvbnNoaXBzKEluY2x1ZGVSZWxhdGlvbnNoaXBzLkJPVEgpOwotICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DLnNldFJlbmRpdGlvbkZpbHRlclN0cmluZygiKiIpOwotICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DLnNldE9yZGVyQnkobnVsbCk7Ci0KLSAgICAgICAgU0VMRUNUX0FMTF9OT19DQUNIRV9PQ19PUkRFUl9CWV9OQU1FID0gbmV3IE9wZXJhdGlvbkNvbnRleHRJbXBsKFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DX09SREVSX0JZX05BTUUuc2V0T3JkZXJCeSgiY21pczpuYW1lIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uRmFjdG9yeSBmYWN0b3J5ID0gU2Vzc2lvbkZhY3RvcnlJbXBsLm5ld0luc3RhbmNlKCk7Ci0gICAgcHJpdmF0ZSBGb2xkZXIgdGVzdEZvbGRlcjsKLQotICAgIHByaXZhdGUgQm9vbGVhbiBzdXBwb3J0c1JlbGF0aW9uc2hpcHM7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHN1cHBvcnRzUG9saWNpZXM7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHN1cHBvcnRzSXRlbXM7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHN1cHBvcnRzU2Vjb25kYXJpZXM7Ci0KLSAgICBwdWJsaWMgQmluZGluZ1R5cGUgZ2V0QmluZGluZygpIHsKLSAgICAgICAgaWYgKGdldFBhcmFtZXRlcnMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gQmluZGluZ1R5cGUuZnJvbVZhbHVlKGdldFBhcmFtZXRlcnMoKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZSgpICsgIiAoIiArIGdldEJpbmRpbmcoKSArICIpIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgU3RyaW5nIHJlcElkID0gcGFyYW1ldGVycy5nZXQoU2Vzc2lvblBhcmFtZXRlci5SRVBPU0lUT1JZX0lEKTsKLSAgICAgICAgaWYgKChyZXBJZCAhPSBudWxsKSAmJiAocmVwSWQubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgc2Vzc2lvbiA9IGZhY3RvcnkuY3JlYXRlU2Vzc2lvbihwYXJhbWV0ZXJzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlc3Npb24gPSBmYWN0b3J5LmdldFJlcG9zaXRvcmllcyhwYXJhbWV0ZXJzKS5nZXQoMCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3dpdGNoIG9mZiB0aGUgY2FjaGUKLSAgICAgICAgc2Vzc2lvbi5nZXREZWZhdWx0Q29udGV4dCgpLnNldENhY2hlRW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJ1bihzZXNzaW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBGYXRhbFRlc3RFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChVTkVYUEVDVEVEX0VYQ0VQVElPTiwgIkV4Y2VwdGlvbjogIiArIGUsIGUsIHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLCAiRXJyb3I6ICIgKyBlcnIsIGVyciwgdHJ1ZSkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdGVzdEZvbGRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgcHJvdGVjdGVkIFJlcG9zaXRvcnlJbmZvIGdldFJlcG9zaXRvcnlJbmZvKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByaSA9IHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZXBvc2l0b3J5IGluZm8gaXMgbnVsbCEiLCB0cnVlKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwocmksIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICByZXR1cm4gcmk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGb2xkZXJUZXN0VHlwZUlkKCkgewotICAgICAgICBTdHJpbmcgb2JqZWN0VHlwZUlkID0gZ2V0UGFyYW1ldGVycygpLmdldChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0ZPTERFUl9UWVBFKTsKLSAgICAgICAgaWYgKG9iamVjdFR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYmplY3RUeXBlSWQgPSBUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0ZPTERFUl9UWVBFX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdFR5cGVJZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERvY3VtZW50VGVzdFR5cGVJZCgpIHsKLSAgICAgICAgU3RyaW5nIG9iamVjdFR5cGVJZCA9IGdldFBhcmFtZXRlcnMoKS5nZXQoVGVzdFBhcmFtZXRlcnMuREVGQVVMVF9ET0NVTUVOVF9UWVBFKTsKLSAgICAgICAgaWYgKG9iamVjdFR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYmplY3RUeXBlSWQgPSBUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0RPQ1VNRU5UX1RZUEVfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb2JqZWN0VHlwZUlkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SXRlbVRlc3RUeXBlSWQoKSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RUeXBlSWQgPSBnZXRQYXJhbWV0ZXJzKCkuZ2V0KFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfSVRFTV9UWVBFKTsKLSAgICAgICAgaWYgKG9iamVjdFR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYmplY3RUeXBlSWQgPSBUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0lURU1fVFlQRV9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvYmplY3RUeXBlSWQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZWNvbmRhcnlUZXN0VHlwZUlkKCkgewotICAgICAgICBTdHJpbmcgb2JqZWN0VHlwZUlkID0gZ2V0UGFyYW1ldGVycygpLmdldChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX1NFQ09OREFSWV9UWVBFKTsKLSAgICAgICAgaWYgKG9iamVjdFR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYmplY3RUeXBlSWQgPSBUZXN0UGFyYW1ldGVycy5ERUZBVUxUX1NFQ09OREFSWV9UWVBFX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iamVjdFR5cGVJZDsKLSAgICB9Ci0KLSAgICAvLyAtLS0gaGVscGVycyAtLS0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRBbGxQcm9wZXJ0aWVzKENtaXNPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXNrID0gbmV3IFN0cmluZ1tvYmplY3QuZ2V0VHlwZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCldOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChTdHJpbmcgcHJvcElkIDogb2JqZWN0LmdldFR5cGUoKS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXNrW2krK10gPSBwcm9wSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydGllc2s7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdGcm9tQ29udGVudFN0cmVhbShDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZW50U3RyZWFtID09IG51bGwgfHwgY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCksIElPVXRpbHMuVVRGOCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcls2NCAqIDEwMjRdOwotICAgICAgICAgICAgaW50IGI7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGIgPSByZWFkZXIucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChiID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYnVmZmVyLCAwLCBiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGIgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gaGFuZHkgY3JlYXRlIGFuZCBkZWxldGUgbWV0aG9kcyAtLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBmb2xkZXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZvbGRlciBjcmVhdGVGb2xkZXIoU2Vzc2lvbiBzZXNzaW9uLCBGb2xkZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gY3JlYXRlRm9sZGVyKHNlc3Npb24sIHBhcmVudCwgbmFtZSwgZ2V0Rm9sZGVyVGVzdFR5cGVJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZm9sZGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGb2xkZXIgY3JlYXRlRm9sZGVyKFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBvYmplY3RUeXBlSWQpIHsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJlbnQgaXMgbm90IHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdFR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgVHlwZSBJZCBpcyBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBPYmplY3RUeXBlIHR5cGU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihvYmplY3RUeXBlSWQpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChVTkVYUEVDVEVEX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgIkZvbGRlciB0eXBlICciICsgb2JqZWN0VHlwZUlkICsgIicgaXMgbm90IGF2YWlsYWJsZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlLCB0cnVlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChCb29sZWFuLkZBTFNFLmVxdWFscyh0eXBlLmlzQ3JlYXRhYmxlKCkpKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJGb2xkZXIgdHlwZSAnIiArIG9iamVjdFR5cGVJZCArICInIGlzIG5vdCBjcmVhdGFibGUhIiwgdHJ1ZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgb2JqZWN0VHlwZUlkKTsKLQotICAgICAgICBGb2xkZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZm9sZGVyCi0gICAgICAgICAgICByZXN1bHQgPSBwYXJlbnQuY3JlYXRlRm9sZGVyKHByb3BlcnRpZXMsIG51bGwsIG51bGwsIG51bGwsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLCAiRm9sZGVyIGNvdWxkIG5vdCBiZSBjcmVhdGVkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgZSwgdHJ1ZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9sZGVyIG5hbWUKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBuYW1lIGRvZXMgbm90IG1hdGNoISIsIGZhbHNlKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMobmFtZSwgcmVzdWx0LmdldE5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB0aGUgbmV3IGZvbGRlcgotICAgICAgICAgICAgU3RyaW5nW10gcHJvcGVydGllc1RvQ2hlY2sgPSBuZXcgU3RyaW5nW3Jlc3VsdC5nZXRUeXBlKCkuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLnNpemUoKV07Ci0KLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHByb3BJZCA6IHJlc3VsdC5nZXRUeXBlKCkuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllc1RvQ2hlY2tbaSsrXSA9IHByb3BJZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrT2JqZWN0KHNlc3Npb24sIHJlc3VsdCwgcHJvcGVydGllc1RvQ2hlY2ssICJOZXcgZm9sZGVyIG9iamVjdCBzcGVjIGNvbXBsaWFuY2UiKSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG9iamVjdCBwYXJlbnRzCi0gICAgICAgICAgICBMaXN0PEZvbGRlcj4gb2JqZWN0UGFyZW50cyA9IHJlc3VsdC5nZXRQYXJlbnRzKCk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk5ld2x5IGNyZWF0ZWQgZm9sZGVyIGhhcyBubyBvciBtb3JlIHRoYW4gb25lIHBhcmVudCEgSWQ6ICIgKyByZXN1bHQuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDEsIG9iamVjdFBhcmVudHMuc2l6ZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZpcnN0IG9iamVjdCBwYXJlbnQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgZm9sZGVyIGRvZXMgbm90IG1hdGNoIHBhcmVudCEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyByZXN1bHQuZ2V0SWQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRTaGFsbG93RXF1YWxzKHBhcmVudCwgb2JqZWN0UGFyZW50cy5nZXQoMCksIG51bGwsIGYpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBmb2xkZXIgcGFyZW50Ci0gICAgICAgICAgICBGb2xkZXIgZm9sZGVyUGFyZW50ID0gcmVzdWx0LmdldEZvbGRlclBhcmVudCgpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTmV3bHkgY3JlYXRlZCBmb2xkZXIgaGFzIG5vIGZvbGRlciBwYXJlbnQhIElkOiAiICsgcmVzdWx0LmdldElkKCksIHRydWUpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoZm9sZGVyUGFyZW50LCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIkZvbGRlciBwYXJlbnQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgZm9sZGVyIGRvZXMgbm90IG1hdGNoIHBhcmVudCEgSWQ6ICIgKyByZXN1bHQuZ2V0SWQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRTaGFsbG93RXF1YWxzKHBhcmVudCwgZm9sZGVyUGFyZW50LCBudWxsLCBmKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgY2hpbGRyZW4gb2YgcGFyZW50Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKENtaXNPYmplY3QgY2hpbGQgOiBwYXJlbnQuZ2V0Q2hpbGRyZW4oU0VMRUNUX0FMTF9OT19DQUNIRV9PQykpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQYXJlbnQgZm9sZGVyIGNvbnRhaW5zIGEgbnVsbCBjaGlsZCEiLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRJZCgpLmVxdWFscyhjaGlsZC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgYW5kIHBhcmVudCBjaGlsZCBkb24ndCBtYXRjaCEgSWQ6ICIgKyByZXN1bHQuZ2V0SWQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTaGFsbG93RXF1YWxzKHJlc3VsdCwgY2hpbGQsIG51bGwsIGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgaXMgbm90IGEgY2hpbGQgb2YgdGhlIHBhcmVudCBmb2xkZXIhIElkOiAiICsgcmVzdWx0LmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoVU5FWFBFQ1RFRF9FWENFUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICJOZXdseSBjcmVhdGVkIGZvbGRlciBpcyBpbnZhbGlkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3VudHMgdGhlIGNoaWxkcmVuIGluIGEgZm9sZGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgY291bnRGb2xkZXJDaGlsZHJlbihGb2xkZXIgZm9sZGVyKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgZm9yIChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgQ21pc09iamVjdCBvYmplY3QgOiBmb2xkZXIuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCBwYXJlbnQsIG5hbWUsIGdldERvY3VtZW50VGVzdFR5cGVJZCgpLCBudWxsLCBjb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBvYmplY3RUeXBlSWQsCi0gICAgICAgICAgICBTdHJpbmdbXSBzZWNvbmRhcnlUeXBlSWRzLCBTdHJpbmcgY29udGVudCkgewotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmVudCBpcyBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0VHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBUeXBlIElkIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZW50ID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIE9iamVjdFR5cGUgdHlwZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKG9iamVjdFR5cGVJZCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgdHlwZSAnIiArIG9iamVjdFR5cGVJZCArICInIGlzIG5vdCBhdmFpbGFibGU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQm9vbGVhbi5GQUxTRS5lcXVhbHModHlwZS5pc0NyZWF0YWJsZSgpKSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiRG9jdW1lbnQgdHlwZSAnIiArIG9iamVjdFR5cGVJZCArICInIGlzIG5vdCBjcmVhdGFibGUhIiwgdHJ1ZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgb2JqZWN0VHlwZUlkKTsKLQotICAgICAgICBpZiAoc2Vjb25kYXJ5VHlwZUlkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTLCBBcnJheXMuYXNMaXN0KHNlY29uZGFyeVR5cGVJZHMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKG9iamVjdFR5cGVJZCk7Ci0gICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGVEZWZpbml0aW9uKSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBpcyBub3QgYSBkb2N1bWVudCB0eXBlISBUeXBlOiAiICsgb2JqZWN0VHlwZUlkLCB0cnVlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gZG9jVHlwZSA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlOwotICAgICAgICBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlID0gKEJvb2xlYW4uVFJVRS5lcXVhbHMoZG9jVHlwZS5pc1ZlcnNpb25hYmxlKCkpID8gVmVyc2lvbmluZ1N0YXRlLk1BSk9SCi0gICAgICAgICAgICAgICAgOiBWZXJzaW9uaW5nU3RhdGUuTk9ORSk7Ci0KLSAgICAgICAgYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IG51bGw7Ci0gICAgICAgIERvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250ZW50Qnl0ZXMgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKGNvbnRlbnQpOwotICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKG5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihjb250ZW50Qnl0ZXMubGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgInRleHQvcGxhaW4iLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudEJ5dGVzKSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgIHJlc3VsdCA9IHBhcmVudC5jcmVhdGVEb2N1bWVudChwcm9wZXJ0aWVzLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICBjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLCAiRG9jdW1lbnQgY291bGQgbm90IGJlIGNyZWF0ZWQhIEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICBlLCB0cnVlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgICAgICAvLyBjaGVjayBkb2N1bWVudCBuYW1lCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBuYW1lIGRvZXMgbm90IG1hdGNoISIsIGZhbHNlKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMobmFtZSwgcmVzdWx0LmdldE5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBjb250ZW50IGxlbmd0aAotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ29udGVudCBsZW5ndGggZG9lcyBub3QgbWF0Y2ghIiwgZmFsc2UpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygobG9uZykgY29udGVudEJ5dGVzLmxlbmd0aCwgcmVzdWx0LmdldENvbnRlbnRTdHJlYW1MZW5ndGgoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB0aGUgbmV3IGRvY3VtZW50Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcmVzdWx0LCBnZXRBbGxQcm9wZXJ0aWVzKHJlc3VsdCksICJOZXcgZG9jdW1lbnQgb2JqZWN0IHNwZWMgY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSByZXN1bHQuZ2V0Q29udGVudFN0cmVhbSgpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRG9jdW1lbnQgZmlsZW5hbWUgYW5kIHRoZSBmaWxlbmFtZSBvZiB0aGUgY29udGVudCBzdHJlYW0gZG8gbm90IG1hdGNoISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhuYW1lLCBjb250ZW50U3RyZWFtLmdldEZpbGVOYW1lKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbWlzOmNvbnRlbnRTdHJlYW1GaWxlTmFtZSBhbmQgdGhlIGZpbGVuYW1lIG9mIHRoZSBjb250ZW50IHN0cmVhbSBkbyBub3QgbWF0Y2ghIiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMocmVzdWx0LmdldENvbnRlbnRTdHJlYW1GaWxlTmFtZSgpLCBjb250ZW50U3RyZWFtLmdldEZpbGVOYW1lKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBmZXRjaGVkQ29udGVudCA9IGdldFN0cmluZ0Zyb21Db250ZW50U3RyZWFtKHJlc3VsdC5nZXRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgIGlmICghY29udGVudC5lcXVhbHMoZmV0Y2hlZENvbnRlbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudCBvZiBuZXdseSBjcmVhdGVkIGRvY3VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIG9yaWduIGNvbnRlbnQhIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQgb2YgbmV3bHkgY3JlYXRlZCBkb2N1bWVudCBjb3VsZG4ndCBiZSByZWFkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAiTmV3bHkgY3JlYXRlZCBkb2N1bWVudCBpcyBpbnZhbGlkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgcGFyZW50cwotICAgICAgICBMaXN0PEZvbGRlcj4gcGFyZW50cyA9IHJlc3VsdC5nZXRQYXJlbnRzKFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoRm9sZGVyIGZvbGRlciA6IHBhcmVudHMpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQuZ2V0SWQoKS5lcXVhbHMoZm9sZGVyLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAiVGhlIGZvbGRlciB0aGUgZG9jdW1lbnQgaGFzIGJlZW4gY3JlYXRlZCBpbiBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgdGhlIGRvY3VtZW50IHBhcmVudHMhIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVsYXRpb25zaGlwLgotICAgICAqLwotICAgIHByb3RlY3RlZCBSZWxhdGlvbnNoaXAgY3JlYXRlUmVsYXRpb25zaGlwKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIG5hbWUsIE9iamVjdElkIHNvdXJjZSwgT2JqZWN0SWQgdGFyZ2V0KSB7Ci0gICAgICAgIFN0cmluZyBvYmplY3RUeXBlSWQgPSBnZXRQYXJhbWV0ZXJzKCkuZ2V0KFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfUkVMQVRJT05TSElQX1RZUEUpOwotICAgICAgICBpZiAob2JqZWN0VHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIG9iamVjdFR5cGVJZCA9IFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfUkVMQVRJT05TSElQX1RZUEVfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3JlYXRlUmVsYXRpb25zaGlwKHNlc3Npb24sIG5hbWUsIHNvdXJjZSwgdGFyZ2V0LCBvYmplY3RUeXBlSWQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZWxhdGlvbnNoaXAuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlbGF0aW9uc2hpcCBjcmVhdGVSZWxhdGlvbnNoaXAoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgbmFtZSwgT2JqZWN0SWQgc291cmNlLCBPYmplY3RJZCB0YXJnZXQsCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0VHlwZUlkKSB7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqZWN0VHlwZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9iamVjdCBUeXBlIElkIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgIE9iamVjdFR5cGUgdHlwZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKG9iamVjdFR5cGVJZCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLCAiUmVsYXRpb25zaGlwIHR5cGUgJyIgKyBvYmplY3RUeXBlSWQgKyAiJyBpcyBub3QgYXZhaWxhYmxlOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUsIHRydWUpKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEJvb2xlYW4uRkFMU0UuZXF1YWxzKHR5cGUuaXNDcmVhdGFibGUoKSkpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlJlbGF0aW9uc2hpcCB0eXBlICciICsgb2JqZWN0VHlwZUlkICsgIicgaXMgbm90IGNyZWF0YWJsZSEiLCB0cnVlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBvYmplY3RUeXBlSWQpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQsIHNvdXJjZS5nZXRJZCgpKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuVEFSR0VUX0lELCB0YXJnZXQuZ2V0SWQoKSk7Ci0KLSAgICAgICAgT2JqZWN0SWQgcmVsSWQ7Ci0gICAgICAgIFJlbGF0aW9uc2hpcCByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWxJZCA9IHNlc3Npb24uY3JlYXRlUmVsYXRpb25zaGlwKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgcmVzdWx0ID0gKFJlbGF0aW9uc2hpcCkgc2Vzc2lvbi5nZXRPYmplY3QocmVsSWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChVTkVYUEVDVEVEX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgIlJlbGF0aW9uc2hpcCBjb3VsZCBub3QgYmUgY3JlYXRlZCEgRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIGUsIHRydWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgbmV3IHJlbGF0aW9uc2hpcAotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCByZXN1bHQsIGdldEFsbFByb3BlcnRpZXMocmVzdWx0KSwgIk5ldyBkb2N1bWVudCBvYmplY3Qgc3BlYyBjb21wbGlhbmNlIikpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoVU5FWFBFQ1RFRF9FWENFUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAiTmV3bHkgY3JlYXRlZCBkb2N1bWVudCBpcyBpbnZhbGlkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgaXRlbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlbSBjcmVhdGVJdGVtKFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUl0ZW0oc2Vzc2lvbiwgcGFyZW50LCBuYW1lLCBnZXRJdGVtVGVzdFR5cGVJZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgaXRlbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSXRlbSBjcmVhdGVJdGVtKFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBvYmplY3RUeXBlSWQpIHsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJlbnQgaXMgbm90IHNldCEiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOYW1lIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdFR5cGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPYmplY3QgVHlwZSBJZCBpcyBub3Qgc2V0ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdHlwZQotICAgICAgICBPYmplY3RUeXBlIHR5cGU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihvYmplY3RUeXBlSWQpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChVTkVYUEVDVEVEX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgIkl0ZW0gdHlwZSAnIiArIG9iamVjdFR5cGVJZCArICInIGlzIG5vdCBhdmFpbGFibGU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQm9vbGVhbi5GQUxTRS5lcXVhbHModHlwZS5pc0NyZWF0YWJsZSgpKSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiSXRlbSB0eXBlICciICsgb2JqZWN0VHlwZUlkICsgIicgaXMgbm90IGNyZWF0YWJsZSEiLCB0cnVlKSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBvYmplY3RUeXBlSWQpOwotCi0gICAgICAgIEl0ZW0gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgaXRlbQotICAgICAgICAgICAgcmVzdWx0ID0gcGFyZW50LmNyZWF0ZUl0ZW0ocHJvcGVydGllcywgbnVsbCwgbnVsbCwgbnVsbCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoVU5FWFBFQ1RFRF9FWENFUFRJT04sICJJdGVtIGNvdWxkIG5vdCBiZSBjcmVhdGVkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaXRlbSBuYW1lCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJJdGVtIG5hbWUgZG9lcyBub3QgbWF0Y2ghIiwgZmFsc2UpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhuYW1lLCByZXN1bHQuZ2V0TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCByZXN1bHQsIGdldEFsbFByb3BlcnRpZXMocmVzdWx0KSwgIk5ldyBpdGVtIG9iamVjdCBzcGVjIGNvbXBsaWFuY2UiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoVU5FWFBFQ1RFRF9FWENFUFRJT04sICJOZXdseSBjcmVhdGVkIEl0ZW0gaXMgaW52YWxpZCEgRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgIGUsIHRydWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHBhcmVudHMKLSAgICAgICAgTGlzdDxGb2xkZXI+IHBhcmVudHMgPSByZXN1bHQuZ2V0UGFyZW50cyhTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKEZvbGRlciBmb2xkZXIgOiBwYXJlbnRzKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50LmdldElkKCkuZXF1YWxzKGZvbGRlci5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBmb2xkZXIgdGhlIGl0ZW0gaGFzIGJlZW4gY3JlYXRlZCBpbiBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgdGhlIGl0ZW0gcGFyZW50cyEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYW4gb2JqZWN0IGFuZCBjaGVja3MgaWYgaXQgaXMgZGVsZXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVPYmplY3QoQ21pc09iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgKChGb2xkZXIpIG9iamVjdCkuZGVsZXRlVHJlZSh0cnVlLCBudWxsLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoVU5FWFBFQ1RFRF9FWENFUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvbGRlciBjb3VsZCBub3QgYmUgZGVsZXRlZCEgRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIGUsIHRydWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFVORVhQRUNURURfRVhDRVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgY291bGQgbm90IGJlIGRlbGV0ZWQhIEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJPYmplY3Qgc2hvdWxkIG5vdCBleGlzdCBhbnltb3JlIGJ1dCBpdCBpcyBzdGlsbCB0aGVyZSEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBvYmplY3QuZ2V0SWQoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNGYWxzZShleGlzdHMob2JqZWN0KSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgaWYgYW4gb2JqZWN0IGV4aXN0cyBieSByZWZyZXNoaW5nIGl0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4aXN0cyhDbWlzT2JqZWN0IG9iamVjdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqZWN0LnJlZnJlc2goKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tIHR5cGUgaGVscGVycyAtLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgdHlwZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0VHlwZSBjcmVhdGVUeXBlKFNlc3Npb24gc2Vzc2lvbiwgVHlwZURlZmluaXRpb24gdHlwZURlZikgewotCi0gICAgICAgIE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgc2V0dGFibGVBdHRyaWJ1dGVzID0gc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldENhcGFiaWxpdGllcygpCi0gICAgICAgICAgICAgICAgLmdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJSZXBvc2l0b3J5IEluZm8gZG9lcyBub3QgaW5kaWNhdGUsIHdoaWNoIHR5cGUgYXR0cmlidXRlcyBjYW4gYmUgc2V0ISIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHRlc3RzCi0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RUeXBlIG5ld1R5cGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3VHlwZSA9IHNlc3Npb24uY3JlYXRlVHlwZSh0eXBlRGVmKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJDcmVhdGVkIHR5cGUgJyIgKyB0eXBlRGVmLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiJy4gUmVwb3NpdG9yeSBhc3NpZ25lZCB0aGUgZm9sbG93aW5nIHR5cGUgaWQ6ICIgKyBuZXdUeXBlLmdldElkKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ3JlYXRpbmcgdHlwZSAnIiArIHR5cGVEZWYuZ2V0SWQoKSArICInIGZhaWxlZDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlLAotICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRSZXN1bHQoY2hlY2tUeXBlRGVmaW5pdGlvbihzZXNzaW9uLCBuZXdUeXBlLCAiTmV3bHkgY3JlYXRlZCB0eXBlIHNwZWMgY29tcGxpYW5jZS4iKSk7Ci0KLSAgICAgICAgaWYgKG5ld1R5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICJOZXdseSBjcmVhdGVkIHR5cGUgZG9lcyBub3QgcHJvdmlkZSB0eXBlIG11dGFiaWxpdHkgZGF0YSEgSWQ6ICIgKyBuZXdUeXBlLmdldElkKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXdUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSB0eXBlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZVR5cGUoU2Vzc2lvbiBzZXNzaW9uLCBTdHJpbmcgdHlwZUlkKSB7Ci0gICAgICAgIE9iamVjdFR5cGUgdHlwZSA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24odHlwZUlkKTsKLQotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUeXBlIGRvZXMgbm90IGV4aXN0IGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGRlbGV0ZWQhIElkOiAiICsgdHlwZUlkKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBpZiB0eXBlIGNhbiBiZSBkZWxldGVkCi0gICAgICAgIGlmICh0eXBlLmdldFR5cGVNdXRhYmlsaXR5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBkb2VzIG5vdCBwcm92aWRlIHR5cGUgbXV0YWJpbGl0eSBkYXRhISBJZDogIiArIHR5cGVJZCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKHR5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKS5jYW5EZWxldGUoKSkpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJUeXBlIGluZGljYXRlcyB0aGF0IGl0IGNhbm5vdCBiZSBkZWxldGVkLiBUcnlpbmcgaXQgYW55d2F5LiBJZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlSWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlbGV0ZSBpdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbi5kZWxldGVUeXBlKHR5cGVJZCk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRlbGV0aW5nIHR5cGUgJyIgKyB0eXBlSWQgKyAiJyBmYWlsZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgZmFsc2UpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0eXBlIHN0aWxsIGV4aXN0cwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBzaG91bGQgbm90IGV4aXN0IGFueW1vcmUgYnV0IGl0IGlzIHN0aWxsIHRoZXJlISBJZDogIiArIHR5cGVJZCwgdHJ1ZSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcmVzdWx0Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0gdGVzdCBmb2xkZXIgbWV0aG9kcyAtLS0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB0ZXN0IGZvbGRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRm9sZGVyIGNyZWF0ZVRlc3RGb2xkZXIoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0KLSAgICAgICAgU3RyaW5nIHRlc3RGb2xkZXJQYXJlbnRQYXRoID0gZ2V0UGFyYW1ldGVycygpLmdldChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX1RFU1RfRk9MREVSX1BBUkVOVCk7Ci0gICAgICAgIGlmICh0ZXN0Rm9sZGVyUGFyZW50UGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXN0Rm9sZGVyUGFyZW50UGF0aCA9IFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfVEVTVF9GT0xERVJfUEFSRU5UX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiY21pc3RjayIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5oYXNoQ29kZSgpOwotCi0gICAgICAgIEZvbGRlciBwYXJlbnQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ21pc09iamVjdCBwYXJlbnRPYmplY3QgPSBzZXNzaW9uLmdldE9iamVjdEJ5UGF0aCh0ZXN0Rm9sZGVyUGFyZW50UGF0aCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0gICAgICAgICAgICBpZiAoIShwYXJlbnRPYmplY3QgaW5zdGFuY2VvZiBGb2xkZXIpKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUGFyZW50IGZvbGRlciBvZiB0aGUgdGVzdCBmb2xkZXIgaXMgYWN0dWFsbHkgbm90IGEgZm9sZGVyISBQYXRoOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRlc3RGb2xkZXJQYXJlbnRQYXRoLCB0cnVlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhcmVudCA9IChGb2xkZXIpIHBhcmVudE9iamVjdDsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChVTkVYUEVDVEVEX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgIlRlc3QgZm9sZGVyIGNvdWxkIG5vdCBiZSBjcmVhdGVkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXN0Rm9sZGVyID0gY3JlYXRlRm9sZGVyKHNlc3Npb24sIHBhcmVudCwgbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGVzdEZvbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHRlc3QgZm9sZGVyLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGb2xkZXIgZ2V0VGVzdEZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RGb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVsZXRlIHRoZSB0ZXN0IGZvbGRlci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVUZXN0Rm9sZGVyKCkgewotICAgICAgICBkZWxldGVPYmplY3QodGVzdEZvbGRlcik7Ci0gICAgfQotCi0gICAgLy8gLS0tIHJldXNhYmxlIGNoZWNrcyAtLS0tCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dldERlc2NlbmRhbnRzU3VwcG9ydGVkKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzIGNhcCA9IHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKTsKLQotICAgICAgICBpZiAoY2FwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYXAuaXNHZXREZXNjZW5kYW50c1N1cHBvcnRlZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYXAuaXNHZXREZXNjZW5kYW50c1N1cHBvcnRlZCgpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZChTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBjYXAgPSBzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q2FwYWJpbGl0aWVzKCk7Ci0KLSAgICAgICAgaWYgKGNhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FwLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYXAuaXNHZXRGb2xkZXJUcmVlU3VwcG9ydGVkKCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPcmRlckJ5TmFtZVN1cHBvcnRlZChTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRPcmRlckJ5Q2FwYWJpbGl0eSgpID09IENhcGFiaWxpdHlPcmRlckJ5Lk5PTkUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1JlbGF0aW9uc2hpcHMoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGlmIChzdXBwb3J0c1JlbGF0aW9uc2hpcHMgPT0gbnVsbCkgewotICAgICAgICAgICAgc3VwcG9ydHNSZWxhdGlvbnNoaXBzID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0VHlwZSB0eXBlIDogc2Vzc2lvbi5nZXRUeXBlQ2hpbGRyZW4obnVsbCwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVAudmFsdWUoKS5lcXVhbHModHlwZS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c1JlbGF0aW9uc2hpcHMgPSBCb29sZWFuLlRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBwb3J0c1JlbGF0aW9uc2hpcHMuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzUG9saWNpZXMoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGlmIChzdXBwb3J0c1BvbGljaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHN1cHBvcnRzUG9saWNpZXMgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgZm9yIChPYmplY3RUeXBlIHR5cGUgOiBzZXNzaW9uLmdldFR5cGVDaGlsZHJlbihudWxsLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoQmFzZVR5cGVJZC5DTUlTX1BPTElDWS52YWx1ZSgpLmVxdWFscyh0eXBlLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzUG9saWNpZXMgPSBCb29sZWFuLlRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBwb3J0c1BvbGljaWVzLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc0l0ZW1zKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBpZiAoc3VwcG9ydHNJdGVtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzdXBwb3J0c0l0ZW1zID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0VHlwZSB0eXBlIDogc2Vzc2lvbi5nZXRUeXBlQ2hpbGRyZW4obnVsbCwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEJhc2VUeXBlSWQuQ01JU19JVEVNLnZhbHVlKCkuZXF1YWxzKHR5cGUuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNJdGVtcyA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRzSXRlbXMuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzU2Vjb25kYXJpZXMoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGlmIChzdXBwb3J0c1NlY29uZGFyaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHN1cHBvcnRzU2Vjb25kYXJpZXMgPSBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgZm9yIChPYmplY3RUeXBlIHR5cGUgOiBzZXNzaW9uLmdldFR5cGVDaGlsZHJlbihudWxsLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWS52YWx1ZSgpLmVxdWFscyh0eXBlLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzU2Vjb25kYXJpZXMgPSBCb29sZWFuLlRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBwb3J0c1NlY29uZGFyaWVzLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBjaGVja09iamVjdChTZXNzaW9uIHNlc3Npb24sIENtaXNPYmplY3Qgb2JqZWN0LCBTdHJpbmdbXSBwcm9wZXJ0aWVzLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk9iamVjdCBpcyBudWxsISIsIHRydWUpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChvYmplY3QsIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk9iamVjdCBpZCBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KG9iamVjdC5nZXRJZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNyZWF0aW9uRGF0ZSA9IG51bGw7Ci0gICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBsYXN0TW9kaWZpY2F0aW9uRGF0ZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHByb3BJZCA6IHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eTw/PiBwcm9wID0gb2JqZWN0LmdldFByb3BlcnR5KHByb3BJZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgb2Ygbm9uLXNwZWMgcHJvcGVydGllcyBhcmUgbm90IGNoZWNrZWQgaGVyZQotICAgICAgICAgICAgICAgIFByb3BlcnR5Q2hlY2tFbnVtIHByb3BlcnR5Q2hlY2sgPSBQcm9wZXJ0eUNoZWNrRW51bS5OT19WQUxVRV9DSEVDSzsKLQotICAgICAgICAgICAgICAgIC8vIGtub3duIHByb3BlcnRpZXMgdGhhdCBhcmUgc3RyaW5ncyBhbmQgbXVzdCBiZSBzZXQKLSAgICAgICAgICAgICAgICBpZiAoUHJvcGVydHlJZHMuT0JKRUNUX0lELmVxdWFscyhwcm9wSWQpIHx8IFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRC5lcXVhbHMocHJvcElkKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQuZXF1YWxzKHByb3BJZCkgfHwgUHJvcGVydHlJZHMuUEFUSC5lcXVhbHMocHJvcElkKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgUHJvcGVydHlJZHMuU09VUkNFX0lELmVxdWFscyhwcm9wSWQpIHx8IFByb3BlcnR5SWRzLlRBUkdFVF9JRC5lcXVhbHMocHJvcElkKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNoZWNrID0gUHJvcGVydHlDaGVja0VudW0uU1RSSU5HX01VU1RfTk9UX0JFX0VNUFRZOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFByb3BlcnR5SWRzLkNSRUFURURfQlkuZXF1YWxzKHByb3BJZCkgfHwgUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWS5lcXVhbHMocHJvcElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDaGVjayA9IFByb3BlcnR5Q2hlY2tFbnVtLlNUUklOR19NVVNUX05PVF9CRV9FTVBUWTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGtub3duIHByb3BlcnRpZXMgdGhhdCBhcmUgc3RyaW5ncyBhbmQgc2hvdWxkIGJlIHNldAotICAgICAgICAgICAgICAgIGlmIChQcm9wZXJ0eUlkcy5OQU1FLmVxdWFscyhwcm9wSWQpIHx8IFByb3BlcnR5SWRzLlBPTElDWV9URVhULmVxdWFscyhwcm9wSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q2hlY2sgPSBQcm9wZXJ0eUNoZWNrRW51bS5TVFJJTkdfU0hPVUxEX05PVF9CRV9FTVBUWTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBrbm93biBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBzdHJpbmdzIGFuZCBtdXN0IGJlIHNldAotICAgICAgICAgICAgICAgIGlmIChQcm9wZXJ0eUlkcy5JU19JTU1VVEFCTEUuZXF1YWxzKHByb3BJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDaGVjayA9IFByb3BlcnR5Q2hlY2tFbnVtLk1VU1RfQkVfU0VUOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUuZXF1YWxzKHByb3BJZCkgfHwgUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURS5lcXVhbHMocHJvcElkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDaGVjayA9IFByb3BlcnR5Q2hlY2tFbnVtLk1VU1RfQkVfU0VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBwYXJlbnQKLSAgICAgICAgICAgICAgICBpZiAoUHJvcGVydHlJZHMuUEFSRU5UX0lELmVxdWFscyhwcm9wSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKEZvbGRlcikgb2JqZWN0KS5pc1Jvb3RGb2xkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q2hlY2sgPSBQcm9wZXJ0eUNoZWNrRW51bS5NVVNUX05PVF9CRV9TRVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q2hlY2sgPSBQcm9wZXJ0eUNoZWNrRW51bS5TVFJJTkdfTVVTVF9OT1RfQkVfRU1QVFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUHJvcGVydHkgIiArIFByb3BlcnR5SWRzLlBBUkVOVF9JRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBvbmx5IGRlZmluZWQgZm9yIGZvbGRlcnMhIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBwYXRoCi0gICAgICAgICAgICAgICAgaWYgKFByb3BlcnR5SWRzLlBBVEguZXF1YWxzKHByb3BJZCkgJiYgcHJvcC5nZXRGaXJzdFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGF0aCA9IHByb3AuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUGF0aCBkb2VzIG5vdCBzdGFydCB3aXRoICcvJzogIiArIHBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydElzVHJ1ZSgoKFN0cmluZykgcGF0aCkubGVuZ3RoKCkgPiAwICYmICgoU3RyaW5nKSBwYXRoKS5jaGFyQXQoMCkgPT0gJy8nLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuUEFUSCArICIgaXMgbm90IGEgc3RyaW5nISIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNoZWNrUHJvcGVydHkocHJvcCwgIlByb3BlcnR5ICIgKyBwcm9wSWQsIHByb3BlcnR5Q2hlY2spKTsKLQotICAgICAgICAgICAgICAgIC8vIGNhdGNoIGNyZWF0aW9uRGF0ZSBhbmQgbGFzdE1vZGlmaWNhdGlvbkRhdGUKLSAgICAgICAgICAgICAgICBpZiAoUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURS5lcXVhbHMocHJvcElkKSkgewotICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbkRhdGUgPSAoR3JlZ29yaWFuQ2FsZW5kYXIpIHByb3AuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURS5lcXVhbHMocHJvcElkKSkgewotICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpY2F0aW9uRGF0ZSA9IChHcmVnb3JpYW5DYWxlbmRhcikgcHJvcC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBjcmVhdGlvbkRhdGUgPD0gbGFzdE1vZGlmaWNhdGlvbkRhdGUKLSAgICAgICAgICAgIGlmIChjcmVhdGlvbkRhdGUgIT0gbnVsbCAmJiBsYXN0TW9kaWZpY2F0aW9uRGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTGFzdCBtb2RpZmljYXRpb24gZGF0ZSBwcmVjZWRlcyBjcmVhdGlvbiBkYXRlISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXNUcnVlKGNyZWF0aW9uRGF0ZS5nZXRUaW1lSW5NaWxsaXMoKSA8PSBsYXN0TW9kaWZpY2F0aW9uRGF0ZS5nZXRUaW1lSW5NaWxsaXMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ3JlYXRpb24gZGF0ZSBhbmQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSBoYXZlIGRpZmZlcmVudCB0aW1lem9uZXMuIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzVHJ1ZShjcmVhdGlvbkRhdGUuZ2V0VGltZVpvbmUoKS5oYXNTYW1lUnVsZXMobGFzdE1vZGlmaWNhdGlvbkRhdGUuZ2V0VGltZVpvbmUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFsbG93YWJsZSBhY3Rpb25zCi0gICAgICAgICAgICBpZiAoKG9iamVjdC5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkgfHwgKG9iamVjdC5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiT2JqZWN0IGhhcyBubyBhbGxvd2FibGUgYWN0aW9ucyEiKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNldDxBY3Rpb24+IGFjdGlvbnMgPSBvYmplY3QuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk9iamVjdCBoYXMgbm8gQ0FOX0dFVF9QUk9QRVJUSUVTIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fR0VUX1BST1BFUlRJRVMsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNUcnVlKG9iamVjdC5oYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uLkNBTl9HRVRfUFJPUEVSVElFUyksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0NIRUNLX09VVCkgJiYgYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0NIRUNLX0lOKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgb2JqZWN0IGhhcyBDQU5fQ0hFQ0tfT1VUIGFuZCBDQU5fQ0hFQ0tfSU4gYWxsb3dhYmxlIGFjdGlvbnMhIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9DSEVDS19PVVQpICYmIGFjdGlvbnMuY29udGFpbnMoQWN0aW9uLkNBTl9DQU5DRUxfQ0hFQ0tfT1VUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgb2JqZWN0IGhhcyBDQU5fQ0hFQ0tfT1VUIGFuZCBDQU5fQ0FOQ0VMX0NIRUNLX09VVCBhbGxvd2FibGUgYWN0aW9ucyEiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2NUeXBlID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pIGRvYy5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb2MuaXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2MuaXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRG9jdW1lbnQgaXMgY2hlY2tlZCBvdXQgYW5kIGhhcyBDQU5fQ0hFQ0tfT1VUIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fQ0hFQ0tfT1VULCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jLmdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50IGlzIGNoZWNrZWQgb3V0IGFuZCBidXQgdGhlIHByb3BlcnR5IGNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCBpcyBub3Qgc2V0ISIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jLmdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQoKS5lcXVhbHMob2JqZWN0LmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QgaXMgUFdDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQV0MgZG9lc24ndCBoYXZlIENBTl9DSEVDS19JTiBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fQ0hFQ0tfSU4sIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUFdDIGRvZXNuJ3QgaGF2ZSBDQU5fQ0FOQ0VMX0NIRUNLX09VVCBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fQ0FOQ0VMX0NIRUNLX09VVCwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0IGlzIG5vdCBQV0MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIk5vbi1QV0MgaGFzIENBTl9DSEVDS19JTiBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fQ0hFQ0tfSU4sIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiTm9uLVBXQyBoYXMgQ0FOX0NBTkNFTF9DSEVDS19PVVQgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX0NBTkNFTF9DSEVDS19PVVQsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50IGlzIG5vdCBjaGVja2VkIG91dCBhbmQgaGFzIENBTl9DSEVDS19JTiBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX0NIRUNLX0lOLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgaXMgbm90IGNoZWNrZWQgb3V0IGFuZCBoYXMgQ0FOX0NBTkNFTF9DSEVDS19PVVQgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9DQU5DRUxfQ0hFQ0tfT1VULCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJzaW9uYWJsZSBjaGVjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2NUeXBlLmlzVmVyc2lvbmFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhkb2MuaXNMYXRlc3RWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N1bWVudCBpcyB2ZXJzaW9uYWJsZSBhbmQgbm90IGNoZWNrZWQgYnV0IGhhcyBubyBDQU5fQ0hFQ0tfT1VUIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9DSEVDS19PVVQsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgaXMgbm90IHZlcnNpb25hYmxlIGJ1dCBoYXMgQ0FOX0NIRUNLX09VVCBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9DSEVDS19PVVQsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJQcm9wZXJ0eSBjbWlzOmlzVmVyc2lvblNlcmllc0NoZWNrZWRPdXQgaXMgbm90IHNldCEiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBpbW11dGFibGUgY2hlY2sKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZG9jLmlzSW1tdXRhYmxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N1bWVudCBpcyBpbW11dGFibGUgYW5kIGhhcyBDQU5fVVBEQVRFX1BST1BFUlRJRVMgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX1VQREFURV9QUk9QRVJUSUVTLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IGlzIGltbXV0YWJsZSBhbmQgaGFzIENBTl9ERUxFVEVfT0JKRUNUIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9ERUxFVEVfT0JKRUNULCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOb24tRG9jdW1lbnQgb2JqZWN0IGhhcyBDQU5fQ0hFQ0tfSU4gYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fQ0hFQ0tfSU4sIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOb24tRG9jdW1lbnQgb2JqZWN0IGhhcyBDQU5fQ0hFQ0tfT1VUIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX0NIRUNLX09VVCwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk5vbi1Eb2N1bWVudCBvYmplY3QgaGFzIENBTl9DQU5DRUxfQ0hFQ0tfT1VUIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX0NBTkNFTF9DSEVDS19PVVQsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOb24tRG9jdW1lbnQgb2JqZWN0IGhhcyBDQU5fR0VUX0NPTlRFTlRfU1RSRUFNIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX0dFVF9DT05URU5UX1NUUkVBTSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk5vbi1Eb2N1bWVudCBvYmplY3QgaGFzIENBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0gYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fREVMRVRFX0NPTlRFTlRfU1RSRUFNLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTm9uLURvY3VtZW50IG9iamVjdCBoYXMgQ0FOX0dFVF9BTExfVkVSU0lPTlMgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fR0VUX0FMTF9WRVJTSU9OUywgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgRm9sZGVyIGZvbGRlciA9IChGb2xkZXIpIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGRlci5pc1Jvb3RGb2xkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUm9vdCBmb2xkZXIgaGFzIENBTl9ERUxFVEVfT0JKRUNUIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9ERUxFVEVfT0JKRUNULCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJvb3QgZm9sZGVyIGhhcyBDQU5fR0VUX0ZPTERFUl9QQVJFTlQgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX0dFVF9GT0xERVJfUEFSRU5ULCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJvb3QgZm9sZGVyIGhhcyBDQU5fTU9WRV9PQkpFQ1QgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX01PVkVfT0JKRUNULCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOb24tRm9sZGVyIG9iamVjdCBoYXMgQ0FOX0dFVF9ERVNDRU5EQU5UUyBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9HRVRfREVTQ0VOREFOVFMsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOb24tRm9sZGVyIG9iamVjdCBoYXMgQ0FOX0dFVF9GT0xERVJfUEFSRU5UIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX0dFVF9GT0xERVJfUEFSRU5ULCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTm9uLUZvbGRlciBvYmplY3QgaGFzIENBTl9HRVRfQ0hJTERSRU4gYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fR0VUX0NISUxEUkVOLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTm9uLUZvbGRlciBvYmplY3QgaGFzIENBTl9ERUxFVEVfVFJFRSBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9ERUxFVEVfVFJFRSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk5vbi1Gb2xkZXIgb2JqZWN0IGhhcyBDQU5fR0VUX0ZPTERFUl9QQVJFTlQgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fR0VUX0ZPTERFUl9QQVJFTlQsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOb24tRm9sZGVyIG9iamVjdCBoYXMgQ0FOX0NSRUFURV9ET0NVTUVOVCBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9DUkVBVEVfRE9DVU1FTlQsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOb24tRm9sZGVyIG9iamVjdCBoYXMgQ0FOX0NSRUFURV9GT0xERVIgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fQ1JFQVRFX0ZPTERFUiwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEZpbGVhYmxlQ21pc09iamVjdCkgfHwgKG9iamVjdCBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb24tRmlsYWJsZSBvYmplY3Qgb3IgZm9sZGVyIGhhcyBDQU5fQUREX09CSkVDVF9UT19GT0xERVIgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihvYmplY3QsIEFjdGlvbi5DQU5fQUREX09CSkVDVF9UT19GT0xERVIsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1GaWxhYmxlIG9iamVjdCBvciBmb2xkZXIgaGFzIENBTl9SRU1PVkVfT0JKRUNUX0ZST01fRk9MREVSIGFsbG93YWJsZSBhY3Rpb24hIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3RBbGxvd2FibGVBY3Rpb24ob2JqZWN0LCBBY3Rpb24uQ0FOX1JFTU9WRV9PQkpFQ1RfRlJPTV9GT0xERVIsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBGaWxlYWJsZUNtaXNPYmplY3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk5vbi1GaWxlYWJsZSBvYmplY3QgaGFzIENBTl9NT1ZFX09CSkVDVCBhbGxvd2FibGUgYWN0aW9uISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKG9iamVjdCwgQWN0aW9uLkNBTl9NT1ZFX09CSkVDVCwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGdldCBhbGxvd2FibGUgYWN0aW9ucyBhZ2FpbgotICAgICAgICAgICAgICAgIEFsbG93YWJsZUFjdGlvbnMgYWxsb3dhYmxlQWN0aW9ucyA9IHNlc3Npb24uZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFsbG93YWJsZUFjdGlvbnMoc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldElkKCksIG9iamVjdC5nZXRJZCgpLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGlmIChhbGxvd2FibGVBY3Rpb25zLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiZ2V0QWxsb3dhYmxlQWN0aW9ucygpIGRpZG4ndCByZXR1cm5lZCBhbGxvd2FibGUgYWN0aW9ucyEiKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgYWxsb3dhYmxlIGFjdGlvbnMgZG9uJ3QgbWF0Y2ggdGhlIGFsbG93YWJsZSBhY3Rpb25zIHJldHVybmVkIGJ5IGdldEFsbG93YWJsZUFjdGlvbnMoKSEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxTZXQob2JqZWN0LmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FibGVBY3Rpb25zLmdldEFsbG93YWJsZUFjdGlvbnMoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgQUNMCi0gICAgICAgICAgICBpZiAob2JqZWN0LmdldEFjbCgpICE9IG51bGwgJiYgb2JqZWN0LmdldEFjbCgpLmdldEFjZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNoZWNrQUNMKHNlc3Npb24sIG9iamVjdC5nZXRBY2woKSwgdHJ1ZSwgIkFDTCIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgcG9saWNpZXMKLSAgICAgICAgICAgIGlmIChoYXNQb2xpY2llcyhzZXNzaW9uKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0RGF0YT4gYXBwbGllZFBvbGljaWVzID0gc2Vzc2lvbi5nZXRCaW5kaW5nKCkuZ2V0UG9saWN5U2VydmljZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFwcGxpZWRQb2xpY2llcyhzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0SWQoKSwgb2JqZWN0LmdldElkKCksICIqIiwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFwcGxpZWRQb2xpY2llcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkUG9saWNpZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8UG9saWN5PiBvYmplY3RQb2xpY2llcyA9IG9iamVjdC5nZXRQb2xpY2llcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0UG9saWNpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0UG9saWNpZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG51bWJlciBvZiBwb2xpY2llcyByZXR1cm5lZCBieSBnZXRBcHBsaWVkUG9saWNpZXMoKSBhbmQgdGhlIG51bWJlciBvZiBvYmplY3QgcG9saWNpZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoYXBwbGllZFBvbGljaWVzLnNpemUoKSwgb2JqZWN0UG9saWNpZXMuc2l6ZSgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiZ2V0QXBwbGllZFBvbGljaWVzKCkgbm90IHN1cHBvcnRlZCBmb3Igb2JqZWN0OiAiICsgb2JqZWN0LmdldElkKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHJlbGF0aW9uc2hpcHMKLSAgICAgICAgICAgIGNoZWNrUmVsYXRpb25zaGlwcyhzZXNzaW9uLCByZXN1bHRzLCBvYmplY3QpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBkb2N1bWVudCBjb250ZW50Ci0gICAgICAgICAgICBjaGVja0RvY3VtZW50Q29udGVudChzZXNzaW9uLCByZXN1bHRzLCBvYmplY3QpOwotCi0gICAgICAgICAgICAvLyBjaGVjayByZW5kaXRpb25zCi0gICAgICAgICAgICBpZiAob2JqZWN0LmdldFJlbmRpdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNoZWNrUmVuZGl0aW9ucyhzZXNzaW9uLCBvYmplY3QsICJSZW5kaXRpb24gY2hlY2siKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFsbG93ZWQgY2hpbGQgb2JqZWN0IHR5cGUgaWRzCi0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG90aWRzID0gb2JqZWN0LmdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlJZHMuQUxMT1dFRF9DSElMRF9PQkpFQ1RfVFlQRV9JRFMpOwotICAgICAgICAgICAgICAgIGlmIChvdGlkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG90aWQgOiBvdGlkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKG90aWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjbWlzOmFsbG93ZWRDaGlsZE9iamVjdFR5cGVJZHMgcHJvcGVydHkgY29udGFpbnMgdGhlIHR5cGUgaWQgJyIgKyBvdGlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBidXQgdGhlIHR5cGUgZG9lc24ndCBleGlzdHMuIEZvbGRlciBpZDogIiArIG9iamVjdC5nZXRJZCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHBhdGgKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGaWxlYWJsZUNtaXNPYmplY3QpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGF0aHMgPSAoKEZpbGVhYmxlQ21pc09iamVjdCkgb2JqZWN0KS5nZXRQYXRocygpOwotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIGRvZXMgbm90IGhhdmUgZXhjYXRseSBvbmUgcGF0aCEgVGhpcyBpcyBhbiBPcGVuQ01JUyBidWchIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoMSwgcGF0aHMuc2l6ZSgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uRkFMU0UuZXF1YWxzKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5pc011bHRpZmlsaW5nU3VwcG9ydGVkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXBvc2l0b3J5IGRvZXMgbm90IHN1cHBvcnQgbXVsdGktZmlsaW5nLCBidXQgdGhlIG9iamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBwYXJlbnQhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNUcnVlKHBhdGhzLnNpemUoKSA8IDIsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0SW1wbCByZXN1bHQgPSBjcmVhdGVSZXN1bHQoZ2V0V29yc3QocmVzdWx0cyksIG1lc3NhZ2UpOwotICAgICAgICByZXN1bHQuZ2V0Q2hpbGRyZW4oKS5hZGRBbGwocmVzdWx0cyk7Ci0KLSAgICAgICAgcmV0dXJuIChyZXN1bHQuZ2V0U3RhdHVzKCkuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpID8gbnVsbCA6IHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGNoZWNrQUNMKFNlc3Npb24gc2Vzc2lvbiwgQWNsIGFjbCwgYm9vbGVhbiBjaGVja0V4YWN0LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFDTCBpcyBudWxsISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChhY2wsIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAoYWNsICE9IG51bGwpIHsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTGlzdCBvZiBBQ0VzIGlzIG51bGwhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChhY2wuZ2V0QWNlcygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGlmIChhY2wuZ2V0QWNlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiBhY2wuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFDRSB3aXRoIGVtcHR5IHByaW5jaXBhbCBJRCEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KGFjZS5nZXRQcmluY2lwYWxJZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQUNFIHdpdGggZW1wdHkgcGVybWlzc2lvbiBsaXN0ISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0TGlzdE5vdEVtcHR5KGFjZS5nZXRQZXJtaXNzaW9ucygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjZS5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pc3Npb24gOiBhY2UuZ2V0UGVybWlzc2lvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFDRSB3aXRoIGVtcHR5IHBlcm1pc3Npb24gZW50cnkhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHBlcm1pc3Npb24sIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoZWNrRXhhY3QpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBQ0wgaXMgcHJvdmlkZWQgYnV0IHRoZSBpc0V4YWN0IGZsYWcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChhY2wuaXNFeGFjdCgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzVGVzdFJlc3VsdEltcGwgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KGdldFdvcnN0KHJlc3VsdHMpLCBtZXNzYWdlKTsKLSAgICAgICAgcmVzdWx0LmdldENoaWxkcmVuKCkuYWRkQWxsKHJlc3VsdHMpOwotCi0gICAgICAgIHJldHVybiAocmVzdWx0LmdldFN0YXR1cygpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSA/IG51bGwgOiByZXN1bHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlbGF0aW9uc2hpcHMoU2Vzc2lvbiBzZXNzaW9uLCBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzLCBDbWlzT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVsYXRpb25zaGlwKSB7Ci0gICAgICAgICAgICBpZiAoaXNOb3RFbXB0eShvYmplY3QuZ2V0UmVsYXRpb25zaGlwcygpKSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkEgcmVsYXRpb25zaGlwIGhhcyByZWxhdGlvbnNoaXBzISIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqZWN0LmdldFJlbGF0aW9uc2hpcHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgOiBvYmplY3QuZ2V0UmVsYXRpb25zaGlwcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkEgcmVsYXRpb25zaGlwIGluIHRoZSByZWxhdGlvbnNoaXAgbGlzdCBpcyBudWxsISIpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ21pc09iamVjdCBmdWxsUmVsYXRpb25zaGlwT2JqZWN0ID0gc2Vzc2lvbi5nZXRPYmplY3QocmVsYXRpb25zaGlwLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZnVsbFJlbGF0aW9uc2hpcE9iamVjdCwgZ2V0QWxsUHJvcGVydGllcyhmdWxsUmVsYXRpb25zaGlwT2JqZWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbGF0aW9uc2hpcCBjaGVjazogIiArIGZ1bGxSZWxhdGlvbnNoaXBPYmplY3QuZ2V0SWQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRG9jdW1lbnRDb250ZW50KFNlc3Npb24gc2Vzc2lvbiwgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cywgQ21pc09iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGRvY3VtZW50cyBoYXZlIGNvbnRlbnQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KSBvYmplY3Q7Ci0gICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gdHlwZSA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSBkb2MuZ2V0VHlwZSgpOwotCi0gICAgICAgIC8vIGNoZWNrIENvbnRlbnRTdHJlYW1BbGxvd2VkIGZsYWcKLSAgICAgICAgYm9vbGVhbiBoYXNDb250ZW50UHJvcGVydGllcyA9IChkb2MuZ2V0Q29udGVudFN0cmVhbUZpbGVOYW1lKCkgIT0gbnVsbCkgfHwgKGRvYy5nZXRDb250ZW50U3RyZWFtSWQoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChkb2MuZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpID4gLTEpIHx8IChkb2MuZ2V0Q29udGVudFN0cmVhbU1pbWVUeXBlKCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgaWYgKGhhc0NvbnRlbnRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRDb250ZW50U3RyZWFtQWxsb3dlZCgpID09IENvbnRlbnRTdHJlYW1BbGxvd2VkLk5PVEFMTE9XRUQpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50IHByb3BlcnRpZXMgaGF2ZSB2YWx1ZXMgYnV0IHRoZSBkb2N1bWVudCB0eXBlIGRvZXNuJ3QgYWxsb3cgY29udGVudCEiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRDb250ZW50U3RyZWFtQWxsb3dlZCgpID09IENvbnRlbnRTdHJlYW1BbGxvd2VkLlJFUVVJUkVEKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgcHJvcGVydGllcyBhcmUgbm90IHNldCBidXQgdGhlIGRvY3VtZW50IHR5cGUgZGVtYW5kcyBjb250ZW50ISIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgY29udGVudCBzdHJlYW0KLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gZG9jLmdldENvbnRlbnRTdHJlYW0oKTsKLQotICAgICAgICBpZiAoY29udGVudFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaGFzQ29udGVudFByb3BlcnRpZXMgJiYgZG9jLmdldENvbnRlbnRTdHJlYW1MZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ29udGVudCBwcm9wZXJ0aWVzIGhhdmUgdmFsdWVzIGJ1dCB0aGUgZG9jdW1lbnQgaGFzIG5vIGNvbnRlbnQhIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHlwZS5nZXRDb250ZW50U3RyZWFtQWxsb3dlZCgpID09IENvbnRlbnRTdHJlYW1BbGxvd2VkLlJFUVVJUkVEKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlRoZSBkb2N1bWVudCB0eXBlIGRlbWFuZHMgY29udGVudCBidXQgdGhlIGRvY3VtZW50IGhhcyBubyBjb250ZW50ISIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUuZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSA9PSBDb250ZW50U3RyZWFtQWxsb3dlZC5OT1RBTExPV0VEKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCB0eXBlIGRvZXNuJ3QgYWxsb3cgY29udGVudCBidXQgZG9jdW1lbnQgaGFzIGNvbnRlbnQhIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmlsZSBuYW1lIGNoZWNrCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgZmlsZSBuYW1lcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhkb2MuZ2V0Q29udGVudFN0cmVhbUZpbGVOYW1lKCksIGNvbnRlbnRTdHJlYW0uZ2V0RmlsZU5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGlmIChkb2MuZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpID4gLTEgJiYgY29udGVudFN0cmVhbS5nZXRMZW5ndGgoKSA+IC0xKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDb250ZW50IGxlbmd0aHMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGRvYy5nZXRDb250ZW50U3RyZWFtTGVuZ3RoKCksIGNvbnRlbnRTdHJlYW0uZ2V0TGVuZ3RoKCksIG51bGwsIGYpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1JTUUgdHlwZSBjaGVjawotICAgICAgICBTdHJpbmcgZG9jTWltZVR5cGUgPSBkb2MuZ2V0Q29udGVudFN0cmVhbU1pbWVUeXBlKCk7Ci0gICAgICAgIGlmIChkb2NNaW1lVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgeCA9IGRvY01pbWVUeXBlLmluZGV4T2YoJzsnKTsKLSAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKLSAgICAgICAgICAgICAgICBkb2NNaW1lVHlwZSA9IGRvY01pbWVUeXBlLnN1YnN0cmluZygwLCB4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvY01pbWVUeXBlID0gZG9jTWltZVR5cGUudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRNaW1lVHlwZSA9IGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRNaW1lVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgeCA9IGNvbnRlbnRNaW1lVHlwZS5pbmRleE9mKCc7Jyk7Ci0gICAgICAgICAgICBpZiAoeCA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudE1pbWVUeXBlID0gY29udGVudE1pbWVUeXBlLnN1YnN0cmluZygwLCB4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRlbnRNaW1lVHlwZSA9IGNvbnRlbnRNaW1lVHlwZS50cmltKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDb250ZW50IE1JTUUgdHlwZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZG9jTWltZVR5cGUsIGNvbnRlbnRNaW1lVHlwZSwgbnVsbCwgZikpOwotCi0gICAgICAgIGlmIChjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRNaW1lVHlwZS5lcXVhbHMoZG9jTWltZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ29udGVudCBNSU1FIHR5cGVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZG9jLmdldENvbnRlbnRTdHJlYW1NaW1lVHlwZSgpLCBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ29udGVudCBNSU1FIHR5cGVzIGlzIGludmFsaWQ6ICIgKyBjb250ZW50U3RyZWFtLmdldE1pbWVUeXBlKCkpOwotICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRJc1RydWUoY29udGVudFN0cmVhbS5nZXRNaW1lVHlwZSgpLmxlbmd0aCgpID4gMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnRTdHJlYW0uZ2V0TWltZVR5cGUoKS5pbmRleE9mKCcvJykgPiAwLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBzdHJlYW0KLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1ZW1udCBoYXMgbm8gY29udGVudCBzdHJlYW0hIikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvbmcgYnl0ZXMgPSAwOwotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzY0ICogMTAyNF07Ci0gICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgICAgICB3aGlsZSAoYiA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZXMgKz0gYjsKLSAgICAgICAgICAgICAgICBiID0gc3RyZWFtLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBjb250ZW50IGxlbmd0aAotICAgICAgICAgICAgaWYgKGRvYy5nZXRDb250ZW50U3RyZWFtTGVuZ3RoKCkgPiAtMSkgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50IHN0cmVhbSBsZW5ndGggcHJvcGVydHkgdmFsdWUgZG9lc24ndCBtYXRjaCB0aGUgYWN0dWFsIGNvbnRlbnQgbGVuZ3RoISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZG9jLmdldENvbnRlbnRTdHJlYW1MZW5ndGgoKSwgYnl0ZXMsIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNvbnRlbnRTdHJlYW0uZ2V0TGVuZ3RoKCkgPiAtMSkgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgbGVuZ3RoIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjdHVhbCBjb250ZW50IGxlbmd0aCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGNvbnRlbnRTdHJlYW0uZ2V0TGVuZ3RoKCksIGJ5dGVzLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZWFkaW5nIGNvbnRlbnQgZmFpbGVkOiAiICsgZSwgZSwgZmFsc2UpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgY2hlY2tSZW5kaXRpb25zKFNlc3Npb24gc2Vzc2lvbiwgQ21pc09iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0UmVzdWx0PigpOwotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaWYgKG9iamVjdC5nZXRSZW5kaXRpb25zKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBmb3IgKFJlbmRpdGlvbiByZW5kIDogb2JqZWN0LmdldFJlbmRpdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkEgcmVuZGl0aW9uIGluIHRoZSBsaXN0IG9mIHJlbmRpdGlvbnMgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChyZW5kLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkEgcmVuZGl0aW9uIGhhcyBhbiBlbXB0eSBzdHJlYW0gaWQhIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRTdHJpbmdOb3RFbXB0eShyZW5kLmdldFN0cmVhbUlkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBIHJlbmRpdGlvbiBoYXMgYW4gZW1wdHkga2luZCEgU3RyZWFtIGlkOiAiICsgcmVuZC5nZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHJlbmQuZ2V0S2luZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQSByZW5kaXRpb24gaGFzIGFuIGVtcHR5IE1JTUUgdHlwZSEgU3RyZWFtIGlkOiAiICsgcmVuZC5nZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHJlbmQuZ2V0TWltZVR5cGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgiY21pczp0aHVtYm5haWwiLmVxdWFscyhyZW5kLmdldEtpbmQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgcmVuZGl0aW9uIGlzIG9mIGtpbmQgJ2NtaXM6dGh1bWJuYWlsJyBidXQgdGhlIGhlaWdodCBpcyBub3Qgc2V0IG9yIGhhcyBhbiBpbnZhbGlkIHZhbHVlISBTdHJlYW0gaWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlbmQuZ2V0U3RyZWFtSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNUcnVlKHJlbmQuZ2V0SGVpZ2h0KCkgPiAwLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgcmVuZGl0aW9uIGlzIG9mIGtpbmQgJ2NtaXM6dGh1bWJuYWlsJyBidXQgdGhlIHdpZHRoIGlzIG5vdCBzZXQgb3IgaGFzIGFuIGludmFsaWQgdmFsdWUhIFN0cmVhbSBpZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVuZC5nZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocmVuZC5nZXRXaWR0aCgpID4gMCwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gcmVuZC5nZXRDb250ZW50U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkEgcmVuZGl0aW9uIGhhcyBubyBjb250ZW50IHN0cmVhbSEgU3RyZWFtIGlkOiAiICsgcmVuZC5nZXRTdHJlYW1JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwoY29udGVudFN0cmVhbSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGNvbnRlbnRTdHJlYW0uZ2V0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkEgcmVuZGl0aW9uIGhhcyBubyBzdHJlYW0hIFN0cmVhbSBpZDogIiArIHJlbmQuZ2V0U3RyZWFtSWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChzdHJlYW0sIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBieXRlcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs2NCAqIDEwMjRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChiID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gc3RyZWFtLnJlYWQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBjb250ZW50IGxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVuZC5nZXRMZW5ndGgoKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW5kaXRpb24gY29udGVudCBzdHJlYW0gbGVuZ3RoIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggdGhlIGFjdHVhbCBjb250ZW50IGxlbmd0aCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMocmVuZC5nZXRMZW5ndGgoKSwgYnl0ZXMsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJlYWRpbmcgY29udGVudCBmYWlsZWQ6ICIgKyBlLCBlLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHRJbXBsIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdChnZXRXb3JzdChyZXN1bHRzKSwgbWVzc2FnZSk7Ci0gICAgICAgIHJlc3VsdC5nZXRDaGlsZHJlbigpLmFkZEFsbChyZXN1bHRzKTsKLQotICAgICAgICByZXR1cm4gKHJlc3VsdC5nZXRTdGF0dXMoKS5nZXRMZXZlbCgpIDw9IE9LLmdldExldmVsKCkgPyBudWxsIDogcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgY2hlY2tWZXJzaW9uSGlzdG9yeShTZXNzaW9uIHNlc3Npb24sIENtaXNPYmplY3Qgb2JqZWN0LCBTdHJpbmdbXSBwcm9wZXJ0aWVzLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmIChvYmplY3QuZ2V0QmFzZVR5cGVJZCgpICE9IEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCkgewotICAgICAgICAgICAgLy8gc2tpcCBub24tZG9jdW1lbnQgb2JqZWN0cwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIUJvb2xlYW4uVFJVRS5lcXVhbHMoKChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSBvYmplY3QuZ2V0VHlwZSgpKS5pc1ZlcnNpb25hYmxlKCkpKSB7Ci0gICAgICAgICAgICAvLyBza2lwIG5vbi12ZXJzaW9uYWJsZSB0eXBlcwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIG9iamVjdDsKLQotICAgICAgICAvLyBjaGVjayB2ZXJzaW9uIHNlcmllcyBpZAotICAgICAgICBTdHJpbmcgdmVyc2lvblNlcmllc0lkID0gZG9jLmdldFZlcnNpb25TZXJpZXNJZCgpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlZlcnNpb25hYmxlIGRvY3VtZW50IGhhcyBubyB2ZXJzaW9uIHNlcmllcyBpZCBwcm9wZXJ0eSEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHZlcnNpb25TZXJpZXNJZCwgbnVsbCwgZikpOwotICAgICAgICBpZiAodmVyc2lvblNlcmllc0lkID09IG51bGwpIHsKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0SW1wbCByZXN1bHQgPSBjcmVhdGVSZXN1bHQoZ2V0V29yc3QocmVzdWx0cyksIG1lc3NhZ2UpOwotICAgICAgICAgICAgcmVzdWx0LmdldENoaWxkcmVuKCkuYWRkQWxsKHJlc3VsdHMpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB2ZXJzaW9uIGhpc3RvcnkKLSAgICAgICAgTGlzdDxEb2N1bWVudD4gdmVyc2lvbnMgPSBkb2MuZ2V0QWxsVmVyc2lvbnMoU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVmVyc2lvbiBoaXN0b3J5IGlzIG51bGwhIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHZlcnNpb25zLCBudWxsLCBmKSk7Ci0gICAgICAgIGlmICh2ZXJzaW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdEltcGwgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KGdldFdvcnN0KHJlc3VsdHMpLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIHJlc3VsdC5nZXRDaGlsZHJlbigpLmFkZEFsbChyZXN1bHRzKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIGhpc3RvcnkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB2ZXJzaW9uISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0TGlzdE5vdEVtcHR5KHZlcnNpb25zLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgaWYgKCF2ZXJzaW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIGdldCBsYXRlc3QgdmVyc2lvbgotICAgICAgICAgICAgRG9jdW1lbnQgbGFzdGVzdFZlcnNpb24gPSBkb2MuZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKGZhbHNlLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICBjaGVja09iamVjdChzZXNzaW9uLCBsYXN0ZXN0VmVyc2lvbiwgcHJvcGVydGllcywgIkxhdGVzdCB2ZXJzaW9uIGNoZWNrOiAiICsgbGFzdGVzdFZlcnNpb24uZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJMYXRlc3QgdmVyc2lvbiBpcyBub3QgZmxhZ2dlZCBhcyBsYXRlc3QgdmVyc2lvbiEgSWQ6ICIgKyBsYXN0ZXN0VmVyc2lvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUobGFzdGVzdFZlcnNpb24uaXNMYXRlc3RWZXJzaW9uKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgLy8gZ2V0IGxhdGVzdCBtYWpvciB2ZXJzaW9uCi0gICAgICAgICAgICBEb2N1bWVudCBsYXN0ZXN0TWFqb3JWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbGFzdGVzdE1ham9yVmVyc2lvbiA9IGRvYy5nZXRPYmplY3RPZkxhdGVzdFZlcnNpb24odHJ1ZSwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24gcmV0dXJuZWQgYW4gaW52YWxpZCBvYmplY3QhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwobGFzdGVzdE1ham9yVmVyc2lvbiwgbnVsbCwgZikpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBsYXRlc3QgbWFqb3IgdmVyc2lvbgotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxhc3Rlc3RNYWpvclZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja09iamVjdChzZXNzaW9uLCBsYXN0ZXN0TWFqb3JWZXJzaW9uLCBwcm9wZXJ0aWVzLCAiTGF0ZXN0IG1ham9yIHZlcnNpb24gY2hlY2s6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0ZXN0TWFqb3JWZXJzaW9uLmdldElkKCkpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkxhdGVzdCBtYWpvciB2ZXJzaW9uIGlzIG5vdCBmbGFnZ2VkIGFzIGxhdGVzdCBtYWpvciB2ZXJzaW9uISBJZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXN0ZXN0TWFqb3JWZXJzaW9uLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUobGFzdGVzdE1ham9yVmVyc2lvbi5pc0xhdGVzdE1ham9yVmVyc2lvbigpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdmVyc2lvbiBoaXN0b3J5IGFuZCB0ZXN0IGVhY2ggdmVyc2lvbgotICAgICAgICAgICAgLy8gZG9jdW1lbnQKLSAgICAgICAgICAgIGxvbmcgY3JlYXRhdGlvbkRhdGUgPSBMb25nLk1BWF9WQUxVRTsKLSAgICAgICAgICAgIGludCBsYXRlc3RWZXJzaW9uID0gMDsKLSAgICAgICAgICAgIGludCBsYXRlc3RNYWpvclZlcnNpb24gPSAwOwotICAgICAgICAgICAgbG9uZyBsYXRlc3RNb2RpZmljYXRpb25EYXRlID0gTG9uZy5NQVhfVkFMVUU7Ci0gICAgICAgICAgICBpbnQgbGF0ZXN0TW9kaWZpY3RhaW9uSW5kZXggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHZlcnNpb25MYWJlbHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kTGFzdGVzdFZlcnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRMYXN0ZXN0TWFqb3JWZXJzaW9uID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgdmVyc2lvbiA9IHZlcnNpb25zLmdldChpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlZlcnNpb24gIiArIGkgKyAiIGlzIG51bGwhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwodmVyc2lvbiwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNoZWNrT2JqZWN0KHNlc3Npb24sIHZlcnNpb24sIHByb3BlcnRpZXMsICJWZXJzaW9uIGNoZWNrOiAiICsgdmVyc2lvbi5nZXRJZCgpKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBmaXJzdCBlbnRyeQotICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24uaXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiBzZXJpZXMgaXMgY2hlY2tlZC1vdXQgYW5kIHRoZSBQV0MgaXMgbm90IHRoZSBsYXRlc3QgdmVyc2lvbiEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZlcnNpb24uZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoTm90ZTogVGhlIHdvcmRzIG9mIHRoZSBDTUlTIHNwZWNpZmljYXRpb24gZGVmaW5lIHRoYXQgdGhlIFBXQyBpcyB0aGUgbGF0ZXN0IHZlcnNpb24uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBCdXQgdGhhdCBpcyBub3QgdGhlIGludGVudGlvbiBvZiB0aGUgc3BlYyBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluIENNSVMgMS4xLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgVGh1cyB0aGlzIGEgd2FybmluZywgbm90IGFuIGVycm9yLikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUodmVyc2lvbi5pc0xhdGVzdFZlcnNpb24oKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiBzZXJpZXMgaXMgbm90IGNoZWNrZWQtb3V0IGFuZCBmaXJzdCB2ZXJzaW9uIGhpc3RvcnkgZW50cnkgaXMgbm90IHRoZSBsYXRlc3QgdmVyc2lvbiEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZlcnNpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNUcnVlKHZlcnNpb24uaXNMYXRlc3RWZXJzaW9uKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHZlcnNpb24gaWQKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIHNlcmllcyBpZCBkb2VzIG5vdCBtYXRjaCEgSWQ6ICIgKyB2ZXJzaW9uLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHModmVyc2lvblNlcmllc0lkLCB2ZXJzaW9uLmdldFZlcnNpb25TZXJpZXNJZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBjcmVhdGlvbiBkYXRlCi0gICAgICAgICAgICAgICAgaWYgKGNyZWF0YXRpb25EYXRlID09IHZlcnNpb24uZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZUluTWlsbGlzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiVHdvIG9yIG1vcmUgdmVyc2lvbnMgaGF2ZSB0aGUgc2FtZSBjcmVhdGlvbiBkYXRlISIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIGhpc3Rvcnkgb3JkZXIgaW5jb3JyZWN0ISBNdXN0IGJlIHNvcnRlZCBiZWkgY3JlYXRpb24gZGF0ZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SXNUcnVlKHZlcnNpb24uZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZUluTWlsbGlzKCkgPD0gY3JlYXRhdGlvbkRhdGUsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb3VudCBsYXRlc3QgdmVyc2lvbnMgYW5kIGxhdGVzdCBtYWpvciB2ZXJzaW9ucwotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmlzTGF0ZXN0VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhdGVzdFZlcnNpb24rKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5pc0xhdGVzdE1ham9yVmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhdGVzdE1ham9yVmVyc2lvbisrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZpbmQgbGF0ZXN0IG1vZGlmaWNhdGlvbiBkYXRlCi0gICAgICAgICAgICAgICAgaWYgKGxhdGVzdE1vZGlmaWNhdGlvbkRhdGUgPT0gdmVyc2lvbi5nZXRMYXN0TW9kaWZpY2F0aW9uRGF0ZSgpLmdldFRpbWVJbk1pbGxpcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiVHdvIG9yIG1vcmUgdmVyc2lvbnMgaGF2ZSB0aGUgc2FtZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlISIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhdGVzdE1vZGlmaWNhdGlvbkRhdGUgPCB2ZXJzaW9uLmdldExhc3RNb2RpZmljYXRpb25EYXRlKCkuZ2V0VGltZUluTWlsbGlzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGF0ZXN0TW9kaWZpY2F0aW9uRGF0ZSA9IHZlcnNpb24uZ2V0TGFzdE1vZGlmaWNhdGlvbkRhdGUoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgbGF0ZXN0TW9kaWZpY3RhaW9uSW5kZXggPSBpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciB2ZXJzaW9uIGxhYmVsIGR1cGxpY2F0ZXMKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbkxhYmVsID0gdmVyc2lvbi5nZXRWZXJzaW9uTGFiZWwoKTsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJNb3JlIHRoYW4gb25lIHZlcnNpb24gaGF2ZSB0aGlzIHZlcnNpb24gbGFiZWw6ICIgKyB2ZXJzaW9uTGFiZWwpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc0ZhbHNlKHZlcnNpb25MYWJlbHMuY29udGFpbnModmVyc2lvbkxhYmVsKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgdmVyc2lvbkxhYmVscy5hZGQodmVyc2lvbkxhYmVsKTsKLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIFBXQwotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmdldElkKCkuZXF1YWxzKHZlcnNpb24uZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQV0MgbXVzdCBub3QgYmUgZmxhZ2dlZCBhcyBsYXRlc3QgbWFqb3IgdmVyc2lvbiEgSWQ6ICIgKyB2ZXJzaW9uLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNGYWxzZSh2ZXJzaW9uLmlzTGF0ZXN0TWFqb3JWZXJzaW9uKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBjaGVja2VkIG91dAotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGRvYy5pc1ZlcnNpb25TZXJpZXNDaGVja2VkT3V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiBzZXJpZXMgaXMgbWFya2VkIGFzIGNoZWNrZWQgb3V0IGJ1dCBjbWlzOnZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQgaXMgbm90IHNldCEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmVyc2lvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KGRvYy5nZXRWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gc2VyaWVzIGlzIG1hcmtlZCBhcyBjaGVja2VkIG91dCBidXQgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5IGlzIG5vdCBzZXQhIElkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZlcnNpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRTdHJpbmdOb3RFbXB0eShkb2MuZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRCeSgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCb29sZWFuLkZBTFNFLmVxdWFscyhkb2MuaXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gc2VyaWVzIGlzIG5vdCBtYXJrZWQgYXMgY2hlY2tlZCBvdXQgYnV0IGNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCBpcyBzZXQhIElkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZlcnNpb24uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROdWxsKGRvYy5nZXRWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gc2VyaWVzIGlzIG5vdCBtYXJrZWQgYXMgY2hlY2tlZCBvdXQgYnV0IGNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZEJ5IGlzIHNldCEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmVyc2lvbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE51bGwoZG9jLmdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0QnkoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9yaWdpbiBvYmplY3Q/Ci0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24uZ2V0SWQoKS5lcXVhbHMob2JqZWN0LmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBmb3VuZCBsYXRlc3QgdmVyc2lvbj8KLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5nZXRJZCgpLmVxdWFscyhsYXN0ZXN0VmVyc2lvbi5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZExhc3Rlc3RWZXJzaW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBmb3VuZCBsYXRlc3QgbWFqb3IgdmVyc2lvbj8KLSAgICAgICAgICAgICAgICBpZiAobGFzdGVzdE1ham9yVmVyc2lvbiAhPSBudWxsICYmIHZlcnNpb24uZ2V0SWQoKS5lcXVhbHMobGFzdGVzdE1ham9yVmVyc2lvbi5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZExhc3Rlc3RNYWpvclZlcnNpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgbGF0ZXN0IHZlcnNpb25zCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIHNlcmllcyBpZCBoYXMgIiArIGxhdGVzdFZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIGxhdGVzdCB2ZXJzaW9ucyEgVGhlcmUgbXVzdCBiZSBvbmx5IG9uZSEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoMSwgbGF0ZXN0VmVyc2lvbiwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBpZiAoIWZvdW5kTGFzdGVzdFZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJMYXRlc3QgdmVyc2lvbiBub3QgZm91bmQgaW4gdmVyc2lvbiBoaXN0b3J5ISIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgbGF0ZXN0IG1ham9yIHZlcnNpb25zCi0gICAgICAgICAgICBpZiAobGFzdGVzdE1ham9yVmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVmVyc2lvbiBzZXJpZXMgaWQgaGFzICIgKyBsYXRlc3RNYWpvclZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBsYXRlc3QgbWFqb3IgdmVyc2lvbihzKSBidXQgZ2V0T2JqZWN0T2ZMYXRlc3RWZXJzaW9uKCkgZGlkbid0IHJldHVybiBhIG1ham9yIHZlcnNpb24hIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscygwLCBsYXRlc3RNYWpvclZlcnNpb24sIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVmVyc2lvbiBzZXJpZXMgaWQgaGFzICIgKyBsYXRlc3RNYWpvclZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBsYXRlc3QgbWFqb3IgdmVyc2lvbnMgYnV0IHRoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKDEsIGxhdGVzdE1ham9yVmVyc2lvbiwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFmb3VuZExhc3Rlc3RNYWpvclZlcnNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTGF0ZXN0IG1ham9yIHZlcnNpb24gbm90IGZvdW5kIGluIHZlcnNpb24gaGlzdG9yeSEiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBsYXRlc3QgdmVyc2lvbgotICAgICAgICAgICAgaWYgKGxhdGVzdE1vZGlmaWN0YWlvbkluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJWZXJzaW9uIHdpdGggdGhlIGxhdGVzdCBtb2RpZmljYXRpb24gZGF0ZSBpcyBub3QgZmxhZ2dlZCBhcyBsYXRlc3QgdmVyc2lvbiEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2ZXJzaW9ucy5nZXQobGF0ZXN0TW9kaWZpY3RhaW9uSW5kZXgpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNUcnVlKHZlcnNpb25zLmdldChsYXRlc3RNb2RpZmljdGFpb25JbmRleCkuaXNMYXRlc3RWZXJzaW9uKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIG9yaWdpbiBvYmplY3Qgd2FzIGZvdW5kCi0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgbm90IGZvdW5kIGluIGl0cyB2ZXJzaW9uIGhpc3RvcnkhIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHRJbXBsIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdChnZXRXb3JzdChyZXN1bHRzKSwgbWVzc2FnZSk7Ci0gICAgICAgIHJlc3VsdC5nZXRDaGlsZHJlbigpLmFkZEFsbChyZXN1bHRzKTsKLQotICAgICAgICByZXR1cm4gKHJlc3VsdC5nZXRTdGF0dXMoKS5nZXRMZXZlbCgpIDw9IE9LLmdldExldmVsKCkgPyBudWxsIDogcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0QWxsb3dhYmxlQWN0aW9uKENtaXNPYmplY3Qgb2JqZWN0LCBBY3Rpb24gYWN0aW9uLCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLAotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSkgewotICAgICAgICBBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMgPSBvYmplY3QuZ2V0QWxsb3dhYmxlQWN0aW9ucygpOwotICAgICAgICBpZiAoYWxsb3dhYmxlQWN0aW9ucyAhPSBudWxsICYmIGFsbG93YWJsZUFjdGlvbnMuZ2V0QWxsb3dhYmxlQWN0aW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhbGxvd2FibGVBY3Rpb25zLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0Tm90QWxsb3dhYmxlQWN0aW9uKENtaXNPYmplY3Qgb2JqZWN0LCBBY3Rpb24gYWN0aW9uLCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLAotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSkgewotICAgICAgICBBbGxvd2FibGVBY3Rpb25zIGFsbG93YWJsZUFjdGlvbnMgPSBvYmplY3QuZ2V0QWxsb3dhYmxlQWN0aW9ucygpOwotICAgICAgICBpZiAoYWxsb3dhYmxlQWN0aW9ucyAhPSBudWxsICYmIGFsbG93YWJsZUFjdGlvbnMuZ2V0QWxsb3dhYmxlQWN0aW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghYWxsb3dhYmxlQWN0aW9ucy5nZXRBbGxvd2FibGVBY3Rpb25zKCkuY29udGFpbnMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGNoZWNrUHJvcGVydHkoUHJvcGVydHk8Pz4gcHJvcGVydHksIFN0cmluZyBtZXNzYWdlLCBQcm9wZXJ0eUNoZWNrRW51bSBwcm9wZXJ0eUNoZWNrKSB7Ci0gICAgICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0UmVzdWx0PigpOwotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUHJvcGVydHkgaXMgbm90IGluY2x1ZGVkIGluIHJlc3BvbnNlISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eSwgbnVsbCwgZikpOwotCi0gICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSBpZCBpcyBub3Qgc2V0IG9yIGVtcHR5ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHByb3BlcnR5LmdldElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRGlzcGxheSBuYW1lIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlF1ZXJ5IG5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHByb3BlcnR5LmdldFF1ZXJ5TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkxvY2FsIG5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHByb3BlcnR5LmdldExvY2FsTmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGlmICgocHJvcGVydHlDaGVjayA9PSBQcm9wZXJ0eUNoZWNrRW51bS5NVVNUX0JFX1NFVCkKLSAgICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5Q2hlY2sgPT0gUHJvcGVydHlDaGVja0VudW0uU1RSSU5HX01VU1RfTk9UX0JFX0VNUFRZKSkgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IGhhcyBubyB2YWx1ZSEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0TGlzdE5vdEVtcHR5KHByb3BlcnR5LmdldFZhbHVlcygpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5Q2hlY2sgPT0gUHJvcGVydHlDaGVja0VudW0uU1RSSU5HX1NIT1VMRF9OT1RfQkVfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJQcm9wZXJ0eSBoYXMgbm8gdmFsdWUhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydExpc3ROb3RFbXB0eShwcm9wZXJ0eS5nZXRWYWx1ZXMoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUNoZWNrID09IFByb3BlcnR5Q2hlY2tFbnVtLk1VU1RfTk9UX0JFX1NFVCkgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IGhhcyBhIHZhbHVlISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocHJvcGVydHkuZ2V0VmFsdWVzKCkuaXNFbXB0eSgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNTdHJpbmcgPSAoKHByb3BlcnR5LmdldERlZmluaXRpb24oKS5nZXRQcm9wZXJ0eVR5cGUoKSA9PSBQcm9wZXJ0eVR5cGUuU1RSSU5HKQotICAgICAgICAgICAgICAgICAgICB8fCAocHJvcGVydHkuZ2V0RGVmaW5pdGlvbigpLmdldFByb3BlcnR5VHlwZSgpID09IFByb3BlcnR5VHlwZS5JRCkKLSAgICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5LmdldERlZmluaXRpb24oKS5nZXRQcm9wZXJ0eVR5cGUoKSA9PSBQcm9wZXJ0eVR5cGUuVVJJKSB8fCAocHJvcGVydHkuZ2V0RGVmaW5pdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eVR5cGUoKSA9PSBQcm9wZXJ0eVR5cGUuSFRNTCkpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBwcm9wZXJ0eS5nZXRWYWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IHZhbHVlcyBjb250YWluIGEgbnVsbCB2YWx1ZSEiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2hlY2sgPT0gUHJvcGVydHlDaGVja0VudW0uU1RSSU5HX01VU1RfTk9UX0JFX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSB2YWx1ZXMgY29udGFpbiBhbiBlbXB0eSBzdHJpbmchIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0U3RyaW5nTm90RW1wdHkodmFsdWUudG9TdHJpbmcoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5Q2hlY2sgPT0gUHJvcGVydHlDaGVja0VudW0uU1RSSU5HX1NIT1VMRF9OT1RfQkVfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlByb3BlcnR5IHZhbHVlcyBjb250YWluIGFuIGVtcHR5IHN0cmluZyEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRTdHJpbmdOb3RFbXB0eSh2YWx1ZS50b1N0cmluZygpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5nZXREZWZpbml0aW9uKCkuZ2V0Q2FyZGluYWxpdHkoKSA9PSBDYXJkaW5hbGl0eS5TSU5HTEUpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSBjYXJkaW5hbGl0eSBpcyBTSU5HTEUgYnV0IHByb3BlcnR5IGhhcyBtb3JlIHRoYW4gb25lIHZhbHVlISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocHJvcGVydHkuZ2V0VmFsdWVzKCkuc2l6ZSgpIDw9IDEsIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByb3BlcnR5LmdldERlZmluaXRpb24oKS5pc1JlcXVpcmVkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IGRlZmluaXRpb24gZG9lc24ndCBjb250YWluIHRoZSByZXF1aXJlZCBmbGFnISIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmdldERlZmluaXRpb24oKS5pc1JlcXVpcmVkKCkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUHJvcGVydHkgaXMgcmVxdWlyZWQgYnV0IGhhcyBubyB2YWx1ZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydExpc3ROb3RFbXB0eShwcm9wZXJ0eS5nZXRWYWx1ZXMoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0SW1wbCByZXN1bHQgPSBjcmVhdGVSZXN1bHQoZ2V0V29yc3QocmVzdWx0cyksIG1lc3NhZ2UpOwotICAgICAgICByZXN1bHQuZ2V0Q2hpbGRyZW4oKS5hZGRBbGwocmVzdWx0cyk7Ci0KLSAgICAgICAgcmV0dXJuIChyZXN1bHQuZ2V0U3RhdHVzKCkuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpID8gbnVsbCA6IHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGNoZWNrQ2hpbGRyZW4oU2Vzc2lvbiBzZXNzaW9uLCBGb2xkZXIgZm9sZGVyLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmIChmb2xkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXRDaGlsZHJlbgotCi0gICAgICAgIGJvb2xlYW4gc3VwcG9ydHNPcmRlckJ5TmFtZSA9IGlzT3JkZXJCeU5hbWVTdXBwb3J0ZWQoc2Vzc2lvbik7Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3JkZXJDb250ZXh0ID0gKHN1cHBvcnRzT3JkZXJCeU5hbWUgPyBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DX09SREVSX0JZX05BTUUKLSAgICAgICAgICAgICAgICA6IFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgIGxvbmcgY2hpbGRyZW5Db3VudCA9IDA7Ci0gICAgICAgIGxvbmcgY2hpbGRyZW5Gb2xkZXJDb3VudCA9IDA7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBjaGlsZHJlbiA9IGZvbGRlci5nZXRDaGlsZHJlbihvcmRlckNvbnRleHQpOwotCi0gICAgICAgIGludCBvcmRlckJ5TmFtZUlzc3VlcyA9IDA7Ci0gICAgICAgIFN0cmluZyBsYXN0TmFtZSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChDbWlzT2JqZWN0IGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGNoaWxkcmVuQ291bnQrKzsKLSAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgICAgIGNoaWxkcmVuRm9sZGVyQ291bnQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2hlY2tDaGlsZChzZXNzaW9uLCByZXN1bHRzLCBmb2xkZXIsIGNoaWxkKTsKLQotICAgICAgICAgICAgaWYgKGxhc3ROYW1lICE9IG51bGwgJiYgY2hpbGQuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobGFzdE5hbWUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBvcmRlckJ5TmFtZUlzc3VlcysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGFzdE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hpbGRyZW4uZ2V0VG90YWxOdW1JdGVtcygpID49IDApIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIk51bWJlciBvZiBjaGlsZHJlbiBkb2Vzbid0IG1hdGNoIHRoZSByZXBvcnRlZCB0b3RhbCBudW1iZXIgb2YgaXRlbXMhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGNoaWxkcmVuQ291bnQsIGNoaWxkcmVuLmdldFRvdGFsTnVtSXRlbXMoKSwgbnVsbCwgZikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiZ2V0Q2hpbGRyZW4gZGlkIG5vdCByZXBvcnQgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VwcG9ydHNPcmRlckJ5TmFtZSkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiQ2hpbGRyZW4gc2hvdWxkIGJlIG9yZGVyZWQgYnkgY21pczpuYW1lLCBidXQgdGhleSBhcmUgbm90ISAoSXQgbWlnaHQgYmUgYSBjb2xsYXRpb24gbWlzbXRhY2guKSIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscygwLCBvcmRlckJ5TmFtZUlzc3VlcywgbnVsbCwgZikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChJTkZPLCAiUmVwb3NpdG9yeSBkb2Vzbid0IHN1cHBvcnQgT3JkZXIgQnkgZm9yIGdldENoaWxkcmVuKCkuIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGVzdCBwYXRoIHNlZ21lbnRzCi0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IHBhdGhTZWdlbWVudENoaWxkcmVuID0gc2Vzc2lvbgotICAgICAgICAgICAgICAgIC5nZXRCaW5kaW5nKCkKLSAgICAgICAgICAgICAgICAuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKQotICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbihzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0SWQoKSwgZm9sZGVyLmdldElkKCksICJjbWlzOm9iamVjdElkLGNtaXM6bmFtZSIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBCb29sZWFuLlRSVUUsIEJpZ0ludGVnZXIudmFsdWVPZigxMCksIEJpZ0ludGVnZXIuWkVSTywgbnVsbCk7Ci0KLSAgICAgICAgaWYgKHBhdGhTZWdlbWVudENoaWxkcmVuICE9IG51bGwgJiYgcGF0aFNlZ2VtZW50Q2hpbGRyZW4uZ2V0T2JqZWN0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJEYXRhIG9iamVjdEluRm9sZGVyIDogcGF0aFNlZ2VtZW50Q2hpbGRyZW4uZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhTZWdlbWVudCA9IG9iamVjdEluRm9sZGVyLmdldFBhdGhTZWdtZW50KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gKFN0cmluZykgb2JqZWN0SW5Gb2xkZXIuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXRoU2VnZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJnZXRDaGlsZHJlbiBvbWl0dGVkIHBhdGggc2VnZW1lbnQhIElkOiAiICsgb2JqZWN0SWQpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDbWlzT2JqZWN0IHBhdGhTZWdlbWVudENoaWxkID0gc2Vzc2lvbi5nZXRPYmplY3RCeVBhdGgoZm9sZGVyLmdldFBhdGgoKSwgcGF0aFNlZ2VtZW50KTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbWJpbmluZyB0aGUgcGF0aCBvZiB0aGUgcGFyZW50IGZvbGRlciBhbmQgdGhlIHBhdGggc2VnZW1lbnQgb2YgYSBjaGlsZCByZXR1cm5zIGEgZGlmZmVyZW50IG9iamVjdCEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb2JqZWN0SWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKG9iamVjdElkLCBwYXRoU2VnZW1lbnRDaGlsZC5nZXRJZCgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0RGVzY2VuZGFudHMKLQotICAgICAgICBpZiAoaXNHZXREZXNjZW5kYW50c1N1cHBvcnRlZChzZXNzaW9uKSkgewotICAgICAgICAgICAgbG9uZyBkZXNjZW5kYW50c0NvdW50ID0gMDsKLSAgICAgICAgICAgIExpc3Q8VHJlZTxGaWxlYWJsZUNtaXNPYmplY3Q+PiBkZXNjZW5kYW50cyA9IGZvbGRlci5nZXREZXNjZW5kYW50cygxLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICAgICAgZm9yIChUcmVlPEZpbGVhYmxlQ21pc09iamVjdD4gY2hpbGQgOiBkZXNjZW5kYW50cykgewotICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzQ291bnQrKzsKLQotICAgICAgICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBkZXNjZW5kYW50cyBjb250YWluIGEgbnVsbCB0cmVlISIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGVja0NoaWxkKHNlc3Npb24sIHJlc3VsdHMsIGZvbGRlciwgY2hpbGQuZ2V0SXRlbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBkZXNjZW5kYW50cyBkb2Vzbid0IG1hdGNoIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gcmV0dXJuZWQgYnkgZ2V0Q2hpbGRyZW4hIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGNoaWxkcmVuQ291bnQsIGRlc2NlbmRhbnRzQ291bnQsIG51bGwsIGYpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoU0tJUFBFRCwgImdldERlc2NlbmRhbnRzIGlzIG5vdCBzdXBwb3J0ZWQuIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0Rm9sZGVyVHJlZQotCi0gICAgICAgIGlmIChpc0dldEZvbGRlclRyZWVTdXBwb3J0ZWQoc2Vzc2lvbikpIHsKLSAgICAgICAgICAgIGxvbmcgZm9sZGVyVHJlZUNvdW50ID0gMDsKLSAgICAgICAgICAgIExpc3Q8VHJlZTxGaWxlYWJsZUNtaXNPYmplY3Q+PiBmb2xkZXJUcmVlID0gZm9sZGVyLmdldEZvbGRlclRyZWUoMSwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgICAgIGZvciAoVHJlZTxGaWxlYWJsZUNtaXNPYmplY3Q+IGNoaWxkIDogZm9sZGVyVHJlZSkgewotICAgICAgICAgICAgICAgIGZvbGRlclRyZWVDb3VudCsrOwotCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIHRyZWUgY29udGFpbnMgYSBudWxsIHRyZWUhIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrQ2hpbGQoc2Vzc2lvbiwgcmVzdWx0cywgZm9sZGVyLCBjaGlsZC5nZXRJdGVtKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTnVtYmVyIG9mIGZvbGRlcnMgZG9lc24ndCBtYXRjaCB0aGUgbnVtYmVyIG9mIGZvbGRlcnMgcmV0dXJuZWQgYnkgZ2V0Q2hpbGRyZW4hIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGNoaWxkcmVuRm9sZGVyQ291bnQsIGZvbGRlclRyZWVDb3VudCwgbnVsbCwgZikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiZ2V0Rm9sZGVyVHJlZSBpcyBub3Qgc3VwcG9ydGVkLiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tLSB3cmFwIHVwIC0tLQotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0SW1wbCByZXN1bHQgPSBjcmVhdGVSZXN1bHQoZ2V0V29yc3QocmVzdWx0cyksIG1lc3NhZ2UpOwotICAgICAgICByZXN1bHQuZ2V0Q2hpbGRyZW4oKS5hZGRBbGwocmVzdWx0cyk7Ci0KLSAgICAgICAgcmV0dXJuIChyZXN1bHQuZ2V0U3RhdHVzKCkuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpID8gbnVsbCA6IHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2hpbGQoU2Vzc2lvbiBzZXNzaW9uLCBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzLCBGb2xkZXIgZm9sZGVyLCBDbWlzT2JqZWN0IGNoaWxkKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaWYgKGNoaWxkID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBjb250YWlucyBhIG51bGwgY2hpbGQhIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nW10gcHJvcGVydGllc1RvQ2hlY2sgPSBuZXcgU3RyaW5nW2NoaWxkLmdldFR5cGUoKS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuc2l6ZSgpXTsKLQotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvcElkIDogY2hpbGQuZ2V0VHlwZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrW2krK10gPSBwcm9wSWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjaGVja09iamVjdChzZXNzaW9uLCBjaGlsZCwgcHJvcGVydGllc1RvQ2hlY2ssICJDaGlsZCBjaGVjazogIiArIGNoaWxkLmdldElkKCkpKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tWZXJzaW9uSGlzdG9yeShzZXNzaW9uLCBjaGlsZCwgcHJvcGVydGllc1RvQ2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaWxkIHZlcnNpb24gaGlzdG9yeSBjaGVjazogIiArIGNoaWxkLmdldElkKCkpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2hpbGQgaXMgbm90IGZpbGVhYmxlISBJZDogIiArIGNoaWxkLmdldElkKCkgKyAiIC8gVHlwZTogIgotICAgICAgICAgICAgICAgICAgICArIGNoaWxkLmdldFR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUoY2hpbGQgaW5zdGFuY2VvZiBGaWxlYWJsZUNtaXNPYmplY3QsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRmlsZWFibGVDbWlzT2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgRmlsZWFibGVDbWlzT2JqZWN0IGZpbGVhYmxlQ2hpbGQgPSAoRmlsZWFibGVDbWlzT2JqZWN0KSBjaGlsZDsKLQotICAgICAgICAgICAgICAgIFNldDxBY3Rpb24+IGFjdGlvbnMgPSBmaWxlYWJsZUNoaWxkLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNPYmplY3RQYXJlbnRzQWN0aW9uID0gYWN0aW9ucy5jb250YWlucyhBY3Rpb24uQ0FOX0dFVF9PQkpFQ1RfUEFSRU5UUyk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNGb2xkZXJQYXJlbnRBY3Rpb24gPSBhY3Rpb25zLmNvbnRhaW5zKEFjdGlvbi5DQU5fR0VUX0ZPTERFUl9QQVJFTlQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGhhc09iamVjdFBhcmVudHNBY3Rpb24gfHwgaGFzRm9sZGVyUGFyZW50QWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Rm9sZGVyPiBwYXJlbnRzID0gZmlsZWFibGVDaGlsZC5nZXRQYXJlbnRzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2hpbGQgaGFzIG5vIHBhcmVudHMhIElkOiAiICsgY2hpbGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRMaXN0Tm90RW1wdHkocGFyZW50cywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbGQgaXMgYSBmb2xkZXIgYW5kIGhhcyBtb3JlIHRoYW4gb25lIHBhcmVudCEgSWQ6ICIgKyBjaGlsZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc0ZhbHNlKHBhcmVudHMuc2l6ZSgpID4gMSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBGb2xkZXIgZm9sZGVyUGFyZW50ID0gKChGb2xkZXIpIGNoaWxkKS5nZXRGb2xkZXJQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2xkZXJQYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRGb2xkZXJQYXJlbnQoKSByZXR1cm5zIG51bGwgZm9yIGEgbm9uLXJvb3QgZm9sZGVyIG9iamVjdCEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNoaWxkLmdldElkKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldEZvbGRlclBhcmVudCgpIHJldHVybnMgd3JvbmcgcGFyZW50IG9iamVjdCEgSWQ6ICIgKyBjaGlsZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGZvbGRlci5nZXRJZCgpLCBmb2xkZXJQYXJlbnQuZ2V0SWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudHMuc2l6ZSgpID4gMCAmJiBwYXJlbnRzLmdldCgwKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0Rm9sZGVyUGFyZW50KCkgYW5kIGdldFBhcmVudHMoKSByZXR1cm4gZGlmZmVyZW50IHBhcmVudHMgZm9yIGEgZm9sZGVyIG9iamVjdCEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hpbGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMocGFyZW50cy5nZXQoMCkuZ2V0SWQoKSwgZm9sZGVyUGFyZW50LmdldElkKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kUGFyZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRm9sZGVyIHBhcmVudCA6IHBhcmVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk9uZSBvZiBjaGlsZHMgcGFyZW50cyBpcyBudWxsISBJZDogIiArIGNoaWxkLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRMaXN0Tm90RW1wdHkocGFyZW50cywgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb2xkZXIuZ2V0SWQoKS5lcXVhbHMocGFyZW50LmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFBhcmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyZW50IGZvbGRlciBpcyBub3QgaW4gcGFyZW50cyBvZiB0aGUgY2hpbGQhIElkOiAiICsgY2hpbGQuZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IG9iamVjdCBieSBpZCBhbmQgY29tcGFyZQotICAgICAgICAgICAgICAgIENtaXNPYmplY3Qgb2JqZWN0QnlJZCA9IHNlc3Npb24uZ2V0T2JqZWN0KGNoaWxkLmdldElkKCksIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2hpbGQgYW5kIG9iamVjdCBmZXRjaGVkIGJ5IGlkIGRvbid0IG1hdGNoISBJZDogIiArIGNoaWxkLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoY2hpbGQsIG9iamVjdEJ5SWQsIG51bGwsIGYsIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IG9iamVjdCBieSBwYXRoIGFuZCBjb21wYXJlCi0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhzID0gKChGaWxlYWJsZUNtaXNPYmplY3QpIGNoaWxkKS5nZXRQYXRocygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkocGF0aHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNoaWxkIGhhcyBubyBwYXRoISAiICsgY2hpbGQuZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBwYXRocykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ21pc09iamVjdCBvYmplY3RCeVBhdGggPSBzZXNzaW9uLmdldE9iamVjdEJ5UGF0aChwYXRoLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2hpbGQgYW5kIG9iamVjdCBmZXRjaGVkIGJ5IHBhdGggZG9uJ3QgbWF0Y2ghIElkOiAiICsgY2hpbGQuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLyBQYXRoOiAiICsgcGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGNoaWxkLCBvYmplY3RCeVBhdGgsIG51bGwsIGYsIGZhbHNlLCBmYWxzZSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJPYmplY3QgZmV0Y2hlZCBieSBpZCBhbmQgb2JqZWN0IGZldGNoZWQgYnkgcGF0aCBkb24ndCBtYXRjaCEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGlsZC5nZXRJZCgpICsgIiAvIFBhdGg6ICIgKyBwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMob2JqZWN0QnlJZCwgb2JqZWN0QnlQYXRoLCBudWxsLCBmLCB0cnVlLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkNoaWxkIGhhcyBubyBDQU5fR0VUX09CSkVDVF9QQVJFTlRTIGFsbG93YWJsZSBhY3Rpb24hIElkOiAiICsgY2hpbGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0QWxsb3dhYmxlQWN0aW9uKGNoaWxkLCBBY3Rpb24uQ0FOX0dFVF9PQkpFQ1RfUEFSRU5UUywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJDaGlsZCBoYXMgbm8gQ0FOX0dFVF9GT0xERVJfUEFSRU5UIGFsbG93YWJsZSBhY3Rpb24hIElkOiAiICsgY2hpbGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEFsbG93YWJsZUFjdGlvbihjaGlsZCwgQWN0aW9uLkNBTl9HRVRfRk9MREVSX1BBUkVOVCwgbnVsbCwgZikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydFNoYWxsb3dFcXVhbHMoQ21pc09iamVjdCBleHBlY3RlZCwgQ21pc09iamVjdCBhY3R1YWwsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsCi0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0KLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpZiAoKGV4cGVjdGVkID09IG51bGwpICYmIChhY3R1YWwgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkV4cGVjdGVkIG9iamVjdCBpcyBudWxsLCBidXQgYWN0dWFsIG9iamVjdCBpcyBub3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFjdHVhbCBvYmplY3QgaXMgbnVsbCwgYnV0IGV4cGVjdGVkIG9iamVjdCBpcyBub3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJJZHMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0SWQoKSwgYWN0dWFsLmdldElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJCYXNlIHR5cGVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldEJhc2VUeXBlSWQoKSwgYWN0dWFsLmdldEJhc2VUeXBlSWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlR5cGVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFR5cGUoKS5nZXRJZCgpLCBhY3R1YWwuZ2V0VHlwZSgpLmdldElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAoZ2V0V29yc3QocmVzdWx0cykuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChzdWNjZXNzLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tIHR5cGUgY2hlY2tzIC0tLQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGNoZWNrUXVlcnlOYW1lKFN0cmluZyBxdWVyeU5hbWUsIGJvb2xlYW4gaXNSZXF1aXJlZCwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpZiAocXVlcnlOYW1lID09IG51bGwgfHwgcXVlcnlOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoaXNSZXF1aXJlZCA/IEZBSUxVUkUgOiBXQVJOSU5HLCAiUXVlcnkgbmFtZSBpcyBub3Qgc2V0ISIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5IG5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICcgJyIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydElzVHJ1ZShxdWVyeU5hbWUuaW5kZXhPZignICcpIDwgMCwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyOiAnLCciKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocXVlcnlOYW1lLmluZGV4T2YoJywnKSA8IDAsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcjogJ1wiJyIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydElzVHJ1ZShxdWVyeU5hbWUuaW5kZXhPZignIicpIDwgMCwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyOiAnJyciKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocXVlcnlOYW1lLmluZGV4T2YoJ1wnJykgPCAwLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5IG5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICdcXCciKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocXVlcnlOYW1lLmluZGV4T2YoJ1xcJykgPCAwLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5IG5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICcuJyIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydElzVHJ1ZShxdWVyeU5hbWUuaW5kZXhPZignLicpIDwgMCwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyOiAnKCciKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocXVlcnlOYW1lLmluZGV4T2YoJygnKSA8IDAsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcjogJyknIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNUcnVlKHF1ZXJ5TmFtZS5pbmRleE9mKCcpJykgPCAwLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5IG5hbWUgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICdcXHQnIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNUcnVlKHF1ZXJ5TmFtZS5pbmRleE9mKCdcdCcpIDwgMCwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyOiAnXFxuJyIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydElzVHJ1ZShxdWVyeU5hbWUuaW5kZXhPZignXG4nKSA8IDAsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcjogJ1xcciciKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUocXVlcnlOYW1lLmluZGV4T2YoJ1xyJykgPCAwLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzVGVzdFJlc3VsdEltcGwgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KGdldFdvcnN0KHJlc3VsdHMpLCBtZXNzYWdlKTsKLSAgICAgICAgcmVzdWx0LmdldENoaWxkcmVuKCkuYWRkQWxsKHJlc3VsdHMpOwotCi0gICAgICAgIHJldHVybiAocmVzdWx0LmdldFN0YXR1cygpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSA/IG51bGwgOiByZXN1bHQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBjaGVja1R5cGVEZWZpbml0aW9uKFNlc3Npb24gc2Vzc2lvbiwgVHlwZURlZmluaXRpb24gdHlwZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUeXBlIGlzIG51bGwhIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHR5cGUsIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUeXBlIGlkIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0U3RyaW5nTm90RW1wdHkodHlwZS5nZXRJZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkJhc2UgdHlwZSBpZCBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwodHlwZS5nZXRCYXNlVHlwZUlkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTG9jYWwgbmFtZSBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHR5cGUuZ2V0TG9jYWxOYW1lKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgLy8gZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTG9jYWwgbmFtZXNwYWNlIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICAvLyBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0U3RyaW5nTm90RW1wdHkodHlwZS4oKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBib29sZWFuIGlzUXVlcnlOYW1lUmVxdWlyZWQgPSBCb29sZWFuLlRSVUUuZXF1YWxzKHR5cGUuaXNRdWVyeWFibGUoKSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tRdWVyeU5hbWUodHlwZS5nZXRRdWVyeU5hbWUoKSwgaXNRdWVyeU5hbWVSZXF1aXJlZCwgIlR5cGUgUXVlcnkgTmFtZTogIiArIHR5cGUuZ2V0UXVlcnlOYW1lKCkpKTsKLQotICAgICAgICAgICAgaWYgKCh0eXBlLmdldElkKCkgIT0gbnVsbCkgJiYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpLnZhbHVlKCkuZXF1YWxzKHR5cGUuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQmFzZSB0eXBlIGhhcyBwYXJlbnQgdHlwZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ051bGxPckVtcHR5KHR5cGUuZ2V0UGFyZW50VHlwZUlkKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQYXJlbnQgdHlwZSBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0U3RyaW5nTm90RW1wdHkodHlwZS5nZXRQYXJlbnRUeXBlSWQoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ3JlYXRhYmxlIGZsYWcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHR5cGUuaXNDcmVhdGFibGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGaWxlYWJsZSBmbGFnIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbCh0eXBlLmlzRmlsZWFibGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDb250cm9sbGFibGUgQUNMIGZsYWcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHR5cGUuaXNDb250cm9sbGFibGVBY2woKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDb250cm9sbGFibGUgUG9saWN5IGZsYWcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHR5cGUuaXNDb250cm9sbGFibGVQb2xpY3koKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGdWxsdGV4dCBpbmRleGVkIGZsYWcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHR5cGUuaXNGdWxsdGV4dEluZGV4ZWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJJbmNsdWRlZCBpbiBzdXBlciB0eXBlIGZsYWcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHR5cGUuaXNJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeWFibGUgZmxhZyBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwodHlwZS5pc1F1ZXJ5YWJsZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlR5cGUgZGlzcGxheSBuYW1lIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0U3RyaW5nTm90RW1wdHkodHlwZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlR5cGUgZGVzY3JpcHRpb24gaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRTdHJpbmdOb3RFbXB0eSh0eXBlLmdldERlc2NyaXB0aW9uKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgaWYgKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC5lcXVhbHModHlwZS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2NUeXBlID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGU7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uYWJsZSBmbGFnIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwoZG9jVHlwZS5pc1ZlcnNpb25hYmxlKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgc3RyZWFtIGFsbG93ZWQgZmxhZyBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKGRvY1R5cGUuZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChCYXNlVHlwZUlkLkNNSVNfRk9MREVSLmVxdWFscyh0eXBlLmdldEJhc2VUeXBlSWQoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0ZpbGVhYmxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgdHlwZXMgbXVzdCBiZSBmaWxlYWJsZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydElzVHJ1ZSh0eXBlLmlzRmlsZWFibGUoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC5lcXVhbHModHlwZS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwVHlwZURlZmluaXRpb24gcmVsVHlwZSA9IChSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbikgdHlwZTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFsbG93ZWQgU291cmNlIFR5cGUgSWRzIGFyZSBub3Qgc2V0ISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHJlbFR5cGUuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbFR5cGUuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR5cGVJZCA6IHJlbFR5cGUuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKHR5cGVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxvd2VkIFNvdXJjZSBUeXBlIElkcyBjb250YWluIGEgdHlwZSBpZCB0aGF0IGRvZXNuJ3QgZXhpc3Q6ICIgKyB0eXBlSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb3dlZCBTb3VyY2UgVHlwZSBJZHMgY29udGFpbiBhIHR5cGUgaWQgdGhhdCBkb2Vzbid0IGV4aXN0OiAiICsgdHlwZUlkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBbGxvd2VkIFRhcmdldCBUeXBlIElkcyBhcmUgbm90IHNldCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChyZWxUeXBlLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWxUeXBlLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlSWQgOiByZWxUeXBlLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb3dlZCBUYXJnZXQgVHlwZSBJZHMgY29udGFpbiBhIHR5cGUgaWQgdGhhdCBkb2Vzbid0IGV4aXN0OiAiICsgdHlwZUlkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsbG93ZWQgVGFyZ2V0IFR5cGUgSWRzIGNvbnRhaW4gYSB0eXBlIGlkIHRoYXQgZG9lc24ndCBleGlzdDogIiArIHR5cGVJZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNGaWxlYWJsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUmVsYXRpb25zaGlwIHR5cGVzIG11c3Qgbm90IGJlIGZpbGVhYmxlISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0SXNGYWxzZSh0eXBlLmlzRmlsZWFibGUoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQmFzZVR5cGVJZC5DTUlTX1BPTElDWS5lcXVhbHModHlwZS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBpZiAoIUJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkuZXF1YWxzKHR5cGUuZ2V0QmFzZVR5cGVJZCgpKSkgewotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBoYXMgbm8gcHJvcGVydHkgZGVmaW5pdGlvbnMhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwodHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BEZWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkEgcHJvcGVydHkgZGVmaW5pdGlvbiBpcyBudWxsISIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcERlZi5nZXRJZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBIHByb3BlcnR5IGRlZmluaXRpb24gaWQgaXMgbnVsbCEiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQcm9wZXJ0eURlZmluaXRpb24ocHJvcERlZiwgIlByb3BlcnR5IGRlZmluaXRpb246ICIgKyBwcm9wRGVmLmdldElkKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENtaXNQcm9wZXJ0eURlZmludGlvbiBjcGQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBjbWlzOm5hbWUKLSAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLk5BTUUsIG51bGwsIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgLy8gY21pczpvYmplY3RJZAotICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuT0JKRUNUX0lELCBmYWxzZSwgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5TSU5HTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgLy8gY21pczpiYXNlVHlwZUlkCi0gICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQsIGZhbHNlLCBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5LlNJTkdMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjbWlzOm9iamVjdFR5cGVJZAotICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHRydWUsIFByb3BlcnR5VHlwZS5JRCwgQ2FyZGluYWxpdHkuU0lOR0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5Lk9OQ1JFQVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLQotICAgICAgICAgICAgICAgIC8vIGNtaXM6Y3JlYXRlZEJ5Ci0gICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5DUkVBVEVEX0JZLCBmYWxzZSwgUHJvcGVydHlUeXBlLlNUUklORywgQ2FyZGluYWxpdHkuU0lOR0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLQotICAgICAgICAgICAgICAgIC8vIGNtaXM6Y3JlYXRpb25EYXRlCi0gICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5DUkVBVElPTl9EQVRFLCBmYWxzZSwgUHJvcGVydHlUeXBlLkRBVEVUSU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIHRydWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgLy8gY21pczpsYXN0TW9kaWZpZWRCeQotICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuTEFTVF9NT0RJRklFRF9CWSwgZmFsc2UsIFByb3BlcnR5VHlwZS5TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjbWlzOmxhc3RNb2RpZmljYXRpb25EYXRlCi0gICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUNBVElPTl9EQVRFLCBmYWxzZSwgUHJvcGVydHlUeXBlLkRBVEVUSU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIHRydWUsIHRydWUpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgLy8gY21pczpjaGFuZ2VUb2tlbgotICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuQ0hBTkdFX1RPS0VOLCBmYWxzZSwgUHJvcGVydHlUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLQotICAgICAgICAgICAgICAgIC8vIENNSVMgMS4xIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldENtaXNWZXJzaW9uKCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczpkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLkRFU0NSSVBUSU9OLCBudWxsLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNtaXM6c2Vjb25kYXJ5T2JqZWN0VHlwZUlkcwotICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsIGZhbHNlLCBQcm9wZXJ0eVR5cGUuSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuTVVMVEksIG51bGwsIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC5lcXVhbHModHlwZS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbWlzOmlzUHJpdmF0ZVdvcmtpbmdDb3B5Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLklTX1BSSVZBVEVfV09SS0lOR19DT1BZLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVR5cGUuQk9PTEVBTiwgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULmVxdWFscyh0eXBlLmdldEJhc2VUeXBlSWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczppc0ltbXV0YWJsZQotICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLklTX0lNTVVUQUJMRSwgZmFsc2UsIFByb3BlcnR5VHlwZS5CT09MRUFOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczppc0xhdGVzdFZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5JU19MQVRFU1RfVkVSU0lPTiwgZmFsc2UsIFByb3BlcnR5VHlwZS5CT09MRUFOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczppc01ham9yVmVyc2lvbgotICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04sIGZhbHNlLCBQcm9wZXJ0eVR5cGUuQk9PTEVBTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNtaXM6aXNMYXRlc3RNYWpvclZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5JU19MQVRFU1RfTUFKT1JfVkVSU0lPTiwgZmFsc2UsIFByb3BlcnR5VHlwZS5CT09MRUFOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczp2ZXJzaW9uTGFiZWwKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMLCBmYWxzZSwgUHJvcGVydHlUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNtaXM6dmVyc2lvblNlcmllc0lkCi0gICAgICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfSUQsIGZhbHNlLCBQcm9wZXJ0eVR5cGUuSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjbWlzOmlzVmVyc2lvblNlcmllc0NoZWNrZWRPdXQKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5JU19WRVJTSU9OX1NFUklFU19DSEVDS0VEX09VVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlUeXBlLkJPT0xFQU4sIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5Ci0gICAgICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfQlksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5TVFJJTkcsIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkCi0gICAgICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQsIGZhbHNlLCBQcm9wZXJ0eVR5cGUuSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZGluYWxpdHkuU0lOR0xFLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjbWlzOmNoZWNraW5Db21tZW50Ci0gICAgICAgICAgICAgICAgICAgIGNwZCA9IG5ldyBDbWlzUHJvcGVydHlEZWZpbnRpb24oUHJvcGVydHlJZHMuQ0hFQ0tJTl9DT01NRU5ULCBmYWxzZSwgUHJvcGVydHlUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNtaXM6Y29udGVudFN0cmVhbUxlbmd0aAotICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCwgZmFsc2UsIFByb3BlcnR5VHlwZS5JTlRFR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczpjb250ZW50U3RyZWFtTWltZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUsIGZhbHNlLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczpjb250ZW50U3RyZWFtRmlsZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUsIGZhbHNlLCBQcm9wZXJ0eVR5cGUuU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5LlNJTkdMRSwgVXBkYXRhYmlsaXR5LlJFQURPTkxZLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczpjb250ZW50U3RyZWFtSWQKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9JRCwgZmFsc2UsIFByb3BlcnR5VHlwZS5JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi5lcXVhbHModHlwZS5nZXRCYXNlVHlwZUlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNtaXM6cGFyZW50SWQKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5QQVJFTlRfSUQsIGZhbHNlLCBQcm9wZXJ0eVR5cGUuSUQsIENhcmRpbmFsaXR5LlNJTkdMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjbWlzOnBhdGgKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5QQVRILCBmYWxzZSwgUHJvcGVydHlUeXBlLlNUUklORywgQ2FyZGluYWxpdHkuU0lOR0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eS5SRUFET05MWSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNtaXM6YWxsb3dlZENoaWxkT2JqZWN0VHlwZUlkcwotICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLkFMTE9XRURfQ0hJTERfT0JKRUNUX1RZUEVfSURTLCBmYWxzZSwgUHJvcGVydHlUeXBlLklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRpbmFsaXR5Lk1VTFRJLCBVcGRhdGFiaWxpdHkuUkVBRE9OTFksIG51bGwsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNwZC5jaGVjayh0eXBlKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQLmVxdWFscyh0eXBlLmdldEJhc2VUeXBlSWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY21pczpzb3VyY2VJZAotICAgICAgICAgICAgICAgICAgICBjcGQgPSBuZXcgQ21pc1Byb3BlcnR5RGVmaW50aW9uKFByb3BlcnR5SWRzLlNPVVJDRV9JRCwgdHJ1ZSwgUHJvcGVydHlUeXBlLklELCBDYXJkaW5hbGl0eS5TSU5HTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcGQuY2hlY2sodHlwZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNtaXM6dGFyZ2V0SWQKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5UQVJHRVRfSUQsIHRydWUsIFByb3BlcnR5VHlwZS5JRCwgQ2FyZGluYWxpdHkuU0lOR0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kuZXF1YWxzKHR5cGUuZ2V0QmFzZVR5cGVJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBjbWlzOnBvbGljeVRleHQKLSAgICAgICAgICAgICAgICAgICAgY3BkID0gbmV3IENtaXNQcm9wZXJ0eURlZmludGlvbihQcm9wZXJ0eUlkcy5QT0xJQ1lfVEVYVCwgbnVsbCwgUHJvcGVydHlUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXJkaW5hbGl0eS5TSU5HTEUsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3BkLmNoZWNrKHR5cGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzVGVzdFJlc3VsdEltcGwgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KGdldFdvcnN0KHJlc3VsdHMpLCBtZXNzYWdlKTsKLSAgICAgICAgcmVzdWx0LmdldENoaWxkcmVuKCkuYWRkQWxsKHJlc3VsdHMpOwotCi0gICAgICAgIHJldHVybiAocmVzdWx0LmdldFN0YXR1cygpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSA/IG51bGwgOiByZXN1bHQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBjaGVja1Byb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSBkZWZpbml0aW9uIGlzIG51bGwhIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHByb3BEZWYsIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAocHJvcERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSBpZCBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHByb3BEZWYuZ2V0SWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJMb2NhbCBuYW1lIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0U3RyaW5nTm90RW1wdHkocHJvcERlZi5nZXRMb2NhbE5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJMb2NhbCBuYW1lc3BhY2UgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIC8vIGFkZFJlc3VsdChyZXN1bHRzLAotICAgICAgICAgICAgLy8gYXNzZXJ0U3RyaW5nTm90RW1wdHkocHJvcERlZi5nZXRMb2NhbE5hbWVzcGFjZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5IG5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRTdHJpbmdOb3RFbXB0eShwcm9wRGVmLmdldFF1ZXJ5TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkRpc3BsYXkgbmFtZSBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHByb3BEZWYuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJEZXNjcmlwdGlvbiBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydFN0cmluZ05vdEVtcHR5KHByb3BEZWYuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSB0eXBlIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNhcmRpbmFsaXR5IGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChwcm9wRGVmLmdldENhcmRpbmFsaXR5KCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVXBkYXRhYmlsaXR5IGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChwcm9wRGVmLmdldFVwZGF0YWJpbGl0eSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkluaGVyaXRlZCBmbGFnIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0Tm90TnVsbChwcm9wRGVmLmlzSW5oZXJpdGVkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUmVxdWlyZWQgZmxhZyBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwocHJvcERlZi5pc1JlcXVpcmVkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnlhYmxlIGZsYWcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnROb3ROdWxsKHByb3BEZWYuaXNRdWVyeWFibGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJPcmRlcmFibGUgZmxhZyBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydE5vdE51bGwocHJvcERlZi5pc09yZGVyYWJsZSgpLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzVGVzdFJlc3VsdEltcGwgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KGdldFdvcnN0KHJlc3VsdHMpLCBtZXNzYWdlKTsKLSAgICAgICAgcmVzdWx0LmdldENoaWxkcmVuKCkuYWRkQWxsKHJlc3VsdHMpOwotCi0gICAgICAgIHJldHVybiAocmVzdWx0LmdldFN0YXR1cygpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSA/IG51bGwgOiByZXN1bHQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRFcXVhbHMoVHlwZURlZmluaXRpb24gZXhwZWN0ZWQsIFR5cGVEZWZpbml0aW9uIGFjdHVhbCwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLQotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmICgoZXhwZWN0ZWQgPT0gbnVsbCkgJiYgKGFjdHVhbCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRXhwZWN0ZWQgdHlwZSBkZWZpbnRpb24gaXMgbnVsbCwgYnV0IGFjdHVhbCB0eXBlIGRlZmludGlvbiBpcyBub3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFjdHVhbCB0eXBlIGRlZmludGlvbiBpcyBudWxsLCBidXQgZXhwZWN0ZWQgdHlwZSBkZWZpbnRpb24gaXMgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBpZHMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0SWQoKSwgYWN0dWFsLmdldElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJCYXNlIHR5cGUgaWRzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldEJhc2VUeXBlSWQoKSwgYWN0dWFsLmdldEJhc2VUeXBlSWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlBhcmVudCB0eXBlIGlkcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRQYXJlbnRUeXBlSWQoKSwgYWN0dWFsLmdldFBhcmVudFR5cGVJZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgbmFtZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UXVlcnlOYW1lKCksIGFjdHVhbC5nZXRRdWVyeU5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkxvY2FsIG5hbWVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldExvY2FsTmFtZSgpLCBhY3R1YWwuZ2V0TG9jYWxOYW1lKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJMb2NhbCBuYW1lc3BhY2VzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldExvY2FsTmFtZXNwYWNlKCksIGFjdHVhbC5nZXRMb2NhbE5hbWVzcGFjZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRGlzcGxheSBuYW1lcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXREaXNwbGF5TmFtZSgpLCBhY3R1YWwuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRlc2NyaXB0aW9ucyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXREZXNjcmlwdGlvbigpLCBhY3R1YWwuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRyb2xsYWJsZSBBQ2wgZmxhZ3MgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuaXNDb250cm9sbGFibGVBY2woKSwgYWN0dWFsLmlzQ29udHJvbGxhYmxlQWNsKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDb250cm9sbGFibGUgUG9saWN5IGZsYWdzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmlzQ29udHJvbGxhYmxlUG9saWN5KCksIGFjdHVhbC5pc0NvbnRyb2xsYWJsZVBvbGljeSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ3JlYXRhYmxlIGZsYWdzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmlzQ3JlYXRhYmxlKCksIGFjdHVhbC5pc0NyZWF0YWJsZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRmlsZWFibGUgZmxhZ3MgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuaXNGaWxlYWJsZSgpLCBhY3R1YWwuaXNGaWxlYWJsZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRnVsbHRleHQgaW5kZXhlZCBmbGFncyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5pc0Z1bGx0ZXh0SW5kZXhlZCgpLCBhY3R1YWwuaXNGdWxsdGV4dEluZGV4ZWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5YWJsZSBmbGFncyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5pc1F1ZXJ5YWJsZSgpLCBhY3R1YWwuaXNRdWVyeWFibGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkluY2x1ZGVkIGluIHN1cGVydHlwZSBxdWVyeSBmbGFncyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmlzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KCksIGFjdHVhbC5pc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkLmdldFR5cGVNdXRhYmlsaXR5KCkgIT0gbnVsbCAmJiBhY3R1YWwuZ2V0VHlwZU11dGFiaWxpdHkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUeXBlIE11dGFiaWxpdHk6IENyZWF0ZSBmbGFncyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFR5cGVNdXRhYmlsaXR5KCkuY2FuQ3JlYXRlKCksIGFjdHVhbC5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhbkNyZWF0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBNdXRhYmlsaXR5OiB1cGRhdGUgZmxhZ3MgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhblVwZGF0ZSgpLCBhY3R1YWwuZ2V0VHlwZU11dGFiaWxpdHkoKS5jYW5VcGRhdGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlR5cGUgTXV0YWJpbGl0eTogZGVsZXRlIGZsYWdzIGRvbid0IG1hdGNoISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0VHlwZU11dGFiaWxpdHkoKS5jYW5EZWxldGUoKSwgYWN0dWFsLmdldFR5cGVNdXRhYmlsaXR5KCkuY2FuRGVsZXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgZikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBNdXRhYmlsaXR5IGluZm9zIGRvbid0IG1hdGNoISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRUeXBlTXV0YWJpbGl0eSgpLCBhY3R1YWwuZ2V0VHlwZU11dGFiaWxpdHkoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChleHBlY3RlZC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCkgJiYgKGFjdHVhbC5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gZXBkID0gZXhwZWN0ZWQuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBhcGQgPSBhY3R1YWwuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEaWZmZXJlbnQgbnVtYmVyIG9mIHByb3BlcnR5IGRlZmludGlvbnMhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGVwZC5zaXplKCksIGFwZC5zaXplKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gcGQgOiBlcGQudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSBkZWZpbml0aW9uIG1pc21hdGNoOiAiICsgcGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhwZCwgYXBkLmdldChwZC5nZXRJZCgpKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldFdvcnN0KHJlc3VsdHMpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoc3VjY2VzcywgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRFcXVhbHMoUHJvcGVydHlEZWZpbml0aW9uPD8+IGV4cGVjdGVkLCBQcm9wZXJ0eURlZmluaXRpb248Pz4gYWN0dWFsLAotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSkgewotCi0gICAgICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0UmVzdWx0PigpOwotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaWYgKChleHBlY3RlZCA9PSBudWxsKSAmJiAoYWN0dWFsID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJFeHBlY3RlZCBwcm9wZXJ0eSBkZWZpbnRpb24gaXMgbnVsbCwgYnV0IGFjdHVhbCBwcm9wZXJ0eSBkZWZpbnRpb24gaXMgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBY3R1YWwgcHJvcGVydHkgZGVmaW50aW9uIGlzIG51bGwsIGJ1dCBleHBlY3RlZCBwcm9wZXJ0eSBkZWZpbnRpb24gaXMgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUHJvcGVydHkgaWRzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldElkKCksIGFjdHVhbC5nZXRJZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTG9jYWwgbmFtZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TG9jYWxOYW1lKCksIGFjdHVhbC5nZXRMb2NhbE5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkxvY2FsIG5hbWVzcGFjZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TG9jYWxOYW1lc3BhY2UoKSwgYWN0dWFsLmdldExvY2FsTmFtZXNwYWNlKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEaXNwbGF5IG5hbWVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldERpc3BsYXlOYW1lKCksIGFjdHVhbC5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgbmFtZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UXVlcnlOYW1lKCksIGFjdHVhbC5nZXRRdWVyeU5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IHR5cGVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFByb3BlcnR5VHlwZSgpLCBhY3R1YWwuZ2V0UHJvcGVydHlUeXBlKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDYXJkaW5hbGl0aWVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldENhcmRpbmFsaXR5KCksIGFjdHVhbC5nZXRDYXJkaW5hbGl0eSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRGVzY3JpcHRpb25zIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldERlc2NyaXB0aW9uKCksIGFjdHVhbC5nZXREZXNjcmlwdGlvbigpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVXBkYXRhYmlsaXR5IGZsYWdzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFVwZGF0YWJpbGl0eSgpLCBhY3R1YWwuZ2V0VXBkYXRhYmlsaXR5KCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEZWZhdWx0IHZhbHVlcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFsTGlzdHMoZXhwZWN0ZWQuZ2V0RGVmYXVsdFZhbHVlKCksIGFjdHVhbC5nZXREZWZhdWx0VmFsdWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkluaGVyaXRlZCBmbGFncyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5pc0luaGVyaXRlZCgpLCBhY3R1YWwuaXNJbmhlcml0ZWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJlcXVpcmVkIGZsYWdzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmlzUmVxdWlyZWQoKSwgYWN0dWFsLmlzUmVxdWlyZWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5YWJsZSBmbGFncyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5pc1F1ZXJ5YWJsZSgpLCBhY3R1YWwuaXNRdWVyeWFibGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk9yZGVyYWJsZSBmbGFncyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5pc09yZGVyYWJsZSgpLCBhY3R1YWwuaXNPcmRlcmFibGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk9wZW4gY2hvaWNlIGZsYWdzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmlzT3BlbkNob2ljZSgpLCBhY3R1YWwuaXNPcGVuQ2hvaWNlKCksIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAoZ2V0V29yc3QocmVzdWx0cykuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChzdWNjZXNzLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydEVxdWFscyhDbWlzT2JqZWN0IGV4cGVjdGVkLCBDbWlzT2JqZWN0IGFjdHVhbCwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUsIGJvb2xlYW4gY2hlY2tBY2xzLCBib29sZWFuIGNoZWNrUG9saWNpZXMpIHsKLQotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmICgoZXhwZWN0ZWQgPT0gbnVsbCkgJiYgKGFjdHVhbCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRXhwZWN0ZWQgb2JqZWN0IGlzIG51bGwsIGJ1dCBhY3R1YWwgb2JqZWN0IGlzIG5vdCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGYpOwotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQWN0dWFsIG9iamVjdCBpcyBudWxsLCBidXQgZXhwZWN0ZWQgb2JqZWN0IGlzIG5vdCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGYpOwotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZC5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpICE9IGFjdHVhbC5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOdW1iZXIgb2YgcHJvcGVydGllcyBkb24ndCBtYXRjaCIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpLCBhY3R1YWwuZ2V0UHJvcGVydGllcygpLnNpemUoKSwgbnVsbCwgZikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eTw/PiBleHBlY3RlZFByb3BlcnR5IDogZXhwZWN0ZWQuZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHk8Pz4gYWN0dWFsUHJvcGVydHkgPSBhY3R1YWwuZ2V0UHJvcGVydHkoZXhwZWN0ZWRQcm9wZXJ0eS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnRpZXMgZG9uJ3QgbWF0Y2ghIFByb3BlcnR5OiAiICsgZXhwZWN0ZWRQcm9wZXJ0eS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUHJvcGVydHksIGFjdHVhbFByb3BlcnR5LCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBbGxvd2FibGUgYWN0aW9ucyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRBbGxvd2FibGVBY3Rpb25zKCksIGFjdHVhbC5nZXRBbGxvd2FibGVBY3Rpb25zKCksIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAoY2hlY2tBY2xzKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBQ0xzIGRvbid0IG1hdGNoISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRBY2woKSwgYWN0dWFsLmdldEFjbCgpLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hlY2tQb2xpY2llcykgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUG9saWNpZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxPYmplY3RMaXN0KGV4cGVjdGVkLmdldFBvbGljaWVzKCksIGFjdHVhbC5nZXRQb2xpY2llcygpLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZWxhdGlvbnNoaXBzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxPYmplY3RMaXN0KGV4cGVjdGVkLmdldFJlbGF0aW9uc2hpcHMoKSwgYWN0dWFsLmdldFJlbGF0aW9uc2hpcHMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJlbmRpdGlvbnMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbFJlbmRpdGlvbkxpc3RzKGV4cGVjdGVkLmdldFJlbmRpdGlvbnMoKSwgYWN0dWFsLmdldFJlbmRpdGlvbnMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGlmIChnZXRXb3JzdChyZXN1bHRzKS5nZXRMZXZlbCgpIDw9IE9LLmdldExldmVsKCkpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKHN1Y2Nlc3MsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0RXF1YWxPYmplY3RMaXN0KExpc3Q8PyBleHRlbmRzIENtaXNPYmplY3Q+IGV4cGVjdGVkLAotICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQ21pc09iamVjdD4gYWN0dWFsLCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLCBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0KLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpZiAoKGV4cGVjdGVkID09IG51bGwpICYmIChhY3R1YWwgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkV4cGVjdGVkIGxpc3Qgb2YgQ01JUyBvYmplY3RzIGlzIG51bGwsIGJ1dCBhY3R1YWwgbGlzdCBvZiBDTUlTIG9iamVjdHMgaXMgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBY3R1YWwgbGlzdCBvZiBDTUlTIG9iamVjdHMgaXMgbnVsbCwgYnV0IGV4cGVjdGVkIGxpc3Qgb2YgQ01JUyBvYmplY3RzIGlzIG5vdCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGYpOwotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZC5zaXplKCkgIT0gYWN0dWFsLnNpemUoKSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0IGxpc3Qgc2l6ZXMgZG9uJ3QgbWF0Y2ghIGV4cGVjdGVkOiAiICsgZXhwZWN0ZWQuc2l6ZSgpICsgIiAvIGFjdHVhbDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhY3R1YWwuc2l6ZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiT2JqZWN0cyBhdCBwb3NpdGlvbiAiICsgaSArICIgIGRvbnQndCBtYXRjaCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldChpKSwgYWN0dWFsLmdldChpKSwgbnVsbCwgZiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRXb3JzdChyZXN1bHRzKS5nZXRMZXZlbCgpIDw9IE9LLmdldExldmVsKCkpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKHN1Y2Nlc3MsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0RXF1YWxzKFByb3BlcnR5PD8+IGV4cGVjdGVkLCBQcm9wZXJ0eTw/PiBhY3R1YWwsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsCi0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0KLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpZiAoKGV4cGVjdGVkID09IG51bGwpICYmIChhY3R1YWwgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkV4cGVjdGVkIHByb3BlcnR5IGlzIG51bGwsIGJ1dCBhY3R1YWwgcHJvcGVydHkgaXMgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBY3R1YWwgcHJvcGVydHkgaXMgbnVsbCwgYnV0IGV4cGVjdGVkIHByb3BlcnR5IGlzIG5vdCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGYpOwotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IGRlZmluaXRpb25zIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldERlZmluaXRpb24oKSwgYWN0dWFsLmdldERlZmluaXRpb24oKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IHZhbHVlcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFsTGlzdHMoZXhwZWN0ZWQuZ2V0VmFsdWVzKCksIGFjdHVhbC5nZXRWYWx1ZXMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGlmIChnZXRXb3JzdChyZXN1bHRzKS5nZXRMZXZlbCgpIDw9IE9LLmdldExldmVsKCkpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKHN1Y2Nlc3MsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0RXF1YWxzKEFsbG93YWJsZUFjdGlvbnMgZXhwZWN0ZWQsIEFsbG93YWJsZUFjdGlvbnMgYWN0dWFsLCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLAotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSkgewotCi0gICAgICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0UmVzdWx0PigpOwotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaWYgKChleHBlY3RlZCA9PSBudWxsKSAmJiAoYWN0dWFsID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJFeHBlY3RlZCBhbGxvd2FibGUgYWN0aW9ucyBhcmUgbnVsbCwgYnV0IGFjdHVhbCBhbGxvd2FibGUgYWN0aW9ucyBhcmUgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBY3R1YWwgYWxsb3dhYmxlIGFjdGlvbnMgYXJlIG51bGwsIGJ1dCBleHBlY3RlZCBhbGxvd2FibGUgYWN0aW9ucyBhcmUgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQWxsb3dhYmxlIGFjdGlvbiBzZXRzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxTZXQoZXhwZWN0ZWQuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLCBhY3R1YWwuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgaWYgKGdldFdvcnN0KHJlc3VsdHMpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoc3VjY2VzcywgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRFcXVhbHMoQWNsIGV4cGVjdGVkLCBBY2wgYWN0dWFsLCBDbWlzVGVzdFJlc3VsdCBzdWNjZXNzLCBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0KLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpZiAoKGV4cGVjdGVkID09IG51bGwpICYmIChhY3R1YWwgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkV4cGVjdGVkIEFDTCBpcyBudWxsLCBidXQgYWN0dWFsIEFDTCBpcyBub3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFjdHVhbCBBQ0wgaXMgbnVsbCwgYnV0IGV4cGVjdGVkIEFDTCBpcyBub3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBQ0VzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxBY2VMaXN0cyhleHBlY3RlZC5nZXRBY2VzKCksIGFjdHVhbC5nZXRBY2VzKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJFeGFjdCBmbGFncyBkb250J3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuaXNFeGFjdCgpLCBhY3R1YWwuaXNFeGFjdCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgaWYgKGdldFdvcnN0KHJlc3VsdHMpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoc3VjY2VzcywgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRFcXVhbEFjZUxpc3RzKExpc3Q8QWNlPiBleHBlY3RlZCwgTGlzdDxBY2U+IGFjdHVhbCwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLQotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJFeHBlY3RlZCBBQ0UgbGlzdCBpcyBudWxsISIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiQWN0dWFsIEFDRSBsaXN0IGlzIG51bGwhIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkLnNpemUoKSAhPSBhY3R1YWwuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiQUNFIGxpc3Qgc2l6ZXMgZG9uJ3QgbWF0Y2ghIGV4cGVjdGVkOiAiICsgZXhwZWN0ZWQuc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC8gYWN0dWFsOiAiICsgYWN0dWFsLnNpemUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFDRXMgYXQgcG9zaXRpb24gIiArIGkgKyAiICBkb250J3QgbWF0Y2ghIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQoaSksIGFjdHVhbC5nZXQoaSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRXb3JzdChyZXN1bHRzKS5nZXRMZXZlbCgpIDw9IE9LLmdldExldmVsKCkpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKHN1Y2Nlc3MsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgYXNzZXJ0RXF1YWxzKEFjZSBleHBlY3RlZCwgQWNlIGFjdHVhbCwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSkgewotCi0gICAgICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0UmVzdWx0PigpOwotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaWYgKChleHBlY3RlZCA9PSBudWxsKSAmJiAoYWN0dWFsID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJFeHBlY3RlZCBBQ0UgaXMgbnVsbCwgYnV0IGFjdHVhbCBBQ0UgaXMgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJBY3R1YWwgQUNFIGlzIG51bGwsIGJ1dCBleHBlY3RlZCBBQ0UgaXMgbm90ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgZik7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUHJpbmNpcGFsIGlkcyBkb250J3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UHJpbmNpcGFsSWQoKSwgYWN0dWFsLmdldFByaW5jaXBhbElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQZXJtaXNzaW9ucyBkb250J3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbExpc3RzKGV4cGVjdGVkLmdldFBlcm1pc3Npb25zKCksIGFjdHVhbC5nZXRQZXJtaXNzaW9ucygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgaWYgKGdldFdvcnN0KHJlc3VsdHMpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoc3VjY2VzcywgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbWlzVGVzdFJlc3VsdCBhc3NlcnRFcXVhbFJlbmRpdGlvbkxpc3RzKExpc3Q8UmVuZGl0aW9uPiBleHBlY3RlZCwgTGlzdDxSZW5kaXRpb24+IGFjdHVhbCwKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLQotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkUmVzdWx0Q2hpbGQoZmFpbHVyZSwgY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8sICJFeHBlY3RlZCByZW5kaXRpb24gbGlzdCBpcyBudWxsISIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiQWN0dWFsIHJlbmRpdGlvbiBsaXN0IGlzIG51bGwhIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkLnNpemUoKSAhPSBhY3R1YWwuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW5kaXRpb24gbGlzdCBzaXplcyBkb24ndCBtYXRjaCEgZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZC5zaXplKCkgKyAiIC8gYWN0dWFsOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFjdHVhbC5zaXplKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZW5kaXRpb25zIGF0IHBvc2l0aW9uICIgKyBpICsgIiAgZG9udCd0IG1hdGNoISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0KGkpLCBhY3R1YWwuZ2V0KGkpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0V29yc3QocmVzdWx0cykuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChzdWNjZXNzLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydEVxdWFscyhSZW5kaXRpb24gZXhwZWN0ZWQsIFJlbmRpdGlvbiBhY3R1YWwsIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3MsCi0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlKSB7Ci0KLSAgICAgICAgTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc1Rlc3RSZXN1bHQ+KCk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpZiAoKGV4cGVjdGVkID09IG51bGwpICYmIChhY3R1YWwgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4cGVjdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkV4cGVjdGVkIHJlbmRpdGlvbiBpcyBudWxsLCBidXQgYWN0dWFsIHJlbmRpdGlvbiBpcyBub3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFjdHVhbCByZW5kaXRpb24gaXMgbnVsbCwgYnV0IGV4cGVjdGVkIHJlbmRpdGlvbiBpcyBub3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJTdHJlYW0gaWRzIGRvbnQndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRTdHJlYW1JZCgpLCBhY3R1YWwuZ2V0U3RyZWFtSWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIktpbmRzIGRvbnQndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRLaW5kKCksIGFjdHVhbC5nZXRLaW5kKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJNSU1FIHR5cGVzIGRvbnQndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRNaW1lVHlwZSgpLCBhY3R1YWwuZ2V0TWltZVR5cGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlRpdGxlcyBkb250J3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0VGl0bGUoKSwgYWN0dWFsLmdldFRpdGxlKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJMZW5ndGhzIGRvbnQndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRMZW5ndGgoKSwgYWN0dWFsLmdldExlbmd0aCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiSGVpZ2h0cyBkb250J3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0QmlnSGVpZ2h0KCksIGFjdHVhbC5nZXRCaWdIZWlnaHQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIldpZHRocyBkb250J3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0QmlnV2lkdGgoKSwgYWN0dWFsLmdldEJpZ1dpZHRoKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZW5kaXRpb24gZG9jdW1lbnQgaWRzIGRvbnQndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRSZW5kaXRpb25Eb2N1bWVudElkKCksIGFjdHVhbC5nZXRSZW5kaXRpb25Eb2N1bWVudElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAoZ2V0V29yc3QocmVzdWx0cykuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChzdWNjZXNzLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENtaXNUZXN0UmVzdWx0IGFzc2VydEVxdWFscyhDb250ZW50U3RyZWFtIGV4cGVjdGVkLCBDb250ZW50U3RyZWFtIGFjdHVhbCwgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzcywKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUpIHsKLQotICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmICgoZXhwZWN0ZWQgPT0gbnVsbCkgJiYgKGFjdHVhbCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRXhwZWN0ZWQgc3RyZWFtIGlzIG51bGwsIGJ1dCBhY3R1YWwgc3RyZWFtIGlzIG5vdCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGYpOwotCi0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShhY3R1YWwpOwotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3R1YWwgPT0gbnVsbCkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQWN0dWFsIG9iamVjdCBpcyBudWxsLCBidXQgZXhwZWN0ZWQgb2JqZWN0IGlzIG5vdCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGYpOwotCi0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShleHBlY3RlZCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRmlsZW5hbWVzIGRvbid0IG1hdGNoISIpOwotICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldEZpbGVOYW1lKCksIGFjdHVhbC5nZXRGaWxlTmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTUlNRSB0eXBlcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRNaW1lVHlwZSgpLCBhY3R1YWwuZ2V0TWltZVR5cGUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkxlbmd0aHMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0QmlnTGVuZ3RoKCksIGFjdHVhbC5nZXRCaWdMZW5ndGgoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGJvb2xlYW4gbWF0Y2ggPSB0cnVlOwotCi0gICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShhY3R1YWwuZ2V0U3RyZWFtKCksIDY0ICogMTAyNCk7Ci0gICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gZXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShleHBlY3RlZC5nZXRTdHJlYW0oKSwgNjQgKiAxMDI0KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGFiID0gMDsKLSAgICAgICAgICAgIGludCBlYiA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFiID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYWIgPSBhcy5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGViID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZWIgPSBlcy5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGFiID09IC0xICYmIGViID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChhYiAhPSBlYikgewotICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoVU5FWFBFQ1RFRF9FWENFUFRJT04sIGUuZ2V0TWVzc2FnZSgpLCBlLCBmYWxzZSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCBmKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWF0Y2gpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgc3RyZWFtcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdENoaWxkKGZhaWx1cmUsIGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoYXMpOwotICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShlcyk7Ci0KLSAgICAgICAgaWYgKGdldFdvcnN0KHJlc3VsdHMpLmdldExldmVsKCkgPD0gT0suZ2V0TGV2ZWwoKSkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0Q2hpbGQoc3VjY2VzcywgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHRDaGlsZChmYWlsdXJlLCByZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFpbHVyZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLSBoZWxwZXJzIC0tLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmVzdWx0KExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMsIENtaXNUZXN0UmVzdWx0IHJlc3VsdCkgewotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBDbWlzVGVzdFJlc3VsdEltcGwpIHsKLSAgICAgICAgICAgICAgICAoKENtaXNUZXN0UmVzdWx0SW1wbCkgcmVzdWx0KS5zZXRTdGFja1RyYWNlKGdldFN0YWNrVHJhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdHMuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmlzRmF0YWwoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGYXRhbFRlc3RFeGNlcHRpb24ocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHRTdGF0dXMgZ2V0V29yc3QoTGlzdDxDbWlzVGVzdFJlc3VsdD4gcmVzdWx0cykgewotICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShyZXN1bHRzKSkgewotICAgICAgICAgICAgcmV0dXJuIENtaXNUZXN0UmVzdWx0U3RhdHVzLk9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1heCA9IDA7Ci0KLSAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICBpZiAobWF4IDwgcmVzdWx0LmdldFN0YXR1cygpLmdldExldmVsKCkpIHsKLSAgICAgICAgICAgICAgICBtYXggPSByZXN1bHQuZ2V0U3RhdHVzKCkuZ2V0TGV2ZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDbWlzVGVzdFJlc3VsdFN0YXR1cy5mcm9tTGV2ZWwobWF4KTsKLSAgICB9Ci0KLSAgICAvLyAtLS0gaGVscGVyIGNsYXNzZXMgLS0tCi0KLSAgICBwdWJsaWMgY2xhc3MgQ21pc1Byb3BlcnR5RGVmaW50aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiByZXF1aXJlZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5OwotICAgICAgICBwcml2YXRlIGZpbmFsIFVwZGF0YWJpbGl0eSB1cGRhdGFiaWxpdHk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiBxdWVyeWFibGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQm9vbGVhbiBvcmRlcmFibGU7Ci0KLSAgICAgICAgcHVibGljIENtaXNQcm9wZXJ0eURlZmludGlvbihTdHJpbmcgaWQsIEJvb2xlYW4gcmVxdWlyZWQsIFByb3BlcnR5VHlwZSBwcm9wZXJ0eVR5cGUsIENhcmRpbmFsaXR5IGNhcmRpbmFsaXR5LAotICAgICAgICAgICAgICAgIFVwZGF0YWJpbGl0eSB1cGRhdGFiaWxpdHksIEJvb2xlYW4gcXVlcnlhYmxlLCBCb29sZWFuIG9yZGVyYWJsZSkgewotICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eVR5cGU7Ci0gICAgICAgICAgICB0aGlzLmNhcmRpbmFsaXR5ID0gY2FyZGluYWxpdHk7Ci0gICAgICAgICAgICB0aGlzLnVwZGF0YWJpbGl0eSA9IHVwZGF0YWJpbGl0eTsKLSAgICAgICAgICAgIHRoaXMucXVlcnlhYmxlID0gcXVlcnlhYmxlOwotICAgICAgICAgICAgdGhpcy5vcmRlcmFibGUgPSAoY2FyZGluYWxpdHkgPT0gQ2FyZGluYWxpdHkuTVVMVEkgPyBCb29sZWFuLkZBTFNFIDogb3JkZXJhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbWlzVGVzdFJlc3VsdCBjaGVjayhUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgICAgICAgICBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLQotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmcyA9IHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgaWYgKHByb3BEZWZzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9wZXJ0eSBkZWZpbml0aW9ucyBhcmUgbWlzc2luZyEiKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmID0gcHJvcERlZnMuZ2V0KGlkKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcERlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5IGRlZmluaXRpb24gaXMgbWlzc2luZyEiKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZXF1aXJlZCAhPSBudWxsKSAmJiAhcmVxdWlyZWQuZXF1YWxzKHByb3BEZWYuaXNSZXF1aXJlZCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZWQgZmxhZzogZXhwZWN0ZWQ6ICIgKyByZXF1aXJlZCArICIgLyBhY3R1YWw6ICIgKyBwcm9wRGVmLmlzUmVxdWlyZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5VHlwZS5lcXVhbHMocHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3BlcnR5IHR5cGU6IGV4cGVjdGVkOiAiICsgcHJvcGVydHlUeXBlICsgIiAvIGFjdHVhbDogIiArIHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXJkaW5hbGl0eS5lcXVhbHMocHJvcERlZi5nZXRDYXJkaW5hbGl0eSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FyZGluYWxpdHk6IGV4cGVjdGVkOiAiICsgY2FyZGluYWxpdHkgKyAiIC8gYWN0dWFsOiAiICsgcHJvcERlZi5nZXRDYXJkaW5hbGl0eSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICgodXBkYXRhYmlsaXR5ICE9IG51bGwpICYmICF1cGRhdGFiaWxpdHkuZXF1YWxzKHByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcGRhdGFiaWxpdHk6IGV4cGVjdGVkOiAiICsgdXBkYXRhYmlsaXR5ICsgIiAvIGFjdHVhbDogIiArIHByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChxdWVyeWFibGUgIT0gbnVsbCkgJiYgIXF1ZXJ5YWJsZS5lcXVhbHMocHJvcERlZi5pc1F1ZXJ5YWJsZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnlhYmxlOiBleHBlY3RlZDogIiArIHF1ZXJ5YWJsZSArICIgLyBhY3R1YWw6ICIgKyBwcm9wRGVmLmlzUXVlcnlhYmxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1Byb3BlcnR5UXVlcnlOYW1lUmVxdWlyZWQgPSBCb29sZWFuLlRSVUUuZXF1YWxzKHF1ZXJ5YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrUXVlcnlOYW1lKHByb3BEZWYuZ2V0UXVlcnlOYW1lKCksIGlzUHJvcGVydHlRdWVyeU5hbWVSZXF1aXJlZCwgIlByb3BlcnR5IFF1ZXJ5IE5hbWU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BEZWYuZ2V0UXVlcnlOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgob3JkZXJhYmxlICE9IG51bGwpICYmICFvcmRlcmFibGUuZXF1YWxzKHByb3BEZWYuaXNPcmRlcmFibGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yZGVyYWJsZTogZXhwZWN0ZWQ6ICIgKyBvcmRlcmFibGUgKyAiIC8gYWN0dWFsOiAiICsgcHJvcERlZi5pc09yZGVyYWJsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldEJhc2VUeXBlSWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGluaGVyaXRlZCA9ICF0eXBlLmdldEJhc2VUeXBlSWQoKS52YWx1ZSgpLmVxdWFscyh0eXBlLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmhlcml0ZWQuZXF1YWxzKHByb3BEZWYuaXNJbmhlcml0ZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5oZXJ0aXRlZDogZXhwZWN0ZWQ6ICIgKyBpbmhlcml0ZWQgKyAiIC8gYWN0dWFsOiAiICsgcHJvcERlZi5pc0luaGVyaXRlZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHR5cGUgc3BlY2lmaWMgdGVzdHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BEZWYgaW5zdGFuY2VvZiBQcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbiBzdHJpbmdQcm9wRGVmID0gKFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbikgcHJvcERlZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZ1Byb3BEZWYuZ2V0TWF4TGVuZ3RoKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdQcm9wRGVmLmdldE1heExlbmd0aCgpLnNpZ251bSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiTWF4IGxlbmd0aCBpcyAwISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpbmdQcm9wRGVmLmdldE1heExlbmd0aCgpLnNpZ251bSgpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk1heCBsZW5ndGggaXMgbmVnYXRpdmUhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcERlZiBpbnN0YW5jZW9mIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SW50ZWdlckRlZmluaXRpb24gaW50UHJvcERlZiA9IChQcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uKSBwcm9wRGVmOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50UHJvcERlZi5nZXRNaW5WYWx1ZSgpICE9IG51bGwgJiBpbnRQcm9wRGVmLmdldE1heFZhbHVlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRQcm9wRGVmLmdldE1pblZhbHVlKCkuY29tcGFyZVRvKGludFByb3BEZWYuZ2V0TWF4VmFsdWUoKSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJNaW4gYW5kIG1heCB2YWx1ZXMgYXJlIGVxdWFsISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRQcm9wRGVmLmdldE1pblZhbHVlKCkuY29tcGFyZVRvKGludFByb3BEZWYuZ2V0TWF4VmFsdWUoKSkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJNaW4gdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG1heCB2YWx1ZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wRGVmIGluc3RhbmNlb2YgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbiBkZWNQcm9wRGVmID0gKFByb3BlcnR5RGVjaW1hbERlZmluaXRpb24pIHByb3BEZWY7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNQcm9wRGVmLmdldE1pblZhbHVlKCkgIT0gbnVsbCAmIGRlY1Byb3BEZWYuZ2V0TWF4VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY1Byb3BEZWYuZ2V0TWluVmFsdWUoKS5jb21wYXJlVG8oZGVjUHJvcERlZi5nZXRNYXhWYWx1ZSgpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIk1pbiBhbmQgbWF4IHZhbHVlcyBhcmUgZXF1YWwhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlY1Byb3BEZWYuZ2V0TWluVmFsdWUoKS5jb21wYXJlVG8oZGVjUHJvcERlZi5nZXRNYXhWYWx1ZSgpKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk1pbiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gbWF4IHZhbHVlISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywgZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdEltcGwgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KGdldFdvcnN0KHJlc3VsdHMpLCAiUHJvcGVydHkgZGVmaW5pdGlvbjogIiArIGlkKTsKLSAgICAgICAgICAgIHJlc3VsdC5nZXRDaGlsZHJlbigpLmFkZEFsbChyZXN1bHRzKTsKLQotICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQuZ2V0U3RhdHVzKCkuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpID8gbnVsbCA6IHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9BYnN0cmFjdFNlc3Npb25UZXN0R3JvdXAuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0Fic3RyYWN0U2Vzc2lvblRlc3RHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGYxZTQ1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0Fic3RyYWN0U2Vzc2lvblRlc3RHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmluZGluZ1R5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgdGVzdCBncm91cHMgdGhhdCByZXF1aXJlIGFuIE9wZW5DTUlTIHNlc3Npb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlc3Npb25UZXN0R3JvdXAgZXh0ZW5kcyBBYnN0cmFjdENtaXNUZXN0R3JvdXAgewotICAgIAotICAgIHByaXZhdGUgQmluZGluZ1R5cGUgZ2V0QmluZGluZygpIHsKLSAgICAgICAgaWYgKGdldFBhcmFtZXRlcnMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gQmluZGluZ1R5cGUuZnJvbVZhbHVlKGdldFBhcmFtZXRlcnMoKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5CSU5ESU5HX1RZUEUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZSgpICsgIiAoIiArIGdldEJpbmRpbmcoKSArICIpIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9DbWlzVGVzdFJlc3VsdEltcGwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0NtaXNUZXN0UmVzdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQxMzI3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0NtaXNUZXN0UmVzdWx0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzOwotCi0vKioKLSAqIENtaXNUZXN0UmVzdWx0IGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ21pc1Rlc3RSZXN1bHRJbXBsIGltcGxlbWVudHMgQ21pc1Rlc3RSZXN1bHQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdyb3VwTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0ZXN0TmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOwotICAgIHByaXZhdGUgZmluYWwgQ21pc1Rlc3RSZXN1bHRTdGF0dXMgc3RhdHVzOwotICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIGV4Y2VwdGlvbjsKLSAgICBwcml2YXRlIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZTsKLSAgICBwcml2YXRlIFN0cmluZyB1cmw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdDsKLSAgICBwcml2YXRlIFN0cmluZyByZXNwb25zZTsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdFJlc3VsdD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNGYXRhbDsKLQotICAgIHB1YmxpYyBDbWlzVGVzdFJlc3VsdEltcGwoU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgbWVzc2FnZSwgQ21pc1Rlc3RSZXN1bHRTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbiwgYm9vbGVhbiBpc0ZhdGFsKSB7Ci0gICAgICAgIHRoaXMuZ3JvdXBOYW1lID0gZ3JvdXBOYW1lOwotICAgICAgICB0aGlzLnRlc3ROYW1lID0gdGVzdE5hbWU7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKLSAgICAgICAgdGhpcy5pc0ZhdGFsID0gaXNGYXRhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3ROYW1lKCkgewotICAgICAgICByZXR1cm4gdGVzdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc1Rlc3RSZXN1bHRTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdGFja1RyYWNlRWxlbWVudFtdIGdldFN0YWNrVHJhY2UoKSB7Ci0gICAgICAgIHJldHVybiBzdGFja1RyYWNlOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuQXJyYXlJc1N0b3JlZERpcmVjdGx5IikKLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFja1RyYWNlKFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSkgewotICAgICAgICB0aGlzLnN0YWNrVHJhY2UgPSBzdGFja1RyYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdCgpIHsKLSAgICAgICAgcmV0dXJuIHJlcXVlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChTdHJpbmcgcmVxdWVzdCkgewotICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2UoKSB7Ci0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKLSAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIHRoaXMudXJsID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNUZXN0UmVzdWx0PiBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmF0YWwoKSB7Ci0gICAgICAgIHJldHVybiBpc0ZhdGFsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgKyAiOiAiICsgZ3JvdXBOYW1lICsgIi8iICsgdGVzdE5hbWUgKyAiOiAiICsgbWVzc2FnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9GYXRhbFRlc3RFeGNlcHRpb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0ZhdGFsVGVzdEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzg4Mzg5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0ZhdGFsVGVzdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsOwotCi0vKioKLSAqIFRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIGEgcmVzdWx0IGlzIGZhdGFsIGFuZCB0aGUgdGVzdCBoYXMgdG8gYmUKLSAqIHN0b3BwZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGYXRhbFRlc3RFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBGYXRhbFRlc3RFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZhdGFsVGVzdEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIHN1cGVyKG1zZyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL2ltcGwvSlVuaXRIZWxwZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL0pVbml0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmU1ZTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL2ltcGwvSlVuaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJlcG9ydC5UZXh0UmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5ydW5uZXIuQWJzdHJhY3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLQotcHVibGljIGZpbmFsIGNsYXNzIEpVbml0SGVscGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpVTklUX1BBUkFNRVRFUlMgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmp1bml0LnBhcmFtZXRlcnMiOwotCi0gICAgcHJpdmF0ZSBKVW5pdEhlbHBlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKENtaXNUZXN0IHRlc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW4obmV3IFdyYXBwZXJDbWlzVGVzdEdyb3VwKHRlc3QpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuKENtaXNUZXN0R3JvdXAgZ3JvdXApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKVW5pdFJ1bm5lciBydW5uZXIgPSBuZXcgSlVuaXRSdW5uZXIoKTsKLQotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyc0ZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSlVOSVRfUEFSQU1FVEVSUyk7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJzRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBydW5uZXIuc2V0UGFyYW1ldGVycyhudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJ1bm5lci5sb2FkUGFyYW1ldGVycyhuZXcgRmlsZShwYXJhbWV0ZXJzRmlsZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcnVubmVyLmFkZEdyb3VwKGdyb3VwKTsKLSAgICAgICAgcnVubmVyLnJ1bihuZXcgSlVuaXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXBvcnQgcmVwb3J0ID0gbmV3IFRleHRSZXBvcnQoKTsKLSAgICAgICAgcmVwb3J0LmNyZWF0ZVJlcG9ydChydW5uZXIuZ2V0UGFyYW1ldGVycygpLCBydW5uZXIuZ2V0R3JvdXBzKCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0KLSAgICAgICAgY2hlY2tGb3JGYWlsdXJlcyhydW5uZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JGYWlsdXJlcyhKVW5pdFJ1bm5lciBydW5uZXIpIHsKLSAgICAgICAgZm9yIChDbWlzVGVzdEdyb3VwIGdyb3VwIDogcnVubmVyLmdldEdyb3VwcygpKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0IHRlc3QgOiBncm91cC5nZXRUZXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiB0ZXN0LmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldFN0YXR1cygpLmdldExldmVsKCkgPj0gQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRS5nZXRMZXZlbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbChyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpVbml0UnVubmVyIGV4dGVuZHMgQWJzdHJhY3RSdW5uZXIgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpVbml0UHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgQ21pc1Rlc3RQcm9ncmVzc01vbml0b3IgewotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuU3lzdGVtUHJpbnRsbiIpCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0R3JvdXAoQ21pc1Rlc3RHcm91cCBncm91cCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdyb3VwLmdldE5hbWUoKSArICIgKCIgKyBncm91cC5nZXRUZXN0cygpLnNpemUoKSArICIgdGVzdHMpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRHcm91cChDbWlzVGVzdEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiUE1ELlN5c3RlbVByaW50bG4iKQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoQ21pc1Rlc3QgdGVzdCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICIgKyB0ZXN0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KENtaXNUZXN0IHRlc3QpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuU3lzdGVtUHJpbnRsbiIpCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1zZykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9Qcm9wZXJ0eUNoZWNrRW51bS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL2ltcGwvUHJvcGVydHlDaGVja0VudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmZjQzOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9Qcm9wZXJ0eUNoZWNrRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsOwotCi1wdWJsaWMgZW51bSBQcm9wZXJ0eUNoZWNrRW51bSB7Ci0gICAgTk9fVkFMVUVfQ0hFQ0ssIE1VU1RfTk9UX0JFX1NFVCwgTVVTVF9CRV9TRVQsIFNUUklOR19TSE9VTERfTk9UX0JFX0VNUFRZLCBTVFJJTkdfTVVTVF9OT1RfQkVfRU1QVFkKLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL1Rlc3RQYXJhbWV0ZXJzLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9UZXN0UGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTUwNzc4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL1Rlc3RQYXJhbWV0ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGw7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0UGFyYW1ldGVycyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTERFUl9UWVBFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5kZWZhdWx0LmZvbGRlclR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRk9MREVSX1RZUEVfVkFMVUUgPSAiY21pczpmb2xkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ET0NVTUVOVF9UWVBFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5kZWZhdWx0LmRvY3VtZW50VHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ET0NVTUVOVF9UWVBFX1ZBTFVFID0gImNtaXM6ZG9jdW1lbnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suZGVmYXVsdC5yZWxhdGlvbnNoaXBUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFX1ZBTFVFID0gImNtaXM6cmVsYXRpb25zaGlwIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSVRFTV9UWVBFID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5kZWZhdWx0Lml0ZW1UeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lURU1fVFlQRV9WQUxVRSA9ICJjbWlzOml0ZW0iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRUNPTkRBUllfVFlQRSA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suZGVmYXVsdC5zZWNvbmRhcnlUeXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFQ09OREFSWV9UWVBFX1ZBTFVFID0gImNtaXM6c2Vjb25kYXJ5IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEVTVF9GT0xERVJfUEFSRU5UID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5kZWZhdWx0LnRlc3RGb2xkZXJQYXJlbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEVTVF9GT0xERVJfUEFSRU5UX1ZBTFVFID0gIi8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BQ0xfUFJJTkNJUEFMID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5kZWZhdWx0LnByaW5jaXBhbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BQ0xfUFJJTkNJUEFMX1ZBTFVFID0gImNtaXM6dXNlciI7Ci0KLSAgICBwcml2YXRlIFRlc3RQYXJhbWV0ZXJzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL1dyYXBwZXJDbWlzVGVzdEdyb3VwLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svaW1wbC9XcmFwcGVyQ21pc1Rlc3RHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RjNDJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9pbXBsL1dyYXBwZXJDbWlzVGVzdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0OwotCi0vKioKLSAqIEhlbHBlciBncm91cCBpbXBsZW1lbnRhdGlvbiB0aGF0IGp1c3QgaG9sZCBvbmUgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIFdyYXBwZXJDbWlzVGVzdEdyb3VwIGV4dGVuZHMgQWJzdHJhY3RDbWlzVGVzdEdyb3VwIHsKLSAgICBwcml2YXRlIGZpbmFsIENtaXNUZXN0IHRlc3Q7Ci0KLSAgICBwdWJsaWMgV3JhcHBlckNtaXNUZXN0R3JvdXAoQ21pc1Rlc3QgdGVzdCkgewotICAgICAgICBpZiAodGVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZXN0IGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnRlc3QgPSB0ZXN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLQotICAgICAgICBhZGRUZXN0KHRlc3QpOwotICAgICAgICBzZXROYW1lKCJXcmFwcGVyIEdyb3VwOiAiICsgdGVzdC5nZXROYW1lKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9yZXBvcnQvQWJzdHJhY3RDbWlzVGVzdFJlcG9ydC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9BYnN0cmFjdENtaXNUZXN0UmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmRjNzAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9BYnN0cmFjdENtaXNUZXN0UmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJlcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlcG9ydDsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciByZXBvcnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbWlzVGVzdFJlcG9ydCBpbXBsZW1lbnRzIENtaXNUZXN0UmVwb3J0IHsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNyZWF0ZVJlcG9ydChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIExpc3Q8Q21pc1Rlc3RHcm91cD4gZ3JvdXBzLCBXcml0ZXIgd3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVJlcG9ydChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIExpc3Q8Q21pc1Rlc3RHcm91cD4gZ3JvdXBzLCBGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSwgSU9VdGlscy5VVEY4KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNyZWF0ZVJlcG9ydChwYXJhbWV0ZXJzLCBncm91cHMsIHdyaXRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseSh3cml0ZXIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9Db3JlSHRtbFJlcG9ydC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9Db3JlSHRtbFJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWM4YjJjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9yZXBvcnQvQ29yZUh0bWxSZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJlcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJ1bm5lci5BYnN0cmFjdFJ1bm5lcjsKLQotLyoqCi0gKiBIVE1MIFJlcG9ydCB3aXRob3V0IGhlYWRlciBhbmQgZm9vdGVyLgotICovCi1wdWJsaWMgY2xhc3MgQ29yZUh0bWxSZXBvcnQgZXh0ZW5kcyBBYnN0cmFjdENtaXNUZXN0UmVwb3J0IHsKLQotICAgIHByaXZhdGUgaW50IHN0YWNrVHJhY2VDb3VudGVyOwotICAgIHByaXZhdGUgU3RyaW5nIHJldmlzaW9uOwotCi0gICAgcHVibGljIENvcmVIdG1sUmVwb3J0KCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVJlcG9ydChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIExpc3Q8Q21pc1Rlc3RHcm91cD4gZ3JvdXBzLCBXcml0ZXIgd3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhY2tUcmFjZUNvdW50ZXIgPSAwOwotICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXZpc2lvbiA9IHBhcmFtZXRlcnMuZ2V0KEFic3RyYWN0UnVubmVyLlRDS19SRVZJU0lPTl9QQVJBTUVURVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCI8aDE+T3BlbkNNSVMgVENLIFJlcG9ydDwvaDE+XG4iKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKChuZXcgRGF0ZSgpKSArICJcbiIpOwotCi0gICAgICAgIHdyaXRlci53cml0ZSgiXG48aDI+UGFyYW1ldGVyczwvaDI+XG4iKTsKLQotICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0YWJsZT5cbiIpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IHAgOiAobmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KHBhcmFtZXRlcnMpKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELmVuZHNXaXRoKHAuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIioqKioqIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjx0cj48dGQ+IiArIGVzY2FwZShwLmdldEtleSgpKSArICI8L3RkPjx0ZD4iICsgZXNjYXBlKHZhbHVlKSArICI8L3RkPjwvdHI+XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC90YWJsZT5cbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCJcbjxoMj5Hcm91cHM8L2gyPlxuIik7Ci0KLSAgICAgICAgaWYgKGdyb3VwcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0R3JvdXAgZ3JvdXAgOiBncm91cHMpIHsKLSAgICAgICAgICAgICAgICBwcmludEdyb3VwUmVzdWx0cyhncm91cCwgd3JpdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0eWxlKFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiYm9keSB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyB9XG4iKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKCIudGNrUmVzdWx0SU5GTyB7IG1hcmdpbi1sZWZ0OiAxMHB4OyBtYXJnaW4tcmlnaHQ6IDEwcHg7IHBhZGRpbmc6IDJweDsgfVxuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiLnRja1Jlc3VsdFNLSVBQRUQgeyBtYXJnaW4tbGVmdDogMTBweDsgbWFyZ2luLXJpZ2h0OiAxMHB4OyBwYWRkaW5nOiAycHg7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7IH1cbiIpOwotICAgICAgICB3cml0ZXIud3JpdGUoIi50Y2tSZXN1bHRPSyB7IG1hcmdpbi1sZWZ0OiAxMHB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgcGFkZGluZzogMnB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjMDBGRjAwOyB9XG4iKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKCIudGNrUmVzdWx0V0FSTklORyB7IG1hcmdpbi1sZWZ0OiAxMHB4OyBtYXJnaW4tcmlnaHQ6IDEwcHg7IHBhZGRpbmc6IDJweDsgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMDsgfVxuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiLnRja1Jlc3VsdEZBSUxVUkUgeyBtYXJnaW4tbGVmdDogMTBweDsgbWFyZ2luLXJpZ2h0OiAxMHB4OyBwYWRkaW5nOiAycHg7IGJhY2tncm91bmQtY29sb3I6ICNGRjYwMDA7IH1cbiIpOwotICAgICAgICB3cml0ZXIud3JpdGUoIi50Y2tSZXN1bHRVTkVYUEVDVEVEX0VYQ0VQVElPTiB7IG1hcmdpbi1sZWZ0OiAxMHB4OyBtYXJnaW4tcmlnaHQ6IDEwcHg7IHBhZGRpbmc6IDJweDsgYmFja2dyb3VuZC1jb2xvcjogI0ZGMDAwMDsgfVxuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiLnRja1RyYWNlTGluayB7IGN1cnNvcjogcG9pbnRlcjsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH1cbiIpOwotICAgICAgICB3cml0ZXIud3JpdGUoIi50Y2tUcmFjZSB7IG1hcmdpbi1sZWZ0OiAxMHB4OyBtYXJnaW4tcmlnaHQ6IDEwcHg7IHBhZGRpbmc6IDJweDsgYm9yZGVyOjJweCBzb2xpZCAjNzc3Nzc3OyBiYWNrZ3JvdW5kLWNvbG9yOiAjREREREREOyB9XG4iKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKCI8L3N0eWxlPlxuIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50SmF2YVNjcmlwdChXcml0ZXIgd3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZXIud3JpdGUoIjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPlxuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiZnVuY3Rpb24gdGNrVG9nZ2xlRGlzcGxheShpZCkge1xuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiKGZ1bmN0aW9uKHN0eWxlKSB7IHN0eWxlLmRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgPyAnJyA6ICdub25lJzsgfSkoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnN0eWxlKTtcbiIpOwotICAgICAgICB3cml0ZXIud3JpdGUoIn1cbiIpOwotICAgICAgICB3cml0ZXIud3JpdGUoIjwvc2NyaXB0PlxuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50R3JvdXBSZXN1bHRzKENtaXNUZXN0R3JvdXAgZ3JvdXAsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZ3JvdXAuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci53cml0ZSgiXG48aHI+XG48aDM+IiArIGVzY2FwZShncm91cC5nZXROYW1lKCkpICsgIjwvaDM+XG4iKTsKLQotICAgICAgICBpZiAoZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIlxuPHA+PGk+IiArIGVzY2FwZShncm91cC5nZXREZXNjcmlwdGlvbigpKSArICI8L2k+PC9wPlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ3JvdXAuZ2V0VGVzdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0IHRlc3QgOiBncm91cC5nZXRUZXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRUZXN0UmVzdWx0cyh0ZXN0LCB3cml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50VGVzdFJlc3VsdHMoQ21pc1Rlc3QgdGVzdCwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCF0ZXN0LmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGUoIlxuPGg0PiIgKyBlc2NhcGUodGVzdC5nZXROYW1lKCkpICsgIiAoIiArIHRlc3QuZ2V0VGltZSgpICsgIiBtcyk8L2g0PlxuIik7Ci0KLSAgICAgICAgaWYgKHRlc3QuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIlxuPHA+PGk+IiArIGVzY2FwZSh0ZXN0LmdldERlc2NyaXB0aW9uKCkpICsgIjwvaT48L3A+XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0ZXN0LmdldFJlc3VsdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHRlc3QuZ2V0UmVzdWx0cygpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8ZGl2IHN0eWxlPVwicGFkZGluZzogNXB4O1wiPlxuIik7Ci0gICAgICAgICAgICAgICAgcHJpbnRSZXN1bHQocmVzdWx0LCB3cml0ZXIpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC9kaXY+XG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludFJlc3VsdChDbWlzVGVzdFJlc3VsdCByZXN1bHQsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YWNrVHJhY2VDb3VudGVyKys7Ci0gICAgICAgIFN0cmluZyBzdGFja1RyYWNlSWQgPSAidGNrVHJhY2UiICsgc3RhY2tUcmFjZUNvdW50ZXI7Ci0gICAgICAgIFN0cmluZyBleGNlcHRpb25JZCA9ICJ0Y2tFeGNlcHRpb24iICsgc3RhY2tUcmFjZUNvdW50ZXI7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXNTdGFja1RyYWNlID0gcmVzdWx0LmdldFN0YWNrVHJhY2UoKSAhPSBudWxsICYmIHJlc3VsdC5nZXRTdGFja1RyYWNlKCkubGVuZ3RoID4gMDsKLSAgICAgICAgYm9vbGVhbiBoYXNFeGNlcHRpb24gPSByZXN1bHQuZ2V0U3RhdHVzKCkgPT0gQ21pc1Rlc3RSZXN1bHRTdGF0dXMuVU5FWFBFQ1RFRF9FWENFUFRJT04KLSAgICAgICAgICAgICAgICAmJiByZXN1bHQuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbDsKLQotICAgICAgICB3cml0ZXIud3JpdGUoIjxkaXYgY2xhc3M9XCJ0Y2tSZXN1bHQiICsgcmVzdWx0LmdldFN0YXR1cygpLm5hbWUoKSArICJcIj5cbiIpOwotCi0gICAgICAgIHdyaXRlci53cml0ZSgiPGI+IiArIHJlc3VsdC5nZXRTdGF0dXMoKSArICI8L2I+OiAiICsgZXNjYXBlKHJlc3VsdC5nZXRNZXNzYWdlKCkpKTsKLQotICAgICAgICBpZiAoaGFzU3RhY2tUcmFjZSkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgKCIgKyBnZXRTb3VyY2VDb2RlTGluayhyZXN1bHQuZ2V0U3RhY2tUcmFjZSgpWzBdLCByZXZpc2lvbikgKyAiKSIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgWzxzcGFuIGNsYXNzPVwidGNrVHJhY2VMaW5rXCIgb25DbGljaz1cInRja1RvZ2dsZURpc3BsYXkoJyIgKyBzdGFja1RyYWNlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAiJyk7XCI+c3RhY2t0cmFjZTwvc3Bhbj5dIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFzRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBbPHNwYW4gY2xhc3M9XCJ0Y2tUcmFjZUxpbmtcIiBvbkNsaWNrPVwidGNrVG9nZ2xlRGlzcGxheSgnIiArIGV4Y2VwdGlvbklkCi0gICAgICAgICAgICAgICAgICAgICsgIicpO1wiPmV4Y2VwdGlvbiBkZXRhaWxzPC9zcGFuPl0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci53cml0ZSgiPGJyLz5cbiIpOwotCi0gICAgICAgIGlmIChoYXNTdGFja1RyYWNlKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIjxkaXYgY2xhc3M9XCJ0Y2tUcmFjZVwiIGlkPVwiIiArIHN0YWNrVHJhY2VJZCArICJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPlxuIik7Ci0KLSAgICAgICAgICAgIGZvciAoU3RhY2tUcmFjZUVsZW1lbnQgc3RlIDogcmVzdWx0LmdldFN0YWNrVHJhY2UoKSkgewotICAgICAgICAgICAgICAgIGlmIChBYnN0cmFjdFJ1bm5lci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHN0ZS5nZXRDbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShzdGUuZ2V0Q2xhc3NOYW1lKCkgKyAiLiIgKyBzdGUuZ2V0TWV0aG9kTmFtZSgpICsgIigiICsgZ2V0U291cmNlQ29kZUxpbmsoc3RlLCByZXZpc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIik8YnIvPlxuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC9kaXY+XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPGRpdiBjbGFzcz1cInRja1RyYWNlXCIgaWQ9XCIiICsgZXhjZXB0aW9uSWQgKyAiXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cbiIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8Yj5FeGNlcHRpb24gc3RhY2sgdHJhY2U6PC9iPjxici8+PGJyLz5cbiIpOwotCi0gICAgICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IHN0ZSA6IHJlc3VsdC5nZXRFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoQWJzdHJhY3RSdW5uZXIuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzdGUuZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoc3RlLmdldENsYXNzTmFtZSgpICsgIi4iICsgc3RlLmdldE1ldGhvZE5hbWUoKSArICIoIiArIGdldFNvdXJjZUNvZGVMaW5rKHN0ZSwgcmV2aXNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICArICIpPGJyLz5cbiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVzdWx0LmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ21pc0Jhc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBDbWlzQmFzZUV4Y2VwdGlvbiBjYmUgPSAoQ21pc0Jhc2VFeGNlcHRpb24pIHJlc3VsdC5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoY2JlLmdldEVycm9yQ29udGVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI8YnIvPlxuPGI+RXJyb3IgY29udGVudDo8L2I+PGJyLz48YnIvPjxwcmU+XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGVzY2FwZShjYmUuZ2V0RXJyb3JDb250ZW50KCkpICsgIjwvcHJlPlxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvZGl2PlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IGNoaWxkIDogcmVzdWx0LmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgIHByaW50UmVzdWx0KGNoaWxkLCB3cml0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCI8L2Rpdj5cbiIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlQ29kZUxpbmsoU3RhY2tUcmFjZUVsZW1lbnQgc3RlLCBTdHJpbmcgcmV2aXNpb24pIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGlmICghc3RlLmdldENsYXNzTmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay4iKSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlc2NhcGUoc3RlLmdldEZpbGVOYW1lKCkpKTsKLSAgICAgICAgICAgIGlmIChzdGUuZ2V0TGluZU51bWJlcigpID4gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJzonKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0ZS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiPGEgaHJlZj1cImh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2NoZW1pc3RyeS9vcGVuY21pcy90cnVuay8iCi0gICAgICAgICAgICAgICAgICAgICsgImNoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhLyIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGUuZ2V0Q2xhc3NOYW1lKCkucmVwbGFjZUFsbCgiXFwuIiwgIi8iKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIuamF2YT92aWV3PW1hcmt1cCIpOwotICAgICAgICAgICAgaWYgKHJldmlzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCImcmV2aXNpb249Iik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyZXZpc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RlLmdldExpbmVOdW1iZXIoKSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIjbCIpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RlLmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlwiIHRhcmdldD1cIl9ibGFua1wiPiIpOwotCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGVzY2FwZShzdGUuZ2V0RmlsZU5hbWUoKSkpOwotICAgICAgICAgICAgaWYgKHN0ZS5nZXRMaW5lTnVtYmVyKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnOicpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc3RlLmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIjwvYT4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlc2NhcGUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImcXVvdDsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJyYnOgotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmFtcDsiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmx0OyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnPic6Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCImZ3Q7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9yZXBvcnQvSHRtbFJlcG9ydC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9IdG1sUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODYzYzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9IdG1sUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJlcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotCi0vKioKLSAqIEhUTUwgUmVwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgSHRtbFJlcG9ydCBleHRlbmRzIENvcmVIdG1sUmVwb3J0IHsKLSAgICBwdWJsaWMgSHRtbFJlcG9ydCgpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVSZXBvcnQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBMaXN0PENtaXNUZXN0R3JvdXA+IGdyb3VwcywgV3JpdGVyIHdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZFwiPlxuIik7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiPGh0bWw+PGhlYWQ+XG48dGl0bGU+T3BlbkNNSVMgVENLIFJlcG9ydDwvdGl0bGU+XG4iKTsKLSAgICAgICAgcHJpbnRTdHlsZSh3cml0ZXIpOwotICAgICAgICBwcmludEphdmFTY3JpcHQod3JpdGVyKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKCI8L2hlYWQ+PGJvZHk+XG4iKTsKLQotICAgICAgICBzdXBlci5jcmVhdGVSZXBvcnQocGFyYW1ldGVycywgZ3JvdXBzLCB3cml0ZXIpOwotCi0gICAgICAgIHdyaXRlci53cml0ZSgiXG48L2JvZHk+PC9odG1sPlxuIik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9yZXBvcnQvVGV4dFJlcG9ydC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9UZXh0UmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTVmMTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3JlcG9ydC9UZXh0UmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQmFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0R3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1czsKLQotLyoqCi0gKiBUZXh0IFJlcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIFRleHRSZXBvcnQgZXh0ZW5kcyBBYnN0cmFjdENtaXNUZXN0UmVwb3J0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICAgIHB1YmxpYyBUZXh0UmVwb3J0KCkgewotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUmVwb3J0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgTGlzdDxDbWlzVGVzdEdyb3VwPiBncm91cHMsIFdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB3cml0ZXIud3JpdGUoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgKyBOTCk7Ci0gICAgICAgIHdyaXRlci53cml0ZSgiVGVzdCBSZXBvcnQ6ICIgKyAobmV3IERhdGUoKSkgKyBOTCk7Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiICsgTkwpOwotICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcCA6IChuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4ocGFyYW1ldGVycykpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUocC5nZXRLZXkoKSArICIgPSAiICsgcC5nZXRWYWx1ZSgpICsgTkwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci53cml0ZSgiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIiArIE5MKTsKLQotICAgICAgICBpZiAoZ3JvdXBzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RHcm91cCBncm91cCA6IGdyb3VwcykgewotICAgICAgICAgICAgICAgIHByaW50R3JvdXBSZXN1bHRzKGdyb3VwLCB3cml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50R3JvdXBSZXN1bHRzKENtaXNUZXN0R3JvdXAgZ3JvdXAsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZ3JvdXAuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci53cml0ZSgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiArIE5MKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKGdyb3VwLmdldE5hbWUoKSArIE5MKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iICsgTkwpOwotCi0gICAgICAgIGlmIChncm91cC5nZXRUZXN0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3QgdGVzdCA6IGdyb3VwLmdldFRlc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBwcmludFRlc3RSZXN1bHRzKHRlc3QsIHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRUZXN0UmVzdWx0cyhDbWlzVGVzdCB0ZXN0LCBXcml0ZXIgd3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIXRlc3QuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlci53cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiArIE5MKTsKLSAgICAgICAgd3JpdGVyLndyaXRlKHRlc3QuZ2V0TmFtZSgpICsgIiAoIiArIHRlc3QuZ2V0VGltZSgpICsgIiBtcykiICsgTkwpOwotICAgICAgICB3cml0ZXIud3JpdGUoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgKyBOTCArIE5MKTsKLQotICAgICAgICBpZiAodGVzdC5nZXRSZXN1bHRzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdFJlc3VsdCByZXN1bHQgOiB0ZXN0LmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgIHByaW50UmVzdWx0KDEsIHJlc3VsdCwgd3JpdGVyKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoTkwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlKE5MKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRSZXN1bHQoaW50IGxldmVsLCBDbWlzVGVzdFJlc3VsdCByZXN1bHQsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByaW50SW50ZW5kKGxldmVsLCB3cml0ZXIpOwotICAgICAgICB3cml0ZXIud3JpdGUocmVzdWx0LmdldFN0YXR1cygpICsgIjogIiArIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIGlmICgocmVzdWx0LmdldFN0YWNrVHJhY2UoKSAhPSBudWxsKSAmJiAocmVzdWx0LmdldFN0YWNrVHJhY2UoKS5sZW5ndGggPiAwKSkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgKCIgKyByZXN1bHQuZ2V0U3RhY2tUcmFjZSgpWzBdLmdldEZpbGVOYW1lKCkgKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgKyByZXN1bHQuZ2V0U3RhY2tUcmFjZSgpWzBdLmdldExpbmVOdW1iZXIoKSArICIpIik7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGUoTkwpOwotCi0gICAgICAgIGlmIChyZXN1bHQuZ2V0U3RhdHVzKCkgPT0gQ21pc1Rlc3RSZXN1bHRTdGF0dXMuVU5FWFBFQ1RFRF9FWENFUFRJT04gJiYgcmVzdWx0LmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZShOTCArICJTdGFja3RyYWNlOiIgKyBOTCArIE5MKTsKLSAgICAgICAgICAgIHJlc3VsdC5nZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHdyaXRlcikpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0LmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ21pc0Jhc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBDbWlzQmFzZUV4Y2VwdGlvbiBjYmUgPSAoQ21pc0Jhc2VFeGNlcHRpb24pIHJlc3VsdC5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoY2JlLmdldEVycm9yQ29udGVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKE5MICsgIkVycm9yIENvbnRlbnQ6IiArIE5MICsgTkwpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoY2JlLmdldEVycm9yQ29udGVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzdWx0LmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByaW50SW50ZW5kKGxldmVsLCB3cml0ZXIpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJFeGNlcHRpb246ICIgKyByZXN1bHQuZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpICsgTkwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXF1ZXN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJpbnRJbnRlbmQobGV2ZWwsIHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIlJlcXVlc3Q6ICIgKyByZXN1bHQuZ2V0UmVxdWVzdCgpICsgTkwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRSZXF1ZXN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJpbnRJbnRlbmQobGV2ZWwsIHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIlJlc3BvbnNlOiAiICsgcmVzdWx0LmdldFJlcXVlc3QoKSArIE5MKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgY2hpbGQgOiByZXN1bHQuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgcHJpbnRSZXN1bHQobGV2ZWwgKyAxLCBjaGlsZCwgd3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludEludGVuZChpbnQgeCwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4OyBpKyspIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZSgiICAiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9yZXBvcnQvWG1sUmVwb3J0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svcmVwb3J0L1htbFJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWJlMjUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9yZXBvcnQvWG1sUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLQotLyoqCi0gKiBYTUwgUmVwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgWG1sUmVwb3J0IGV4dGVuZHMgQWJzdHJhY3RDbWlzVGVzdFJlcG9ydCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVBPUlQgPSAicmVwb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUkFNRVRFUlMgPSAicGFyYW1ldGVycyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QQVJBTUVURVIgPSAicGFyYW1ldGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0dST1VQID0gImdyb3VwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1RFU1QgPSAidGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVNVTFQgPSAicmVzdWx0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0tFWSA9ICJrZXkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFID0gInZhbHVlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1RJTUUgPSAidGltZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBVFVTID0gInN0YXR1cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVTU0FHRSA9ICJtZXNzYWdlIjsKLQotICAgIHB1YmxpYyBYbWxSZXBvcnQoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY3JlYXRlUmVwb3J0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgTGlzdDxDbWlzVGVzdEdyb3VwPiBncm91cHMsIFdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MT3V0cHV0RmFjdG9yeSBmYWN0b3J5ID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sID0gZmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKTsKLQotICAgICAgICAvLyBzdGFydCBkb2MKLSAgICAgICAgeG1sLndyaXRlU3RhcnREb2N1bWVudCgpOwotCi0gICAgICAgIHhtbC53cml0ZVN0YXJ0RWxlbWVudChUQUdfUkVQT1JUKTsKLQotICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWwud3JpdGVTdGFydEVsZW1lbnQoVEFHX1BBUkFNRVRFUlMpOwotCi0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcCA6IChuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4ocGFyYW1ldGVycykpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICB4bWwud3JpdGVTdGFydEVsZW1lbnQoVEFHX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKEFUVFJfS0VZLCBwLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocC5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKEFUVFJfVkFMVUUsIHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbC53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeG1sLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdyb3VwcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0R3JvdXAgZ3JvdXAgOiBncm91cHMpIHsKLSAgICAgICAgICAgICAgICBwcmludEdyb3VwUmVzdWx0cyhncm91cCwgeG1sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHhtbC53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICAvLyBlbmQgZG9jdW1lbnQKLSAgICAgICAgeG1sLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgICAgICAgeG1sLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50R3JvdXBSZXN1bHRzKENtaXNUZXN0R3JvdXAgZ3JvdXAsIFhNTFN0cmVhbVdyaXRlciB4bWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWdyb3VwLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB4bWwud3JpdGVTdGFydEVsZW1lbnQoVEFHX0dST1VQKTsKLSAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKEFUVFJfTkFNRSwgZ3JvdXAuZ2V0TmFtZSgpKTsKLQotICAgICAgICBpZiAoZ3JvdXAuZ2V0VGVzdHMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENtaXNUZXN0IHRlc3QgOiBncm91cC5nZXRUZXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRUZXN0UmVzdWx0cyh0ZXN0LCB4bWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgeG1sLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludFRlc3RSZXN1bHRzKENtaXNUZXN0IHRlc3QsIFhNTFN0cmVhbVdyaXRlciB4bWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIXRlc3QuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHhtbC53cml0ZVN0YXJ0RWxlbWVudChUQUdfVEVTVCk7Ci0gICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZShBVFRSX05BTUUsIHRlc3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKEFUVFJfVElNRSwgIiIgKyB0ZXN0LmdldFRpbWUoKSk7Ci0KLSAgICAgICAgaWYgKHRlc3QuZ2V0UmVzdWx0cygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgcmVzdWx0IDogdGVzdC5nZXRSZXN1bHRzKCkpIHsKLSAgICAgICAgICAgICAgICBwcmludFJlc3VsdChyZXN1bHQsIHhtbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB4bWwud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50UmVzdWx0KENtaXNUZXN0UmVzdWx0IHJlc3VsdCwgWE1MU3RyZWFtV3JpdGVyIHhtbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbC53cml0ZVN0YXJ0RWxlbWVudChUQUdfUkVTVUxUKTsKLSAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKEFUVFJfU1RBVFVTLCByZXN1bHQuZ2V0U3RhdHVzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZShBVFRSX01FU1NBR0UsIHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgY2hpbGQgOiByZXN1bHQuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICAgICAgcHJpbnRSZXN1bHQoY2hpbGQsIHhtbCk7Ci0gICAgICAgIH0KLQotICAgICAgICB4bWwud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3J1bm5lci9BYnN0cmFjdFJ1bm5lci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3J1bm5lci9BYnN0cmFjdFJ1bm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjYyMGUwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9ydW5uZXIvQWJzdHJhY3RSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJ1bm5lcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNsYXNzTG9hZGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0R3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLldyYXBwZXJDbWlzVGVzdEdyb3VwOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHJ1bm5lcnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJ1bm5lciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVkVSUklERV9LRVkgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVENLX0dST1VQUyA9ICIvY21pcy10Y2stZ3JvdXBzLnR4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVENLX0JVSUxEX1RJTUVTVEFNUCA9ICIvTUVUQS1JTkYvYnVpbGQtdGltZXN0YW1wLnR4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVENLX0JVSUxEX1RJTUVTVEFNUF9QQVJBTUVURVIgPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRpbWVzdGFtcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVENLX1JFVklTSU9OID0gIi9NRVRBLUlORi90Y2stcmV2aXNpb24udHh0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQ0tfUkVWSVNJT05fUEFSQU1FVEVSID0gIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5yZXZpc2lvbiI7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyczsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q21pc1Rlc3RHcm91cD4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxDbWlzVGVzdEdyb3VwPigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NhbmNlbGVkID0gZmFsc2U7Ci0KLSAgICAvLyAtLS0gcGFyYW1ldGVycyAtLS0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBvcmdQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBpZiAob3JnUGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMucHV0QWxsKG9yZ1BhcmFtZXRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb3ZlcnJpZGUgd2l0aCBzeXN0ZW0gcHJvcGVydGllcwotICAgICAgICBmb3IgKE9iamVjdCBrZXkgOiBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoIWtleS50b1N0cmluZygpLnN0YXJ0c1dpdGgoT1ZFUlJJREVfS0VZKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChrZXkudG9TdHJpbmcoKSwgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IFRDSyBidWlsZCB0aW1lc3RhbXAgYW5kIHJldmlzaW9uCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KFRDS19CVUlMRF9USU1FU1RBTVBfUEFSQU1FVEVSLCBsb2FkVENLVGltZXN0YW1wKCkpOwotICAgICAgICBTdHJpbmcgcmV2aXNpb24gPSBsb2FkVENLUmV2aXNpb24oKTsKLSAgICAgICAgaWYgKHJldmlzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFRDS19SRVZJU0lPTl9QQVJBTUVURVIsIHJldmlzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRQYXJhbWV0ZXJzKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsZSBub3QgZm91bmQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2FkUGFyYW1ldGVycyhuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkUGFyYW1ldGVycyhJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRQYXJhbWV0ZXJzKElPVXRpbHMucmVhZEFsbExpbmVzQXNNYXAoc3RyZWFtKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9hZFRDS1RpbWVzdGFtcCgpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKFRDS19CVUlMRF9USU1FU1RBTVApOwotCi0gICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU9VdGlscy5yZWFkQWxsTGluZXMoc3RyZWFtKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9hZFRDS1JldmlzaW9uKCkgewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oVENLX1JFVklTSU9OKTsKLQotICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJldlN0ciA9IElPVXRpbHMucmVhZEZpcnN0TGluZShzdHJlYW0pOwotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihJbnRlZ2VyLnBhcnNlSW50KHJldlN0ci50cmltKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyAtLS0gZ3JvdXBzIC0tLQotCi0gICAgcHVibGljIHZvaWQgbG9hZERlZmF1bHRUY2tHcm91cHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbG9hZEdyb3Vwcyh0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShERUZBVUxUX1RDS19HUk9VUFMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkR3JvdXBzKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwgfHwgIWZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgbm90IGZvdW5kISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZEdyb3VwcyhuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkR3JvdXBzKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyZWFtIGlzIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFN0cmluZyBncm91cE5hbWUgOiBJT1V0aWxzLnJlYWRBbGxMaW5lc0FzTGlzdChzdHJlYW0pKSB7Ci0gICAgICAgICAgICBhZGRHcm91cChncm91cE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkR3JvdXBzKFN0cmluZ1tdIGdyb3VwQ2xhc3NlcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChncm91cENsYXNzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBDbGFzcyA6IGdyb3VwQ2xhc3NlcykgewotICAgICAgICAgICAgYWRkR3JvdXAoZ3JvdXBDbGFzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChTdHJpbmcgZ3JvdXBDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChncm91cENsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGdyb3VwQ2xhc3MgPSBncm91cENsYXNzLnRyaW0oKTsKLSAgICAgICAgaWYgKGdyb3VwQ2xhc3MubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBDbGFzc0xvYWRlclV0aWwubG9hZENsYXNzKGdyb3VwQ2xhc3MpOwotICAgICAgICBPYmplY3QgbyA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIENtaXNUZXN0R3JvdXAgZ3JvdXAgPSBudWxsOwotCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ21pc1Rlc3RHcm91cCkgewotICAgICAgICAgICAgZ3JvdXAgPSAoQ21pc1Rlc3RHcm91cCkgbzsKLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ21pc1Rlc3QpIHsKLSAgICAgICAgICAgIGdyb3VwID0gbmV3IFdyYXBwZXJDbWlzVGVzdEdyb3VwKChDbWlzVGVzdCkgbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiTm90IGEgQ21pc1Rlc3RHcm91cCBvciBDbWlzVGVzdCBjbGFzcyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZEdyb3VwKGdyb3VwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRHcm91cChDbWlzVGVzdEdyb3VwIGdyb3VwKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdyb3VwLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgICAgICBncm91cHMuYWRkKGdyb3VwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PENtaXNUZXN0R3JvdXA+IGdldEdyb3VwcygpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwczsKLSAgICB9Ci0KLSAgICAvLyAtLS0gcnVuIC0tLQotCi0gICAgLyoqCi0gICAgICogUnVucyBhbGwgY29uZmlndXJlZCBncm91cHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlzQ2FuY2VsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoQ21pc1Rlc3RHcm91cCBncm91cCA6IGdyb3VwcykgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCB8fCAhZ3JvdXAuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ3JvdXAuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotICAgICAgICAgICAgZ3JvdXAucnVuKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzQ2FuY2VsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbCgpIHsKLSAgICAgICAgaXNDYW5jZWxlZCA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3J1bm5lci9DbWlzVGNrQW50VGFzay5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3J1bm5lci9DbWlzVGNrQW50VGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWYwZjdjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay9ydW5uZXIvQ21pc1Rja0FudFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJ1bm5lcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJlcG9ydC5IdG1sUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5yZXBvcnQuVGV4dFJlcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sucmVwb3J0LlhtbFJlcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotCi0vKioKLSAqIENNSVMgVENLIEFudCBUYXNrLgotICovCi1wdWJsaWMgY2xhc3MgQ21pc1Rja0FudFRhc2sgZXh0ZW5kcyBUYXNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfVEVYVCA9ICJ0ZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUX1hNTCA9ICJ4bWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfSFRNTCA9ICJodG1sIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFUE9SVF9OQU1FID0gImNtaXMtdGNrLXJlcG9ydCI7Ci0KLSAgICBwcml2YXRlIEZpbGUgcGFyYW1ldGVyczsKLSAgICBwcml2YXRlIEZpbGUgZ3JvdXBzOwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgc3VwZXIuaW5pdCgpOwotICAgICAgICBwYXJhbWV0ZXJzID0gbnVsbDsKLSAgICAgICAgZ3JvdXBzID0gbnVsbDsKLSAgICAgICAgb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgZm9ybWF0ID0gUkVQT1JUX1RFWFQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhGaWxlIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoRmlsZSBncm91cHMpIHsKLSAgICAgICAgdGhpcy5ncm91cHMgPSBncm91cHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KEZpbGUgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChTdHJpbmcgZm9ybWF0KSB7Ci0gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCi0gICAgICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVubmVyLnNldFBhcmFtZXRlcnMobnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJ1bm5lci5sb2FkUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGdyb3VwcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVubmVyLmxvYWREZWZhdWx0VGNrR3JvdXBzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJ1bm5lci5sb2FkR3JvdXBzKGdyb3Vwcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENtaXNUZXN0UmVwb3J0IHJlcG9ydCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcG9ydCA9IG5ldyBUZXh0UmVwb3J0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBGaWxlKERFRkFVTFRfUkVQT1JUX05BTUUgKyAiLnR4dCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJFUE9SVF9URVhULmVxdWFscyhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydCA9IG5ldyBUZXh0UmVwb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gbmV3IEZpbGUoREVGQVVMVF9SRVBPUlRfTkFNRSArICIudHh0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJFUE9SVF9YTUwuZXF1YWxzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3J0ID0gbmV3IFhtbFJlcG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBGaWxlKERFRkFVTFRfUkVQT1JUX05BTUUgKyAiLnhtbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChSRVBPUlRfSFRNTC5lcXVhbHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICByZXBvcnQgPSBuZXcgSHRtbFJlcG9ydCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG5ldyBGaWxlKERFRkFVTFRfUkVQT1JUX05BTUUgKyAiLmh0bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5rbm93biBmb3JtYXQhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBydW5uZXIucnVuKG5ldyBBbnRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLSAgICAgICAgICAgIGxvZygiQ01JUyBUQ0sgUmVwb3J0OiAiICsgb3V0cHV0LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIHJlcG9ydC5jcmVhdGVSZXBvcnQocnVubmVyLmdldFBhcmFtZXRlcnMoKSwgcnVubmVyLmdldEdyb3VwcygpLCBvdXRwdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPcGVuQ01JUyBUQ0sgcnVuIGZhaWxlZCEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFudFJ1bm5lciBleHRlbmRzIEFic3RyYWN0UnVubmVyIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQW50UHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgQ21pc1Rlc3RQcm9ncmVzc01vbml0b3IgewotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEdyb3VwKENtaXNUZXN0R3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIGxvZyhncm91cC5nZXROYW1lKCkgKyAiICgiICsgZ3JvdXAuZ2V0VGVzdHMoKS5zaXplKCkgKyAiIHRlc3RzKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kR3JvdXAoQ21pc1Rlc3RHcm91cCBncm91cCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KENtaXNUZXN0IHRlc3QpIHsKLSAgICAgICAgICAgIGxvZygiICAiICsgdGVzdC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kVGVzdChDbWlzVGVzdCB0ZXN0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlKFN0cmluZyBtc2cpIHsKLSAgICAgICAgICAgIGxvZyhtc2cpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3J1bm5lci9Db25zb2xlUnVubmVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svcnVubmVyL0NvbnNvbGVSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNTIyOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svcnVubmVyL0NvbnNvbGVSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sucnVubmVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0R3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sucmVwb3J0LlRleHRSZXBvcnQ7Ci0KLS8qKgotICogQ29uc29sZSBSdW5uZXIuCi0gKiAKLSAqIFRoaXMgcnVubmVyIGNhbiBiZSBzdGFydGVkIGZvciBhIGNvbnNvbGUgYW5kIGFjY2VwdHMgdHdvIHBhcmFtZXRlcnM6IE9wZW5DTUlTCi0gKiBTZXNzaW9uIHBhcmFtZXRlcnMgZmlsZSBuYW1lIGFuZCBncm91cCBsaXN0IGZpbGUgbmFtZS4KLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVSdW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFJ1bm5lciB7Ci0KLSAgICBwdWJsaWMgQ29uc29sZVJ1bm5lcihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkgewotICAgICAgICAgICAgc2V0UGFyYW1ldGVycyhudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvYWRQYXJhbWV0ZXJzKG5ldyBGaWxlKGFyZ3NbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgIGxvYWREZWZhdWx0VGNrR3JvdXBzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2FkR3JvdXBzKG5ldyBGaWxlKGFyZ3NbMV0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJ1bihuZXcgQ29uc29sZVByb2dyZXNzTW9uaXRvcigpKTsKLQotICAgICAgICBDbWlzVGVzdFJlcG9ydCByZXBvcnQgPSBuZXcgVGV4dFJlcG9ydCgpOwotICAgICAgICByZXBvcnQuY3JlYXRlUmVwb3J0KGdldFBhcmFtZXRlcnMoKSwgZ2V0R3JvdXBzKCksIG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uc29sZVByb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIHsKLSAgICAgICAgCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuU3lzdGVtUHJpbnRsbiIpCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0R3JvdXAoQ21pc1Rlc3RHcm91cCBncm91cCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdyb3VwLmdldE5hbWUoKSArICIgKCIgKyBncm91cC5nZXRUZXN0cygpLnNpemUoKSArICIgdGVzdHMpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiUE1ELlN5c3RlbVByaW50bG4iKQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRHcm91cChDbWlzVGVzdEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuU3lzdGVtUHJpbnRsbiIpCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChDbWlzVGVzdCB0ZXN0KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KENtaXNUZXN0IHRlc3QpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJQTUQuU3lzdGVtUHJpbnRsbiIpCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1zZykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IENvbnNvbGVSdW5uZXIoYXJncyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3J1bm5lci9XZWJSdW5uZXJTZXJ2bGV0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svcnVubmVyL1dlYlJ1bm5lclNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1YTg3Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svcnVubmVyL1dlYlJ1bm5lclNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJ1bm5lcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sucmVwb3J0LkNvcmVIdG1sUmVwb3J0OwotCi0vKioKLSAqIFdlYiBSdW5uZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJSdW5uZXJTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc3Auc2V0Q29udGVudFR5cGUoInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIpOwotCi0gICAgICAgIFByaW50V3JpdGVyIHB3ID0gcmVzcC5nZXRXcml0ZXIoKTsKLQotICAgICAgICBwcmludEhlYWRlcihwdyk7Ci0KLSAgICAgICAgcHcucHJpbnRsbigiPGgxPk9wZW5DTUlTIFRDSzwvaDE+Iik7Ci0KLSAgICAgICAgcHcucHJpbnRsbigiPGZvcm0gYWN0aW9uPVwiIiArIHJlcS5nZXRSZXF1ZXN0VVJJKCkgKyAiXCIgbWV0aG9kPVwiUE9TVFwiPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8dGFibGU+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjx0cj48dGQ+QXRvbVB1YiBVUkw6PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXRvbXB1Yi51cmxcIiBzaXplPVwiNTBcIj48L3RkPjwvdHI+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjx0cj48dGQ+VXNlcm5hbWU6PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXJcIiBzaXplPVwiNTBcIj48L3RkPjwvdHI+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjx0cj48dGQ+UGFzc3dvcmQ6PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZFwiIHNpemU9XCI1MFwiPjwvdGQ+PC90cj4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPHRyPjx0ZD5SZXBvc2l0b3J5IElkOjwvdGQ+PHRkPjxpbnB1dCB0eXBlPVwidGV4dFwiIG5hbWU9XCJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXNzaW9uLnJlcG9zaXRvcnkuaWRcIiBzaXplPVwiNTBcIj48L3RkPjwvdHI+Iik7Ci0gICAgICAgIHB3LnByaW50bG4oIjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0IHR5cGU9XCJzdWJtaXRcIiB2YWx1ZT1cIlN0YXJ0IFRDS1wiPjwvdGQ+PC90cj4iKTsKLSAgICAgICAgcHcucHJpbnRsbigiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZVwiIHZhbHVlPVwiYXRvbXB1YlwiPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8L2Zvcm0+Iik7Ci0KLSAgICAgICAgcHJpbnRGb290ZXIocHcpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlc3Auc2V0QnVmZmVyU2l6ZSgwKTsKLSAgICAgICAgcmVzcC5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFyc2V0PVVURi04Iik7Ci0KLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSByZXNwLmdldFdyaXRlcigpOwotCi0gICAgICAgIHByaW50SGVhZGVyKHB3KTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmdbXT4gZW50cnkgOiAoKE1hcDxTdHJpbmcsIFN0cmluZ1tdPikgcmVxLmdldFBhcmFtZXRlck1hcCgpKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoKGVudHJ5LmdldFZhbHVlKCkgPT0gbnVsbCkgfHwgKGVudHJ5LmdldFZhbHVlKCkubGVuZ3RoIDwgMSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBXZWJSdW5uZXIgcnVubmVyID0gbmV3IFdlYlJ1bm5lcigpOwotICAgICAgICAgICAgcnVubmVyLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7Ci0gICAgICAgICAgICBydW5uZXIubG9hZERlZmF1bHRUY2tHcm91cHMoKTsKLQotICAgICAgICAgICAgcHcucHJpbnRsbigiPGRpdiBpZD1cInByb2dyZXNzXCI+Iik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCI8aDE+UnVubmluZyBPcGVuQ01JUyBUQ0s8L2gxPiIpOwotCi0gICAgICAgICAgICBydW5uZXIucnVuKG5ldyBXZWJQcm9ncmVzc01vbml0b3IocHcpKTsKLQotICAgICAgICAgICAgcHcucHJpbnRsbigiPC9kaXY+Iik7Ci0KLSAgICAgICAgICAgIC8vIGxldCBwcm9ncmVzcyBkaXYgZGlzYXBwZWFyCi0gICAgICAgICAgICBwdy5wcmludGxuKCI8c2NyaXB0IGxhbmd1YWdlPVwiamF2YXNjcmlwdFwiPiIpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwcm9ncmVzc1wiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7Iik7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCI8L3NjcmlwdD4iKTsKLQotICAgICAgICAgICAgKG5ldyBDb3JlSHRtbFJlcG9ydCgpKS5jcmVhdGVSZXBvcnQocnVubmVyLmdldFBhcmFtZXRlcnMoKSwgcnVubmVyLmdldEdyb3VwcygpLCBwdyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCI8aDI+RXhjZXB0aW9uPC9oMj4iKTsKLQotICAgICAgICAgICAgcHcucHJpbnRsbigiXG48cHJlPiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgcHcucHJpbnRsbigiXG48L3ByZT4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW50Rm9vdGVyKHB3KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEhlYWRlcihQcmludFdyaXRlciBwdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcHcucHJpbnRsbigiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZFwiPiIpOwotICAgICAgICBwdy5wcmludGxuKCI8aHRtbD48aGVhZD5cbjx0aXRsZT5PcGVuQ01JUyBUQ0s8L3RpdGxlPiIpOwotICAgICAgICBDb3JlSHRtbFJlcG9ydC5wcmludFN0eWxlKHB3KTsKLSAgICAgICAgcHcucHJpbnRsbigiPC9oZWFkPjxib2R5PiIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Rm9vdGVyKFByaW50V3JpdGVyIHB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBwdy5wcmludGxuKCJcbjwvYm9keT48L2h0bWw+Iik7Ci0gICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2ViUnVubmVyIGV4dGVuZHMgQWJzdHJhY3RSdW5uZXIgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdlYlByb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIENtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcmludFdyaXRlciBwdzsKLQotICAgICAgICBwdWJsaWMgV2ViUHJvZ3Jlc3NNb25pdG9yKFByaW50V3JpdGVyIHB3KSB7Ci0gICAgICAgICAgICB0aGlzLnB3ID0gcHc7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEdyb3VwKENtaXNUZXN0R3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIjxoMz4iICsgZ3JvdXAuZ2V0TmFtZSgpICsgIiAoIiArIGdyb3VwLmdldFRlc3RzKCkuc2l6ZSgpICsgIiB0ZXN0cyk8L2gzPiIpOwotICAgICAgICAgICAgcHcuZmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEdyb3VwKENtaXNUZXN0R3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIjxicj4iKTsKLSAgICAgICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoQ21pc1Rlc3QgdGVzdCkgewotICAgICAgICAgICAgcHcucHJpbnQoIiZuYnNwOyZuYnNwOyZuYnNwOyIgKyB0ZXN0LmdldE5hbWUoKSArICIgLi4uICIpOwotICAgICAgICAgICAgcHcuZmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoQ21pc1Rlc3QgdGVzdCkgewotICAgICAgICAgICAgcHcucHJpbnRsbigiY29tcGxldGVkPGJyPiIpOwotICAgICAgICAgICAgcHcuZmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2UoU3RyaW5nIG1zZykgewotICAgICAgICAgICAgcHcucHJpbnRsbihtc2cpOwotICAgICAgICAgICAgcHcuZmx1c2goKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9iYXNpY3MvQmFzaWNzVGVzdEdyb3VwLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvYmFzaWNzL0Jhc2ljc1Rlc3RHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzExMmUyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9iYXNpY3MvQmFzaWNzVGVzdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmJhc2ljczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0R3JvdXA7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGdyb3VwIGNvbnRhaW5zIHRlc3RzIHRoYXQgY2hlY2sgdGhlIENNSVMgYmFzaWNzIHN1Y2ggdGhlIHJlcG9zaXRvcnkKLSAqIGluZm8gb3IgdHlwZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY3NUZXN0R3JvdXAgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0R3JvdXAgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLQotICAgICAgICBzZXROYW1lKCJCYXNpY3MgVGVzdCBHcm91cCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQmFzaWMgdGVzdHMuIik7Ci0KLSAgICAgICAgYWRkVGVzdChuZXcgU2VjdXJpdHlUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBSZXBvc2l0b3J5SW5mb1Rlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFJvb3RGb2xkZXJUZXN0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9iYXNpY3MvUmVwb3NpdG9yeUluZm9UZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvYmFzaWNzL1JlcG9zaXRvcnlJbmZvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGI1YzA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9iYXNpY3MvUmVwb3NpdG9yeUluZm9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5iYXNpY3M7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5PSzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkc7Ci0KLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsQ2FwYWJpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogUmVwb3NpdG9yeSBpbmZvIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5SW5mb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIlJlcG9zaXRvcnkgSW5mbyBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJHZXRzIGFuZCBjaGVja3MgdGhlIHJlcG9zaXRvcnkgaW5mby4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IHN1Y2Nlc3M7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmU7Ci0KLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmkgPSBnZXRSZXBvc2l0b3J5SW5mbyhzZXNzaW9uKTsKLQotICAgICAgICAvLyBJRAotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiUmVwb3NpdG9yeSBJRDogIiArIHJpLmdldElkKCkpOwotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZXBvc2l0b3J5IGlkIGlzIG5vdCBzZXQhIiwgdHJ1ZSk7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXRJZCgpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgLy8gbmFtZQotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZXBvc2l0b3J5IG5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwocmkuZ2V0TmFtZSgpLCBudWxsLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIlJlcG9zaXRvcnkgbmFtZTogIiArIHJpLmdldE5hbWUoKSk7Ci0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlJlcG9zaXRvcnkgbmFtZSBpcyBlbXB0eSEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldE5hbWUoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgIC8vIGRlc2NyaXB0aW9uCi0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJlcG9zaXRvcnkgZGVzY3JpcHRpb24gaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwocmkuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgZmFpbHVyZSkpOwotCi0gICAgICAgIHN1Y2Nlc3MgPSBjcmVhdGVSZXN1bHQoT0ssICJSZXBvc2l0b3J5IGRlc2NyaXB0aW9uOiAiICsgcmkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlJlcG9zaXRvcnkgZGVzY3JpcHRpb24gaXMgZW1wdHkhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXREZXNjcmlwdGlvbigpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgLy8gdmVuZG9yCi0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlZlbmRvciBuYW1lIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXRWZW5kb3JOYW1lKCksIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiVmVuZG9yIG5hbWU6ICIgKyByaS5nZXRWZW5kb3JOYW1lKCkpOwotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJWZW5kb3IgbmFtZSBpcyBlbXB0eSEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldFZlbmRvck5hbWUoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgIC8vIHByb2R1Y3QgbmFtZQotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQcm9kdWN0IG5hbWUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldFByb2R1Y3ROYW1lKCksIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiUHJvZHVjdCBuYW1lOiAiICsgcmkuZ2V0UHJvZHVjdE5hbWUoKSk7Ci0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlByb2R1Y3QgbmFtZSBpcyBlbXB0eSEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldFByb2R1Y3ROYW1lKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAvLyBwcm9kdWN0IHZlcnNpb24KLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUHJvZHVjdCB2ZXJzaW9uIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXRQcm9kdWN0VmVyc2lvbigpLCBudWxsLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIlByb2R1Y3QgdmVyc2lvbjogIiArIHJpLmdldFByb2R1Y3RWZXJzaW9uKCkpOwotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJQcm9kdWN0IHZlcnNpb24gaXMgZW1wdHkhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXRQcm9kdWN0VmVyc2lvbigpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgLy8gQ01JUyB2ZXJzaW9uIHN1cHBvcnRlZAotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiQ01JUyBWZXJzaW9uIFN1cHBvcnRlZDogIiArIHJpLmdldENtaXNWZXJzaW9uU3VwcG9ydGVkKCkpOwotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDTUlTIFZlcnNpb24gU3VwcG9ydGVkIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXRDbWlzVmVyc2lvblN1cHBvcnRlZCgpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgaWYgKCEiMS4wIi5lcXVhbHMocmkuZ2V0Q21pc1ZlcnNpb25TdXBwb3J0ZWQoKSkgJiYgISIxLjEiLmVxdWFscyhyaS5nZXRDbWlzVmVyc2lvblN1cHBvcnRlZCgpKSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ01JUyBWZXJzaW9uIFN1cHBvcnRlZCBpcyBuZWl0aGVyICcxLjAnIG5vciAnMS4xJyEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByb290IGZvbGRlcgotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiUm9vdCBmb2xkZXIgSUQ6ICIgKyByaS5nZXRSb290Rm9sZGVySWQoKSk7Ci0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJvb3QgZm9sZGVyIElEIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXRSb290Rm9sZGVySWQoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgIC8vIHRoaW4gY2xpZW50IFVSSQotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiVGhpbiBjbGllbnQgVVJJOiAiICsgcmkuZ2V0VGhpbkNsaWVudFVyaSgpKTsKLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiVGhpbiBjbGllbnQgVVJJIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShyaS5nZXRUaGluQ2xpZW50VXJpKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICBpZiAocmkuZ2V0VGhpbkNsaWVudFVyaSgpICE9IG51bGwgJiYgcmkuZ2V0VGhpbkNsaWVudFVyaSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSAobmV3IFVSTChyaS5nZXRUaGluQ2xpZW50VXJpKCkpKS5vcGVuQ29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICAgICAgY29ubi5jb25uZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmVzcG9uc2VDb2RlID0gY29ubi5nZXRSZXNwb25zZUNvZGUoKTsKLSAgICAgICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJVbmFibGUgdG8gY29ubmVjdCB0byB0aGluIGNsaWVudCAnIiArIHJpLmdldFRoaW5DbGllbnRVcmkoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJy4gSFRUUCBzdGF0dXMgY29kZTogIiArIHJlc3BvbnNlQ29kZSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzVHJ1ZShyZXNwb25zZUNvZGUgPj0gMjAwICYmIHJlc3BvbnNlQ29kZSA8IDQwMCwgbnVsbCwgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAgICAgY29ubi5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywgIlVuYWJsZSB0byBjb25uZWN0IHRvIHRoaW4gY2xpZW50ICciICsgcmkuZ2V0VGhpbkNsaWVudFVyaSgpICsgIic6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcmluY2lwYWwgSUQgYW5vbnltb3VzCi0gICAgICAgIHN1Y2Nlc3MgPSBjcmVhdGVSZXN1bHQoT0ssICJQcmluY2lwYWwgSUQgYW5vbnltb3VzOiAiICsgcmkuZ2V0UHJpbmNpcGFsSWRBbm9ueW1vdXMoKSk7Ci0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlByaW5jaXBhbCBJRCBhbm9ueW1vdXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldFByaW5jaXBhbElkQW5vbnltb3VzKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAvLyBwcmluY2lwYWwgSUQgYW55b25lCi0gICAgICAgIHN1Y2Nlc3MgPSBjcmVhdGVSZXN1bHQoT0ssICJQcmluY2lwYWwgSUQgYW55b25lOiAiICsgcmkuZ2V0UHJpbmNpcGFsSWRBbnlvbmUoKSk7Ci0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlByaW5jaXBhbCBJZCBhbnlvbmUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldFByaW5jaXBhbElkQW55b25lKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAvLyBsYXRlc3QgY2hhbmdlIGxvZyB0b2tlbgotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiTGF0ZXN0IGNoYW5nZSBsb2cgdG9rZW46ICIgKyByaS5nZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbigpKTsKLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiTGF0ZXN0IGNoYW5nZSBsb2cgdG9rZW4gaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAvLyBjaGFuZ2VzIGluY29tcGxldGUKLSAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIkNoYW5nZXMgSW5jb21wbGV0ZTogIiArIHJpLmdldENoYW5nZXNJbmNvbXBsZXRlKCkpOwotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJDaGFuZ2VzIEluY29tcGxldGUgaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwocmkuZ2V0Q2hhbmdlc0luY29tcGxldGUoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgIC8vIGNoYW5nZXMgb24gdHlwZQotICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiQ2hhbmdlcyBvbiB0eXBlOiAiICsgcmkuZ2V0Q2hhbmdlc09uVHlwZSgpKTsKLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ2hhbmdlcyBvbiB0eXBlIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHJpLmdldENoYW5nZXNPblR5cGUoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgIGlmIChyaS5nZXRDaGFuZ2VzT25UeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ2hhbmdlcyBvbiB0eXBlIGhhcyBtb3JlIHRoYW4gNCBlbnRyaWVzISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzVHJ1ZShyaS5nZXRDaGFuZ2VzT25UeXBlKCkuc2l6ZSgpIDwgNSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmVhdHVyZXMKLSAgICAgICAgaWYgKHJpLmdldENtaXNWZXJzaW9uKCkgIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBjcmVhdGVSZXN1bHQoT0ssICJSZXBvc2l0b3J5IGZlYXR1cmVzIGV4cG9zZWQuIik7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KE9LLCAiTm8gcmVwb3NpdG9yeSBmZWF0dXJlcyBleHBvc2VkLiIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwocmkuZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICBpZiAocmkuZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChFeHRlbnNpb25GZWF0dXJlIGZlYXR1cmUgOiByaS5nZXRFeHRlbnNpb25GZWF0dXJlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkF0IGxlYXN0IG9uZSByZXBvc2l0b3J5IGZlYXR1cmVzIGhhcyBubyBJRCEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KGZlYXR1cmUuZ2V0SWQoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNhcGFiaWxpdGllcwotICAgICAgICBpZiAocmkuZ2V0Q2FwYWJpbGl0aWVzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2FwYWJpbGl0aWVzIGFyZSBub3Qgc2V0ISIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFJlcG9zaXRvcnlDYXBhYmlsaXRpZXMgY2FwID0gcmkuZ2V0Q2FwYWJpbGl0aWVzKCk7Ci0KLSAgICAgICAgICAgIC8vIEFDTCBjYXBhYmlsaXR5Ci0gICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiQUNMIGNhcGFiaWxpdHk6ICIgKyBjYXAuZ2V0QWNsQ2FwYWJpbGl0eSgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFDTCBjYXBhYmlsaXR5IGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChjYXAuZ2V0QWNsQ2FwYWJpbGl0eSgpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgICAgIC8vIGNoYW5nZXMgY2FwYWJpbGl0eQotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIkNoYW5nZXMgY2FwYWJpbGl0eTogIiArIGNhcC5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkNoYW5nZXMgY2FwYWJpbGl0eSBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoY2FwLmdldENoYW5nZXNDYXBhYmlsaXR5KCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgLy8gY29udGVudCBzdHJlYW0gdXBkYXRlcyBjYXBhYmlsaXR5Ci0gICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiQ29udGVudCBzdHJlYW0gdXBkYXRlcyBjYXBhYmlsaXR5OiAiICsgY2FwLmdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgc3RyZWFtIHVwZGF0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKGNhcC5nZXRDb250ZW50U3RyZWFtVXBkYXRlc0NhcGFiaWxpdHkoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAvLyBnZXQgZGVzY2VuZGFudHMgY2FwYWJpbGl0eQotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIkdldCBkZXNjZW5kYW50cyBjYXBhYmlsaXR5OiAiICsgY2FwLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSk7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJHZXQgZGVzY2VuZGFudHMgY2FwYWJpbGl0eSBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoY2FwLmlzR2V0RGVzY2VuZGFudHNTdXBwb3J0ZWQoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAvLyBnZXQgZm9sZGVyIHRyZWUgY2FwYWJpbGl0eQotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIkdldCBmb2xkZXIgdHJlZSBjYXBhYmlsaXR5OiAiICsgY2FwLmlzR2V0Rm9sZGVyVHJlZVN1cHBvcnRlZCgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkdldCBmb2xkZXIgdHJlZSBjYXBhYmlsaXR5IGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChjYXAuaXNHZXRGb2xkZXJUcmVlU3VwcG9ydGVkKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgLy8gbXVsdGlmaWxpbmcgY2FwYWJpbGl0eQotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIk11bHRpZmlsaW5nIGNhcGFiaWxpdHk6ICIgKyBjYXAuaXNNdWx0aWZpbGluZ1N1cHBvcnRlZCgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk11bHRpZmlsaW5nIGNhcGFiaWxpdHkgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKGNhcC5pc011bHRpZmlsaW5nU3VwcG9ydGVkKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgLy8gdW5maWxpbmcgY2FwYWJpbGl0eQotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIlVuZmlsaW5nIGNhcGFiaWxpdHk6ICIgKyBjYXAuaXNVbmZpbGluZ1N1cHBvcnRlZCgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlVuZmlsaW5nIGNhcGFiaWxpdHkgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKGNhcC5pc1VuZmlsaW5nU3VwcG9ydGVkKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgLy8gdmVyc2lvbiBzcGVjaWZpYyBmaWxpbmcgY2FwYWJpbGl0eQotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIlZlcnNpb24gc3BlY2lmaWMgZmlsaW5nIGNhcGFiaWxpdHk6ICIgKyBjYXAuaXNWZXJzaW9uU3BlY2lmaWNGaWxpbmdTdXBwb3J0ZWQoKSk7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIHNwZWNpZmljIGZpbGluZyBjYXBhYmlsaXR5IGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChjYXAuaXNWZXJzaW9uU3BlY2lmaWNGaWxpbmdTdXBwb3J0ZWQoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAvLyBxdWVyeSBjYXBhYmlsaXR5Ci0gICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiUXVlcnkgY2FwYWJpbGl0eTogIiArIGNhcC5nZXRRdWVyeUNhcGFiaWxpdHkoKSk7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSBjYXBhYmlsaXR5IGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChjYXAuZ2V0UXVlcnlDYXBhYmlsaXR5KCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgLy8gSk9JTiBjYXBhYmlsaXR5Ci0gICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiSk9JTiBjYXBhYmlsaXR5OiAiICsgY2FwLmdldEpvaW5DYXBhYmlsaXR5KCkpOwotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiSk9JTiBjYXBhYmlsaXR5IGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChjYXAuZ2V0Sm9pbkNhcGFiaWxpdHkoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAvLyBhbGwgdmVyc2lvbnMgc2VhcmNoYWJsZSBjYXBhYmlsaXR5Ci0gICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiQWxsIHZlcnNpb25zIHNlYXJjaGFibGUgY2FwYWJpbGl0eTogIiArIGNhcC5pc0FsbFZlcnNpb25zU2VhcmNoYWJsZVN1cHBvcnRlZCgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFsbCB2ZXJzaW9ucyBzZWFyY2hhYmxlIGNhcGFiaWxpdHkgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKGNhcC5pc0FsbFZlcnNpb25zU2VhcmNoYWJsZVN1cHBvcnRlZCgpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgICAgIC8vIFBXQyBzZWFyY2hhYmxlIGNhcGFiaWxpdHkKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBjcmVhdGVSZXN1bHQoT0ssICJQV0Mgc2VhcmNoYWJsZSBjYXBhYmlsaXR5OiAiICsgY2FwLmlzUHdjU2VhcmNoYWJsZVN1cHBvcnRlZCgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlBXQyBzZWFyY2hhYmxlIGNhcGFiaWxpdHkgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKGNhcC5pc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAvLyBQV0MgdXBkYXRhYmxlIGNhcGFiaWxpdHkKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBjcmVhdGVSZXN1bHQoT0ssICJQV0MgdXBkYXRhYmxlIGNhcGFiaWxpdHk6ICIgKyBjYXAuaXNQd2NVcGRhdGFibGVTdXBwb3J0ZWQoKSk7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJQV0MgdXBkYXRhYmxlIGNhcGFiaWxpdHkgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKGNhcC5pc1B3Y1VwZGF0YWJsZVN1cHBvcnRlZCgpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgICAgIC8vIHJlbmRpdGlvbnMgY2FwYWJpbGl0eQotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIlJlbmRpdGlvbnMgY2FwYWJpbGl0eTogIiArIGNhcC5nZXRSZW5kaXRpb25zQ2FwYWJpbGl0eSgpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJlbmRpdGlvbnMgY2FwYWJpbGl0eSBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoY2FwLmdldFJlbmRpdGlvbnNDYXBhYmlsaXR5KCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgaWYgKHJpLmdldENtaXNWZXJzaW9uKCkgIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgICAgICAvLyBuZXcgdHlwZSBzZXR0YWJsZSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIidOZXcgdHlwZSBzZXR0YWJsZSBhdHRyaWJ1dGVzJyBmbGFncyBhcmUgc2V0LiIpOwotICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIidOZXcgdHlwZSBzZXR0YWJsZSBhdHRyaWJ1dGVzJyBmbGFncyBhcmUgbm90IHNldCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChjYXAuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGFibGUgcHJvcGVydHkgdHlwZXMKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiJ0NyZWF0YWJsZSBwcm9wZXJ0eSB0eXBlcycgZmxhZ3MgYXJlIHNldC4iKTsKLSAgICAgICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICInQ3JlYXRhYmxlIHByb3BlcnR5IHR5cGVzJyBmbGFncyBhcmUgbm90IHNldCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChjYXAuZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBQ0wgY2FwYWJpbGl0aWVzCi0gICAgICAgIGlmIChyaS5nZXRBY2xDYXBhYmlsaXRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJBQ0wgY2FwYWJpbGl0aWVzIGFyZSBub3Qgc2V0ISIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFjbENhcGFiaWxpdGllcyBhY2xDYXAgPSByaS5nZXRBY2xDYXBhYmlsaXRpZXMoKTsKLQotICAgICAgICAgICAgLy8gc3VwcG9ydGVkIHBlcm1pc3Npb25zCi0gICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiU3VwcG9ydGVkIHBlcm1pc3Npb25zOiAiICsgYWNsQ2FwLmdldFN1cHBvcnRlZFBlcm1pc3Npb25zKCkpOwotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiU3VwcG9ydGVkIHBlcm1pc3Npb25zIGFyZSBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoYWNsQ2FwLmdldFN1cHBvcnRlZFBlcm1pc3Npb25zKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgLy8gQUNMIHByb3BhZ2F0aW9uCi0gICAgICAgICAgICBzdWNjZXNzID0gY3JlYXRlUmVzdWx0KE9LLCAiQUNMIHByb3BhZ2F0aW9uOiAiICsgYWNsQ2FwLmdldEFjbFByb3BhZ2F0aW9uKCkpOwotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQUNMIHByb3BhZ2F0aW9uIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChhY2xDYXAuZ2V0QWNsUHJvcGFnYXRpb24oKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAvLyBwZXJtaXNzaW9ucwotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIlBlcm1pc3Npb25zOiAiCi0gICAgICAgICAgICAgICAgICAgICsgKGFjbENhcC5nZXRQZXJtaXNzaW9ucygpID09IG51bGwgPyAiPyIgOiBhY2xDYXAuZ2V0UGVybWlzc2lvbnMoKS5zaXplKCkpKTsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlBlcm1pc3Npb25zIGFyZSBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoYWNsQ2FwLmdldFBlcm1pc3Npb25zKCksIHN1Y2Nlc3MsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgaWYgKGFjbENhcC5nZXRQZXJtaXNzaW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChQZXJtaXNzaW9uRGVmaW5pdGlvbiBwZXJtRGVmIDogYWNsQ2FwLmdldFBlcm1pc3Npb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUGVybWlzc2lvbiAjIiArIGkgKyAiIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHBlcm1EZWYsIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGVybURlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJJRCBvZiBwZXJtaXNzaW9uICMiICsgaSArICIgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShwZXJtRGVmLmdldElkKCksIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHBlcm1pc3Npb24gbWFwcGluZwotICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIlBlcm1pc3Npb24gbWFwcGluZzogIgotICAgICAgICAgICAgICAgICAgICArIChhY2xDYXAuZ2V0UGVybWlzc2lvbk1hcHBpbmcoKSA9PSBudWxsID8gIj8iIDogYWNsQ2FwLmdldFBlcm1pc3Npb25NYXBwaW5nKCkuc2l6ZSgpKSk7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJQZXJtaXNzaW9uIG1hcHBpbmcgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKGFjbENhcC5nZXRQZXJtaXNzaW9uTWFwcGluZygpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmkuZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEV4dGVuc2lvbkZlYXR1cmUgZWYgOiByaS5nZXRFeHRlbnNpb25GZWF0dXJlcygpKSB7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGNyZWF0ZVJlc3VsdChPSywgIkV4dGVuc2lvbiBGZWF0dXJlOiAiICsgZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRXh0ZW5zaW9uIEZlYXR1cmUgd2l0aG91dCBJRCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0U3RyaW5nTm90RW1wdHkoZWYuZ2V0SWQoKSwgc3VjY2VzcywgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRXh0ZW5zaW9uIEZlYXR1cmUgd2l0aG91dCBjb21tb24gbmFtZTogIiArIGVmLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShlZi5nZXRDb21tb25OYW1lKCksIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkV4dGVuc2lvbiBGZWF0dXJlIHdpdGhvdXQgdmVyc2lvbiBsYWJlbDogIiArIGVmLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShlZi5nZXRWZXJzaW9uTGFiZWwoKSwgbnVsbCwgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRXh0ZW5zaW9uIEZlYXR1cmUgd2l0aG91dCBVUkw6ICIgKyBlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0U3RyaW5nTm90RW1wdHkoZWYuZ2V0VXJsKCksIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9iYXNpY3MvUm9vdEZvbGRlclRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9iYXNpY3MvUm9vdEZvbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0N2I1ZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvYmFzaWNzL1Jvb3RGb2xkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmJhc2ljczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLk9LOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORzsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotLyoqCi0gKiBCYXNpYyByb290IGZvbGRlciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFJvb3RGb2xkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJSb290IEZvbGRlciBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDaGVja3MgdGhlIHJvb3QgZm9sZGVyIGFuZCBpdHMgY2hpbGRyZW4gZm9yIHNwZWNpZmljYXRpb24gY29tcGxpYW5jZS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgc3VjY2VzczsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZTsKLQotICAgICAgICAvLyBjaGVjayByb290IGZvbGRlciBpZAotICAgICAgICBSZXBvc2l0b3J5SW5mbyByaSA9IGdldFJlcG9zaXRvcnlJbmZvKHNlc3Npb24pOwotCi0gICAgICAgIHN1Y2Nlc3MgPSBjcmVhdGVSZXN1bHQoT0ssICJSb290IGZvbGRlciBpZDogIiArIHJpLmdldFJvb3RGb2xkZXJJZCgpKTsKLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUm9vdCBmb2xkZXIgaWQgaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KHJpLmdldFJvb3RGb2xkZXJJZCgpLCBzdWNjZXNzLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSByb290IGZvbGRlcgotICAgICAgICBGb2xkZXIgcm9vdEZvbGRlciA9IHNlc3Npb24uZ2V0Um9vdEZvbGRlcihTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICBpZiAocm9vdEZvbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSb290IGZvbGRlciBpcyBub3QgYXZhaWxhYmxlISIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCByb290Rm9sZGVyLCBnZXRBbGxQcm9wZXJ0aWVzKHJvb3RGb2xkZXIpLCAiUm9vdCBmb2xkZXIgb2JqZWN0IHNwZWMgY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAvLyBmb2xkZXIgYW5kIHBhdGgKLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICJSb290IGZvbGRlciBpZCBpbiB0aGUgcmVwb3NpdG9yeSBpbmZvIGRvZXNuJ3QgbWF0Y2ggdGhlIHJvb3QgZm9sZGVyIG9iamVjdCBpZCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhyaS5nZXRSb290Rm9sZGVySWQoKSwgcm9vdEZvbGRlci5nZXRJZCgpLCBudWxsLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUm9vdCBmb2xkZXIgaXMgbm90IGEgY21pczpmb2xkZXIhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0ZPTERFUiwgcm9vdEZvbGRlci5nZXRCYXNlVHlwZUlkKCksIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSb290IGZvbGRlciBwYXRoIGlzIG5vdCAnLychIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoIi8iLCByb290Rm9sZGVyLmdldFBhdGgoKSwgbnVsbCwgZmFpbHVyZSkpOwotCi0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJvb3QgZm9sZGVyIGhhcyBwYXJlbnRzISIpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDAsIHJvb3RGb2xkZXIuZ2V0UGFyZW50cygpLnNpemUoKSwgbnVsbCwgZmFpbHVyZSkpOwotCi0gICAgICAgIC8vIGFsbG93YWJsZSBhY3Rpb25zCi0gICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJvb3QgZm9sZGVyIGhhcyBDQU5fR0VUX0ZPTERFUl9QQVJFTlQgYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdEFsbG93YWJsZUFjdGlvbihyb290Rm9sZGVyLCBBY3Rpb24uQ0FOX0dFVF9GT0xERVJfUEFSRU5ULCBudWxsLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiUm9vdCBmb2xkZXIgaGFzIG5vIENBTl9HRVRfQ0hJTERSRU4gYWxsb3dhYmxlIGFjdGlvbiEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydEFsbG93YWJsZUFjdGlvbihyb290Rm9sZGVyLCBBY3Rpb24uQ0FOX0dFVF9DSElMRFJFTiwgbnVsbCwgZmFpbHVyZSkpOwotCi0gICAgICAgIC8vIHNpbXBsZSBjaGlsZHJlbiB0ZXN0Ci0gICAgICAgIGFkZFJlc3VsdChjaGVja0NoaWxkcmVuKHNlc3Npb24sIHJvb3RGb2xkZXIsICJSb290IGZvbGRlciBjaGlsZHJlbiBjaGVjayIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvYmFzaWNzL1NlY3VyaXR5VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2Jhc2ljcy9TZWN1cml0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjODFkOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvYmFzaWNzL1NlY3VyaXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5iYXNpY3M7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmluZGluZ1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogVGVzdHMgd2V0aGVyIEhUVFBTIGlzIHVzZWQgb3Igbm90LgotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJTZWN1cml0eSBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDaGVja3MgaWYgSFRUUFMgaXMgdXNlZC4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBCaW5kaW5nVHlwZSBiaW5kaW5nID0gZ2V0QmluZGluZygpOwotCi0gICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJCaW5kaW5nOiAiICsgYmluZGluZykpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkhUVFBTIGlzIG5vdCB1c2VkLiBDcmVkZW50aWFscyBtaWdodCBiZSB0cmFuc2ZlcnJlZCBhcyBwbGFpbiB0ZXh0ISIpOwotCi0gICAgICAgIHN3aXRjaCAoYmluZGluZykgewotICAgICAgICBjYXNlIEFUT01QVUI6Ci0gICAgICAgICAgICBpZiAoIWlzSHR0cHNVcmwoZ2V0UGFyYW1ldGVycygpLmdldChTZXNzaW9uUGFyYW1ldGVyLkFUT01QVUJfVVJMKSkpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXRUJTRVJWSUNFUzoKLSAgICAgICAgICAgIGlmICghaXNIdHRwc1VybChnZXRQYXJhbWV0ZXJzKCkuZ2V0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFKSkpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUk9XU0VSOgotICAgICAgICAgICAgaWYgKCFpc0h0dHBzVXJsKGdldFBhcmFtZXRlcnMoKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX1VSTCkpKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHR0cHNVcmwoU3RyaW5nIHVybCkgewotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmwudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5zdGFydHNXaXRoKCJodHRwczovLyIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jb250cm9sL0FDTFNtb2tlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NvbnRyb2wvQUNMU21va2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzQ5ZmMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NvbnRyb2wvQUNMU21va2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jb250cm9sOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5UZXN0UGFyYW1ldGVyczsKLQotLyoqCi0gKiBBQ0wgc21va2UgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIEFDTFNtb2tlVGVzdCBleHRlbmRzIEFic3RyYWN0U2Vzc2lvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiQUNMIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgYSBkb2N1bWVudCBhbmQgY2hlY2tzIGl0cyBBQ0wuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmIChzdXBwb3J0c0FDTHMoc2Vzc2lvbikpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvbGRlciBhbmQgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICBGb2xkZXIgdGVzdEZvbGRlciA9IGNyZWF0ZVRlc3RGb2xkZXIoc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImFjbHRlc3QudHh0IiwgIkFDTCB0ZXN0Iik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbiBBQ0wKLSAgICAgICAgICAgICAgICBBY2wgYWNsID0gZG9jLmdldEFjbCgpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQUNMcyBhcmUgc3VwcG9ydGVkIGJ1dCBuZXdseSBjcmVhdGVkIGRvY3VtZW50IGhhcyBubyBBQ0whIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoYWNsLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBiYXNpYyBwZXJtaXNzaW9ucwotICAgICAgICAgICAgICAgIEFjbCBiYXNpY0FjbCA9IHNlc3Npb24uZ2V0QWNsKGRvYywgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQUNMcyBhcmUgc3VwcG9ydGVkIGJ1dCByZXBvc2l0b3J5IGRvZXMgbm90IHJldHVybiBhIGJhc2ljIEFDTCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnQhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoYmFzaWNBY2wsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGlmIChiYXNpY0FjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja0FDTChzZXNzaW9uLCBiYXNpY0FjbCwgZmFsc2UsICJCYXNpYyBBQ0wiKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2ljQWNsLmdldEFjZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiBiYXNpY0FjbC5nZXRBY2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNlLmdldFBlcm1pc3Npb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXNzaW9uIDogYWNlLmdldFBlcm1pc3Npb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImNtaXM6cmVhZCIuZXF1YWxzKHBlcm1pc3Npb24pICYmICEiY21pczp3cml0ZSIuZXF1YWxzKHBlcm1pc3Npb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICEiY21pczphbGwiLmVxdWFscyhwZXJtaXNzaW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFDRSBjb250YWlucyBhIG5vbi1iYXNpYyBwZXJtaXNzaW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBlcm1pc3Npb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChnZXRBY2xDYXBhYmlsaXR5KHNlc3Npb24pID09IENhcGFiaWxpdHlBY2wuTUFOQUdFCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhQm9vbGVhbi5GQUxTRS5lcXVhbHMoZG9jLmdldFR5cGUoKS5pc0NvbnRyb2xsYWJsZUFjbCgpKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJpbmNpcGFsID0gZ2V0UGFyYW1ldGVycygpLmdldChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0FDTF9QUklOQ0lQQUwpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJpbmNpcGFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW5jaXBhbCA9IFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfQUNMX1BSSU5DSVBBTF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IHBlcm1pc3Npb24gImNtaXM6d3JpdGUiCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8QWNlPiBhY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjZXMuYWRkKHNlc3Npb24uZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUFjZShwcmluY2lwYWwsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImNtaXM6d3JpdGUiKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uYXBwbHlBY2woZG9jLCBhY2VzLCBudWxsLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldEFjbENhcGFiaWxpdGllcygpLmdldEFjbFByb3BhZ2F0aW9uKCkgIT0gQWNsUHJvcGFnYXRpb24uUkVQT1NJVE9SWURFVEVSTUlORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBwZXJtaXNzaW9uICJjbWlzOmFsbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjZXMgPSBuZXcgQXJyYXlMaXN0PEFjZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjZXMuYWRkKHNlc3Npb24uZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUFjZShwcmluY2lwYWwsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImNtaXM6YWxsIikpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRBY2woZG9jLCBhY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoSU5GTywgIlRoZSByZXBvc2l0b3J5IG9yIHRoZSB0eXBlICciICsgZG9jLmdldFR5cGUoKS5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBkb24ndCBzdXBwb3J0IG1hbmFnaW5nIEFDTHMuIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRlbGV0ZU9iamVjdChkb2MpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJBQ0xzIGFyZSBub3Qgc3VwcG9ydGVkLiBUZXN0IFNraXBwZWQhIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNBQ0xzKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDYXBhYmlsaXR5QWNsIGFjbENhcCA9IGdldEFjbENhcGFiaWxpdHkoc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiAoYWNsQ2FwICE9IG51bGwpICYmIChhY2xDYXAgIT0gQ2FwYWJpbGl0eUFjbC5OT05FKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2FwYWJpbGl0eUFjbCBnZXRBY2xDYXBhYmlsaXR5KFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5ID0gc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmdldEFjbENhcGFiaWxpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmdldEFjbENhcGFiaWxpdHkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY29udHJvbC9Db250cm9sVGVzdEdyb3VwLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY29udHJvbC9Db250cm9sVGVzdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Y2ZkZTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NvbnRyb2wvQ29udHJvbFRlc3RHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jb250cm9sOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3RHcm91cDsKLQotLyoqCi0gKiBUaGlzIHRlc3QgZ3JvdXAgY29udGFpbnMgQUNMIGFuZCBwb2xpY3kgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sVGVzdEdyb3VwIGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdEdyb3VwIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgc2V0TmFtZSgiQ29udHJvbCBUZXN0IEdyb3VwIik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJBQ0wgYW5kIFBvbGljeSB0ZXN0cy4iKTsKLQotICAgICAgICBhZGRUZXN0KG5ldyBBQ0xTbW9rZVRlc3QoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQnVsa1VwZGF0ZVByb3BlcnRpZXNUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9CdWxrVXBkYXRlUHJvcGVydGllc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5N2NiMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9CdWxrVXBkYXRlUHJvcGVydGllc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNydWQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5CdWxrVXBkYXRlT2JqZWN0SWRBbmRDaGFuZ2VUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCdWxrVXBkYXRlUHJvcGVydGllc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIkJsdWsgdXBkYXRlIHRlc3QgY29udGVudC4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTkFNRSA9ICJidW5ld25hbWUudHh0IjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIkJ1bGsgVXBkYXRlIFByb3BlcnRpZXMgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIGZldyBmb2xkZXJzIGFuZCBkb2N1bWVudHMsIHJlbmFtZXMgYWxsIGRvY3VtZW50cyBhdCBvbmNlLCBhbmQgZGVsZXRlcyBhbGwgY3JlYXRlZCBvYmplY3RzLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDbWlzVmVyc2lvbigpID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJCdWxrIFVwZGF0ZSBQcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgQ01JUyAxLjAuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlID0gbnVsbDsKLSAgICAgICAgaW50IG51bU9mT2JqZWN0cyA9IDIwOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgRm9sZGVyPiBmb2xkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGb2xkZXI+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEb2N1bWVudD4gZG9jdW1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEb2N1bWVudD4oKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGZvbGRlcnMgYW5kIGRvY3VtZW50cwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZk9iamVjdHM7IGkrKykgewotICAgICAgICAgICAgICAgIEZvbGRlciBuZXdGb2xkZXIgPSBjcmVhdGVGb2xkZXIoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImJ1Zm9sZGVyIiArIGkpOwotICAgICAgICAgICAgICAgIGZvbGRlcnMucHV0KG5ld0ZvbGRlci5nZXRJZCgpLCBuZXdGb2xkZXIpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IG5ld0RvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgbmV3Rm9sZGVyLCAiYnVkb2MiICsgaSArICIudHh0IiwgQ09OVEVOVCk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnRzLnB1dChuZXdEb2N1bWVudC5nZXRJZCgpLCBuZXdEb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSBjbWlzOm5hbWUgb2YgYWxsIHRoZSBkb2N1bWVudHMKLSAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdD4gb2JqZWN0cyA9IG5ldyBBcnJheUxpc3Q8Q21pc09iamVjdD4oZG9jdW1lbnRzLnZhbHVlcygpKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgTkVXX05BTUUpOwotCi0gICAgICAgICAgICBMaXN0PEJ1bGtVcGRhdGVPYmplY3RJZEFuZENoYW5nZVRva2VuPiB1cGRhdGVkSWRzID0gc2Vzc2lvbi5idWxrVXBkYXRlUHJvcGVydGllcyhvYmplY3RzLCBwcm9wZXJ0aWVzLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHJlc3VsdAotICAgICAgICAgICAgaWYgKGdldEJpbmRpbmcoKSA9PSBCaW5kaW5nVHlwZS5XRUJTRVJWSUNFUykgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlldyBhZnRlciBUQyBjbGFyaWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChJTkZPLCAiVGhlIFdlYiBTZXJ2aWNlcyBiaW5kaW5nIGRvZXMgbm90IHJldHVybiB0aGUgdXBkYXRlZCBpZHMuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFRoaXMgaXNzdWUgaGFzIHRvIGJlIGNsYXJpZmllZCBieSB0aGUgQ01JUyBUQyBhbmQgdGhlIHRlc3QgdG8gYWRvcHRlZCBsYXRlci4iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkSWRzID09IG51bGwgfHwgdXBkYXRlZElkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQnVsayBVcGRhdGUgUHJvcGVydGllcyBkaWQgbm90IHVwZGF0ZSBhbnkgZG9jdW1lbnRzISIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJCdWxrIFVwZGF0ZSBQcm9wZXJ0aWVzIGRpZCBub3QgdXBkYXRlIGFsbCB0ZXN0IGRvY3VtZW50cyEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhkb2N1bWVudHMuc2l6ZSgpLCB1cGRhdGVkSWRzLnNpemUoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgYWxsIGRvY3VtZW50cwotICAgICAgICAgICAgZm9yIChGb2xkZXIgZm9sZGVyIDogZm9sZGVycy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIExpc3Q8Q21pc09iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PENtaXNPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChDbWlzT2JqZWN0IGNoaWxkIDogZm9sZGVyLmdldENoaWxkcmVuKFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLnNpemUoKSAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdCBmb2xkZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgY2hpbGQsIGJ1dCBpdCBoYXMgIiArIGNoaWxkcmVuLnNpemUoKSArICIhIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IGRvZXMgbm90IGhhdmUgdGhlIG5ldyBuYW1lISBJZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hpbGRyZW4uZ2V0KDApLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKE5FV19OQU1FLCBjaGlsZHJlbi5nZXQoMCkuZ2V0TmFtZSgpLCBudWxsLCBmYWlsdXJlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkZWxldGUgZm9sZGVycyBhbmQgZG9jdW1lbnRzCi0gICAgICAgICAgICBmb3IgKEZvbGRlciBmb2xkZXIgOiBmb2xkZXJzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgZm9sZGVyLmRlbGV0ZVRyZWUodHJ1ZSwgbnVsbCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NSVURUZXN0R3JvdXAuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NSVURUZXN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkZDFiNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DUlVEVGVzdEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNydWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdEdyb3VwOwotCi0vKioKLSAqIFRoaXMgdGVzdCBncm91cCBjb250YWlucyBzaW1wbGUgQ3JlYXRlLCBSZWFkLCBVcGRhdGUgYW5kIERlbGV0ZSB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIENSVURUZXN0R3JvdXAgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0R3JvdXAgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLQotICAgICAgICBzZXROYW1lKCJDUlVEIFRlc3QgR3JvdXAiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZSwgUmVhZCwgVXBkYXRlLCBhbmQgRGVsZXRlIHRlc3RzLiIpOwotCi0gICAgICAgIGFkZFRlc3QobmV3IENyZWF0ZUFuZERlbGV0ZUZvbGRlclRlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IENyZWF0ZUFuZERlbGV0ZURvY3VtZW50VGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgQ3JlYXRlQmlnRG9jdW1lbnQoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IENyZWF0ZURvY3VtZW50V2l0aG91dENvbnRlbnQoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IENyZWF0ZUludmFsaWRUeXBlVGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgTmFtZUNoYXJzZXRUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBXaGl0ZXNwYWNlSW5OYW1lVGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgQ3JlYXRlQW5kRGVsZXRlUmVsYXRpb25zaGlwVGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgQ3JlYXRlQW5kRGVsZXRlSXRlbVRlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFByb3BlcnR5RmlsdGVyVGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgVXBkYXRlU21va2VUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBCdWxrVXBkYXRlUHJvcGVydGllc1Rlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFNldEFuZERlbGV0ZUNvbnRlbnRUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBDaGFuZ2VUb2tlblRlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IENvbnRlbnRSYW5nZXNUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBDb3B5VGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgTW92ZVRlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IERlbGV0ZVRyZWVUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBPcGVyYXRpb25Db250ZXh0VGVzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DaGFuZ2VUb2tlblRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NoYW5nZVRva2VuVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU0NGRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NoYW5nZVRva2VuVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuY3J1ZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLklORk87Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5TS0lQUEVEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5Q29udGVudFN0cmVhbVVwZGF0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIENoYW5nZVRva2VuVGVzdCBleHRlbmRzIEFic3RyYWN0U2Vzc2lvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiQ2hhbmdlIFRva2VuIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgYSBkb2N1bWVudCBhbmQgYSBmb2xkZXIgYW5kIHVwZGF0ZXMgdGhlbSB3aXRoIGFuIG91dGRhdGVkIGNoYW5nZSB0b2tlbi4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gdXBkYXRlIGRvY3VtZW50IHByb3BlcnRpZXMgdGVzdAotICAgICAgICAgICAgcnVuVXBkYXRlRG9jdW1lbnRUZXN0KHNlc3Npb24sIHRlc3RGb2xkZXIpOwotCi0gICAgICAgICAgICAvLyBjb250ZW50IHVwZGF0ZSB0ZXN0Ci0gICAgICAgICAgICBydW5Db250ZW50VGVzdChzZXNzaW9uLCB0ZXN0Rm9sZGVyKTsKLQotICAgICAgICAgICAgLy8gdXBkYXRlIGZvbGRlciBwcm9wZXJ0aWVzIHRlc3QKLSAgICAgICAgICAgIHJ1blVwZGF0ZUZvbGRlclRlc3Qoc2Vzc2lvbiwgdGVzdEZvbGRlcik7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBjaGlsZCBhbmQgdXBkYXRlIGZvbGRlciBwcm9wZXJ0aWVzIHRlc3QKLSAgICAgICAgICAgIHJ1bkFkZENoaWxkRm9sZGVyVGVzdChzZXNzaW9uLCB0ZXN0Rm9sZGVyKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdGVzdCBmb2xkZXIKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBydW5VcGRhdGVEb2N1bWVudFRlc3QoU2Vzc2lvbiBzZXNzaW9uLCBGb2xkZXIgdGVzdEZvbGRlcikgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAidXBkYXRlMS50eHQiLCAiSGVsbG8gV29ybGQhIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkb2MuZ2V0Q2hhbmdlVG9rZW4oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELAotICAgICAgICAgICAgICAgICAgICAgICAgIlJlcG9zaXRvcnkgZG9lcyBub3QgcHJvdmlkZSBjaGFuZ2UgdG9rZW5zIGZvciBkb2N1bWVudHMuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgZG9jLmdldFR5cGUoKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBuYW1lUHJvcERlZiA9IHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgICAgIGlmIChuYW1lUHJvcERlZi5nZXRVcGRhdGFiaWxpdHkoKSA9PSBVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQKLSAgICAgICAgICAgICAgICAgICAgfHwgIWRvYy5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmNvbnRhaW5zKEFjdGlvbi5DQU5fVVBEQVRFX1BST1BFUlRJRVMpKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiRG9jdW1lbnQgbmFtZSBjYW4ndCBiZSBjaGFuZ2VkLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHVwZGF0ZSBzaG91bGQgc3VjY2VlZAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzMiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgcHJvcGVydGllczIucHV0KFByb3BlcnR5SWRzLk5BTUUsICJ1cGRhdGUyLnR4dCIpOwotICAgICAgICAgICAgT2JqZWN0SWQgbmV3SWQgPSBkb2MudXBkYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzMiwgZmFsc2UpOwotCi0gICAgICAgICAgICBpZiAoIWRvYy5nZXRJZCgpLmVxdWFscyhuZXdJZC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIC8vIHRoZSByZXBvc2l0b3J5IGNyZWF0ZWQgYSBuZXcgdmVyc2lvbgotICAgICAgICAgICAgICAgIC8vIC0+IGEgY2hhbmdlIHRva2VuIHRlc3QgZG9lcyBub3QgbWFrZSBzZW5zZQotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcmVwb3NpdG9yeSBjcmVhdGVkIGEgbmV3IHZlcnNpb24uIENoYW5nZSB0b2tlbnMgYXJlIG5vdCByZWxldmFudCBoZXJlLiIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzMyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzMy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgInVwZGF0ZTMudHh0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGRvYy51cGRhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMzLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVXBkYXRpbmcgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lIHdpdGggdGhlIHNhbWUgY2hhbmdlIHRva2VuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgcmVzdWx0IGluIGFuIFVwZGF0ZUNvbmZsaWN0IGV4Y2VwdGlvbiEiKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcnVuQ29udGVudFRlc3QoU2Vzc2lvbiBzZXNzaW9uLCBGb2xkZXIgdGVzdEZvbGRlcikgewotICAgICAgICBpZiAoc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldENhcGFiaWxpdGllcygpLmdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYWJpbGl0eSgpICE9IENhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlcy5BTllUSU1FKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJSZXBvc2l0b3J5IGRvZXNuJ3QgYWxsb3cgdG8gcmVwbGFjZSBjb250ZW50LiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImNvbnRlbnQxLnR4dCIsICJIZWxsbyBXb3JsZCEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRvYy5nZXRDaGFuZ2VUb2tlbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUmVwb3NpdG9yeSBkb2VzIG5vdCBwcm92aWRlIGNoYW5nZSB0b2tlbnMgZm9yIGRvY3VtZW50cy4gVGVzdCBza2lwcGVkISIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZG9jLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkuY29udGFpbnMoQWN0aW9uLkNBTl9TRVRfQ09OVEVOVF9TVFJFQU0pKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiRG9jdW1lbnQgY29udGVudCBjYW4ndCBiZSBjaGFuZ2VkLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IElPVXRpbHMudG9VVEY4Qnl0ZXMoIk5ldyBjb250ZW50Iik7Ci0gICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBuZXcgQ29udGVudFN0cmVhbUltcGwoImNvbnRlbnQyLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihjb250ZW50Qnl0ZXMubGVuZ3RoKSwgInRleHQvcGxhaW4iLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudEJ5dGVzKSk7Ci0KLSAgICAgICAgICAgIE9iamVjdElkIG5ld0lkID0gZG9jLnNldENvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbSwgdHJ1ZSwgZmFsc2UpOwotCi0gICAgICAgICAgICBpZiAobmV3SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRoZSBBdG9tUHViIGJpbmRpbmcgZG9lcyBub3QgcmV0dXJuIGFuIGlkIGhlcmUKLSAgICAgICAgICAgICAgICAvLyAtPiBnZXQgdGhlIGxhdGVzdCBpZCBmcm9tIHRoZSB2ZXJzaW9uIHNlcmllcwotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKCgoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgZG9jLmdldFR5cGUoKSkuaXNWZXJzaW9uYWJsZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PERvY3VtZW50PiB2ZXJzaW9ucyA9IGRvYy5nZXRBbGxWZXJzaW9ucygpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbnMgPT0gbnVsbCB8fCB2ZXJzaW9ucy5zaXplKCkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZXBvc2l0b3J5IHJldHVybmVkIGFuIGVtcHR5IGxpc3Qgb2YgZG9jdW1lbnQgdmVyc2lvbnMhIikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhdGVzdCBkb2N1bWVudCBpcyBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdJZCA9IHZlcnNpb25zLmdldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudCB0eXBlIGlzIG5vdCB2ZXJzaW9uYWJsZQotICAgICAgICAgICAgICAgICAgICAvLyAtPiB0aGUgcmVwb3NpdG9yeSBjb3VsZG4ndCBjcmVhdGUgYSBuZXcgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICBuZXdJZCA9IGRvYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuZXdJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkb2MuZ2V0SWQoKS5lcXVhbHMobmV3SWQuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcG9zaXRvcnkgY3JlYXRlZCBhIG5ldyB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIC0+IGEgY2hhbmdlIHRva2VuIHRlc3QgZG9lcyBub3QgbWFrZSBzZW5zZQotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KElORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZXBvc2l0b3J5IGNyZWF0ZWQgYSBuZXcgdmVyc2lvbi4gQ2hhbmdlIHRva2VucyBhcmUgbm90IHJlbGV2YW50IGhlcmUuIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb2Muc2V0Q29udGVudFN0cmVhbShjb250ZW50U3RyZWFtLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlVwZGF0aW5nIGNvbnRlbnQgYSBzZWNvbmQgdGltZSB3aXRoIHRoZSBzYW1lIGNoYW5nZSB0b2tlbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNob3VsZCByZXN1bHQgaW4gYW4gVXBkYXRlQ29uZmxpY3QgZXhjZXB0aW9uISIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uIHVjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBydW5VcGRhdGVGb2xkZXJUZXN0KFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHRlc3RGb2xkZXIpIHsKLSAgICAgICAgRm9sZGVyIGZvbGRlciA9IGNyZWF0ZUZvbGRlcihzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiZm9sZGVyMSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZm9sZGVyLmdldENoYW5nZVRva2VuKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlJlcG9zaXRvcnkgZG9lcyBub3QgcHJvdmlkZSBjaGFuZ2UgdG9rZW5zIGZvciBmb2xkZXJzLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmb2xkZXIuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhBY3Rpb24uQ0FOX1VQREFURV9QUk9QRVJUSUVTKSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIkZvbGRlciBuYW1lIGNhbid0IGJlIGNoYW5nZWQuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgdXBkYXRlIHNob3VsZCBzdWNjZWVkCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzMi5wdXQoUHJvcGVydHlJZHMuTkFNRSwgImZvbGRlcjIiKTsKLSAgICAgICAgICAgIGZvbGRlci51cGRhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMyLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzMyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAiZm9sZGVyMyIpOwotICAgICAgICAgICAgICAgIGZvbGRlci51cGRhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMzLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJVcGRhdGluZyBwcm9wZXJ0aWVzIGEgc2Vjb25kIHRpbWUgd2l0aCB0aGUgc2FtZSBjaGFuZ2UgdG9rZW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic2hvdWxkIHJlc3VsdCBpbiBhbiBVcGRhdGVDb25mbGljdCBleGNlcHRpb24hIikpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc1VwZGF0ZUNvbmZsaWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBleGNlcHRpb24KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGZvbGRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcnVuQWRkQ2hpbGRGb2xkZXJUZXN0KFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHRlc3RGb2xkZXIpIHsKLSAgICAgICAgRm9sZGVyIGZvbGRlciA9IGNyZWF0ZUZvbGRlcihzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiZm9sZGVyMSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZm9sZGVyLmdldENoYW5nZVRva2VuKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlJlcG9zaXRvcnkgZG9lcyBub3QgcHJvdmlkZSBjaGFuZ2UgdG9rZW5zIGZvciBmb2xkZXJzLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmb2xkZXIuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhBY3Rpb24uQ0FOX1VQREFURV9QUk9QRVJUSUVTKSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIkZvbGRlciBuYW1lIGNhbid0IGJlIGNoYW5nZWQuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCBmb2xkZXIsICJkb2MxIiwgImNvbnRlbnQiKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllczIucHV0KFByb3BlcnR5SWRzLk5BTUUsICJmb2xkZXIyIik7Ci0gICAgICAgICAgICAgICAgZm9sZGVyLnVwZGF0ZVByb3BlcnRpZXMocHJvcGVydGllczIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNVcGRhdGVDb25mbGljdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQWRkaW5nIGEgY2hpbGQgdG8gYSBmb2xkZXIgY2hhbmdlcyB0aGUgY2hhbmdlIHRva2VuIG9mIHRoZSBmb2xkZXIuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkNNSVMgY2xpZW50cyBtaWdodCBub3QgZXhwZWN0IHRoYXQuIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZWxldGVPYmplY3QoZm9sZGVyKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NvbnRlbnRSYW5nZXNUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9Db250ZW50UmFuZ2VzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjBiNjQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NvbnRlbnRSYW5nZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORzsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUGFydGlhbENvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogQ29udGVudCBSYW5nZSBUZXN0LgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFJhbmdlc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiQ29udGVudCBSYW5nZXMgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIGRvY3VtZW50IGFuZCByZWFkcyBkaWZmZXJlbnQgZXhjZXJwdHMgb2YgdGhlIGNvbnRlbnQuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgInRlc3Rjb250ZW50LnR4dCIsIENPTlRFTlQpOwotCi0gICAgICAgICAgICBTdHJpbmcgZXhjZXJwdDsKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudDsKLSAgICAgICAgICAgIGxvbmcgY29udGVudExlbmd0aCA9IGRvYy5nZXRDb250ZW50U3RyZWFtTGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIC8vIG5vIG9mZnNldCwgbm8gbGVuZ3RoIC0+IGZ1bGwgY29udGVudAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb250ZW50ID0gZG9jLmdldENvbnRlbnRTdHJlYW0obnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZXhjZXJwdCA9IGdldFN0cmluZ0Zyb21Db250ZW50U3RyZWFtKGNvbnRlbnQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPiAtMSAmJiBjb250ZW50LmdldExlbmd0aCgpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ29udGVudCBsZW5ndGggZG9lcyBub3QgbWF0Y2gge29mZnNldD1udWxsLCBsZW5ndGg9bnVsbH0hIiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKGNvbnRlbnRMZW5ndGgsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoQ09OVEVOVC5lcXVhbHMoZXhjZXJwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoY29udGVudCBpbnN0YW5jZW9mIFBhcnRpYWxDb250ZW50U3RyZWFtLCBudWxsLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIHN0cmVhbSBpcyBtYXJrZWQgYXMgcGFydGlhbCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWx0aG91Z2ggdGhlIGZ1bGwgc3RyZWFtIHtvZmZzZXQ9bnVsbCwgbGVuZ3RoPW51bGx9IHdhcyBleHBlY3RlZCEiKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHJpZXZlZCBzdHJlYW0gZG9lc24ndCBtYXRjaCB0aGUgZG9jdW1lbnQgY29udGVudCEiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyBmdWxsIHN0cmVhbSB7b2Zmc2V0PW51bGwsIGxlbmd0aD1udWxsfTogIiArIGUsIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9mZnNldCA9IDAsIG5vIGxlbmd0aCAtPiBmdWxsIGNvbnRlbnQKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29udGVudCA9IGRvYy5nZXRDb250ZW50U3RyZWFtKEJpZ0ludGVnZXIuWkVSTywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZXhjZXJwdCA9IGdldFN0cmluZ0Zyb21Db250ZW50U3RyZWFtKGNvbnRlbnQpOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPiAtMSAmJiBjb250ZW50LmdldExlbmd0aCgpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ29udGVudCBsZW5ndGggZG9lcyBub3QgbWF0Y2gge29mZnNldD0wLCBsZW5ndGg9bnVsbH0hIiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKGNvbnRlbnRMZW5ndGgsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoQ09OVEVOVC5lcXVhbHMoZXhjZXJwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoY29udGVudCBpbnN0YW5jZW9mIFBhcnRpYWxDb250ZW50U3RyZWFtLCBudWxsLCBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIHN0cmVhbSBpcyBtYXJrZWQgYXMgcGFydGlhbCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWx0aG91Z2ggdGhlIGZ1bGwgc3RyZWFtIHtvZmZzZXQ9MCwgbGVuZ3RoPW51bGx9IHdhcyBleHBlY3RlZCEiKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHJpZXZlZCBzdHJlYW0gZG9lc24ndCBtYXRjaCB0aGUgZG9jdW1lbnQgY29udGVudCEiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyBmdWxsIHN0cmVhbSB7b2Zmc2V0PTAsIGxlbmd0aD1udWxsfTogIiArIGUsIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9mZnNldCwgbm8gbGVuZ3RoCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBkb2MuZ2V0Q29udGVudFN0cmVhbShCaWdJbnRlZ2VyLnZhbHVlT2YoMyksIG51bGwpOwotICAgICAgICAgICAgICAgIGV4Y2VycHQgPSBnZXRTdHJpbmdGcm9tQ29udGVudFN0cmVhbShjb250ZW50KTsKLQotICAgICAgICAgICAgICAgIGlmIChjb250ZW50TGVuZ3RoID4gLTEgJiYgY29udGVudC5nZXRMZW5ndGgoKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkNvbnRlbnQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHtvZmZzZXQ9MywgbGVuZ3RoPW51bGx9ISIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhjb250ZW50TGVuZ3RoIC0gMywgY29udGVudC5nZXRMZW5ndGgoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChDT05URU5ULmVxdWFscyhleGNlcnB0KSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHJpZXZlZCBmdWxsIHN0cmVhbSBpbnN0ZWFkIG9mIGFuIGV4Y2VycHQge29mZnNldD0zLCBsZW5ndGg9bnVsbH0hIENvbnRlbnQgcmFuZ2VzIHN1cHBvcnRlZD8iKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc0ZhbHNlKGNvbnRlbnQgaW5zdGFuY2VvZiBQYXJ0aWFsQ29udGVudFN0cmVhbSwgbnVsbCwgY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHJpZXZlZCBzdHJlYW0gaXMgbWFya2VkIGFzIHBhcnRpYWwgc3RyZWFtLCAiICsgImFsdGhvdWdoIHRoZSBmdWxsIHN0cmVhbSBpcyByZXR1cm5lZCEiKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHJpZXZlZCBzdHJlYW0gZXhjZXJwdCB7b2Zmc2V0PTMsIGxlbmd0aD1udWxsfSBkb2Vzbid0IG1hdGNoISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKENPTlRFTlQuc3Vic3RyaW5nKDMpLCBleGNlcnB0LCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUoY29udGVudCBpbnN0YW5jZW9mIFBhcnRpYWxDb250ZW50U3RyZWFtLCBudWxsLCBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIHN0cmVhbSBpcyBub3QgbWFya2VkIGFzIHBhcnRpYWwgc3RyZWFtLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoQXRvbVB1YiBhbmQgQnJvd3NlciBCaW5kaW5nIHNob3VsZCByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgMjA2LikiKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdoaWxlIHJldHJpZXZpbmcgc3RyZWFtIHtvZmZzZXQ9MywgbGVuZ3RoPW51bGx9OiAiICsgZSwgZSwgZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm8gb2Zmc2V0LCBsZW5ndGgKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29udGVudCA9IGRvYy5nZXRDb250ZW50U3RyZWFtKG51bGwsIEJpZ0ludGVnZXIudmFsdWVPZigxMikpOwotICAgICAgICAgICAgICAgIGV4Y2VycHQgPSBnZXRTdHJpbmdGcm9tQ29udGVudFN0cmVhbShjb250ZW50KTsKLQotICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmdldExlbmd0aCgpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ29udGVudCBsZW5ndGggZG9lcyBub3QgbWF0Y2gge29mZnNldD1udWxsLCBsZW5ndGg9MTJ9ISIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygxMkwsIGNvbnRlbnQuZ2V0TGVuZ3RoKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoQ09OVEVOVC5lcXVhbHMoZXhjZXJwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRyaWV2ZWQgZnVsbCBzdHJlYW0gaW5zdGVhZCBvZiBhbiBleGNlcnB0IHtvZmZzZXQ9bnVsbCwgbGVuZ3RoPTEyfSEgQ29udGVudCByYW5nZXMgc3VwcG9ydGVkPyIpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoY29udGVudCBpbnN0YW5jZW9mIFBhcnRpYWxDb250ZW50U3RyZWFtLCBudWxsLCBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIHN0cmVhbSBpcyBtYXJrZWQgYXMgcGFydGlhbCBzdHJlYW0sICIgKyAiYWx0aG91Z2ggdGhlIGZ1bGwgc3RyZWFtIGlzIHJldHVybmVkISIpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUmV0cmlldmVkIHN0cmVhbSBleGNlcnB0IHtvZmZzZXQ9bnVsbCwgbGVuZ3RoPTEyfSBkb2Vzbid0IG1hdGNoISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKENPTlRFTlQuc3Vic3RyaW5nKDAsIDEyKSwgZXhjZXJwdCwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGNvbnRlbnQgaW5zdGFuY2VvZiBQYXJ0aWFsQ29udGVudFN0cmVhbSwgbnVsbCwgY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHJpZXZlZCBzdHJlYW0gaXMgbm90IG1hcmtlZCBhcyBwYXJ0aWFsIHN0cmVhbS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKEF0b21QdWIgYW5kIEJyb3dzZXIgQmluZGluZyBzaG91bGQgcmV0dXJuIHRoZSBIVFRQIHN0YXR1cyBjb2RlIDIwNi4pIikpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB3aGlsZSByZXRyaWV2aW5nIHN0cmVhbSB7b2Zmc2V0PW51bGwsIGxlbmd0aD0xMn06ICIgKyBlLCBlLCBmYWxzZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb250ZW50ID0gZG9jLmdldENvbnRlbnRTdHJlYW0oQmlnSW50ZWdlci52YWx1ZU9mKDUpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMTcpKTsKLSAgICAgICAgICAgICAgICBleGNlcnB0ID0gZ2V0U3RyaW5nRnJvbUNvbnRlbnRTdHJlYW0oY29udGVudCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudC5nZXRMZW5ndGgoKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkNvbnRlbnQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHtvZmZzZXQ9NSwgbGVuZ3RoPTE3fSEiLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoKGxvbmcpICgxNyAtIDUpLCBjb250ZW50LmdldExlbmd0aCgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKENPTlRFTlQuZXF1YWxzKGV4Y2VycHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIGZ1bGwgc3RyZWFtIGluc3RlYWQgb2YgYW4gZXhjZXJwdCB7b2Zmc2V0PTUsIGxlbmd0aD0xN30hIENvbnRlbnQgcmFuZ2VzIHN1cHBvcnRlZD8iKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc0ZhbHNlKGNvbnRlbnQgaW5zdGFuY2VvZiBQYXJ0aWFsQ29udGVudFN0cmVhbSwgbnVsbCwgY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHJpZXZlZCBzdHJlYW0gaXMgbWFya2VkIGFzIHBhcnRpYWwgc3RyZWFtLCAiICsgImFsdGhvdWdoIHRoZSBmdWxsIHN0cmVhbSBpcyByZXR1cm5lZCEiKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHJpZXZlZCBzdHJlYW0gZXhjZXJwdCB7b2Zmc2V0PTUsIGxlbmd0aD0xN30gZG9lc24ndCBtYXRjaCEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhDT05URU5ULnN1YnN0cmluZyg1LCA1ICsgMTcpLCBleGNlcnB0LCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUoY29udGVudCBpbnN0YW5jZW9mIFBhcnRpYWxDb250ZW50U3RyZWFtLCBudWxsLCBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIHN0cmVhbSBpcyBub3QgbWFya2VkIGFzIHBhcnRpYWwgc3RyZWFtLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoQXRvbVB1YiBhbmQgQnJvd3NlciBCaW5kaW5nIHNob3VsZCByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgMjA2LikiKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyBzdHJlYW0ge29mZnNldD01LCBsZW5ndGg9MTd9OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGUsIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoID4gY29udGVudCBzaXplCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBkb2MuZ2V0Q29udGVudFN0cmVhbShCaWdJbnRlZ2VyLnZhbHVlT2YoOSksIEJpZ0ludGVnZXIudmFsdWVPZigxMjMpKTsKLSAgICAgICAgICAgICAgICBleGNlcnB0ID0gZ2V0U3RyaW5nRnJvbUNvbnRlbnRTdHJlYW0oY29udGVudCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudC5nZXRMZW5ndGgoKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkNvbnRlbnQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIHtvZmZzZXQ9OSwgbGVuZ3RoPTEyM30hIiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKChsb25nKSAoQ09OVEVOVC5sZW5ndGgoKSAtIDkpLCBjb250ZW50LmdldExlbmd0aCgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKENPTlRFTlQuZXF1YWxzKGV4Y2VycHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIGZ1bGwgc3RyZWFtIGluc3RlYWQgb2YgYW4gZXhjZXJwdCB7b2Zmc2V0PTksIGxlbmd0aD0xMjN9ISBDb250ZW50IHJhbmdlcyBzdXBwb3J0ZWQ/IikpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNGYWxzZShjb250ZW50IGluc3RhbmNlb2YgUGFydGlhbENvbnRlbnRTdHJlYW0sIG51bGwsIGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRyaWV2ZWQgc3RyZWFtIGlzIG1hcmtlZCBhcyBwYXJ0aWFsIHN0cmVhbSwgIiArICJhbHRob3VnaCB0aGUgZnVsbCBzdHJlYW0gaXMgcmV0dXJuZWQhIikpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJSZXRyaWV2ZWQgc3RyZWFtIGV4Y2VycHQge29mZnNldD05LCBsZW5ndGg9MTIzfSBkb2Vzbid0IG1hdGNoISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKENPTlRFTlQuc3Vic3RyaW5nKDkpLCBleGNlcnB0LCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUoY29udGVudCBpbnN0YW5jZW9mIFBhcnRpYWxDb250ZW50U3RyZWFtLCBudWxsLCBjcmVhdGVSZXN1bHQoV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmV0cmlldmVkIHN0cmVhbSBpcyBub3QgbWFya2VkIGFzIHBhcnRpYWwgc3RyZWFtLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoQXRvbVB1YiBhbmQgQnJvd3NlciBCaW5kaW5nIHNob3VsZCByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgMjA2LikiKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVW5leHBlY3RlZCBleGNlcHRpb24gd2hpbGUgcmV0cmlldmluZyBzdHJlYW0ge29mZnNldD05LCBsZW5ndGg9MTIzfTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBlLCBlLCBmYWxzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gY2xlYW4gdXAKLSAgICAgICAgICAgIGRlbGV0ZU9iamVjdChkb2MpOwotICAgICAgICAgICAgZGVsZXRlVGVzdEZvbGRlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQ29weVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NvcHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDFkNTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQ29weVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuY3J1ZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogQ29weSB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgQ29weVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIkNvcHkgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyB0d28gZm9sZGVycyBhbmQgYSBkb2N1bWVudCBhbmQgY29waWVzIHRoZSBkb2N1bWVudCBmcm9tIG9uZSBmb2xkZXIgdG8gdGhlIG90aGVyLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgLy8gaWYgKGdldEJpbmRpbmcoKSA9PSBCaW5kaW5nVHlwZS5BVE9NUFVCKSB7Ci0gICAgICAgIC8vIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwKLSAgICAgICAgLy8gIkF0b21QdWIgYmluZGluZyBkb2VzIG5vdCBzdXBwb3J0IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZSgpLiBUZXN0IFNraXBwZWQhIikpOwotICAgICAgICAvLyByZXR1cm47Ci0gICAgICAgIC8vIH0KLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgZm9sZGVycwotICAgICAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotICAgICAgICAgICAgRm9sZGVyIGZvbGRlcjEgPSBjcmVhdGVGb2xkZXIoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImNvcHlmb2xkZXIxIik7Ci0gICAgICAgICAgICBGb2xkZXIgZm9sZGVyMiA9IGNyZWF0ZUZvbGRlcihzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiY29weWZvbGRlcjIiKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGRvY3VtZW50Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MxID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgZm9sZGVyMSwgImNvcHl0ZXN0ZG9jLnR4dCIsICJjb3B5IHRlc3QiKTsKLQotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSA9IFZlcnNpb25pbmdTdGF0ZS5NQUpPUjsKLSAgICAgICAgICAgIGlmICghKChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSBkb2MxLmdldFR5cGUoKSkuaXNWZXJzaW9uYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlID0gVmVyc2lvbmluZ1N0YXRlLk5PTkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNvcHkKLSAgICAgICAgICAgIERvY3VtZW50IGRvYzIgPSBkb2MxLmNvcHkoZm9sZGVyMiwgbnVsbCwgdmVyc2lvbmluZ1N0YXRlLCBudWxsLCBudWxsLCBudWxsLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICAgICAgaWYgKGRvYzIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvcGllZCBkb2N1bWVudCBpcyBudWxsISIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrT2JqZWN0KHNlc3Npb24sIGRvYzIsIGdldEFsbFByb3BlcnRpZXMoZG9jMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ29waWVkIGRvY3VtZW50IGNoZWNrLiBJZDogKyAiICsgZG9jMi5nZXROYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgc3RyZWFtcyBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKGRvYzEuZ2V0Q29udGVudFN0cmVhbSgpLCBkb2MyLmdldENvbnRlbnRTdHJlYW0oKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY291bnQxID0gY291bnRGb2xkZXJDaGlsZHJlbihmb2xkZXIxKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlNvdXJjZSBmb2xkZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgY2hpbGQgYnV0IGhhcyAiICsgY291bnQxICsgIiBjaGlsZHJlbiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgY291bnQxLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudDIgPSBjb3VudEZvbGRlckNoaWxkcmVuKGZvbGRlcjIpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVGFyZ2V0IGZvbGRlciBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBjaGlsZCBidXQgaGFzICIgKyBjb3VudDIgKyAiIGNoaWxkcmVuISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygxLCBjb3VudDIsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvYzIpOwotICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvYzEpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gY2xlYW4gdXAKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUFuZERlbGV0ZURvY3VtZW50VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQ3JlYXRlQW5kRGVsZXRlRG9jdW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NGE3MTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQ3JlYXRlQW5kRGVsZXRlRG9jdW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogU2ltcGxlIGRvY3VtZW50IHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVBbmREZWxldGVEb2N1bWVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIlRDSyB0ZXN0IGNvbnRlbnQuIjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIkNyZWF0ZSBhbmQgRGVsZXRlIERvY3VtZW50IFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgYSBmZXcgZG9jdW1lbnRzLCBjaGVja3MgdGhlIG5ld2x5IGNyZWF0ZWQgZG9jdW1lbnRzIGFuZCB0aGVpciBwYXJlbnQgYW5kIGZpbmFsbHkgZGVsZXRlcyB0aGUgY3JlYXRlZCBkb2N1bWVudHMuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGludCBudW1PZkRvY3VtZW50cyA9IDIwOwotCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3JkZXJDb250ZXh0ID0gKGlzT3JkZXJCeU5hbWVTdXBwb3J0ZWQoc2Vzc2lvbikgPyBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DX09SREVSX0JZX05BTUUKLSAgICAgICAgICAgICAgICA6IFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgRG9jdW1lbnQ+IGRvY3VtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG9jdW1lbnQ+KCk7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiB2ZXJzaW9uU2VyaWVzSWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnRzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9mRG9jdW1lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBuZXdEb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KHNlc3Npb24sIHRlc3RGb2xkZXIsICJkb2MiICsgaSwgQ09OVEVOVCk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnRzLnB1dChuZXdEb2N1bWVudC5nZXRJZCgpLCBuZXdEb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgdmVyc2lvblNlcmllc0lkcy5hZGQobmV3RG9jdW1lbnQuZ2V0VmVyc2lvblNlcmllc0lkKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzaW1wbGUgY2hpbGRyZW4gdGVzdAotICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrQ2hpbGRyZW4oc2Vzc2lvbiwgdGVzdEZvbGRlciwgIlRlc3QgZm9sZGVyIGNoaWxkcmVuIGNoZWNrIikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBhbGwgZG9jdW1lbnRzIGFyZSB0aGVyZQotICAgICAgICAgICAgSXRlbUl0ZXJhYmxlPENtaXNPYmplY3Q+IGNoaWxkcmVuID0gdGVzdEZvbGRlci5nZXRDaGlsZHJlbihTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZHJlbklkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChDbWlzT2JqZWN0IGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbklkcy5hZGQoY2hpbGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRzLmdldChjaGlsZC5nZXRJZCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBhbmQgdGVzdCBmb2xkZXIgY2hpbGQgZG9uJ3QgbWF0Y2ghIElkOiAiICsgY2hpbGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRTaGFsbG93RXF1YWxzKGRvY3VtZW50LCBjaGlsZCwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTnVtYmVyIG9mIGNyZWF0ZWQgZG9jdW1lbnRzIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgZXhpc3RpbmcgZG9jdW1lbnRzISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhudW1PZkRvY3VtZW50cywgY2hpbGRyZW5JZHMuc2l6ZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGZvciAoRG9jdW1lbnQgZG9jdW1lbnQgOiBkb2N1bWVudHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuSWRzLmNvbnRhaW5zKGRvY3VtZW50LmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNyZWF0ZWQgZG9jdW1lbnQgbm90IGZvdW5kIGluIHRlc3QgZm9sZGVyIGNoaWxkcmVuISBJZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZG9jdW1lbnQuZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgdmVyc2lvbiBzZXJpZXMgaWRzCi0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscygoKERvY3VtZW50VHlwZSkgZG9jdW1lbnRzLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFR5cGUoKSkuaXNWZXJzaW9uYWJsZSgpKSkgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBbHRob3VnaCB0aGUgY3JlYXRlZCBkb2N1bWVudHMgYXJlIGluZGVwZW5kZW50LCBzb21lIGRvY3VtZW50cyBzaGFyZSBhIFZlcnNpb24gU2VyaWVzIElkISIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KElORk8sICJTb21lIGRvY3VtZW50cyBzaGFyZSB0aGUgc2FtZSBWZXJzaW9uIFNlcmllcyBJZC4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhudW1PZkRvY3VtZW50cywgdmVyc2lvblNlcmllc0lkcy5zaXplKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgcGFnaW5nCi0gICAgICAgICAgICBpbnQgcGFnZVNpemUgPSA1OwotICAgICAgICAgICAgQ21pc09iamVjdCBsYXN0T2JqZWN0ID0gbnVsbDsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBwYWdlMSA9IHRlc3RGb2xkZXIuZ2V0Q2hpbGRyZW4ob3JkZXJDb250ZXh0KS5nZXRQYWdlKHBhZ2VTaXplKTsKLSAgICAgICAgICAgIGZvciAoQ21pc09iamVjdCBjaGlsZCA6IHBhZ2UxKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICBsYXN0T2JqZWN0ID0gY2hpbGQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHVybmVkIG51bWJlciBvZiBjaGlsZHJlbiBkb2Vzbid0IG1hdGNoIHRoZSBwYWdlIHNpemUhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKHBhZ2VTaXplLCBjb3VudCwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBpZiAocGFnZTEuZ2V0VG90YWxOdW1JdGVtcygpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiUmVwb3NpdG9yeSBkaWQgbm90IHJldHVybiBudW1JdGVtcyBmb3IgdGhlIGZpcnN0IHRlc3QgcGFnZS4iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHVybmVkIG51bUl0ZW1zIGRvZXNuJ3QgbWF0Y2ggdGhlIG51bWJlciBvZiBkb2N1bWVudHMhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygobG9uZykgbnVtT2ZEb2N1bWVudHMsIHBhZ2UxLmdldFRvdGFsTnVtSXRlbXMoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJoYXNNb3JlSXRlbXMgb2YgdGhlIGZpcnN0IHRlc3QgcGFnZSBtdXN0IGJlIFRSVUUhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKHRydWUsIHBhZ2UxLmdldEhhc01vcmVJdGVtcygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHNlY29uZCBwYWdlCi0gICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICBJdGVtSXRlcmFibGU8Q21pc09iamVjdD4gcGFnZTIgPSB0ZXN0Rm9sZGVyLmdldENoaWxkcmVuKG9yZGVyQ29udGV4dCkuc2tpcFRvKHBhZ2VTaXplIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFBhZ2UocGFnZVNpemUpOwotICAgICAgICAgICAgZm9yIChDbWlzT2JqZWN0IGNoaWxkIDogcGFnZTIpIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXN0IG9iamVjdCBvZiB0aGUgZmlyc3QgcGFnZSBkb2Vzbid0IG1hdGNoIHRoZSBmaXJzdCBvYmplY3Qgb2YgdGhlIHNlY29uZCBwYWdlLiIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKGxhc3RPYmplY3QuZ2V0SWQoKSwgY2hpbGQuZ2V0SWQoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUmV0dXJuZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGRvZXNuJ3QgbWF0Y2ggdGhlIHBhZ2Ugc2l6ZSEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMocGFnZVNpemUsIGNvdW50LCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGlmIChwYWdlMi5nZXRUb3RhbE51bUl0ZW1zKCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJSZXBvc2l0b3J5IGRpZCBub3QgcmV0dXJuIG51bUl0ZW1zIGZvciB0aGUgc2Vjb25kIHRlc3QgcGFnZS4iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHVybmVkIG51bUl0ZW1zIGRvZXNuJ3QgbWF0Y2ggdGhlIG51bWJlciBvZiBkb2N1bWVudHMhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygobG9uZykgbnVtT2ZEb2N1bWVudHMsIHBhZ2UyLmdldFRvdGFsTnVtSXRlbXMoKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJoYXNNb3JlSXRlbXMgb2YgdGhlIHNlY29uZCB0ZXN0IHBhZ2UgbXVzdCBiZSBUUlVFISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyh0cnVlLCBwYWdlMi5nZXRIYXNNb3JlSXRlbXMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB0aGlyZCBwYWdlCi0gICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICBJdGVtSXRlcmFibGU8Q21pc09iamVjdD4gcGFnZTMgPSB0ZXN0Rm9sZGVyLmdldENoaWxkcmVuKG9yZGVyQ29udGV4dCkuc2tpcFRvKG51bU9mRG9jdW1lbnRzIC0gNSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFBhZ2UoMTApOwotICAgICAgICAgICAgZm9yIChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgICAgIENtaXNPYmplY3QgY2hpbGQgOiBwYWdlMykgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIlJldHVybmVkIG51bWJlciBvZiBjaGlsZHJlbiBzaG91bGQgYmUgNSBiZWNhdXNlIHBhZ2Ugc3RhcnRldGQgYXQgKG51bU9mRG9jdW1lbnRzIC0gNSkuIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDUsIGNvdW50LCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGlmIChwYWdlMy5nZXRUb3RhbE51bUl0ZW1zKCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJSZXBvc2l0b3J5IGRpZCBub3QgcmV0dXJuIG51bUl0ZW1zIGZvciB0aGUgdGhpcmQgdGVzdCBwYWdlLiIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUmV0dXJuZWQgbnVtSXRlbXMgZG9lc24ndCBtYXRjaCB0aGUgbnVtYmVyIG9mIGRvY3VtZW50cyEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKChsb25nKSBudW1PZkRvY3VtZW50cywgcGFnZTMuZ2V0VG90YWxOdW1JdGVtcygpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgImhhc01vcmVJdGVtcyBvZiB0aGUgdGhpcmQgdGVzdCBwYWdlIG11c3QgYmUgRkFMU0UhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKGZhbHNlLCBwYWdlMy5nZXRIYXNNb3JlSXRlbXMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBub24tZXhpc3RpbmcgcGFnZQotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgSXRlbUl0ZXJhYmxlPENtaXNPYmplY3Q+IHBhZ2VOb3RFeGlzdGluZyA9IHRlc3RGb2xkZXIuZ2V0Q2hpbGRyZW4ob3JkZXJDb250ZXh0KS5za2lwVG8oMTAwMDAwKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFnZShwYWdlU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgICAgICAgICAgQ21pc09iamVjdCBjaGlsZCA6IHBhZ2VOb3RFeGlzdGluZykgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlRoZSBwYWdlIHNpemUgb2YgYSBub24tZXhpc3RpbmcgcGFnZSBtdXN0IGJlIDAhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDAsIGNvdW50LCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGlmIChwYWdlTm90RXhpc3RpbmcuZ2V0VG90YWxOdW1JdGVtcygpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiUmVwb3NpdG9yeSBkaWQgbm90IHJldHVybiBudW1JdGVtcyBmb3IgYSBub24tZXhpc3RpbmcgcGFnZS4iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlJldHVybmVkIG51bUl0ZW1zIGRvZXNuJ3QgbWF0Y2ggdGhlIG51bWJlciBvZiBkb2N1bWVudHMhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygobG9uZykgbnVtT2ZEb2N1bWVudHMsIHBhZ2VOb3RFeGlzdGluZy5nZXRUb3RhbE51bUl0ZW1zKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiaGFzTW9yZUl0ZW1zIG9mIGEgbm9uLWV4aXN0aW5nIHBhZ2UgbXVzdCBiZSBGQUxTRSEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoZmFsc2UsIHBhZ2VOb3RFeGlzdGluZy5nZXRIYXNNb3JlSXRlbXMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBjb250ZW50Ci0gICAgICAgICAgICBmb3IgKERvY3VtZW50IGRvY3VtZW50IDogZG9jdW1lbnRzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gZG9jdW1lbnQuZ2V0Q29udGVudFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZW50U3RyZWFtID09IG51bGwgfHwgY29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IGhhcyBubyBjb250ZW50ISBJZDogIiArIGRvY3VtZW50LmdldElkKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoY29udGVudFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogY29udGVudCBjaGVja3MKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZGVsZXRlIGFsbCBkb2N1bWVudHMKLSAgICAgICAgICAgIGZvciAoRG9jdW1lbnQgZG9jdW1lbnQgOiBkb2N1bWVudHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudC5kZWxldGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgc2hvdWxkIG5vdCBleGlzdCBhbnltb3JlIGJ1dCBpdCBpcyBzdGlsbCB0aGVyZSEgSWQ6ICIgKyBkb2N1bWVudC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNGYWxzZShleGlzdHMoZG9jdW1lbnQpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiVGVzdGVkIHRoZSBjcmVhdGlvbiBhbmQgZGVsZXRpb24gb2YgIiArIG51bU9mRG9jdW1lbnRzICsgIiBkb2N1bWVudHMuIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUFuZERlbGV0ZUZvbGRlclRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUFuZERlbGV0ZUZvbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwNDRkYy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DcmVhdGVBbmREZWxldGVGb2xkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotLyoqCi0gKiBTaW1wbGUgZm9sZGVyIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVBbmREZWxldGVGb2xkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJDcmVhdGUgYW5kIERlbGV0ZSBGb2xkZXIgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIGZldyBmb2xkZXJzLCBjaGVja3MgdGhlIG5ld2x5IGNyZWF0ZWQgZm9sZGVycyBhbmQgdGhlaXIgcGFyZW50IGFuZCBmaW5hbGx5IGRlbGV0ZXMgdGhlIGNyZWF0ZWQgZm9sZGVycy4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaW50IG51bU9mRm9sZGVycyA9IDIwOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgRm9sZGVyPiBmb2xkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGb2xkZXI+KCk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBmb2xkZXJzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU9mRm9sZGVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRm9sZGVyIG5ld0ZvbGRlciA9IGNyZWF0ZUZvbGRlcihzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiZm9sZGVyIiArIGkpOwotICAgICAgICAgICAgICAgIGZvbGRlcnMucHV0KG5ld0ZvbGRlci5nZXRJZCgpLCBuZXdGb2xkZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzaW1wbGUgY2hpbGRyZW4gdGVzdAotICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrQ2hpbGRyZW4oc2Vzc2lvbiwgdGVzdEZvbGRlciwgIlRlc3QgZm9sZGVyIGNoaWxkcmVuIGNoZWNrIikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBhbGwgZm9sZGVycyBhcmUgdGhlcmUKLSAgICAgICAgICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBjaGlsZHJlbiA9IHRlc3RGb2xkZXIuZ2V0Q2hpbGRyZW4oU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gY2hpbGRyZW5JZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvciAoQ21pc09iamVjdCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5JZHMuYWRkKGNoaWxkLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBGb2xkZXIgZm9sZGVyID0gZm9sZGVycy5nZXQoY2hpbGQuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIGFuZCB0ZXN0IGZvbGRlciBjaGlsZCBkb24ndCBtYXRjaCEgSWQ6ICIgKyBjaGlsZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydFNoYWxsb3dFcXVhbHMoZm9sZGVyLCBjaGlsZCwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTnVtYmVyIG9mIGNyZWF0ZWQgZm9sZGVycyBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGZvbGRlcnMhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKG51bU9mRm9sZGVycywgY2hpbGRyZW5JZHMuc2l6ZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGZvciAoRm9sZGVyIGZvbGRlciA6IGZvbGRlcnMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuSWRzLmNvbnRhaW5zKGZvbGRlci5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0ZWQgZm9sZGVyIG5vdCBmb3VuZCBpbiB0ZXN0IGZvbGRlciBjaGlsZHJlbiEgSWQ6ICIgKyBmb2xkZXIuZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZGVsZXRlIGFsbCBmb2xkZXJzCi0gICAgICAgICAgICBmb3IgKEZvbGRlciBmb2xkZXIgOiBmb2xkZXJzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW1wdHkgZm9sZGVycyBzaG91bGQgYmUgZGVsZXRlYWJsZSBsaWtlIHRoaXMKLSAgICAgICAgICAgICAgICBmb2xkZXIuZGVsZXRlKHRydWUpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgIkZvbGRlciBzaG91bGQgbm90IGV4aXN0IGFueW1vcmUgYnV0IGl0IGlzIHN0aWxsIHRoZXJlISBJZDogIiArIGZvbGRlci5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNGYWxzZShleGlzdHMoZm9sZGVyKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB0ZXN0IGZvbGRlcgotICAgICAgICAgICAgZGVsZXRlVGVzdEZvbGRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlRlc3RlZCB0aGUgY3JlYXRpb24gYW5kIGRlbGV0aW9uIG9mICIgKyBudW1PZkZvbGRlcnMgKyAiIGZvbGRlcnMuIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUFuZERlbGV0ZUl0ZW1UZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DcmVhdGVBbmREZWxldGVJdGVtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQ2YTRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUFuZERlbGV0ZUl0ZW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogU2ltcGxlIGZvbGRlciB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQW5kRGVsZXRlSXRlbVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIkNyZWF0ZSBhbmQgRGVsZXRlIEl0ZW0gVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIGZldyBpdGVtcywgY2hlY2tzIHRoZSBuZXdseSBjcmVhdGVkIGl0ZW5zIGFuZCB0aGVpciBwYXJlbnQgYW5kIGZpbmFsbHkgZGVsZXRlcyB0aGUgY3JlYXRlZCBpdGVtLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDbWlzVmVyc2lvbigpID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJJdGVtcyBhcmUgbm90IHN1cHBvcnRlZCBieSBDTUlTIDEuMC4gVGVzdCBza2lwcGVkISIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNJdGVtcyhzZXNzaW9uKSkgewotICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICAgICAgaW50IG51bU9mSXRlbXMgPSAyMDsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCBmb2xkZXIKLSAgICAgICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBJdGVtPiBpdGVtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSXRlbT4oKTsKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBpdGVtcwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT2ZJdGVtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZW0gbmV3SXRlbSA9IGNyZWF0ZUl0ZW0oc2Vzc2lvbiwgdGVzdEZvbGRlciwgIml0ZW0iICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1dChuZXdJdGVtLmdldElkKCksIG5ld0l0ZW0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFsbCBpdGVtcyBhcmUgdGhlcmUKLSAgICAgICAgICAgICAgICBJdGVtSXRlcmFibGU8Q21pc09iamVjdD4gY2hpbGRyZW4gPSB0ZXN0Rm9sZGVyLmdldENoaWxkcmVuKFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZHJlbklkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGZvciAoQ21pc09iamVjdCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbklkcy5hZGQoY2hpbGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVtIGl0ZW0gPSBpdGVtcy5nZXQoY2hpbGQuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkl0ZW0gYW5kIHRlc3QgZm9sZGVyIGNoaWxkIGRvbid0IG1hdGNoISBJZDogIiArIGNoaWxkLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydFNoYWxsb3dFcXVhbHMoaXRlbSwgY2hpbGQsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk51bWJlciBvZiBjcmVhdGVkIGl0ZW1zIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgZXhpc3RpbmcgaXRlbXMhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhudW1PZkl0ZW1zLCBjaGlsZHJlbklkcy5zaXplKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGZvciAoSXRlbSBpdGVtIDogaXRlbXMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbklkcy5jb250YWlucyhpdGVtLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGVkIGl0ZW0gbm90IGZvdW5kIGluIHRlc3QgZm9sZGVyIGNoaWxkcmVuISBJZDogIiArIGl0ZW0uZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGFsbCBpdGVtCi0gICAgICAgICAgICAgICAgZm9yIChJdGVtIGl0ZW0gOiBpdGVtcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBpdGVtLmRlbGV0ZSh0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0ZW0gc2hvdWxkIG5vdCBleGlzdCBhbnltb3JlIGJ1dCBpdCBpcyBzdGlsbCB0aGVyZSEgSWQ6ICIgKyBpdGVtLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNGYWxzZShleGlzdHMoaXRlbSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdGVzdCBmb2xkZXIKLSAgICAgICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJUZXN0ZWQgdGhlIGNyZWF0aW9uIGFuZCBkZWxldGlvbiBvZiAiICsgbnVtT2ZJdGVtcyArICIgaXRlbXMuIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiSXRlbXMgbm90IHN1cHBvcnRlZC4gVGVzdCBza2lwcGVkISIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUFuZERlbGV0ZVJlbGF0aW9uc2hpcFRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUFuZERlbGV0ZVJlbGF0aW9uc2hpcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzODFlMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DcmVhdGVBbmREZWxldGVSZWxhdGlvbnNoaXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlJlbGF0aW9uc2hpcERpcmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotLyoqCi0gKiBTaW1wbGUgcmVsYXRpb25zaGlwIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVBbmREZWxldGVSZWxhdGlvbnNoaXBUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJDcmVhdGUgYW5kIERlbGV0ZSBSZWxhdGlvbnNoaXAgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBkb2N1bWVudHMsIGNoZWNrcyB0aGUgbmV3bHkgY3JlYXRlZCByZWxhdGlvbnNoaXAgYW5kIGZpbmFsbHkgZGVsZXRlcyB0aGUgY3JlYXRlZCByZWxhdGlvbnNoaXAuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotICAgICAgICBib29sZWFuIGZvdW5kOwotCi0gICAgICAgIGlmIChoYXNSZWxhdGlvbnNoaXBzKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZXN0IGZvbGRlcgotICAgICAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBkb2N1bWVudHMKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MxID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImRvYzEudHh0IiwgImRvYzEiKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MyID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImRvYzIudHh0IiwgImRvYzIiKTsKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXAgcmVsID0gY3JlYXRlUmVsYXRpb25zaGlwKHNlc3Npb24sICJyZWwxIiwgZG9jMSwgZG9jMik7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJTb3VyY2UgZG9jdW1lbnQgaWQgZG9lcyBub3QgbWF0Y2ggcmVsYXRpb25zaGlwIHNvdXJjZSBpZCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKGRvYzEuZ2V0SWQoKSwgcmVsLmdldFNvdXJjZUlkKCkuZ2V0SWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVGFyZ2V0IGRvY3VtZW50IGlkIGRvZXMgbm90IG1hdGNoIHJlbGF0aW9uc2hpcCB0YXJnZXQgaWQhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhkb2MyLmdldElkKCksIHJlbC5nZXRUYXJnZXQoKS5nZXRJZCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgc291cmNlIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgZG9jMS5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgTGlzdDxSZWxhdGlvbnNoaXA+IGRvYzFyZWxzID0gZG9jMS5nZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJTb3VyY2UgZG9jdW1lbnQgaGFzIG5vIHJlbGF0aW9uc2hpcHMgYnV0IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydExpc3ROb3RFbXB0eShkb2MxcmVscywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRvYzFyZWxzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgciA6IGRvYzFyZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmdldElkKCkuZXF1YWxzKHIuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ld2x5IGNyZWF0ZWQgcmVsYXRpb25zaGlwIG5vdCBmb3VuZCBpbiB0aGUgcmVsYXRpb25zaGlwcyBvZiB0aGUgc291cmNlIGRvY3VtZW50ISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGZvdW5kLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByIDogc2Vzc2lvbi5nZXRSZWxhdGlvbnNoaXBzKGRvYzEsIHRydWUsIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5TT1VSQ0UsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmdldElkKCkuZXF1YWxzKHIuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTmV3bHkgY3JlYXRlZCByZWxhdGlvbnNoaXAgbm90IGZvdW5kIGluIHRoZSByZWxhdGlvbnNoaXBzIHJldHVybmVkIGJ5IGdldE9iamVjdFJlbGF0aW9uc2hpcHMoKSBmb3IgdGhlIHNvdXJjZSBkb2N1bWVudCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGZvdW5kLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgdGFyZ2V0IGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgZG9jMi5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgTGlzdDxSZWxhdGlvbnNoaXA+IGRvYzJyZWxzID0gZG9jMi5nZXRSZWxhdGlvbnNoaXBzKCk7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUYXJnZXQgZG9jdW1lbnQgaGFzIG5vIHJlbGF0aW9uc2hpcHMgYnV0IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydExpc3ROb3RFbXB0eShkb2MycmVscywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRvYzJyZWxzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSZWxhdGlvbnNoaXAgciA6IGRvYzJyZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmdldElkKCkuZXF1YWxzKHIuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ld2x5IGNyZWF0ZWQgcmVsYXRpb25zaGlwIG5vdCBmb3VuZCBpbiB0aGUgcmVsYXRpb25zaGlwcyBvZiB0aGUgdGFyZ2V0IGRvY3VtZW50ISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGZvdW5kLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKFJlbGF0aW9uc2hpcCByIDogc2Vzc2lvbi5nZXRSZWxhdGlvbnNoaXBzKGRvYzIsIHRydWUsIFJlbGF0aW9uc2hpcERpcmVjdGlvbi5UQVJHRVQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVsLmdldElkKCkuZXF1YWxzKHIuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTmV3bHkgY3JlYXRlZCByZWxhdGlvbnNoaXAgbm90IGZvdW5kIGluIHRoZSByZWxhdGlvbnNoaXBzIHJldHVybmVkIGJ5IGdldE9iamVjdFJlbGF0aW9uc2hpcHMoKSBmb3IgdGhlIHRhcmdldCBkb2N1bWVudCEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGZvdW5kLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUKLSAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QocmVsKTsKLSAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jMik7Ci0gICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvYzEpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICAgICAgZGVsZXRlVGVzdEZvbGRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiUmVsYXRpb25zaGlwcyBub3Qgc3VwcG9ydGVkLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQ3JlYXRlQmlnRG9jdW1lbnQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUJpZ0RvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYzg2ZDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQ3JlYXRlQmlnRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNydWQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotLyoqCi0gKiBCaWcgZG9jdW1lbnQgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUJpZ0RvY3VtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJDcmVhdGUgQmlnIERvY3VtZW50IFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgYSAxMCBNaUIgZG9jdW1lbnQgYW5kIGRlbGV0ZXMgaXQuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiYmlnZG9jIjsKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3RUeXBlSWQgPSBnZXREb2N1bWVudFRlc3RUeXBlSWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBtaW1ldHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwotCi0gICAgICAgICAgICBmaW5hbCBsb25nIHNpemUgPSAxMCAqIDEwMjQgKiAxMDI0OyAvLyAxMCBNaUIKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IElucHV0U3RyZWFtKCkgewotICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAtMTsKLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ZXIrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXIgPj0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcwJyArIChjb3VudGVyIC8gMTApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBzdHJlYW0gYW5kIHByb3BlcnRpZXMKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IHNlc3Npb24uZ2V0T2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUNvbnRlbnRTdHJlYW0obmFtZSwgc2l6ZSwgbWltZXR5cGUsIGluKTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBvYmplY3RUeXBlSWQpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB0eXBlCi0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihvYmplY3RUeXBlSWQpOwotICAgICAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVHlwZSBpcyBub3QgYSBkb2N1bWVudCB0eXBlISBUeXBlOiAiICsgb2JqZWN0VHlwZUlkLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgdHlwZTsKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSAoQm9vbGVhbi5UUlVFLmVxdWFscyhkb2NUeXBlLmlzVmVyc2lvbmFibGUoKSkgPyBWZXJzaW9uaW5nU3RhdGUuTUFKT1IKLSAgICAgICAgICAgICAgICAgICAgOiBWZXJzaW9uaW5nU3RhdGUuTk9ORSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhbmQgZmV0Y2ggdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICBPYmplY3RJZCBpZCA9IHNlc3Npb24uY3JlYXRlRG9jdW1lbnQocHJvcGVydGllcywgdGVzdEZvbGRlciwgY29udGVudFN0cmVhbSwgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QoaWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB0aGUgbmV3IGRvY3VtZW50Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZG9jLCBnZXRBbGxQcm9wZXJ0aWVzKGRvYyksICJOZXcgZG9jdW1lbnQgb2JqZWN0IHNwZWMgY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHNpemUKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNvbnRlbnQgc3RyZWFtIGxlbmd0aCBkb2Vzbid0IG1hdGNoIHRoZSB1cGxvYWRlZCBjb250ZW50ISIsIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIGRvYy5nZXRDb250ZW50U3RyZWFtTGVuZ3RoKCksIG51bGwsIGYpOwotCi0gICAgICAgICAgICAvLyBkZWxldGUgaXQKLSAgICAgICAgICAgIGRvYy5kZWxldGUodHJ1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DcmVhdGVEb2N1bWVudFdpdGhvdXRDb250ZW50LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DcmVhdGVEb2N1bWVudFdpdGhvdXRDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDQ4MTAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvQ3JlYXRlRG9jdW1lbnRXaXRob3V0Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuY3J1ZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNvbnRlbnRTdHJlYW1BbGxvd2VkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0OwotCi0vKioKLSAqIERvY3VtZW50IHdpdGhvdXQgY29udGVudCB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRG9jdW1lbnRXaXRob3V0Q29udGVudCBleHRlbmRzIEFic3RyYWN0U2Vzc2lvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiQ3JlYXRlIERvY3VtZW50IHdpdGhvdXQgQ29udGVudCBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGEgZG9jdW1lbnQgd2l0aG91dCBjb250ZW50IGFuZCBkZWxldGVzIGl0LiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBTdHJpbmcgb2JqZWN0VHlwZUlkID0gZ2V0RG9jdW1lbnRUZXN0VHlwZUlkKCk7Ci0KLSAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24ob2JqZWN0VHlwZUlkKTsKLSAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUeXBlIGlzIG5vdCBhIGRvY3VtZW50IHR5cGUhIFR5cGU6ICIgKyBvYmplY3RUeXBlSWQsIHRydWUpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gZG9jVHlwZSA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSB0eXBlOwotCi0gICAgICAgIGlmIChkb2NUeXBlLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkgPT0gQ29udGVudFN0cmVhbUFsbG93ZWQuUkVRVUlSRUQpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSB0ZXN0IGRvY3VtZW50IHR5cGUgZG9lcyBub3Qgc3VwcG9ydCBkb2N1bWVudHMgd2l0aG91dCBjb250ZW50LiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCBmb2xkZXIKLSAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJub2NvbnRlbnQiOwotCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpOwotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIG9iamVjdFR5cGVJZCk7Ci0KLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSAoQm9vbGVhbi5UUlVFLmVxdWFscyhkb2NUeXBlLmlzVmVyc2lvbmFibGUoKSkgPyBWZXJzaW9uaW5nU3RhdGUuTUFKT1IKLSAgICAgICAgICAgICAgICAgICAgOiBWZXJzaW9uaW5nU3RhdGUuTk9ORSk7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhbmQgZmV0Y2ggdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICBPYmplY3RJZCBpZCA9IHNlc3Npb24uY3JlYXRlRG9jdW1lbnQocHJvcGVydGllcywgdGVzdEZvbGRlciwgbnVsbCwgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QoaWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB0aGUgbmV3IGRvY3VtZW50Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZG9jLCBnZXRBbGxQcm9wZXJ0aWVzKGRvYyksICJOZXcgZG9jdW1lbnQgb2JqZWN0IHNwZWMgY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIE1JTUUgdHlwZQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVGhlIGRvY3VtZW50IGhhcyBubyBjb250ZW50IGJ1dCBhIE1JTUUgdHlwZSEiLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoZG9jLmdldENvbnRlbnRTdHJlYW1NaW1lVHlwZSgpLCBudWxsLCBmKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGNvbnRlbnQgc2l6ZQotICAgICAgICAgICAgaWYgKGRvYy5nZXRDb250ZW50U3RyZWFtTGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywgIlRoZSBkb2N1bWVudCBoYXMgbm8gY29udGVudCBidXQgdGhlIGNvbnRlbnQgbGVuZ3RoIGlzIHNldCB0byAwISAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgY29udGVudCBsZW5ndGggc2hvdWxkbid0IGJlIHNldC4iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRvYy5nZXRDb250ZW50U3RyZWFtTGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVGhlIGRvY3VtZW50IGhhcyBubyBjb250ZW50IGJ1dCB0aGUgY29udGVudCBsZW5ndGggaXMgc2V0IGFuZCA+MCEgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKGNvbnRlbnQgbGVuZ3RoOiAiICsgZG9jLmdldENvbnRlbnRTdHJlYW1MZW5ndGgoKSArICIpIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBkZWxldGUgaXQKLSAgICAgICAgICAgIGRvYy5kZWxldGUodHJ1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9DcmVhdGVJbnZhbGlkVHlwZVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUludmFsaWRUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVkN2I4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0NyZWF0ZUludmFsaWRUeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29uc3RyYWludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQ29udGVudFN0cmVhbUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUludmFsaWRUeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0U2Vzc2lvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiQ3JlYXRlIE9iamVjdCBXaXRoIEludmFsaWQgVHlwZSBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJUcmllcyB0byBjcmVhdGUgZG9jdW1lbnQgd2l0aCBhIGZvbGRlciB0eXBlIGFuZCBmb2xkZXIgd2l0aCBhIGRvY3VtZW50IHR5cGUuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICAvLyBjcmVhdGUgYSB0ZXN0IGZvbGRlcgotICAgICAgICBGb2xkZXIgdGVzdEZvbGRlciA9IGNyZWF0ZVRlc3RGb2xkZXIoc2Vzc2lvbik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHRlc3QgZG9jdW1lbnQgY3JlYXRpb24KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgIm5ldmVyLnR4dCIpOwotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBnZXRGb2xkZXJUZXN0VHlwZUlkKCkpOwotCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IElPVXRpbHMudG9VVEY4Qnl0ZXMoIm5vdGhpbmciKTsKLSAgICAgICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBuZXcgQ29udGVudFN0cmVhbUltcGwoIm5ldmVyLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoY29udGVudEJ5dGVzLmxlbmd0aCksICJ0ZXh0L3BsYWluIiwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRCeXRlcykpOwotCi0gICAgICAgICAgICAgICAgdGVzdEZvbGRlci5jcmVhdGVEb2N1bWVudChwcm9wZXJ0aWVzLCBjb250ZW50U3RyZWFtLCBudWxsKTsKLQotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNyZWF0aW9uIG9mIGEgZG9jdW1lbnQgd2l0aCBhIGZvbGRlciB0eXBlIHNob3VsZG4ndCB3b3JrISIpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pICYmICEoZSBpbnN0YW5jZW9mIENtaXNDb25zdHJhaW50RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW9uIG9mIGEgZG9jdW1lbnQgd2l0aCBhIGZvbGRlciB0eXBlIHRocmV3IGFuIHVuZXhjcGV0ZWQgZXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0ZXN0IGZvbGRlciBjcmVhdGlvbgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCAibmV2ZXIiKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgZ2V0RG9jdW1lbnRUZXN0VHlwZUlkKCkpOwotCi0gICAgICAgICAgICAgICAgdGVzdEZvbGRlci5jcmVhdGVGb2xkZXIocHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDcmVhdGlvbiBvZiBhIGZvbGRlciB3aXRoIGEgZG9jdW1lbnQgdHlwZSBzaG91bGRuJ3Qgd29yayEiKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBDbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKSAmJiAhKGUgaW5zdGFuY2VvZiBDbWlzQ29uc3RyYWludEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbiBvZiBhIGZvbGRlciB3aXRoIGEgZG9jdW1lbnQgdHlwZSB0aHJldyBhbiB1bmV4Y3BldGVkIGV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdGVzdCBmb2xkZXIKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0RlbGV0ZVRyZWVUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9EZWxldGVUcmVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U0NDU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL0RlbGV0ZVRyZWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNydWQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VbmZpbGVPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogRGVsZXRlIHRyZWUgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVRyZWVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVCA9ICJUQ0sgdGVzdCBjb250ZW50LiI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJEZWxldGUgVHJlZSBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGEgZmV3IGRvY3VtZW50cyBpbiBhIGZvbGRlciwgZGVsZXRlcyB0aGUgZm9sZGVyIGFuZCBjaGVja3MgaWYgYWxsIGRvY3VtZW50cyBhcmUgZ29uZS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaW50IG51bU9mRG9jdW1lbnRzID0gMjA7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCBmb2xkZXIKLSAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIERvY3VtZW50PiBkb2N1bWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERvY3VtZW50PigpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBkb2N1bWVudHMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZkRvY3VtZW50czsgaSsrKSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBuZXdEb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KHNlc3Npb24sIHRlc3RGb2xkZXIsICJkb2MiICsgaSwgQ09OVEVOVCk7Ci0gICAgICAgICAgICBkb2N1bWVudHMucHV0KG5ld0RvY3VtZW50LmdldElkKCksIG5ld0RvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlbGV0ZSB0cmVlCi0gICAgICAgIExpc3Q8U3RyaW5nPiBmYWlsZWRJZHMgPSB0ZXN0Rm9sZGVyLmRlbGV0ZVRyZWUodHJ1ZSwgVW5maWxlT2JqZWN0LkRFTEVURSwgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgZmFpbGVkIGlkcwotICAgICAgICBpZiAoZmFpbGVkSWRzICE9IG51bGwgJiYgIWZhaWxlZElkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgImRlbGV0ZVRyZWUoKSBjb3VsZCBub3QgZGVsZXRlICIgKyBmYWlsZWRJZHMuc2l6ZSgpICsgIiBvdXQgb2YgIiArIG51bU9mRG9jdW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICsgIiBvYmplY3RzIGluIHRoZSBmb2xkZXIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDAsIGZhaWxlZElkcy5zaXplKCksIG51bGwsIGYpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGRvY3VtZW50cwotICAgICAgICBmb3IgKERvY3VtZW50IGRvYyA6IGRvY3VtZW50cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc3RpbGwgZXhpc3RzIGJ1dCBzaG91bGQgaGF2ZSBiZWVuIGRlbGV0ZWQuIElkOiAiICsgZG9jLmdldElkKCkpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoZXhpc3RzKGRvYyksIG51bGwsIGYpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGZvbGRlcgotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgc3RpbGwgZXhpc3RzIGJ1dCBzaG91bGQgaGF2ZSBiZWVuIGRlbGV0ZWQuIElkOiAiICsgdGVzdEZvbGRlci5nZXRJZCgpKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoZXhpc3RzKHRlc3RGb2xkZXIpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgaWYgKGV4aXN0cyh0ZXN0Rm9sZGVyKSkgewotICAgICAgICAgICAgLy8gdHJ5IHRvIGNsZWFuIHVwCi0gICAgICAgICAgICBkZWxldGVPYmplY3QodGVzdEZvbGRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9Nb3ZlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvTW92ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMDdiYS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9Nb3ZlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0OwotCi0vKioKLSAqIE1vdmUgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIE1vdmVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJNb3ZlIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgdHdvIGZvbGRlcnMgYW5kIGEgZG9jdW1lbnQgYW5kIG1vdmVzIHRoZSBkb2N1bWVudCBmcm9tIG9uZSBmb2xkZXIgdG8gdGhlIG90aGVyLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGZvbGRlcnMKLSAgICAgICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLSAgICAgICAgICAgIEZvbGRlciBmb2xkZXIxID0gY3JlYXRlRm9sZGVyKHNlc3Npb24sIHRlc3RGb2xkZXIsICJtb3ZlZm9sZGVyMSIpOwotICAgICAgICAgICAgRm9sZGVyIGZvbGRlcjIgPSBjcmVhdGVGb2xkZXIoc2Vzc2lvbiwgdGVzdEZvbGRlciwgIm1vdmVmb2xkZXIyIik7Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBkb2N1bWVudAotICAgICAgICAgICAgRG9jdW1lbnQgZG9jMSA9IGNyZWF0ZURvY3VtZW50KHNlc3Npb24sIGZvbGRlcjEsICJtb3ZldGVzdGRvYy50eHQiLCAibW92ZSB0ZXN0Iik7Ci0KLSAgICAgICAgICAgIC8vIG1vdmUKLSAgICAgICAgICAgIERvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpIGRvYzEubW92ZShmb2xkZXIxLCBmb2xkZXIyLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICAgICAgaWYgKGRvYzIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk1vdmVkIGRvY3VtZW50IGlzIG51bGwhIikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZG9jMiwgZ2V0QWxsUHJvcGVydGllcyhkb2MyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNb3ZlZCBkb2N1bWVudCBjaGVjay4gSWQ6ICsgIiArIGRvYzIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjb3VudDEgPSBjb3VudEZvbGRlckNoaWxkcmVuKGZvbGRlcjEpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiU291cmNlIGZvbGRlciBzaG91bGQgYmUgZW1wdHkgYWZ0ZXIgbW92ZSBidXQgaGFzICIgKyBjb3VudDEgKyAiIGNoaWxkcmVuISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygwLCBjb3VudDEsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgaW50IGNvdW50MiA9IGNvdW50Rm9sZGVyQ2hpbGRyZW4oZm9sZGVyMik7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUYXJnZXQgZm9sZGVyIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGJ1dCBoYXMgIiArIGNvdW50MiArICIgY2hpbGRyZW4hIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDEsIGNvdW50MiwgbnVsbCwgZikpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gY2xlYW4gdXAKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL05hbWVDaGFyc2V0VGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvTmFtZUNoYXJzZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGU5M2IuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvTmFtZUNoYXJzZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORzsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotLyoqCi0gKiBEb2N1bWVudCBuYW1lcyB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgTmFtZUNoYXJzZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOQU1FUyA9IG5ldyBTdHJpbmdbXSB7IC8vCi0gICAgIlx1MDA2NFx1MDA2Zlx1MDA2M1x1MDA3NVx1MDA2ZFx1MDA2NVx1MDA2ZVx1MDA3NCIsIC8vCi0gICAgICAgICAgICAiXHUwMDUzXHUwMDYzXHUwMDY4XHUwMDcyXHUwMDY5XHUwMDY2XHUwMDc0XHUwMDczXHUwMDc0XHUwMGZjXHUwMDYzXHUwMDZiIiwgLy8KLSAgICAgICAgICAgICJcdTA2NDhcdTA2MmJcdTA2NGFcdTA2NDJcdTA2MjkiLCAvLwotICAgICAgICAgICAgIlx1MDA3M1x1MDI1OVx1MDA2ZVx1MDI1OVx1MDA2NCIsIC8vCi0gICAgICAgICAgICAiXHUwNDM0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyIiwgLy8KLSAgICAgICAgICAgICJcdTY1ODdcdTRlZjYiLCAvLwotICAgICAgICAgICAgIlx1MDNhZFx1MDNiM1x1MDNiM1x1MDNjMVx1MDNiMVx1MDNjNlx1MDNiZiIsIC8vCi0gICAgICAgICAgICAiXHUwYWE2XHUwYWI4XHUwYWNkXHUwYWE0XHUwYWJlXHUwYWI1XHUwYWM3XHUwYTljIiwgLy8KLSAgICAgICAgICAgICJcdTA5MjZcdTA5MzhcdTA5NGRcdTA5MjRcdTA5M2VcdTA5MzVcdTA5NDdcdTA5MWNcdTA5M2MiLCAvLwotICAgICAgICAgICAgIlx1MDA2NFx1MDA2Zlx1MDA2OVx1MDA2M1x1MDA2OVx1MDA2ZFx1MDBlOVx1MDA2MVx1MDA2NCIsIC8vCi0gICAgICAgICAgICAiXHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM4IiwgLy8KLSAgICAgICAgICAgICJcdTA1ZDNcdTA1ZDBcdTA1YjhcdTA1ZTdcdTA1ZDVcdTA1ZGVcdTA1ZTJcdTA1ZTBcdTA1ZDgiLCAvLwotICAgICAgICAgICAgIlx1MGNhNlx1MGNiZVx1MGM5Nlx1MGNiMlx1MGNjNiIsIC8vCi0gICAgICAgICAgICAiXHViYjM4XHVjMTFjIiwgLy8KLSAgICAgICAgICAgICJcdTA2MzNcdTA2NDZcdTA2MmYiLCAvLwotICAgICAgICAgICAgIlx1MGI4Nlx1MGJiNVx1MGJhM1x1MGJhZVx1MGJjZCIsIC8vCi0gICAgICAgICAgICAiXHUwYzJhXHUwYzI0XHUwYzRkXHUwYzMwXHUwYzAyIiwgLy8KLSAgICAgICAgICAgICJcdTBlNDBcdTBlMmRcdTBlMDFcdTBlMmFcdTBlMzJcdTBlMjMiLCAvLwotICAgICAgICAgICAgIlx1MDYyZlx1MDYzM1x1MDYyYVx1MDYyN1x1MDY0OFx1MDZjY1x1MDYzMiIsIC8vCi0gICAgICAgICAgICAiXHUwMDc0XHUwMGUwXHUwMDY5XHUwMDIwXHUwMDZjXHUwMDY5XHUxZWM3XHUwMDc1IiwgLy8KLSAgICAgICAgICAgICJhJmIiLCAvLwotICAgICAgICAgICAgImFiYyVfUHh5eiIgfTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIk5hbWUgQ2hhcnNldCBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGFuZCBkZWxldGVzIGRvY3VtZW50cyB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBjbWlzOm5hbWUuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQU1FUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jMiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZG9jID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgTkFNRVNbaV0sIE5BTUVTW2ldKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IGJ5IHBhdGgKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkb2MuZ2V0UGF0aHMoKS5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvYzIgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0QnlQYXRoKHBhdGgsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZG9jMiwgZ2V0QWxsUHJvcGVydGllcyhkb2MyKSwgIk5ldyBkb2N1bWVudCBvYmplY3Qgc3BlYyBjb21wbGlhbmNlIikpOwotCi0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk5hbWVzIG9mIHRoZSBjcmVhdGVkIGFuZCB0aGUgZmV0Y2hlZCBkb2N1bWVudCBkb24ndCBtYXRjaCEiKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE5BTUVTW2ldLCBkb2MyLmdldE5hbWUoKSwgbnVsbCwgZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gZG9jLmdldENvbnRlbnRTdHJlYW0oKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBoYXMgbm8gY29udGVudCEiKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50U3RyZWFtLCBudWxsLCBmKTsKLQotICAgICAgICAgICAgICAgICAgICBJT1V0aWxzLmNvbnN1bWVBbmRDbG9zZShjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJUaGUgbmFtZSAnIiArIE5BTUVTW2ldICsgIicgcmFpc2VkIHRoaXMgZXhjZXB0aW9uOiAiICsgZSwgZSwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpdAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MuZGVsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlRlc3RlZCAiICsgTkFNRVMubGVuZ3RoICsgIiBkaWZmZXJlbnQgbmFtZXMuIikpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB0ZXN0IGZvbGRlcgotICAgICAgICAgICAgZGVsZXRlVGVzdEZvbGRlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvT3BlcmF0aW9uQ29udGV4dFRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL09wZXJhdGlvbkNvbnRleHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjRlZGIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvT3BlcmF0aW9uQ29udGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNydWQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdERhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJMaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RQYXJlbnREYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0OwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uQ29udGV4dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIlRDSyB0ZXN0IGNvbnRlbnQuIjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIk9wZXJhdGlvbiBDb250ZXh0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGEgZG9jdW1lbnQsIHJldHJpZXZlcyBhIG1pbmltYWwgc2V0IG9mIGRldGFpbHMsIGNoZWNrcyBpdCwgYW5kIGZpbmFsbHkgZGVsZXRlcyB0aGUgZG9jdW1lbnQuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCBkb2N1bWVudAotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAidGVzdGRvYy50eHQiLCBDT05URU5UKTsKLQotICAgICAgICAgICAgLy8gaGlnaC1sZXZlbCBBUEkgdGVzdHMKLSAgICAgICAgICAgIHJ1bkhpZ2hMZXZlbEFwaVRlc3RzKHNlc3Npb24sIHRlc3RGb2xkZXIsIGRvY3VtZW50KTsKLQotICAgICAgICAgICAgLy8gbG93LWxldmVsIEFQSSB0ZXN0cwotICAgICAgICAgICAgcnVuTG93TGV2ZWxBcGlUZXN0cyhzZXNzaW9uLCB0ZXN0Rm9sZGVyLCBkb2N1bWVudCk7Ci0KLSAgICAgICAgICAgIC8vIGNsZWFuIHVwCi0gICAgICAgICAgICBkb2N1bWVudC5kZWxldGUodHJ1ZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgZm9yIG5vdCByZXF1ZXN0ZWQgcHJvcGVydGllcywgQWxsb3dhYmxlIEFjdGlvbnMsIEFDTHMsIHJlbmRpdGlvbnMsCi0gICAgICogcmVsYXRpb25zaGlwcywgYW5kIHBvbGljaWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bkhpZ2hMZXZlbEFwaVRlc3RzKFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHRlc3RGb2xkZXIsIERvY3VtZW50IHRlc3REb2N1bWVudCkgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIC8vIG9ubHkgc2VsZWN0IHNvbWUgYmFzZSBwcm9wZXJ0aWVzCi0gICAgICAgIFNldDxTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKCJjbWlzOm9iamVjdElkIik7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKCJjbWlzOmJhc2VUeXBlSWQiKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoImNtaXM6b2JqZWN0VHlwZUlkIik7Ci0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjb250ZXh0ID0gc2Vzc2lvbi5jcmVhdGVPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGNvbnRleHQuc2V0Q2FjaGVFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgY29udGV4dC5zZXRGaWx0ZXIocHJvcGVydGllcyk7Ci0gICAgICAgIGNvbnRleHQuc2V0SW5jbHVkZUFjbHMoZmFsc2UpOwotICAgICAgICBjb250ZXh0LnNldEluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKGZhbHNlKTsKLSAgICAgICAgY29udGV4dC5zZXRJbmNsdWRlUGF0aFNlZ21lbnRzKGZhbHNlKTsKLSAgICAgICAgY29udGV4dC5zZXRJbmNsdWRlUG9saWNpZXMoZmFsc2UpOwotICAgICAgICBjb250ZXh0LnNldEluY2x1ZGVSZWxhdGlvbnNoaXBzKEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUpOwotICAgICAgICBjb250ZXh0LnNldExvYWRTZWNvbmRhcnlUeXBlUHJvcGVydGllcyhmYWxzZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKCJjbWlzOm5vbmUiKTsKLQotICAgICAgICAvLyBnZXQgdGhlIG9iamVjdCB3aXRoIHRoZSBPcGVyYXRpb25Db250ZXh0Ci0gICAgICAgIERvY3VtZW50IGRvYzEgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KHRlc3REb2N1bWVudCwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgcHJvcGVydGllcwotICAgICAgICBmb3IgKFByb3BlcnR5PD8+IHByb3AgOiBkb2MxLmdldFByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbnRhaW5zKHByb3AuZ2V0RGVmaW5pdGlvbigpLmdldFF1ZXJ5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJnZXRPYmplY3QoKSBkZWxpdmVyZWQgdGhlIHByb3BlcnR5ICciICsgcHJvcC5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicsIGFsdGhvdWdoIGl0IGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQuIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgb3RoZXIgZGV0YWlscwotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgImdldE9iamVjdCgpIGRlbGl2ZXJlZCBBQ0xzLCBhbHRob3VnaCB0aGV5IGhhdmUgbm90IGJlZW4gcmVxdWVzdGVkLiIpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChkb2MxLmdldEFjbCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HLAotICAgICAgICAgICAgICAgICJnZXRPYmplY3QoKSBkZWxpdmVyZWQgQWxsb3dhYmxlIEFjdGlvbnMsIGFsdGhvdWdoIHRoZXkgaGF2ZSBub3QgYmVlbiByZXF1ZXN0ZWQuIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGRvYzEuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HLAotICAgICAgICAgICAgICAgICJnZXRPYmplY3QoKSBkZWxpdmVyZWQgcG9saWNpZXMsIGFsdGhvdWdoIHRoZXkgaGF2ZSBub3QgYmVlbiByZXF1ZXN0ZWQuIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRMaXN0TnVsbE9yRW1wdHkoZG9jMS5nZXRQb2xpY2llcygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HLAotICAgICAgICAgICAgICAgICJnZXRPYmplY3QoKSBkZWxpdmVyZWQgcmVsYXRpb25zaGlwcywgYWx0aG91Z2ggdGhleSBoYXZlIG5vdCBiZWVuIHJlcXVlc3RlZC4iKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydExpc3ROdWxsT3JFbXB0eShkb2MxLmdldFJlbGF0aW9uc2hpcHMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAiZ2V0T2JqZWN0KCkgZGVsaXZlcmVkIHJlbmRpdGlvbnMsIGFsdGhvdWdoIHRoZXkgaGF2ZSBub3QgYmVlbiByZXF1ZXN0ZWQuIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRMaXN0TnVsbE9yRW1wdHkoZG9jMS5nZXRSZW5kaXRpb25zKCksIG51bGwsIGYpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHRlc3QgZm9sZGVyIGNoaWxkcmVuIHdpdGggdGhlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgICAgZm9yIChDbWlzT2JqZWN0IGNoaWxkIDogdGVzdEZvbGRlci5nZXRDaGlsZHJlbihjb250ZXh0KSkgewotICAgICAgICAgICAgaWYgKGNoaWxkLmdldElkKCkuZXF1YWxzKHRlc3REb2N1bWVudC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5PD8+IHByb3AgOiBjaGlsZC5nZXRQcm9wZXJ0aWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbnRhaW5zKHByb3AuZ2V0RGVmaW5pdGlvbigpLmdldFF1ZXJ5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HLCAiZ2V0Q2hpbGRyZW4oKSBkZWxpdmVyZWQgdGhlIHByb3BlcnR5ICciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcC5nZXRJZCgpICsgIicsIGFsdGhvdWdoIGl0IGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQuIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgb3RoZXIgZGV0YWlscwotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgImdldENoaWxkcmVuKCkgZGVsaXZlcmVkIEFDTHMsIHdoaWNoIGlzIG5vdCByZXF1aXJlZC4iKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChjaGlsZC5nZXRBY2woKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgImdldENoaWxkcmVuKCkgZGVsaXZlcmVkIEFsbG93YWJsZSBBY3Rpb25zLCBhbHRob3VnaCB0aGV5IGhhdmUgbm90IGJlZW4gcmVxdWVzdGVkLiIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGNoaWxkLmdldEFsbG93YWJsZUFjdGlvbnMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5JTkZPLCAiZ2V0Q2hpbGRyZW4oKSBkZWxpdmVyZWQgcG9saWNpZXMsIHdoaWNoIGlzIG5vdCByZXF1aXJlZC4iKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TGlzdE51bGxPckVtcHR5KGNoaWxkLmdldFBvbGljaWVzKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJnZXRDaGlsZHJlbigpIGRlbGl2ZXJlZCByZWxhdGlvbnNoaXBzLCBhbHRob3VnaCB0aGV5IGhhdmUgbm90IGJlZW4gcmVxdWVzdGVkLiIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRMaXN0TnVsbE9yRW1wdHkoY2hpbGQuZ2V0UmVsYXRpb25zaGlwcygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ2V0Q2hpbGRyZW4oKSBkZWxpdmVyZWQgcmVuZGl0aW9ucywgYWx0aG91Z2ggdGhleSBoYXZlIG5vdCBiZWVuIHJlcXVlc3RlZC4iKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TGlzdE51bGxPckVtcHR5KGNoaWxkLmdldFJlbmRpdGlvbnMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgZm9yIGNoYW5nZSBldmVudHMgYW5kIHBhdGggc2VnbWVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuTG93TGV2ZWxBcGlUZXN0cyhTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyLCBEb2N1bWVudCB0ZXN0RG9jdW1lbnQpIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeUlkID0gc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldElkKCk7Ci0gICAgICAgIFN0cmluZyBmaWx0ZXIgPSAiY21pczpvYmplY3RJZCxjbWlzOmJhc2VUeXBlSWQsY21pczpvYmplY3RUeXBlSWQiOwotCi0gICAgICAgIC8vIGdldCB0aGUgb2JqZWN0Ci0gICAgICAgIE9iamVjdERhdGEgZG9jMSA9IHNlc3Npb24KLSAgICAgICAgICAgICAgICAuZ2V0QmluZGluZygpCi0gICAgICAgICAgICAgICAgLmdldE9iamVjdFNlcnZpY2UoKQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3QocmVwb3NpdG9yeUlkLCB0ZXN0RG9jdW1lbnQuZ2V0SWQoKSwgZmlsdGVyLCBCb29sZWFuLkZBTFNFLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgImNtaXM6bm9uZSIsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uRkFMU0UsIG51bGwpOwotCi0gICAgICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgZXZlbnRzCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORywKLSAgICAgICAgICAgICAgICAiZ2V0T2JqZWN0KCkgZGVsaXZlcmVkIGEgY2hhbmdlIGV2ZW50LCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UuIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGRvYzEuZ2V0Q2hhbmdlRXZlbnRJbmZvKCksIG51bGwsIGYpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHRlc3QgZm9sZGVyIGNoaWxkcmVuCi0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCBjaGlsZHJlbiA9IHNlc3Npb24KLSAgICAgICAgICAgICAgICAuZ2V0QmluZGluZygpCi0gICAgICAgICAgICAgICAgLmdldE5hdmlnYXRpb25TZXJ2aWNlKCkKLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW4ocmVwb3NpdG9yeUlkLCB0ZXN0Rm9sZGVyLmdldElkKCksIGZpbHRlciwgbnVsbCwgQm9vbGVhbi5GQUxTRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbWlzOm5vbmUiLCBCb29sZWFuLkZBTFNFLCBudWxsLCBCaWdJbnRlZ2VyLlpFUk8sIG51bGwpOwotCi0gICAgICAgIC8vIGNoZWNrIGZvciBwYXRoIHNlZ21lbnRzCi0gICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJEYXRhIGNoaWxkIDogY2hpbGRyZW4uZ2V0T2JqZWN0cygpKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KENtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICJnZXRDaGlsZHJlbigpIGRlbGl2ZXJlZCBhIHBhdGggc2VnbWVudCwgYWx0aG91Z2ggaXQgaGFzbid0IGJlZW4gcmVxdWVzdGVkLiIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwoY2hpbGQuZ2V0UGF0aFNlZ21lbnQoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBkb2N1bWVudCBwYXJlbnQKLSAgICAgICAgTGlzdDxPYmplY3RQYXJlbnREYXRhPiBwYXJlbnRzID0gc2Vzc2lvbgotICAgICAgICAgICAgICAgIC5nZXRCaW5kaW5nKCkKLSAgICAgICAgICAgICAgICAuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3RQYXJlbnRzKHJlcG9zaXRvcnlJZCwgdGVzdERvY3VtZW50LmdldElkKCksIGZpbHRlciwgQm9vbGVhbi5GQUxTRSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbWlzOm5vbmUiLCBCb29sZWFuLkZBTFNFLCBudWxsKTsKLQotICAgICAgICAvLyBjaGVjayBmb3IgcmVsYXRpdmUgcGF0aCBzZWdtZW50cwotICAgICAgICBmb3IgKE9iamVjdFBhcmVudERhdGEgcGFyZW50IDogcGFyZW50cykgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChDbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiZ2V0T2JqZWN0UGFyZW50cygpIGRlbGl2ZXJlZCBhIHJlbGF0aXZlIHBhdGggc2VnbWVudCwgYWx0aG91Z2ggaXQgaGFzbid0IGJlZW4gcmVxdWVzdGVkLiIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwocGFyZW50LmdldFJlbGF0aXZlUGF0aFNlZ21lbnQoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvUHJvcGVydHlGaWx0ZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9Qcm9wZXJ0eUZpbHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI5MmIwYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9Qcm9wZXJ0eUZpbHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNydWQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQudXRpbC5PcGVyYXRpb25Db250ZXh0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5RmlsdGVyVGVzdCBleHRlbmRzIEFic3RyYWN0U2Vzc2lvblRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlQgPSAiVENLIHRlc3QgY29udGVudC4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX1BST1BFUlRZID0gImNtaXM6dGNrOnRoaXNQcm9wZXJ0eURvZXNOb3RFeGlzdCI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJQcm9wZXJ0eSBGaWx0ZXIgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiVGVzdHMgZGlmZmVyZW50IHByb3BlcnR5IGZpbHRlciBjb21iaW5hdGlvbnMgZm9yIGRvY3VtZW50cyBhbmQgZm9sZGVycy4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgLy8gZmlsdGVyIHdpdGggTUlNRSB0eXBlCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgdGVzdENvbnRleHQxID0gT3BlcmF0aW9uQ29udGV4dFV0aWxzLmNyZWF0ZU1pbmltdW1PcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHRlc3RmaWx0ZXIxID0gbmV3IEhhc2hTZXQ8U3RyaW5nPih0ZXN0Q29udGV4dDEuZ2V0RmlsdGVyKCkpOwotICAgICAgICB0ZXN0ZmlsdGVyMS5hZGQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFKTsKLSAgICAgICAgdGVzdENvbnRleHQxLnNldEZpbHRlcih0ZXN0ZmlsdGVyMSk7Ci0KLSAgICAgICAgLy8gZmlsdGVyIHdpdGggcGF0aAotICAgICAgICBPcGVyYXRpb25Db250ZXh0IHRlc3RDb250ZXh0MiA9IE9wZXJhdGlvbkNvbnRleHRVdGlscy5jcmVhdGVNaW5pbXVtT3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICBTZXQ8U3RyaW5nPiB0ZXN0ZmlsdGVyMiA9IG5ldyBIYXNoU2V0PFN0cmluZz4odGVzdENvbnRleHQyLmdldEZpbHRlcigpKTsKLSAgICAgICAgdGVzdGZpbHRlcjIuYWRkKFByb3BlcnR5SWRzLlBBVEgpOwotICAgICAgICB0ZXN0Q29udGV4dDIuc2V0RmlsdGVyKHRlc3RmaWx0ZXIyKTsKLQotICAgICAgICAvLyBmaWx0ZXIgd2l0aCBpbnZhbGlkIHByb3BlcnR5Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgdGVzdENvbnRleHQzID0gT3BlcmF0aW9uQ29udGV4dFV0aWxzLmNyZWF0ZU1pbmltdW1PcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHRlc3RmaWx0ZXIzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPih0ZXN0Q29udGV4dDMuZ2V0RmlsdGVyKCkpOwotICAgICAgICB0ZXN0ZmlsdGVyMy5hZGQoSU5WQUxJRF9QUk9QRVJUWSk7Ci0gICAgICAgIHRlc3RDb250ZXh0My5zZXRGaWx0ZXIodGVzdGZpbHRlcjMpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImRvYyIsIENPTlRFTlQpOwotCi0gICAgICAgICAgICBEb2N1bWVudCBkb2MxID0gKERvY3VtZW50KSBzZXNzaW9uLmdldE9iamVjdChkb2MsIHRlc3RDb250ZXh0MSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGRvY3VtZW50Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBzaG91bGQgaGF2ZSB0aGUgcHJvcGVydHkgIiArIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChkb2MxLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IHNob3VsZCBub3QgaGF2ZSB0aGUgcHJvcGVydHkgIiArIFByb3BlcnR5SWRzLlBBVEggKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwoZG9jMS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUlkcy5QQVRIKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSAiICsgSU5WQUxJRF9QUk9QRVJUWSArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChkb2MxLmdldFByb3BlcnR5KElOVkFMSURfUFJPUEVSVFkpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KGRvYywgdGVzdENvbnRleHQyKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRG9jdW1lbnQgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFCi0gICAgICAgICAgICAgICAgICAgICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGRvYzIuZ2V0UHJvcGVydHkoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuUEFUSCArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChkb2MyLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLlBBVEgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5ICIgKyBJTlZBTElEX1BST1BFUlRZICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGRvYzIuZ2V0UHJvcGVydHkoSU5WQUxJRF9QUk9QRVJUWSksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jMyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QoZG9jLCB0ZXN0Q29udGV4dDMpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJEb2N1bWVudCBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5IiArIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRQotICAgICAgICAgICAgICAgICAgICArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChkb2MzLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IHNob3VsZCBub3QgaGF2ZSB0aGUgcHJvcGVydHkiICsgUHJvcGVydHlJZHMuUEFUSCArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChkb2MzLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLlBBVEgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5IiArIElOVkFMSURfUFJPUEVSVFkgKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwoZG9jMy5nZXRQcm9wZXJ0eShJTlZBTElEX1BST1BFUlRZKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBmb2xkZXIKLSAgICAgICAgICAgIEZvbGRlciBmb2xkZXIxID0gKEZvbGRlcikgc2Vzc2lvbi5nZXRPYmplY3QodGVzdEZvbGRlciwgdGVzdENvbnRleHQxKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIHNob3VsZCBub3QgaGF2ZSB0aGUgcHJvcGVydHkgIiArIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRQotICAgICAgICAgICAgICAgICAgICArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChmb2xkZXIxLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkZvbGRlciBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5ICIgKyBQcm9wZXJ0eUlkcy5QQVRIICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGZvbGRlcjEuZ2V0UHJvcGVydHkoUHJvcGVydHlJZHMuUEFUSCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5ICIgKyBJTlZBTElEX1BST1BFUlRZICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGZvbGRlcjEuZ2V0UHJvcGVydHkoSU5WQUxJRF9QUk9QRVJUWSksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgRm9sZGVyIGZvbGRlcjIgPSAoRm9sZGVyKSBzZXNzaW9uLmdldE9iamVjdCh0ZXN0Rm9sZGVyLCB0ZXN0Q29udGV4dDIpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFCi0gICAgICAgICAgICAgICAgICAgICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGZvbGRlcjIuZ2V0UHJvcGVydHkoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIHNob3VsZCBoYXZlIHRoZSBwcm9wZXJ0eSAiICsgUHJvcGVydHlJZHMuUEFUSCArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChmb2xkZXIyLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLlBBVEgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSAiICsgSU5WQUxJRF9QUk9QRVJUWSArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChmb2xkZXIyLmdldFByb3BlcnR5KElOVkFMSURfUFJPUEVSVFkpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIEZvbGRlciBmb2xkZXIzID0gKEZvbGRlcikgc2Vzc2lvbi5nZXRPYmplY3QodGVzdEZvbGRlciwgdGVzdENvbnRleHQzKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIHNob3VsZCBub3QgaGF2ZSB0aGUgcHJvcGVydHkgIiArIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRQotICAgICAgICAgICAgICAgICAgICArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChmb2xkZXIzLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkZvbGRlciBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5ICIgKyBQcm9wZXJ0eUlkcy5QQVRIICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGZvbGRlcjMuZ2V0UHJvcGVydHkoUHJvcGVydHlJZHMuUEFUSCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5ICIgKyBJTlZBTElEX1BST1BFUlRZICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKGZvbGRlcjMuZ2V0UHJvcGVydHkoSU5WQUxJRF9QUk9QRVJUWSksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgY2hpbGRyZW4KLSAgICAgICAgICAgIENtaXNPYmplY3Qgb2JqMSA9IHRlc3RGb2xkZXIuZ2V0Q2hpbGRyZW4odGVzdENvbnRleHQxKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ2hpbGQgc2hvdWxkIGhhdmUgdGhlIHByb3BlcnR5ICIgKyBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUgKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwob2JqMS5nZXRQcm9wZXJ0eShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJDaGlsZCBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5ICIgKyBQcm9wZXJ0eUlkcy5QQVRIICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKG9iajEuZ2V0UHJvcGVydHkoUHJvcGVydHlJZHMuUEFUSCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNoaWxkIHNob3VsZCBub3QgaGF2ZSB0aGUgcHJvcGVydHkgIiArIElOVkFMSURfUFJPUEVSVFkgKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwob2JqMS5nZXRQcm9wZXJ0eShJTlZBTElEX1BST1BFUlRZKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBDbWlzT2JqZWN0IG9iajIgPSB0ZXN0Rm9sZGVyLmdldENoaWxkcmVuKHRlc3RDb250ZXh0MikuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkNoaWxkIHNob3VsZCBub3QgaGF2ZSB0aGUgcHJvcGVydHkgIiArIFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRQotICAgICAgICAgICAgICAgICAgICArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChvYmoyLmdldFByb3BlcnR5KFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX01JTUVfVFlQRSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkNoaWxkIHNob3VsZCBub3QgaGF2ZSB0aGUgcHJvcGVydHkgIiArIFByb3BlcnR5SWRzLlBBVEggKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwob2JqMi5nZXRQcm9wZXJ0eShQcm9wZXJ0eUlkcy5QQVRIKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2hpbGQgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSAiICsgSU5WQUxJRF9QUk9QRVJUWSArICIhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChvYmoyLmdldFByb3BlcnR5KElOVkFMSURfUFJPUEVSVFkpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIENtaXNPYmplY3Qgb2JqMyA9IHRlc3RGb2xkZXIuZ2V0Q2hpbGRyZW4odGVzdENvbnRleHQzKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ2hpbGQgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSIgKyBQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUgKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwob2JqMy5nZXRQcm9wZXJ0eShQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9NSU1FX1RZUEUpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJDaGlsZCBzaG91bGQgbm90IGhhdmUgdGhlIHByb3BlcnR5IiArIFByb3BlcnR5SWRzLlBBVEggKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwob2JqMy5nZXRQcm9wZXJ0eShQcm9wZXJ0eUlkcy5QQVRIKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2hpbGQgc2hvdWxkIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSIgKyBJTlZBTElEX1BST1BFUlRZICsgIiEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROdWxsKG9iajMuZ2V0UHJvcGVydHkoSU5WQUxJRF9QUk9QRVJUWSksIG51bGwsIGYpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdGVzdCBmb2xkZXIKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL1NldEFuZERlbGV0ZUNvbnRlbnRUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9TZXRBbmREZWxldGVDb250ZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBhMWI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9jcnVkL1NldEFuZERlbGV0ZUNvbnRlbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5jcnVkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlVORVhQRUNURURfRVhDRVBUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDb250ZW50U3RyZWFtVXBkYXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ29udGVudFN0cmVhbUFsbG93ZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogQ29udGVudCB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgU2V0QW5kRGVsZXRlQ29udGVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UMSA9ICJvbmUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UMiA9ICJ0d28iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UMyA9ICJ0aHJlZSI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJTZXQsIEFwcGVuZCwgYW5kIERlbGV0ZSBDb250ZW50IFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgYW5kIHRyaWVzIHRvIHNldCwgYXBwZW5kLCBhbmQgZGVsZXRlIGl0cyBjb250ZW50LiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpZiAoZ2V0Q29udGVudFN0cmVhbVVwZGF0ZXNDYXBiaWxpdHkoc2Vzc2lvbikgPT0gQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzLk5PTkUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlN0cmVhbSB1cGRhdGVzIGFyZSBub3Qgc3VwcG9ydGVkLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBmb2xkZXIgYW5kIGRvY3VtZW50Ci0gICAgICAgICAgICBGb2xkZXIgdGVzdEZvbGRlciA9IGNyZWF0ZVRlc3RGb2xkZXIoc2Vzc2lvbik7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiY29udGVudHRlc3QudHh0IiwgQ09OVEVOVDEpOwotICAgICAgICAgICAgRG9jdW1lbnQgd29ya0RvYyA9IGRvYzsKLSAgICAgICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gZG9jVHlwZSA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSBkb2MuZ2V0VHlwZSgpOwotCi0gICAgICAgICAgICAvLyB0ZXN0IGlmIGNoZWNrIG91dCBpcyByZXF1aXJlZCBhbmQgcG9zc2libGUKLSAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZG91dCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKCFkb2MuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhBY3Rpb24uQ0FOX1NFVF9DT05URU5UX1NUUkVBTSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWRvY1R5cGUuaXNWZXJzaW9uYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHRlc3QgZG9jdW1lbnQgZG9lcyBub3QgYWNjZXB0IGEgbmV3IGNvbnRlbnQgc3RyZWFtLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgICAgICBkb2MuZGVsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd29ya0RvYyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QoZG9jLmNoZWNrT3V0KCksIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgICAgICBjaGVja2Vkb3V0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIXdvcmtEb2MuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhBY3Rpb24uQ0FOX1NFVF9DT05URU5UX1NUUkVBTSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB0ZXN0IFBXQyBkb2VzIG5vdCBhY2NlcHQgYSBuZXcgY29udGVudCBzdHJlYW0uIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JrRG9jLmNhbmNlbENoZWNrT3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb2MuZGVsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0ZXN0IGlmIHRoZSBjb250ZW50IHN0cmVhbSBjYW4gYmUgZGVsZXRlZAotICAgICAgICAgICAgaWYgKGRvY1R5cGUuZ2V0Q29udGVudFN0cmVhbUFsbG93ZWQoKSA9PSBDb250ZW50U3RyZWFtQWxsb3dlZC5SRVFVSVJFRCkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBIGNvbnRlbnQgc3RyZWFtIGlzIHJlcXVpcmVkIGZvciB0aGlzIGRvY3VtZW50IHR5cGUuIGRlbGV0ZUNvbnRlbnRTdHJlYW0oKSB0ZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBkZWxldGUgY29udGVudCBzdHJlYW0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3RJZCBuZXdPYmplY3RJZCA9IHdvcmtEb2MuZGVsZXRlQ29udGVudFN0cmVhbSh0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGVDb250ZW50U3RyZWFtIG1heSBoYXZlIGNyZWF0ZWQgYSBuZXcgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBjb250ZW50RG9jID0gZ2V0TmV3VmVyc2lvbihzZXNzaW9uLCB3b3JrRG9jLCBjaGVja2Vkb3V0LCBuZXdPYmplY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRlQ29udGVudFN0cmVhbSgpIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc3RpbGwgaGFzIGNvbnRlbnQgYWZ0ZXIgZGVsZXRlQ29udGVudFN0cmVhbSgpIGhhcyBiZWVuIGNhbGxlZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwoY29udGVudERvYy5nZXRDb250ZW50U3RyZWFtKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50IHN0aWxsIGhhcyBhIE1JTUUgdHlwZSBhZnRlciBkZWxldGVDb250ZW50U3RyZWFtKCkgaGFzIGJlZW4gY2FsbGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRlbnREb2MuZ2V0Q29udGVudFN0cmVhbU1pbWVUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChjb250ZW50RG9jLmdldENvbnRlbnRTdHJlYW1NaW1lVHlwZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N1bWVudCBzdGlsbCBoYXMgYSBjb250ZW50IGxlbmd0aCBhZnRlciBkZWxldGVDb250ZW50U3RyZWFtKCkgaGFzIGJlZW4gY2FsbGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRlbnREb2MuZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygtMUwsIGNvbnRlbnREb2MuZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N1bWVudCBzdGlsbCBoYXMgYSBmaWxlIG5hbWUgYWZ0ZXIgZGVsZXRlQ29udGVudFN0cmVhbSgpIGhhcyBiZWVuIGNhbGxlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250ZW50RG9jLmdldENvbnRlbnRTdHJlYW1GaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwoY29udGVudERvYy5nZXRDb250ZW50U3RyZWFtRmlsZU5hbWUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIHdvcmtEb2MgPSBjb250ZW50RG9jOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJkZWxldGVDb250ZW50U3RyZWFtKCkgaXMgbm90IHN1cHBvcnRlZCEiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgYSBuZXcgY29udGVudCBzdHJlYW0KLSAgICAgICAgICAgIGJ5dGVbXSBjb250ZW50Qnl0ZXMgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKENPTlRFTlQyKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBzZXNzaW9uLmdldE9iamVjdEZhY3RvcnkoKS5jcmVhdGVDb250ZW50U3RyZWFtKHdvcmtEb2MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEJ5dGVzLmxlbmd0aCwgInRleHQvcGxhaW4iLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudEJ5dGVzKSk7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3RJZCBuZXdPYmplY3RJZCA9IHdvcmtEb2Muc2V0Q29udGVudFN0cmVhbShjb250ZW50U3RyZWFtLCB0cnVlLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGNvbnRlbnRTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0Q29udGVudFN0cmVhbSBtYXkgaGF2ZSBjcmVhdGVkIGEgbmV3IHZlcnNpb24KLSAgICAgICAgICAgICAgICBEb2N1bWVudCBjb250ZW50RG9jID0gZ2V0TmV3VmVyc2lvbihzZXNzaW9uLCB3b3JrRG9jLCBjaGVja2Vkb3V0LCBuZXdPYmplY3RJZCwgInNldENvbnRlbnRTdHJlYW0oKSIpOwotCi0gICAgICAgICAgICAgICAgLy8gdGVzdCBuZXcgY29udGVudAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0U3RyaW5nRnJvbUNvbnRlbnRTdHJlYW0oY29udGVudERvYy5nZXRDb250ZW50U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBjb250ZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIGNvbnRlbnQgc2V0IGJ5IHNldENvbnRlbnRTdHJlYW0oKSEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhDT05URU5UMiwgY29udGVudCwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChVTkVYUEVDVEVEX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgY29udGVudCBjb3VsZG4ndCBiZSByZWFkISBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgdHJ1ZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdvcmtEb2MgPSBjb250ZW50RG9jOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAic2V0Q29udGVudFN0cmVhbSgpIGlzIG5vdCBzdXBwb3J0ZWQhIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0ZXN0IGFwcGVuZENvbnRlbnRTdHJlYW0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q21pc1ZlcnNpb24oKSAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRCeXRlcyA9IElPVXRpbHMudG9VVEY4Qnl0ZXMoQ09OVEVOVDMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gc2Vzc2lvbi5nZXRPYmplY3RGYWN0b3J5KCkuY3JlYXRlQ29udGVudFN0cmVhbSh3b3JrRG9jLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Qnl0ZXMubGVuZ3RoLCAidGV4dC9wbGFpbiIsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50Qnl0ZXMpKTsKLQotICAgICAgICAgICAgICAgICAgICBPYmplY3RJZCBuZXdPYmplY3RJZCA9IHdvcmtEb2MuYXBwZW5kQ29udGVudFN0cmVhbShjb250ZW50U3RyZWFtLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmRDb250ZW50U3RyZWFtIG1heSBoYXZlIGNyZWF0ZWQgYSBuZXcgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBjb250ZW50RG9jID0gZ2V0TmV3VmVyc2lvbihzZXNzaW9uLCB3b3JrRG9jLCBjaGVja2Vkb3V0LCBuZXdPYmplY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwZW5kQ29udGVudFN0cmVhbSgpIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGVzdCBuZXcgY29udGVudAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBnZXRTdHJpbmdGcm9tQ29udGVudFN0cmVhbShjb250ZW50RG9jLmdldENvbnRlbnRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb2N1bWVudCBjb250ZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIGNvbnRlbnQgc2V0IGJ5IHNldENvbnRlbnRTdHJlYW0oKSBmb2xsb3dlZCBieSBhcHBlbmRDb250ZW50U3RyZWFtKCkhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKENPTlRFTlQyICsgQ09OVEVOVDMsIGNvbnRlbnQsIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChVTkVYUEVDVEVEX0VYQ0VQVElPTiwgIkRvY3VtZW50IGNvbnRlbnQgY291bGRuJ3QgYmUgcmVhZCEgRXhjZXB0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUsIHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJhcHBlbmRDb250ZW50U3RyZWFtKCkgaXMgbm90IHN1cHBvcnRlZCEiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjYW5jZWwgYSBwb3NzaWJsZSBjaGVjayBvdXQKLSAgICAgICAgICAgIGlmIChjaGVja2Vkb3V0KSB7Ci0gICAgICAgICAgICAgICAgd29ya0RvYy5jYW5jZWxDaGVja091dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ2FwYWJpbGl0eUNvbnRlbnRTdHJlYW1VcGRhdGVzIGdldENvbnRlbnRTdHJlYW1VcGRhdGVzQ2FwYmlsaXR5KFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBpZiAoc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldENhcGFiaWxpdGllcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRDb250ZW50U3RyZWFtVXBkYXRlc0NhcGFiaWxpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IGdldE5ld1ZlcnNpb24oU2Vzc2lvbiBzZXNzaW9uLCBEb2N1bWVudCBvcmdEb2MsIGJvb2xlYW4gY2hlY2tlZG91dCwgT2JqZWN0SWQgbmV3T2JqZWN0SWQsCi0gICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uKSB7Ci0gICAgICAgIERvY3VtZW50IHJlc3VsdCA9IG9yZ0RvYzsKLQotICAgICAgICBpZiAobmV3T2JqZWN0SWQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gLT4gTm9uIEF0b21QdWIgYmluZGluZwotICAgICAgICAgICAgaWYgKCFvcmdEb2MuZ2V0SWQoKS5lcXVhbHMobmV3T2JqZWN0SWQuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZG91dCkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsIG9wZXJhdGlvbiArICIgY3JlYXRlZCBhIG5ldyB2ZXJzaW9uIGZyb20gYSBQV0MhIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QobmV3T2JqZWN0SWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcmVzdWx0LCBnZXRBbGxQcm9wZXJ0aWVzKHJlc3VsdCksICJWZXJzaW9uIGNyZWF0ZWQgYnkgIiArIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgY29tcGxpYW5jZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QmluZGluZygpICE9IEJpbmRpbmdUeXBlLkFUT01QVUIpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsIG9wZXJhdGlvbiArICIgZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0IGlkISIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gLT4gQXRvbVB1YiBiaW5kaW5nIG9yIGluY29tcGxpYW50IG90aGVyIGJpbmRpbmcKLSAgICAgICAgICAgIGlmIChjaGVja2Vkb3V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGNoZWNrIGlmIHRoZSByZXBvc2l0b3J5IGRvZXMgdGhlIHJpZ2h0IHRoaW5nLAotICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiB0aGVyZSBpcyBhIHByb2JsZW0gdGhlIHZlcnNpb25pbmcgdGVzdHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgLy8gY2F0Y2ggaXQKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscygoKERvY3VtZW50VHlwZURlZmluaXRpb24pIG9yZ0RvYy5nZXRUeXBlKCkpLmlzVmVyc2lvbmFibGUoKSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PERvY3VtZW50PiB2ZXJzaW9ucyA9IG9yZ0RvYy5nZXRBbGxWZXJzaW9ucygpOwotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9ucyA9PSBudWxsIHx8IHZlcnNpb25zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjcmVhdGVkIGEgbmV3IHZlcnNpb24gYnV0IHRoZSB2ZXJzaW9uIGhpc3RvcnkgaXMgZW1wdHkhIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9yZ0RvYy5nZXRJZCgpLmVxdWFscyh2ZXJzaW9ucy5nZXQoMCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKERvY3VtZW50KSBzZXNzaW9uLmdldE9iamVjdCh2ZXJzaW9ucy5nZXQoMCksIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcmVzdWx0LCBnZXRBbGxQcm9wZXJ0aWVzKHJlc3VsdCksICJWZXJzaW9uIGNyZWF0ZWQgYnkgIiArIG9wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb21wbGlhbmNlIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvVXBkYXRlU21va2VUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9VcGRhdGVTbW9rZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZmODZjZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9VcGRhdGVTbW9rZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNydWQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogVXBkYXRlIHNtb2tlIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTbW9rZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfTkFNRTEgPSAidXBkYXRldGVzdDEudHh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX05BTUUyID0gInVwZGF0ZXRlc3QyLnR4dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FMSA9ICJ1cGRhdGV0ZXN0MSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUl9OQU1FMiA9ICJ1cGRhdGV0ZXN0MiI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJVcGRhdGUgU21va2UgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIGRvY3VtZW50LCB1cGRhdGVzIGl0cyBuYW1lIGFuZCBmaW5hbGx5IGRlbGV0ZXMgaXQuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBGb2xkZXIgdGVzdEZvbGRlciA9IGNyZWF0ZVRlc3RGb2xkZXIoc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIGRvY3VtZW50IHRlc3QKLSAgICAgICAgICAgIHVwZGF0ZURvY3VtZW50KHNlc3Npb24sIHRlc3RGb2xkZXIpOwotCi0gICAgICAgICAgICAvLyBmb2xkZXIgdGVzdAotICAgICAgICAgICAgdXBkYXRlRm9sZGVyKHNlc3Npb24sIHRlc3RGb2xkZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gY2xlYW4gdXAKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEb2N1bWVudChTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGRvY3VtZW50Ci0gICAgICAgIERvY3VtZW50IGRvYzEgPSBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCB0ZXN0Rm9sZGVyLCBET0NfTkFNRTEsICJyZW5hbWUgbWUhIik7Ci0gICAgICAgIERvY3VtZW50IHdvcmtEb2MgPSBkb2MxOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IG5hbWUgZG9lc24ndCBtYXRjaCB0aGUgZ2l2ZW4gbmFtZSEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhET0NfTkFNRTEsIGRvYzEuZ2V0TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgLy8gdGVzdCBpZiBjaGVjayBvdXQgaXMgcmVxdWlyZWQKLSAgICAgICAgYm9vbGVhbiBjaGVja2Vkb3V0ID0gZmFsc2U7Ci0gICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gdHlwZSA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSBkb2MxLmdldFR5cGUoKTsKLSAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IG5hbWVQcm9wRGVmID0gdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICBpZiAobmFtZVByb3BEZWYuZ2V0VXBkYXRhYmlsaXR5KCkgPT0gVXBkYXRhYmlsaXR5LldIRU5DSEVDS0VET1VUCi0gICAgICAgICAgICAgICAgfHwgKCFkb2MxLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkuY29udGFpbnMoQWN0aW9uLkNBTl9VUERBVEVfUFJPUEVSVElFUykgJiYgQm9vbGVhbi5UUlVFCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHR5cGUuaXNWZXJzaW9uYWJsZSgpKSkpIHsKLSAgICAgICAgICAgIHdvcmtEb2MgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KGRvYzEuY2hlY2tPdXQoKSwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0gICAgICAgICAgICBjaGVja2Vkb3V0ID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgRE9DX05BTUUyKTsKLQotICAgICAgICBPYmplY3RJZCBuZXdJZCA9IHdvcmtEb2MudXBkYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzLCBmYWxzZSk7Ci0gICAgICAgIERvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KG5ld0lkLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZG9jMiwgZ2V0QWxsUHJvcGVydGllcyhkb2MyKSwgIlVwZGF0ZWQgZG9jdW1lbnQgY29tcGxpYW5jZSIpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBuYW1lIGRvZXNuJ3QgbWF0Y2ggdXBkYXRlZCB2YWx1ZSEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhET0NfTkFNRTIsIGRvYzIuZ2V0TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgLy8gZGVsZXRlCi0gICAgICAgIGlmICghd29ya0RvYy5nZXRJZCgpLmVxdWFscyhkb2MyLmdldElkKCkpKSB7Ci0gICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jMik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjYW5jZWwgYSBwb3NzaWJsZSBjaGVjayBvdXQKLSAgICAgICAgaWYgKGNoZWNrZWRvdXQpIHsKLSAgICAgICAgICAgIHdvcmtEb2MuY2FuY2VsQ2hlY2tPdXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZG9jMS5nZXRJZCgpLmVxdWFscyhkb2MyLmdldElkKCkpKSB7Ci0gICAgICAgICAgICBpZiAoZXhpc3RzKGRvYzEpKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvYzEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUZvbGRlcihTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgRm9sZGVyIGZvbGRlciA9IGNyZWF0ZUZvbGRlcihzZXNzaW9uLCB0ZXN0Rm9sZGVyLCBGT0xERVJfTkFNRTEpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBuYW1lIGRvZXNuJ3QgbWF0Y2ggdGhlIGdpdmVuIG5hbWUhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoRk9MREVSX05BTUUxLCBmb2xkZXIuZ2V0TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBGT0xERVJfTkFNRTIpOwotCi0gICAgICAgIE9iamVjdElkIG5ld0lkID0gZm9sZGVyLnVwZGF0ZVByb3BlcnRpZXMocHJvcGVydGllcywgZmFsc2UpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkZvbGRlciBpZCBjaGFuZ2VkIGFmdGVyIG5hbWUgdXBkYXRlISBUaGUgZm9sZGVyIGlkIHNob3VsZCBuZXZlciBjaGFuZ2UhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoZm9sZGVyLmdldElkKCksIG5ld0lkLmdldElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIG5ldyBmb2xkZXIgb2JqZWN0IGFuZCBjaGVjayB0aGUgbmV3IG5hbWUKLSAgICAgICAgZm9sZGVyLnJlZnJlc2goKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgbmFtZSBkb2Vzbid0IG1hdGNoIHVwZGF0ZWQgdmFsdWUhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoRk9MREVSX05BTUUyLCBmb2xkZXIuZ2V0TmFtZSgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIGFnYWluIHdpdGggdGhlIHNhbWUgbmFtZQotICAgICAgICBmb2xkZXIucmVuYW1lKEZPTERFUl9OQU1FMiwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgbmFtZSBkb2Vzbid0IG1hdGNoIHVwZGF0ZWQgdmFsdWUhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoRk9MREVSX05BTUUyLCBmb2xkZXIuZ2V0TmFtZSgpLCBudWxsLCBmKSk7Ci0gICAgICAgIAotICAgICAgICBkZWxldGVPYmplY3QoZm9sZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9XaGl0ZXNwYWNlSW5OYW1lVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2NydWQvV2hpdGVzcGFjZUluTmFtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwMmU0OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvY3J1ZC9XaGl0ZXNwYWNlSW5OYW1lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuY3J1ZDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIFdoaXRlc3BhY2VJbk5hbWVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJXaGl0ZXNwYWNlIGluIE5hbWUgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBkb2N1bWVudHMgd2l0aCBzcGFjZXMgaW4gY21pczpuYW1lLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCBmb2xkZXIKLSAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0Q2VudGVyU3BhY2VTcGFjZShzZXNzaW9uLCB0ZXN0Rm9sZGVyKTsKLSAgICAgICAgICAgIHRlc3RNdWx0aXBsZUNlbnRlclNwYWNlU3BhY2Uoc2Vzc2lvbiwgdGVzdEZvbGRlcik7Ci0gICAgICAgICAgICB0ZXN0TGVhZGluZ1NwYWNlKHNlc3Npb24sIHRlc3RGb2xkZXIpOwotICAgICAgICAgICAgdGVzdFRyYWlsaW5nU3BhY2Uoc2Vzc2lvbiwgdGVzdEZvbGRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdExlYWRpbmdTcGFjZShTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gImxlYWRpbmcudHh0IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgIiAiICsgbmFtZSwgIiIpOwotCi0gICAgICAgICAgICBpZiAoZG9jLmdldE5hbWUoKS5lcXVhbHMoIiAiICsgbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUmVwb3NpdG9yeSBkb2VzIHN1cHBvcnRzIGRvY3VtZW50IG5hbWVzIHdpdGggYSBsZWFkaW5nIHNwYWNlLiIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRvYy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJSZXBvc2l0b3J5IHJlbW92ZXMgbGVhZGluZyBzcGFjZSBmcm9tIGRvY3VtZW50IG5hbWUuIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJSZXBvc2l0b3J5IHJlbmFtZXMgZG9jdW1lbnRzIHdpdGggYSBsZWFkaW5nIHNwYWNlLiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJSZXBvc2l0b3J5IGRvZXMgbm90IHN1cHBvcnQgZG9jdW1lbnQgbmFtZXMgd2l0aCBhIGxlYWRpbmcgc3BhY2UuIEV4Y2VwdGlvbjogIgotICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RUcmFpbGluZ1NwYWNlKFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHRlc3RGb2xkZXIpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAidHJhaWxpbmcudHh0IjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgbmFtZSArICIgIiwgIiIpOwotCi0gICAgICAgICAgICBpZiAoZG9jLmdldE5hbWUoKS5lcXVhbHMobmFtZSArICIgIikpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUmVwb3NpdG9yeSBkb2VzIHN1cHBvcnRzIGRvY3VtZW50IG5hbWVzIHdpdGggYSB0cmFpbGluZyBzcGFjZS4iKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkb2MuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUmVwb3NpdG9yeSByZW1vdmVzIHRyYWlsaW5nIHNwYWNlIGZyb20gZG9jdW1lbnQgbmFtZS4iKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlJlcG9zaXRvcnkgcmVuYW1lcyBkb2N1bWVudHMgd2l0aCBhIHRyYWlsaW5nIHNwYWNlLiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJSZXBvc2l0b3J5IGRvZXMgbm90IHN1cHBvcnQgZG9jdW1lbnQgbmFtZXMgd2l0aCBhIHRyYWlsaW5nIHNwYWNlLiBFeGNlcHRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2VudGVyU3BhY2VTcGFjZShTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gImNlbnRlciBzcGFjZS50eHQiOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCB0ZXN0Rm9sZGVyLCBuYW1lLCAiIik7Ci0KLSAgICAgICAgICAgIGlmIChkb2MuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJSZXBvc2l0b3J5IGRvZXMgc3VwcG9ydHMgZG9jdW1lbnQgbmFtZXMgd2l0aCBhIHNwYWNlLiIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRvYy5nZXROYW1lKCkuZXF1YWxzKCJjZW50ZXJzcGFjZS50eHQiKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUmVwb3NpdG9yeSByZW1vdmVzIHNwYWNlcyBmcm9tIGRvY3VtZW50IG5hbWUuIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJSZXBvc2l0b3J5IHJlbmFtZXMgZG9jdW1lbnRzIHdpdGggYSBzcGFjZS4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUmVwb3NpdG9yeSBkb2VzIG5vdCBzdXBwb3J0IGRvY3VtZW50IG5hbWVzIHdpdGggYSBzcGFjZS4gRXhjZXB0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdE11bHRpcGxlQ2VudGVyU3BhY2VTcGFjZShTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gInR3b2NlbnRlciAgc3BhY2VzLnR4dCI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGNyZWF0ZURvY3VtZW50KHNlc3Npb24sIHRlc3RGb2xkZXIsIG5hbWUsICIiKTsKLQotICAgICAgICAgICAgaWYgKGRvYy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlJlcG9zaXRvcnkgZG9lcyBzdXBwb3J0cyBkb2N1bWVudCBuYW1lcyB3aXRoIG1vcmUgdGhhbiBvbmUgc3VjY2Vzc2l2ZSBzcGFjZXMuIikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZG9jLmdldE5hbWUoKS5lcXVhbHMoInR3b2NlbnRlcnNwYWNlcy50eHQiKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUmVwb3NpdG9yeSByZW1vdmVzIHNwYWNlcyBmcm9tIGRvY3VtZW50IG5hbWUuIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jLmdldE5hbWUoKS5lcXVhbHMoInR3b2NlbnRlciBzcGFjZXMudHh0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlJlcG9zaXRvcnkgY29tYmluZXMgbXVsdGlwbGUgc3BhY2VzIGludG8gb25lIGluIGRvY3VtZW50IG5hbWVzLiIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUmVwb3NpdG9yeSByZW5hbWVzIGRvY3VtZW50cyB3aXRoIGEgc3BhY2UuIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlJlcG9zaXRvcnkgZG9lcyBub3Qgc3VwcG9ydCBkb2N1bWVudCBuYW1lcyB3aXRoIGEgc3BhY2UuIEV4Y2VwdGlvbjogIgotICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2ZpbGluZy9GaWxpbmdUZXN0R3JvdXAuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9maWxpbmcvRmlsaW5nVGVzdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmU1NmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2ZpbGluZy9GaWxpbmdUZXN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuZmlsaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3RHcm91cDsKLQotLyoqCi0gKiBUaGlzIHRlc3QgZ3JvdXAgY29udGFpbnMgbXVsdGlmaWxpbmcgYW5kIHVuZmlsaW5nIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsaW5nVGVzdEdyb3VwIGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdEdyb3VwIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgc2V0TmFtZSgiRmlsaW5nIFRlc3QgR3JvdXAiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIk11bHRpZmlsaW5nIGFuZiBVbmZpbGluZyB0ZXN0cy4iKTsKLQotICAgICAgICBhZGRUZXN0KG5ldyBNdWx0aWZpbGluZ1Rlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFVuZmlsaW5nVGVzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvZmlsaW5nL011bHRpZmlsaW5nVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2ZpbGluZy9NdWx0aWZpbGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1OGQxMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvZmlsaW5nL011bHRpZmlsaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuZmlsaW5nOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogTXVsdGlmaWxpbmcgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIE11bHRpZmlsaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0U2Vzc2lvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiTXVsdGlmaWxpbmcgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyB0d28gZm9sZGVycyBhbmQgYSBkb2N1bWVudCBpbiBvbmUgb2YgdGhlIGZvbGRlcnMsICIKLSAgICAgICAgICAgICAgICArICJhZGRzIHRoZSBkb2N1bWVudCB0byB0aGUgc2Vjb25kIGZvbGRlciBhbmQgdGhlbiByZW1vdmVzIGl0IGFnYWluIGZvciB0aGUgc2Vjb25kIGZvbGRlci4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGlmIChzdXBwb3J0c011bHRpZmlsaW5nKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgICAgICBpbnQgY291bnQxOwotICAgICAgICAgICAgaW50IGNvdW50MjsKLSAgICAgICAgICAgIGludCBwYXJlbnRzOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb2xkZXJzCi0gICAgICAgICAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotICAgICAgICAgICAgICAgIEZvbGRlciBmb2xkZXIxID0gY3JlYXRlRm9sZGVyKHNlc3Npb24sIHRlc3RGb2xkZXIsICJmb2xkZXIxIik7Ci0gICAgICAgICAgICAgICAgRm9sZGVyIGZvbGRlcjIgPSBjcmVhdGVGb2xkZXIoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImZvbGRlcjIiKTsKLQotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBkb2N1bWVudAotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYzEgPSBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCBmb2xkZXIxLCAidGVzdGRvYy50eHQiLCAibXVsdGlmaWxpbmcgdGVzdCIpOwotCi0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrQ2hpbGRyZW4oc2Vzc2lvbiwgZm9sZGVyMSwgIkZvbGRlciAxIGFmdGVyIGNyZWF0ZURvY3VtZW50KCkiKSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrQ2hpbGRyZW4oc2Vzc2lvbiwgZm9sZGVyMiwgIkZvbGRlciAyIGFmdGVyIGNyZWF0ZURvY3VtZW50KCkiKSk7Ci0KLSAgICAgICAgICAgICAgICBjb3VudDEgPSBjb3VudEZvbGRlckNoaWxkcmVuKGZvbGRlcjEpOwotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciAxIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGJ1dCBoYXMgIiArIGNvdW50MSArICIgY2hpbGRyZW4hIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygxLCBjb3VudDEsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGNvdW50MiA9IGNvdW50Rm9sZGVyQ2hpbGRyZW4oZm9sZGVyMik7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIDIgc2hvdWxkIG5vdCBoYXZlIGNoaWxkcmVuIGJ1dCBoYXMgIiArIGNvdW50MiArICIgY2hpbGRyZW4hIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygwLCBjb3VudDIsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIHBhcmVudHMgPSBkb2MxLmdldFBhcmVudHMoKS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc2hvdWxkIGhhdmUgb25lIHBhcmVudCBidXQgaGFzICIgKyBwYXJlbnRzICsgIiBwYXJlbnRzISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgcGFyZW50cywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgLy8gYWRkIHRvIG90aGVyIGZvbGRlcgotICAgICAgICAgICAgICAgIGRvYzEuYWRkVG9Gb2xkZXIoZm9sZGVyMiwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tDaGlsZHJlbihzZXNzaW9uLCBmb2xkZXIxLCAiRm9sZGVyIDEgYWZ0ZXIgYWRkVG9Gb2xkZXIoKSIpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tDaGlsZHJlbihzZXNzaW9uLCBmb2xkZXIyLCAiRm9sZGVyIDIgYWZ0ZXIgYWRkVG9Gb2xkZXIoKSIpKTsKLQotICAgICAgICAgICAgICAgIGNvdW50MSA9IGNvdW50Rm9sZGVyQ2hpbGRyZW4oZm9sZGVyMSk7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIDEgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgY2hpbGQgYnV0IGhhcyAiICsgY291bnQxICsgIiBjaGlsZHJlbiEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDEsIGNvdW50MSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgY291bnQyID0gY291bnRGb2xkZXJDaGlsZHJlbihmb2xkZXIyKTsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgMiBzaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBjaGlsZCBidXQgaGFzICIgKyBjb3VudDIgKyAiIGNoaWxkcmVuISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgY291bnQyLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICBwYXJlbnRzID0gZG9jMS5nZXRQYXJlbnRzKCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IHNob3VsZCBoYXZlIHR3byBwYXJlbnRzIGJ1dCBoYXMgIiArIHBhcmVudHMgKyAiIHBhcmVudHMhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygyLCBwYXJlbnRzLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBmaXJzdCBmb2xkZXIKLSAgICAgICAgICAgICAgICBkb2MxLnJlbW92ZUZyb21Gb2xkZXIoZm9sZGVyMik7Ci0KLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tDaGlsZHJlbihzZXNzaW9uLCBmb2xkZXIxLCAiRm9sZGVyIDEgYWZ0ZXIgcmVtb3ZlRnJvbUZvbGRlcigpIikpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja0NoaWxkcmVuKHNlc3Npb24sIGZvbGRlcjIsICJGb2xkZXIgMiBhZnRlciByZW1vdmVGcm9tRm9sZGVyKCkiKSk7Ci0KLSAgICAgICAgICAgICAgICBjb3VudDEgPSBjb3VudEZvbGRlckNoaWxkcmVuKGZvbGRlcjEpOwotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciAxIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGNoaWxkIGJ1dCBoYXMgIiArIGNvdW50MSArICIgY2hpbGRyZW4hIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygxLCBjb3VudDEsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGNvdW50MiA9IGNvdW50Rm9sZGVyQ2hpbGRyZW4oZm9sZGVyMik7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIDIgc2hvdWxkIG5vdCBoYXZlIGNoaWxkcmVuIGJ1dCBoYXMgIiArIGNvdW50MiArICIgY2hpbGRyZW4hIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygwLCBjb3VudDIsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIHBhcmVudHMgPSBkb2MxLmdldFBhcmVudHMoKS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc2hvdWxkIGhhdmUgb25lIHBhcmVudCBidXQgaGFzICIgKyBwYXJlbnRzICsgIiBwYXJlbnRzISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgcGFyZW50cywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGV2ZXJ5dGhpbmcKLSAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jMSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGZvbGRlcjIpOwotICAgICAgICAgICAgICAgIGRlbGV0ZU9iamVjdChmb2xkZXIxKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAKLSAgICAgICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJNdWx0aWZsaW5nIG5vdCBzdXBwb3J0ZWQuIFRlc3QgU2tpcHBlZCEiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c011bHRpZmlsaW5nKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5ID0gc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmlzTXVsdGlmaWxpbmdTdXBwb3J0ZWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5pc011bHRpZmlsaW5nU3VwcG9ydGVkKCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2ZpbGluZy9VbmZpbGluZ1Rlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9maWxpbmcvVW5maWxpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGE0OGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL2ZpbGluZy9VbmZpbGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmZpbGluZzsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0OwotCi0vKioKLSAqIFVuZmlsaW5nIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmZpbGluZ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIlVuZmlsaW5nIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgYSBmb2xkZXIgYW5kIGEgZG9jdW1lbnQsIHJlbW92ZXMgdGhlIGRvY3VtZW50IGZyb20gdGhlIGZvbGRlciBhbmQgdGhlbiBhZGRzIGl0IGFnYWluLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHN1cHBvcnRzVW5maWxpbmcoc2Vzc2lvbikpIHsKLSAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIGludCBwYXJlbnRzOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb2xkZXJzCi0gICAgICAgICAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotICAgICAgICAgICAgICAgIEZvbGRlciBmb2xkZXIxID0gY3JlYXRlRm9sZGVyKHNlc3Npb24sIHRlc3RGb2xkZXIsICJmb2xkZXIxIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MxID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgZm9sZGVyMSwgInRlc3Rkb2MudHh0IiwgInVuZmlsaW5nIHRlc3QiKTsKLQotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja0NoaWxkcmVuKHNlc3Npb24sIGZvbGRlcjEsICJGb2xkZXIgYWZ0ZXIgY3JlYXRlRG9jdW1lbnQoKSIpKTsKLQotICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnRGb2xkZXJDaGlsZHJlbihmb2xkZXIxKTsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgY2hpbGQgYnV0IGhhcyAiICsgY291bnQgKyAiIGNoaWxkcmVuISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgY291bnQsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIHBhcmVudHMgPSBkb2MxLmdldFBhcmVudHMoKS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc2hvdWxkIGhhdmUgb25lIHBhcmVudCBidXQgaGFzICIgKyBwYXJlbnRzICsgIiBwYXJlbnRzISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgcGFyZW50cywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gZm9sZGVyCi0gICAgICAgICAgICAgICAgZG9jMS5yZW1vdmVGcm9tRm9sZGVyKGZvbGRlcjEpOwotCi0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrQ2hpbGRyZW4oc2Vzc2lvbiwgZm9sZGVyMSwgIkZvbGRlciBhZnRlciByZW1vdmVGcm9tRm9sZGVyKCkiKSk7Ci0KLSAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50Rm9sZGVyQ2hpbGRyZW4oZm9sZGVyMSk7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIHNob3VsZCBoYXZlIG5vIGNoaWxkcmVuIGJ1dCBoYXMgIiArIGNvdW50ICsgIiBjaGlsZHJlbiEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDAsIGNvdW50LCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICBwYXJlbnRzID0gZG9jMS5nZXRQYXJlbnRzKCkuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IHNob3VsZCBub3QgaGF2ZSBubyBwYXJlbnRzIGJ1dCBoYXMgIiArIHBhcmVudHMgKyAiIHBhcmVudHMhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygwLCBwYXJlbnRzLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdG8gZm9sZGVyIGFnYWluCi0gICAgICAgICAgICAgICAgZG9jMS5hZGRUb0ZvbGRlcihmb2xkZXIxLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja0NoaWxkcmVuKHNlc3Npb24sIGZvbGRlcjEsICJGb2xkZXIgYWZ0ZXIgYWRkVG9Gb2xkZXIoKSIpKTsKLQotICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnRGb2xkZXJDaGlsZHJlbihmb2xkZXIxKTsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgc2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgY2hpbGQgYnV0IGhhcyAiICsgY291bnQgKyAiIGNoaWxkcmVuISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgY291bnQsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIHBhcmVudHMgPSBkb2MxLmdldFBhcmVudHMoKS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc2hvdWxkIGhhdmUgb25lIHBhcmVudCBidXQgaGFzICIgKyBwYXJlbnRzICsgIiBwYXJlbnRzISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgcGFyZW50cywgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIGV2ZXJ5dGhpbmcKLSAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jMSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGZvbGRlcjEpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cAotICAgICAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlVuZmlsaW5nIG5vdCBzdXBwb3J0ZWQuIFRlc3QgU2tpcHBlZCEiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c1VuZmlsaW5nKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvc2l0b3J5ID0gc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpOwotCi0gICAgICAgIGlmIChyZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmlzVW5maWxpbmdTdXBwb3J0ZWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5pc1VuZmlsaW5nU3VwcG9ydGVkKCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3F1ZXJ5L0Fic3RyYWN0UXVlcnlUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvQWJzdHJhY3RRdWVyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5ZmMzNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvQWJzdHJhY3RRdWVyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMucXVlcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFF1ZXJ5VGVzdCBleHRlbmRzIEFic3RyYWN0U2Vzc2lvblRlc3QgewotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNRdWVyeShTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeSA9IHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRRdWVyeUNhcGFiaWxpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRRdWVyeUNhcGFiaWxpdHkoKSAhPSBDYXBhYmlsaXR5UXVlcnkuTk9ORTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Z1bGx0ZXh0T25seShTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeSA9IHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRRdWVyeUNhcGFiaWxpdHkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRRdWVyeUNhcGFiaWxpdHkoKSA9PSBDYXBhYmlsaXR5UXVlcnkuRlVMTFRFWFRPTkxZOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9xdWVyeS9Db250ZW50Q2hhbmdlc1Ntb2tlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3F1ZXJ5L0NvbnRlbnRDaGFuZ2VzU21va2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTZlMGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3F1ZXJ5L0NvbnRlbnRDaGFuZ2VzU21va2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5xdWVyeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLklORk87Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5TS0lQUEVEOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DaGFuZ2VFdmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlDaGFuZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2hhbmdlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0OwotCi0vKioKLSAqIENvbnRlbnQgQ2hhbmdlcyBzbW9rZSB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENoYW5nZXNTbW9rZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIkNvbnRlbnQgQ2hhbmdlcyBTbW9rZSBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDYWxscyBnZXRDb250ZW50Q2hhbmdlcygpLiBJdCBkb2VzIG5vdCBjaGVjayBpZiB0aGUgcmVzdWx0cyBhcmUgY29ycmVjdCEiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaWYgKHN1cHBvcnRzQ29udGVudENoYW5nZXMoc2Vzc2lvbikpIHsKLSAgICAgICAgICAgIC8vIGdldCBhIHBhZ2Ugb2YgMTAwIGVudHJpZXMKLSAgICAgICAgICAgIENoYW5nZUV2ZW50cyBldmVudHMgPSBzZXNzaW9uLmdldENvbnRlbnRDaGFuZ2VzKG51bGwsIHRydWUsIDEwMDAsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDaGFuZ2UgZXZlbnRzIGFyZSBudWxsISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoZXZlbnRzLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgIGlmIChldmVudHMgIT0gbnVsbCAmJiBldmVudHMuZ2V0Q2hhbmdlRXZlbnRzKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgaWYgKGdldEJpbmRpbmcoKSAhPSBCaW5kaW5nVHlwZS5BVE9NUFVCKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBBdG9tcFB1YiBiaW5kaW5nIGRvZXMgbm90IHJldHVybiBhIGNoYW5nZSBsb2cgdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ2hhbmdlIGxvZyB0b2tlbiBpcyBudWxsISIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChldmVudHMuZ2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oKSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFuIE9wZW5DTUlTIGJhc2VkIHNlcnZlciB0cmFuc3BvcnRzIHRoZSBjaGFuZ2UgbG9nIHRva2VuCi0gICAgICAgICAgICAgICAgICAgIC8vIGluIHByb3ByaWV0YXJ5IHdheS4KLSAgICAgICAgICAgICAgICAgICAgQ21pc1Rlc3RSZXN1bHQgb2NzID0gY3JlYXRlUmVzdWx0KElORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW5nZSBsb2cgdG9rZW4gaXMgbnVsbC4gVGhlIEF0b21QdWIgYmluZGluZyBkb2VzIG5vdCByZXR1cm4gaXQuIik7Ci0gICAgICAgICAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IG5vY3MgPSBjcmVhdGVSZXN1bHQoSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlIGxvZyB0b2tlbiBpcyBub3QgbnVsbC4gUHJvYmFibHkgYW4gT3BlbkNNSVMgYmFzZWQgc2VydmVyLiIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChldmVudHMuZ2V0TGF0ZXN0Q2hhbmdlTG9nVG9rZW4oKSwgb2NzLCBub2NzKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChDaGFuZ2VFdmVudCBldmVudCA6IGV2ZW50cy5nZXRDaGFuZ2VFdmVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBjaGVja0NoYW5nZUV2ZW50KHNlc3Npb24sIGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCBhbGwgZW50cmllcwotICAgICAgICAgICAgZm9yIChDaGFuZ2VFdmVudCBldmVudCA6IHNlc3Npb24uZ2V0Q29udGVudENoYW5nZXMobnVsbCwgdHJ1ZSwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQykpIHsKLSAgICAgICAgICAgICAgICBjaGVja0NoYW5nZUV2ZW50KHNlc3Npb24sIGV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIkNvbnRlbnQgQ2hhbmdlcyBub3Qgc3VwcG9ydGVkLiBUZXN0IFNraXBwZWQhIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDb250ZW50Q2hhbmdlcyhTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgUmVwb3NpdG9yeUluZm8gcmVwb3NpdG9yeSA9IHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKTsKLQotICAgICAgICBpZiAocmVwb3NpdG9yeS5nZXRDYXBhYmlsaXRpZXMoKS5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldENhcGFiaWxpdGllcygpLmdldENoYW5nZXNDYXBhYmlsaXR5KCkgIT0gQ2FwYWJpbGl0eUNoYW5nZXMuTk9ORTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NoYW5nZUV2ZW50KFNlc3Npb24gc2Vzc2lvbiwgQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJPYmplY3QgSWQgaXMgbm90IHNldCEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydFN0cmluZ05vdEVtcHR5KGV2ZW50LmdldE9iamVjdElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDaGFuZ2UgVHlwZSBpcyBub3Qgc2V0ISBJZDogIiArIGV2ZW50LmdldE9iamVjdElkKCkpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChldmVudC5nZXRDaGFuZ2VUeXBlKCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJDaGFuZ2UgVGltZSBpcyBub3Qgc2V0ISBJZDogIiArIGV2ZW50LmdldE9iamVjdElkKCkpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChldmVudC5nZXRDaGFuZ2VUaW1lKCksIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAoZXZlbnQuZ2V0T2JqZWN0SWQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IENoYW5nZVR5cGUuREVMRVRFRCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0T2JqZWN0KGV2ZW50LmdldE9iamVjdElkKCksIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW5nZSBldmVudCBpbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3QgaGFzIGJlZW4gZGVsZXRlZCBidXQgaXQgc3RpbGwgZXhpc3RzLiBJZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBldmVudC5nZXRPYmplY3RJZCgpKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENtaXNPYmplY3Qgb2JqZWN0ID0gc2Vzc2lvbi5nZXRPYmplY3QoZXZlbnQuZ2V0T2JqZWN0SWQoKSwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCBvYmplY3QsIGdldEFsbFByb3BlcnRpZXMob2JqZWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0IGNoZWNrLiBJZDogIiArIGV2ZW50LmdldE9iamVjdElkKCkpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QgbWlnaHQgaGF2ZSBiZWVuIGRlbGV0ZWQgbGF0ZXIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlGb3JPYmplY3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9xdWVyeS9RdWVyeUZvck9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdlNmY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9xdWVyeS9RdWVyeUZvck9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMucXVlcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5TS0lQUEVEOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5RdWVyeVJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5U3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLQotcHVibGljIGNsYXNzIFF1ZXJ5Rm9yT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3RRdWVyeVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlQgPSAiVENLIHRlc3QgY29udGVudC4iOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiUXVlcnkgRm9yIE9iamVjdCBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGEgZm9sZGVyIGFuZCBhIGRvY3VtZW50LCBxdWVyaWVzIHRoZW0gYnkgb2JqZWN0IGlkLCBhbmQgZGVsZXRlcyBib3RoLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHN1cHBvcnRzUXVlcnkoc2Vzc2lvbikgJiYgIWlzRnVsbHRleHRPbmx5KHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZXN0IGZvbGRlcgotICAgICAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGNyZWF0ZURvY3VtZW50KHNlc3Npb24sIHRlc3RGb2xkZXIsICJ0ZXN0ZG9jLnR4dCIsIENPTlRFTlQpOwotCi0gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgZm9sZGVyCi0gICAgICAgICAgICAgICAgcnVuRm9sZGVyUXVlcnkoc2Vzc2lvbiwgdGVzdEZvbGRlcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgICAgIHJ1bkRvY3VtZW50UXVlcnkoc2Vzc2lvbiwgZG9jdW1lbnQpOwotCi0gICAgICAgICAgICAgICAgLy8gY2xlYW4gdXAKLSAgICAgICAgICAgICAgICBkb2N1bWVudC5kZWxldGUodHJ1ZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdGVzdCBmb2xkZXIKLSAgICAgICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIk1ldGFkYXRhIHF1ZXJ5IG5vdCBzdXBwb3J0ZWQuIFRlc3QgU2tpcHBlZCEiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5Gb2xkZXJRdWVyeShTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyKSB7Ci0gICAgICAgIGlmICghQm9vbGVhbi5UUlVFLmVxdWFscyh0ZXN0Rm9sZGVyLmdldFR5cGUoKS5pc1F1ZXJ5YWJsZSgpKSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiRm9sZGVyIHR5cGUgJyIgKyB0ZXN0Rm9sZGVyLmdldFR5cGUoKS5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIicgaXMgbm90IHF1ZXJ5YWJsZS4gRm9sZGVyIHF1ZXJ5IHRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIFF1ZXJ5U3RhdGVtZW50W10gc3RhdGVtZW50cyA9IG5ldyBRdWVyeVN0YXRlbWVudFtdIHsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmNyZWF0ZVF1ZXJ5U3RhdGVtZW50KCJTRUxFQ1QgKiBGUk9NID8gV0hFUkUgPyA9ID8iKSwKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmNyZWF0ZVF1ZXJ5U3RhdGVtZW50KCJTRUxFQ1QgKiBGUk9NID8gV0hFUkUgPyBJTiAoPykiKSB9OwotCi0gICAgICAgIGZvciAoUXVlcnlTdGF0ZW1lbnQgc3RhdGVtZW50IDogc3RhdGVtZW50cykgewotICAgICAgICAgICAgc3RhdGVtZW50LnNldFR5cGUoMSwgdGVzdEZvbGRlci5nZXRUeXBlKCkpOwotICAgICAgICAgICAgc3RhdGVtZW50LnNldFByb3BlcnR5KDIsIHRlc3RGb2xkZXIuZ2V0VHlwZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKSk7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuc2V0U3RyaW5nKDMsIHRlc3RGb2xkZXIuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJGb2xkZXIgcXVlcnk6ICIgKyBzdGF0ZW1lbnQudG9RdWVyeVN0cmluZygpKSk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKFF1ZXJ5UmVzdWx0IHFyIDogc3RhdGVtZW50LnF1ZXJ5KGZhbHNlKSkgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSBxci5nZXRQcm9wZXJ0eVZhbHVlQnlRdWVyeU5hbWUoImNtaXM6b2JqZWN0SWQiKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBxdWVyeSByZXR1cm5lZCB1bmV4cGVjdGVkIG9iamVjdC4gSWQ6ICIgKyBvYmplY3RJZCk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyh0ZXN0Rm9sZGVyLmdldElkKCksIG9iamVjdElkLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkZvbGRlciBxdWVyeSBzaG91bGQgcmV0dXJuIGV4YWN0bHkgb25lIGhpdCwgYnV0IHJldHVybmVkICIgKyBjb3VudCArICIuIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDEsIGNvdW50LCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5Eb2N1bWVudFF1ZXJ5KFNlc3Npb24gc2Vzc2lvbiwgRG9jdW1lbnQgdGVzdERvY3VtZW50KSB7Ci0gICAgICAgIGlmICghQm9vbGVhbi5UUlVFLmVxdWFscyh0ZXN0RG9jdW1lbnQuZ2V0VHlwZSgpLmlzUXVlcnlhYmxlKCkpKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJEb2N1bWVudCB0eXBlICciICsgdGVzdERvY3VtZW50LmdldFR5cGUoKS5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIicgaXMgbm90IHF1ZXJ5YWJsZS4gRG9jdW1lbnQgcXVlcnkgdGVzdCBza2lwcGVkISIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgUXVlcnlTdGF0ZW1lbnRbXSBzdGF0ZW1lbnRzID0gbmV3IFF1ZXJ5U3RhdGVtZW50W10gewotICAgICAgICAgICAgICAgIHNlc3Npb24uY3JlYXRlUXVlcnlTdGF0ZW1lbnQoIlNFTEVDVCAqIEZST00gPyBXSEVSRSA/ID0gPyIpLAotICAgICAgICAgICAgICAgIHNlc3Npb24uY3JlYXRlUXVlcnlTdGF0ZW1lbnQoIlNFTEVDVCAqIEZST00gPyBXSEVSRSA/IElOICg/KSIpIH07Ci0KLSAgICAgICAgZm9yIChRdWVyeVN0YXRlbWVudCBzdGF0ZW1lbnQgOiBzdGF0ZW1lbnRzKSB7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuc2V0VHlwZSgxLCB0ZXN0RG9jdW1lbnQuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIHN0YXRlbWVudC5zZXRQcm9wZXJ0eSgyLCB0ZXN0RG9jdW1lbnQuZ2V0VHlwZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKSk7Ci0gICAgICAgICAgICBzdGF0ZW1lbnQuc2V0U3RyaW5nKDMsIHRlc3REb2N1bWVudC5nZXRJZCgpKTsKLQotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIkRvY3VtZW50IHF1ZXJ5OiAiICsgc3RhdGVtZW50LnRvUXVlcnlTdHJpbmcoKSkpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxciA6IHN0YXRlbWVudC5xdWVyeShmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gcXIuZ2V0UHJvcGVydHlWYWx1ZUJ5UXVlcnlOYW1lKCJjbWlzOm9iamVjdElkIik7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBxdWVyeSByZXR1cm5lZCB1bmV4cGVjdGVkIG9iamVjdC4gSWQ6ICIgKyBvYmplY3RJZCk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyh0ZXN0RG9jdW1lbnQuZ2V0SWQoKSwgb2JqZWN0SWQsIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgcXVlcnkgc2hvdWxkIHJldHVybiBleGFjdGx5IG9uZSBoaXQsIGJ1dCByZXR1cm5lZCAiICsgY291bnQgKyAiLiIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygxLCBjb3VudCwgbnVsbCwgZikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3F1ZXJ5L1F1ZXJ5SW5Gb2xkZXJUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlJbkZvbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmYTRiMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlJbkZvbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLnF1ZXJ5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5GaWxlYWJsZUNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUXVlcnlTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotCi1wdWJsaWMgY2xhc3MgUXVlcnlJbkZvbGRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFF1ZXJ5VGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVCA9ICJUQ0sgdGVzdCBjb250ZW50LiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVWRUwxX0RPQ1MgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRVZFTDFfRk9MREVSUyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExFVkVMMl9ET0NTID0gNTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEVWRUwyX0ZPTERFUlMgPSA1OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiUXVlcnkgSU5fRk9MREVSIGFuZCBJTl9UUkVFIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIlBlcmZvcm1zIElOX0ZPTERFUiBhbmQgSU5fVFJFRSBxdWVyaWVzLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHN1cHBvcnRzUXVlcnkoc2Vzc2lvbikgJiYgIWlzRnVsbHRleHRPbmx5KHNlc3Npb24pKSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZXN0IGZvbGRlcgotICAgICAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHRvcExldmVsRG9jcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiB0b3BMZXZlbEZvbGRlcnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnRzCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMRVZFTDFfRE9DUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IG5ld0RvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImRvYyIgKyBpLCBDT05URU5UKTsKLSAgICAgICAgICAgICAgICAgICAgdG9wTGV2ZWxEb2NzLmFkZChuZXdEb2N1bWVudC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9sZGVycwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTEVWRUwxX0ZPTERFUlM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBGb2xkZXIgbmV3Rm9sZGVyID0gY3JlYXRlRm9sZGVyKHNlc3Npb24sIHRlc3RGb2xkZXIsICJmb2xkZXIiICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHRvcExldmVsRm9sZGVycy5hZGQobmV3Rm9sZGVyLmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTEVWRUwyX0RPQ1M7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgbmV3Rm9sZGVyLCAiZG9jIiArIGosIENPTlRFTlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBMRVZFTDJfRk9MREVSUzsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXIoc2Vzc2lvbiwgbmV3Rm9sZGVyLCAiZm9sZGVyIiArIGopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZG9RdWVyeShzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiY21pczpkb2N1bWVudCIsIGZhbHNlLCB0b3BMZXZlbERvY3MsIHRvcExldmVsRm9sZGVycyk7Ci0gICAgICAgICAgICAgICAgZG9RdWVyeShzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiY21pczpkb2N1bWVudCIsIHRydWUsIHRvcExldmVsRG9jcywgdG9wTGV2ZWxGb2xkZXJzKTsKLSAgICAgICAgICAgICAgICBkb1F1ZXJ5KHNlc3Npb24sIHRlc3RGb2xkZXIsICJjbWlzOmZvbGRlciIsIGZhbHNlLCB0b3BMZXZlbERvY3MsIHRvcExldmVsRm9sZGVycyk7Ci0gICAgICAgICAgICAgICAgZG9RdWVyeShzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiY21pczpmb2xkZXIiLCB0cnVlLCB0b3BMZXZlbERvY3MsIHRvcExldmVsRm9sZGVycyk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdGVzdCBmb2xkZXIKLSAgICAgICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJNZXRhZGF0YSBxdWVyeSBub3Qgc3VwcG9ydGVkLiBUZXN0IFNraXBwZWQhIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvUXVlcnkoU2Vzc2lvbiBzZXNzaW9uLCBPYmplY3RJZCB0ZXN0Rm9sZGVyLCBTdHJpbmcgdHlwZSwgYm9vbGVhbiBkZWVwLCBTZXQ8U3RyaW5nPiB0b3BMZXZlbERvY3MsCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiB0b3BMZXZlbEZvbGRlcnMpIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBTdHJpbmcgaW5XaGF0ID0gKGRlZXAgPyAiSU5fVFJFRSIgOiAiSU5fRk9MREVSIik7Ci0KLSAgICAgICAgUXVlcnlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gc2Vzc2lvbi5jcmVhdGVRdWVyeVN0YXRlbWVudCgiU0VMRUNUID8gRlJPTSA/IFdIRVJFICIgKyBpbldoYXQgKyAiKD8pIik7Ci0gICAgICAgIHN0YXRlbWVudC5zZXRQcm9wZXJ0eSgxLCB0eXBlLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpOwotICAgICAgICBzdGF0ZW1lbnQuc2V0VHlwZSgyLCB0eXBlKTsKLSAgICAgICAgc3RhdGVtZW50LnNldFN0cmluZygzLCB0ZXN0Rm9sZGVyLmdldElkKCkpOwotCi0gICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJRdWVyeTogIiArIHN0YXRlbWVudC50b1F1ZXJ5U3RyaW5nKCkpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxciA6IHN0YXRlbWVudC5xdWVyeShmYWxzZSkuZ2V0UGFnZSgxMDApKSB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IHFyLmdldFByb3BlcnR5VmFsdWVCeVF1ZXJ5TmFtZSgiY21pczpvYmplY3RJZCIpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCBpbldoYXQgKyAiIHF1ZXJ5IHJldHVybmVkIGFuIGludmFsaWQgb2JqZWN0IElEISIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRTdHJpbmdOb3RFbXB0eShvYmplY3RJZCwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgRmlsZWFibGVDbWlzT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gKEZpbGVhYmxlQ21pc09iamVjdCkgc2Vzc2lvbi5nZXRPYmplY3Qob2JqZWN0SWQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBvbmYpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCBpbldoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcXVlcnkgcmV0dXJuZWQgYW4gb2JqZWN0IElEIG9mIGFuIG9iamVjdCB0aGF0IGRvZXNuJ3QgZXhpc3QhIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZGVlcCAmJiBvYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsIGluV2hhdCArICIgcXVlcnkgcmV0dXJuZWQgYW4gb2JqZWN0IHRoYXQgc2hvdWxkIG5vdCBiZSB0aGVyZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzVHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZXZlbERvY3MuY29udGFpbnMob2JqZWN0LmdldElkKCkpIHx8IHRvcExldmVsRm9sZGVycy5jb250YWlucyhvYmplY3QuZ2V0SWQoKSksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRm9sZGVyIHBhcmVudCA6IG9iamVjdC5nZXRQYXJlbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0Rm9sZGVyLmdldElkKCkuZXF1YWxzKHBhcmVudC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgaW5XaGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBxdWVyeSByZXR1cm5lZCBhbiBvYmplY3QsIHdoaWNoIGhhc24ndCB0aGUgdGVzdCBmb2xkZXIgYXMgYSBwYXJlbnQgZm9sZGVyISIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIkhpdHM6ICIgKyBjb3VudCkpOwotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgIGluV2hhdCArICIgcXVlcnkgZmFpbGVkOiAiICsgZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgZmFsc2UpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9xdWVyeS9RdWVyeUxpa2VUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlMaWtlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjEyZmQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9xdWVyeS9RdWVyeUxpa2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy5xdWVyeTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci0KLS8qKgotICogUXVlcnkgTElLRSB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgUXVlcnlMaWtlVGVzdCBleHRlbmRzIEFic3RyYWN0UXVlcnlUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIlRDSyB0ZXN0IGNvbnRlbnQuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV9TSVpFID0gMTA7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJRdWVyeSBMSUtFIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIlBlcmZvcm1zIGEgTElLRSBxdWVyeSBhbmQgY2hlY2tzIGlmIG9ubHkgbWF0Y2hpbmcgb2JqZWN0cyBhcmUgcmV0dXJuZWQuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBpZiAoc3VwcG9ydHNRdWVyeShzZXNzaW9uKSAmJiAhaXNGdWxsdGV4dE9ubHkoc2Vzc2lvbikpIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBGb2xkZXIgdGVzdEZvbGRlciA9IGNyZWF0ZVRlc3RGb2xkZXIoc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjaGFyIGMgPSAnYSc7IGMgPD0gJ3onOyBjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgYyArICJEb2N1bWVudCIsIENPTlRFTlQpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXIoc2Vzc2lvbiwgdGVzdEZvbGRlciwgYyArICJGb2xkZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IGNvbnRleHQgPSBzZXNzaW9uLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZpbHRlclN0cmluZygiY21pczpuYW1lLGNtaXM6Y3JlYXRpb25EYXRlIik7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRDYWNoZUVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5jbHVkZUFjbHMoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5jbHVkZVBhdGhTZWdtZW50cyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbmNsdWRlUG9saWNpZXMoZmFsc2UpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5jbHVkZVJlbGF0aW9uc2hpcHMoSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRSZW5kaXRpb25GaWx0ZXJTdHJpbmcoImNtaXM6bm9uZSIpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0T3JkZXJCeSgiY21pczpjcmVhdGlvbkRhdGUiKTsKLQotICAgICAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGNoYXIgYyA9ICdhJzsgYyA8PSAneic7IGMrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBxdWVyeSBkb2N1bWVudHMKLSAgICAgICAgICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAgPSBMb25nLk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBjb3VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChDbWlzT2JqZWN0IG8gOiBzZXNzaW9uLnF1ZXJ5T2JqZWN0cygiY21pczpkb2N1bWVudCIsICJjbWlzOm5hbWUgTElLRSAnIiArIGMgKyAiJSciLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KS5nZXRQYWdlKFBBR0VfU0laRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uZ2V0TmFtZSgpID09IG51bGwgfHwgby5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50cyB3aXRob3V0IG5hbWUgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCBieSB0aGlzIHF1ZXJ5ISBEb2N1bWVudCBJRDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG8uZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBuYW1lIHNob3VsZCBzdGFydCB3aXRoICciICsgYyArICInIGJ1dCB0aGUgbmFtZSBpcyAnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvLmdldE5hbWUoKSArICInLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoYywgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG8uZ2V0TmFtZSgpLmNoYXJBdCgwKSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uZ2V0Q3JlYXRpb25EYXRlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBkb2N1bWVudCB3aXRob3V0IGNyZWF0aW9uIGRhdGUhIERvY3VtZW50IElEOiAiICsgby5nZXRJZCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeSByZXN1bHRzIHNob3VsZCBiZSBvcmRlcmVkIGJ5IGNtaXM6Y3JlYXRpb25EYXRlIGJ1dCB0aGV5IGFyZSBub3QhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzVHJ1ZSh0aW1lc3RhbXAgPD0gby5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lSW5NaWxsaXMoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gby5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk5vIGRvY3VtZW50cyBzdGFydGluZyB3aXRoICciICsgYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgaGF2ZSBiZWVuIGZvdW5kLCBidXQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUhIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUoY291bnQgPiAwLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQSBwYWdlIG9mICIgKyBQQUdFX1NJWkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcXVlcnkgaGl0cyBoYXMgYmVlbiByZXF1ZXN0ZWQsIGJ1dCB0aGUgcmVwb3NpdG9yeSByZXR1cm5lZCAiICsgY291bnQgKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGNvdW50IDw9IFBBR0VfU0laRSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHF1ZXJ5IGZvbGRlcnMKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gTG9uZy5NSU5fVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKENtaXNPYmplY3QgbyA6IHNlc3Npb24ucXVlcnlPYmplY3RzKCJjbWlzOmZvbGRlciIsICJjbWlzOm5hbWUgTElLRSAnIiArIGMgKyAiJSciLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KS5nZXRQYWdlKFBBR0VfU0laRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uZ2V0TmFtZSgpID09IG51bGwgfHwgby5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb2xkZXIgd2l0aG91dCBuYW1lIHNob3VsZCBub3QgYmUgcmV0dXJuZWQgYnkgdGhpcyBxdWVyeSEgRm9sZGVyIElEOiAiICsgby5nZXRJZCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb2xkZXIgbmFtZSBzaG91bGQgc3RhcnQgd2l0aCAnIiArIGMgKyAiJyBidXQgdGhlIG5hbWUgaXMgJyIgKyBvLmdldE5hbWUoKSArICInLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoYywgQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG8uZ2V0TmFtZSgpLmNoYXJBdCgwKSksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uZ2V0Q3JlYXRpb25EYXRlKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBmb2xkZXIgd2l0aG91dCBjcmVhdGlvbiBkYXRlISBGb2xkZXIgSUQ6ICIgKyBvLmdldElkKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5IHJlc3VsdHMgc2hvdWxkIGJlIG9yZGVyZWQgYnkgY21pczpjcmVhdGlvbkRhdGUgYnV0IHRoZXkgYXJlIG5vdCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKHRpbWVzdGFtcCA8PSBvLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWVJbk1pbGxpcygpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBvLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWVJbk1pbGxpcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTm8gZm9sZGVycyBzdGFydGluZyB3aXRoICciICsgYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgaGF2ZSBiZWVuIGZvdW5kLCBidXQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUhIik7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUoY291bnQgPiAwLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQSBwYWdlIG9mICIgKyBQQUdFX1NJWkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcXVlcnkgaGl0cyBoYXMgYmVlbiByZXF1ZXN0ZWQsIGJ1dCB0aGUgcmVwb3NpdG9yeSByZXR1cm5lZCAiICsgY291bnQgKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGNvdW50IDw9IFBBR0VfU0laRSwgbnVsbCwgZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVsZXRlIHRoZSB0ZXN0IGZvbGRlcgotICAgICAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIk1ldGFkYXRhIHF1ZXJ5IG5vdCBzdXBwb3J0ZWQuIFRlc3QgU2tpcHBlZCEiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlSb290Rm9sZGVyVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3F1ZXJ5L1F1ZXJ5Um9vdEZvbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlNDZkZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlSb290Rm9sZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMucXVlcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5TS0lQUEVEOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUXVlcnlTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotCi0vKioKLSAqIFJvb3QgZm9sZGVyIHF1ZXJ5IHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyeVJvb3RGb2xkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RRdWVyeVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiUXVlcnkgUm9vdCBGb2xkZXIgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiUGVyZm9ybXMgYSBxdWVyeSB0aGF0IHNob3VsZCByZXR1cm4gdGhlIHJvb3QgZm9sZGVyIG5hbWUgYW5kIGlkLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHN1cHBvcnRzUXVlcnkoc2Vzc2lvbikgJiYgIWlzRnVsbHRleHRPbmx5KHNlc3Npb24pKSB7Ci0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhzZXNzaW9uLmdldFJvb3RGb2xkZXIoKS5nZXRUeXBlKCkuaXNRdWVyeWFibGUoKSkpIHsKLSAgICAgICAgICAgICAgICBxdWVyeUJ5SWQoc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgcXVlcnlCeURhdGUoc2Vzc2lvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlJvb3QgZm9sZGVyIHR5cGUgKCIgKyBzZXNzaW9uLmdldFJvb3RGb2xkZXIoKS5nZXRUeXBlKCkuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBpcyBub3QgcXVlcnlhYmxlLiBUZXN0IFNraXBwZWQhIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiTWV0YWRhdGEgcXVlcnkgbm90IHN1cHBvcnRlZC4gVGVzdCBTa2lwcGVkISIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHF1ZXJ5QnlJZChTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBTdHJpbmcgdGVzdFR5cGUgPSAiY21pczpmb2xkZXIiOwotCi0gICAgICAgIEZvbGRlciByb290Rm9sZGVyID0gc2Vzc2lvbi5nZXRSb290Rm9sZGVyKCk7Ci0KLSAgICAgICAgUXVlcnlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gc2Vzc2lvbgotICAgICAgICAgICAgICAgIC5jcmVhdGVRdWVyeVN0YXRlbWVudCgiU0VMRUNUID8gQVMgZm9sZGVyTmFtZSwgPyBBUyBmb2xkZXJJZCBGUk9NID8gV0hFUkUgPyA9ID8iKTsKLQotICAgICAgICBzdGF0ZW1lbnQuc2V0UHJvcGVydHkoMSwgdGVzdFR5cGUsIFByb3BlcnR5SWRzLk5BTUUpOwotICAgICAgICBzdGF0ZW1lbnQuc2V0UHJvcGVydHkoMiwgdGVzdFR5cGUsIFByb3BlcnR5SWRzLk9CSkVDVF9JRCk7Ci0gICAgICAgIHN0YXRlbWVudC5zZXRUeXBlKDMsIHRlc3RUeXBlKTsKLSAgICAgICAgc3RhdGVtZW50LnNldFByb3BlcnR5KDQsIHRlc3RUeXBlLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpOwotICAgICAgICBzdGF0ZW1lbnQuc2V0U3RyaW5nKDUsIHJvb3RGb2xkZXIuZ2V0SWQoKSk7Ci0KLSAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlF1ZXJ5OiAiICsgc3RhdGVtZW50LnRvUXVlcnlTdHJpbmcoKSkpOwotCi0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcmVzdWx0cyA9IHN0YXRlbWVudC5xdWVyeShmYWxzZSk7Ci0gICAgICAgIGZvciAoUXVlcnlSZXN1bHQgcXIgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IHFyLmdldFByb3BlcnR5VmFsdWVCeVF1ZXJ5TmFtZSgiZm9sZGVyTmFtZSIpOwotICAgICAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gcXIuZ2V0UHJvcGVydHlWYWx1ZUJ5UXVlcnlOYW1lKCJmb2xkZXJJZCIpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSByZXN1bHQgZG9lcyBub3QgbWF0Y2ggcm9vdCBmb2xkZXIgbmFtZSEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMocm9vdEZvbGRlci5nZXROYW1lKCksIGZvbGRlck5hbWUsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgcmVzdWx0IGRvZXMgbm90IG1hdGNoIHJvb3QgZm9sZGVyIGlkISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhyb290Rm9sZGVyLmdldElkKCksIGZvbGRlcklkLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUaGUgcXVlcnkgc2hvdWxkIHJldHVybiBleGFjdGx5IG9uZSByZXN1bHQgYnV0IHJldHVybmVkICIgKyBjb3VudCArICIhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMSwgY291bnQsIG51bGwsIGYpKTsKLQotICAgICAgICBpZiAocmVzdWx0cy5nZXRUb3RhbE51bUl0ZW1zKCkgPj0gMCkgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAiVGhlIHF1ZXJ5IHJldHVybmVkIGEgdG90YWwgbnVtYmVyIG9mIGl0ZW1zICE9IDEsIGJ1dCB0aGVyZSBjYW4gYmUgb25seSBleGFjdGx5IG9uZSBoaXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDFMLCByZXN1bHRzLmdldFRvdGFsTnVtSXRlbXMoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcXVlcnlCeURhdGUoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgU3RyaW5nIHRlc3RUeXBlID0gImNtaXM6Zm9sZGVyIjsKLQotICAgICAgICBGb2xkZXIgcm9vdEZvbGRlciA9IHNlc3Npb24uZ2V0Um9vdEZvbGRlcigpOwotCi0gICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGJlZm9yZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICBiZWZvcmUuc2V0VGltZUluTWlsbGlzKHJvb3RGb2xkZXIuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZUluTWlsbGlzKCkgLSAoNjAgKiA2MCAqIDEwMDApKTsKLQotICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBhZnRlciA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICBhZnRlci5zZXRUaW1lSW5NaWxsaXMocm9vdEZvbGRlci5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lSW5NaWxsaXMoKSArICg2MCAqIDYwICogMTAwMCkpOwotCi0gICAgICAgIFF1ZXJ5U3RhdGVtZW50IHN0YXRlbWVudCA9IHNlc3Npb24KLSAgICAgICAgICAgICAgICAuY3JlYXRlUXVlcnlTdGF0ZW1lbnQoIlNFTEVDVCA/IEFTIGZvbGRlck5hbWUsID8gQVMgZm9sZGVySWQgRlJPTSA/IFdIRVJFID8gPiBUSU1FU1RBTVAgPyBBTkQgPyA8IFRJTUVTVEFNUCA/Iik7Ci0KLSAgICAgICAgc3RhdGVtZW50LnNldFByb3BlcnR5KDEsIHRlc3RUeXBlLCBQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgc3RhdGVtZW50LnNldFByb3BlcnR5KDIsIHRlc3RUeXBlLCBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpOwotICAgICAgICBzdGF0ZW1lbnQuc2V0VHlwZSgzLCB0ZXN0VHlwZSk7Ci0gICAgICAgIHN0YXRlbWVudC5zZXRQcm9wZXJ0eSg0LCB0ZXN0VHlwZSwgUHJvcGVydHlJZHMuQ1JFQVRJT05fREFURSk7Ci0gICAgICAgIHN0YXRlbWVudC5zZXREYXRlVGltZSg1LCBiZWZvcmUpOwotICAgICAgICBzdGF0ZW1lbnQuc2V0UHJvcGVydHkoNiwgdGVzdFR5cGUsIFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUpOwotICAgICAgICBzdGF0ZW1lbnQuc2V0RGF0ZVRpbWUoNywgYWZ0ZXIpOwotCi0gICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KCJRdWVyeTogIiArIHN0YXRlbWVudC50b1F1ZXJ5U3RyaW5nKCkpKTsKLQotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcmVzdWx0cyA9IHN0YXRlbWVudC5xdWVyeShmYWxzZSk7Ci0gICAgICAgIGZvciAoUXVlcnlSZXN1bHQgcXIgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZm9sZGVySWQgPSBxci5nZXRQcm9wZXJ0eVZhbHVlQnlRdWVyeU5hbWUoImZvbGRlcklkIik7Ci0KLSAgICAgICAgICAgIGlmIChyb290Rm9sZGVyLmdldElkKCkuZXF1YWxzKGZvbGRlcklkKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBmb2xkZXJOYW1lID0gcXIuZ2V0UHJvcGVydHlWYWx1ZUJ5UXVlcnlOYW1lKCJmb2xkZXJOYW1lIik7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSByZXN1bHQgZG9lcyBub3QgbWF0Y2ggcm9vdCBmb2xkZXIgbmFtZSEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKHJvb3RGb2xkZXIuZ2V0TmFtZSgpLCBmb2xkZXJOYW1lLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUaGUgcXVlcnkgc2hvdWxkIHJldHVybiB0aGUgcm9vdCBmb2xkZXIgYnV0IGRvZXMgbm90ISIpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGZvdW5kLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdHMuZ2V0VG90YWxOdW1JdGVtcygpID49IDApIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBxdWVyeSByZXR1cm5lZCBhIHRvdGFsIG51bWJlciBvZiBpdGVtcyA8IDEsIGJ1dCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBoaXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKHJlc3VsdHMuZ2V0VG90YWxOdW1JdGVtcygpID49IDFMLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlTbW9rZVRlc3QuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9xdWVyeS9RdWVyeVNtb2tlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmEzNDU5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy9xdWVyeS9RdWVyeVNtb2tlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMucXVlcnk7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5PSzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQ21pc1Rlc3RSZXN1bHRJbXBsOwotCi0vKioKLSAqIFF1ZXJ5IHNtb2tlIHRlc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyeVNtb2tlVGVzdCBleHRlbmRzIEFic3RyYWN0UXVlcnlUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIlF1ZXJ5IFNtb2tlIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIlBlcmZvcm1zIGEgc2ltcGxlIHF1ZXJ5IGFuZCBjaGVja3MgaWYgdGhlIGZvcm1hdCBvZiB0aGUgcmVzdWx0cyBpcyBjb3JyZWN0LiBJdCBkb2VzIG5vdCBjaGVjayBpZiB0aGUgcmVzdWx0cyBhcmUgY29tcGxldGUhIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGlmIChzdXBwb3J0c1F1ZXJ5KHNlc3Npb24pKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGVzdFR5cGUgPSAiY21pczpkb2N1bWVudCI7Ci0gICAgICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIEZST00gIiArIHRlc3RUeXBlOwotCi0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiUXVlcnk6ICIgKyBzdGF0ZW1lbnQpKTsKLQotICAgICAgICAgICAgT2JqZWN0VHlwZSB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbih0ZXN0VHlwZSk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlRlc3QgdHlwZSBkZWZpbml0aW9uICciICsgdGVzdFR5cGUgKyAiJ25vdCBmb3VuZCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHR5cGUsIG51bGwsIGYpKTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBvYmplY3RJZFByb3BEZWYgPSB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiT2JqZWN0IElkIHByb3BlcnR5IGRlZmluaXRpb24gZG9lcyBub3QgZXhpc3QhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChvYmplY3RJZFByb3BEZWYsIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkUXVlcnlOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChvYmplY3RJZFByb3BEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9iamVjdElkUXVlcnlOYW1lID0gb2JqZWN0SWRQcm9wRGVmLmdldFF1ZXJ5TmFtZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGFnZVNpemUgPSAxMDA7Ci0KLSAgICAgICAgICAgIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcmVzdWx0U2V0ID0gc2Vzc2lvbi5xdWVyeShzdGF0ZW1lbnQsIGZhbHNlKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdFNldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgcmVzdWx0IHNldCBpcyBudWxsISAoT3BlbkNNSVMgaXNzdWU/Pz8pIikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gdGVzdGluZyAxMDAgcmVzdWx0cyBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgdGhpcyB0ZXN0Ci0gICAgICAgICAgICAgICAgSXRlbUl0ZXJhYmxlPFF1ZXJ5UmVzdWx0PiBxdWVyeUl0ZXJhYmxlID0gcmVzdWx0U2V0LmdldFBhZ2UocGFnZVNpemUpOwotICAgICAgICAgICAgICAgIGZvciAoUXVlcnlSZXN1bHQgcXIgOiBxdWVyeUl0ZXJhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJRdWVyeSByZXN1bHQgaXMgbnVsbCEgKE9wZW5DTUlTIGlzc3VlPz8/KSIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja1F1ZXJ5UmVzdWx0KHNlc3Npb24sIHFyLCB0eXBlLCAiUXVlcnkgcmVzdWx0OiAiICsgaSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0SWRRdWVyeU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3RJZCA9IChTdHJpbmcpIHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUob2JqZWN0SWRRdWVyeU5hbWUpLmdldEZpcnN0VmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENtaXNPYmplY3Qgb2JqZWN0ID0gc2Vzc2lvbi5nZXRPYmplY3Qob2JqZWN0SWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgb2JqZWN0LCBnZXRBbGxQcm9wZXJ0aWVzKG9iamVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5IGhpdCBjaGVjay4gSWQ6ICIgKyBvYmplY3RJZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnkgaGl0IHJlZmVyZW5jZXMgYW4gb2JqZWN0IHRoYXQgZG9lc24ndCBleGlzdC4gSWQ6ICIgKyBvYmplY3RJZCwgZSwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBtb3JlCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIk1vcmUgcXVlcnkgcmVzdWx0cyAoIiArIGkgKyAiKSB0aGFuIGV4cGVjdGVkIChwYWdlIHNpemUgPSAiICsgcGFnZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIikhIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoKGkgPiBwYWdlU2l6ZSksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGlmIChxdWVyeUl0ZXJhYmxlLmdldFRvdGFsTnVtSXRlbXMoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJSZXBvc2l0b3J5IGRpZCBub3QgcmV0dXJuIG51bUl0ZW1zLiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdChpICsgIiBxdWVyeSByZXN1bHRzIGZvciBcIiIgKyBzdGF0ZW1lbnQgKyAiXCIgKHBhZ2Ugc2l6ZSA9ICIgKyBwYWdlU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlF1ZXJ5IG5vdCBzdXBwb3J0ZWQuIFRlc3QgU2tpcHBlZCEiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ21pc1Rlc3RSZXN1bHQgY2hlY2tRdWVyeVJlc3VsdChTZXNzaW9uIHNlc3Npb24sIFF1ZXJ5UmVzdWx0IHFyLCBPYmplY3RUeXBlIHR5cGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0UmVzdWx0PigpOwotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgaWYgKHFyLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5IHJlc3VsdCBpcyBlbXB0eSEiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmIDogdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcERlZi5nZXRRdWVyeU5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFByb3BlcnR5RGF0YTw/PiBwZCA9IHFyLmdldFByb3BlcnR5QnlRdWVyeU5hbWUocHJvcERlZi5nZXRRdWVyeU5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQocmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlF1ZXJ5IHByb3BlcnR5IG5vdCBpbiByZXN1bHQgc2V0OiAiICsgcHJvcERlZi5nZXRRdWVyeU5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQuZXF1YWxzKHByb3BEZWYuZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRC5lcXVhbHMocHJvcERlZi5nZXRJZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRC5lcXVhbHMocHJvcERlZi5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUXVlcnkgcHJvcGVydHkgbXVzdCBub3QgYmUgZW1wdHk6ICIgKyBwcm9wRGVmLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRTdHJpbmdOb3RFbXB0eSgoU3RyaW5nKSBwZC5nZXRGaXJzdFZhbHVlKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENtaXNUZXN0UmVzdWx0SW1wbCByZXN1bHQgPSBjcmVhdGVSZXN1bHQoZ2V0V29yc3QocmVzdWx0cyksIG1lc3NhZ2UpOwotICAgICAgICByZXN1bHQuZ2V0Q2hpbGRyZW4oKS5hZGRBbGwocmVzdWx0cyk7Ci0KLSAgICAgICAgcmV0dXJuIChyZXN1bHQuZ2V0U3RhdHVzKCkuZ2V0TGV2ZWwoKSA8PSBPSy5nZXRMZXZlbCgpID8gbnVsbCA6IHJlc3VsdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3F1ZXJ5L1F1ZXJ5VGVzdEdyb3VwLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlUZXN0R3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwOTcwNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvcXVlcnkvUXVlcnlUZXN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMucXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdEdyb3VwOwotCi0vKioKLSAqIFRoaXMgdGVzdCBncm91cCBjb250YWlucyBxdWVyeSB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5VGVzdEdyb3VwIGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdEdyb3VwIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgc2V0TmFtZSgiUXVlcnkgVGVzdCBHcm91cCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiUXVlcnkgYW5kIGNvbnRlbnQgY2hhbmdlcyB0ZXN0cy4iKTsKLQotICAgICAgICBhZGRUZXN0KG5ldyBRdWVyeVNtb2tlVGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUXVlcnlSb290Rm9sZGVyVGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgUXVlcnlGb3JPYmplY3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFF1ZXJ5TGlrZVRlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFF1ZXJ5SW5Gb2xkZXJUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBDb250ZW50Q2hhbmdlc1Ntb2tlVGVzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdHlwZXMvQmFzZVR5cGVzVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3R5cGVzL0Jhc2VUeXBlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2Y2FlMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdHlwZXMvQmFzZVR5cGVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMudHlwZXM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DbWlzVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIEJhc2VUeXBlc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJUeXBlcyBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDaGVja3MgYWxsIHR5cGVzIGV4cG9zZWQgYnkgdGhlIHJlcG9zaXRvcnkgZm9yIHNwZWNpZmljYXRpb24gY29tcGxpYW5jZS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmU7Ci0KLSAgICAgICAgLy8gY2hlY2sgYmFzZSB0eXBlcwotICAgICAgICBTZXQ8U3RyaW5nPiBjbWlzVHlwZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGNtaXNUeXBlcy5hZGQoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCkpOwotICAgICAgICBjbWlzVHlwZXMuYWRkKEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSk7Ci0gICAgICAgIGNtaXNUeXBlcy5hZGQoQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC52YWx1ZSgpKTsKLSAgICAgICAgY21pc1R5cGVzLmFkZChCYXNlVHlwZUlkLkNNSVNfUE9MSUNZLnZhbHVlKCkpOwotCi0gICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q21pc1ZlcnNpb24oKSAhPSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgY21pc1R5cGVzLmFkZChCYXNlVHlwZUlkLkNNSVNfSVRFTS52YWx1ZSgpKTsKLSAgICAgICAgICAgIGNtaXNUeXBlcy5hZGQoQmFzZVR5cGVJZC5DTUlTX1NFQ09OREFSWS52YWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoVHlwZURlZmluaXRpb24gdHlwZURlZiA6IHNlc3Npb24uZ2V0VHlwZUNoaWxkcmVuKG51bGwsIGZhbHNlKSkgewotICAgICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IHR5cGVEZWYuZ2V0SWQoKTsKLQotICAgICAgICAgICAgaWYgKHR5cGVJZCA9PSBudWxsIHx8ICFjbWlzVHlwZXMuY29udGFpbnModHlwZUlkKSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkJhc2UgdHlwZSBoYXMgYW4gaW52YWxpZCBpZDogIiArIHR5cGVJZCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCAmJiAhdHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiUHJvcGVydHkgdHlwZSBkZWZpbml0aW9ucyB3ZXJlIG5vdCByZXF1ZXN0ZWQgYnV0IGRlbGl2ZXJlZC4gVHlwZSBpZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlSWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvY3VtZW50Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBkb2N1bWVudFR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja1R5cGVEZWZpbml0aW9uKHNlc3Npb24sIGRvY3VtZW50VHlwZSwgIkRvY3VtZW50IHR5cGUgc3BlYyBjb21wbGlhbmNlLiIpKTsKLQotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgdHlwZSBoYXMgdGhlIHdyb25nIGJhc2UgdHlwZTogIiArIGRvY3VtZW50VHlwZS5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQsIGRvY3VtZW50VHlwZS5nZXRCYXNlVHlwZUlkKCksIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IHR5cGUgbm90IGF2YWlsYWJsZSEiLCBlLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9sZGVyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiBmb2xkZXJUeXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpOwotCi0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tUeXBlRGVmaW5pdGlvbihzZXNzaW9uLCBmb2xkZXJUeXBlLCAiRm9sZGVyIHR5cGUgc3BlYyBjb21wbGlhbmNlLiIpKTsKLQotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRm9sZGVyIHR5cGUgaGFzIHRoZSB3cm9uZyBiYXNlIHR5cGU6ICIgKyBmb2xkZXJUeXBlLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKEJhc2VUeXBlSWQuQ01JU19GT0xERVIsIGZvbGRlclR5cGUuZ2V0QmFzZVR5cGVJZCgpLCBudWxsLCBmYWlsdXJlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJGb2xkZXIgdHlwZSBub3QgYXZhaWxhYmxlISIsIGUsIGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZWxhdGlvbnNoaXAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHJlbGF0aW9uc2hpcFR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVAudmFsdWUoKSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tUeXBlRGVmaW5pdGlvbihzZXNzaW9uLCByZWxhdGlvbnNoaXBUeXBlLCAiUmVsYXRpb25zaGlwIHR5cGUgc3BlYyBjb21wbGlhbmNlLiIpKTsKLQotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAiUmVsYXRpb25zaGlwIHR5cGUgaGFzIHRoZSB3cm9uZyBiYXNlIHR5cGU6ICIgKyByZWxhdGlvbnNoaXBUeXBlLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVAsIHJlbGF0aW9uc2hpcFR5cGUuZ2V0QmFzZVR5cGVJZCgpLCBudWxsLCBmYWlsdXJlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJSZWxhdGlvbnNoaXAgdHlwZSBub3QgYXZhaWxhYmxlISIsIGUsIGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwb2xpY3kKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHBvbGljeVR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKEJhc2VUeXBlSWQuQ01JU19QT0xJQ1kudmFsdWUoKSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tUeXBlRGVmaW5pdGlvbihzZXNzaW9uLCBwb2xpY3lUeXBlLCAiUG9saWN5IHR5cGUgc3BlYyBjb21wbGlhbmNlLiIpKTsKLQotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUG9saWN5IHR5cGUgaGFzIHRoZSB3cm9uZyBiYXNlIHR5cGU6ICIgKyBwb2xpY3lUeXBlLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKEJhc2VUeXBlSWQuQ01JU19QT0xJQ1ksIHBvbGljeVR5cGUuZ2V0QmFzZVR5cGVJZCgpLCBudWxsLCBmYWlsdXJlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiUG9saWN5IHR5cGUgbm90IGF2YWlsYWJsZSEiLCBlLCBmYWxzZSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiUG9saWN5IHR5cGUgbm90IGF2YWlsYWJsZSEiLCBlLCBmYWxzZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ01JUyAxLjEgdHlwZXMKLSAgICAgICAgaWYgKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDbWlzVmVyc2lvbigpID09IENtaXNWZXJzaW9uLkNNSVNfMV8xKSB7Ci0gICAgICAgICAgICAvLyBpdGVtCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIGl0ZW1UeXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihCYXNlVHlwZUlkLkNNSVNfSVRFTS52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tUeXBlRGVmaW5pdGlvbihzZXNzaW9uLCBpdGVtVHlwZSwgIkl0ZW0gdHlwZSBzcGVjIGNvbXBsaWFuY2UuIikpOwotCi0gICAgICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiSXRlbSB0eXBlIGhhcyB0aGUgd3JvbmcgYmFzZSB0eXBlOiAiICsgaXRlbVR5cGUuZ2V0QmFzZVR5cGVJZCgpKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKEJhc2VUeXBlSWQuQ01JU19JVEVNLCBpdGVtVHlwZS5nZXRCYXNlVHlwZUlkKCksIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywgIkl0ZW0gdHlwZSBub3QgYXZhaWxhYmxlISIsIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywgIkl0ZW0gdHlwZSBub3QgYXZhaWxhYmxlISIsIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNlY29uZGFyeSB0eXBlCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHNlY29uZGFyeVR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKEJhc2VUeXBlSWQuQ01JU19TRUNPTkRBUlkudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrVHlwZURlZmluaXRpb24oc2Vzc2lvbiwgc2Vjb25kYXJ5VHlwZSwgIlNlY29uZGFyeSB0eXBlIHNwZWMgY29tcGxpYW5jZS4iKSk7Ci0KLSAgICAgICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiU2Vjb25kYXJ5IHR5cGUgaGFzIHRoZSB3cm9uZyBiYXNlIHR5cGU6ICIgKyBzZWNvbmRhcnlUeXBlLmdldEJhc2VUeXBlSWQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhCYXNlVHlwZUlkLkNNSVNfU0VDT05EQVJZLCBzZWNvbmRhcnlUeXBlLmdldEJhc2VUeXBlSWQoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiU2Vjb25kYXJ5IHR5cGUgbm90IGF2YWlsYWJsZSEiLCBlLCBmYWxzZSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJTZWNvbmRhcnkgdHlwZSBub3QgYXZhaWxhYmxlISIsIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24oQmFzZVR5cGVJZC5DTUlTX0lURU0udmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiQ01JUyAxLjAgcmVwb3NpdG9yeSByZXR1cm5zIGNtaXM6aXRlbSB0eXBlIGRlZmluaXRpb24hIikpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihCYXNlVHlwZUlkLkNNSVNfU0VDT05EQVJZLnZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkNNSVMgMS4wIHJlcG9zaXRvcnkgcmV0dXJucyBjbWlzOnNlY29uZGFyeSB0eXBlIGRlZmluaXRpb24hIikpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbnVtT2ZUeXBlcyA9IHJ1blR5cGVDaGVja3Moc2Vzc2lvbiwgc2Vzc2lvbi5nZXRUeXBlRGVzY2VuZGFudHMobnVsbCwgLTEsIHRydWUpKTsKLQotICAgICAgICBhZGRSZXN1bHQoY3JlYXRlSW5mb1Jlc3VsdCgiQ2hlY2tlZCAiICsgbnVtT2ZUeXBlcyArICIgdHlwZSBkZWZpbml0aW9ucy4iKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcnVuVHlwZUNoZWNrcyhTZXNzaW9uIHNlc3Npb24sIExpc3Q8VHJlZTxPYmplY3RUeXBlPj4gdHlwZXMpIHsKLSAgICAgICAgaWYgKHR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG51bU9mVHlwZXMgPSAwOwotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlOwotCi0gICAgICAgIGZvciAoVHJlZTxPYmplY3RUeXBlPiB0cmVlIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlR5cGVzIHRyZWUgY29udGFpbnMgbnVsbCBsZWFmISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwodHJlZSwgbnVsbCwgZmFpbHVyZSkpOwotCi0gICAgICAgICAgICBpZiAodHJlZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbnVtT2ZUeXBlcysrOwotCi0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrVHlwZURlZmluaXRpb24oc2Vzc2lvbiwgdHJlZS5nZXRJdGVtKCksICJUeXBlIHNwZWMgY29tcGxpYW5jZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0cmVlLmdldEl0ZW0oKS5nZXRJZCgpKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGUgdG8gZW5zdXJlIHRoYXQgdGhlIHR5cGUgZGVmaW5pdGlvbiBpcwotICAgICAgICAgICAgICAgIC8vIHJlbG9hZGVkIGZyb20gdGhlIHJlcG9zaXRvcnkKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiByZWxvYWRlZFR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKHRyZWUuZ2V0SXRlbSgpLmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja1R5cGVEZWZpbml0aW9uKHNlc3Npb24sIHJlbG9hZGVkVHlwZSwgIlR5cGUgc3BlYyBjb21wbGlhbmNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocmVsb2FkZWRUeXBlID09IG51bGwgPyAiPyIgOiByZWxvYWRlZFR5cGUuZ2V0SWQoKSkpKTsKLQotICAgICAgICAgICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR5cGUgZmV0Y2hlZCB2aWEgZ2V0VHlwZURlc2NlbmRhbnRzKCkgaXMgZG9lcyBub3QgbWFjdGggdHlwZSBmZXRjaGVkIHZpYSBnZXRUeXBlRGVmaW5pdGlvbigpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRyZWUuZ2V0SXRlbSgpLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKHRyZWUuZ2V0SXRlbSgpLCByZWxvYWRlZFR5cGUsIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR5cGUgZmV0Y2hlZCB2aWEgZ2V0VHlwZURlc2NlbmRhbnRzKCkgaXMgbm90IGF2YWlsYWJsZSB2aWEgZ2V0VHlwZURlZmluaXRpb24oKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0cmVlLmdldEl0ZW0oKS5nZXRJZCgpLCBlLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZSBhZ2FpbiB0byBlbnN1cmUgdGhhdCB0aGUgdHlwZSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgLy8gY2hpbGRyZW4gYXJlIHJlbG9hZGVkIGZyb20gdGhlIHJlcG9zaXRvcnkKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJdGVtSXRlcmFibGU8T2JqZWN0VHlwZT4gcmVsb2FkZWRUeXBlQ2hpbGRyZW4gPSBzZXNzaW9uLmdldFR5cGVDaGlsZHJlbih0cmVlLmdldEl0ZW0oKS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHR5cGUgY2hpbGRyZW4KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0VHlwZT4gdHlwZUNoaWxkZW4gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdFR5cGU+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0VHlwZSBjaGlsZFR5cGUgOiByZWxvYWRlZFR5cGVDaGlsZHJlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVGhlIGxpc3Qgb2YgdHlwZXMgY29udGFpbnMgYSBudWxsIGVudHJ5ISIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrVHlwZURlZmluaXRpb24oc2Vzc2lvbiwgY2hpbGRUeXBlLCAiVHlwZSBzcGVjIGNvbXBsaWFuY2U6ICIgKyBjaGlsZFR5cGUuZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ2hpbGRlbi5wdXQoY2hpbGRUeXBlLmdldElkKCksIGNoaWxkVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHR5cGUgY2hpbGRyZW4gYW5kIHR5cGUgZGVzY2VuZGFudHMKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyZWUuZ2V0Q2hpbGRyZW4oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIGNoaWxkcmVuIGZldGNoZWQgdmlhIGdldFR5cGVEZXNjZW5kYW50cygpIGRvbid0IG1hdGNoIHR5cGUgY2hpbGRyZW4gZmV0Y2hlZCB2aWEgZ2V0VHlwZUNoaWxkcmVuKCk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRyZWUuZ2V0SXRlbSgpLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygwLCB0eXBlQ2hpbGRlbi5zaXplKCksIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3RUeXBlPiB0eXBlRGVzY2VuZGFudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdFR5cGU+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFRyZWU8T2JqZWN0VHlwZT4gY2hpbGRUeXBlIDogdHJlZS5nZXRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZFR5cGUgIT0gbnVsbCkgJiYgKGNoaWxkVHlwZS5nZXRJdGVtKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZURlc2NlbmRhbnRzLnB1dChjaGlsZFR5cGUuZ2V0SXRlbSgpLmdldElkKCksIGNoaWxkVHlwZS5nZXRJdGVtKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZSBjaGlsZHJlbiBmZXRjaGVkIHZpYSBnZXRUeXBlRGVzY2VuZGFudHMoKSBkb24ndCBtYXRjaCB0eXBlIGNoaWxkcmVuIGZldGNoZWQgdmlhIGdldFR5cGVDaGlsZHJlbigpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0cmVlLmdldEl0ZW0oKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHModHlwZURlc2NlbmRhbnRzLnNpemUoKSwgdHlwZUNoaWxkZW4uc2l6ZSgpLCBudWxsLCBmYWlsdXJlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0VHlwZSBjb21wYXJlVHlwZSA6IHR5cGVEZXNjZW5kYW50cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIGZldGNoZWQgdmlhIGdldFR5cGVEZXNjZW5kYW50cygpIGRvZXNuJ3QgbWF0Y2ggdHlwZSBmZXRjaGVkIHZpYSBnZXRUeXBlQ2hpbGRyZW4oKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRyZWUuZ2V0SXRlbSgpLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoY29tcGFyZVR5cGUsIHR5cGVDaGlsZGVuLmdldChjb21wYXJlVHlwZS5nZXRJZCgpKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIGNoaWxkcmVuIGZldGNoZWQgdmlhIGdldFR5cGVEZXNjZW5kYW50cygpIGlzIG5vdCBhdmFpbGFibGUgdmlhIGdldFR5cGVDaGlsZHJlbigpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRyZWUuZ2V0SXRlbSgpLmdldElkKCksIGUsIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbnVtT2ZUeXBlcyArPSBydW5UeXBlQ2hlY2tzKHNlc3Npb24sIHRyZWUuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVtT2ZUeXBlczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy90eXBlcy9DcmVhdGVBbmREZWxldGVUeXBlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3R5cGVzL0NyZWF0ZUFuZERlbGV0ZVR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDRlMTMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3R5cGVzL0NyZWF0ZUFuZERlbGV0ZVR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy50eXBlczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ3JlYXRhYmxlUHJvcGVydHlUeXBlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcmRpbmFsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Db250ZW50U3RyZWFtQWxsb3dlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVwZGF0YWJpbGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5BYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLlByb3BlcnR5RGVjaW1hbERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlJZERlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Qcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlTdHJpbmdEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuUHJvcGVydHlVcmlEZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIENyZWF0ZUFuZERlbGV0ZVR5cGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiQ3JlYXRlIGFuZCBEZWxldGUgVHlwZSBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGEgZG9jdW1lbnQgdHlwZSBhbmQgZGVsZXRlcyBpdCBhZ2Fpbi4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q21pc1ZlcnNpb24oKSA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChTS0lQUEVELCAiVHlwZSBtdXRhYmlsaXR5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgQ01JUyAxLjAuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3RUeXBlIHBhcmVudFR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKGdldERvY3VtZW50VGVzdFR5cGVJZCgpKTsKLSAgICAgICAgaWYgKHBhcmVudFR5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKSA9PSBudWxsIHx8ICFCb29sZWFuLlRSVUUuZXF1YWxzKHBhcmVudFR5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKS5jYW5DcmVhdGUoKSkpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwgIlRlc3QgZG9jdW1lbnQgdHlwZSBkb2Vzbid0IGFsbG93IGNyZWF0aW5nIGEgc3ViLXR5cGUuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVUeXBlV2l0aG91dFByb3BlcnRpZXMoc2Vzc2lvbiwgcGFyZW50VHlwZSk7Ci0gICAgICAgIGNyZWF0ZVR5cGVXaXRoUHJvcGVydGllcyhzZXNzaW9uLCBwYXJlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlVHlwZVdpdGhvdXRQcm9wZXJ0aWVzKFNlc3Npb24gc2Vzc2lvbiwgT2JqZWN0VHlwZSBwYXJlbnRUeXBlKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGZhaWx1cmUgPSBudWxsOwotCi0gICAgICAgIC8vIGRlZmluZSB0aGUgdHlwZQotICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCBuZXdUeXBlRGVmID0gY3JlYXRlRG9jdW1lbnRUeXBlRGVmaW5pdGlvbihzZXNzaW9uLCAidGNrOnRlc3RpZF93aXRob3V0X3Byb3BlcnRpZXMiLAotICAgICAgICAgICAgICAgIHBhcmVudFR5cGUpOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgdHlwZQotICAgICAgICBPYmplY3RUeXBlIG5ld1R5cGUgPSBjcmVhdGVUeXBlKHNlc3Npb24sIG5ld1R5cGVEZWYpOwotICAgICAgICBpZiAobmV3VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHR5cGUKLSAgICAgICAgT2JqZWN0VHlwZSBuZXdUeXBlMiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXdUeXBlMiA9IHNlc3Npb24uZ2V0VHlwZURlZmluaXRpb24obmV3VHlwZS5nZXRJZCgpKTsKLQotICAgICAgICAgICAgLy8gYXNzZXJ0IHR5cGUgZGVmaW5pdGlvbnMKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgIlRoZSB0eXBlIGRlZmluaXRpb24gcmV0dXJuZWQgYnkgY3JlYXRlVHlwZSgpIGRvZXNuJ3QgbWF0Y2ggdGhlIHR5cGUgZGVmaW5pdGlvbiByZXR1cm5lZCBieSBnZXRUeXBlRGVmaW5pdGlvbigpISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhuZXdUeXBlLCBuZXdUeXBlMiwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9IGNhdGNoIChDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiTmV3bHkgY3JlYXRlZCB0eXBlIGNhbiBub3QgYmUgZmV0Y2hlZC4gSWQ6ICIgKyBuZXdUeXBlLmdldElkKCksIGUsIGZhbHNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWxldGUgdGhlIHR5cGUKLSAgICAgICAgZGVsZXRlVHlwZShzZXNzaW9uLCBuZXdUeXBlLmdldElkKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUeXBlV2l0aFByb3BlcnRpZXMoU2Vzc2lvbiBzZXNzaW9uLCBPYmplY3RUeXBlIHBhcmVudFR5cGUpIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZmFpbHVyZSA9IG51bGw7Ci0KLSAgICAgICAgQ3JlYXRhYmxlUHJvcGVydHlUeXBlcyBjcHQgPSBzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpOwotICAgICAgICBpZiAoY3B0ID09IG51bGwgfHwgY3B0LmNhbkNyZWF0ZSgpID09IG51bGwgfHwgY3B0LmNhbkNyZWF0ZSgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUmVwb3NpdG9yeSBJbmZvIGRvZXMgbm90IGluZGljYXRlLCB3aGljaCBwcm9wZXJ0eSB0eXBlcyBjYW4gYmUgY3JlYXRlZCEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWZpbmUgdGhlIHR5cGUKLSAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgbmV3VHlwZURlZiA9IGNyZWF0ZURvY3VtZW50VHlwZURlZmluaXRpb24oc2Vzc2lvbiwgInRjazp0ZXN0aWRfd2l0aF9wcm9wZXJ0aWVzIiwKLSAgICAgICAgICAgICAgICBwYXJlbnRUeXBlKTsKLQotICAgICAgICAvLyBhZGQgYSBwcm9wZXJ0eSBmb3IgZWFjaCBjcmVhdGFibGUgcHJvcGVydHkgdHlwZQotICAgICAgICBmb3IgKFByb3BlcnR5VHlwZSBwcm9wVHlwZSA6IFByb3BlcnR5VHlwZS52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKCFjcHQuY2FuQ3JlYXRlKCkuY29udGFpbnMocHJvcFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ld1R5cGVEZWYuYWRkUHJvcGVydHlEZWZpbml0aW9uKGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihwcm9wVHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSB0eXBlCi0gICAgICAgIE9iamVjdFR5cGUgbmV3VHlwZSA9IGNyZWF0ZVR5cGUoc2Vzc2lvbiwgbmV3VHlwZURlZik7Ci0gICAgICAgIGlmIChuZXdUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgdHlwZQotICAgICAgICBPYmplY3RUeXBlIG5ld1R5cGUyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld1R5cGUyID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihuZXdUeXBlLmdldElkKCkpOwotCi0gICAgICAgICAgICAvLyBhc3NlcnQgdHlwZSBkZWZpbml0aW9ucwotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAiVGhlIHR5cGUgZGVmaW5pdGlvbiByZXR1cm5lZCBieSBjcmVhdGVUeXBlKCkgZG9lc24ndCBtYXRjaCB0aGUgdHlwZSBkZWZpbml0aW9uIHJldHVybmVkIGJ5IGdldFR5cGVEZWZpbml0aW9uKCkhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKG5ld1R5cGUsIG5ld1R5cGUyLCBudWxsLCBmYWlsdXJlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOZXdseSBjcmVhdGVkIHR5cGUgY2FuIG5vdCBiZSBmZXRjaGVkLiBJZDogIiArIG5ld1R5cGUuZ2V0SWQoKSwgZSwgZmFsc2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHByb3BlcnRpZXMKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURlZmluaXRpb248Pz4+IG5ld1Byb3BEZWZzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURlZmluaXRpb248Pz4+KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmIDogbmV3VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaWYgKEJvb2xlYW4uRkFMU0UuZXF1YWxzKHByb3BEZWYuZ2V0VmFsdWUoKS5pc0luaGVyaXRlZCgpKSkgewotICAgICAgICAgICAgICAgIG5ld1Byb3BEZWZzLmFkZChwcm9wRGVmLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGRlZmluZWQgcHJvcGVydGllcyBhbmQgdGhlIG51bWJlciBvZiBub24taW5oZXJpdGVkIHByb3BlcnRpZXMgZG9uJ3QgbWF0Y2ghIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMobmV3VHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuc2l6ZSgpLCBuZXdQcm9wRGVmcy5zaXplKCksIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICAvLyBjaGVjayB0aGUgb3JkZXIgb2YgdGhlIHByb3BlcnRpZXMsIHdoaWNoIG11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZQotICAgICAgICAvLyBvcmlnaW5hbCB0eXBlIGRlZmluaXRpb24KLSAgICAgICAgLy8gKE9wZW5DTUlTIGtlZXBzIHRoZSBvcmRlciBvZiB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMuKQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wRGVmIDogbmV3VHlwZURlZi5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IG5ld1Byb3BEZWYgPSBuZXdQcm9wRGVmcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlByb3BlcnR5ICIgKyAoaSArIDEpICsgIiBtdXN0IGJlIG9mIHR5cGUgIgotICAgICAgICAgICAgICAgICAgICArIHByb3BEZWYuZ2V0VmFsdWUoKS5nZXRQcm9wZXJ0eVR5cGUoKSArICIgYnV0IGlzIG9mIHR5cGUgIiArIG5ld1Byb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCkgKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhwcm9wRGVmLmdldFZhbHVlKCkuZ2V0UHJvcGVydHlUeXBlKCksIG5ld1Byb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCksIG51bGwsIGZhaWx1cmUpKTsKLQotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZUluZm9SZXN1bHQoIlJlcG9zaXRvcnkgYXNzaWduZWQgdGhlIHByb3BlcnR5ICciICsgcHJvcERlZi5nZXRWYWx1ZSgpLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiJyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGlkOiAiICsgbmV3UHJvcERlZi5nZXRJZCgpKSk7Ci0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRlbGV0ZSB0aGUgdHlwZQotICAgICAgICBkZWxldGVUeXBlKHNlc3Npb24sIG5ld1R5cGUuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEb2N1bWVudFR5cGVEZWZpbml0aW9uSW1wbCBjcmVhdGVEb2N1bWVudFR5cGVEZWZpbml0aW9uKFNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nIHR5cGVJZCwKLSAgICAgICAgICAgIE9iamVjdFR5cGUgcGFyZW50VHlwZSkgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmYWlsdXJlID0gbnVsbDsKLQotICAgICAgICBOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIHNldHRhYmxlQXR0cmlidXRlcyA9IHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDYXBhYmlsaXRpZXMoKQotICAgICAgICAgICAgICAgIC5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ2FwYWJpbGl0eSBOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIGlzIG5vdCBzZXQhIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbkltcGwgcmVzdWx0ID0gbmV3IERvY3VtZW50VHlwZURlZmluaXRpb25JbXBsKCk7Ci0KLSAgICAgICAgcmVzdWx0LnNldEJhc2VUeXBlSWQocGFyZW50VHlwZS5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICByZXN1bHQuc2V0UGFyZW50VHlwZUlkKHBhcmVudFR5cGUuZ2V0SWQoKSk7Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldElkKCkpKSB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0SWQodHlwZUlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRmxhZyAnaWQnIGluIGNhcGFiaWxpdHkgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldElkKCksIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgPT0gbnVsbCB8fCBCb29sZWFuLlRSVUUuZXF1YWxzKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWUoInRjazp0ZXN0bG9jYWwiKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRmxhZyAnbG9jYWxOYW1lJyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRMb2NhbE5hbWUoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldExvY2FsTmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICByZXN1bHQuc2V0TG9jYWxOYW1lc3BhY2UoImh0dHA6Ly90Y2svdGVzdGxvY2FsbmFtZXNwYWNlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2V0dGFibGVBdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWx1cmUgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIkZsYWcgJ2xvY2FsTmFtZXNwYWNlJyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRMb2NhbE5hbWVzcGFjZSgpLCBudWxsLCBmYWlsdXJlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2V0dGFibGVBdHRyaWJ1dGVzID09IG51bGwgfHwgQm9vbGVhbi5UUlVFLmVxdWFscyhzZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RGlzcGxheU5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXREaXNwbGF5TmFtZSgiVENLIERvY3VtZW50IFR5cGUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRmxhZyAnZGlzcGxheU5hbWUnIGluIGNhcGFiaWxpdHkgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldERpc3BsYXlOYW1lKCksIG51bGwsIGZhaWx1cmUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgPT0gbnVsbCB8fCBCb29sZWFuLlRSVUUuZXF1YWxzKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXREZXNjcmlwdGlvbigpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKCJUaGlzIGlzIHRoZSBUQ0sgZG9jdW1lbnQgdHlwZSIpOwotICAgICAgICB9IGVsc2UgaWYgKHNldHRhYmxlQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJGbGFnICdkZXNjcmlwdGlvbicgaW4gY2FwYWJpbGl0eSBOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChzZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldFF1ZXJ5TmFtZSgpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldFF1ZXJ5TmFtZSgidGNrOnRlc3RxdWVyeW5hbWUiKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRmxhZyAncXVlcnlOYW1lJyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRRdWVyeU5hbWUoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldFF1ZXJ5YWJsZSgpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldElzUXVlcnlhYmxlKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiRmxhZyAncXVlcnlhYmxlJyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRRdWVyeWFibGUoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldEZ1bGx0ZXh0SW5kZXhlZCgpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldElzRnVsbHRleHRJbmRleGVkKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiRmxhZyAnZnVsbHRleHRJbmRleGVkJyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRGdWxsdGV4dEluZGV4ZWQoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldEluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldElzSW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5KGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiRmxhZyAnaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5JyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENvbnRyb2xsYWJsZUFjbCgpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldElzQ29udHJvbGxhYmxlQWNsKGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiRmxhZyAnY29udHJvbGxhYmxlQUNMJyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDb250cm9sbGFibGVBY2woKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENvbnRyb2xsYWJsZVBvbGljeSgpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldElzQ29udHJvbGxhYmxlUG9saWN5KGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXR0YWJsZUF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbHVyZSA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiRmxhZyAnY29udHJvbGxhYmxlUG9saWN5JyBpbiBjYXBhYmlsaXR5IE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMgaXMgbm90IHNldCEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnROb3ROdWxsKHNldHRhYmxlQXR0cmlidXRlcy5jYW5TZXRDb250cm9sbGFibGVQb2xpY3koKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRhYmxlQXR0cmlidXRlcyA9PSBudWxsIHx8IEJvb2xlYW4uVFJVRS5lcXVhbHMoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENyZWF0YWJsZSgpKSkgewotICAgICAgICAgICAgcmVzdWx0LnNldElzQ3JlYXRhYmxlKHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKHNldHRhYmxlQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJGbGFnICdjcmVhdGFibGUnIGluIGNhcGFiaWxpdHkgTmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcyBpcyBub3Qgc2V0ISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydE5vdE51bGwoc2V0dGFibGVBdHRyaWJ1dGVzLmNhblNldENyZWF0YWJsZSgpLCBudWxsLCBmYWlsdXJlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2V0dGFibGVBdHRyaWJ1dGVzID09IG51bGwgfHwgQm9vbGVhbi5UUlVFLmVxdWFscyhzZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RmlsZWFibGUoKSkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRJc0ZpbGVhYmxlKHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKHNldHRhYmxlQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsdXJlID0gY3JlYXRlUmVzdWx0KFdBUk5JTkcsICJGbGFnICdmaWxlYWJsZScgaW4gY2FwYWJpbGl0eSBOZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzIGlzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0Tm90TnVsbChzZXR0YWJsZUF0dHJpYnV0ZXMuY2FuU2V0RmlsZWFibGUoKSwgbnVsbCwgZmFpbHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldElzVmVyc2lvbmFibGUoZmFsc2UpOwotICAgICAgICByZXN1bHQuc2V0Q29udGVudFN0cmVhbUFsbG93ZWQoQ29udGVudFN0cmVhbUFsbG93ZWQuQUxMT1dFRCk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IGNyZWF0ZVByb3BlcnR5RGVmaW5pdGlvbihQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlKSB7Ci0gICAgICAgIEFic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uPD8+IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgc3dpdGNoIChwcm9wZXJ0eVR5cGUpIHsKLSAgICAgICAgY2FzZSBCT09MRUFOOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5Qm9vbGVhbkRlZmluaXRpb25JbXBsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJRDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUlkRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgUHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERBVEVUSU1FOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSFRNTDoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBQcm9wZXJ0eUh0bWxEZWZpbml0aW9uSW1wbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVJJOgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5VXJpRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbkltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRQcm9wZXJ0eVR5cGUocHJvcGVydHlUeXBlKTsKLSAgICAgICAgcmVzdWx0LnNldElkKCJ0Y2s6IiArIHByb3BlcnR5VHlwZS52YWx1ZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldExvY2FsTmFtZSgidGNrOmxvY2FsXyIgKyBwcm9wZXJ0eVR5cGUudmFsdWUoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbE5hbWVzcGFjZSgidGNrOnRlc3Rsb2NhbG5hbWVzcGFjZSIpOwotICAgICAgICByZXN1bHQuc2V0RGlzcGxheU5hbWUoIlRDSyAiICsgcHJvcGVydHlUeXBlLnZhbHVlKCkgKyAiIHByb3BlcnRyeSIpOwotICAgICAgICByZXN1bHQuc2V0UXVlcnlOYW1lKCJ0Y2s6IiArIHByb3BlcnR5VHlwZS52YWx1ZSgpKTsKLSAgICAgICAgcmVzdWx0LnNldERlc2NyaXB0aW9uKCJUQ0sgIiArIHByb3BlcnR5VHlwZS52YWx1ZSgpICsgIiBwcm9wZXJ0cnkiKTsKLSAgICAgICAgcmVzdWx0LnNldENhcmRpbmFsaXR5KENhcmRpbmFsaXR5LlNJTkdMRSk7Ci0gICAgICAgIHJlc3VsdC5zZXRVcGRhdGFiaWxpdHkoVXBkYXRhYmlsaXR5LlJFQURXUklURSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc0luaGVyaXRlZChmYWxzZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1F1ZXJ5YWJsZShmYWxzZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc09yZGVyYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlc3VsdC5zZXRJc1JlcXVpcmVkKGZhbHNlKTsKLSAgICAgICAgcmVzdWx0LnNldElzT3BlbkNob2ljZSh0cnVlKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdHlwZXMvU2Vjb25kYXJ5VHlwZXNUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdHlwZXMvU2Vjb25kYXJ5VHlwZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTM0MWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3R5cGVzL1NlY29uZGFyeVR5cGVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMudHlwZXM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5TS0lQUEVEOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZWNvbmRhcnlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuRG9jdW1lbnRUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0OwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VHlwZXNUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLSAgICAgICAgc2V0TmFtZSgiU2Vjb25kYXJ5IFR5cGVzIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgZG9jdW1lbnRzLCBhdHRhY2hlcyBhbmQgZGV0YWNoZXMgc2Vjb25kYXJ5IHR5cGVzLCBjaGVja3MgdGhlIHByb3BlcnRpZXMsIGFuZCBmaW5hbGx5IGRlbGV0ZXMgdGhlIHRlc3QgZG9jdW1lbnRzLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDbWlzVmVyc2lvbigpID09IENtaXNWZXJzaW9uLkNNSVNfMV8wKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJTZWNvbmRhcnkgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgQ01JUyAxLjAuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWhhc1NlY29uZGFyaWVzKHNlc3Npb24pKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJSZXBvc2l0b3J5IGRvZXNuJ3Qgc3VwcG9ydCBzZWNvbmRhcnkgdHlwZXMuIFRlc3Qgc2tpcHBlZCEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBjbWlzOnNlY29uZGFyeU9iamVjdFR5cGVJZHMgcHJvcGVydHkgZGVmaW5pdGlvbgotICAgICAgICBPYmplY3RUeXBlIGRvY1R5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKGdldERvY3VtZW50VGVzdFR5cGVJZCgpKTsKLSAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHNlY1R5cGVzUHJvcERlZiA9IGRvY1R5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldCgKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTKTsKLSAgICAgICAgaWYgKHNlY1R5cGVzUHJvcERlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUZXN0IGRvY3VtZW50IHR5cGUgaGFzIG5vICIgKyBQcm9wZXJ0eUlkcy5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTCi0gICAgICAgICAgICAgICAgICAgICsgIiBwcm9wZXJ0eSEiKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VjVHlwZXNQcm9wRGVmLmdldFVwZGF0YWJpbGl0eSgpICE9IFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoU0tJUFBFRCwKLSAgICAgICAgICAgICAgICAgICAgIlRlc3QgZG9jdW1lbnQgdHlwZSBkb2VzIG5vdCBhbGxvdyBhdHRhY2hpbmcgc2Vjb25kYXJ5IHR5cGVzLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgdGVzdCBmb2xkZXIKLSAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2Vjb25kYXJ5VGVzdFR5cGVJZCA9IGdldFNlY29uZGFyeVRlc3RUeXBlSWQoKTsKLSAgICAgICAgICAgIE9iamVjdFR5cGUgc2Vjb25kYXJ5VGVzdFR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKHNlY29uZGFyeVRlc3RUeXBlSWQpOwotCi0gICAgICAgICAgICBjcmVhdGVEb2N1bWVudEFuZEF0dGFjaFNlY29uZGFyeVR5cGUoc2Vzc2lvbiwgdGVzdEZvbGRlciwgc2Vjb25kYXJ5VGVzdFR5cGUpOwotICAgICAgICAgICAgY3JlYXRlRG9jdW1lbnRXaXRoU2Vjb25kYXJ5VHlwZShzZXNzaW9uLCB0ZXN0Rm9sZGVyLCBzZWNvbmRhcnlUZXN0VHlwZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRG9jdW1lbnRBbmRBdHRhY2hTZWNvbmRhcnlUeXBlKFNlc3Npb24gc2Vzc2lvbiwgRm9sZGVyIHRlc3RGb2xkZXIsIE9iamVjdFR5cGUgc2Vjb25kYXJ5VGVzdFR5cGUpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgImNyZWF0ZWFuZGF0dGFjaC50eHQiLCAiU2Vjb25kYXJ5IFR5cGUgVGVzdCIpOwotICAgICAgICBEb2N1bWVudCB3b3JrRG9jID0gZG9jOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB0ZXN0IGlmIGNoZWNrIG91dCBpcyByZXF1aXJlZAotICAgICAgICAgICAgYm9vbGVhbiBjaGVja2Vkb3V0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobmVlZHNDaGVja091dChkb2MpKSB7Ci0gICAgICAgICAgICAgICAgd29ya0RvYyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QoZG9jLmNoZWNrT3V0KCksIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgIGNoZWNrZWRvdXQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyAtLSBhdHRhY2ggc2Vjb25kYXJ5IHR5cGUKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzZWNvbmRhcnlUeXBlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICAvLyBjb3B5IGFscmVhZHkgYXR0YWNoZWQgc2Vjb25kYXJ5IHR5cGVzLCBpZiB0aGVyZSBhcmUgYW55Ci0gICAgICAgICAgICBpZiAod29ya0RvYy5nZXRTZWNvbmRhcnlUeXBlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFNlY29uZGFyeVR5cGUgc2VjVHlwZSA6IHdvcmtEb2MuZ2V0U2Vjb25kYXJ5VHlwZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlUeXBlcy5hZGQoc2VjVHlwZS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgbmV3IHNlY29uZGFyeSB0eXBlCi0gICAgICAgICAgICBzZWNvbmRhcnlUeXBlcy5hZGQoc2Vjb25kYXJ5VGVzdFR5cGUuZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuU0VDT05EQVJZX09CSkVDVF9UWVBFX0lEUywgc2Vjb25kYXJ5VHlwZXMpOwotCi0gICAgICAgICAgICAvLyBhdHRhY2ggc2Vjb25kYXJ5IHR5cGUKLSAgICAgICAgICAgIE9iamVjdElkIG5ld0lkID0gd29ya0RvYy51cGRhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgICAgICAgICAgRG9jdW1lbnQgbmV3RG9jID0gKERvY3VtZW50KSBzZXNzaW9uLmdldE9iamVjdChuZXdJZCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzZWNvbmRhcnkgdHlwZSBpcyB0aGVyZQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGNoZWNrU2Vjb25kYXJ5VHlwZShuZXdEb2MsIHNlY29uZGFyeVRlc3RUeXBlKTsKLQotICAgICAgICAgICAgLy8gLS0gZGV0YWNoIHNlY29uZGFyeSB0eXBlCi0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICBkZXRhY2hTZWNvbmRhcnlUeXBlKHNlc3Npb24sIG5ld0RvYywgc2Vjb25kYXJ5VGVzdFR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjYW5jZWwgYSBwb3NzaWJsZSBjaGVjayBvdXQKLSAgICAgICAgICAgIGlmIChjaGVja2Vkb3V0KSB7Ci0gICAgICAgICAgICAgICAgd29ya0RvYy5jYW5jZWxDaGVja091dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRG9jdW1lbnRXaXRoU2Vjb25kYXJ5VHlwZShTZXNzaW9uIHNlc3Npb24sIEZvbGRlciB0ZXN0Rm9sZGVyLCBPYmplY3RUeXBlIHNlY29uZGFyeVRlc3RUeXBlKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGNyZWF0ZURvY3VtZW50KHNlc3Npb24sIHRlc3RGb2xkZXIsICJjcmVhdGV3aXRoc2Vjb25kYXJ5dHlwZS50eHQiLCBnZXREb2N1bWVudFRlc3RUeXBlSWQoKSwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBzZWNvbmRhcnlUZXN0VHlwZS5nZXRJZCgpIH0sICJTZWNvbmRhcnkgVHlwZSBUZXN0Iik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzZWNvbmRhcnkgdHlwZSBpcyB0aGVyZQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGNoZWNrU2Vjb25kYXJ5VHlwZShkb2MsIHNlY29uZGFyeVRlc3RUeXBlKTsKLQotICAgICAgICAgICAgLy8gZGV0YWNoIHNlY29uZGFyeSB0eXBlCi0gICAgICAgICAgICBpZiAoZm91bmQgJiYgIW5lZWRzQ2hlY2tPdXQoZG9jKSkgewotICAgICAgICAgICAgICAgIGRldGFjaFNlY29uZGFyeVR5cGUoc2Vzc2lvbiwgZG9jLCBzZWNvbmRhcnlUZXN0VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkc0NoZWNrT3V0KERvY3VtZW50IGRvYykgewotICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgZG9jLmdldFR5cGUoKTsKLSAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHNlY1R5cGVJZHNQcm9wRGVmID0gdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KAotICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMpOwotCi0gICAgICAgIHJldHVybiBzZWNUeXBlSWRzUHJvcERlZi5nZXRVcGRhdGFiaWxpdHkoKSA9PSBVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQKLSAgICAgICAgICAgICAgICB8fCAoIWRvYy5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmNvbnRhaW5zKEFjdGlvbi5DQU5fVVBEQVRFX1BST1BFUlRJRVMpICYmIEJvb2xlYW4uVFJVRQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyh0eXBlLmlzVmVyc2lvbmFibGUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja1NlY29uZGFyeVR5cGUoRG9jdW1lbnQgZG9jLCBPYmplY3RUeXBlIHNlY29uZGFyeVRlc3RUeXBlKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNlY29uZGFyeSB0eXBlIGlzIHRoZXJlCi0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGRvYy5nZXRTZWNvbmRhcnlUeXBlcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50IGRvZXMgbm90IGhhdmUgdGhlIGF0dGFjaGVkIHNlY29uZGFyeSB0eXBlISIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoU2Vjb25kYXJ5VHlwZSBzZWNUeXBlIDogZG9jLmdldFNlY29uZGFyeVR5cGVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5VGVzdFR5cGUuZ2V0SWQoKS5lcXVhbHMoc2VjVHlwZS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgYXR0YWNoZWQgc2Vjb25kYXJ5IHR5cGUhIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGZvdW5kLCBudWxsLCBmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBwcm9wZXJ0aWVzIG9mIHNlY29uZGFyeSB0eXBlCi0gICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gc2Vjb25kYXJ5VHlwZVByb3BlcnRpZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUZXN0VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiBzZWNvbmRhcnlUZXN0VHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VHlwZVByb3BlcnRpZXMuYWRkKHByb3BEZWYuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFByb3BlcnR5PD8+IHByb3AgOiBkb2MuZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICAgICAgc2Vjb25kYXJ5VHlwZVByb3BlcnRpZXMucmVtb3ZlKHByb3AuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkRvY3VtZW50cyBsYWNrcyB0aGUgZm9sbG93aW5nIHNlY29uZGFyeSB0eXBlIHByb3BlcnRpZXM6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBzZWNvbmRhcnlUeXBlUHJvcGVydGllcyk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKHNlY29uZGFyeVR5cGVQcm9wZXJ0aWVzLmlzRW1wdHkoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRhY2hTZWNvbmRhcnlUeXBlKFNlc3Npb24gc2Vzc2lvbiwgRG9jdW1lbnQgZG9jLCBPYmplY3RUeXBlIHNlY29uZGFyeVRlc3RUeXBlKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHNlY29uZGFyeVR5cGVzSWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBmb3IgKFNlY29uZGFyeVR5cGUgc2VjVHlwZSA6IGRvYy5nZXRTZWNvbmRhcnlUeXBlcygpKSB7Ci0gICAgICAgICAgICBpZiAoIXNlY29uZGFyeVRlc3RUeXBlLmdldElkKCkuZXF1YWxzKHNlY1R5cGUuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBzZWNvbmRhcnlUeXBlc0lkLmFkZChzZWNUeXBlLmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFMsIHNlY29uZGFyeVR5cGVzSWQpOwotCi0gICAgICAgIC8vIGRldGFjaCBzZWNvbmRhcnkgdHlwZQotICAgICAgICBPYmplY3RJZCBuZXdJZCA9IGRvYy51cGRhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgICAgICBEb2N1bWVudCBuZXdEb2MgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KG5ld0lkLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdEb2MuZ2V0U2Vjb25kYXJ5VHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFNlY29uZGFyeVR5cGUgc2VjVHlwZSA6IG5ld0RvYy5nZXRTZWNvbmRhcnlUeXBlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlY29uZGFyeVRlc3RUeXBlLmdldElkKCkuZXF1YWxzKHNlY1R5cGUuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBzdGlsbCBoYXMgdGhlIGRldGFjaGVkIHNlY29uZGFyeSB0eXBlISIpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNGYWxzZShmb3VuZCwgbnVsbCwgZikpOwotCi0gICAgICAgIC8vIGNoZWNrIHByb3BlcnRpZXMKLSAgICAgICAgT2JqZWN0VHlwZSBwcmltYXJ5VHlwZSA9IG5ld0RvYy5nZXRUeXBlKCk7Ci0gICAgICAgIExpc3Q8U2Vjb25kYXJ5VHlwZT4gc2Vjb25kYXJ5VHlwZXMgPSBuZXdEb2MuZ2V0U2Vjb25kYXJ5VHlwZXMoKTsKLQotICAgICAgICBmb3IgKFByb3BlcnR5PD8+IHByb3AgOiBkb2MuZ2V0UHJvcGVydGllcygpKSB7Ci0gICAgICAgICAgICBpZiAoIXByaW1hcnlUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5jb250YWluc0tleShwcm9wLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiUHJvcGVydHkgJyIgKyBwcm9wLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIicgaXMgbmVpdGhlciBkZWZpbmVkIGJ5IHRoZSBwcmltYXJ5IHR5cGUgbm9yIGJ5IGEgc2Vjb25kYXJ5IHR5cGUhIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHlwZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFByb3BlcnR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU2Vjb25kYXJ5VHlwZSBzZWNvbmRhcnlUeXBlIDogc2Vjb25kYXJ5VHlwZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlY29uZGFyeVR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmNvbnRhaW5zS2V5KHByb3AuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFByb3BlcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGZvdW5kUHJvcGVydHksIG51bGwsIGYpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdHlwZXMvVHlwZXNUZXN0R3JvdXAuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy90eXBlcy9UeXBlc1Rlc3RHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY3NWJmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy90eXBlcy9UeXBlc1Rlc3RHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy50eXBlczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0R3JvdXA7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGdyb3VwIGNvbnRhaW5zIHRlc3RzIHRoYXQgY2hlY2sgdHlwZSBvcGVyYXRpb25zLgotICovCi1wdWJsaWMgY2xhc3MgVHlwZXNUZXN0R3JvdXAgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0R3JvdXAgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLQotICAgICAgICBzZXROYW1lKCJUeXBlcyBUZXN0IEdyb3VwIik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJUeXBlcyB0ZXN0cy4iKTsKLQotICAgICAgICBhZGRUZXN0KG5ldyBCYXNlVHlwZXNUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBDcmVhdGVBbmREZWxldGVUeXBlVGVzdCgpKTsKLSAgICAgICAgYWRkVGVzdChuZXcgU2Vjb25kYXJ5VHlwZXNUZXN0KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy92ZXJzaW9uaW5nL0NoZWNrZWRPdXRUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdmVyc2lvbmluZy9DaGVja2VkT3V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNkNTMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy92ZXJzaW9uaW5nL0NoZWNrZWRPdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy52ZXJzaW9uaW5nOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkl0ZW1JdGVyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5pbXBsLkFic3RyYWN0U2Vzc2lvblRlc3Q7Ci0KLS8qKgotICogQ2hlY2tlZCBvdXQgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIENoZWNrZWRPdXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJDaGVja2VkIG91dCBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDYWxscyBnZXRDaGVja2VkT3V0RG9jcygpIGFuZCBjaGVja3MgdGhlIHJldHVybmVkIG9iamVjdHMuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIGJvb2xlYW4gc3VwcG9ydHNPcmRlckJ5TmFtZSA9IGlzT3JkZXJCeU5hbWVTdXBwb3J0ZWQoc2Vzc2lvbik7Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3JkZXJDb250ZXh0ID0gKHN1cHBvcnRzT3JkZXJCeU5hbWUgPyBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DX09SREVSX0JZX05BTUUKLSAgICAgICAgICAgICAgICA6IFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgIERvY3VtZW50IHB3YyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgZm9sZGVyIGFuZCBhIGNoZWNrZWQtb3V0IGRvY3VtZW50Ci0gICAgICAgICAgICBGb2xkZXIgdGVzdEZvbGRlciA9IGNyZWF0ZVRlc3RGb2xkZXIoc2Vzc2lvbik7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBjcmVhdGVEb2N1bWVudChzZXNzaW9uLCB0ZXN0Rm9sZGVyLCAiY2hlY2tlZG91dHRlc3QudHh0IiwgImNoZWNrZWQgb3V0Iik7Ci0gICAgICAgICAgICBEb2N1bWVudFR5cGVEZWZpbml0aW9uIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlRGVmaW5pdGlvbikgZG9jLmdldFR5cGUoKTsKLQotICAgICAgICAgICAgaWYgKCFkb2NUeXBlLmlzVmVyc2lvbmFibGUoKSkgewotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywgIlRlc3QgdHlwZSBpcyBub3QgdmVyc2lvbmFibGUuIENoZWNrIG91dCBza2lwcGVkISIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0SWQgcHdjSWQgPSBkb2MuY2hlY2tPdXQoKTsKLSAgICAgICAgICAgICAgICBwd2MgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KHB3Y0lkLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGVzdCBhbGwgY2hlY2tlZC1vdXQgZG9jdW1lbnRzCi0gICAgICAgICAgICBpbnQgc2Vzc2lvbkNoZWNrZWRPdXQgPSBjaGVja1BXQ3Moc2Vzc2lvbiwgc2Vzc2lvbi5nZXRDaGVja2VkT3V0RG9jcyhvcmRlckNvbnRleHQpLCBzdXBwb3J0c09yZGVyQnlOYW1lKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KHNlc3Npb25DaGVja2VkT3V0ICsgIiBjaGVja2VkIG91dCBkb2N1bWVudChzKSBvdmVyYWxsLiIpKTsKLQotICAgICAgICAgICAgaWYgKHB3YyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBjaGVja2VkIG91dCBkb2N1bWVudCBpbiB0aGUgcmVwb3NpdG9yeSEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKHNlc3Npb25DaGVja2VkT3V0ID49IDEsIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGVzdCBjaGVja2VkLW91dCBkb2N1bWVudHMgaW4gdGhlIHRlc3QgZm9sZGVyCi0gICAgICAgICAgICBpbnQgdGVzdEZvbGRlckNoZWNrZWRPdXQgPSBjaGVja1BXQ3Moc2Vzc2lvbiwgdGVzdEZvbGRlci5nZXRDaGVja2VkT3V0RG9jcyhvcmRlckNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c09yZGVyQnlOYW1lKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVJbmZvUmVzdWx0KHRlc3RGb2xkZXJDaGVja2VkT3V0ICsgIiBjaGVja2VkIG91dCBkb2N1bWVudChzKSBpbiB0aGUgdGVzdCBmb2xkZXIuIikpOwotCi0gICAgICAgICAgICBpZiAocHdjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGNoZWNrZWQgb3V0IGRvY3VtZW50IGluIHRoZSB0ZXN0IGZvbGRlciEiKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKHRlc3RGb2xkZXJDaGVja2VkT3V0ID49IDEsIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBQV0MgYW5kIGRvY3VtZW50Ci0gICAgICAgICAgICBpZiAocHdjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwd2MuY2FuY2VsQ2hlY2tPdXQoKTsKLSAgICAgICAgICAgICAgICBwd2MgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvYyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocHdjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwd2MuY2FuY2VsQ2hlY2tPdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNoZWNrUFdDcyhTZXNzaW9uIHNlc3Npb24sIEl0ZW1JdGVyYWJsZTxEb2N1bWVudD4gcHdjcywgYm9vbGVhbiBjaGVja09yZGVyKSB7Ci0gICAgICAgIGlmIChwd2NzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGludCBvcmRlckJ5TmFtZUlzc3VlcyA9IDA7Ci0gICAgICAgIFN0cmluZyBsYXN0TmFtZSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChEb2N1bWVudCBwd2MgOiBwd2NzKSB7Ci0gICAgICAgICAgICBpZiAocHdjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUaGUgbGlzdCBvZiBjaGVja2VkIG91dCBkb2N1bWVudHMgY29udGFpbnMgYSBudWxsIGVudHJ5ISIpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nW10gcHJvcGVydGllc1RvQ2hlY2sgPSBnZXRBbGxQcm9wZXJ0aWVzKHB3Yyk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcHdjLCBwcm9wZXJ0aWVzVG9DaGVjaywgIlBXQyBjaGVjazogIiArIHB3Yy5nZXRJZCgpKSk7Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0Q21pc1ZlcnNpb24oKSA9PSBDbWlzVmVyc2lvbi5DTUlTXzFfMCkgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoV0FSTklORywgIlBXQyBpcyBub3QgdGhlIGxhdGVzdCB2ZXJzaW9uISBJZDogIiArIHB3Yy5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgKE5vdGU6IFRoZSB3b3JkcyBvZiB0aGUgQ01JUyBzcGVjaWZpY2F0aW9uIGRlZmluZSB0aGF0IHRoZSBQV0MgaXMgdGhlIGxhdGVzdCB2ZXJzaW9uLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBCdXQgdGhhdCBpcyBub3QgdGhlIGludGVudGlvbiBvZiB0aGUgc3BlYyBhbmQgd2lsbCBiZSBjaGFuZ2VkIGluIENNSVMgMS4xLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBUaHVzIHRoaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IuKSIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUocHdjLmlzTGF0ZXN0VmVyc2lvbigpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcHJvcGVydHkgdmFsdWUgb2YgJ2NtaXM6aXNMYXRlc3RWZXJzaW9uJyBpcyBUUlVFIGZvciBhIFBXQyEgSWQ6ICIgKyBwd2MuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UocHdjLmlzTGF0ZXN0VmVyc2lvbigpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVGhlIHByb3BlcnR5IHZhbHVlIG9mICdjbWlzOmlzTGF0ZXN0TWFqb3JWZXJzaW9uJyBpcyBUUlVFIGZvciBhIFBXQyEgSWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHdjLmdldElkKCkpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc0ZhbHNlKHB3Yy5pc0xhdGVzdE1ham9yVmVyc2lvbigpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsYXN0TmFtZSAhPSBudWxsICYmIHB3Yy5nZXROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChwd2MuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobGFzdE5hbWUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBvcmRlckJ5TmFtZUlzc3VlcysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGFzdE5hbWUgPSBwd2MuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hlY2tPcmRlcikgewotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiQ2hlY2tlZC1vdXQgZG9jdW1lbnRzIHNob3VsZCBiZSBvcmRlcmVkIGJ5IGNtaXM6bmFtZSwgYnV0IHRoZXkgYXJlIG5vdCEgKEl0IG1pZ2h0IGJlIGEgY29sbGF0aW9uIG1pc21hdGNoLikiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoMCwgb3JkZXJCeU5hbWVJc3N1ZXMsIG51bGwsIGYpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoSU5GTywgIlJlcG9zaXRvcnkgZG9lc24ndCBzdXBwb3J0IE9yZGVyIEJ5IGZvciBnZXRDaGVja2VkT3V0RG9jcygpLiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy92ZXJzaW9uaW5nL1ZlcnNpb25EZWxldGVUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdmVyc2lvbmluZy9WZXJzaW9uRGVsZXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmZhMmRiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy92ZXJzaW9uaW5nL1ZlcnNpb25EZWxldGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay50ZXN0cy52ZXJzaW9uaW5nOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25EZWxldGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgewotICAgICAgICBzdXBlci5pbml0KHBhcmFtZXRlcnMpOwotICAgICAgICBzZXROYW1lKCJWZXJzaW9uaW5nIERlbGV0ZSBUZXN0Iik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJDcmVhdGVzIGEgZG9jdW1lbnQsIGFkZHMgdGhyZWUgdmVyc2lvbnMgYW5kIGRlbGV0ZXMgdGhlIGN1cnJlbnQgdmVyc2lvbiB1bnRpbCB0aGUgZG9jdW1lbnQgaXMgZ29uZS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgZm9sZGVyIGFuZCBkb2N1bWVudAotICAgICAgICAgICAgRm9sZGVyIHRlc3RGb2xkZXIgPSBjcmVhdGVUZXN0Rm9sZGVyKHNlc3Npb24pOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gY3JlYXRlRG9jdW1lbnQoc2Vzc2lvbiwgdGVzdEZvbGRlciwgInZlcnNpb25kZWxldGV0ZXN0LnR4dCIsICJ2MSIpOwotICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2NUeXBlID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pIGRvYy5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICghZG9jVHlwZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJUZXN0IHR5cGUgaXMgbm90IHZlcnNpb25hYmxlLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgIGRvYy5kZWxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdmVyc2lvbnMKLSAgICAgICAgICAgIERvY3VtZW50IGRvYzIgPSBjcmVhdGVWZXJzaW9uKHNlc3Npb24sIGRvYywgInYyIiwgMik7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MzID0gY3JlYXRlVmVyc2lvbihzZXNzaW9uLCBkb2MyLCAidjMiLCAzKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYzQgPSBjcmVhdGVWZXJzaW9uKHNlc3Npb24sIGRvYzMsICJ2NCIsIDQpOwotCi0gICAgICAgICAgICAvLyBkZWxldGUgdmVyc2lvbnMKLSAgICAgICAgICAgIGRlbGV0ZVZlcnNpb24oZG9jNCwgZG9jMywgNCk7Ci0gICAgICAgICAgICBkZWxldGVWZXJzaW9uKGRvYzMsIGRvYzIsIDMpOwotICAgICAgICAgICAgZGVsZXRlVmVyc2lvbihkb2MyLCBkb2MsIDIpOwotICAgICAgICAgICAgZGVsZXRlVmVyc2lvbihkb2MsIG51bGwsIDEpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IGNyZWF0ZVZlcnNpb24oU2Vzc2lvbiBzZXNzaW9uLCBEb2N1bWVudCBkb2MsIFN0cmluZyBjb250ZW50LCBpbnQgdmVyc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIC8vIGNoZWNrIG91dAotICAgICAgICBPYmplY3RJZCBwd2NJZCA9IGRvYy5jaGVja091dCgpOwotICAgICAgICBEb2N1bWVudCBwd2MgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KHB3Y0lkLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcHdjLCBnZXRBbGxQcm9wZXJ0aWVzKHB3YyksICJQV0MgIiArIHZlcnNpb24gKyAiIGNvbXBsaWFuY2UiKSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaW4KLSAgICAgICAgYnl0ZVtdIGNvbnRlbnRCeXRlcyA9IElPVXRpbHMudG9VVEY4Qnl0ZXMoY29udGVudCk7Ci0KLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKGRvYy5nZXROYW1lKCksIEJpZ0ludGVnZXIudmFsdWVPZihjb250ZW50Qnl0ZXMubGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAidGV4dC9wbGFpbiIsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50Qnl0ZXMpKTsKLQotICAgICAgICBPYmplY3RJZCBuZXdWZXJzaW9uSWQgPSBwd2MuY2hlY2tJbih0cnVlLCBudWxsLCBjb250ZW50U3RyZWFtLCAidGVzdCB2ZXJzaW9uICIgKyB2ZXJzaW9uKTsKLQotICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShjb250ZW50U3RyZWFtKTsKLQotICAgICAgICBEb2N1bWVudCBuZXdWZXJzaW9uID0gKERvY3VtZW50KSBzZXNzaW9uLmdldE9iamVjdChuZXdWZXJzaW9uSWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCBuZXdWZXJzaW9uLCBnZXRBbGxQcm9wZXJ0aWVzKG5ld1ZlcnNpb24pLCAiVmVyc2lvbiAiICsgdmVyc2lvbiArICIgY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAvLyBjaGVjayB2ZXJzaW9uIGhpc3RvcnkKLSAgICAgICAgTGlzdDxEb2N1bWVudD4gdmVyc2lvbnMgPSBkb2MuZ2V0QWxsVmVyc2lvbnMoKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIHNlcmllcyBzaG91bGQgaGF2ZSAiICsgdmVyc2lvbiArICIgdmVyc2lvbnMgYnV0IGhhcyAiICsgdmVyc2lvbnMuc2l6ZSgpCi0gICAgICAgICAgICAgICAgKyAiISIpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKHZlcnNpb24sIHZlcnNpb25zLnNpemUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGlmICghdmVyc2lvbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJOZXdseSBjcmVhdGVkIHZlcnNpb24gIiArIHZlcnNpb24gKyAiIGlzIG5vdCB0aGUgbGF0ZXN0IHZlcnNpb24hIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKG5ld1ZlcnNpb24uZ2V0SWQoKSwgdmVyc2lvbnMuZ2V0KDApLmdldElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgaWYgKHZlcnNpb25zLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUaGUgcHJldmlvdXMgdmVyc2lvbiBvZiB2ZXJzaW9uICIgKyB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IHRoZSBkb2N1bWVudCBpdCBoYXMgYmVlbiBjcmVhdGVkIGZyb20hIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhkb2MuZ2V0SWQoKSwgdmVyc2lvbnMuZ2V0KDEpLmdldElkKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXdWZXJzaW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVWZXJzaW9uKERvY3VtZW50IHZlcnNpb25Eb2MsIERvY3VtZW50IHByZXZpb3VzRG9jLCBpbnQgdmVyc2lvbikgewotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIC8vIGdldCB2ZXJzaW9uIGhpc3RvcnkgYmVmb3JlIGRlbGV0ZQotICAgICAgICBMaXN0PERvY3VtZW50PiB2ZXJzaW9uc0JlZm9yZSA9IHZlcnNpb25Eb2MuZ2V0QWxsVmVyc2lvbnMoKTsKLQotICAgICAgICAvLyBkZWxldGUgYW5kIGNoZWNrCi0gICAgICAgIHZlcnNpb25Eb2MuZGVsZXRlKGZhbHNlKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEZWxldGVkIHZlcnNpb24gIiArIHZlcnNpb24gKyAiIHN0aWxsIGV4aXN0cyEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoZXhpc3RzKHZlcnNpb25Eb2MpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdmVyc2lvbiBoaXN0b3J5IGFmdGVyIGRlbGV0ZQotICAgICAgICBpZiAocHJldmlvdXNEb2MgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxEb2N1bWVudD4gdmVyc2lvbnNBZnRlciA9IHByZXZpb3VzRG9jLmdldEFsbFZlcnNpb25zKCk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIkFmdGVyIHZlcnNpb24gIiArIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBiZWVuIGRlbGV0ZWQsIHRoZSB2ZXJzaW9uIGhpc3Rvcnkgc2hvdWxkIGNvbnNpc3Qgb2YgIiArICh2ZXJzaW9uc0JlZm9yZS5zaXplKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICArICIgIGRvY3VtZW50cyBidXQgaXMgaGFzICIgKyB2ZXJzaW9uc0FmdGVyLnNpemUoKSArICIgISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyh2ZXJzaW9uc0JlZm9yZS5zaXplKCkgLSAxLCB2ZXJzaW9uc0FmdGVyLnNpemUoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3ZlcnNpb25pbmcvVmVyc2lvbmluZ1Ntb2tlVGVzdC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3ZlcnNpb25pbmcvVmVyc2lvbmluZ1Ntb2tlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzUwMDI1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy92ZXJzaW9uaW5nL1ZlcnNpb25pbmdTbW9rZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLnZlcnNpb25pbmc7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5PSzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVXBkYXRhYmlsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5DbWlzVGVzdFJlc3VsdEltcGw7Ci0KLS8qKgotICogQ2hlY2tlZCBvdXQgdGVzdC4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25pbmdTbW9rZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIlZlcnNpb25pbmcgU21va2UgVGVzdCIpOwotICAgICAgICBzZXREZXNjcmlwdGlvbigiQ3JlYXRlcyBhIGRvY3VtZW50LCBjaGVja3MgaXQgb3V0LCBjYW5jZWxzIHRoZSBjaGVjayBvdXQsIGNoZWNrcyBpdCBvdXQgYWdhaW4gYW5kIGZpbmFsbHkgY2hlY2tzIGl0IGluLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bihTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGZvbGRlciBhbmQgZG9jdW1lbnQKLSAgICAgICAgICAgIEZvbGRlciB0ZXN0Rm9sZGVyID0gY3JlYXRlVGVzdEZvbGRlcihzZXNzaW9uKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGNyZWF0ZURvY3VtZW50KHNlc3Npb24sIHRlc3RGb2xkZXIsICJ2ZXJzaW9uaW5ndGVzdC50eHQiLCAidmVyc2lvbmluZyIpOwotICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2NUeXBlID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pIGRvYy5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICghZG9jVHlwZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJUZXN0IHR5cGUgaXMgbm90IHZlcnNpb25hYmxlLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgIGRvYy5kZWxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnYXRoZXIgcHJvcGVydGllcyBmb3IgbGF0ZXIKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXNUb0NoZWNrID0gbmV3IFN0cmluZ1tkb2MuZ2V0VHlwZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCldOwotCi0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9wSWQgOiBkb2MuZ2V0VHlwZSgpLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrW2krK10gPSBwcm9wSWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gd3JpdGFibGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5PD8+IHByb3BlcnR5IDogZG9jLmdldFByb3BlcnRpZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5nZXREZWZpbml0aW9uKCkuZ2V0VXBkYXRhYmlsaXR5KCkgPT0gVXBkYXRhYmlsaXR5LlJFQURXUklURSkgewotICAgICAgICAgICAgICAgICAgICB3cml0YWJsZVByb3BlcnRpZXMucHV0KHByb3BlcnR5LmdldElkKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgb3V0Ci0gICAgICAgICAgICBPYmplY3RJZCBwd2NJZCA9IGRvYy5jaGVja091dCgpOwotICAgICAgICAgICAgRG9jdW1lbnQgcHdjID0gKERvY3VtZW50KSBzZXNzaW9uLmdldE9iamVjdChwd2NJZCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCBwd2MsIGdldEFsbFByb3BlcnRpZXMocHdjKSwgIlBXQyBzcGVjIGNvbXBsaWFuY2UgLSB0ZXN0IDEiKSk7Ci0KLSAgICAgICAgICAgIGNoZWNrQ2hlY2tlZE91dChwd2MpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB2ZXJzaW9uIHNlcmllcwotICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrVmVyc2lvblNlcmllcyhzZXNzaW9uLCBwd2MuZ2V0QWxsVmVyc2lvbnMoU0VMRUNUX0FMTF9OT19DQUNIRV9PQyksIHByb3BlcnRpZXNUb0NoZWNrLAotICAgICAgICAgICAgICAgICAgICAiVGVzdCB2ZXJzaW9uIHNlcmllcyBhZnRlciBjaGVjayBvdXQiKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhbmNlbCBjaGVja291dAotICAgICAgICAgICAgcHdjLmNhbmNlbENoZWNrT3V0KCk7Ci0KLSAgICAgICAgICAgIGRvYy5yZWZyZXNoKCk7Ci0gICAgICAgICAgICBjaGVja0NoZWNrZWRJbihkb2MpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBvdXQgYWdhaW4KLSAgICAgICAgICAgIHB3Y0lkID0gZG9jLmNoZWNrT3V0KCk7Ci0gICAgICAgICAgICBwd2MgPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KHB3Y0lkLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLQotICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrT2JqZWN0KHNlc3Npb24sIHB3YywgZ2V0QWxsUHJvcGVydGllcyhwd2MpLCAiUFdDIHNwZWMgY29tcGxpYW5jZSAtIHRlc3QgMiIpKTsKLQotICAgICAgICAgICAgY2hlY2tDaGVja2VkT3V0KHB3Yyk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGluCi0gICAgICAgICAgICBPYmplY3RJZCBuZXdWZXJzaW9uSWQgPSBwd2MuY2hlY2tJbih0cnVlLCBudWxsLCBudWxsLCAiVGVzdCBWZXJzaW9uIDIiKTsKLSAgICAgICAgICAgIERvY3VtZW50IG5ld1ZlcnNpb24gPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KG5ld1ZlcnNpb25JZCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCBuZXdWZXJzaW9uLCBnZXRBbGxQcm9wZXJ0aWVzKG5ld1ZlcnNpb24pLCAiTmV3IHZlcnNpb24gY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAgICAgY2hlY2tDaGVja2VkSW4obmV3VmVyc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHZlcnNpb24gaGlzdG9yeQotICAgICAgICAgICAgTGlzdDxEb2N1bWVudD4gdmVyc2lvbnMgPSBuZXdWZXJzaW9uLmdldEFsbFZlcnNpb25zKFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVmVyc2lvbiBzZXJpZXMgc2hvdWxkIGhhdmUgMiB2ZXJzaW9ucyBidXQgaGFzICIgKyB2ZXJzaW9ucy5zaXplKCkgKyAiISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygyLCB2ZXJzaW9ucy5zaXplKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgaWYgKCF2ZXJzaW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiBoaXN0b3J5IG9yZGVyIGlzIGluY29ycmVjdCEgVGhlIGZpcnN0IHZlcnNpb24gc2hvdWxkIGJlIHRoZSBuZXcgdmVyc2lvbi4iKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKG5ld1ZlcnNpb24uZ2V0SWQoKSwgdmVyc2lvbnMuZ2V0KDApLmdldElkKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbmV3IHZlcnNpb24gc2hvdWxkIGJlIHRoZSBsYXRlc3QgdmVyc2lvbiwgYnV0IGNtaXM6aXNMYXRlc3RWZXJzaW9uIGlzIG5vdCBUUlVFLiIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHModHJ1ZSwgdmVyc2lvbnMuZ2V0KDApLmlzTGF0ZXN0VmVyc2lvbigpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5ldyB2ZXJzaW9uIHNob3VsZCBiZSB0aGUgbGF0ZXN0IG1ham9yIHZlcnNpb24sIGJ1dCBjbWlzOmlzTGF0ZXN0TWFqb3JWZXJzaW9uIGlzIG5vdCBUUlVFLiIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHModHJ1ZSwgdmVyc2lvbnMuZ2V0KDApLmlzTGF0ZXN0TWFqb3JWZXJzaW9uKCksIG51bGwsIGYpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZlcnNpb25zLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiBoaXN0b3J5IG9yZGVyIGlzIGluY29ycmVjdCEgVGhlIHNlY29uZCB2ZXJzaW9uIHNob3VsZCBiZSB0aGUgb3JpZ2luIGRvY3VtZW50LiIpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRFcXVhbHMoZG9jLmdldElkKCksIHZlcnNpb25zLmdldCgxKS5nZXRJZCgpLCBudWxsLCBmKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHZlcnNpb24gc2VyaWVzCi0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tWZXJzaW9uU2VyaWVzKHNlc3Npb24sIHZlcnNpb25zLCBwcm9wZXJ0aWVzVG9DaGVjaywgIlRlc3QgdmVyc2lvbiBzZXJpZXMgYWZ0ZXIgY2hlY2sgaW4iKSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG91dCBhZ2FpbgotICAgICAgICAgICAgcHdjSWQgPSBkb2MuY2hlY2tPdXQoKTsKLSAgICAgICAgICAgIHB3YyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QocHdjSWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcHdjLCBnZXRBbGxQcm9wZXJ0aWVzKHB3YyksICJQV0Mgc3BlYyBjb21wbGlhbmNlIC0gdGVzdCAzIikpOwotCi0gICAgICAgICAgICBjaGVja0NoZWNrZWRPdXQocHdjKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaW4gZ2l2aW5nIGJhY2sgYWxsIHVwZGF0ZWFibGUgcHJvcGVydGllcwotICAgICAgICAgICAgT2JqZWN0SWQgdGhpcmRWZXJzaW9uSWQgPSBwd2MuY2hlY2tJbih0cnVlLCB3cml0YWJsZVByb3BlcnRpZXMsIG51bGwsICJUZXN0IFZlcnNpb24gMyIpOwotICAgICAgICAgICAgRG9jdW1lbnQgdGhpcmRWZXJzaW9uID0gKERvY3VtZW50KSBzZXNzaW9uLmdldE9iamVjdCh0aGlyZFZlcnNpb25JZCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCB0aGlyZFZlcnNpb24sIGdldEFsbFByb3BlcnRpZXModGhpcmRWZXJzaW9uKSwgIk5ldyB2ZXJzaW9uIGNvbXBsaWFuY2UiKSk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG91dCBhZ2FpbgotICAgICAgICAgICAgcHdjSWQgPSBkb2MuY2hlY2tPdXQoKTsKLSAgICAgICAgICAgIHB3YyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QocHdjSWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcHdjLCBnZXRBbGxQcm9wZXJ0aWVzKHB3YyksICJQV0Mgc3BlYyBjb21wbGlhbmNlIC0gdGVzdCA0IikpOwotCi0gICAgICAgICAgICBjaGVja0NoZWNrZWRPdXQocHdjKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaW4gZ2l2aW5nIGEgbmV3IGNvbnRlbnQgc3RyZWFtCi0gICAgICAgICAgICBTdHJpbmcgZm91cnRoQ29udGVudCA9ICJuZXcgY29udGVudCI7Ci0gICAgICAgICAgICBieXRlW10gZm91cnRoQ29udGVudEJ5dGVzID0gSU9VdGlscy50b1VURjhCeXRlcyhmb3VydGhDb250ZW50KTsKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gZm91cnRoQ29udGVudFN0cmVhbSA9IG5ldyBDb250ZW50U3RyZWFtSW1wbCgidmVyc2lvbjQiLAotICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoZm91cnRoQ29udGVudEJ5dGVzLmxlbmd0aCksICJ0ZXh0L3BsYWluIiwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdXJ0aENvbnRlbnRCeXRlcykpOwotCi0gICAgICAgICAgICBPYmplY3RJZCBmb3VydGhWZXJzaW9uSWQgPSBwd2MuY2hlY2tJbih0cnVlLCBudWxsLCBmb3VydGhDb250ZW50U3RyZWFtLCAiVGVzdCBWZXJzaW9uIDUiKTsKLSAgICAgICAgICAgIERvY3VtZW50IGZvdXJ0aFZlcnNpb24gPSAoRG9jdW1lbnQpIHNlc3Npb24uZ2V0T2JqZWN0KGZvdXJ0aFZlcnNpb25JZCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0KLSAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCBmb3VydGhWZXJzaW9uLCBnZXRBbGxQcm9wZXJ0aWVzKGZvdXJ0aFZlcnNpb24pLCAiTmV3IHZlcnNpb24gY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAgICAgY2hlY2tDaGVja2VkSW4oZm91cnRoVmVyc2lvbik7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIG91dCBhZ2FpbgotICAgICAgICAgICAgcHdjSWQgPSBkb2MuY2hlY2tPdXQoKTsKLSAgICAgICAgICAgIHB3YyA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QocHdjSWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgcHdjLCBnZXRBbGxQcm9wZXJ0aWVzKHB3YyksICJQV0Mgc3BlYyBjb21wbGlhbmNlIC0gdGVzdCA1IikpOwotCi0gICAgICAgICAgICBjaGVja0NoZWNrZWRPdXQocHdjKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY2hlY2sgaW4gZ2l2aW5nIHByb3BlcnRpZXMgYW5kIGEgbmV3IGNvbnRlbnQgc3RyZWFtCi0gICAgICAgICAgICBTdHJpbmcgZmlmdGhDb250ZW50ID0gImJyYW5kLW5ldyBjb250ZW50IjsKLSAgICAgICAgICAgIGJ5dGVbXSBmaWZ0aENvbnRlbnRCeXRlcyA9IElPVXRpbHMudG9VVEY4Qnl0ZXMoZmlmdGhDb250ZW50KTsKLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gZmlmdGhDb250ZW50U3RyZWFtID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCJ2ZXJzaW9uNSIsCi0gICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihmaWZ0aENvbnRlbnRCeXRlcy5sZW5ndGgpLCAidGV4dC9wbGFpbiIsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWZ0aENvbnRlbnRCeXRlcykpOwotCi0gICAgICAgICAgICBPYmplY3RJZCBmaWZ0aFZlcnNpb25JZCA9IHB3Yy5jaGVja0luKHRydWUsIHdyaXRhYmxlUHJvcGVydGllcywgZmlmdGhDb250ZW50U3RyZWFtLCAiVGVzdCBWZXJzaW9uIDUiKTsKLSAgICAgICAgICAgIERvY3VtZW50IGZpZnRoVmVyc2lvbiA9IChEb2N1bWVudCkgc2Vzc2lvbi5nZXRPYmplY3QoZmlmdGhWZXJzaW9uSWQsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZmlmdGhWZXJzaW9uLCBnZXRBbGxQcm9wZXJ0aWVzKGZpZnRoVmVyc2lvbiksICJOZXcgdmVyc2lvbiBjb21wbGlhbmNlIikpOwotCi0gICAgICAgICAgICBjaGVja0NoZWNrZWRJbihmaWZ0aFZlcnNpb24pOwotCi0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGRlbGV0ZVRlc3RGb2xkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0NoZWNrZWRPdXQoRG9jdW1lbnQgcHdjKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVmVyc2lvbiBzZXJpZXMgaGFzIGEgUFdDIGJ1dCBjbWlzOmlzVmVyc2lvblNlcmllc0NoZWNrZWRPdXQgaXMgbm90IFRSVUUhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUocHdjLmlzVmVyc2lvblNlcmllc0NoZWNrZWRPdXQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGlmIChwd2MuZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoV0FSTklORywgImNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCBpcyBub3Qgc2V0ISIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlBXQyBpZCBhbmQgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkIGRvbid0IG1hdGNoISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscyhwd2MuZ2V0SWQoKSwgcHdjLmdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0KLSAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiUFdDIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBmb3IgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5ISIpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0U3RyaW5nTm90RW1wdHkocHdjLmdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0QnkoKSwgbnVsbCwgZikpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0NoZWNrZWRJbihEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgQ21pc1Rlc3RSZXN1bHQgZjsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIHNlcmllcyBpcyBub3QgY2hlY2tlZCBvdXQgYnV0IGNtaXM6aXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCBpcyBub3QgRkFMU0UhIik7Ci0gICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc0ZhbHNlKGRvYy5pc1ZlcnNpb25TZXJpZXNDaGVja2VkT3V0KCksIG51bGwsIGYpKTsKLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJWZXJzaW9uIHNlcmllcyBpcyBub3QgY2hlY2tlZCBvdXQgYnV0IGNtaXM6dmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCBoYXMgYSB2YWx1ZSEiKTsKLSAgICAgICAgYWRkUmVzdWx0KGFzc2VydE51bGwoZG9jLmdldFZlcnNpb25TZXJpZXNDaGVja2VkT3V0SWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlZlcnNpb24gc2VyaWVzIGlzIG5vdCBjaGVja2VkIG91dCBidXQgY21pczp2ZXJzaW9uU2VyaWVzQ2hlY2tlZE91dEJ5IGhhcyBhIHZhbHVlISIpOwotICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0TnVsbChkb2MuZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRCeSgpLCBudWxsLCBmKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbWlzVGVzdFJlc3VsdCBjaGVja1ZlcnNpb25TZXJpZXMoU2Vzc2lvbiBzZXNzaW9uLCBMaXN0PERvY3VtZW50PiB2ZXJzaW9ucywgU3RyaW5nW10gcHJvcGVydGllcywKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIExpc3Q8Q21pc1Rlc3RSZXN1bHQ+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0UmVzdWx0PigpOwotICAgICAgICBDbWlzVGVzdFJlc3VsdCBmOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBsYXRlc3QgdmVyc2lvbgotICAgICAgICAvLyBhbmQgemVybyBvciBvbmUgbGF0ZXN0IG1ham9yIHZlcnNpb24KLSAgICAgICAgaW50IGNvdW50TGF0ZXN0ID0gMDsKLSAgICAgICAgaW50IGNvdW50TGF0ZXN0TWFqb3IgPSAwOwotICAgICAgICBTdHJpbmcgbGF0ZXN0SWQgPSBudWxsOwotICAgICAgICBmb3IgKERvY3VtZW50IHZlcnNpb24gOiB2ZXJzaW9ucykgewotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGNoZWNrT2JqZWN0KHNlc3Npb24sIHZlcnNpb24sIHByb3BlcnRpZXMsICJWZXJzaW9uIG9iamVjdCBjaGVjazogIiArIHZlcnNpb24uZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyh2ZXJzaW9uLmlzTGF0ZXN0VmVyc2lvbigpKSkgewotICAgICAgICAgICAgICAgIGNvdW50TGF0ZXN0Kys7Ci0gICAgICAgICAgICAgICAgbGF0ZXN0SWQgPSB2ZXJzaW9uLmdldElkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKHZlcnNpb24uaXNMYXRlc3RNYWpvclZlcnNpb24oKSkpIHsKLSAgICAgICAgICAgICAgICBjb3VudExhdGVzdE1ham9yKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJUaGUgdmVyc2lvbiBzZXJpZXMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGxhdGVzdCB2ZXJzaW9uLCBidXQgaXQgaGFzICIgKyBjb3VudExhdGVzdAotICAgICAgICAgICAgICAgICsgIiEiKTsKLSAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscygxLCBjb3VudExhdGVzdCwgbnVsbCwgZikpOwotCi0gICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlRoZSB2ZXJzaW9uIHNlcmllcyBtdXN0IGhhdmUgemVybyBvciBvbmUgbGF0ZXN0IG1ham9yIHZlcnNpb24sIGJ1dCBpdCBoYXMgIgotICAgICAgICAgICAgICAgICsgY291bnRMYXRlc3RNYWpvciArICIhIik7Ci0gICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRJc1RydWUoY291bnRMYXRlc3RNYWpvciA8IDIsIG51bGwsIGYpKTsKLQotICAgICAgICAvLyBjaGVjayBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24oKQotICAgICAgICBpZiAoY291bnRMYXRlc3QgPT0gMSkgewotICAgICAgICAgICAgRG9jdW1lbnQgbGF0ZXN0VmVyc2lvbiA9IHZlcnNpb25zLmdldCgwKS5nZXRPYmplY3RPZkxhdGVzdFZlcnNpb24oZmFsc2UsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgYWRkUmVzdWx0KAotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICBjaGVja09iamVjdChzZXNzaW9uLCBsYXRlc3RWZXJzaW9uLCBwcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXRlc3QgdmVyc2lvbiBvYmplY3QgY2hlY2s6ICIgKyBsYXRlc3RWZXJzaW9uLmdldElkKCkpKTsKLQotICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLAotICAgICAgICAgICAgICAgICAgICAiVGhlIHZlcnNpb24gdGhhdCBpcyBmbGFnZ2VkIGFzIGxhdGVzdCB2ZXJzaW9uIGlzIG5vdCByZXR1cm5lZCBieSBnZXRPYmplY3RPZkxhdGVzdFZlcnNpb24oKSEiKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChyZXN1bHRzLCBhc3NlcnRFcXVhbHMobGF0ZXN0SWQsIGxhdGVzdFZlcnNpb24uZ2V0SWQoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAvLyBjaGVjayB3aXRoIHNlc3Npb24uZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKCkKLSAgICAgICAgICAgIERvY3VtZW50IGxhdGVzdFZlcnNpb24yID0gc2Vzc2lvbi5nZXRMYXRlc3REb2N1bWVudFZlcnNpb24odmVyc2lvbnMuZ2V0KHZlcnNpb25zLnNpemUoKSAtIDEpLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotCi0gICAgICAgICAgICBhZGRSZXN1bHQoCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrT2JqZWN0KHNlc3Npb24sIGxhdGVzdFZlcnNpb24yLCBwcm9wZXJ0aWVzLCAiTGF0ZXN0IHZlcnNpb24gb2JqZWN0IGNoZWNrICgyKTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGF0ZXN0VmVyc2lvbjIuZ2V0SWQoKSkpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsCi0gICAgICAgICAgICAgICAgICAgICJUaGUgdmVyc2lvbiB0aGF0IGlzIGZsYWdnZWQgYXMgbGF0ZXN0IHZlcnNpb24gaXMgbm90IHJldHVybmVkIGJ5IGdldE9iamVjdE9mTGF0ZXN0VmVyc2lvbigpISIpOwotICAgICAgICAgICAgYWRkUmVzdWx0KHJlc3VsdHMsIGFzc2VydEVxdWFscyhsYXRlc3RJZCwgbGF0ZXN0VmVyc2lvbjIuZ2V0SWQoKSwgbnVsbCwgZikpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ21pc1Rlc3RSZXN1bHRJbXBsIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdChnZXRXb3JzdChyZXN1bHRzKSwgbWVzc2FnZSk7Ci0gICAgICAgIHJlc3VsdC5nZXRDaGlsZHJlbigpLmFkZEFsbChyZXN1bHRzKTsKLQotICAgICAgICByZXR1cm4gKHJlc3VsdC5nZXRTdGF0dXMoKS5nZXRMZXZlbCgpIDw9IE9LLmdldExldmVsKCkgPyBudWxsIDogcmVzdWx0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdmVyc2lvbmluZy9WZXJzaW9uaW5nU3RhdGVDcmVhdGVUZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90Y2svdGVzdHMvdmVyc2lvbmluZy9WZXJzaW9uaW5nU3RhdGVDcmVhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWZhMWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3ZlcnNpb25pbmcvVmVyc2lvbmluZ1N0YXRlQ3JlYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMudmVyc2lvbmluZzsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXMuRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVzdWx0U3RhdHVzLlNLSVBQRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1cy5XQVJOSU5HOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RTZXNzaW9uVGVzdDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25pbmdTdGF0ZUNyZWF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIlZlcnNpb25pbmcgU3RhdGUgQ3JlYXRlIFRlc3QiKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oIkNyZWF0ZXMgZG9jdW1lbnRzIGluIGRpZmZlcmVudCB2ZXJzaW9uaW5nIHN0YXRlcy4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIENtaXNUZXN0UmVzdWx0IGY7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBmb2xkZXIgYW5kIGRvY3VtZW50Ci0gICAgICAgICAgICBGb2xkZXIgdGVzdEZvbGRlciA9IGNyZWF0ZVRlc3RGb2xkZXIoc2Vzc2lvbik7Ci0KLSAgICAgICAgICAgIERvY3VtZW50VHlwZURlZmluaXRpb24gZG9jVHlwZSA9IChEb2N1bWVudFR5cGVEZWZpbml0aW9uKSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVmaW5pdGlvbihnZXREb2N1bWVudFRlc3RUeXBlSWQoKSk7Ci0KLSAgICAgICAgICAgIGlmICghZG9jVHlwZS5pc1ZlcnNpb25hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY3JlYXRlUmVzdWx0KFNLSVBQRUQsICJUZXN0IHR5cGUgaXMgbm90IHZlcnNpb25hYmxlLiBUZXN0IHNraXBwZWQhIikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbWFqb3IgdmVyc2lvbgotICAgICAgICAgICAgRG9jdW1lbnQgZG9jTWFqb3IgPSB0ZXN0Rm9sZGVyLmNyZWF0ZURvY3VtZW50KGdldFByb3BlcnRpZXMoIm1ham9yLnR4dCIpLCBnZXRDb250ZW50U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZS5NQUpPUiwgbnVsbCwgbnVsbCwgbnVsbCwgU0VMRUNUX0FMTF9OT19DQUNIRV9PQyk7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZG9jTWFqb3IsIGdldEFsbFByb3BlcnRpZXMoZG9jTWFqb3IpLCAiTWFqb3IgdmVyc2lvbiBjb21wbGlhbmNlIikpOwotCi0gICAgICAgICAgICBmID0gY3JlYXRlUmVzdWx0KEZBSUxVUkUsICJEb2N1bWVudCBzaG91bGQgYmUgbWFqb3IgdmVyc2lvbi4iKTsKLSAgICAgICAgICAgIGFkZFJlc3VsdChhc3NlcnRJc1RydWUoZG9jTWFqb3IuaXNNYWpvclZlcnNpb24oKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBMaXN0PERvY3VtZW50PiB2ZXJzaW9ucyA9IGRvY01ham9yLmdldEFsbFZlcnNpb25zKCk7Ci0KLSAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlZlcnNpb24gc2VyaWVzIHNob3VsZCBoYXZlIG9uZSB2ZXJzaW9uIGJ1dCBoYXMgIiArIHZlcnNpb25zLnNpemUoKSArICIuIik7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDEsIHZlcnNpb25zLnNpemUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICBkZWxldGVPYmplY3QoZG9jTWFqb3IpOwotCi0gICAgICAgICAgICAvLyBtaW5vciB2ZXJzaW9uCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY01pbm9yID0gdGVzdEZvbGRlci5jcmVhdGVEb2N1bWVudChnZXRQcm9wZXJ0aWVzKCJtaW5vci50eHQiKSwgZ2V0Q29udGVudFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlLk1JTk9SLCBudWxsLCBudWxsLCBudWxsLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tPYmplY3Qoc2Vzc2lvbiwgZG9jTWlub3IsIGdldEFsbFByb3BlcnRpZXMoZG9jTWlub3IpLCAiTWlub3IgdmVyc2lvbiBjb21wbGlhbmNlIikpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiRG9jdW1lbnQgc2hvdWxkIGJlIG1pbm9yIHZlcnNpb24uIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydElzRmFsc2UoZG9jTWlub3IuaXNNYWpvclZlcnNpb24oKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgdmVyc2lvbnMgPSBkb2NNaW5vci5nZXRBbGxWZXJzaW9ucygpOwotCi0gICAgICAgICAgICAgICAgZiA9IGNyZWF0ZVJlc3VsdChGQUlMVVJFLCAiVmVyc2lvbiBzZXJpZXMgc2hvdWxkIGhhdmUgb25lIHZlcnNpb24gYnV0IGhhcyAiICsgdmVyc2lvbnMuc2l6ZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0RXF1YWxzKDEsIHZlcnNpb25zLnNpemUoKSwgbnVsbCwgZikpOwotCi0gICAgICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGRvY01pbm9yKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNDb25zdHJhaW50RXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ3JlYXRpbmcgYSBtaW5vciB2ZXJzaW9uIGZhaWxlZCEgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIHJlcG9zaXRvcnkgbWlnaHQgbm90IHN1cHBvcnQgbWlub3IgdmVyc2lvbnMuIEV4Y2VwdGlvbjogIiArIGNlLCBjZSwgZmFsc2UpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ3JlYXRpbmcgYSBtaW5vciB2ZXJzaW9uIGZhaWxlZCEgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIHJlcG9zaXRvcnkgbWlnaHQgbm90IHN1cHBvcnQgbWlub3IgdmVyc2lvbnMuICBFeGNlcHRpb246ICIgKyBpYWUsIGlhZSwgZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2tlZCBvdXQgdmVyc2lvbgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2NDaGVja2VkT3V0ID0gdGVzdEZvbGRlci5jcmVhdGVEb2N1bWVudChnZXRQcm9wZXJ0aWVzKCJjaGVja291dC50eHQiKSwgZ2V0Q29udGVudFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlLkNIRUNLRURPVVQsIG51bGwsIG51bGwsIG51bGwsIFNFTEVDVF9BTExfTk9fQ0FDSEVfT0MpOwotICAgICAgICAgICAgICAgIGFkZFJlc3VsdChjaGVja09iamVjdChzZXNzaW9uLCBkb2NDaGVja2VkT3V0LCBnZXRBbGxQcm9wZXJ0aWVzKGRvY0NoZWNrZWRPdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrZWQgb3V0IHZlcnNpb24gY29tcGxpYW5jZSIpKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlZlcnNpb24gc2VyaWVzIHNob3VsZCBiZSBjaGVja2VkIG91dC4iKTsKLSAgICAgICAgICAgICAgICBhZGRSZXN1bHQoYXNzZXJ0SXNUcnVlKGRvY0NoZWNrZWRPdXQuaXNWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dCgpLCBudWxsLCBmKSk7Ci0KLSAgICAgICAgICAgICAgICB2ZXJzaW9ucyA9IGRvY0NoZWNrZWRPdXQuZ2V0QWxsVmVyc2lvbnMoKTsKLQotICAgICAgICAgICAgICAgIGYgPSBjcmVhdGVSZXN1bHQoRkFJTFVSRSwgIlZlcnNpb24gc2VyaWVzIHNob3VsZCBoYXZlIG9uZSB2ZXJzaW9uIGJ1dCBoYXMgIiArIHZlcnNpb25zLnNpemUoKSArICIuIik7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGFzc2VydEVxdWFscygxLCB2ZXJzaW9ucy5zaXplKCksIG51bGwsIGYpKTsKLQotICAgICAgICAgICAgICAgIGRvY0NoZWNrZWRPdXQuY2FuY2VsQ2hlY2tPdXQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNDb25zdHJhaW50RXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ3JlYXRpbmcgYSBjaGVja2VkIG91dCB2ZXJzaW9uIGZhaWxlZCEgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIHJlcG9zaXRvcnkgbWlnaHQgbm90IHN1cHBvcnQgY3JlYXRpbmcgY2hlY2tlZCBvdXQgdmVyc2lvbnMuIEV4Y2VwdGlvbjogIiArIGNlLCBjZSwgZmFsc2UpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENtaXNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgYWRkUmVzdWx0KGNyZWF0ZVJlc3VsdChXQVJOSU5HLCAiQ3JlYXRpbmcgYSBjaGVja2VkIG91dCB2ZXJzaW9uIGZhaWxlZCEgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIHJlcG9zaXRvcnkgbWlnaHQgbm90ICBzdXBwb3J0IGNyZWF0aW5nIGNoZWNrZWQgb3V0IHZlcnNpb25zLiAgRXhjZXB0aW9uOiAiICsgaWFlLCBpYWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZWxldGVUZXN0Rm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcyhTdHJpbmcgbmFtZSkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBnZXREb2N1bWVudFRlc3RUeXBlSWQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oKSB7Ci0gICAgICAgIGJ5dGVbXSBjb250ZW50Qnl0ZXMgPSBJT1V0aWxzLnRvVVRGOEJ5dGVzKCJzb21lIGNvbnRlbnQiKTsKLQotICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCJjb250ZW50LnR4dCIsIEJpZ0ludGVnZXIudmFsdWVPZihjb250ZW50Qnl0ZXMubGVuZ3RoKSwgInRleHQvcGxhaW4iLAotICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50Qnl0ZXMpKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3ZlcnNpb25pbmcvVmVyc2lvbmluZ1Rlc3RHcm91cC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdGNrL3Rlc3RzL3ZlcnNpb25pbmcvVmVyc2lvbmluZ1Rlc3RHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2JmNDBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rjay90ZXN0cy92ZXJzaW9uaW5nL1ZlcnNpb25pbmdUZXN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMudmVyc2lvbmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0R3JvdXA7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGdyb3VwIGNvbnRhaW5zIHZlcnNpb25pbmcgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uaW5nVGVzdEdyb3VwIGV4dGVuZHMgQWJzdHJhY3RTZXNzaW9uVGVzdEdyb3VwIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgc2V0TmFtZSgiVmVyc2lvbmluZyBUZXN0IEdyb3VwIik7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKCJWZXJzaW9uaW5nIHRlc3RzLiIpOwotCi0gICAgICAgIGFkZFRlc3QobmV3IFZlcnNpb25pbmdTbW9rZVRlc3QoKSk7Ci0gICAgICAgIGFkZFRlc3QobmV3IFZlcnNpb25EZWxldGVUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBWZXJzaW9uaW5nU3RhdGVDcmVhdGVUZXN0KCkpOwotICAgICAgICBhZGRUZXN0KG5ldyBDaGVja2VkT3V0VGVzdCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vcmVzb3VyY2VzL2NtaXMtdGNrLWdyb3Vwcy50eHQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vcmVzb3VyY2VzL2NtaXMtdGNrLWdyb3Vwcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjYzZmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL3Jlc291cmNlcy9jbWlzLXRjay1ncm91cHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRDSyBncm91cCBjbGFzcyBsaXN0LiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuYmFzaWNzLkJhc2ljc1Rlc3RHcm91cAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLnR5cGVzLlR5cGVzVGVzdEdyb3VwCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuY3J1ZC5DUlVEVGVzdEdyb3VwCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMudmVyc2lvbmluZy5WZXJzaW9uaW5nVGVzdEdyb3VwCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sudGVzdHMuZmlsaW5nLkZpbGluZ1Rlc3RHcm91cAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLmNvbnRyb2wuQ29udHJvbFRlc3RHcm91cAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnRlc3RzLnF1ZXJ5LlF1ZXJ5VGVzdEdyb3VwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL3Jlc291cmNlcy9zYW1wbGUtYnVpbGQueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL3Jlc291cmNlcy9zYW1wbGUtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk4OTA3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjay9zcmMvbWFpbi9yZXNvdXJjZXMvc2FtcGxlLWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLSAgICA8IS0tCi0gICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzCi0gICAgICAgIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAtLT4KLQotICAgIDwhLS0KLSAgICAgICAgQ01JUyBUQ0sgYW50IHRhc2sgZXhhbXBsZS4KLSAgICAtLT4KLQotPHByb2plY3QgbmFtZT0iQ01JU1RDS0V4YW1wbGUiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi0gICAgPHRhcmdldCBuYW1lPSJtYWluIj4KLSAgICAgICAgPHBhdGggaWQ9Im9wZW5jbWlzdGNrIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iL3BhdGgvdG8vb3BlbmNtaXMvamFycyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9wYXRoPgotICAgIAotICAgICAgICA8dGFza2RlZiBuYW1lPSJjbWlzdGNrIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5ydW5uZXIuQ21pc1Rja0FudFRhc2siPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ib3BlbmNtaXN0Y2siLz4KLSAgICAgICAgPC90YXNrZGVmPgotICAgICAgICAKLSAgICAgICAgPCEtLQotICAgICAgICAgICAgcGFyYW1ldGVyczogT3BlbkNNSVMgc2Vzc2lvbiBwYXJhbWV0ZXJzIGZpbGUgKHNlZSBzYW1wbGUtcGFyYW1ldGVycy5wcm9wZXJ0aWVzKQotICAgICAgICAgICAgb3V0cHV0OiAgICAgcmVwb3J0IGZpbGUKLSAgICAgICAgICAgIGZvcm1hdDogICAgIHRleHQsIHhtbCwgb3IgaHRtbAotICAgICAgICAtLT4KLQotICAgICAgICA8Y21pc3RjayBwYXJhbWV0ZXJzPSIvcGF0aC90by9vcGVuY21pcy1wYXJhbWV0ZXJzLnByb3BlcnRpZXMiIG91dHB1dD0iL3BhdGgvdG8vb3V0cHV0LnR4dCIgZm9ybWF0PSJ0ZXh0IiAvPgotICAgIAkKLSAgICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vcmVzb3VyY2VzL3NhbXBsZS1wYXJhbWV0ZXJzLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10Y2svc3JjL21haW4vcmVzb3VyY2VzL3NhbXBsZS1wYXJhbWV0ZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2ZkY2EuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrL3NyYy9tYWluL3Jlc291cmNlcy9zYW1wbGUtcGFyYW1ldGVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9vcGVuY21pcy9hdG9tCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPXRlc3QKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnBhc3N3b3JkPXRlc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyZjM0Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotICAgIDwhLS0KLSAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICAgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBVbmxlc3MKLSAgICAgICAgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgICAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAgIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29sczwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5PcGVuQ01JUyBUb29sczwvbmFtZT4KLSAgICAKLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLSAgICAKLQk8YnVpbGQ+Ci0JCTxwbHVnaW5zPgotCQkJPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRNYXZlbkRlc2NyaXB0b3I+ZmFsc2U8L2FkZE1hdmVuRGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1haW4uT2JqR2VuQXBwPC9tYWluQ2xhc3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZENsYXNzcGF0aD50cnVlPC9hZGRDbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aFByZWZpeCAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFgtQ29tcGlsZS1Tb3VyY2UtSkRLPiR7bWF2ZW4uY29tcGlsZS5zb3VyY2V9PC9YLUNvbXBpbGUtU291cmNlLUpESz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WC1Db21waWxlLVRhcmdldC1KREs+JHttYXZlbi5jb21waWxlLnRhcmdldH08L1gtQ29tcGlsZS1UYXJnZXQtSkRLPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQkJPC9wbHVnaW5zPgotCTwvYnVpbGQ+Ci0JCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0JCTxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aWthPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGlrYS1wYXJzZXJzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bmV0LnNmLmpvcHQtc2ltcGxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+am9wdC1zaW1wbGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotbG9nNGoxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2xmNGoudmVyc2lvbn08L3ZlcnNpb24+ICAgICAgICAgIAotICAgICAgICA8L2RlcGVuZGVuY3k+ICAgICAgICAKLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvcmVzb3VyY2VzL1Byb3BlcnR5RGVmaW5pdGlvbnMudHh0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvcmVzb3VyY2VzL1Byb3BlcnR5RGVmaW5pdGlvbnMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjNlZjZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3Jlc291cmNlcy9Qcm9wZXJ0eURlZmluaXRpb25zLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYzMCArMCwwIEBACi0jcHJvcGVydHkgZGVmaW5pdGlvbnMNCi1zdHJpbmcNCi1BcnRpc3QNCi1hcnRpc3Q7YXJ0aXN0O2FwYWNoZQ0KLUFydGlzdA0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZw0KLUFsYnVtDQotYWxidW07YWxidW07YXBhY2hlDQotdGl0bGUNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1zdHJpbmcNCi1UaXRsZQ0KLXRpdGxlO3RpdGxlO2FwYWNoZQ0KLVRpdGxlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nDQotQ29tbWVudA0KLWNvbW1lbnQ7Y29tbWVudDthcGFjaGUNCi1Db21tZW50DQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1HZW5yZQ0KLWdlbnJlO2dlbnJlO2FwYWNoZQ0KLUdlbnJlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotaW50ZWdlcg0KLUxlbmd0aA0KLWxlbmd0aDtsZW5ndGg7YXBhY2hlDQotTGVuZ3RoIGluIHNlY29uZHMNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1UcmFjaw0KLXRyYWNrO3RyYWNrO2FwYWNoZQ0KLVRyYWNrIGluIGFsYnVtDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nDQotWWVhcg0KLXllYXI7eWVhcjthcGFjaGUNCi1yZWxlYXNlIGRhdGUgb2YgYWxidW4NCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1zdHJpbmcNCi1Db21wb3Nlcg0KLWNvbXBvc2VyO2NvbXBvc2VyO2FwYWNoZQ0KLUNvbXBvc2VyDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nDQotRGlzYyBOdW1iZXINCi1kaXNjTm87ZGlzY05vO2FwYWNoZQ0KLW51bWJlciBvZiBkaXNjIC8gdG90YWwgZGlzY3MNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLXN0cmluZw0KLUF1ZGlvIEZvcm1hdA0KLWF1ZGlvRm9ybWF0O2F1ZGlvRm9ybWF0O2FwYWNoZQ0KLUF1ZGlvIEZvcm1hdCAvIGNvbXByZXNzaW9uIHNjaGVtZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlcg0KLVNhbXBsZSBSYXRlDQotc2FtcGxlUmF0ZTtzYW1wbGVSYXRlO2FwYWNoZQ0KLVNhbXBsZSBSYXRlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcgZW51bTogTW9ubz1Nb25vO1N0ZXJlbz1TdGVyZW87NS4xPTUuMTs3LjE9Ny4xDQotQXVkaW8gQ2hhbm5lbCBUeXBlDQotYXVkaW9DaGFubmVsVHlwZTthdWRpb0NoYW5uZWxUeXBlO2FwYWNoZQ0KLWF1ZGlvIGNoYW5uZWwgdHlwZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlcg0KLU51bWJlciBDaGFubmVscw0KLW5vQ2hhbm5lbHM7bm9DaGFubmVsczthcGFjaGUNCi1udW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLXN0cmluZw0KLUNvbXByZXNzb3IgVmVyc2lvbg0KLWNvbXByZXNzb3JWZXJzaW9uO2NvbXByZXNzb3JWZXJzaW9uO2FwYWNoZQ0KLXZlcnNpb24gZGVzY3JpcHRpb24gb2YgY29tcHJlc3Nvcg0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotc3RyaW5nDQotTWVzc2FnZSBSZWNpcGllbnQgQWRkcmVzcw0KLW1lc3NhZ2VSZWNpcGllbnRBZGRyZXNzO21lc3NhZ2VSZWNpcGllbnRBZGRyZXNzO2FwYWNoZQ0KLU1lc3NhZ2UgUmVjaXBpZW50IEFkZHJlc3MNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1zdHJpbmcNCi1Gcm9tDQotZnJvbTtmcm9tO2FwYWNoZQ0KLXNlbmRlciBvZiBtZXNzYWdlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nDQotVG8NCi10bzt0bzthcGFjaGUNCi1yZWNpcGllbnRzIG9mIG1lc3NhZ2UNCi1tdWx0aSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZw0KLUNjDQotY2M7Y2M7YXBhY2hlDQotY2FyYm9uIGNvcHkgcmVjaXBpZW50cyBvZiBtZXNzYWdlDQotbXVsdGksIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1zdHJpbmcNCi1CY2MNCi1iY2M7YmNjO2FwYWNoZQ0KLWJsaW5kIGNhcmJvbiBjb3B5IHJlY2lwaWVudHMgb2YgbWVzc2FnZQ0KLW11bHRpLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1TdWJqZWN0DQotc3ViamVjdDtzdWJqZWN0O2FwYWNoZQ0KLXN1YmpldCBvZiBtZXNzYWdlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotZGF0ZXRpbWUNCi1DcmVhdGlvbiBEYXRlDQotY3JlYXRpb25EYXRlO2NyZWF0aW9uRGF0ZTthcGFjaGUNCi1DcmVhdGlvbiBEYXRlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1kYXRldGltZQ0KLUxhc3QgU2F2ZSBEYXRlDQotbGFzdFNhdmVEYXRlO2xhc3RTYXZlRGF0ZTthcGFjaGUNCi1MYXN0IFNhdmUgRGF0ZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlcg0KLUltYWdlIFdpZHRoDQotaW1hZ2VXaWR0aDsweDAxMDA7YXBhY2hlOw0KLUltYWdlIFdpZHRoDQotc2luZ2xlLCBvbmNyZWF0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1JbWFnZSBIZWlnaHQNCi1pbWFnZUhlaWdodDsweDAxMDE7YXBhY2hlDQotSW1hZ2UgSGVpZ2h0DQotc2luZ2xlLCBvbmNyZWF0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1CaXRzIFBlciBTYW1wbGUNCi1iaXRzUGVyU2FtcGxlOzB4MDEwMjthcGFjaGUNCi1CaXRzIFBlciBTYW1wbGUNCi1zaW5nbGUsIG9uY3JlYXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlciBlbnVtOiAxPVVuY29tcHJlc3NlZDsyPUNDSVRUIDFEOzM9VDQvR3JvdXAgMyBGYXg7ND1UNi9Hcm91cCA0IEZheDs1PUxaVzs2PUpQRUcgKG9sZC1zdHlsZSk7Nz1KUEVHOzg9QWRvYmUgRGVmbGF0ZTs5PUpCSUcgQlc7MTA9SkJJRyBDb2xvcjs5OT1KUEVHOzI2Mj1Lb2RhayAyNjI7MzI3NjY9TmV4dDszMjc2Nz1Tb255IEFSVyBDb21wcmVzc2VkOzMyNzY5PVBhY2tlZCBSQVc7MzI3NzA9U2Ftc3VuZyBTUlcgQ29tcHJlc3NlZDszMjc3MT1DQ0lSTEVXOzMyNzczPVBhY2tCaXRzOzMyODA5PVRodW5kZXJzY2FuOzMyODY3PUtvZGFrIEtEQyBDb21wcmVzc2VkOzMyODk1PUlUOENUUEFEOzMyODk2PUlUOExXOzMyODk3PUlUOE1QOzMyODk4PUlUOEJMOzMyOTA4PVBpeGFyRmlsbTszMjkwOT1QaXhhckxvZzszMjk0Nj1EZWZsYXRlOzMyOTQ3PURDUzszNDY2MT1KQklHOzM0Njc2PVNHSUxvZzszNDY3Nz1TR0lMb2cyNDszNDcxMj1KUEVHIDIwMDA7MzQ3MTM9Tmlrb24gTkVGIENvbXByZXNzZWQ7MzQ3MTU9SkJJRzIgVElGRiBGWDszNDcxOD1NaWNyb3NvZnQgRG9jdW1lbnQgSW1hZ2luZyAoTURJKSBCaW5hcnkgTGV2ZWwgQ29kZWM7MzQ3MTk9TWljcm9zb2Z0IERvY3VtZW50IEltYWdpbmcgKE1ESSkgUHJvZ3Jlc3NpdmUgVHJhbnNmb3JtIENvZGVjOzM0NzIwPU1pY3Jvc29mdCBEb2N1bWVudCBJbWFnaW5nIChNREkpIFZlY3Rvcjs2NTAwMD1Lb2RhayBEQ1IgQ29tcHJlc3NlZDs2NTUzNT1QZW50YXggUEVGIENvbXByZXNzZWQNCi1Db21wcmVzc2lvbg0KLWNvbXByZXNzaW9uOzB4MDEwMzthcGFjaGUNCi1Db21wcmVzc2lvbiBGb3JtYXQNCi1zaW5nbGUsIG9uY3JlYXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlciBlbnVtOiAwPVdoaXRlSXNaZXJvOzE9QmxhY2tJc1plcm87Mj1SR0I7Mz1SR0IgUGFsZXR0ZTs0PVRyYW5zcGFyZW5jeSBNYXNrOzU9Q01ZSzs2PVlDYkNyOzg9Q0lFTGFiOzk9SUNDTGFiOzEwPUlUVUxhYjszMjgwMz1Db2xvciBGaWx0ZXIgQXJyYXk7MzI4NDQ9UGl4YXIgTG9nTDszMjg0NT1QaXhhciBMb2dMdXY7MzQ4OTI9TGluZWFyIFJhdw0KLVBob3RvbWV0cmljIEludGVycHJldGF0aW9uDQotcGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbjsweDAxMDYNCi1Db2xvciBGb3JtYXQNCi1zaW5nbGUsIG9uY3JlYXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotc3RyaW5nDQotSW1hZ2UgRGVzY3JpcHRpb24NCi1pbWFnZURlc2NyaXB0aW9uOzB4MDEwZTthcGFjaGUNCi1EZXNjcmlwdGlvbg0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQkgDQotc3RyaW5nDQotTWFrZQ0KLW1ha2U7MHgwMTBmO2FwYWNoZQ0KLUNhbWVyYSBNYWtlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nDQotTW9kZWwNCi1tb2RlbDsweDAxMTA7YXBhY2hlDQotQ2FtZXJhIE1vZGVsDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotaW50ZWdlciBlbnVtOiAxPUhvcml6b250YWwgKG5vcm1hbCk7Mj1NaXJyb3IgaG9yaXpvbnRhbDszPVJvdGF0ZSAxODA7ND1NaXJyb3IgdmVydGljYWw7NT1NaXJyb3IgaG9yaXpvbnRhbCBhbmQgcm90YXRlIDI3MCBDVzs2PVJvdGF0ZSA5MCBDVzs3PU1pcnJvciBob3Jpem9udGFsIGFuZCByb3RhdGUgOTAgQ1c7OD1Sb3RhdGUgMjcwIENXDQotT3JpZW50YXRpb24NCi1vcmllbnRhdGlvbjsweDAxMTI7YXBhY2hlDQotT3JpZW50YXRpb24NCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWRlY2ltYWwNCi1YIFJlc29sdXRpb24NCi14UmVzb2x1dGlvbjsweDAxMWE7YXBhY2hlDQoteHJlc29sdXRpb24NCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWRlY2ltYWwNCi1ZIFJlc29sdXRpb24NCi15UmVzb2x1dGlvbjsweDAxMWI7YXBhY2hlDQoteXJlc29sdXRpb24NCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXIgZW51bTogMT1Ob25lOzI9aW5jaGVzOzM9Y20NCi1SZXNvbHV0aW9uIFVuaXQNCi1yZXNvbHV0aW9uVW5pdDsweDAxMjg7YXBhY2hlDQotUmVzb2x1dGlvbiBVbml0DQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1Tb2Z0d2FyZQ0KLXNvZnR3YXJlOzB4MDEzMTthcGFjaGUNCi1Tb2Z0d2FyZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotZGF0ZXRpbWUNCi1Nb2RpZnkgRGF0ZQ0KLW1vZGlmeURhdGU7MHgwMTMyO2FwYWNoZQ0KLU1vZGlmeSBEYXRlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1BcnRpc3QNCi1hcnRpc3Q7MHgwMTNiO2FwYWNoZQ0KLUFydGlzdA0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLWludGVnZXIgZW51bTogMT1DZW50ZXJlZDsyPUNvLXNpdGVkDQotWUNiQ3JQb3NpdGlvbmluZw0KLXlDYkNyUG9zaXRpb25pbmc7MHgwMjEzO2FwYWNoZQ0KLVlDYkNyIFBvc2l0aW9uaW5nDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1Db3B5cmlnaHQNCi1jb3B5cmlnaHQ7MHg4Mjk4O2FwYWNoZQ0KLUNvcHlyaWdodCBOb3RpY2UNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWRlY2ltYWwNCi1FeHBvc3VyZSBUaW1lDQotZXhwb3N1cmVUaW1lOzB4ODI5YTthcGFjaGUNCi1FeHBvc3VyZSBUaW1lDQotc2luZ2xlLCBvbmNyZWF0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWRlY2ltYWwNCi1GIE51bWJlcg0KLWZOdW1iZXI7MHg4MjlkO2FwYWNoZQ0KLUYtU3RvcCBOdW1iZXINCi1zaW5nbGUsIG9uY3JlYXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlciBlbnVtOiAwPU5vdCBEZWZpbmVkOzE9TWFudWFsOzI9UHJvZ3JhbSBBRTszPUFwZXJ0dXJlLXByaW9yaXR5IEFFOzQ9U2h1dHRlciBzcGVlZCBwcmlvcml0eSBBRTs1PUNyZWF0aXZlIChTbG93IHNwZWVkKTs2PUFjdGlvbiAoSGlnaCBzcGVlZCk7Nz1Qb3J0cmFpdDs4PUxhbmRzY2FwZTs5PUJ1bGINCi1FeHBvc3VyZSBQcm9ncmFtDQotZXhwb3N1cmVQcm9ncmFtOzB4ODgyMjthcGFjaGUNCi1FeHBvc3VyZSBQcm9ncmFtDQotc2luZ2xlLCBvbmNyZWF0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1JU08gU3BlZWQNCi1pc29TcGVlZDsweDg4Mjc7YXBhY2hlDQotSVNPIFNwZWVkIFNldHRpbmcNCi1zaW5nbGUsIG9uY3JlYXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLWRlY2ltYWwNCi1HUFMgTGF0aXR1ZGUNCi1ncHNMYXRpdHVkZTsweDg4MjUtMHgwMDAyO2FwYWNoZQ0KLUdQUyBMYXRpdHVkZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZwllbnVtOiBOPU5vcnRoO1M9U291dGgNCi1HUFMgTGF0aXR1ZGUgUmVmDQotZ3BzTGF0aXR1ZGVSZWY7MHg4ODI1LTB4MDAwMTthcGFjaGUNCi1HUFMgTGF0aXR1ZGUgUmVmZXJlbmNlIChOL1MpDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotZGVjaW1hbA0KLUdQUyBMb25naXR1ZGUNCi1ncHNMb25naXR1ZGU7MHg4ODI1LTB4MDAwNDthcGFjaGUNCi1HUFMgTG9uZ2l0dWRlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nIGVudW06IEU9RWFzdDtXPVdlc3QNCi1HUFMgTG9uZ2l0dWRlIFJlZg0KLWdwc0xvbmdpdHVkZVJlZjsweDg4MjUtMHgwMDAzO2FwYWNoZQ0KLUdQUyBMb25naXR1ZGUgUmVmZXJlbmNlIChXL0UpDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotZGVjaW1hbA0KLUdQUyBBbHRpdHVkZQ0KLWdwc0FsdGl0dWRlOzB4ODgyNS0weDAwMDY7YXBhY2hlDQotR1BTIEFsdGl0dWRlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nIGVudW06IDA9QWJvdmUgU2VhIExldmVsOzE9QmVsb3cgU2VhIExldmVsDQotR1BTIEFsdGl0dWRlIFJlZg0KLWdwc0FsdGl0dWRlUmVmOzB4ODgyNS0weDAwMDU7YXBhY2hlDQotR1BTIEFsdGl0dWRlIFJlZmVyZW5jZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLWludGVnZXINCi1TZWxmIFRpbWVyIE1vZGUNCi1zZWxmVGltZXJNb2RlOzB4ODgyYjthcGFjaGUNCi1TZWxmIFRpbWVyIE1vZGUNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1UaW1lIFpvbmUgT2Zmc2V0DQotdGltZVpvbmVPZmZzZXQ7MHg4ODJhO2FwYWNoZQ0KLVRpbWUgWm9uZSBPZmZzZXQgKEdNVCBvZmZzZXQgaW4gaG91cnMpDQotbXVsdGksIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQkNCi1kYXRldGltZQ0KLURhdGUgVGltZSBPcmlnaW5hbA0KLWRhdGVUaW1lT3JpZ2luYWw7MHg5MDAzO2FwYWNoZQ0KLWRhdGUvdGltZSB3aGVuIG9yaWdpbmFsIGltYWdlIHdhcyB0YWtlbg0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotZGF0ZXRpbWUNCi1DcmVhdGUgRGF0ZQ0KLWNyZWF0ZURhdGU7MHg5MDA0O2FwYWNoZQ0KLWRhdGUvdGltZSBkaWdpdGl6ZWQNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1kZWNpbWFsDQotU2h1dHRlciBTcGVlZCBWYWx1ZQ0KLXNodXR0ZXJTcGVlZFZhbHVlOzB4OTIwMTthcGFjaGUNCi1zaHV0dGVyIHNwZWVkIHZhbHVlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1kZWNpbWFsDQotQXBlcnR1cmUgVmFsdWUNCi1hcGVydHVyZVZhbHVlOzB4OTIwMjthcGFjaGUNCi1BcGVydHVyZSBWYWx1ZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotZGVjaW1hbA0KLUJyaWdodG5lc3MgVmFsdWUNCi1icmlnaHRuZXNzVmFsdWU7MHg5MjAzO2FwYWNoZQ0KLUJyaWdodG5lc3MgVmFsdWUNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWRlY2ltYWwNCi1FeHBvc3VyZSBDb21wZW5zYXRpb24NCi1leHBvc3VyZUNvbXBlbnNhdGlvbjsweDkyMDQ7YXBhY2hlDQotRXhwb3N1cmUgQ29tcGVuc2F0aW9uDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1kZWNpbWFsDQotTWF4IEFwZXJ0dXJlIFZhbHVlIAkNCi1tYXhBcGVydHVyZVZhbHVlOzB4OTIwNTthcGFjaGUNCi1NYXggQXBlcnR1cmUgVmFsdWUgCQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlciBlbnVtOjA9VW5rbm93bjsxPUF2ZXJhZ2U7Mj1DZW50ZXItd2VpZ2h0ZWQgYXZlcmFnZTszPVNwb3Q7ND1NdWx0aS1zcG90OzU9TXVsdGktc2VnbWVudDs2PVBhcnRpYWw7MjU1PU90aGVyDQotTWV0ZXJpbmcgTW9kZQ0KLW1ldGVyaW5nTW9kZTsweDkyMDc7YXBhY2hlDQotbWV0ZXJpbmcgbW9kZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotZGVjaW1hbA0KLVN1YmplY3QgRGlzdGFuY2UNCi1zdWJqZWN0RGlzdGFuY2U7MHg5MjA2O2FwYWNoZQ0KLXN1YmplY3QgZGlzdGFuY2UNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1MaWdodCBTb3VyY2UNCi1saWdodFNvdXJjZTsweDkyMDg7YXBhY2hlDQotbGlnaHQgc291cmNlIHZhbHVlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1pbnRlZ2VyDQotRmxhc2gNCi1mbGFzaDsweDkyMDk7YXBhY2hlDQotRmxhc2ggU2V0dGluZw0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotZGVjaW1hbA0KLUZvY2FsIExlbmd0aA0KLWZvY2FsTGVuZ3RoOzB4OTIwYTthcGFjaGUNCi1mb2NhbCBsZW5ndGgNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1zdHJpbmcgDQotVXNlciBDb21tZW50DQotdXNlckNvbW1lbnQ7MHg5Mjg2O2FwYWNoZQ0KLXVzZXIgY29tbWVudA0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLWludGVnZXIgZW51bTogMT1zUkdCOzI9QWRvYmUgUkdCOzY1NTMzPVdpZGUgR2FtdXQgUkdCOzY1NTM0PUlDQyBQcm9maWxlOzY1NTM1PVVuY2FsaWJyYXRlZA0KLUNvbG9yIFNwYWNlDQotY29sb3JTcGFjZTsweGEwMDE7YXBhY2hlDQotY29sb3Igc3BhY2UNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1QaXhlbFhEaW1lbnNpb24NCi1waXhlbFhEaW1lbnNpb247MHhhMDAyO2FwYWNoZQ0KLWRpbWVuc2lvbiBpbiBwaXhlbCB4DQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1pbnRlZ2VyDQotUGl4ZWxZRGltZW5zaW9uDQotcGl4ZWxZRGltZW5zaW9uOzB4YTAwMzthcGFjaGUNCi1kaW1lbnNpb24gaW4gcGl4ZWwgeQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlciBlbnVtOiAwPUF1dG87MT1NYW51YWw7Mj1BdXRvIGJyYWNrZXQNCi1FeHBvc3VyZSBNb2RlDQotZXhwb3N1cmVNb2RlOzB4YTQwMjthcGFjaGUNCi1FeHBvc3VyZSBNb2RlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1pbnRlZ2VyIGVudW06IDA9QXV0bzsxPU1hbnVhbA0KLVdoaXRlIEJhbGFuY2UNCi13aGl0ZUJhbGFuY2U7MHhhNDAzO2FwYWNoZQ0KLXdoaXRlIGJhbGFuY2UNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXIgZW51bTogMD1TdGFuZGFyZDsxPUxhbmRzY2FwZTsyPVBvcnRyYWl0OzM9TmlnaHQNCi1TY2VuZSBDYXB0dXJlIFR5cGUNCi1zY2VuZUNhcHR1cmVUeXBlOzB4YTQwNjthcGFjaGUNCi1TY2VuZSBDYXB0dXJlIFR5cGUNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWlkDQotSW1hZ2UgVW5pcXVlIElkDQotaW1hZ2VVbmlxdWVJZDsweGE0MjA7YXBhY2hlDQotSW1hZ2UgVW5pcXVlIElkDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1Pd25lciBOYW1lDQotb3duZXJOYW1lOzB4YTQzMDthcGFjaGUNCi1Pd25lciBOYW1lDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCB0cnVlLCB0cnVlDQotDQotc3RyaW5nDQotU2VyaWFsIE51bWJlcg0KLXNlcmlhbE51bWJlcjsweGE0MzE7YXBhY2hlDQotc2VyaWFsIG51bWJlcg0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLWludGVnZXINCi1SYXRpbmcNCi1yYXRpbmc7MHg0NzQ2O2FwYWNoZQ0KLXJhdGluZyB2YWx1ZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlcg0KLVJhdGluZyBQZXJjZW50DQotcmF0aW5nUGVyY2VudDsweDQ3NDk7YXBhY2hlDQotcmF0aW5nIHBlcmNlbnQNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1EYXRhIFByZWNpc2lvbg0KLWRhdGFQcmVjaXNpb247MHgwMDAwO2FwYWNoZQ0KLUpQRUcgRGF0YSBQcmVjaXNpb24NCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLXN0cmluZw0KLUFwcGxpY2F0aW9uIE5hbWUNCi1hcHBsaWNhdGlvbk5hbWU7YXBwbGljYXRpb25OYW1lO2FwYWNoZQ0KLUFwcGxpY2F0aW9uIE5hbWUNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1zdHJpbmcNCi1BcHBsaWNhdGlvbiBWZXJzaW9uDQotYXBwbGljYXRpb25WZXJzaW9uO2FwcGxpY2F0aW9uVmVyc2lvbjthcGFjaGUNCi1BcHBsaWNhdGlvbiBWZXJzaW9uDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1BdXRob3INCi1hdXRob3I7YXV0aG9yO2FwYWNoZQ0KLUF1dGhvcg0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZw0KLUNhdGVnb3J5DQotY2F0ZWdvcnk7Y2F0ZWdvcnk7YXBhY2hlDQotQ2F0ZWdvcnkNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1zdHJpbmcNCi1Db250ZW50IFN0YXR1cw0KLWNvbnRlbnRTdGF0dXM7Y29udGVudFN0YXR1czthcGFjaGUNCi1Db250ZW50IFN0YXR1cw0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotc3RyaW5nDQotQ29tbWVudHMNCi1jb21tZW50cztjb21tZW50czthcGFjaGUNCi1Db21tZW50cw0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZw0KLUNvbXBhbnkNCi1jb21wYW55O2NvbXBhbnk7YXBhY2hlDQotQ29tcGFueQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZw0KLUtleXdvcmRzDQota2V5d29yZHM7a2V5d29yZHM7YXBhY2hlDQotS2V5d29yZHMNCi1tdWx0aXBsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZw0KLUxhc3QgQXV0aG9yDQotbGFzdEF1dGhvcjtsYXN0QXV0aG9yO2FwYWNoZQ0KLUxhc3QgQXV0aG9yDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1NYW5hZ2VyDQotbWFuYWdlcjttYW5hZ2VyO2FwYWNoZQ0KLU1hbmFnZXINCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLXN0cmluZw0KLU5vdGVzDQotbm90ZXM7bm90ZXM7YXBhY2hlDQotTm90ZXMNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLXN0cmluZw0KLVByZXNlbnRhdGlvbiBGb3JtYXQNCi1wcmVzZW50YXRpb25Gb3JtYXQ7cHJlc2VudGF0aW9uRm9ybWF0O2FwYWNoZQ0KLVByZXNlbnRhdGlvbiBGb3JtYXQNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLXN0cmluZw0KLVJldmlzaW9uIE51bWJlcg0KLXJldmlzaW9uTnVtYmVyO3JldmlzaW9uTnVtYmVyO2FwYWNoZQ0KLVJldmlzaW9uIE51bWJlcg0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotc3RyaW5nDQotVGVtcGxhdGUNCi10ZW1wbGF0ZTt0ZW1wbGF0ZTthcGFjaGUNCi1UZW1wbGF0ZQ0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotc3RyaW5nDQotVmVyc2lvbg0KLXZlcnNpb247dmVyc2lvbjthcGFjaGUNCi1WZXJzaW9uDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1pbnRlZ2VyDQotQ2hhcmFjdGVyIENvdW50DQotY2hhcmFjdGVyQ291bnQ7Y2hhcmFjdGVyQ291bnQ7YXBhY2hlDQotQ2hhcmFjdGVyIENvdW50DQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1pbnRlZ2VyDQotQ2hhcmFjdGVyIENvdW50IFdpdGggU3BhY2VzDQotY2hhcmFjdGVyQ291bnRXaXRoU3BhY2VzO2NoYXJhY3RlckNvdW50V2l0aFNwYWNlczthcGFjaGUNCi1DaGFyYWN0ZXIgQ291bnQgV2l0aCBTcGFjZXMNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWludGVnZXINCi1Xb3JkIENvdW50DQotd29yZENvdW50O3dvcmRDb3VudDthcGFjaGUNCi1Xb3JkIENvdW50DQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1pbnRlZ2VyDQotTGluZSBDb3VudA0KLWxpbmVDb3VudDtsaW5lQ291bnQ7YXBhY2hlDQotTGluZSBDb3VudA0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQotDQotaW50ZWdlcg0KLVBhZ2UgQ291bnQNCi1wYWdlQ291bnQ7cGFnZUNvdW50O2FwYWNoZQ0KLVBhZ2UgQ291bnQNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1pbnRlZ2VyDQotU2xpZGUgQ291bnQNCi1zbGlkZUNvdW50O3NsaWRlQ291bnQ7YXBhY2hlDQotU2xpZGUgQ291bnQNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIHRydWUsIHRydWUNCi0NCi1pbnRlZ2VyDQotUGFyYWdyYXBoIENvdW50DQotcGFyYWdyYXBoQ291bnQ7cGFyYWdyYXBoQ291bnQ7YXBhY2hlDQotUGFyYWdyYXBoIENvdW50DQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1Ub3RhbCBUaW1lDQotdG90YWxUaW1lO3RvdGFsVGltZTthcGFjaGUNCi1Ub3RhbCBUaW1lDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1FZGl0IFRpbWUNCi1lZGl0VGltZTtlZGl0VGltZTthcGFjaGUNCi1FZGl0IFRpbWUNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLWRhdGV0aW1lDQotTGFzdCBTYXZlIERhdGUNCi1sYXN0U2F2ZURhdGU7bGFzdFNhdmVEYXRlO2FwYWNoZQ0KLUxhc3QgU2F2ZSBEYXRlDQotc2luZ2xlLCByZWFkd3JpdGUsIG9wdGlvbmFsLCBmYWxzZSwgZmFsc2UNCi0NCi1zdHJpbmcNCi1MYXN0IFByaW50ZWQNCi1sYXN0UHJpbnRlZDtsYXN0UHJpbnRlZDthcGFjaGUNCi1MYXN0IFByaW50ZWQNCi1zaW5nbGUsIHJlYWR3cml0ZSwgb3B0aW9uYWwsIGZhbHNlLCBmYWxzZQ0KLQ0KLXN0cmluZw0KLUNyZWF0b3INCi1jcmVhdG9yO2NyZWF0b3I7YXBhY2hlDQotY3JlYXRvciBvZiBkb2N1bWVudA0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgdHJ1ZSwgdHJ1ZQ0KLQ0KLXN0cmluZw0KLVRyYXBwZWQNCi10cmFwcGVkO3RyYXBwZWQ7YXBhY2hlDQotdHJhcHBlZA0KLXNpbmdsZSwgcmVhZHdyaXRlLCBvcHRpb25hbCwgZmFsc2UsIGZhbHNlDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvcmVzb3VyY2VzL1R5cGVEZWZpbml0aW9ucy50eHQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvVHlwZURlZmluaXRpb25zLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3MGJmNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvVHlwZURlZmluaXRpb25zLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0jRVhJRiB0eXBlIGRlZmluaXRpb24gaHR0cDovL3d3dy5zbm8ucGh5LnF1ZWVuc3UuY2EvfnBoaWwvZXhpZnRvb2wvVGFnTmFtZXMvRVhJRi5odG1sDQotZG9jdW1lbnQNCi1hdWRpb0ZpbGU7YXVkaW9GaWxlO2FwYWNoZQ0KLUF1ZGlvIEZpbGUNCi1BdWRpbyBDb250ZW50IChjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCkNCi0gICAgQXJ0aXN0DQotICAgIEFsYnVtDQotICAgIFRpdGxlDQotICAgIENvbW1lbnQNCi0gICAgR2VucmUNCi0gICAgTGVuZ3RoDQotICAgIFRyYWNrDQotICAgIFllYXINCi0gICAgQ29tcG9zZXINCi0gICAgRGlzYyBOdW1iZXINCi0gICAgQXVkaW8gRm9ybWF0DQotICAgIFNhbXBsZSBSYXRlDQotICAgIEF1ZGlvIENoYW5uZWwgVHlwZQ0KLSAgICBOdW1iZXIgQ2hhbm5lbHMNCi0gICAgQ29tcHJlc3NvciBWZXJzaW9uDQotDQotZG9jdW1lbnQNCi1lbWFpbERvY3VtZW50O2VtYWlsRG9jdW1lbnQ7YXBhY2hlDQotRW1haWwgRG9jdW1lbnQNCi1Eb2N1bWVudCBvZiB0eXBlIEVtYWlsDQotICAgIEZyb20NCi0gICAgVG8NCi0gICAgQ2MNCi0gICAgQmNjDQotICAgIFN1YmplY3QNCi0gICAgTWVzc2FnZSBSZWNpcGllbnQgQWRkcmVzcw0KLSAgICBDcmVhdGlvbiBEYXRlDQotICAgIExhc3QgU2F2ZSBEYXRlDQotDQotZG9jdW1lbnQNCi1leGlmSW1hZ2U7ZXhpZkltYWdlO2FwYWNoZQ0KLUVYSUYgSW1hZ2UNCi1JbWFnZSB3aXRoIEVYSUYgdGFncw0KLSAgICBJbWFnZSBXaWR0aA0KLSAgICBJbWFnZSBIZWlnaHQNCi0gICAgQml0cyBQZXIgU2FtcGxlDQotICAgIENvbXByZXNzaW9uDQotICAgIFBob3RvbWV0cmljIEludGVycHJldGF0aW9uDQotICAgIEltYWdlIERlc2NyaXB0aW9uDQotICAgIE1ha2UNCi0gICAgTW9kZWwNCi0gICAgT3JpZW50YXRpb24NCi0gICAgWCBSZXNvbHV0aW9uDQotICAgIFkgUmVzb2x1dGlvbg0KLSAgICBSZXNvbHV0aW9uIFVuaXQNCi0gICAgU29mdHdhcmUNCi0gICAgTW9kaWZ5IERhdGUNCi0gICAgQXJ0aXN0DQotICAgIFlDYkNyUG9zaXRpb25pbmcNCi0gICAgQ29weXJpZ2h0DQotICAgIEV4cG9zdXJlIFRpbWUNCi0gICAgRiBOdW1iZXINCi0gICAgRXhwb3N1cmUgUHJvZ3JhbQ0KLSAgICBJU08gU3BlZWQNCi0gICAgR1BTIExhdGl0dWRlDQotICAgIEdQUyBMYXRpdHVkZSBSZWYNCi0gICAgR1BTIExvbmdpdHVkZQ0KLSAgICBHUFMgTG9uZ2l0dWRlIFJlZg0KLSAgICBHUFMgQWx0aXR1ZGUNCi0gICAgR1BTIEFsdGl0dWRlIFJlZg0KLSAgICBTZWxmIFRpbWVyIE1vZGUNCi0gICAgVGltZSBab25lIE9mZnNldA0KLSAgICBEYXRlIFRpbWUgT3JpZ2luYWwNCi0gICAgQ3JlYXRlIERhdGUNCi0gICAgU2h1dHRlciBTcGVlZCBWYWx1ZQ0KLSAgICBBcGVydHVyZSBWYWx1ZQ0KLSAgICBCcmlnaHRuZXNzIFZhbHVlDQotICAgIEV4cG9zdXJlIENvbXBlbnNhdGlvbg0KLSAgICBNYXggQXBlcnR1cmUgVmFsdWUgCQ0KLSAgICBNZXRlcmluZyBNb2RlDQotICAgIFN1YmplY3QgRGlzdGFuY2UNCi0gICAgTGlnaHQgU291cmNlDQotICAgIEZsYXNoDQotICAgIEZvY2FsIExlbmd0aA0KLSAgICBVc2VyIENvbW1lbnQNCi0gICAgQ29sb3IgU3BhY2UNCi0gICAgUGl4ZWxYRGltZW5zaW9uDQotICAgIFBpeGVsWURpbWVuc2lvbg0KLSAgICBFeHBvc3VyZSBNb2RlDQotICAgIFdoaXRlIEJhbGFuY2UNCi0gICAgU2NlbmUgQ2FwdHVyZSBUeXBlDQotICAgIEltYWdlIFVuaXF1ZSBJZA0KLSAgICBPd25lciBOYW1lDQotICAgIFNlcmlhbCBOdW1iZXINCi0gICAgUmF0aW5nDQotICAgIFJhdGluZyBQZXJjZW50DQotICAgIERhdGEgUHJlY2lzaW9uDQotDQotZG9jdW1lbnQNCi1vZmZpY2VEb2N1bWVudDtvZmZpY2VEb2N1bWVudDthcGFjaGUNCi1PZmZpY2UgRG9jdW1lbnQNCi1Eb2N1bWVudCBvZiB0eXBlIE9mZmljZQ0KLSAgICBBcHBsaWNhdGlvbiBOYW1lDQotICAgIEFwcGxpY2F0aW9uIFZlcnNpb24NCi0gICAgQXV0aG9yDQotICAgIENhdGVnb3J5DQotICAgIENvbnRlbnQgU3RhdHVzDQotICAgIENvbW1lbnRzDQotICAgIENvbXBhbnkNCi0gICAgS2V5d29yZHMNCi0gICAgTGFzdCBBdXRob3INCi0gICAgTWFuYWdlcg0KLSAgICBOb3Rlcw0KLSAgICBQcmVzZW50YXRpb24gRm9ybWF0DQotICAgIFJldmlzaW9uIE51bWJlcg0KLSAgICBUZW1wbGF0ZQ0KLSAgICBWZXJzaW9uDQotICAgIENoYXJhY3RlciBDb3VudA0KLSAgICBDaGFyYWN0ZXIgQ291bnQgV2l0aCBTcGFjZXMNCi0gICAgV29yZCBDb3VudA0KLSAgICBMaW5lIENvdW50DQotICAgIFBhZ2UgQ291bnQNCi0gICAgU2xpZGUgQ291bnQNCi0gICAgUGFyYWdyYXBoIENvdW50DQotICAgIFRvdGFsIFRpbWUNCi0gICAgRWRpdCBUaW1lDQotICAgIENyZWF0aW9uIERhdGUNCi0gICAgTGFzdCBTYXZlIERhdGUNCi0gICAgTGFzdCBQcmludGVkDQotDQotZG9jdW1lbnQNCi1wZGZEb2N1bWVudDtwZGZEb2N1bWVudDthcGFjaGU6b2ZmaWNlRG9jdW1lbnQNCi1QREYgRG9jdW1lbnQNCi1Eb2N1bWVudCBvZiB0eXBlIFBERg0KLSAgICBDcmVhdG9yDQotICAgIFRpdGxlDQotICAgIFN1YmplY3QNCi0gICAgVHJhcHBlZA0KLQ0KLWRvY3VtZW50DQotdmlkZW9GaWxlO3ZpZGVvRmlsZTthcGFjaGUNCi1WaWRlbyBGaWxlDQotVmlkZW8gTW92aWVzDQotICAgIEFydGlzdA0KLSAgICBBbGJ1bQ0KLSAgICBUaXRsZQ0KLSAgICBDb21tZW50DQotICAgIEdlbnJlDQotICAgIExlbmd0aA0KLSAgICBUcmFjaw0KLSAgICBZZWFyDQotICAgIERpc2MgTnVtYmVyDQotICAgIEltYWdlIFdpZHRoDQotICAgIEltYWdlIEhlaWdodA0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3Jlc291cmNlcy9UeXBlc1htbEdlbmVyYXRvci5ncm9vdnkgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvVHlwZXNYbWxHZW5lcmF0b3IuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDViYjJiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3Jlc291cmNlcy9UeXBlc1htbEdlbmVyYXRvci5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyANCi0vLyBHcm9vdnkgc2NyaXB0IHRvIGdlbmVyYXRlIGEgdHlwZXMueG1sIGZpbGUgZnJvbSBhIHRleHQgZmlsZSBpbiANCi0vLyBhIHNpbXBsaWZpZWQgc3ludGF4DQotLy8gVGhpcyBzY3JpcHQgZXhwZWN0cyB0d28gZmlsZXMgbmFtZXMgVHlwZURlZmluaXRpb25zLnR4dCBhbmQgDQotLy8gUHJvcGVydHlEZWZpbml0aW9ucy50eHQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBnZW5lcmF0ZXMNCi0vLyBmaWxlIHR5cGVzLnhtbCB0aGF0IGNhbiBiZSBpbXBvcnRlZCBpbnRvIHRoZSBJbk1lbW9yeVNlcnZlcg0KLS8vIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiBnZW5Db21tb25zMShuYW1lLCBpZCwgZGVzY3IpIHsNCi0gICAgZGVmIGlkMSA9IGlkDQotICAgIGRlZiBsb2NhbE5hbWUgPSBuYW1lDQotICAgIGRlZiBucyA9ICIiDQotICAgIA0KLSAgICAvLyBhbGxvdyBzeW50YXggbmFtZTtsb2NhbE5hbWU7bmFtZXNwYWNlIGluIHByb3BlcnR5IG5hbWUgbGluZQ0KLSAgICBpZiAoaWQuY29udGFpbnMoIjsiKSkgew0KLSAgICAgICAgbmFtZXMgPSBpZC50b2tlbml6ZSgiOyIpDQotICAgICAgICBpZiAobmFtZXMuc2l6ZSgpID4gMCkNCi0gICAgICAgICAgICBpZDEgPSBuYW1lc1swXTsNCi0gICAgICAgIGlmIChuYW1lcy5zaXplKCkgPiAxKQ0KLSAgICAgICAgICAgIGxvY2FsTmFtZSA9IG5hbWVzWzFdOw0KLSAgICAgICAgaWYgKG5hbWVzLnNpemUoKSA+IDIpDQotICAgICAgICAgICAgbnMgPSBuYW1lc1syXTsNCi0gICAgfQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPGlkPiIgKyBpZDEgKyAiPC9pZD4iKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPGxvY2FsTmFtZT4iICsgbG9jYWxOYW1lICsgIjwvbG9jYWxOYW1lPiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgICAgICA8ZGlzcGxheU5hbWU+IiArIG5hbWUgKyAiPC9kaXNwbGF5TmFtZT4iKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPHF1ZXJ5TmFtZT4iICsgbmFtZS5yZXBsYWNlQWxsKCIgIiwgIl8iKS50b1VwcGVyQ2FzZSgpICsgIjwvcXVlcnlOYW1lPiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgICAgICA8ZGVzY3JpcHRpb24+IiArIGRlc2NyICsgIjwvZGVzY3JpcHRpb24+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgICAgIDxsb2NhbE5hbWVzcGFjZT4iICsgbnMgKyAiPC9sb2NhbE5hbWVzcGFjZT4iKQ0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi1kZWYgZ2VuQ29tbW9uczIoY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKSB7DQotICAgIGRlZiBjYXJkaW5hbGl0eVN0ciANCi0gICAgZGVmIHVwZGF0YWJpbGl0eVN0cg0KLSAgICBkZWYgcmVxdWlyZWRTdHINCi0gICAgZGVmIHF1ZXJ5YWJsZVN0cg0KLSAgICBkZWYgb3JkZXJhYmxlU3RyDQotICAgIA0KLSAgICBpZiAodXBkYXRhYmlsaXR5LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgicmVhZG9ubHkiKSkgIA0KLSAgICAgICAgdXBkYXRhYmlsaXR5U3RyID0gInJlYWRvbmx5Ig0KLSAgICBlbHNlIGlmICh1cGRhdGFiaWxpdHkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJvbmNyZWF0ZSIpKSAgDQotICAgICAgICB1cGRhdGFiaWxpdHlTdHIgPSAib25jcmVhdGUiDQotICAgIGVsc2UgaWYgKHVwZGF0YWJpbGl0eS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIndoZW5jaGVja2Vkb3V0IikpICANCi0gICAgICAgIHVwZGF0YWJpbGl0eVN0ciA9ICJ3aGVuY2hlY2tlZG91dCINCi0gICAgZWxzZQ0KLSAgICAgICAgdXBkYXRhYmlsaXR5U3RyID0gInJlYWR3cml0ZSINCi0gICAgDQotICAgIGlmIChyZXF1aXJlZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInRydWUiKSkNCi0gICAgICAgIHJlcXVpcmVkU3RyID0gInRydWUiDQotICAgIGVsc2UNCi0gICAgICAgIHJlcXVpcmVkU3RyID0gImZhbHNlIg0KLQ0KLSAgICAgICAgaWYgKGNhcmRpbmFsaXR5LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgibXVsdGkiKSkNCi0gICAgICAgIGNhcmRpbmFsaXR5U3RyID0gIm11bHRpIg0KLSAgICBlbHNlDQotICAgICAgICBjYXJkaW5hbGl0eVN0ciA9ICJzaW5nbGUiDQotICAgIA0KLSAgICBpZiAocXVlcnlhYmxlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgidHJ1ZSIpKQ0KLSAgICAgICAgcXVlcnlhYmxlU3RyID0gInRydWUiDQotICAgIGVsc2UNCi0gICAgICAgIHF1ZXJ5YWJsZVN0ciA9ICJmYWxzZSINCi0NCi0gICAgaWYgKG9yZGVyYWJsZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInRydWUiKSkNCi0gICAgICAgIG9yZGVyYWJsZVN0ciA9ICJ0cnVlIg0KLSAgICBlbHNlDQotICAgICAgICBvcmRlcmFibGVTdHIgPSAiZmFsc2UiDQotDQotCW91dEZpbGUucHJpbnRsbigiICAgICAgICA8Y2FyZGluYWxpdHk+IiArICBjYXJkaW5hbGl0eVN0ciArICI8L2NhcmRpbmFsaXR5PiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgICAgICA8dXBkYXRhYmlsaXR5PiIgKyB1cGRhdGFiaWxpdHlTdHIgKyAiPC91cGRhdGFiaWxpdHk+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4iKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPHJlcXVpcmVkPiIgKyByZXF1aXJlZFN0ciArICI8L3JlcXVpcmVkPiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgICAgICA8cXVlcnlhYmxlPiIgKyBxdWVyeWFibGVTdHIgKyAiPC9xdWVyeWFibGU+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgICAgIDxvcmRlcmFibGU+IiArIG9yZGVyYWJsZVN0ciArICI8L29yZGVyYWJsZT4iKQ0KLSAgICBvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+IikNCi0JaWYgKG51bGwgIT0gY2hvaWNlcykgDQotCSAgICBnZW5DaG9pY2VzKGNob2ljZXMpDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiBnZW5Cb29sZWFuIChuYW1lLCB1dWlkLCBkZXNjciwgY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKSB7DQotCW91dEZpbGUucHJpbnRsbigiICAgIDxwcm9wZXJ0eUJvb2xlYW5EZWZpbml0aW9uPiIpDQotCWdlbkNvbW1vbnMxKG5hbWUsIHV1aWQsIGRlc2NyKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPHByb3BlcnR5VHlwZT5ib29sZWFuPC9wcm9wZXJ0eVR5cGU+IikNCi0JZ2VuQ29tbW9uczIoY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICA8L3Byb3BlcnR5Qm9vbGVhbkRlZmluaXRpb24+IikNCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotZGVmIGdlbkRhdGUgKG5hbWUsIHV1aWQsIGRlc2NyLCBjaG9pY2VzLCBjYXJkaW5hbGl0eSwgdXBkYXRhYmlsaXR5LCByZXF1aXJlZCwgcXVlcnlhYmxlLCBvcmRlcmFibGUpIHsNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPHByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPiIpDQotCWdlbkNvbW1vbnMxKG5hbWUsIHV1aWQsIGRlc2NyKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPHByb3BlcnR5VHlwZT5kYXRldGltZTwvcHJvcGVydHlUeXBlPiIpDQotCWdlbkNvbW1vbnMyKGNob2ljZXMsIGNhcmRpbmFsaXR5LCB1cGRhdGFiaWxpdHksIHJlcXVpcmVkLCBxdWVyeWFibGUsIG9yZGVyYWJsZSkNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPC9wcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4iKQ0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi1kZWYgZ2VuSWQgKG5hbWUsIHV1aWQsIGRlc2NyLCBjaG9pY2VzLCBjYXJkaW5hbGl0eSwgdXBkYXRhYmlsaXR5LCByZXF1aXJlZCwgcXVlcnlhYmxlLCBvcmRlcmFibGUpIHsNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPHByb3BlcnR5SWREZWZpbml0aW9uPiIpDQotCWdlbkNvbW1vbnMxKG5hbWUsIHV1aWQsIGRlc2NyKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPHByb3BlcnR5VHlwZT5pZDwvcHJvcGVydHlUeXBlPiIpDQotCWdlbkNvbW1vbnMyKGNob2ljZXMsIGNhcmRpbmFsaXR5LCB1cGRhdGFiaWxpdHksIHJlcXVpcmVkLCBxdWVyeWFibGUsIG9yZGVyYWJsZSkNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPC9wcm9wZXJ0eUlkRGVmaW5pdGlvbj4iKQ0KLX0NCi0gDQotNDUvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi1kZWYgZ2VuSW50ZWdlciAobmFtZSwgdXVpZCwgZGVzY3IsIGNob2ljZXMsIGNhcmRpbmFsaXR5LCB1cGRhdGFiaWxpdHksIHJlcXVpcmVkLCBxdWVyeWFibGUsIG9yZGVyYWJsZSkgew0KLQlvdXRGaWxlLnByaW50bG4oIiAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4iKQ0KLQlnZW5Db21tb25zMShuYW1lLCB1dWlkLCBkZXNjcikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPiIpDQotCWdlbkNvbW1vbnMyKGNob2ljZXMsIGNhcmRpbmFsaXR5LCB1cGRhdGFiaWxpdHksIHJlcXVpcmVkLCBxdWVyeWFibGUsIG9yZGVyYWJsZSkNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPiIpDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiBnZW5TdHJpbmcgKG5hbWUsIHV1aWQsIGRlc2NyLCBjaG9pY2VzLCBjYXJkaW5hbGl0eSwgdXBkYXRhYmlsaXR5LCByZXF1aXJlZCwgcXVlcnlhYmxlLCBvcmRlcmFibGUpIHsNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4iKQ0KLQlnZW5Db21tb25zMShuYW1lLCB1dWlkLCBkZXNjcikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+IikNCi0JZ2VuQ29tbW9uczIoY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4iKQ0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi1kZWYgZ2VuRGVjaW1hbCAobmFtZSwgdXVpZCwgZGVzY3IsIGNob2ljZXMsIGNhcmRpbmFsaXR5LCB1cGRhdGFiaWxpdHksIHJlcXVpcmVkLCBxdWVyeWFibGUsIG9yZGVyYWJsZSkgew0KLQlvdXRGaWxlLnByaW50bG4oIiAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4iKQ0KLQlnZW5Db21tb25zMShuYW1lLCB1dWlkLCBkZXNjcikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPiIpDQotCWdlbkNvbW1vbnMyKGNob2ljZXMsIGNhcmRpbmFsaXR5LCB1cGRhdGFiaWxpdHksIHJlcXVpcmVkLCBxdWVyeWFibGUsIG9yZGVyYWJsZSkNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPiIpDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiBnZW5DaG9pY2VzIChjaG9pY2VzKSB7DQotCSAgIGNob2ljZXMuZWFjaCB7DQotCSAgICAga2V5VmFsdWUgPSBpdC50b2tlbml6ZSgiPSIpDQotCQkgU3RyaW5nIGtleSA9IGtleVZhbHVlLmdldCgwKS50cmltKCkNCi0JCSBTdHJpbmcgdmFsdWUgPSBrZXlWYWx1ZS5nZXQoMSkudHJpbSgpDQotCQkgLy8gcHJpbnRsbigiRm91bmQgZW51bSB3aXRoIGtleTogIiArIGtleSArICIgdmFsdWU6ICIgKyB2YWx1ZSkNCi0gICAgICAgICBvdXRGaWxlLnByaW50bG4oIiAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT1cIiIgKyB2YWx1ZSArICJcIj4iKQ0KLSAgICAgICAgIG91dEZpbGUucHJpbnRsbigiICAgICAgICAgICAgPHZhbHVlPiIgKyBrZXkgKyAiPC92YWx1ZT4iKQ0KLSAgICAgICAgIG91dEZpbGUucHJpbnRsbigiICAgICAgICA8L2Nob2ljZT4iKQ0KLQkgICB9DQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiBnZW5UeXBlRGVmIChuYW1lLCBpZCwgZGVzY3IsIHR5cGVLaW5kLCBwYXJlbnRUeXBlLCBwcm9wcykgew0KLQ0KLSAgICBTdHJpbmcgeHNpVHlwZQ0KLSAgICBTdHJpbmcgYmFzZUlkDQotICAgIA0KLSAgICBzd2l0Y2ggKHR5cGVLaW5kKSB7DQotICAgICAgICBjYXNlICJkb2N1bWVudCI6DQotICAgICAgICAgIHhzaVR5cGUgPSAiY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIg0KLSAgICAgICAgICBiYXNlSWQgPSAiY21pczpkb2N1bWVudCINCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlICJmb2xkZXIiOg0KLSAgICAgICAgICB4c2lUeXBlID0gImNtaXNUeXBlRm9sZGVyRGVmaW5pdGlvblR5cGUiDQotICAgICAgICAgIGJhc2VJZCA9ICJjbWlzOmZvbGRlciINCi0gICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgcHJpbnRsbigiRXJyb3IgaWxsZWdhbCB0eXBlOiAiICsgdHlwZUtpbmQpDQotICAgIH0NCi0gICAgaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkNCi0gICAgICBwYXJlbnRUeXBlID0gYmFzZUlkDQotICAgICAgDQotICAgIGRlZiBpZDEgPSBpZA0KLSAgICBkZWYgbG9jYWxOYW1lID0gbmFtZQ0KLSAgICBkZWYgbnMgPSAiIg0KLSAgICANCi0gICAgLy8gYWxsb3cgc3ludGF4IG5hbWU7bG9jYWxOYW1lO25hbWVzcGFjZSBpbiBwcm9wZXJ0eSBuYW1lIGxpbmUNCi0gICAgaWYgKGlkLmNvbnRhaW5zKCI7IikpIHsNCi0gICAgICAgIG5hbWVzID0gaWQudG9rZW5pemUoIjsiKQ0KLSAgICAgICAgaWYgKG5hbWVzLnNpemUoKSA+IDApDQotICAgICAgICAgICAgaWQxID0gbmFtZXNbMF07DQotICAgICAgICBpZiAobmFtZXMuc2l6ZSgpID4gMSkNCi0gICAgICAgICAgICBsb2NhbE5hbWUgPSBuYW1lc1sxXTsNCi0gICAgICAgICAgICBucyA9IG5hbWVzWzJdOw0KLSAgICB9DQotDQotCW91dEZpbGUucHJpbnRsbigiPGNtaXNyYTp0eXBlIHhzaTp0eXBlPVwiIiArIHhzaVR5cGUgKyAiXCI+IikNCi0gICAgb3V0RmlsZS5wcmludGxuKCIgICAgPGlkPiIgKyBpZDEgKyAiPC9pZD4iKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICA8bG9jYWxOYW1lPiIgKyBsb2NhbE5hbWUgKyAiPC9sb2NhbE5hbWU+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPGxvY2FsTmFtZXNwYWNlPiIgKyBucyArICI8L2xvY2FsTmFtZXNwYWNlPiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgIDxwYXJlbnRJZD4iICsgcGFyZW50VHlwZSArICI8L3BhcmVudElkPiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgIDxkaXNwbGF5TmFtZT4iICsgbmFtZSArICI8L2Rpc3BsYXlOYW1lPiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgIDxxdWVyeU5hbWU+IiArICBuYW1lLnJlcGxhY2VBbGwoIiAiLCAiXyIpLnRvVXBwZXJDYXNlKCkgKyAiPC9xdWVyeU5hbWU+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPGRlc2NyaXB0aW9uPiIgKyBkZXNjciArICI8L2Rlc2NyaXB0aW9uPiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgIDxiYXNlSWQ+IiArIGJhc2VJZCArICI8L2Jhc2VJZD4iKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICA8Y3JlYXRhYmxlPnRydWU8L2NyZWF0YWJsZT4iKQ0KLQlvdXRGaWxlLnByaW50bG4oIiAgICA8ZmlsZWFibGU+dHJ1ZTwvZmlsZWFibGU+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPGZ1bGx0ZXh0SW5kZXhlZD50cnVlPC9mdWxsdGV4dEluZGV4ZWQ+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPGluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT50cnVlPC9pbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+IikNCi0Jb3V0RmlsZS5wcmludGxuKCIgICAgPGNvbnRyb2xsYWJsZVBvbGljeT5mYWxzZTwvY29udHJvbGxhYmxlUG9saWN5PiIpDQotCW91dEZpbGUucHJpbnRsbigiICAgIDxjb250cm9sbGFibGVBQ0w+dHJ1ZTwvY29udHJvbGxhYmxlQUNMPiIpDQotICAgIGlmICh0eXBlS2luZCA9PSAiZG9jdW1lbnQiKSB7DQotICAgICAgICBvdXRGaWxlLnByaW50bG4oIiAgICA8dmVyc2lvbmFibGU+ZmFsc2U8L3ZlcnNpb25hYmxlPiIpDQotICAgICAgICBvdXRGaWxlLnByaW50bG4oIiAgICA8Y29udGVudFN0cmVhbUFsbG93ZWQ+YWxsb3dlZDwvY29udGVudFN0cmVhbUFsbG93ZWQ+IikNCi0gICAgfQ0KLSAgICBpZiAocHJvcHMgIT0gbnVsbCkNCi0gICAgICAgIHByb3BzLmVhY2ggeyANCi0gICAgICAgICAgICBkZWYgcHJvcERlZiA9IHByb3BEZWZzTWFwLmdldChpdCkNCi0gICAgICAgICAgICBpZiAocHJvcERlZiAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICBnZW5Qcm9wZXJ0eURlZiAocHJvcERlZi50eXBlLCBwcm9wRGVmLm5hbWUsIHByb3BEZWYuaWQsIHByb3BEZWYuZGVzY3IsIHByb3BEZWYuY2hvaWNlcywgDQotICAgICAgICAgICAgICAgICAgIHByb3BEZWYuY2FyZGluYWxpdHksIHByb3BEZWYudXBkYXRhYmlsaXR5LCBwcm9wRGVmLnJlcXVpcmVkLCBwcm9wRGVmLnF1ZXJ5YWJsZSwgcHJvcERlZi5vcmRlcmFibGUpDQotICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgcHJpbnRsbiAoIkVycm9yOiB1bmtub3duIHByb3BlcnR5IGRlZmluaXRpb24gIiArIGl0ICsgIiBpbiB0eXBlIGRlZmluaXRpb24gIiArIG5hbWUpDQotICAgICAgICB9DQotCW91dEZpbGUucHJpbnRsbigiPC9jbWlzcmE6dHlwZT4iKQ0KLSAgICBvdXRGaWxlLnByaW50bG4oKQ0KLSAgICBvdXRGaWxlLmZsdXNoKCkgICAgDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiBnZW5Qcm9wZXJ0eURlZih0eXBlLCBuYW1lLCB1dWlkLCBkZXNjciwgY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKSB7DQotICAgICAgICANCi0gICAgc3dpdGNoICh0eXBlKSB7DQotICAgICBjYXNlICJib29sZWFuIjoNCi0gICAgICAgZ2VuQm9vbGVhbihuYW1lLCB1dWlkLCBkZXNjciwgY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKQ0KLSAgICAgICBicmVhaw0KLSAgICAgY2FzZSAiZGF0ZXRpbWUiOg0KLSAgICAgICBnZW5EYXRlKG5hbWUsIHV1aWQsIGRlc2NyLCBjaG9pY2VzLCBjYXJkaW5hbGl0eSwgdXBkYXRhYmlsaXR5LCByZXF1aXJlZCwgcXVlcnlhYmxlLCBvcmRlcmFibGUpDQotICAgICAgIGJyZWFrDQotICAgICBjYXNlICJpZCI6DQotICAgICAgIGdlbklkKG5hbWUsIHV1aWQsIGRlc2NyLCBjaG9pY2VzLCBjYXJkaW5hbGl0eSwgdXBkYXRhYmlsaXR5LCByZXF1aXJlZCwgcXVlcnlhYmxlLCBvcmRlcmFibGUpDQotICAgICAgIGJyZWFrDQotICAgICBjYXNlICJpbnRlZ2VyIjoNCi0gICAgICAgZ2VuSW50ZWdlcihuYW1lLCB1dWlkLCBkZXNjciwgY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKQ0KLSAgICAgICBicmVhaw0KLSAgICAgY2FzZSAic3RyaW5nIjoNCi0gICAgICAgZ2VuU3RyaW5nKG5hbWUsIHV1aWQsIGRlc2NyLCBjaG9pY2VzLCBjYXJkaW5hbGl0eSwgdXBkYXRhYmlsaXR5LCByZXF1aXJlZCwgcXVlcnlhYmxlLCBvcmRlcmFibGUpDQotICAgICAgIGJyZWFrDQotICAgICBjYXNlICJkZWNpbWFsIjoNCi0gICAgICAgZ2VuRGVjaW1hbChuYW1lLCB1dWlkLCBkZXNjciwgY2hvaWNlcywgY2FyZGluYWxpdHksIHVwZGF0YWJpbGl0eSwgcmVxdWlyZWQsIHF1ZXJ5YWJsZSwgb3JkZXJhYmxlKQ0KLSAgICAgICBicmVhaw0KLSAgICAgZGVmYXVsdDoNCi0gICAgICAgcHJpbnRsbigiISEhRXJyb3I6IHVua25vd24gcHJvcGVydHkgdHlwZSAiICsgdHlwZSk7DQotICAgIH0NCi0gICAgDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiByZWFkUHJvcGVydGllc0ZpbGUoaW5wdXRGaWxlKSB7ICAgIA0KLSAgICBkZWYgcHJvcERlZk1hcCA9IFs6XQ0KLSAgICBkZWYgaW5GaWxlID0gbmV3IEZpbGUoaW5wdXRGaWxlKS5uZXdSZWFkZXIoKSANCi0gICAgDQotICAgIHdoaWxlIChpbkZpbGUucmVhZExpbmUoKSAhPSBudWxsKSB7ICAgDQotICAgICAgIGRlZiB0eXBlTGluZSA9IGluRmlsZS5yZWFkTGluZSgpDQotICAgICAgIGRlZiBuYW1lID0gaW5GaWxlLnJlYWRMaW5lKCkudHJpbSgpDQotICAgICAgIHByaW50bG4oIiAgIHByb2Nlc3NpbmcgcHJvcGVydHk6ICIgKyBuYW1lICsgIiB0eXBlOiAiICsgdHlwZUxpbmUpDQotICAgICAgIGRlZiBpZCA9IGluRmlsZS5yZWFkTGluZSgpLnRyaW0oKQ0KLSAgICAgICBkZWYgZGVzY3IgPSBpbkZpbGUucmVhZExpbmUoKS50cmltKCkNCi0gICAgICAgZGVmIGF0dHJzID0gaW5GaWxlLnJlYWRMaW5lKCkudHJpbSgpDQotICAgICAgIGRlZiBjaG9pY2VzID0gbnVsbDsNCi0gICAgICAgZGVmIGNhcmRpbmFsaXR5LCB1cGRhdGFiaWxpdHksIHJlcXVpcmVkLCBxdWVyeWFibGUsIG9yZGVyYWJsZQ0KLSAgICAgICANCi0NCi0gICAgICAgdHlwZSA9IHR5cGVMaW5lLnRva2VuaXplKCkuZ2V0KDApDQotICAgICAgIGRlZiBhcnIgPSBhdHRycy5zcGxpdCgiLCIpDQotICAgICAgIGNhcmRpbmFsaXR5ID0gYXJyLmxlbmd0aCA+IDAgPyBhcnJbMF0udHJpbSgpIDogbnVsbA0KLSAgICAgICB1cGRhdGFiaWxpdHkgPSBhcnIubGVuZ3RoID4gMSA/IGFyclsxXS50cmltKCkgOiBudWxsDQotICAgICAgIHJlcXVpcmVkID0gYXJyLmxlbmd0aCA+IDIgPyBhcnJbMl0udHJpbSgpIDogbnVsbA0KLSAgICAgICBxdWVyeWFibGUgPSBhcnIubGVuZ3RoID4gMiA/IGFyclszXS50cmltKCkgOiAiZmFsc2UiDQotICAgICAgIG9yZGVyYWJsZSA9IGFyci5sZW5ndGggPiAyID8gYXJyWzRdLnRyaW0oKSA6ICJmYWxzZSINCi0gICAgICAgDQotICAgICAgIGlmICh0eXBlTGluZS5jb250YWlucygiZW51bToiKSkgew0KLSAgICAgICAgICAgY2hvaWNlcyA9IHR5cGVMaW5lW3R5cGVMaW5lLmluZGV4T2YoImVudW06IikrIDUuLnR5cGVMaW5lLmxlbmd0aCgpLTFdLnRva2VuaXplKCI7IikNCi0gICAgICAgfQ0KLSAgICAgICBwcm9wRGVmTWFwLnB1dChuYW1lLCBbbmFtZTpuYW1lLCBpZDppZCwgZGVzY3I6ZGVzY3IsIHR5cGU6dHlwZSwgY2hvaWNlczpjaG9pY2VzLCBjYXJkaW5hbGl0eTpjYXJkaW5hbGl0eSwNCi0gICAgICAgICAgICAgICB1cGRhdGFiaWxpdHk6dXBkYXRhYmlsaXR5LCByZXF1aXJlZDpyZXF1aXJlZCwgcXVlcnlhYmxlOnF1ZXJ5YWJsZSwgb3JkZXJhYmxlOm9yZGVyYWJsZV0pDQotICAgIH0NCi0gICAgDQotICAgIHJldHVybiBwcm9wRGVmTWFwOyAgDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLWRlZiByZWFkVHlwZURlZmluaXRpb25zKGlucHV0RmlsZSkgew0KLSAgICBkZWYgdHlwZURlZk1hcCA9IFs6XQ0KLSAgICBkZWYgaW5SZWFkZXIgPSBuZXcgRmlsZShpbnB1dEZpbGUpLm5ld1JlYWRlcigpIA0KLSAgICAvLyBkZWYgaW5SZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHR5cGVEZWZJbnB1dCkNCi0gICAgZGVmIGxpbmUgPSBpblJlYWRlci5yZWFkTGluZSgpDQotICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsgICANCi0gICAgICAgZGVmIGtpbmQgPSBpblJlYWRlci5yZWFkTGluZSgpLnRyaW0oKQ0KLSAgICAgICBkZWYgaWRMaW5lID0gaW5SZWFkZXIucmVhZExpbmUoKS50cmltKCkNCi0gICAgICAgZGVmIG5hbWUgPSBpblJlYWRlci5yZWFkTGluZSgpLnRyaW0oKQ0KLSAgICAgICBkZWYgZGVzY3IgPSBpblJlYWRlci5yZWFkTGluZSgpLnRyaW0oKQ0KLSAgICAgICBkZWYgYXJyID0gaWRMaW5lLnNwbGl0KCI6IikNCi0gICAgICAgZGVmIGlkID0gYXJyLmxlbmd0aD4wID8gYXJyWzBdLnRyaW0oKSA6IG51bGwNCi0gICAgICAgZGVmIHN1cGVyVHlwZSA9IGFyci5sZW5ndGg+MSA/IGFyclsxXS50cmltKCkgOiBudWxsDQotDQotICAgICAgIGRlZiBwcm9wRGVmcyA9IFtdDQotICAgICAgIGRlZiByZWFkUHJvcGVydGllcyA9IHRydWU7DQotICAgICAgIHdoaWxlIChyZWFkUHJvcGVydGllcykgew0KLSAgICAgICAgICAgbGluZSA9IGluUmVhZGVyLnJlYWRMaW5lKCkNCi0gICAgICAgICAgIGlmIChsaW5lICE9IG51bGwgJiYgbGluZS5zaXplKCkgPiAwKSANCi0gICAgICAgICAgICAgICBwcm9wRGVmcy5wdXNoKGxpbmUudHJpbSgpKQ0KLSAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgcmVhZFByb3BlcnRpZXMgPSBmYWxzZTsNCi0gICAgICAgfQ0KLSAgICAgICBwcmludGxuKCJSZWFkaW5nIHR5cGUgZGVmICIgKyBuYW1lKQ0KLSAgICAgICB0eXBlRGVmTWFwLnB1dChuYW1lLCBbbmFtZTogbmFtZSwgaWQ6IGlkLCBraW5kOiBraW5kLCBzdXBlcjogc3VwZXJUeXBlLCBkZXNjcjogZGVzY3IsIHByb3BzOiBwcm9wRGVmc10pDQotICAgIH0NCi0gICAgcmV0dXJuIHR5cGVEZWZNYXANCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotZGVmIHdyaXRlVHlwZXModHlwZURlZnNNYXApIHsNCi0gICAgb3V0RmlsZS5wcmludGxuKCI8Y2hlbTp0eXBlRGVmaW5pdGlvbnMgeG1sbnM9XCJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4L1wiIikNCi0gICAgb3V0RmlsZS5wcmludGxuKCIgICAgIHhtbG5zOmNtaXNyYT1cImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL25zL2NtaXMvcmVzdGF0b20vMjAwOTA4L1wiIikNCi0gICAgb3V0RmlsZS5wcmludGxuKCIgICAgIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIiKQ0KLSAgICBvdXRGaWxlLnByaW50bG4oIiAgICAgeG1sbnM6Y2hlbT1cImh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9zY2hlbWFzL1R5cGVEZWZuaXRpb25zXCI+IikNCi0gICAgZm9yICggZSBpbiB0eXBlRGVmc01hcCAgICkgew0KLSAgICAgICAgcHJpbnRsbigiZ2VuZXJhdGluZyB0eXBlIiArICBlLnZhbHVlLm5hbWUpICANCi0gICAgICAgIGdlblR5cGVEZWYgKGUudmFsdWUubmFtZSwgZS52YWx1ZS5pZCwgZS52YWx1ZS5kZXNjciwgZS52YWx1ZS5raW5kLCBlLnZhbHVlLnN1cGVyLCBlLnZhbHVlLnByb3BzKSANCi0gICAgfQ0KLSAgICBvdXRGaWxlLnByaW50bG4oIjwvY2hlbTp0eXBlRGVmaW5pdGlvbnM+IikNCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotZGVmIHdyaXRlUHJvcERlZnMocHJvcERlZnNNYXApIHsNCi0gICAgZm9yICggZSBpbiBwcm9wRGVmc01hcCAgICkgew0KLSAgICAgICAgcHJpbnRsbigiZ2VuZXJhdGluZyBwcm9wZXJ0eSIgKyAgZS52YWx1ZS5uYW1lKSAgDQotICAgICAgICANCi0gICAgICAgIGdlblByb3BlcnR5RGVmIChlLnZhbHVlLnR5cGUsIGUudmFsdWUubmFtZSwgZS52YWx1ZS5pZCwgZS52YWx1ZS5kZXNjciwgZS52YWx1ZS5jaG9pY2VzLA0KLSAgICAgICAgICAgIGUudmFsdWUuY2FyZGluYWxpdHksIGUudmFsdWUudXBkYXRhYmlsaXR5LCBlLnZhbHVlLnJlcXVpcmVkKSANCi0gICAgfQ0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyAgTWFpbiBwcm9ncmFtDQotDQotcHJpbnRsbigiU3RhcnRpbmcuLi4iKQ0KLWRlZiBwcm9wc0ZpbGUgPSAiUHJvcGVydHlEZWZpbml0aW9ucy50eHQiOw0KLWRlZiB0eXBlc0ZpbGUgPSAiVHlwZURlZmluaXRpb25zLnR4dCI7DQotZGVmIG91dEZpbGVOYW1lID0gInR5cGVzLnhtbCI7DQotb3V0RmlsZSA9IG5ldyBGaWxlKG91dEZpbGVOYW1lKS5uZXdQcmludFdyaXRlcigpDQotDQotcHJpbnRsbigiUmVhZGluZyB0eXBlIGRlZmluaXRpb25zIGZyb20gZmlsZSAiICsgdHlwZXNGaWxlKTsNCi10eXBlRGVmc01hcCA9IHJlYWRUeXBlRGVmaW5pdGlvbnModHlwZXNGaWxlKQ0KLXByaW50bG4oIlJlYWRpbmcgcHJvcGVydHkgZGVmaW5pdGlvbnMgZnJvbSBmaWxlICIgKyBwcm9wc0ZpbGUpOw0KLXByb3BEZWZzTWFwID0gcmVhZFByb3BlcnRpZXNGaWxlKHByb3BzRmlsZSkNCi1wcmludGxuKCJXcml0aW5nIG91dCB0byAiICsgb3V0RmlsZU5hbWUpOyAgICAgIA0KLW91dEZpbGUucHJpbnRsbigiPCEtLSBHZW5lcmF0ZWQgT3V0cHV0IGZpbGUgd2l0aCB0eXBlIGRlZmluaXRpb25zLiBEbyBub3QgZWRpdCEgLS0+IikNCi13cml0ZVR5cGVzKHR5cGVEZWZzTWFwKQ0KLW91dEZpbGUuY2xvc2UoKQ0KLXByaW50bG4oIi4uLkRvbmUuIikNCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvY29tbWFuZGVyLWF0b21wdWItZXhhbXBsZS5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvcmVzb3VyY2VzL2NvbW1hbmRlci1hdG9tcHViLWV4YW1wbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1Mzc2My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvY29tbWFuZGVyLWF0b21wdWItZXhhbXBsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPXRlc3QKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnBhc3N3b3JkPXRlc3QKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwOi8vbG9jYWxob3N0L2NtaXMvYXRvbQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvcmVzb3VyY2VzL2NvbW1hbmRlci13ZWJzZXJ2aWNlcy1leGFtcGxlLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvY29tbWFuZGVyLXdlYnNlcnZpY2VzLWV4YW1wbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE2ZWI4Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvY29tbWFuZGVyLXdlYnNlcnZpY2VzLWV4YW1wbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj10ZXN0Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD10ZXN0Ci0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVwb3NpdG9yeVNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdC9jbWlzL1JlcG9zaXRvcnlTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdC9jbWlzL05hdmlnYXRpb25TZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuT2JqZWN0U2VydmljZT1odHRwOi8vbG9jYWxob3N0L2NtaXMvT2JqZWN0U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlZlcnNpb25pbmdTZXJ2aWNlPWh0dHA6Ly9sb2NhbGhvc3QvY21pcy9WZXJzaW9uaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdC9jbWlzL0Rpc2NvdmVyeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZWxhdGlvbnNoaXBTZXJ2aWNlPWh0dHA6Ly9sb2NhbGhvc3QvY21pcy9SZWxhdGlvbnNoaXBTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTXVsdGlGaWxpbmdTZXJ2aWNlPWh0dHA6Ly9sb2NhbGhvc3QvY21pcy9NdWx0aUZpbGlnU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlBvbGljeVNlcnZpY2U9aHR0cDovL2xvY2FsaG9zdC9jbWlzL1BvbGljeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5BQ0xTZXJ2aWNlPWh0dHA6Ly9sb2NhbGhvc3QvY21pcy9BQ0xTZXJ2aWNlP3dzZGwKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3Jlc291cmNlcy90eXBlcy54bWwgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9yZXNvdXJjZXMvdHlwZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGI4MjgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3Jlc291cmNlcy90eXBlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzU0ICswLDAgQEAKLTwhLS0gR2VuZXJhdGVkIE91dHB1dCBmaWxlIHdpdGggdHlwZSBkZWZpbml0aW9ucy4gRG8gbm90IGVkaXQhIC0tPgotPGNoZW06dHlwZURlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL2NvcmUvMjAwOTA4LyIKLSAgICAgeG1sbnM6Y21pc3JhPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9ucy9jbWlzL3Jlc3RhdG9tLzIwMDkwOC8iCi0gICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgIHhtbG5zOmNoZW09Imh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9zY2hlbWFzL1R5cGVEZWZuaXRpb25zIj4KLTxjbWlzcmE6dHlwZSB4c2k6dHlwZT0iY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIj4KLSAgICA8aWQ+YXVkaW9GaWxlPC9pZD4KLSAgICA8bG9jYWxOYW1lPmF1ZGlvRmlsZTwvbG9jYWxOYW1lPgotICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgIDxwYXJlbnRJZD5jbWlzOmRvY3VtZW50PC9wYXJlbnRJZD4KLSAgICA8ZGlzcGxheU5hbWU+QXVkaW8gRmlsZTwvZGlzcGxheU5hbWU+Ci0gICAgPHF1ZXJ5TmFtZT5BVURJT19GSUxFPC9xdWVyeU5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF1ZGlvIENvbnRlbnQgKGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkKTwvZGVzY3JpcHRpb24+Ci0gICAgPGJhc2VJZD5jbWlzOmRvY3VtZW50PC9iYXNlSWQ+Ci0gICAgPGNyZWF0YWJsZT50cnVlPC9jcmVhdGFibGU+Ci0gICAgPGZpbGVhYmxlPnRydWU8L2ZpbGVhYmxlPgotICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgIDxmdWxsdGV4dEluZGV4ZWQ+dHJ1ZTwvZnVsbHRleHRJbmRleGVkPgotICAgIDxpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+dHJ1ZTwvaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PgotICAgIDxjb250cm9sbGFibGVQb2xpY3k+ZmFsc2U8L2NvbnRyb2xsYWJsZVBvbGljeT4KLSAgICA8Y29udHJvbGxhYmxlQUNMPnRydWU8L2NvbnRyb2xsYWJsZUFDTD4KLSAgICA8dmVyc2lvbmFibGU+ZmFsc2U8L3ZlcnNpb25hYmxlPgotICAgIDxjb250ZW50U3RyZWFtQWxsb3dlZD5hbGxvd2VkPC9jb250ZW50U3RyZWFtQWxsb3dlZD4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YXJ0aXN0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxM2I8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkFydGlzdDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QVJUSVNUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BcnRpc3Q8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YWxidW08L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmFsYnVtPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BbGJ1bTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QUxCVU08L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnRpdGxlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnRpdGxlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT50aXRsZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VGl0bGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRJVExFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaXRsZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb21tZW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jb21tZW50PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Db21tZW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT01NRU5UPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tZW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Z2VucmU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmdlbnJlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5HZW5yZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R0VOUkU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkdlbnJlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5sZW5ndGg8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmxlbmd0aDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TGVuZ3RoPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5MRU5HVEg8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkxlbmd0aCBpbiBzZWNvbmRzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dHJhY2s8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnRyYWNrPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5UcmFjazwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+VFJBQ0s8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRyYWNrIGluIGFsYnVtPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+eWVhcjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+eWVhcjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+WWVhcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+WUVBUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+cmVsZWFzZSBkYXRlIG9mIGFsYnVuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNvbXBvc2VyPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jb21wb3NlcjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q29tcG9zZXI8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNPTVBPU0VSPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21wb3NlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5kaXNjTm88L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmRpc2NObzwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RGlzYyBOdW1iZXI8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkRJU0NfTlVNQkVSPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5udW1iZXIgb2YgZGlzYyAvIHRvdGFsIGRpc2NzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YXVkaW9Gb3JtYXQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmF1ZGlvRm9ybWF0PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BdWRpbyBGb3JtYXQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFVRElPX0ZPUk1BVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+QXVkaW8gRm9ybWF0IC8gY29tcHJlc3Npb24gc2NoZW1lPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnNhbXBsZVJhdGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnNhbXBsZVJhdGU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlNhbXBsZSBSYXRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TQU1QTEVfUkFURTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+U2FtcGxlIFJhdGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmF1ZGlvQ2hhbm5lbFR5cGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmF1ZGlvQ2hhbm5lbFR5cGU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkF1ZGlvIENoYW5uZWwgVHlwZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QVVESU9fQ0hBTk5FTF9UWVBFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5hdWRpbyBjaGFubmVsIHR5cGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNb25vIj4KLSAgICAgICAgICAgIDx2YWx1ZT5Nb25vPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlN0ZXJlbyI+Ci0gICAgICAgICAgICA8dmFsdWU+U3RlcmVvPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IjUuMSI+Ci0gICAgICAgICAgICA8dmFsdWU+NS4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IjcuMSI+Ci0gICAgICAgICAgICA8dmFsdWU+Ny4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5ub0NoYW5uZWxzPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5ub0NoYW5uZWxzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5OdW1iZXIgQ2hhbm5lbHM8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPk5VTUJFUl9DSEFOTkVMUzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+bnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb21wcmVzc29yVmVyc2lvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y29tcHJlc3NvclZlcnNpb248L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbXByZXNzb3IgVmVyc2lvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q09NUFJFU1NPUl9WRVJTSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj52ZXJzaW9uIGRlc2NyaXB0aW9uIG9mIGNvbXByZXNzb3I8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotPC9jbWlzcmE6dHlwZT4KLQotPGNtaXNyYTp0eXBlIHhzaTp0eXBlPSJjbWlzVHlwZURvY3VtZW50RGVmaW5pdGlvblR5cGUiPgotICAgIDxpZD5lbWFpbERvY3VtZW50PC9pZD4KLSAgICA8bG9jYWxOYW1lPmVtYWlsRG9jdW1lbnQ8L2xvY2FsTmFtZT4KLSAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICA8cGFyZW50SWQ+Y21pczpkb2N1bWVudDwvcGFyZW50SWQ+Ci0gICAgPGRpc3BsYXlOYW1lPkVtYWlsIERvY3VtZW50PC9kaXNwbGF5TmFtZT4KLSAgICA8cXVlcnlOYW1lPkVNQUlMX0RPQ1VNRU5UPC9xdWVyeU5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkRvY3VtZW50IG9mIHR5cGUgRW1haWw8L2Rlc2NyaXB0aW9uPgotICAgIDxiYXNlSWQ+Y21pczpkb2N1bWVudDwvYmFzZUlkPgotICAgIDxjcmVhdGFibGU+dHJ1ZTwvY3JlYXRhYmxlPgotICAgIDxmaWxlYWJsZT50cnVlPC9maWxlYWJsZT4KLSAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICA8ZnVsbHRleHRJbmRleGVkPnRydWU8L2Z1bGx0ZXh0SW5kZXhlZD4KLSAgICA8aW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PnRydWU8L2luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT4KLSAgICA8Y29udHJvbGxhYmxlUG9saWN5PmZhbHNlPC9jb250cm9sbGFibGVQb2xpY3k+Ci0gICAgPGNvbnRyb2xsYWJsZUFDTD50cnVlPC9jb250cm9sbGFibGVBQ0w+Ci0gICAgPHZlcnNpb25hYmxlPmZhbHNlPC92ZXJzaW9uYWJsZT4KLSAgICA8Y29udGVudFN0cmVhbUFsbG93ZWQ+YWxsb3dlZDwvY29udGVudFN0cmVhbUFsbG93ZWQ+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmZyb208L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmZyb208L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkZyb208L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkZST008L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnNlbmRlciBvZiBtZXNzYWdlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnRvPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT50bzwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VG88L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRPPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5yZWNpcGllbnRzIG9mIG1lc3NhZ2U8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5Pm11bHRpPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jYzwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y2M8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNjPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DQzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Y2FyYm9uIGNvcHkgcmVjaXBpZW50cyBvZiBtZXNzYWdlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5tdWx0aTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YmNjPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5iY2M8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkJjYzwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QkNDPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5ibGluZCBjYXJib24gY29weSByZWNpcGllbnRzIG9mIG1lc3NhZ2U8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5Pm11bHRpPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnN1YmplY3Q8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnN1YmplY3Q8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlN1YmplY3Q8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlNVQkpFQ1Q8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnN1YmpldCBvZiBtZXNzYWdlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1lc3NhZ2VSZWNpcGllbnRBZGRyZXNzPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5tZXNzYWdlUmVjaXBpZW50QWRkcmVzczwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TWVzc2FnZSBSZWNpcGllbnQgQWRkcmVzczwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TUVTU0FHRV9SRUNJUElFTlRfQUREUkVTUzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TWVzc2FnZSBSZWNpcGllbnQgQWRkcmVzczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNyZWF0aW9uRGF0ZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y3JlYXRpb25EYXRlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5DcmVhdGlvbiBEYXRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DUkVBVElPTl9EQVRFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5DcmVhdGlvbiBEYXRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGF0ZXRpbWU8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEYXRlVGltZURlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bGFzdFNhdmVEYXRlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5sYXN0U2F2ZURhdGU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxhc3QgU2F2ZSBEYXRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5MQVNUX1NBVkVfREFURTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TGFzdCBTYXZlIERhdGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5kYXRldGltZTwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLTwvY21pc3JhOnR5cGU+Ci0KLTxjbWlzcmE6dHlwZSB4c2k6dHlwZT0iY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIj4KLSAgICA8aWQ+ZXhpZkltYWdlPC9pZD4KLSAgICA8bG9jYWxOYW1lPmV4aWZJbWFnZTwvbG9jYWxOYW1lPgotICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgIDxwYXJlbnRJZD5jbWlzOmRvY3VtZW50PC9wYXJlbnRJZD4KLSAgICA8ZGlzcGxheU5hbWU+RVhJRiBJbWFnZTwvZGlzcGxheU5hbWU+Ci0gICAgPHF1ZXJ5TmFtZT5FWElGX0lNQUdFPC9xdWVyeU5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkltYWdlIHdpdGggRVhJRiB0YWdzPC9kZXNjcmlwdGlvbj4KLSAgICA8YmFzZUlkPmNtaXM6ZG9jdW1lbnQ8L2Jhc2VJZD4KLSAgICA8Y3JlYXRhYmxlPnRydWU8L2NyZWF0YWJsZT4KLSAgICA8ZmlsZWFibGU+dHJ1ZTwvZmlsZWFibGU+Ci0gICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgPGZ1bGx0ZXh0SW5kZXhlZD50cnVlPC9mdWxsdGV4dEluZGV4ZWQ+Ci0gICAgPGluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT50cnVlPC9pbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+Ci0gICAgPGNvbnRyb2xsYWJsZVBvbGljeT5mYWxzZTwvY29udHJvbGxhYmxlUG9saWN5PgotICAgIDxjb250cm9sbGFibGVBQ0w+dHJ1ZTwvY29udHJvbGxhYmxlQUNMPgotICAgIDx2ZXJzaW9uYWJsZT5mYWxzZTwvdmVyc2lvbmFibGU+Ci0gICAgPGNvbnRlbnRTdHJlYW1BbGxvd2VkPmFsbG93ZWQ8L2NvbnRlbnRTdHJlYW1BbGxvd2VkPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+aW1hZ2VXaWR0aDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTAwPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5JbWFnZSBXaWR0aDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+SU1BR0VfV0lEVEg8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkltYWdlIFdpZHRoPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5pbWFnZUhlaWdodDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTAxPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5JbWFnZSBIZWlnaHQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklNQUdFX0hFSUdIVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+SW1hZ2UgSGVpZ2h0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5iaXRzUGVyU2FtcGxlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMDI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkJpdHMgUGVyIFNhbXBsZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QklUU19QRVJfU0FNUExFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5CaXRzIFBlciBTYW1wbGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5Pm9uY3JlYXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNvbXByZXNzaW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMDM8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbXByZXNzaW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT01QUkVTU0lPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tcHJlc3Npb24gRm9ybWF0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iVW5jb21wcmVzc2VkIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNDSVRUIDFEIj4KLSAgICAgICAgICAgIDx2YWx1ZT4yPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlQ0L0dyb3VwIDMgRmF4Ij4KLSAgICAgICAgICAgIDx2YWx1ZT4zPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlQ2L0dyb3VwIDQgRmF4Ij4KLSAgICAgICAgICAgIDx2YWx1ZT40PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkxaVyI+Ci0gICAgICAgICAgICA8dmFsdWU+NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJKUEVHIChvbGQtc3R5bGUpIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpQRUciPgotICAgICAgICAgICAgPHZhbHVlPjc8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQWRvYmUgRGVmbGF0ZSI+Ci0gICAgICAgICAgICA8dmFsdWU+ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJKQklHIEJXIj4KLSAgICAgICAgICAgIDx2YWx1ZT45PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpCSUcgQ29sb3IiPgotICAgICAgICAgICAgPHZhbHVlPjEwPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpQRUciPgotICAgICAgICAgICAgPHZhbHVlPjk5PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IktvZGFrIDI2MiI+Ci0gICAgICAgICAgICA8dmFsdWU+MjYyPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik5leHQiPgotICAgICAgICAgICAgPHZhbHVlPjMyNzY2PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlNvbnkgQVJXIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjMyNzY3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBhY2tlZCBSQVciPgotICAgICAgICAgICAgPHZhbHVlPjMyNzY5PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlNhbXN1bmcgU1JXIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjMyNzcwPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNDSVJMRVciPgotICAgICAgICAgICAgPHZhbHVlPjMyNzcxPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBhY2tCaXRzIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjc3MzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJUaHVuZGVyc2NhbiI+Ci0gICAgICAgICAgICA8dmFsdWU+MzI4MDk8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iS29kYWsgS0RDIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjMyODY3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IklUOENUUEFEIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjg5NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJJVDhMVyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzI4OTY8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iSVQ4TVAiPgotICAgICAgICAgICAgPHZhbHVlPjMyODk3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IklUOEJMIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjg5ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJQaXhhckZpbG0iPgotICAgICAgICAgICAgPHZhbHVlPjMyOTA4PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBpeGFyTG9nIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjkwOTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJEZWZsYXRlIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zMjk0NjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJEQ1MiPgotICAgICAgICAgICAgPHZhbHVlPjMyOTQ3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpCSUciPgotICAgICAgICAgICAgPHZhbHVlPjM0NjYxPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlNHSUxvZyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ2NzY8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iU0dJTG9nMjQiPgotICAgICAgICAgICAgPHZhbHVlPjM0Njc3PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpQRUcgMjAwMCI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ3MTI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTmlrb24gTkVGIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjM0NzEzPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkpCSUcyIFRJRkYgRlgiPgotICAgICAgICAgICAgPHZhbHVlPjM0NzE1PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik1pY3Jvc29mdCBEb2N1bWVudCBJbWFnaW5nIChNREkpIEJpbmFyeSBMZXZlbCBDb2RlYyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ3MTg8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTWljcm9zb2Z0IERvY3VtZW50IEltYWdpbmcgKE1ESSkgUHJvZ3Jlc3NpdmUgVHJhbnNmb3JtIENvZGVjIj4KLSAgICAgICAgICAgIDx2YWx1ZT4zNDcxOTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNaWNyb3NvZnQgRG9jdW1lbnQgSW1hZ2luZyAoTURJKSBWZWN0b3IiPgotICAgICAgICAgICAgPHZhbHVlPjM0NzIwPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IktvZGFrIERDUiBDb21wcmVzc2VkIj4KLSAgICAgICAgICAgIDx2YWx1ZT42NTAwMDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJQZW50YXggUEVGIENvbXByZXNzZWQiPgotICAgICAgICAgICAgPHZhbHVlPjY1NTM1PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTA2PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5QaG90b21ldHJpYyBJbnRlcnByZXRhdGlvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+UEhPVE9NRVRSSUNfSU5URVJQUkVUQVRJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbG9yIEZvcm1hdDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT48L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+b25jcmVhdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IldoaXRlSXNaZXJvIj4KLSAgICAgICAgICAgIDx2YWx1ZT4wPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkJsYWNrSXNaZXJvIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlJHQiI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJSR0IgUGFsZXR0ZSI+Ci0gICAgICAgICAgICA8dmFsdWU+MzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJUcmFuc3BhcmVuY3kgTWFzayI+Ci0gICAgICAgICAgICA8dmFsdWU+NDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDTVlLIj4KLSAgICAgICAgICAgIDx2YWx1ZT41PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IllDYkNyIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNJRUxhYiI+Ci0gICAgICAgICAgICA8dmFsdWU+ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJJQ0NMYWIiPgotICAgICAgICAgICAgPHZhbHVlPjk8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iSVRVTGFiIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xMDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDb2xvciBGaWx0ZXIgQXJyYXkiPgotICAgICAgICAgICAgPHZhbHVlPjMyODAzPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBpeGFyIExvZ0wiPgotICAgICAgICAgICAgPHZhbHVlPjMyODQ0PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBpeGFyIExvZ0x1diI+Ci0gICAgICAgICAgICA8dmFsdWU+MzI4NDU8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTGluZWFyIFJhdyI+Ci0gICAgICAgICAgICA8dmFsdWU+MzQ4OTI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmltYWdlRGVzY3JpcHRpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEwZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+SW1hZ2UgRGVzY3JpcHRpb248L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklNQUdFX0RFU0NSSVBUSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5tYWtlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMGY8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPk1ha2U8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPk1BS0U8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNhbWVyYSBNYWtlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1vZGVsPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMTA8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPk1vZGVsPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5NT0RFTDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q2FtZXJhIE1vZGVsPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5vcmllbnRhdGlvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTEyPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5PcmllbnRhdGlvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+T1JJRU5UQVRJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9yaWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ikhvcml6b250YWwgKG5vcm1hbCkiPgotICAgICAgICAgICAgPHZhbHVlPjE8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTWlycm9yIGhvcml6b250YWwiPgotICAgICAgICAgICAgPHZhbHVlPjI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iUm90YXRlIDE4MCI+Ci0gICAgICAgICAgICA8dmFsdWU+MzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNaXJyb3IgdmVydGljYWwiPgotICAgICAgICAgICAgPHZhbHVlPjQ8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTWlycm9yIGhvcml6b250YWwgYW5kIHJvdGF0ZSAyNzAgQ1ciPgotICAgICAgICAgICAgPHZhbHVlPjU8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iUm90YXRlIDkwIENXIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik1pcnJvciBob3Jpem9udGFsIGFuZCByb3RhdGUgOTAgQ1ciPgotICAgICAgICAgICAgPHZhbHVlPjc8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iUm90YXRlIDI3MCBDVyI+Ci0gICAgICAgICAgICA8dmFsdWU+ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnhSZXNvbHV0aW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMWE8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlggUmVzb2x1dGlvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+WF9SRVNPTFVUSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj54cmVzb2x1dGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnlSZXNvbHV0aW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMWI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlkgUmVzb2x1dGlvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+WV9SRVNPTFVUSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj55cmVzb2x1dGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnJlc29sdXRpb25Vbml0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMjg8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlJlc29sdXRpb24gVW5pdDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+UkVTT0xVVElPTl9VTklUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5SZXNvbHV0aW9uIFVuaXQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTm9uZSI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJpbmNoZXMiPgotICAgICAgICAgICAgPHZhbHVlPjI8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iY20iPgotICAgICAgICAgICAgPHZhbHVlPjM8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnNvZnR3YXJlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxMzE8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlNvZnR3YXJlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TT0ZUV0FSRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+U29mdHdhcmU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1vZGlmeURhdGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEzMjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TW9kaWZ5IERhdGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPk1PRElGWV9EQVRFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Nb2RpZnkgRGF0ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRhdGV0aW1lPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5hcnRpc3Q8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4MDEzYjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+QXJ0aXN0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5BUlRJU1Q8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkFydGlzdDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+eUNiQ3JQb3NpdGlvbmluZzwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMjEzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5ZQ2JDclBvc2l0aW9uaW5nPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5ZQ0JDUlBPU0lUSU9OSU5HPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5ZQ2JDciBQb3NpdGlvbmluZzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDZW50ZXJlZCI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDby1zaXRlZCI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y29weXJpZ2h0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDgyOTg8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvcHlyaWdodDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q09QWVJJR0hUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db3B5cmlnaHQgTm90aWNlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmV4cG9zdXJlVGltZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4MjlhPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5FeHBvc3VyZSBUaW1lPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5FWFBPU1VSRV9USU1FPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FeHBvc3VyZSBUaW1lPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgICAgIDxpZD5mTnVtYmVyPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDgyOWQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkYgTnVtYmVyPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5GX05VTUJFUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ri1TdG9wIE51bWJlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+b25jcmVhdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZXhwb3N1cmVQcm9ncmFtPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDg4MjI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkV4cG9zdXJlIFByb2dyYW08L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkVYUE9TVVJFX1BST0dSQU08L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4cG9zdXJlIFByb2dyYW08L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5Pm9uY3JlYXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJOb3QgRGVmaW5lZCI+Ci0gICAgICAgICAgICA8dmFsdWU+MDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNYW51YWwiPgotICAgICAgICAgICAgPHZhbHVlPjE8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iUHJvZ3JhbSBBRSI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJBcGVydHVyZS1wcmlvcml0eSBBRSI+Ci0gICAgICAgICAgICA8dmFsdWU+MzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJTaHV0dGVyIHNwZWVkIHByaW9yaXR5IEFFIj4KLSAgICAgICAgICAgIDx2YWx1ZT40PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkNyZWF0aXZlIChTbG93IHNwZWVkKSI+Ci0gICAgICAgICAgICA8dmFsdWU+NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJBY3Rpb24gKEhpZ2ggc3BlZWQpIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBvcnRyYWl0Ij4KLSAgICAgICAgICAgIDx2YWx1ZT43PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkxhbmRzY2FwZSI+Ci0gICAgICAgICAgICA8dmFsdWU+ODwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJCdWxiIj4KLSAgICAgICAgICAgIDx2YWx1ZT45PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+aXNvU3BlZWQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODgyNzwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+SVNPIFNwZWVkPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5JU09fU1BFRUQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPklTTyBTcGVlZCBTZXR0aW5nPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Z3BzTGF0aXR1ZGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODgyNS0weDAwMDI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkdQUyBMYXRpdHVkZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0xBVElUVURFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HUFMgTGF0aXR1ZGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5kZWNpbWFsPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5ncHNMYXRpdHVkZVJlZjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODI1LTB4MDAwMTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+R1BTIExhdGl0dWRlIFJlZjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0xBVElUVURFX1JFRjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+R1BTIExhdGl0dWRlIFJlZmVyZW5jZSAoTi9TKTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJOb3J0aCI+Ci0gICAgICAgICAgICA8dmFsdWU+TjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJTb3V0aCI+Ci0gICAgICAgICAgICA8dmFsdWU+UzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Z3BzTG9uZ2l0dWRlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDg4MjUtMHgwMDA0PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5HUFMgTG9uZ2l0dWRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5HUFNfTE9OR0lUVURFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HUFMgTG9uZ2l0dWRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Z3BzTG9uZ2l0dWRlUmVmPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDg4MjUtMHgwMDAzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5HUFMgTG9uZ2l0dWRlIFJlZjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0xPTkdJVFVERV9SRUY8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkdQUyBMb25naXR1ZGUgUmVmZXJlbmNlIChXL0UpPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IkVhc3QiPgotICAgICAgICAgICAgPHZhbHVlPkU8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iV2VzdCI+Ci0gICAgICAgICAgICA8dmFsdWU+VzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Z3BzQWx0aXR1ZGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4ODgyNS0weDAwMDY8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkdQUyBBbHRpdHVkZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0FMVElUVURFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5HUFMgQWx0aXR1ZGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5kZWNpbWFsPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5ncHNBbHRpdHVkZVJlZjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODI1LTB4MDAwNTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+R1BTIEFsdGl0dWRlIFJlZjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R1BTX0FMVElUVURFX1JFRjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+R1BTIEFsdGl0dWRlIFJlZmVyZW5jZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJBYm92ZSBTZWEgTGV2ZWwiPgotICAgICAgICAgICAgPHZhbHVlPjA8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQmVsb3cgU2VhIExldmVsIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zZWxmVGltZXJNb2RlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDg4MmI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlNlbGYgVGltZXIgTW9kZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U0VMRl9USU1FUl9NT0RFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TZWxmIFRpbWVyIE1vZGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD50aW1lWm9uZU9mZnNldDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg4ODJhPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5UaW1lIFpvbmUgT2Zmc2V0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5USU1FX1pPTkVfT0ZGU0VUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaW1lIFpvbmUgT2Zmc2V0IChHTVQgb2Zmc2V0IGluIGhvdXJzKTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5Pm11bHRpPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmRhdGVUaW1lT3JpZ2luYWw8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTAwMzwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RGF0ZSBUaW1lIE9yaWdpbmFsPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5EQVRFX1RJTUVfT1JJR0lOQUw8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRhdGUvdGltZSB3aGVuIG9yaWdpbmFsIGltYWdlIHdhcyB0YWtlbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRhdGV0aW1lPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNyZWF0ZURhdGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTAwNDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q3JlYXRlIERhdGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkNSRUFURV9EQVRFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kYXRlL3RpbWUgZGlnaXRpemVkPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGF0ZXRpbWU8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+c2h1dHRlclNwZWVkVmFsdWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwMTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U2h1dHRlciBTcGVlZCBWYWx1ZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U0hVVFRFUl9TUEVFRF9WQUxVRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+c2h1dHRlciBzcGVlZCB2YWx1ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmFwZXJ0dXJlVmFsdWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwMjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+QXBlcnR1cmUgVmFsdWU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkFQRVJUVVJFX1ZBTFVFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BcGVydHVyZSBWYWx1ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmJyaWdodG5lc3NWYWx1ZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjAzPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5CcmlnaHRuZXNzIFZhbHVlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5CUklHSFRORVNTX1ZBTFVFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5CcmlnaHRuZXNzIFZhbHVlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURlY2ltYWxEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZXhwb3N1cmVDb21wZW5zYXRpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwNDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+RXhwb3N1cmUgQ29tcGVuc2F0aW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5FWFBPU1VSRV9DT01QRU5TQVRJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4cG9zdXJlIENvbXBlbnNhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1heEFwZXJ0dXJlVmFsdWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwNTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TWF4IEFwZXJ0dXJlIFZhbHVlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5NQVhfQVBFUlRVUkVfVkFMVUU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk1heCBBcGVydHVyZSBWYWx1ZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm1ldGVyaW5nTW9kZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjA3PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5NZXRlcmluZyBNb2RlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5NRVRFUklOR19NT0RFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5tZXRlcmluZyBtb2RlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlVua25vd24iPgotICAgICAgICAgICAgPHZhbHVlPjA8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQXZlcmFnZSI+Ci0gICAgICAgICAgICA8dmFsdWU+MTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJDZW50ZXItd2VpZ2h0ZWQgYXZlcmFnZSI+Ci0gICAgICAgICAgICA8dmFsdWU+MjwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJTcG90Ij4KLSAgICAgICAgICAgIDx2YWx1ZT4zPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik11bHRpLXNwb3QiPgotICAgICAgICAgICAgPHZhbHVlPjQ8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTXVsdGktc2VnbWVudCI+Ci0gICAgICAgICAgICA8dmFsdWU+NTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJQYXJ0aWFsIj4KLSAgICAgICAgICAgIDx2YWx1ZT42PC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik90aGVyIj4KLSAgICAgICAgICAgIDx2YWx1ZT4yNTU8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zdWJqZWN0RGlzdGFuY2U8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTIwNjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U3ViamVjdCBEaXN0YW5jZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U1VCSkVDVF9ESVNUQU5DRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+c3ViamVjdCBkaXN0YW5jZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmRlY2ltYWw8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmxpZ2h0U291cmNlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDkyMDg8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxpZ2h0IFNvdXJjZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TElHSFRfU09VUkNFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5saWdodCBzb3VyY2UgdmFsdWU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5mbGFzaDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjA5PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5GbGFzaDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+RkxBU0g8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkZsYXNoIFNldHRpbmc8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGVjaW1hbERlZmluaXRpb24+Ci0gICAgICAgIDxpZD5mb2NhbExlbmd0aDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHg5MjBhPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Gb2NhbCBMZW5ndGg8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkZPQ0FMX0xFTkdUSDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Zm9jYWwgbGVuZ3RoPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGVjaW1hbDwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEZWNpbWFsRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dXNlckNvbW1lbnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4OTI4NjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VXNlciBDb21tZW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5VU0VSX0NPTU1FTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnVzZXIgY29tbWVudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y29sb3JTcGFjZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHhhMDAxPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Db2xvciBTcGFjZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q09MT1JfU1BBQ0U8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmNvbG9yIHNwYWNlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9InNSR0IiPgotICAgICAgICAgICAgPHZhbHVlPjE8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQWRvYmUgUkdCIj4KLSAgICAgICAgICAgIDx2YWx1ZT4yPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IldpZGUgR2FtdXQgUkdCIj4KLSAgICAgICAgICAgIDx2YWx1ZT42NTUzMzwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJJQ0MgUHJvZmlsZSI+Ci0gICAgICAgICAgICA8dmFsdWU+NjU1MzQ8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iVW5jYWxpYnJhdGVkIj4KLSAgICAgICAgICAgIDx2YWx1ZT42NTUzNTwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnBpeGVsWERpbWVuc2lvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHhhMDAyPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5QaXhlbFhEaW1lbnNpb248L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlBJWEVMWERJTUVOU0lPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGltZW5zaW9uIGluIHBpeGVsIHg8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5waXhlbFlEaW1lbnNpb248L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4YTAwMzwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+UGl4ZWxZRGltZW5zaW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5QSVhFTFlESU1FTlNJT048L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRpbWVuc2lvbiBpbiBwaXhlbCB5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+ZXhwb3N1cmVNb2RlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weGE0MDI8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkV4cG9zdXJlIE1vZGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkVYUE9TVVJFX01PREU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkV4cG9zdXJlIE1vZGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQXV0byI+Ci0gICAgICAgICAgICA8dmFsdWU+MDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNYW51YWwiPgotICAgICAgICAgICAgPHZhbHVlPjE8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQXV0byBicmFja2V0Ij4KLSAgICAgICAgICAgIDx2YWx1ZT4yPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+d2hpdGVCYWxhbmNlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weGE0MDM8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPldoaXRlIEJhbGFuY2U8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPldISVRFX0JBTEFOQ0U8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPndoaXRlIGJhbGFuY2U8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iQXV0byI+Ci0gICAgICAgICAgICA8dmFsdWU+MDwvdmFsdWU+Ci0gICAgICAgIDwvY2hvaWNlPgotICAgICAgICA8Y2hvaWNlIGRpc3BsYXlOYW1lPSJNYW51YWwiPgotICAgICAgICAgICAgPHZhbHVlPjE8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zY2VuZUNhcHR1cmVUeXBlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weGE0MDY8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlNjZW5lIENhcHR1cmUgVHlwZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U0NFTkVfQ0FQVFVSRV9UWVBFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5TY2VuZSBDYXB0dXJlIFR5cGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iU3RhbmRhcmQiPgotICAgICAgICAgICAgPHZhbHVlPjA8L3ZhbHVlPgotICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgPGNob2ljZSBkaXNwbGF5TmFtZT0iTGFuZHNjYXBlIj4KLSAgICAgICAgICAgIDx2YWx1ZT4xPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9IlBvcnRyYWl0Ij4KLSAgICAgICAgICAgIDx2YWx1ZT4yPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgIDxjaG9pY2UgZGlzcGxheU5hbWU9Ik5pZ2h0Ij4KLSAgICAgICAgICAgIDx2YWx1ZT4zPC92YWx1ZT4KLSAgICAgICAgPC9jaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUlkRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmltYWdlVW5pcXVlSWQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4YTQyMDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+SW1hZ2UgVW5pcXVlIElkPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5JTUFHRV9VTklRVUVfSUQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkltYWdlIFVuaXF1ZSBJZDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmlkPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SWREZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5vd25lck5hbWU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4YTQzMDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+T3duZXIgTmFtZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+T1dORVJfTkFNRTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+T3duZXIgTmFtZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zZXJpYWxOdW1iZXI8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPjB4YTQzMTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+U2VyaWFsIE51bWJlcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U0VSSUFMX05VTUJFUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+c2VyaWFsIG51bWJlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cmF0aW5nPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDQ3NDY8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlJhdGluZzwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+UkFUSU5HPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5yYXRpbmcgdmFsdWU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5yYXRpbmdQZXJjZW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDQ3NDk8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlJhdGluZyBQZXJjZW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5SQVRJTkdfUEVSQ0VOVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+cmF0aW5nIHBlcmNlbnQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5kYXRhUHJlY2lzaW9uPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAwMDA8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkRhdGEgUHJlY2lzaW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5EQVRBX1BSRUNJU0lPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+SlBFRyBEYXRhIFByZWNpc2lvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLTwvY21pc3JhOnR5cGU+Ci0KLTxjbWlzcmE6dHlwZSB4c2k6dHlwZT0iY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIj4KLSAgICA8aWQ+b2ZmaWNlRG9jdW1lbnQ8L2lkPgotICAgIDxsb2NhbE5hbWU+b2ZmaWNlRG9jdW1lbnQ8L2xvY2FsTmFtZT4KLSAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICA8cGFyZW50SWQ+Y21pczpkb2N1bWVudDwvcGFyZW50SWQ+Ci0gICAgPGRpc3BsYXlOYW1lPk9mZmljZSBEb2N1bWVudDwvZGlzcGxheU5hbWU+Ci0gICAgPHF1ZXJ5TmFtZT5PRkZJQ0VfRE9DVU1FTlQ8L3F1ZXJ5TmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+RG9jdW1lbnQgb2YgdHlwZSBPZmZpY2U8L2Rlc2NyaXB0aW9uPgotICAgIDxiYXNlSWQ+Y21pczpkb2N1bWVudDwvYmFzZUlkPgotICAgIDxjcmVhdGFibGU+dHJ1ZTwvY3JlYXRhYmxlPgotICAgIDxmaWxlYWJsZT50cnVlPC9maWxlYWJsZT4KLSAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICA8ZnVsbHRleHRJbmRleGVkPnRydWU8L2Z1bGx0ZXh0SW5kZXhlZD4KLSAgICA8aW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PnRydWU8L2luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT4KLSAgICA8Y29udHJvbGxhYmxlUG9saWN5PmZhbHNlPC9jb250cm9sbGFibGVQb2xpY3k+Ci0gICAgPGNvbnRyb2xsYWJsZUFDTD50cnVlPC9jb250cm9sbGFibGVBQ0w+Ci0gICAgPHZlcnNpb25hYmxlPmZhbHNlPC92ZXJzaW9uYWJsZT4KLSAgICA8Y29udGVudFN0cmVhbUFsbG93ZWQ+YWxsb3dlZDwvY29udGVudFN0cmVhbUFsbG93ZWQ+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmFwcGxpY2F0aW9uTmFtZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+YXBwbGljYXRpb25OYW1lPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BcHBsaWNhdGlvbiBOYW1lPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5BUFBMSUNBVElPTl9OQU1FPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BcHBsaWNhdGlvbiBOYW1lPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmFwcGxpY2F0aW9uVmVyc2lvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+YXBwbGljYXRpb25WZXJzaW9uPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BcHBsaWNhdGlvbiBWZXJzaW9uPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5BUFBMSUNBVElPTl9WRVJTSU9OPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BcHBsaWNhdGlvbiBWZXJzaW9uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YXV0aG9yPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5hdXRob3I8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkF1dGhvcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QVVUSE9SPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BdXRob3I8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y2F0ZWdvcnk8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNhdGVnb3J5PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5DYXRlZ29yeTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q0FURUdPUlk8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNhdGVnb3J5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNvbnRlbnRTdGF0dXM8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNvbnRlbnRTdGF0dXM8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbnRlbnQgU3RhdHVzPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT05URU5UX1NUQVRVUzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29udGVudCBTdGF0dXM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb21tZW50czwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y29tbWVudHM8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNvbW1lbnRzPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT01NRU5UUzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tbWVudHM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Y29tcGFueTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y29tcGFueTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q29tcGFueTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q09NUEFOWTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+Q29tcGFueTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5rZXl3b3JkczwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+a2V5d29yZHM8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPktleXdvcmRzPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5LRVlXT1JEUzwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+S2V5d29yZHM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5Pm11bHRpPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5sYXN0QXV0aG9yPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5sYXN0QXV0aG9yPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5MYXN0IEF1dGhvcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TEFTVF9BVVRIT1I8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkxhc3QgQXV0aG9yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bWFuYWdlcjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+bWFuYWdlcjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TWFuYWdlcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+TUFOQUdFUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TWFuYWdlcjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPm5vdGVzPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5ub3RlczwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Tm90ZXM8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPk5PVEVTPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Ob3RlczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnByZXNlbnRhdGlvbkZvcm1hdDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+cHJlc2VudGF0aW9uRm9ybWF0PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5QcmVzZW50YXRpb24gRm9ybWF0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5QUkVTRU5UQVRJT05fRk9STUFUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5QcmVzZW50YXRpb24gRm9ybWF0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+cmV2aXNpb25OdW1iZXI8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnJldmlzaW9uTnVtYmVyPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5SZXZpc2lvbiBOdW1iZXI8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlJFVklTSU9OX05VTUJFUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+UmV2aXNpb24gTnVtYmVyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dGVtcGxhdGU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnRlbXBsYXRlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5UZW1wbGF0ZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+VEVNUExBVEU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRlbXBsYXRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dmVyc2lvbjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+dmVyc2lvbjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VmVyc2lvbjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+VkVSU0lPTjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+VmVyc2lvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jaGFyYWN0ZXJDb3VudDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y2hhcmFjdGVyQ291bnQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkNoYXJhY3RlciBDb3VudDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+Q0hBUkFDVEVSX0NPVU5UPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5DaGFyYWN0ZXIgQ291bnQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jaGFyYWN0ZXJDb3VudFdpdGhTcGFjZXM8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmNoYXJhY3RlckNvdW50V2l0aFNwYWNlczwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+Q2hhcmFjdGVyIENvdW50IFdpdGggU3BhY2VzPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DSEFSQUNURVJfQ09VTlRfV0lUSF9TUEFDRVM8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNoYXJhY3RlciBDb3VudCBXaXRoIFNwYWNlczwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPndvcmRDb3VudDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+d29yZENvdW50PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Xb3JkIENvdW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5XT1JEX0NPVU5UPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Xb3JkIENvdW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bGluZUNvdW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5saW5lQ291bnQ8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxpbmUgQ291bnQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkxJTkVfQ09VTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkxpbmUgQ291bnQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5pbnRlZ2VyPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5wYWdlQ291bnQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnBhZ2VDb3VudDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+UGFnZSBDb3VudDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+UEFHRV9DT1VOVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+UGFnZSBDb3VudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zbGlkZUNvdW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5zbGlkZUNvdW50PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5TbGlkZSBDb3VudDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+U0xJREVfQ09VTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlNsaWRlIENvdW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnBhcmFncmFwaENvdW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5wYXJhZ3JhcGhDb3VudDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+UGFyYWdyYXBoIENvdW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5QQVJBR1JBUEhfQ09VTlQ8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlBhcmFncmFwaCBDb3VudDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPmludGVnZXI8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dG90YWxUaW1lPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT50b3RhbFRpbWU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPlRvdGFsIFRpbWU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRPVEFMX1RJTUU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRvdGFsIFRpbWU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5lZGl0VGltZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+ZWRpdFRpbWU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkVkaXQgVGltZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+RURJVF9USU1FPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5FZGl0IFRpbWU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmNyZWF0aW9uRGF0ZTwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+Y3JlYXRpb25EYXRlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5DcmVhdGlvbiBEYXRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DUkVBVElPTl9EQVRFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5DcmVhdGlvbiBEYXRlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+ZGF0ZXRpbWU8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlEYXRlVGltZURlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5RGF0ZVRpbWVEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bGFzdFNhdmVEYXRlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5sYXN0U2F2ZURhdGU8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkxhc3QgU2F2ZSBEYXRlPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5MQVNUX1NBVkVfREFURTwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TGFzdCBTYXZlIERhdGU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5kYXRldGltZTwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eURhdGVUaW1lRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+bGFzdFByaW50ZWQ8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmxhc3RQcmludGVkPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5MYXN0IFByaW50ZWQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPkxBU1RfUFJJTlRFRDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+TGFzdCBQcmludGVkPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLTwvY21pc3JhOnR5cGU+Ci0KLTxjbWlzcmE6dHlwZSB4c2k6dHlwZT0iY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIj4KLSAgICA8aWQ+cGRmRG9jdW1lbnQ8L2lkPgotICAgIDxsb2NhbE5hbWU+cGRmRG9jdW1lbnQ8L2xvY2FsTmFtZT4KLSAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICA8cGFyZW50SWQ+b2ZmaWNlRG9jdW1lbnQ8L3BhcmVudElkPgotICAgIDxkaXNwbGF5TmFtZT5QREYgRG9jdW1lbnQ8L2Rpc3BsYXlOYW1lPgotICAgIDxxdWVyeU5hbWU+UERGX0RPQ1VNRU5UPC9xdWVyeU5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkRvY3VtZW50IG9mIHR5cGUgUERGPC9kZXNjcmlwdGlvbj4KLSAgICA8YmFzZUlkPmNtaXM6ZG9jdW1lbnQ8L2Jhc2VJZD4KLSAgICA8Y3JlYXRhYmxlPnRydWU8L2NyZWF0YWJsZT4KLSAgICA8ZmlsZWFibGU+dHJ1ZTwvZmlsZWFibGU+Ci0gICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgPGZ1bGx0ZXh0SW5kZXhlZD50cnVlPC9mdWxsdGV4dEluZGV4ZWQ+Ci0gICAgPGluY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeT50cnVlPC9pbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+Ci0gICAgPGNvbnRyb2xsYWJsZVBvbGljeT5mYWxzZTwvY29udHJvbGxhYmxlUG9saWN5PgotICAgIDxjb250cm9sbGFibGVBQ0w+dHJ1ZTwvY29udHJvbGxhYmxlQUNMPgotICAgIDx2ZXJzaW9uYWJsZT5mYWxzZTwvdmVyc2lvbmFibGU+Ci0gICAgPGNvbnRlbnRTdHJlYW1BbGxvd2VkPmFsbG93ZWQ8L2NvbnRlbnRTdHJlYW1BbGxvd2VkPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jcmVhdG9yPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jcmVhdG9yPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5DcmVhdG9yPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DUkVBVE9SPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5jcmVhdG9yIG9mIGRvY3VtZW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnRpdGxlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT50aXRsZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VGl0bGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRJVExFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaXRsZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5zdWJqZWN0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5zdWJqZWN0PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5TdWJqZWN0PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5TVUJKRUNUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5zdWJqZXQgb2YgbWVzc2FnZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD50cmFwcGVkPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT50cmFwcGVkPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5UcmFwcGVkPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5UUkFQUEVEPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj50cmFwcGVkPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLTwvY21pc3JhOnR5cGU+Ci0KLTxjbWlzcmE6dHlwZSB4c2k6dHlwZT0iY21pc1R5cGVEb2N1bWVudERlZmluaXRpb25UeXBlIj4KLSAgICA8aWQ+dmlkZW9GaWxlPC9pZD4KLSAgICA8bG9jYWxOYW1lPnZpZGVvRmlsZTwvbG9jYWxOYW1lPgotICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgIDxwYXJlbnRJZD5jbWlzOmRvY3VtZW50PC9wYXJlbnRJZD4KLSAgICA8ZGlzcGxheU5hbWU+VmlkZW8gRmlsZTwvZGlzcGxheU5hbWU+Ci0gICAgPHF1ZXJ5TmFtZT5WSURFT19GSUxFPC9xdWVyeU5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPlZpZGVvIE1vdmllczwvZGVzY3JpcHRpb24+Ci0gICAgPGJhc2VJZD5jbWlzOmRvY3VtZW50PC9iYXNlSWQ+Ci0gICAgPGNyZWF0YWJsZT50cnVlPC9jcmVhdGFibGU+Ci0gICAgPGZpbGVhYmxlPnRydWU8L2ZpbGVhYmxlPgotICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgIDxmdWxsdGV4dEluZGV4ZWQ+dHJ1ZTwvZnVsbHRleHRJbmRleGVkPgotICAgIDxpbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnk+dHJ1ZTwvaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5PgotICAgIDxjb250cm9sbGFibGVQb2xpY3k+ZmFsc2U8L2NvbnRyb2xsYWJsZVBvbGljeT4KLSAgICA8Y29udHJvbGxhYmxlQUNMPnRydWU8L2NvbnRyb2xsYWJsZUFDTD4KLSAgICA8dmVyc2lvbmFibGU+ZmFsc2U8L3ZlcnNpb25hYmxlPgotICAgIDxjb250ZW50U3RyZWFtQWxsb3dlZD5hbGxvd2VkPC9jb250ZW50U3RyZWFtQWxsb3dlZD4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YXJ0aXN0PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT4weDAxM2I8L2xvY2FsTmFtZT4KLSAgICAgICAgPGRpc3BsYXlOYW1lPkFydGlzdDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QVJUSVNUPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BcnRpc3Q8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT50cnVlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+dHJ1ZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+YWxidW08L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmFsYnVtPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5BbGJ1bTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+QUxCVU08L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPnRpdGxlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPnRpdGxlPC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT50aXRsZTwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+VGl0bGU8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPlRJVExFPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaXRsZTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsb2NhbE5hbWVzcGFjZT5hcGFjaGU8L2xvY2FsTmFtZXNwYWNlPgotICAgICAgICA8cHJvcGVydHlUeXBlPnN0cmluZzwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgICAgIDxpZD5jb21tZW50PC9pZD4KLSAgICAgICAgPGxvY2FsTmFtZT5jb21tZW50PC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5Db21tZW50PC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5DT01NRU5UPC9xdWVyeU5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Db21tZW50PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+Z2VucmU8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmdlbnJlPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5HZW5yZTwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+R0VOUkU8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkdlbnJlPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5sZW5ndGg8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPmxlbmd0aDwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+TGVuZ3RoPC9kaXNwbGF5TmFtZT4KLSAgICAgICAgPHF1ZXJ5TmFtZT5MRU5HVEg8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkxlbmd0aCBpbiBzZWNvbmRzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPmZhbHNlPC9xdWVyeWFibGU+Ci0gICAgICAgIDxvcmRlcmFibGU+ZmFsc2U8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+dHJhY2s8L2lkPgotICAgICAgICA8bG9jYWxOYW1lPnRyYWNrPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5UcmFjazwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+VFJBQ0s8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRyYWNrIGluIGFsYnVtPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5yZWFkd3JpdGU8L3VwZGF0YWJpbGl0eT4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICA8cXVlcnlhYmxlPnRydWU8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT50cnVlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlJbnRlZ2VyRGVmaW5pdGlvbj4KLSAgICA8cHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgICAgICA8aWQ+eWVhcjwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+eWVhcjwvbG9jYWxOYW1lPgotICAgICAgICA8ZGlzcGxheU5hbWU+WWVhcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+WUVBUjwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+cmVsZWFzZSBkYXRlIG9mIGFsYnVuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+c3RyaW5nPC9wcm9wZXJ0eVR5cGU+Ci0gICAgICAgIDxjYXJkaW5hbGl0eT5zaW5nbGU8L2NhcmRpbmFsaXR5PgotICAgICAgICA8dXBkYXRhYmlsaXR5PnJlYWR3cml0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+dHJ1ZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPnRydWU8L29yZGVyYWJsZT4KLSAgICAgICAgPG9wZW5DaG9pY2U+ZmFsc2U8L29wZW5DaG9pY2U+Ci0gICAgPC9wcm9wZXJ0eVN0cmluZ0RlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5U3RyaW5nRGVmaW5pdGlvbj4KLSAgICAgICAgPGlkPmRpc2NObzwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+ZGlzY05vPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5EaXNjIE51bWJlcjwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+RElTQ19OVU1CRVI8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPm51bWJlciBvZiBkaXNjIC8gdG90YWwgZGlzY3M8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8bG9jYWxOYW1lc3BhY2U+YXBhY2hlPC9sb2NhbE5hbWVzcGFjZT4KLSAgICAgICAgPHByb3BlcnR5VHlwZT5zdHJpbmc8L3Byb3BlcnR5VHlwZT4KLSAgICAgICAgPGNhcmRpbmFsaXR5PnNpbmdsZTwvY2FyZGluYWxpdHk+Ci0gICAgICAgIDx1cGRhdGFiaWxpdHk+cmVhZHdyaXRlPC91cGRhdGFiaWxpdHk+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPHJlcXVpcmVkPmZhbHNlPC9yZXF1aXJlZD4KLSAgICAgICAgPHF1ZXJ5YWJsZT5mYWxzZTwvcXVlcnlhYmxlPgotICAgICAgICA8b3JkZXJhYmxlPmZhbHNlPC9vcmRlcmFibGU+Ci0gICAgICAgIDxvcGVuQ2hvaWNlPmZhbHNlPC9vcGVuQ2hvaWNlPgotICAgIDwvcHJvcGVydHlTdHJpbmdEZWZpbml0aW9uPgotICAgIDxwcm9wZXJ0eUludGVnZXJEZWZpbml0aW9uPgotICAgICAgICA8aWQ+aW1hZ2VXaWR0aDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTAwPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5JbWFnZSBXaWR0aDwvZGlzcGxheU5hbWU+Ci0gICAgICAgIDxxdWVyeU5hbWU+SU1BR0VfV0lEVEg8L3F1ZXJ5TmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkltYWdlIFdpZHRoPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgPHByb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci0gICAgICAgIDxpZD5pbWFnZUhlaWdodDwvaWQ+Ci0gICAgICAgIDxsb2NhbE5hbWU+MHgwMTAxPC9sb2NhbE5hbWU+Ci0gICAgICAgIDxkaXNwbGF5TmFtZT5JbWFnZSBIZWlnaHQ8L2Rpc3BsYXlOYW1lPgotICAgICAgICA8cXVlcnlOYW1lPklNQUdFX0hFSUdIVDwvcXVlcnlOYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+SW1hZ2UgSGVpZ2h0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxvY2FsTmFtZXNwYWNlPmFwYWNoZTwvbG9jYWxOYW1lc3BhY2U+Ci0gICAgICAgIDxwcm9wZXJ0eVR5cGU+aW50ZWdlcjwvcHJvcGVydHlUeXBlPgotICAgICAgICA8Y2FyZGluYWxpdHk+c2luZ2xlPC9jYXJkaW5hbGl0eT4KLSAgICAgICAgPHVwZGF0YWJpbGl0eT5vbmNyZWF0ZTwvdXBkYXRhYmlsaXR5PgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDxxdWVyeWFibGU+ZmFsc2U8L3F1ZXJ5YWJsZT4KLSAgICAgICAgPG9yZGVyYWJsZT5mYWxzZTwvb3JkZXJhYmxlPgotICAgICAgICA8b3BlbkNob2ljZT5mYWxzZTwvb3BlbkNob2ljZT4KLSAgICA8L3Byb3BlcnR5SW50ZWdlckRlZmluaXRpb24+Ci08L2NtaXNyYTp0eXBlPgotCi08L2NoZW06dHlwZURlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc2NyaXB0cy9HZW5TcGVjRXhhbXBsZXMuYmF0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc2NyaXB0cy9HZW5TcGVjRXhhbXBsZXMuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDVkNTNmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvR2VuU3BlY0V4YW1wbGVzLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQGVjaG8gT0ZGDQotc2V0IEpBVkFfSE9NRT1EOlxKYXZhXGpkazEuNi4wXzIyLXg2NA0KLXNldCBQQVRIPSVKQVZBX0hPTUUlXGJpbjslUEFUSCUNCi1jYWxsIGNwLmJhdA0KLWphdmEgLWNwICVDUCUgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMuc3BlY2V4YW1wbGVzLk1haW4NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL2NwLmJhdCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvY3AuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjk2MzZkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvY3AuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotc2V0IFZFUj0wLjguMC1TTkFQU0hPVA0KLXNldCBNMl9SRVBPPWQ6XGphdmFcbWF2ZW4tcmVwb3NpdG9yeQ0KLXNldCBDUD10YXJnZXRcY2xhc3NlczteDQotJU0yX1JFUE8lL2phdmF4L2FjdGl2YXRpb24vYWN0aXZhdGlvbi8xLjEvYWN0aXZhdGlvbi0xLjEuamFyO14gDQotJU0yX1JFUE8lL2phdmF4L3htbC9iaW5kL2pheGItYXBpLzIuMS9qYXhiLWFwaS0yLjEuamFyO14gDQotJU0yX1JFUE8lL2phdmF4L3htbC93cy9qYXh3cy1hcGkvMi4xL2pheHdzLWFwaS0yLjEuamFyO14gDQotJU0yX1JFUE8lL2phdmF4L3htbC9zb2FwL3NhYWotYXBpLzEuMy9zYWFqLWFwaS0xLjMuamFyO14gDQotJU0yX1JFUE8lL2phdmF4L3htbC9zdHJlYW0vc3RheC1hcGkvMS4wL3N0YXgtYXBpLTEuMC5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2FwYWNoZS9qYW1lcy9hcGFjaGUtbWltZTRqLWNvcmUvMC43L2FwYWNoZS1taW1lNGotY29yZS0wLjcuamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvamFtZXMvYXBhY2hlLW1pbWU0ai1kb20vMC43L2FwYWNoZS1taW1lNGotZG9tLTAuNy5qYXI7XiANCi0lTTJfUkVQTyUvYXNtL2FzbS8zLjEvYXNtLTMuMS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2JvdW5jeWNhc3RsZS9iY21haWwtamRrMTUvMS40NS9iY21haWwtamRrMTUtMS40NS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2JvdW5jeWNhc3RsZS9iY3Byb3YtamRrMTUvMS40NS9iY3Byb3YtamRrMTUtMS40NS5qYXI7XiANCi0lTTJfUkVQTyUvZGUvbDNzL2JvaWxlcnBpcGUvYm9pbGVycGlwZS8xLjEuMC9ib2lsZXJwaXBlLTEuMS4wLmphcjteIA0KLSVNMl9SRVBPJS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS8lVkVSJS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWFwaS0lVkVSJS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy8lVkVSJS9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWJpbmRpbmdzLSVWRVIlLmphcjteIA0KLSVNMl9SRVBPJS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGwvJVZFUiUvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsLSVWRVIlLmphcjteIA0KLSVNMl9SRVBPJS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1hcGkvJVZFUiUvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtYXBpLSVWRVIlLmphcjteIA0KLSVNMl9SRVBPJS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsLyVWRVIlL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGwtJVZFUiUuamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvJVZFUiUvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC0lVkVSJS5qYXI7XiANCi0lTTJfUkVQTyUvY29tbW9ucy1jb2RlYy9jb21tb25zLWNvZGVjLzEuNS9jb21tb25zLWNvZGVjLTEuNS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2FwYWNoZS9jb21tb25zL2NvbW1vbnMtY29tcHJlc3MvMS4zL2NvbW1vbnMtY29tcHJlc3MtMS4zLmphcjteIA0KLSVNMl9SRVBPJS9jb21tb25zLWlvL2NvbW1vbnMtaW8vMi4wLjEvY29tbW9ucy1pby0yLjAuMS5qYXI7Xg0KLSVNMl9SRVBPJS9jb21tb25zLWxvZ2dpbmcvY29tbW9ucy1sb2dnaW5nLzEuMS4xL2NvbW1vbnMtbG9nZ2luZy0xLjEuMS5qYXI7XiANCi0lTTJfUkVQTyUvZG9tNGovZG9tNGovMS42LjEvZG9tNGotMS42LjEuamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvcGRmYm94L2ZvbnRib3gvMS42LjAvZm9udGJveC0xLjYuMC5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2FwYWNoZS9nZXJvbmltby9zcGVjcy9nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYy8xLjAuMS9nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYy0xLjAuMS5qYXI7XiANCi0lTTJfUkVQTyUvY29tL2dvb2dsZWNvZGUvbXA0cGFyc2VyL2lzb3BhcnNlci8xLjAtYmV0YS01L2lzb3BhcnNlci0xLjAtYmV0YS01LmphcjteIA0KLSVNMl9SRVBPJS9qYXZhc3Npc3QvamF2YXNzaXN0LzMuNi4wLkdBL2phdmFzc2lzdC0zLjYuMC5HQS5qYXI7Xg0KLSVNMl9SRVBPJS9jb20vc3VuL3htbC9iaW5kL2pheGItaW1wbC8yLjEuMTEvamF4Yi1pbXBsLTIuMS4xMS5qYXI7XiANCi0lTTJfUkVQTyUvY29tL3N1bi94bWwvd3MvamF4d3MtcnQvMi4xLjcvamF4d3MtcnQtMi4xLjcuamFyO14gDQotJU0yX1JFUE8lL2pkb20vamRvbS8xLjAvamRvbS0xLjAuamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvcGRmYm94L2plbXBib3gvMS42LjAvamVtcGJveC0xLjYuMC5qYXI7XiANCi0lTTJfUkVQTyUvbmV0L3NmL2pvcHQtc2ltcGxlL2pvcHQtc2ltcGxlLzMuMi9qb3B0LXNpbXBsZS0zLjIuamFyO14gDQotJU0yX1JFUE8lL2p1bml0L2p1bml0LzQuNy9qdW5pdC00LjcuamFyO14gDQotJU0yX1JFUE8lL2xvZzRqL2xvZzRqLzEuMi4xNi9sb2c0ai0xLjIuMTYuamFyO14NCi0lTTJfUkVQTyUvY29tL2RyZXdub2FrZXMvbWV0YWRhdGEtZXh0cmFjdG9yLzIuNC4wLWJldGEtMS9tZXRhZGF0YS1leHRyYWN0b3ItMi40LjAtYmV0YS0xLmphcjteIA0KLSVNMl9SRVBPJS9vcmcvanZuZXQvbWltZXB1bGwvMS4zL21pbWVwdWxsLTEuMy5qYXI7XiANCi0lTTJfUkVQTyUvZWR1L3VjYXIvbmV0Y2RmLzQuMi1taW4vbmV0Y2RmLTQuMi1taW4uamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvZmVsaXgvb3JnLm9zZ2kuY29yZS8xLjAuMC9vcmcub3NnaS5jb3JlLTEuMC4wLmphcjteDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvcGRmYm94L3BkZmJveC8xLjYuMC9wZGZib3gtMS42LjAuamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvcG9pL3BvaS8zLjgtYmV0YTUvcG9pLTMuOC1iZXRhNS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2FwYWNoZS9wb2kvcG9pLW9veG1sLzMuOC1iZXRhNS9wb2ktb294bWwtMy44LWJldGE1LmphcjteIA0KLSVNMl9SRVBPJS9vcmcvYXBhY2hlL3BvaS9wb2ktb294bWwtc2NoZW1hcy8zLjgtYmV0YTUvcG9pLW9veG1sLXNjaGVtYXMtMy44LWJldGE1LmphcjteDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvcG9pL3BvaS1zY3JhdGNocGFkLzMuOC1iZXRhNS9wb2ktc2NyYXRjaHBhZC0zLjgtYmV0YTUuamFyO14gDQotJU0yX1JFUE8lL2NvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvcmVzb2x2ZXIvMjAwNTA5MjcvcmVzb2x2ZXItMjAwNTA5MjcuamFyO14gDQotJU0yX1JFUE8lL3JvbWUvcm9tZS8wLjkvcm9tZS0wLjkuamFyO14gDQotJU0yX1JFUE8lL2NvbS9zdW4veG1sL21lc3NhZ2luZy9zYWFqL3NhYWotaW1wbC8xLjMuMy9zYWFqLWltcGwtMS4zLjMuamFyO14gDQotJU0yX1JFUE8lL25ldC9zZi9zY2Fubm90YXRpb24vc2Nhbm5vdGF0aW9uLzEuMC4yL3NjYW5ub3RhdGlvbi0xLjAuMi5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL3NsZjRqL3NsZjRqLWFwaS8xLjYuNC9zbGY0ai1hcGktMS42LjQuamFyO14gDQotJU0yX1JFUE8lL29yZy9zbGY0ai9zbGY0ai1sb2c0ajEyLzEuNi40L3NsZjRqLWxvZzRqMTItMS42LjQuamFyO14NCi0lTTJfUkVQTyUvc3RheC9zdGF4LWFwaS8xLjAuMS9zdGF4LWFwaS0xLjAuMS5qYXI7Xg0KLSVNMl9SRVBPJS9vcmcvanZuZXQvc3RheGV4L3N0YXgtZXgvMS4yL3N0YXgtZXgtMS4yLmphcjteIA0KLSVNMl9SRVBPJS9jb20vc3VuL3htbC9zdHJlYW0vYnVmZmVyL3N0cmVhbWJ1ZmZlci8wLjkvc3RyZWFtYnVmZmVyLTAuOS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2NjaWwvY293YW4vdGFnc291cC90YWdzb3VwLzEuMi4xL3RhZ3NvdXAtMS4yLjEuamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvdGlrYS90aWthLWNvcmUvMS4xL3Rpa2EtY29yZS0xLjEuamFyO14gDQotJU0yX1JFUE8lL29yZy9hcGFjaGUvdGlrYS90aWthLXBhcnNlcnMvMS4xL3Rpa2EtcGFyc2Vycy0xLjEuamFyO14gDQotJU0yX1JFUE8lL29yZy9nYWdyYXZhcnIvdm9yYmlzLWphdmEtY29yZS8wLjEvdm9yYmlzLWphdmEtY29yZS0wLjEtdGVzdHMuamFyO14NCi0lTTJfUkVQTyUvb3JnL2dhZ3JhdmFyci92b3JiaXMtamF2YS1jb3JlLzAuMS92b3JiaXMtamF2YS1jb3JlLTAuMS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2dhZ3JhdmFyci92b3JiaXMtamF2YS10aWthLzAuMS92b3JiaXMtamF2YS10aWthLTAuMS5qYXI7XiANCi0lTTJfUkVQTyUvb3JnL2NvZGVoYXVzL3dvb2RzdG94L3dzdHgtYXNsLzMuMi4zL3dzdHgtYXNsLTMuMi4zLmphcjteIA0KLSVNMl9SRVBPJS9vcmcvYXBhY2hlL3htbGJlYW5zL3htbGJlYW5zLzIuMy4wL3htbGJlYW5zLTIuMy4wLmphcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvcnVuQ3JlYXRlLmJhdCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvcnVuQ3JlYXRlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzNGZhMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL3J1bkNyZWF0ZS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1yZW0NCi1yZW0NCi1yZW0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLXJlbSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1yZW0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZW0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXJlbSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotcmVtICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1yZW0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLXJlbQ0KLXJlbSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLXJlbQ0KLXJlbSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotcmVtIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotcmVtICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLXJlbSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1yZW0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXJlbSB1bmRlciB0aGUgTGljZW5zZS4NCi1yZW0NCi1yZW0NCi1jYWxsIHJ1bmNtZC5iYXQgLS1Db21tYW5kPUNyZWF0ZURvY3VtZW50IC0tUmVwb3NpdG9yeUlkPUExIC0tQ29udGVudFNpemVJbktCPTI1DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc2NyaXB0cy9ydW5jbWQuYmF0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc2NyaXB0cy9ydW5jbWQuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2EzYzI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvcnVuY21kLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXJlbQ0KLXJlbQ0KLXJlbSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotcmVtIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLXJlbSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlbSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotcmVtIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1yZW0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXJlbSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotcmVtDQotcmVtICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotcmVtDQotcmVtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1yZW0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1yZW0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotcmVtIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXJlbSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotcmVtIHVuZGVyIHRoZSBMaWNlbnNlLg0KLXJlbQ0KLXJlbQ0KLXNldCBNMl9SRVBPPWQ6XGphdmFcbWF2ZW4tcmVwb3NpdG9yeQ0KLXNldCBKQVZBX0hPTUU9ZDpcSmF2YVxqZGsxLjYuMF8yMi14NjQNCi1zZXQgUEFUSD0lSkFWQV9IT01FJVxiaW4NCi1jYWxsIGNwLmJhdA0KLWphdmEgLURvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbm1lbW9yeS9hdG9tIF4NCi0tRG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1YiBeDQotLURvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPWplbnMgXg0KLS1Eb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9ZHVtbXkgXg0KLS1jcCAlQ1AlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1haW4uT2JqR2VuQXBwICUqDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc2NyaXB0cy9ydW5jbWQuc2ggYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL3J1bmNtZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyNzc0Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL3J1bmNtZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLQotaWYgWyAteiAiJEpBVkFfSE9NRSIgXTsgdGhlbgotICBqPSQod2hpY2ggamF2YSAyPi9kZXYvbnVsbCkKLSAgaWYgWyAteiAiJGoiIF07IHRoZW4KLSAJZWNobyAiVW5hYmxlIHRvIGxvY2F0ZSBKYXZhISIKLSAgICBleGl0IDEKLSAgZWxzZQotICAgIEpBVkE9IiRqIgotICBmaQotZWxzZQotICBKQVZBPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgotZmkKLQotCi0uIHRlc3R0b29sLmNsYXNzcGF0aC5zaAotCi1KQVZBX09QVFM9Ii1Eb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvaW5tZW1vcnkvYXRvbSBcCi0tRG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1YiBcCi0tRG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9amVucyBcCi0tRG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnBhc3N3b3JkPWR1bW15IgotCi1KQVZBX09QVFM9IiRKQVZBX09QVFMgLURqYXZhLm5ldC51c2VTeXN0ZW1Qcm94aWVzPXRydWUiCi0KLQotaWYgWyAtbiAiJGh0dHBfcHJveHkiIF07IHRoZW4KLSAgSFRUUF9QUk9YWV9IT1NUPSQoZWNobyAkaHR0cF9wcm94eSB8IHNlZCAncy9odHRwOlwvXC9cKC4qXCk6LiovXDEvJykKLSAgSFRUUF9QUk9YWV9QT1JUPSQoZWNobyAkaHR0cF9wcm94eSB8IHNlZCAncy9odHRwOlwvXC8uKjpcKC4qXCkvXDEvJykKLSAgSkFWQV9PUFRTPSIkSkFWQV9PUFRTIC1EaHR0cC5wcm94eUhvc3Q9JEhUVFBfUFJPWFlfSE9TVCAtRGh0dHAucHJveHlQb3J0PSRIVFRQX1BST1hZX1BPUlQiCi1maQotCi1pZiBbIC1uICIkaHR0cHNfcHJveHkiIF07IHRoZW4KLSAgSFRUUFNfUFJPWFlfSE9TVD0kKGVjaG8gJGh0dHBzX3Byb3h5IHwgc2VkICdzL2h0dHA6XC9cL1woLipcKTouKi9cMS8nKQotICBIVFRQU19QUk9YWV9QT1JUPSQoZWNobyAkaHR0cHNfcHJveHkgfCBzZWQgJ3MvaHR0cDpcL1wvLio6XCguKlwpL1wxLycpCi0gIEpBVkFfT1BUUz0iJEpBVkFfT1BUUyAtRGh0dHBzLnByb3h5SG9zdD0kSFRUUFNfUFJPWFlfSE9TVCAtRGh0dHBzLnByb3h5UG9ydD0kSFRUUFNfUFJPWFlfUE9SVCIKLWZpCi0KLWVjaG8gJENQCi1leGVjICRKQVZBICRKQVZBX09QVFMgLWNsYXNzcGF0aCAkQ1Agb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFpbi5PYmpHZW5BcHAgJCoKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvcnVuZmlsbC5iYXQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL3J1bmZpbGwuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTc4YWFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvcnVuZmlsbC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1yZW0NCi1yZW0NCi1yZW0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLXJlbSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1yZW0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZW0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXJlbSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotcmVtICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1yZW0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLXJlbQ0KLXJlbSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLXJlbQ0KLXJlbSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotcmVtIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotcmVtICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLXJlbSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1yZW0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXJlbSB1bmRlciB0aGUgTGljZW5zZS4NCi1yZW0NCi1yZW0NCi1jYWxsIHJ1bmNtZC5iYXQgLS1Db21tYW5kPUZpbGxSZXBvc2l0b3J5IC0tUmVwb3NpdG9yeUlkPUExIC0tRGVwdGg9MSAtLURvY3NQZXJGb2xkZXI9MSBeDQotLS1Gb2xkZXJzUGVyRm9sZGVyPTAgIC0tQ29udGVudFNpemVJbktCPTI1DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc2NyaXB0cy90ZXN0dG9vbC5jbGFzc3BhdGguc2ggYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL3Rlc3R0b29sLmNsYXNzcGF0aC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyNzNjMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL3Rlc3R0b29sLmNsYXNzcGF0aC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLVZFUj0wLjguMC1TTkFQU0hPVAotTTJfUkVQTz1+Ly5tMi9yZXBvc2l0b3J5Ci1DUD0idGFyZ2V0L2NsYXNzZXM6XAotJE0yX1JFUE8vamF2YXgvYWN0aXZhdGlvbi9hY3RpdmF0aW9uLzEuMS9hY3RpdmF0aW9uLTEuMS5qYXI6XAotJE0yX1JFUE8vamF2YXgveG1sL2JpbmQvamF4Yi1hcGkvMi4xL2pheGItYXBpLTIuMS5qYXI6XAotJE0yX1JFUE8vamF2YXgveG1sL3dzL2pheHdzLWFwaS8yLjEvamF4d3MtYXBpLTIuMS5qYXI6XAotJE0yX1JFUE8vamF2YXgveG1sL3NvYXAvc2Fhai1hcGkvMS4zL3NhYWotYXBpLTEuMy5qYXI6XAotJE0yX1JFUE8vamF2YXgveG1sL3N0cmVhbS9zdGF4LWFwaS8xLjAvc3RheC1hcGktMS4wLmphcjpcCi0kTTJfUkVQTy9vcmcvYXBhY2hlL2phbWVzL2FwYWNoZS1taW1lNGotY29yZS8wLjcvYXBhY2hlLW1pbWU0ai1jb3JlLTAuNy5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS9qYW1lcy9hcGFjaGUtbWltZTRqLWRvbS8wLjcvYXBhY2hlLW1pbWU0ai1kb20tMC43LmphcjpcCi0kTTJfUkVQTy9hc20vYXNtLzMuMS9hc20tMy4xLmphcjpcCi0kTTJfUkVQTy9vcmcvYm91bmN5Y2FzdGxlL2JjbWFpbC1qZGsxNS8xLjQ1L2JjbWFpbC1qZGsxNS0xLjQ1LmphcjpcCi0kTTJfUkVQTy9vcmcvYm91bmN5Y2FzdGxlL2JjcHJvdi1qZGsxNS8xLjQ1L2JjcHJvdi1qZGsxNS0xLjQ1LmphcjpcCi0kTTJfUkVQTy9kZS9sM3MvYm9pbGVycGlwZS9ib2lsZXJwaXBlLzEuMS4wL2JvaWxlcnBpcGUtMS4xLjAuamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpLyRWRVIvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1hcGktJFZFUi5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5ncy8kVkVSL2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3MtJFZFUi5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsLyRWRVIvY2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsLSRWRVIuamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS8kVkVSL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaS0kVkVSLmphcjpcCi0kTTJfUkVQTy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jaGVtaXN0cnktb3BlbmNtaXMtY29tbW9ucy1pbXBsLyRWRVIvY2hlbWlzdHJ5LW9wZW5jbWlzLWNvbW1vbnMtaW1wbC0kVkVSLmphcjpcCi0kTTJfUkVQTy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsLyRWRVIvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC0kVkVSLmphcjpcCi0kTTJfUkVQTy9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy8kVkVSL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzLSRWRVIuamFyOlwKLSRNMl9SRVBPL2NvbW1vbnMtY29kZWMvY29tbW9ucy1jb2RlYy8xLjUvY29tbW9ucy1jb2RlYy0xLjUuamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUvY29tbW9ucy9jb21tb25zLWNvbXByZXNzLzEuNC4xL2NvbW1vbnMtY29tcHJlc3MtMS40LjEuamFyOlwKLSRNMl9SRVBPL2NvbW1vbnMtaW8vY29tbW9ucy1pby8yLjAuMS9jb21tb25zLWlvLTIuMC4xLmphcjpcCi0kTTJfUkVQTy9jb21tb25zLWxvZ2dpbmcvY29tbW9ucy1sb2dnaW5nLzEuMS4xL2NvbW1vbnMtbG9nZ2luZy0xLjEuMS5qYXI6XAotJE0yX1JFUE8vZG9tNGovZG9tNGovMS42LjEvZG9tNGotMS42LjEuamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUvcGRmYm94L2ZvbnRib3gvMS43LjAvZm9udGJveC0xLjcuMC5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS9nZXJvbmltby9zcGVjcy9nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYy8xLjAuMS9nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYy0xLjAuMS5qYXI6XAotJE0yX1JFUE8vY29tL2dvb2dsZWNvZGUvbXA0cGFyc2VyL2lzb3BhcnNlci8xLjAtUkMtMS9pc29wYXJzZXItMS4wLVJDLTEuamFyOlwKLSRNMl9SRVBPL2phdmFzc2lzdC9qYXZhc3Npc3QvMy42LjAuR0EvamF2YXNzaXN0LTMuNi4wLkdBLmphcjpcCi0kTTJfUkVQTy9jb20vc3VuL3htbC9iaW5kL2pheGItaW1wbC8yLjEuMTEvamF4Yi1pbXBsLTIuMS4xMS5qYXI6XAotJE0yX1JFUE8vY29tL3N1bi94bWwvd3MvamF4d3MtcnQvMi4xLjcvamF4d3MtcnQtMi4xLjcuamFyOlwKLSRNMl9SRVBPL2pkb20vamRvbS8xLjAvamRvbS0xLjAuamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUvcGRmYm94L2plbXBib3gvMS43LjAvamVtcGJveC0xLjcuMC5qYXI6XAotJE0yX1JFUE8vbmV0L3NmL2pvcHQtc2ltcGxlL2pvcHQtc2ltcGxlLzMuMi9qb3B0LXNpbXBsZS0zLjIuamFyOlwKLSRNMl9SRVBPL2p1bml0L2p1bml0LzQuNy9qdW5pdC00LjcuamFyOlwKLSRNMl9SRVBPL2xvZzRqL2xvZzRqLzEuMi4xNi9sb2c0ai0xLjIuMTYuamFyOlwKLSRNMl9SRVBPL2NvbS9kcmV3bm9ha2VzL21ldGFkYXRhLWV4dHJhY3Rvci8yLjQuMC1iZXRhLTEvbWV0YWRhdGEtZXh0cmFjdG9yLTIuNC4wLWJldGEtMS5qYXI6XAotJE0yX1JFUE8vb3JnL2p2bmV0L21pbWVwdWxsLzEuMy9taW1lcHVsbC0xLjMuamFyOlwKLSRNMl9SRVBPL2VkdS91Y2FyL25ldGNkZi80LjItbWluL25ldGNkZi00LjItbWluLmphcjpcCi0kTTJfUkVQTy9vcmcvYXBhY2hlL2ZlbGl4L29yZy5vc2dpLmNvcmUvMS4wLjAvb3JnLm9zZ2kuY29yZS0xLjAuMC5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS9wZGZib3gvcGRmYm94LzEuNy4wL3BkZmJveC0xLjcuMC5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS9wb2kvcG9pLzMuOC9wb2ktMy44LmphcjpcCi0kTTJfUkVQTy9vcmcvYXBhY2hlL3BvaS9wb2ktb294bWwvMy44L3BvaS1vb3htbC0zLjguamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUvcG9pL3BvaS1vb3htbC1zY2hlbWFzLzMuOC9wb2ktb294bWwtc2NoZW1hcy0zLjguamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUvcG9pL3BvaS1zY3JhdGNocGFkLzMuOC9wb2ktc2NyYXRjaHBhZC0zLjguamFyOlwKLSRNMl9SRVBPL2NvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvcmVzb2x2ZXIvMjAwNTA5MjcvcmVzb2x2ZXItMjAwNTA5MjcuamFyOlwKLSRNMl9SRVBPL3JvbWUvcm9tZS8wLjkvcm9tZS0wLjkuamFyOlwKLSRNMl9SRVBPL2NvbS9zdW4veG1sL21lc3NhZ2luZy9zYWFqL3NhYWotaW1wbC8xLjMuMy9zYWFqLWltcGwtMS4zLjMuamFyOlwKLSRNMl9SRVBPL25ldC9zZi9zY2Fubm90YXRpb24vc2Nhbm5vdGF0aW9uLzEuMC4yL3NjYW5ub3RhdGlvbi0xLjAuMi5qYXI6XAotJE0yX1JFUE8vb3JnL3NsZjRqL3NsZjRqLWFwaS8xLjYuNi9zbGY0ai1hcGktMS42LjYuamFyOlwKLSRNMl9SRVBPL29yZy9zbGY0ai9zbGY0ai1sb2c0ajEyLzEuNi42L3NsZjRqLWxvZzRqMTItMS42LjYuamFyOlwKLSRNMl9SRVBPL3N0YXgvc3RheC1hcGkvMS4wLjEvc3RheC1hcGktMS4wLjEuamFyOlwKLSRNMl9SRVBPL29yZy9qdm5ldC9zdGF4ZXgvc3RheC1leC8xLjIvc3RheC1leC0xLjIuamFyOlwKLSRNMl9SRVBPL2NvbS9zdW4veG1sL3N0cmVhbS9idWZmZXIvc3RyZWFtYnVmZmVyLzAuOS9zdHJlYW1idWZmZXItMC45LmphcjpcCi0kTTJfUkVQTy9vcmcvY2NpbC9jb3dhbi90YWdzb3VwL3RhZ3NvdXAvMS4yLjEvdGFnc291cC0xLjIuMS5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS90aWthL3Rpa2EtY29yZS8xLjIvdGlrYS1jb3JlLTEuMi5qYXI6XAotJE0yX1JFUE8vb3JnL2FwYWNoZS90aWthL3Rpa2EtcGFyc2Vycy8xLjIvdGlrYS1wYXJzZXJzLTEuMi5qYXI6XAotJE0yX1JFUE8vb3JnL2dhZ3JhdmFyci92b3JiaXMtamF2YS1jb3JlLzAuMS92b3JiaXMtamF2YS1jb3JlLTAuMS10ZXN0cy5qYXI6XAotJE0yX1JFUE8vb3JnL2FzcGVjdGovYXNwZWN0anJ0LzEuNi4xMS9hc3BlY3RqcnQtMS42LjExLmphcjpcCi0kTTJfUkVQTy9vcmcvZ2FncmF2YXJyL3ZvcmJpcy1qYXZhLWNvcmUvMC4xL3ZvcmJpcy1qYXZhLWNvcmUtMC4xLmphcjpcCi0kTTJfUkVQTy9vcmcvZ2FncmF2YXJyL3ZvcmJpcy1qYXZhLXRpa2EvMC4xL3ZvcmJpcy1qYXZhLXRpa2EtMC4xLmphcjpcCi0kTTJfUkVQTy9vcmcvY29kZWhhdXMvd29vZHN0b3gvd3N0eC1hc2wvMy4yLjMvd3N0eC1hc2wtMy4yLjMuamFyOlwKLSRNMl9SRVBPL29yZy9hcGFjaGUveG1sYmVhbnMveG1sYmVhbnMvMi4zLjAveG1sYmVhbnMtMi4zLjAuamFyOlwKLSRNMl9SRVBPL29yZy90dWthYW5pL3h6LzEuMC94ei0xLjAuamFyIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvdXBsb2FkbWVkaWEuc2ggYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zY3JpcHRzL3VwbG9hZG1lZGlhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTdlODY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NjcmlwdHMvdXBsb2FkbWVkaWEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotLiBydW5jbWQuc2ggLS1Db21tYW5kPUNvcHlGaWxlcyAtLVJlcG9zaXRvcnlJZD1BMSAtLURpciB+L215bWVkaWEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL2ZpbGVjb3B5L0ZpbGVDb3BpZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvZmlsZWNvcHkvRmlsZUNvcGllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTlmNWY5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvZmlsZWNvcHkvRmlsZUNvcGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5maWxlY29weTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLlNlc3Npb25GYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1hcHBlci5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyLk1hcHBlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5tYXBwZXIuUHJvcGVydHlNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyLk1ldGFkYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLnBhcnNlci5NZXRhZGF0YVBhcnNlclRpa2E7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aWthLlRpa2E7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEZpbGVDb3BpZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbGVDb3BpZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAvLyBpbml0aWFsaXplIGNvbmZpZ3VyYXRvciB0byBnZXQgcGFyc2VycyBhbmQgcHJvcGVydHkgbWFwcGluZ3MKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWd1cmF0b3IgQ0ZHID0gQ29uZmlndXJhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHRvdGFsTnVtID0gMDsKLQotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOwotCi0gICAgcHVibGljIEZpbGVDb3BpZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0aW5nIHRvIGEgcmVwb3NpdG9yeSAuLi4iKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBTZXNzaW9uRmFjdG9yeSBhbmQgc2V0IHVwIHRoZSBTZXNzaW9uUGFyYW1ldGVyIG1hcAotICAgICAgICBTZXNzaW9uRmFjdG9yeSBzZXNzaW9uRmFjdG9yeSA9IFNlc3Npb25GYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgIHNlc3Npb24gPSBzZXNzaW9uRmFjdG9yeS5jcmVhdGVTZXNzaW9uKHBhcmFtZXRlcnMpOwotCi0gICAgICAgIExPRy5kZWJ1ZygiR290IGEgY29ubmVjdGlvbiB0byByZXBvc2l0b3J5LiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlSZWN1cnNpdmUoU3RyaW5nIGZvbGRlck5hbWUsIFN0cmluZyBmb2xkZXJJZCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGVPckRpciA9IG5ldyBGaWxlKGZvbGRlck5hbWUpOwotICAgICAgICAgICAgaWYgKGZpbGVPckRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0ZvbGRlcklkID0gY3JlYXRlRm9sZGVySW5SZXBvc2l0b3J5KGZpbGVPckRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZm9sZGVySWQpOwotICAgICAgICAgICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGZpbGVPckRpci5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZS5nZXROYW1lKCkuZXF1YWxzKCIuIikgJiYgIWZpbGUuZ2V0TmFtZSgpLmVxdWFscygiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29weVJlY3Vyc2l2ZShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXdGb2xkZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvcHlGaWxlVG9SZXBvc2l0b3J5KGZpbGVPckRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgZm9sZGVySWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb3B5RmlsZVRvUmVwb3NpdG9yeShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBmb2xkZXJJZCkgewotICAgICAgICBMT0cuZGVidWcoInVwbG9hZGluZyBmaWxlICIgKyBmaWxlTmFtZSk7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBGb2xkZXIgcGFyZW50Rm9sZGVyOwotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotCi0gICAgICAgIGlmIChudWxsID09IGZvbGRlcklkKSB7Ci0gICAgICAgICAgICBwYXJlbnRGb2xkZXIgPSBzZXNzaW9uLmdldFJvb3RGb2xkZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmVudEZvbGRlciA9IChGb2xkZXIpIHNlc3Npb24uZ2V0T2JqZWN0KGZvbGRlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0gICAgICAgICAgICBUaWthIHRpa2EgPSBuZXcgVGlrYSgpOwotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gdGlrYS5kZXRlY3QoZik7Ci0gICAgICAgICAgICBMT0cuaW5mbygiRGV0ZWN0ZWQgTUlNRSB0eXBlOiAiICsgbWltZVR5cGUpOwotCi0gICAgICAgICAgICAvLyBleHRyYWN0IG1ldGFkYXRhOiBmaXJzdCBnZXQgYSBwYXJzZXIKLSAgICAgICAgICAgIE1ldGFkYXRhUGFyc2VyIHBhcnNlciA9IENGRy5nZXRQYXJzZXIobWltZVR5cGUpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gcGFyc2VyKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgZi5nZXROYW1lKCkucmVwbGFjZUFsbCgiICIsICJfIikpOwotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBDRkcuZ2V0RGVmYXVsdERvY3VtZW50VHlwZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyLnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlNYXBwZXIgbWFwcGVyID0gQ0ZHLmdldFByb3BlcnR5TWFwcGVyKG1pbWVUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBtYXBwZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiVW5rbm93biBtaW1lIHR5cGUgKG5vIGNvbmZpZ3VyYXRpb24pOiAiICsgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZUlkID0gbWFwcGVyLmdldE1hcHBlZFR5cGVJZCgpOwotICAgICAgICAgICAgICAgIGlmIChudWxsID09IHR5cGVJZCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJObyBDTUlTIHR5cGUgY29uZmlndXJlZCBmb3IgbWltZSB0eXBlIiArIG1pbWVUeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdGQgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKHR5cGVJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gdGQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiQ01JUyB0eXBlICIgKyB0eXBlSWQgKyAiIGRvZXMgbm90IGV4aXN0IG9uIHNlcnZlci4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBMT0cuaW5mbygiRGV0ZWN0ZWQgTUlNRSB0eXBlOiAiICsgbWltZVR5cGUgKyAiIGlzIG1hcHBlZCB0byBDTUlTIHR5cGUgaWQ6ICIgKyB0ZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBwYXJzZXIuZXh0cmFjdE1ldGFkYXRhKGYsIHRkLCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gcGFyc2VyLmdldENtaXNQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFuIG92ZXJyaWRkZW4gY29udGVudCB0eXBlIGNvbmZpZ3VyZWQKLSAgICAgICAgICAgIGludCBwb3NMYXN0RG90ID0gZi5nZXROYW1lKCkuaW5kZXhPZignLicpOwotICAgICAgICAgICAgU3RyaW5nIGV4dCA9IHBvc0xhc3REb3QgPCAwID8gbnVsbCA6IGYuZ2V0TmFtZSgpLnN1YnN0cmluZyhwb3NMYXN0RG90ICsgMSwgZi5nZXROYW1lKCkubGVuZ3RoKCkpOwotICAgICAgICAgICAgU3RyaW5nIG92ZXJyaWRkZW4gPSBudWxsOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gZXh0ICYmIChvdmVycmlkZGVuID0gQ0ZHLmdldENvbnRlbnRUeXBlKGV4dCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtaW1lVHlwZSA9IG92ZXJyaWRkZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb25nIGxlbmd0aCA9IGYubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IHNlc3Npb24uZ2V0T2JqZWN0RmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb250ZW50U3RyZWFtKGZpbGVOYW1lLCBsZW5ndGgsIG1pbWVUeXBlLCBpcyk7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnRpZXMuY29udGFpbnNLZXkoUHJvcGVydHlJZHMuTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBmLmdldE5hbWUoKS5yZXBsYWNlQWxsKCIgIiwgIl8iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0cuZGVidWcoInVwbG9hZGluZyBkb2N1bWVudCB3aXRoIGNvbnRlbnQgbGVudGg6ICIgKyBjb250ZW50U3RyZWFtLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IHBhcmVudEZvbGRlci5jcmVhdGVEb2N1bWVudChwcm9wZXJ0aWVzLCBjb250ZW50U3RyZWFtLCBWZXJzaW9uaW5nU3RhdGUuTk9ORSk7Ci0gICAgICAgICAgICBpcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBpZCA9IGRvYy5nZXRJZCgpOwotICAgICAgICAgICAgTE9HLmluZm8oIk5ldyBkb2N1bWVudCBjcmVhdGVkIHdpdGggaWQ6ICIgKyBpZCArICIsIG5hbWU6ICIgKyBwcm9wZXJ0aWVzLmdldChQcm9wZXJ0eUlkcy5OQU1FKQotICAgICAgICAgICAgICAgICAgICArICIgaW4gZm9sZGVyOiAiICsgcGFyZW50Rm9sZGVyLmdldElkKCkpOwotICAgICAgICAgICAgTE9HLmRlYnVnKCJ0b3RhbCBudW1iZXIgb2YgY3JlYXRpb25zIDogIiArICsrdG90YWxOdW0pOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgQ01JUyBkb2N1bWVudC4iLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIENNSVMgZG9jdW1lbnQuIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBpcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0cuZGVidWcoIkNvbnZlcnNpb24gYW5kIHRyYW5zZmVyIGRvbmUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUZvbGRlckluUmVwb3NpdG9yeShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBwYXJlbnRGb2xkZXJJZCkgewotICAgICAgICBGb2xkZXIgcGFyZW50Rm9sZGVyOwotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICBpZiAobnVsbCA9PSBwYXJlbnRGb2xkZXJJZCkgewotICAgICAgICAgICAgcGFyZW50Rm9sZGVyID0gc2Vzc2lvbi5nZXRSb290Rm9sZGVyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJlbnRGb2xkZXIgPSAoRm9sZGVyKSBzZXNzaW9uLmdldE9iamVjdChwYXJlbnRGb2xkZXJJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgZi5nZXROYW1lKCkucmVwbGFjZUFsbCgiICIsICJfIikpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgQ0ZHLmdldERlZmF1bHRGb2xkZXJUeXBlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRm9sZGVyIGZvbGRlciA9IHBhcmVudEZvbGRlci5jcmVhdGVGb2xkZXIocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBpZCA9IGZvbGRlci5nZXRJZCgpOwotICAgICAgICAgICAgTE9HLmRlYnVnKCJOZXcgZm9sZGVyIGNyZWF0ZWQgd2l0aCBpZDogIiArIGZvbGRlci5nZXRJZCgpICsgIiwgcGF0aDogIiArIGZvbGRlci5nZXRQYXRocygpLmdldCgwKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgQ01JUyBkb2N1bWVudC4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICBMT0cuaW5mbygiTmV3IGZvbGRlciBjcmVhdGVkIHdpdGggaWQ6ICIgKyBpZCArICIsIG5hbWU6ICIgKyBwcm9wZXJ0aWVzLmdldChQcm9wZXJ0eUlkcy5OQU1FKQotICAgICAgICAgICAgICAgICsgIiBpbiBwYXJlbnQgZm9sZGVyOiAiICsgcGFyZW50Rm9sZGVyLmdldElkKCkpOwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlzdE1ldGFkYXRhKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotICAgICAgICAgICAgVGlrYSB0aWthID0gbmV3IFRpa2EoKTsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHRpa2EuZGV0ZWN0KGYpOwotICAgICAgICAgICAgTE9HLmluZm8oIkRldGVjdGVkIE1JTUUgdHlwZTogIiArIG1pbWVUeXBlKTsKLQotICAgICAgICAgICAgLy8gZXh0cmFjdCBtZXRhZGF0YTogZmlyc3QgZ2V0IGEgcGFyc2VyCi0gICAgICAgICAgICBNZXRhZGF0YVBhcnNlciBwYXJzZXIgPSBDRkcuZ2V0UGFyc2VyKG1pbWVUeXBlKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHBhcnNlcikgewotICAgICAgICAgICAgICAgIExPRy53YXJuKCJVbmtub3duIGNvbnRlbnQgdHlwZSAiICsgbWltZVR5cGUgKyAiIG5vIG1ldGFkYXRhIGZvdW5kLCBsaXN0aW5nIGFsbCB0YWdzIGZvdW5kIGluIGZpbGUuIik7Ci0gICAgICAgICAgICAgICAgTWV0YWRhdGFQYXJzZXJUaWthIG1wdCA9IG5ldyBNZXRhZGF0YVBhcnNlclRpa2EoKTsKLSAgICAgICAgICAgICAgICBtcHQubGlzdE1ldGFkYXRhKGYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eU1hcHBlciBtYXBwZXIgPSBDRkcuZ2V0UHJvcGVydHlNYXBwZXIobWltZVR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChudWxsID09IG1hcHBlcikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJVbmtub3duIG1pbWUgdHlwZSAobm8gY29uZmlndXJhdGlvbik6ICIgKyBtaW1lVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlSWQgPSBtYXBwZXIuZ2V0TWFwcGVkVHlwZUlkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gdHlwZUlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIk5vIENNSVMgdHlwZSBjb25maWd1cmVkIGZvciBtaW1lIHR5cGUiICsgbWltZVR5cGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNlc3Npb24gYXZhaWxhYmxlPyBpZiB5ZXMgZG8gY29udmVyc2lvbgotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHRkID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBzZXNzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRkID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbih0eXBlSWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB0ZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiQ01JUyB0eXBlICIgKyB0eXBlSWQgKyAiIGRvZXMgbm90IGV4aXN0IG9uIHNlcnZlci4iKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5pbmZvKCJEZXRlY3RlZCBNSU1FIHR5cGU6ICIgKyBtaW1lVHlwZSArICIgaXMgbWFwcGVkIHRvIENNSVMgdHlwZSBpZDogIiArIHRkLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGFyc2VyLmV4dHJhY3RNZXRhZGF0YShmLCB0ZCwgc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gcGFyc2VyLmdldENtaXNQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcHJvcGVydGllcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5pbmZvKCJGb3VuZCBtZXRhZGF0YSB0YWcgIiArIGVudHJ5LmdldEtleSgpICsgIm1hcHBlZCB0byAiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBsaXN0IG1ldGFkYXRhIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HLmRlYnVnKCJDb252ZXJzaW9uIGFuZCB0cmFuc2ZlciBkb25lLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gYXJnc1swXTsKLSAgICAgICAgTE9HLmRlYnVnKCJleHRyYWN0aW5nIENNSVMgcHJvcGVydGllcyBmb3IgZmlsZSAiICsgZmlsZU5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IEZpbGVDb3BpZXIoKS5saXN0TWV0YWRhdGEoZmlsZU5hbWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HLmRlYnVnKCJFeHRyYWN0aW9uIGRvbmUuIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYWluL09iakdlbkFwcC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYWluL09iakdlbkFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZjZDJjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvbWFpbi9PYmpHZW5BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFpbjsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgam9wdHNpbXBsZS5PcHRpb25QYXJzZXI7DQotaW1wb3J0IGpvcHRzaW1wbGUuT3B0aW9uU2V0Ow0KLWltcG9ydCBqb3B0c2ltcGxlLk9wdGlvblNwZWM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5DbWlzQmluZGluZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuUmVwb3NpdG9yeVNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLmZpbGVjb3B5LkZpbGVDb3BpZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwucmVwb3NpdG9yeS5NdWx0aVRocmVhZGVkT2JqZWN0R2VuZXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLnJlcG9zaXRvcnkuT2JqZWN0R2VuZXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLnJlcG9zaXRvcnkuT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLnJlcG9zaXRvcnkuVGltZUxvZ2dlcjsNCi0NCi1wdWJsaWMgY2xhc3MgT2JqR2VuQXBwIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRlNJWkUgPSA2NCAqIDEwMjQ7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1VTRVIgPSBTZXNzaW9uUGFyYW1ldGVyLlVTRVI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BBU1NXT1JEID0gU2Vzc2lvblBhcmFtZXRlci5QQVNTV09SRDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUiA9ICJ1c2VyIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFTU1dPUkQgPSAiZHVtbXkiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BVE9NUFVCX1VSTCA9IFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkw7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dTX1VSTCA9ICJvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLnVybCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0JST1dTRVJfVVJMID0gU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX1VSTDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQklORElORyA9IFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DVVNUT00gPSAib3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5oZWFkZXIuIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQVRPTVBVQl9VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2lubWVtb3J5L2F0b20iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XU19VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2lubWVtb3J5L3NlcnZpY2VzLyI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JST1dTRVJfQklORElOR19VUkwgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2lubWVtb3J5L2Jyb3dzZXIvIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQklORElORyA9ICJhdG9tcHViIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENNRCA9ICJDb21tYW5kIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfSUQgPSAiUmVwb3NpdG9yeUlkIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTExFUl9ET0NVTUVOVF9UWVBFX0lEID0gIkRvY3VtZW50VHlwZUlkIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTExFUl9GT0xERVJfVFlQRV9JRCA9ICJGb2xkZXJUeXBlSWQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMTEVSX0RPQ1NfUEVSX0ZPTERFUiA9ICJEb2NzUGVyRm9sZGVyIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTExFUl9GT0xERVJTX1BFUl9GT0xERVIgPSAiRm9sZGVyc1BlckZvbGRlciI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxMRVJfREVQVEggPSAiRGVwdGgiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMTEVSX0NPTlRFTlRfU0laRSA9ICJDb250ZW50U2l6ZUluS0IiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlQgPSAiQ291bnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUCA9ICJDbGVhbnVwIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RGT0xERVIgPSAiUm9vdEZvbGRlciI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJFQURTID0gIlRocmVhZHMiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9LSU5EID0gIkNvbnRlbnRLaW5kIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRV9QQVRURVJOID0gIkZpbGVOYW1lIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0ZJTEUgPSAiRmlsZSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9ESVIgPSAiRGlyIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfQVRPTSA9ICJhdG9tcHViIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfV1MgPSAid2Vic2VydmljZXMiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19CUk9XU0VSID0gImJyb3dzZXIiOw0KLQ0KLSAgICBwcml2YXRlIEJpbmRpbmdUeXBlIGJpbmRpbmdUeXBlOw0KLSAgICBwcml2YXRlIENvbnRlbnRLaW5kIGNvbnRlbnRLaW5kOw0KLSAgICBwcml2YXRlIENtaXNCaW5kaW5nIGJpbmRpbmc7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNtZDsNCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIGRlcHRoOw0KLSAgICBwcml2YXRlIEludGVnZXIgY29udGVudFNpemU7DQotICAgIHByaXZhdGUgSW50ZWdlciBmb2xkZXJQZXJGb2xkZXI7DQotICAgIHByaXZhdGUgSW50ZWdlciBkb2NzUGVyRm9sZGVyOw0KLSAgICBwcml2YXRlIFN0cmluZyBmb2xkZXJUeXBlOw0KLSAgICBwcml2YXRlIFN0cmluZyBkb2NUeXBlOw0KLSAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5SWQ7DQotICAgIHByaXZhdGUgSW50ZWdlciBjb3VudDsNCi0gICAgcHJpdmF0ZSBCb29sZWFuIGNsZWFudXA7DQotICAgIHByaXZhdGUgU3RyaW5nIHJvb3RGb2xkZXI7DQotICAgIHByaXZhdGUgSW50ZWdlciB0aHJlYWRzOw0KLSAgICBwcml2YXRlIFN0cmluZyBjb250ZW50S2luZFN0cjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWVQYXR0ZXJuOw0KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbERpcjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxGaWxlOyAgIA0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotDQotICAgICAgICBPYmpHZW5BcHAgYXBwID0gbmV3IE9iakdlbkFwcCgpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBhcHAucHJvY2Vzc0NtZExpbmUoYXJncyk7DQotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBjZSkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IENvdWxkIG5vdCBwcm9jZXNzIGNvbW1hbmQuICIgKyBjZSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHRlbmRlZCBlcnJvcjogIiArIGNlLmdldEVycm9yQ29udGVudCgpKTsNCi0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZmlsbCByZXBvc2l0b3J5ICIgKyBlKTsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ21kTGluZShTdHJpbmdbXSBhcmdzKSB7DQotDQotICAgICAgICBPcHRpb25TcGVjPFN0cmluZz4gb3B0Q21kOw0KLSAgICAgICAgT3B0aW9uU3BlYzxJbnRlZ2VyPiBvcHREZXB0aDsNCi0gICAgICAgIE9wdGlvblNwZWM8SW50ZWdlcj4gb3B0Q29udGVudFNpemU7DQotICAgICAgICBPcHRpb25TcGVjPEludGVnZXI+IG9wdEZvbGRlclBlckZvbGRlcjsNCi0gICAgICAgIE9wdGlvblNwZWM8SW50ZWdlcj4gb3B0RG9jc1BlckZvbGRlcjsNCi0gICAgICAgIE9wdGlvblNwZWM8U3RyaW5nPiBvcHRGb2xkZXJUeXBlOw0KLSAgICAgICAgT3B0aW9uU3BlYzxTdHJpbmc+IG9wdERvY1R5cGU7DQotICAgICAgICBPcHRpb25TcGVjPFN0cmluZz4gb3B0UmVwb0lkOw0KLSAgICAgICAgT3B0aW9uU3BlYzxJbnRlZ2VyPiBvcHRDb3VudDsNCi0gICAgICAgIE9wdGlvblNwZWM8Qm9vbGVhbj4gb3B0Q2xlYW51cDsNCi0gICAgICAgIE9wdGlvblNwZWM8U3RyaW5nPiBvcHRSb290Rm9sZGVyOw0KLSAgICAgICAgT3B0aW9uU3BlYzxJbnRlZ2VyPiBvcHRUaHJlYWRzOw0KLSAgICAgICAgT3B0aW9uU3BlYzxTdHJpbmc+IG9wdENvbnRlbnRLaW5kU3RyOw0KLSAgICAgICAgT3B0aW9uU3BlYzxTdHJpbmc+IG9wdEZpbGVOYW1lUGF0dGVybjsNCi0gICAgICAgIE9wdGlvblNwZWM8U3RyaW5nPiBvcHRMb2NhbERpcjsNCi0gICAgICAgIE9wdGlvblNwZWM8U3RyaW5nPiBvcHRMb2NhbEZpbGU7DQotDQotICAgICAgICBPcHRpb25QYXJzZXIgcGFyc2VyID0gbmV3IE9wdGlvblBhcnNlcigpOw0KLSAgICAgICAgb3B0Q21kID0gcGFyc2VyLmFjY2VwdHMoQ01EKS53aXRoUmVxdWlyZWRBcmcoKS5kZXNjcmliZWRBcygiQ29tbWFuZCB0byBwZXJmb3JtIChzZWUgYmVsb3cpIik7DQotICAgICAgICBvcHRSZXBvSWQgPSBwYXJzZXIuYWNjZXB0cyhSRVBPU0lUT1JZX0lEKS53aXRoT3B0aW9uYWxBcmcoKS5kZXNjcmliZWRBcygiUmVwb3NpdG9yeSB1c2VkIik7DQotICAgICAgICBvcHREb2NUeXBlID0gcGFyc2VyLmFjY2VwdHMoRklMTEVSX0RPQ1VNRU5UX1RZUEVfSUQpLndpdGhPcHRpb25hbEFyZygpDQotICAgICAgICAgICAgICAgIC5kZWZhdWx0c1RvKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKS5kZXNjcmliZWRBcygiRG9jdW1lbnQgdHlwZSBjcmVhdGVkIik7DQotICAgICAgICBvcHRGb2xkZXJUeXBlID0gcGFyc2VyLmFjY2VwdHMoRklMTEVSX0ZPTERFUl9UWVBFX0lEKS53aXRoT3B0aW9uYWxBcmcoKQ0KLSAgICAgICAgICAgICAgICAuZGVmYXVsdHNUbyhCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpLmRlc2NyaWJlZEFzKCJGb2xkZXIgdHlwZSBjcmVhdGVkIik7DQotICAgICAgICBvcHREb2NzUGVyRm9sZGVyID0gcGFyc2VyLmFjY2VwdHMoRklMTEVSX0RPQ1NfUEVSX0ZPTERFUikud2l0aE9wdGlvbmFsQXJnKCkub2ZUeXBlKEludGVnZXIuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5kZXNjcmliZWRBcygiRG9jdW1lbnRzIG9uIGVhY2ggbGV2ZWwiKS5kZWZhdWx0c1RvKDEpOw0KLSAgICAgICAgb3B0Rm9sZGVyUGVyRm9sZGVyID0gcGFyc2VyLmFjY2VwdHMoRklMTEVSX0ZPTERFUlNfUEVSX0ZPTERFUikud2l0aE9wdGlvbmFsQXJnKCkub2ZUeXBlKEludGVnZXIuY2xhc3MpDQotICAgICAgICAgICAgICAgIC5kZXNjcmliZWRBcygiIEZvbGRlcnMgb24gZWFjaCBsZXZlbCIpLmRlZmF1bHRzVG8oMCk7DQotICAgICAgICBvcHREZXB0aCA9IHBhcnNlci5hY2NlcHRzKEZJTExFUl9ERVBUSCkud2l0aE9wdGlvbmFsQXJnKCkub2ZUeXBlKEludGVnZXIuY2xhc3MpLmRlc2NyaWJlZEFzKCJMZXZlbHMgb2YgZm9sZGVycyIpDQotICAgICAgICAgICAgICAgIC5kZWZhdWx0c1RvKDEpOw0KLSAgICAgICAgb3B0Q29udGVudFNpemUgPSBwYXJzZXIuYWNjZXB0cyhGSUxMRVJfQ09OVEVOVF9TSVpFKS53aXRoT3B0aW9uYWxBcmcoKS5vZlR5cGUoSW50ZWdlci5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmRlc2NyaWJlZEFzKCJDb250ZW50IHNpemUgb2YgZWFjaCBkb2MiKS5kZWZhdWx0c1RvKDApOw0KLSAgICAgICAgb3B0Q291bnQgPSBwYXJzZXIuYWNjZXB0cyhDT1VOVCkud2l0aE9wdGlvbmFsQXJnKCkub2ZUeXBlKEludGVnZXIuY2xhc3MpLmRlZmF1bHRzVG8oMSkNCi0gICAgICAgICAgICAgICAgLmRlc2NyaWJlZEFzKCJSZXBlYXQgYSBjb21tYW5kIG4gdGltZXMgKHBhcnRpYWxseSBpbXBsZW1lbnRlZCkiKTsNCi0gICAgICAgIG9wdENsZWFudXAgPSBwYXJzZXIuYWNjZXB0cyhDTEVBTlVQKS53aXRoT3B0aW9uYWxBcmcoKS5vZlR5cGUoQm9vbGVhbi5jbGFzcykuZGVmYXVsdHNUbyhmYWxzZSkNCi0gICAgICAgICAgICAgICAgLmRlc2NyaWJlZEFzKCJDbGVhbiBhbGwgY3JlYXRlZCBvYmplY3RzIGF0IHRoZSBlbmQiKTsNCi0gICAgICAgIG9wdFJvb3RGb2xkZXIgPSBwYXJzZXIuYWNjZXB0cyhST09URk9MREVSKS53aXRoT3B0aW9uYWxBcmcoKS5vZlR5cGUoU3RyaW5nLmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAuZGVzY3JpYmVkQXMoImZvbGRlciBpZCB1c2VkIGFzIHJvb3QgdG8gY3JlYXRlIG9iamVjdHMgKGRlZmF1bHQgcmVwb3NpdG9yeSByb290IGZvbGRlcikiKTsNCi0gICAgICAgIG9wdFRocmVhZHMgPSBwYXJzZXIuYWNjZXB0cyhUSFJFQURTKS53aXRoT3B0aW9uYWxBcmcoKS5vZlR5cGUoSW50ZWdlci5jbGFzcykuZGVmYXVsdHNUbygxKQ0KLSAgICAgICAgICAgICAgICAuZGVzY3JpYmVkQXMoIk51bWJlciBvZiB0aHJlYWRzIHRvIHN0YXJ0IGluIHBhcmFsbGVsIik7DQotICAgICAgICBvcHRDb250ZW50S2luZFN0ciA9IHBhcnNlci5hY2NlcHRzKENPTlRFTlRfS0lORCkud2l0aE9wdGlvbmFsQXJnKCkub2ZUeXBlKFN0cmluZy5jbGFzcykuZGVmYXVsdHNUbygibG9yZW0vdGV4dCIpDQotICAgICAgICAgICAgICAgIC5kZXNjcmliZWRBcygia2luZCBvZiBjb250ZW50OiBzdGF0aWMvdGV4dCwgbG9yZW0vdGV4dCwgbG9yZW0vaHRtbCwgZnJhY3RhbC9qcGVnIik7DQotICAgICAgICBvcHRGaWxlTmFtZVBhdHRlcm4gPSBwYXJzZXIuYWNjZXB0cyhGSUxFX05BTUVfUEFUVEVSTikud2l0aE9wdGlvbmFsQXJnKCkub2ZUeXBlKFN0cmluZy5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmRlZmF1bHRzVG8oIkNvbnRlbnREYXRhLSUwM2QuYmluIikuZGVzY3JpYmVkQXMoImZpbGUgbmFtZSBwYXR0ZXJuIHRvIGJlIHVzZWQgd2l0aCBDcmVhdGVGaWxlcyBhY3Rpb24iKTsNCi0gICAgICAgIG9wdExvY2FsRGlyID0gcGFyc2VyLmFjY2VwdHMoTE9DQUxfRElSKS53aXRoT3B0aW9uYWxBcmcoKS5vZlR5cGUoU3RyaW5nLmNsYXNzKS5kZWZhdWx0c1RvKCIuIikNCi0gICAgICAgICAgICAgICAgLmRlc2NyaWJlZEFzKCJuYW1lIG9mIGEgZGlyZWN0b3J5IHRvIGJlIHJlY3Vyc2l2ZWx5IGNvcGllZCB0byB0aGUgcmVwb3NpdG9yeSIpOw0KLSAgICAgICAgb3B0TG9jYWxGaWxlID0gcGFyc2VyLmFjY2VwdHMoTE9DQUxfRklMRSkud2l0aE9wdGlvbmFsQXJnKCkub2ZUeXBlKFN0cmluZy5jbGFzcykNCi0gICAgICAgICAgICAgICAgLmRlc2NyaWJlZEFzKCJmaWxlIG5hbWUgb2YgYSBmaWxlIHRvIGJlIGNvcGllZCB0byB0aGUgcmVwb3NpdG9yeSIpOw0KLSAgICAgICAgT3B0aW9uU2V0IG9wdGlvbnMgPSBwYXJzZXIucGFyc2UoYXJncyk7DQotDQotICAgICAgICBpZiAoY21kID09IG51bGwgfHwgb3B0aW9ucy5oYXMoIj8iKSkgew0KLSAgICAgICAgICAgIHVzYWdlKHBhcnNlcik7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgYmluZGluZ1N0ciA9IGdldEJpbmRpbmdQcm9wZXJ0eSgpOw0KLQ0KLSAgICAgICAgaWYgKGJpbmRpbmdTdHIuZXF1YWxzKEJJTkRJTkdfV1MpKSB7DQotICAgICAgICAgICAgYmluZGluZ1R5cGUgPSBCaW5kaW5nVHlwZS5XRUJTRVJWSUNFUzsNCi0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1N0ci5lcXVhbHMoQklORElOR19BVE9NKSkgew0KLSAgICAgICAgICAgIGJpbmRpbmdUeXBlID0gQmluZGluZ1R5cGUuQVRPTVBVQjsNCi0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1N0ci5lcXVhbHMoQklORElOR19CUk9XU0VSKSkgew0KLSAgICAgICAgICAgIGJpbmRpbmdUeXBlID0gQmluZGluZ1R5cGUuQlJPV1NFUjsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogVW5rbm93biBiaW5kaW5nOiAiICsgYmluZGluZ1N0ciArICIgYWxsb3dlZCB2YWx1ZXM6ICIgKyBCSU5ESU5HX1dTICsgIiBvciAiDQotICAgICAgICAgICAgICAgICAgICArIEJJTkRJTkdfQVRPTSArICIgb3IgIiArIEJJTkRJTkdfQlJPV1NFUik7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGtpbmQgPSBvcHRpb25zLnZhbHVlT2Yob3B0Q29udGVudEtpbmRTdHIpOw0KLSAgICAgICAgaWYgKG51bGwgPT0ga2luZCkgew0KLSAgICAgICAgICAgIGlmIChvcHRpb25zLnZhbHVlT2Yob3B0Q29udGVudFNpemUpID4gMCkgew0KLSAgICAgICAgICAgICAgICBjb250ZW50S2luZCA9IE9iamVjdEdlbmVyYXRvci5Db250ZW50S2luZC5TVEFUSUNfVEVYVDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjb250ZW50S2luZCA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChraW5kLmVxdWFscygic3RhdGljL3RleHQiKSkgew0KLSAgICAgICAgICAgIGNvbnRlbnRLaW5kID0gT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kLlNUQVRJQ19URVhUOw0KLSAgICAgICAgfSBlbHNlIGlmIChraW5kLmVxdWFscygibG9yZW0vdGV4dCIpKSB7DQotICAgICAgICAgICAgY29udGVudEtpbmQgPSBPYmplY3RHZW5lcmF0b3IuQ29udGVudEtpbmQuTE9SRU1fSVBTVU1fVEVYVDsNCi0gICAgICAgIH0gZWxzZSBpZiAoa2luZC5lcXVhbHMoImxvcmVtL2h0bWwiKSkgew0KLSAgICAgICAgICAgIGNvbnRlbnRLaW5kID0gT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kLkxPUkVNX0lQU1VNX0hUTUw7DQotICAgICAgICB9IGVsc2UgaWYgKGtpbmQuZXF1YWxzKCJmcmFjdGFsL2pwZWciKSkgew0KLSAgICAgICAgICAgIGNvbnRlbnRLaW5kID0gT2JqZWN0R2VuZXJhdG9yLkNvbnRlbnRLaW5kLklNQUdFX0ZSQUNUQUxfSlBFRzsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmtub3duIGNvbnRlbnQga2luZDogIiArIG9wdGlvbnMudmFsdWVPZihvcHRDb250ZW50S2luZFN0cikpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBtdXN0IGJlIG9uZSBvZiBzdGF0aWMvdGV4dCwgbG9yZW0vdGV4dCwgbG9yZW0vaHRtbCwgZnJhY3RhbC9qcGVnIik7DQotICAgICAgICAgICAgdXNhZ2UocGFyc2VyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJlcG9zaXRvcnlJZCA9IG9wdGlvbnMudmFsdWVPZihvcHRSZXBvSWQpOw0KLSAgICAgICAgY21kID0gb3B0aW9ucy52YWx1ZU9mKG9wdENtZCk7DQotICAgICAgICBkZXB0aCA9IG9wdGlvbnMudmFsdWVPZihvcHREZXB0aCk7DQotICAgICAgICBjb250ZW50U2l6ZSA9IG9wdGlvbnMudmFsdWVPZihvcHRDb250ZW50U2l6ZSk7DQotICAgICAgICBmb2xkZXJQZXJGb2xkZXIgPSBvcHRpb25zLnZhbHVlT2Yob3B0Rm9sZGVyUGVyRm9sZGVyKTsNCi0gICAgICAgIGRvY3NQZXJGb2xkZXIgPSBvcHRpb25zLnZhbHVlT2Yob3B0RG9jc1BlckZvbGRlcik7DQotICAgICAgICBmb2xkZXJUeXBlID0gb3B0aW9ucy52YWx1ZU9mKG9wdEZvbGRlclR5cGUpOw0KLSAgICAgICAgZG9jVHlwZSA9IG9wdGlvbnMudmFsdWVPZihvcHREb2NUeXBlKTsNCi0gICAgICAgIGNvdW50ID0gb3B0aW9ucy52YWx1ZU9mKG9wdENvdW50KTsNCi0gICAgICAgIGNsZWFudXAgPSBvcHRpb25zLnZhbHVlT2Yob3B0Q2xlYW51cCk7DQotICAgICAgICByb290Rm9sZGVyID0gb3B0aW9ucy52YWx1ZU9mKG9wdFJvb3RGb2xkZXIpOw0KLSAgICAgICAgdGhyZWFkcyA9IG9wdGlvbnMudmFsdWVPZihvcHRUaHJlYWRzKTsNCi0gICAgICAgIGNvbnRlbnRLaW5kU3RyID0gb3B0aW9ucy52YWx1ZU9mKG9wdENvbnRlbnRLaW5kU3RyKTsNCi0gICAgICAgIGZpbGVOYW1lUGF0dGVybiA9IG9wdGlvbnMudmFsdWVPZihvcHRGaWxlTmFtZVBhdHRlcm4pOw0KLSAgICAgICAgbG9jYWxEaXIgPSBvcHRpb25zLnZhbHVlT2Yob3B0TG9jYWxEaXIpOw0KLSAgICAgICAgbG9jYWxGaWxlID0gb3B0aW9ucy52YWx1ZU9mKG9wdExvY2FsRmlsZSk7DQotDQotICAgICAgICBpbml0Q2xpZW50QmluZGluZ3MoKTsNCi0NCi0gICAgICAgIGlmIChudWxsID09IGNtZCkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gY29tbWFuZCBnaXZlbi4iKTsNCi0gICAgICAgICAgICB1c2FnZShwYXJzZXIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjbWQuZXF1YWxzKCJGaWxsUmVwb3NpdG9yeSIpKSB7DQotICAgICAgICAgICAgZmlsbFJlcG9zaXRvcnkob3B0aW9ucyk7DQotICAgICAgICB9IGVsc2UgaWYgKGNtZC5lcXVhbHMoIkNyZWF0ZURvY3VtZW50IikpIHsNCi0gICAgICAgICAgICBjcmVhdGVTaW5nbGVEb2N1bWVudChvcHRpb25zKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY21kLmVxdWFscygiQ3JlYXRlRm9sZGVyIikpIHsNCi0gICAgICAgICAgICBjcmVhdGVGb2xkZXJzKG9wdGlvbnMpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjbWQuZXF1YWxzKCJSZXBvc2l0b3J5SW5mbyIpKSB7DQotICAgICAgICAgICAgcmVwb3NpdG9yeUluZm8ob3B0aW9ucyk7DQotICAgICAgICB9IGVsc2UgaWYgKGNtZC5lcXVhbHMoIkNyZWF0ZUZpbGVzIikpIHsNCi0gICAgICAgICAgICBjcmVhdGVGaWxlcyhvcHRpb25zKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY21kLmVxdWFscygiQ29weUZpbGVzIikpIHsNCi0gICAgICAgICAgICB0cmFuc2ZlckZpbGVzKG9wdGlvbnMpOw0KLSAgICAgICAgfSBlbHNlIGlmIChjbWQuZXF1YWxzKCJDb3B5RmlsZXNUZXN0IikpIHsgLy8gdW5kb2N1bWVudGVkDQotICAgICAgICAgICAgdHJhbnNmZXJGaWxlc1Rlc3Qob3B0aW9ucyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBjbWQ6ICIgKyBjbWQpOw0KLSAgICAgICAgICAgIHVzYWdlKHBhcnNlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB1c2FnZShPcHRpb25QYXJzZXIgcGFyc2VyKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqR2VuQXBwIGlzIGEgY29tbWFuZCBsaW5lIHRvb2wgZm9yIHRlc3RpbmcgYSBDTUlTIHJlcG9zaXRvcnkuIik7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZToiKTsNCi0gICAgICAgICAgICBwYXJzZXIucHJpbnRIZWxwT24oU3lzdGVtLm91dCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dA0KLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIkNvbW1hbmQgaXMgb25lIG9mIFtDcmVhdGVEb2N1bWVudCwgQ3JlYXRlRm9sZGVyLCBGaWxsUmVwb3NpdG9yeSwgUmVwb3NpdG9yeUluZm8sIENyZWF0ZUZpbGVzLCAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvcHlGaWxlcywgQ29weUZpbGVzVGVzdF0iKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpWTSBzeXN0ZW0gcHJvcGVydGllczogIiArIFBST1BfQVRPTVBVQl9VUkwgKyAiLCAiICsgUFJPUF9XU19VUkwgKyAiLCAiDQotICAgICAgICAgICAgICAgICAgICArIFBST1BfQlJPV1NFUl9VUkwpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgICAgICAgICAiICsgUFJPUF9VU0VSICsgIiwgIiArIFBST1BfUEFTU1dPUkQpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhhbXBsZTogIik7DQotICAgICAgICAgICAgU3lzdGVtLm91dA0KLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oImphdmEgLUQiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgUFJPUF9BVE9NUFVCX1VSTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI9aHR0cDovL2xvY2FsaG9zdDo4MDgwL2lubWVtb3J5L2F0b20gLWNwIC4uLiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwucmVwb3NpdG9yeS5PYmpHZW5BcHAgLS1CaW5kaW5nPUF0b21QdWIgLS1Db21tYW5kPUNyZWF0ZURvY3VtZW50ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLS1SZXBvc2l0b3J5SWQ9QTEgLS1Db250ZW50U2l6ZUluS0I9MjUgLS1Db250ZW50S2luZD1sb3JlbS90ZXh0Iik7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxSZXBvc2l0b3J5KFN0cmluZyByZXBvSWQsIGludCBkb2NzUGVyRm9sZGVyLCBpbnQgZm9sZGVyc1BlckZvbGRlcnMsIGludCBkZXB0aCwNCi0gICAgICAgICAgICBTdHJpbmcgZG9jdW1lbnRUeXBlLCBTdHJpbmcgZm9sZGVyVHlwZSwgaW50IGNvbnRlbnRTaXplSW5LQiwgU3RyaW5nIHJvb3RGb2xkZXJJZCwgYm9vbGVhbiBkb0NsZWFudXApIHsNCi0NCi0gICAgICAgIE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IuT2JqZWN0R2VuZXJhdG9yUnVubmVyIHJ1bm5lciA9IE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IucHJlcGFyZUZvckNyZWF0ZVRyZWUoDQotICAgICAgICAgICAgICAgIGJpbmRpbmcsIHJlcG9JZCwgZG9jc1BlckZvbGRlciwgZm9sZGVyc1BlckZvbGRlcnMsIGRlcHRoLCBkb2N1bWVudFR5cGUsIGZvbGRlclR5cGUsIGNvbnRlbnRTaXplSW5LQiwNCi0gICAgICAgICAgICAgICAgcm9vdEZvbGRlcklkLCBjb250ZW50S2luZCwgZG9DbGVhbnVwKTsNCi0gICAgICAgIE9iamVjdEdlbmVyYXRvciBnZW4gPSBydW5uZXIuZ2V0T2JqZWN0R2VuZXJhdG9yKCk7DQotICAgICAgICBydW5uZXIuZG9DcmVhdGVUcmVlKCk7DQotDQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0OiIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxsaW5nIHJlcG9zaXRvcnkgc3VjY2VlZGVkLiIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb2xkZXIgdXNlZCBhcyByb290IGZvciBjcmVhdGlvbiAobnVsbD1yb290Rm9sZGVySWQpOiAiICsgcm9vdEZvbGRlcklkKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIGRvY3VtZW50cyBjcmVhdGVkOiAiICsgZ2VuLmdldERvY3VtZW50c0luVG90YWwoKSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBmb2xkZXJzIGNyZWF0ZWQ6ICIgKyBnZW4uZ2V0Rm9sZGVyc0luVG90YWwoKSk7DQotICAgICAgICBnZW4ucHJpbnRUaW1pbmdzKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxSZXBvc2l0b3J5TVQoaW50IG5vVGhyZWFkcywgU3RyaW5nIHJlcG9JZCwgaW50IGRvY3NQZXJGb2xkZXIsIGludCBmb2xkZXJzUGVyRm9sZGVycywgaW50IGRlcHRoLA0KLSAgICAgICAgICAgIFN0cmluZyBkb2N1bWVudFR5cGUsIFN0cmluZyBmb2xkZXJUeXBlLCBpbnQgY29udGVudFNpemVJbktCLCBTdHJpbmcgcm9vdEZvbGRlcklkLCBib29sZWFuIGRvQ2xlYW51cCkgew0KLQ0KLSAgICAgICAgLy8gU3RlcCAxOiBjcmVhdGUgYSByb290IGZvbGRlciBmb3IgZWFjaCB0aHJlYWQNCi0gICAgICAgIE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IuT2JqZWN0R2VuZXJhdG9yUnVubmVyIHJ1bm5lciA9IE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3INCi0gICAgICAgICAgICAgICAgLnByZXBhcmVGb3JDcmVhdGVGb2xkZXIoYmluZGluZywgcmVwb0lkLCBmb2xkZXJUeXBlLCByb290Rm9sZGVySWQsIG5vVGhyZWFkcywgZG9DbGVhbnVwKTsNCi0gICAgICAgIFN0cmluZ1tdIGZvbGRlcklkcyA9IHJ1bm5lci5kb0NyZWF0ZUZvbGRlcigpOw0KLQ0KLSAgICAgICAgLy8gU3RlcCAyOiBmaWxsIGVhY2ggcm9vdCBmb2xkZXIgd2l0aCBhbiBvYmplY3QgdHJlZQ0KLSAgICAgICAgTXVsdGlUaHJlYWRlZE9iamVjdEdlbmVyYXRvci5PYmplY3RHZW5lcmF0b3JSdW5uZXJbXSBydW5uZXJzID0gTXVsdGlUaHJlYWRlZE9iamVjdEdlbmVyYXRvcg0KLSAgICAgICAgICAgICAgICAucHJlcGFyZUZvckNyZWF0ZVRyZWVNVChiaW5kaW5nLCByZXBvSWQsIGRvY3NQZXJGb2xkZXIsIGZvbGRlcnNQZXJGb2xkZXJzLCBkZXB0aCwgZG9jdW1lbnRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsIGNvbnRlbnRTaXplSW5LQiwgZm9sZGVySWRzLCBjb250ZW50S2luZCwgZG9DbGVhbnVwKTsNCi0NCi0gICAgICAgIE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IucnVuTXVsdGlUaHJlYWRlZChydW5uZXJzKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsbGluZyByZXBvc2l0b3J5IHN1Y2NlZWRlZC4iKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRQYXJhbWV0ZXJzKE9wdGlvblNldCBvcHRpb25zKSB7DQotICAgICAgICBpZiAoYmluZGluZ1R5cGUgPT0gQmluZGluZ1R5cGUuQVRPTVBVQikgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgQXRvbVB1YiwgY29ubmVjdGluZyB0byAgIiArIGdldEF0b21QdWJVcmwoKSk7DQotICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdUeXBlID09IEJpbmRpbmdUeXBlLldFQlNFUlZJQ0VTKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2luZyBXZWJTZXJ2aWNlLCBjb25uZWN0aW5nIHRvICAiICsgZ2V0V3NVcmwoKSk7DQotICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdUeXBlID09IEJpbmRpbmdUeXBlLkJST1dTRVIpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzaW5nIEJyb3dzZXIgYmluZGluZywgY29ubmVjdGluZyB0byAgIiArIGdldEJyb3dzZXJVcmwoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBiaW5kaW5nIHR5cGUuIik7DQotICAgICAgICB9DQotDQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcG9zaXRvcnkgaWQgaXM6ICIgKyByZXBvc2l0b3J5SWQpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50IHNpemU6ICIgKyBjb250ZW50U2l6ZSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50IFR5cGU6ICIgKyBkb2NUeXBlKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9sZGVyIGlkIHVzZWQgYXMgcm9vdDogIiArIHJvb3RGb2xkZXIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWxldGUgYWxsIG9iamVjdHMgYWZ0ZXIgY3JlYXRpb246ICIgKyBjbGVhbnVwKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIGFjdGlvbnMgdG8gcGVyZm9ybTogIiArIGNvdW50KTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIHRocmVhZHMgdG8gc3RhcnQ6ICIgKyB0aHJlYWRzKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2luZCBvZiBjcmVhdGVkIGNvbnRlbnQ6ICIgKyBjb250ZW50S2luZFN0cik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNpbmdsZURvY3VtZW50KE9wdGlvblNldCBvcHRpb25zKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgZG9jdW1lbnQgd2l0aCBwYXJhbWV0ZXJzOiIpOw0KLSAgICAgICAgcHJpbnRQYXJhbWV0ZXJzKG9wdGlvbnMpOw0KLSAgICAgICAgaW50IG5vVGhyZWFkcyA9IHRocmVhZHM7DQotICAgICAgICBpZiAobm9UaHJlYWRzIDw9IDEpIHsNCi0gICAgICAgICAgICBjcmVhdGVTaW5nbGVEb2N1bWVudChyZXBvc2l0b3J5SWQsIGRvY1R5cGUsIGNvbnRlbnRTaXplLA0KLSAgICAgICAgICAgICAgICAgICAgcm9vdEZvbGRlciwgY291bnQsIGNsZWFudXApOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjcmVhdGVTaW5nbGVEb2N1bWVudE1UKG5vVGhyZWFkcywgcmVwb3NpdG9yeUlkLCBkb2NUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgY29udGVudFNpemUsIHJvb3RGb2xkZXIsIGNvdW50LA0KLSAgICAgICAgICAgICAgICAgICAgY2xlYW51cCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxSZXBvc2l0b3J5KE9wdGlvblNldCBvcHRpb25zKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsNCi0gICAgICAgIHByaW50UGFyYW1ldGVycyhvcHRpb25zKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgb2JqZWN0IHRyZWUgd2l0aCBmb2xvd2luZyBwYXJhbWV0ZXJzOiAiKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRzIHBlciBmb2xkZXI6ICIgKyBkb2NzUGVyRm9sZGVyKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9sZGVyIHBlciBmb2xkZXI6ICIgKyBmb2xkZXJQZXJGb2xkZXIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZXB0aDogIiArIGRlcHRoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9sZGVyIFR5cGU6ICIgKyBmb2xkZXJUeXBlKTsNCi0NCi0gICAgICAgIGludCBub1RocmVhZHMgPSB0aHJlYWRzOw0KLSAgICAgICAgaWYgKG5vVGhyZWFkcyA8PSAxKSB7DQotICAgICAgICAgICAgZmlsbFJlcG9zaXRvcnkocmVwb3NpdG9yeUlkLCBkb2NzUGVyRm9sZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgZm9sZGVyUGVyRm9sZGVyLCBkZXB0aCwgZG9jVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsIGNvbnRlbnRTaXplLCByb290Rm9sZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgY2xlYW51cCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZpbGxSZXBvc2l0b3J5TVQobm9UaHJlYWRzLCByZXBvc2l0b3J5SWQsIGRvY3NQZXJGb2xkZXIsDQotICAgICAgICAgICAgICAgICAgICBmb2xkZXJQZXJGb2xkZXIsIGRlcHRoLCBkb2NUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSwgY29udGVudFNpemUsIHJvb3RGb2xkZXIsDQotICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRm9sZGVycyhPcHRpb25TZXQgb3B0aW9ucykgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIGZvbGRlciB3aXRoIHBhcmFtZXRlcnM6Iik7DQotICAgICAgICBwcmludFBhcmFtZXRlcnMob3B0aW9ucyk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvbGRlciBUeXBlOiAiICsgZm9sZGVyVHlwZSk7DQotICAgICAgICBpbnQgbm9UaHJlYWRzID0gdGhyZWFkczsNCi0gICAgICAgIGlmIChub1RocmVhZHMgPD0gMSkgew0KLSAgICAgICAgICAgIGNyZWF0ZUZvbGRlcnMocmVwb3NpdG9yeUlkLCBmb2xkZXJUeXBlLCByb290Rm9sZGVyLA0KLSAgICAgICAgICAgICAgICAgICAgY291bnQsIGNsZWFudXApOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjcmVhdGVGb2xkZXJzTVQobm9UaHJlYWRzLCByZXBvc2l0b3J5SWQsIGZvbGRlclR5cGUsDQotICAgICAgICAgICAgICAgICAgICByb290Rm9sZGVyLCBjb3VudCwgY2xlYW51cCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNpbmdsZURvY3VtZW50KFN0cmluZyByZXBvSWQsIFN0cmluZyBkb2N1bWVudFR5cGUsIGludCBjb250ZW50U2l6ZUluS0IsIFN0cmluZyByb290Rm9sZGVySWQsDQotICAgICAgICAgICAgaW50IGRvY0NvdW50LCBib29sZWFuIGRvQ2xlYW51cCkgew0KLQ0KLSAgICAgICAgTXVsdGlUaHJlYWRlZE9iamVjdEdlbmVyYXRvci5PYmplY3RHZW5lcmF0b3JSdW5uZXIgcnVubmVyID0gTXVsdGlUaHJlYWRlZE9iamVjdEdlbmVyYXRvcg0KLSAgICAgICAgICAgICAgICAucHJlcGFyZUZvckNyZWF0ZURvY3VtZW50KGJpbmRpbmcsIHJlcG9JZCwgZG9jdW1lbnRUeXBlLCBjb250ZW50U2l6ZUluS0IsIHJvb3RGb2xkZXJJZCwgZG9jQ291bnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEtpbmQsIGRvQ2xlYW51cCk7DQotICAgICAgICBPYmplY3RHZW5lcmF0b3IgZ2VuID0gcnVubmVyLmdldE9iamVjdEdlbmVyYXRvcigpOw0KLSAgICAgICAgU3RyaW5nW10gaWRzID0gcnVubmVyLmRvQ3JlYXRlRG9jdW1lbnQoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQ6Iik7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50IGNyZWF0aW9uIHN1Y2NlZWRlZC4iKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9sZGVyIHVzZWQgYXMgcm9vdCBmb3IgY3JlYXRpb246ICIgKyByb290Rm9sZGVySWQpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZHMgb2YgY3JlYXRlZCBkb2N1bWVudHM6ICIpOw0KLSAgICAgICAgaWYgKG51bGwgPT0gaWRzKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8bm9uZT4iKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlkc1tpXSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZ2VuLnByaW50VGltaW5ncygpOw0KLSAgICAgICAgZ2VuLnJlc2V0Q291bnRlcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2luZ2xlRG9jdW1lbnRNVChpbnQgbm9UaHJlYWRzLCBTdHJpbmcgcmVwb0lkLCBTdHJpbmcgZG9jdW1lbnRUeXBlLCBpbnQgY29udGVudFNpemVJbktCLA0KLSAgICAgICAgICAgIFN0cmluZyByb290Rm9sZGVySWQsIGludCBkb2NDb3VudCwgYm9vbGVhbiBkb0NsZWFudXApIHsNCi0NCi0gICAgICAgIE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IuT2JqZWN0R2VuZXJhdG9yUnVubmVyW10gcnVubmVycyA9IE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3INCi0gICAgICAgICAgICAgICAgLnByZXBhcmVGb3JDcmVhdGVEb2N1bWVudE1UKG5vVGhyZWFkcywgYmluZGluZywgcmVwb0lkLCBkb2N1bWVudFR5cGUsIGNvbnRlbnRTaXplSW5LQiwgcm9vdEZvbGRlcklkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvY0NvdW50LCBjb250ZW50S2luZCwgZG9DbGVhbnVwKTsNCi0NCi0gICAgICAgIE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IucnVuTXVsdGlUaHJlYWRlZChydW5uZXJzKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnQgY3JlYXRpb24gc3VjY2VlZGVkLiBBbGwgdGhyZWFkcyB0ZXJtaW5hdGVkLiIpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXJzKFN0cmluZyByZXBvSWQsIFN0cmluZyBmb2xkZXJUeXBlLCBTdHJpbmcgcm9vdEZvbGRlcklkLCBpbnQgbm9Gb2xkZXJzLCBib29sZWFuIGRvQ2xlYW51cCkgew0KLQ0KLSAgICAgICAgTXVsdGlUaHJlYWRlZE9iamVjdEdlbmVyYXRvci5PYmplY3RHZW5lcmF0b3JSdW5uZXIgcnVubmVyID0gTXVsdGlUaHJlYWRlZE9iamVjdEdlbmVyYXRvcg0KLSAgICAgICAgICAgICAgICAucHJlcGFyZUZvckNyZWF0ZUZvbGRlcihiaW5kaW5nLCByZXBvSWQsIGZvbGRlclR5cGUsIHJvb3RGb2xkZXJJZCwgbm9Gb2xkZXJzLCBkb0NsZWFudXApOw0KLSAgICAgICAgT2JqZWN0R2VuZXJhdG9yIGdlbiA9IHJ1bm5lci5nZXRPYmplY3RHZW5lcmF0b3IoKTsNCi0gICAgICAgIFN0cmluZ1tdIGlkcyA9IHJ1bm5lci5kb0NyZWF0ZUZvbGRlcigpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdDoiKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9sZGVyIGNyZWF0aW9uIHN1Y2NlZWRlZC4iKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWRzIG9mIGNyZWF0ZWQgZm9sZGVyczogIik7DQotICAgICAgICBpZiAobnVsbCA9PSBpZHMpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjxub25lPiIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaWRzW2ldKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBnZW4ucHJpbnRUaW1pbmdzKCk7DQotICAgICAgICBnZW4ucmVzZXRDb3VudGVycygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXJzTVQoaW50IG5vVGhyZWFkcywgU3RyaW5nIHJlcG9JZCwgU3RyaW5nIGZvbGRlclR5cGUsIFN0cmluZyByb290Rm9sZGVySWQsIGludCBub0ZvbGRlcnMsDQotICAgICAgICAgICAgYm9vbGVhbiBkb0NsZWFudXApIHsNCi0NCi0gICAgICAgIE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IuT2JqZWN0R2VuZXJhdG9yUnVubmVyW10gcnVubmVycyA9IE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3INCi0gICAgICAgICAgICAgICAgLnByZXBhcmVGb3JDcmVhdGVGb2xkZXJNVChub1RocmVhZHMsIGJpbmRpbmcsIHJlcG9JZCwgZm9sZGVyVHlwZSwgcm9vdEZvbGRlcklkLCBub0ZvbGRlcnMsIGRvQ2xlYW51cCk7DQotICAgICAgICBNdWx0aVRocmVhZGVkT2JqZWN0R2VuZXJhdG9yLnJ1bk11bHRpVGhyZWFkZWQocnVubmVycyk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvbGRlciBjcmVhdGlvbiBzdWNjZWVkZWQuIik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxSZXBvSW5mbyhTdHJpbmcgcmVwb3NpdG9yeUlkLCBpbnQgY291bnQpIHsNCi0gICAgICAgIFJlcG9zaXRvcnlTZXJ2aWNlIHJlcFN2YyA9IGJpbmRpbmcuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKTsNCi0gICAgICAgIFRpbWVMb2dnZXIgdGltZUxvZ2dlciA9IG5ldyBUaW1lTG9nZ2VyKCJSZXBvSW5mb1Rlc3QiKTsNCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9JbmZvID0gbnVsbDsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KLSAgICAgICAgICAgIGJpbmRpbmcuY2xlYXJSZXBvc2l0b3J5Q2FjaGUocmVwb3NpdG9yeUlkKTsNCi0gICAgICAgICAgICB0aW1lTG9nZ2VyLnN0YXJ0KCk7DQotICAgICAgICAgICAgcmVwb0luZm8gPSByZXBTdmMuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkLCBudWxsKTsNCi0gICAgICAgICAgICB0aW1lTG9nZ2VyLnN0b3AoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUm9vdCBGb2xkZXIgaWQgaXM6ICIgKyAocmVwb0luZm8gPT0gbnVsbCA/ICI8dW5rbm93bj4iIDogcmVwb0luZm8uZ2V0Um9vdEZvbGRlcklkKCkpKTsNCi0gICAgICAgIHRpbWVMb2dnZXIucHJpbnRUaW1lcygpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZXBvc2l0b3J5SW5mbyhPcHRpb25TZXQgb3B0aW9ucykgew0KLSAgICAgICAgY2FsbFJlcG9JbmZvKHJlcG9zaXRvcnlJZCwgY291bnQpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGaWxlcyhPcHRpb25TZXQgb3B0aW9ucykgew0KLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsNCi0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgbG9jYWwgZmlsZXMgd2l0aCBjb250ZW50OiAiKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2luZDogIiArIGRvY3NQZXJGb2xkZXIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgZmlsZXM6ICIgKyBjb3VudCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbmFtZSBwYXR0ZXJuOiAiICsgZmlsZU5hbWVQYXR0ZXJuKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2luZCBvZiBjb250ZW50OiAiICsgY29udGVudEtpbmRTdHIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaXplIG9mIGNvbnRlbnQgKHRleHQgb25seSk6ICIgKyBjb250ZW50U2l6ZSk7DQotDQotICAgICAgICBPYmplY3RHZW5lcmF0b3Igb2JqR2VuID0gbmV3IE9iamVjdEdlbmVyYXRvcihudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBjb250ZW50S2luZCk7DQotICAgICAgICBvYmpHZW4uc2V0Q29udGVudFNpemVJbktCKGNvbnRlbnRTaXplKTsNCi0NCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gU3RyaW5nLmZvcm1hdChmaWxlTmFtZVBhdHRlcm4sIGkpOw0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRpbmcgZmlsZTogIiArIGZpbGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRTaXplID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb250ZW50S2luZCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUNfVEVYVDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtID0gb2JqR2VuLmNyZWF0ZUNvbnRlbnRTdGF0aWNUZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIExPUkVNX0lQU1VNX1RFWFQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IG9iakdlbi5jcmVhdGVDb250ZW50TG9yZW1JcHN1bVRleHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTE9SRU1fSVBTVU1fSFRNTDoNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtID0gb2JqR2VuLmNyZWF0ZUNvbnRlbnRMb3JlbUlwc3VtSHRtbCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJTUFHRV9GUkFDVEFMX0pQRUc6DQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IG9iakdlbi5jcmVhdGVDb250ZW50RnJhY3RhbGltYWdlSnBlZygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRvIGEgZmlsZToNCi0gICAgICAgICAgICAgICAgaXMgPSBjb250ZW50U3RyZWFtLmdldFN0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KGlzLCBvcywgQlVGU0laRSk7DQotDQotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIGlzID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgb3MgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBnZW5lcmF0aW5nIGZpbGU6ICIgKyBlKTsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShpcyk7DQotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkob3MpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB0cmFuc2ZlckZpbGVzKE9wdGlvblNldCBvcHRpb25zKSB7DQotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBsb2NhbEZpbGU7DQotICAgICAgICBTdHJpbmcgZGlyTmFtZSA9IGxvY2FsRGlyOw0KLSAgICAgICAgU3RyaW5nIGZvbGRlcklkID0gcm9vdEZvbGRlcjsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gZmlsZU5hbWU7DQotDQotICAgICAgICBpZiAoKG51bGwgPT0gZmlsZU5hbWUgfHwgZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkgJiYgKG51bGwgPT0gZGlyTmFtZSB8fCBkaXJOYW1lLmxlbmd0aCgpID09IDApKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogWW91IGVpdGhlciBoYXZlIHRvIHByb3ZpZGUgYSAtLWZpbGUgb3IgYSAtLWRpciBvcHRpb24gdG8gY29weSBmaWxlKHMpLiIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGlmIG5vIGZpbGUgbmFtZSBpcyBwcm92aWRlZCB0aGVyZSBtdXN0IGJlIGEgZGlyZWN0b3J5DQotICAgICAgICBpZiAobnVsbCA9PSBuYW1lIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIG5hbWUgPSBkaXJOYW1lOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGZpbGVzIHRvIGEgcmVwb3NpdG9yeTogIik7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcG9zaXRvcnkgaWQgaXM6ICIgKyAocmVwb3NpdG9yeUlkID09IG51bGwgPyAibm90IHNldCEiIDogcmVwb3NpdG9yeUlkKSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvbGRlciBpZCB1c2VkIGFzIHJvb3Q6ICIgKyByb290Rm9sZGVyKTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IGdldENvbm5lY3Rpb25QYXJhbWV0ZXJzKGdldEJpbmRpbmdQcm9wZXJ0eSgpLCByZXBvc2l0b3J5SWQpOw0KLSAgICAgICAgRmlsZUNvcGllciBmYyA9IG5ldyBGaWxlQ29waWVyKCk7DQotICAgICAgICBmYy5jb25uZWN0KHBhcmFtZXRlcnMpOw0KLSAgICAgICAgZmMuY29weVJlY3Vyc2l2ZShuYW1lLCBmb2xkZXJJZCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHRyYW5zZmVyRmlsZXNUZXN0KE9wdGlvblNldCBvcHRpb25zKSB7DQotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBsb2NhbEZpbGU7DQotDQotICAgICAgICBpZiAoKG51bGwgPT0gZmlsZU5hbWUgfHwgZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBZb3UgaGF2ZSB0byBwcm92aWRlIGEgLS1maWxlIG9wdGlvbiB0byB0ZXN0IG1ldGFkYXRhIGV4dHJhY3Rpb24uIik7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nIG1ldGFkYXRhIGV4dHJhY3Rpb246ICIpOw0KLQ0KLSAgICAgICAgRmlsZUNvcGllciBmYyA9IG5ldyBGaWxlQ29waWVyKCk7DQotICAgICAgICBmYy5saXN0TWV0YWRhdGEoZmlsZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRDb25uZWN0aW9uUGFyYW1ldGVycyhTdHJpbmcgYmluZGluZywgU3RyaW5nIHJlcG9JZCkgew0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQsIHJlcG9JZCk7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgYmluZGluZyk7DQotDQotICAgICAgICBpZiAoYmluZGluZy5lcXVhbHMoQmluZGluZ1R5cGUuQVRPTVBVQi52YWx1ZSgpKSkgew0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkwsIGdldEF0b21QdWJVcmwoKSk7DQotICAgICAgICAgICAgZmlsTG9naW5QYXJhbXMocGFyYW1ldGVycywgZ2V0VXNlcigpLCBnZXRQYXNzd29yZCgpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZy5lcXVhbHMoQmluZGluZ1R5cGUuV0VCU0VSVklDRVMudmFsdWUoKSkpIHsNCi0gICAgICAgICAgICBmaWxsV1NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIGdldFdzVXJsKCksIGlzUHJlZml4KGdldFdzVXJsKCkpLCBnZXRVc2VyKCksIGdldFBhc3N3b3JkKCkpOw0KLSAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nLmVxdWFscyhCaW5kaW5nVHlwZS5CUk9XU0VSLnZhbHVlKCkpKSB7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX1VSTCwgZ2V0QnJvd3NlclVybCgpKTsNCi0gICAgICAgICAgICBmaWxMb2dpblBhcmFtcyhwYXJhbWV0ZXJzLCBnZXRVc2VyKCksIGdldFBhc3N3b3JkKCkpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHVua25vd24gYmluZGluZzogIiArIGJpbmRpbmcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmlsbEN1c3RvbUhlYWRlcnMocGFyYW1ldGVycyk7DQotDQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENsaWVudEJpbmRpbmdzKCkgew0KLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nVHlwZSA9PSBCaW5kaW5nVHlwZS5BVE9NUFVCKSB7DQotICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBjcmVhdGVBdG9tQmluZGluZyhnZXRBdG9tUHViVXJsKCksIGdldFVzZXIoKSwgZ2V0UGFzc3dvcmQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nVHlwZSA9PSBCaW5kaW5nVHlwZS5XRUJTRVJWSUNFUykgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gZ2V0V3NVcmwoKTsNCi0gICAgICAgICAgICAgICAgYmluZGluZyA9IGNyZWF0ZVdTQmluZGluZyh1cmwsIGlzUHJlZml4KHVybCksIGdldFVzZXIoKSwgZ2V0UGFzc3dvcmQoKSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nVHlwZSA9PSBCaW5kaW5nVHlwZS5CUk9XU0VSKSB7DQotICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBjcmVhdGVCcm93c2VyQmluZGluZyhnZXRCcm93c2VyVXJsKCksIGdldFVzZXIoKSwgZ2V0UGFzc3dvcmQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9JbmZvID0gYmluZGluZy5nZXRSZXBvc2l0b3J5U2VydmljZSgpLmdldFJlcG9zaXRvcnlJbmZvKG51bGwsIG51bGwpOw0KLSAgICAgICAgICAgIGlmIChudWxsID09IHJlcG9zaXRvcnlJZCkgew0KLSAgICAgICAgICAgICAgICByZXBvc2l0b3J5SWQgPSByZXBvSW5mby5nZXRJZCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbExvZ2luUGFyYW1zKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCkgew0KLSAgICAgICAgaWYgKHVzZXIgIT0gbnVsbCAmJiB1c2VyLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgdXNlcik7DQotICAgICAgICB9DQotICAgICAgICBpZiAodXNlciAhPSBudWxsICYmIHVzZXIubGVuZ3RoKCkgPiAwKSB7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5QQVNTV09SRCwgcGFzc3dvcmQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmlsbEN1c3RvbUhlYWRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7DQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBnZXRDdXN0b21IZWFkZXJzKCk7DQotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBjdXN0b21IZWFkZXJzLmVudHJ5U2V0KCkpIHsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ21pc0JpbmRpbmcgY3JlYXRlQXRvbUJpbmRpbmcoU3RyaW5nIHVybCwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCkgew0KLQ0KLSAgICAgICAgLy8gZ2F0aGVyIHBhcmFtZXRlcnMNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgZmlsTG9naW5QYXJhbXMocGFyYW1ldGVycywgdXNlciwgcGFzc3dvcmQpOw0KLSAgICAgICAgZmlsbEN1c3RvbUhlYWRlcnMocGFyYW1ldGVycyk7DQotDQotICAgICAgICAvLyBnZXQgZmFjdG9yeSBhbmQgY3JlYXRlIGJpbmRpbmcNCi0gICAgICAgIENtaXNCaW5kaW5nRmFjdG9yeSBmYWN0b3J5ID0gQ21pc0JpbmRpbmdGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkFUT01QVUJfVVJMLCB1cmwpOw0KLSAgICAgICAgQ21pc0JpbmRpbmcgYmluZGluZyA9IGZhY3RvcnkuY3JlYXRlQ21pc0F0b21QdWJCaW5kaW5nKHBhcmFtZXRlcnMpOw0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ21pc0JpbmRpbmcgY3JlYXRlQnJvd3NlckJpbmRpbmcoU3RyaW5nIHVybCwgU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCkgew0KLQ0KLSAgICAgICAgLy8gZ2F0aGVyIHBhcmFtZXRlcnMNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KLSAgICAgICAgZmlsTG9naW5QYXJhbXMocGFyYW1ldGVycywgdXNlciwgcGFzc3dvcmQpOw0KLSAgICAgICAgZmlsbEN1c3RvbUhlYWRlcnMocGFyYW1ldGVycyk7DQotDQotICAgICAgICAvLyBnZXQgZmFjdG9yeSBhbmQgY3JlYXRlIGJpbmRpbmcNCi0gICAgICAgIENtaXNCaW5kaW5nRmFjdG9yeSBmYWN0b3J5ID0gQ21pc0JpbmRpbmdGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJST1dTRVJfVVJMLCB1cmwpOw0KLSAgICAgICAgQ21pc0JpbmRpbmcgYmluZGluZyA9IGZhY3RvcnkuY3JlYXRlQ21pc0Jyb3dzZXJCaW5kaW5nKHBhcmFtZXRlcnMpOw0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ByZWZpeChTdHJpbmcgdXJsKSB7DQotICAgICAgICBib29sZWFuIGlzUHJlZml4ID0gdHJ1ZTsNCi0gICAgICAgIFN0cmluZyB1cmxMb3dlciA9IHVybC50b0xvd2VyQ2FzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHVybExvd2VyLmVuZHNXaXRoKCI/d3NkbCIpKSB7DQotICAgICAgICAgICAgaXNQcmVmaXggPSBmYWxzZTsNCi0gICAgICAgIH0gZWxzZSBpZiAodXJsTG93ZXIuZW5kc1dpdGgoIi53c2RsIikpIHsNCi0gICAgICAgICAgICBpc1ByZWZpeCA9IGZhbHNlOw0KLSAgICAgICAgfSBlbHNlIGlmICh1cmxMb3dlci5lbmRzV2l0aCgiLnhtbCIpKSB7DQotICAgICAgICAgICAgaXNQcmVmaXggPSBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpc1ByZWZpeDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIENtaXNCaW5kaW5nIGNyZWF0ZVdTQmluZGluZyhTdHJpbmcgdXJsLCBib29sZWFuIGlzUHJlZml4LCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgew0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgICAgICBmaWxsV1NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIHVybCwgaXNQcmVmaXgsIHVzZXJuYW1lLCBwYXNzd29yZCk7DQotICAgICAgICBmaWxsQ3VzdG9tSGVhZGVycyhwYXJhbWV0ZXJzKTsNCi0NCi0gICAgICAgIC8vIGdldCBmYWN0b3J5IGFuZCBjcmVhdGUgcHJvdmlkZXINCi0gICAgICAgIENtaXNCaW5kaW5nRmFjdG9yeSBmYWN0b3J5ID0gQ21pc0JpbmRpbmdGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBDbWlzQmluZGluZyBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzV2ViU2VydmljZXNCaW5kaW5nKHBhcmFtZXRlcnMpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxXU1BhcmFtZXRlcnMoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBTdHJpbmcgdXJsLCBib29sZWFuIGlzUHJlZml4LCBTdHJpbmcgdXNlcm5hbWUsDQotICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkKSB7DQotICAgICAgICAvLyBnYXRoZXIgcGFyYW1ldGVycw0KLSAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSLCB1c2VybmFtZSk7DQotICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlBBU1NXT1JELCBwYXNzd29yZCk7DQotDQotICAgICAgICBpZiAoIWlzUHJlZml4KSB7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0UsIHVybCk7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0UsIHVybCk7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRSwgdXJsKTsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1ZFUlNJT05JTkdfU0VSVklDRSwgdXJsKTsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0RJU0NPVkVSWV9TRVJWSUNFLCB1cmwpOw0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVMQVRJT05TSElQX1NFUlZJQ0UsIHVybCk7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFLCB1cmwpOw0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUE9MSUNZX1NFUlZJQ0UsIHVybCk7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19BQ0xfU0VSVklDRSwgdXJsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19SRVBPU0lUT1JZX1NFUlZJQ0UsIHVybCArICJSZXBvc2l0b3J5U2VydmljZT93c2RsIik7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19OQVZJR0FUSU9OX1NFUlZJQ0UsIHVybCArICJOYXZpZ2F0aW9uU2VydmljZT93c2RsIik7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19PQkpFQ1RfU0VSVklDRSwgdXJsICsgIk9iamVjdFNlcnZpY2U/d3NkbCIpOw0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfVkVSU0lPTklOR19TRVJWSUNFLCB1cmwgKyAiVmVyc2lvbmluZ1NlcnZpY2U/d3NkbCIpOw0KLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfRElTQ09WRVJZX1NFUlZJQ0UsIHVybCArICJEaXNjb3ZlcnlTZXJ2aWNlP3dzZGwiKTsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1JFTEFUSU9OU0hJUF9TRVJWSUNFLCB1cmwgKyAiUmVsYXRpb25zaGlwU2VydmljZT93c2RsIik7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFLCB1cmwgKyAiTXVsdGlGaWxpbmdTZXJ2aWNlP3dzZGwiKTsNCi0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX1BPTElDWV9TRVJWSUNFLCB1cmwgKyAiUG9saWN5U2VydmljZT93c2RsIik7DQotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19BQ0xfU0VSVklDRSwgdXJsICsgIkFDTFNlcnZpY2U/d3NkbCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCaW5kaW5nUHJvcGVydHkoKSB7DQotICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KFBST1BfQklORElORywgREVGQVVMVF9CSU5ESU5HKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXRvbVB1YlVybCgpIHsNCi0gICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoUFJPUF9BVE9NUFVCX1VSTCwgREVGQVVMVF9BVE9NUFVCX1VSTCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFdzVXJsKCkgew0KLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1dTX1VSTCwgREVGQVVMVF9XU19VUkwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCcm93c2VyVXJsKCkgew0KLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0JST1dTRVJfVVJMLCBERUZBVUxUX0JST1dTRVJfQklORElOR19VUkwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVc2VyKCkgew0KLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1VTRVIsIERFRkFVTFRfVVNFUik7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgew0KLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX1BBU1NXT1JELCBERUZBVUxUX1BBU1NXT1JEKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEN1c3RvbUhlYWRlcnMoKSB7DQotICAgICAgICBpbnQgaSA9IDA7DQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShQUk9QX0NVU1RPTSArIGksIG51bGwpOw0KLSAgICAgICAgICAgIGlmIChudWxsID09IHZhbCkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjdXN0b21IZWFkZXJzLnB1dChQUk9QX0NVU1RPTSArIGkrKywgdmFsKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY3VzdG9tSGVhZGVyczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL21hcHBlci9BYnN0cmFjdFByb3BlcnR5TWFwcGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL21hcHBlci9BYnN0cmFjdFByb3BlcnR5TWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjIwMzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvQWJzdHJhY3RQcm9wZXJ0eU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGVydHlNYXBwZXIgaW1wbGVtZW50cyBQcm9wZXJ0eU1hcHBlciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RBVEVfRk9STUFUID0gInl5eXktTU0tZGQnVCdISDptbTpzcyI7DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBjb250ZW50VHlwZXM7DQotICAgIHByb3RlY3RlZCBTdHJpbmcgY21pc1R5cGVJZDsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm9wUHJlZml4Ow0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRhdGVGb3JtYXQgPSBERUZBVUxUX0RBVEVfRk9STUFUOw0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbml0aWFsaXplKFN0cmluZyBjZmdQcmVmaXgsIFN0cmluZyB0eXBlS2V5LCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsNCi0gICAgICAgIHByb3BQcmVmaXggPSBjZmdQcmVmaXggKyAiLiIgKyB0eXBlS2V5Ow0KLSAgICAgICAgY21pc1R5cGVJZCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcFByZWZpeCArICIudHlwZUlkIik7DQotICAgICAgICBTdHJpbmcgY29udGVudFR5cGVFbnRyeSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcFByZWZpeCk7DQotDQotICAgICAgICBjb250ZW50VHlwZXMgPSBjb250ZW50VHlwZUVudHJ5LnNwbGl0KCJcXDoiKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgY29udGVudFR5cGVzW2ldID0gY29udGVudFR5cGVzW2ldLnRyaW0oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBkZiA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcFByZWZpeCArICIuZGF0ZUZvcm1hdCIpOw0KLSAgICAgICAgaWYgKG51bGwgIT0gZGYpIHsNCi0gICAgICAgICAgICBkYXRlRm9ybWF0ID0gZGY7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobnVsbCA9PSBjbWlzVHlwZUlkKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiTWlzc2luZ3QgdHlwZSBpZCBpbiBwcm9wZXJ0aWVzOiAiICsgcHJvcFByZWZpeCArICIudHlwZUlkIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlZFR5cGVJZCgpIHsNCi0gICAgICAgIHJldHVybiBjbWlzVHlwZUlkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb250ZW50VHlwZXMoKSB7DQotICAgICAgICByZXR1cm4gY29udGVudFR5cGVzOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvbWFwcGVyL0NvbmZpZ3VyYXRvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzFlYzkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1hcHBlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyLk1ldGFkYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLnBhcnNlci5NZXRhZGF0YVBhcnNlclRpa2E7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29uZmlndXJhdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0b3IgaW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJtYXBwaW5nLmNvbnRlbnRUeXBlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdG9yIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAobnVsbCA9PSBpbnN0YW5jZSkgewotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9wZXJ0eU1hcHBlcj4gY29udGVudFR5cGVNYXBwZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3BlcnR5TWFwcGVyPigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWV0YWRhdGFQYXJzZXI+IHBhcnNlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0YWRhdGFQYXJzZXI+KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdERvY3VtZW50VHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0Rm9sZGVyVHlwZTsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdG9yKCkgewotICAgICAgICBsb2FkUHJvcGVydGllcygpOwotICAgICAgICBsb2FkRGVmYXVsdHMoKTsKLSAgICAgICAgYnVpbGRNYXBwZXJNYXAoKTsKLSAgICAgICAgY3JlYXRlUGFyc2VycygpOwotICAgIH0KLQotICAgIC8vIGp1c3QgZm9yIHVuaXQgdGVzdHMKLSAgICBDb25maWd1cmF0b3IoUHJvcGVydGllcyBwcm9wcykgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlNYXBwZXIgZ2V0UHJvcGVydHlNYXBwZXIoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIE1ldGFkYXRhUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcihjb250ZW50VHlwZSk7Ci0gICAgICAgIHJldHVybiBwYXJzZXIuZ2V0TWFwcGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGFkYXRhUGFyc2VyIGdldFBhcnNlcihTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgTWV0YWRhdGFQYXJzZXIgcGFyc2VyID0gcGFyc2VyTWFwLmdldChjb250ZW50VHlwZSk7Ci0gICAgICAgIGlmIChudWxsID09IHBhcnNlcikgewotICAgICAgICAgICAgLy8gaWYgbm90IGZvdW5kIHRyeSBhIG1vcmUgZ2VuZXJpYyBvbmUKLSAgICAgICAgICAgIFN0cmluZyBnZW5lcmljQ29udGVudFR5cGUgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoMCwgY29udGVudFR5cGUuaW5kZXhPZignLycpKSArICIvKiI7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBwYXJzZXJNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhnZW5lcmljQ29udGVudFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXJNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJzZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRQcm9wZXJ0aWVzKCkgewotICAgICAgICAvLyBSZXR1cm5zIG51bGwgb24gbG9va3VwIGZhaWx1cmVzOgotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IENvbmZpZ3VyYXRvci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvbWFwcGluZy5wcm9wZXJ0aWVzIik7Ci0gICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5sb2FkKGluKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2FkIGZpbGUgbWFwcGluZy5wcm9wZXJ0aWVzIGFzIHJlc291cmNlIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZERlZmF1bHRzKCkgewotICAgICAgICBkZWZhdWx0RG9jdW1lbnRUeXBlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUkVGSVggKyAiLmRlZmF1bHQuZG9jdW1lbnQiKTsKLSAgICAgICAgaWYgKG51bGwgPT0gZGVmYXVsdERvY3VtZW50VHlwZSkgewotICAgICAgICAgICAgZGVmYXVsdERvY3VtZW50VHlwZSA9ICJjbWlzOmRvY3VtZW50IjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHRGb2xkZXJUeXBlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUkVGSVggKyAiLmRlZmF1bHQuZm9sZGVyIik7Ci0gICAgICAgIGlmIChudWxsID09IGRlZmF1bHRGb2xkZXJUeXBlKSB7Ci0gICAgICAgICAgICBkZWZhdWx0Rm9sZGVyVHlwZSA9ICJjbWlzOmZvbGRlciI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREb2N1bWVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0RG9jdW1lbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEZvbGRlclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Rm9sZGVyVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gYW4gb3ZlcnJpZGRlbiBNSU1FIHR5cGUgZnJvbSBhIGZpbGUgZXh0ZW5zaW9uCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGVFeHRlbnNpb24KLSAgICAgKiAgICAgICAgICAgIGVuZm9yY2VkIG9yIGNvbnRlbnQtdHlwZSBvciBudWxsIGlmIG5vbmUgaXMgc2V0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShTdHJpbmcgZmlsZUV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUkVGSVggKyAiLmZvcmNlQ29udGVudFR5cGUuIiArIGZpbGVFeHRlbnNpb24sIG51bGwpOwotICAgIH0KLQotICAgIFN0cmluZ1tdIGdldFR5cGVLZXlzKCkgewotICAgICAgICBTdHJpbmcgcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJFRklYICsgInMiKTsKLQotICAgICAgICBpZiAobnVsbCA9PSBzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGtleXMgPSBzLnNwbGl0KCIsIik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBrZXlzW2ldID0ga2V5c1tpXS50cmltKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2V5czsKLSAgICB9Ci0KLSAgICB2b2lkIGJ1aWxkTWFwcGVyTWFwKCkgewotCi0gICAgICAgIFN0cmluZ1tdIHR5cGVLZXlzID0gZ2V0VHlwZUtleXMoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgdHlwZUtleSA6IHR5cGVLZXlzKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eU1hcHBlciBtYXBwZXIgPSBsb2FkTWFwcGVyQ2xhc3ModHlwZUtleSk7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBSRUZJWCArICIuIiArIHR5cGVLZXkpOwotICAgICAgICAgICAgaWYgKG51bGwgPT0gY29udGVudFR5cGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJNaXNzaW5ndCBjb250ZW50IHR5cGUgaW4gcHJvcGVydGllczogIiArIFBSRUZJWCArICIuIiArIHR5cGVLZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBvayA9IG1hcHBlci5pbml0aWFsaXplKFBSRUZJWCwgdHlwZUtleSwgcHJvcGVydGllcyk7Ci0KLSAgICAgICAgICAgIGlmIChvaykgewotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlTWFwcGVyTWFwLnB1dCh0eXBlS2V5LCBtYXBwZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjcmVhdGVQYXJzZXJzKCkgewotICAgICAgICBTdHJpbmdbXSB0eXBlS2V5cyA9IGdldFR5cGVLZXlzKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHR5cGVLZXkgOiB0eXBlS2V5cykgewotICAgICAgICAgICAgTWV0YWRhdGFQYXJzZXIgcGFyc2VyID0gbG9hZFBhcnNlckNsYXNzKHR5cGVLZXkpOwotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUkVGSVggKyAiLiIgKyB0eXBlS2V5KTsKLSAgICAgICAgICAgIGlmIChudWxsID09IGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiTWlzc2luZyBjb250ZW50IHR5cGUgaW4gcHJvcGVydGllczogIiArIFBSRUZJWCArICIuIiArIHR5cGVLZXkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQcm9wZXJ0eU1hcHBlciBtYXBwZXIgPSBjb250ZW50VHlwZU1hcHBlck1hcC5nZXQodHlwZUtleSk7Ci0KLSAgICAgICAgICAgIHBhcnNlci5pbml0aWFsaXplKG1hcHBlciwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgU3RyaW5nW10gY29udGVudFR5cGVzID0gcGFyc2VyLmdldENvbnRlbnRUeXBlcygpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgY3QgOiBjb250ZW50VHlwZXMpIHsKLSAgICAgICAgICAgICAgICBwYXJzZXJNYXAucHV0KGN0LCBwYXJzZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWV0YWRhdGFQYXJzZXIgbG9hZFBhcnNlckNsYXNzKFN0cmluZyB0eXBlS2V5KSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBSRUZJWCArICIuIiArIHR5cGVLZXkgKyAiLnBhcnNlckNsYXNzIik7Ci0gICAgICAgIGlmIChudWxsID09IGNsYXNzTmFtZSkgey8vIHVzZSBUaWthIGFzIGRlZmF1bHQgcGFyc2VyIGlmIG5vbmUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJlZAotICAgICAgICAgICAgY2xhc3NOYW1lID0gTWV0YWRhdGFQYXJzZXJUaWthLmNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIklsbGVnYWwgY2xhc3MgdG8gbG9hZCBtZXRhZGF0YSBwYXJzZXIsIGNhbm5vdCBpbnN0YW50aWF0ZSAiICsgY2xhc3NOYW1lLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIklsbGVnYWwgY2xhc3MgdG8gbG9hZCBtZXRhZGF0YSBwYXJzZXIsIGNhbm5vdCBhY2Nlc3MgIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJJbGxlZ2FsIGNsYXNzIHRvIGxvYWQgbWV0YWRhdGEgcGFyc2VyLCBjbGFzcyBub3QgZm91bmQ6ICIgKyBjbGFzc05hbWUsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGFkYXRhUGFyc2VyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1ldGFkYXRhUGFyc2VyKSBvYmo7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJJbGxlZ2FsIGNsYXNzIHRvIGNyZWF0ZSBtZXRhZGF0YSBwYXJzZXI6ICIgKyBjbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtdXN0IGltcGxlbWVudCBNZXRhZGF0YVBhcnNlciBpbnRlcmZhY2UuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBQcm9wZXJ0eU1hcHBlciBsb2FkTWFwcGVyQ2xhc3MoU3RyaW5nIHR5cGVLZXkpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJFRklYICsgIi4iICsgdHlwZUtleSArICIubWFwcGVyQ2xhc3MiKTsKLSAgICAgICAgaWYgKG51bGwgPT0gY2xhc3NOYW1lKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBQcm9wZXJ0eU1hcHBlclRpa2EuY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9iaiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5lcnJvcihlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiSWxsZWdhbCBjbGFzcyB0byBsb2FkIG1hcHBpbmcgY29uZmlndXJhdGlvbiwgY2Fubm90IGluc3RhbnRpYXRlICIgKyBjbGFzc05hbWUsIGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExPRy5lcnJvcihlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiSWxsZWdhbCBjbGFzcyB0byBsb2FkIG1hcHBpbmcgY29uZmlndXJhdGlvbiwgY2Fubm90IGFjY2VzcyAiICsgY2xhc3NOYW1lLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIklsbGVnYWwgY2xhc3MgdG8gbG9hZCBtYXBwaW5nIGNvbmZpZ3VyYXRpb24sIGNsYXNzIG5vdCBmb3VuZDogIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUHJvcGVydHlNYXBwZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoUHJvcGVydHlNYXBwZXIpIG9iajsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIklsbGVnYWwgY2xhc3MgdG8gY3JlYXRlIHByb3BlcnR5IG1hcHBlcjogIiArIGNsYXNzTmFtZQotICAgICAgICAgICAgICAgICAgICArICIsIG11c3QgaW1wbGVtZW50IFByb3BlcnR5TWFwcGVyIGludGVyZmFjZS4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvbWFwcGVyL01hcHBlckV4Y2VwdGlvbi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvTWFwcGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTk2YmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvTWFwcGVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyOw0KLQ0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBNYXBwZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQ0KLSAgICBwdWJsaWMgTWFwcGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwcGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL21hcHBlci9Qcm9wZXJ0eU1hcHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvUHJvcGVydHlNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2NDg1MS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL21hcHBlci9Qcm9wZXJ0eU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1hcHBlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOw0KLQ0KLS8qKg0KLSAqIEEgcHJvcGVydHkgbWFwcGVyIGlzIGEgY2xhc3MgYmVpbmcgcmVzcG9uc2libGUgdG8gbWFwIGEgQ29udGVudC1UeXBlIChlLmcuIGltYWdlL2pwZWcpDQotICogdG8gYSBDTUlTIHR5cGUgaWQgYW5kIHRvIG1hcCBhbmQgY29udmVydCBwcm9wZXJ0aWVzLiBFeHRyYWN0ZWQgdGFncyBhcmUgbWFwcGVkIHRvIA0KLSAqIENNSVMgcHJvcGVydHkgaWRzIGFuZCBzb21ldGltZXMgdHlwZSBjb252ZXJzaW9uIGlzIHJlcXVpcmVkIChlLmcuIGEgc3RyaW5nIHRvIGEgZGF0ZSkuDQotICogQ2xhc3NlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZXh0cmFjdGluZyB0aGUgbWV0YWRhdGEgDQotICogKHNlZSBNZXRhZGF0YVBhcnNlcikuIEl0IG9ubHkgcmVhZHMgYSBjb25maWd1cmF0aW9uIGFuZCBtYXBzIHByb3BlcnRpZXMuIFRoZSANCi0gKiBDb25maWd1cmF0b3Igd2lsbCByZWFkIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYW5kIGluc3RhbnRpYXRlIGltcGxlbWVudGF0aW9ucyANCi0gKiBvZiB0aGlzIGludGVyZmFjZSAob25lIGluc3RhbmNlIHBlciBDTUlTIHR5cGUpDQotICovDQotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eU1hcHBlciB7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogaW5pdGlhbGl6ZSBhIHByb3BlcnR5IG1hcHBlcg0KLSAgICAgKiBAcGFyYW0gY2ZnUHJlZml4DQotICAgICAqICAgICAgcHJlZml4IGZvciBhbGwgY29uZmlndXJhdGlvbiBlbnRyaWVzIGluIHByb3BlcnRpZXMgZmlsZQ0KLSAgICAgKiBAcGFyYW0gdHlwZUtleQ0KLSAgICAgKiAgICAgIHR5cGUga2V5IGluIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBpZGVudGlmeSB0aGlzIHR5cGUNCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMNCi0gICAgICogICAgICBhbGwgcHJvcGVydGllcyByZWFkIGZyb20gcmVzb3VyY2UgbWFwcGluZy5wcm9wZXJ0aWVzDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgICB0cnVlLCBpZiBwcm9jZXNzaW5nIHNob3VsZCBjb250aW51ZSwgZmFsc2UgaWYgbm90IA0KLSAgICAgKi8NCi0gICAgYm9vbGVhbiBpbml0aWFsaXplKFN0cmluZyBjZmdQcmVmaXgsIFN0cmluZyB0eXBlS2V5LCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlc2V0IGFsbCBpbnRlcm5hbCBkYXRhIHRvIGdldCByZWFkeSBmb3IgYSBuZXcgcGFyc2luZyBwcm9jZXNzIA0KLSAgICAgKi8NCi0gICAgdm9pZCByZXNldCgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIHJldHVybiB0aGUgQ01JUyB0eXBlIGlkIHVzZWQgZm9yIHRoaXMgbWFwcGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgICBDTUlTIHR5cGUgaWQgdG8gbWFwIHRoaXMgY29udGVudCB0eXBlIHRvIG9yIG51bGwgaWYgbm90IG1hcHBhYmxlDQotICAgICAqLw0KLSAgICBTdHJpbmcgZ2V0TWFwcGVkVHlwZUlkKCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogcmV0dXJuIHRoZSBDTUlTIHByb3BlcnR5IGlkIGZvciBhIGZvdW5kIHRhZyBpbiBhIGZpbGUNCi0gICAgICogQHBhcmFtIGtleQ0KLSAgICAgKiAgICAgIHRhZyAodXN1YWxseSBwYXJzZWQgZnJvbSBUaWthKSBmb3VuZCBpbiBmaWxlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgICBDTUlTIHByb3BlcnR5IHRoaXMgdGFnIGdldHMgbWFwcGVkIHRvLCBudWxsIGlmIG5vdCBtYXBwZWQNCi0gICAgICovDQotICAgIFN0cmluZyBnZXRNYXBwZWRQcm9wZXJ0eUlkKFN0cmluZyBrZXkpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnZlcnQgYSB2YWx1ZSBwYXJzZWQgZnJvbSB0aGUgZmlsZSB0byB0aGUgdHlwZSB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBleHBlY3RzDQotICAgICAqIEBwYXJhbSBpZA0KLSAgICAgKiAgICAgIENNSVMgcHJvcGVydHkgaWQNCi0gICAgICogQHBhcmFtIHByb3BlcnR5VHlwZQ0KLSAgICAgKiAgICAgIHByb3BlcnR5IHR5cGUgZnJvbSB0eXBlIGRlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHN0clZhbHVlDQotICAgICAqICAgICAgdmFsdWUgcmVhZCBmcm9tIGZpbGUgKFRpa2EgYWx3YXlzIGdpdmVzIGEgc3RyaW5nKQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICAgY29udmVydGVkIHZhbHVlIGNvbmZvcm1pbmcgdG8gdGhlIG1hcHBlZCBwcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgT2JqZWN0IGNvbnZlcnRWYWx1ZShTdHJpbmcgaWQsIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmLCBTdHJpbmcgc3RyVmFsdWUpOw0KLQ0KLSAgICAvKioNCi0gICAgICogZ2V0IGFsbCBjb250ZW50IHR5cGVzIGhhbmRsZWQgYnkgdGhpcyBwYXJzZXINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgIGFycmF5IHdpdGggY29udGVudCB0eXBlcw0KLSAgICAgKi8NCi0gICAgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVzKCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvbWFwcGVyL1Byb3BlcnR5TWFwcGVyRXhpZi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvUHJvcGVydHlNYXBwZXJFeGlmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzJkYWMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvUHJvcGVydHlNYXBwZXJFeGlmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1hcHBlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgY29tLmRyZXcuaW1hZ2luZy5QaG90b2dyYXBoaWNDb252ZXJzaW9uczsKLWltcG9ydCBjb20uZHJldy5sYW5nLlJhdGlvbmFsOwotaW1wb3J0IGNvbS5kcmV3Lm1ldGFkYXRhLkRpcmVjdG9yeTsKLWltcG9ydCBjb20uZHJldy5tZXRhZGF0YS5UYWc7Ci1pbXBvcnQgY29tLmRyZXcubWV0YWRhdGEuZXhpZi5FeGlmRGlyZWN0b3J5OwotaW1wb3J0IGNvbS5kcmV3Lm1ldGFkYXRhLmV4aWYuR3BzRGlyZWN0b3J5OwotaW1wb3J0IGNvbS5kcmV3Lm1ldGFkYXRhLmpwZWcuSnBlZ0RpcmVjdG9yeTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5TWFwcGVyRXhpZiBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlNYXBwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFQ1NfUEVSX0hPVVIgPSAzNjAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRUNTX1BFUl9NSU5VVEUgPSA2MDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvcGVydHlNYXBwZXJFeGlmLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYSUZfREFURV9GT1JNQVQgPSAieXl5eTpNTTpkZCBISDptbTpzcyI7Ci0KLSAgICAvKiB0YWcgdG8gcHJvcGVydHkgaWQgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcE1hcEV4aWYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAvKiB0YWcgdG8gcHJvcGVydHkgaWQgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcE1hcEdwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgIC8qIHRhZyB0byBwcm9wZXJ0eSBpZCAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wTWFwSnBlZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcE1hcDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGluaXRpYWxpemUoU3RyaW5nIGNmZ1ByZWZpeCwgU3RyaW5nIHR5cGVLZXksIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBzdXBlci5pbml0aWFsaXplKGNmZ1ByZWZpeCwgdHlwZUtleSwgcHJvcGVydGllcyk7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIGRhdGVGb3JtYXQgPSBFWElGX0RBVEVfRk9STUFUOwotICAgICAgICBidWlsZElkTWFwKCJleGlmIiwgcHJvcE1hcEV4aWYsIHByb3BlcnRpZXMpOwotICAgICAgICBidWlsZElkTWFwKCJncHMiLCBwcm9wTWFwR3BzLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgYnVpbGRJZE1hcCgianBlZyIsIHByb3BNYXBKcGVnLCBwcm9wZXJ0aWVzKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgcHJvcE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE1hcHBlZFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZElkTWFwKFN0cmluZyBkaXJLZXksIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcE1hcCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFNldDxTdHJpbmc+IGtleXMgPSBwcm9wZXJ0aWVzLnN0cmluZ1Byb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHByb3BQcmVmaXggKyAiLiIgKyBkaXJLZXkgKyAiLmlkLiI7Ci0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0ga2V5LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbWlzUHJvcElkID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGNtaXNQcm9wSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBrZXkgIiArIGtleSArICIgbXVzdCBoYXZlIGEgdmFsdWUgYXNzaWduZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY21pc1Byb3BJZCA9IGNtaXNQcm9wSWQudHJpbSgpOwotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgbWFwcGluZyBmb3IgdHlwZSAiICsgZGlyS2V5ICsgIiB3aXRoICIgKyBpZCArICIgdG8gIiArIGNtaXNQcm9wSWQpOwotICAgICAgICAgICAgICAgIHByb3BNYXAucHV0KGlkLCBjbWlzUHJvcElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkVHlwZUlkKFN0cmluZyBtaW1lVHlwZSkgewotICAgICAgICByZXR1cm4gY21pc1R5cGVJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlZFByb3BlcnR5SWQoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnRWYWx1ZShTdHJpbmcgaWQsIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmLCBTdHJpbmcgc3RyVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0SGV4U3RyaW5nKGludCB0YWdUeXBlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBoZXhTdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGhleFN0ci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyh0YWdUeXBlKSk7Ci0gICAgICAgIHdoaWxlIChoZXhTdHIubGVuZ3RoKCkgPCA0KSB7Ci0gICAgICAgICAgICBoZXhTdHIuaW5zZXJ0KDAsICIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgaGV4U3RyLmluc2VydCgwLCAiMHgiKTsKLSAgICAgICAgcmV0dXJuIGhleFN0ci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHN0b3JlIHRoZSBwcm9wZXJ0eSBpZCBtYXBwZWQgdG8gdGhpcyB0YWcgaW4gYSBKUEVHIGZpbGUgaW4gYSBsb2NhbCBtYXAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGlyCi0gICAgICogICAgICAgICAgICBkaXJlY3Rvcnkgb2YgdGFnCi0gICAgICogQHBhcmFtIHRhZwotICAgICAqICAgICAgICAgICAgdGFnCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBtYXBUYWdBbmRDb252ZXJ0KERpcmVjdG9yeSBkaXIsIFRhZyB0YWcsIFR5cGVEZWZpbml0aW9uIHRkKSB7Ci0gICAgICAgIFN0cmluZyBwcm9wSWQgPSBudWxsOwotICAgICAgICBTdHJpbmcgaGV4U3RyID0gZ2V0SGV4U3RyaW5nKHRhZy5nZXRUYWdUeXBlKCkpOwotCi0gICAgICAgIGlmIChHcHNEaXJlY3RvcnkuY2xhc3MuZXF1YWxzKGRpci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgcHJvcElkID0gcHJvcE1hcEdwcy5nZXQoaGV4U3RyKTsKLSAgICAgICAgfSBlbHNlIGlmIChFeGlmRGlyZWN0b3J5LmNsYXNzLmVxdWFscyhkaXIuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHByb3BJZCA9IHByb3BNYXBFeGlmLmdldChoZXhTdHIpOwotICAgICAgICB9IGVsc2UgaWYgKEpwZWdEaXJlY3RvcnkuY2xhc3MuZXF1YWxzKGRpci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgcHJvcElkID0gcHJvcE1hcEpwZWcuZ2V0KGhleFN0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9wSWQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gcHJvcElkKSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB0ZCkgewotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwZCA9IHRkLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcElkKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBwZCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJVbmtub3duIHByb3BlcnR5IGlkICIgKyBwcm9wSWQgKyAiIGluIHR5cGUgZGVmaW5pdGlvbiAiICsgdGQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZSBwdCA9IHBkLmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgICAgIE9iamVjdCBjb252VmFsdWUgPSBjb252ZXJ0VmFsdWUoZGlyLCB0YWcsIHB0KTsKLSAgICAgICAgICAgICAgICBwcm9wTWFwLnB1dChwcm9wSWQsIGNvbnZWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG9taXQgY29udmVyc2lvbiBpZiBubyB0eXBlIGRlZmluaXRpb24gaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgcHJvcE1hcC5wdXQocHJvcElkLCBkaXIuZ2V0T2JqZWN0KHRhZy5nZXRUYWdUeXBlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgY29udmVydFZhbHVlKERpcmVjdG9yeSBkaXIsIFRhZyB0YWcsIFByb3BlcnR5VHlwZSBwcm9wVHlwZSkgewotCi0gICAgICAgIE9iamVjdCByZXMgPSBudWxsOwotICAgICAgICBTdHJpbmcgaGV4U3RyID0gZ2V0SGV4U3RyaW5nKHRhZy5nZXRUYWdUeXBlKCkpOwotCi0gICAgICAgIC8vIEhhbmRsZSBhbGwgdGFncyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIGRpcmVjdG9yeSBzcGVjaWZpY3MKLSAgICAgICAgaWYgKEdwc0RpcmVjdG9yeS5jbGFzcy5lcXVhbHMoZGlyLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgdGhvc2UgdGFncyB0aGF0IG5lZWQgc3BlY2lhbCBjb25zaWRlcmF0aW9uOgotICAgICAgICAgICAgaWYgKEdwc0RpcmVjdG9yeS5UQUdfR1BTX0xPTkdJVFVERSA9PSB0YWcuZ2V0VGFnVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlZiA9IGRpci5nZXRPYmplY3QoR3BzRGlyZWN0b3J5LlRBR19HUFNfTE9OR0lUVURFX1JFRik7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBtdXN0SW52ID0gcmVmICE9IG51bGwgJiYgcmVmLmVxdWFscygiVyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0R3BzKHRhZywgZGlyLCBtdXN0SW52KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoR3BzRGlyZWN0b3J5LlRBR19HUFNfTEFUSVRVREUgPT0gdGFnLmdldFRhZ1R5cGUoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCByZWYgPSBkaXIuZ2V0T2JqZWN0KEdwc0RpcmVjdG9yeS5UQUdfR1BTX0xPTkdJVFVERV9SRUYpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gbXVzdEludiA9IHJlZiAhPSBudWxsICYmIHJlZi5lcXVhbHMoIlMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydEdwcyh0YWcsIGRpciwgbXVzdEludik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wSWQgPSBwcm9wTWFwR3BzLmdldChoZXhTdHIpOwotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgR1BTIHRhZyAnIiArIHRhZyArICJcJywgcHJvcGVydHkgbWFwcGVkIGlzOiAiICsgcHJvcElkKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmluZm8oIklnbm9yaW5nIEVYSUYgdGFnICciICsgdGFnICsgIlwnIG5vIHByb3BlcnR5IG1hcHBlZCB0byB0aGlzIHRhZy4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYW5kIGlzIGEgY29uZmlndXJhdGlvbiBlcnJvcjogd2UgaGF2ZSBhCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGlkIGJ1dCBubyB0eXBlCi0gICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiSWdub3JpbmcgRVhJRiB0YWcgJyIgKyB0YWcgKyAiXCcgbm8gcHJvcGVydHkgdHlwZSBtYXBwZWQgdG8gdGhpcyB0YWcuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE9iamVjdCBzcmMgPSBkaXIuZ2V0T2JqZWN0KHRhZy5nZXRUYWdUeXBlKCkpOwotICAgICAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gc3JjLmdldENsYXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXp6LmVxdWFscyhSYXRpb25hbC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGEgQ01JUyBkZWNpbWFsIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuREVDSU1BTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiVGFnIHZhbHVlIGhhcyB0eXBlIFJhdGlvbmFsIGFuZCBleHBlY3RlZCBDTUlTIERlY2ltYWwsIGJ1dCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BUeXBlICsgIiBmb3IgdGFnOiAiICsgdGFnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCA9ICgoUmF0aW9uYWwpIHNyYykuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsYXp6LmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuU1RSSU5HICYmIHByb3BUeXBlICE9IFByb3BlcnR5VHlwZS5JRCAmJiBwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuVVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcHJvcFR5cGUgIT0gUHJvcGVydHlUeXBlLkhUTUwgJiYgcHJvcFR5cGUgIT0gUHJvcGVydHlUeXBlLkRBVEVUSU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJUYWcgdmFsdWUgaGFzIHR5cGUgU3RyaW5nIGFuZCBleHBlY3RlZCBDTUlTIFN0cmluZywgYnV0IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcFR5cGUgKyAiIGZvciB0YWc6ICIgKyB0YWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gKChTdHJpbmcpIHNyYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcyA9IHM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoRXhpZkRpcmVjdG9yeS5jbGFzcy5lcXVhbHMoZGlyLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAvLyBpcyB0aGVyZSBhIHByb3BlcnR5IG1hcHBlZCB0byB0aGlzIHRhZz8KLSAgICAgICAgICAgIFN0cmluZyBwcm9wSWQgPSBwcm9wTWFwRXhpZi5nZXQoaGV4U3RyKTsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgRVhJRiB0YWcgJyIgKyB0YWcgKyAiXCcsIHByb3BlcnR5IG1hcHBlZCBpczogIiArIHByb3BJZCk7Ci0KLSAgICAgICAgICAgIGlmIChudWxsID09IHByb3BJZCkgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiSWdub3JpbmcgRVhJRiB0YWcgJyIgKyB0YWcgKyAiXCcgbm8gcHJvcGVydHkgbWFwcGVkIHRvIHRoaXMgdGFnLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYW5kIGlzIGEgY29uZmlndXJhdGlvbiBlcnJvcjogd2UgaGF2ZSBhCi0gICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgaWQgYnV0IG5vIHR5cGUKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIklnbm9yaW5nIEVYSUYgdGFnICciICsgdGFnICsgIlwnIG5vIHByb3BlcnR5IHR5cGUgbWFwcGVkIHRvIHRoaXMgdGFnLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgc3JjID0gZGlyLmdldE9iamVjdCh0YWcuZ2V0VGFnVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHNyYy5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhcnJheXMgYW5kIG1hcCB0aGVtIHRvIG11bHRpLXZhbHVlIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICBpZiAoY2xhenouaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiRm91bmQgYSBtdWx0aS12YWx1ZSB0YWcgIiArIHRhZyArICI6IG11bHRpIHZhbHVlIG5vdCBpbXBsZW1lbnRlZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXp6LmVxdWFscyhSYXRpb25hbC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGEgQ01JUyBkZWNpbWFsIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuREVDSU1BTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiVGFnIHZhbHVlIGhhcyB0eXBlIFJhdGlvbmFsIGFuZCBleHBlY3RlZCBDTUlTIERlY2ltYWwsIGJ1dCBmb3VuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb3BUeXBlICsgIiBmb3IgdGFnOiAiICsgdGFnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YWcuZ2V0VGFnVHlwZSgpID09IEV4aWZEaXJlY3RvcnkuVEFHX1NIVVRURVJfU1BFRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcsIHNlZSBUaWthIGltcGwuCi0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYXBleFZhbHVlID0gKChSYXRpb25hbCkgc3JjKS5kb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gUGhvdG9ncmFwaGljQ29udmVyc2lvbnMuc2h1dHRlclNwZWVkVG9FeHBvc3VyZVRpbWUoYXBleFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcuZ2V0VGFnVHlwZSgpID09IChFeGlmRGlyZWN0b3J5LlRBR19BUEVSVFVSRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhcGVydHVyZSA9ICgoUmF0aW9uYWwpIHNyYykuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmU3RvcCA9IFBob3RvZ3JhcGhpY0NvbnZlcnNpb25zLmFwZXJ0dXJlVG9GU3RvcChhcGVydHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBmU3RvcDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYSBkb3VibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gKChSYXRpb25hbCkgc3JjKS5kb3VibGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenouZXF1YWxzKEludGVnZXIuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuSU5URUdFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiVGFnIHZhbHVlIGhhcyB0eXBlIEludGVnZXIgYW5kIGV4cGVjdGVkIENNSVMgSW50ZWdlciwgYnV0IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcFR5cGUgKyAiIGZvciB0YWc6ICIgKyB0YWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYSBsb25nCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgbCA9ICgoSW50ZWdlcikgc3JjKS5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsYXp6LmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuU1RSSU5HICYmIHByb3BUeXBlICE9IFByb3BlcnR5VHlwZS5JRCAmJiBwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuVVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcHJvcFR5cGUgIT0gUHJvcGVydHlUeXBlLkhUTUwgJiYgcHJvcFR5cGUgIT0gUHJvcGVydHlUeXBlLkRBVEVUSU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJUYWcgdmFsdWUgaGFzIHR5cGUgU3RyaW5nIGFuZCBleHBlY3RlZCBDTUlTIFN0cmluZywgYnV0IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcFR5cGUgKyAiIGZvciB0YWc6ICIgKyB0YWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBhIFN0cmluZwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcFR5cGUgPT0gUHJvcGVydHlUeXBlLkRBVEVUSU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSBmb3JtYXQ6IDIwMTI6MDI6MjUgMTY6MjM6MTYKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGVGb3JtYXQgZm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoZGF0ZUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUgZGF0ZSA9IGZvcm1hdHRlci5wYXJzZSgoU3RyaW5nKSBzcmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZGF0ZSB0byBHcmVvZ29yaWFuQ2FsZW5kYXIgYXMgQ01JUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWwuc2V0VGltZShkYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgZGF0ZSBmb3JtYXQgaW4gRVhJRiBkYXRlIHRhZzogIiArIHNyYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciB0YWc6ICIgKyB0YWcgKyAiIGV4cGVjdGVkOiB5eXl5Ok1NOmRkIEhIOm1tOnNzIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBjYWw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICgoU3RyaW5nKSBzcmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenouZXF1YWxzKERhdGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuREFURVRJTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIlRhZyB2YWx1ZSBoYXMgdHlwZSBEYXRlIGFuZCBleHBlY3RlZCBDTUlTIERhdGVUaW1lLCBidXQgZm91bmQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wVHlwZSArICIgZm9yIHRhZzogIiArIHRhZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBhIFN0cmluZwotICAgICAgICAgICAgICAgICAgICBEYXRlIGRhdGUgPSAoKERhdGUpIHNyYyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZGF0ZSB0byBHcmVvZ29yaWFuQ2FsZW5kYXIgYXMgQ01JUyBleHBlY3RzCi0gICAgICAgICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgICAgICAgICBjYWwuc2V0VGltZShkYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gY2FsOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhenouZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVHlwZSAhPSBQcm9wZXJ0eVR5cGUuQk9PTEVBTikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiVGFnIHZhbHVlIGhhcyB0eXBlIEJvb2xlYW4gYW5kIGV4cGVjdGVkIENNSVMgQm9vbGVhbiwgYnV0IGZvdW5kOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvcFR5cGUgKyAiIGZvciB0YWc6ICIgKyB0YWcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYSBTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBiID0gKChCb29sZWFuKSBzcmMpOwotICAgICAgICAgICAgICAgICAgICByZXMgPSBiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiVGFnIHZhbHVlIGhhcyB1bnN1cHBvcnRlZCB0eXBlOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBmb3IgRVhJRiB0YWc6ICIgKyB0YWcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChKcGVnRGlyZWN0b3J5LmNsYXNzLmVxdWFscyhkaXIuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgcHJvcGVydHkgbWFwcGVkIHRvIHRoaXMgdGFnPwotICAgICAgICAgICAgU3RyaW5nIHByb3BJZCA9IHByb3BNYXBKcGVnLmdldChoZXhTdHIpOwotICAgICAgICAgICAgTE9HLmRlYnVnKCJGb3VuZCBKUEVHIHRhZyAnIiArIHRhZyArICJcJywgcHJvcGVydHkgbWFwcGVkIGlzOiAiICsgcHJvcElkKTsKLQotICAgICAgICAgICAgaWYgKG51bGwgPT0gcHJvcElkKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmluZm8oIklnbm9yaW5nIEpQRUcgdGFnICciICsgdGFnICsgIlwnIG5vIHByb3BlcnR5IG1hcHBlZCB0byB0aGlzIHRhZy4iKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIGFuZCBpcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3I6IHdlIGhhdmUgYQotICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGlkIGJ1dCBubyB0eXBlCi0gICAgICAgICAgICAgICAgTE9HLmVycm9yKCJJZ25vcmluZyBKUEVHIHRhZyAnIiArIHRhZyArICJcJyBubyBwcm9wZXJ0eSB0eXBlIG1hcHBlZCB0byB0aGlzIHRhZy4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNyYyA9IGRpci5nZXRPYmplY3QodGFnLmdldFRhZ1R5cGUoKSk7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBzcmMuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjbGF6ei5lcXVhbHMoSW50ZWdlci5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BUeXBlICE9IFByb3BlcnR5VHlwZS5JTlRFR0VSKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJUYWcgdmFsdWUgaGFzIHR5cGUgSW50ZWdlciBhbmQgZXhwZWN0ZWQgQ01JUyBJbnRlZ2VyLCBidXQgZm91bmQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wVHlwZSArICIgZm9yIHRhZzogIiArIHRhZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBhIGxvbmcKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBsID0gKChJbnRlZ2VyKSBzcmMpLmxvbmdWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXMgPSBsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiVGFnIHZhbHVlIGhhcyB1bnN1cHBvcnRlZCB0eXBlOiAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBmb3IgSlBFRyB0YWc6ICIgKyB0YWcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNvbnZlcnRHcHMoVGFnIHRhZywgRGlyZWN0b3J5IGRpciwgYm9vbGVhbiBtdXN0SW52ZXJ0KSB7Ci0gICAgICAgIERvdWJsZSByZXMgPSBudWxsOwotICAgICAgICBPYmplY3Qgc3JjID0gZGlyLmdldE9iamVjdCh0YWcuZ2V0VGFnVHlwZSgpKTsKLQotICAgICAgICBDbGFzczw/PiBzdHJpbmdBcnJheUNsYXNzID0gc3JjLmdldENsYXNzKCk7Ci0gICAgICAgIENsYXNzPD8+IHN0cmluZ0FycmF5Q29tcG9uZW50VHlwZSA9IHN0cmluZ0FycmF5Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICBpZiAoIXN0cmluZ0FycmF5Q2xhc3MuaXNBcnJheSgpIHx8IG51bGwgPT0gc3RyaW5nQXJyYXlDb21wb25lbnRUeXBlIHx8IEFycmF5LmdldExlbmd0aChzcmMpICE9IDMpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIkdQUyBjb29yZGluYXRlIFwiIiArIHRhZyArICJcIiBoYXMgdW5rbm93biB0eXBlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyaW5nQXJyYXlDb21wb25lbnRUeXBlLmVxdWFscyhSYXRpb25hbC5jbGFzcykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIkdQUyBjb29yZGluYXRlIFwiIiArIHRhZwotICAgICAgICAgICAgICAgICAgICArICJcIiBoYXMgdW5rbm93biBjb21wb25lbnQgdHlwZSAoZXhwZWN0ZWQgUmF0aW9uYWwsIGZvdW5kOiAiICsgc3RyaW5nQXJyYXlDb21wb25lbnRUeXBlLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG8gY29udmVyc2lvbgotICAgICAgICBSYXRpb25hbFtdIGNvbXBvbmVudHM7Ci0gICAgICAgIGNvbXBvbmVudHMgPSAoUmF0aW9uYWxbXSkgc3JjOwotICAgICAgICBpbnQgZGVnID0gY29tcG9uZW50c1swXS5pbnRWYWx1ZSgpOwotICAgICAgICBkb3VibGUgbWluID0gY29tcG9uZW50c1sxXS5kb3VibGVWYWx1ZSgpOwotICAgICAgICBkb3VibGUgc2VjID0gY29tcG9uZW50c1syXS5kb3VibGVWYWx1ZSgpOwotICAgICAgICBEb3VibGUgZCA9IChkZWcgKyBtaW4gLyBTRUNTX1BFUl9NSU5VVEUgKyBzZWMgLyBTRUNTX1BFUl9IT1VSKTsKLSAgICAgICAgaWYgKGQgPiAwLjAgJiYgbXVzdEludmVydCkgewotICAgICAgICAgICAgZCA9IC1kOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IGQ7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9tYXBwZXIvUHJvcGVydHlNYXBwZXJUaWthLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL21hcHBlci9Qcm9wZXJ0eU1hcHBlclRpa2EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NjBkNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL21hcHBlci9Qcm9wZXJ0eU1hcHBlclRpa2EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyOwotCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5Qcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5TWFwcGVyVGlrYSBleHRlbmRzIEFic3RyYWN0UHJvcGVydHlNYXBwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb3BlcnR5TWFwcGVyVGlrYS5jbGFzcy5nZXROYW1lKCkpOwotICAgIAotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wTWFwVGFncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiAoKTsgLy8gdGFnIHRvIHByb3BlcnR5IGlkCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHRva2VuaXplck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiAoKTsgLy8gdGFnIHRvIHRva2VuaXplciByZWdleHAKLQotICAgIHB1YmxpYyBQcm9wZXJ0eU1hcHBlclRpa2EoKSB7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGluaXRpYWxpemUoU3RyaW5nIGNmZ1ByZWZpeCwgU3RyaW5nIHR5cGVLZXksIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBzdXBlci5pbml0aWFsaXplKGNmZ1ByZWZpeCwgdHlwZUtleSwgcHJvcGVydGllcyk7Ci0gICAgICAgIGJ1aWxkSWRNYXAodHlwZUtleSwgcHJvcGVydGllcyk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkUHJvcGVydHlJZChTdHJpbmcga2V5KSB7Ci0gICAgICAgIFN0cmluZyBwcm9wSWQgPSBwcm9wTWFwVGFncy5nZXQoa2V5KTsKLSAgICAgICAgcmV0dXJuIHByb3BJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnRWYWx1ZShTdHJpbmcga2V5LCBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiwgU3RyaW5nIHN0clZhbHVlUGFyYW0pIHsKLSAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gc3RyVmFsdWVQYXJhbTsgCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIFByb3BlcnR5VHlwZSBwdCA9IHByb3BEZWYuZ2V0UHJvcGVydHlUeXBlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobnVsbCA9PSBwdCkgewotICAgICAgICAgICAgdmFsdWUgPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKG51bGwgIT0gc3RyVmFsdWUgJiYgc3RyVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBUaWthIGhhcyBhIGJ1ZyBhbmQgc29tZXRpbWVzIGZhaWxzIHRvIHBhcnNlIE1QMyB0YWdzLCB0aGVuIGdlbmVyYXRlcyAnXDAnIGluIFN0cmluZwotICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVElLQS04ODcKLSAgICAgICAgICAgIGludCBsYXN0SWxsZWdhbFBvcyA9IC0xOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHN0clZhbHVlLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgaW50IGMgPSBzdHJWYWx1ZS5jb2RlUG9pbnRBdChpKTsKLSAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0lTT0NvbnRyb2woYykpIHsKLSAgICAgICAgICAgICAgICBsYXN0SWxsZWdhbFBvcyA9IGk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGFzdElsbGVnYWxQb3MgPj0gMCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyVmFsdWUgPSBzdHJWYWx1ZS5zdWJzdHJpbmcobGFzdElsbGVnYWxQb3MrMSk7IC8vIHVzZSByZW1haW5pbmcgcGFydCBhZnRlciBpbGxlZ2FsIGNoYXIKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChwdCkgewotICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICBjYXNlIEhUTUw6Ci0gICAgICAgICAgICBjYXNlIFVSSToKLSAgICAgICAgICAgIGNhc2UgSUQ6Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHByb3BEZWYuZ2V0Q2FyZGluYWxpdHkoKSA9PSBDYXJkaW5hbGl0eS5TSU5HTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJWYWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5pemVyID0gdG9rZW5pemVyTWFwLmNvbnRhaW5zS2V5KGtleSkgPyB0b2tlbml6ZXJNYXAuZ2V0KGtleSkgOiAiXFxXIjsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gc3RyVmFsdWUuc3BsaXQodG9rZW5pemVyKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsTGlzdC5hZGQocy50cmltKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsTGlzdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BEZWYuZ2V0Q2FyZGluYWxpdHkoKSA9PSBDYXJkaW5hbGl0eS5TSU5HTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2Yoc3RyVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5pemVyID0gdG9rZW5pemVyTWFwLmNvbnRhaW5zS2V5KGtleSkgPyB0b2tlbml6ZXJNYXAuZ2V0KGtleSkgOiAiXFxXIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHN0clZhbHVlLnNwbGl0KHRva2VuaXplcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEludGVnZXI+IHZhbExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsTGlzdC5hZGQoSW50ZWdlci52YWx1ZU9mKHMudHJpbSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbExpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgICAgICBpZiAocHJvcERlZi5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5LlNJTkdMRSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKHN0clZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9rZW5pemVyID0gdG9rZW5pemVyTWFwLmNvbnRhaW5zS2V5KGtleSkgPyB0b2tlbml6ZXJNYXAuZ2V0KGtleSkgOiAiW1xcczs6XSI7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHN0clZhbHVlLnNwbGl0KHRva2VuaXplcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PERvdWJsZT4gdmFsTGlzdCA9IG5ldyBBcnJheUxpc3Q8RG91YmxlPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbExpc3QuYWRkKERvdWJsZS52YWx1ZU9mKHMudHJpbSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbExpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgREFURVRJTUU6Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChkYXRlRm9ybWF0LCBuZXcgRGF0ZUZvcm1hdFN5bWJvbHMoTG9jYWxlLlVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wRGVmLmdldENhcmRpbmFsaXR5KCkgPT0gQ2FyZGluYWxpdHkuU0lOR0xFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGRhdGUgPSBzZGYucGFyc2Uoc3RyVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWwuc2V0VGltZShkYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbml6ZXIgPSB0b2tlbml6ZXJNYXAuY29udGFpbnNLZXkoa2V5KSA/IHRva2VuaXplck1hcC5nZXQoa2V5KSA6ICJbOyw6XSI7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBzdHJWYWx1ZS5zcGxpdCh0b2tlbml6ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxHcmVnb3JpYW5DYWxlbmRhcj4gdmFsTGlzdCA9IG5ldyBBcnJheUxpc3Q8R3JlZ29yaWFuQ2FsZW5kYXI+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZSBkYXRlID0gc2RmLnBhcnNlKHMudHJpbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWwuc2V0VGltZShkYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxMaXN0LmFkZChjYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWxMaXN0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBkYXRlOiAiICsgc3RyVmFsdWUgKyAiIChjaGVjayBkYXRlIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigidW5rbm93biBwcm9wZXJ0eSB0eXBlICIgKyBwdCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICAKLSAgICB2b2lkIGJ1aWxkSWRNYXAoU3RyaW5nIHR5cGVLZXksIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlzID0gcHJvcGVydGllcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCk7IAotICAgICAgICBTdHJpbmcgcHJlZml4ID0gcHJvcFByZWZpeCArICIuaWQuIjsKLSAgICAgICAgU3RyaW5nIHRva2VuaXplclByZWZpeCA9IHByb3BQcmVmaXggKyAiLnRva2VuaXplci4iOwotCi0gICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0ga2V5LnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbWlzUHJvcElkID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGNtaXNQcm9wSWQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBlckV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBrZXkgIiArIGtleSArICIgbXVzdCBoYXZlIGEgdmFsdWUgYXNzaWduZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY21pc1Byb3BJZCA9IGNtaXNQcm9wSWQudHJpbSgpOwotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgbWFwcGluZyBmb3IgdHlwZSAiICsgdHlwZUtleSArICIgd2l0aCAiICsgaWQgKyAiIHRvICIgKyBjbWlzUHJvcElkKTsKLSAgICAgICAgICAgICAgICBwcm9wTWFwVGFncy5wdXQoaWQsICBjbWlzUHJvcElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh0b2tlbml6ZXJQcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0ga2V5LnN1YnN0cmluZyh0b2tlbml6ZXJQcmVmaXgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZWdleCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSByZWdleCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIGtleSAiICsga2V5ICsgIiBtdXN0IGhhdmUgYSB2YWx1ZSBhc3NpZ25lZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWdleCA9IHJlZ2V4LnRyaW0oKTsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkZvdW5kIHRva2VuaXplciBtYXBwaW5nIGZvciBwcm9wZXJ0eSAiICsgaWQgKyAiIHRvICIgKyByZWdleCk7Ci0gICAgICAgICAgICAgICAgdG9rZW5pemVyTWFwLnB1dChpZCwgcmVnZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGludCBnZXRTaXplKCkgewotICAgICAgICByZXR1cm4gcHJvcE1hcFRhZ3Muc2l6ZSgpOwotICAgIH0KLSAgICAKLSB9CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL3BhcnNlci9BYnN0cmFjdE1ldGFkYXRhUGFyc2VyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL3BhcnNlci9BYnN0cmFjdE1ldGFkYXRhUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YjM4NWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9wYXJzZXIvQWJzdHJhY3RNZXRhZGF0YVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1hcHBlci5NYXBwZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyLlByb3BlcnR5TWFwcGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRhZGF0YVBhcnNlciBpbXBsZW1lbnRzIE1ldGFkYXRhUGFyc2VyIHsKLSAgICAKLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBjbWlzUHJvcGVydGllczsKLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlNYXBwZXIgbWFwcGVyID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RNZXRhZGF0YVBhcnNlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFByb3BlcnR5TWFwcGVyIG1hcHBlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyOwotICAgICAgICByZXNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENtaXNQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gY21pc1Byb3BlcnRpZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBTdHJpbmcgdHlwZUlkID0gbWFwcGVyLmdldE1hcHBlZFR5cGVJZCgpOwotICAgICAgICBjbWlzUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBtYXBwZXIucmVzZXQoKTsKLQotICAgICAgICBpZiAobnVsbCA9PSB0eXBlSWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZXJFeGNlcHRpb24oIk5vIENNSVMgVHlwZSBjb25maWd1cmVkIGluIHRoaXMgcGFyc2VyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNtaXNQcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlci5nZXRDb250ZW50VHlwZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXBwZWRUeXBlSWQoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZXIuZ2V0TWFwcGVkVHlwZUlkKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQcm9wZXJ0eU1hcHBlciBnZXRNYXBwZXIoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9wYXJzZXIvTWV0YWRhdGFQYXJzZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvcGFyc2VyL01ldGFkYXRhUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDZlOWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9wYXJzZXIvTWV0YWRhdGFQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5tYXBwZXIuTWFwcGVyRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5tYXBwZXIuUHJvcGVydHlNYXBwZXI7DQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBleHRyYWN0IG1ldGFkYXRhIGZyb20gY29udGVudC4gQW4gaW5zdGFuY2UgaXMgDQotICogcmVzcG9uc2libGUgdG8gcGFyc2UgdGhlIGNvbnRlbnQgYW5kIGV4dHJhY3QgdGhlIG1ldGFkYXRhLiBUaGUgbWV0YWRhdGENCi0gKiBtdXN0IGJlIHN0b3JlZCBpbiBhIENNSVMgcHJvcGVydHkgYmFnLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBjbGFzcyBhcmUNCi0gKiBjcmVhdGVkIGJ5IHRoZSBDb25maWd1cmF0b3IgZGVwZW5kaW5nIG9uIHRoZSBDb250ZW50LVR5cGUgdG8gcGFyc2UgYW5kDQotICogdGhlIGNvcnJlc3BvbmRpbmcgcGFyc2VyIGNvbmZpZ3VyYXRpb24NCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFkYXRhUGFyc2VyIHsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbml0aWFsaXplIGEgcGFyc2VyIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBtYXBwZXIgYW5kIGEgY29udGVudCB0eXBlDQotICAgICAqIEBwYXJhbSBtYXBwZXINCi0gICAgICogICAgICBQcm9wZXJ0eU1hcHBlciB1c2VkIHRvIG1hcCB0YWdzIHRvIHByb3BlcnRpZXMgYW5kIGNvbnZlcnQgdmFsdWVzDQotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQ0KLSAgICAgKiAgICAgIGNvbnRlbnQgdHlwZSBvZiBmaWxlIHRvIGV4dHJhY3QNCi0gICAgICovDQotICAgIHZvaWQgaW5pdGlhbGl6ZShQcm9wZXJ0eU1hcHBlciBtYXBwZXIsIFN0cmluZyBjb250ZW50VHlwZSk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogZ2V0IHJlYWR5IGZvciBwYXJzaW5nIGEgbmV3IGZpbGUNCi0gICAgICovDQotICAgIHZvaWQgcmVzZXQoKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBQYXJzZSBhIGZpbGUgYW5kIGV4dHJhY3QgYWxsIG1ldGFkYXRhIGFuZCBzdG9yZSB0aGVtIGluIGEgQ01JUyBwcm9wZXJ0eSBiYWcNCi0gICAgICogQHBhcmFtIGYNCi0gICAgICogICAgICBmaWxlIHRvIHBhcnNlDQotICAgICAqIEB0aHJvd3MgTWFwcGVyRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICB2b2lkIGV4dHJhY3RNZXRhZGF0YShGaWxlIGYsIFR5cGVEZWZpbml0aW9uIHRkLCBTZXNzaW9uIHNlc3Npb24pIHRocm93cyBNYXBwZXJFeGNlcHRpb247DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIGFsbCBmb3VuZCBtZXRhZGF0YSwgY2FsbGVkIGFmdGVyIHBhcnNpbmcgaXMgY29tcGxldGVkLg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICAgZXh0cmFjdGVkIENNSVMgcHJvcGVydGllcw0KLSAgICAgKi8NCi0gICAgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDbWlzUHJvcGVydGllcygpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIGdldCBhbGwgY29udGVudCB0eXBlcyBoYW5kbGVkIGJ5IHRoaXMgcGFyc2VyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgICBhcnJheSB3aXRoIGNvbnRlbnQgdHlwZXMNCi0gICAgICovDQotICAgIFN0cmluZ1tdIGdldENvbnRlbnRUeXBlcygpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIGdldCB0aGUgQ01JUyB0eXBlIGlkIHVzZWQgYnkgdGhpcyB0eXBlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgICBDTUlTIHR5cGUgaWQNCi0gICAgICovDQotICAgIFN0cmluZyBnZXRNYXBwZWRUeXBlSWQoKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBnZXQgdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgbWFwcGVyIGZvciB0aGlzIENNSVMgdHlwZQ0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgIHByb3BlcnR5IG1hcHBlcg0KLSAgICAgKi8NCi0gICAgUHJvcGVydHlNYXBwZXIgZ2V0TWFwcGVyKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvcGFyc2VyL01ldGFkYXRhUGFyc2VyRXhpZi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9wYXJzZXIvTWV0YWRhdGFQYXJzZXJFeGlmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWRkMjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9wYXJzZXIvTWV0YWRhdGFQYXJzZXJFeGlmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyLk1hcHBlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5tYXBwZXIuUHJvcGVydHlNYXBwZXJFeGlmOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBjb20uZHJldy5pbWFnaW5nLkltYWdlTWV0YWRhdGFSZWFkZXI7Ci1pbXBvcnQgY29tLmRyZXcuaW1hZ2luZy5JbWFnZVByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgY29tLmRyZXcubWV0YWRhdGEuRGlyZWN0b3J5OwotaW1wb3J0IGNvbS5kcmV3Lm1ldGFkYXRhLlRhZzsKLQotLyoqCi0gKiBBIHBhcnNlciBpbXBsZW1lbnRhdGlvbiB1c2luZyBhIGxvd2VyIGxldmVsIGludGVyZmFjZSB0byBnZXQgbW9yZSBjb250cm9sIGFib3V0IHRoZSAKLSAqIEVYSUYgdGFncyB0aGFuIFRpa2EgcHJvdmlkZXMKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFQYXJzZXJFeGlmIGV4dGVuZHMgQWJzdHJhY3RNZXRhZGF0YVBhcnNlciAgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1ldGFkYXRhUGFyc2VyRXhpZi5jbGFzcy5nZXROYW1lKCkpOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4dHJhY3RNZXRhZGF0YShGaWxlIGYsIFR5cGVEZWZpbml0aW9uIHRkLCBTZXNzaW9uIHNlc3Npb24pIHRocm93cyBNYXBwZXJFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHNlZSAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL21ldGFkYXRhLWV4dHJhY3Rvci93aWtpL0dldHRpbmdTdGFydGVkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb20uZHJldy5tZXRhZGF0YS5NZXRhZGF0YSBtZXRhZGF0YSA9IEltYWdlTWV0YWRhdGFSZWFkZXIucmVhZE1ldGFkYXRhKGYpOwotICAgICAgICAgICAgSXRlcmF0b3I8Pz4gaXQgPSBtZXRhZGF0YS5nZXREaXJlY3RvcnlJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIERpcmVjdG9yeSBkaXJlY3RvcnkgPSAoY29tLmRyZXcubWV0YWRhdGEuRGlyZWN0b3J5KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8Pz4gdGFnSXQgPSBkaXJlY3RvcnkuZ2V0VGFnSXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAodGFnSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhZyB0YWcgPSAoVGFnKSB0YWdJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gZGlyZWN0b3J5LmdldE9iamVjdCh0YWcuZ2V0VGFnVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJUYWc6ICIgKyB0YWcgKyAiLCB2YWx1ZTogIiArIG8gKyAiLCBjbGFzczogIiArIG8uZ2V0Q2xhc3MoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHRhZyB0eXBlOiAiICsgdGFnLmdldFRhZ1R5cGUoKSArICIsIGhleC12YWx1ZTogIiArIHRhZy5nZXRUYWdUeXBlSGV4KCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBjbWlzUHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgKChQcm9wZXJ0eU1hcHBlckV4aWYpbWFwcGVyKS5tYXBUYWdBbmRDb252ZXJ0KGRpcmVjdG9yeSwgdGFnLCB0ZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gKChQcm9wZXJ0eU1hcHBlckV4aWYpbWFwcGVyKS5nZXRNYXBwZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBjbWlzUHJvcGVydGllcy5wdXRBbGwocHJvcHMpOwotICAgICAgICB9IGNhdGNoIChJbWFnZVByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeyAgICAgICAgICAgIAotICAgICAgICAgICAgTE9HLmVycm9yKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy90b29scy9wYXJzZXIvTWV0YWRhdGFQYXJzZXJUaWthLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL3BhcnNlci9NZXRhZGF0YVBhcnNlclRpa2EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliZDVmNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL3BhcnNlci9NZXRhZGF0YVBhcnNlclRpa2EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5tYXBwZXIuTWFwcGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGlrYS5tZXRhZGF0YS5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLnRpa2EucGFyc2VyLkF1dG9EZXRlY3RQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aWthLnBhcnNlci5QYXJzZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aWthLnBhcnNlci5QYXJzZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEEgbWV0YWRhdGEgcGFyc2VyIHVzaW5nIHRoZSBBcGFjaGUgVGlrYSBsaWJyYXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YVBhcnNlclRpa2EgZXh0ZW5kcyBBYnN0cmFjdE1ldGFkYXRhUGFyc2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihNZXRhZGF0YVBhcnNlclRpa2EuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIHB1YmxpYyBNZXRhZGF0YVBhcnNlclRpa2EoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGV4dHJhY3RNZXRhZGF0YShGaWxlIGYsIFR5cGVEZWZpbml0aW9uIHRkLCBTZXNzaW9uIHNlc3Npb24pIHRocm93cyBNYXBwZXJFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IERlZmF1bHRIYW5kbGVyKCk7Ci0gICAgICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3IEF1dG9EZXRlY3RQYXJzZXIoKTsgCi0gICAgICAgICAgICBQYXJzZUNvbnRleHQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShzdHJlYW0sIGhhbmRsZXIsIG1ldGFkYXRhLCBjb250ZXh0KTsKLQotICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbWV0YWRhdGEubmFtZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBtZXRhZGF0YS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkZvdW5kIG1ldGFkYXRhIFwnIiArIGtleSArICJcJzogIiArIHZhbCk7ICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gY21pc1Byb3BlcnRpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5SWQgPSBtYXBwZXIuZ2V0TWFwcGVkUHJvcGVydHlJZChrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wZXJ0eUlkICYmIG51bGwgIT0gdmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmID0gZ2V0TWFwcGVkUHJvcGVydHlEZWZpbml0aW9uKHRkLmdldElkKCksIHByb3BlcnR5SWQsIHNlc3Npb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udlZhbCA9IG1hcHBlci5jb252ZXJ0VmFsdWUocHJvcGVydHlJZCwgcHJvcERlZiwgdmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBjb252VmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtaXNQcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eUlkLCBjb252VmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWlzUHJvcGVydGllcy5wdXQocHJvcGVydHlJZCwgdmFsKTsgLy8gb21pdCBjb252ZXJzaW9uIGlmIG5vIHR5cGUgZGVmaW5pdGlvbiBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJFeHRyYWN0aW5nIG1ldGFkYXRhIGZhaWxlZCBmb3IgZmlsZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBnZXRNYXBwZWRQcm9wZXJ0eURlZmluaXRpb24oU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHByb3BlcnR5SWQsIFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIE1hcHBlckV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0eXBlSWRNb2QgPSB0eXBlSWQ7Ci0gICAgICAgIHdoaWxlIChudWxsICE9IHR5cGVJZE1vZCkgewotICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdGQgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKHR5cGVJZE1vZCk7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiA9IHRkLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcGVydHlJZCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wRGVmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BEZWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlSWRNb2QgPSB0ZC5nZXRQYXJlbnRUeXBlSWQoKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJNYXBwaW5nIGVycm9yOiB1bmtub3duIHByb3BlcnR5ICIrIHByb3BlcnR5SWQgKyAiIGluIHR5cGUgZGVmaW5pdGlvbiAiICsgdHlwZUlkKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIGxpc3RNZXRhZGF0YShGaWxlIGYpIHRocm93cyBNYXBwZXJFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICAgICAgICAgIE1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IERlZmF1bHRIYW5kbGVyKCk7Ci0gICAgICAgICAgICBQYXJzZXIgcGFyc2VyID0gbmV3IEF1dG9EZXRlY3RQYXJzZXIoKTsgCi0gICAgICAgICAgICBQYXJzZUNvbnRleHQgY29udGV4dCA9IG5ldyBQYXJzZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHBhcnNlci5wYXJzZShzdHJlYW0sIGhhbmRsZXIsIG1ldGFkYXRhLCBjb250ZXh0KTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbWV0YWRhdGEubmFtZXMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB2YWwgPSBtZXRhZGF0YS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBMT0cuaW5mbygiRm91bmQgbWV0YWRhdGEgXCciICsga2V5ICsgIlwnOiAiICsgdmFsKTsgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVyRXhjZXB0aW9uKCJFeHRyYWN0aW5nIG1ldGFkYXRhIGZhaWxlZCwgZmlsZSBub3QgZm91bmQ6ICIgKyBmLmdldEFic29sdXRlUGF0aCgpLCBlKTsKLSAgICAgICAgfQotICAgIH0gCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3Rvb2xzL3NwZWNleGFtcGxlcy9TcGVjRXhhbXBsZXMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvc3BlY2V4YW1wbGVzL1NwZWNFeGFtcGxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTk5ZTQwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvc3BlY2V4YW1wbGVzL1NwZWNFeGFtcGxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5zcGVjZXhhbXBsZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuQ21pc0JpbmRpbmdGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbnNEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLk9iamVjdEluRm9sZGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUHJvcGVydHlEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjbFByb3BhZ2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuSW5jbHVkZVJlbGF0aW9uc2hpcHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5WZXJzaW9uaW5nU3RhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNCYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5CaW5kaW5nc09iamVjdEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5DbWlzRXh0ZW5zaW9uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLmRhdGFvYmplY3RzLkNvbnRlbnRTdHJlYW1JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5FeHRlbnNpb25EYXRhSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BY2xTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5EaXNjb3ZlcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5NdWx0aUZpbGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5WZXJzaW9uaW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZWZpbHRlci5XaWxkY2FyZEZpbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNwZWNFeGFtcGxlcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGU0laRSA9IDMyICogMTAyNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfVElNRSA9IDIwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElGSUxFRF9ET0NVTUVOVCA9ICJNdWx0aWZpbGVkRG9jdW1lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSUZJTEVEX0ZPTERFUl8yID0gIk11bHRpZmlsZWRGb2xkZXIyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElGSUxFRF9GT0xERVJfMSA9ICJNdWx0aWZpbGVkRm9sZGVyMSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNwZWNFeGFtcGxlcy5jbGFzcy5nZXROYW1lKCkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9ERVBUSF9BTEwgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUFYX0lURU1TID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNLSVBfQ09VTlQgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUExFVkVMX1RZUEUgPSAiRG9jdW1lbnRUb3BMZXZlbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05FRF9UWVBFID0gIlZlcnNpb25hYmxlVHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05FRF9QUk9QID0gIlZlcnNpb25lZFN0cmluZ1Byb3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ly8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZS5zZXBhcmF0b3I7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pbm1lbW9yeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfVVJMX09BU0lTID0gImh0dHA6Ly93d3cuZXhhbXBsZS5jb206ODA4MC9pbm1lbW9yeSI7IAotICAgICAgLy8gcmVxdWlyZWQgYnkgT0FTSVMgcnVsZXMsIGFkZCB0aGlzIGhvc3QgdG8geW91ciBob3N0cyBmaWxlCi0gICAgCi0gICAgc3RhdGljIGludCBOT19GSUxFU19MT0dHRUQgPSAwOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotICAgIHByaXZhdGUgQmluZGluZ3NPYmplY3RGYWN0b3J5IG9iakZhY3RvcnkgPSBuZXcgQmluZGluZ3NPYmplY3RGYWN0b3J5SW1wbCgpOwotICAgIHByaXZhdGUgQmluZGluZ1R5cGUgYmluZGluZ1R5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcm9vdEZvbGRlcklkOwotICAgIHByaXZhdGUgU3RyaW5nIHJlcG9zaXRvcnlJZDsKLSAgICBwcml2YXRlIE9iamVjdFNlcnZpY2Ugb2JqU3ZjOwotICAgIHByaXZhdGUgTmF2aWdhdGlvblNlcnZpY2UgbmF2U3ZjOwotICAgIHByaXZhdGUgUmVwb3NpdG9yeVNlcnZpY2UgcmVwU3ZjOwotICAgIHByaXZhdGUgVmVyc2lvbmluZ1NlcnZpY2UgdmVyU3ZjOwotICAgIHByaXZhdGUgTXVsdGlGaWxpbmdTZXJ2aWNlIG11bHRpU3ZjOwotICAgIHByaXZhdGUgRGlzY292ZXJ5U2VydmljZSBkaXNjU3ZjOwotICAgIHByaXZhdGUgQWNsU2VydmljZSBhY2xTdmM7Ci0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBpZHNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgU3RyaW5nIG11bHRpRmlsZWREb2M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbXVsdGlGaWxlZEZvbGRlcjI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2hhbmdlVG9rZW47Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVUkxTID0geyBST09UX1VSTCArICIvYXRvbSIsIFJPT1RfVVJMICsgIi9zZXJ2aWNlcyIsIFJPT1RfVVJMICsgIi9icm93c2VyIiB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpbmRpbmdUeXBlW10gQklORElOR1MgPSB7IEJpbmRpbmdUeXBlLkFUT01QVUIsIEJpbmRpbmdUeXBlLldFQlNFUlZJQ0VTLCBCaW5kaW5nVHlwZS5CUk9XU0VSIH07Ci0KLSAgICBwdWJsaWMgU3BlY0V4YW1wbGVzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bkFsbEJpbmRpbmdzKCkgewotICAgICAgICBjbGVhbkxvZ0ZpbHRlckRpcigpOyAvLyBkZWxldGUgZGlyZWN0b3J5IHdoZXJlIExvZ2dpbmcgZmlsdGVyIHdyaXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgbm90IHRvIGluY2x1ZGUgdW53YW50ZWQgZmlsZXMKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJJTkRJTkdTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBiaW5kaW5nVHlwZSA9IEJJTkRJTkdTW2ldOwotICAgICAgICAgICAgaW5pdChVUkxTW2ldLCBCSU5ESU5HU1tpXSk7Ci0gICAgICAgICAgICBydW4oKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZGlyc1tdID0geyBCaW5kaW5nVHlwZS5BVE9NUFVCLnZhbHVlKCksIEJpbmRpbmdUeXBlLldFQlNFUlZJQ0VTLnZhbHVlKCksIEJpbmRpbmdUeXBlLkJST1dTRVIudmFsdWUoKSB9OwotICAgICAgICBjcmVhdGVaaXBGaWxlKCJDTUlTLVNwZWMtRXhhbXBsZXMuemlwIiwgZGlycyk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiR2VuZXJhdGluZyBzcGVjIGV4YW1wbGVzIGZvciBCaW5kaW5nOiAiICsgYmluZGluZ1R5cGUudmFsdWUoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFJlcG9zaXRvcnkgU2VydmljZToKLSAgICAgICAgICAgIGdldFJlcG9zaXRvcmllcygpOwotCi0gICAgICAgICAgICByZXBvc2l0b3J5SWQgPSAiQTEiOwotICAgICAgICAgICAgZ2V0UmVwb3NpdG9yeUluZm8oKTsgLy8gZ2V0IHJvb3QgZm9sZGVyIGlkIGhlcmUhCi0KLSAgICAgICAgICAgIGdldFR5cGVEZWZpbml0aW9uKCJjbWlzOmZvbGRlciIpOwotCi0gICAgICAgICAgICBTdHJpbmcgZG9jSWQgPSBnZXRUZXN0RG9jSWQoKTsKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJJZCA9IGdldFRlc3RGb2xkZXJJZCgpOwotCi0gICAgICAgICAgICBnZXRUeXBlQ2hpbGRyZW4oVE9QTEVWRUxfVFlQRSk7Ci0KLSAgICAgICAgICAgIC8vIE5hdmlnYXRpb24gU2VydmljZToKLSAgICAgICAgICAgIGdldENoaWxkcmVuKGZvbGRlcklkKTsKLSAgICAgICAgICAgIGdldERlc2NlbmRhbnRzKGZvbGRlcklkKTsKLSAgICAgICAgICAgIGdldE9iamVjdFBhcmVudHMoZm9sZGVySWQpOwotICAgICAgICAgICAgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlcigpOwotCi0gICAgICAgICAgICAvLyBPYmplY3QgU2VydmljZToKLSAgICAgICAgICAgIGdldE9iamVjdChkb2NJZCk7Ci0gICAgICAgICAgICBnZXRBY2woZG9jSWQpOwotICAgICAgICAgICAgU3RyaW5nIGlkMSA9IGNyZWF0ZURvY3VtZW50KCJTYW1wbGVEb2N1bWVudCIsIFRPUExFVkVMX1RZUEUsIHJvb3RGb2xkZXJJZCwgVmVyc2lvbmluZ1N0YXRlLk5PTkUpOwotICAgICAgICAgICAgdXBkYXRlUHJvcGVydGllcyhpZDEsIFByb3BlcnR5SWRzLk5BTUUsICJSZW5hbWVkRG9jdW1lbnQiKTsKLSAgICAgICAgICAgIGdldEFsbG93YWJsZUFjdGlvbnMoaWQxKTsKLQotICAgICAgICAgICAgZGVsZXRlT2JqZWN0KGlkMSk7Ci0KLSAgICAgICAgICAgIC8vIERpc2NvdmVyeSBTZXJ2aWNlOgotICAgICAgICAgICAgZG9RdWVyeSgpOwotICAgICAgICAgICAgZ2V0Q29udGVudENoYW5nZXMoY2hhbmdlVG9rZW4pOwotCi0gICAgICAgICAgICAvLyBWZXJzaW9uaW5nIFNlcnZpY2UKLSAgICAgICAgICAgIFN0cmluZyBpZDIgPSBwcmVwYXJlVmVyc2lvblNlcmllcygiVmVyc2lvbmVkRG9jdW1lbnQiLCBWRVJTSU9ORURfVFlQRSwgcm9vdEZvbGRlcklkKTsKLSAgICAgICAgICAgIGNoZWNrT3V0KGlkMik7Ci0gICAgICAgICAgICBjaGVja0luKGlkMiwgdHJ1ZSwgImZpbmFsIHZlcnNpb24gaW4gc2VyaWVzIik7Ci0gICAgICAgICAgICBnZXRBbGxWZXJzaW9ucyhpZDIpOwotCi0gICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBjYXB0dXJlZCBmaWxlcyBhbmQgc3RvcmUgdGhlbSBpbiBhIFpJUCBmaWxlCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgc3BlYyBleGFtcGxlczogIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZWxldGUgYWxsIGdlbmVyYXRlZCBvYmplY3RzCi0gICAgICAgIGNsZWFudXAoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgdXJsLCBCaW5kaW5nVHlwZSBiaW5kaW5nVHlwZSkgewotICAgICAgICBMT0cuZGVidWcoIkluaXRpYWxpemluZyBjb25uZWN0aW9uIHRvIEluTWVtb3J5IHNlcnZlcjogIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiICAgQmluZGluZzogIiArIGJpbmRpbmdUeXBlLnZhbHVlKCkpOwotICAgICAgICBMT0cuZGVidWcoIiAgIFVSTDogIiArIHVybCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuVVNFUiwgImFkbWluIik7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuUEFTU1dPUkQsICJhZG1pbiIpOwotCi0gICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQklORElOR19UWVBFLCBiaW5kaW5nVHlwZS52YWx1ZSgpKTsKLQotICAgICAgICAvLyBnZXQgZmFjdG9yeSBhbmQgY3JlYXRlIGJpbmRpbmcKLSAgICAgICAgQ21pc0JpbmRpbmdGYWN0b3J5IGZhY3RvcnkgPSBDbWlzQmluZGluZ0ZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgQ21pc0JpbmRpbmcgYmluZGluZyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlID09IEJpbmRpbmdUeXBlLkFUT01QVUIpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuQVRPTVBVQl9VUkwsIHVybCk7Ci0gICAgICAgICAgICBiaW5kaW5nID0gZmFjdG9yeS5jcmVhdGVDbWlzQXRvbVB1YkJpbmRpbmcocGFyYW1ldGVycyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUgPT0gQmluZGluZ1R5cGUuV0VCU0VSVklDRVMpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfQUNMX1NFUlZJQ0UsIHVybCArICIvQUNMU2VydmljZT93c2RsIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX0RJU0NPVkVSWV9TRVJWSUNFLCB1cmwgKyAiL0Rpc2NvdmVyeVNlcnZpY2U/d3NkbCIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19NVUxUSUZJTElOR19TRVJWSUNFLCB1cmwgKyAiL011bHRpRmlsaW5nU2VydmljZT93c2RsIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX05BVklHQVRJT05fU0VSVklDRSwgdXJsICsgIi9OYXZpZ2F0aW9uU2VydmljZT93c2RsIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLldFQlNFUlZJQ0VTX09CSkVDVF9TRVJWSUNFLCB1cmwgKyAiL09iamVjdFNlcnZpY2U/d3NkbCIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5XRUJTRVJWSUNFU19QT0xJQ1lfU0VSVklDRSwgdXJsICsgIi9Qb2xpY3lTZXJ2aWNlP3dzZGwiKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVMQVRJT05TSElQX1NFUlZJQ0UsIHVybCArICIvUmVsYXRpbnNoaXBTZXJ2aWNlP3dzZGwiKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfUkVQT1NJVE9SWV9TRVJWSUNFLCB1cmwgKyAiL1JlcG9zaXRvcnlTZXJ2aWNlP3dzZGwiKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFNlc3Npb25QYXJhbWV0ZXIuV0VCU0VSVklDRVNfVkVSU0lPTklOR19TRVJWSUNFLCB1cmwgKyAiL1ZlcnNpb25pbmdTZXJ2aWNlP3dzZGwiKTsKLSAgICAgICAgICAgIGJpbmRpbmcgPSBmYWN0b3J5LmNyZWF0ZUNtaXNXZWJTZXJ2aWNlc0JpbmRpbmcocGFyYW1ldGVycyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUgPT0gQmluZGluZ1R5cGUuQlJPV1NFUikgewotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5CUk9XU0VSX1VSTCwgdXJsKTsKLSAgICAgICAgICAgIGJpbmRpbmcgPSBmYWN0b3J5LmNyZWF0ZUNtaXNCcm93c2VyQmluZGluZyhwYXJhbWV0ZXJzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRy5lcnJvcigiVW5rbm93biBiaW5kaW5nIHR5cGU6ICIgKyBiaW5kaW5nVHlwZS52YWx1ZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBvYmpGYWN0b3J5ID0gYmluZGluZy5nZXRPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgIHJlcFN2YyA9IGJpbmRpbmcuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKTsKLSAgICAgICAgb2JqU3ZjID0gYmluZGluZy5nZXRPYmplY3RTZXJ2aWNlKCk7Ci0gICAgICAgIG5hdlN2YyA9IGJpbmRpbmcuZ2V0TmF2aWdhdGlvblNlcnZpY2UoKTsKLSAgICAgICAgdmVyU3ZjID0gYmluZGluZy5nZXRWZXJzaW9uaW5nU2VydmljZSgpOwotICAgICAgICBtdWx0aVN2YyA9IGJpbmRpbmcuZ2V0TXVsdGlGaWxpbmdTZXJ2aWNlKCk7Ci0gICAgICAgIGRpc2NTdmMgPSBiaW5kaW5nLmdldERpc2NvdmVyeVNlcnZpY2UoKTsKLSAgICAgICAgYWNsU3ZjID0gYmluZGluZy5nZXRBY2xTZXJ2aWNlKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgZm9sZGVyIHdoZXJlIHRhcmdldCBmaWxlcyB3aWxsIGJlIHN0b3JlZDoKLSAgICAgICAgdGFyZ2V0RGlyID0gYmluZGluZ1R5cGUudmFsdWUoKTsKLSAgICAgICAgRmlsZSBpbiA9IG5ldyBGaWxlKHRhcmdldERpcik7Ci0gICAgICAgIGRlbGV0ZURpclJlY3Vyc2l2ZShpbik7IC8vIGF2b2lkIHRoYXQgdGhlcmUgYXJlIHVud2FudGVkIGZpbGVzIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgcnVucwotICAgICAgICBib29sZWFuIG9rID0gaW4ubWtkaXIoKTsKLQotICAgICAgICBMT0cuZGVidWcoImNyZWF0aW5nIHRhcmdldCBkaXJlY3RvcnkgZm9yIGZpbGVzOiAiICsgb2spOwotICAgICAgICBMT0cuZGVidWcoIkluaXRpYWxpemluZyBkb25lLiAiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0UmVwb3NpdG9yaWVzKCkgewotICAgICAgICBMT0cuZGVidWcoImdldFJlcG9zaXRvcmllcygpIik7Ci0gICAgICAgIExpc3Q8UmVwb3NpdG9yeUluZm8+IHJlcG9zaXRvcmllcyA9IHJlcFN2Yy5nZXRSZXBvc2l0b3J5SW5mb3MobnVsbCk7Ci0gICAgICAgIHRoaXMucmVwb3NpdG9yeUlkID0gcmVwb3NpdG9yaWVzLmdldCgwKS5nZXRJZCgpOwotICAgICAgICByZW5hbWVGaWxlcygiZ2V0UmVwb3NpdG9yeUluZm9zIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0UmVwb3NpdG9yeUluZm8oKSBkb25lLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRSZXBvc2l0b3J5SW5mbygpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXR0aW5nIHJlcG9zaXRvcnkgaW5mbyBmb3IgcmVwb3NpdG9yeSAiICsgcmVwb3NpdG9yeUlkKTsKLQotICAgICAgICAvLyBCZWNhdXNlIHNvbWUgYmluZGluZ3Mgc2lsZW50bHkgcmV0cmlldmUgYWxsIHJlcG9zaXRvcmllcyBvbiB0aGUgZmlyc3QKLSAgICAgICAgLy8gcmVxdWVzdCB3ZSBjYWxsIGl0IHR3aWNlCi0gICAgICAgIC8vIGFuZCB1c2UgYSBkdW1teSBleHRlbnNpb24gZGF0YSBlbGVtZW50IHRvIHByZXZlbnQgY2FjaGluZwotICAgICAgICBSZXBvc2l0b3J5SW5mbyByZXBvSW5mbyA9IHJlcFN2Yy5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5SWQsIG51bGwpOwotICAgICAgICBFeHRlbnNpb25EYXRhSW1wbCBkdW1teUV4dCA9IG5ldyBFeHRlbnNpb25EYXRhSW1wbCgpOwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKLSAgICAgICAgTGlzdDxDbWlzRXh0ZW5zaW9uRWxlbWVudD4gZXh0TGlzdCA9IG5ldyBBcnJheUxpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+KCkgewotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZChuZXcgQ21pc0V4dGVuc2lvbkVsZW1lbnRJbXBsKCJmb28iLCAiZm9vIiwgbnVsbCwgImJhciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZHVtbXlFeHQuc2V0RXh0ZW5zaW9ucyhleHRMaXN0KTsKLSAgICAgICAgcmVwb0luZm8gPSByZXBTdmMuZ2V0UmVwb3NpdG9yeUluZm8ocmVwb3NpdG9yeUlkLCBkdW1teUV4dCk7Ci0KLSAgICAgICAgTE9HLmRlYnVnKCJyZXBvc2l0b3J5IGlkIGlzOiAiICsgcmVwb0luZm8uZ2V0SWQoKSk7Ci0gICAgICAgIHJvb3RGb2xkZXJJZCA9IHJlcG9JbmZvLmdldFJvb3RGb2xkZXJJZCgpOwotICAgICAgICBjaGFuZ2VUb2tlbiA9IHJlcG9JbmZvLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCk7Ci0gICAgICAgIExPRy5kZWJ1Zygicm9vdCBmb2xkZXIgaWQgaXM6ICIgKyByZXBvSW5mby5nZXRSb290Rm9sZGVySWQoKSk7Ci0gICAgICAgIHJlbmFtZUZpbGVzKCJnZXRSZXBvc2l0b3J5SW5mbyIpOwotICAgICAgICBMT0cuZGVidWcoImdldFJlcG9zaXRvcnlJbmZvKCkgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T2JqZWN0KFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBMT0cuZGVidWcoImdldE9iamVjdCAiICsgb2JqZWN0SWQpOwotICAgICAgICBvYmpTdmMuZ2V0T2JqZWN0KHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsICIqIiwgdHJ1ZSAvKiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyAqLywKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FIC8qIGluY2x1ZGVSZWxhdGlvbnNoaXBzICovLCBudWxsIC8qIHJlbmRpdGlvbkZpbHRlciAqLywKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlUG9saWN5SWRzICovLCB0cnVlIC8qIGluY2x1ZGVBY2wgKi8sIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygiZ2V0T2JqZWN0Iik7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0T2JqZWN0KCkgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0Q2hpbGRyZW4oU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0Q2hpbGRyZW4gIiArIGZvbGRlcklkKTsKLSAgICAgICAgbmF2U3ZjLmdldENoaWxkcmVuKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsICIqIiwgbnVsbCAvKiBvcmRlckJ5ICovLCB0cnVlIC8qIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zICovLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwgLyogcmVuZGl0aW9uRmlsdGVyICovLCB0cnVlIC8qIGluY2x1ZGVQYXRoU2VnbWVudCAqLywgTUFYX0lURU1TLAotICAgICAgICAgICAgICAgIFNLSVBfQ09VTlQsIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygiZ2V0Q2hpbGRyZW4iKTsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXRDaGlsZHJlbigpIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldERlc2NlbmRhbnRzKFN0cmluZyBmb2xkZXJJZCkgewotICAgICAgICBmaW5hbCBCaWdJbnRlZ2VyIGRlcHRoID0gQmlnSW50ZWdlci52YWx1ZU9mKDMpOwotICAgICAgICBMT0cuZGVidWcoImdldERlc2NlbmRhbnRzICIgKyBmb2xkZXJJZCk7Ci0gICAgICAgIG5hdlN2Yy5nZXREZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIGZvbGRlcklkLCBkZXB0aCwgIioiLCB0cnVlIC8qIGluY2x1ZGVBbGxvd2FibGVBY3Rpb25zICovLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwgLyogcmVuZGl0aW9uRmlsdGVyICovLCB0cnVlIC8qIGluY2x1ZGVQYXRoU2VnbWVudCAqLywgbnVsbCk7Ci0gICAgICAgIHJlbmFtZUZpbGVzKCJnZXREZXNjZW5kYW50cyIpOwotICAgICAgICBMT0cuZGVidWcoImdldERlc2NlbmRhbnRzKCkgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T2JqZWN0UGFyZW50cyhTdHJpbmcgZm9sZGVySWQpIHsKLSAgICAgICAgU3RyaW5nIG11bHRpRmlsZWRGb2xkZXIxOwotICAgICAgICAvLyBnZXQgb2JqZWN0IHBhcmVudHMgZmlyc3QgYWRkIG9iamVjdCB0byB0d28gZm9sZGVycyB0aGVuIGdldCBwYXJlbnRzCi0gICAgICAgIExPRy5kZWJ1ZygiZ2V0T2JqZWN0c1BhcmVudHMgIiArIGZvbGRlcklkKTsKLSAgICAgICAgbXVsdGlGaWxlZEZvbGRlcjEgPSBjcmVhdGVGb2xkZXJJbnRlcm4oTVVMVElGSUxFRF9GT0xERVJfMSwgQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpLCBmb2xkZXJJZCk7Ci0gICAgICAgIGlkc1RvRGVsZXRlLmFkZChtdWx0aUZpbGVkRm9sZGVyMSk7Ci0gICAgICAgIG11bHRpRmlsZWRGb2xkZXIyID0gY3JlYXRlRm9sZGVySW50ZXJuKE1VTFRJRklMRURfRk9MREVSXzIsIEJhc2VUeXBlSWQuQ01JU19GT0xERVIudmFsdWUoKSwgZm9sZGVySWQpOwotICAgICAgICBpZHNUb0RlbGV0ZS5hZGQobXVsdGlGaWxlZEZvbGRlcjIpOwotICAgICAgICBtdWx0aUZpbGVkRG9jID0gY3JlYXRlRG9jdW1lbnRJbnRlcm4oTVVMVElGSUxFRF9ET0NVTUVOVCwgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCksIG11bHRpRmlsZWRGb2xkZXIxLAotICAgICAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZS5OT05FKTsKLSAgICAgICAgaWRzVG9EZWxldGUuYWRkKDAsIG11bHRpRmlsZWREb2MpOyAvLyBhZGQgYXQgdGhlIGJlZ2lubmluZyBtdXN0IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZCBiZWZvcmUgZm9sZGVycyEKLSAgICAgICAgbXVsdGlTdmMuYWRkT2JqZWN0VG9Gb2xkZXIocmVwb3NpdG9yeUlkLCBtdWx0aUZpbGVkRG9jLCBtdWx0aUZpbGVkRm9sZGVyMiwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIG5hdlN2Yy5nZXRPYmplY3RQYXJlbnRzKHJlcG9zaXRvcnlJZCwgbXVsdGlGaWxlZERvYywgIioiLCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIHJlbmFtZUZpbGVzKCJnZXRPYmplY3RQYXJlbnRzIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0T2JqZWN0UGFyZW50cygpIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU9iamVjdEZyb21Gb2xkZXIoKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygicmVtb3ZlT2JqZWN0RnJvbUZvbGRlciIpOwotICAgICAgICBtdWx0aVN2Yy5yZW1vdmVPYmplY3RGcm9tRm9sZGVyKHJlcG9zaXRvcnlJZCwgbXVsdGlGaWxlZERvYywgbXVsdGlGaWxlZEZvbGRlcjIsIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygicmVtb3ZlT2JqZWN0RnJvbUZvbGRlciIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIlRocmVhZCBpbnRlcnJ1cHRlZDogIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HLmRlYnVnKCJyZW1vdmVPYmplY3RGcm9tRm9sZGVyKCkgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9RdWVyeSgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJkb1F1ZXJ5ICIpOwotICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gIlNFTEVDVCAqIGZyb20gY21pczpkb2N1bWVudCBXSEVSRSBJTl9GT0xERVIoJyIgKyByb290Rm9sZGVySWQgKyAiJykiOwotICAgICAgICBkaXNjU3ZjLnF1ZXJ5KHJlcG9zaXRvcnlJZCwgc3RhdGVtZW50LCBmYWxzZSAvKiBzZWFyY2hBbGxWZXJzaW9ucyAqLywgdHJ1ZSAvKiBpbmNsdWRlQWxsb3dhYmxlQWN0aW9ucyAqLywKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCBNQVhfSVRFTVMsIFNLSVBfQ09VTlQsIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygiZG9RdWVyeSIpOwotICAgICAgICBMT0cuZGVidWcoImRvUXVlcnkoKSBkb25lLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRDb250ZW50Q2hhbmdlcyhTdHJpbmcgdG9rZW4pIHsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXRDb250ZW50Q2hhbmdlcyIpOwotICAgICAgICBIb2xkZXI8U3RyaW5nPiBjaGFuZ2VMb2dUb2tlbiA9IG5ldyBIb2xkZXI8U3RyaW5nPigidG9rZW4iKTsKLSAgICAgICAgZGlzY1N2Yy5nZXRDb250ZW50Q2hhbmdlcyhyZXBvc2l0b3J5SWQsIGNoYW5nZUxvZ1Rva2VuLCBmYWxzZSwgIioiLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygiZ2V0Q29udGVudENoYW5nZXMiKTsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXRDb250ZW50Q2hhbmdlcygpIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldFR5cGVDaGlsZHJlbihTdHJpbmcgdHlwZUlkKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0VHlwZUNoaWxkcmVuICIgKyB0eXBlSWQpOwotICAgICAgICByZXBTdmMuZ2V0VHlwZUNoaWxkcmVuKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCB0cnVlIC8qIGluY2x1ZGVQcm9wZXJ0eURlZmluaXRpb25zICovLCBNQVhfSVRFTVMsIFNLSVBfQ09VTlQsIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygiZ2V0VHlwZUNoaWxkcmVuIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0VHlwZUNoaWxkcmVuKCkgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiY3JlYXRlRG9jdW1lbnQgIiArIHR5cGVJZCk7Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlRG9jdW1lbnRJbnRlcm4obmFtZSwgdHlwZUlkLCBmb2xkZXJJZCwgdmVyc2lvbmluZ1N0YXRlKTsKLSAgICAgICAgcmVuYW1lRmlsZXMoImNyZWF0ZURvY3VtZW50Iik7Ci0gICAgICAgIExPRy5kZWJ1ZygiY3JlYXRlRG9jdW1lbnQoKSBkb25lLiIpOwotCi0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVEb2N1bWVudEludGVybihTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZvbGRlcklkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwb2xpY2llcyA9IG51bGw7Ci0gICAgICAgIEFjbCBhZGRBQ0VzID0gbnVsbDsKLSAgICAgICAgQWNsIHJlbW92ZUFDRXMgPSBudWxsOwotICAgICAgICBFeHRlbnNpb25zRGF0YSBleHRlbnNpb24gPSBudWxsOwotCi0gICAgICAgIExpc3Q8UHJvcGVydHlEYXRhPD8+PiBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eURhdGE8Pz4+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlSWQpKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG9iakZhY3RvcnkuY3JlYXRlUHJvcGVydGllc0RhdGEocHJvcGVydGllcyk7Ci0KLSAgICAgICAgY29udGVudFN0cmVhbSA9IGNyZWF0ZUNvbnRlbnQoKTsKLQotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWQgPSBvYmpTdmMuY3JlYXRlRG9jdW1lbnQocmVwb3NpdG9yeUlkLCBwcm9wcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgICAgIGFkZEFDRXMsIHJlbW92ZUFDRXMsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gY2F0Y2ggKENtaXNCYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGZvbGRlciBhbHJlYWR5IHRoZXJlLCBnZXQgaXQ6Ci0gICAgICAgICAgICBPYmplY3RJbkZvbGRlckxpc3QgcmVzdWx0ID0gbmF2U3ZjLmdldENoaWxkcmVuKHJlcG9zaXRvcnlJZCwgZm9sZGVySWQsICIqIiwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIHRydWUsIE1BWF9JVEVNUywgU0tJUF9DT1VOVCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPiBjaGlsZHJlbiA9IHJlc3VsdC5nZXRPYmplY3RzKCk7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIiBmb3VuZCAiICsgY2hpbGRyZW4uc2l6ZSgpICsgIiBmb2xkZXJzIGluIGdldENoaWxkcmVuKCkiKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0SW5Gb2xkZXJEYXRhIGNoaWxkIDogY2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZUNoaWxkID0gKFN0cmluZykgY2hpbGQuZ2V0T2JqZWN0KCkuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuTkFNRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5hbWVDaGlsZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLmdldE9iamVjdCgpLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVGb2xkZXJJbnRlcm4oU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlSWQsIFN0cmluZyBwYXJlbnRGb2xkZXJJZCkgewotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMgPSBudWxsOwotICAgICAgICBBY2wgYWRkQUNFcyA9IG51bGw7Ci0gICAgICAgIEFjbCByZW1vdmVBQ0VzID0gbnVsbDsKLSAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uID0gbnVsbDsKLQotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnR5SWREYXRhKFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQob2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZUlkKSk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBvYmpGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotCi0gICAgICAgIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZCA9IG9ialN2Yy5jcmVhdGVGb2xkZXIocmVwb3NpdG9yeUlkLCBwcm9wcywgcGFyZW50Rm9sZGVySWQsIHBvbGljaWVzLCBhZGRBQ0VzLCByZW1vdmVBQ0VzLCBleHRlbnNpb24pOwotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBmb2xkZXIgYWxyZWFkeSB0aGVyZSwgZ2V0IGl0OgotICAgICAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IHJlc3VsdCA9IG5hdlN2Yy5nZXRDaGlsZHJlbihyZXBvc2l0b3J5SWQsIHBhcmVudEZvbGRlcklkLCAiKiIsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBNQVhfSVRFTVMsIFNLSVBfQ09VTlQsIG51bGwpOwotCi0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gY2hpbGRyZW4gPSByZXN1bHQuZ2V0T2JqZWN0cygpOwotICAgICAgICAgICAgTE9HLmRlYnVnKCIgZm91bmQgIiArIGNoaWxkcmVuLnNpemUoKSArICIgZm9sZGVycyBpbiBnZXRDaGlsZHJlbigpIik7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdEluRm9sZGVyRGF0YSBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVDaGlsZCA9IChTdHJpbmcpIGNoaWxkLmdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk5BTUUpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhuYW1lQ2hpbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5nZXRPYmplY3QoKS5nZXRJZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb250ZW50U3RyZWFtIGNyZWF0ZUNvbnRlbnQoKSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW1JbXBsIGNvbnRlbnQgPSBuZXcgQ29udGVudFN0cmVhbUltcGwoKTsKLSAgICAgICAgY29udGVudC5zZXRGaWxlTmFtZSgiZGF0YS50eHQiKTsKLSAgICAgICAgY29udGVudC5zZXRNaW1lVHlwZSgidGV4dC9wbGFpbiIpOwotICAgICAgICBpbnQgbGVuID0gQlVGU0laRTsKLSAgICAgICAgYnl0ZVtdIGIgPSB7IDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4MGMsIDB4MGEsCi0gICAgICAgICAgICAgICAgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHgwYywgMHgwYSB9OyAvLyAzMgotICAgICAgICAvLyBCeXRlcwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGxlbik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMjQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJhLndyaXRlKGIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBmaWxsIGNvbnRlbnQgc3RyZWFtIHdpdGggZGF0YSIsIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGVudC5zZXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgY29udGVudC5zZXRMZW5ndGgoQmlnSW50ZWdlci52YWx1ZU9mKGxlbikpOwotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvcGVydGllcyhTdHJpbmcgaWQsIFN0cmluZyBwcm9wZXJ0eUlkLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotICAgICAgICBMT0cuZGVidWcoInVwZGF0ZVByb3BlcnRpZXMgIiArIGlkKTsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQob2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEocHJvcGVydHlJZCwgcHJvcGVydHlWYWx1ZSkpOwotICAgICAgICBQcm9wZXJ0aWVzIG5ld1Byb3BzID0gb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBIb2xkZXI8U3RyaW5nPiBpZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihpZCk7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGNoYW5nZVRva2VuSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KCk7Ci0gICAgICAgIG9ialN2Yy51cGRhdGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIGNoYW5nZVRva2VuSG9sZGVyLCBuZXdQcm9wcywgbnVsbCk7Ci0gICAgICAgIHJlbmFtZUZpbGVzKCJ1cGRhdGVQcm9wZXJ0aWVzIik7Ci0gICAgICAgIExPRy5kZWJ1ZygidXBkYXRlUHJvcGVydGllcygpIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZU9iamVjdChTdHJpbmcgaWQpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJkZWxldGVPYmplY3QgIiArIGlkKTsKLSAgICAgICAgb2JqU3ZjLmRlbGV0ZU9iamVjdChyZXBvc2l0b3J5SWQsIGlkLCB0cnVlLCBudWxsKTsKLSAgICAgICAgcmVuYW1lRmlsZXMoImRlbGV0ZU9iamVjdCIpOwotICAgICAgICBMT0cuZGVidWcoImRlbGV0ZU9iamVjdCgpIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiY2xlYW5pbmcgdXAuLi4iKTsKLSAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHNUb0RlbGV0ZSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJkZWxldGluZyBvYmplY3QgIiArIGlkKTsKLSAgICAgICAgICAgIG9ialN2Yy5kZWxldGVPYmplY3QocmVwb3NpdG9yeUlkLCBpZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWRzVG9EZWxldGUuY2xlYXIoKTsKLSAgICAgICAgTE9HLmRlYnVnKCIuLi4gY2xlYW5pbmcgdXAgZG9uZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGVudW1lcmF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhlIHJvb3QgZm9sZGVyIGFuZCByZXR1cm4gdGhlIGlkIG9mIHRoZSBmaXJzdAotICAgICAqIGRvY3VtZW50Ci0gICAgICogCi0gICAgICogQHJldHVybiBpZCBvZiBmaXJzdCBkb2MgaW4gcm9vdCBmb2xkZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXN0RG9jSWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0SWQoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBlbnVtZXJhdGUgdGhlIGNoaWxkcmVuIG9mIHRoZSByb290IGZvbGRlciBhbmQgcmV0dXJuIHRoZSBpZCBvZiB0aGUgZmlyc3QKLSAgICAgKiBzdWItZm9sZGVyCi0gICAgICogCi0gICAgICogQHJldHVybiBpZCBvZiBmaXJzdCBkb2MgaW4gcm9vdCBmb2xkZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXN0Rm9sZGVySWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0SWQoQmFzZVR5cGVJZC5DTUlTX0ZPTERFUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGVzdElkKEJhc2VUeXBlSWQgYmFzZVR5cGVJZCkgewotICAgICAgICBMT0cuZGVidWcoImdldFRlc3REb2NJZCgpIik7Ci0gICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCByZXN1bHQgPSBuYXZTdmMuZ2V0Q2hpbGRyZW4ocmVwb3NpdG9yeUlkLCByb290Rm9sZGVySWQsICIqIiwgbnVsbCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgTUFYX0lURU1TLCBTS0lQX0NPVU5ULCBudWxsKTsKLQotICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gY2hpbGRyZW4gPSByZXN1bHQuZ2V0T2JqZWN0cygpOwotICAgICAgICBMT0cuZGVidWcoIiBmb3VuZCAiICsgY2hpbGRyZW4uc2l6ZSgpICsgIiBmb2xkZXJzIGluIGdldENoaWxkcmVuKCkiKTsKLSAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgaWYgKGJhc2VUeXBlSWQuZXF1YWxzKGNoaWxkLmdldE9iamVjdCgpLmdldEJhc2VUeXBlSWQoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuZ2V0T2JqZWN0KCkuZ2V0SWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcmVwYXJlVmVyc2lvblNlcmllcyhTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNyZWF0ZURvY3VtZW50SW50ZXJuKG5hbWUsIHR5cGVJZCwgZm9sZGVySWQsIFZlcnNpb25pbmdTdGF0ZS5NQUpPUik7Ci0gICAgICAgIEhvbGRlcjxCb29sZWFuPiBjb250ZW50Q29waWVkID0gbmV3IEhvbGRlcjxCb29sZWFuPigpOwotICAgICAgICBIb2xkZXI8U3RyaW5nPiBpZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihpZCk7Ci0KLSAgICAgICAgdmVyU3ZjLmNoZWNrT3V0KHJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG51bGwsIGNvbnRlbnRDb3BpZWQpOwotICAgICAgICBTdHJpbmcgY2hlY2tpbkNvbW1lbnQgPSAiQ2hlY2tpbiBWMi4wIjsKLSAgICAgICAgdmVyU3ZjLmNoZWNrSW4ocmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgdHJ1ZSAvKiBtYWpvciAqLywgbnVsbCAvKiBwcm9wZXJ0aWVzICovLCBudWxsIC8qIGNvbnRlbnQgKi8sCi0gICAgICAgICAgICAgICAgY2hlY2tpbkNvbW1lbnQsIG51bGwvKiBwb2xpY2llcyAqLywgbnVsbC8qIGFkZEFjbCAqLywgbnVsbCAvKiByZW1vdmVBY2wgKi8sIG51bGwgLyogZXh0ZW5zaW9uICovKTsKLQotICAgICAgICB2ZXJTdmMuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgbnVsbCwgY29udGVudENvcGllZCk7Ci0gICAgICAgIGNoZWNraW5Db21tZW50ID0gIkNoZWNraW4gVjIuMSI7Ci0gICAgICAgIHZlclN2Yy5jaGVja0luKHJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIGZhbHNlIC8qIG1ham9yICovLCBudWxsIC8qIHByb3BlcnRpZXMgKi8sIG51bGwgLyogY29udGVudCAqLywKLSAgICAgICAgICAgICAgICBjaGVja2luQ29tbWVudCwgbnVsbC8qIHBvbGljaWVzICovLCBudWxsLyogYWRkQWNsICovLCBudWxsIC8qIHJlbW92ZUFjbCAqLywgbnVsbCAvKiBleHRlbnNpb24gKi8pOwotCi0gICAgICAgIHJldHVybiBpZEhvbGRlci5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja091dChTdHJpbmcgaWQpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJjaGVja091dCgpIik7Ci0gICAgICAgIEhvbGRlcjxTdHJpbmc+IGlkSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KGlkKTsKLSAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGNvbnRlbnRDb3BpZWQgPSBuZXcgSG9sZGVyPEJvb2xlYW4+KHRydWUpOwotICAgICAgICB2ZXJTdmMuY2hlY2tPdXQocmVwb3NpdG9yeUlkLCBpZEhvbGRlciwgbnVsbCwgY29udGVudENvcGllZCk7Ci0gICAgICAgIHJlbmFtZUZpbGVzKCJjaGVja091dCIpOwotICAgICAgICBMT0cuZGVidWcoImNoZWNrT3V0IGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSW4oU3RyaW5nIGlkLCBib29sZWFuIG1ham9yLCBTdHJpbmcgY2hlY2tpbkNvbW1lbnQpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJjaGVja0luKCkiKTsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQob2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoVkVSU0lPTkVEX1BST1AsICJ1cGRhdGVkIHZhbHVlIikpOwotICAgICAgICBQcm9wZXJ0aWVzIG5ld1Byb3BzID0gb2JqRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLQotICAgICAgICBIb2xkZXI8U3RyaW5nPiBpZEhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihpZCk7Ci0gICAgICAgIHZlclN2Yy5jaGVja0luKHJlcG9zaXRvcnlJZCwgaWRIb2xkZXIsIG1ham9yIC8qIG1ham9yICovLCBuZXdQcm9wcyAvKiBwcm9wZXJ0aWVzICovLCBudWxsIC8qIGNvbnRlbnQgKi8sCi0gICAgICAgICAgICAgICAgY2hlY2tpbkNvbW1lbnQsIG51bGwvKiBwb2xpY2llcyAqLywgbnVsbC8qIGFkZEFjbCAqLywgbnVsbCAvKiByZW1vdmVBY2wgKi8sIG51bGwgLyogZXh0ZW5zaW9uICovKTsKLSAgICAgICAgcmVuYW1lRmlsZXMoImNoZWNrSW4iKTsKLSAgICAgICAgTE9HLmRlYnVnKCJjaGVja0luIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldEFsbFZlcnNpb25zKFN0cmluZyBpZCkgewotICAgICAgICBMT0cuZGVidWcoImdldEFsbFZlcnNpb25zKCkiKTsKLSAgICAgICAgdmVyU3ZjLmdldEFsbFZlcnNpb25zKHJlcG9zaXRvcnlJZCwgaWQvKiBvYmplY3QgaWQgKi8sIGlkLyogc2VyaWVzIGlkICovLCAiKiIvKiBmaWx0ZXIgKi8sCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUFsbG93YWJsZUFjdGlvbnMgKi8sIG51bGwgLyogZXh0ZW5zaW9uICovKTsKLSAgICAgICAgcmVuYW1lRmlsZXMoImdldEFsbFZlcnNpb25zIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0QWxsVmVyc2lvbnMgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0QWNsKFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICBMT0cuZGVidWcoImdldHRpbmcgQWNsKCkgIiArIG9iamVjdElkKTsKLQotICAgICAgICAvLyBnZXQgb2xkIEFDTCBmaXJzdDoKLSAgICAgICAgQWNsIG9sZEFjbCA9IGFjbFN2Yy5nZXRBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdHJ1ZSwgbnVsbCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEFDTCBmb3IgdGhlIHRlc3QgZG9jCi0gICAgICAgIExpc3Q8QWNlPiBhY2VzID0gbmV3IEFycmF5TGlzdDxBY2U+KCk7Ci0gICAgICAgIGFjZXMuYWRkKG9iakZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbEVudHJ5KCJBbGljZSIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImNtaXM6cmVhZCIpKSk7Ci0gICAgICAgIGFjZXMuYWRkKG9iakZhY3RvcnkuY3JlYXRlQWNjZXNzQ29udHJvbEVudHJ5KCJCb2IiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJjbWlzOndyaXRlIikpKTsKLSAgICAgICAgYWNlcy5hZGQob2JqRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sRW50cnkoImFkbWluIiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiY21pczphbGwiKSkpOwotICAgICAgICBBY2wgYWNsID0gb2JqRmFjdG9yeS5jcmVhdGVBY2Nlc3NDb250cm9sTGlzdChhY2VzKTsKLQotICAgICAgICAvLyBhZGQgdGhlIG5ldyBBQ0wgYW5kIHJlbW92ZSB0aGUgb2xkIG9uZQotICAgICAgICBhY2xTdmMuYXBwbHlBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgYWNsLCBvbGRBY2wsIEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFksIG51bGwpOwotCi0gICAgICAgIGFjbFN2Yy5nZXRBY2wocmVwb3NpdG9yeUlkLCBvYmplY3RJZCwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIHJlbmFtZUZpbGVzKCJnZXRBY2wiKTsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXR0aW5nIEFjbCgpIGRvbmUuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldFR5cGVEZWZpbml0aW9uKFN0cmluZyB0eXBlSWQpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXRUeXBlRGVmaW5pdGlvbiAiICsgdHlwZUlkKTsKLSAgICAgICAgcmVwU3ZjLmdldFR5cGVEZWZpbml0aW9uKHJlcG9zaXRvcnlJZCwgdHlwZUlkLCBudWxsKTsKLSAgICAgICAgcmVuYW1lRmlsZXMoImdldFR5cGVEZWZpbml0aW9uIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0VHlwZURlZmluaXRpb24oKSBkb25lLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXRUeXBlRGVzY2VuZGFudHMoU3RyaW5nIHR5cGVJZCkgewotICAgICAgICBMT0cuZGVidWcoImdldFR5cGVEZXNjZW5kYW50cyAiICsgdHlwZUlkKTsKLSAgICAgICAgcmVwU3ZjLmdldFR5cGVEZXNjZW5kYW50cyhyZXBvc2l0b3J5SWQsIHR5cGVJZCwgVFlQRV9ERVBUSF9BTEwsIHRydWUgLyogaW5jbHVkZVByb3BlcnR5RGVmaW5pdGlvbnMgKi8sIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygiZ2V0VHlwZURlc2NlbmRhbnRzIik7Ci0gICAgICAgIExPRy5kZWJ1ZygiZ2V0VHlwZURlc2NlbmRhbnRzKCkgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0QWxsb3dhYmxlQWN0aW9ucyhTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJnZXRBbGxvd2FibGVBY3Rpb25zICIgKyBvYmplY3RJZCk7Ci0gICAgICAgIG9ialN2Yy5nZXRBbGxvd2FibGVBY3Rpb25zKHJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIG51bGwpOwotICAgICAgICByZW5hbWVGaWxlcygiZ2V0QWxsb3dhYmxlQWN0aW9ucyIpOwotICAgICAgICBMT0cuZGVidWcoImdldEFsbG93YWJsZUFjdGlvbnMoKSBkb25lLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW5hbWVGaWxlcyhTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgZmlsZU5hbWVJblJlcSA9IGZpbmRMYXN0RmlsZShMT0dESVIsICIqLXJlcXVlc3QubG9nIik7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZUluUmVzcCA9IGZpbmRMYXN0RmlsZShMT0dESVIsICIqLXJlc3BvbnNlLmxvZyIpOwotICAgICAgICBpZiAobnVsbCA9PSBmaWxlTmFtZUluUmVxKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIGNhcHR1cmVkIHJlcXVlc3QgZmlsZSBmb3IgIiArIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsID09IGZpbGVOYW1lSW5SZXNwKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBmaW5kIGNhcHR1cmVkIHJlc3BvbnNlIGZpbGUgZm9yICIgKyBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIGluID0gbmV3IEZpbGUoZmlsZU5hbWVJblJlcSk7Ci0gICAgICAgIEZpbGUgb3V0ID0gbmV3IEZpbGUodGFyZ2V0RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lICsgIi1yZXF1ZXN0LmxvZyIpOwotICAgICAgICBpZiAob3V0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXQuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBvayA9IGluLnJlbmFtZVRvKG91dCk7Ci0gICAgICAgIGlmIChvaykgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJSZW5hbWluZyBmaWxlICIgKyBpbi5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIiArIG91dC5nZXRBYnNvbHV0ZVBhdGgoKSArICIgc3VjY2VlZGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HLndhcm4oIlJlbmFtaW5nIGZpbGUgIiArIGluLmdldEFic29sdXRlUGF0aCgpICsgIiB0byAiICsgb3V0LmdldEFic29sdXRlUGF0aCgpICsgIiBmYWlsZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbiA9IG5ldyBGaWxlKGZpbGVOYW1lSW5SZXNwKTsKLSAgICAgICAgb3V0ID0gbmV3IEZpbGUodGFyZ2V0RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lICsgIi1yZXNwb25zZS5sb2ciKTsKLSAgICAgICAgaWYgKG91dC5leGlzdHMoKSkgewotICAgICAgICAgICAgb3V0LmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIG9rID0gaW4ucmVuYW1lVG8ob3V0KTsKLSAgICAgICAgaWYgKG9rKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlJlbmFtaW5nIGZpbGUgIiArIGluLmdldEFic29sdXRlUGF0aCgpICsgInRvICIgKyBvdXQuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIHN1Y2NlZWRlZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRy53YXJuKCJSZW5hbWluZyBmaWxlICIgKyBpbi5nZXRBYnNvbHV0ZVBhdGgoKSArICIgdG8gIiArIG91dC5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZmFpbGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVppcEZpbGUoU3RyaW5nIHppcEZpbGVOYW1lLCBTdHJpbmdbXSBkaXJzKSB7Ci0KLSAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZSh6aXBGaWxlTmFtZSk7Ci0gICAgICAgIGlmIChvdXQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG91dC5kZWxldGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG51bGw7Ci0gICAgICAgIFppcE91dHB1dFN0cmVhbSB6b3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh6aXBGaWxlTmFtZSk7Ci0gICAgICAgICAgICB6b3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShmb3V0KTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGRpciA6IGRpcnMpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGRpclRvWmlwID0gbmV3IEZpbGUoZGlyKTsKLSAgICAgICAgICAgICAgICBhZGREaXJlY3Rvcnkoem91dCwgZGlyLCBkaXJUb1ppcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMT0cuZXJyb3IoIkNyZWF0aW5nIFpJUCBmaWxlIGZhaWxlZDogIiArIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoem91dCk7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShmb3V0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRGlyZWN0b3J5KFppcE91dHB1dFN0cmVhbSB6b3V0LCBTdHJpbmcgcHJlZml4LCBGaWxlIHNvdXJjZURpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBGaWxlW10gZmlsZXMgPSBzb3VyY2VEaXIubGlzdEZpbGVzKCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRlIFppcCwgYWRkaW5nIGRpcmVjdG9yeSAiICsgc291cmNlRGlyLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gZmlsZXMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBhZGREaXJlY3Rvcnkoem91dCwgcHJlZml4ICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlc1tpXS5nZXROYW1lKCksIGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNyZWF0ZSBaaXAsIGFkZGluZyBmaWxlICIgKyBmaWxlc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGU0laRV07Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB6aXBFbnRyeU5hbWUgPSBwcmVmaXggKyBGaWxlLnNlcGFyYXRvciArIGZpbGVzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiICAgYWRkaW5nIGVudHJ5ICIgKyB6aXBFbnRyeU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgem91dC5wdXROZXh0RW50cnkobmV3IFppcEVudHJ5KHppcEVudHJ5TmFtZSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSBmaW4ucmVhZChidWZmZXIpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b3V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGZpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6b3V0LmNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbigpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJDbGVhbmluZyBnZW5lcmF0ZWQgYW5kIGNhcHR1cmVkIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGxvZ3MuLi4iKTsKLQotICAgICAgICBjbGVhbkZpbGVzV2l0aEZpbHRlcihMT0dESVIsICIqLXJlcXVlc3QubG9nIik7Ci0gICAgICAgIGNsZWFuRmlsZXNXaXRoRmlsdGVyKExPR0RJUiwgIiotcmVzcG9uc2UubG9nIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQklORElOR1MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBkaXIgPSBCSU5ESU5HU1tpXS52YWx1ZSgpOwotCi0gICAgICAgICAgICBjbGVhbkZpbGVzV2l0aEZpbHRlcihkaXIsICIqLXJlcXVlc3QubG9nIik7Ci0gICAgICAgICAgICBjbGVhbkZpbGVzV2l0aEZpbHRlcihkaXIsICIqLXJlc3BvbnNlLmxvZyIpOwotCi0gICAgICAgICAgICBGaWxlIGRpclRvRGVsZXRlID0gbmV3IEZpbGUoZGlyKTsKLSAgICAgICAgICAgIGJvb2xlYW4gb2sgPSBkaXJUb0RlbGV0ZS5kZWxldGUoKTsKLSAgICAgICAgICAgIGlmIChvaykgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRGVsZXRpbmcgZGlyICIgKyBkaXJUb0RlbGV0ZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgc3VjY2VlZGVkLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiRGVsZXRpbmcgZGlyICIgKyBkaXJUb0RlbGV0ZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZmFpbGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5ldyBGaWxlKCIuL3RhcmdldC9sb2dzL2xvZzRqLmxvZyIpLmRlbGV0ZSgpOwotICAgICAgICBMT0cuZGVidWcoIi4uLiBkb25lLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5GaWxlc1dpdGhGaWx0ZXIoU3RyaW5nIGRpcmVjdG9yeVBhdGgsIFN0cmluZyB3aWxkY2FyZEZpbHRlcikgewotICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGRpcmVjdG9yeVBhdGgpOwotICAgICAgICBGaWxlRmlsdGVyIGZpbGVGaWx0ZXIgPSBuZXcgV2lsZGNhcmRGaWxlRmlsdGVyKHdpbGRjYXJkRmlsdGVyKTsKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcyhmaWxlRmlsdGVyKTsKLSAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIG9rID0gZmlsZXNbaV0uZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJEZWxldGluZyBmaWxlOiAiICsgZmlsZXNbaV0gKyAiLCBzdWNjZXNzOiAiICsgb2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRMYXN0RmlsZShTdHJpbmcgZGlyZWN0b3J5UGF0aCwgU3RyaW5nIHdpbGRjYXJkRmlsdGVyKSB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5UGF0aCk7Ci0gICAgICAgIEZpbGVGaWx0ZXIgZmlsZUZpbHRlciA9IG5ldyBXaWxkY2FyZEZpbGVGaWx0ZXIod2lsZGNhcmRGaWx0ZXIpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKGZpbGVGaWx0ZXIpOwotICAgICAgICBMT0cuZGVidWcoIk51bWJlciBvZiBmaWxlcyBpbiBmaWx0ZXIgZGlyICIgKyBmaWxlcy5sZW5ndGgpOwotICAgICAgICBpZiAoZmlsZXMubGVuZ3RoIDwgTk9fRklMRVNfTE9HR0VEKSB7Ci0gICAgICAgICAgICBMT0cud2FybigiV0FSTklORyBUT08gRkVXIEZJTEVTISIpOwotICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgc29tZSBwcm9ibGVtIHdpdGggZGlzayBjYWNoaW5nLCBzZWVtcyB0aGF0Ci0gICAgICAgICAgICAvLyBsaXN0RmlsZXMKLSAgICAgICAgICAgIC8vIGRvZXMgbm90IGFsd2F5cyBnZXQgdGhlIG1vc3QgcmVjZW50IHN0YXRlLCB1Z2x5IHdvcmthcm91bmQKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExPRy5lcnJvcigiVGhyZWFkIGludGVycnVwdGVkOiAiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbGVzID0gZGlyLmxpc3RGaWxlcyhmaWxlRmlsdGVyKTsKLSAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPCBOT19GSUxFU19MT0dHRUQpIHsKLSAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIldBUk5JTkcgVE9PIEZFVyBGSUxFUyBFVkVOIEFGVEVSIFNFQ09ORCBUUlkhISEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBOT19GSUxFU19MT0dHRUQgPSBmaWxlcy5sZW5ndGg7Ci0gICAgICAgIEFycmF5cy5zb3J0KGZpbGVzKTsKLSAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlc1tmaWxlcy5sZW5ndGggLSAxXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdLmVxdWFscygiLWNsZWFuIikpIHsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiQ2xlYW5pbmcgdXAgZ2VuZXJhdGVkIGZpbGVzLi4uIik7Ci0gICAgICAgICAgICBTcGVjRXhhbXBsZXMuY2xlYW4oKTsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiLi4uIGNsZWFuaW5nIHVwIGRvbmUuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlN0YXJ0aW5nIGdlbmVyYXRpbmcgc3BlYyBleGFtcGxlcy4uLiIpOwotICAgICAgICAgICAgU3BlY0V4YW1wbGVzIG1haW4gPSBuZXcgU3BlY0V4YW1wbGVzKCk7Ci0gICAgICAgICAgICBtYWluLnJ1bkFsbEJpbmRpbmdzKCk7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIi4uLiBmaW5pc2hlZCBnZW5lcmF0aW5nIHNwZWMgZXhhbXBsZXMuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlbGV0ZURpclJlY3Vyc2l2ZShGaWxlIHBhdGgpIHsKLSAgICAgICAgaWYgKHBhdGguZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IHBhdGgubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlRGlyUmVjdXJzaXZlKGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlc1tpXS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChwYXRoLmRlbGV0ZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xlYW5Mb2dGaWx0ZXJEaXIoKSB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoTE9HRElSKTsKLSAgICAgICAgRmlsZUZpbHRlciBmaWxlRmlsdGVyID0gbmV3IFdpbGRjYXJkRmlsZUZpbHRlcigiKi1yZXF1ZXN0LmxvZyIpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKGZpbGVGaWx0ZXIpOwotICAgICAgICBmb3IgKEZpbGUgZiA6IGZpbGVzKSB7Ci0gICAgICAgICAgICBmLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbGVGaWx0ZXIgPSBuZXcgV2lsZGNhcmRGaWxlRmlsdGVyKCIqLXJlc3BvbnNlLmxvZyIpOwotICAgICAgICBmaWxlcyA9IGRpci5saXN0RmlsZXMoZmlsZUZpbHRlcik7Ci0gICAgICAgIGZvciAoRmlsZSBmIDogZmlsZXMpIHsKLSAgICAgICAgICAgIGYuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC10b29scy9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWEyNWY4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMgDQotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMgDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0NCi0jIHNhbXBsZSBsb2c0ai5wcm9wZXJ0aWVzDQotDQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8NCi0NCi0jIFN0ZG91dA0KLWxvZzRqLmFwcGVuZGVyLk89b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXINCi0NCi0jIEZpbGUNCi1sb2c0ai5hcHBlbmRlci5SPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLlIuRmlsZT1sb2c0ai5sb2cNCi0NCi0jIENvbnRyb2wgdGhlIG1heGltdW0gbG9nIGZpbGUgc2l6ZQ0KLWxvZzRqLmFwcGVuZGVyLlIuTWF4RmlsZVNpemU9MTAwS0INCi0NCi0jIEFyY2hpdmUgbG9nIGZpbGVzIChvbmUgYmFja3VwIGZpbGUgaGVyZSkNCi1sb2c0ai5hcHBlbmRlci5SLk1heEJhY2t1cEluZGV4PTENCi1sb2c0ai5hcHBlbmRlci5SLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5PLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5SLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWM6ICVtJW4NCi1sb2c0ai5hcHBlbmRlci5PLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWM6ICVtJW4NCi0NCi0jIGxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scz1ERUJVRw0KLSMgbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnNlcnZlci5zdXBwb3J0LmZpbHRlcj1JTkZPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vcmVzb3VyY2VzL21hcHBpbmcucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzL3NyYy9tYWluL3Jlc291cmNlcy9tYXBwaW5nLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDgwYmYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdG9vbHMvc3JjL21haW4vcmVzb3VyY2VzL21hcHBpbmcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIyANCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIyANCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgY29uZmlndXJhdGlvbiBmaWxlIGhvdyB0byBtYXAgZmlsZSBtZXRhZGF0YSB0byBDTUlTIHR5cGVzIGFuZCBwcm9wZXJ0aWVzDQotDQotbWFwcGluZy5jb250ZW50VHlwZXMgPSBpbWFnZSwgbXAzLCBwZGYsIG9mZmljZSwgZW1haWwsIHZpZGVvDQotI2RlZmF1bHQgQ01JUyB0eXBlIGlkIGZvciB0aG9zZSBmaWxlcy9mb2xkZXJzIHdpdGhvdXQgYSBzcGVjaWFsIG1hcHBpbmcgY29uZmlndXJlZA0KLW1hcHBpbmcuY29udGVudFR5cGUuZGVmYXVsdC5kb2N1bWVudCA9IGNtaXM6ZG9jdW1lbnQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmRlZmF1bHQuZm9sZGVyID0gY21pczpmb2xkZXINCi0NCi0jIGNvbmZpZ3VyZSB0aGUgTUlNRSB0eXBlcyBmb3IgZWFjaCBrZXkgaW4gdmFsdWUgb2YgbWFwcGluZy5jb250ZW50VHlwZXMgDQotIyBzeW50YXggY2FuIGJlIGxpa2UgaW1hZ2UvanBlZyBvciBpbWFnZS8qIG9yIGNvbG9uIHNlcGFyYXRlZCBsaXN0IGltYWdlL2pwZWc6aW1hZ2UvdGlmZjppbWFnZS9wbmcNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm1wMyA9IGF1ZGlvL21wZWcNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlID0gaW1hZ2UvanBlZw0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmID0gYXBwbGljYXRpb24vcGRmDQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UgPSBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uOmFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZTphcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93OmFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0OnZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlOmFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50OmFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlDQotbWFwcGluZy5jb250ZW50VHlwZS5lbWFpbCA9IGFwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rOm1lc3NhZ2UvcmZjODIyDQotbWFwcGluZy5jb250ZW50VHlwZS52aWRlbyA9IHZpZGVvL21wNA0KLQ0KLSMgQ01JUyB0eXBlIGlkcyBtYXBwZWQgdG8gZWFjaCBrZXkgaW4gdmFsdWUgb2YgbWFwcGluZy5jb250ZW50VHlwZXMNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm1wMy50eXBlSWQgPSBhdWRpb0ZpbGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLnR5cGVJZCA9IGV4aWZJbWFnZQ0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmLnR5cGVJZCA9IHBkZkRvY3VtZW50DQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UudHlwZUlkID0gb2ZmaWNlRG9jdW1lbnQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmVtYWlsLnR5cGVJZCA9IGVtYWlsRG9jdW1lbnQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLnZpZGVvLnR5cGVJZCA9IHZpZGVvRmlsZQ0KLQ0KLSMgY2xhc3NlcyBmb3IgcGFyc2VycyBhbmQgcHJvcGVydHkgbWFwcGVycywgdXN1YWxseSBNZXRhZGF0YVBhcnNlclRpa2EgYW5kIFByb3BlcnR5TWFwcGVyVGlrYQ0KLSMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBzcGVjaWFsIGltcGxlbWVudGF0aW9ucyBmb3Igb3RoZXIgcGFyc2VycywgTWV0YWRhdGFQYXJzZXJUaWthIGFuZA0KLSMgUHJvcGVydHlNYXBwZXJUaWthIGFyZSB0aGUgZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5wYXJzZXJDbGFzcyA9IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLnBhcnNlci5NZXRhZGF0YVBhcnNlckV4aWYNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLm1hcHBlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyLlByb3BlcnR5TWFwcGVyRXhpZg0KLW1hcHBpbmcuY29udGVudFR5cGUubXAzLnBhcnNlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyLk1ldGFkYXRhUGFyc2VyVGlrYQ0KLW1hcHBpbmcuY29udGVudFR5cGUubXAzLm1hcHBlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyLlByb3BlcnR5TWFwcGVyVGlrYQ0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmLnBhcnNlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyLk1ldGFkYXRhUGFyc2VyVGlrYQ0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmLm1hcHBlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyLlByb3BlcnR5TWFwcGVyVGlrYQ0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLnBhcnNlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyLk1ldGFkYXRhUGFyc2VyVGlrYQ0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLm1hcHBlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMubWFwcGVyLlByb3BlcnR5TWFwcGVyVGlrYQ0KLW1hcHBpbmcuY29udGVudFR5cGUuZW1haWwucGFyc2VyQ2xhc3MgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5wYXJzZXIuTWV0YWRhdGFQYXJzZXJUaWthDQotbWFwcGluZy5jb250ZW50VHlwZS5lbWFpbC5tYXBwZXJDbGFzcyA9IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRvb2xzLm1hcHBlci5Qcm9wZXJ0eU1hcHBlclRpa2ENCi1tYXBwaW5nLmNvbnRlbnRUeXBlLnZpZGVvLnBhcnNlckNsYXNzID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudG9vbHMucGFyc2VyLk1ldGFkYXRhUGFyc2VyVGlrYQ0KLW1hcHBpbmcuY29udGVudFR5cGUudmlkZW8ubWFwcGVyQ2xhc3MgPSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50b29scy5tYXBwZXIuUHJvcGVydHlNYXBwZXJUaWthDQotDQotIyBmb3IgY29udGVudCB0eXBlcyB0aGF0IGFyZSBub3QgZGV0ZWN0ZWQgYnkgVGlrYSBvciB0aGF0IHlvdSB3YW50IHRvIHRyZWF0IGRpZmZlcmVudGx5DQotIyBjYW4gYmUgb3ZlcnJpZGRlbiBkZXBlbmRpbmcgb24gdGhlIGZpbGUgZXh0ZW5zaW9uICgueHl6IHRvIGZvby9iYXIpDQotbWFwcGluZy5jb250ZW50VHlwZS5mb3JjZUNvbnRlbnRUeXBlLm1wNCA9IHZpZGVvL21wNA0KLW1hcHBpbmcuY29udGVudFR5cGUuZm9yY2VDb250ZW50VHlwZS53ZWJtID0gdmlkZW8vd2VibQ0KLQ0KLSMgQ01JUyBwcm9wZXJ0aWVzIGluIHVzZQ0KLSMgYSBzdGFuZGFyZCBzeW50YXggZm9yIGEgVGlrYSBwYXJzZXINCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm1wMy5pZC54bXBETVw6YXJ0aXN0ID0gYXJ0aXN0DQotbWFwcGluZy5jb250ZW50VHlwZS5tcDMuaWQueG1wRE1cOmFsYnVtID0gYWxidW0NCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm1wMy5pZC50aXRsZSA9IHRpdGxlDQotbWFwcGluZy5jb250ZW50VHlwZS5tcDMuaWQueG1wRE1cOmxvZ0NvbW1lbnQgPSBjb21tZW50DQotbWFwcGluZy5jb250ZW50VHlwZS5tcDMuaWQueG1wRE1cOmdlbnJlID0gZ2VucmUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm1wMy5pZC54eHggPSBsZW5ndGgNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm1wMy5pZC54bXBETVw6dHJhY2tOdW1iZXIgPSB0cmFjaw0KLW1hcHBpbmcuY29udGVudFR5cGUubXAzLmlkLnhtcERNXDpyZWxlYXNlRGF0ZSA9IHllYXINCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm1wMy5pZC54bXBETTpjb21wb3NlciA9IGNvbXBvc2VyDQotbWFwcGluZy5jb250ZW50VHlwZS5tcDMuaWQueXl5ID0gZGlzY051bWJlcg0KLW1hcHBpbmcuY29udGVudFR5cGUubXAzLmlkLnhtcERNXDphdWRpb0NvbXByZXNzb3IgPSBhdWRpb0Zvcm1hdA0KLW1hcHBpbmcuY29udGVudFR5cGUubXAzLmlkLnhtcERNXDphdWRpb1NhbXBsZVJhdGUgPSBzYW1wbGVSYXRlDQotbWFwcGluZy5jb250ZW50VHlwZS5tcDMuaWQueG1wRE1cOmF1ZGlvQ2hhbm5lbFR5cGUgPSBhdWRpb0NoYW5uZWxUeXBlDQotbWFwcGluZy5jb250ZW50VHlwZS5tcDMuaWQuY2hhbm5lbHMgPSBub0NoYW5uZWxzDQotbWFwcGluZy5jb250ZW50VHlwZS5tcDMuaWQudmVyc2lvbiA9IGNvbXByZXNzb3JWZXJzaW9uDQotDQotIyBpbWFnZXMgdGFncyBpbiBleGlmIGRpcmVjdG9yeQ0KLSMgVGhpcyBpcyBhbiBleGFtcGxlIGZvciBhIGN1c3RvbSBwYXJzZXIgd2l0aCBhIHN1YnN0cnVjdHVyZSBpbiB0aGUgdGFncw0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDAxMDAgPSBpbWFnZVdpZHRoDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDEwMSA9IGltYWdlSGVpZ2h0DQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDEwMiA9IGJpdHNQZXJTYW1wbGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHgwMTAzID0gY29tcHJlc3Npb24NCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHgwMTA2ID0gcGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbg0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDAxMGUgPSBpbWFnZURlc2NyaXB0aW9uDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDEwZiA9IG1ha2UNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHgwMTEwID0gbW9kZWwNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHgwMTEyID0gb3JpZW50YXRpb24gICAgICAgDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDExYSA9IHhSZXNvbHV0aW9uDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDExYiA9IHlSZXNvbHV0aW9uDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDEyOCA9IHJlc29sdXRpb25Vbml0DQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDEzMSA9IHNvZnR3YXJlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDEzMiA9IG1vZGlmeURhdGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHgwMTNiID0gYXJ0aXN0DQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4MDIxMyA9IHlDYkNyUG9zaXRpb25pbmcgIA0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weGE0MDYgPSBzY2VuZUNhcHR1cmVUeXBlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4ODI5OCA9IGNvcHlyaWdodA0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDgyOWEgPSBleHBvc3VyZVRpbWUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg4MjlkID0gZk51bWJlcg0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDg4MjIgPSBleHBvc3VyZVByb2dyYW0NCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg4ODI3ID0gaXNvU3BlZWQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg4ODI1ID0gZ3BzQWx0aXR1ZGVSZWYtMHgwMDA1DQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4ODgyYiA9IHNlbGZUaW1lck1vZGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg4ODJhID0gdGltZVpvbmVPZmZzZXQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg5MDAzID0gZGF0ZVRpbWVPcmlnaW5hbA0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDkwMDQgPSBjcmVhdGVEYXRlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4OTIwMSA9IHNodXR0ZXJTcGVlZFZhbHVlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4OTIwMiA9IGFwZXJ0dXJlVmFsdWUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg5MjAzID0gYnJpZ2h0bmVzc1ZhbHVlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4OTIwNCA9IGV4cG9zdXJlQ29tcGVuc2F0aW9uDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4OTIwNSA9IG1heEFwZXJ0dXJlVmFsdWUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg5MjA3ID0gbWV0ZXJpbmdNb2RlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4OTIwNiA9IHN1YmplY3REaXN0YW5jZQ0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDkyMDggPSBsaWdodFNvdXJjZQ0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDkyMDkgPSBmbGFzaA0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDkyMGEgPSBmb2NhbExlbmd0aA0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weDkyODYgPSB1c2VyQ29tbWVudA0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weGEwMDEgPSBjb2xvclNwYWNlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4YTAwMiA9IHBpeGVsWERpbWVuc2lvbg0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weGEwMDMgPSBwaXhlbFlEaW1lbnNpb24NCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHhhNDAyID0gZXhwb3N1cmVNb2RlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4YTQwMyA9IHdoaXRlQmFsYW5jZQ0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weGE0MjAgPSBpbWFnZVVuaXF1ZUlkDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4YTQzMCA9IG93bmVyTmFtZQ0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZXhpZi5pZC4weGE0MzEgPSBzZXJpYWxOdW1iZXINCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmV4aWYuaWQuMHg0NzQ2ID0gcmF0aW5nDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5leGlmLmlkLjB4NDc0OSA9IHJhdGluZ1BlcmNlbnQNCi0jIGdwcyBkaXJlY3RvcnkNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmdwcy5pZC4weDAwMDEgPSBncHNMYXRpdHVkZVJlZg0KLW1hcHBpbmcuY29udGVudFR5cGUuaW1hZ2UuZ3BzLmlkLjB4MDAwMiA9IGdwc0xhdGl0dWRlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5ncHMuaWQuMHgwMDAzID0gZ3BzTG9uZ2l0dWRlUmVmDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5ncHMuaWQuMHgwMDA0ID0gZ3BzTG9uZ2l0dWRlDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5ncHMuaWQuMHgwMDA1ID0gZ3BzQWx0aXR1ZGVSZWYNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmdwcy5pZC4weDAwMDYgPSBncHNBbHRpdHVkZQ0KLSMganBlZyBkaXJlY3RvcnkgDQotbWFwcGluZy5jb250ZW50VHlwZS5pbWFnZS5qcGVnLmlkLjB4MDAwMCA9IGRhdGFQcmVjaXNpb24NCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmpwZWcuaWQuMHgwMDAxID0gaW1hZ2VIZWlnaHQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmltYWdlLmpwZWcuaWQuMHgwMDAzID0gaW1hZ2VXaWR0aA0KLQ0KLSMgUERGIHR5cGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLnBkZi5pZC54bXBUUGdcOk5QYWdlcyA9IHBhZ2VDb3VudA0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmLmlkLnRpdGxlID0gdGl0bGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLnBkZi5pZC5hdXRob3IgPSBhdXRob3INCi1tYXBwaW5nLmNvbnRlbnRUeXBlLnBkZi5pZC5jcmVhdG9yID0gY3JlYXRvcg0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmLmlkLktleXdvcmRzID0ga2V5d29yZHMNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLnBkZi5pZC5wcm9kdWNlciA9IGFwcGxpY2F0aW9uTmFtZQ0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmLmlkLnN1YmplY3QgPSBzdWJqZWN0DQotbWFwcGluZy5jb250ZW50VHlwZS5wZGYuaWQuQ3JlYXRpb24tRGF0ZSA9IGNyZWF0aW9uRGF0ZQ0KLW1hcHBpbmcuY29udGVudFR5cGUucGRmLmlkLkxhc3QtTW9kaWZpZWQgPSBsYXN0U2F2ZURhdGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLnBkZi5pZC50cmFwcGVkICA9IHRyYXBwZWQNCi0NCi0jIE9mZmljZSB0eXBlDQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuQXBwbGljYXRpb24tTmFtZSA9IGFwcGxpY2F0aW9uTmFtZQ0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLkFwcGxpY2F0aW9uLVZlcnNpb24gPSBhcHBsaWNhdGlvblZlcnNpb24NCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5BdXRob3IgPSBhdXRob3INCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5DYXRlZ29yeSA9IGNhdGVnb3J5DQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuQ29udGVudC1TdGF0dXMgPSBjb250ZW50U3RhdHVzDQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuQ29tbWVudHMgPSBjb21tZW50cw0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLkNvbXBhbnkgPSBjb21wYW55DQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuS2V5d29yZHMgPSBrZXl3b3Jkcw0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLkxhc3QtQXV0aG9yID0gbGFzdEF1dGhvcg0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLk1hbmFnZXIgPSBtYW5hZ2VyDQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuTm90ZXMgPSBub3Rlcw0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLlByZXNlbnRhdGlvbi1Gb3JtYXQgPSBwcmVzZW50YXRpb25Gb3JtYXQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5SZXZpc2lvbi1OdW1iZXIgPSByZXZpc2lvbk51bWJlcg0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLlRlbXBsYXRlID0gdGVtcGxhdGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5WZXJzaW9uID0gdmVyc2lvbg0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLkNoYXJhY3Rlci1Db3VudCA9IGNoYXJhY3RlckNvdW50DQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuQ2hhcmFjdGVyLUNvdW50LVdpdGgtU3BhY2VzID0gY2hhcmFjdGVyQ291bnRXaXRoU3BhY2VzDQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuV29yZC1Db3VudCA9IHdvcmRDb3VudA0KLW1hcHBpbmcuY29udGVudFR5cGUub2ZmaWNlLmlkLkxpbmUtQ291bnQgPSBsaW5lQ291bnQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5QYWdlLUNvdW50ID0gcGFnZUNvdW50DQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuU2xpZGUtQ291bnQgPSBzbGlkZUNvdW50DQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuUGFyYWdyYXBoLUNvdW50ID0gcGFyYWdyYXBoQ291bnQNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5Ub3RhbC1UaW1lID0gdG90YWxUaW1lDQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuRWRpdC1UaW1lID0gZWRpdFRpbWUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5DcmVhdGlvbi1EYXRlID0gY3JlYXRpb25EYXRlDQotbWFwcGluZy5jb250ZW50VHlwZS5vZmZpY2UuaWQuTGFzdC1TYXZlLURhdGUgPSBsYXN0U2F2ZURhdGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLm9mZmljZS5pZC5MYXN0LVByaW50ZWQgPSBsYXN0UHJpbnRlZA0KLQ0KLSNlbWFpbA0KLW1hcHBpbmcuY29udGVudFR5cGUuZW1haWwuaWQuTWVzc2FnZS1SZWNpcGllbnQtQWRkcmVzcyBtZXNzYWdlUmVjaXBpZW50QWRkcmVzcw0KLW1hcHBpbmcuY29udGVudFR5cGUuZW1haWwuaWQuTWVzc2FnZS1Gcm9tID0gZnJvbQ0KLW1hcHBpbmcuY29udGVudFR5cGUuZW1haWwuaWQuTWVzc2FnZS1UbyA9IHRvDQotbWFwcGluZy5jb250ZW50VHlwZS5lbWFpbC50b2tlbml6ZXIudG8gPSA7DQotbWFwcGluZy5jb250ZW50VHlwZS5lbWFpbC5pZC5NZXNzYWdlLUNjID0gY2MNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmVtYWlsLnRva2VuaXplci5jYyA9IDsNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmVtYWlsLmlkLk1lc3NhZ2UtQmNjID0gYmNjDQotbWFwcGluZy5jb250ZW50VHlwZS5lbWFpbC50b2tlbml6ZXIuYmNjID0gOw0KLW1hcHBpbmcuY29udGVudFR5cGUuZW1haWwuaWQuc3ViamVjdCA9IHN1YmplY3QNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmVtYWlsLmlkLkNyZWF0aW9uLURhdGUgPSBjcmVhdGlvbkRhdGUNCi1tYXBwaW5nLmNvbnRlbnRUeXBlLmVtYWlsLmlkLkxhc3QtU2F2ZS1EYXRlID0gbGFzdFNhdmVEYXRlDQotDQotI3ZpZGVvDQotbWFwcGluZy5jb250ZW50VHlwZS52aWRlby5pZC54bXBETVw6YXJ0aXN0ID0gYXJ0aXN0DQotbWFwcGluZy5jb250ZW50VHlwZS52aWRlby5pZC54bXBETVw6YWxidW0gPSBhbGJ1bQ0KLW1hcHBpbmcuY29udGVudFR5cGUudmlkZW8uaWQudGl0bGUgPSB0aXRsZQ0KLW1hcHBpbmcuY29udGVudFR5cGUudmlkZW8uaWQueG1wRE1cOmxvZ0NvbW1lbnQgPSBjb21tZW50DQotbWFwcGluZy5jb250ZW50VHlwZS52aWRlby5pZC54bXBETVw6Z2VucmUgPSBnZW5yZQ0KLW1hcHBpbmcuY29udGVudFR5cGUudmlkZW8uaWQueHh4ID0gbGVuZ3RoDQotbWFwcGluZy5jb250ZW50VHlwZS52aWRlby5pZC54bXBETVw6dHJhY2tOdW1iZXIgPSB0cmFjaw0KLW1hcHBpbmcuY29udGVudFR5cGUudmlkZW8uaWQueG1wRE1cOnJlbGVhc2VEYXRlID0geWVhcg0KLW1hcHBpbmcuY29udGVudFR5cGUudmlkZW8uaWQudGlmZjpJbWFnZVdpZHRoID0gaW1hZ2VXaWR0aA0KLW1hcHBpbmcuY29udGVudFR5cGUudmlkZW8uaWQudGlmZjpJbWFnZUxlbmd0aCA9IGltYWdlSGVpZ2h0DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmJkZmU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLSAgICA8IS0tCi0gICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgVW5sZXNzCi0gICAgICAgIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICAgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjEzLjA8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbDwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5PcGVuQ01JUyBUZXN0IFV0aWxpdGllczwvbmFtZT4KLSAgICAKLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLSAgICAKLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1iaW5kaW5nczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvY29udGVudC9mcmFjdGFsL0NvbXBsZXhQb2ludC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvY29udGVudC9mcmFjdGFsL0NvbXBsZXhQb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2YyNjBiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL2NvbnRlbnQvZnJhY3RhbC9Db21wbGV4UG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwuY29udGVudC5mcmFjdGFsOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb21wbGV4UG9pbnQgew0KLSAgICBwcml2YXRlIGRvdWJsZSByZWFsOw0KLSAgICBwcml2YXRlIGRvdWJsZSBpbWFnaW5hcnk7DQotDQotICAgIHB1YmxpYyBDb21wbGV4UG9pbnQoZG91YmxlIHJlYWwsIGRvdWJsZSBpbWFnaW5hcnkpIHsNCi0gICAgICAgIHRoaXMucmVhbCA9IHJlYWw7DQotICAgICAgICB0aGlzLmltYWdpbmFyeSA9IGltYWdpbmFyeTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29tcGxleFBvaW50KCkgew0KLSAgICAgICAgcmVhbCA9IDAuMDsNCi0gICAgICAgIGltYWdpbmFyeSA9IDAuMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZG91YmxlIGdldEltYWdpbmFyeSgpIHsNCi0gICAgICAgIHJldHVybiBpbWFnaW5hcnk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGRvdWJsZSBnZXRSZWFsKCkgew0KLSAgICAgICAgcmV0dXJuIHJlYWw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0KENvbXBsZXhQb2ludCBjcCkgew0KLSAgICAgICAgcmVhbCA9IGNwLmdldFJlYWwoKTsNCi0gICAgICAgIGltYWdpbmFyeSA9IGNwLmdldEltYWdpbmFyeSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldChkb3VibGUgY3IsIGRvdWJsZSBjaSkgew0KLSAgICAgICAgcmVhbCA9IGNyOw0KLSAgICAgICAgaW1hZ2luYXJ5ID0gY2k7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvY29udGVudC9mcmFjdGFsL0NvbXBsZXhSZWN0YW5nbGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL2NvbnRlbnQvZnJhY3RhbC9Db21wbGV4UmVjdGFuZ2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWYwNDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvY29udGVudC9mcmFjdGFsL0NvbXBsZXhSZWN0YW5nbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXRpbC5jb250ZW50LmZyYWN0YWw7DQotDQotDQotcHVibGljIGNsYXNzIENvbXBsZXhSZWN0YW5nbGUgew0KLSAgICBwcml2YXRlIGRvdWJsZSBpTWluOyAvLyBpbWFnaW5hcnkNCi0gICAgcHJpdmF0ZSBkb3VibGUgaU1heDsNCi0gICAgcHJpdmF0ZSBkb3VibGUgck1pbjsgLy8gcmVhbA0KLSAgICBwcml2YXRlIGRvdWJsZSByTWF4Ow0KLQ0KLSAgICBwdWJsaWMgQ29tcGxleFJlY3RhbmdsZShkb3VibGUgcjEsIGRvdWJsZSByMiwgZG91YmxlIGkxLCBkb3VibGUgaTIpIHsNCi0gICAgICAgIHNldChyMSwgcjIsIGkxLCBpMik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbXBsZXhSZWN0YW5nbGUoKSB7DQotICAgICAgICBzZXQoMC4wLCAwLjAsIDAuMCwgMC4wKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29tcGxleFJlY3RhbmdsZShDb21wbGV4UmVjdGFuZ2xlIGNyKSB7DQotICAgICAgICBzZXQoY3IpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBkb3VibGUgZ2V0SU1pbigpIHsNCi0gICAgICAgIHJldHVybiBpTWluOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBkb3VibGUgZ2V0SU1heCgpIHsNCi0gICAgICAgIHJldHVybiBpTWF4Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBkb3VibGUgZ2V0Uk1pbigpIHsNCi0gICAgICAgIHJldHVybiByTWluOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBkb3VibGUgZ2V0Uk1heCgpIHsNCi0gICAgICAgIHJldHVybiByTWF4Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBkb3VibGUgZ2V0SGVpZ2h0KCkgew0KLSAgICAgICAgcmV0dXJuIGlNYXggLSBpTWluOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBkb3VibGUgZ2V0V2lkdGgoKSB7DQotICAgICAgICByZXR1cm4gck1heCAtIHJNaW47DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0KENvbXBsZXhSZWN0YW5nbGUgY3IpIHsNCi0gICAgICAgIHNldChjci5nZXRSTWluKCksIGNyLmdldFJNYXgoKSwgY3IuZ2V0SU1pbigpLCBjci5nZXRJTWF4KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldChDb21wbGV4UG9pbnQgcDEsIENvbXBsZXhQb2ludCBwMikgew0KLSAgICAgICAgc2V0KHAxLmdldFJlYWwoKSwgcDIuZ2V0UmVhbCgpLCBwMS5nZXRJbWFnaW5hcnkoKSwgcDIuZ2V0SW1hZ2luYXJ5KCkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldChkb3VibGUgcjEsIGRvdWJsZSByMiwgZG91YmxlIGkxLCBkb3VibGUgaTIpIHsNCi0gICAgICAgIGlmIChyMSA+IHIyKSB7DQotICAgICAgICAgICAgck1pbiA9IHIyOw0KLSAgICAgICAgICAgIHJNYXggPSByMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgck1pbiA9IHIxOw0KLSAgICAgICAgICAgIHJNYXggPSByMjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpMSA+IGkyKSB7DQotICAgICAgICAgICAgaU1pbiA9IGkyOw0KLSAgICAgICAgICAgIGlNYXggPSBpMTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaU1pbiA9IGkxOw0KLSAgICAgICAgICAgIGlNYXggPSBpMjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9jb250ZW50L2ZyYWN0YWwvRnJhY3RhbENhbGN1bGF0b3IuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL2NvbnRlbnQvZnJhY3RhbC9GcmFjdGFsQ2FsY3VsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRmYmQ0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL2NvbnRlbnQvZnJhY3RhbC9GcmFjdGFsQ2FsY3VsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXRpbC5jb250ZW50LmZyYWN0YWw7DQotDQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOw0KLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLQ0KLWZpbmFsIGNsYXNzIEZyYWN0YWxDYWxjdWxhdG9yIHsNCi0gICAgcHJpdmF0ZSBpbnRbXSBjb2xvck1hcDsNCi0gICAgcHJvdGVjdGVkIGludFtdW10gbm9JdGVyYXRpb25zOw0KLSAgICBwcml2YXRlIGRvdWJsZSBkZWx0YTsNCi0gICAgcHJpdmF0ZSBkb3VibGUgaVJhbmdlTWF4Ow0KLSAgICBwcml2YXRlIGRvdWJsZSBpUmFuZ2VNaW47DQotICAgIHByaXZhdGUgaW50IG1heEl0ZXJhdGlvbnM7DQotICAgIHByaXZhdGUgQ29tcGxleFJlY3RhbmdsZSBuZXdSZWN0Ow0KLSAgICBwcml2YXRlIGludCBudW1Db2xvcnM7DQotICAgIHByaXZhdGUgaW50IGltYWdlSGVpZ2h0Ow0KLSAgICBwcml2YXRlIGludCBpbWFnZVdpZHRoOw0KLSAgICBwcml2YXRlIGRvdWJsZSByUmFuZ2VNYXg7DQotICAgIHByaXZhdGUgZG91YmxlIHJSYW5nZU1pbjsNCi0gICAgLy8gRm9yIEp1bGlhIHNldDoNCi0gICAgcHJpdmF0ZSBkb3VibGUgY0p1bGlhUG9pbnRSID0gMC4wOyAvLyBSZWFsDQotICAgIHByaXZhdGUgZG91YmxlIGNKdWxpYVBvaW50SSA9IDAuMDsgLy8gSW1hZ2luYXJ5DQotICAgIGJvb2xlYW4gdXNlSnVsaWEgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIEZyYWN0YWxDYWxjdWxhdG9yKENvbXBsZXhSZWN0YW5nbGUgY29tcGxSZWN0LCBpbnQgbWF4SXRlcnMsIGludCBpbWdXaWR0aCwgaW50IGltZ0hlaWdodCwgaW50W10gY29sTWFwLA0KLSAgICAgICAgICAgIENvbXBsZXhQb2ludCBqdWxpYVBvaW50KSB7DQotICAgICAgICBtYXhJdGVyYXRpb25zID0gbWF4SXRlcnM7DQotICAgICAgICBuZXdSZWN0ID0gY29tcGxSZWN0Ow0KLSAgICAgICAgaW1hZ2VXaWR0aCA9IGltZ1dpZHRoOw0KLSAgICAgICAgaW1hZ2VIZWlnaHQgPSBpbWdIZWlnaHQ7DQotICAgICAgICBjb2xvck1hcCA9IEFycmF5cy5jb3B5T2YoY29sTWFwLCBjb2xNYXAubGVuZ3RoKTsNCi0gICAgICAgIG51bUNvbG9ycyA9IGNvbG9yTWFwLmxlbmd0aDsNCi0gICAgICAgIHJSYW5nZU1pbiA9IG5ld1JlY3QuZ2V0Uk1pbigpOw0KLSAgICAgICAgclJhbmdlTWF4ID0gbmV3UmVjdC5nZXRSTWF4KCk7DQotICAgICAgICBpUmFuZ2VNaW4gPSBuZXdSZWN0LmdldElNaW4oKTsNCi0gICAgICAgIGlSYW5nZU1heCA9IG5ld1JlY3QuZ2V0SU1heCgpOw0KLSAgICAgICAgZGVsdGEgPSAoclJhbmdlTWF4IC0gclJhbmdlTWluKSAvIGltYWdlV2lkdGg7DQotICAgICAgICBpZiAobnVsbCAhPSBqdWxpYVBvaW50KSB7DQotICAgICAgICAgICAgY0p1bGlhUG9pbnRSID0ganVsaWFQb2ludC5nZXRSZWFsKCk7DQotICAgICAgICAgICAgY0p1bGlhUG9pbnRJID0ganVsaWFQb2ludC5nZXRJbWFnaW5hcnkoKTsNCi0gICAgICAgICAgICB1c2VKdWxpYSA9IHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludFtdW10gY2FsY0ZyYWN0YWwoKSB7DQotICAgICAgICBub0l0ZXJhdGlvbnMgPSBuZXcgaW50WyBpbWFnZVdpZHRoIF1bIGltYWdlSGVpZ2h0IF07DQotDQotICAgICAgICAvLyBGb3IgZWFjaCBwaXhlbC4uLg0KLSAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBpbWFnZVdpZHRoOyB4KyspIHsNCi0gICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGltYWdlSGVpZ2h0OyB5KyspIHsNCi0gICAgICAgICAgICAgICAgZG91YmxlIHpSID0gclJhbmdlTWluICsgeCAqIGRlbHRhOw0KLSAgICAgICAgICAgICAgICBkb3VibGUgekkgPSBpUmFuZ2VNaW4gKyAoaW1hZ2VIZWlnaHQgLSB5KSAqIGRlbHRhOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBJcyB0aGUgcG9pbnQgaW5zaWRlIHRoZSBzZXQ/DQotICAgICAgICAgICAgICAgIGlmICh1c2VKdWxpYSkgew0KLSAgICAgICAgICAgICAgICAgICAgbm9JdGVyYXRpb25zW3hdW3ldID0gdGVzdFBvaW50SnVsaWFTZXQoelIsIHpJLCBtYXhJdGVyYXRpb25zKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIG5vSXRlcmF0aW9uc1t4XVt5XSA9IHRlc3RQb2ludE1hbmRlbGJyb3QoelIsIHpJLCBtYXhJdGVyYXRpb25zKTsNCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBub0l0ZXJhdGlvbnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgbWFwSXRlcnNUb0NvbG9ycyhpbnRbXVtdIGl0ZXJhdGlvbnMpIHsNCi0NCi0gICAgICAgIC8vIEFzc2lnbiBhIGNvbG9yIHRvIGV2ZXJ5IHBpeGVsICggeCAsIHkgKSBpbiB0aGUgSW1hZ2UsIGNvcnJlc3BvbmRpbmcNCi0gICAgICAgIC8vIHRvDQotICAgICAgICAvLyBvbmUgcG9pbnQsIHosIGluIHRoZSBpbWFnaW5hcnkgcGxhbmUgKCB6ciwgemkgKS4NCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZShpbWFnZVdpZHRoLCBpbWFnZUhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFXzNCWVRFX0JHUiApOw0KLQ0KLSAgICAgICAgLy8gRm9yIGVhY2ggcGl4ZWwuLi4NCi0gICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgaW1hZ2VXaWR0aDsgeCsrKSB7DQotICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBpbWFnZUhlaWdodDsgeSsrKSB7DQotICAgICAgICAgICAgICAgIGludCBjb2xvciA9IGdldENvbG9yKGl0ZXJhdGlvbnNbeF1beV0pOw0KLSAgICAgICAgICAgICAgICBpbWFnZS5zZXRSR0IoeCwgeSwgY29sb3IpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpbWFnZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgaW50IGdldENvbG9yKGludCBudW1JdGVyYXRpb25zKSB7DQotICAgICAgICBpbnQgYyA9IENvbG9yLmJsYWNrLmdldFJHQigpOw0KLQ0KLSAgICAgICAgaWYgKG51bUl0ZXJhdGlvbnMgIT0gMCkgew0KLSAgICAgICAgICAgIC8vIFRoZSBwb2ludCBpcyBvdXRzaWRlIHRoZSBzZXQuIEl0IGdldHMgYSBjb2xvciBiYXNlZCBvbiB0aGUgbnVtYmVyDQotICAgICAgICAgICAgLy8gb2YgaXRlcmF0aW9ucyBpdCB0b29rIHRvIGtub3cgdGhpcy4NCi0gICAgICAgICAgICBpbnQgY29sb3JOdW0gPSAoaW50KSAobnVtQ29sb3JzICogKDEuMCAtIChmbG9hdCkgbnVtSXRlcmF0aW9ucyAvIChmbG9hdCkgbWF4SXRlcmF0aW9ucykpOw0KLSAgICAgICAgICAgIGNvbG9yTnVtID0gKGNvbG9yTnVtID09IG51bUNvbG9ycykgPyAwIDogY29sb3JOdW07DQotDQotICAgICAgICAgICAgYyA9IGNvbG9yTWFwW2NvbG9yTnVtXTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IHRlc3RQb2ludE1hbmRlbGJyb3QoZG91YmxlIGNSLCBkb3VibGUgY0ksIGludCBtYXhJdGVyYXRpb25zKSB7DQotICAgICAgICAvLyBJcyB0aGUgZ2l2ZW4gY29tcGxleCBwb2ludCwgKGNSLCBjSSksIGluIHRoZSBNYW5kZWxicm90IHNldD8NCi0gICAgICAgIC8vIFVzZSB0aGUgZm9ybXVsYTogeiA8PSB6KnogKyBjLCB3aGVyZSB6IGlzIGluaXRpYWxseSBlcXVhbCB0byBjLg0KLSAgICAgICAgLy8gSWYgfHp8ID49IDIsIHRoZW4gdGhlIHBvaW50IGlzIG5vdCBpbiB0aGUgc2V0Lg0KLSAgICAgICAgLy8gUmV0dXJuIDAgaWYgdGhlIHBvaW50IGlzIGluIHRoZSBzZXQ7IGVsc2UgcmV0dXJuIHRoZSBudW1iZXIgb2YNCi0gICAgICAgIC8vIGl0ZXJhdGlvbnMgaXQgdG9vayB0byBkZWNpZGUgdGhhdCB0aGUgcG9pbnQgaXMgbm90IGluIHRoZSBzZXQuDQotICAgICAgICBkb3VibGUgelIgPSBjUjsNCi0gICAgICAgIGRvdWJsZSB6SSA9IGNJOw0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4SXRlcmF0aW9uczsgaSsrKSB7DQotICAgICAgICAgICAgLy8gVG8gc3F1YXJlIGEgY29tcGxleCBudW1iZXI6IChhK2JpKShhK2JpKSA9IGEqYSAtIGIqYiArIDJhYmkNCi0gICAgICAgICAgICBkb3VibGUgelJPbGQgPSB6UjsNCi0gICAgICAgICAgICB6UiA9IHpSICogelIgLSB6SSAqIHpJICsgY1I7DQotICAgICAgICAgICAgekkgPSAyICogelJPbGQgKiB6SSArIGNJOw0KLQ0KLSAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCBpZiB0aGUgZGlzdGFuY2UgZnJvbSB6IHRvIHRoZSBvcmlnaW4gaXMgPj0gMg0KLSAgICAgICAgICAgIC8vIHRoZW4gdGhlIHBvaW50IGlzIG91dCBvZiB0aGUgc2V0LiBUbyBhdm9pZCBhIHNxdWFyZSByb290LA0KLSAgICAgICAgICAgIC8vIHdlJ2xsIGluc3RlYWQgY2hlY2sgaWYgdGhlIGRpc3RhbmNlIHNxdWFyZWQgPj0gNC4NCi0gICAgICAgICAgICBkb3VibGUgZGlzdFNxdWFyZWQgPSB6UiAqIHpSICsgekkgKiB6STsNCi0gICAgICAgICAgICBpZiAoZGlzdFNxdWFyZWQgPj0gNCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gaTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGludCB0ZXN0UG9pbnRKdWxpYVNldChkb3VibGUgelIsIGRvdWJsZSB6SSwgaW50IG1heEl0ZXJhdGlvbnMpIHsNCi0gICAgICAgIC8vIElzIHRoZSBnaXZlbiBjb21wbGV4IHBvaW50LCAoelIsIHpJKSwgaW4gdGhlIEp1bGlhIHNldD8NCi0gICAgICAgIC8vIFVzZSB0aGUgZm9ybXVsYTogeiA8PSB6KnogKyBjLCB3aGVyZSB6IGlzIHRoZSBwb2ludCBiZWluZyB0ZXN0ZWQsDQotICAgICAgICAvLyBhbmQgYyBpcyB0aGUgSnVsaWEgU2V0IGNvbnN0YW50Lg0KLSAgICAgICAgLy8gSWYgfHp8ID49IDIsIHRoZW4gdGhlIHBvaW50IGlzIG5vdCBpbiB0aGUgc2V0Lg0KLSAgICAgICAgLy8gUmV0dXJuIDAgaWYgdGhlIHBvaW50IGlzIGluIHRoZSBzZXQ7IGVsc2UgcmV0dXJuIHRoZSBudW1iZXIgb2YNCi0gICAgICAgIC8vIGl0ZXJhdGlvbnMgaXQgdG9vayB0byBkZWNpZGUgdGhhdCB0aGUgcG9pbnQgaXMgbm90IGluIHRoZSBzZXQuDQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtYXhJdGVyYXRpb25zOyBpKyspIHsNCi0gICAgICAgICAgICBkb3VibGUgelJPbGQgPSB6UjsNCi0gICAgICAgICAgICAvLyBUbyBzcXVhcmUgYSBjb21wbGV4IG51bWJlcjogKGErYmkpKGErYmkpID0gYSphIC0gYipiICsgMmFiaQ0KLSAgICAgICAgICAgIHpSID0gelIgKiB6UiAtIHpJICogekkgKyBjSnVsaWFQb2ludFI7DQotICAgICAgICAgICAgekkgPSAyICogelJPbGQgKiB6SSArIGNKdWxpYVBvaW50STsNCi0gICAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgaWYgdGhlIGRpc3RhbmNlIGZyb20geiB0byB0aGUgb3JpZ2luIGlzID49IDINCi0gICAgICAgICAgICAvLyB0aGVuIHRoZSBwb2ludCBpcyBvdXQgb2YgdGhlIHNldC4gVG8gYXZvaWQgYSBzcXVhcmUgcm9vdCwNCi0gICAgICAgICAgICAvLyB3ZSdsbCBpbnN0ZWFkIGNoZWNrIGlmIHRoZSBkaXN0YW5jZSBzcXVhcmVkID49IDQuDQotICAgICAgICAgICAgZG91YmxlIGRpc3RTcXVhcmVkID0gelIgKiB6UiArIHpJICogekk7DQotICAgICAgICAgICAgaWYgKGRpc3RTcXVhcmVkID49IDQpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvY29udGVudC9mcmFjdGFsL0ZyYWN0YWxHZW5lcmF0b3IuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL2NvbnRlbnQvZnJhY3RhbC9GcmFjdGFsR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTIxYTYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvY29udGVudC9mcmFjdGFsL0ZyYWN0YWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBPcmlnaW5hbCBjb2RlIGluc3BpcmVkIGJ5IHdvcmsgZnJvbSBEYXZpZCBMZWJlcm5pZ2h0IAotICogc2VlOiBodHRwOi8vd3d3Lmd1aS5uZXQvZnJhY3RhbC5odG1sCi0gKiBlbWFpbCBhcyByZXF1ZXN0ZWQgaW4gb3JpZ2luYWwgc291cmNlIGhhcyBiZWVuIHNlbnQsCi0gKiB0byBkYXZpZEBsZWJlcmtuaWdodC5jb20sIGJ1dCBhZGRyZXNzIGlzIGludmFsaWQgKDIwMTItMDItMDcpCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLmNvbnRlbnQuZnJhY3RhbDsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JSU9JbWFnZTsKLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlUGFyYW07Ci1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlcjsKLWltcG9ydCBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZy5KUEVHSW1hZ2VXcml0ZVBhcmFtOwotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEZyYWN0YWxHZW5lcmF0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGcmFjdGFsR2VuZXJhdG9yLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaT09NX1NURVBTX1BFUl9CQVRDSCA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9JVEVSQVRJT05TID0gMzM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGxleFJlY3RhbmdsZSBJTklUSUFMX1JFQ1QgPSBuZXcgQ29tcGxleFJlY3RhbmdsZSgtMi4xLCAxLjEsIC0xLjMsIDEuMyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGxleFJlY3RhbmdsZSBJTklUSUFMX0pVTElBX1JFQ1QgPSBuZXcgQ29tcGxleFJlY3RhbmdsZSgtMi4wLCAyLjAsIC0yLjAsIDIuMCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfSVRFUkFUSU9OUyA9IDMzOwotCi0gICAgLy8gQ29sb3I6Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBpbnRbXT4gY29sb3JUYWJsZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JTX0JMQUNLX0FORF9XSElURSA9ICJibGFjayAmIHdoaXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JTX0JMVUVfSUNFID0gImJsdWUgaWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JTX0ZVTktZID0gImZ1bmt5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JTX1BBU1RFTCA9ICJwYXN0ZWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUlNfUFNZQ0hFREVMSUMgPSAicHN5Y2hlZGVsaWMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUlNfUFVSUExFX0hBWkUgPSAicHVycGxlIGhhemUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUlNfUkFESUNBTCA9ICJyYWRpY2FsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JTX1JBSU5CT1cgPSAicmFpbmJvdyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SU19SQUlOQk9XUyA9ICJyYWluYm93cyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SU19TQ0lOVElMTEFUSU9OID0gInNjaW50aWxsYXRpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUlNfV0FSUEVEID0gIndhcnBlZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SU19XSUxEID0gIndpbGQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUlNfWkVCUkEgPSAiemVicmEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNvbG9yU2NoZW1lcyA9IHsgQ09MT1JTX0JMQUNLX0FORF9XSElURSwgQ09MT1JTX0JMVUVfSUNFLCBDT0xPUlNfRlVOS1ksCi0gICAgICAgICAgICBDT0xPUlNfUEFTVEVMLCBDT0xPUlNfUFNZQ0hFREVMSUMsIENPTE9SU19QVVJQTEVfSEFaRSwgQ09MT1JTX1JBRElDQUwsIENPTE9SU19SQUlOQk9XLCBDT0xPUlNfUkFJTkJPV1MsCi0gICAgICAgICAgICBDT0xPUlNfU0NJTlRJTExBVElPTiwgQ09MT1JTX1dBUlBFRCwgQ09MT1JTX1dJTEQsIENPTE9SU19aRUJSQSB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUFHRV9IRUlHSFQgPSA1MTI7IC8vIGRlZmF1bHQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfV0lEVEggPSA1MTI7IC8vIGRlZmF1bHQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0NPTE9SUyA9IDUxMjsgLy8gY29sb3JzIHBlciBjb2xvcm1hcAotICAgIHByaXZhdGUgRnJhY3RhbENhbGN1bGF0b3IgY2FsY3VsYXRvcjsKLSAgICBwcml2YXRlIGludCBwcmV2aW91c0l0ZXJhdGlvbnMgPSAxOwotICAgIHByaXZhdGUgaW50IG1heEl0ZXJhdGlvbnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29sb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbmV3Um93VGlsZSwgbmV3Q29sVGlsZTsKLSAgICBwcml2YXRlIGludCBwYXJ0cyA9IDE2OwotICAgIHByaXZhdGUgaW50IHN0ZXBJbkJhdGNoID0gMDsKLSAgICBwcml2YXRlIENvbXBsZXhSZWN0YW5nbGUgcmVjdDsKLSAgICBwcml2YXRlIENvbXBsZXhQb2ludCBqdWxpYVBvaW50OwotCi0gICAgcHVibGljIEZyYWN0YWxHZW5lcmF0b3IoKSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotICAgICAgICByZWN0ID0gbmV3IENvbXBsZXhSZWN0YW5nbGUoLTEuNiwgLTEuMiwgLTAuMSwgMC4xKTsKLSAgICAgICAganVsaWFQb2ludCA9IG51bGw7IC8vIG5ldyBDb21wbGV4UG9pbnQoKTsKLSAgICAgICAgbWF4SXRlcmF0aW9ucyA9IERFRkFVTFRfTUFYX0lURVJBVElPTlM7Ci0KLSAgICAgICAgUmFuZG9tIHJhbiA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgY29sb3IgPSBjb2xvclNjaGVtZXNbcmFuLm5leHRJbnQoY29sb3JTY2hlbWVzLmxlbmd0aCldOwotICAgICAgICBwYXJ0cyA9IHJhbi5uZXh0SW50KDEzKSArIDM7Ci0gICAgICAgIExPRy5kZWJ1ZygiUGFydHM6ICIgKyBwYXJ0cyk7Ci0gICAgICAgIG1heEl0ZXJhdGlvbnMgPSBERUZBVUxUX01BWF9JVEVSQVRJT05TOwotICAgICAgICBMT0cuZGVidWcoIk9yaWdpbmFsIHJlY3QgIiArICI6ICgiICsgcmVjdC5nZXRSTWluKCkgKyAiciwiICsgcmVjdC5nZXRSTWF4KCkgKyAiciwgIiArIHJlY3QuZ2V0SU1pbigpICsgImksICIKLSAgICAgICAgICAgICAgICArIHJlY3QuZ2V0SU1heCgpICsgImkpIik7Ci0gICAgICAgIHJhbmRvbWl6ZVJlY3QocmVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBnZW5lcmF0ZUZyYWN0YWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKLQotICAgICAgICBpZiAoc3RlcEluQmF0Y2ggPT0gWk9PTV9TVEVQU19QRVJfQkFUQ0gpIHsKLSAgICAgICAgICAgIHN0ZXBJbkJhdGNoID0gMDsKLSAgICAgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICArK3N0ZXBJbkJhdGNoOwotICAgICAgICBMT0cuZGVidWcoIkdlbmVyYXRpbmcgcmVjdCBubyAiICsgc3RlcEluQmF0Y2ggKyAiOiAoIiArIHJlY3QuZ2V0Uk1pbigpICsgInIsIiArIHJlY3QuZ2V0Uk1heCgpICsgInIsICIKLSAgICAgICAgICAgICAgICArIHJlY3QuZ2V0SU1pbigpICsgImksICIgKyByZWN0LmdldElNYXgoKSArICJpKSIpOwotICAgICAgICBMT0cuZGVidWcoIiAgIHdpZHRoOiAiICsgcmVjdC5nZXRXaWR0aCgpICsgIiBoZWlnaHQ6ICIgKyByZWN0LmdldEhlaWdodCgpKTsKLSAgICAgICAgYm9zID0gZ2VuRnJhY3RhbChyZWN0LCBqdWxpYVBvaW50KTsKLQotICAgICAgICBkb3VibGUgcjFOZXcgPSByZWN0LmdldFdpZHRoKCkgKiBuZXdDb2xUaWxlIC8gcGFydHMgKyByZWN0LmdldFJNaW4oKTsKLSAgICAgICAgZG91YmxlIHIyTmV3ID0gcmVjdC5nZXRXaWR0aCgpICogKG5ld0NvbFRpbGUgKyAxKSAvIHBhcnRzICsgcmVjdC5nZXRSTWluKCk7Ci0gICAgICAgIGRvdWJsZSBpMU5ldyA9IHJlY3QuZ2V0SU1heCgpIC0gKHJlY3QuZ2V0SGVpZ2h0KCkgKiBuZXdSb3dUaWxlIC8gcGFydHMpOwotICAgICAgICBkb3VibGUgaTJOZXcgPSByZWN0LmdldElNYXgoKSAtIChyZWN0LmdldEhlaWdodCgpICogKG5ld1Jvd1RpbGUgKyAxKSAvIHBhcnRzKTsKLSAgICAgICAgcmVjdC5zZXQocjFOZXcsIHIyTmV3LCBpMU5ldywgaTJOZXcpOwotICAgICAgICByYW5kb21pemVSZWN0KHJlY3QpOwotICAgICAgICBMT0cuZGVidWcoIkRvbmUgZ2VuZXJhdGluZyBmcmFjdGFscy4iKTsKLQotICAgICAgICByZXR1cm4gYm9zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByYW5kb21pemVSZWN0KENvbXBsZXhSZWN0YW5nbGUgcmVjdCkgewotICAgICAgICBkb3VibGUgaml0dGVyRmFjdG9yID0gMC4xNTsgLy8gKy8tIDE1JQotICAgICAgICBkb3VibGUgcmFuID0gTWF0aC5yYW5kb20oKSAqIGppdHRlckZhY3RvciArICgxLjAgLSBqaXR0ZXJGYWN0b3IpOwotICAgICAgICBkb3VibGUgd2lkdGggPSByZWN0LmdldFdpZHRoKCkgKiByYW47Ci0gICAgICAgIHJhbiA9IE1hdGgucmFuZG9tKCkgKiBqaXR0ZXJGYWN0b3IgKyAoMS4wIC0gaml0dGVyRmFjdG9yKTsKLSAgICAgICAgZG91YmxlIGhlaWdodCA9IHJlY3QuZ2V0SGVpZ2h0KCkgKiByYW47Ci0gICAgICAgIHJhbiA9IE1hdGgucmFuZG9tKCkgKiBqaXR0ZXJGYWN0b3IgKyAoMS4wIC0gaml0dGVyRmFjdG9yKTsKLSAgICAgICAgZG91YmxlIHIxID0gKHJlY3QuZ2V0V2lkdGgoKSAtIHdpZHRoKSAqIHJhbiArIHJlY3QuZ2V0Uk1pbigpOwotICAgICAgICByYW4gPSBNYXRoLnJhbmRvbSgpICogaml0dGVyRmFjdG9yICsgKDEuMCAtIGppdHRlckZhY3Rvcik7Ci0gICAgICAgIGRvdWJsZSBpMSA9IChyZWN0LmdldEhlaWdodCgpIC0gaGVpZ2h0KSAqIHJhbiArIHJlY3QuZ2V0SU1pbigpOwotICAgICAgICByZWN0LnNldChyMSwgcjEgKyB3aWR0aCwgaTEsIGkxICsgaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBmcmFjdGFsIGltYWdlIGFzIEpQRUcgaW4gbWVtb3J5IGFuZCByZXR1cm4gaXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVjdAotICAgICAqICAgICAgICAgICAgcmVjdGFuZ2xlIG9mIG1hbmRlbGJyb3Qgb3IganVsaWEgc2V0Ci0gICAgICogQHBhcmFtIGp1bGlhUG9pbnQKLSAgICAgKiAgICAgICAgICAgIHBvaW50IGluIEp1bGlhIHNldCBvciBudWxsCi0gICAgICogQHJldHVybiBieXRlIGFycmF5IHdpdGggSlBFRyBzdHJlYW0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBnZW5GcmFjdGFsKENvbXBsZXhSZWN0YW5nbGUgcmVjdCwgQ29tcGxleFBvaW50IGp1bGlhUG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiBpc0p1bGlhID0gbnVsbCAhPSBqdWxpYVBvaW50OwotICAgICAgICBleHBhbmRSZWN0VG9GaXRJbWFnZShyZWN0KTsKLSAgICAgICAgaW5pdGlhbGl6ZUNvbG9ycygpOwotCi0gICAgICAgIG1heEl0ZXJhdGlvbnMgPSBtYXliZUd1ZXNzTWF4SXRlcmF0aW9ucyhtYXhJdGVyYXRpb25zLCByZWN0LCBpc0p1bGlhKTsKLSAgICAgICAgTE9HLmRlYnVnKCJ1c2luZyAiICsgbWF4SXRlcmF0aW9ucyArICIgaXRlcmF0aW9ucy4iKTsKLSAgICAgICAgZGV0ZWN0RGVlcFpvb20ocmVjdCk7Ci0KLSAgICAgICAgY2FsY3VsYXRvciA9IG5ldyBGcmFjdGFsQ2FsY3VsYXRvcihyZWN0LCBtYXhJdGVyYXRpb25zLCBJTUFHRV9XSURUSCwgSU1BR0VfSEVJR0hULCBnZXRDdXJyZW50Q29sb3JNYXAoKSwKLSAgICAgICAgICAgICAgICBqdWxpYVBvaW50KTsKLSAgICAgICAgaW50W11bXSBpdGVyYXRpb25zID0gY2FsY3VsYXRvci5jYWxjRnJhY3RhbCgpOwotICAgICAgICBCdWZmZXJlZEltYWdlIGltYWdlID0gY2FsY3VsYXRvci5tYXBJdGVyc1RvQ29sb3JzKGl0ZXJhdGlvbnMpOwotICAgICAgICBmaW5kTmV3UmVjdChpbWFnZSwgaXRlcmF0aW9ucyk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGltYWdlIGluIG1lbW9yeQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgyMDAgKiAxMDI0KTsKLSAgICAgICAgSW1hZ2VPdXRwdXRTdHJlYW0gaW9zID0gSW1hZ2VJTy5jcmVhdGVJbWFnZU91dHB1dFN0cmVhbShib3MpOwotICAgICAgICBJdGVyYXRvcjxJbWFnZVdyaXRlcj4gd3JpdGVycyA9IEltYWdlSU8uZ2V0SW1hZ2VXcml0ZXJzQnlGb3JtYXROYW1lKCJqcGciKTsKLSAgICAgICAgSW1hZ2VXcml0ZXIgaW1hZ2VXcml0ZXIgPSB3cml0ZXJzLm5leHQoKTsKLQotICAgICAgICBKUEVHSW1hZ2VXcml0ZVBhcmFtIHBhcmFtcyA9IG5ldyBKUEVHSW1hZ2VXcml0ZVBhcmFtKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICBwYXJhbXMuc2V0Q29tcHJlc3Npb25Nb2RlKEltYWdlV3JpdGVQYXJhbS5NT0RFX0VYUExJQ0lUKTsKLSAgICAgICAgcGFyYW1zLnNldENvbXByZXNzaW9uUXVhbGl0eSgwLjlmKTsKLQotICAgICAgICBpbWFnZVdyaXRlci5zZXRPdXRwdXQoaW9zKTsKLSAgICAgICAgaW1hZ2VXcml0ZXIud3JpdGUobnVsbCwgbmV3IElJT0ltYWdlKGltYWdlLCBudWxsLCBudWxsKSwgcGFyYW1zKTsKLSAgICAgICAgaW9zLmNsb3NlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGJvczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50W10gZ2V0Q3VycmVudENvbG9yTWFwKCkgewotICAgICAgICByZXR1cm4gY29sb3JUYWJsZS5nZXQoZ2V0Q29sb3IoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb2xvcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGV4cGFuZFJlY3RUb0ZpdEltYWdlKENvbXBsZXhSZWN0YW5nbGUgY29tcGxleFJlY3QpIHsKLSAgICAgICAgLy8gVGhlIGNvbXBsZXggcmVjdGFuZ2xlIG11c3QgYmUgc2NhbGVkIHRvIGZpdCB0aGUgcGl4ZWwgaW1hZ2Ugdmlldy4KLSAgICAgICAgLy8gTWV0aG9kOiBjb21wYXJlIHRoZSB3aWR0aC9oZWlnaHQgcmF0aW9zIG9mIHRoZSB0d28gcmVjdGFuZ2xlcy4KLSAgICAgICAgZG91YmxlIGltYWdlV0hSYXRpbyA9IDEuMDsKLSAgICAgICAgZG91YmxlIGNvbXBsZXhXSFJhdGlvID0gMS4wOwotICAgICAgICBkb3VibGUgaU1pbiA9IGNvbXBsZXhSZWN0LmdldElNaW4oKTsKLSAgICAgICAgZG91YmxlIGlNYXggPSBjb21wbGV4UmVjdC5nZXRJTWF4KCk7Ci0gICAgICAgIGRvdWJsZSByTWluID0gY29tcGxleFJlY3QuZ2V0Uk1pbigpOwotICAgICAgICBkb3VibGUgck1heCA9IGNvbXBsZXhSZWN0LmdldFJNYXgoKTsKLSAgICAgICAgZG91YmxlIGNvbXBsZXhXaWR0aCA9IHJNYXggLSByTWluOwotICAgICAgICBkb3VibGUgY29tcGxleEhlaWdodCA9IGlNYXggLSBpTWluOwotCi0gICAgICAgIGlmICgoSU1BR0VfV0lEVEggPiAwKSAmJiAoSU1BR0VfSEVJR0hUID4gMCkpIHsKLSAgICAgICAgICAgIGltYWdlV0hSYXRpbyA9ICgoZG91YmxlKSBJTUFHRV9XSURUSCAvIChkb3VibGUpIElNQUdFX0hFSUdIVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGNvbXBsZXhXaWR0aCA+IDApICYmIChjb21wbGV4SGVpZ2h0ID4gMCkpIHsKLSAgICAgICAgICAgIGNvbXBsZXhXSFJhdGlvID0gY29tcGxleFdpZHRoIC8gY29tcGxleEhlaWdodDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChEb3VibGUuY29tcGFyZShpbWFnZVdIUmF0aW8sIGNvbXBsZXhXSFJhdGlvKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW1hZ2VXSFJhdGlvIDwgY29tcGxleFdIUmF0aW8pIHsKLSAgICAgICAgICAgIC8vIEV4cGFuZCB2ZXJ0aWNhbGx5Ci0gICAgICAgICAgICBkb3VibGUgbmV3SGVpZ2h0ID0gY29tcGxleFdpZHRoIC8gaW1hZ2VXSFJhdGlvOwotICAgICAgICAgICAgZG91YmxlIGhlaWdodERpZmZlcmVuY2UgPSBNYXRoLmFicyhuZXdIZWlnaHQgLSBjb21wbGV4SGVpZ2h0KTsKLSAgICAgICAgICAgIGlNaW4gPSBpTWluIC0gaGVpZ2h0RGlmZmVyZW5jZSAvIDI7Ci0gICAgICAgICAgICBpTWF4ID0gaU1heCArIGhlaWdodERpZmZlcmVuY2UgLyAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRXhwYW5kIGhvcml6b250YWxseQotICAgICAgICAgICAgZG91YmxlIG5ld1dpZHRoID0gY29tcGxleEhlaWdodCAqIGltYWdlV0hSYXRpbzsKLSAgICAgICAgICAgIGRvdWJsZSB3aWR0aERpZmZlcmVuY2UgPSBNYXRoLmFicyhuZXdXaWR0aCAtIGNvbXBsZXhXaWR0aCk7Ci0gICAgICAgICAgICByTWluID0gck1pbiAtIHdpZHRoRGlmZmVyZW5jZSAvIDI7Ci0gICAgICAgICAgICByTWF4ID0gck1heCArIHdpZHRoRGlmZmVyZW5jZSAvIDI7Ci0gICAgICAgIH0KLSAgICAgICAgY29tcGxleFJlY3Quc2V0KHJNaW4sIHJNYXgsIGlNaW4sIGlNYXgpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGd1ZXNzTmV3TWF4SXRlcmF0aW9ucyhDb21wbGV4UmVjdGFuZ2xlIGNyLCBib29sZWFuIGlzSnVsaWEpIHsKLSAgICAgICAgLy8gVGhlIGhpZ2hlciB0aGUgem9vbSBmYWN0b3IsIHRoZSBtb3JlIGl0ZXJhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIHRvCi0gICAgICAgIC8vIHNlZQotICAgICAgICAvLyB0aGUgZGV0YWlsLiBHdWVzcyBhdCBhIG51bWJlciB0byBwcm9kdWNlIGEgY29vbCBsb29raW5nIGZyYWN0YWw6Ci0gICAgICAgIGRvdWJsZSB6b29tID0gSU5JVElBTF9SRUNULmdldFdpZHRoKCkgLyBjci5nZXRXaWR0aCgpOwotICAgICAgICBpZiAoem9vbSA8IDEuMCkgewotICAgICAgICAgICAgem9vbSA9IDEuMDsgLy8gZm9yY2VzIGxvZ1pvb20gPj0gMAotICAgICAgICB9Ci0gICAgICAgIGRvdWJsZSBsb2dab29tID0gTWF0aC5sb2coem9vbSk7Ci0gICAgICAgIGRvdWJsZSBtYWduaXR1ZGUgPSAobG9nWm9vbSAvIDIuMykgLSAyLjA7IC8vIGp1c3QgYSBndWVzcy4KLSAgICAgICAgaWYgKG1hZ25pdHVkZSA8IDEuMCkgewotICAgICAgICAgICAgbWFnbml0dWRlID0gMS4wOwotICAgICAgICB9Ci0gICAgICAgIGRvdWJsZSBpdGVyYXRpb25zID0gSU5JVElBTF9JVEVSQVRJT05TICogKG1hZ25pdHVkZSAqIGxvZ1pvb20gKyAxLjApOwotICAgICAgICBpZiAoaXNKdWxpYSkgewotICAgICAgICAgICAgaXRlcmF0aW9ucyAqPSAyLjA7IC8vIEp1bGlhIHNldHMgdGVuZCB0byBuZWVkIG1vcmUgaXRlcmF0aW9ucy4KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGludCkgaXRlcmF0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBtYXliZUd1ZXNzTWF4SXRlcmF0aW9ucyhpbnQgbWF4SXRlcmF0aW9ucywgQ29tcGxleFJlY3RhbmdsZSBjciwgYm9vbGVhbiBpc0p1bGlhKSB7Ci0gICAgICAgIC8vIElmIHRoZSB1c2VyIGRpZCBub3QgY2hhbmdlIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucywgbWFrZSBhIGd1ZXNzLi4uCi0gICAgICAgIGlmIChwcmV2aW91c0l0ZXJhdGlvbnMgPT0gbWF4SXRlcmF0aW9ucykgewotICAgICAgICAgICAgbWF4SXRlcmF0aW9ucyA9IGd1ZXNzTmV3TWF4SXRlcmF0aW9ucyhjciwgaXNKdWxpYSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldmlvdXNJdGVyYXRpb25zID0gbWF4SXRlcmF0aW9uczsKLSAgICAgICAgcmV0dXJuIG1heEl0ZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRldGVjdERlZXBab29tKENvbXBsZXhSZWN0YW5nbGUgY3IpIHsKLSAgICAgICAgLy8gIkRlZXAgWm9vbSIgb2NjdXJzIHdoZW4gdGhlIHByZWNpc2lvbiBwcm92aWRlZCBieSB0aGUgSmF2YSB0eXBlCi0gICAgICAgIC8vIGRvdWJsZQotICAgICAgICAvLyBydW5zIG91dCBvZiByZXNvbHV0aW9uLiBUaGUgdXNlIG9mIEJpZ0RlY2ltYWwgaXMgcmVxdWlyZWQgdG8gZml4Ci0gICAgICAgIC8vIHRoaXMuCi0gICAgICAgIGRvdWJsZSBkZWx0YURpdjIgPSBjci5nZXRXaWR0aCgpIC8gKChJTUFHRV9XSURUSCkgKiAyLjApOwotICAgICAgICBTdHJpbmcgbWluID0gIiIgKyAoY3IuZ2V0Uk1pbigpKTsKLSAgICAgICAgU3RyaW5nIG1pblBsdXMgPSAiIiArIChjci5nZXRSTWluKCkgKyBkZWx0YURpdjIpOwotCi0gICAgICAgIGlmIChEb3VibGUudmFsdWVPZihtaW4pLmRvdWJsZVZhbHVlKCkgPT0gRG91YmxlLnZhbHVlT2YobWluUGx1cykuZG91YmxlVmFsdWUoKSkgewotICAgICAgICAgICAgTE9HLndhcm4oIkRlZXAgWm9vbS4uLiAgRHJhd2luZyByZXNvbHV0aW9uIHdpbGwgYmUgZGVncmFkZWQgOy0oIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDb2xvcnMoKSB7Ci0gICAgICAgIGNvbG9yVGFibGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIGludFtdPigpOwotCi0gICAgICAgIGludCByZWQgPSAyNTU7Ci0gICAgICAgIGludCBncmVlbiA9IDI1NTsKLSAgICAgICAgaW50IGJsdWUgPSAyNTU7Ci0KLSAgICAgICAgZmxvYXQgaHVlID0gKGZsb2F0KSAxLjA7Ci0gICAgICAgIGZsb2F0IHNhdHVyYXRpb24gPSAoZmxvYXQpIDEuMDsKLSAgICAgICAgZmxvYXQgYnJpZ2h0bmVzcyA9IChmbG9hdCkgMS4wOwotCi0gICAgICAgIC8vIENPTE9SU19CTEFDS19BTkRfV0hJVEU6Ci0gICAgICAgIGludFtdIGNvbG9yTWFwID0gbmV3IGludFtOVU1fQ09MT1JTXTsKLSAgICAgICAgZm9yIChpbnQgY29sb3JOdW0gPSBOVU1fQ09MT1JTIC0gMTsgY29sb3JOdW0gPj0gMDsgY29sb3JOdW0tLSkgewotICAgICAgICAgICAgY29sb3JNYXBbY29sb3JOdW1dID0gQ29sb3Iud2hpdGUuZ2V0UkdCKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29sb3JUYWJsZS5wdXQoQ09MT1JTX0JMQUNLX0FORF9XSElURSwgY29sb3JNYXApOwotCi0gICAgICAgIC8vIENPTE9SU19CTFVFX0lDRToKLSAgICAgICAgYmx1ZSA9IDI1NTsKLSAgICAgICAgY29sb3JNYXAgPSBuZXcgaW50W05VTV9DT0xPUlNdOwotICAgICAgICBmb3IgKGludCBjb2xvck51bSA9IE5VTV9DT0xPUlMgLSAxOyBjb2xvck51bSA+PSAwOyBjb2xvck51bS0tKSB7Ci0gICAgICAgICAgICByZWQgPSAoaW50KSAoKDI1NSAqIChmbG9hdCkgY29sb3JOdW0gLyBOVU1fQ09MT1JTKSkgJSAyNTU7Ci0gICAgICAgICAgICBncmVlbiA9IChpbnQpICgoMjU1ICogKGZsb2F0KSBjb2xvck51bSAvIE5VTV9DT0xPUlMpKSAlIDI1NTsKLSAgICAgICAgICAgIGNvbG9yTWFwW2NvbG9yTnVtXSA9IG5ldyBDb2xvcihyZWQsIGdyZWVuLCBibHVlKS5nZXRSR0IoKTsKLSAgICAgICAgfQotICAgICAgICBjb2xvclRhYmxlLnB1dChDT0xPUlNfQkxVRV9JQ0UsIGNvbG9yTWFwKTsKLQotICAgICAgICAvLyBDT0xPUlNfRlVOS1k6Ci0gICAgICAgIGNvbG9yTWFwID0gbmV3IGludFtOVU1fQ09MT1JTXTsKLSAgICAgICAgZm9yIChpbnQgY29sb3JOdW0gPSBOVU1fQ09MT1JTIC0gMTsgY29sb3JOdW0gPj0gMDsgY29sb3JOdW0tLSkgewotICAgICAgICAgICAgcmVkID0gKGludCkgKCgxMDI0ICogKGZsb2F0KSBjb2xvck51bSAvIE5VTV9DT0xPUlMpKSAlIDI1NTsKLSAgICAgICAgICAgIGdyZWVuID0gKGludCkgKCg1MTIgKiAoZmxvYXQpIGNvbG9yTnVtIC8gTlVNX0NPTE9SUykpICUgMjU1OwotICAgICAgICAgICAgYmx1ZSA9IChpbnQpICgoMjU2ICogKGZsb2F0KSBjb2xvck51bSAvIE5VTV9DT0xPUlMpKSAlIDI1NTsKLSAgICAgICAgICAgIGNvbG9yTWFwW05VTV9DT0xPUlMgLSBjb2xvck51bSAtIDFdID0gbmV3IENvbG9yKHJlZCwgZ3JlZW4sIGJsdWUpLmdldFJHQigpOwotICAgICAgICB9Ci0gICAgICAgIGNvbG9yVGFibGUucHV0KENPTE9SU19GVU5LWSwgY29sb3JNYXApOwotCi0gICAgICAgIC8vIENPTE9SU19QQVNURUwKLSAgICAgICAgYnJpZ2h0bmVzcyA9IChmbG9hdCkgMS4wOwotICAgICAgICBjb2xvck1hcCA9IG5ldyBpbnRbTlVNX0NPTE9SU107Ci0gICAgICAgIGZvciAoaW50IGNvbG9yTnVtID0gMDsgY29sb3JOdW0gPCBOVU1fQ09MT1JTOyBjb2xvck51bSsrKSB7Ci0gICAgICAgICAgICBodWUgPSAoKGZsb2F0KSAoY29sb3JOdW0gKiA0KSAvIChmbG9hdCkgTlVNX0NPTE9SUykgJSBOVU1fQ09MT1JTOwotICAgICAgICAgICAgc2F0dXJhdGlvbiA9ICgoZmxvYXQpIChjb2xvck51bSAqIDIpIC8gKGZsb2F0KSBOVU1fQ09MT1JTKSAlIE5VTV9DT0xPUlM7Ci0gICAgICAgICAgICBjb2xvck1hcFtjb2xvck51bV0gPSBDb2xvci5IU0J0b1JHQihodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNvbG9yVGFibGUucHV0KENPTE9SU19QQVNURUwsIGNvbG9yTWFwKTsKLQotICAgICAgICAvLyBDT0xPUlNfUFNZQ0hFREVMSUM6Ci0gICAgICAgIHNhdHVyYXRpb24gPSAoZmxvYXQpIDEuMDsKLSAgICAgICAgY29sb3JNYXAgPSBuZXcgaW50W05VTV9DT0xPUlNdOwotICAgICAgICBmb3IgKGludCBjb2xvck51bSA9IDA7IGNvbG9yTnVtIDwgTlVNX0NPTE9SUzsgY29sb3JOdW0rKykgewotICAgICAgICAgICAgaHVlID0gKChmbG9hdCkgKGNvbG9yTnVtICogNSkgLyAoZmxvYXQpIE5VTV9DT0xPUlMpICUgTlVNX0NPTE9SUzsKLSAgICAgICAgICAgIGJyaWdodG5lc3MgPSAoKGZsb2F0KSAoY29sb3JOdW0gKiAyMCkgLyAoZmxvYXQpIE5VTV9DT0xPUlMpICUgTlVNX0NPTE9SUzsKLSAgICAgICAgICAgIGNvbG9yTWFwW2NvbG9yTnVtXSA9IENvbG9yLkhTQnRvUkdCKGh1ZSwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY29sb3JUYWJsZS5wdXQoQ09MT1JTX1BTWUNIRURFTElDLCBjb2xvck1hcCk7Ci0KLSAgICAgICAgLy8gQ09MT1JTX1BVUlBMRV9IQVpFOgotICAgICAgICByZWQgPSAyNTU7Ci0gICAgICAgIGJsdWUgPSAyNTU7Ci0gICAgICAgIGNvbG9yTWFwID0gbmV3IGludFtOVU1fQ09MT1JTXTsKLSAgICAgICAgZm9yIChpbnQgY29sb3JOdW0gPSBOVU1fQ09MT1JTIC0gMTsgY29sb3JOdW0gPj0gMDsgY29sb3JOdW0tLSkgewotICAgICAgICAgICAgZ3JlZW4gPSAoaW50KSAoKDI1NSAqIChmbG9hdCkgY29sb3JOdW0gLyBOVU1fQ09MT1JTKSkgJSAyNTU7Ci0gICAgICAgICAgICBjb2xvck1hcFtOVU1fQ09MT1JTIC0gY29sb3JOdW0gLSAxXSA9IG5ldyBDb2xvcihyZWQsIGdyZWVuLCBibHVlKS5nZXRSR0IoKTsKLSAgICAgICAgfQotICAgICAgICBjb2xvclRhYmxlLnB1dChDT0xPUlNfUFVSUExFX0hBWkUsIGNvbG9yTWFwKTsKLQotICAgICAgICAvLyBDT0xPUlNfUkFESUNBTDoKLSAgICAgICAgc2F0dXJhdGlvbiA9IChmbG9hdCkgMS4wOwotICAgICAgICBjb2xvck1hcCA9IG5ldyBpbnRbTlVNX0NPTE9SU107Ci0gICAgICAgIGZvciAoaW50IGNvbG9yTnVtID0gMDsgY29sb3JOdW0gPCBOVU1fQ09MT1JTOyBjb2xvck51bSsrKSB7Ci0gICAgICAgICAgICBodWUgPSAoKGZsb2F0KSAoY29sb3JOdW0gKiA3KSAvIChmbG9hdCkgTlVNX0NPTE9SUykgJSBOVU1fQ09MT1JTOwotICAgICAgICAgICAgYnJpZ2h0bmVzcyA9ICgoZmxvYXQpIChjb2xvck51bSAqIDQ5KSAvIChmbG9hdCkgTlVNX0NPTE9SUykgJSBOVU1fQ09MT1JTOwotICAgICAgICAgICAgY29sb3JNYXBbY29sb3JOdW1dID0gQ29sb3IuSFNCdG9SR0IoaHVlLCBzYXR1cmF0aW9uLCBicmlnaHRuZXNzKTsKLSAgICAgICAgfQotICAgICAgICBjb2xvclRhYmxlLnB1dChDT0xPUlNfUkFESUNBTCwgY29sb3JNYXApOwotCi0gICAgICAgIC8vIENPTE9SU19SQUlOQk9XOgotICAgICAgICBzYXR1cmF0aW9uID0gKGZsb2F0KSAxLjA7Ci0gICAgICAgIGJyaWdodG5lc3MgPSAoZmxvYXQpIDEuMDsKLSAgICAgICAgY29sb3JNYXAgPSBuZXcgaW50W05VTV9DT0xPUlNdOwotICAgICAgICBmb3IgKGludCBjb2xvck51bSA9IDA7IGNvbG9yTnVtIDwgTlVNX0NPTE9SUzsgY29sb3JOdW0rKykgewotICAgICAgICAgICAgaHVlID0gKGZsb2F0KSBjb2xvck51bSAvIChmbG9hdCkgTlVNX0NPTE9SUzsKLSAgICAgICAgICAgIGNvbG9yTWFwW2NvbG9yTnVtXSA9IENvbG9yLkhTQnRvUkdCKGh1ZSwgc2F0dXJhdGlvbiwgYnJpZ2h0bmVzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY29sb3JUYWJsZS5wdXQoQ09MT1JTX1JBSU5CT1csIGNvbG9yTWFwKTsKLQotICAgICAgICAvLyBDT0xPUlNfUkFJTkJPV1M6Ci0gICAgICAgIHNhdHVyYXRpb24gPSAoZmxvYXQpIDEuMDsKLSAgICAgICAgYnJpZ2h0bmVzcyA9IChmbG9hdCkgMS4wOwotICAgICAgICBjb2xvck1hcCA9IG5ldyBpbnRbTlVNX0NPTE9SU107Ci0gICAgICAgIGZvciAoaW50IGNvbG9yTnVtID0gMDsgY29sb3JOdW0gPCBOVU1fQ09MT1JTOyBjb2xvck51bSsrKSB7Ci0gICAgICAgICAgICBodWUgPSAoKGZsb2F0KSAoY29sb3JOdW0gKiA1KSAvIChmbG9hdCkgTlVNX0NPTE9SUykgJSBOVU1fQ09MT1JTOwotICAgICAgICAgICAgY29sb3JNYXBbY29sb3JOdW1dID0gQ29sb3IuSFNCdG9SR0IoaHVlLCBzYXR1cmF0aW9uLCBicmlnaHRuZXNzKTsKLSAgICAgICAgfQotICAgICAgICBjb2xvclRhYmxlLnB1dChDT0xPUlNfUkFJTkJPV1MsIGNvbG9yTWFwKTsKLQotICAgICAgICAvLyBDT0xPUlNfU0NJTlRJTExBVElPTgotICAgICAgICBicmlnaHRuZXNzID0gKGZsb2F0KSAxLjA7Ci0gICAgICAgIHNhdHVyYXRpb24gPSAoZmxvYXQpIDEuMDsKLSAgICAgICAgY29sb3JNYXAgPSBuZXcgaW50W05VTV9DT0xPUlNdOwotICAgICAgICBmb3IgKGludCBjb2xvck51bSA9IDA7IGNvbG9yTnVtIDwgTlVNX0NPTE9SUzsgY29sb3JOdW0rKykgewotICAgICAgICAgICAgaHVlID0gKChmbG9hdCkgKGNvbG9yTnVtICogMikgLyAoZmxvYXQpIE5VTV9DT0xPUlMpICUgTlVNX0NPTE9SUzsKLSAgICAgICAgICAgIGJyaWdodG5lc3MgPSAoKGZsb2F0KSAoY29sb3JOdW0gKiA1KSAvIChmbG9hdCkgTlVNX0NPTE9SUykgJSBOVU1fQ09MT1JTOwotICAgICAgICAgICAgY29sb3JNYXBbY29sb3JOdW1dID0gQ29sb3IuSFNCdG9SR0IoaHVlLCBzYXR1cmF0aW9uLCBicmlnaHRuZXNzKTsKLSAgICAgICAgfQotICAgICAgICBjb2xvclRhYmxlLnB1dChDT0xPUlNfU0NJTlRJTExBVElPTiwgY29sb3JNYXApOwotCi0gICAgICAgIC8vIENPTE9SU19XQVJQRUQ6Ci0gICAgICAgIGNvbG9yTWFwID0gbmV3IGludFtOVU1fQ09MT1JTXTsKLSAgICAgICAgZm9yIChpbnQgY29sb3JOdW0gPSBOVU1fQ09MT1JTIC0gMTsgY29sb3JOdW0gPj0gMDsgY29sb3JOdW0tLSkgewotICAgICAgICAgICAgcmVkID0gKGludCkgKCgxMDI0ICogKGZsb2F0KSBjb2xvck51bSAvIE5VTV9DT0xPUlMpKSAlIDI1NTsKLSAgICAgICAgICAgIGdyZWVuID0gKGludCkgKCgyNTYgKiAoZmxvYXQpIGNvbG9yTnVtIC8gTlVNX0NPTE9SUykpICUgMjU1OwotICAgICAgICAgICAgYmx1ZSA9IChpbnQpICgoNTEyICogKGZsb2F0KSBjb2xvck51bSAvIE5VTV9DT0xPUlMpKSAlIDI1NTsKLSAgICAgICAgICAgIGNvbG9yTWFwW05VTV9DT0xPUlMgLSBjb2xvck51bSAtIDFdID0gbmV3IENvbG9yKHJlZCwgZ3JlZW4sIGJsdWUpLmdldFJHQigpOwotICAgICAgICB9Ci0gICAgICAgIGNvbG9yVGFibGUucHV0KENPTE9SU19XQVJQRUQsIGNvbG9yTWFwKTsKLQotICAgICAgICAvLyBDT0xPUlNfV0lMRDoKLSAgICAgICAgY29sb3JNYXAgPSBuZXcgaW50W05VTV9DT0xPUlNdOwotICAgICAgICBmb3IgKGludCBjb2xvck51bSA9IDA7IGNvbG9yTnVtIDwgTlVNX0NPTE9SUzsgY29sb3JOdW0rKykgewotICAgICAgICAgICAgaHVlID0gKChmbG9hdCkgKGNvbG9yTnVtICogMSkgLyAoZmxvYXQpIE5VTV9DT0xPUlMpICUgTlVNX0NPTE9SUzsKLSAgICAgICAgICAgIHNhdHVyYXRpb24gPSAoKGZsb2F0KSAoY29sb3JOdW0gKiAyKSAvIChmbG9hdCkgTlVNX0NPTE9SUykgJSBOVU1fQ09MT1JTOwotICAgICAgICAgICAgYnJpZ2h0bmVzcyA9ICgoZmxvYXQpIChjb2xvck51bSAqIDQpIC8gKGZsb2F0KSBOVU1fQ09MT1JTKSAlIE5VTV9DT0xPUlM7Ci0gICAgICAgICAgICBjb2xvck1hcFtjb2xvck51bV0gPSBDb2xvci5IU0J0b1JHQihodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNvbG9yVGFibGUucHV0KENPTE9SU19XSUxELCBjb2xvck1hcCk7Ci0KLSAgICAgICAgLy8gQ09MT1JTX1pFQlJBOgotICAgICAgICBjb2xvck1hcCA9IG5ldyBpbnRbTlVNX0NPTE9SU107Ci0gICAgICAgIGZvciAoaW50IGNvbG9yTnVtID0gMDsgY29sb3JOdW0gPCBOVU1fQ09MT1JTOyBjb2xvck51bSsrKSB7Ci0gICAgICAgICAgICBpZiAoY29sb3JOdW0gJSAyID09IDApIHsKLSAgICAgICAgICAgICAgICBjb2xvck1hcFtjb2xvck51bV0gPSBDb2xvci53aGl0ZS5nZXRSR0IoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29sb3JNYXBbY29sb3JOdW1dID0gQ29sb3IuYmxhY2suZ2V0UkdCKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29sb3JUYWJsZS5wdXQoQ09MT1JTX1pFQlJBLCBjb2xvck1hcCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmROZXdSZWN0KEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UsIGludFtdW10gaXRlcmF0aW9ucykgewotCi0gICAgICAgIGludCBuZXdXaWR0aCA9IGltYWdlLmdldFdpZHRoKCkgLyBwYXJ0czsKLSAgICAgICAgaW50IG5ld0hlaWdodCA9IGltYWdlLmdldEhlaWdodCgpIC8gcGFydHM7Ci0gICAgICAgIGludCBpID0gMCwgaiA9IDA7Ci0gICAgICAgIGludCBub1RpbGVzID0gKGltYWdlLmdldFdpZHRoKCkgLyBuZXdXaWR0aCkgKiAoaW1hZ2UuZ2V0SGVpZ2h0KCkgLyBuZXdIZWlnaHQpOyAvLyBlcXVhbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcnMhCi0gICAgICAgIGRvdWJsZVtdIHN0ZERldiA9IG5ldyBkb3VibGVbbm9UaWxlc107Ci0KLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgKyBuZXdIZWlnaHQgPD0gaW1hZ2UuZ2V0SGVpZ2h0KCk7IHkgKz0gbmV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCArIG5ld1dpZHRoIDw9IGltYWdlLmdldFdpZHRoKCk7IHggKz0gbmV3V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgc3ViUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgbmV3V2lkdGgsIG5ld0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgc3RkRGV2W2kgKiBwYXJ0cyArIGpdID0gY2FsY1N0ZERldihpdGVyYXRpb25zLCBzdWJSZWN0KTsKLSAgICAgICAgICAgICAgICArK2o7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICBqID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmQgdGlsZSB3aXRoIGdyZWF0ZXN0IHN0ZCBkZXZpYXRpb246Ci0gICAgICAgIGRvdWJsZSBtYXggPSAwOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9UaWxlczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc3RkRGV2W2ldID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgIG1heCA9IHN0ZERldltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuZXdSb3dUaWxlID0gaW5kZXggLyBwYXJ0czsKLSAgICAgICAgbmV3Q29sVGlsZSA9IGluZGV4ICUgcGFydHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBkb3VibGUgY2FsY1N0ZERldihpbnRbXVtdIGl0ZXJhdGlvbnMsIFJlY3RhbmdsZSByZWN0KSB7Ci0KLSAgICAgICAgaW50IHN1bSA9IDA7Ci0gICAgICAgIGxvbmcgc3VtU3F1YXJlID0gMDsKLQotICAgICAgICBmb3IgKGludCB4ID0gcmVjdC54OyB4IDwgcmVjdC54ICsgcmVjdC53aWR0aDsgeCArPSAxKSB7Ci0gICAgICAgICAgICBmb3IgKGludCB5ID0gcmVjdC55OyB5IDwgcmVjdC55ICsgcmVjdC5oZWlnaHQ7IHkgKz0gMSkgewotICAgICAgICAgICAgICAgIGludCBpdGVycyA9IGl0ZXJhdGlvbnNbeF1beV07Ci0gICAgICAgICAgICAgICAgc3VtICs9IGl0ZXJzOwotICAgICAgICAgICAgICAgIHN1bVNxdWFyZSArPSBpdGVycyAqIGl0ZXJzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBjb3VudCA9IHJlY3Qud2lkdGggKiByZWN0LmhlaWdodDsKLSAgICAgICAgZG91YmxlIG1lYW4gPSAwLjA7Ci0KLSAgICAgICAgbWVhbiA9IChkb3VibGUpIHN1bSAvIGNvdW50OwotICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bVNxdWFyZSAvIChjb3VudCAtIChtZWFuICogbWVhbikpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL2NvbnRlbnQvbG9yZW1pcHN1bS9Mb3JlbUlwc3VtLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9jb250ZW50L2xvcmVtaXBzdW0vTG9yZW1JcHN1bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ5ZWE2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL2NvbnRlbnQvbG9yZW1pcHN1bS9Mb3JlbUlwc3VtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLmNvbnRlbnQubG9yZW1pcHN1bTsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5SYW5kb207DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQSBnZW5lcmF0b3Igb2YgbG9yZW0gaXBzdW0gdGV4dCBwb3J0ZWQgZnJvbSB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGF0DQotICogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2xvcmVtLWlwc3VtLWdlbmVyYXRvci8uIE5vdGU6IG9yaWdpbmFsIGNvZGUgbGljZW5zZWQNCi0gKiB1bmRlciB0aGUgQlNEIGxpY2Vuc2UNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9yZW1JcHN1bSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdvcmRMZW5ndGhQYWlyIHsNCi0gICAgICAgIHB1YmxpYyBpbnQgbGVuMTsNCi0gICAgICAgIHB1YmxpYyBpbnQgbGVuMjsNCi0NCi0gICAgICAgIHB1YmxpYyBXb3JkTGVuZ3RoUGFpcihpbnQgbGVuMSwgaW50IGxlbjIpIHsNCi0gICAgICAgICAgICB0aGlzLmxlbjEgPSBsZW4xOw0KLSAgICAgICAgICAgIHRoaXMubGVuMiA9IGxlbjI7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICAgICAgcmV0dXJuICJXb3JkTGVuZ3RoUGFpcjogbGVuMTogIiArIGxlbjEgKyAiLCBsZW4yOiAiICsgbGVuMjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgew0KLSAgICAgICAgICAgIGlmICh0aGlzID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChvdGhlci5nZXRDbGFzcygpICE9IGdldENsYXNzKCkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gKGxlbjEgPT0gKChXb3JkTGVuZ3RoUGFpcikgb3RoZXIpLmxlbjEgJiYgbGVuMiA9PSAoKFdvcmRMZW5ndGhQYWlyKSBvdGhlcikubGVuMik7DQotICAgICAgICB9DQotDQotICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGxlbjEgXiBsZW4yOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWxpbWl0ZXJzIHRoYXQgZW5kIHNlbnRlbmNlcy4NCi0gICAgICogDQotICAgICAqIEB0eXBlIHtBcnJheS48c3RyaW5nPn0NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVJTX1NFTlRFTkNFU1tdID0geyAiLiIsICI/IiwgIiEiIH07DQotDQotICAgIC8qKg0KLSAgICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwbGl0dGluZyBhIHRleHQgaW50byBzZW50ZW5jZXMuDQotICAgICAqIA0KLSAgICAgKiBAdHlwZSB7UmVnRXhwfQ0KLSAgICAgKiBAcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTlRFTkNFX1NQTElUX1JFR0VYID0gIltcXC5cXD9cXCFdIjsNCi0NCi0gICAgLyoqDQotICAgICAqIERlbGltaXRlcnMgdGhhdCBlbmQgd29yZHMuDQotICAgICAqIA0KLSAgICAgKiBAdHlwZSB7QXJyYXkuPHN0cmluZz59DQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSU19XT1JEU1tdID0geyAiLiIsICIsIiwgIj8iLCAiISIgfTsNCi0NCi0gICAgLyoqDQotICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BsaXR0aW5nIHRleHQgaW50byB3b3Jkcy4NCi0gICAgICogDQotICAgICAqIEB0eXBlIHtSZWdFeHB9DQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SRF9TUExJVF9SRUdFWCA9ICJcXHMiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7DQotDQotICAgIC8qKg0KLSAgICAgKiBXb3JkcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiBNYXBzIGEgd29yZC1sZW5ndGggdG8gYQ0KLSAgICAgKiBsaXN0IG9mIHdvcmRzIG9mIHRoYXQgbGVuZ3RoLg0KLSAgICAgKiANCi0gICAgICogQHR5cGUge2dvb2cuc3RydWN0cy5NYXB9DQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBMaXN0PFN0cmluZz4+IHdvcmRzOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ2hhaW5zIG9mIHRocmVlIHdvcmRzIHRoYXQgYXBwZWFyIGluIHRoZSBzYW1wbGUgdGV4dCBNYXBzIGEgcGFpciBvZg0KLSAgICAgKiB3b3JkLWxlbmd0aHMgdG8gYSB0aGlyZCB3b3JkLWxlbmd0aCBhbmQgYW4gb3B0aW9uYWwgcGllY2Ugb2YgdHJhaWxpbmcNCi0gICAgICogcHVuY3R1YXRpb24gKGZvciBleGFtcGxlLCBhIHBlcmlvZCwgY29tbWEsIGV0Yy4pLg0KLSAgICAgKiANCi0gICAgICogQHR5cGUge2dvb2cuc3RydWN0cy5NYXB9DQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIE1hcDxXb3JkTGVuZ3RoUGFpciwgTGlzdDxXb3JkSW5mbz4+IGNoYWluczsNCi0NCi0gICAgLyoqDQotICAgICAqIFBhaXJzIG9mIHdvcmQtbGVuZ3RocyB0aGF0IGNhbiBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiBzZW50ZW5jZXMuDQotICAgICAqIA0KLSAgICAgKiBAdHlwZSB7QXJyYXl9DQotICAgICAqLw0KLSAgICBwcml2YXRlIExpc3Q8V29yZExlbmd0aFBhaXI+IHN0YXJ0czsNCi0NCi0gICAgLyoqDQotICAgICAqIEF2ZXJhZ2Ugc2VudGVuY2UgbGVuZ3RoIGluIHdvcmRzLg0KLSAgICAgKiANCi0gICAgICogQHR5cGUge251bWJlcn0NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgZG91YmxlIHNlbnRlbmNlTWVhbjsNCi0NCi0gICAgLyoqDQotICAgICAqIFNpZ21hIChzcXJ0IG9mIE9iamVjdGlhbmNlKSBmb3IgdGhlIHNlbnRlbmNlIGxlbmd0aCBpbiB3b3Jkcy4NCi0gICAgICogDQotICAgICAqIEB0eXBlIHtudW1iZXJ9DQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIGRvdWJsZSBzZW50ZW5jZVNpZ21hOw0KLQ0KLSAgICAvKioNCi0gICAgICogQXZlcmFnZSBwYXJhZ3JhcGggbGVuZ3RoIGluIHNlbnRlbmNlcy4NCi0gICAgICogDQotICAgICAqIEB0eXBlIHtudW1iZXJ9DQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIGRvdWJsZSBwYXJhZ3JhcGhNZWFuOw0KLQ0KLSAgICAvKioNCi0gICAgICogU2lnbWEgKHNxcnQgb2YgdmFyaWFuY2UpIGZvciB0aGUgcGFyYWdyYXBoIGxlbmd0aCBpbiBzZW50ZW5jZXMuDQotICAgICAqIA0KLSAgICAgKiBAdHlwZSB7bnVtYmVyfQ0KLSAgICAgKiBAcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBkb3VibGUgcGFyYWdyYXBoU2lnbWE7DQotDQotICAgIC8qKg0KLSAgICAgKiBTYW1wbGUgdGhhdCB0aGUgZ2VuZXJhdGVkIHRleHQgaXMgYmFzZWQgb24gLg0KLSAgICAgKiANCi0gICAgICogQHR5cGUge3N0cmluZ30NCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIHNhbXBsZSA9IFNBTVBMRTsNCi0NCi0gICAgLyoqDQotICAgICAqIERpY3Rpb25hcnkgb2Ygd29yZHMuDQotICAgICAqIA0KLSAgICAgKiBAdHlwZSB7c3RyaW5nfQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGljdGlvbmFyeSA9IERJQ1Q7DQotDQotICAgIC8qKg0KLSAgICAgKiBQaWNrcyBhIHJhbmRvbSBlbGVtZW50IG9mIHRoZSBhcnJheS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwaWNrIGZyb20uDQotICAgICAqIEByZXR1cm4geyp9IEFuIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFdvcmRJbmZvIHJhbmRvbUNob2ljZShXb3JkSW5mb1tdIGFycmF5KSB7DQotICAgICAgICByZXR1cm4gYXJyYXlbcmFuZG9tSW50KGFycmF5Lmxlbmd0aCldOw0KLSAgICB9Ow0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyByYW5kb21DaG9pY2UoU3RyaW5nW10gYXJyYXkpIHsNCi0gICAgICAgIHJldHVybiBhcnJheVtyYW5kb21JbnQoYXJyYXkubGVuZ3RoKV07DQotICAgIH07DQotDQotICAgIHByaXZhdGUgaW50IHJhbmRvbUludChpbnQgbGVuZ3RoKSB7DQotICAgICAgICByZXR1cm4gcmFuZG9tR2VuZXJhdG9yLm5leHRJbnQobGVuZ3RoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXb3JkSW5mbyB7DQotICAgICAgICBpbnQgbGVuOw0KLSAgICAgICAgU3RyaW5nIGRlbGltOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgUmFuZG9tIHJhbmRvbUdlbmVyYXRvciA9IG5ldyBSYW5kb20oKTsNCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyByYW5kb20gc3RyaW5ncyBvZiAibG9yZW0gaXBzdW0iIHRleHQsIGJhc2VkIG9uIHRoZSB3b3JkDQotICAgICAqIGRpc3RyaWJ1dGlvbiBvZiBhIHNhbXBsZSB0ZXh0LCB1c2luZyB0aGUgd29yZHMgaW4gYSBkaWN0aW9uYXJ5Lg0KLSAgICAgKiANCi0gICAgICogQGNvbnN0cnVjdG9yDQotICAgICAqLw0KLSAgICBwdWJsaWMgTG9yZW1JcHN1bSgpIHsNCi0gICAgICAgIGdlbmVyYXRlQ2hhaW5zKHRoaXMuc2FtcGxlKTsNCi0gICAgICAgIGdlbmVyYXRlU3RhdGlzdGljcyh0aGlzLnNhbXBsZSk7DQotICAgICAgICBpbml0aWFsaXplRGljdGlvbmFyeSh0aGlzLmRpY3Rpb25hcnkpOw0KLSAgICB9Ow0KLQ0KLSAgICBwdWJsaWMgTG9yZW1JcHN1bShTdHJpbmcgc2FtcGxlLCBTdHJpbmcgZGljdGlvbmFyeSkgew0KLSAgICAgICAgdGhpcy5zYW1wbGUgPSBzYW1wbGU7DQotICAgICAgICB0aGlzLmRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5Ow0KLSAgICAgICAgZ2VuZXJhdGVDaGFpbnModGhpcy5zYW1wbGUpOw0KLSAgICAgICAgZ2VuZXJhdGVTdGF0aXN0aWNzKHRoaXMuc2FtcGxlKTsNCi0gICAgICAgIGluaXRpYWxpemVEaWN0aW9uYXJ5KHRoaXMuZGljdGlvbmFyeSk7DQotICAgIH07DQotDQotICAgIHB1YmxpYyBMb3JlbUlwc3VtKFN0cmluZyBzYW1wbGUsIFN0cmluZ1tdIG5ld0RpY3Rpb25hcnkpIHsNCi0gICAgICAgIHRoaXMuc2FtcGxlID0gc2FtcGxlOw0KLSAgICAgICAgdGhpcy5kaWN0aW9uYXJ5ID0gbnVsbDsNCi0gICAgICAgIGdlbmVyYXRlQ2hhaW5zKHRoaXMuc2FtcGxlKTsNCi0gICAgICAgIGdlbmVyYXRlU3RhdGlzdGljcyh0aGlzLnNhbXBsZSk7DQotICAgICAgICBpbml0aWFsaXplRGljdGlvbmFyeShuZXdEaWN0aW9uYXJ5KTsNCi0gICAgfTsNCi0NCi0gICAgcHVibGljIExvcmVtSXBzdW0oU3RyaW5nIHNhbXBsZSkgew0KLSAgICAgICAgdGhpcy5zYW1wbGUgPSBzYW1wbGU7DQotICAgICAgICBTdHJpbmdbXSBkaWN0V29yZHMgPSBmaWx0ZXJOb3RFbXB0eU9yV2hpdGVTcGFjZShzYW1wbGUuc3BsaXQoIlteXFxwe0x9XSIvKiAiXFxXIiAqLykpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7DQotICAgICAgICBTZXQ8U3RyaW5nPiBkaWN0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KGRpY3RXb3JkcykpOw0KLSAgICAgICAgZGljdFdvcmRzID0gZGljdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOw0KLSAgICAgICAgQXJyYXlzLnNvcnQoZGljdFdvcmRzKTsNCi0NCi0gICAgICAgIGdlbmVyYXRlQ2hhaW5zKHRoaXMuc2FtcGxlKTsNCi0gICAgICAgIGdlbmVyYXRlU3RhdGlzdGljcyh0aGlzLnNhbXBsZSk7DQotICAgICAgICBpbml0aWFsaXplRGljdGlvbmFyeShkaWN0V29yZHMpOw0KLSAgICB9Ow0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgc2luZ2xlIGxvcmVtIGlwc3VtIHBhcmFncmFwaCwgb2YgcmFuZG9tIGxlbmd0aC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0U3RhcnRXaXRoTG9yZW0gV2hldGhlciB0byBzdGFydCB0aGUgc2VudGVuY2Ugd2l0aCB0aGUNCi0gICAgICogICAgICAgIHN0YW5kYXJkICJMb3JlbSBpcHN1bS4uLiIgZmlyc3Qgc2VudGVuY2UuDQotICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGdlbmVyYXRlZCBzZW50ZW5jZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVQYXJhZ3JhcGgoYm9vbGVhbiBvcHRTdGFydFdpdGhMb3JlbSkgew0KLSAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcGFyYWdyYXBoIGlzIGEgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgcmFuZG9tDQotICAgICAgICAvLyBPYmplY3RpYWJsZS4NCi0gICAgICAgIERvdWJsZSBwYXJhZ3JhcGhMZW5ndGhEYmwgPSByYW5kb21Ob3JtYWwodGhpcy5wYXJhZ3JhcGhNZWFuLCB0aGlzLnBhcmFncmFwaFNpZ21hKTsNCi0gICAgICAgIGludCBwYXJhZ3JhcGhMZW5ndGggPSBNYXRoLm1heCgoaW50KSBNYXRoLmZsb29yKHBhcmFncmFwaExlbmd0aERibCksIDEpOw0KLQ0KLSAgICAgICAgLy8gQ29uc3RydWN0IGEgcGFyYWdyYXBoIGZyb20gYSBudW1iZXIgb2Ygc2VudGVuY2VzLg0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFncmFwaCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgYm9vbGVhbiBzdGFydFdpdGhMb3JlbSA9IG9wdFN0YXJ0V2l0aExvcmVtOw0KLSAgICAgICAgd2hpbGUgKHBhcmFncmFwaC5zaXplKCkgPCBwYXJhZ3JhcGhMZW5ndGgpIHsNCi0gICAgICAgICAgICBTdHJpbmcgc2VudGVuY2UgPSB0aGlzLmdlbmVyYXRlU2VudGVuY2Uoc3RhcnRXaXRoTG9yZW0pOw0KLSAgICAgICAgICAgIHBhcmFncmFwaC5hZGQoc2VudGVuY2UpOw0KLSAgICAgICAgICAgIHN0YXJ0V2l0aExvcmVtID0gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgLy8gRm9ybSB0aGUgcGFyYWdyYXBoIGludG8gYSBzdHJpbmcuDQotICAgICAgICBmb3IgKFN0cmluZyBzZW50ZW5jZSA6IHBhcmFncmFwaCkgew0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VudGVuY2UpOw0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgc2luZ2xlIHNlbnRlbmNlLCBvZiByYW5kb20gbGVuZ3RoLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRTdGFydFdpdGhMb3JlbSBXaGV0aGVyIHRvIHN0YXJ0IHRoZSBzZXRuZW5jZSB3aXRoIHRoZQ0KLSAgICAgKiAgICAgICAgc3RhbmRhcmQgIkxvcmVtIGlwc3VtLi4uIiBmaXJzdCBzZW50ZW5jZS4NCi0gICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIHNlbnRlbmNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZVNlbnRlbmNlKGJvb2xlYW4gb3B0U3RhcnRXaXRoTG9yZW0pIHsNCi0gICAgICAgIGlmICh0aGlzLmNoYWlucy5zaXplKCkgPT0gMCB8fCB0aGlzLnN0YXJ0cy5zaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBjaGFpbnMgY3JlYXRlZCAoSW52YWxpZCBzYW1wbGUgdGV4dD8pIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAodGhpcy53b3Jkcy5zaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBkaWN0aW9uYXJ5Iik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBzZW50ZW5jZSBpcyBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJhbmRvbQ0KLSAgICAgICAgLy8gT2JqZWN0aWFibGUuDQotICAgICAgICBkb3VibGUgc2VudGVuY2VMZW5ndGhEYmwgPSByYW5kb21Ob3JtYWwodGhpcy5zZW50ZW5jZU1lYW4sIHRoaXMuc2VudGVuY2VTaWdtYSk7DQotICAgICAgICBpbnQgc2VudGVuY2VMZW5ndGggPSBNYXRoLm1heCgoaW50KSBNYXRoLmZsb29yKHNlbnRlbmNlTGVuZ3RoRGJsKSwgMSk7DQotDQotICAgICAgICBTdHJpbmcgd29yZERlbGltaXRlciA9ICIiOyAvLyBEZWZpbmVkIGhlcmUgaW4gY2FzZSB3aGlsZSBsb29wIGRvZXNuJ3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bg0KLQ0KLSAgICAgICAgLy8gU3RhcnQgdGhlIHNlbnRlbmNlIHdpdGggIkxvcmVtIGlwc3VtLi4uIiwgaWYgZGVzaXJlZA0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHNlbnRlbmNlOw0KLQ0KLSAgICAgICAgaWYgKG9wdFN0YXJ0V2l0aExvcmVtKSB7DQotICAgICAgICAgICAgU3RyaW5nIGxvcmVtID0gImxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXRldXIgYWRpcGlzY2luZyBlbGl0IjsNCi0gICAgICAgICAgICBzZW50ZW5jZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KHNwbGl0V29yZHMobG9yZW0pKSk7DQotICAgICAgICAgICAgaWYgKHNlbnRlbmNlLnNpemUoKSA+IHNlbnRlbmNlTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgIHNlbnRlbmNlLnN1Ykxpc3QoMCwgc2VudGVuY2VMZW5ndGgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBTdHJpbmcgbGFzdFdvcmQgPSBzZW50ZW5jZS5nZXQoc2VudGVuY2Uuc2l6ZSgpIC0gMSk7DQotICAgICAgICAgICAgU3RyaW5nIGxhc3RDaGFyID0gbGFzdFdvcmQuc3Vic3RyaW5nKGxhc3RXb3JkLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgaWYgKGNvbnRhaW5zKERFTElNSVRFUlNfV09SRFMsIGxhc3RDaGFyKSkgew0KLSAgICAgICAgICAgICAgICB3b3JkRGVsaW1pdGVyID0gbGFzdENoYXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzZW50ZW5jZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgV29yZExlbmd0aFBhaXIgcHJldmlvdXMgPSBuZXcgV29yZExlbmd0aFBhaXIoMCwgMCk7DQotDQotICAgICAgICAvLyBHZW5lcmF0ZSBhIHNlbnRlbmNlIGZyb20gdGhlICJjaGFpbnMiDQotICAgICAgICB3aGlsZSAoc2VudGVuY2Uuc2l6ZSgpIDwgc2VudGVuY2VMZW5ndGgpIHsNCi0gICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBzdGFydGluZyBwb2ludCBpcyBpbnZhbGlkLCBjaG9vc2UgYW5vdGhlciByYW5kb21seQ0KLSAgICAgICAgICAgIGlmICghdGhpcy5jaGFpbnMuY29udGFpbnNLZXkocHJldmlvdXMpKSB7DQotICAgICAgICAgICAgICAgIHByZXZpb3VzID0gdGhpcy5jaG9vc2VSYW5kb21TdGFydF8oKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gQ2hvb3NlIHRoZSBuZXh0ICJjaGFpbiIgdG8gZ28gdG8uIFRoaXMgZGV0ZXJtaW5lcyB0aGUgbmV4dCB3b3JkDQotICAgICAgICAgICAgLy8gbGVuZ3RoIHdlIHVzZSwgYW5kIHdoZXRoZXIgdGhlcmUgaXMgZS5nLiBhIGNvbW1hIGF0IHRoZSBlbmQgb2YNCi0gICAgICAgICAgICAvLyB0aGUgd29yZC4NCi0gICAgICAgICAgICBXb3JkSW5mbyBjaGFpbiA9IHJhbmRvbUNob2ljZSh0aGlzLmNoYWlucy5nZXQocHJldmlvdXMpLnRvQXJyYXkobmV3IFdvcmRJbmZvWzBdKSk7DQotICAgICAgICAgICAgaW50IHdvcmRMZW5ndGggPSBjaGFpbi5sZW47DQotDQotICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZGVsaW1pdGVyIGNvbnRhaW5lZCBpbiB0aGUgY2hhaW4gaXMgYWxzbyBhIHNlbnRlbmNlDQotICAgICAgICAgICAgLy8gZGVsaW1pdGVyLCB0aGVuIHdlIGRvbiJ0IGluY2x1ZGUgaXQgYmVjYXVzZSB3ZSBkb24idCB3YW50IHRoZQ0KLSAgICAgICAgICAgIC8vIHNlbnRlbmNlIHRvIGVuZCBwcmVtYXR1cmVseSAod2Ugd2FudCB0aGUgbGVuZ3RoIHRvIG1hdGNoIHRoZQ0KLSAgICAgICAgICAgIC8vIHNlbnRlbmNlX2xlbmd0aCB2YWx1ZSkuDQotICAgICAgICAgICAgaWYgKGNvbnRhaW5zKERFTElNSVRFUlNfU0VOVEVOQ0VTLCBjaGFpbi5kZWxpbSkpIHsNCi0gICAgICAgICAgICAgICAgd29yZERlbGltaXRlciA9ICIiOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHdvcmREZWxpbWl0ZXIgPSBjaGFpbi5kZWxpbTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gQ2hvb3NlIGEgd29yZCByYW5kb21seSB0aGF0IG1hdGNoZXMgKG9yIGNsb3NlbHkgbWF0Y2hlcykgdGhlDQotICAgICAgICAgICAgLy8gbGVuZ3RoIHdlJ3JlIGFmdGVyLg0KLSAgICAgICAgICAgIGludCBjbG9zZXN0TGVuZ3RoID0gY2hvb3NlQ2xvc2VzdCh0aGlzLndvcmRzLmtleVNldCgpLnRvQXJyYXkobmV3IEludGVnZXJbMF0pLCB3b3JkTGVuZ3RoKTsNCi0gICAgICAgICAgICBTdHJpbmcgd29yZCA9IHJhbmRvbUNob2ljZSh0aGlzLndvcmRzLmdldChjbG9zZXN0TGVuZ3RoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsNCi0NCi0gICAgICAgICAgICBzZW50ZW5jZS5hZGQod29yZCArIHdvcmREZWxpbWl0ZXIpOw0KLSAgICAgICAgICAgIHByZXZpb3VzID0gbmV3IFdvcmRMZW5ndGhQYWlyKHByZXZpb3VzLmxlbjIsIHdvcmRMZW5ndGgpOw0KLQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gRmluaXNoIHRoZSBzZW50ZW5jZSBvZmYgd2l0aCBjYXBpdGFsaXNhdGlvbiwgYSBwZXJpb2QgYW5kDQotICAgICAgICAvLyBmb3JtIGl0IGludG8gYSBzdHJpbmcNCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICBmb3IgKFN0cmluZyBzIDogc2VudGVuY2UpIHsNCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMpOw0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJlc3VsdC5kZWxldGVDaGFyQXQocmVzdWx0Lmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICByZXN1bHQucmVwbGFjZSgwLCAxLCByZXN1bHQuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkpOw0KLSAgICAgICAgaW50IHN0ckxlbiA9IHJlc3VsdC5sZW5ndGgoKSAtIDE7DQotICAgICAgICBpZiAod29yZERlbGltaXRlci5sZW5ndGgoKSA+IDAgJiYgd29yZERlbGltaXRlci5jaGFyQXQoMCkgPT0gcmVzdWx0LmNoYXJBdChzdHJMZW4pKSB7DQotICAgICAgICAgICAgcmVzdWx0LmRlbGV0ZUNoYXJBdChzdHJMZW4pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLiIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlKCkgew0KLSAgICAgICAgcmV0dXJuIHNhbXBsZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTYW1wbGUoU3RyaW5nIHNhbXBsZSkgew0KLSAgICAgICAgdGhpcy5zYW1wbGUgPSBzYW1wbGU7DQotICAgICAgICBnZW5lcmF0ZUNoYWlucyh0aGlzLnNhbXBsZSk7DQotICAgICAgICBnZW5lcmF0ZVN0YXRpc3RpY3ModGhpcy5zYW1wbGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGljdGlvbmFyeSgpIHsNCi0gICAgICAgIHJldHVybiBkaWN0aW9uYXJ5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERpY3Rpb25hcnkoU3RyaW5nIGRpY3Rpb25hcnkpIHsNCi0gICAgICAgIHRoaXMuZGljdGlvbmFyeSA9IGRpY3Rpb25hcnk7DQotICAgICAgICBpbml0aWFsaXplRGljdGlvbmFyeSh0aGlzLmRpY3Rpb25hcnkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgbXVsdGlwbGUgcGFyYWdyYXBocyBvZiB0ZXh0LCB3aXRoIGJlZ2luIGJlZm9yZSB0aGUgcGFyYWdyYXBocywNCi0gICAgICogZW5kIGFmdGVyIHRoZSBwYXJhZ3JhcGhzLCBhbmQgYmV0d2VlbiBiZXR3ZWVuIGVhY2ggdHdvIHBhcmFncmFwaHMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZU1hcmt1cFBhcmFncmFwaHMoU3RyaW5nIGJlZ2luLCBTdHJpbmcgZW5kLCBTdHJpbmcgYmV0d2VlbiwgaW50IHF1YW50aXR5LA0KLSAgICAgICAgICAgIGJvb2xlYW4gc3RhcnRXaXRoTG9yZW0pIHsNCi0NCi0gICAgICAgIFN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQ0KLSAgICAgICAgdGV4dC5hcHBlbmQoYmVnaW4pOw0KLSAgICAgICAgU3RyaW5nIHBhcmEgPSBnZW5lcmF0ZVBhcmFncmFwaChzdGFydFdpdGhMb3JlbSk7DQotICAgICAgICB0ZXh0LmFwcGVuZChwYXJhKTsNCi0gICAgICAgIHdoaWxlICh0ZXh0Lmxlbmd0aCgpIDwgcXVhbnRpdHkpIHsNCi0gICAgICAgICAgICBwYXJhID0gZ2VuZXJhdGVQYXJhZ3JhcGgoZmFsc2UpOw0KLSAgICAgICAgICAgIHRleHQuYXBwZW5kKHBhcmEpOw0KLSAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpIDwgcXVhbnRpdHkpIHsNCi0gICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoYmV0d2Vlbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGV4dC5hcHBlbmQoZW5kKTsNCi0gICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyBtdWx0aXBsZSBwYXJhZ3JhcGhzIG9mIHRleHQsIHdpdGggYmVnaW4gYmVmb3JlIHRoZSBwYXJhZ3JhcGhzLA0KLSAgICAgKiBlbmQgYWZ0ZXIgdGhlIHBhcmFncmFwaHMsIGFuZCBiZXR3ZWVuIGJldHdlZW4gZWFjaCB0d28gcGFyYWdyYXBocy4NCi0gICAgICogDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZU1hcmt1cFBhcmFncmFwaHMoQXBwZW5kYWJsZSB3cml0ZXIsIFN0cmluZyBiZWdpbiwgU3RyaW5nIGVuZCwgU3RyaW5nIGJldHdlZW4sIGludCBxdWFudGl0eSwNCi0gICAgICAgICAgICBib29sZWFuIHN0YXJ0V2l0aExvcmVtKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgaW50IGxlbiA9IGJlZ2luLmxlbmd0aCgpOw0KLSAgICAgICAgd3JpdGVyLmFwcGVuZChiZWdpbik7DQotICAgICAgICBTdHJpbmcgcGFyYSA9IGdlbmVyYXRlUGFyYWdyYXBoKHN0YXJ0V2l0aExvcmVtKTsNCi0gICAgICAgIGxlbiArPSBwYXJhLmxlbmd0aCgpOw0KLSAgICAgICAgd3JpdGVyLmFwcGVuZChwYXJhKTsNCi0gICAgICAgIHdoaWxlIChsZW4gPCBxdWFudGl0eSkgew0KLSAgICAgICAgICAgIHBhcmEgPSBnZW5lcmF0ZVBhcmFncmFwaChmYWxzZSk7DQotICAgICAgICAgICAgbGVuICs9IHBhcmEubGVuZ3RoKCk7DQotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChwYXJhKTsNCi0gICAgICAgICAgICBpZiAobGVuIDwgcXVhbnRpdHkpIHsNCi0gICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChiZXR3ZWVuKTsNCi0gICAgICAgICAgICAgICAgbGVuICs9IHBhcmEubGVuZ3RoKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JpdGVyLmFwcGVuZChlbmQpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgbXVsdGlwbGUgc2VudGVuY2VzIG9mIHRleHQsIHdpdGggYmVnaW4gYmVmb3JlIHRoZSBzZW50ZW5jZXMsDQotICAgICAqIGVuZCBhZnRlciB0aGUgc2VudGVuY2VzLCBhbmQgYmV0d2VlbiBiZXR3ZWVuIGVhY2ggdHdvIHNlbnRlbmNlcy4NCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlTWFya3VwU2VudGVuY2VzKFN0cmluZyBiZWdpbiwgU3RyaW5nIGVuZCwgU3RyaW5nIGJldHdlZW4sIGludCBxdWFudGl0eSwNCi0gICAgICAgICAgICBib29sZWFuIHN0YXJ0V2l0aExvcmVtKSB7DQotDQotICAgICAgICBTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIHRleHQuYXBwZW5kKGJlZ2luKTsNCi0gICAgICAgIFN0cmluZyBzZW50ZW5jZSA9IGdlbmVyYXRlU2VudGVuY2Uoc3RhcnRXaXRoTG9yZW0pOw0KLSAgICAgICAgdGV4dC5hcHBlbmQoc2VudGVuY2UpOw0KLQ0KLSAgICAgICAgd2hpbGUgKHRleHQubGVuZ3RoKCkgPCBxdWFudGl0eSkgew0KLSAgICAgICAgICAgIHNlbnRlbmNlID0gZ2VuZXJhdGVTZW50ZW5jZShmYWxzZSk7DQotICAgICAgICAgICAgdGV4dC5hcHBlbmQoc2VudGVuY2UpOw0KLSAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpIDwgcXVhbnRpdHkpIHsNCi0gICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoYmV0d2Vlbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGV4dC5hcHBlbmQoZW5kKTsNCi0gICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyB0aGUgY2hhaW5zIGFuZCBzdGFydHMgdmFsdWVzIHJlcXVpcmVkIGZvciBzZW50ZW5jZSBnZW5lcmF0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IHNhbXBsZSBUaGUgc2FtZSB0ZXh0Lg0KLSAgICAgKiBAcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ2hhaW5zKFN0cmluZyBzYW1wbGUpIHsNCi0NCi0gICAgICAgIFN0cmluZ1tdIHdvcmRzID0gc3BsaXRXb3JkcyhzYW1wbGUpOw0KLSAgICAgICAgV29yZEluZm9bXSB3b3JkSW5mb3MgPSBnZW5lcmF0ZVdvcmRJbmZvKHdvcmRzKTsNCi0gICAgICAgIFdvcmRMZW5ndGhQYWlyIHByZXZpb3VzID0gbmV3IFdvcmRMZW5ndGhQYWlyKDAsIDApOw0KLSAgICAgICAgTGlzdDxXb3JkTGVuZ3RoUGFpcj4gc3RhcnRzID0gbmV3IEFycmF5TGlzdDxXb3JkTGVuZ3RoUGFpcj4oKTsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBkZWxpbUxpc3QgPSBBcnJheXMuYXNMaXN0KERFTElNSVRFUlNfU0VOVEVOQ0VTKTsNCi0gICAgICAgIE1hcDxXb3JkTGVuZ3RoUGFpciwgTGlzdDxXb3JkSW5mbz4+IGNoYWlucyA9IG5ldyBIYXNoTWFwPFdvcmRMZW5ndGhQYWlyLCBMaXN0PFdvcmRJbmZvPj4oKTsNCi0NCi0gICAgICAgIGZvciAoV29yZEluZm8gd2kgOiB3b3JkSW5mb3MpIHsNCi0gICAgICAgICAgICBpZiAod2kubGVuID09IDApIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIExpc3Q8V29yZEluZm8+IHZhbHVlID0gY2hhaW5zLmdldChwcmV2aW91cyk7DQotICAgICAgICAgICAgaWYgKG51bGwgPT0gdmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgY2hhaW5zLnB1dChwcmV2aW91cywgbmV3IEFycmF5TGlzdDxXb3JkSW5mbz4oKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgY2hhaW5zLmdldChwcmV2aW91cykuYWRkKHdpKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKGRlbGltTGlzdC5jb250YWlucyh3aS5kZWxpbSkpIHsNCi0gICAgICAgICAgICAgICAgc3RhcnRzLmFkZChwcmV2aW91cyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHByZXZpb3VzLmxlbjEgPSBwcmV2aW91cy5sZW4yOw0KLSAgICAgICAgICAgIHByZXZpb3VzLmxlbjIgPSB3aS5sZW47DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoY2hhaW5zLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHNhbXBsZSB0ZXh0LiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdGhpcy5jaGFpbnMgPSBjaGFpbnM7DQotICAgICAgICB0aGlzLnN0YXJ0cyA9IHN0YXJ0czsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNlbnRlbmNlIGFuZCBwYXJhZ3JhcGgNCi0gICAgICogbGVuZ3Rocy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzYW1wbGUgVGhlIHNhbWUgdGV4dC4NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVN0YXRpc3RpY3MoU3RyaW5nIHNhbXBsZSkgew0KLSAgICAgICAgdGhpcy5nZW5lcmF0ZVNlbnRlbmNlU3RhdGlzdGljcyhzYW1wbGUpOw0KLSAgICAgICAgdGhpcy5nZW5lcmF0ZVBhcmFncmFwaFN0YXRpc3RpY3Moc2FtcGxlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBsZW5ndGhzIG9mIHNlbnRlbmNlcw0KLSAgICAgKiAoaW4gd29yZHMpIGluIGEgc2FtcGxlIHRleHQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2FtcGxlIFRoZSBzYW1lIHRleHQuDQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTZW50ZW5jZVN0YXRpc3RpY3MoU3RyaW5nIHNhbXBsZSkgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHNlbnRlbmNlcyA9IGZpbHRlck5vdEVtcHR5T3JXaGl0ZVNwYWNlKHNwbGl0U2VudGVuY2VzKHNhbXBsZSkpOw0KLSAgICAgICAgaW50IHNlbnRlbmNlTGVuZ3Roc1tdID0gbmV3IGludFtzZW50ZW5jZXMuc2l6ZSgpXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VudGVuY2VzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgU3RyaW5nW10gd29yZHMgPSBzcGxpdFdvcmRzKHNlbnRlbmNlcy5nZXQoaSkpOw0KLSAgICAgICAgICAgIHNlbnRlbmNlTGVuZ3Roc1tpXSA9IHdvcmRzLmxlbmd0aDsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMuc2VudGVuY2VNZWFuID0gbWVhbihzZW50ZW5jZUxlbmd0aHMpOw0KLSAgICAgICAgdGhpcy5zZW50ZW5jZVNpZ21hID0gc2lnbWEoc2VudGVuY2VMZW5ndGhzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2FsY3VsYXRlcyB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBsZW5ndGhzIG9mIHBhcmFncmFwaHMNCi0gICAgICogKGluIHNlbnRlbmNlcykgaW4gYSBzYW1wbGUgdGV4dC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzYW1wbGUgVGhlIHNhbWUgdGV4dC4NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVBhcmFncmFwaFN0YXRpc3RpY3MoU3RyaW5nIHNhbXBsZSkgew0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFncmFwaHMgPSBmaWx0ZXJOb3RFbXB0eU9yV2hpdGVTcGFjZShzcGxpdFBhcmFncmFwaHMoc2FtcGxlKSk7DQotDQotICAgICAgICBpbnQgcGFyYWdyYXBoTGVuZ3Roc1tdID0gbmV3IGludFtwYXJhZ3JhcGhzLnNpemUoKV07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBTdHJpbmdbXSBzZW50ZW5jZXMgPSBzcGxpdFNlbnRlbmNlcyhwYXJhZ3JhcGhzLmdldChpKSk7DQotICAgICAgICAgICAgcGFyYWdyYXBoTGVuZ3Roc1tpXSA9IHNlbnRlbmNlcy5sZW5ndGg7DQotICAgICAgICB9DQotDQotICAgICAgICB0aGlzLnBhcmFncmFwaE1lYW4gPSBtZWFuKHBhcmFncmFwaExlbmd0aHMpOw0KLSAgICAgICAgdGhpcy5wYXJhZ3JhcGhTaWdtYSA9IHNpZ21hKHBhcmFncmFwaExlbmd0aHMpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBnZW5lcmF0b3IgdG8gdXNlIGEgZ2l2ZW4gc2VsZWN0aW9uIG9mIHdvcmRzIGZvciBnZW5lcmF0aW5nDQotICAgICAqIHNlbnRlbmNlcyB3aXRoLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IGRpY3Rpb25hcnkgVGhlIGRpY3Rpb25hcnkgdG8gdXNlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEaWN0aW9uYXJ5KFN0cmluZyBkaWN0aW9uYXJ5KSB7DQotICAgICAgICBTdHJpbmdbXSBkaWN0aW9uYXJ5V29yZHMgPSBzcGxpdFdvcmRzKGRpY3Rpb25hcnkpOw0KLSAgICAgICAgaW5pdGlhbGl6ZURpY3Rpb25hcnkoZGljdGlvbmFyeVdvcmRzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURpY3Rpb25hcnkoU3RyaW5nW10gZGljdGlvbmFyeVdvcmRzKSB7DQotICAgICAgICB3b3JkcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExpc3Q8U3RyaW5nPj4oKTsNCi0gICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBkaWN0aW9uYXJ5V29yZHMpIHsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gd29yZFdpdGhMZW4gPSB3b3Jkcy5nZXQod29yZC5sZW5ndGgoKSk7DQotICAgICAgICAgICAgaWYgKG51bGwgPT0gd29yZFdpdGhMZW4pIHsNCi0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICAgICAgbGlzdC5hZGQod29yZCk7DQotICAgICAgICAgICAgICAgIHdvcmRzLnB1dCh3b3JkLmxlbmd0aCgpLCBsaXN0KTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB3b3JkV2l0aExlbi5hZGQod29yZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHdvcmRzLnNpemUoKSA9PSAwKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgZGljdGlvbmFyeS4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUGlja3MgYSByYW5kb20gc3RhcnRpbmcgY2hhaW4uDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdGFydGluZyBrZXkuDQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFdvcmRMZW5ndGhQYWlyIGNob29zZVJhbmRvbVN0YXJ0XygpIHsNCi0gICAgICAgIFNldDxXb3JkTGVuZ3RoUGFpcj4ga2V5cyA9IGNoYWlucy5rZXlTZXQoKTsNCi0gICAgICAgIFNldDxXb3JkTGVuZ3RoUGFpcj4gdmFsaWRTdGFydHMgPSBuZXcgSGFzaFNldDxXb3JkTGVuZ3RoUGFpcj4oc3RhcnRzKTsNCi0gICAgICAgIHZhbGlkU3RhcnRzLnJldGFpbkFsbChrZXlzKTsNCi0gICAgICAgIGludCBpbmRleCA9IHJhbmRvbUludCh2YWxpZFN0YXJ0cy5zaXplKCkpOw0KLSAgICAgICAgV29yZExlbmd0aFBhaXIgd2xQYWlyID0gdmFsaWRTdGFydHMudG9BcnJheShuZXcgV29yZExlbmd0aFBhaXJbMF0pW2luZGV4XTsNCi0gICAgICAgIHJldHVybiB3bFBhaXI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNwbGl0cyBhIHBpZWNlIG9mIHRleHQgaW50byBwYXJhZ3JhcGhzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gc3BsaXQuDQotICAgICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBBbiBhcnJheSBvZiBwYXJhZ3JhcGhzLg0KLSAgICAgKiBAcHJpdmF0ZQ0KLSAgICAgKi8NCi0NCi0gICAgc3RhdGljIFN0cmluZ1tdIHNwbGl0UGFyYWdyYXBocyhTdHJpbmcgdGV4dCkgew0KLSAgICAgICAgcmV0dXJuIGZpbHRlck5vdEVtcHR5T3JXaGl0ZVNwYWNlKHRleHQuc3BsaXQoIlxuIikpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNwbGl0cyBhIHBpZWNlIG9mIHRleHQgaW50byBzZW50ZW5jZXMuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGV4dCB0byBzcGxpdC4NCi0gICAgICogQHJldHVybiB7QXJyYXkuPHN0cmluZz59IEFuIGFycmF5IG9mIHNlbnRlbmNlcy4NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBTdHJpbmdbXSBzcGxpdFNlbnRlbmNlcyhTdHJpbmcgdGV4dCkgew0KLSAgICAgICAgcmV0dXJuIGZpbHRlck5vdEVtcHR5T3JXaGl0ZVNwYWNlKHRleHQuc3BsaXQoU0VOVEVOQ0VfU1BMSVRfUkVHRVgpKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTcGxpdHMgYSBwaWVjZSBvZiB0ZXh0IGludG8gd29yZHMuLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHRleHQgdG8gc3BsaXQuDQotICAgICAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSBBbiBhcnJheSBvZiB3b3Jkcy4NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHN0YXRpYyBTdHJpbmdbXSBzcGxpdFdvcmRzKFN0cmluZyB0ZXh0KSB7DQotICAgICAgICByZXR1cm4gZmlsdGVyTm90RW1wdHlPcldoaXRlU3BhY2UodGV4dC5zcGxpdChXT1JEX1NQTElUX1JFR0VYKSkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgbnVtYmVyIGluIHRoZSBsaXN0IG9mIHZhbHVlcyB0aGF0IGlzIGNsb3Nlc3QgdG8gdGhlIHRhcmdldC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IHZhbHVlcyBUaGUgdmFsdWVzLg0KLSAgICAgKiBAcGFyYW0ge251bWJlcn0gdGFyZ2V0IFRoZSB0YXJnZXQgdmFsdWUuDQotICAgICAqIEByZXR1cm4ge251bWJlcn0gVGhlIGNsb3Nlc3QgdmFsdWUuDQotICAgICAqLw0KLSAgICBzdGF0aWMgaW50IGNob29zZUNsb3Nlc3QoSW50ZWdlcltdIHZhbHVlcywgaW50IHRhcmdldCkgew0KLSAgICAgICAgaW50IGNsb3Nlc3QgPSB2YWx1ZXNbMF07DQotICAgICAgICBmb3IgKGludCB2YWx1ZSA6IHZhbHVlcykgew0KLSAgICAgICAgICAgIGlmIChNYXRoLmFicyh0YXJnZXQgLSB2YWx1ZSkgPCBNYXRoLmFicyh0YXJnZXQgLSBjbG9zZXN0KSkgew0KLSAgICAgICAgICAgICAgICBjbG9zZXN0ID0gdmFsdWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGNsb3Nlc3Q7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgaW5mbyBhYm91dCBhIHdvcmQgdXNlZCBhcyBwYXJ0IG9mIHRoZSBsb3JlbSBpcHN1bSBhbGdvcml0aG0uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0ge3N0cmluZ30gd29yZCBUaGUgd29yZCB0byBjaGVjay4NCi0gICAgICogQHJldHVybiB7QXJyYXl9IEEgdHdvIGVsZW1lbnQgYXJyYXkuIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzaXplIG9mIHRoZQ0KLSAgICAgKiAgICAgICAgIHdvcmQuIFRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgZGVsaW1pdGVyIHVzZWQgaW4gdGhlIHdvcmQuDQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBXb3JkSW5mbyBnZXRXb3JkSW5mbyhTdHJpbmcgd29yZCkgew0KLSAgICAgICAgV29yZEluZm8gcmV0ID0gbmV3IFdvcmRJbmZvKCk7DQotICAgICAgICBmb3IgKFN0cmluZyBkZWxpbSA6IERFTElNSVRFUlNfV09SRFMpIHsNCi0gICAgICAgICAgICBpZiAod29yZC5lbmRzV2l0aChkZWxpbSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0LmxlbiA9IHdvcmQubGVuZ3RoKCkgLSBkZWxpbS5sZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgcmV0LmRlbGltID0gZGVsaW07DQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0LmxlbiA9IHdvcmQubGVuZ3RoKCk7DQotICAgICAgICByZXQuZGVsaW0gPSAiIjsNCi0gICAgICAgIHJldHVybiByZXQ7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgV29yZEluZm9bXSBnZW5lcmF0ZVdvcmRJbmZvKFN0cmluZ1tdIHdvcmRzKSB7DQotICAgICAgICBXb3JkSW5mb1tdIHJlc3VsdCA9IG5ldyBXb3JkSW5mb1t3b3Jkcy5sZW5ndGhdOw0KLSAgICAgICAgaW50IGkgPSAwOw0KLSAgICAgICAgZm9yIChTdHJpbmcgd29yZCA6IHdvcmRzKSB7DQotICAgICAgICAgICAgcmVzdWx0W2krK10gPSBnZXRXb3JkSW5mbyh3b3JkKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0YW50IHVzZWQgZm9yIHtAbGluayAjcmFuZG9tTm9ybWFsX30uDQotICAgICAqIA0KLSAgICAgKiBAdHlwZSB7bnVtYmVyfQ0KLSAgICAgKiBAcHJpdmF0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIE5WX01BR0lDQ09OU1RfID0gNCAqIE1hdGguZXhwKC0wLjUpIC8gTWF0aC5zcXJ0KDIuMCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIGZvciBhIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkDQotICAgICAqIG1lYW4gYW5kIHNpZ21hLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHtudW1iZXJ9IG11IFRoZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb24uDQotICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaWdtYSBUaGUgc2lnbWEgb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGRvdWJsZSByYW5kb21Ob3JtYWwoZG91YmxlIG11LCBkb3VibGUgc2lnbWEpIHsNCi0gICAgICAgIGRvdWJsZSB6ID0gMC4wZDsNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgICAgICAgICAgZG91YmxlIHUxID0gTWF0aC5yYW5kb20oKTsNCi0gICAgICAgICAgICBkb3VibGUgdTIgPSAxLjBkIC0gTWF0aC5yYW5kb20oKTsNCi0gICAgICAgICAgICB6ID0gTlZfTUFHSUNDT05TVF8gKiAodTEgLSAwLjVkKSAvIHUyOw0KLSAgICAgICAgICAgIGRvdWJsZSB6eiA9IHogKiB6IC8gNC4wZDsNCi0gICAgICAgICAgICBpZiAoenogPD0gLU1hdGgubG9nKHUyKSkgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbXUgKyB6ICogc2lnbWE7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgdGhlIHRleHQgaWYgaXQgaXMgbm90IGVtcHR5IG9yIGp1c3Qgd2hpdGVzcGFjZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IHRoZSB0ZXh0IHRvIGNoZWNrLg0KLSAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSB0ZXh0IGlzIG5laXRoZXIgZW1wdHkgbm9yIHdoaXRlc3BhY2UuDQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gZmlsdGVyTm90RW1wdHlPcldoaXRlU3BhY2UoU3RyaW5nW10gYXJyKSB7DQotICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICBmb3IgKFN0cmluZyBzIDogYXJyKSB7DQotICAgICAgICAgICAgU3RyaW5nIHRyaW1zID0gcy50cmltKCk7DQotICAgICAgICAgICAgaWYgKHRyaW1zLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHRyaW1zKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIG1lYW4oaW50W10gdmFsdWVzKSB7DQotICAgICAgICByZXR1cm4gKChkb3VibGUpIHN1bSh2YWx1ZXMpKSAvICgoZG91YmxlKSAoTWF0aC5tYXgodmFsdWVzLmxlbmd0aCwgMSkpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBtZWFuKGRvdWJsZVtdIHZhbHVlcykgew0KLSAgICAgICAgcmV0dXJuIHN1bSh2YWx1ZXMpIC8gKChNYXRoLm1heCh2YWx1ZXMubGVuZ3RoLCAxKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHZhcmlhbmNlKGRvdWJsZVtdIHZhbHVlcykgew0KLSAgICAgICAgZG91YmxlW10gc3F1YXJlZCA9IG5ldyBkb3VibGVbdmFsdWVzLmxlbmd0aF07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHNxdWFyZWRbaV0gPSB2YWx1ZXNbaV0gKiB2YWx1ZXNbaV07DQotICAgICAgICB9DQotDQotICAgICAgICBkb3VibGUgbWVhblZhbCA9IG1lYW4odmFsdWVzKTsNCi0gICAgICAgIHJldHVybiBtZWFuKHNxdWFyZWQpIC0gKG1lYW5WYWwgKiBtZWFuVmFsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBzaWdtYShpbnRbXSB2YWx1ZXMpIHsNCi0gICAgICAgIGRvdWJsZVtdIGQgPSBuZXcgZG91YmxlW3ZhbHVlcy5sZW5ndGhdOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBkW2ldID0gdmFsdWVzW2ldOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHNpZ21hKGQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHNpZ21hKGRvdWJsZVtdIHZhbHVlcykgew0KLSAgICAgICAgcmV0dXJuIE1hdGguc3FydCh2YXJpYW5jZSh2YWx1ZXMpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGludCBzdW0oaW50W10gdmFsdWVzKSB7DQotICAgICAgICBpbnQgc3VtID0gMDsNCi0gICAgICAgIGZvciAoaW50IHZhbCA6IHZhbHVlcykgew0KLSAgICAgICAgICAgIHN1bSArPSB2YWw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3VtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHN1bShkb3VibGVbXSB2YWx1ZXMpIHsNCi0gICAgICAgIGRvdWJsZSBzdW0gPSAwLjBkOw0KLSAgICAgICAgZm9yIChkb3VibGUgdmFsIDogdmFsdWVzKSB7DQotICAgICAgICAgICAgc3VtICs9IHZhbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIGFycmF5LCBTdHJpbmcgdmFsKSB7DQotICAgICAgICBmb3IgKFN0cmluZyBzIDogYXJyYXkpIHsNCi0gICAgICAgICAgICBpZiAocy5lcXVhbHModmFsKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgLyogZm9yIHVuaXQgdGVzdGluZyAqLw0KLSAgICBkb3VibGUgZ2V0U2VudGVuY2VNZWFuKCkgew0KLSAgICAgICAgcmV0dXJuIHNlbnRlbmNlTWVhbjsNCi0gICAgfQ0KLQ0KLSAgICBkb3VibGUgZ2V0U2VudGVuY2VTaWdtYSgpIHsNCi0gICAgICAgIHJldHVybiBzZW50ZW5jZVNpZ21hOw0KLSAgICB9DQotDQotICAgIGRvdWJsZSBnZXRQYXJhZ3JhcGhNZWFuKCkgew0KLSAgICAgICAgcmV0dXJuIHBhcmFncmFwaE1lYW47DQotICAgIH0NCi0NCi0gICAgZG91YmxlIGdldFBhcmFncmFwaFNpZ21hKCkgew0KLSAgICAgICAgcmV0dXJuIHBhcmFncmFwaFNpZ21hOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBEaWN0aW9uYXJ5IG9mIHdvcmRzIGZvciBsb3JlbSBpcHN1bS4NCi0gICAgICogDQotICAgICAqIEB0eXBlIHtzdHJpbmd9DQotICAgICAqIEBwcml2YXRlDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElDVCA9ICJhIGFjIGFjY3Vtc2FuIGFkIGFkaXBpc2NpbmcgYWVuZWFuIGFsaXF1YW0gYWxpcXVldCBhbWV0IGFudGUgIg0KLSAgICAgICAgICAgICsgImFwdGVudCBhcmN1IGF0IGF1Y3RvciBhdWd1ZSBiaWJlbmR1bSBibGFuZGl0IGNsYXNzIGNvbW1vZG8gIg0KLSAgICAgICAgICAgICsgImNvbmRpbWVudHVtIGNvbmd1ZSBjb25zZWN0ZXR1ZXIgY29uc2VxdWF0IGNvbnViaWEgY29udmFsbGlzIGNyYXMgIg0KLSAgICAgICAgICAgICsgImN1YmlsaWEgY3VtIGN1cmFiaXR1ciBjdXJhZSBjdXJzdXMgZGFwaWJ1cyBkaWFtIGRpY3R1bSBkaWN0dW1zdCAiDQotICAgICAgICAgICAgKyAiZGlnbmlzc2ltIGRpcyBkb2xvciBkb25lYyBkdWkgZHVpcyBlZ2VzdGFzIGVnZXQgZWxlaWZlbmQgZWxlbWVudHVtICINCi0gICAgICAgICAgICArICJlbGl0IGVuaSBlbmltIGVyYXQgZXJvcyBlc3QgZXQgZXRpYW0gZXUgZXVpc21vZCBmYWNpbGlzaSBmYWNpbGlzaXMgIg0KLSAgICAgICAgICAgICsgImZhbWVzIGZhdWNpYnVzIGZlbGlzIGZlcm1lbnR1bSBmZXVnaWF0IGZyaW5naWxsYSBmdXNjZSBncmF2aWRhICINCi0gICAgICAgICAgICArICJoYWJpdGFudCBoYWJpdGFzc2UgaGFjIGhlbmRyZXJpdCBoeW1lbmFlb3MgaWFjdWxpcyBpZCBpbXBlcmRpZXQgIg0KLSAgICAgICAgICAgICsgImluIGluY2VwdG9zIGludGVnZXIgaW50ZXJkdW0gaXBzdW0ganVzdG8gbGFjaW5pYSBsYWN1cyBsYW9yZWV0ICINCi0gICAgICAgICAgICArICJsZWN0dXMgbGVvIGxpYmVybyBsaWd1bGEgbGl0b3JhIGxvYm9ydGlzIGxvcmVtIGx1Y3R1cyBtYWVjZW5hcyAiDQotICAgICAgICAgICAgKyAibWFnbmEgbWFnbmlzIG1hbGVzdWFkYSBtYXNzYSBtYXR0aXMgbWF1cmlzIG1ldHVzIG1pIG1vbGVzdGllICINCi0gICAgICAgICAgICArICJtb2xsaXMgbW9udGVzIG1vcmJpIG11cyBuYW0gbmFzY2V0dXIgbmF0b3F1ZSBuZWMgbmVxdWUgbmV0dXMgIg0KLSAgICAgICAgICAgICsgIm5pYmggbmlzaSBuaXNsIG5vbiBub251bW15IG5vc3RyYSBudWxsYSBudWxsYW0gbnVuYyBvZGlvIG9yY2kgIg0KLSAgICAgICAgICAgICsgIm9ybmFyZSBwYXJ0dXJpZW50IHBlZGUgcGVsbGVudGVzcXVlIHBlbmF0aWJ1cyBwZXIgcGhhcmV0cmEgIg0KLSAgICAgICAgICAgICsgInBoYXNlbGx1cyBwbGFjZXJhdCBwbGF0ZWEgcG9ydGEgcG9ydHRpdG9yIHBvc3VlcmUgcG90ZW50aSBwcmFlc2VudCAiDQotICAgICAgICAgICAgKyAicHJldGl1bSBwcmltaXMgcHJvaW4gcHVsdmluYXIgcHVydXMgcXVhbSBxdWlzIHF1aXNxdWUgcmhvbmN1cyAiDQotICAgICAgICAgICAgKyAicmlkaWN1bHVzIHJpc3VzIHJ1dHJ1bSBzYWdpdHRpcyBzYXBpZW4gc2NlbGVyaXNxdWUgc2VkIHNlbSBzZW1wZXIgIg0KLSAgICAgICAgICAgICsgInNlbmVjdHVzIHNpdCBzb2NpaXMgc29jaW9zcXUgc29kYWxlcyBzb2xsaWNpdHVkaW4gc3VzY2lwaXQgIg0KLSAgICAgICAgICAgICsgInN1c3BlbmRpc3NlIHRhY2l0aSB0ZWxsdXMgdGVtcG9yIHRlbXB1cyB0aW5jaWR1bnQgdG9ycXVlbnQgdG9ydG9yICINCi0gICAgICAgICAgICArICJ0cmlzdGlxdWUgdHVycGlzIHVsbGFtY29ycGVyIHVsdHJpY2VzIHVsdHJpY2llcyB1cm5hIHV0IE9iamVjdGl1cyB2ZSAiDQotICAgICAgICAgICAgKyAidmVoaWN1bGEgdmVsIHZlbGl0IHZlbmVuYXRpcyB2ZXN0aWJ1bHVtIHZpdGFlIHZpdmFtdXMgdml2ZXJyYSAiICsgInZvbHV0cGF0IHZ1bHB1dGF0ZSI7DQotDQotICAgIC8qKg0KLSAgICAgKiBBIHNhbXBsZSB0byB1c2UgZm9yIGdlbmVyYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiB3b3JkIGFuZCBzZW50ZW5jZQ0KLSAgICAgKiBsZW5ndGhzIGluIGxvcmVtIGlwc3VtLg0KLSAgICAgKiANCi0gICAgICogQHR5cGUge3N0cmluZ30NCi0gICAgICogQHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQU1QTEUgPSAiTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQuIEFlbmVhbiAiDQotICAgICAgICAgICAgKyAiY29tbW9kbyBsaWd1bGEgZWdldCBkb2xvci4gQWVuZWFuIG1hc3NhLiBDdW0gc29jaWlzIG5hdG9xdWUgcGVuYXRpYnVzICINCi0gICAgICAgICAgICArICJldCBtYWduaXMgZGlzIHBhcnR1cmllbnQgbW9udGVzLCBuYXNjZXR1ciByaWRpY3VsdXMgbXVzLiBEb25lYyBxdWFtICINCi0gICAgICAgICAgICArICJmZWxpcywgdWx0cmljaWVzIG5lYywgcGVsbGVudGVzcXVlIGV1LCBwcmV0aXVtIHF1aXMsIHNlbS4gTnVsbGEgIg0KLSAgICAgICAgICAgICsgImNvbnNlcXVhdCBtYXNzYSBxdWlzIGVuaW0uIERvbmVjIHBlZGUganVzdG8sIGZyaW5naWxsYSB2ZWwsIGFsaXF1ZXQgIg0KLSAgICAgICAgICAgICsgIm5lYywgdnVscHV0YXRlIGVnZXQsIGFyY3UuIEluIGVuaW0ganVzdG8sIHJob25jdXMgdXQsIGltcGVyZGlldCBhLCAiDQotICAgICAgICAgICAgKyAidmVuZW5hdGlzIHZpdGFlLCBqdXN0by4gTnVsbGFtIGRpY3R1bSBmZWxpcyBldSBwZWRlIG1vbGxpcyBwcmV0aXVtLiAiDQotICAgICAgICAgICAgKyAiSW50ZWdlciB0aW5jaWR1bnQuIENyYXMgZGFwaWJ1cy4gVml2YW11cyBlbGVtZW50dW0gc2VtcGVyIG5pc2kuIEFlbmVhbiAiDQotICAgICAgICAgICAgKyAidnVscHV0YXRlIGVsZWlmZW5kIHRlbGx1cy4gQWVuZWFuIGxlbyBsaWd1bGEsIHBvcnR0aXRvciBldSwgY29uc2VxdWF0ICINCi0gICAgICAgICAgICArICJ2aXRhZSwgZWxlaWZlbmQgYWMsIGVuaW0uIEFsaXF1YW0gbG9yZW0gYW50ZSwgZGFwaWJ1cyBpbiwgdml2ZXJyYSAiDQotICAgICAgICAgICAgKyAicXVpcywgZmV1Z2lhdCBhLCB0ZWxsdXMuIFBoYXNlbGx1cyB2aXZlcnJhIG51bGxhIHV0IG1ldHVzIE9iamVjdGl1cyAiDQotICAgICAgICAgICAgKyAibGFvcmVldC4gUXVpc3F1ZSBydXRydW0uIEFlbmVhbiBpbXBlcmRpZXQuIEV0aWFtIHVsdHJpY2llcyBuaXNpIHZlbCAiDQotICAgICAgICAgICAgKyAiYXVndWUuIEN1cmFiaXR1ciB1bGxhbWNvcnBlciB1bHRyaWNpZXMgbmlzaS4gTmFtIGVnZXQgZHVpLlxuXG4iICsNCi0NCi0gICAgICAgICAgICAiRXRpYW0gcmhvbmN1cy4gTWFlY2VuYXMgdGVtcHVzLCB0ZWxsdXMgZWdldCBjb25kaW1lbnR1bSByaG9uY3VzLCBzZW0gIg0KLSAgICAgICAgICAgICsgInF1YW0gc2VtcGVyIGxpYmVybywgc2l0IGFtZXQgYWRpcGlzY2luZyBzZW0gbmVxdWUgc2VkIGlwc3VtLiBOYW0gcXVhbSAiDQotICAgICAgICAgICAgKyAibnVuYywgYmxhbmRpdCB2ZWwsIGx1Y3R1cyBwdWx2aW5hciwgaGVuZHJlcml0IGlkLCBsb3JlbS4gTWFlY2VuYXMgbmVjICINCi0gICAgICAgICAgICArICJvZGlvIGV0IGFudGUgdGluY2lkdW50IHRlbXB1cy4gRG9uZWMgdml0YWUgc2FwaWVuIHV0IGxpYmVybyB2ZW5lbmF0aXMgIg0KLSAgICAgICAgICAgICsgImZhdWNpYnVzLiBOdWxsYW0gcXVpcyBhbnRlLiBFdGlhbSBzaXQgYW1ldCBvcmNpIGVnZXQgZXJvcyBmYXVjaWJ1cyAiDQotICAgICAgICAgICAgKyAidGluY2lkdW50LiBEdWlzIGxlby4gU2VkIGZyaW5naWxsYSBtYXVyaXMgc2l0IGFtZXQgbmliaC4gRG9uZWMgc29kYWxlcyAiDQotICAgICAgICAgICAgKyAic2FnaXR0aXMgbWFnbmEuIFNlZCBjb25zZXF1YXQsIGxlbyBlZ2V0IGJpYmVuZHVtIHNvZGFsZXMsIGF1Z3VlIHZlbGl0ICINCi0gICAgICAgICAgICArICJjdXJzdXMgbnVuYywgcXVpcyBncmF2aWRhIG1hZ25hIG1pIGEgbGliZXJvLiBGdXNjZSB2dWxwdXRhdGUgZWxlaWZlbmQgIg0KLSAgICAgICAgICAgICsgInNhcGllbi4gVmVzdGlidWx1bSBwdXJ1cyBxdWFtLCBzY2VsZXJpc3F1ZSB1dCwgbW9sbGlzIHNlZCwgbm9udW1teSBpZCwgIg0KLSAgICAgICAgICAgICsgIm1ldHVzLiBOdWxsYW0gYWNjdW1zYW4gbG9yZW0gaW4gZHVpLiBDcmFzIHVsdHJpY2llcyBtaSBldSB0dXJwaXMgIg0KLSAgICAgICAgICAgICsgImhlbmRyZXJpdCBmcmluZ2lsbGEuIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSAiDQotICAgICAgICAgICAgKyAibHVjdHVzIGV0IHVsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTsgSW4gYWMgZHVpIHF1aXMgbWkgIiArICJjb25zZWN0ZXR1ZXIgbGFjaW5pYS5cblxuIiArDQotDQotICAgICAgICAgICAgIk5hbSBwcmV0aXVtIHR1cnBpcyBldCBhcmN1LiBEdWlzIGFyY3UgdG9ydG9yLCBzdXNjaXBpdCBlZ2V0LCBpbXBlcmRpZXQgIg0KLSAgICAgICAgICAgICsgIm5lYywgaW1wZXJkaWV0IGlhY3VsaXMsIGlwc3VtLiBTZWQgYWxpcXVhbSB1bHRyaWNlcyBtYXVyaXMuIEludGVnZXIgIg0KLSAgICAgICAgICAgICsgImFudGUgYXJjdSwgYWNjdW1zYW4gYSwgY29uc2VjdGV0dWVyIGVnZXQsIHBvc3VlcmUgdXQsIG1hdXJpcy4gUHJhZXNlbnQgIg0KLSAgICAgICAgICAgICsgImFkaXBpc2NpbmcuIFBoYXNlbGx1cyB1bGxhbWNvcnBlciBpcHN1bSBydXRydW0gbnVuYy4gTnVuYyBub251bW15ICINCi0gICAgICAgICAgICArICJtZXR1cy4gVmVzdGlidWx1bSB2b2x1dHBhdCBwcmV0aXVtIGxpYmVyby4gQ3JhcyBpZCBkdWkuIEFlbmVhbiB1dCBlcm9zICINCi0gICAgICAgICAgICArICJldCBuaXNsIHNhZ2l0dGlzIHZlc3RpYnVsdW0uIE51bGxhbSBudWxsYSBlcm9zLCB1bHRyaWNpZXMgc2l0IGFtZXQsICINCi0gICAgICAgICAgICArICJub251bW15IGlkLCBpbXBlcmRpZXQgZmV1Z2lhdCwgcGVkZS4gU2VkIGxlY3R1cy4gRG9uZWMgbW9sbGlzIGhlbmRyZXJpdCAiDQotICAgICAgICAgICAgKyAicmlzdXMuIFBoYXNlbGx1cyBuZWMgc2VtIGluIGp1c3RvIHBlbGxlbnRlc3F1ZSBmYWNpbGlzaXMuIEV0aWFtICINCi0gICAgICAgICAgICArICJpbXBlcmRpZXQgaW1wZXJkaWV0IG9yY2kuIE51bmMgbmVjIG5lcXVlLiBQaGFzZWxsdXMgbGVvIGRvbG9yLCB0ZW1wdXMgIg0KLSAgICAgICAgICAgICsgIm5vbiwgYXVjdG9yIGV0LCBoZW5kcmVyaXQgcXVpcywgbmlzaS5cblxuIiArDQotDQotICAgICAgICAgICAgIkN1cmFiaXR1ciBsaWd1bGEgc2FwaWVuLCB0aW5jaWR1bnQgbm9uLCBldWlzbW9kIHZpdGFlLCBwb3N1ZXJlICINCi0gICAgICAgICAgICArICJpbXBlcmRpZXQsIGxlby4gTWFlY2VuYXMgbWFsZXN1YWRhLiBQcmFlc2VudCBjb25ndWUgZXJhdCBhdCBtYXNzYS4gU2VkICINCi0gICAgICAgICAgICArICJjdXJzdXMgdHVycGlzIHZpdGFlIHRvcnRvci4gRG9uZWMgcG9zdWVyZSB2dWxwdXRhdGUgYXJjdS4gUGhhc2VsbHVzICINCi0gICAgICAgICAgICArICJhY2N1bXNhbiBjdXJzdXMgdmVsaXQuIFZlc3RpYnVsdW0gYW50ZSBpcHN1bSBwcmltaXMgaW4gZmF1Y2lidXMgb3JjaSAiDQotICAgICAgICAgICAgKyAibHVjdHVzIGV0IHVsdHJpY2VzIHBvc3VlcmUgY3ViaWxpYSBDdXJhZTsgU2VkIGFsaXF1YW0sIG5pc2kgcXVpcyAiDQotICAgICAgICAgICAgKyAicG9ydHRpdG9yIGNvbmd1ZSwgZWxpdCBlcmF0IGV1aXNtb2Qgb3JjaSwgYWMgcGxhY2VyYXQgZG9sb3IgbGVjdHVzIHF1aXMgIg0KLSAgICAgICAgICAgICsgIm9yY2kuIFBoYXNlbGx1cyBjb25zZWN0ZXR1ZXIgdmVzdGlidWx1bSBlbGl0LiBBZW5lYW4gdGVsbHVzIG1ldHVzLCAiDQotICAgICAgICAgICAgKyAiYmliZW5kdW0gc2VkLCBwb3N1ZXJlIGFjLCBtYXR0aXMgbm9uLCBudW5jLiBWZXN0aWJ1bHVtIGZyaW5naWxsYSBwZWRlICINCi0gICAgICAgICAgICArICJzaXQgYW1ldCBhdWd1ZS4gSW4gdHVycGlzLiBQZWxsZW50ZXNxdWUgcG9zdWVyZS4gUHJhZXNlbnQgdHVycGlzLlxuXG4iICsNCi0NCi0gICAgICAgICAgICAiQWVuZWFuIHBvc3VlcmUsIHRvcnRvciBzZWQgY3Vyc3VzIGZldWdpYXQsIG51bmMgYXVndWUgYmxhbmRpdCBudW5jLCBldSAiDQotICAgICAgICAgICAgKyAic29sbGljaXR1ZGluIHVybmEgZG9sb3Igc2FnaXR0aXMgbGFjdXMuIERvbmVjIGVsaXQgbGliZXJvLCBzb2RhbGVzICINCi0gICAgICAgICAgICArICJuZWMsIHZvbHV0cGF0IGEsIHN1c2NpcGl0IG5vbiwgdHVycGlzLiBOdWxsYW0gc2FnaXR0aXMuIFN1c3BlbmRpc3NlICINCi0gICAgICAgICAgICArICJwdWx2aW5hciwgYXVndWUgYWMgdmVuZW5hdGlzIGNvbmRpbWVudHVtLCBzZW0gbGliZXJvIHZvbHV0cGF0IG5pYmgsICINCi0gICAgICAgICAgICArICJuZWMgcGVsbGVudGVzcXVlIHZlbGl0IHBlZGUgcXVpcyBudW5jLiBWZXN0aWJ1bHVtIGFudGUgaXBzdW0gcHJpbWlzIGluICINCi0gICAgICAgICAgICArICJmYXVjaWJ1cyBvcmNpIGx1Y3R1cyBldCB1bHRyaWNlcyBwb3N1ZXJlIGN1YmlsaWEgQ3VyYWU7IEZ1c2NlIGlkICINCi0gICAgICAgICAgICArICJwdXJ1cy4gVXQgT2JqZWN0aXVzIHRpbmNpZHVudCBsaWJlcm8uIFBoYXNlbGx1cyBkb2xvci4gTWFlY2VuYXMgdmVzdGlidWx1bSAiDQotICAgICAgICAgICAgKyAibW9sbGlzIGRpYW0uIFBlbGxlbnRlc3F1ZSB1dCBuZXF1ZS4gUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpICINCi0gICAgICAgICAgICArICJ0cmlzdGlxdWUgc2VuZWN0dXMgZXQgbmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLlxuXG4iICsNCi0NCi0gICAgICAgICAgICAiSW4gZHVpIG1hZ25hLCBwb3N1ZXJlIGVnZXQsIHZlc3RpYnVsdW0gZXQsIHRlbXBvciBhdWN0b3IsIGp1c3RvLiBJbiBhYyAiDQotICAgICAgICAgICAgKyAiZmVsaXMgcXVpcyB0b3J0b3IgbWFsZXN1YWRhIHByZXRpdW0uIFBlbGxlbnRlc3F1ZSBhdWN0b3IgbmVxdWUgbmVjICINCi0gICAgICAgICAgICArICJ1cm5hLiBQcm9pbiBzYXBpZW4gaXBzdW0sIHBvcnRhIGEsIGF1Y3RvciBxdWlzLCBldWlzbW9kIHV0LCBtaS4gQWVuZWFuICINCi0gICAgICAgICAgICArICJ2aXZlcnJhIHJob25jdXMgcGVkZS4gUGVsbGVudGVzcXVlIGhhYml0YW50IG1vcmJpIHRyaXN0aXF1ZSBzZW5lY3R1cyBldCAiDQotICAgICAgICAgICAgKyAibmV0dXMgZXQgbWFsZXN1YWRhIGZhbWVzIGFjIHR1cnBpcyBlZ2VzdGFzLiBVdCBub24gZW5pbSBlbGVpZmVuZCBmZWxpcyAiDQotICAgICAgICAgICAgKyAicHJldGl1bSBmZXVnaWF0LiBWaXZhbXVzIHF1aXMgbWkuIFBoYXNlbGx1cyBhIGVzdC4gUGhhc2VsbHVzIG1hZ25hLlxuXG4iICsNCi0NCi0gICAgICAgICAgICAiSW4gaGFjIGhhYml0YXNzZSBwbGF0ZWEgZGljdHVtc3QuIEN1cmFiaXR1ciBhdCBsYWN1cyBhYyB2ZWxpdCBvcm5hcmUgIg0KLSAgICAgICAgICAgICsgImxvYm9ydGlzLiBDdXJhYml0dXIgYSBmZWxpcyBpbiBudW5jIGZyaW5naWxsYSB0cmlzdGlxdWUuIE1vcmJpIG1hdHRpcyAiDQotICAgICAgICAgICAgKyAidWxsYW1jb3JwZXIgdmVsaXQuIFBoYXNlbGx1cyBncmF2aWRhIHNlbXBlciBuaXNpLiBOdWxsYW0gdmVsIHNlbS4gIg0KLSAgICAgICAgICAgICsgIlBlbGxlbnRlc3F1ZSBsaWJlcm8gdG9ydG9yLCB0aW5jaWR1bnQgZXQsIHRpbmNpZHVudCBlZ2V0LCBzZW1wZXIgbmVjLCAiDQotICAgICAgICAgICAgKyAicXVhbS4gU2VkIGhlbmRyZXJpdC4gTW9yYmkgYWMgZmVsaXMuIE51bmMgZWdlc3RhcywgYXVndWUgYXQgIg0KLSAgICAgICAgICAgICsgInBlbGxlbnRlc3F1ZSBsYW9yZWV0LCBmZWxpcyBlcm9zIHZlaGljdWxhIGxlbywgYXQgbWFsZXN1YWRhIHZlbGl0IGxlbyAiDQotICAgICAgICAgICAgKyAicXVpcyBwZWRlLiBEb25lYyBpbnRlcmR1bSwgbWV0dXMgZXQgaGVuZHJlcml0IGFsaXF1ZXQsIGRvbG9yIGRpYW0gIg0KLSAgICAgICAgICAgICsgInNhZ2l0dGlzIGxpZ3VsYSwgZWdldCBlZ2VzdGFzIGxpYmVybyB0dXJwaXMgdmVsIG1pLiBOdW5jIG51bGxhLiBGdXNjZSAiDQotICAgICAgICAgICAgKyAicmlzdXMgbmlzbCwgdml2ZXJyYSBldCwgdGVtcG9yIGV0LCBwcmV0aXVtIGluLCBzYXBpZW4uIERvbmVjIHZlbmVuYXRpcyAiICsgInZ1bHB1dGF0ZSBsb3JlbS5cblxuIiArDQotDQotICAgICAgICAgICAgIk1vcmJpIG5lYyBtZXR1cy4gUGhhc2VsbHVzIGJsYW5kaXQgbGVvIHV0IG9kaW8uIE1hZWNlbmFzIHVsbGFtY29ycGVyLCAiDQotICAgICAgICAgICAgKyAiZHVpIGV0IHBsYWNlcmF0IGZldWdpYXQsIGVyb3MgcGVkZSBPYmplY3RpdXMgbmlzaSwgY29uZGltZW50dW0gdml2ZXJyYSAiDQotICAgICAgICAgICAgKyAiZmVsaXMgbnVuYyBldCBsb3JlbS4gU2VkIG1hZ25hIHB1cnVzLCBmZXJtZW50dW0gZXUsIHRpbmNpZHVudCBldSwgIg0KLSAgICAgICAgICAgICsgIk9iamVjdGl1cyB1dCwgZmVsaXMuIEluIGF1Y3RvciBsb2JvcnRpcyBsYWN1cy4gUXVpc3F1ZSBsaWJlcm8gbWV0dXMsICINCi0gICAgICAgICAgICArICJjb25kaW1lbnR1bSBuZWMsIHRlbXBvciBhLCBjb21tb2RvIG1vbGxpcywgbWFnbmEuIFZlc3RpYnVsdW0gIg0KLSAgICAgICAgICAgICsgInVsbGFtY29ycGVyIG1hdXJpcyBhdCBsaWd1bGEuIEZ1c2NlIGZlcm1lbnR1bS4gTnVsbGFtIGN1cnN1cyBsYWNpbmlhICINCi0gICAgICAgICAgICArICJlcmF0LiBQcmFlc2VudCBibGFuZGl0IGxhb3JlZXQgbmliaC5cblxuIiArDQotDQotICAgICAgICAgICAgIkZ1c2NlIGNvbnZhbGxpcyBtZXR1cyBpZCBmZWxpcyBsdWN0dXMgYWRpcGlzY2luZy4gUGVsbGVudGVzcXVlIGVnZXN0YXMsICINCi0gICAgICAgICAgICArICJuZXF1ZSBzaXQgYW1ldCBjb252YWxsaXMgcHVsdmluYXIsIGp1c3RvIG51bGxhIGVsZWlmZW5kIGF1Z3VlLCBhYyAiDQotICAgICAgICAgICAgKyAiYXVjdG9yIG9yY2kgbGVvIG5vbiBlc3QuIFF1aXNxdWUgaWQgbWkuIFV0IHRpbmNpZHVudCB0aW5jaWR1bnQgZXJhdC4gIg0KLSAgICAgICAgICAgICsgIkV0aWFtIGZldWdpYXQgbG9yZW0gbm9uIG1ldHVzLiBWZXN0aWJ1bHVtIGRhcGlidXMgbnVuYyBhYyBhdWd1ZS4gIg0KLSAgICAgICAgICAgICsgIkN1cmFiaXR1ciB2ZXN0aWJ1bHVtIGFsaXF1YW0gbGVvLiBQcmFlc2VudCBlZ2VzdGFzIG5lcXVlIGV1IGVuaW0uIEluICINCi0gICAgICAgICAgICArICJoYWMgaGFiaXRhc3NlIHBsYXRlYSBkaWN0dW1zdC4gRnVzY2UgYSBxdWFtLiBFdGlhbSB1dCBwdXJ1cyBtYXR0aXMgIg0KLSAgICAgICAgICAgICsgIm1hdXJpcyBzb2RhbGVzIGFsaXF1YW0uIEN1cmFiaXR1ciBuaXNpLiBRdWlzcXVlIG1hbGVzdWFkYSBwbGFjZXJhdCAiDQotICAgICAgICAgICAgKyAibmlzbC4gTmFtIGlwc3VtIHJpc3VzLCBydXRydW0gdml0YWUsIHZlc3RpYnVsdW0gZXUsIG1vbGVzdGllIHZlbCwgIiArICJsYWN1cy5cblxuIiArDQotDQotICAgICAgICAgICAgIlNlZCBhdWd1ZSBpcHN1bSwgZWdlc3RhcyBuZWMsIHZlc3RpYnVsdW0gZXQsIG1hbGVzdWFkYSBhZGlwaXNjaW5nLCAiDQotICAgICAgICAgICAgKyAiZHVpLiBWZXN0aWJ1bHVtIGZhY2lsaXNpcywgcHVydXMgbmVjIHB1bHZpbmFyIGlhY3VsaXMsIGxpZ3VsYSBtaSAiDQotICAgICAgICAgICAgKyAiY29uZ3VlIG51bmMsIHZpdGFlIGV1aXNtb2QgbGlndWxhIHVybmEgaW4gZG9sb3IuIE1hdXJpcyBzb2xsaWNpdHVkaW4gIg0KLSAgICAgICAgICAgICsgImZlcm1lbnR1bSBsaWJlcm8uIFByYWVzZW50IG5vbnVtbXkgbWkgaW4gb2Rpby4gTnVuYyBpbnRlcmR1bSBsYWN1cyBzaXQgIg0KLSAgICAgICAgICAgICsgImFtZXQgb3JjaS4gVmVzdGlidWx1bSBydXRydW0sIG1pIG5lYyBlbGVtZW50dW0gdmVoaWN1bGEsIGVyb3MgcXVhbSAiDQotICAgICAgICAgICAgKyAiZ3JhdmlkYSBuaXNsLCBpZCBmcmluZ2lsbGEgbmVxdWUgYW50ZSB2ZWwgbWkuIE1vcmJpIG1vbGxpcyB0ZWxsdXMgYWMgIg0KLSAgICAgICAgICAgICsgInNhcGllbi4gUGhhc2VsbHVzIHZvbHV0cGF0LCBtZXR1cyBlZ2V0IGVnZXN0YXMgbW9sbGlzLCBsYWN1cyBsYWN1cyAiDQotICAgICAgICAgICAgKyAiYmxhbmRpdCBkdWksIGlkIGVnZXN0YXMgcXVhbSBtYXVyaXMgdXQgbGFjdXMuIEZ1c2NlIHZlbCBkdWkuIFNlZCBpbiAiDQotICAgICAgICAgICAgKyAibGliZXJvIHV0IG5pYmggcGxhY2VyYXQgYWNjdW1zYW4uIFByb2luIGZhdWNpYnVzIGFyY3UgcXVpcyBhbnRlLiBJbiAiDQotICAgICAgICAgICAgKyAiY29uc2VjdGV0dWVyIHR1cnBpcyB1dCB2ZWxpdC4gTnVsbGEgc2l0IGFtZXQgZXN0LiBQcmFlc2VudCBtZXR1cyAiDQotICAgICAgICAgICAgKyAidGVsbHVzLCBlbGVtZW50dW0gZXUsIHNlbXBlciBhLCBhZGlwaXNjaW5nIG5lYywgcHVydXMuIENyYXMgcmlzdXMgIg0KLSAgICAgICAgICAgICsgImlwc3VtLCBmYXVjaWJ1cyB1dCwgdWxsYW1jb3JwZXIgaWQsIE9iamVjdGl1cyBhYywgbGVvLiBTdXNwZW5kaXNzZSAiDQotICAgICAgICAgICAgKyAiZmV1Z2lhdC4gU3VzcGVuZGlzc2UgZW5pbSB0dXJwaXMsIGRpY3R1bSBzZWQsIGlhY3VsaXMgYSwgY29uZGltZW50dW0gIg0KLSAgICAgICAgICAgICsgIm5lYywgbmlzaS4gUHJhZXNlbnQgbmVjIG5pc2wgYSBwdXJ1cyBibGFuZGl0IHZpdmVycmEuIFByYWVzZW50IGFjICINCi0gICAgICAgICAgICArICJtYXNzYSBhdCBsaWd1bGEgbGFvcmVldCBpYWN1bGlzLiBOdWxsYSBuZXF1ZSBkb2xvciwgc2FnaXR0aXMgZWdldCwgIg0KLSAgICAgICAgICAgICsgImlhY3VsaXMgcXVpcywgbW9sZXN0aWUgbm9uLCB2ZWxpdC5cblxuIiArDQotDQotICAgICAgICAgICAgIk1hdXJpcyB0dXJwaXMgbnVuYywgYmxhbmRpdCBldCwgdm9sdXRwYXQgbW9sZXN0aWUsIHBvcnRhIHV0LCBsaWd1bGEuICINCi0gICAgICAgICAgICArICJGdXNjZSBwaGFyZXRyYSBjb252YWxsaXMgdXJuYS4gUXVpc3F1ZSB1dCBuaXNpLiBEb25lYyBtaSBvZGlvLCBmYXVjaWJ1cyAiDQotICAgICAgICAgICAgKyAiYXQsIHNjZWxlcmlzcXVlIHF1aXMsIGNvbnZhbGxpcyBpbiwgbmlzaS4gU3VzcGVuZGlzc2Ugbm9uIG5pc2wgc2l0IGFtZXQgIg0KLSAgICAgICAgICAgICsgInZlbGl0IGhlbmRyZXJpdCBydXRydW0uIFV0IGxlby4gVXQgYSBuaXNsIGlkIGFudGUgdGVtcHVzIGhlbmRyZXJpdC4gIg0KLSAgICAgICAgICAgICsgIlByb2luIHByZXRpdW0sIGxlbyBhYyBwZWxsZW50ZXNxdWUgbW9sbGlzLCBmZWxpcyBudW5jIHVsdHJpY2VzIGVyb3MsICINCi0gICAgICAgICAgICArICJzZWQgZ3JhdmlkYSBhdWd1ZSBhdWd1ZSBtb2xsaXMganVzdG8uIFN1c3BlbmRpc3NlIGV1IGxpZ3VsYS4gTnVsbGEgIg0KLSAgICAgICAgICAgICsgImZhY2lsaXNpLiBEb25lYyBpZCBqdXN0by4gUHJhZXNlbnQgcG9ydHRpdG9yLCBudWxsYSB2aXRhZSBwb3N1ZXJlICINCi0gICAgICAgICAgICArICJpYWN1bGlzLCBhcmN1IG5pc2wgZGlnbmlzc2ltIGRvbG9yLCBhIHByZXRpdW0gbWkgc2VtIHV0IGlwc3VtLiAiDQotICAgICAgICAgICAgKyAiQ3VyYWJpdHVyIHN1c2NpcGl0IHN1c2NpcGl0IHRlbGx1cy5cblxuIiArDQotDQotICAgICAgICAgICAgIlByYWVzZW50IHZlc3RpYnVsdW0gZGFwaWJ1cyBuaWJoLiBFdGlhbSBpYWN1bGlzIG51bmMgYWMgbWV0dXMuIFV0IGlkICINCi0gICAgICAgICAgICArICJuaXNsIHF1aXMgZW5pbSBkaWduaXNzaW0gc2FnaXR0aXMuIEV0aWFtIHNvbGxpY2l0dWRpbiwgaXBzdW0gZXUgIg0KLSAgICAgICAgICAgICsgInB1bHZpbmFyIHJ1dHJ1bSwgdGVsbHVzIGlwc3VtIGxhb3JlZXQgc2FwaWVuLCBxdWlzIHZlbmVuYXRpcyBhbnRlICINCi0gICAgICAgICAgICArICJvZGlvIHNpdCBhbWV0IGVyb3MuIFByb2luIG1hZ25hLiBEdWlzIHZlbCBuaWJoIGF0IHZlbGl0IHNjZWxlcmlzcXVlICINCi0gICAgICAgICAgICArICJzdXNjaXBpdC4gQ3VyYWJpdHVyIHR1cnBpcy4gVmVzdGlidWx1bSBzdXNjaXBpdCBudWxsYSBxdWlzIG9yY2kuIEZ1c2NlICINCi0gICAgICAgICAgICArICJhYyBmZWxpcyBzaXQgYW1ldCBsaWd1bGEgcGhhcmV0cmEgY29uZGltZW50dW0uIE1hZWNlbmFzIGVnZXN0YXMgYXJjdSAiDQotICAgICAgICAgICAgKyAicXVpcyBsaWd1bGEgbWF0dGlzIHBsYWNlcmF0LiBEdWlzIGxvYm9ydGlzIG1hc3NhIGltcGVyZGlldCBxdWFtLiAiICsgIlN1c3BlbmRpc3NlIHBvdGVudGkuXG5cbiIgKw0KLQ0KLSAgICAgICAgICAgICJQZWxsZW50ZXNxdWUgY29tbW9kbyBlcm9zIGEgZW5pbS4gVmVzdGlidWx1bSB0dXJwaXMgc2VtLCBhbGlxdWV0IGVnZXQsICINCi0gICAgICAgICAgICArICJsb2JvcnRpcyBwZWxsZW50ZXNxdWUsIHJ1dHJ1bSBldSwgbmlzbC4gU2VkIGxpYmVyby4gQWxpcXVhbSBlcmF0ICINCi0gICAgICAgICAgICArICJ2b2x1dHBhdC4gRXRpYW0gdml0YWUgdG9ydG9yLiBNb3JiaSB2ZXN0aWJ1bHVtIHZvbHV0cGF0IGVuaW0uIEFsaXF1YW0gIg0KLSAgICAgICAgICAgICsgImV1IG51bmMuIE51bmMgc2VkIHR1cnBpcy4gU2VkIG1vbGxpcywgZXJvcyBldCB1bHRyaWNlcyB0ZW1wdXMsIG1hdXJpcyAiDQotICAgICAgICAgICAgKyAiaXBzdW0gYWxpcXVhbSBsaWJlcm8sIG5vbiBhZGlwaXNjaW5nIGRvbG9yIHVybmEgYSBvcmNpLiBOdWxsYSBwb3J0YSAiDQotICAgICAgICAgICAgKyAiZG9sb3IuIENsYXNzIGFwdGVudCB0YWNpdGkgc29jaW9zcXUgYWQgbGl0b3JhIHRvcnF1ZW50IHBlciBjb251YmlhICINCi0gICAgICAgICAgICArICJub3N0cmEsIHBlciBpbmNlcHRvcyBoeW1lbmFlb3MuXG5cbiIgKw0KLQ0KLSAgICAgICAgICAgICJQZWxsZW50ZXNxdWUgZGFwaWJ1cyBoZW5kcmVyaXQgdG9ydG9yLiBQcmFlc2VudCBlZ2VzdGFzIHRyaXN0aXF1ZSBuaWJoLiAiDQotICAgICAgICAgICAgKyAiU2VkIGEgbGliZXJvLiBDcmFzIE9iamVjdGl1cy4gRG9uZWMgdml0YWUgb3JjaSBzZWQgZG9sb3IgcnV0cnVtIGF1Y3Rvci4gIg0KLSAgICAgICAgICAgICsgIkZ1c2NlIGVnZXN0YXMgZWxpdCBlZ2V0IGxvcmVtLiBTdXNwZW5kaXNzZSBuaXNsIGVsaXQsIHJob25jdXMgZWdldCwgIg0KLSAgICAgICAgICAgICsgImVsZW1lbnR1bSBhYywgY29uZGltZW50dW0gZWdldCwgZGlhbS4gTmFtIGF0IHRvcnRvciBpbiB0ZWxsdXMgaW50ZXJkdW0gIg0KLSAgICAgICAgICAgICsgInNhZ2l0dGlzLiBBbGlxdWFtIGxvYm9ydGlzLiBEb25lYyBvcmNpIGxlY3R1cywgYWxpcXVhbSB1dCwgZmF1Y2lidXMgIg0KLSAgICAgICAgICAgICsgIm5vbiwgZXVpc21vZCBpZCwgbnVsbGEuIEN1cmFiaXR1ciBibGFuZGl0IG1vbGxpcyBsYWN1cy4gTmFtIGFkaXBpc2NpbmcuICIgKyAiVmVzdGlidWx1bSBldSBvZGlvLlxuXG4iICsNCi0NCi0gICAgICAgICAgICAiVml2YW11cyBsYW9yZWV0LiBOdWxsYW0gdGluY2lkdW50IGFkaXBpc2NpbmcgZW5pbS4gUGhhc2VsbHVzIHRlbXB1cy4gIg0KLSAgICAgICAgICAgICsgIlByb2luIHZpdmVycmEsIGxpZ3VsYSBzaXQgYW1ldCB1bHRyaWNlcyBzZW1wZXIsIGxpZ3VsYSBhcmN1IHRyaXN0aXF1ZSAiDQotICAgICAgICAgICAgKyAic2FwaWVuLCBhIGFjY3Vtc2FuIG5pc2kgbWF1cmlzIGFjIGVyb3MuIEZ1c2NlIG5lcXVlLiBTdXNwZW5kaXNzZSAiDQotICAgICAgICAgICAgKyAiZmF1Y2lidXMsIG51bmMgZXQgcGVsbGVudGVzcXVlIGVnZXN0YXMsIGxhY3VzIGFudGUgY29udmFsbGlzIHRlbGx1cywgIg0KLSAgICAgICAgICAgICsgInZpdGFlIGlhY3VsaXMgbGFjdXMgZWxpdCBpZCB0b3J0b3IuIFZpdmFtdXMgYWxpcXVldCBlbGl0IGFjIG5pc2wuIEZ1c2NlICINCi0gICAgICAgICAgICArICJmZXJtZW50dW0gb2RpbyBuZWMgYXJjdS4gVml2YW11cyBldWlzbW9kIG1hdXJpcy4gSW4gdXQgcXVhbSB2aXRhZSAiDQotICAgICAgICAgICAgKyAib2RpbyBsYWNpbmlhIHRpbmNpZHVudC4gUHJhZXNlbnQgdXQgbGlndWxhIG5vbiBtaSBPYmplY3RpdXMgc2FnaXR0aXMuICINCi0gICAgICAgICAgICArICJDcmFzIHNhZ2l0dGlzLiBQcmFlc2VudCBhYyBzZW0gZWdldCBlc3QgZWdlc3RhcyB2b2x1dHBhdC4gVml2YW11cyAiDQotICAgICAgICAgICAgKyAiY29uc2VjdGV0dWVyIGhlbmRyZXJpdCBsYWN1cy4gQ3JhcyBub24gZG9sb3IuIFZpdmFtdXMgaW4gZXJhdCB1dCB1cm5hICINCi0gICAgICAgICAgICArICJjdXJzdXMgdmVzdGlidWx1bS4gRnVzY2UgY29tbW9kbyBhbGlxdWFtIGFyY3UuIE5hbSBjb21tb2RvIHN1c2NpcGl0ICINCi0gICAgICAgICAgICArICJxdWFtLiBRdWlzcXVlIGlkIG9kaW8uIFByYWVzZW50IHZlbmVuYXRpcyBtZXR1cyBhdCB0b3J0b3IgcHVsdmluYXIgIiArICJ2YXJpdXMuXG5cbiI7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgYSBudW1iZXIgb2YgcGFyYWdyYXBocywgd2l0aCBlYWNoIHBhcmFncmFwaCBzdXJyb3VuZGVkIGJ5IEhUTUwNCi0gICAgICogcGFyYXJhcGggdGFncy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBxdWFudGl0eQ0KLSAgICAgKiBAcGFyYW0gc3RhcnRXaXRoTG9yZW0NCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZVBhcmFncmFwaHNIdG1sKGludCBxdWFudGl0eSwgYm9vbGVhbiBzdGFydFdpdGhMb3JlbSkgew0KLQ0KLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlTWFya3VwUGFyYWdyYXBocygiPHA+IiArIExJTkVfU0VQQVJBVE9SICsgIlx0IiwgTElORV9TRVBBUkFUT1IgKyAiPC9wPiIsIExJTkVfU0VQQVJBVE9SICsgIjwvcD4iDQotICAgICAgICAgICAgICAgICsgTElORV9TRVBBUkFUT1IgKyAiPHA+IiArIExJTkVfU0VQQVJBVE9SICsgIlx0IiwgcXVhbnRpdHksIHN0YXJ0V2l0aExvcmVtKTsNCi0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgbnVtYmVyIG9mIHBhcmFncmFwaHMsIHdpdGggZWFjaCBwYXJhZ3JhcGggc3Vycm91bmRlZCBieSBIVE1MDQotICAgICAqIHBhcmFyYXBoIHRhZ3MuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gd3JpdGVyDQotICAgICAqIEBwYXJhbSBxdWFudGl0eQ0KLSAgICAgKiBAcGFyYW0gc3RhcnRXaXRoTG9yZW0NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVQYXJhZ3JhcGhzSHRtbChBcHBlbmRhYmxlIHdyaXRlciwgaW50IHF1YW50aXR5LCBib29sZWFuIHN0YXJ0V2l0aExvcmVtKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgZ2VuZXJhdGVNYXJrdXBQYXJhZ3JhcGhzKHdyaXRlciwgIjxwPiIgKyBMSU5FX1NFUEFSQVRPUiArICJcdCIsIExJTkVfU0VQQVJBVE9SICsgIjwvcD4iLCBMSU5FX1NFUEFSQVRPUg0KLSAgICAgICAgICAgICAgICArICI8L3A+IiArIExJTkVfU0VQQVJBVE9SICsgIjxwPiIgKyBMSU5FX1NFUEFSQVRPUiArICJcdCIsIHF1YW50aXR5LCBzdGFydFdpdGhMb3JlbSk7DQotDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyBvbmUgcGFyYWdyYXBoIG9mIEhUTUwsIHN1cnJvdW5kZWQgYnkgSFRNTCBwYXJhcmFwaCB0YWdzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHF1YW50aXR5DQotICAgICAqIEBwYXJhbSBzdGFydFdpdGhMb3JlbQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlT25lUGFyYWdyYXBoSHRtbChpbnQgcXVhbnRpdHksIGJvb2xlYW4gc3RhcnRXaXRoTG9yZW0pIHsNCi0NCi0gICAgICAgIHJldHVybiBnZW5lcmF0ZU1hcmt1cFNlbnRlbmNlcygiPHA+IiArIExJTkVfU0VQQVJBVE9SICsgIlx0IiwgTElORV9TRVBBUkFUT1IgKyAiPC9wPiIsIExJTkVfU0VQQVJBVE9SLA0KLSAgICAgICAgICAgICAgICBxdWFudGl0eSwgc3RhcnRXaXRoTG9yZW0pOw0KLQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgYSBudW1iZXIgb2YgcGFyYWdyYXBocywgd2l0aCBlYWNoIHBhcmFncmFwaCBzdXJyb3VuZGVkIGJ5IEhUTUwNCi0gICAgICogcGFyYWdyYXBoIHRhZ3MgYXMgYSBmdWxsIEhUTUwgcGFnZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBxdWFudGl0eQ0KLSAgICAgKiBAcGFyYW0gc3RhcnRXaXRoTG9yZW0NCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZVBhcmFncmFwaHNGdWxsSHRtbChpbnQgcXVhbnRpdHksIGJvb2xlYW4gc3RhcnRXaXRoTG9yZW0pIHsNCi0NCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiPGh0bWw+IiArIExJTkVfU0VQQVJBVE9SICsgIjxoZWFkZXI+IiArIExJTkVfU0VQQVJBVE9SICsgIjx0aXRsZT5Mb3JlbSBJcHN1bTwvdGl0bGU+Ig0KLSAgICAgICAgICAgICAgICArIExJTkVfU0VQQVJBVE9SICsgIjwvaGVhZGVyPiIgKyBMSU5FX1NFUEFSQVRPUiArIExJTkVfU0VQQVJBVE9SICsgIjxib2R5PiI7DQotICAgICAgICBTdHJpbmcgcG9zdGZpeCA9ICI8L2JvZHk+IiArIExJTkVfU0VQQVJBVE9SICsgIjwvaHRtbD4iICsgTElORV9TRVBBUkFUT1I7DQotDQotICAgICAgICByZXR1cm4gZ2VuZXJhdGVNYXJrdXBQYXJhZ3JhcGhzKHByZWZpeCArIExJTkVfU0VQQVJBVE9SICsgIjxwPiIgKyBMSU5FX1NFUEFSQVRPUiArICJcdCIsIExJTkVfU0VQQVJBVE9SDQotICAgICAgICAgICAgICAgICsgIjwvcD4iICsgTElORV9TRVBBUkFUT1IgKyBwb3N0Zml4LCBMSU5FX1NFUEFSQVRPUiArICI8L3A+IiArIExJTkVfU0VQQVJBVE9SICsgIjxwPiIgKyBMSU5FX1NFUEFSQVRPUg0KLSAgICAgICAgICAgICAgICArICJcdCIsIHF1YW50aXR5LCBzdGFydFdpdGhMb3JlbSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdlbmVyYXRlcyBhIG51bWJlciBvZiBwYXJhZ3JhcGhzLCB3aXRoIGVhY2ggcGFyYWdyYXBoIHN1cnJvdW5kZWQgYnkgSFRNTA0KLSAgICAgKiBwYXJhZ3JhcGggdGFncyBhcyBhIGZ1bGwgSFRNTCBwYWdlLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHdyaXRlcg0KLSAgICAgKiBAcGFyYW0gcXVhbnRpdHkNCi0gICAgICogQHBhcmFtIHN0YXJ0V2l0aExvcmVtDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlUGFyYWdyYXBoc0Z1bGxIdG1sKEFwcGVuZGFibGUgd3JpdGVyLCBpbnQgcXVhbnRpdHksIGJvb2xlYW4gc3RhcnRXaXRoTG9yZW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotDQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIjxodG1sPiIgKyBMSU5FX1NFUEFSQVRPUiArICI8aGVhZGVyPiIgKyBMSU5FX1NFUEFSQVRPUiArICI8dGl0bGU+TG9yZW0gSXBzdW08L3RpdGxlPiINCi0gICAgICAgICAgICAgICAgKyBMSU5FX1NFUEFSQVRPUiArICI8L2hlYWRlcj4iICsgTElORV9TRVBBUkFUT1IgKyBMSU5FX1NFUEFSQVRPUiArICI8Ym9keT4iOw0KLSAgICAgICAgU3RyaW5nIHBvc3RmaXggPSAiPC9ib2R5PiIgKyBMSU5FX1NFUEFSQVRPUiArICI8L2h0bWw+IiArIExJTkVfU0VQQVJBVE9SOw0KLQ0KLSAgICAgICAgZ2VuZXJhdGVNYXJrdXBQYXJhZ3JhcGhzKHdyaXRlciwgcHJlZml4ICsgTElORV9TRVBBUkFUT1IgKyAiPHA+IiArIExJTkVfU0VQQVJBVE9SICsgIlx0IiwgTElORV9TRVBBUkFUT1INCi0gICAgICAgICAgICAgICAgKyAiPC9wPiIgKyBMSU5FX1NFUEFSQVRPUiArIHBvc3RmaXgsIExJTkVfU0VQQVJBVE9SICsgIjwvcD4iICsgTElORV9TRVBBUkFUT1IgKyAiPHA+IiArIExJTkVfU0VQQVJBVE9SDQotICAgICAgICAgICAgICAgICsgIlx0IiwgcXVhbnRpdHksIHN0YXJ0V2l0aExvcmVtKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgbnVtYmVyIG9mIHBhcmFncmFwaHMsIHdpdGggZWFjaCBwYXJhZ3JhcGggc2VwYXJhdGVkIGJ5IHR3bw0KLSAgICAgKiBuZXdsaW5lcy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBxdWFudGl0eQ0KLSAgICAgKiBAcGFyYW0gc3RhcnRXaXRoTG9yZW0NCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZVBhcmFncmFwaHNQbGFpblRleHQoaW50IHF1YW50aXR5LCBib29sZWFuIHN0YXJ0V2l0aExvcmVtKSB7DQotDQotICAgICAgICByZXR1cm4gZ2VuZXJhdGVNYXJrdXBQYXJhZ3JhcGhzKCIiLCAiIiwgTElORV9TRVBBUkFUT1IgKyBMSU5FX1NFUEFSQVRPUiwgcXVhbnRpdHksIHN0YXJ0V2l0aExvcmVtKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgbnVtYmVyIG9mIHBhcmFncmFwaHMsIHdpdGggZWFjaCBwYXJhZ3JhcGggc2VwYXJhdGVkIGJ5IHR3bw0KLSAgICAgKiBuZXdsaW5lcy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB3cml0ZXINCi0gICAgICogQHBhcmFtIHF1YW50aXR5DQotICAgICAqIEBwYXJhbSBzdGFydFdpdGhMb3JlbQ0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVBhcmFncmFwaHNQbGFpblRleHQoQXBwZW5kYWJsZSB3cml0ZXIsIGludCBxdWFudGl0eSwgYm9vbGVhbiBzdGFydFdpdGhMb3JlbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIGdlbmVyYXRlTWFya3VwUGFyYWdyYXBocyh3cml0ZXIsICIiLCAiIiwgTElORV9TRVBBUkFUT1IgKyBMSU5FX1NFUEFSQVRPUiwgcXVhbnRpdHksIHN0YXJ0V2l0aExvcmVtKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgbnVtYmVyIG9mIHBhcmFncmFwaHMsIHdpdGggZWFjaCBwYXJhZ3JhcGggc2VwYXJhdGVkIGJ5IHR3bw0KLSAgICAgKiBuZXdsaW5lcyBhbmQgbm8gbGluZSBleGNlZWRpbmcgbWF4Q29scyBjb2x1bW5zDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcXVhbnRpdHkNCi0gICAgICogQHBhcmFtIHN0YXJ0V2l0aExvcmVtDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVQYXJhZ3JhcGhzUGxhaW5UZXh0KGludCBxdWFudGl0eSwgaW50IG1heENvbHMsIGJvb2xlYW4gc3RhcnRXaXRoTG9yZW0pIHsNCi0NCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKHF1YW50aXR5ICsgNTEyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZ2VuZXJhdGVQYXJhZ3JhcGhzUGxhaW5UZXh0KHdyaXRlciwgcXVhbnRpdHksIG1heENvbHMsIHN0YXJ0V2l0aExvcmVtKTsNCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2VuZXJhdGVzIGEgbnVtYmVyIG9mIHBhcmFncmFwaHMsIHdpdGggZWFjaCBwYXJhZ3JhcGggc2VwYXJhdGVkIGJ5IHR3bw0KLSAgICAgKiBuZXdsaW5lcyBhbmQgbm8gbGluZSBleGNlZWRpbmcgbWF4Q29scyBjb2x1bW5zDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gd3JpdGVyDQotICAgICAqIEBwYXJhbSBxdWFudGl0eQ0KLSAgICAgKiBAcGFyYW0gc3RhcnRXaXRoTG9yZW0NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVQYXJhZ3JhcGhzUGxhaW5UZXh0KEFwcGVuZGFibGUgd3JpdGVyLCBpbnQgcXVhbnRpdHksIGludCBtYXhDb2xzLCBib29sZWFuIHN0YXJ0V2l0aExvcmVtKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotDQotICAgICAgICBTdHJpbmcgZGVsaW1zID0gIiAuLD8hIjsNCi0gICAgICAgIFN0cmluZyB1bmZvcm1hdHRlZCA9IGdlbmVyYXRlTWFya3VwUGFyYWdyYXBocygiIiwgIiIsIExJTkVfU0VQQVJBVE9SICsgTElORV9TRVBBUkFUT1IsIHF1YW50aXR5LCBzdGFydFdpdGhMb3JlbSk7DQotICAgICAgICBpbnQgbGVuID0gdW5mb3JtYXR0ZWQubGVuZ3RoKCk7DQotDQotICAgICAgICBpZiAobWF4Q29scyA8PSAwKSB7DQotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCh1bmZvcm1hdHRlZCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGludCBzdGFydFBvcyA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKHN0YXJ0UG9zIDwgbGVuIC0gMSkgew0KLSAgICAgICAgICAgICAgICBpbnQgZW5kUG9zID0gTWF0aC5taW4oc3RhcnRQb3MgKyBtYXhDb2xzLCBsZW4gLSAxKTsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBzaGlmdCA9IHRydWU7DQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBsaW5lIGJyZWFrOg0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnRQb3M7IGkgPCBlbmRQb3M7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuZm9ybWF0dGVkLmNoYXJBdChpKSA9PSAnXG4nKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbmRQb3MgPSBpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNoYXIgY2ggPSB1bmZvcm1hdHRlZC5jaGFyQXQoZW5kUG9zKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKHNoaWZ0KSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbGltcy5sZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IGRlbGltcy5jaGFyQXQoaSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSB1bmZvcm1hdHRlZC5jaGFyQXQoLS1lbmRQb3MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gZW5kUG9zID4gc3RhcnRQb3M7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCh1bmZvcm1hdHRlZC5zdWJzdHJpbmcoc3RhcnRQb3MsIGVuZFBvcyArIDEpKTsNCi0gICAgICAgICAgICAgICAgaWYgKHVuZm9ybWF0dGVkLmNoYXJBdChlbmRQb3MpICE9ICdcbicpIHsNCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoTElORV9TRVBBUkFUT1IpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gZW5kUG9zICsgMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvcmVwb3NpdG9yeS9NdWx0aVRocmVhZGVkT2JqZWN0R2VuZXJhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9yZXBvc2l0b3J5L011bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwMTI3NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9yZXBvc2l0b3J5L011bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXRpbC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlJlcG9zaXRvcnlJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLkJpbmRpbmdzT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5DbWlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5OYXZpZ2F0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5PYmplY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc3BpLlJlcG9zaXRvcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwucmVwb3NpdG9yeS5PYmplY3RHZW5lcmF0b3IuQ29udGVudEtpbmQ7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aVRocmVhZGVkT2JqZWN0R2VuZXJhdG9yIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBBY3Rpb24gewotICAgICAgICBDcmVhdGVEb2N1bWVudCwgQ3JlYXRlVHJlZSwgQ3JlYXRlRm9sZGVycywgQ3JlYXRlVHlwZXMKLSAgICB9Ci0KLSAgICBwcml2YXRlIE11bHRpVGhyZWFkZWRPYmplY3RHZW5lcmF0b3IoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RHZW5lcmF0b3JSdW5uZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQWN0aW9uIGZBY3Rpb247Ci0gICAgICAgIE9iamVjdEdlbmVyYXRvciBmT2JqR2VuOwotICAgICAgICBwcml2YXRlIFN0cmluZyBmUm9vdEZvbGRlcklkOwotICAgICAgICBwcml2YXRlIGludCBmRm9sZGVyc1BlckZvbGRlcnM7Ci0gICAgICAgIHByaXZhdGUgaW50IGZEZXB0aDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgZkNvdW50OwotICAgICAgICBwcml2YXRlIFR5cGVEZWZpbml0aW9uTGlzdCBmVHlwZURlZkxpc3Q7Ci0KLSAgICAgICAgcHVibGljIE9iamVjdEdlbmVyYXRvclJ1bm5lcihPYmplY3RHZW5lcmF0b3Igb2JqR2VuLCBBY3Rpb24gYWN0aW9uKSB7Ci0gICAgICAgICAgICBmT2JqR2VuID0gb2JqR2VuOwotICAgICAgICAgICAgZkFjdGlvbiA9IGFjdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChmQWN0aW9uID09IEFjdGlvbi5DcmVhdGVEb2N1bWVudCkgewotICAgICAgICAgICAgICAgIGRvQ3JlYXRlRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZkFjdGlvbiA9PSBBY3Rpb24uQ3JlYXRlVHJlZSkgewotICAgICAgICAgICAgICAgIGRvQ3JlYXRlVHJlZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmQWN0aW9uID09IEFjdGlvbi5DcmVhdGVGb2xkZXJzKSB7Ci0gICAgICAgICAgICAgICAgZG9DcmVhdGVGb2xkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZkFjdGlvbiA9PSBBY3Rpb24uQ3JlYXRlVHlwZXMpIHsKLSAgICAgICAgICAgICAgICBkb0NyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZG9DcmVhdGVEb2N1bWVudCgpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGlkcyA9IGZPYmpHZW4uY3JlYXRlRG9jdW1lbnRzKGZSb290Rm9sZGVySWQsIGZDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gaWRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZG9DcmVhdGVUcmVlKCkgewotICAgICAgICAgICAgZk9iakdlbi5jcmVhdGVGb2xkZXJIaWVyYWNoeShmRGVwdGgsIGZGb2xkZXJzUGVyRm9sZGVycywgZlJvb3RGb2xkZXJJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZG9DcmVhdGVGb2xkZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZk9iakdlbi5jcmVhdGVGb2xkZXJzKGZSb290Rm9sZGVySWQsIGZDb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvQ3JlYXRlVHlwZXMoKSB7Ci0gICAgICAgICAgICBmT2JqR2VuLmNyZWF0ZVR5cGVzKGZUeXBlRGVmTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0R2VuZXJhdG9yIGdldE9iamVjdEdlbmVyYXRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBmT2JqR2VuOwotICAgICAgICB9Ci0KLSAgICB9IC8vIE9iamVjdENyZWF0b3JSdW5uZXIKLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdEdlbmVyYXRvciBjcmVhdGVPYmplY3RHZW5lcmF0b3IoQ21pc0JpbmRpbmcgYmluZGluZywgU3RyaW5nIHJlcG9JZCwgaW50IGRvY3NQZXJGb2xkZXIsCi0gICAgICAgICAgICBpbnQgZm9sZGVyc1BlckZvbGRlcnMsIGludCBkZXB0aCwgU3RyaW5nIGRvY3VtZW50VHlwZSwgU3RyaW5nIGZvbGRlclR5cGUsIGludCBjb250ZW50U2l6ZUluS0IsCi0gICAgICAgICAgICBTdHJpbmcgcm9vdEZvbGRlcklkLCBDb250ZW50S2luZCBjb250ZW50S2luZCwgYm9vbGVhbiBkb0NsZWFudXApIHsKLQotICAgICAgICBCaW5kaW5nc09iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSA9IGJpbmRpbmcuZ2V0T2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBOYXZpZ2F0aW9uU2VydmljZSBuYXZTdmMgPSBiaW5kaW5nLmdldE5hdmlnYXRpb25TZXJ2aWNlKCk7Ci0gICAgICAgIE9iamVjdFNlcnZpY2Ugb2JqU3ZjID0gYmluZGluZy5nZXRPYmplY3RTZXJ2aWNlKCk7Ci0gICAgICAgIFJlcG9zaXRvcnlTZXJ2aWNlIHJlcFN2YyA9IGJpbmRpbmcuZ2V0UmVwb3NpdG9yeVNlcnZpY2UoKTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdEdlbmVyYXRvciBnZW4gPSBuZXcgT2JqZWN0R2VuZXJhdG9yKG9iamVjdEZhY3RvcnksIG5hdlN2Yywgb2JqU3ZjLCByZXBTdmMsIHJlcG9JZCwgY29udGVudEtpbmQpOwotICAgICAgICBnZW4uc2V0VXNlVXVpZHNGb3JOYW1lcyh0cnVlKTsKLSAgICAgICAgZ2VuLnNldE51bWJlck9mRG9jdW1lbnRzVG9DcmVhdGVQZXJGb2xkZXIoZG9jc1BlckZvbGRlcik7Ci0gICAgICAgIC8vIFNldCB0aGUgdHlwZSBpZCBmb3IgYWxsIGNyZWF0ZWQgZG9jdW1lbnRzOgotICAgICAgICBnZW4uc2V0RG9jdW1lbnRUeXBlSWQoZG9jdW1lbnRUeXBlKTsKLSAgICAgICAgLy8gU2V0IHRoZSB0eXBlIGlkIGZvciBhbGwgY3JlYXRlZCBmb2xkZXJzOgotICAgICAgICBnZW4uc2V0Rm9sZGVyVHlwZUlkKGZvbGRlclR5cGUpOwotICAgICAgICAvLyBTZXQgY29udGVudFNpemUKLSAgICAgICAgZ2VuLnNldENvbnRlbnRTaXplSW5LQihjb250ZW50U2l6ZUluS0IpOwotICAgICAgICBnZW4uc2V0Q2xlYW5VcEFmdGVyQ3JlYXRlKGRvQ2xlYW51cCk7Ci0KLSAgICAgICAgcmV0dXJuIGdlbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Um9vdEZvbGRlcklkKENtaXNCaW5kaW5nIGJpbmRpbmcsIFN0cmluZyByZXBvc2l0b3J5SWQsIFN0cmluZyByb290Rm9sZGVySWQpIHsKLSAgICAgICAgUmVwb3NpdG9yeVNlcnZpY2UgcmVwU3ZjID0gYmluZGluZy5nZXRSZXBvc2l0b3J5U2VydmljZSgpOwotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcCA9IHJlcFN2Yy5nZXRSZXBvc2l0b3J5SW5mbyhyZXBvc2l0b3J5SWQsIG51bGwpOwotICAgICAgICBpZiAobnVsbCA9PSByb290Rm9sZGVySWQgfHwgcm9vdEZvbGRlcklkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJvb3RGb2xkZXJJZCA9IHJlcC5nZXRSb290Rm9sZGVySWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByb290Rm9sZGVySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RHZW5lcmF0b3JSdW5uZXIgcHJlcGFyZUZvckNyZWF0ZVRyZWUoQ21pc0JpbmRpbmcgYmluZGluZywgU3RyaW5nIHJlcG9JZCwgaW50IGRvY3NQZXJGb2xkZXIsCi0gICAgICAgICAgICBpbnQgZm9sZGVyc1BlckZvbGRlcnMsIGludCBkZXB0aCwgU3RyaW5nIGRvY3VtZW50VHlwZSwgU3RyaW5nIGZvbGRlclR5cGUsIGludCBjb250ZW50U2l6ZUluS0IsCi0gICAgICAgICAgICBTdHJpbmcgcm9vdEZvbGRlcklkLCBDb250ZW50S2luZCBjb250ZW50S2luZCwgYm9vbGVhbiBkb0NsZWFudXApIHsKLQotICAgICAgICBPYmplY3RHZW5lcmF0b3Igb2JqR2VuID0gY3JlYXRlT2JqZWN0R2VuZXJhdG9yKGJpbmRpbmcsIHJlcG9JZCwgZG9jc1BlckZvbGRlciwgZm9sZGVyc1BlckZvbGRlcnMsIGRlcHRoLAotICAgICAgICAgICAgICAgIGRvY3VtZW50VHlwZSwgZm9sZGVyVHlwZSwgY29udGVudFNpemVJbktCLCByb290Rm9sZGVySWQsIGNvbnRlbnRLaW5kLCBkb0NsZWFudXApOwotCi0gICAgICAgIE9iamVjdEdlbmVyYXRvclJ1bm5lciBnZW4gPSBuZXcgT2JqZWN0R2VuZXJhdG9yUnVubmVyKG9iakdlbiwgQWN0aW9uLkNyZWF0ZVRyZWUpOwotICAgICAgICBnZW4uZkZvbGRlcnNQZXJGb2xkZXJzID0gZm9sZGVyc1BlckZvbGRlcnM7Ci0gICAgICAgIGdlbi5mRGVwdGggPSBkZXB0aDsKLSAgICAgICAgZ2VuLmZSb290Rm9sZGVySWQgPSBnZXRSb290Rm9sZGVySWQoYmluZGluZywgcmVwb0lkLCByb290Rm9sZGVySWQpOwotICAgICAgICByZXR1cm4gZ2VuOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0R2VuZXJhdG9yUnVubmVyW10gcHJlcGFyZUZvckNyZWF0ZVRyZWVNVChDbWlzQmluZGluZyBwcm92aWRlciwgU3RyaW5nIHJlcG9JZCwKLSAgICAgICAgICAgIGludCBkb2NzUGVyRm9sZGVyLCBpbnQgZm9sZGVyc1BlckZvbGRlcnMsIGludCBkZXB0aCwgU3RyaW5nIGRvY3VtZW50VHlwZSwgU3RyaW5nIGZvbGRlclR5cGUsCi0gICAgICAgICAgICBpbnQgY29udGVudFNpemVJbktCLCBTdHJpbmdbXSByb290Rm9sZGVySWRzLCBDb250ZW50S2luZCBjb250ZW50S2luZCwgYm9vbGVhbiBkb0NsZWFudXApIHsKLQotICAgICAgICBPYmplY3RHZW5lcmF0b3JSdW5uZXJbXSBydW5uZXJzID0gbmV3IE9iamVjdEdlbmVyYXRvclJ1bm5lcltyb290Rm9sZGVySWRzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9vdEZvbGRlcklkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0R2VuZXJhdG9yIG9iakdlbiA9IGNyZWF0ZU9iamVjdEdlbmVyYXRvcihwcm92aWRlciwgcmVwb0lkLCBkb2NzUGVyRm9sZGVyLCBmb2xkZXJzUGVyRm9sZGVycywgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50VHlwZSwgZm9sZGVyVHlwZSwgY29udGVudFNpemVJbktCLCByb290Rm9sZGVySWRzW2ldLCBjb250ZW50S2luZCwKLSAgICAgICAgICAgICAgICAgICAgZG9DbGVhbnVwKTsKLQotICAgICAgICAgICAgT2JqZWN0R2VuZXJhdG9yUnVubmVyIGdlbiA9IG5ldyBPYmplY3RHZW5lcmF0b3JSdW5uZXIob2JqR2VuLCBBY3Rpb24uQ3JlYXRlVHJlZSk7Ci0gICAgICAgICAgICBnZW4uZkZvbGRlcnNQZXJGb2xkZXJzID0gZm9sZGVyc1BlckZvbGRlcnM7Ci0gICAgICAgICAgICBnZW4uZkRlcHRoID0gZGVwdGg7Ci0gICAgICAgICAgICBnZW4uZlJvb3RGb2xkZXJJZCA9IHJvb3RGb2xkZXJJZHNbaV07Ci0gICAgICAgICAgICBydW5uZXJzW2ldID0gZ2VuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydW5uZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0R2VuZXJhdG9yUnVubmVyIHByZXBhcmVGb3JDcmVhdGVEb2N1bWVudChDbWlzQmluZGluZyBwcm92aWRlciwgU3RyaW5nIHJlcG9JZCwKLSAgICAgICAgICAgIFN0cmluZyBkb2N1bWVudFR5cGUsIGludCBjb250ZW50U2l6ZUluS0IsIFN0cmluZyByb290Rm9sZGVySWQsIGludCBub0RvY3VtZW50cywgCi0gICAgICAgICAgICBDb250ZW50S2luZCBjb250ZW50S2luZCwgYm9vbGVhbiBkb0NsZWFudXApIHsKLQotICAgICAgICBPYmplY3RHZW5lcmF0b3Igb2JqR2VuID0gY3JlYXRlT2JqZWN0R2VuZXJhdG9yKHByb3ZpZGVyLCByZXBvSWQsIDAsIDAsIDAsIGRvY3VtZW50VHlwZSwgbnVsbCwgY29udGVudFNpemVJbktCLAotICAgICAgICAgICAgICAgIHJvb3RGb2xkZXJJZCwgY29udGVudEtpbmQsIGRvQ2xlYW51cCk7Ci0KLSAgICAgICAgT2JqZWN0R2VuZXJhdG9yUnVubmVyIGdlbiA9IG5ldyBPYmplY3RHZW5lcmF0b3JSdW5uZXIob2JqR2VuLCBBY3Rpb24uQ3JlYXRlRG9jdW1lbnQpOwotICAgICAgICBnZW4uZlJvb3RGb2xkZXJJZCA9IGdldFJvb3RGb2xkZXJJZChwcm92aWRlciwgcmVwb0lkLCByb290Rm9sZGVySWQpOwotICAgICAgICBnZW4uZkNvdW50ID0gbm9Eb2N1bWVudHM7Ci0gICAgICAgIHJldHVybiBnZW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3RHZW5lcmF0b3JSdW5uZXJbXSBwcmVwYXJlRm9yQ3JlYXRlRG9jdW1lbnRNVChpbnQgdGhyZWFkQ291bnQsIENtaXNCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgICAgICBTdHJpbmcgcmVwb0lkLCBTdHJpbmcgZG9jdW1lbnRUeXBlLCBpbnQgY29udGVudFNpemVJbktCLCBTdHJpbmcgcm9vdEZvbGRlcklkLCBpbnQgbm9Eb2N1bWVudHMsCi0gICAgICAgICAgICBDb250ZW50S2luZCBjb250ZW50S2luZCwgYm9vbGVhbiBkb0NsZWFudXApIHsKLQotICAgICAgICBPYmplY3RHZW5lcmF0b3JSdW5uZXJbXSBydW5uZXJzID0gbmV3IE9iamVjdEdlbmVyYXRvclJ1bm5lclt0aHJlYWRDb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkQ291bnQ7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0R2VuZXJhdG9yIG9iakdlbiA9IGNyZWF0ZU9iamVjdEdlbmVyYXRvcihiaW5kaW5nLCByZXBvSWQsIDAsIDAsIDAsIGRvY3VtZW50VHlwZSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFNpemVJbktCLCByb290Rm9sZGVySWQsIGNvbnRlbnRLaW5kLCBkb0NsZWFudXApOwotCi0gICAgICAgICAgICBPYmplY3RHZW5lcmF0b3JSdW5uZXIgZ2VuID0gbmV3IE9iamVjdEdlbmVyYXRvclJ1bm5lcihvYmpHZW4sIEFjdGlvbi5DcmVhdGVEb2N1bWVudCk7Ci0gICAgICAgICAgICBnZW4uZlJvb3RGb2xkZXJJZCA9IGdldFJvb3RGb2xkZXJJZChiaW5kaW5nLCByZXBvSWQsIHJvb3RGb2xkZXJJZCk7Ci0gICAgICAgICAgICBnZW4uZkNvdW50ID0gbm9Eb2N1bWVudHM7Ci0gICAgICAgICAgICBydW5uZXJzW2ldID0gZ2VuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydW5uZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0R2VuZXJhdG9yUnVubmVyIHByZXBhcmVGb3JDcmVhdGVGb2xkZXIoQ21pc0JpbmRpbmcgcHJvdmlkZXIsIFN0cmluZyByZXBvSWQsIFN0cmluZyBmb2xkZXJUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHJvb3RGb2xkZXJJZCwgaW50IG5vRm9sZGVycywgYm9vbGVhbiBkb0NsZWFudXApIHsKLQotICAgICAgICBPYmplY3RHZW5lcmF0b3Igb2JqR2VuID0gY3JlYXRlT2JqZWN0R2VuZXJhdG9yKHByb3ZpZGVyLCByZXBvSWQsIDAsIDAsIDAsIG51bGwsIGZvbGRlclR5cGUsIDAsIHJvb3RGb2xkZXJJZCwKLSAgICAgICAgICAgICAgICBudWxsLCBkb0NsZWFudXApOwotCi0gICAgICAgIE9iamVjdEdlbmVyYXRvclJ1bm5lciBnZW4gPSBuZXcgT2JqZWN0R2VuZXJhdG9yUnVubmVyKG9iakdlbiwgQWN0aW9uLkNyZWF0ZUZvbGRlcnMpOwotICAgICAgICBnZW4uZlJvb3RGb2xkZXJJZCA9IGdldFJvb3RGb2xkZXJJZChwcm92aWRlciwgcmVwb0lkLCByb290Rm9sZGVySWQpOwotICAgICAgICBnZW4uZkNvdW50ID0gbm9Gb2xkZXJzOwotICAgICAgICByZXR1cm4gZ2VuOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0R2VuZXJhdG9yUnVubmVyW10gcHJlcGFyZUZvckNyZWF0ZUZvbGRlck1UKGludCB0aHJlYWRDb3VudCwgQ21pc0JpbmRpbmcgYmluZGluZywgU3RyaW5nIHJlcG9JZCwKLSAgICAgICAgICAgIFN0cmluZyBmb2xkZXJUeXBlLCBTdHJpbmcgcm9vdEZvbGRlcklkLCBpbnQgbm9Gb2xkZXJzLCBib29sZWFuIGRvQ2xlYW51cCkgewotCi0gICAgICAgIE9iamVjdEdlbmVyYXRvclJ1bm5lcltdIHJ1bm5lcnMgPSBuZXcgT2JqZWN0R2VuZXJhdG9yUnVubmVyW3RocmVhZENvdW50XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3RHZW5lcmF0b3Igb2JqR2VuID0gY3JlYXRlT2JqZWN0R2VuZXJhdG9yKGJpbmRpbmcsIHJlcG9JZCwgMCwgMCwgMCwgbnVsbCwgZm9sZGVyVHlwZSwgMCwgcm9vdEZvbGRlcklkLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBkb0NsZWFudXApOwotCi0gICAgICAgICAgICBPYmplY3RHZW5lcmF0b3JSdW5uZXIgZ2VuID0gbmV3IE9iamVjdEdlbmVyYXRvclJ1bm5lcihvYmpHZW4sIEFjdGlvbi5DcmVhdGVGb2xkZXJzKTsKLSAgICAgICAgICAgIGdlbi5mUm9vdEZvbGRlcklkID0gZ2V0Um9vdEZvbGRlcklkKGJpbmRpbmcsIHJlcG9JZCwgcm9vdEZvbGRlcklkKTsKLSAgICAgICAgICAgIGdlbi5mQ291bnQgPSBub0ZvbGRlcnM7Ci0gICAgICAgICAgICBydW5uZXJzW2ldID0gZ2VuOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydW5uZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0R2VuZXJhdG9yUnVubmVyIHByZXBhcmVGb3JDcmVhdGVUeXBlcyhDbWlzQmluZGluZyBwcm92aWRlciwgU3RyaW5nIHJlcG9JZCwgVHlwZURlZmluaXRpb25MaXN0IHR5cGVEZWZMaXN0KSB7Ci0KLSAgICAgICAgT2JqZWN0R2VuZXJhdG9yIG9iakdlbiA9IGNyZWF0ZU9iamVjdEdlbmVyYXRvcihwcm92aWRlciwgcmVwb0lkLCAwLCAwLCAwLCBudWxsLCBudWxsLCAwLCBudWxsLAotICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlKTsKLQotICAgICAgICBPYmplY3RHZW5lcmF0b3JSdW5uZXIgZ2VuID0gbmV3IE9iamVjdEdlbmVyYXRvclJ1bm5lcihvYmpHZW4sIEFjdGlvbi5DcmVhdGVUeXBlcyk7Ci0gICAgICAgIGdlbi5mVHlwZURlZkxpc3QgPSB0eXBlRGVmTGlzdDsKLSAgICAgICAgcmV0dXJuIGdlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuTXVsdGlUaHJlYWRlZChPYmplY3RHZW5lcmF0b3JSdW5uZXJbXSBydW5uZXIpIHsKLSAgICAgICAgaW50IHRocmVhZENvdW50ID0gcnVubmVyLmxlbmd0aDsKLSAgICAgICAgVGhyZWFkW10gdGhyZWFkcyA9IG5ldyBUaHJlYWRbdGhyZWFkQ291bnRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKHJ1bm5lcltpXSwgIk9iamVjdEdlbmVyYXRvclRocmVhZC0iICsgaSk7Ci0gICAgICAgICAgICB0aHJlYWRzW2ldID0gdGhyZWFkOwotICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChUaHJlYWQgdGhyZWFkIDogdGhyZWFkcykgewotICAgICAgICAgICAgICAgIHRocmVhZC5qb2luKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBQcmludCBhbGwgdGltaW5ncyB0byBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0OiIpOwotICAgICAgICAgICAgVGltZUxvZ2dlcltdIGxvZ2dlcnNDcmVhdGVEb2MgPSBuZXcgVGltZUxvZ2dlclt0aHJlYWRDb3VudF07Ci0gICAgICAgICAgICBUaW1lTG9nZ2VyW10gbG9nZ2Vyc0NyZWF0ZUZvbGRlciA9IG5ldyBUaW1lTG9nZ2VyW3RocmVhZENvdW50XTsKLSAgICAgICAgICAgIFRpbWVMb2dnZXJbXSBsb2dnZXJzRGVsZXRlID0gbmV3IFRpbWVMb2dnZXJbdGhyZWFkQ291bnRdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2Vyc0NyZWF0ZURvY1tpXSA9IHJ1bm5lcltpXS5mT2JqR2VuLmdldENyZWF0ZURvY3VtZW50VGltZUxvZ2dlcigpOwotICAgICAgICAgICAgICAgIGxvZ2dlcnNDcmVhdGVGb2xkZXJbaV0gPSBydW5uZXJbaV0uZk9iakdlbi5nZXRDcmVhdGVGb2xkZXJUaW1lTG9nZ2VyKCk7Ci0gICAgICAgICAgICAgICAgbG9nZ2Vyc0RlbGV0ZVtpXSA9IHJ1bm5lcltpXS5mT2JqR2VuLmdldERlbGV0ZVRpbWVMb2dnZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRpbWVMb2dnZXIucHJpbnRUaW1lcyhsb2dnZXJzQ3JlYXRlRG9jKTsKLSAgICAgICAgICAgIFRpbWVMb2dnZXIucHJpbnRUaW1lcyhsb2dnZXJzQ3JlYXRlRm9sZGVyKTsKLSAgICAgICAgICAgIFRpbWVMb2dnZXIucHJpbnRUaW1lcyhsb2dnZXJzRGVsZXRlKTsKLQotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byB3YWl0IGZvciB0ZXJtaW5hdGlvbiBvZiB0aHJlYWRzOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL3JlcG9zaXRvcnkvT2JqZWN0R2VuZXJhdG9yLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9yZXBvc2l0b3J5L09iamVjdEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBmOGNmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL3JlcG9zaXRvcnkvT2JqZWN0R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Db250ZW50U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5FeHRlbnNpb25zRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuT2JqZWN0SW5Gb2xkZXJEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5PYmplY3RJbkZvbGRlckxpc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlByb3BlcnR5RGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuVHlwZURlZmluaXRpb25MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVW5maWxlT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuVmVyc2lvbmluZ1N0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5kYXRhb2JqZWN0cy5Db250ZW50U3RyZWFtSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5CaW5kaW5nc09iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuTmF2aWdhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuT2JqZWN0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5SZXBvc2l0b3J5U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLmNvbnRlbnQuZnJhY3RhbC5GcmFjdGFsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWwuY29udGVudC5sb3JlbWlwc3VtLkxvcmVtSXBzdW07Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotLyoqCi0gKiBBIHNpbXBsZSBoZWxwZXIgY2xhc3MgZm9yIHRoZSB0ZXN0cyB0aGF0IGdlbmVyYXRlcyBhIHNhbXBsZSBmb2xkZXIgaGllcmFyY2h5Ci0gKiBhbmQgb3B0aW9uYWxseSBkb2N1bWVudHMgaW4gaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RHZW5lcmF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtJTE8gPSAxMDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPYmplY3RHZW5lcmF0b3IuY2xhc3MpOwotICAgIHByaXZhdGUgZmluYWwgQmluZGluZ3NPYmplY3RGYWN0b3J5IGZGYWN0b3J5OwotICAgIE5hdmlnYXRpb25TZXJ2aWNlIGZOYXZTdmM7Ci0gICAgT2JqZWN0U2VydmljZSBmT2JqU3ZjOwotICAgIFJlcG9zaXRvcnlTZXJ2aWNlIGZSZXBTdmM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlJlcG9zaXRvcnlJZDsKLSAgICBwcml2YXRlIGZpbmFsIFRpbWVMb2dnZXIgZlRpbWVMb2dnZXJDcmVhdGVEb2M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUaW1lTG9nZ2VyIGZUaW1lTG9nZ2VyQ3JlYXRlRm9sZGVyOwotICAgIHByaXZhdGUgZmluYWwgVGltZUxvZ2dlciBmVGltZUxvZ2dlckRlbGV0ZTsKLSAgICBwcml2YXRlIGZpbmFsIFRpbWVMb2dnZXIgZlRpbWVMb2dnZXJDcmVhdGVUeXBlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmQ2xlYW51cDsKLSAgICBMaXN0PFN0cmluZz4gZlRvcExldmVsRG9jc0NyZWF0ZWQ7IC8vIGxpc3Qgb2YgaWRzIGNyZWF0ZWQgb24gZmlyc3QgbGV2ZWwKLSAgICBMaXN0PFN0cmluZz4gZlRvcExldmVsRm9sZGVyc0NyZWF0ZWQ7IC8vIGxpc3Qgb2YgaWRzIGNyZWF0ZWQgb24gZmlyc3QgbGV2ZWwKLQotICAgIC8qKgotICAgICAqIHN1cHBvcnRlZCBraW5kcyBvZiBjb250ZW50Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIGVudW0gQ29udGVudEtpbmQgewotICAgICAgICBTVEFUSUNfVEVYVCwgTE9SRU1fSVBTVU1fVEVYVCwgTE9SRU1fSVBTVU1fSFRNTCwgSU1BR0VfRlJBQ1RBTF9KUEVHCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiAvIGhvdyBtYW55IGRvY3VtZW50cyBhcmUgY3JlYXRlZCBpbiBlYWNoIGZvbGRlcgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGZOb0RvY3VtZW50c1RvQ3JlYXRlOwotCi0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgaWQgb2YgdGhlIGRvY3VtZW50IGlkIHRoYXQgaXMgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmRG9jVHlwZUlkID0gQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBpZCBvZiB0aGUgZm9sZGVyIHRoYXQgaXMgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmRm9sZGVyVHlwZUlkID0gQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpOwotCi0gICAgLyoqCi0gICAgICogQSBsaXN0IG9mIHByb3BlcnR5IGlkcy4gRm9yIGVhY2ggZWxlbWVudCBpbiB0aGlzIGxpc3QgYSBTdHJpbmcgcHJvcGVydHkKLSAgICAgKiB2YWx1ZSBpcyBjcmVhdGVkIGZvciBlYWNoIGNyZWF0aW9uIG9mIGEgZG9jdW1lbnQuIEFsbCBpZHMgbXVzdCBiZSB2YWxpZAotICAgICAqIHN0cmluZyBwcm9wZXJ0eSBpZCBvZiB0aGUgdHlwZSBmRG9jVHlwZUlkCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZlN0cmluZ1Byb3BlcnR5SWRzVG9TZXRGb3JEb2N1bWVudDsKLQotICAgIC8qKgotICAgICAqIEEgbGlzdCBvZiBwcm9wZXJ0eSBpZHMuIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhpcyBsaXN0IGEgU3RyaW5nIHByb3BlcnR5Ci0gICAgICogdmFsdWUgaXMgY3JlYXRlZCBmb3IgZWFjaCBjcmVhdGlvbiBvZiBhIGZvbGRlci4gQWxsIGlkcyBtdXN0IGJlIHZhbGlkCi0gICAgICogc3RyaW5nIHByb3BlcnR5IGlkIG9mIHRoZSB0eXBlIGZGb2xkZXJUeXBlSWQKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBmU3RyaW5nUHJvcGVydHlJZHNUb1NldEZvckZvbGRlcjsKLQotICAgIC8qKgotICAgICAqIG51bWJlciBvZiBkb2N1bWVudHMgY3JlYXRlZCBpbiB0b3RhbAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGZEb2N1bWVudHNJblRvdGFsQ291bnQgPSAwOwotCi0gICAgLyoqCi0gICAgICogbnVtYmVyIG9mIGZvbGRlcnMgY3JlYXRlZCBpbiB0b3RhbAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGZGb2xkZXJzSW5Ub3RhbENvdW50ID0gMDsKLQotICAgIC8qKgotICAgICAqIHNpemUgb2YgY29udGVudCBpbiBLQiwgaWYgMCBjcmVhdGUgZG9jdW1lbnRzIHdpdGhvdXQgY29udGVudAotICAgICAqLwotICAgIHByaXZhdGUgaW50IGZDb250ZW50U2l6ZUluSyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBLaW5kIG9mIGNvbnRlbnQgdG8gY3JlYXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBDb250ZW50S2luZCBmQ29udGVudEtpbmQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVBST1BWQUxQUkVGSVhET0MgPSAiTXlfRG9jdW1lbnQtIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVBST1BWQUxQUkVGSVhGT0xERVIgPSAiTXlfRm9sZGVyLSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1BST1BWQUxQUkVGSVhET0MgPSAiTXkgRG9jIFN0cmluZ1Byb3BlcnR5ICI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1BST1BWQUxQUkVGSVhGT0xERVIgPSAiTXkgRm9sZGVyIFN0cmluZ1Byb3BlcnR5ICI7Ci0gICAgcHJpdmF0ZSBpbnQgcHJvcFZhbENvdW50ZXJEb2NTdHJpbmcgPSAwOwotICAgIHByaXZhdGUgaW50IHByb3BWYWxDb3VudGVyRm9sZGVyU3RyaW5nID0gMDsKLSAgICAvKioKLSAgICAgKiB1c2UgVVVJRHMgdG8gZ2VuZXJhdGUgZm9sZGVyIGFuZCBkb2N1bWVudCBuYW1lcwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmVXNlVXVpZHM7Ci0KLSAgICAvKioKLSAgICAgKiBnZW5lcmF0b3IgZm9yIGltYWdlcwotICAgICAqLwotICAgIHByaXZhdGUgRnJhY3RhbEdlbmVyYXRvciBmcmFjdGFsR2VuZXJhdG9yID0gbnVsbDsKLQotICAgIHB1YmxpYyBPYmplY3RHZW5lcmF0b3IoQmluZGluZ3NPYmplY3RGYWN0b3J5IGZhY3RvcnksIE5hdmlnYXRpb25TZXJ2aWNlIG5hdlN2YywgT2JqZWN0U2VydmljZSBvYmpTdmMsCi0gICAgICAgICAgICBSZXBvc2l0b3J5U2VydmljZSByZXBTdmMsIFN0cmluZyByZXBvc2l0b3J5SWQsIENvbnRlbnRLaW5kIGNvbnRlbnRLaW5kKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGZGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgZk5hdlN2YyA9IG5hdlN2YzsKLSAgICAgICAgZk9ialN2YyA9IG9ialN2YzsKLSAgICAgICAgZlJlcFN2YyA9IHJlcFN2YzsKLSAgICAgICAgZlJlcG9zaXRvcnlJZCA9IHJlcG9zaXRvcnlJZDsKLSAgICAgICAgLy8gY3JlYXRlIGFuIGVtcHR5IGxpc3Qgb2YgcHJvcGVydGllcyB0byBnZW5lcmF0ZSBieSBkZWZhdWx0IGZvciBmb2xkZXIKLSAgICAgICAgLy8gYW5kIGRvY3VtZW50Ci0gICAgICAgIGZTdHJpbmdQcm9wZXJ0eUlkc1RvU2V0Rm9yRG9jdW1lbnQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZlN0cmluZ1Byb3BlcnR5SWRzVG9TZXRGb3JGb2xkZXIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZk5vRG9jdW1lbnRzVG9DcmVhdGUgPSAwOwotICAgICAgICBmVXNlVXVpZHMgPSBmYWxzZTsKLSAgICAgICAgZlRpbWVMb2dnZXJDcmVhdGVEb2MgPSBuZXcgVGltZUxvZ2dlcigiY3JlYXRlRG9jdW1lbnQoKSIpOwotICAgICAgICBmVGltZUxvZ2dlckNyZWF0ZUZvbGRlciA9IG5ldyBUaW1lTG9nZ2VyKCJjcmVhdGVGb2xkZXIoKSIpOwotICAgICAgICBmVGltZUxvZ2dlckRlbGV0ZSA9IG5ldyBUaW1lTG9nZ2VyKCJEZWxldGUiKTsKLSAgICAgICAgZlRpbWVMb2dnZXJDcmVhdGVUeXBlID0gbmV3IFRpbWVMb2dnZXIoImNyZWF0ZVR5cGUoKSIpOwotICAgICAgICBmQ2xlYW51cCA9IGZhbHNlOwotICAgICAgICBmVG9wTGV2ZWxEb2NzQ3JlYXRlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmVG9wTGV2ZWxGb2xkZXJzQ3JlYXRlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmQ29udGVudEtpbmQgPSBjb250ZW50S2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXJPZkRvY3VtZW50c1RvQ3JlYXRlUGVyRm9sZGVyKGludCBub0RvY3VtZW50c1RvQ3JlYXRlKSB7Ci0gICAgICAgIGZOb0RvY3VtZW50c1RvQ3JlYXRlID0gbm9Eb2N1bWVudHNUb0NyZWF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2xkZXJUeXBlSWQoU3RyaW5nIGZvbGRlclR5cGVJZCkgewotICAgICAgICBmRm9sZGVyVHlwZUlkID0gZm9sZGVyVHlwZUlkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50VHlwZUlkKFN0cmluZyBkb2NUeXBlSWQpIHsKLSAgICAgICAgZkRvY1R5cGVJZCA9IGRvY1R5cGVJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudFByb3BlcnRpZXNUb0dlbmVyYXRlKExpc3Q8U3RyaW5nPiBwcm9wZXJ0eUlkcykgewotICAgICAgICBmU3RyaW5nUHJvcGVydHlJZHNUb1NldEZvckRvY3VtZW50ID0gcHJvcGVydHlJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Rm9sZGVyUHJvcGVydGllc1RvR2VuZXJhdGUoTGlzdDxTdHJpbmc+IHByb3BlcnR5SWRzKSB7Ci0gICAgICAgIGZTdHJpbmdQcm9wZXJ0eUlkc1RvU2V0Rm9yRm9sZGVyID0gcHJvcGVydHlJZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFNpemVJbktCKGludCBzaXplSW5LKSB7Ci0gICAgICAgIGZDb250ZW50U2l6ZUluSyA9IHNpemVJbks7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRLaW5kIGdldENvbnRlbnRLaW5kKCkgewotICAgICAgICByZXR1cm4gZkNvbnRlbnRLaW5kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvcmVJcHN1bUdlbmVyYXRvcihDb250ZW50S2luZCBjb250ZW50S2luZCkgewotICAgICAgICBmQ29udGVudEtpbmQgPSBjb250ZW50S2luZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGVhblVwQWZ0ZXJDcmVhdGUoYm9vbGVhbiBkb0NsZWFudXApIHsKLSAgICAgICAgZkNsZWFudXAgPSBkb0NsZWFudXA7Ci0gICAgfQotCi0gICAgcHVibGljIFRpbWVMb2dnZXIgZ2V0Q3JlYXRlRG9jdW1lbnRUaW1lTG9nZ2VyKCkgewotICAgICAgICByZXR1cm4gZlRpbWVMb2dnZXJDcmVhdGVEb2M7Ci0gICAgfQotCi0gICAgcHVibGljIFRpbWVMb2dnZXIgZ2V0Q3JlYXRlRm9sZGVyVGltZUxvZ2dlcigpIHsKLSAgICAgICAgcmV0dXJuIGZUaW1lTG9nZ2VyQ3JlYXRlRm9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBUaW1lTG9nZ2VyIGdldERlbGV0ZVRpbWVMb2dnZXIoKSB7Ci0gICAgICAgIHJldHVybiBmVGltZUxvZ2dlckRlbGV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVGb2xkZXJIaWVyYWNoeShpbnQgbGV2ZWxzLCBpbnQgY2hpbGRyZW5QZXJMZXZlbCwgU3RyaW5nIHJvb3RGb2xkZXJJZCkgewotICAgICAgICByZXNldENvdW50ZXJzKCk7Ci0gICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRG9jLnJlc2V0KCk7Ci0gICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRm9sZGVyLnJlc2V0KCk7Ci0gICAgICAgIGZUb3BMZXZlbEZvbGRlcnNDcmVhdGVkLmNsZWFyKCk7Ci0gICAgICAgIGZUb3BMZXZlbERvY3NDcmVhdGVkLmNsZWFyKCk7Ci0gICAgICAgIGNyZWF0ZUZvbGRlckhpZXJhY2h5KHJvb3RGb2xkZXJJZCwgMCwgbGV2ZWxzLCBjaGlsZHJlblBlckxldmVsKTsKLSAgICAgICAgaWYgKGZDbGVhbnVwKSB7Ci0gICAgICAgICAgICBkZWxldGVUcmVlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VVdWlkc0Zvck5hbWVzKGJvb2xlYW4gdXNlVXVpZHMpIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIHVzZSBVVUlEcyB0byBnZW5lcmF0ZSBmb2xkZXIgYW5kIGRvY3VtZW50IG5hbWVzCi0gICAgICAgICAqLwotICAgICAgICBmVXNlVXVpZHMgPSB1c2VVdWlkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXRyaWV2ZSB0aGUgaW5kZXgtdGggZm9sZGVyIGZyb20gZ2l2ZW4gbGV2ZWwgb2YgdGhlIGhpZXJhcmNoeSBzdGFydGluZwotICAgICAqIGF0IHJvb3RJZAotICAgICAqIAotICAgICAqIEBwYXJhbSByb290SWQKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGb2xkZXJJZChTdHJpbmcgcm9vdElkLCBpbnQgbGV2ZWwsIGludCBpbmRleCkgewotICAgICAgICBTdHJpbmcgb2JqZWN0SWQgPSByb290SWQ7Ci0gICAgICAgIGZpbmFsIFN0cmluZyByZXF1aXJlZFByb3BlcnRpZXMgPSBQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQgKyAiLCIgKyBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCArICIsIgotICAgICAgICAgICAgICAgICsgUHJvcGVydHlJZHMuQkFTRV9UWVBFX0lEOwotICAgICAgICAvLyBOb3RlOiBUaGlzIHdvcmtzIGJlY2F1c2UgZmlyc3QgZm9sZGVycyBhcmUgY3JlYXRlZCB0aGVuIGRvY3VtZW50cwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxldmVsOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdEluRm9sZGVyTGlzdCByZXN1bHQgPSBmTmF2U3ZjLmdldENoaWxkcmVuKGZSZXBvc2l0b3J5SWQsIG9iamVjdElkLCByZXF1aXJlZFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgIFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCBmYWxzZSwgSW5jbHVkZVJlbGF0aW9uc2hpcHMuTk9ORSwgbnVsbCwgdHJ1ZSwgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwKLSAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgbnVsbCk7Ci0gICAgICAgICAgICBMaXN0PE9iamVjdEluRm9sZGVyRGF0YT4gY2hpbGRyZW4gPSByZXN1bHQuZ2V0T2JqZWN0cygpOwotICAgICAgICAgICAgT2JqZWN0RGF0YSBjaGlsZCA9IGNoaWxkcmVuLmdldChpbmRleCkuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICBvYmplY3RJZCA9IChTdHJpbmcpIGNoaWxkLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFByb3BlcnR5SWRzLk9CSkVDVF9JRCkuZ2V0Rmlyc3RWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmplY3RJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXRyaWV2ZSB0aGUgaW5kZXgtdGggZG9jdW1lbnQgZnJvbSBnaXZlbiBmb2xkZXIKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZm9sZGVySWQKLSAgICAgKiAgICAgICAgICAgIGZvbGRlciB0byByZXRyaWV2ZSBkb2N1bWVudCBmcm9tCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogICAgICAgICAgICBpbmRleCBvZiBkb2N1bWVudCB0byByZXRyaWV2ZSBmcm9tIHRoaXMgZm9sZGVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRJZChTdHJpbmcgZm9sZGVySWQsIGludCBpbmRleCkgewotICAgICAgICBTdHJpbmcgZG9jSWQgPSBudWxsOwotICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWlyZWRQcm9wZXJ0aWVzID0gUHJvcGVydHlJZHMuT0JKRUNUX0lEICsgIiwiICsgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQgKyAiLCIKLSAgICAgICAgICAgICAgICArIFByb3BlcnR5SWRzLkJBU0VfVFlQRV9JRDsKLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IHJlc3VsdCA9IGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIHJlcXVpcmVkUHJvcGVydGllcywKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgZmFsc2UsIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUsIG51bGwsIHRydWUsIEJpZ0ludGVnZXIudmFsdWVPZigtMSksCi0gICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgbnVsbCk7Ci0gICAgICAgIExpc3Q8T2JqZWN0SW5Gb2xkZXJEYXRhPiBjaGlsZHJlbiA9IHJlc3VsdC5nZXRPYmplY3RzKCk7Ci0gICAgICAgIGludCBudW1Eb2NzRm91bmQgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3REYXRhIGNoaWxkID0gY2hpbGRyZW4uZ2V0KGkpLmdldE9iamVjdCgpOwotICAgICAgICAgICAgZG9jSWQgPSAoU3RyaW5nKSBjaGlsZC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRCYXNlVHlwZUlkKCkuZXF1YWxzKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtRG9jc0ZvdW5kID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2NJZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBudW1Eb2NzRm91bmQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY0lkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGRvY3VtZW50cyBjcmVhdGVkCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRzSW5Ub3RhbCgpIHsKLSAgICAgICAgcmV0dXJuIGZEb2N1bWVudHNJblRvdGFsQ291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZm9sZGVycyBjcmVhdGVkCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Rm9sZGVyc0luVG90YWwoKSB7Ci0gICAgICAgIHJldHVybiBmRm9sZGVyc0luVG90YWxDb3VudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE9iamVjdHNJblRvdGFsKCkgewotICAgICAgICByZXR1cm4gZkRvY3VtZW50c0luVG90YWxDb3VudCArIGZGb2xkZXJzSW5Ub3RhbENvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlU2luZ2xlRG9jdW1lbnQoU3RyaW5nIGZvbGRlcklkKSB7Ci0gICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRG9jLnJlc2V0KCk7Ci0gICAgICAgIFN0cmluZyBvYmplY3RJZCA9IGNyZWF0ZURvY3VtZW50KGZvbGRlcklkLCAwLCAwKTsKLSAgICAgICAgaWYgKGZDbGVhbnVwKSB7Ci0gICAgICAgICAgICBkZWxldGVPYmplY3Qob2JqZWN0SWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmplY3RJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlRG9jdW1lbnRzKFN0cmluZyBmb2xkZXJJZCwgaW50IGNvdW50KSB7Ci0KLSAgICAgICAgU3RyaW5nW10gcmVzdWx0OwotCi0gICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRG9jLnJlc2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gY3JlYXRlRG9jdW1lbnQoZm9sZGVySWQsIDAsIDApOwotICAgICAgICAgICAgZlRvcExldmVsRG9jc0NyZWF0ZWQuYWRkKGlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkNsZWFudXApIHsKLSAgICAgICAgICAgIGRlbGV0ZVRyZWUoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgU3RyaW5nW2NvdW50XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZlRvcExldmVsRG9jc0NyZWF0ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBmVG9wTGV2ZWxEb2NzQ3JlYXRlZC5nZXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlRm9sZGVycyhTdHJpbmcgZm9sZGVySWQsIGludCBjb3VudCkgewotCi0gICAgICAgIFN0cmluZ1tdIHJlc3VsdDsKLQotICAgICAgICBmVGltZUxvZ2dlckNyZWF0ZUZvbGRlci5yZXNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNyZWF0ZUZvbGRlcihmb2xkZXJJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZDbGVhbnVwKSB7Ci0gICAgICAgICAgICBkZWxldGVUcmVlKCk7Ci0gICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1tjb3VudF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZUb3BMZXZlbEZvbGRlcnNDcmVhdGVkLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gZlRvcExldmVsRm9sZGVyc0NyZWF0ZWQuZ2V0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXRDb3VudGVycygpIHsKLSAgICAgICAgZkRvY3VtZW50c0luVG90YWxDb3VudCA9IDA7Ci0gICAgICAgIGZGb2xkZXJzSW5Ub3RhbENvdW50ID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludFRpbWluZ3MoKSB7Ci0gICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRG9jLnByaW50VGltZXMoKTsKLSAgICAgICAgZlRpbWVMb2dnZXJDcmVhdGVGb2xkZXIucHJpbnRUaW1lcygpOwotICAgICAgICBpZiAoZkNsZWFudXApIHsKLSAgICAgICAgICAgIGZUaW1lTG9nZ2VyRGVsZXRlLnByaW50VGltZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvZ1RpbWluZ3MoKSB7Ci0gICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRG9jLmxvZ1RpbWVzKCk7Ci0gICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRm9sZGVyLmxvZ1RpbWVzKCk7Ci0gICAgICAgIGlmIChmQ2xlYW51cCkgewotICAgICAgICAgICAgZlRpbWVMb2dnZXJEZWxldGUubG9nVGltZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXJIaWVyYWNoeShTdHJpbmcgcGFyZW50SWQsIGludCBsZXZlbCwgaW50IGxldmVscywgaW50IGNoaWxkcmVuUGVyTGV2ZWwpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gbnVsbDsKLQotICAgICAgICBpZiAobGV2ZWwgPj0gbGV2ZWxzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMT0cuZGVidWcoIiBjcmVhdGUgZm9sZGVyIGZvciBwYXJlbnQgaWQ6ICIgKyBwYXJlbnRJZCArICIsIGluIGxldmVsICIgKyBsZXZlbCArICIsIG1heCBsZXZlbHMgIiArIGxldmVscyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblBlckxldmVsOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVGb2xkZXJQcm9wZXJ0aWVzKGksIGxldmVsKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZlRpbWVMb2dnZXJDcmVhdGVGb2xkZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBpZCA9IGZPYmpTdmMuY3JlYXRlRm9sZGVyKGZSZXBvc2l0b3J5SWQsIHByb3BzLCBwYXJlbnRJZCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZlRvcExldmVsRm9sZGVyc0NyZWF0ZWQuYWRkKGlkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGZUaW1lTG9nZ2VyQ3JlYXRlRm9sZGVyLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICArK2ZGb2xkZXJzSW5Ub3RhbENvdW50OwotICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlckhpZXJhY2h5KGlkLCBsZXZlbCArIDEsIGxldmVscywgY2hpbGRyZW5QZXJMZXZlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmTm9Eb2N1bWVudHNUb0NyZWF0ZTsgaisrKSB7Ci0gICAgICAgICAgICBpZCA9IGNyZWF0ZURvY3VtZW50KHBhcmVudElkLCBqLCBsZXZlbCk7Ci0gICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkgewotICAgICAgICAgICAgICAgIGZUb3BMZXZlbERvY3NDcmVhdGVkLmFkZChpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVGb2xkZXIoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBjcmVhdGVGb2xkZXJQcm9wZXJ0aWVzKDAsIDApOwotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlRpbWVMb2dnZXJDcmVhdGVGb2xkZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIGlkID0gZk9ialN2Yy5jcmVhdGVGb2xkZXIoZlJlcG9zaXRvcnlJZCwgcHJvcHMsIHBhcmVudElkLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGZUb3BMZXZlbEZvbGRlcnNDcmVhdGVkLmFkZChpZCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmVGltZUxvZ2dlckNyZWF0ZUZvbGRlci5zdG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURvY3VtZW50KFN0cmluZyBmb2xkZXJJZCwgaW50IG5vLCBpbnQgbGV2ZWwpIHsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50U3RyZWFtID0gbnVsbDsKLSAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSA9IFZlcnNpb25pbmdTdGF0ZS5OT05FOwotICAgICAgICBMaXN0PFN0cmluZz4gcG9saWNpZXMgPSBudWxsOwotICAgICAgICBBY2wgYWRkQUNFcyA9IG51bGw7Ci0gICAgICAgIEFjbCByZW1vdmVBQ0VzID0gbnVsbDsKLSAgICAgICAgRXh0ZW5zaW9uc0RhdGEgZXh0ZW5zaW9uID0gbnVsbDsKLQotICAgICAgICBMT0cuZGVidWcoImNyZWF0ZSBkb2N1bWVudCBpbiBmb2xkZXIgIiArIGZvbGRlcklkKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGNyZWF0ZURvY3VtZW50UHJvcGVydGllcyhubywgbGV2ZWwpOwotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOwotCi0gICAgICAgIGlmIChmQ29udGVudFNpemVJbksgPiAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZDb250ZW50S2luZCkgewotICAgICAgICAgICAgY2FzZSBTVEFUSUNfVEVYVDoKLSAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtID0gY3JlYXRlQ29udGVudFN0YXRpY1RleHQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTE9SRU1fSVBTVU1fVEVYVDoKLSAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtID0gY3JlYXRlQ29udGVudExvcmVtSXBzdW1UZXh0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIExPUkVNX0lQU1VNX0hUTUw6Ci0gICAgICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IGNyZWF0ZUNvbnRlbnRMb3JlbUlwc3VtSHRtbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTUFHRV9GUkFDVEFMX0pQRUc6Ci0gICAgICAgICAgICAgICAgY29udGVudFN0cmVhbSA9IGNyZWF0ZUNvbnRlbnRGcmFjdGFsaW1hZ2VKcGVnKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZlRpbWVMb2dnZXJDcmVhdGVEb2Muc3RhcnQoKTsKLSAgICAgICAgICAgIGlkID0gZk9ialN2Yy5jcmVhdGVEb2N1bWVudChmUmVwb3NpdG9yeUlkLCBwcm9wcywgZm9sZGVySWQsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSwgcG9saWNpZXMsCi0gICAgICAgICAgICAgICAgICAgIGFkZEFDRXMsIHJlbW92ZUFDRXMsIGV4dGVuc2lvbik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmVGltZUxvZ2dlckNyZWF0ZURvYy5zdG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCA9PSBpZCkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJjcmVhdGVEb2N1bWVudCBmYWlsZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgKytmRG9jdW1lbnRzSW5Ub3RhbENvdW50OwotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVRyZWUoKSB7Ci0KLSAgICAgICAgLy8gZGVsZXRlIGFsbCBkb2N1bWVudHMgZnJvbSBmaXJzdCBsZXZlbAotICAgICAgICBmb3IgKFN0cmluZyBpZCA6IGZUb3BMZXZlbERvY3NDcmVhdGVkKSB7Ci0gICAgICAgICAgICBkZWxldGVPYmplY3QoaWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVsZXRlIHJlY3Vyc2l2ZWx5IGFsbCBmb2xkZXJzIGZyb20gZmlyc3QgbGV2ZWwKLSAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBmVG9wTGV2ZWxGb2xkZXJzQ3JlYXRlZCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmVGltZUxvZ2dlckRlbGV0ZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIGZPYmpTdmMuZGVsZXRlVHJlZShmUmVwb3NpdG9yeUlkLCBpZCwgdHJ1ZSwgVW5maWxlT2JqZWN0LkRFTEVURSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGZUaW1lTG9nZ2VyRGVsZXRlLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVPYmplY3QoU3RyaW5nIG9iamVjdElkKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmVGltZUxvZ2dlckRlbGV0ZS5zdGFydCgpOwotICAgICAgICAgICAgZk9ialN2Yy5kZWxldGVPYmplY3QoZlJlcG9zaXRvcnlJZCwgb2JqZWN0SWQsIHRydWUsIG51bGwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZlRpbWVMb2dnZXJEZWxldGUuc3RvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudExvcmVtSXBzdW1IdG1sKCkgewotICAgICAgICBDb250ZW50U3RyZWFtSW1wbCBjb250ZW50ID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0gICAgICAgIGNvbnRlbnQuc2V0RmlsZU5hbWUoImRhdGEuaHRtbCIpOwotICAgICAgICBjb250ZW50LnNldE1pbWVUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgaW50IGxlbiA9IGZDb250ZW50U2l6ZUluSyAqIEtJTE87IC8vIHNpemUgb2YgZG9jdW1lbnQgaW4gSwotCi0gICAgICAgIExvcmVtSXBzdW0gaXBzdW0gPSBuZXcgTG9yZW1JcHN1bSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IGlwc3VtLmdlbmVyYXRlUGFyYWdyYXBoc0Z1bGxIdG1sKGxlbiwgdHJ1ZSk7Ci0KLSAgICAgICAgY29udGVudC5zZXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKElPVXRpbHMudG9VVEY4Qnl0ZXModGV4dCkpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudExvcmVtSXBzdW1UZXh0KCkgewotICAgICAgICBDb250ZW50U3RyZWFtSW1wbCBjb250ZW50ID0gbmV3IENvbnRlbnRTdHJlYW1JbXBsKCk7Ci0gICAgICAgIGNvbnRlbnQuc2V0RmlsZU5hbWUoImRhdGEudHh0Iik7Ci0gICAgICAgIGNvbnRlbnQuc2V0TWltZVR5cGUoInRleHQvcGxhaW4iKTsKLSAgICAgICAgaW50IGxlbiA9IGZDb250ZW50U2l6ZUluSyAqIDEwMjQ7IC8vIHNpemUgb2YgZG9jdW1lbnQgaW4gSwotCi0gICAgICAgIExvcmVtSXBzdW0gaXBzdW0gPSBuZXcgTG9yZW1JcHN1bSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IGlwc3VtLmdlbmVyYXRlUGFyYWdyYXBoc1BsYWluVGV4dChsZW4sIDgwLCB0cnVlKTsKLSAgICAgICAgY29udGVudC5zZXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKElPVXRpbHMudG9VVEY4Qnl0ZXModGV4dCkpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudFN0YXRpY1RleHQoKSB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW1JbXBsIGNvbnRlbnQgPSBuZXcgQ29udGVudFN0cmVhbUltcGwoKTsKLSAgICAgICAgY29udGVudC5zZXRGaWxlTmFtZSgiZGF0YS50eHQiKTsKLSAgICAgICAgY29udGVudC5zZXRNaW1lVHlwZSgidGV4dC9wbGFpbiIpOwotICAgICAgICBpbnQgbGVuID0gZkNvbnRlbnRTaXplSW5LICogMTAyNDsgLy8gc2l6ZSBvZiBkb2N1bWVudCBpbiBLCi0gICAgICAgIGJ5dGVbXSBiID0geyAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDBjLCAweDBhLAotICAgICAgICAgICAgICAgIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4MGMsIDB4MGEgfTsgLy8gMzIKLSAgICAgICAgLy8gQnl0ZXMKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShsZW4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmQ29udGVudFNpemVJbks7IGorKykgewotICAgICAgICAgICAgICAgIC8vIHdyaXRlIDFLIG9mIGRhdGEKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmEud3JpdGUoYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGZpbGwgY29udGVudCBzdHJlYW0gd2l0aCBkYXRhIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGVudC5zZXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRTdHJlYW0gY3JlYXRlQ29udGVudEZyYWN0YWxpbWFnZUpwZWcoKSB7Ci0gICAgICAgIGlmIChudWxsID09IGZyYWN0YWxHZW5lcmF0b3IpIHsKLSAgICAgICAgICAgIGZyYWN0YWxHZW5lcmF0b3IgPSBuZXcgRnJhY3RhbEdlbmVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGVudFN0cmVhbUltcGwgY29udGVudCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBmcmFjdGFsR2VuZXJhdG9yLmdlbmVyYXRlRnJhY3RhbCgpOwotICAgICAgICAgICAgY29udGVudCA9IG5ldyBDb250ZW50U3RyZWFtSW1wbCgpOwotICAgICAgICAgICAgY29udGVudC5zZXRGaWxlTmFtZSgiaW1hZ2UuanBnIik7Ci0gICAgICAgICAgICBjb250ZW50LnNldE1pbWVUeXBlKCJpbWFnZS9qcGVnIik7Ci0gICAgICAgICAgICBjb250ZW50LnNldFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgICAgIGJvcy5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIHdoZW4gZ2VuZXJhdGluZyBmcmFjdGFsIGltYWdlOiAiICsgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGNyZWF0ZUZvbGRlclByb3BlcnRpZXMoaW50IG5vLCBpbnQgbGV2ZWwpIHsKLSAgICAgICAgTGlzdDxQcm9wZXJ0eURhdGE8Pz4+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGF0YTw/Pj4oKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKFByb3BlcnR5SWRzLk5BTUUsIGdlbmVyYXRlRm9sZGVyTmFtZVZhbHVlKG5vLCBsZXZlbCkpKTsKLSAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlJZERhdGEoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIGZGb2xkZXJUeXBlSWQpKTsKLSAgICAgICAgLy8gR2VuZXJhdGUgc29tZSBwcm9wZXJ0eSB2YWx1ZXMgZm9yIGN1c3RvbSBhdHRyaWJ1dGVzCi0gICAgICAgIGZvciAoU3RyaW5nIHN0cmluZ1Byb3BJZCA6IGZTdHJpbmdQcm9wZXJ0eUlkc1RvU2V0Rm9yRm9sZGVyKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoc3RyaW5nUHJvcElkLCBnZW5lcmF0ZVN0cmluZ1Byb3BWYWx1ZUZvbGRlcigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGZGYWN0b3J5LmNyZWF0ZVByb3BlcnRpZXNEYXRhKHByb3BlcnRpZXMpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGNyZWF0ZURvY3VtZW50UHJvcGVydGllcyhpbnQgbm8sIGludCBsZXZlbCkgewotICAgICAgICBMaXN0PFByb3BlcnR5RGF0YTw/Pj4gcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEYXRhPD8+PigpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eVN0cmluZ0RhdGEoUHJvcGVydHlJZHMuTkFNRSwgZ2VuZXJhdGVEb2NOYW1lVmFsdWUobm8sIGxldmVsKSkpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZChmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0eUlkRGF0YShQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgZkRvY1R5cGVJZCkpOwotICAgICAgICAvLyBHZW5lcmF0ZSBzb21lIHByb3BlcnR5IHZhbHVlcyBmb3IgY3VzdG9tIGF0dHJpYnV0ZXMKLSAgICAgICAgZm9yIChTdHJpbmcgc3RyaW5nUHJvcElkIDogZlN0cmluZ1Byb3BlcnR5SWRzVG9TZXRGb3JEb2N1bWVudCkgewotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQoZkZhY3RvcnkuY3JlYXRlUHJvcGVydHlTdHJpbmdEYXRhKHN0cmluZ1Byb3BJZCwgZ2VuZXJhdGVTdHJpbmdQcm9wVmFsdWVEb2MoKSkpOwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBmRmFjdG9yeS5jcmVhdGVQcm9wZXJ0aWVzRGF0YShwcm9wZXJ0aWVzKTsKLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBpbmNyZW1lbnRQcm9wQ291bnRlckRvY1N0cmluZ1Byb3AoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wVmFsQ291bnRlckRvY1N0cmluZysrOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIGludCBpbmNyZW1lbnRQcm9wQ291bnRlckZvbGRlclN0cmluZ1Byb3AoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wVmFsQ291bnRlckZvbGRlclN0cmluZysrOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlRG9jTmFtZVZhbHVlKGludCBubywgaW50IGxldmVsKSB7Ci0gICAgICAgIGlmIChmVXNlVXVpZHMpIHsKLSAgICAgICAgICAgIHJldHVybiBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIE5BTUVQUk9QVkFMUFJFRklYRE9DICsgbGV2ZWwgKyAiLSIgKyBubzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlRm9sZGVyTmFtZVZhbHVlKGludCBubywgaW50IGxldmVsKSB7Ci0gICAgICAgIGlmIChmVXNlVXVpZHMpIHsKLSAgICAgICAgICAgIHJldHVybiBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIE5BTUVQUk9QVkFMUFJFRklYRk9MREVSICsgbGV2ZWwgKyAiLSIgKyBubzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlU3RyaW5nUHJvcFZhbHVlRG9jKCkgewotICAgICAgICByZXR1cm4gU1RSSU5HUFJPUFZBTFBSRUZJWERPQyArIGluY3JlbWVudFByb3BDb3VudGVyRG9jU3RyaW5nUHJvcCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlU3RyaW5nUHJvcFZhbHVlRm9sZGVyKCkgewotICAgICAgICByZXR1cm4gU1RSSU5HUFJPUFZBTFBSRUZJWEZPTERFUiArIGluY3JlbWVudFByb3BDb3VudGVyRm9sZGVyU3RyaW5nUHJvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGR1bXBGb2xkZXIoU3RyaW5nIGZvbGRlcklkLCBTdHJpbmcgcHJvcGVydHlGaWx0ZXIpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJzdGFydGluZyBkdW1wRm9sZGVyKCkgaWQgIiArIGZvbGRlcklkICsgIiAuLi4iKTsKLSAgICAgICAgYm9vbGVhbiBhbGxSZXF1aXJlZFByb3BlcnRpZXNBcmVQcmVzZW50ID0gcHJvcGVydHlGaWx0ZXIgIT0gbnVsbCAmJiBwcm9wZXJ0eUZpbHRlci5lcXVhbHMoIioiKTsgLy8gY2FuCi0gICAgICAgIC8vIGJlCi0gICAgICAgIC8vIG9wdGltaXplZAotICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWlyZWRQcm9wZXJ0aWVzID0gYWxsUmVxdWlyZWRQcm9wZXJ0aWVzQXJlUHJlc2VudCA/IHByb3BlcnR5RmlsdGVyIDogUHJvcGVydHlJZHMuT0JKRUNUX0lECi0gICAgICAgICAgICAgICAgKyAiLCIgKyBQcm9wZXJ0eUlkcy5OQU1FICsgIiwiICsgUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQgKyAiLCIgKyBQcm9wZXJ0eUlkcy5CQVNFX1RZUEVfSUQ7Ci0gICAgICAgIC8vIGlmIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGFyZSBjb250YWluZWQgaW4gdGhlIGZpbHRlciB1c2Ugd2UgdXNlIHRoZQotICAgICAgICAvLyBmaWx0ZXIgb3RoZXJ3aXNlCi0gICAgICAgIC8vIHdlIHVzZSBvdXIgb3duIHNldCBhbmQgZ2V0IHRob3NlIGZyb20gdGhlIGZpbHRlciBsYXRlciBpbiBhbiBleHRyYQotICAgICAgICAvLyBjYWxsCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUZpbHRlckludGVybiA9IGFsbFJlcXVpcmVkUHJvcGVydGllc0FyZVByZXNlbnQgPyBwcm9wZXJ0eUZpbHRlciA6IHJlcXVpcmVkUHJvcGVydGllczsKLSAgICAgICAgZHVtcEZvbGRlcihmb2xkZXJJZCwgcHJvcGVydHlGaWx0ZXJJbnRlcm4sIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkdW1wRm9sZGVyKFN0cmluZyBmb2xkZXJJZCwgU3RyaW5nIHByb3BlcnR5RmlsdGVyLCBpbnQgZGVwdGgpIHsKLSAgICAgICAgYm9vbGVhbiBhbGxSZXF1aXJlZFByb3BlcnRpZXNBcmVQcmVzZW50ID0gcHJvcGVydHlGaWx0ZXIuZXF1YWxzKCIqIik7IC8vIGNhbgotICAgICAgICAvLyBiZQotICAgICAgICAvLyBvcHRpbWl6ZWQKLSAgICAgICAgU3RyaW5nQnVpbGRlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKLSAgICAgICAgICAgIHByZWZpeC5hcHBlbmQoIiAgICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0SW5Gb2xkZXJMaXN0IHJlc3VsdCA9IGZOYXZTdmMuZ2V0Q2hpbGRyZW4oZlJlcG9zaXRvcnlJZCwgZm9sZGVySWQsIHByb3BlcnR5RmlsdGVyLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLCBudWxsLCB0cnVlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpLCBudWxsKTsKLSAgICAgICAgTGlzdDxPYmplY3RJbkZvbGRlckRhdGE+IGZvbGRlcnMgPSByZXN1bHQuZ2V0T2JqZWN0cygpOwotICAgICAgICBpZiAobnVsbCAhPSBmb2xkZXJzKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcocHJlZml4ICsgImZvdW5kICIgKyBmb2xkZXJzLnNpemUoKSArICIgY2hpbGRyZW4gaW4gZm9sZGVyICIgKyBmb2xkZXJJZCk7Ci0gICAgICAgICAgICBpbnQgbm8gPSAwOwotICAgICAgICAgICAgZm9yIChPYmplY3RJbkZvbGRlckRhdGEgZm9sZGVyIDogZm9sZGVycykgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZyhwcmVmaXgudG9TdHJpbmcoKSArICsrbm8gKyAiOiBmb3VuZCBvYmplY3Qgd2l0aCBpZDogIiArIGZvbGRlci5nZXRPYmplY3QoKS5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIHBhdGggc2VnbWVudDogIiArIGZvbGRlci5nZXRQYXRoU2VnbWVudCgpKTsKLSAgICAgICAgICAgICAgICBkdW1wT2JqZWN0UHJvcGVydGllcyhmb2xkZXIuZ2V0T2JqZWN0KCksIGRlcHRoLCBwcm9wZXJ0eUZpbHRlciwgIWFsbFJlcXVpcmVkUHJvcGVydGllc0FyZVByZXNlbnQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3RUeXBlQmFzZUlkID0gZm9sZGVyLmdldE9iamVjdCgpLmdldEJhc2VUeXBlSWQoKS52YWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlQmFzZUlkLmVxdWFscyhCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBGb2xkZXIoZm9sZGVyLmdldE9iamVjdCgpLmdldElkKCksIHByb3BlcnR5RmlsdGVyLCBkZXB0aCArIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0VHlwZUJhc2VJZC5lcXVhbHMoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBPYmplY3RQcm9wZXJ0aWVzKGZvbGRlci5nZXRPYmplY3QoKSwgZGVwdGggKyAxLCBwcm9wZXJ0eUZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYWxsUmVxdWlyZWRQcm9wZXJ0aWVzQXJlUHJlc2VudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExPRy5kZWJ1ZygiIik7IC8vIGFkZCBlbXB0eSBsaW5lCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGR1bXBPYmplY3RQcm9wZXJ0aWVzKE9iamVjdERhdGEgb2JqZWN0LCBpbnQgZGVwdGgsIFN0cmluZyBwcm9wZXJ0eUZpbHRlciwgYm9vbGVhbiBtdXN0RmV0Y2hQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWiIpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHByZWZpeCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotICAgICAgICAgICAgcHJlZml4LmFwcGVuZCgiICAgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0cuZGVidWcocHJlZml4ICsgImZvdW5kIG9iamVjdCBpZCAiICsgb2JqZWN0LmdldElkKCkpOwotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURhdGE8Pz4+IHByb3BNYXA7Ci0gICAgICAgIGlmIChtdXN0RmV0Y2hQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb2JqSWQgPSAoU3RyaW5nKSBvYmplY3QuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKS5nZXRGaXJzdFZhbHVlKCk7Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZk9ialN2Yy5nZXRQcm9wZXJ0aWVzKGZSZXBvc2l0b3J5SWQsIG9iaklkLCBwcm9wZXJ0eUZpbHRlciwgbnVsbCk7Ci0gICAgICAgICAgICBwcm9wTWFwID0gcHJvcHMuZ2V0UHJvcGVydGllcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvcE1hcCA9IG9iamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWVTdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigiWyIpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFByb3BlcnR5RGF0YTw/Pj4gZW50cnkgOiBwcm9wTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldFZhbHVlcygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKS5nZXRGaXJzdFZhbHVlKCkgaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBlbnRyeS5nZXRWYWx1ZSgpLmdldFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSAoR3JlZ29yaWFuQ2FsZW5kYXIpIG9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyLmFwcGVuZChkZi5mb3JtYXQoY2FsLmdldFRpbWUoKSkpLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ci5hcHBlbmQoIl0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKGVudHJ5LmdldFZhbHVlKCkuZ2V0VmFsdWVzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldEZpcnN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ciA9IG5ldyBTdHJpbmdCdWlsZGVyKHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHIgPSBuZXcgU3RyaW5nQnVpbGRlcihkZi5mb3JtYXQoKChHcmVnb3JpYW5DYWxlbmRhcikgZW50cnkuZ2V0VmFsdWUoKS5nZXRGaXJzdFZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUaW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExPRy5kZWJ1ZyhwcmVmaXggKyBlbnRyeS5nZXRLZXkoKSArICI6ICIgKyB2YWx1ZVN0cik7Ci0gICAgICAgIH0KLSAgICAgICAgTE9HLmRlYnVnKCIiKTsgLy8gYWRkIGVtcHR5IGxpbmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVUeXBlcyhUeXBlRGVmaW5pdGlvbkxpc3QgdHlwZURlZkxpc3QpIHsKLQotICAgICAgICBmVGltZUxvZ2dlckNyZWF0ZVR5cGUucmVzZXQoKTsKLSAgICAgICAgZm9yIChUeXBlRGVmaW5pdGlvbiB0ZCA6IHR5cGVEZWZMaXN0LmdldExpc3QoKSkgewotICAgICAgICAgICAgLy8gVE9ETzogZW5hYmxlIHRoaXMgaWYgYXZhaWxhYmxlIQotICAgICAgICAgICAgLy8gZlJlcFN2Yy5jcmVhdGVUeXBlRGVmaW5pdGlvbihmUmVwb3NpdG9yeUlkLCB0ZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9yZXBvc2l0b3J5L1RpbWVMb2dnZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL3JlcG9zaXRvcnkvVGltZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MzZjAzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy91dGlsL3JlcG9zaXRvcnkvVGltZUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51dGlsLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLS8qKgotICogU2ltcGxlIHV0aWxpdHkgY2xhc3MgZm9yIHRpbWUgbG9nZ2luZy4gTm90ZTogTk9UIHRocmVhZCBzYWZlIQotICovCi1wdWJsaWMgY2xhc3MgVGltZUxvZ2dlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRpbWVMb2dnZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGltZVJlY29yZCB7Ci0gICAgICAgIHB1YmxpYyBsb25nIGZTdGFydDsKLSAgICAgICAgcHVibGljIGxvbmcgZlN0b3A7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZkFjdGlvbjsKLSAgICBwcml2YXRlIEFycmF5RGVxdWU8VGltZVJlY29yZD4gZlRpbWVSZWNzID0gbmV3IEFycmF5RGVxdWU8VGltZVJlY29yZD4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJWkUgPSAyNTAwOwotICAgIFRpbWVSZWNvcmQgZkN1cnJlbnRSZWM7Ci0KLSAgICBwdWJsaWMgVGltZUxvZ2dlcigpIHsKLSAgICAgICAgZkFjdGlvbiA9ICIiOwotICAgICAgICBmVGltZVJlY3MgPSBuZXcgQXJyYXlEZXF1ZTxUaW1lUmVjb3JkPigpOwotICAgIH0KLQotICAgIHB1YmxpYyBUaW1lTG9nZ2VyKFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgZkFjdGlvbiA9IGFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgY3JlYXRlQW5kQWRkTmV3UmVjb3JkKCk7Ci0gICAgICAgIGZDdXJyZW50UmVjLmZTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGZDdXJyZW50UmVjLmZTdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIGZUaW1lUmVjcy5jbGVhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvZ1RpbWVzKCkgewotICAgICAgICBsb25nIHNpemUgPSBmVGltZVJlY3Muc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0cuaW5mbygiTm8gc2FtcGxlcyBmb3IgIiArIGZBY3Rpb24gKyAiIGF2YWlsYWJsZS4gIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICBMT0cuaW5mbygiVGltZSBlbGFwc2VkIGZvciAiICsgZkFjdGlvbiArICI6ICIgKyBnZXRMYXN0VGltZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRy5pbmZvKCJUaW1pbmdzIGZvciAiICsgc2l6ZSArICIgc2FtcGxlcyBmb3IgYWN0aW9uICIgKyBmQWN0aW9uICsgIjogIik7Ci0gICAgICAgICAgICBMT0cuaW5mbygiICBBdmVyYWdlOiAiICsgZ2V0QXZlcmFnZVRpbWUoKSArICJtcyIpOwotICAgICAgICAgICAgTE9HLmluZm8oIiAgTWluICAgIDogIiArIGdldE1pblRpbWUoKSArICJtcyIpOwotICAgICAgICAgICAgTE9HLmluZm8oIiAgTWF4ICAgIDogIiArIGdldE1heFRpbWUoKSArICJtcyIpOwotICAgICAgICAgICAgTE9HLmluZm8oIiAgVG90YWwgIDogIiArIGdldFRvdGFsVGltZSgpICsgIm1zIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludFRpbWVzKCkgewotICAgICAgICBsb25nIHNpemUgPSBmVGltZVJlY3Muc2l6ZSgpOwotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHNhbXBsZXMgZm9yICIgKyBmQWN0aW9uICsgIiBhdmFpbGFibGUuICIpOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIGVsYXBzZWQgZm9yICIgKyBmQWN0aW9uICsgIjogIiArIGdldExhc3RUaW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1pbmdzIGZvciAiICsgc2l6ZSArICIgc2FtcGxlcyBmb3IgYWN0aW9uICIgKyBmQWN0aW9uICsgIjogIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgQXZlcmFnZTogIiArIGdldEF2ZXJhZ2VUaW1lKCkgKyAibXMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBNaW4gICAgOiAiICsgZ2V0TWluVGltZSgpICsgIm1zIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgTWF4ICAgIDogIiArIGdldE1heFRpbWUoKSArICJtcyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFRvdGFsICA6ICIgKyBnZXRUb3RhbFRpbWUoKSArICJtcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdFRpbWUoKSB7Ci0gICAgICAgIFRpbWVSZWNvcmQgbGFzdFJlYyA9IGZUaW1lUmVjcy5nZXRMYXN0KCk7Ci0gICAgICAgIGlmIChudWxsICE9IGxhc3RSZWMpIHsKLSAgICAgICAgICAgIHJldHVybiBsYXN0UmVjLmZTdG9wIC0gbGFzdFJlYy5mU3RhcnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmRBZGROZXdSZWNvcmQoKSB7Ci0gICAgICAgIGlmIChmVGltZVJlY3Muc2l6ZSgpIDwgTUFYX1NJWkUpIHsKLSAgICAgICAgICAgIGZDdXJyZW50UmVjID0gbmV3IFRpbWVSZWNvcmQoKTsKLSAgICAgICAgICAgIGZUaW1lUmVjcy5hZGQoZkN1cnJlbnRSZWMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIGdldEF2ZXJhZ2VUaW1lKCkgewotICAgICAgICBsb25nIHN1bSA9IDA7Ci0gICAgICAgIGxvbmcgc2l6ZSA9IGZUaW1lUmVjcy5zaXplKCk7Ci0KLSAgICAgICAgaWYgKDAgPT0gZlRpbWVSZWNzLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFRpbWVSZWNvcmQgdG0gOiBmVGltZVJlY3MpIHsKLSAgICAgICAgICAgIHN1bSArPSB0bS5mU3RvcCAtIHRtLmZTdGFydDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHN1bSArIHNpemUgLyAyKSAvIHNpemU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIGdldE1pblRpbWUoKSB7Ci0gICAgICAgIGxvbmcgbWluID0gTG9uZy5NQVhfVkFMVUU7Ci0KLSAgICAgICAgaWYgKDAgPT0gZlRpbWVSZWNzLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFRpbWVSZWNvcmQgdG0gOiBmVGltZVJlY3MpIHsKLSAgICAgICAgICAgIGxvbmcgdmFsID0gdG0uZlN0b3AgLSB0bS5mU3RhcnQ7Ci0gICAgICAgICAgICBpZiAodmFsIDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgbWluID0gdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtaW47Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgZ2V0TWF4VGltZSgpIHsKLSAgICAgICAgbG9uZyBtYXggPSBMb25nLk1JTl9WQUxVRTsKLQotICAgICAgICBpZiAoMCA9PSBmVGltZVJlY3Muc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoVGltZVJlY29yZCB0bSA6IGZUaW1lUmVjcykgewotICAgICAgICAgICAgbG9uZyB2YWwgPSB0bS5mU3RvcCAtIHRtLmZTdGFydDsKLSAgICAgICAgICAgIGlmICh2YWwgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtYXggPSB2YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1heDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgZ2V0VG90YWxUaW1lKCkgewotICAgICAgICBsb25nIHN1bSA9IDA7Ci0KLSAgICAgICAgZm9yIChUaW1lUmVjb3JkIHRtIDogZlRpbWVSZWNzKSB7Ci0gICAgICAgICAgICBzdW0gKz0gdG0uZlN0b3AgLSB0bS5mU3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1bTsKLSAgICB9Ci0KLSAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIC8vLy8vLy8vCi0gICAgLy8KLSAgICAvLyBTYW1lIG1ldGhvZHMgdXNlZCBmb3IgbXVsdGl0aHJlYWRlZCBsb2dnaW5nCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nVGltZXMoVGltZUxvZ2dlcltdIGxvZ2dlcnMpIHsKLSAgICAgICAgbG9uZyBzaXplID0gMDsKLSAgICAgICAgaWYgKG51bGwgPT0gbG9nZ2VycykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2dnZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzaXplICs9IGxvZ2dlcnNbaV0uZlRpbWVSZWNzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIExPRy5pbmZvKCJUaW1pbmdzIGZvciAiICsgc2l6ZSArICIgc2FtcGxlcyBmb3IgYWN0aW9uICIgKyBsb2dnZXJzWzBdLmZBY3Rpb24gKyAiOiAiKTsKLSAgICAgICAgTE9HLmluZm8oIiAgQXZlcmFnZTogIiArIGdldEF2ZXJhZ2VUaW1lKGxvZ2dlcnMpICsgIm1zIik7Ci0gICAgICAgIExPRy5pbmZvKCIgIE1pbiAgICA6ICIgKyBnZXRNaW5UaW1lKGxvZ2dlcnMpICsgIm1zIik7Ci0gICAgICAgIExPRy5pbmZvKCIgIE1heCAgICA6ICIgKyBnZXRNYXhUaW1lKGxvZ2dlcnMpICsgIm1zIik7Ci0gICAgICAgIExPRy5pbmZvKCIgIFRvdGFsICA6ICIgKyBnZXRUb3RhbFRpbWUobG9nZ2VycykgKyAibXMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRUaW1lcyhUaW1lTG9nZ2VyW10gbG9nZ2VycykgewotICAgICAgICBsb25nIHNpemUgPSAwOwotICAgICAgICBpZiAobnVsbCA9PSBsb2dnZXJzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvZ2dlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNpemUgKz0gbG9nZ2Vyc1tpXS5mVGltZVJlY3Muc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1pbmdzIGZvciAiICsgc2l6ZSArICIgc2FtcGxlcyBmb3IgYWN0aW9uICIgKyBsb2dnZXJzWzBdLmZBY3Rpb24gKyAiOiAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIEF2ZXJhZ2U6ICIgKyBnZXRBdmVyYWdlVGltZShsb2dnZXJzKSArICJtcyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgTWluICAgIDogIiArIGdldE1pblRpbWUobG9nZ2VycykgKyAibXMiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIE1heCAgICA6ICIgKyBnZXRNYXhUaW1lKGxvZ2dlcnMpICsgIm1zIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBUb3RhbCAgOiAiICsgZ2V0VG90YWxUaW1lKGxvZ2dlcnMpICsgIm1zIik7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEF2ZXJhZ2VUaW1lKFRpbWVMb2dnZXJbXSBsb2dnZXJzKSB7Ci0gICAgICAgIGxvbmcgc3VtID0gMDsKLSAgICAgICAgbG9uZyBzaXplID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvZ2dlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNpemUgKz0gbG9nZ2Vyc1tpXS5mVGltZVJlY3Muc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvZ2dlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgwID09IGxvZ2dlcnNbaV0uZlRpbWVSZWNzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKFRpbWVSZWNvcmQgdG0gOiBsb2dnZXJzW2ldLmZUaW1lUmVjcykgewotICAgICAgICAgICAgICAgIHN1bSArPSB0bS5mU3RvcCAtIHRtLmZTdGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoc3VtICsgc2l6ZSAvIDIpIC8gc2l6ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldE1heFRpbWUoVGltZUxvZ2dlcltdIGxvZ2dlcnMpIHsKLSAgICAgICAgbG9uZyBtYXggPSBMb25nLk1JTl9WQUxVRTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvZ2dlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGxvbmcgdmFsID0gbG9nZ2Vyc1tpXS5nZXRNYXhUaW1lKCk7Ci0gICAgICAgICAgICBpZiAodmFsID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgbWF4ID0gdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1heDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldE1pblRpbWUoVGltZUxvZ2dlcltdIGxvZ2dlcnMpIHsKLSAgICAgICAgbG9uZyBtaW4gPSBMb25nLk1BWF9WQUxVRTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvZ2dlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGxvbmcgdmFsID0gbG9nZ2Vyc1tpXS5nZXRNaW5UaW1lKCk7Ci0gICAgICAgICAgICBpZiAodmFsIDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgbWluID0gdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1pbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFRvdGFsVGltZShUaW1lTG9nZ2VyW10gbG9nZ2VycykgewotICAgICAgICBsb25nIHRvdGFsVGltZSA9IExvbmcuTUlOX1ZBTFVFOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9nZ2Vycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbG9uZyB2YWwgPSBsb2dnZXJzW2ldLmdldFRvdGFsVGltZSgpOwotICAgICAgICAgICAgaWYgKHZhbCA+IHRvdGFsVGltZSkgewotICAgICAgICAgICAgICAgIHRvdGFsVGltZSA9IHZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0b3RhbFRpbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVlOTRkOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUNCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aA0KLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjANCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoDQotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMgDQotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMgDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi0jIHNhbXBsZSBsb2c0ai5wcm9wZXJ0aWVzDQotDQotbG9nNGoucm9vdENhdGVnb3J5PVdBUk4sIFIsIE8NCi0jbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBSLCBPDQotDQotIyBTdGRvdXQNCi1sb2c0ai5hcHBlbmRlci5PPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotDQotIyBGaWxlDQotbG9nNGouYXBwZW5kZXIuUj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5SLkZpbGU9bG9nNGoubG9nDQotDQotIyBDb250cm9sIHRoZSBtYXhpbXVtIGxvZyBmaWxlIHNpemUNCi1sb2c0ai5hcHBlbmRlci5SLk1heEZpbGVTaXplPTEwMEtCDQotDQotIyBBcmNoaXZlIGxvZyBmaWxlcyAob25lIGJhY2t1cCBmaWxlIGhlcmUpDQotbG9nNGouYXBwZW5kZXIuUi5NYXhCYWNrdXBJbmRleD0xDQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuDQotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWR7SVNPODYwMX0gJS01cCBbJXRdICVjOiAlbSVuDQotDQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvY29udGVudC9sb3JlbWlwc3VtL0xvcmVtSXBzdW1UZXN0LmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9jb250ZW50L2xvcmVtaXBzdW0vTG9yZW1JcHN1bVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0NGEzNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdXRpbC9jb250ZW50L2xvcmVtaXBzdW0vTG9yZW1JcHN1bVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXRpbC5jb250ZW50LmxvcmVtaXBzdW07Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTG9yZW1JcHN1bVRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExvcmVtSXBzdW1UZXN0LmNsYXNzKTsKLQotICAgIFN0cmluZyBzYW1wbGUgPSAiT25lIHR3byB0aHJlZSBmb3VyIGZpdmUgc2l4LiBTZXZlbiBlaWdodCBuaW5lIHRlbiBlbGV2ZW4gdHdlbHZlLiAiICsgIlxuXG4iCi0gICAgICAgICAgICArICJUaGlydGVlbiBmb3VydGVlbiBmaWZ0ZWVuIHNpeHRlZW4uIFNldmVudGVlbiBlaWdodGVlbiBuaW5ldGVlbiB0d2VudHkuIjsKLQotICAgIFN0cmluZyBkaWN0aW9uYXJ5ID0gImEgYmIgY2NjIGRkZGQgZWVlZWUgZmZmZmZmIGdnZ2dnZ2cgaGhoaGhoaGggaWlpaWlpaWlpIGpqampqampqamoga2tra2tra2tra2sgbGxsbGxsbGxsbGxsIjsKLSAgICBMb3JlbUlwc3VtIGdlbmVyYXRvciA9IG5ldyBMb3JlbUlwc3VtKHNhbXBsZSwgZGljdGlvbmFyeSk7Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZGljdGlvbmFyeS5zcGxpdCgiICIpOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X21lYW4oKSB7Ci0gICAgICAgIGludFtdIGlhMSA9IHsgMSwgMiwgMywgNCB9OwotICAgICAgICBhc3NlcnRFcXVhbHMoMi41ZCwgTG9yZW1JcHN1bS5tZWFuKGlhMSksIDAuMDFkKTsKLSAgICAgICAgaW50W10gaWEyID0geyA2LCA2LCA0LCA0IH07Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LjBkLCBMb3JlbUlwc3VtLm1lYW4oaWEyKSwgMC4wMWQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9tZWFuX2VtcHR5KCkgewotICAgICAgICBpbnRbXSBpYTEgPSB7fTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGQsIExvcmVtSXBzdW0ubWVhbihpYTEpLCAwLjAxZCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3ZhcmlhbmNlKCkgewotICAgICAgICBkb3VibGVbXSBpYTEgPSB7IDYuMGQsIDYuMGQsIDQuMGQsIDQuMGQgfTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMGQsIExvcmVtSXBzdW0udmFyaWFuY2UoaWExKSwgMC4wMWQpOwotICAgICAgICBkb3VibGVbXSBpYTIgPSB7IDEuMGQsIDIuMGQsIDMuMGQsIDQuMGQgfTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMjVkLCBMb3JlbUlwc3VtLnZhcmlhbmNlKGlhMiksIDAuMDFkKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2lnbWEoKSB7Ci0gICAgICAgIGRvdWJsZVtdIGlhMSA9IHsgNi4wZCwgNi4wZCwgNC4wZCwgNC4wZCB9OwotICAgICAgICBkb3VibGVbXSBpYTIgPSB7IDEuMGQsIDIuMGQsIDMuMGQsIDQuMGQgfTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMGQsIExvcmVtSXBzdW0uc2lnbWEoaWExKSwgMC4wMWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTWF0aC5zcXJ0KDEuMjUpLCBMb3JlbUlwc3VtLnNpZ21hKGlhMiksIDAuMDFkKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2lnbWFfZW1wdHkoKSB7Ci0gICAgICAgIGludFtdIGlhMSA9IHt9OwotICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZCwgTG9yZW1JcHN1bS5zaWdtYShpYTEpLCAwLjAxZCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NwbGl0X3NlbnRlbmNlcygpIHsKLSAgICAgICAgU3RyaW5nW10gc2VudGVuY2VzMSA9IHsgIkhlbGxvIiwgIkhpIiB9OwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhzZW50ZW5jZXMxLCBMb3JlbUlwc3VtLnNwbGl0U2VudGVuY2VzKCJIZWxsby4gSGkuIikpOwotICAgICAgICBTdHJpbmdbXSBzZW50ZW5jZXMyID0geyAiT25lIHR3byB0aHJlZSBmb3VyIGZpdmUgc2l4IiwgIlNldmVuIGVpZ2h0IG5pbmUgdGVuIGVsZXZlbiB0d2VsdmUiLAotICAgICAgICAgICAgICAgICJUaGlydGVlbiBmb3VydGVlbiBmaWZ0ZWVuIHNpeHRlZW4iLCAiU2V2ZW50ZWVuIGVpZ2h0ZWVuIG5pbmV0ZWVuIHR3ZW50eSIgfTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoc2VudGVuY2VzMiwgTG9yZW1JcHN1bS5zcGxpdFNlbnRlbmNlcyhzYW1wbGUpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3BsaXRfc2VudGVuY2VzX2VtcHR5KCkgewotICAgICAgICBTdHJpbmdbXSBzZW50ZW5jZXMgPSB7fTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoc2VudGVuY2VzLCBMb3JlbUlwc3VtLnNwbGl0U2VudGVuY2VzKCIiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NwbGl0X3NlbnRlbmNlc190cmFpbGluZygpIHsKLSAgICAgICAgU3RyaW5nW10gc2VudGVuY2VzMSA9IHsgIkhlbGxvIiwgIkhpIiwgIkhlbGxvIiB9OwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhzZW50ZW5jZXMxLCBMb3JlbUlwc3VtLnNwbGl0U2VudGVuY2VzKCJIZWxsby4gSGkuIEhlbGxvIikpOwotICAgICAgICBTdHJpbmdbXSBzZW50ZW5jZXMyID0geyAiSGVsbG8iLCAiSGkiLCAiSGVsbG8iIH07Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHNlbnRlbmNlczIsIExvcmVtSXBzdW0uc3BsaXRTZW50ZW5jZXMoIiAgSGVsbG8uIEhpLiBIZWxsbyAgIikpOwotICAgICAgICBTdHJpbmdbXSBzZW50ZW5jZXMzID0geyAiSGVsbG8iLCAiSGkiLCAiSGVsbG8iIH07Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHNlbnRlbmNlczMsIExvcmVtSXBzdW0uc3BsaXRTZW50ZW5jZXMoIi4uICBIZWxsby4uLiBIaS4uLi4gSGVsbG8gICIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3BsaXRfcGFyYWdyYXBocygpIHsKLSAgICAgICAgU3RyaW5nW10gcGFyYWdyYXBocyA9IHsgIk9uZSB0d28gdGhyZWUgZm91ciBmaXZlIHNpeC4gU2V2ZW4gZWlnaHQgbmluZSB0ZW4gZWxldmVuIHR3ZWx2ZS4iLAotICAgICAgICAgICAgICAgICJUaGlydGVlbiBmb3VydGVlbiBmaWZ0ZWVuIHNpeHRlZW4uIFNldmVudGVlbiBlaWdodGVlbiBuaW5ldGVlbiB0d2VudHkuIiB9OwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhwYXJhZ3JhcGhzLCBMb3JlbUlwc3VtLnNwbGl0UGFyYWdyYXBocyhzYW1wbGUpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc3BsaXRfcGFyYWdyYXBoc19lbXB0eSgpIHsKLSAgICAgICAgU3RyaW5nW10gcGFyYWdyYXBocyA9IHt9OwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhwYXJhZ3JhcGhzLCBMb3JlbUlwc3VtLnNwbGl0UGFyYWdyYXBocygiIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9zcGxpdF9wYXJhZ3JhcGhzX3RyYWlsaW5nKCkgewotICAgICAgICBTdHJpbmdbXSBwYXJhZ3JhcGhzID0geyAiSGVsbG8iLCAiSGkiIH07Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHBhcmFncmFwaHMsIExvcmVtSXBzdW0uc3BsaXRQYXJhZ3JhcGhzKCJIZWxsb1xuXG5IaSIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMocGFyYWdyYXBocywgTG9yZW1JcHN1bS5zcGxpdFBhcmFncmFwaHMoIkhlbGxvXG5cbkhpXG4iKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHBhcmFncmFwaHMsIExvcmVtSXBzdW0uc3BsaXRQYXJhZ3JhcGhzKCJIZWxsb1xuXG5IaVxuXG4iKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHBhcmFncmFwaHMsIExvcmVtSXBzdW0uc3BsaXRQYXJhZ3JhcGhzKCJIZWxsb1xuXG5IaVxuXG5cbiIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMocGFyYWdyYXBocywgTG9yZW1JcHN1bS5zcGxpdFBhcmFncmFwaHMoIkhlbGxvXG5cbkhpXG5cblxuXG5cblxuIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhwYXJhZ3JhcGhzLCBMb3JlbUlwc3VtLnNwbGl0UGFyYWdyYXBocygiXG5IZWxsb1xuXG5IaSIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMocGFyYWdyYXBocywgTG9yZW1JcHN1bS5zcGxpdFBhcmFncmFwaHMoIlxuXG5IZWxsb1xuXG5IaSIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMocGFyYWdyYXBocywgTG9yZW1JcHN1bS5zcGxpdFBhcmFncmFwaHMoIlxuXG5cbkhlbGxvXG5cbkhpIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhwYXJhZ3JhcGhzLCBMb3JlbUlwc3VtLnNwbGl0UGFyYWdyYXBocygiXG5cblxuXG5cblxuSGVsbG9cblxuSGkiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NwbGl0X3dvcmRzKCkgewotICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IHsgIk9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIgfTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMod29yZHMsIExvcmVtSXBzdW0uc3BsaXRXb3JkcygiT25lIHR3byB0aHJlZSBmb3VyIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh3b3JkcywgTG9yZW1JcHN1bS5zcGxpdFdvcmRzKCIgIE9uZSAgICB0d28gIHRocmVlICBmb3VyICAgIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9zcGxpdF93b3Jkc19lbXB0eSgpIHsKLSAgICAgICAgU3RyaW5nW10gd29yZHMgPSB7fTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMod29yZHMsIExvcmVtSXBzdW0uc3BsaXRXb3JkcygiIikpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jaG9vc2VfY2xvc2VzdCgpIHsKLSAgICAgICAgSW50ZWdlcltdIGludEFycmF5MSA9IHsgMSwgMiwgMywgNCB9OwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgTG9yZW1JcHN1bS5jaG9vc2VDbG9zZXN0KGludEFycmF5MSwgMSkpOwotICAgICAgICBJbnRlZ2VyW10gaW50QXJyYXkyID0geyAxLCAyLCAzLCA0IH07Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBMb3JlbUlwc3VtLmNob29zZUNsb3Nlc3QoaW50QXJyYXkyLCA0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBMb3JlbUlwc3VtLmNob29zZUNsb3Nlc3QoaW50QXJyYXkyLCAyMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgTG9yZW1JcHN1bS5jaG9vc2VDbG9zZXN0KGludEFycmF5MiwgLTEwKSk7Ci0gICAgICAgIEludGVnZXJbXSBpbnRBcnJheTMgPSB7IDEsIDQgfTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIExvcmVtSXBzdW0uY2hvb3NlQ2xvc2VzdChpbnRBcnJheTMsIDIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIExvcmVtSXBzdW0uY2hvb3NlQ2xvc2VzdChpbnRBcnJheTMsIDMpKTsKLSAgICAgICAgSW50ZWdlcltdIGludEFycmF5NCA9IHsgMSwgMyB9OwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgTG9yZW1JcHN1bS5jaG9vc2VDbG9zZXN0KGludEFycmF5NCwgMikpOwotICAgICAgICBJbnRlZ2VyW10gaW50QXJyYXk1ID0geyAzLCAxIH07Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBMb3JlbUlwc3VtLmNob29zZUNsb3Nlc3QoaW50QXJyYXk1LCAyKSk7Ci0gICAgICAgIEludGVnZXJbXSBpbnRBcnJheTYgPSB7IDEgfTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIExvcmVtSXBzdW0uY2hvb3NlQ2xvc2VzdChpbnRBcnJheTYsIDIwMCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9zZW50ZW5jZV9tZWFuKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoNS4wZCwgZ2VuZXJhdG9yLmdldFNlbnRlbmNlTWVhbigpLCAwLjAxZCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3BhcmFncmFwaF9tZWFuKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoMi4wZCwgZ2VuZXJhdG9yLmdldFBhcmFncmFwaE1lYW4oKSwgMC4wMWQpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9zZW50ZW5jZV9zaWdtYSgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMGQsIGdlbmVyYXRvci5nZXRTZW50ZW5jZVNpZ21hKCksIDAuMDFkKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyYWdyYXBoX3NpZ21hKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZCwgZ2VuZXJhdG9yLmdldFBhcmFncmFwaFNpZ21hKCksIDAuMDFkKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2FtcGxlKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoZ2VuZXJhdG9yLmdldFNhbXBsZSgpLCBzYW1wbGUpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdF9kaWN0aW9uYXJ5KCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoZ2VuZXJhdG9yLmdldERpY3Rpb25hcnkoKSwgZGljdGlvbmFyeSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldF9kaWN0aW9uYXJ5KCkgewotICAgICAgICBTdHJpbmcgbmV3ZGljdCA9ICJhIGIgYyI7Ci0gICAgICAgIGdlbmVyYXRvci5zZXREaWN0aW9uYXJ5KG5ld2RpY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2VuZXJhdG9yLmdldERpY3Rpb25hcnkoKSwgbmV3ZGljdCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRfbm9fc2FtcGxlKCkgewotICAgICAgICBkb0dlbmVyYXRlKCIiKTsKLSAgICAgICAgZG9HZW5lcmF0ZSgiICIpOwotICAgICAgICBkb0dlbmVyYXRlKCJcblxuIik7Ci0gICAgICAgIGRvR2VuZXJhdGUoIiAgXG5cbiAgIik7Ci0gICAgICAgIGRvR2VuZXJhdGUoIiAuXG5cbiAuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvR2VuZXJhdGUoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdlbmVyYXRvciA9IG5ldyBMb3JlbUlwc3VtKHRleHQsIGRpY3Rpb25hcnkpOwotICAgICAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlUGFyYWdyYXBoKGZhbHNlKTsKLSAgICAgICAgICAgIGZhaWwoIlNhbXBsZSB0ZXh0ICIgKyB0ZXh0ICsgIiBzaG91bGQgZ2VuZXJhdGUgZXhjZXB0aW9uLiIpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkludmFsaWQgc2FtcGxlIHRleHQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdF9ub19kaWN0KCkgewotICAgICAgICBkb0dlbmVyYXRlTm9EaWN0KCIiKTsKLSAgICAgICAgZG9HZW5lcmF0ZU5vRGljdCgiICIpOwotICAgICAgICBkb0dlbmVyYXRlTm9EaWN0KCJcblxuIik7Ci0gICAgICAgIGRvR2VuZXJhdGVOb0RpY3QoIiAgXG5cbiAgIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvR2VuZXJhdGVOb0RpY3QoU3RyaW5nIGRpY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdlbmVyYXRvciA9IG5ldyBMb3JlbUlwc3VtKHNhbXBsZSwgZGljdCk7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGVQYXJhZ3JhcGgoZmFsc2UpOwotICAgICAgICAgICAgZmFpbCgiRGljdGlvbmFyeSAiICsgZGljdCArICIgc2hvdWxkIGdlbmVyYXRlIGV4Y2VwdGlvbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJJbnZhbGlkIGRpY3Rpb25hcnkuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZSgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJHZW5lcmF0ZSBuZXcgdGV4dDogIik7Ci0gICAgICAgIFN0cmluZyBuZXdEaWN0ID0gIm1lIHlvdSBoZSB0aGUgT25lIHR3byB0aHJlZSBmb3VyIGZpdmUgc2l4IFNldmVuIGVpZ2h0IG5pbmUgdGVuIGVsZXZlbiB0d2VsdmUgIgotICAgICAgICAgICAgICAgICsgIlRoaXJ0ZWVuIGZvdXJ0ZWVuIGZpZnRlZW4gc2l4dGVlbiBTZXZlbnRlZW4gZWlnaHRlZW4gbmluZXRlZW4gdHdlbnR5IGpvZSBmcmVkIHNvbWUiOwotICAgICAgICBTdHJpbmdbXSBuZXdQYXJhZ3JhcGhzID0gbmV3IFN0cmluZ1s0XTsKLSAgICAgICAgZ2VuZXJhdG9yLnNldERpY3Rpb25hcnkobmV3RGljdCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3UGFyYWdyYXBocy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbmV3UGFyYWdyYXBoc1tpXSA9IGdlbmVyYXRvci5nZW5lcmF0ZVBhcmFncmFwaChmYWxzZSk7Ci0gICAgICAgICAgICBMT0cuZGVidWcobmV3UGFyYWdyYXBoc1tpXSk7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIiIpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEZhbHNlKG5ld1BhcmFncmFwaHNbMF0uZXF1YWxzKG5ld1BhcmFncmFwaHNbMV0pKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobmV3UGFyYWdyYXBoc1swXS5lcXVhbHMobmV3UGFyYWdyYXBoc1syXSkpOwotICAgICAgICBhc3NlcnRGYWxzZShuZXdQYXJhZ3JhcGhzWzBdLmVxdWFscyhuZXdQYXJhZ3JhcGhzWzNdKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG5ld1BhcmFncmFwaHNbMV0uZXF1YWxzKG5ld1BhcmFncmFwaHNbMl0pKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobmV3UGFyYWdyYXBoc1sxXS5lcXVhbHMobmV3UGFyYWdyYXBoc1szXSkpOwotICAgICAgICBhc3NlcnRGYWxzZShuZXdQYXJhZ3JhcGhzWzJdLmVxdWFscyhuZXdQYXJhZ3JhcGhzWzNdKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVMb3JlSXBzdW0oKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiR2VuZXJhdGUgbmV3IExvcmUgSXBzdW0gdGV4dDogIik7Ci0gICAgICAgIExvcmVtSXBzdW0gaXBzdW0gPSBuZXcgTG9yZW1JcHN1bSgpOwotICAgICAgICBTdHJpbmdbXSBuZXdQYXJhZ3JhcGhzID0gbmV3IFN0cmluZ1s0XTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdQYXJhZ3JhcGhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBuZXdQYXJhZ3JhcGhzW2ldID0gaXBzdW0uZ2VuZXJhdGVQYXJhZ3JhcGgoZmFsc2UpOwotICAgICAgICAgICAgTE9HLmRlYnVnKG5ld1BhcmFncmFwaHNbaV0pOwotICAgICAgICAgICAgTE9HLmRlYnVnKCIiKTsKLSAgICAgICAgICAgIExPRy5kZWJ1ZygiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUxvcmVJcHN1bUh0bWwxKCkgewotICAgICAgICBMT0cuZGVidWcoIkdlbmVyYXRlIG5ldyBMb3JlIElwc3VtIGFzIGh0bWwgcGFyYWdyYXBoczoiKTsKLSAgICAgICAgTG9yZW1JcHN1bSBpcHN1bSA9IG5ldyBMb3JlbUlwc3VtKCk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBpcHN1bS5nZW5lcmF0ZVBhcmFncmFwaHNIdG1sKDIwNDgsIHRydWUpOwotICAgICAgICBMT0cuZGVidWcob3V0cHV0KTsKLSAgICAgICAgTE9HLmRlYnVnKCIiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUxvcmVJcHN1bUh0bWwyKCkgewotICAgICAgICBMT0cuZGVidWcoIkdlbmVyYXRlIG5ldyBMb3JlIElwc3VtIGFzIG9uZSBodG1sIHBhcmFncmFwaDoiKTsKLSAgICAgICAgTG9yZW1JcHN1bSBpcHN1bSA9IG5ldyBMb3JlbUlwc3VtKCk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBpcHN1bS5nZW5lcmF0ZU9uZVBhcmFncmFwaEh0bWwoMjA0OCwgdHJ1ZSk7Ci0gICAgICAgIExPRy5kZWJ1ZyhvdXRwdXQpOwotICAgICAgICBMT0cuZGVidWcoIiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlTG9yZUlwc3VtSHRtbDMoKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiR2VuZXJhdGUgbmV3IExvcmUgSXBzdW0gYXMgZnVsbCBodG1sIGRvY3VtZW50OiAiKTsKLSAgICAgICAgTG9yZW1JcHN1bSBpcHN1bSA9IG5ldyBMb3JlbUlwc3VtKCk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBpcHN1bS5nZW5lcmF0ZVBhcmFncmFwaHNGdWxsSHRtbCgyMDQ4LCB0cnVlKTsKLSAgICAgICAgTE9HLmRlYnVnKG91dHB1dCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVMb3JlSXBzdW1QbGFpblRleHQoKSB7Ci0gICAgICAgIExPRy5kZWJ1ZygiR2VuZXJhdGUgbmV3IExvcmUgSXBzdW0gYXMgcGxhaW4gdGV4dDogIik7Ci0gICAgICAgIExvcmVtSXBzdW0gaXBzdW0gPSBuZXcgTG9yZW1JcHN1bSgpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaXBzdW0uZ2VuZXJhdGVQYXJhZ3JhcGhzUGxhaW5UZXh0KDIwNDgsIHRydWUpOwotICAgICAgICBMT0cuZGVidWcob3V0cHV0KTsKLSAgICAgICAgTE9HLmRlYnVnKCIiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUxvcmVJcHN1bVBsYWluVGV4dEZvcm1hdHRlZCgpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJHZW5lcmF0ZSBuZXcgTG9yZSBJcHN1bSBhcyBwbGFpbiB0ZXh0IHdpdGggNjAgY29sdW1uczogIik7Ci0gICAgICAgIExvcmVtSXBzdW0gaXBzdW0gPSBuZXcgTG9yZW1JcHN1bSgpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaXBzdW0uZ2VuZXJhdGVQYXJhZ3JhcGhzUGxhaW5UZXh0KDI1NiwgNjAsIGZhbHNlKTsKLSAgICAgICAgTE9HLmRlYnVnKG91dHB1dCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVMb3JlSXBzdW1IdG1sMVdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExPRy5kZWJ1ZygiR2VuZXJhdGUgbmV3IExvcmUgSXBzdW0gYXMgaHRtbCBwYXJhZ3JhcGhzIHdpdGggUHJpbnRXcml0ZXI6Iik7Ci0gICAgICAgIExvcmVtSXBzdW0gaXBzdW0gPSBuZXcgTG9yZW1JcHN1bSgpOwotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBpcHN1bS5nZW5lcmF0ZVBhcmFncmFwaHNIdG1sKHdyaXRlciwgMjA0OCwgdHJ1ZSk7Ci0gICAgICAgIExPRy5kZWJ1Zyh3cml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIExPRy5kZWJ1ZygiRW5kIFRlc3QuIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVMb3JlSXBzdW1IdG1sMldyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExPRy5kZWJ1ZygiR2VuZXJhdGUgbmV3IExvcmUgSXBzdW0gYXMgZnVsbCBodG1sIHBhcmFncmFwaCB3aXRoIFByaW50V3JpdGVyOiIpOwotICAgICAgICBMb3JlbUlwc3VtIGlwc3VtID0gbmV3IExvcmVtSXBzdW0oKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgaXBzdW0uZ2VuZXJhdGVQYXJhZ3JhcGhzRnVsbEh0bWwod3JpdGVyLCAyMDQ4LCB0cnVlKTsKLSAgICAgICAgTE9HLmRlYnVnKHdyaXRlci50b1N0cmluZygpKTsKLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgVGVzdC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUxvcmVJcHN1bVBsYWluVGV4dFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExPRy5kZWJ1ZygiR2VuZXJhdGUgbmV3IExvcmUgSXBzdW0gYXMgcGxhaW4gdGV4dCB3aXRoIFByaW50V3JpdGVyOiAiKTsKLSAgICAgICAgTG9yZW1JcHN1bSBpcHN1bSA9IG5ldyBMb3JlbUlwc3VtKCk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGlwc3VtLmdlbmVyYXRlUGFyYWdyYXBoc1BsYWluVGV4dCh3cml0ZXIsIDIwNDgsIHRydWUpOwotICAgICAgICBMT0cuZGVidWcod3JpdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBMT0cuZGVidWcoIkVuZCBUZXN0LiIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlTG9yZUlwc3VtUGxhaW5UZXh0Rm9ybWF0dGVkV3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTE9HLmRlYnVnKCJHZW5lcmF0ZSBuZXcgTG9yZSBJcHN1bSBhcyBwbGFpbiB0ZXh0IHdpdGggNjAgY29sdW1ucyB3aXRoIFByaW50V3JpdGVyOiAiKTsKLSAgICAgICAgTG9yZW1JcHN1bSBpcHN1bSA9IG5ldyBMb3JlbUlwc3VtKCk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGlwc3VtLmdlbmVyYXRlUGFyYWdyYXBoc1BsYWluVGV4dCh3cml0ZXIsIDI1NiwgNjAsIGZhbHNlKTsKLSAgICAgICAgTE9HLmRlYnVnKHdyaXRlci50b1N0cmluZygpKTsKLSAgICAgICAgTE9HLmRlYnVnKCJFbmQgVGVzdC4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZUxvcmVJcHN1bUdlcm1hbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMT0cuZGVidWcoIkdlbmVyYXRlIG5ldyBMb3JlIElwc3VtIEZlcnJ5IFRhbGU6ICIpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvSGFlbnNlbFVuZEdyZXRlbC50eHQiKTsKLQotICAgICAgICAvLyByZWFkIHN0cmVhbSBpbnRvIGEgc3RyaW5nCi0gICAgICAgIGZpbmFsIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYW1wbGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBSZWFkZXIgaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsICJJU08tODg1OS0xIik7Ci0gICAgICAgIGludCByZWFkOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZWFkID0gaW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwotICAgICAgICAgICAgaWYgKHJlYWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2FtcGxlLmFwcGVuZChidWZmZXIsIDAsIHJlYWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChyZWFkID49IDApOwotCi0gICAgICAgIExvcmVtSXBzdW0gaXBzdW0gPSBuZXcgTG9yZW1JcHN1bShzYW1wbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXQgPSBpcHN1bS5nZW5lcmF0ZVBhcmFncmFwaHNQbGFpblRleHQoNDA5NiwgODAsIGZhbHNlKTsKLSAgICAgICAgTE9HLmRlYnVnKG91dHB1dCk7Ci0gICAgICAgIExPRy5kZWJ1ZygiRW5kIFRlc3QuIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC11dGlsL3NyYy90ZXN0L3Jlc291cmNlcy9IYWVuc2VsVW5kR3JldGVsLnR4dCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL3Rlc3QvcmVzb3VyY2VzL0hhZW5zZWxVbmRHcmV0ZWwudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2IxMTEzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL3Rlc3QvcmVzb3VyY2VzL0hhZW5zZWxVbmRHcmV0ZWwudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotSORuc2VsIHVuZCBHcmV0aGVsLg0KLQ0KLVZvciBlaW5lbSBncm/fZW4gV2FsZGUgd29obnRlIGVpbiBhcm1lciBIb2x6aGFja2VyIG1pdCBzZWluZXIgRnJhdSB1bmQgc2VpbmVuIHp3ZWkgS2luZGVybjsgZGFzIEL8YmNoZW4gaGll3yBI5G5zZWwgdW5kIGRhcyBN5GRjaGVuIEdyZXRoZWwuIEVyIGhhdHRlIHdlbmlnIHp1IGJlad9lbiB1bmQgenUgYnJlY2hlbiwgdW5kIGVpbm1hbCwgYWxzIGdyb99lIFRoZXVlcnVuZyBpbnMgTGFuZCBrYW0sIGtvbm50ZSBlciBhdWNoIGRhcyB05GdsaWNoIEJyb3QgbmljaHQgbWVociBzY2hhZmZlbi4gV2llIGVyIHNpY2ggbnVuIEFiZW5kcyBpbSBCZXR0ZSBHZWRhbmtlbiBtYWNodGUgdW5kIHNpY2ggdm9yIFNvcmdlbiBoZXJ1bSB35Gx6dGUsIHNldWZ6dGUgZXIgdW5kIHNwcmFjaCB6dSBzZWluZXIgRnJhdSAid2FzIHNvbGwgYXVzIHVucyB3ZXJkZW4/IHdpZSBr9m5uZW4gd2lyIHVuc2VyZSBhcm1lbiBLaW5kZXIgZXJu5GhyZW4sIGRhIHdpciBm/HIgdW5zIHNlbGJzdCBuaWNodHMgbWVociBoYWJlbj8iICJXZWnfdCBkdSB3YXMsIE1hbm4sIiBhbnR3b3J0ZXRlIGRpZSBGcmF1LCAid2lyIHdvbGxlbiBNb3JnZW4gaW4gYWxsZXIgRnL8aGUgZGllIEtpbmRlciBoaW5hdXMgaW4gZGVuIFdhbGQgZvxocmVuLCB3byBlciBhbSBkaWNrc3RlbiBpc3Q6IGRhIG1hY2hlbiB3aXIgaWhuZW4gZWluIEZldWVyIGFuIHVuZCBnZWJlbiBqZWRlbSBub2NoIGVpbiBTdPxja2NoZW4gQnJvdCwgZGFubiBnZWhlbiB3aXIgYW4gdW5zZXJlIEFyYmVpdCB1bmQgbGFzc2VuIHNpZSBhbGxlaW4uIFNpZSBmaW5kZW4gZGVuIFdlZyBuaWNodCB3aWVkZXIgbmFjaCBIYXVzIHVuZCB3aXIgc2luZCBzaWUgbG9zLiIgIk5laW4sIEZyYXUsIiBzYWd0ZSBkZXIgTWFubiwgImRhcyB0aHVlIGljaCBuaWNodDsgd2llIHNvbGx0IGljaHMg/GJlcnMgSGVyeiBicmluZ2VuIG1laW5lIEtpbmRlciBpbSBXYWxkZSBhbGxlaW4genUgbGFzc2VuLCBkaWUgd2lsZGVuIFRoaWVyZSB3/HJkZW4gYmFsZCBrb21tZW4gdW5kIHNpZSB6ZXJyZWnfZW4uIiAiTyBkdSBOYXJyLCIgc2FndGUgc2llLCAiZGFubiBt/HNzZW4gd2lyIGFsbGUgdmllcmUgSHVuZ2VycyBzdGVyYmVuLCBkdSBrYW5uc3QgbnVyIGRpZSBCcmV0dGVyIGb8ciBkaWUgU+RyZ2UgaG9iZWxlbiwiIHVuZCBsaWXfIGlobSBrZWluZSBSdWhlIGJpcyBlciBlaW53aWxsaWd0ZS4gIkFiZXIgZGllIGFybWVuIEtpbmRlciBkYXVlcm4gbWljaCBkb2NoIiBzYWd0ZSBkZXIgTWFubi4NCi0NCi1EaWUgendlaSBLaW5kZXIgaGF0dGVuIHZvciBIdW5nZXIgYXVjaCBuaWNodCBlaW5zY2hsYWZlbiBr9m5uZW4gdW5kIGhhdHRlbiBnZWj2cnQgd2FzIGRpZSBTdGllZm11dHRlciB6dW0gVmF0ZXIgZ2VzYWd0IA0KLUFscyBkZXIgVGFnIGFuYnJhY2gsIG5vY2ggZWhlIGRpZSBTb25uZSBhdWZnZWdhbmdlbiB3YXIsIGthbSBzY2hvbiBkaWUgRnJhdSB1bmQgd2Vja3RlIGRpZSBiZWlkZW4gS2luZGVyLCAic3RlaHQgYXVmLCBpaHIgRmF1bGxlbnplciwgd2lyIHdvbGxlbiBpbiBkZW4gV2FsZCBnZWhlbiB1bmQgSG9seiBob2xlbi4iIERhbm4gZ2FiIHNpZSBqZWRlbSBlaW4gU3T8Y2tjaGVuIEJyb3QgdW5kIHNwcmFjaCAiZGEgaGFidCBpaHIgZXR3YXMgZvxyIGRlbiBNaXR0YWcsIGFiZXIgZd90cyBuaWNodCB2b3JoZXIgYXVmLCB3ZWl0ZXIga3JpZWd0IGlociBuaWNodHMuIiBHcmV0aGVsIG5haG0gZGFzIEJyb3QgdW50ZXIgZGllIFNjaPxyemUsIHdlaWwgSORuc2VsIGRpZSBTdGVpbmUgaW4gZGVyIFRhc2NoZSBoYXR0ZS4gRGFuYWNoIG1hY2h0ZW4gc2llIHNpY2ggYWxsZSB6dXNhbW1lbiBhdWYgZGVuIFdlZyBuYWNoIGRlbSBXYWxkLiBBbHMgc2llIGVpbiBXZWlsY2hlbiBnZWdhbmdlbiB3YXJlbiwgc3RhbmQgSORuc2VsIHN0aWxsIHVuZCBndWNrdGUgbmFjaCBkZW0gSGF1cyB6dXL8Y2sgdW5kIHRoYXQgZGFzIHdpZWRlciB1bmQgaW1tZXIgd2llZGVyLiBEZXIgVmF0ZXIgc3ByYWNoICJI5G5zZWwsIHdhcyBndWNrc3QgZHUgZGEgdW5kIGJsZWlic3QgenVy/GNrLCBoYWIgQWNodCB1bmQgdmVyZ2nfIGRlaW5lIEJlaW5lIG5pY2h0LiIgIkFjaCwgVmF0ZXIsIiBzYWd0ZSBI5G5zZWwsICJpY2ggc2VoZSBuYWNoIG1laW5lbSB3ZWnfZW4gS+R0emNoZW4sIGRhcyBzaXR6dCBvYmVuIGF1ZiBkZW0gRGFjaCB1bmQgd2lsbCBtaXIgQWRlIHNhZ2VuLiIgRGllIEZyYXUgc3ByYWNoICJOYXJyLCBkYXMgaXN0IGRlaW4gS+R0emNoZW4gbmljaHQsIGRhcyBpc3QgZGllIE1vcmdlbnNvbm5lLCBkaWUgYXVmIGRlbiBTY2hvcm5zdGVpbiBzY2hlaW50LiIgSORuc2VsIGFiZXIgaGF0dGUgbmljaHQgbmFjaCBkZW0gS+R0emNoZW4gZ2VzZWhlbiwgc29uZGVybiBpbW1lciBlaW5lbiB2b24gZGVuIGJsYW5rZW4gS2llc2Vsc3RlaW5lbiBhdXMgc2VpbmVyIFRhc2NoZSBhdWYgZGVuIFdlZyBnZXdvcmZlbi4NCi0NCi1BbHMgc2llIG1pdHRlbiBpbiBkZW4gV2FsZCBnZWtvbW1lbiB3YXJlbiwgc3ByYWNoIGRlciBWYXRlciAibnVuIHNhbW1lbHQgSG9seiwgaWhyIEtpbmRlciwgaWNoIHdpbGwgZWluIEZldWVyIGFubWFjaGVuLCBkYW1pdCBpaHIgbmljaHQgZnJpZXJ0LiIgSORuc2VsIHVuZCBHcmV0aGVsIHRydWdlbiBSZWlzaWcgenVzYW1tZW4sIGVpbmVuIGtsZWluZW4gQmVyZyBob2NoLiBEYXMgUmVpc2lnIHdhcmQgYW5nZXr8bmRldCwgdW5kIGFscyBkaWUgRmxhbW1lIHJlY2h0IGhvY2ggYnJhbm50ZSwgc2FndGUgZGllIEZyYXUgIm51biBsZWd0IGV1Y2ggYW5zIEZldWVyLCBpaHIgS2luZGVyIHVuZCBydWh0IGV1Y2ggYXVzLCB3aXIgZ2VoZW4gaW4gZGVuIFdhbGQgdW5kIGhhdWVuIEhvbHouIFdlbm4gd2lyIGZlcnRpZyBzaW5kLCBrb21tZW4gd2lyIHdpZWRlciB1bmQgaG9sZW4gZXVjaCBhYi4iDQotDQotSORuc2VsIHVuZCBHcmV0aGVsIHNh32VuIGFtIEZldWVyLCB1bmQgYWxzIGRlciBNaXR0YWcga2FtLCBh3yBqZWRlcyBzZWluIFN0/GNrbGVpbiBCcm90LiBVbmQgd2VpbCBzaWUgZGllIFNjaGzkZ2UgZGVyIEhvbHpheHQgaPZydGVuLCBzbyBnbGF1YnRlbiBzaWUgaWhyIFZhdGVyIHfkcmUgaW4gZGVyIE7kaGUuIEVzIHdhciBhYmVyIG5pY2h0IGRpZSBIb2x6YXh0LCBlcyB3YXIgZWluIEFzdCwgZGVuIGVyIGFuIGVpbmVuIGT8cnJlbiBCYXVtIGdlYnVuZGVuIGhhdHRlIHVuZCBkZW4gZGVyIFdpbmQgaGluIHVuZCBoZXIgc2NobHVnLiBVbmQgYWxzIHNpZSBzbyBsYW5nZSBnZXNlc3NlbiBoYXR0ZW4sIGZpZWxlbiBpaG5lbiBkaWUgQXVnZW4gdm9yIE38ZGlna2VpdCB6dSwgdW5kIHNpZSBzY2hsaWVmZW4gZmVzdCBlaW4uIEFscyBzaWUgZW5kbGljaCBlcndhY2h0ZW4sIHdhciBlcyBzY2hvbiBmaW5zdGVyZSBOYWNodC4gR3JldGhlbCBmaWVuZyBhbiB6dSB3ZWluZW4gdW5kIHNwcmFjaCAid2llIHNvbGxlbiB3aXIgbnVuIGF1cyBkZW0gV2FsZCBrb21tZW4hIiBI5G5zZWwgYWJlciB0cvZzdGV0ZSBzaWUsICJ3YXJ0IG51ciBlaW4gV2VpbGNoZW4sIGJpcyBkZXIgTW9uZCBhdWZnZWdhbmdlbiBpc3QsIGRhbm4gd29sbGVuIHdpciBkZW4gV2VnIHNjaG9uIGZpbmRlbi4iIFVuZCBhbHMgZGVyIHZvbGxlIE1vbmQgYXVmZ2VzdGllZ2VuIHdhciwgc28gbmFobSBI5G5zZWwgc2VpbiBTY2h3ZXN0ZXJjaGVuIGFuIGRlciBIYW5kIHVuZCBnaWVuZyBkZW4gS2llc2Vsc3RlaW5lbiBuYWNoLCBkaWUgc2NoaW1tZXJ0ZW4gd2llIG5ldSBnZXNjaGxhZ2VuZSBCYXR6ZW4gdW5kIHplaWd0ZW4gaWhuZW4gZGVuIFdlZy4gU2llIGdpZW5nZW4gZGllIGdhbnplIE5hY2h0IGhpbmR1cmNoIHVuZCBrYW1lbiBiZWkgYW5icmVjaGVuZGVtIFRhZyB3aWVkZXIgenUgaWhyZXMgVmF0ZXJzIEhhdXMuIFNpZSBrbG9wZnRlbiBhbiBkaWUgVGj8ciwgdW5kIGFscyBkaWUgRnJhdSBhdWZtYWNodGUgdW5kIHNhaCBkYd8gZXMgSORuc2VsIHVuZCBHcmV0aGVsIHdhciwgc3ByYWNoIHNpZSAiaWhyIGL2c2VuIEtpbmRlciwgd2FzIGhhYnQgaWhyIHNvIGxhbmdlIGltIFdhbGRlIGdlc2NobGFmZW4sIHdpciBoYWJlbiBnZWdsYXVidCBpaHIgd29sbHRldCBnYXIgbmljaHQgd2llZGVyIGtvbW1lbi4iIERlciBWYXRlciBhYmVyIGZyZXV0ZSBzaWNoLCBkZW5uIGVzIHdhciBpaG0genUgSGVyemVuIGdlZ2FuZ2VuIGRh3yBlciBzaWUgc28gYWxsZWluIHp1cvxjayBnZWxhc3NlbiBoYXR0ZS4NCi0NCi1OaWNodCBsYW5nZSBkYW5hY2ggd2FyIHdpZWRlciBOb3RoIGluIGFsbGVuIEVja2VuLCB1bmQgZGllIEtpbmRlciBo9nJ0ZW4gd2llIGRpZSBNdXR0ZXIgTmFjaHRzIGltIEJldHRlIHp1IGRlbSBWYXRlciBzcHJhY2ggImFsbGVzIGlzdCB3aWVkZXIgYXVmZ2V6ZWhydCwgd2lyIGhhYmVuIG5vY2ggZWluZW4gaGFsYmVuIExhaWIgQnJvdCwgaGVybmFjaCBoYXQgZGFzIExpZWQgZWluIEVuZGUuIERpZSBLaW5kZXIgbfxzc2VuIGZvcnQsIHdpciB3b2xsZW4gc2llIHRpZWZlciBpbiBkZW4gV2FsZCBoaW5laW5m/GhyZW4sIGRhbWl0IHNpZSBkZW4gV2VnIG5pY2h0IHdpZWRlciBoZXJhdXMgZmluZGVuOyBlcyBpc3Qgc29uc3Qga2VpbmUgUmV0dHVuZyBm/HIgdW5zLiIgRGVtIE1hbm4gZmllbHMgc2Nod2VyIGF1ZnMgSGVyeiB1bmQgZXIgZGFjaHRlICJlcyB35HJlIGJlc3NlciwgZGHfIGR1IGRlbiBsZXR6dGVuIEJpc3NlbiBtaXQgZGVpbmVuIEtpbmRlcm4gdGhlaWx0ZXN0LiIgQWJlciBkaWUgRnJhdSBo9nJ0ZSBhdWYgbmljaHRzLCB3YXMgZXIgc2FndGUsIHNjaGFsdCBpaG4gdW5kIG1hY2h0ZSBpaG0gVm9yd/xyZmUuIFdlciBBIHNhZ3QgbXXfIGF1Y2ggQiBzYWdlbiwgdW5kIHdlaWwgZXIgZGFzIGVyc3RlIE1hbCBuYWNoZ2VnZWJlbiBoYXR0ZSwgc28gbXXfdGUgZXIgZXMgYXVjaCB6dW0gendlaXRlbiBNYWwuDQotDQotRGllIEtpbmRlciB3YXJlbiBhYmVyIG5vY2ggd2FjaCBnZXdlc2VuIHVuZCBoYXR0ZW4gZGFzIEdlc3By5GNoIG1pdCBhbmdlaPZydC4gQWxzIGRpZSBBbHRlbiBzY2hsaWVmZW4sIHN0YW5kIEjkbnNlbCB3aWVkZXIgYXVmLCB3b2xsdGUgaGluYXVzIHVuZCBLaWVzZWxzdGVpbmUgYXVmbGVzZW4sIHdpZSBkYXMgdm9yaWdlbWFsLCBhYmVyIGRpZSBGcmF1IGhhdHRlIGRpZSBUaPxyIHZlcnNjaGxvc3NlbiwgdW5kIEjkbnNlbCBrb25udGUgbmljaHQgaGVyYXVzLiBBYmVyIGVyIHRy9nN0ZXRlIHNlaW4gU2Nod2VzdGVyY2hlbiB1bmQgc3ByYWNoICJ3ZWluZSBuaWNodCwgR3JldGhlbCwgdW5kIHNjaGxhZiBudXIgcnVoaWcsIGRlciBsaWViZSBHb3R0IHdpcmQgdW5zIHNjaG9uIGhlbGZlbi4iDQotDQotQW0gZnL8aGVuIE1vcmdlbiBrYW0gZGllIEZyYXUgdW5kIGhvbHRlIGRpZSBLaW5kZXIgYXVzIGRlbSBCZXR0ZS4gU2llIGVyaGllbHRlbiBpaHIgU3T8Y2tjaGVuIEJyb3QsIGRhcyB3YXIgYWJlciBub2NoIGtsZWluZXIgYWxzIGRhcyB2b3JpZ2VtYWwuIEF1ZiBkZW0gV2VnZSBuYWNoIGRlbSBXYWxkIGJy9mNrZWx0ZSBlcyBI5G5zZWwgaW4gZGVyIFRhc2NoZSwgc3RhbmQgb2Z0IHN0aWxsIHVuZCB3YXJmIGVpbiBCcvZja2xlaW4gYXVmIGRpZSBFcmRlLiAiSORuc2VsLCB3YXMgc3RlaHN0IGR1IHVuZCBndWNrc3QgZGljaCB1bSwiIHNhZ3RlIGRlciBWYXRlciwgImdlaCBkZWluZXIgV2VnZS4iICJJY2ggc2VoZSBuYWNoIG1laW5lbSBU5HViY2hlbiwgZGFzIHNpdHp0IGF1ZiBkZW0gRGFjaGUgdW5kIHdpbGwgbWlyIEFkZSBzYWdlbiwiIGFudHdvcnRldGUgSORuc2VsLiAiTmFyciwiIHNhZ3RlIGRpZSBGcmF1LCAiZGFzIGlzdCBkZWluIFTkdWJjaGVuIG5pY2h0LCBkYXMgaXN0IGRpZSBNb3JnZW5zb25uZSwgZGllIGF1ZiBkZW4gU2Nob3Juc3RlaW4gb2JlbiBzY2hlaW50LiIgSORuc2VsIGFiZXIgd2FyZiBuYWNoIHVuZCBuYWNoIGFsbGUgQnL2Y2tsZWluIGF1ZiBkZW4gV2VnLg0KLQ0KLURpZSBGcmF1IGb8aHJ0ZSBkaWUgS2luZGVyIG5vY2ggdGllZmVyIGluIGRlbiBXYWxkLCB3byBzaWUgaWhyIExlYnRhZyBub2NoIG5pY2h0IGdld2VzZW4gd2FyZW4uIERhIHdhcmQgd2llZGVyIGVpbiBncm/fZXMgRmV1ZXIgYW5nZW1hY2h0LCB1bmQgZGllIE11dHRlciBzYWd0ZSAiYmxlaWJ0IG51ciBkYSBzaXR6ZW4sIGlociBLaW5kZXIsIHVuZCB3ZW5uIGlociBt/GRlIHNlaWQsIGv2bm50IGlociBlaW4gd2VuaWcgc2NobGFmZW46IHdpciBnZWhlbiBpbiBkZW4gV2FsZCB1bmQgaGF1ZW4gSG9seiwgdW5kIEFiZW5kcywgd2VubiB3aXIgZmVydGlnIHNpbmQsIGtvbW1lbiB3aXIgdW5kIGhvbGVuIGV1Y2ggYWIuIiBBbHMgZXMgTWl0dGFnIHdhciwgdGhlaWx0ZSBHcmV0aGVsIGlociBCcm90IG1pdCBI5G5zZWwsIGRlciBzZWluIFN0/GNrIGF1ZiBkZW4gV2VnIGdlc3RyZXV0IGhhdHRlLiBEYW5uIHNjaGxpZWZlbiBzaWUgZWluLCB1bmQgZGVyIEFiZW5kIHZlcmdpZW5nLCBhYmVyIG5pZW1hbmQga2FtIHp1IGRlbiBhcm1lbiBLaW5kZXJuLiBTaWUgZXJ3YWNodGVuIGVyc3QgaW4gZGVyIGZpbnN0ZXJuIE5hY2h0LCB1bmQgSORuc2VsIHRy9nN0ZXRlIHNlaW4gU2Nod2VzdGVyY2hlbiB1bmQgc2FndGUsICJ3YXJ0IG51ciwgR3JldGhlbCwgYmlzIGRlciBNb25kIGF1ZmdlaHQsIGRhbm4gd2VyZGVuIHdpciBkaWUgQnJvdGJy9mNrbGVpbiBzZWhlbiwgZGllIGljaCBhdXNnZXN0cmV1dCBoYWJlLCBkaWUgemVpZ2VuIHVucyBkZW4gV2VnIG5hY2ggSGF1cy4iIEFscyBkZXIgTW9uZCBrYW0sIG1hY2h0ZW4gc2llIHNpY2ggYXVmLCBhYmVyIHNpZSBmYW5kZW4ga2VpbiBCcvZja2xlaW4gbWVociwgZGVubiBkaWUgdmllbCB0YXVzZW5kIFb2Z2VsLCBkaWUgaW0gV2FsZGUgdW5kIGltIEZlbGRlIHVtaGVyIGZsaWVnZW4sIGRpZSBoYXR0ZW4gc2llIHdlZ2dlcGlja3QuIEjkbnNlbCBzYWd0ZSB6dSBHcmV0aGVsICJ3aXIgd2VyZGVuIGRlbiBXZWcgc2Nob24gZmluZGVuLCIgYWJlciBzaWUgZmFuZGVuIGlobiBuaWNodC4gU2llIGdpZW5nZW4gZGllIGdhbnplIE5hY2h0IHVuZCBub2NoIGVpbmVuIFRhZyB2b24gTW9yZ2VuIGJpcyBBYmVuZCwgYWJlciBzaWUga2FtZW4gYXVzIGRlbSBXYWxkIG5pY2h0IGhlcmF1cywgdW5kIHdhcmVuIHNvIGh1bmdyaWcsIGRlbm4gc2llIGhhdHRlbiBuaWNodHMgYWxzIGRpZSBwYWFyIEJlZXJlbiwgZGllIGF1ZiBkZXIgRXJkZSBzdGFuZGVuLiBVbmQgd2VpbCBzaWUgc28gbfxkZSB3YXJlbiBkYd8gZGllIEJlaW5lIHNpZSBuaWNodCBtZWhyIHRyYWdlbiB3b2xsdGVuLCBzbyBsZWd0ZW4gc2llIHNpY2ggdW50ZXIgZWluZW4gQmF1bSB1bmQgc2NobGllZmVuIGVpbi4NCi0NCi1OdW4gd2FycyBzY2hvbiBkZXIgZHJpdHRlIE1vcmdlbiwgZGHfIHNpZSBpaHJlcyBWYXRlcnMgSGF1cyB2ZXJsYXNzZW4gaGF0dGVuLiBTaWUgZmllbmdlbiB3aWVkZXIgYW4genUgZ2VoZW4sIGFiZXIgc2llIGdlcmlldGhlbiBpbW1lciB0aWVmZXIgaW4gZGVuIFdhbGQgdW5kIHdlbm4gbmljaHQgYmFsZCBIaWxmZSBrYW0sIHNvIG1133RlbiBzaWUgdmVyc2NobWFjaHRlbi4gQWxzIGVzIE1pdHRhZyB3YXIsIHNhaGVuIHNpZSBlaW4gc2No9m5lcyBzY2huZWV3ZWnfZXMgVvZnbGVpbiBhdWYgZWluZW0gQXN0IHNpdHplbiwgZGFzIHNhbmcgc28gc2No9m4sIGRh3yBzaWUgc3RlaGVuIGJsaWViZW4gdW5kIGlobSB6dWj2cnRlbi4gVW5kIGFscyBlcyBmZXJ0aWcgd2FyLCBzY2h3YW5nIGVzIHNlaW5lIEZs/GdlbCB1bmQgZmxvZyB2b3IgaWhuZW4gaGVyLCB1bmQgc2llIGdpZW5nZW4gaWhtIG5hY2gsIGJpcyBzaWUgenUgZWluZW0gSOR1c2NoZW4gZ2VsYW5ndGVuLCBhdWYgZGVzc2VuIERhY2ggZXMgc2ljaCBzZXR6dGUsIHVuZCBhbHMgc2llIGdhbnogbmFoIGhlcmFuIGthbWVuLCBzbyBzYWhlbiBzaWUgZGHfIGRhcyBI5HVzbGVpbiBhdXMgQnJvdCBnZWJhdXQgd2FyLCB1bmQgbWl0IEt1Y2hlbiBnZWRlY2t0OyBhYmVyIGRpZSBGZW5zdGVyIHdhcmVuIHZvbiBoZWxsZW0gWnVja2VyLiAiRGEgd29sbGVuIHdpciB1bnMgZHJhbiBtYWNoZW4sIiBzcHJhY2ggSORuc2VsLCAidW5kIGVpbmUgZ2VzZWduZXRlIE1haGx6ZWl0IGhhbHRlbi4gSWNoIHdpbGwgZWluIFN0/GNrIHZvbSBEYWNoIGVzc2VuLCBHcmV0aGVsLCBkdSBrYW5uc3Qgdm9tIEZlbnN0ZXIgZXNzZW4sIGRhcyBzY2htZWNrdCBz/N8uIiBI5G5zZWwgcmVpY2h0ZSBpbiBkaWUgSPZoZSB1bmQgYnJhY2ggc2ljaCBlaW4gd2VuaWcgdm9tIERhY2ggYWIsIHVtIHp1IHZlcnN1Y2hlbiB3aWUgZXMgc2NobWVja3RlLCB1bmQgR3JldGhlbCBzdGVsbHRlIHNpY2ggYW4gZGllIFNjaGVpYmVuIHVuZCBrbnVwZXJ0ZSBkYXJhbi4gRGEgcmllZiBlaW5lIGZlaW5lIFN0aW1tZSBhdXMgZGVyIFN0dWJlIGhlcmF1cw0KLQ0KLSJrbnVwZXIsIGtudXBlciwga25laXNjaGVuLA0KLXdlciBrbnVwZXJ0IGFuIG1laW5lbSBI5HVzY2hlbj8iDQotDQotZGllIEtpbmRlciBhbnR3b3J0ZXRlbg0KLQ0KLSJkZXIgV2luZCwgZGVyIFdpbmQsDQotZGFzIGhpbW1saXNjaGUgS2luZCwiDQotDQotdW5kIGHfZW4gd2VpdGVyLCBvaG5lIHNpY2ggaXJyZSBtYWNoZW4genUgbGFzc2VuLiBI5G5zZWwsIGRlbSBkYXMgRGFjaCBzZWhyIGd1dCBzY2htZWNrdGUsIHJp3yBzaWNoIGVpbiBncm/fZXMgU3T8Y2sgZGF2b24gaGVydW50ZXIsIHVuZCBHcmV0aGVsIHN0aWXfIGVpbmUgZ2FuemUgcnVuZGUgRmVuc3RlcnNjaGVpYmUgaGVyYXVzLCBzZXR6dGUgc2ljaCBuaWVkZXIsIHVuZCB0aGF0IHNpY2ggd29obCBkYW1pdC4gRGEgZ2llbmcgYXVmIGVpbm1hbCBkaWUgVGj8cmUgYXVmLCB1bmQgZWluZSBzdGVpbmFsdGUgRnJhdSwgZGllIHNpY2ggYXVmIGVpbmUgS3L8Y2tlIHN0/HR6dGUsIGthbSBoZXJhdXMgZ2VzY2hsaWNoZW4uIEjkbnNlbCB1bmQgR3JldGhlbCBlcnNjaHJhY2tlbiBzbyBnZXdhbHRpZywgZGHfIHNpZSBmYWxsZW4gbGll32VuIHdhcyBzaWUgaW4gZGVuIEjkbmRlbiBoaWVsdGVuLiBEaWUgQWx0ZSBhYmVyIHdhY2tlbHRlIG1pdCBkZW0gS29wZmUgdW5kIHNwcmFjaCAiZWksIGlociBsaWViZW4gS2luZGVyLCB3ZXIgaGF0IGV1Y2ggaGllcmhlciBnZWJyYWNodD8ga29tbXQgbnVyIGhlcmVpbiB1bmQgYmxlaWJ0IGJlaSBtaXIsIGVzIGdlc2NoaWVodCBldWNoIGtlaW4gTGVpZC4iIFNpZSBmYd90ZSBiZWlkZSBhbiBkZXIgSGFuZCB1bmQgZvxocnRlIHNpZSBpbiBpaHIgSOR1c2NoZW4uIERhIHdhcmQgZ3V0ZXMgRXNzZW4gYXVmZ2V0cmFnZW4sIE1pbGNoIHVuZCBQZmFubmVrdWNoZW4gbWl0IFp1Y2tlciwgxHBmZWwgdW5kIE78c3NlLiBIZXJuYWNoIHd1cmRlbiB6d2VpIHNjaPZuZSBCZXR0bGVpbiB3ZWnfIGdlZGVja3QsIHVuZCBI5G5zZWwgdW5kIEdyZXRoZWwgbGVndGVuIHNpY2ggaGluZWluIHVuZCBtZWludGVuIHNpZSB35HJlbiBpbSBIaW1tZWwuDQotDQotRGllIEFsdGUgaGF0dGUgc2ljaCBudXIgc28gZnJldW5kbGljaCBhbmdlc3RlbGx0LCBzaWUgd2FyIGFiZXIgZWluZSBi9nNlIEhleGUsIGRpZSBkZW4gS2luZGVybiBhdWZsYXVlcnRlLCB1bmQgaGF0dGUgZGFzIEJyb3Ro5HVzbGVpbiBibG/fIGdlYmF1dCwgdW0gc2llIGhlcmJlaXp1bG9ja2VuLiBXZW5uIGVpbnMgaW4gaWhyZSBHZXdhbHQga2FtLCBzbyBtYWNodGUgc2llIGVzIHRvZHQsIGtvY2h0ZSBlcyB1bmQgYd8gZXMsIHVuZCBkYXMgd2FyIGlociBlaW4gRmVzdHRhZy4gRGllIEhleGVuIGhhYmVuIHJvdGhlIEF1Z2VuIHVuZCBr9m5uZW4gbmljaHQgd2VpdCBzZWhlbiwgYWJlciBzaWUgaGFiZW4gZWluZSBmZWluZSBXaXR0ZXJ1bmcsIHdpZSBkaWUgVGhpZXJlLCB1bmQgbWVya2VucyB3ZW5uIE1lbnNjaGVuIGhlcmFuIGtvbW1lbi4gQWxzIEjkbnNlbCB1bmQgR3JldGhlbCBpbiBpaHJlIE7kaGUga2FtZW4sIGRhIGxhY2h0ZSBzaWUgYm9zaGFmdCB1bmQgc3ByYWNoIGj2aG5pc2NoICJkaWUgaGFiZSBpY2gsIGRpZSBzb2xsZW4gbWlyIG5pY2h0IHdpZWRlciBlbnR3aXNjaGVuLiIgRnL8aCBNb3JnZW5zIGVoZSBkaWUgS2luZGVyIGVyd2FjaHQgd2FyZW4sIHN0YW5kIHNpZSBzY2hvbiBhdWYsIHVuZCBhbHMgc2llIGJlaWRlIHNvIGxpZWJsaWNoIHJ1aGVuIHNhaCwgbWl0IGRlbiB2b2xsZW4gcm90aGVuIEJhY2tlbiwgc28gbXVybWVsdGUgc2llIHZvciBzaWNoIGhpbiAiZGFzIHdpcmQgZWluIGd1dGVyIEJpc3NlbiB3ZXJkZW4uIiBEYSBwYWNrdGUgc2llIEjkbnNlbCBtaXQgaWhyZXIgZPxycmVuIEhhbmQgdW5kIHRydWcgaWhuIGluIGVpbmVuIGtsZWluZW4gU3RhbGwgdW5kIHNwZXJydGUgaWhuIG1pdCBlaW5lciBHaXR0ZXJ0aPxyZSBlaW47IGVyIG1vY2h0ZSBzY2hyZWllbiB3aWUgZXIgd29sbHRlLCBlcyBoYWxmIGlobSBuaWNodHMuIERhbm4gZ2llbmcgc2llIHp1ciBHcmV0aGVsLCBy/HR0ZWx0ZSBzaWUgd2FjaCB1bmQgcmllZiAic3RlaCBhdWYsIEZhdWxsZW56ZXJpbiwgdHJhZyBXYXNzZXIgdW5kIGtvY2ggZGVpbmVtIEJydWRlciBldHdhcyBndXRlcywgZGVyIHNpdHp0IGRyYXXfZW4gaW0gU3RhbGwgdW5kIHNvbGwgZmV0dCB3ZXJkZW4uIFdlbm4gZXIgZmV0dCBpc3QsIHNvIHdpbGwgaWNoIGlobiBlc3Nlbi4iIEdyZXRoZWwgZmllbmcgYW4gYml0dGVybGljaCB6dSB3ZWluZW4sIGFiZXIgZXMgd2FyIGFsbGVzIHZlcmdlYmxpY2gsIHNpZSBtdd90ZSB0aHVuIHdhcyBkaWUgYvZzZSBIZXhlIHZlcmxhbmd0ZS4NCi0NCi1OdW4gd2FyZCBkZW0gYXJtZW4gSORuc2VsIGRhcyBiZXN0ZSBFc3NlbiBnZWtvY2h0LCBhYmVyIEdyZXRoZWwgYmVrYW0gbmljaHRzIGFscyBLcmVic3NjaGFsZW4uIEplZGVuIE1vcmdlbiBzY2hsaWNoIGRpZSBBbHRlIHp1IGRlbSBTdORsbGNoZW4gdW5kIHJpZWYgIkjkbnNlbCwgc3RyZWNrIGRlaW5lIEZpbmdlciBoZXJhdXMsIGRhbWl0IGljaCBm/GhsZSBvYiBkdSBiYWxkIGZldHQgYmlzdC4iIEjkbnNlbCBzdHJlY2t0ZSBpaHIgYWJlciBlaW4gS272Y2hsZWluIGhlcmF1cywgdW5kIGRpZSBBbHRlLCBkaWUgdHL8YmUgQXVnZW4gaGF0dGUsIGtvbm50ZSBlcyBuaWNodCBzZWhlbiwgdW5kIG1laW50ZSBlcyB35HJlbiBI5G5zZWxzIEZpbmdlciwgdW5kIHZlcnd1bmRlcnRlIHNpY2ggZGHfIGVyIGdhciBuaWNodCBmZXR0IHdlcmRlbiB3b2xsdGUuIEFscyB2aWVyIFdvY2hlbiBoZXJ1bSB3YXJlbiB1bmQgSORuc2VsIGltbWVyIG1hZ2VyIGJsaWViLCBkYSD8YmVybmFobSBzaWUgZGllIFVuZ2VkdWxkLCB1bmQgc2llIHdvbGx0ZSBuaWNodCBs5G5nZXIgd2FydGVuLiAiSGVkYSwgR3JldGhlbCwiIHJpZWYgc2llIGRlbSBN5GRjaGVuIHp1LCAic2VpIGZsaW5rIHVuZCB0cmFnIFdhc3NlcjogSORuc2VsIG1hZyBmZXR0IG9kZXIgbWFnZXIgc2VpbiwgbW9yZ2VuIHdpbGwgaWNoIGlobiBzY2hsYWNodGVuIHVuZCBrb2NoZW4uIiBBY2gsIHdpZSBqYW1tZXJ0ZSBkYXMgYXJtZSBTY2h3ZXN0ZXJjaGVuLCBhbHMgZXMgZGFzIFdhc3NlciB0cmFnZW4gbXXfdGUsIHVuZCB3aWUgZmxvc3NlbiBpaG0gZGllIFRocuRuZW4g/GJlciBkaWUgQmFja2VuIGhlcnVudGVyISAiTGllYmVyIEdvdHQsIGhpbGYgdW5zIGRvY2gsIiByaWVmIHNpZSBhdXMsICJo5HR0ZW4gdW5zIG51ciBkaWUgd2lsZGVuIFRoaWVyZSBpbSBXYWxkIGdlZnJlc3Nlbiwgc28gd+RyZW4gd2lyIGRvY2ggenVzYW1tZW4gZ2VzdG9yYmVuLiIgIlNwYXIgbnVyIGRlaW4gR2VibORycmUsIiBzYWd0ZSBkaWUgQWx0ZSwgImVzIGhpbGZ0IGRpciBhbGxlcyBuaWNodHMuIg0KLQ0KLUZy/GggTW9yZ2VucyBtdd90ZSBHcmV0aGVsIGhlcmF1cywgZGVuIEtlc3NlbCBtaXQgV2Fzc2VyIGF1ZmjkbmdlbiB1bmQgRmV1ZXIgYW56/G5kZW4uICJFcnN0IHdvbGxlbiB3aXIgYmFja2VuIiBzYWd0ZSBkaWUgQWx0ZSwgImljaCBoYWJlIGRlbiBCYWNrb2ZlbiBzY2hvbiBlaW5nZWhlaXp0IHVuZCBkZW4gVGVpZyBnZWtu5HRldC4iIFNpZSBzdGll3yBkYXMgYXJtZSBHcmV0aGVsIGhpbmF1cyB6dSBkZW0gQmFja29mZW4sIGF1cyBkZW0gZGllIEZldWVyZmxhbW1lbiBzY2hvbiBoZXJhdXMgc2NobHVnZW4uICJLcmllY2ggaGluZWluLCIgc2FndGUgZGllIEhleGUsICJ1bmQgc2llaCB6dSBvYiByZWNodCBlaW5nZWhlaXp0IGlzdCwgZGFtaXQgd2lyIGRhcyBCcm90IGhpbmVpbnNjaGllYmVuIGv2bm5lbi4iIFVuZCB3ZW5uIEdyZXRoZWwgZGFyaW4gd2FyLCB3b2xsdGUgc2llIGRlbiBPZmVuIHp1bWFjaGVuLCB1bmQgR3JldGhlbCBzb2xsdGUgZGFyaW4gYnJhdGVuLCB1bmQgZGFubiB3b2xsdGUgc2llcyBhdWNoIGF1ZmVzc2VuLiBBYmVyIEdyZXRoZWwgbWVya3RlIHdhcyBzaWUgaW0gU2lubiBoYXR0ZSB1bmQgc3ByYWNoICJpY2ggd2Vp3yBuaWNodCB3aWUgaWNocyBtYWNoZW4gc29sbDsgd2llIGtvbW0gaWNoIGRhIGhpbmVpbj8iICJEdW1tZSBHYW5zLCIgc2FndGUgZGllIEFsdGUsICJkaWUg1mZmbnVuZyBpc3QgZ3Jv3yBnZW51Zywgc2llaHN0IGR1IHdvaGwsIGljaCBr9m5udGUgc2VsYnN0IGhpbmVpbiwiIGtyYXBwZWx0ZSBoZXJhbiB1bmQgc3RlY2t0ZSBkZW4gS29wZiBpbiBkZW4gQmFja29mZW4uIERhIGdhYiBpaHIgR3JldGhlbCBlaW5lbiBTdG/fIGRh3yBzaWUgd2VpdCBoaW5laW4gZnVociwgbWFjaHRlIGRpZSBlaXNlcm5lIFRo/HIgenUgdW5kIHNjaG9iIGRlbiBSaWVnZWwgdm9yLiBIdSEgZGEgZmllbmcgc2llIGFuIHp1IGhldWxlbiwgZ2FueiBncmF1c2VsaWNoOyBhYmVyIEdyZXRoZWwgbGllZiBmb3J0LCB1bmQgZGllIGdvdHRsb3NlIEhleGUgbXXfdGUgZWxlbmRpZ2xpY2ggdmVyYnJlbm5lbi4NCi0NCi1HcmV0aGVsIGFiZXIgbGllZiBzY2hudXJzdHJhY2tzIHp1bSBI5G5zZWwsIPZmZm5ldGUgc2VpbiBTdORsbGNoZW4gdW5kIHJpZWYgIkjkbnNlbCwgd2lyIHNpbmQgZXJs9nN0LCBkaWUgYWx0ZSBIZXhlIGlzdCB0b2R0LiIgRGEgc3ByYW5nIEjkbnNlbCBoZXJhdXMsIHdpZSBlaW4gVm9nZWwgYXVzIGRlbSBL5GZpZywgd2VubiBpaG0gZGllIFRo/HJlIGF1ZmdlbWFjaHQgd2lyZC4gV2llIGhhYmVuIHNpZSBzaWNoIGdlZnJldXQsIHNpbmQgc2ljaCB1bSBkZW4gSGFscyBnZWZhbGxlbiwgc2luZCBoZXJ1bWdlc3BydW5nZW4gdW5kIGhhYmVuIHNpY2ggZ2Vr/N90ISBVbmQgd2VpbCBzaWUgc2ljaCBuaWNodCBtZWhyIHp1IGb8cmNodGVuIGJyYXVjaHRlbiwgc28gZ2llbmdlbiBzaWUgaW4gZGFzIEhhdXMgZGVyIEhleGUgaGluZWluLCBkYSBzdGFuZGVuIGluIGFsbGVuIEVja2VuIEthc3RlbiBtaXQgUGVybGVuIHVuZCBFZGVsc3RlaW5lbi4gIkRpZSBzaW5kIG5vY2ggYmVzc2VyIGFscyBLaWVzZWxzdGVpbmUiIHNhZ3RlIEjkbnNlbCB1bmQgc3RlY2t0ZSBpbiBzZWluZSBUYXNjaGVuIHdhcyBoaW5laW4gd29sbHRlLCB1bmQgR3JldGhlbCBzYWd0ZSAiaWNoIHdpbGwgYXVjaCBldHdhcyBtaXQgbmFjaCBIYXVzIGJyaW5nZW4iIHVuZCBm/GxsdGUgc2ljaCBzZWluIFNjaPxyemNoZW4gdm9sbC4gIkFiZXIgamV0enQgd29sbGVuIHdpciBmb3J0LCIgc2FndGUgSORuc2VsLCAiZGFtaXQgd2lyIGF1cyBkZW0gSGV4ZW53YWxkIGhlcmF1c2tvbW1lbi4iIEFscyBzaWUgYWJlciBlaW4gcGFhciBTdHVuZGVuIGdlZ2FuZ2VuIHdhcmVuLCBnZWxhbmd0ZW4gc2llIGFuIGVpbiBncm/fZXMgV2Fzc2VyLiAiV2lyIGv2bm5lbiBuaWNodCBoaW78YmVyLCIgc3ByYWNoIEjkbnNlbCwgImljaCBzZWhlIGtlaW5lbiBTdGVnIHVuZCBrZWluZSBCcvxja2UuIiAiSGllciBm5GhydCBhdWNoIGtlaW4gU2NoaWZmY2hlbiwiIGFudHdvcnRldGUgR3JldGhlbCwgImFiZXIgZGEgc2Nod2ltbXQgZWluZSB3ZWnfZSBFbnRlLCB3ZW5uIGljaCBkaWUgYml0dGUsIHNvIGhpbGZ0IHNpZSB1bnMgaGlu/GJlci4iIERhIHJpZWYgc2llDQotDQotIkVudGNoZW4sIEVudGNoZW4sDQotZGEgc3RlaHQgR3JldGhlbCB1bmQgSORuc2VsLg0KLUtlaW4gU3RlZyB1bmQga2VpbmUgQnL8Y2tlLA0KLW5pbW0gdW5zIGF1ZiBkZWluZW4gd2Vp32VuIFL8Y2tlbi4iDQotDQotRGFzIEVudGNoZW4ga2FtIGF1Y2ggaGVyYW4sIHVuZCBI5G5zZWwgc2V0enRlIHNpY2ggYXVmIHVuZCBiYXQgc2VpbiBTY2h3ZXN0ZXJjaGVuIHNpY2ggenUgaWhtIHp1IHNldHplbi4gIk5laW4sIiBhbnR3b3J0ZXRlIEdyZXRoZWwsICJlcyB3aXJkIGRlbSBFbnRjaGVuIHp1IHNjaHdlciwgZXMgc29sbCB1bnMgbmFjaCBlaW5hbmRlciBoaW78YmVyIGJyaW5nZW4uIiBEYXMgdGhhdCBkYXMgZ3V0ZSBUaGllcmNoZW4sIHVuZCBhbHMgc2llIGds/GNrbGljaCBkcvxiZW4gd2FyZW4gdW5kIGVpbiBXZWlsY2hlbiBmb3J0Z2llbmdlbiwgZGEga2FtIGlobmVuIGRlciBXYWxkIGltbWVyIGJla2FubnRlciB1bmQgaW1tZXIgYmVrYW5udGVyIHZvciwgdW5kIGVuZGxpY2ggZXJibGlja3RlbiBzaWUgdm9uIHdlaXRlbSBpaHJlcyBWYXRlcnMgSGF1cy4gRGEgZmllbmdlbiBzaWUgYW4genUgbGF1ZmVuLCBzdPxyenRlbiBpbiBkaWUgU3R1YmUgaGluZWluIHVuZCBmaWVsZW4gaWhyZW0gVmF0ZXIgdW0gZGVuIEhhbHMuIERlciBNYW5uIGhhdHRlIGtlaW5lIGZyb2hlIFN0dW5kZSBnZWhhYnQsIHNlaXRkZW0gZXIgZGllIEtpbmRlciBpbSBXYWxkZSBnZWxhc3NlbiBoYXR0ZSwgZGllIEZyYXUgYWJlciB3YXIgZ2VzdG9yYmVuLiBHcmV0aGVsIHNjaPx0dGV0ZSBzZWluIFNjaPxyemNoZW4gYXVzIGRh3yBkaWUgUGVybGVuIHVuZCBFZGVsc3RlaW5lIGluIGRlciBTdHViZSBoZXJ1bXNwcmFuZ2VuLCB1bmQgSORuc2VsIHdhcmYgZWluZSBIYW5kdm9sbCBuYWNoIGRlciBhbmRlcm4gYXVzIHNlaW5lciBUYXNjaGUgZGF6dS4gRGEgaGF0dGVuIGFsbGUgU29yZ2VuIGVpbiBFbmRlLCB1bmQgc2llIGxlYnRlbiBpbiBsYXV0ZXIgRnJldWRlIHp1c2FtbWVuLiBNZWluIE3kcmNoZW4gaXN0IGF1cywgZG9ydCBsYXVmdCBlaW5lIE1hdXMsIHdlciBzaWUgZuRuZ3QsIGRhcmYgc2ljaCBlaW5lIGdyb99lIGdyb99lIFBlbHprYXBwZSBkYXJhdXMgbWFjaGVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXV0aWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNWFlYzEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jIA0KLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jIA0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotIyBzYW1wbGUgbG9nNGoucHJvcGVydGllcw0KLQ0KLWxvZzRqLnJvb3RDYXRlZ29yeT1XQVJOLCBSLCBPDQotDQotIyBTdGRvdXQNCi1sb2c0ai5hcHBlbmRlci5PPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotDQotIyBGaWxlDQotbG9nNGouYXBwZW5kZXIuUj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5SLkZpbGU9bG9nNGoubG9nDQotDQotIyBDb250cm9sIHRoZSBtYXhpbXVtIGxvZyBmaWxlIHNpemUNCi1sb2c0ai5hcHBlbmRlci5SLk1heEZpbGVTaXplPTEwMEtCDQotDQotIyBBcmNoaXZlIGxvZyBmaWxlcyAob25lIGJhY2t1cCBmaWxlIGhlcmUpDQotbG9nNGouYXBwZW5kZXIuUi5NYXhCYWNrdXBJbmRleD0wDQotbG9nNGouYXBwZW5kZXIuUi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuTy5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotIyBsb2c0ai5hcHBlbmRlci5SLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwIFsldF0gJWM6ICVtJW4NCi0jIGxvZzRqLmFwcGVuZGVyLk8ubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXAgWyV0XSAlYzogJW0lbg0KLWxvZzRqLmFwcGVuZGVyLlIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVke0lTTzg2MDF9ICUtNXA6ICVtJW4NCi1sb2c0ai5hcHBlbmRlci5PLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwOiAlbSVuDQotDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnV0aWw9V0FSTgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9wb20ueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODZjMWUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC4xMy4wPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2g8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+T3BlbkNNSVMgV29ya2JlbmNoPC9uYW1lPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHBhcmVudEJhc2VkaXI+Li4vLi4vPC9wYXJlbnRCYXNlZGlyPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTU8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4ke21hdmVuLmNvbXBpbGUudGFyZ2V0fTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7bWF2ZW4uY29tcGlsZS5zb3VyY2V9PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphci1uby1mb3JrPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZVBvbT50cnVlPC9pbmNsdWRlUG9tPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KLSAgICAgICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke21hdmVuLnZlcnNpb259IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRpbWVzdGFtcCIgdmFsdWU9IiR7dGltZXN0YW1wfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXZpc2lvbiIgdmFsdWU9IiR7YnVpbGROdW1iZXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhc2VkaXIiIHZhbHVlPSIke21hdmVuLmJhc2VkaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldGRpciIgdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndvcmtiZW5jaC5qYXIiIHZhbHVlPSIke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LiR7cHJvamVjdC5wYWNrYWdpbmd9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGJ1aWxkIHRpbWVzdGFtcCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvIGZpbGU9IiR7dGFyZ2V0ZGlyfS9nZW5lcmF0ZWQtcmVzb3VyY2VzL01FVEEtSU5GL2J1aWxkLXRpbWVzdGFtcC50eHQiPlZlcnNpb246ICR7cHJvamVjdC52ZXJzaW9ufSAvIFJldmlzaW9uOiAke3JldmlzaW9ufSAvIEJ1aWxkOiAke3RpbWVzdGFtcH08L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc3RhcnQgc2NyaXB0cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0ZGlyfS9zdGFydCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke3RhcmdldGRpcn0vc3RhcnQiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NyYy9tYWluL3N0YXJ0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcGxhY2UgZGlyPSIke3RhcmdldGRpcn0vc3RhcnQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlZmlsdGVyIHRva2VuPSJAd29ya2JlbmNoLmphckAiIHZhbHVlPSIke3dvcmtiZW5jaC5qYXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlZmlsdGVyIHRva2VuPSJAdmVyc2lvbkAiIHZhbHVlPSJWZXJzaW9uOiAke3Byb2plY3QudmVyc2lvbn0gLyBSZXZpc2lvbjogJHtyZXZpc2lvbn0gLyBCdWlsZDogJHt0aW1lc3RhbXB9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlZmlsdGVyIHRva2VuPSJAdmVyc2lvbm51bWJlckAiIHZhbHVlPSIke3Byb2plY3QudmVyc2lvbn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlcGxhY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2htb2QgZGlyPSIke3RhcmdldGRpcn0vc3RhcnQiIHBlcm09Iit4IiBpbmNsdWRlcz0iKiovKi5zaCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVjbGlwc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGRvd25sb2FkU291cmNlcz50cnVlPC9kb3dubG9hZFNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkb3dubG9hZEphdmFkb2NzPnRydWU8L2Rvd25sb2FkSmF2YWRvY3M+Ci0gICAgICAgICAgICAgICAgICAgIDx3b3Jrc3BhY2U+Ljwvd29ya3NwYWNlPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRNYXZlbkRlc2NyaXB0b3I+ZmFsc2U8L2FkZE1hdmVuRGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5Xb3JrYmVuY2g8L21haW5DbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkQ2xhc3NwYXRoPnRydWU8L2FkZENsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoUHJlZml4IC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WC1Db21waWxlLVNvdXJjZS1KREs+JHttYXZlbi5jb21waWxlLnNvdXJjZX08L1gtQ29tcGlsZS1Tb3VyY2UtSkRLPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxYLUNvbXBpbGUtVGFyZ2V0LUpESz4ke21hdmVuLmNvbXBpbGUudGFyZ2V0fTwvWC1Db21waWxlLVRhcmdldC1KREs+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cGFjay13b3JrYmVuY2g8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXR0YWNoPnRydWU8L2F0dGFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3dvcmtiZW5jaC1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3dvcmtiZW5jaC1yaS1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3dvcmtiZW5jaC1jeGYtYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXhpczItYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFjLXdvcmtiZW5jaDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRhY2g+dHJ1ZTwvYXR0YWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+Q01JUyBXb3JrYmVuY2ggJHtwcm9qZWN0LnZlcnNpb259LmFwcDwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL21haW4vYXNzZW1ibHkvd29ya2JlbmNoLW1hYy1hc3NlbWJseS54bWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qby53ZWJzdGFydDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53ZWJzdGFydC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWJldGEtMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qbmxwLWlubGluZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGxpYlBhdGg+bGliPC9saWJQYXRoPgotICAgICAgICAgICAgICAgICAgICA8am5scD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLldvcmtiZW5jaDwvbWFpbkNsYXNzPgotICAgICAgICAgICAgICAgICAgICA8L2pubHA+Ci0gICAgICAgICAgICAgICAgICAgIDxwYWNrMjAwPnRydWU8L3BhY2syMDA+Ci0gICAgICAgICAgICAgICAgICAgIDxnemlwPnRydWU8L2d6aXA+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHNpZ24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8a2V5c3RvcmU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0va2V5c3RvcmU8L2tleXN0b3JlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGtleXBhc3M+cGFzc3dvcmQ8L2tleXBhc3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcmVwYXNzPnBhc3N3b3JkPC9zdG9yZXBhc3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YWxpYXM+d2Vic3RhcnQ8L2FsaWFzPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8dmFsaWRpdHk+MzY1PC92YWxpZGl0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkbmFtZUNuPk9wZW5DTUlTIERldmVsb3BtZW50IFRlYW08L2RuYW1lQ24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZG5hbWVPdT5BcGFjaGUgQ2hlbWlzdHJ5IE9wZW5DTUlTPC9kbmFtZU91PgotICAgICAgICAgICAgICAgICAgICAgICAgPGRuYW1lTz5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2RuYW1lTz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcmlmeT50cnVlPC92ZXJpZnk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxrZXlzdG9yZUNvbmZpZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlPnRydWU8L2RlbGV0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2VuPnRydWU8L2dlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwva2V5c3RvcmVDb25maWc+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2lnbj4KLQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdGNrPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdyb292eTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyb292eS1hbGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjQuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3NsZjRqLnZlcnNpb259PC92ZXJzaW9uPiAgICAgICAgICAKLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS56eGluZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmFzZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8IS0tIFN1biBSSSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQubWltZXB1bGw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5taW1lcHVsbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWltZXB1bGwudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+IAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLndzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4d3MtcnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2pheHdzLXJ0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+IDwhLS0gaW5jbHVkZWQgaW4gSmF2YSA2IGFuZCBhYm92ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLnN0cmVhbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4gPCEtLSBpbmNsdWRlZCBpbiBKYXZhIDYgYW5kIGFib3ZlIC0tPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4JIAotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53c3R4LWFzbDwvYXJ0aWZhY3RJZD4JIAotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4JIAotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4JIAotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgkgCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4JIAotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQ8L2dyb3VwSWQ+CSAKLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWltZXB1bGw8L2FydGlmYWN0SWQ+CSAKLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4JIAotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gQ1hGIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3hmPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3hmLXJ0LWZyb250ZW5kLWpheHdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjeGYudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jeGY8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jeGYtcnQtdHJhbnNwb3J0cy1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjeGYudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jeGY8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jeGYtcnQtd3MtcG9saWN5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtjeGYudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwhLS0gQXhpczIgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWpheHdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtheGlzMi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtheGlzMi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtheGlzMi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbXRvbXBvbGljeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7YXhpczIudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotCSAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPgotCSAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotCSAgICAgICAgPHZlcnNpb24+MS42LjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLQotICAgIDwhLS0KLSAgICAgICAgRXh0ZW5kaW5nIHRoZSBkZWZhdWx0IC1QYXBhY2hlLXJlbGVhc2UgcHJvZmlsZSB1c2VkICpvbmx5KgotICAgICAgICBkdXJpbmcgcmVsZWFzZXMKLSAgICAtLT4KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgIDxpZD5hcGFjaGUtcmVsZWFzZTwvaWQ+Ci0gICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgotICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wYWNrLXdvcmtiZW5jaDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRhY2g+dHJ1ZTwvYXR0YWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL21haW4vYXNzZW1ibHkvd29ya2JlbmNoLWFzc2VtYmx5LnhtbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgPC9wcm9maWxlPgotICAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHktbGljZW5zZS50eHQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vYXNzZW1ibHkvd29ya2JlbmNoLWFzc2VtYmx5LWxpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjYzMTYwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHktbGljZW5zZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3MjYgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBHcm9vdnkgKGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnLykKLSAgTGljZW5zZTogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQpCi0tIFpYaW5nIENvcmUgKGh0dHA6Ly9uZXh1cy5zb25hdHlwZS5vcmcvb3NzLXJlcG9zaXRvcnktaG9zdGluZy5odG1sL2NvcmUpCi0gIExpY2Vuc2U6IFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAgIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0KQotLSBaWGluZyBKYXZhIFNFIGV4dGVuc2lvbnMgKGh0dHA6Ly9uZXh1cy5zb25hdHlwZS5vcmcvb3NzLXJlcG9zaXRvcnktaG9zdGluZy5odG1sL2phdmFzZSkKLSAgTGljZW5zZTogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQpCi0KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gV29vZHN0b3ggKGh0dHA6Ly93b29kc3RveC5jb2RlaGF1cy5vcmcpCi0gIExpY2Vuc2U6IFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAgIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0KQotCi0KLVRoaXMgY29weSBvZiBXb29kc3RveCBYTUwgcHJvY2Vzc29yIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQotQXBhY2hlIChTb2Z0d2FyZSkgTGljZW5zZSwgdmVyc2lvbiAyLjAgKCJ0aGUgTGljZW5zZSIpLgotU2VlIHRoZSBMaWNlbnNlIGZvciBkZXRhaWxzIGFib3V0IGRpc3RyaWJ1dGlvbiByaWdodHMsIGFuZCB0aGUKLXNwZWNpZmljIHJpZ2h0cyByZWdhcmRpbmcgZGVyaXZhdGUgd29ya3MuCi0KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi1BIGNvcHkgaXMgYWxzbyBpbmNsdWRlZCB3aXRoIGJvdGggdGhlIHRoZSBkb3dubG9hZGFibGUgc291cmNlIGNvZGUgcGFja2FnZQotYW5kIGphciB0aGF0IGNvbnRhaW5zIGNsYXNzIGJ5dGVjb2RlcywgYXMgZmlsZSAiQVNMIDIuMCIuIEluIGJvdGggY2FzZXMsCi10aGF0IGZpbGUgc2hvdWxkIGJlIGxvY2F0ZWQgbmV4dCB0byB0aGlzIGZpbGU6IGluIHNvdXJjZSBkaXN0cmlidXRpb24KLXRoZSBsb2NhdGlvbiBzaG91bGQgYmUgInJlbGVhc2Utbm90ZXMvYXNsIjsgYW5kIGluIGphciAiTUVUQS1JTkYvIgotCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIFN0YXgyIEFQSSAoaHR0cDovL3dvb2RzdG94LmNvZGVoYXVzLm9yZy9TdEFYMikKLSAgTGljZW5zZTogVGhlIEJTRCBMaWNlbnNlICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHApCi0KLQotQ29weXJpZ2h0IChjKSAyMDA0LTIwMTAsIFdvb2RzdG94IFByb2plY3QgKGh0dHA6Ly93b29kc3RveC5jb2RlaGF1cy5vcmcvKQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLTIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgV29vZHN0b3ggWE1MIFByb2Nlc3NvciBub3IgdGhlIG5hbWVzCi0gICBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLUFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLVNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLUNPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi1BUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gU3RyZWFtaW5nIEFQSSBmb3IgWE1MIChodHRwOi8vc3RheC5jb2RlaGF1cy5vcmcpCi0gIExpY2Vuc2U6IER1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MiAgKGh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbCkKLQotCi0gICAgICBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotCi0gICAgICAxLiBEZWZpbml0aW9ucy4KLSAgICAgICAgICAgIDEuMS4gIkNvbnRyaWJ1dG9yIiBtZWFucyBlYWNoIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQKLSAgICAgICAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0gICAgICAgICAgICAxLjIuICJDb250cmlidXRvciBWZXJzaW9uIiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlCi0gICAgICAgICAgICBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEKLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0Ci0gICAgICAgICAgICBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotICAgICAgICAgICAgMS4zLiAiQ292ZXJlZCBTb2Z0d2FyZSIgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IKLSAgICAgICAgICAgIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzCi0gICAgICAgICAgICBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggZmlsZXMgY29udGFpbmluZwotICAgICAgICAgICAgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotICAgICAgICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0KLSAgICAgICAgICAgIG90aGVyIHRoYW4gU291cmNlIENvZGUuIAotICAgICAgICAgICAgMS41LiAiSW5pdGlhbCBEZXZlbG9wZXIiIG1lYW5zIHRoZSBpbmRpdmlkdWFsIG9yIGVudGl0eQotICAgICAgICAgICAgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcwotICAgICAgICAgICAgTGljZW5zZS4gCi0gICAgICAgICAgICAxLjYuICJMYXJnZXIgV29yayIgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQKLSAgICAgICAgICAgIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUKLSAgICAgICAgICAgIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLSAgICAgICAgICAgIDEuNy4gIkxpY2Vuc2UiIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0gICAgICAgICAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUKLSAgICAgICAgICAgIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsCi0gICAgICAgICAgICBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMKLSAgICAgICAgICAgIGNvbnZleWVkIGhlcmVpbi4KLSAgICAgICAgICAgIDEuOS4gIk1vZGlmaWNhdGlvbnMiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZQotICAgICAgICAgICAgZm9ybSBvZiBhbnkgb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywKLSAgICAgICAgICAgICAgICAgIGRlbGV0aW9uIGZyb20gb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBhCi0gICAgICAgICAgICAgICAgICBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMKLSAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IAotICAgICAgICAgICAgICAgICAgQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yIAotICAgICAgICAgICAgICAgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotICAgICAgICAgICAgMS4xMC4gIk9yaWdpbmFsIFNvZnR3YXJlIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kCi0gICAgICAgICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzCi0gICAgICAgICAgICBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4gCi0gICAgICAgICAgICAxLjExLiAiUGF0ZW50IENsYWltcyIgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkCi0gICAgICAgICAgICBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sCi0gICAgICAgICAgICBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50Ci0gICAgICAgICAgICBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuIAotICAgICAgICAgICAgMS4xMi4gIlNvdXJjZSBDb2RlIiBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyCi0gICAgICAgICAgICBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKQotICAgICAgICAgICAgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotICAgICAgICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsCi0gICAgICAgICAgICBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YKLSAgICAgICAgICAgIHRoZSB0ZXJtcyBvZiwgdGhpcyBMaWNlbnNlLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UiCi0gICAgICAgICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcwotICAgICAgICAgICAgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzCi0gICAgICAgICAgICBkZWZpbml0aW9uLCAiY29udHJvbCIgbWVhbnMgKGEpIHRoZSBwb3dlciwgZGlyZWN0IG9yCi0gICAgICAgICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gKLSAgICAgICAgICAgIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAKLSAgICAgICAgICAgIG9mIG1vcmUgdGhhbiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9mIHRoZSBvdXRzdGFuZGluZyBzaGFyZXMKLSAgICAgICAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotICAgICAgMi4gTGljZW5zZSBHcmFudHMuIAotICAgICAgICAgICAgMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZAotICAgICAgICAgICAgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUKLSAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwKLSAgICAgICAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiAKLSAgICAgICAgICAgICAgICAgIChhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuCi0gICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyLAotICAgICAgICAgICAgICAgICAgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwKLSAgICAgICAgICAgICAgICAgIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcgotICAgICAgICAgICAgICAgICAgcG9ydGlvbnMgdGhlcmVvZiksIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLAotICAgICAgICAgICAgICAgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kIAotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsCi0gICAgICAgICAgICAgICAgICB1c2luZyBvciBzZWxsaW5nIG9mIE9yaWdpbmFsIFNvZnR3YXJlLCB0byBtYWtlLCBoYXZlCi0gICAgICAgICAgICAgICAgICBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vcgotICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvcgotICAgICAgICAgICAgICAgICAgcG9ydGlvbnMgdGhlcmVvZikuIAotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpCi0gICAgICAgICAgICAgICAgICBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0Ci0gICAgICAgICAgICAgICAgICBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgTGljZW5zZS4gCi0gICAgICAgICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4xKGIpIGFib3ZlLCBubyBwYXRlbnQKLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tCi0gICAgICAgICAgICAgICAgICB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKSBmb3IgaW5mcmluZ2VtZW50cwotICAgICAgICAgICAgICAgICAgY2F1c2VkIGJ5OiAoaSkgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4gCi0gICAgICAgICAgICAyLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotICAgICAgICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQKLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaAotICAgICAgICAgICAgQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsCi0gICAgICAgICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbgotICAgICAgICAgICAgICAgICAgcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0bwotICAgICAgICAgICAgICAgICAgdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZQotICAgICAgICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbgotICAgICAgICAgICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcwotICAgICAgICAgICAgICAgICAgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLSAgICAgICAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLAotICAgICAgICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQKLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIGVpdGhlciBhbG9uZSBhbmQvb3IgaW4gY29tYmluYXRpb24gd2l0aAotICAgICAgICAgICAgICAgICAgaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2gKLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwKLSAgICAgICAgICAgICAgICAgIGhhdmUgbWFkZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mOiAoMSkKLSAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucwotICAgICAgICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uCi0gICAgICAgICAgICAgICAgICAob3IgcG9ydGlvbnMgb2Ygc3VjaCBjb21iaW5hdGlvbikuIAotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQKLSAgICAgICAgICAgICAgICAgIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0Ci0gICAgICAgICAgICAgICAgICBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LiAKLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjIoYikgYWJvdmUsIG5vIHBhdGVudAotICAgICAgICAgICAgICAgICAgbGljZW5zZSBpcyBncmFudGVkOiAoMSkgZm9yIGFueSBjb2RlIHRoYXQgQ29udHJpYnV0b3IKLSAgICAgICAgICAgICAgICAgIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3IKLSAgICAgICAgICAgICAgICAgIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSkgdGhpcmQgcGFydHkKLSAgICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKSB0aGUKLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yCi0gICAgICAgICAgICAgICAgICB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yICgzKSB1bmRlcgotICAgICAgICAgICAgICAgICAgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgIGFic2VuY2Ugb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IuIAotICAgICAgMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotICAgICAgICAgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuCi0gICAgICAgICAgICBBbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlCi0gICAgICAgICAgICBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbgotICAgICAgICAgICAgU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUKLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QKLSAgICAgICAgICAgIGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yCi0gICAgICAgICAgICBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueQotICAgICAgICAgICAgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4KLSAgICAgICAgICAgIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhCi0gICAgICAgICAgICByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQKLSAgICAgICAgICAgIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLSAgICAgICAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4KLSAgICAgICAgICAgIFRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UKLSAgICAgICAgICAgIGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdQotICAgICAgICAgICAgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyCi0gICAgICAgICAgICBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8KLSAgICAgICAgICAgIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgotICAgICAgICAgICAgMy4zLiBSZXF1aXJlZCBOb3RpY2VzLgotICAgICAgICAgICAgWW91IG11c3QgaW5jbHVkZSBhIG5vdGljZSBpbiBlYWNoIG9mIFlvdXIgTW9kaWZpY2F0aW9ucwotICAgICAgICAgICAgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IKLSAgICAgICAgICAgIHRyYWRlbWFyayBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIENvdmVyZWQgU29mdHdhcmUsIG9yCi0gICAgICAgICAgICBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nCi0gICAgICAgICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotICAgICAgICAgICAgMy40LiBBcHBsaWNhdGlvbiBvZiBBZGRpdGlvbmFsIFRlcm1zLgotICAgICAgICAgICAgWW91IG1heSBub3Qgb2ZmZXIgb3IgaW1wb3NlIGFueSB0ZXJtcyBvbiBhbnkgQ292ZXJlZAotICAgICAgICAgICAgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlCi0gICAgICAgICAgICBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJwotICAgICAgICAgICAgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYQotICAgICAgICAgICAgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkKLSAgICAgICAgICAgIG9ibGlnYXRpb25zIHRvIG9uZSBvciBtb3JlIHJlY2lwaWVudHMgb2YgQ292ZXJlZCBTb2Z0d2FyZS4KLSAgICAgICAgICAgIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24KLSAgICAgICAgICAgIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UKLSAgICAgICAgICAgIG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHN1Y2ggd2FycmFudHksCi0gICAgICAgICAgICBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieQotICAgICAgICAgICAgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwKLSAgICAgICAgICAgIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQKLSAgICAgICAgICAgIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mCi0gICAgICAgICAgICB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0gICAgICAgICAgICAzLjUuIERpc3RyaWJ1dGlvbiBvZiBFeGVjdXRhYmxlIFZlcnNpb25zLgotICAgICAgICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQKLSAgICAgICAgICAgIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zCi0gICAgICAgICAgICBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zCi0gICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbgotICAgICAgICAgICAgY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlCi0gICAgICAgICAgICBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQKLSAgICAgICAgICAgIG9yIGFsdGVyIHRoZSByZWNpcGllbnQncyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0KLSAgICAgICAgICAgIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UKLSAgICAgICAgICAgIGRpc3RyaWJ1dGUgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIHVuZGVyIGEKLSAgICAgICAgICAgIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdAotICAgICAgICAgICAgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UKLSAgICAgICAgICAgIGFsb25lLCBub3QgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yLiBZb3UKLSAgICAgICAgICAgIGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeQotICAgICAgICAgICAgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwKLSAgICAgICAgICAgIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIGFueSBzdWNoIHRlcm1zCi0gICAgICAgICAgICBZb3Ugb2ZmZXIuCi0gICAgICAgICAgICAzLjYuIExhcmdlciBXb3Jrcy4KLSAgICAgICAgICAgIFlvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUKLSAgICAgICAgICAgIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQotICAgICAgICAgICAgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2gKLSAgICAgICAgICAgIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlCi0gICAgICAgICAgICBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gCi0gICAgICA0LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4gCi0gICAgICAgICAgICA0LjEuIE5ldyBWZXJzaW9ucy4KLSAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZAotICAgICAgICAgICAgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZQotICAgICAgICAgICAgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEKLSAgICAgICAgICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4KLSAgICAgICAgICAgIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUKLSAgICAgICAgICAgIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIExpY2Vuc2UuIAotICAgICAgICAgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotICAgICAgICAgICAgWW91IG1heSBhbHdheXMgY29udGludWUgdG8gdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZQotICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZAotICAgICAgICAgICAgdGhlIENvdmVyZWQgU29mdHdhcmUuIElmIHRoZSBJbml0aWFsIERldmVsb3BlciBpbmNsdWRlcyBhCi0gICAgICAgICAgICBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcKLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkKLSAgICAgICAgICAgIHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSwgWW91IG11c3QgZGlzdHJpYnV0ZSBhbmQKLSAgICAgICAgICAgIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQKLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBPdGhlcndpc2UsIFlvdSBtYXkgYWxzbyBjaG9vc2UgdG8KLSAgICAgICAgICAgIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZQotICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZQotICAgICAgICAgICAgTGljZW5zZSBwdWJsaXNoZWQgYnkgdGhlIGxpY2Vuc2Ugc3Rld2FyZC4gCi0gICAgICAgICAgICA0LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotICAgICAgICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYQotICAgICAgICAgICAgbmV3IGxpY2Vuc2UgZm9yIFlvdXIgT3JpZ2luYWwgU29mdHdhcmUsIFlvdSBtYXkgY3JlYXRlIGFuZAotICAgICAgICAgICAgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSkgcmVuYW1lCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZQotICAgICAgICAgICAgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMKLSAgICAgICAgICAgIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKSBvdGhlcndpc2UgbWFrZSBpdCBjbGVhciB0aGF0Ci0gICAgICAgICAgICB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0gICAgICA1LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIgotICAgICAgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwKLSAgICAgIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQKLSAgICAgIFNPRlRXQVJFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUgotICAgICAgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORAotICAgICAgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkKLSAgICAgIENPVkVSRUQgU09GVFdBUkUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUKLSAgICAgIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GCi0gICAgICBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRgotICAgICAgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YKLSAgICAgIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTCi0gICAgICBESVNDTEFJTUVSLiAKLSAgICAgIDYuIFRFUk1JTkFUSU9OLiAKLSAgICAgICAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwKLSAgICAgICAgICAgIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zCi0gICAgICAgICAgICBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZgotICAgICAgICAgICAgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIKLSAgICAgICAgICAgIG5hdHVyZSwgbXVzdCByZW1haW4gaW4gZWZmZWN0IGJleW9uZCB0aGUgdGVybWluYXRpb24gb2YKLSAgICAgICAgICAgIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotICAgICAgICAgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nCi0gICAgICAgICAgICBkZWNsYXJhdG9yeSBqdWRnbWVudCBhY3Rpb25zKSBhZ2FpbnN0IEluaXRpYWwgRGV2ZWxvcGVyIG9yCi0gICAgICAgICAgICBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdAotICAgICAgICAgICAgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikKLSAgICAgICAgICAgIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZQotICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbiB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgYSBDb250cmlidXRvcgotICAgICAgICAgICAgb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUKLSAgICAgICAgICAgIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkKLSAgICAgICAgICAgIHBhdGVudCwgdGhlbiBhbnkgYW5kIGFsbCByaWdodHMgZ3JhbnRlZCBkaXJlY3RseSBvcgotICAgICAgICAgICAgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwKLSAgICAgICAgICAgIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpCi0gICAgICAgICAgICBhbmQgYWxsIENvbnRyaWJ1dG9ycyB1bmRlciBTZWN0aW9ucyAyLjEgYW5kL29yIDIuMiBvZiB0aGlzCi0gICAgICAgICAgICBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQKLSAgICAgICAgICAgIHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGF0IHRoZSBleHBpcmF0aW9uCi0gICAgICAgICAgICBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5Ci0gICAgICAgICAgICBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQotICAgICAgICAgICAgUGFydGljaXBhbnQgU29mdHdhcmUgYWdhaW5zdCBzdWNoIFBhcnRpY2lwYW50IGVpdGhlcgotICAgICAgICAgICAgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aAotICAgICAgICAgICAgUGFydGljaXBhbnQuCi0gICAgICAgICAgICA2LjMuIEluIHRoZSBldmVudCBvZiB0ZXJtaW5hdGlvbiB1bmRlciBTZWN0aW9ucyA2LjEgb3IgNi4yCi0gICAgICAgICAgICBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZAotICAgICAgICAgICAgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24KLSAgICAgICAgICAgIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKQotICAgICAgICAgICAgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLSAgICAgIDcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLgotICAgICAgVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQKLSAgICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFCi0gICAgICBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YKLSAgICAgIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRQotICAgICAgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IKLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVAotICAgICAgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLCi0gICAgICBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIKLSAgICAgIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4KLSAgICAgIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRgotICAgICAgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMCi0gICAgICBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWSdTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVAotICAgICAgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPCi0gICAgICBOT1QgQUxMT1cgVEhFIEVYQ0xVU0lPTiBPUiBMSU1JVEFUSU9OIE9GIElOQ0lERU5UQUwgT1IKLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVAotICAgICAgQVBQTFkgVE8gWU9VLgotICAgICAgOC4gVS5TLiBHT1ZFUk5NRU5UIEVORCBVU0VSUy4KLSAgICAgIFRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcwotICAgICAgZGVmaW5lZCBpbiA0OCBDLkYuUi4gMi4xMDEgKE9jdC4gMTk5NSksIGNvbnNpc3Rpbmcgb2YgImNvbW1lcmNpYWwKLSAgICAgIGNvbXB1dGVyIHNvZnR3YXJlIiAoYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgYXQgNDggQy5GLlIuIMKkCi0gICAgICAyNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCAiY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZQotICAgICAgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LgotICAgICAgMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMQotICAgICAgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycwotICAgICAgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4KLSAgICAgIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsCi0gICAgICBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzCi0gICAgICBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuCi0gICAgICA5LiBNSVNDRUxMQU5FT1VTLgotICAgICAgVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QKLSAgICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUKLSAgICAgIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlCi0gICAgICBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZQotICAgICAgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZQotICAgICAgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50Ci0gICAgICBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaAotICAgICAganVyaXNkaWN0aW9uJ3MgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uCi0gICAgICByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mCi0gICAgICB0aGUgY291cnRzIGxvY2F0ZWQgaW4gdGhlIGp1cmlzZGljdGlvbiBhbmQgdmVudWUgc3BlY2lmaWVkIGluIGEKLSAgICAgIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nCi0gICAgICBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydAotICAgICAgY29zdHMgYW5kIHJlYXNvbmFibGUgYXR0b3JuZXlzJyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlCi0gICAgICBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQotICAgICAgSW50ZXJuYXRpb25hbCBTYWxlIG9mIEdvb2RzIGlzIGV4cHJlc3NseSBleGNsdWRlZC4gQW55IGxhdyBvcgotICAgICAgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsCi0gICAgICBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLgotICAgICAgWW91IGFncmVlIHRoYXQgWW91IGFsb25lIGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZSB3aXRoIHRoZQotICAgICAgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0Ci0gICAgICBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLAotICAgICAgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IENvdmVyZWQgU29mdHdhcmUuCi0gICAgICAxMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLSAgICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMKLSAgICAgIHJlc3BvbnNpYmxlIGZvciBjbGFpbXMgYW5kIGRhbWFnZXMgYXJpc2luZywgZGlyZWN0bHkgb3IKLSAgICAgIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZQotICAgICAgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0bwotICAgICAgZGlzdHJpYnV0ZSBzdWNoIHJlc3BvbnNpYmlsaXR5IG9uIGFuIGVxdWl0YWJsZSBiYXNpcy4gTm90aGluZwotICAgICAgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24KLSAgICAgIG9mIGxpYWJpbGl0eS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBBTlRMUgotCi0KLUFOVExSIDE5ODktMjAwNiBEZXZlbG9wZWQgYnkgVGVyZW5jZSBQYXJyCi1QYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IFVuaXZlcnNpdHkgb2YgU2FuIEZyYW5jaXNjbyAmIGpHdXJ1LmNvbQotCi1XZSByZXNlcnZlIG5vIGxlZ2FsIHJpZ2h0cyB0byB0aGUgQU5UTFItLWl0IGlzIGZ1bGx5IGluIHRoZQotcHVibGljIGRvbWFpbi4gQW4gaW5kaXZpZHVhbCBvciBjb21wYW55IG1heSBkbyB3aGF0ZXZlcgotdGhleSB3aXNoIHdpdGggc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgd2l0aCBBTlRMUiBvciB0aGUKLWNvZGUgZ2VuZXJhdGVkIGJ5IEFOVExSLCBpbmNsdWRpbmcgdGhlIGluY29ycG9yYXRpb24gb2YKLUFOVExSLCBvciBpdHMgb3V0cHV0LCBpbnRvIGNvbW1lcmljYWwgc29mdHdhcmUuCi0KLVdlIGVuY291cmFnZSB1c2VycyB0byBkZXZlbG9wIHNvZnR3YXJlIHdpdGggQU5UTFIuIEhvd2V2ZXIsCi13ZSBkbyBhc2sgdGhhdCBjcmVkaXQgaXMgZ2l2ZW4gdG8gdXMgZm9yIGRldmVsb3BpbmcKLUFOVExSLiBCeSAiY3JlZGl0Iiwgd2UgbWVhbiB0aGF0IGlmIHlvdSB1c2UgQU5UTFIgb3IKLWluY29ycG9yYXRlIGFueSBzb3VyY2UgY29kZSBpbnRvIG9uZSBvZiB5b3VyIHByb2dyYW1zCi0oY29tbWVyY2lhbCBwcm9kdWN0LCByZXNlYXJjaCBwcm9qZWN0LCBvciBvdGhlcndpc2UpIHRoYXQKLXlvdSBhY2tub3dsZWRnZSB0aGlzIGZhY3Qgc29tZXdoZXJlIGluIHRoZSBkb2N1bWVudGF0aW9uLAotcmVzZWFyY2ggcmVwb3J0LCBldGMuLi4gSWYgeW91IGxpa2UgQU5UTFIgYW5kIGhhdmUKLWRldmVsb3BlZCBhIG5pY2UgdG9vbCB3aXRoIHRoZSBvdXRwdXQsIHBsZWFzZSBtZW50aW9uIHRoYXQKLXlvdSBkZXZlbG9wZWQgaXQgdXNpbmcgQU5UTFIuIEluIGFkZGl0aW9uLCB3ZSBhc2sgdGhhdCB0aGUKLWhlYWRlcnMgcmVtYWluIGludGFjdCBpbiBvdXIgc291cmNlIGNvZGUuIEFzIGxvbmcgYXMgdGhlc2UKLWd1aWRlbGluZXMgYXJlIGtlcHQsIHdlIGV4cGVjdCB0byBjb250aW51ZSBlbmhhbmNpbmcgdGhpcwotc3lzdGVtIGFuZCBleHBlY3QgdG8gbWFrZSBvdGhlciB0b29scyBhdmFpbGFibGUgYXMgdGhleSBhcmUKLWNvbXBsZXRlZC4KLQotVGhlIHByaW1hcnkgQU5UTFIgZ3V5OgotCi1UZXJlbmNlIFBhcnIKLXBhcnJ0QGNzLnVzZmNhLmVkdQotcGFycnRAYW50bHIub3JnCi0KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gQVNNCi0KLQotICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBKU1IyMjMKLQotCi0gKiBDb3B5cmlnaHQgMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAKLSAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIAotICogcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSAKLSAqIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgCi0gKiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgU3VuIE1pY3Jvc3lzdGVtcyBub3IgdGhlIG5hbWVzIG9mIAotICogaXMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSAKLSAqIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUwotICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgCi0gKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgCi0gKiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiAKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgCi0gKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAotICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLSBTTEY0SiBBUEkgTW9kdWxlIChodHRwOi8vd3d3LnNsZjRqLm9yZykKLSAgTGljZW5zZTogTUlUIExpY2Vuc2UgIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocCkKLS0gU0xGNEogTE9HNEotMTIgQmluZGluZyAoaHR0cDovL3d3dy5zbGY0ai5vcmcpCi0gIExpY2Vuc2U6IE1JVCBMaWNlbnNlICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApCi0KLQotQ29weXJpZ2h0IChjKSAyMDA0LTIwMTMgUU9TLmNoCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLSBhICBjb3B5ICBvZiB0aGlzICBzb2Z0d2FyZSAgYW5kICBhc3NvY2lhdGVkICBkb2N1bWVudGF0aW9uIGZpbGVzICAodGhlCi0gIlNvZnR3YXJlIiksIHRvICBkZWFsIGluICB0aGUgU29mdHdhcmUgd2l0aG91dCAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotIHdpdGhvdXQgbGltaXRhdGlvbiAgdGhlIHJpZ2h0cyB0byAgdXNlLCBjb3B5LCBtb2RpZnksICBtZXJnZSwgcHVibGlzaCwKLSBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgIGNvcGllcyBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kIHRvCi0gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKLSBUaGUgIGFib3ZlICBjb3B5cmlnaHQgIG5vdGljZSAgYW5kICB0aGlzIHBlcm1pc3Npb24gIG5vdGljZSAgc2hhbGwgIGJlCi0gaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gCi0gVEhFICBTT0ZUV0FSRSBJUyAgUFJPVklERUQgICJBUyAgSVMiLCBXSVRIT1VUICBXQVJSQU5UWSAgT0YgQU5ZICBLSU5ELAotIEVYUFJFU1MgT1IgIElNUExJRUQsIElOQ0xVRElORyAgQlVUIE5PVCBMSU1JVEVEICBUTyBUSEUgIFdBUlJBTlRJRVMgT0YKLSBNRVJDSEFOVEFCSUxJVFksICAgIEZJVE5FU1MgICAgRk9SICAgIEEgICBQQVJUSUNVTEFSICAgIFBVUlBPU0UgICAgQU5ECi0gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHktbm90aWNlLnR4dCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHktbm90aWNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjMGMxOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vYXNzZW1ibHkvd29ya2JlbmNoLWFzc2VtYmx5LW5vdGljZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0KLU9wZW5DTUlTIFdvcmtiZW5jaAotQ29weXJpZ2h0IDIwMDktMjAxNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBhdAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotCi1PcGVuQ01JUyBjb250YWlucyBjb2RlIGZyb20gdGhlIGZvbGxvd2luZyBPcGVuIFNvdXJjZSBwcm9qZWN0czoKLQotLSBCYXNlNjQgCi0gIENvcHlyaWdodCAoYykgMjAxMCBSb2JlcnQgSGFyZGVyCi0gIFB1YmxpYyBEb21haW4sIDxodHRwOi8vaWhhcmRlci5uZXQvYmFzZTY0PgotCi0tIEpTT04uc2ltcGxlCi0gIENvcHlyaWdodCAoYykgMjAxMiBZaWRvbmcgRmFuZwotICBBcGFjaGUgTGljZW5zZSAyLjAsIDxodHRwOi8vY29kZS5nb29nbGUuY29tL3AvanNvbi1zaW1wbGUvPgotICAKLSAgCi1PcGVuQ01JUyBjb250YWlucyBPQVNJUyBDTUlTIDEuMCBhbmQgQ01JUyAxLjEgc2NoZW1hIGFuZCBXU0RMIGZpbGVzLgotQ29weXJpZ2h0IChjKSAyMDEwIGFuZCAyMDEzIE9BU0lTIE9wZW4KLTxodHRwczovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2NtaXM+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vYXNzZW1ibHkvd29ya2JlbmNoLWFzc2VtYmx5LnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDNiYzBlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseQotICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjEgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4xLnhzZCI+Ci0gICAgPCEtLSBUbyBidWlsZCB0aGlzLCBydW4gIm12biBwYWNrYWdlIGFzc2VtYmx5OmFzc2VtYmx5IiAtLT4KLSAgICA8aWQ+ZnVsbDwvaWQ+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0KLSAgICA8ZmlsZVNldHM+Ci0gICAgICAgIDwhLS0gbGljZW5zZSwgcmVhZG1lLCBldGMuIGNhbGN1bGF0ZWQgYXQgYnVpbGQgdGltZSAtLT4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TElDRU5TRTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5OT1RJQ0U8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLSAgICA8ZmlsZXM+Ci0gICAgICAgIDxmaWxlPgotICAgICAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHktbGljZW5zZS50eHQ8L3NvdXJjZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGRlc3ROYW1lPkxJQ0VOU0U8L2Rlc3ROYW1lPgotICAgICAgICA8L2ZpbGU+Ci0gICAgICAgIDxmaWxlPgotICAgICAgICAgICAgPHNvdXJjZT5zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXNzZW1ibHktbm90aWNlLnR4dDwvc291cmNlPgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8ZGVzdE5hbWU+Tk9USUNFPC9kZXN0TmFtZT4KLSAgICAgICAgPC9maWxlPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+dGFyZ2V0L3N0YXJ0L3dvcmtiZW5jaC5zaDwvc291cmNlPgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxsaW5lRW5kaW5nPnVuaXg8L2xpbmVFbmRpbmc+Ci0gICAgICAgICAgICA8ZmlsZU1vZGU+MDc1NTwvZmlsZU1vZGU+Ci0gICAgICAgIDwvZmlsZT4KLSAgICAgICAgPGZpbGU+Ci0gICAgICAgICAgICA8c291cmNlPnRhcmdldC9zdGFydC93b3JrYmVuY2guYmF0PC9zb3VyY2U+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGxpbmVFbmRpbmc+ZG9zPC9saW5lRW5kaW5nPgotICAgICAgICA8L2ZpbGU+Ci0gICAgPC9maWxlcz4KLSAgICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PjwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgPHVzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+dHJ1ZTwvdXNlVHJhbnNpdGl2ZUZpbHRlcmluZz4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5qdW5pdDpqdW5pdDwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgPHVzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+dHJ1ZTwvdXNlVHJhbnNpdGl2ZUZpbHRlcmluZz4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uc3VuLnhtbC53czpqYXh3cy1ydDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmN4ZjoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuYXhpczI6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT53c2RsNGo6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtYXhpczItYXNzZW1ibHkueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2Fzc2VtYmx5L3dvcmtiZW5jaC1heGlzMi1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTQ5MjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2Fzc2VtYmx5L3dvcmtiZW5jaC1heGlzMi1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5Ci0gICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4xIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjEueHNkIj4KLSAgICA8IS0tIFRvIGJ1aWxkIHRoaXMsIHJ1biAibXZuIHBhY2thZ2UgYXNzZW1ibHk6YXNzZW1ibHkiIC0tPgotICAgIDxpZD5heGlzMjwvaWQ+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gICAgCi0gICAgPGZpbGVTZXRzPgotICAgICAgICAgPCEtLSBsaWNlbnNlLCByZWFkbWUsIGV0Yy4gY2FsY3VsYXRlZCBhdCBidWlsZCB0aW1lIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci0gICAgPGZpbGVzPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+dGFyZ2V0L3N0YXJ0L3dvcmtiZW5jaC1heGlzMi5zaDwvc291cmNlPgotICAgICAgICAgICAgPGRlc3ROYW1lPndvcmtiZW5jaC5zaDwvZGVzdE5hbWU+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGxpbmVFbmRpbmc+dW5peDwvbGluZUVuZGluZz4KLSAgICAgICAgICAgIDxmaWxlTW9kZT4wNzU1PC9maWxlTW9kZT4KLSAgICAgICAgPC9maWxlPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+dGFyZ2V0L3N0YXJ0L3dvcmtiZW5jaC1heGlzMi5iYXQ8L3NvdXJjZT4KLSAgICAgICAgICAgIDxkZXN0TmFtZT53b3JrYmVuY2guYmF0PC9kZXN0TmFtZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8bGluZUVuZGluZz5kb3M8L2xpbmVFbmRpbmc+Ci0gICAgICAgIDwvZmlsZT4KLSAgICA8L2ZpbGVzPgotICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZUZpbHRlcmluZz50cnVlPC91c2VUcmFuc2l0aXZlRmlsdGVyaW5nPgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmp1bml0Omp1bml0PC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5heGlzMjoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUubmVldGhpOio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczpnZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnhtbC1yZXNvbHZlcjoqPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmNvZGVoYXVzLndvb2RzdG94OndzdHgtYXNsOio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tLnN1bi54bWwud3M6amF4d3MtcnQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5jeGY6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtY3hmLWFzc2VtYmx5LnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtY3hmLWFzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyODI5OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vYXNzZW1ibHkvd29ya2JlbmNoLWN4Zi1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5Ci0gICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4xIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjEueHNkIj4KLSAgICA8IS0tIFRvIGJ1aWxkIHRoaXMsIHJ1biAibXZuIHBhY2thZ2UgYXNzZW1ibHk6YXNzZW1ibHkiIC0tPgotICAgIDxpZD5jeGY8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIAotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgIDwhLS0gbGljZW5zZSwgcmVhZG1lLCBldGMuIGNhbGN1bGF0ZWQgYXQgYnVpbGQgdGltZSAtLT4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotICAgIDxmaWxlcz4KLSAgICAgICAgPGZpbGU+Ci0gICAgICAgICAgICA8c291cmNlPnRhcmdldC9zdGFydC93b3JrYmVuY2gtY3hmLnNoPC9zb3VyY2U+Ci0gICAgICAgICAgICA8ZGVzdE5hbWU+d29ya2JlbmNoLnNoPC9kZXN0TmFtZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8bGluZUVuZGluZz51bml4PC9saW5lRW5kaW5nPgotICAgICAgICAgICAgPGZpbGVNb2RlPjA3NTU8L2ZpbGVNb2RlPgotICAgICAgICA8L2ZpbGU+Ci0gICAgICAgIDxmaWxlPgotICAgICAgICAgICAgPHNvdXJjZT50YXJnZXQvc3RhcnQvd29ya2JlbmNoLWN4Zi5iYXQ8L3NvdXJjZT4KLSAgICAgICAgICAgIDxkZXN0TmFtZT53b3JrYmVuY2guYmF0PC9kZXN0TmFtZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8bGluZUVuZGluZz5kb3M8L2xpbmVFbmRpbmc+Ci0gICAgICAgIDwvZmlsZT4KLSAgICA8L2ZpbGVzPgotICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZUZpbHRlcmluZz50cnVlPC91c2VUcmFuc2l0aXZlRmlsdGVyaW5nPgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmp1bml0Omp1bml0PC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5jeGY6KjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZUZpbHRlcmluZz50cnVlPC91c2VUcmFuc2l0aXZlRmlsdGVyaW5nPgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5jb2RlaGF1cy53b29kc3RveDp3c3R4LWFzbDoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5zdW4ueG1sLndzOmpheHdzLXJ0PC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuYXhpczI6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtbWFjLWFzc2VtYmx5LnhtbCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtbWFjLWFzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NzYyZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vYXNzZW1ibHkvd29ya2JlbmNoLW1hYy1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5Ci0gICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4xIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjEueHNkIj4KLSAgICA8IS0tIFRvIGJ1aWxkIHRoaXMsIHJ1biAibXZuIHBhY2thZ2UgYXNzZW1ibHk6YXNzZW1ibHkiIC0tPgotICAgIDxpZD5tYWM8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIAotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgIDwhLS0gbGljZW5zZSwgcmVhZG1lLCBldGMuIGNhbGN1bGF0ZWQgYXQgYnVpbGQgdGltZSAtLT4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy9NRVRBLUlORjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotICAgIDxmaWxlcz4KLSAgICAgICAgPGZpbGU+Ci0gICAgICAgICAgICA8c291cmNlPnRhcmdldC9zdGFydC93b3JrYmVuY2guc2g8L3NvdXJjZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L0NvbnRlbnRzL1Jlc291cmNlczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGxpbmVFbmRpbmc+dW5peDwvbGluZUVuZGluZz4KLSAgICAgICAgICAgIDxmaWxlTW9kZT4wNzU1PC9maWxlTW9kZT4KLSAgICAgICAgPC9maWxlPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+dGFyZ2V0L3N0YXJ0L3J1bi5zaDwvc291cmNlPgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vQ29udGVudHMvTWFjT1M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxsaW5lRW5kaW5nPnVuaXg8L2xpbmVFbmRpbmc+Ci0gICAgICAgICAgICA8ZmlsZU1vZGU+MDc1NTwvZmlsZU1vZGU+Ci0gICAgICAgIDwvZmlsZT4KLSAgICAgICAgPGZpbGU+Ci0gICAgICAgICAgICA8c291cmNlPnRhcmdldC9zdGFydC9pbmZvLnBsaXN0PC9zb3VyY2U+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9Db250ZW50czwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGxpbmVFbmRpbmc+dW5peDwvbGluZUVuZGluZz4KLSAgICAgICAgPC9maWxlPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+c3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9pY29uLmljbnM8L3NvdXJjZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L0NvbnRlbnRzL1Jlc291cmNlczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8L2ZpbGU+IAotICAgIDwvZmlsZXM+Ci0gICAgPGRlcGVuZGVuY3lTZXRzPgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L0NvbnRlbnRzL1Jlc291cmNlcy9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZUZpbHRlcmluZz50cnVlPC91c2VUcmFuc2l0aXZlRmlsdGVyaW5nPgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmp1bml0Omp1bml0PC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L0NvbnRlbnRzL1Jlc291cmNlcy9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICAgICAgPHVzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+dHJ1ZTwvdXNlVHJhbnNpdGl2ZUZpbHRlcmluZz4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uc3VuLnhtbC53czpqYXh3cy1ydDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmN4ZjoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuYXhpczI6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT53c2RsNGo6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9hc3NlbWJseS93b3JrYmVuY2gtcmktYXNzZW1ibHkueG1sIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2Fzc2VtYmx5L3dvcmtiZW5jaC1yaS1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2QxYTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2Fzc2VtYmx5L3dvcmtiZW5jaC1yaS1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5Ci0gICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4xIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjEueHNkIj4KLSAgICA8IS0tIFRvIGJ1aWxkIHRoaXMsIHJ1biAibXZuIHBhY2thZ2UgYXNzZW1ibHk6YXNzZW1ibHkiIC0tPgotICAgIDxpZD5yaTwvaWQ+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gICAgCi0gICAgPGZpbGVTZXRzPgotICAgICAgICAgPCEtLSBsaWNlbnNlLCByZWFkbWUsIGV0Yy4gY2FsY3VsYXRlZCBhdCBidWlsZCB0aW1lIC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci0gICAgPGZpbGVzPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+dGFyZ2V0L3N0YXJ0L3dvcmtiZW5jaC1yaS5zaDwvc291cmNlPgotICAgICAgICAgICAgPGRlc3ROYW1lPndvcmtiZW5jaC5zaDwvZGVzdE5hbWU+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGxpbmVFbmRpbmc+dW5peDwvbGluZUVuZGluZz4KLSAgICAgICAgICAgIDxmaWxlTW9kZT4wNzU1PC9maWxlTW9kZT4KLSAgICAgICAgPC9maWxlPgotICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+dGFyZ2V0L3N0YXJ0L3dvcmtiZW5jaC1yaS5iYXQ8L3NvdXJjZT4KLSAgICAgICAgICAgIDxkZXN0TmFtZT53b3JrYmVuY2guYmF0PC9kZXN0TmFtZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8bGluZUVuZGluZz5kb3M8L2xpbmVFbmRpbmc+Ci0gICAgICAgIDwvZmlsZT4KLSAgICA8L2ZpbGVzPgotICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+PC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZUZpbHRlcmluZz50cnVlPC91c2VUcmFuc2l0aXZlRmlsdGVyaW5nPgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmp1bml0Omp1bml0PC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Y29tLnN1bi54bWwud3M6amF4d3MtcnQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmp2bmV0Lm1pbWVwdWxsOm1pbWVwdWxsPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmNvZGVoYXVzLndvb2RzdG94OndzdHgtYXNsOio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS5jeGY6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmF4aXMyOio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQWJzdHJhY3RMb2dpblRhYi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0Fic3RyYWN0TG9naW5UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmMDQ3OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQWJzdHJhY3RMb2dpblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLlR5cGVEZWZpbml0aW9uQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuY2FjaGUuQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5zcGkuQXV0aGVudGljYXRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBBYnN0cmFjdCBMb2dpbiBUYWIuCi0gKiAKLSAqIFRvIGFkZCBhIG5ldyBsb2dpbiB0YWIsIGRlcml2ZSBhIGNsYXNzIGZyb20gdGhpcyBjbGFzcywgY3JlYXRlIGEgZmlsZQotICoge0Bjb2RlIE1FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5BYnN0cmFjdExvZ2luVGFifQotICogLCBhbmQgcHV0IHRoZSBuYW1lIG9mIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB5b3VyIGNsYXNzIGludG8gdGhpcyBmaWxlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMb2dpblRhYiBleHRlbmRzIEpQYW5lbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSB0YWIuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUYWJUaXRsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIHdoZW4gdGhlIHVzZXIgaGl0cyB0aGUgIkxvYWQgUmVwb3NpdG9yaWVzIgotICAgICAqIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTZXNzaW9uUGFyYW1ldGVycygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB7QGNvZGUgT2JqZWN0RmFjdG9yeX0gaW5zdGFuY2Ugb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUgZGVmYXVsdAotICAgICAqIG9iamVjdCBmYWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5IGdldE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4ge0Bjb2RlIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXJ9IGluc3RhbmNlIG9yIHtAY29kZSBudWxsfSBmb3IKLSAgICAgKiB0aGUgZGVmYXVsdCBhdXRoZW50aWNhdGlvbiBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXV0aGVudGljYXRpb25Qcm92aWRlciBnZXRBdXRoZW50aWNhdGlvblByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIENhY2hlfSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gZm9yIHRoZSBkZWZhdWx0IGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyBDYWNoZSBnZXRDYWNoZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiB7QGNvZGUgVHlwZURlZmluaXRpb25DYWNoZX0gaW5zdGFuY2Ugb3Ige0Bjb2RlIG51bGx9IGZvciB0aGUKLSAgICAgKiBkZWZhdWx0IGF1dGhlbnRpY2F0aW9uIHByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBUeXBlRGVmaW5pdGlvbkNhY2hlIGdldFR5cGVEZWZpbml0aW9uQ2FjaGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSB0cmFuc2ZlcmVkIHRvIHRoZSBleHBlcnQKLSAgICAgKiB0YWIgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBmcm9tIHRoZSB0aGlzIHRhYiB0byB0aGUgZXhwZXJ0IHRhYiBvciBub3QuCi0gICAgICogVGhlIGRlZmF1bHQgaXMge0Bjb2RlIGZhbHNlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0cmFuc2ZlclNlc3Npb25QYXJhbWV0ZXJzVG9FeHBlcnRUYWIoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBpcyBsb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYmVmb3JlTG9hZFJlcG9zaXRvcmllcygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIGhhcyBiZWVuIGxvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZnRlckxvYWRSZXBvc2l0b3JpZXMoTGlzdDxSZXBvc2l0b3J5PiByZXBvc2l0b3JpZXMpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIHRoZSBXb3JrYmVuY2ggc2Vzc2lvbiBpcyBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJlZm9yZUxvZ2luKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBhZnRlciB0aGUgV29ya2JlbmNoIHNlc3Npb24gaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZnRlckxvZ2luKFNlc3Npb24gc2Vzc2lvbikgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9BYnN0cmFjdFNwcmluZ0xvZ2luVGFiLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQWJzdHJhY3RTcHJpbmdMb2dpblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E3ODdhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9BYnN0cmFjdFNwcmluZ0xvZ2luVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkNvbnRhaW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFzc3dvcmRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwcmluZzsKLWltcG9ydCBqYXZheC5zd2luZy5TcHJpbmdMYXlvdXQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyBmb3Igc3ByaW5nIGxheW91dCB0YWJzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTcHJpbmdMb2dpblRhYiBleHRlbmRzIEFic3RyYWN0TG9naW5UYWIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcm90ZWN0ZWQgSlRleHRGaWVsZCBjcmVhdGVUZXh0RmllbGQoQ29udGFpbmVyIHBhbmUsIFN0cmluZyBsYWJlbCkgewotICAgICAgICBKVGV4dEZpZWxkIHRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDYwKTsKLSAgICAgICAgSkxhYmVsIHRleHRMYWJlbCA9IG5ldyBKTGFiZWwobGFiZWwsIEpMYWJlbC5UUkFJTElORyk7Ci0gICAgICAgIHRleHRMYWJlbC5zZXRMYWJlbEZvcih0ZXh0RmllbGQpOwotCi0gICAgICAgIHBhbmUuYWRkKHRleHRMYWJlbCk7Ci0gICAgICAgIHBhbmUuYWRkKHRleHRGaWVsZCk7Ci0KLSAgICAgICAgcmV0dXJuIHRleHRGaWVsZDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSlBhc3N3b3JkRmllbGQgY3JlYXRlUGFzc3dvcmRGaWVsZChDb250YWluZXIgcGFuZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIEpQYXNzd29yZEZpZWxkIHRleHRGaWVsZCA9IG5ldyBKUGFzc3dvcmRGaWVsZCg2MCk7Ci0gICAgICAgIEpMYWJlbCB0ZXh0TGFiZWwgPSBuZXcgSkxhYmVsKGxhYmVsLCBKTGFiZWwuVFJBSUxJTkcpOwotICAgICAgICB0ZXh0TGFiZWwuc2V0TGFiZWxGb3IodGV4dEZpZWxkKTsKLQotICAgICAgICBwYW5lLmFkZCh0ZXh0TGFiZWwpOwotICAgICAgICBwYW5lLmFkZCh0ZXh0RmllbGQpOwotCi0gICAgICAgIHJldHVybiB0ZXh0RmllbGQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTcHJpbmdMYXlvdXQuQ29uc3RyYWludHMgZ2V0Q29uc3RyYWludHNGb3JDZWxsKGludCByb3csIGludCBjb2wsIENvbnRhaW5lciBwYXJlbnQsIGludCBjb2xzKSB7Ci0gICAgICAgIFNwcmluZ0xheW91dCBsYXlvdXQgPSAoU3ByaW5nTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCk7Ci0gICAgICAgIENvbXBvbmVudCBjID0gcGFyZW50LmdldENvbXBvbmVudChyb3cgKiBjb2xzICsgY29sKTsKLSAgICAgICAgcmV0dXJuIGxheW91dC5nZXRDb25zdHJhaW50cyhjKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQ29tcGFjdEdyaWQoQ29udGFpbmVyIHBhcmVudCwgaW50IHJvd3MsIGludCBjb2xzLCBpbnQgaW5pdGlhbFgsIGludCBpbml0aWFsWSwgaW50IHhQYWQsIGludCB5UGFkKSB7Ci0gICAgICAgIFNwcmluZ0xheW91dCBsYXlvdXQgPSAoU3ByaW5nTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCk7Ci0KLSAgICAgICAgU3ByaW5nIHggPSBTcHJpbmcuY29uc3RhbnQoaW5pdGlhbFgpOwotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGNvbHM7IGMrKykgewotICAgICAgICAgICAgU3ByaW5nIHdpZHRoID0gU3ByaW5nLmNvbnN0YW50KDApOwotICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByb3dzOyByKyspIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IFNwcmluZy5tYXgod2lkdGgsIGdldENvbnN0cmFpbnRzRm9yQ2VsbChyLCBjLCBwYXJlbnQsIGNvbHMpLmdldFdpZHRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByb3dzOyByKyspIHsKLSAgICAgICAgICAgICAgICBTcHJpbmdMYXlvdXQuQ29uc3RyYWludHMgY29uc3RyYWludHMgPSBnZXRDb25zdHJhaW50c0ZvckNlbGwociwgYywgcGFyZW50LCBjb2xzKTsKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50cy5zZXRYKHgpOwotICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLnNldFdpZHRoKHdpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHggPSBTcHJpbmcuc3VtKHgsIFNwcmluZy5zdW0od2lkdGgsIFNwcmluZy5jb25zdGFudCh4UGFkKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3ByaW5nIHkgPSBTcHJpbmcuY29uc3RhbnQoaW5pdGlhbFkpOwotICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHJvd3M7IHIrKykgewotICAgICAgICAgICAgU3ByaW5nIGhlaWdodCA9IFNwcmluZy5jb25zdGFudCgwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgY29sczsgYysrKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ID0gU3ByaW5nLm1heChoZWlnaHQsIGdldENvbnN0cmFpbnRzRm9yQ2VsbChyLCBjLCBwYXJlbnQsIGNvbHMpLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgY29sczsgYysrKSB7Ci0gICAgICAgICAgICAgICAgU3ByaW5nTGF5b3V0LkNvbnN0cmFpbnRzIGNvbnN0cmFpbnRzID0gZ2V0Q29uc3RyYWludHNGb3JDZWxsKHIsIGMsIHBhcmVudCwgY29scyk7Ci0gICAgICAgICAgICAgICAgY29uc3RyYWludHMuc2V0WSh5KTsKLSAgICAgICAgICAgICAgICBjb25zdHJhaW50cy5zZXRIZWlnaHQoaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHkgPSBTcHJpbmcuc3VtKHksIFNwcmluZy5zdW0oaGVpZ2h0LCBTcHJpbmcuY29uc3RhbnQoeVBhZCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxheW91dC5nZXRDb25zdHJhaW50cyhwYXJlbnQpLnNldENvbnN0cmFpbnQoU3ByaW5nTGF5b3V0LkVBU1QsIHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9BY2xFZGl0b3JGcmFtZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0FjbEVkaXRvckZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OGRkNTkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0FjbEVkaXRvckZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5DdXJzb3I7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHM7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuRm9jdXNFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwOwotaW1wb3J0IGphdmF4LnN3aW5nLkltYWdlSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUmFkaW9CdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNlcGFyYXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkpUZXh0Q29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUGVybWlzc2lvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY2xQcm9wYWdhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbEVudHJ5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHMuQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLQotcHVibGljIGNsYXNzIEFjbEVkaXRvckZyYW1lIGV4dGVuZHMgSkZyYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19USVRMRSA9ICJBQ0wgRWRpdG9yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZUljb24gSUNPTl9BREQgPSBDbGllbnRIZWxwZXIuZ2V0SWNvbigiYWRkLnBuZyIpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIGZpbmFsIENtaXNPYmplY3Qgb2JqZWN0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBY2VMaXN0IGFkZEFjZUxpc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY2VMaXN0IHJlbW92ZUFjZUxpc3Q7Ci0KLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBwcm9wYWdhdGlvblJlcG9zaXRvcnlCdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gcHJvcGFnYXRpb25PYmplY3RPbmx5QnV0dG9uOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIHByb3BhZ2F0aW9uUHJvcGFndGVCdXR0b247Ci0KLSAgICBwdWJsaWMgQWNsRWRpdG9yRnJhbWUoZmluYWwgQ2xpZW50TW9kZWwgbW9kZWwsIGZpbmFsIENtaXNPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKLQotICAgICAgICAvLyBnZXQgdXNlcnMKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByaW5jaWFwbExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByaW5jaWFwbExpc3QuYWRkKCIiKTsKLSAgICAgICAgICAgIHByaW5jaWFwbExpc3QuYWRkKCJjbWlzOnVzZXIiKTsKLQotICAgICAgICAgICAgU3RyaW5nIHVzZXIgPSBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSKTsKLSAgICAgICAgICAgIGlmICh1c2VyICE9IG51bGwgJiYgdXNlci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcmluY2lhcGxMaXN0LmFkZCh1c2VyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFub255bW91cyA9IG1vZGVsLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0UHJpbmNpcGFsSWRBbm9ueW1vdXMoKTsKLSAgICAgICAgICAgIGlmIChhbm9ueW1vdXMgIT0gbnVsbCAmJiBhbm9ueW1vdXMubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbmNpYXBsTGlzdC5hZGQoYW5vbnltb3VzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFueW9uZSA9IG1vZGVsLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0UHJpbmNpcGFsSWRBbnlvbmUoKTsKLSAgICAgICAgICAgIGlmIChhbnlvbmUgIT0gbnVsbCAmJiBhbnlvbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbmNpYXBsTGlzdC5hZGQoYW55b25lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRBY2woKSAhPSBudWxsICYmIG9iamVjdC5nZXRBY2woKS5nZXRBY2VzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBhY2xQcmluY2lhcGxMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEFjZSBhY2UgOiBvYmplY3QuZ2V0QWNsKCkuZ2V0QWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwaWQgPSBhY2UuZ2V0UHJpbmNpcGFsSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmluY2lhcGxMaXN0LmNvbnRhaW5zKHBpZCkgJiYgIWFjbFByaW5jaWFwbExpc3QuY29udGFpbnMocGlkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWNsUHJpbmNpYXBsTGlzdC5hZGQocGlkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWNsUHJpbmNpYXBsTGlzdCk7Ci0KLSAgICAgICAgICAgICAgICBwcmluY2lhcGxMaXN0LmFkZEFsbChhY2xQcmluY2lhcGxMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBwcmluY2lhcGxMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBwcmluY2lhcGxMaXN0LmFkZCgiIik7Ci0gICAgICAgICAgICBwcmluY2lhcGxMaXN0LmFkZCgiY21pczp1c2VyIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgcGVybWlzc2lvbnMKLSAgICAgICAgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGVybWlzc2lvbnNMaXN0LmFkZCgiIik7Ci0gICAgICAgICAgICBmb3IgKFBlcm1pc3Npb25EZWZpbml0aW9uIHBkIDogbW9kZWwuZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRBY2xDYXBhYmlsaXRpZXMoKS5nZXRQZXJtaXNzaW9ucygpKSB7Ci0gICAgICAgICAgICAgICAgcGVybWlzc2lvbnNMaXN0LmFkZChwZC5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBwZXJtaXNzaW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIHBlcm1pc3Npb25zTGlzdC5hZGQoIiIpOwotICAgICAgICAgICAgcGVybWlzc2lvbnNMaXN0LmFkZCgiY21pczpyZWFkIik7Ci0gICAgICAgICAgICBwZXJtaXNzaW9uc0xpc3QuYWRkKCJjbWlzOndyaXRlIik7Ci0gICAgICAgICAgICBwZXJtaXNzaW9uc0xpc3QuYWRkKCJjbWlzOmFsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQWNlTGlzdCA9IG5ldyBBY2VMaXN0KHByaW5jaWFwbExpc3QsIHBlcm1pc3Npb25zTGlzdCk7Ci0gICAgICAgIHJlbW92ZUFjZUxpc3QgPSBuZXcgQWNlTGlzdChwcmluY2lhcGxMaXN0LCBwZXJtaXNzaW9uc0xpc3QpOwotCi0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIHNldFRpdGxlKFdJTkRPV19USVRMRSk7Ci0gICAgICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig4MDAsIDYwMCkpOwotICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDMwMCwgMTIwKSk7Ci0KLSAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0KLSAgICAgICAgZmluYWwgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dChwYW5lbCwgQm94TGF5b3V0LlBBR0VfQVhJUykpOwotCi0gICAgICAgIGZpbmFsIEZvbnQgbGFiZWxGb250ID0gVUlNYW5hZ2VyLmdldEZvbnQoIkxhYmVsLmZvbnQiKTsKLSAgICAgICAgZmluYWwgRm9udCBib2xkRm9udCA9IGxhYmVsRm9udC5kZXJpdmVGb250KEZvbnQuQk9MRCwgbGFiZWxGb250LmdldFNpemUyRCgpICogMS4yZik7Ci0KLSAgICAgICAgZmluYWwgSlBhbmVsIHRvcFBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICB0b3BQYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dCh0b3BQYW5lbCwgQm94TGF5b3V0LllfQVhJUykpOwotICAgICAgICB0b3BQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7Ci0gICAgICAgIGZpbmFsIEpMYWJlbCBuYW1lTGFiZWwgPSBuZXcgSkxhYmVsKG9iamVjdC5nZXROYW1lKCkpOwotICAgICAgICBuYW1lTGFiZWwuc2V0Rm9udChib2xkRm9udCk7Ci0gICAgICAgIHRvcFBhbmVsLmFkZChuYW1lTGFiZWwpOwotICAgICAgICB0b3BQYW5lbC5hZGQobmV3IEpMYWJlbChvYmplY3QuZ2V0SWQoKSkpOwotICAgICAgICBhZGQodG9wUGFuZWwsIEJvcmRlckxheW91dC5QQUdFX1NUQVJUKTsKLQotICAgICAgICAvLyBBQ0UgcGFuZWxzCi0gICAgICAgIGZpbmFsIEpQYW5lbCBhZGRBY2VQYW5lbCA9IGNyZWF0ZUFjZUxpc3RQYW5lbCgiQWRkIEFDRXMiLCBhZGRBY2VMaXN0KTsKLSAgICAgICAgZmluYWwgSlBhbmVsIHJlbW92ZUFjZVBhbmVsID0gY3JlYXRlQWNlTGlzdFBhbmVsKCJSZW1vdmUgQUNFcyIsIHJlbW92ZUFjZUxpc3QpOwotCi0gICAgICAgIEpQYW5lbCBjZW50ZXJQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICBmaW5hbCBKU3BsaXRQYW5lIGFjZVNwbGl0UGFuZWwgPSBuZXcgSlNwbGl0UGFuZShKU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQsIG5ldyBKU2Nyb2xsUGFuZShhZGRBY2VQYW5lbCksCi0gICAgICAgICAgICAgICAgbmV3IEpTY3JvbGxQYW5lKHJlbW92ZUFjZVBhbmVsKSk7Ci0KLSAgICAgICAgY2VudGVyUGFuZWwuYWRkKGFjZVNwbGl0UGFuZWwsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgIC8vIHByb3BhZ2F0aW9uIGJ1dHRvbnMKLSAgICAgICAgcHJvcGFnYXRpb25SZXBvc2l0b3J5QnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigicmVwb3NpdG9yeSBkZXRlcm1pbmVkIiwgdHJ1ZSk7Ci0gICAgICAgIHByb3BhZ2F0aW9uT2JqZWN0T25seUJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIm9iamVjdCBvbmx5IiwgZmFsc2UpOwotICAgICAgICBwcm9wYWdhdGlvblByb3BhZ3RlQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigicHJvcGFnYXRlIiwgZmFsc2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobW9kZWwuZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRBY2xDYXBhYmlsaXRpZXMoKS5nZXRBY2xQcm9wYWdhdGlvbigpID09IEFjbFByb3BhZ2F0aW9uLk9CSkVDVE9OTFkpIHsKLSAgICAgICAgICAgICAgICBwcm9wYWdhdGlvblByb3BhZ3RlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcHJvcGFnYXRpb25Qcm9wYWd0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQnV0dG9uR3JvdXAgcHJvcGFndGlvbkdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgICAgIHByb3BhZ3Rpb25Hcm91cC5hZGQocHJvcGFnYXRpb25SZXBvc2l0b3J5QnV0dG9uKTsKLSAgICAgICAgcHJvcGFndGlvbkdyb3VwLmFkZChwcm9wYWdhdGlvbk9iamVjdE9ubHlCdXR0b24pOwotICAgICAgICBwcm9wYWd0aW9uR3JvdXAuYWRkKHByb3BhZ2F0aW9uUHJvcGFndGVCdXR0b24pOwotCi0gICAgICAgIEpQYW5lbCBwcm9wYWd0aW9uUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuTEVGVCkpOwotICAgICAgICBwcm9wYWd0aW9uUGFuZWwuYWRkKG5ldyBKTGFiZWwoIkFDTCBQcm9wYWdhdGlvbjoiKSk7Ci0gICAgICAgIHByb3BhZ3Rpb25QYW5lbC5hZGQocHJvcGFnYXRpb25SZXBvc2l0b3J5QnV0dG9uKTsKLSAgICAgICAgcHJvcGFndGlvblBhbmVsLmFkZChwcm9wYWdhdGlvbk9iamVjdE9ubHlCdXR0b24pOwotICAgICAgICBwcm9wYWd0aW9uUGFuZWwuYWRkKHByb3BhZ2F0aW9uUHJvcGFndGVCdXR0b24pOwotCi0gICAgICAgIGNlbnRlclBhbmVsLmFkZChwcm9wYWd0aW9uUGFuZWwsIEJvcmRlckxheW91dC5QQUdFX0VORCk7Ci0KLSAgICAgICAgYWRkKGNlbnRlclBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICAvLyB1cGRhdGUgYnV0dG9uCi0gICAgICAgIEpCdXR0b24gdXBkYXRlQnV0dG9uID0gbmV3IEpCdXR0b24oIlVwZGF0ZSIpOwotICAgICAgICB1cGRhdGVCdXR0b24uc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoNSwgNSwgNSwgNSkpOwotICAgICAgICB1cGRhdGVCdXR0b24uc2V0RGVmYXVsdENhcGFibGUodHJ1ZSk7Ci0gICAgICAgIHVwZGF0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZG9BcHBseSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFkZCh1cGRhdGVCdXR0b24sIEJvcmRlckxheW91dC5QQUdFX0VORCk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5ESVNQT1NFX09OX0NMT1NFKTsKLSAgICAgICAgcGFjaygpOwotICAgICAgICBzZXRMb2NhdGlvblJlbGF0aXZlVG8obnVsbCk7Ci0gICAgICAgIHNldFZpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgYWNlU3BsaXRQYW5lbC5zZXREaXZpZGVyTG9jYXRpb24oMC41Zik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKUGFuZWwgY3JlYXRlQWNlTGlzdFBhbmVsKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgQWNlTGlzdCBsaXN0KSB7Ci0gICAgICAgIGZpbmFsIEZvbnQgbGFiZWxGb250ID0gVUlNYW5hZ2VyLmdldEZvbnQoIkxhYmVsLmZvbnQiKTsKLSAgICAgICAgZmluYWwgRm9udCBib2xkRm9udCA9IGxhYmVsRm9udC5kZXJpdmVGb250KEZvbnQuQk9MRCwgbGFiZWxGb250LmdldFNpemUyRCgpICogMS4yZik7Ci0KLSAgICAgICAgZmluYWwgSlBhbmVsIHJlc3VsdCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgcmVzdWx0LnNldExheW91dChuZXcgQm94TGF5b3V0KHJlc3VsdCwgQm94TGF5b3V0LlBBR0VfQVhJUykpOwotCi0gICAgICAgIGZpbmFsIEpQYW5lbCB0b3BQYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgdG9wUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodG9wUGFuZWwsIEJveExheW91dC5MSU5FX0FYSVMpKTsKLSAgICAgICAgdG9wUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoNSwgNSwgNSwgNSkpOwotCi0gICAgICAgIGZpbmFsIEpMYWJlbCB0aXRsZUxhYmVsID0gbmV3IEpMYWJlbCh0aXRsZSk7Ci0gICAgICAgIHRpdGxlTGFiZWwuc2V0Rm9udChib2xkRm9udCk7Ci0gICAgICAgIHRvcFBhbmVsLmFkZCh0aXRsZUxhYmVsLCBCb3JkZXJMYXlvdXQuTElORV9TVEFSVCk7Ci0KLSAgICAgICAgdG9wUGFuZWwuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsR2x1ZSgpKTsKLQotICAgICAgICBmaW5hbCBKQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKElDT05fQUREKTsKLSAgICAgICAgYWRkQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkTmV3QWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRvcFBhbmVsLmFkZChhZGRCdXR0b24sIEJvcmRlckxheW91dC5MSU5FX0VORCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZCh0b3BQYW5lbCk7Ci0KLSAgICAgICAgcmVzdWx0LmFkZChsaXN0KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGxpZXMgdGhlIEFDRXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRvQXBwbHkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0KLSAgICAgICAgICAgIExpc3Q8QWNlPiBhZGRzID0gYWRkQWNlTGlzdC5nZXRBY2VzKCk7Ci0gICAgICAgICAgICBMaXN0PEFjZT4gcmVtb3ZlcyA9IHJlbW92ZUFjZUxpc3QuZ2V0QWNlcygpOwotCi0gICAgICAgICAgICBpZiAoYWRkcyAhPSBudWxsIHx8IHJlbW92ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFjbFByb3BhZ2F0aW9uIGFjbFByb3BhZ2F0aW9uID0gQWNsUHJvcGFnYXRpb24uUkVQT1NJVE9SWURFVEVSTUlORUQ7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BhZ2F0aW9uT2JqZWN0T25seUJ1dHRvbi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWNsUHJvcGFnYXRpb24gPSBBY2xQcm9wYWdhdGlvbi5PQkpFQ1RPTkxZOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcm9wYWdhdGlvblByb3BhZ3RlQnV0dG9uLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBhY2xQcm9wYWdhdGlvbiA9IEFjbFByb3BhZ2F0aW9uLlBST1BBR0FURTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvYmplY3QuYXBwbHlBY2woYWRkcywgcmVtb3ZlcywgYWNsUHJvcGFnYXRpb24pOwotICAgICAgICAgICAgICAgIG1vZGVsLnJlbG9hZE9iamVjdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKHRoaXMsIGV4KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFDRSBsaXN0IHBhbmVsLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjZUxpc3QgZXh0ZW5kcyBKUGFuZWwgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxBY2VJbnB1dFBhbmVsPiBwYW5lbHM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHByaW5jaXBhbHM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zOwotCi0gICAgICAgIHB1YmxpYyBBY2VMaXN0KGZpbmFsIExpc3Q8U3RyaW5nPiBwcmluY2lwYWxzLCBmaW5hbCBMaXN0PFN0cmluZz4gcGVybWlzc2lvbnMpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgICAgIHBhbmVscyA9IG5ldyBBcnJheUxpc3Q8QWNlSW5wdXRQYW5lbD4oKTsKLSAgICAgICAgICAgIHRoaXMucHJpbmNpcGFscyA9IHByaW5jaXBhbHM7Ci0gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnM7Ci0KLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm94TGF5b3V0KHRoaXMsIEJveExheW91dC5ZX0FYSVMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGROZXdBY2UoKSB7Ci0gICAgICAgICAgICBBY2VJbnB1dFBhbmVsIGFjZVBhbmVsID0gbmV3IEFjZUlucHV0UGFuZWwodGhpcywgcHJpbmNpcGFscywgcGVybWlzc2lvbnMsIHBhbmVscy5zaXplKCkpOwotICAgICAgICAgICAgcGFuZWxzLmFkZChhY2VQYW5lbCk7Ci0KLSAgICAgICAgICAgIGFkZChhY2VQYW5lbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQWNlKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcGFuZWxzLnJlbW92ZShwb3NpdGlvbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gcG9zaXRpb247IGkgPCBwYW5lbHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwYW5lbHMuZ2V0KGkpLnVwZGF0ZVBvc2l0aW9uKGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIGZvciAoQWNlSW5wdXRQYW5lbCBwIDogcGFuZWxzKSB7Ci0gICAgICAgICAgICAgICAgYWRkKHApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIExpc3Q8QWNlPiBnZXRBY2VzKCkgewotICAgICAgICAgICAgTGlzdDxBY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QWNlPigpOwotCi0gICAgICAgICAgICBmb3IgKEFjZUlucHV0UGFuZWwgcCA6IHBhbmVscykgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocC5nZXRBY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNFbXB0eSgpID8gbnVsbCA6IHJlc3VsdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFDRSBpbnB1dCBwYW5lbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjZUlucHV0UGFuZWwgZXh0ZW5kcyBKUGFuZWwgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJBQ0tHUk9VTkQxID0gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZTpcIlRhYmxlLmNlbGxSZW5kZXJlclwiLmJhY2tncm91bmQiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkFDS0dST1VORDIgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmFsdGVybmF0ZVJvd0NvbG9yIik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIExJTkUgPSBuZXcgQ29sb3IoMHhCOCwgMHhCOCwgMHhCOCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VJY29uIElDT05fUkVNT1ZFID0gQ2xpZW50SGVscGVyLmdldEljb24oInJlbW92ZS5wbmciKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBwZXJtaXNzaW9uczsKLQotICAgICAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKQ29tYm9Cb3ggcHJpbmNpcGFsQm94OwotICAgICAgICBwcml2YXRlIGZpbmFsIEpQYW5lbCBwZXJtaXNzaW9uc1BhbmVsOwotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SkNvbWJvQm94PiBwZXJtaXNzaW9uQm94ZXM7Ci0KLSAgICAgICAgcHVibGljIEFjZUlucHV0UGFuZWwoZmluYWwgQWNlTGlzdCBsaXN0LCBmaW5hbCBMaXN0PFN0cmluZz4gcHJpbmNpcGFscywgZmluYWwgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zLAotICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zOwotCi0gICAgICAgICAgICB1cGRhdGVQb3NpdGlvbihwb3NpdGlvbik7Ci0KLSAgICAgICAgICAgIHNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgICAgIHNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUNvbXBvdW5kQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlTWF0dGVCb3JkZXIoMCwgMCwgMSwgMCwgTElORSksCi0gICAgICAgICAgICAgICAgICAgIEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMTAsIDUsIDEwLCA1KSkpOwotCi0gICAgICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgYyA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLSAgICAgICAgICAgIGMuZ3JpZGhlaWdodCA9IDE7Ci0gICAgICAgICAgICBjLmdyaWR3aWR0aCA9IDE7Ci0KLSAgICAgICAgICAgIC8vIGNvbCAxCi0gICAgICAgICAgICBjLmdyaWR4ID0gMDsKLSAgICAgICAgICAgIGMud2VpZ2h0eCA9IDE7Ci0gICAgICAgICAgICBjLmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTDsKLSAgICAgICAgICAgIGMuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQ7Ci0KLSAgICAgICAgICAgIGMuZ3JpZHkgPSAwOwotICAgICAgICAgICAgYWRkKG5ldyBKTGFiZWwoIlByaW5jaXBhbDoiKSwgYyk7Ci0KLSAgICAgICAgICAgIGMuZ3JpZHkgPSAxOwotICAgICAgICAgICAgYWRkKG5ldyBKU2VwYXJhdG9yKFN3aW5nQ29uc3RhbnRzLkhPUklaT05UQUwpLCBjKTsKLQotICAgICAgICAgICAgYy5ncmlkeSA9IDI7Ci0gICAgICAgICAgICBhZGQobmV3IEpMYWJlbCgiUGVybWlzc2lvbnM6IiksIGMpOwotCi0gICAgICAgICAgICAvLyBjb2wgMgotICAgICAgICAgICAgYy5ncmlkeCA9IDE7Ci0gICAgICAgICAgICBjLndlaWdodHggPSAxOwotICAgICAgICAgICAgYy5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7Ci0gICAgICAgICAgICBjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX1NUQVJUOwotCi0gICAgICAgICAgICBwcmluY2lwYWxCb3ggPSBuZXcgSkNvbWJvQm94KHByaW5jaXBhbHMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICBwcmluY2lwYWxCb3guc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICBwcmluY2lwYWxCb3guc2V0UHJvdG90eXBlRGlzcGxheVZhbHVlKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Iik7Ci0KLSAgICAgICAgICAgIGMuZ3JpZHkgPSAwOwotICAgICAgICAgICAgYWRkKHByaW5jaXBhbEJveCwgYyk7Ci0KLSAgICAgICAgICAgIGMuZ3JpZHkgPSAxOwotICAgICAgICAgICAgYWRkKG5ldyBKU2VwYXJhdG9yKFN3aW5nQ29uc3RhbnRzLkhPUklaT05UQUwpLCBjKTsKLQotICAgICAgICAgICAgcGVybWlzc2lvbnNQYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHBlcm1pc3Npb25zUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQocGVybWlzc2lvbnNQYW5lbCwgQm94TGF5b3V0LllfQVhJUykpOwotICAgICAgICAgICAgcGVybWlzc2lvbnNQYW5lbC5zZXRPcGFxdWUoZmFsc2UpOwotCi0gICAgICAgICAgICBwZXJtaXNzaW9uQm94ZXMgPSBuZXcgQXJyYXlMaXN0PEpDb21ib0JveD4oKTsKLQotICAgICAgICAgICAgdXBkYXRlUGVybWlzc2lvbnNQYW5lbChmYWxzZSk7Ci0KLSAgICAgICAgICAgIGMuZ3JpZHkgPSAyOwotICAgICAgICAgICAgYWRkKHBlcm1pc3Npb25zUGFuZWwsIGMpOwotCi0gICAgICAgICAgICAvLyBjb2wgMwotICAgICAgICAgICAgYy5ncmlkeCA9IDI7Ci0gICAgICAgICAgICBjLndlaWdodHggPSAxOwotICAgICAgICAgICAgYy5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkU7Ci0gICAgICAgICAgICBjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5MSU5FX0VORDsKLQotICAgICAgICAgICAgYy5ncmlkeSA9IDA7Ci0gICAgICAgICAgICBKQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKElDT05fUkVNT1ZFKTsKLSAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlQWNlKGdldFBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBhZGQocmVtb3ZlQnV0dG9uLCBjKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSkNvbWJvQm94IGNyZWF0ZVBlcm1pc3Npb25Cb3goKSB7Ci0gICAgICAgICAgICBKQ29tYm9Cb3ggcmVzdWx0ID0gbmV3IEpDb21ib0JveChwZXJtaXNzaW9ucy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRQcm90b3R5cGVEaXNwbGF5VmFsdWUoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUiKTsKLQotICAgICAgICAgICAgSlRleHRDb21wb25lbnQgZWRpdG9yID0gKEpUZXh0Q29tcG9uZW50KSByZXN1bHQuZ2V0RWRpdG9yKCkuZ2V0RWRpdG9yQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBlZGl0b3IuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBlcm1pc3Npb25zUGFuZWwodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGVkaXRvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0VOVEVSIHx8IGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX1RBQikgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGVybWlzc2lvbnNQYW5lbCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBlcm1pc3Npb25zUGFuZWwoYm9vbGVhbiBmb2N1cykgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmICghcGVybWlzc2lvbkJveGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHBlcm1pc3Npb25Cb3hlcy5zaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uQm94ZXMuZ2V0KGkpLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Cb3hlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uQm94ZXMuZ2V0KHBlcm1pc3Npb25Cb3hlcy5zaXplKCkgLSAxKS5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbkJveGVzLmFkZChjcmVhdGVQZXJtaXNzaW9uQm94KCkpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Cb3hlcy5hZGQoY3JlYXRlUGVybWlzc2lvbkJveCgpKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICBwZXJtaXNzaW9uc1BhbmVsLnJlbW92ZUFsbCgpOwotCi0gICAgICAgICAgICAgICAgZm9yIChKQ29tYm9Cb3ggYm94IDogcGVybWlzc2lvbkJveGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zUGFuZWwuYWRkKGJveCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV2YWxpZGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZvY3VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25Cb3hlcy5nZXQocGVybWlzc2lvbkJveGVzLnNpemUoKSAtIDEpLnJlcXVlc3RGb2N1c0luV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBvc2l0aW9uKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgICAgICAgICAgc2V0QmFja2dyb3VuZChwb3NpdGlvbiAlIDIgPT0gMCA/IEJBQ0tHUk9VTkQxIDogQkFDS0dST1VORDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGltZW5zaW9uIGdldE1heGltdW1TaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEaW1lbnNpb24oU2hvcnQuTUFYX1ZBTFVFLCBnZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBY2UgZ2V0QWNlKCkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBlcm1pc3Npb25zTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBmb3IgKEpDb21ib0JveCBib3ggOiBwZXJtaXNzaW9uQm94ZXMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGVybWlzc2lvbiA9IGJveC5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAocGVybWlzc2lvbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnNMaXN0LmFkZChwZXJtaXNzaW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQWNjZXNzQ29udHJvbEVudHJ5SW1wbChuZXcgQWNjZXNzQ29udHJvbFByaW5jaXBhbERhdGFJbXBsKHByaW5jaXBhbEJveC5nZXRTZWxlY3RlZEl0ZW0oKQotICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSksIHBlcm1pc3Npb25zTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQmFzaWNMb2dpblRhYi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0Jhc2ljTG9naW5UYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyYjE4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQmFzaWNMb2dpblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db250YWluZXI7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJveDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uR3JvdXA7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFzc3dvcmRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5KUmFkaW9CdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5TcHJpbmdMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJpbmRpbmdUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRTZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNMb2dpblRhYiBleHRlbmRzIEFic3RyYWN0U3ByaW5nTG9naW5UYWIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX1VSTCA9IENsaWVudFNlc3Npb24uV09SS0JFTkNIX1BSRUZJWCArICJ1cmwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1BST1BfQklORElORyA9IENsaWVudFNlc3Npb24uV09SS0JFTkNIX1BSRUZJWCArICJiaW5kaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX0FVVEhFTlRJQ0FUSU9OID0gQ2xpZW50U2Vzc2lvbi5XT1JLQkVOQ0hfUFJFRklYICsgImF1dGhlbnRpY2F0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX0NPTVBSRVNTSU9OID0gQ2xpZW50U2Vzc2lvbi5XT1JLQkVOQ0hfUFJFRklYICsgImNvbXByZXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX0NMSUVOVENPTVBSRVNTSU9OID0gQ2xpZW50U2Vzc2lvbi5XT1JLQkVOQ0hfUFJFRklYICsgImNsaWVudGNvbXByZXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX0NPT0tJRVMgPSBDbGllbnRTZXNzaW9uLldPUktCRU5DSF9QUkVGSVggKyAiY29va2llcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTUFJPUF9VU0VSID0gQ2xpZW50U2Vzc2lvbi5XT1JLQkVOQ0hfUFJFRklYICsgInVzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1BST1BfUEFTU1dPUkQgPSBDbGllbnRTZXNzaW9uLldPUktCRU5DSF9QUkVGSVggKyAicGFzc3dvcmQiOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHVybEZpZWxkOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGJpbmRpbmdBdG9tQnV0dG9uOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGJpbmRpbmdXZWJTZXJ2aWNlc0J1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBiaW5kaW5nQnJvd3NlckJ1dHRvbjsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdXNlcm5hbWVGaWVsZDsKLSAgICBwcml2YXRlIEpQYXNzd29yZEZpZWxkIHBhc3N3b3JkRmllbGQ7Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gYXV0aGVudGljYXRpb25Ob25lQnV0dG9uOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGF1dGhlbnRpY2F0aW9uU3RhbmRhcmRCdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gYXV0aGVudGljYXRpb25OVExNQnV0dG9uOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGF1dGhlbnRpY2F0aW9uT0F1dGhCdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gY29tcHJlc3Npb25PbkJ1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBjb21wcmVzc2lvbk9mZkJ1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBjbGllbnRDb21wcmVzc2lvbk9uQnV0dG9uOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGNsaWVudENvbXByZXNzaW9uT2ZmQnV0dG9uOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGNvb2tpZXNPbkJ1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBjb29raWVzT2ZmQnV0dG9uOwotCi0gICAgcHVibGljIEJhc2ljTG9naW5UYWIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIHNldExheW91dChuZXcgU3ByaW5nTGF5b3V0KCkpOwotCi0gICAgICAgIHVybEZpZWxkID0gY3JlYXRlVGV4dEZpZWxkKHRoaXMsICJVUkw6Iik7Ci0gICAgICAgIHVybEZpZWxkLnNldFRleHQoU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfVVJMLCAiIikudHJpbSgpKTsKLQotICAgICAgICBjcmVhdGVCaW5kaW5nQnV0dG9ucyh0aGlzKTsKLQotICAgICAgICB1c2VybmFtZUZpZWxkID0gY3JlYXRlVGV4dEZpZWxkKHRoaXMsICJVc2VybmFtZToiKTsKLSAgICAgICAgdXNlcm5hbWVGaWVsZC5zZXRUZXh0KFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNQUk9QX1VTRVIsICIiKSk7Ci0KLSAgICAgICAgcGFzc3dvcmRGaWVsZCA9IGNyZWF0ZVBhc3N3b3JkRmllbGQodGhpcywgIlBhc3N3b3JkOiIpOwotICAgICAgICBwYXNzd29yZEZpZWxkLnNldFRleHQoU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfUEFTU1dPUkQsICIiKSk7Ci0KLSAgICAgICAgY3JlYXRlQXV0aGVudGljYXRpb25CdXR0b25zKHRoaXMpOwotCi0gICAgICAgIGNyZWF0ZUNvbXByZXNzaW9uQnV0dG9ucyh0aGlzKTsKLQotICAgICAgICBjcmVhdGVDbGllbnRDb21wcmVzc2lvbkJ1dHRvbnModGhpcyk7Ci0KLSAgICAgICAgY3JlYXRlQ29va2llQnV0dG9ucyh0aGlzKTsKLQotICAgICAgICBtYWtlQ29tcGFjdEdyaWQodGhpcywgOCwgMiwgNSwgMTAsIDUsIDUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVCaW5kaW5nQnV0dG9ucyhDb250YWluZXIgcGFuZSkgewotICAgICAgICBKUGFuZWwgYmluZGluZ0NvbnRhaW5lciA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgYmluZGluZ0NvbnRhaW5lci5zZXRMYXlvdXQobmV3IEJveExheW91dChiaW5kaW5nQ29udGFpbmVyLCBCb3hMYXlvdXQuTElORV9BWElTKSk7Ci0gICAgICAgIGNoYXIgYmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTUFJPUF9CSU5ESU5HLCAiYXRvbSIpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5jaGFyQXQoMCk7Ci0gICAgICAgIGJvb2xlYW4gYXRvbSA9IChiYyA9PSAnYScpOwotICAgICAgICBib29sZWFuIHdzID0gKGJjID09ICd3Jyk7Ci0gICAgICAgIGJvb2xlYW4gYnJvd3NlciA9IChiYyA9PSAnYicpOwotICAgICAgICBiaW5kaW5nQXRvbUJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIkF0b21QdWIiLCBhdG9tKTsKLSAgICAgICAgYmluZGluZ1dlYlNlcnZpY2VzQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigiV2ViIFNlcnZpY2VzIiwgd3MpOwotICAgICAgICBiaW5kaW5nQnJvd3NlckJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIkJyb3dzZXIiLCBicm93c2VyKTsKLSAgICAgICAgQnV0dG9uR3JvdXAgYmluZGluZ0dyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgICAgIGJpbmRpbmdHcm91cC5hZGQoYmluZGluZ0F0b21CdXR0b24pOwotICAgICAgICBiaW5kaW5nR3JvdXAuYWRkKGJpbmRpbmdXZWJTZXJ2aWNlc0J1dHRvbik7Ci0gICAgICAgIGJpbmRpbmdHcm91cC5hZGQoYmluZGluZ0Jyb3dzZXJCdXR0b24pOwotICAgICAgICBiaW5kaW5nQ29udGFpbmVyLmFkZChiaW5kaW5nQXRvbUJ1dHRvbik7Ci0gICAgICAgIGJpbmRpbmdDb250YWluZXIuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwgMCkpKTsKLSAgICAgICAgYmluZGluZ0NvbnRhaW5lci5hZGQoYmluZGluZ1dlYlNlcnZpY2VzQnV0dG9uKTsKLSAgICAgICAgYmluZGluZ0NvbnRhaW5lci5hZGQoQm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEwLCAwKSkpOwotICAgICAgICBiaW5kaW5nQ29udGFpbmVyLmFkZChiaW5kaW5nQnJvd3NlckJ1dHRvbik7Ci0gICAgICAgIEpMYWJlbCBiaW5kaW5nTGFiZWwgPSBuZXcgSkxhYmVsKCJCaW5kaW5nOiIsIEpMYWJlbC5UUkFJTElORyk7Ci0KLSAgICAgICAgcGFuZS5hZGQoYmluZGluZ0xhYmVsKTsKLSAgICAgICAgcGFuZS5hZGQoYmluZGluZ0NvbnRhaW5lcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUF1dGhlbnRpY2F0aW9uQnV0dG9ucyhDb250YWluZXIgcGFuZSkgewotICAgICAgICBKUGFuZWwgYXV0aGVudGljYXRpb25Db250YWluZXIgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIGF1dGhlbnRpY2F0aW9uQ29udGFpbmVyLnNldExheW91dChuZXcgQm94TGF5b3V0KGF1dGhlbnRpY2F0aW9uQ29udGFpbmVyLCBCb3hMYXlvdXQuTElORV9BWElTKSk7Ci0gICAgICAgIGJvb2xlYW4gc3RhbmRhcmQgPSAoU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfQVVUSEVOVElDQVRJT04sICJzdGFuZGFyZCIpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoInN0YW5kYXJkIikpOwotICAgICAgICBib29sZWFuIG50bG0gPSAoU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfQVVUSEVOVElDQVRJT04sICIiKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkuZXF1YWxzKCJudGxtIikpOwotICAgICAgICBib29sZWFuIG9hdXRoID0gKFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNQUk9QX0FVVEhFTlRJQ0FUSU9OLCAiIikudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLmVxdWFscygib2F1dGgiKSk7Ci0gICAgICAgIGJvb2xlYW4gbm9uZSA9ICFzdGFuZGFyZCAmJiAhbnRsbTsKLSAgICAgICAgYXV0aGVudGljYXRpb25Ob25lQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigiTm9uZSIsIG5vbmUpOwotICAgICAgICBhdXRoZW50aWNhdGlvblN0YW5kYXJkQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigiU3RhbmRhcmQiLCBzdGFuZGFyZCk7Ci0gICAgICAgIGF1dGhlbnRpY2F0aW9uTlRMTUJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIk5UTE0iLCBudGxtKTsKLSAgICAgICAgYXV0aGVudGljYXRpb25PQXV0aEJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIk9BdXRoIDIuMCAoQmVhcmVyIFRva2VuKSIsIG9hdXRoKTsKLSAgICAgICAgQnV0dG9uR3JvdXAgYXV0aGVudGljYXRpb25Hcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotICAgICAgICBhdXRoZW50aWNhdGlvbkdyb3VwLmFkZChhdXRoZW50aWNhdGlvbk5vbmVCdXR0b24pOwotICAgICAgICBhdXRoZW50aWNhdGlvbkdyb3VwLmFkZChhdXRoZW50aWNhdGlvblN0YW5kYXJkQnV0dG9uKTsKLSAgICAgICAgYXV0aGVudGljYXRpb25Hcm91cC5hZGQoYXV0aGVudGljYXRpb25OVExNQnV0dG9uKTsKLSAgICAgICAgYXV0aGVudGljYXRpb25Hcm91cC5hZGQoYXV0aGVudGljYXRpb25PQXV0aEJ1dHRvbik7Ci0gICAgICAgIGF1dGhlbnRpY2F0aW9uQ29udGFpbmVyLmFkZChhdXRoZW50aWNhdGlvbk5vbmVCdXR0b24pOwotICAgICAgICBhdXRoZW50aWNhdGlvbkNvbnRhaW5lci5hZGQoQm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEwLCAwKSkpOwotICAgICAgICBhdXRoZW50aWNhdGlvbkNvbnRhaW5lci5hZGQoYXV0aGVudGljYXRpb25TdGFuZGFyZEJ1dHRvbik7Ci0gICAgICAgIGF1dGhlbnRpY2F0aW9uQ29udGFpbmVyLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMTAsIDApKSk7Ci0gICAgICAgIGF1dGhlbnRpY2F0aW9uQ29udGFpbmVyLmFkZChhdXRoZW50aWNhdGlvbk5UTE1CdXR0b24pOwotICAgICAgICBhdXRoZW50aWNhdGlvbkNvbnRhaW5lci5hZGQoQm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEwLCAwKSkpOwotICAgICAgICBhdXRoZW50aWNhdGlvbkNvbnRhaW5lci5hZGQoYXV0aGVudGljYXRpb25PQXV0aEJ1dHRvbik7Ci0gICAgICAgIEpMYWJlbCBhdXRoZW50aWNhdGlvTGFiZWwgPSBuZXcgSkxhYmVsKCJBdXRoZW50aWNhdGlvbjoiLCBKTGFiZWwuVFJBSUxJTkcpOwotCi0gICAgICAgIHBhbmUuYWRkKGF1dGhlbnRpY2F0aW9MYWJlbCk7Ci0gICAgICAgIHBhbmUuYWRkKGF1dGhlbnRpY2F0aW9uQ29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29tcHJlc3Npb25CdXR0b25zKENvbnRhaW5lciBwYW5lKSB7Ci0gICAgICAgIEpQYW5lbCBjb21wcmVzc2lvbkNvbnRhaW5lciA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgY29tcHJlc3Npb25Db250YWluZXIuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoY29tcHJlc3Npb25Db250YWluZXIsIEJveExheW91dC5MSU5FX0FYSVMpKTsKLSAgICAgICAgYm9vbGVhbiBjb21wcmVzc2lvbiA9ICEoU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfQ09NUFJFU1NJT04sICJvbiIpLmVxdWFsc0lnbm9yZUNhc2UoIm9mZiIpKTsKLSAgICAgICAgY29tcHJlc3Npb25PbkJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIk9uIiwgY29tcHJlc3Npb24pOwotICAgICAgICBjb21wcmVzc2lvbk9mZkJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIk9mZiIsICFjb21wcmVzc2lvbik7Ci0gICAgICAgIEJ1dHRvbkdyb3VwIGNvbXByZXNzaW9uR3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKLSAgICAgICAgY29tcHJlc3Npb25Hcm91cC5hZGQoY29tcHJlc3Npb25PbkJ1dHRvbik7Ci0gICAgICAgIGNvbXByZXNzaW9uR3JvdXAuYWRkKGNvbXByZXNzaW9uT2ZmQnV0dG9uKTsKLSAgICAgICAgY29tcHJlc3Npb25Db250YWluZXIuYWRkKGNvbXByZXNzaW9uT25CdXR0b24pOwotICAgICAgICBjb21wcmVzc2lvbkNvbnRhaW5lci5hZGQoQm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEwLCAwKSkpOwotICAgICAgICBjb21wcmVzc2lvbkNvbnRhaW5lci5hZGQoY29tcHJlc3Npb25PZmZCdXR0b24pOwotICAgICAgICBKTGFiZWwgY29tcHJlc3Npb25MYWJlbCA9IG5ldyBKTGFiZWwoIkNvbXByZXNzaW9uOiIsIEpMYWJlbC5UUkFJTElORyk7Ci0KLSAgICAgICAgcGFuZS5hZGQoY29tcHJlc3Npb25MYWJlbCk7Ci0gICAgICAgIHBhbmUuYWRkKGNvbXByZXNzaW9uQ29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ2xpZW50Q29tcHJlc3Npb25CdXR0b25zKENvbnRhaW5lciBwYW5lKSB7Ci0gICAgICAgIEpQYW5lbCBjbGllbnRDb21wcmVzc2lvbkNvbnRhaW5lciA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgY2xpZW50Q29tcHJlc3Npb25Db250YWluZXIuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoY2xpZW50Q29tcHJlc3Npb25Db250YWluZXIsIEJveExheW91dC5MSU5FX0FYSVMpKTsKLSAgICAgICAgYm9vbGVhbiBjbGllbnRDb21wcmVzc2lvbiA9IChTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTUFJPUF9DTElFTlRDT01QUkVTU0lPTiwgIm9mZiIpLmVxdWFsc0lnbm9yZUNhc2UoIm9uIikpOwotICAgICAgICBjbGllbnRDb21wcmVzc2lvbk9uQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigiT24iLCBjbGllbnRDb21wcmVzc2lvbik7Ci0gICAgICAgIGNsaWVudENvbXByZXNzaW9uT2ZmQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigiT2ZmIiwgIWNsaWVudENvbXByZXNzaW9uKTsKLSAgICAgICAgQnV0dG9uR3JvdXAgY2xpZW50Q29tcHJlc3Npb25Hcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotICAgICAgICBjbGllbnRDb21wcmVzc2lvbkdyb3VwLmFkZChjbGllbnRDb21wcmVzc2lvbk9uQnV0dG9uKTsKLSAgICAgICAgY2xpZW50Q29tcHJlc3Npb25Hcm91cC5hZGQoY2xpZW50Q29tcHJlc3Npb25PZmZCdXR0b24pOwotICAgICAgICBjbGllbnRDb21wcmVzc2lvbkNvbnRhaW5lci5hZGQoY2xpZW50Q29tcHJlc3Npb25PbkJ1dHRvbik7Ci0gICAgICAgIGNsaWVudENvbXByZXNzaW9uQ29udGFpbmVyLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMTAsIDApKSk7Ci0gICAgICAgIGNsaWVudENvbXByZXNzaW9uQ29udGFpbmVyLmFkZChjbGllbnRDb21wcmVzc2lvbk9mZkJ1dHRvbik7Ci0gICAgICAgIEpMYWJlbCBjbGllbnRDb21wcmVzc2lvbkxhYmVsID0gbmV3IEpMYWJlbCgiQ2xpZW50IENvbXByZXNzaW9uOiIsIEpMYWJlbC5UUkFJTElORyk7Ci0KLSAgICAgICAgcGFuZS5hZGQoY2xpZW50Q29tcHJlc3Npb25MYWJlbCk7Ci0gICAgICAgIHBhbmUuYWRkKGNsaWVudENvbXByZXNzaW9uQ29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29va2llQnV0dG9ucyhDb250YWluZXIgcGFuZSkgewotICAgICAgICBKUGFuZWwgY29va2llc0NvbnRhaW5lciA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgY29va2llc0NvbnRhaW5lci5zZXRMYXlvdXQobmV3IEJveExheW91dChjb29raWVzQ29udGFpbmVyLCBCb3hMYXlvdXQuTElORV9BWElTKSk7Ci0gICAgICAgIGJvb2xlYW4gY29va2llcyA9IChTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTUFJPUF9DT09LSUVTLCAib24iKS5lcXVhbHNJZ25vcmVDYXNlKCJvbiIpKTsKLSAgICAgICAgY29va2llc09uQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigiT24iLCBjb29raWVzKTsKLSAgICAgICAgY29va2llc09mZkJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIk9mZiIsICFjb29raWVzKTsKLSAgICAgICAgQnV0dG9uR3JvdXAgY29va2llc0dyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgICAgIGNvb2tpZXNHcm91cC5hZGQoY29va2llc09uQnV0dG9uKTsKLSAgICAgICAgY29va2llc0dyb3VwLmFkZChjb29raWVzT2ZmQnV0dG9uKTsKLSAgICAgICAgY29va2llc0NvbnRhaW5lci5hZGQoY29va2llc09uQnV0dG9uKTsKLSAgICAgICAgY29va2llc0NvbnRhaW5lci5hZGQoQm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEwLCAwKSkpOwotICAgICAgICBjb29raWVzQ29udGFpbmVyLmFkZChjb29raWVzT2ZmQnV0dG9uKTsKLSAgICAgICAgSkxhYmVsIGNvb2tpZXNMYWJlbCA9IG5ldyBKTGFiZWwoIkNvb2tpZXM6IiwgSkxhYmVsLlRSQUlMSU5HKTsKLQotICAgICAgICBwYW5lLmFkZChjb29raWVzTGFiZWwpOwotICAgICAgICBwYW5lLmFkZChjb29raWVzQ29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhYlRpdGxlKCkgewotICAgICAgICByZXR1cm4gIkJhc2ljIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTZXNzaW9uUGFyYW1ldGVycygpIHsKLSAgICAgICAgU3RyaW5nIHVybCA9IHVybEZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0KLSAgICAgICAgQmluZGluZ1R5cGUgYmluZGluZyA9IEJpbmRpbmdUeXBlLkFUT01QVUI7Ci0gICAgICAgIGlmIChiaW5kaW5nV2ViU2VydmljZXNCdXR0b24uaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICBiaW5kaW5nID0gQmluZGluZ1R5cGUuV0VCU0VSVklDRVM7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ0Jyb3dzZXJCdXR0b24uaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICBiaW5kaW5nID0gQmluZGluZ1R5cGUuQlJPV1NFUjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB1c2VybmFtZSA9IHVzZXJuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBuZXcgU3RyaW5nKHBhc3N3b3JkRmllbGQuZ2V0UGFzc3dvcmQoKSk7Ci0KLSAgICAgICAgQ2xpZW50U2Vzc2lvbi5BdXRoZW50aWNhdGlvbiBhdXRoZW50aWNhdGlvbiA9IENsaWVudFNlc3Npb24uQXV0aGVudGljYXRpb24uTk9ORTsKLSAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uU3RhbmRhcmRCdXR0b24uaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICBhdXRoZW50aWNhdGlvbiA9IENsaWVudFNlc3Npb24uQXV0aGVudGljYXRpb24uU1RBTkRBUkQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXV0aGVudGljYXRpb25OVExNQnV0dG9uLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgYXV0aGVudGljYXRpb24gPSBDbGllbnRTZXNzaW9uLkF1dGhlbnRpY2F0aW9uLk5UTE07Ci0gICAgICAgIH0gZWxzZSBpZiAoYXV0aGVudGljYXRpb25PQXV0aEJ1dHRvbi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uID0gQ2xpZW50U2Vzc2lvbi5BdXRoZW50aWNhdGlvbi5PQVVUSF9CRUFSRVI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENsaWVudFNlc3Npb24uY3JlYXRlU2Vzc2lvblBhcmFtZXRlcnModXJsLCBiaW5kaW5nLCB1c2VybmFtZSwgcGFzc3dvcmQsIGF1dGhlbnRpY2F0aW9uLAotICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uT25CdXR0b24uaXNTZWxlY3RlZCgpLCBjbGllbnRDb21wcmVzc2lvbk9uQnV0dG9uLmlzU2VsZWN0ZWQoKSwgY29va2llc09uQnV0dG9uLmlzU2VsZWN0ZWQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdHJhbnNmZXJTZXNzaW9uUGFyYW1ldGVyc1RvRXhwZXJ0VGFiKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQ2hhbmdlTG9nRnJhbWUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DaGFuZ2VMb2dGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjM5ZjVhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DaGFuZ2VMb2dGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNoYW5nZUV2ZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkNvbGxlY3Rpb25SZW5kZXJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmcuR3JlZ29yaWFuQ2FsZW5kYXJSZW5kZXJlcjsKLQotcHVibGljIGNsYXNzIENoYW5nZUxvZ0ZyYW1lIGV4dGVuZHMgSkZyYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19USVRMRSA9ICJDTUlTIENoYW5nZSBMb2dnZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgSlRleHRGaWVsZCBjaGFuZ2VMb2dUb2tlbkZpZWxkOwotICAgIHByaXZhdGUgQ2hhbmdlTG9nVGFibGUgY2hhbmdlTG9nVGFibGU7Ci0KLSAgICBwdWJsaWMgQ2hhbmdlTG9nRnJhbWUoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIHNldFRpdGxlKFdJTkRPV19USVRMRSArICIgLSAiICsgbW9kZWwuZ2V0UmVwb3NpdG9yeU5hbWUoKSk7Ci0gICAgICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig3MDAsIDcwMCkpOwotICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDIwMCwgNjApKTsKLQotICAgICAgICBzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICBKUGFuZWwgaW5wdXRQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgaW5wdXRQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigzLCAzLCAzLCAzKSk7Ci0KLSAgICAgICAgaW5wdXRQYW5lbC5hZGQobmV3IEpMYWJlbCgiQ2hhbmdlIExvZyBUb2tlbjogIiksIEJvcmRlckxheW91dC5MSU5FX1NUQVJUKTsKLQotICAgICAgICBjaGFuZ2VMb2dUb2tlbkZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5nZUxvZ1Rva2VuRmllbGQuc2V0VGV4dChtb2RlbC5nZXRSZXBvc2l0b3J5SW5mbygpLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgY2hhbmdlTG9nVG9rZW5GaWVsZC5zZXRUZXh0KCIiKTsKLSAgICAgICAgfQotICAgICAgICBpbnB1dFBhbmVsLmFkZChjaGFuZ2VMb2dUb2tlbkZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBKQnV0dG9uIGxvYWRCdXR0b24gPSBuZXcgSkJ1dHRvbigiTG9hZCIpOwotICAgICAgICBsb2FkQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBjaGFuZ2VMb2dUb2tlbiA9IGNoYW5nZUxvZ1Rva2VuRmllbGQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VMb2dUb2tlbi50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VMb2dUb2tlbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ2hhbmdlRXZlbnRzIGV2ZW50cyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgICAgICBldmVudHMgPSBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmdldENvbnRlbnRDaGFuZ2VzKGNoYW5nZUxvZ1Rva2VuLCB0cnVlLCAxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2hhbmdlTG9nVGFibGUuc2V0Q2hhbmdlRXZlbnRzKGV2ZW50cy5nZXRDaGFuZ2VFdmVudHMoKSk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlTG9nVG9rZW5GaWVsZC5zZXRUZXh0KGV2ZW50cy5nZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbigpID09IG51bGwgPyAiIiA6IGV2ZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhdGVzdENoYW5nZUxvZ1Rva2VuKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW5wdXRQYW5lbC5hZGQobG9hZEJ1dHRvbiwgQm9yZGVyTGF5b3V0LkxJTkVfRU5EKTsKLSAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGxvYWRCdXR0b24pOwotCi0gICAgICAgIGFkZChpbnB1dFBhbmVsLCBCb3JkZXJMYXlvdXQuUEFHRV9TVEFSVCk7Ci0KLSAgICAgICAgY2hhbmdlTG9nVGFibGUgPSBuZXcgQ2hhbmdlTG9nVGFibGUoKTsKLSAgICAgICAgYWRkKG5ldyBKU2Nyb2xsUGFuZShjaGFuZ2VMb2dUYWJsZSksIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgIENsaWVudEhlbHBlci5pbnN0YWxsRXNjYXBlQmluZGluZyh0aGlzLCBnZXRSb290UGFuZSgpLCB0cnVlKTsKLQotICAgICAgICBzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkRJU1BPU0VfT05fQ0xPU0UpOwotICAgICAgICBwYWNrKCk7Ci0KLSAgICAgICAgc2V0TG9jYXRpb25SZWxhdGl2ZVRvKG51bGwpOwotICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDaGFuZ2VMb2dUYWJsZSBleHRlbmRzIEpUYWJsZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OX05BTUVTID0geyAiQ2hhbmdlIFR5cGUiLCAiT2JqZWN0IElkIiwgIkNoYW5nZSBUaW1lIiwgIlByb3BlcnRpZXMiIH07Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENPTFVNTl9XSURUSFMgPSB7IDEwMCwgMjAwLCAyMDAsIDQwMCB9OwotCi0gICAgICAgIHByaXZhdGUgTGlzdDxDaGFuZ2VFdmVudD4gY2hhbmdlRXZlbnRzOwotCi0gICAgICAgIHB1YmxpYyBDaGFuZ2VMb2dUYWJsZSgpIHsKLSAgICAgICAgICAgIHNldERlZmF1bHRSZW5kZXJlcihHcmVnb3JpYW5DYWxlbmRhci5jbGFzcywgbmV3IEdyZWdvcmlhbkNhbGVuZGFyUmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBzZXREZWZhdWx0UmVuZGVyZXIoQ29sbGVjdGlvbi5jbGFzcywgbmV3IENvbGxlY3Rpb25SZW5kZXJlcigpKTsKLSAgICAgICAgICAgIHNldE1vZGVsKG5ldyBDaGFuZ2VMb2dUYWJsZU1vZGVsKHRoaXMpKTsKLQotICAgICAgICAgICAgc2V0QXV0b1Jlc2l6ZU1vZGUoQVVUT19SRVNJWkVfT0ZGKTsKLSAgICAgICAgICAgIHNldEF1dG9DcmVhdGVSb3dTb3J0ZXIodHJ1ZSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09MVU1OX1dJRFRIUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IGdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKGkpOwotICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRQcmVmZXJyZWRXaWR0aChDT0xVTU5fV0lEVEhTW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0RmlsbHNWaWV3cG9ydEhlaWdodCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENoYW5nZUV2ZW50cyhMaXN0PENoYW5nZUV2ZW50PiBjaGFuZ2VFdmVudHMpIHsKLSAgICAgICAgICAgIHRoaXMuY2hhbmdlRXZlbnRzID0gY2hhbmdlRXZlbnRzOwotICAgICAgICAgICAgKChBYnN0cmFjdFRhYmxlTW9kZWwpIGdldE1vZGVsKCkpLmZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxDaGFuZ2VFdmVudD4gZ2V0Q2hhbmdlRXZlbnRzKCkgewotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZUV2ZW50czsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBjbGFzcyBDaGFuZ2VMb2dUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsKLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ2hhbmdlTG9nVGFibGUgdGFibGU7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBDaGFuZ2VMb2dUYWJsZU1vZGVsKENoYW5nZUxvZ1RhYmxlIHRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENPTFVNTl9OQU1FU1tjb2x1bW5JbmRleF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENPTFVNTl9OQU1FUy5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRhYmxlLmdldENoYW5nZUV2ZW50cygpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldENoYW5nZUV2ZW50cygpLnNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgQ2hhbmdlRXZlbnQgZXZlbnQgPSB0YWJsZS5nZXRDaGFuZ2VFdmVudHMoKS5nZXQocm93SW5kZXgpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChldmVudC5nZXRDaGFuZ2VUeXBlKCkgPT0gbnVsbCA/ICI/IiA6IGV2ZW50LmdldENoYW5nZVR5cGUoKS52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXZlbnQuZ2V0T2JqZWN0SWQoKSA9PSBudWxsID8gIj8iIDogZXZlbnQuZ2V0T2JqZWN0SWQoKSk7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuZ2V0Q2hhbmdlVGltZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENsYXNzPD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBHcmVnb3JpYW5DYWxlbmRhci5jbGFzczsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb24uY2xhc3M7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldENvbHVtbkNsYXNzKGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DbGllbnRGcmFtZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NsaWVudEZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmIxM2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NsaWVudEZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db250YWluZXI7Ci1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmF3dC5XaW5kb3c7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkltYWdlSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBvcHVwTWVudTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUb29sQmFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5DbGllbnRIZWxwZXIuRmlsZUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5kZXRhaWxzLkRldGFpbHNUYWJzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50U2Vzc2lvbjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50RnJhbWUgZXh0ZW5kcyBKRnJhbWUgaW1wbGVtZW50cyBXaW5kb3dMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDbGllbnRGcmFtZS5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX1NDUklQVFMgPSBDbGllbnRTZXNzaW9uLldPUktCRU5DSF9QUkVGSVggKyAic2NyaXB0cyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX1RJVExFID0gIkNNSVMgV29ya2JlbmNoIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fQ09OTkVDVCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9SRVBPU0lUT1JZX0lORk8gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fVFlQRVMgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fUVVFUlkgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fQ0hBTkdFTE9HID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0NPTlNPTEUgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fVENLID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0NSRUFURSA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9MT0cgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fSU5GTyA9IDk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfWCA9ICJ4IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfWSA9ICJ5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfV0lEVEggPSAid2lkdGgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU19IRUlHSFQgPSAiaGVpZ2h0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRlNfRElWID0gImRpdiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPT1ZZX1NDUklQVF9GT0xERVIgPSAiL3NjcmlwdHMvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPT1ZZX1NDUklQVF9MSUJSQVJZID0gInNjcmlwdC1saWJyYXJ5LnByb3BlcnRpZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBQcmVmZXJlbmNlcyBwcmVmcyA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZSh0aGlzLmdldENsYXNzKCkpOwotCi0gICAgcHJpdmF0ZSBMb2dpbkRpYWxvZyBsb2dpbkRpYWxvZzsKLSAgICBwcml2YXRlIExvZ0ZyYW1lIGxvZ0ZyYW1lOwotICAgIHByaXZhdGUgSW5mb0RpYWxvZyBpbmZvRGlhbG9nOwotCi0gICAgcHJpdmF0ZSBKVG9vbEJhciB0b29sQmFyOwotICAgIHByaXZhdGUgSkJ1dHRvbltdIHRvb2xiYXJCdXR0b247Ci0gICAgcHJpdmF0ZSBKUG9wdXBNZW51IHRvb2xiYXJDb25zb2xlUG9wdXA7Ci0gICAgcHJpdmF0ZSBKUG9wdXBNZW51IHRvb2xiYXJDcmVhdGVQb3B1cDsKLSAgICBwcml2YXRlIEpNZW51SXRlbSBkb2N1bWVudE1lbnVJdGVtOwotICAgIHByaXZhdGUgSk1lbnVJdGVtIGl0ZW1NZW51SXRlbTsKLSAgICBwcml2YXRlIEpNZW51SXRlbSBmb2xkZXJNZW51SXRlbTsKLSAgICBwcml2YXRlIEpNZW51SXRlbSByZWxhdGlvbnNoaXBNZW51SXRlbTsKLQotICAgIHByaXZhdGUgSlNwbGl0UGFuZSBzcGxpdDsKLSAgICBwcml2YXRlIEZvbGRlclBhbmVsIGZvbGRlclBhbmVsOwotICAgIHByaXZhdGUgRGV0YWlsc1RhYnMgZGV0YWlsc1RhYnM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIENsaWVudEZyYW1lKCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgICAgIG1vZGVsID0gbmV3IENsaWVudE1vZGVsKCk7Ci0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgICAgICBzaG93TG9naW5Gb3JtKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgc2V0VGl0bGUoV0lORE9XX1RJVExFKTsKLQotICAgICAgICBJbWFnZUljb24gaWNvbiA9IENsaWVudEhlbHBlci5nZXRJY29uKCJpY29uLnBuZyIpOwotICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRJY29uSW1hZ2UoaWNvbi5nZXRJbWFnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hYyBPUyBYIGdvb2RpZXMKLSAgICAgICAgaWYgKENsaWVudEhlbHBlci5pc01hY09TWCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzPD8+IG1hY0FwcENsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmFwcGxlLmVhd3QuQXBwbGljYXRpb24iKTsKLSAgICAgICAgICAgICAgICBNZXRob2QgbWFjQXBwR2V0QXBwID0gbWFjQXBwQ2xhc3MuZ2V0TWV0aG9kKCJnZXRBcHBsaWNhdGlvbiIsIChDbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgbWFjQXBwID0gbWFjQXBwR2V0QXBwLmludm9rZShudWxsLCAoT2JqZWN0W10pIG51bGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGljb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFjQXBwQ2xhc3MuZ2V0TWV0aG9kKCJzZXREb2NrSWNvbkltYWdlIiwgbmV3IENsYXNzPD8+W10geyBJbWFnZS5jbGFzcyB9KS5pbnZva2UobWFjQXBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBpY29uLmdldEltYWdlKCkgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNvdWxkIG5vdCBzZXQgZG9jayBpY29uISIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZnVsbHNjcmVlbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmFwcGxlLmVhd3QuRnVsbFNjcmVlblV0aWxpdGllcyIpOwotICAgICAgICAgICAgICAgICAgICBmdWxsc2NyZWVuQ2xhc3MuZ2V0TWV0aG9kKCJzZXRXaW5kb3dDYW5GdWxsU2NyZWVuIiwgbmV3IENsYXNzPD8+W10geyBXaW5kb3cuY2xhc3MsIEJvb2xlYW4uVFlQRSB9KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZva2UoZnVsbHNjcmVlbkNsYXNzLCB0aGlzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNvdWxkIG5vdCBhZGQgZnVsbHNjcmVlbiBidXR0b24hIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNvdWxkIG5vdCBnZXQgY29tLmFwcGxlLmVhd3QuQXBwbGljYXRpb24gb2JqZWN0ISIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0KLSAgICAgICAgZmluYWwgQ2xpZW50RnJhbWUgdGhpc0ZyYW1lID0gdGhpczsKLSAgICAgICAgbG9naW5EaWFsb2cgPSBuZXcgTG9naW5EaWFsb2codGhpcyk7Ci0gICAgICAgIGxvZ0ZyYW1lID0gbmV3IExvZ0ZyYW1lKCk7Ci0gICAgICAgIGluZm9EaWFsb2cgPSBuZXcgSW5mb0RpYWxvZyh0aGlzKTsKLQotICAgICAgICBDb250YWluZXIgcGFuZSA9IGdldENvbnRlbnRQYW5lKCk7Ci0KLSAgICAgICAgdG9vbEJhciA9IG5ldyBKVG9vbEJhcigiQ01JUyBUb29sYmFyIiwgSlRvb2xCYXIuSE9SSVpPTlRBTCk7Ci0KLSAgICAgICAgdG9vbGJhckJ1dHRvbiA9IG5ldyBKQnV0dG9uWzEwXTsKLQotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DT05ORUNUXSA9IG5ldyBKQnV0dG9uKCJDb25uZWN0aW9uIiwgQ2xpZW50SGVscGVyLmdldEljb24oImNvbm5lY3QucG5nIikpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DT05ORUNUXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNob3dMb2dpbkZvcm0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdG9vbEJhci5hZGQodG9vbGJhckJ1dHRvbltCVVRUT05fQ09OTkVDVF0pOwotCi0gICAgICAgIHRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0KLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fUkVQT1NJVE9SWV9JTkZPXSA9IG5ldyBKQnV0dG9uKCJSZXBvc2l0b3J5IEluZm8iLAotICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5nZXRJY29uKCJyZXBvc2l0b3J5LWluZm8ucG5nIikpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9SRVBPU0lUT1JZX0lORk9dLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9SRVBPU0lUT1JZX0lORk9dLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbmV3IFJlcG9zaXRvcnlJbmZvRnJhbWUobW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0b29sQmFyLmFkZCh0b29sYmFyQnV0dG9uW0JVVFRPTl9SRVBPU0lUT1JZX0lORk9dKTsKLQotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9UWVBFU10gPSBuZXcgSkJ1dHRvbigiVHlwZXMiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigidHlwZXMucG5nIikpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9UWVBFU10uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1RZUEVTXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG5ldyBUeXBlc0ZyYW1lKG1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdG9vbEJhci5hZGQodG9vbGJhckJ1dHRvbltCVVRUT05fVFlQRVNdKTsKLQotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9RVUVSWV0gPSBuZXcgSkJ1dHRvbigiUXVlcnkiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigicXVlcnkucG5nIikpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9RVUVSWV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1FVRVJZXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG5ldyBRdWVyeUZyYW1lKG1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdG9vbEJhci5hZGQodG9vbGJhckJ1dHRvbltCVVRUT05fUVVFUlldKTsKLQotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DSEFOR0VMT0ddID0gbmV3IEpCdXR0b24oIkNoYW5nZSBMb2ciLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigiY2hhbmdlbG9nLnBuZyIpKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ0hBTkdFTE9HXS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ0hBTkdFTE9HXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VMb2dGcmFtZShtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRvb2xCYXIuYWRkKHRvb2xiYXJCdXR0b25bQlVUVE9OX0NIQU5HRUxPR10pOwotCi0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX0NPTlNPTEVdID0gbmV3IEpCdXR0b24oIkNvbnNvbGUiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigiY29uc29sZS5wbmciKSk7Ci0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX0NPTlNPTEVdLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DT05TT0xFXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRvb2xiYXJDb25zb2xlUG9wdXAuc2hvdyh0b29sYmFyQnV0dG9uW0JVVFRPTl9DT05TT0xFXSwgMCwgdG9vbGJhckJ1dHRvbltCVVRUT05fQ09OU09MRV0uZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0b29sQmFyLmFkZCh0b29sYmFyQnV0dG9uW0JVVFRPTl9DT05TT0xFXSk7Ci0KLSAgICAgICAgdG9vbGJhckNvbnNvbGVQb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0gICAgICAgIGZvciAoRmlsZUVudHJ5IGZlIDogcmVhZFNjcmlwdExpYnJhcnkoKSkgewotICAgICAgICAgICAgSk1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IEpNZW51SXRlbShmZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgZmluYWwgVVJJIGZpbGUgPSBmZS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBtZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLm9wZW5Db25zb2xlKENsaWVudEZyYW1lLnRoaXMsIG1vZGVsLCBmaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHRvb2xiYXJDb25zb2xlUG9wdXAuYWRkKG1lbnVJdGVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1RDS10gPSBuZXcgSkJ1dHRvbigiVENLIiwgQ2xpZW50SGVscGVyLmdldEljb24oInRjay5wbmciKSk7Ci0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1RDS10uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1RDS10uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBuZXcgVGNrRGlhbG9nKHRoaXNGcmFtZSwgbW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0b29sQmFyLmFkZCh0b29sYmFyQnV0dG9uW0JVVFRPTl9UQ0tdKTsKLQotICAgICAgICB0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCi0gICAgICAgIHRvb2xiYXJDcmVhdGVQb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0gICAgICAgIGRvY3VtZW50TWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJEb2N1bWVudCIpOwotICAgICAgICBkb2N1bWVudE1lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRvb2xiYXJDcmVhdGVQb3B1cC5hZGQoZG9jdW1lbnRNZW51SXRlbSk7Ci0gICAgICAgIGRvY3VtZW50TWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBuZXcgQ3JlYXRlRG9jdW1lbnREaWFsb2codGhpc0ZyYW1lLCBtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGl0ZW1NZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIkl0ZW0iKTsKLSAgICAgICAgaXRlbU1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0b29sYmFyQ3JlYXRlUG9wdXAuYWRkKGl0ZW1NZW51SXRlbSk7Ci0gICAgICAgIGl0ZW1NZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIG5ldyBDcmVhdGVJdGVtRGlhbG9nKHRoaXNGcmFtZSwgbW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmb2xkZXJNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIkZvbGRlciIpOwotICAgICAgICBmb2xkZXJNZW51SXRlbS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0b29sYmFyQ3JlYXRlUG9wdXAuYWRkKGZvbGRlck1lbnVJdGVtKTsKLSAgICAgICAgZm9sZGVyTWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBuZXcgQ3JlYXRlRm9sZGVyRGlhbG9nKHRoaXNGcmFtZSwgbW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZWxhdGlvbnNoaXBNZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIlJlbGF0aW9uc2hpcCIpOwotICAgICAgICByZWxhdGlvbnNoaXBNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdG9vbGJhckNyZWF0ZVBvcHVwLmFkZChyZWxhdGlvbnNoaXBNZW51SXRlbSk7Ci0gICAgICAgIHJlbGF0aW9uc2hpcE1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgbmV3IENyZWF0ZVJlbGF0aW9uc2hpcERpYWxvZyh0aGlzRnJhbWUsIG1vZGVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXSA9IG5ldyBKQnV0dG9uKCJDcmVhdGUgT2JqZWN0IiwgQ2xpZW50SGVscGVyLmdldEljb24oIm5ld2RvY3VtZW50LnBuZyIpKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRvb2xiYXJDcmVhdGVQb3B1cC5zaG93KHRvb2xiYXJCdXR0b25bQlVUVE9OX0NSRUFURV0sIDAsIHRvb2xiYXJCdXR0b25bQlVUVE9OX0NSRUFURV0uZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0b29sQmFyLmFkZCh0b29sYmFyQnV0dG9uW0JVVFRPTl9DUkVBVEVdKTsKLQotICAgICAgICB0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCi0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX0xPR10gPSBuZXcgSkJ1dHRvbigiTG9nIiwgQ2xpZW50SGVscGVyLmdldEljb24oImxvZy5wbmciKSk7Ci0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX0xPR10uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBsb2dGcmFtZS5zaG93RnJhbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdG9vbEJhci5hZGQodG9vbGJhckJ1dHRvbltCVVRUT05fTE9HXSk7Ci0KLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fSU5GT10gPSBuZXcgSkJ1dHRvbigiSW5mbyIsIENsaWVudEhlbHBlci5nZXRJY29uKCJpbmZvLnBuZyIpKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fSU5GT10uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbmZvRGlhbG9nLnNob3dEaWFsb2coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdG9vbEJhci5hZGQodG9vbGJhckJ1dHRvbltCVVRUT05fSU5GT10pOwotCi0gICAgICAgIHBhbmUuYWRkKHRvb2xCYXIsIEJvcmRlckxheW91dC5QQUdFX1NUQVJUKTsKLQotICAgICAgICBmb2xkZXJQYW5lbCA9IG5ldyBGb2xkZXJQYW5lbChtb2RlbCk7Ci0gICAgICAgIGRldGFpbHNUYWJzID0gbmV3IERldGFpbHNUYWJzKG1vZGVsKTsKLQotICAgICAgICBzcGxpdCA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCwgZm9sZGVyUGFuZWwsIGRldGFpbHNUYWJzKTsKLQotICAgICAgICBwYW5lLmFkZChzcGxpdCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgYWRkV2luZG93TGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHByZWZzLmdldEludChQUkVGU19XSURUSCwgMTAwMCksIHByZWZzLmdldEludChQUkVGU19IRUlHSFQsIDYwMCkpKTsKLSAgICAgICAgc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbigyMDAsIDYwKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgcGFjaygpOwotCi0gICAgICAgIHNwbGl0LnNldERpdmlkZXJMb2NhdGlvbihwcmVmcy5nZXRJbnQoUFJFRlNfRElWLCA1MDApKTsKLQotICAgICAgICBpZiAocHJlZnMuZ2V0SW50KFBSRUZTX1gsIEludGVnZXIuTUFYX1ZBTFVFKSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgc2V0TG9jYXRpb25SZWxhdGl2ZVRvKG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0TG9jYXRpb24ocHJlZnMuZ2V0SW50KFBSRUZTX1gsIDApLCBwcmVmcy5nZXRJbnQoUFJFRlNfWSwgMCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0xvZ2luRm9ybSgpIHsKLSAgICAgICAgbG9naW5EaWFsb2cuc2hvd0RpYWxvZygpOwotICAgICAgICBpZiAoIWxvZ2luRGlhbG9nLmlzQ2FuY2VsZWQoKSkgewotICAgICAgICAgICAgQ2xpZW50U2Vzc2lvbiBjbGllbnRTZXNzaW9uID0gbG9naW5EaWFsb2cuZ2V0Q2xpZW50U2Vzc2lvbigpOwotCi0gICAgICAgICAgICBtb2RlbC5zZXRDbGllbnRTZXNzaW9uKGNsaWVudFNlc3Npb24pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgICAgIG1vZGVsLmxvYWRGb2xkZXIoY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCkuZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRSb290Rm9sZGVySWQoKSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIG1vZGVsLmxvYWRPYmplY3QoY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCkuZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRSb290Rm9sZGVySWQoKSk7Ci0KLSAgICAgICAgICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9SRVBPU0lUT1JZX0lORk9dLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fVFlQRVNdLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fUVVFUlldLnNldEVuYWJsZWQobW9kZWwuc3VwcG9ydHNRdWVyeSgpKTsKLSAgICAgICAgICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DSEFOR0VMT0ddLnNldEVuYWJsZWQobW9kZWwuc3VwcG9ydHNDaGFuZ2VMb2coKSk7Ci0gICAgICAgICAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ09OU09MRV0uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9UQ0tdLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXS5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgICAgICAgICAgICAgaXRlbU1lbnVJdGVtLnNldEVuYWJsZWQobW9kZWwuc3VwcG9ydHNJdGVtcygpKTsKLSAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBNZW51SXRlbS5zZXRFbmFibGVkKG1vZGVsLnN1cHBvcnRzUmVsYXRpb25zaGlwcygpKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB1c2VyID0gY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uUGFyYW1ldGVycygpLmdldChTZXNzaW9uUGFyYW1ldGVyLlVTRVIpOwotICAgICAgICAgICAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlciA9ICIgLSAoIiArIHVzZXIgKyAiKSI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlciA9ICIiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNldFRpdGxlKFdJTkRPV19USVRMRSArIHVzZXIgKyAiIC0gIiArIGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1JFUE9TSVRPUllfSU5GT10uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fVFlQRVNdLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1FVRVJZXS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DSEFOR0VMT0ddLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX0NPTlNPTEVdLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1RDS10uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXS5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZXgpOwotCi0gICAgICAgICAgICAgICAgc2V0VGl0bGUoV0lORE9XX1RJVExFKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PEZpbGVFbnRyeT4gcmVhZFNjcmlwdExpYnJhcnkoKSB7Ci0KLSAgICAgICAgVVJJIHByb3BGaWxlID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgZXh0ZXJuYWxTY3JpcHRzID0gU3lzdGVtLmdldFByb3BlcnR5KFNZU1BST1BfU0NSSVBUUyk7Ci0gICAgICAgIGlmIChleHRlcm5hbFNjcmlwdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcEZpbGUgPSBDbGllbnRIZWxwZXIuZ2V0Q2xhc3NwYXRoVVJJKEdST09WWV9TQ1JJUFRfRk9MREVSICsgR1JPT1ZZX1NDUklQVF9MSUJSQVJZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb3BGaWxlID0gKG5ldyBGaWxlKGV4dGVybmFsU2NyaXB0cykpLnRvVVJJKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PEZpbGVFbnRyeT4gcmVzdWx0ID0gQ2xpZW50SGVscGVyLnJlYWRGaWxlUHJvcGVydGllcyhwcm9wRmlsZSk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IEZpbGVFbnRyeSgiR3Jvb3Z5IENvbnNvbGUiLCBudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgIFBvaW50IHAgPSBnZXRMb2NhdGlvbigpOwotICAgICAgICBwcmVmcy5wdXRJbnQoUFJFRlNfWCwgcC54KTsKLSAgICAgICAgcHJlZnMucHV0SW50KFBSRUZTX1ksIHAueSk7Ci0gICAgICAgIHByZWZzLnB1dEludChQUkVGU19XSURUSCwgZ2V0V2lkdGgoKSk7Ci0gICAgICAgIHByZWZzLnB1dEludChQUkVGU19IRUlHSFQsIGdldEhlaWdodCgpKTsKLSAgICAgICAgcHJlZnMucHV0SW50KFBSRUZTX0RJViwgc3BsaXQuZ2V0RGl2aWRlckxvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2luZG93SWNvbmlmaWVkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dEZWljb25pZmllZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2luZG93QWN0aXZhdGVkKFdpbmRvd0V2ZW50IGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NsaWVudEhlbHBlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NsaWVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWU3NjA1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DbGllbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgZ3Jvb3Z5LmxhbmcuQmluZGluZzsKLWltcG9ydCBncm9vdnkudWkuQ29uc29sZTsKLWltcG9ydCBncm9vdnkudXRpbC5Hcm9vdnlTY3JpcHRFbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkRlc2t0b3A7Ci1pbXBvcnQgamF2YS5hd3QuRGVza3RvcC5BY3Rpb247Ci1pbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKLWltcG9ydCBqYXZhLmF3dC5XaW5kb3c7Ci1pbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLkNsaXBib2FyZDsKLWltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuU3RyaW5nU2VsZWN0aW9uOwotaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5UcmFuc2ZlcmFibGU7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmU7Ci1pbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSW1hZ2VJY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLklucHV0TWFwOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZpbGVDaG9vc2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTWVudTsKLWltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlJvb3RQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5LZXlTdHJva2U7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQXR0cmlidXRlU2V0OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRGVmYXVsdEVkaXRvcktpdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5SZW5kaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNDb25zdHJhaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuTWltZVR5cGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50SGVscGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgTElOS19DT0xPUiA9IG5ldyBDb2xvcigxMDUsIDI5LCAyMSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBMSU5LX1NFTEVDVEVEX0NPTE9SID0gbmV3IENvbG9yKDI1NSwgMjU1LCAyNTUpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENsaWVudEhlbHBlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNjQgKiAxMDI0OwotCi0gICAgcHJpdmF0ZSBDbGllbnRIZWxwZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKEV4Y2VwdGlvbiBleCkgewotICAgICAgICBpZiAoTE9HLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy5lcnJvcihleC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICI6ICIgKyBleC5nZXRNZXNzYWdlKCksIGV4KTsKLQotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQ21pc0Jhc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBDbWlzQmFzZUV4Y2VwdGlvbiBjZXggPSAoQ21pc0Jhc2VFeGNlcHRpb24pIGV4OwotCi0gICAgICAgICAgICAgICAgaWYgKGNleC5nZXRDb2RlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkVycm9yIGNvZGU6ICIgKyBjZXguZ2V0Q29kZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2V4LmdldEVycm9yQ29udGVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJFcnJvciBjb250ZW50OiAiICsgY2V4LmdldEVycm9yQ29udGVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoTE9HLmlzRGVidWdFbmFibGVkKCkgJiYgY2V4LmdldENhdXNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkNhdXNlOiAiICsgY2V4LmdldENhdXNlKCkudG9TdHJpbmcoKSwgY2V4LmdldENhdXNlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RXJyb3IoQ29tcG9uZW50IHBhcmVudCwgRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIGxvZ0Vycm9yKGV4KTsKLQotICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTmFtZSA9IGV4LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBDbWlzQmFzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9ICgoQ21pc0Jhc2VFeGNlcHRpb24pIGV4KS5nZXRFeGNlcHRpb25OYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZXguZ2V0TWVzc2FnZSgpID09IG51bGwgPyAibnVsbCIgOiBleC5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIGludCB3aWR0aCA9IDgwOwotICAgICAgICB3aGlsZSAoc2IubGVuZ3RoKCkgPiB3aWR0aCkgewotICAgICAgICAgICAgaW50IHAgPSB3aWR0aDsKLQotICAgICAgICAgICAgaW50IHggPSBzYi5pbmRleE9mKCIgIiwgcCk7Ci0gICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+IHAgKyAxMCkgewotICAgICAgICAgICAgICAgIHggPSBzYi5pbmRleE9mKCIvIiwgcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+IHAgKyAxMCkgewotICAgICAgICAgICAgICAgIHggPSBzYi5pbmRleE9mKCI6IiwgcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+IHAgKyAxMCkgewotICAgICAgICAgICAgICAgIHggPSBwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5pbnNlcnQoeCwgJ1xuJyk7Ci0gICAgICAgICAgICB3aWR0aCA9IHggKyA4MDsKLSAgICAgICAgfQotCi0gICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHBhcmVudCwgZXhjZXB0aW9uTmFtZSArICI6XG4iICsgc2IsICJFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hY09TWCgpIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnN0YXJ0c1dpdGgoIk1hYyBPUyBYIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGxLZXlCaW5kaW5ncygpIHsKLSAgICAgICAgaWYgKGlzTWFjT1NYKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEtleVN0cm9rZSBjb3B5S2V5U3Ryb2tlID0gS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgibWV0YSBwcmVzc2VkIEMiKTsKLSAgICAgICAgICAgIGZpbmFsIEtleVN0cm9rZSBwYXN0ZUtleVN0cm9rZSA9IEtleVN0cm9rZS5nZXRLZXlTdHJva2UoIm1ldGEgcHJlc3NlZCBWIik7Ci0gICAgICAgICAgICBmaW5hbCBLZXlTdHJva2UgY3V0S2V5U3Ryb2tlID0gS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgibWV0YSBwcmVzc2VkIFgiKTsKLSAgICAgICAgICAgIGZpbmFsIEtleVN0cm9rZSBhbGxLZXlTdHJva2UgPSBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKCJtZXRhIHByZXNzZWQgQSIpOwotCi0gICAgICAgICAgICBJbnB1dE1hcCB0ZXh0RmllbGRNYXAgPSAoSW5wdXRNYXApIFVJTWFuYWdlci5nZXQoIlRleHRGaWVsZC5mb2N1c0lucHV0TWFwIik7Ci0gICAgICAgICAgICB0ZXh0RmllbGRNYXAucHV0KGNvcHlLZXlTdHJva2UsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbik7Ci0gICAgICAgICAgICB0ZXh0RmllbGRNYXAucHV0KHBhc3RlS2V5U3Ryb2tlLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uKTsKLSAgICAgICAgICAgIHRleHRGaWVsZE1hcC5wdXQoY3V0S2V5U3Ryb2tlLCBEZWZhdWx0RWRpdG9yS2l0LmN1dEFjdGlvbik7Ci0gICAgICAgICAgICB0ZXh0RmllbGRNYXAucHV0KGFsbEtleVN0cm9rZSwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3RBbGxBY3Rpb24pOwotCi0gICAgICAgICAgICBJbnB1dE1hcCBmb3JtYXR0ZWRUZXh0RmllbGRNYXAgPSAoSW5wdXRNYXApIFVJTWFuYWdlci5nZXQoIkZvcm1hdHRlZFRleHRGaWVsZC5mb2N1c0lucHV0TWFwIik7Ci0gICAgICAgICAgICBmb3JtYXR0ZWRUZXh0RmllbGRNYXAucHV0KGNvcHlLZXlTdHJva2UsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbik7Ci0gICAgICAgICAgICBmb3JtYXR0ZWRUZXh0RmllbGRNYXAucHV0KHBhc3RlS2V5U3Ryb2tlLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uKTsKLSAgICAgICAgICAgIGZvcm1hdHRlZFRleHRGaWVsZE1hcC5wdXQoY3V0S2V5U3Ryb2tlLCBEZWZhdWx0RWRpdG9yS2l0LmN1dEFjdGlvbik7Ci0gICAgICAgICAgICBmb3JtYXR0ZWRUZXh0RmllbGRNYXAucHV0KGFsbEtleVN0cm9rZSwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3RBbGxBY3Rpb24pOwotCi0gICAgICAgICAgICBJbnB1dE1hcCB0ZXh0QXJlYU1hcCA9IChJbnB1dE1hcCkgVUlNYW5hZ2VyLmdldCgiVGV4dEFyZWEuZm9jdXNJbnB1dE1hcCIpOwotICAgICAgICAgICAgdGV4dEFyZWFNYXAucHV0KGNvcHlLZXlTdHJva2UsIERlZmF1bHRFZGl0b3JLaXQuY29weUFjdGlvbik7Ci0gICAgICAgICAgICB0ZXh0QXJlYU1hcC5wdXQocGFzdGVLZXlTdHJva2UsIERlZmF1bHRFZGl0b3JLaXQucGFzdGVBY3Rpb24pOwotICAgICAgICAgICAgdGV4dEFyZWFNYXAucHV0KGN1dEtleVN0cm9rZSwgRGVmYXVsdEVkaXRvcktpdC5jdXRBY3Rpb24pOwotICAgICAgICAgICAgdGV4dEFyZWFNYXAucHV0KGFsbEtleVN0cm9rZSwgRGVmYXVsdEVkaXRvcktpdC5zZWxlY3RBbGxBY3Rpb24pOwotCi0gICAgICAgICAgICBJbnB1dE1hcCBwYXNzd29yZEZpZWxkTWFwID0gKElucHV0TWFwKSBVSU1hbmFnZXIuZ2V0KCJQYXNzd29yZEZpZWxkLmZvY3VzSW5wdXRNYXAiKTsKLSAgICAgICAgICAgIHBhc3N3b3JkRmllbGRNYXAucHV0KHBhc3RlS2V5U3Ryb2tlLCBEZWZhdWx0RWRpdG9yS2l0LnBhc3RlQWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsRXNjYXBlQmluZGluZyhmaW5hbCBXaW5kb3cgd2luZG93LCBmaW5hbCBKUm9vdFBhbmUgcm9vdFBhbmUsIGZpbmFsIGJvb2xlYW4gZGlzcG9zZSkgewotICAgICAgICBmaW5hbCBLZXlTdHJva2Ugc3Ryb2tlID0gS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgiRVNDQVBFIik7Ci0gICAgICAgIGZpbmFsIElucHV0TWFwIGlucHV0TWFwID0gcm9vdFBhbmUuZ2V0SW5wdXRNYXAoSkNvbXBvbmVudC5XSEVOX0lOX0ZPQ1VTRURfV0lORE9XKTsKLSAgICAgICAgaW5wdXRNYXAucHV0KHN0cm9rZSwgIkVTQ0FQRSIpOwotICAgICAgICByb290UGFuZS5nZXRBY3Rpb25NYXAoKS5wdXQoIkVTQ0FQRSIsIG5ldyBBYnN0cmFjdEFjdGlvbigpIHsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgd2luZG93LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlSWNvbiBnZXRJY29uKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFVSTCBpbWFnZVVSTCA9IENsaWVudEhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZSgiL2ltYWdlcy8iICsgbmFtZSk7Ci0gICAgICAgIGlmIChpbWFnZVVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlSWNvbihpbWFnZVVSTCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREYXRlU3RyaW5nKEdyZWdvcmlhbkNhbGVuZGFyIGNhbCkgewotICAgICAgICBpZiAoY2FsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MgWlpaIik7Ci0gICAgICAgIHNkZi5zZXRUaW1lWm9uZShjYWwuZ2V0VGltZVpvbmUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHNkZi5mb3JtYXQoY2FsLmdldFRpbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvd25sb2FkKENvbXBvbmVudCBjb21wb25lbnQsIENtaXNPYmplY3Qgb2JqZWN0LCBTdHJpbmcgc3RyZWFtSWQpIHsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50ID0gZ2V0Q29udGVudFN0cmVhbShvYmplY3QsIHN0cmVhbUlkKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY29udGVudC5nZXRGaWxlTmFtZSgpOwotICAgICAgICBpZiAoZmlsZW5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAoKERvY3VtZW50KSBvYmplY3QpLmdldENvbnRlbnRTdHJlYW1GaWxlTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9iamVjdC5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBKRmlsZUNob29zZXIgZmlsZUNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGZpbGVDaG9vc2VyLnNldFNlbGVjdGVkRmlsZShuZXcgRmlsZShmaWxlbmFtZSkpOwotCi0gICAgICAgIGludCBjaG9vc2VSZXN1bHQgPSBmaWxlQ2hvb3Nlci5zaG93RGlhbG9nKGNvbXBvbmVudCwgIkRvd25sb2FkIik7Ci0gICAgICAgIGlmIChjaG9vc2VSZXN1bHQgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN0b3JlU3RyZWFtKGNvbnRlbnQuZ2V0U3RyZWFtKCksIGZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2hvd0Vycm9yKGNvbXBvbmVudCwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShDb21wb25lbnQgY29tcG9uZW50LCBGaWxlIGZpbGUpIHsKLSAgICAgICAgSkZpbGVDaG9vc2VyIGZpbGVDaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOwotICAgICAgICBmaWxlQ2hvb3Nlci5zZXRTZWxlY3RlZEZpbGUobmV3IEZpbGUoZmlsZS5nZXROYW1lKCkpKTsKLQotICAgICAgICBpbnQgY2hvb3NlUmVzdWx0ID0gZmlsZUNob29zZXIuc2hvd0RpYWxvZyhjb21wb25lbnQsICJEb3dubG9hZCIpOwotICAgICAgICBpZiAoY2hvb3NlUmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdG9yZVN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCBmaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHNob3dFcnJvcihjb21wb25lbnQsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oQ29tcG9uZW50IGNvbXBvbmVudCwgQ21pc09iamVjdCBvYmplY3QsIFN0cmluZyBzdHJlYW1JZCkgewotICAgICAgICBpZiAoIURlc2t0b3AuaXNEZXNrdG9wU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgIGRvd25sb2FkKGNvbXBvbmVudCwgb2JqZWN0LCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBEZXNrdG9wIGRlc2t0b3AgPSBEZXNrdG9wLmdldERlc2t0b3AoKTsKLQotICAgICAgICBpZiAoIWRlc2t0b3AuaXNTdXBwb3J0ZWQoRGVza3RvcC5BY3Rpb24uT1BFTikpIHsKLSAgICAgICAgICAgIGRvd25sb2FkKGNvbXBvbmVudCwgb2JqZWN0LCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIGZpbGUgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaWxlID0gY3JlYXRlVGVtcEZpbGVGcm9tRG9jdW1lbnQob2JqZWN0LCBzdHJlYW1JZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzaG93RXJyb3IoY29tcG9uZW50LCBlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXNrdG9wLm9wZW4oZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgY29weShjb21wb25lbnQsIGZpbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG93RXJyb3IoY29tcG9uZW50LCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0gICAgICAgIEZpbGUgY2xpZW50VGVtcERpciA9IG5ldyBGaWxlKHRlbXBEaXIsICJjbWlzd29ya2JlbmNoIik7Ci0gICAgICAgIGlmICghY2xpZW50VGVtcERpci5leGlzdHMoKSAmJiAhY2xpZW50VGVtcERpci5ta2RpcnMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENtaXNSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGVtcCBmaWxlISIpOwotICAgICAgICB9Ci0gICAgICAgIGNsaWVudFRlbXBEaXIuZGVsZXRlT25FeGl0KCk7Ci0KLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKGNsaWVudFRlbXBEaXIsIGZpbGVuYW1lKTsKLSAgICAgICAgdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0KLSAgICAgICAgcmV0dXJuIHRlbXBGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRmlsZUZyb21Eb2N1bWVudChDbWlzT2JqZWN0IG9iamVjdCwgU3RyaW5nIHN0cmVhbUlkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQgPSBnZXRDb250ZW50U3RyZWFtKG9iamVjdCwgc3RyZWFtSWQpOwotICAgICAgICBpZiAoY29udGVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb250ZW50ISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY29udGVudC5nZXRGaWxlTmFtZSgpOwotICAgICAgICBpZiAoKGZpbGVuYW1lID09IG51bGwpIHx8IChmaWxlbmFtZS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAoKERvY3VtZW50KSBvYmplY3QpLmdldENvbnRlbnRTdHJlYW1GaWxlTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZmlsZW5hbWUgPT0gbnVsbCkgfHwgKGZpbGVuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IG9iamVjdC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChmaWxlbmFtZSA9PSBudWxsKSB8fCAoZmlsZW5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gImNvbnRlbnQiOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGV4dCA9IE1pbWVUeXBlcy5nZXRFeHRlbnNpb24oY29udGVudC5nZXRNaW1lVHlwZSgpKTsKLSAgICAgICAgaWYgKGV4dC5sZW5ndGgoKSA+IDAgJiYgIWZpbGVuYW1lLmVuZHNXaXRoKGV4dCkpIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyBleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlIHRlbXBGaWxlID0gQ2xpZW50SGVscGVyLmNyZWF0ZVRlbXBGaWxlKGZpbGVuYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0b3JlU3RyZWFtKGNvbnRlbnQuZ2V0U3RyZWFtKCksIHRlbXBGaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0NvbnN0cmFpbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gY29udGVudCAtIGxlYXZlIHRoZSB0ZW1wIGZpbGUgZW1wdHkKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0ZW1wRmlsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHN0b3JlU3RyZWFtKElucHV0U3RyZWFtIGluLCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICBJT1V0aWxzLmNvcHkobmV3IExvZ2dpbmdJbnB1dFN0cmVhbShpbiwgZmlsZS5nZXROYW1lKCkpLCBvdXQsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGluKTsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KG91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb250ZW50U3RyZWFtIGdldENvbnRlbnRTdHJlYW0oQ21pc09iamVjdCBvYmplY3QsIFN0cmluZyBzdHJlYW1JZCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChEb2N1bWVudCkgb2JqZWN0KS5nZXRDb250ZW50U3RyZWFtKHN0cmVhbUlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8UmVuZGl0aW9uPiByZW5kaXRpb25zID0gb2JqZWN0LmdldFJlbmRpdGlvbnMoKTsKLSAgICAgICAgICAgIGlmIChyZW5kaXRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChSZW5kaXRpb24gcmVuZGl0aW9uIDogcmVuZGl0aW9ucykgewotICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JZC5lcXVhbHMocmVuZGl0aW9uLmdldFN0cmVhbUlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZW5kaXRpb24uZ2V0Q29udGVudFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VGFibGVUb0NsaXBib2FyZChKVGFibGUgdGFibGUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZpbmFsIGludCByb3dzID0gdGFibGUuZ2V0TW9kZWwoKS5nZXRSb3dDb3VudCgpOwotICAgICAgICBmaW5hbCBpbnQgY29scyA9IHRhYmxlLmdldE1vZGVsKCkuZ2V0Q29sdW1uQ291bnQoKTsKLQotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykgewotICAgICAgICAgICAgaWYgKGNvbCA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2IuYXBwZW5kKGZvcm1hdENTVlZhbHVlKHRhYmxlLmdldE1vZGVsKCkuZ2V0Q29sdW1uTmFtZShjb2wpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQobmV3bGluZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdGFibGUuZ2V0TW9kZWwoKS5nZXRWYWx1ZUF0KHJvdywgY29sKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZm9ybWF0Q1NWVmFsdWUodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIENsaXBib2FyZCBjbGlwYm9hcmQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U3lzdGVtQ2xpcGJvYXJkKCk7Ci0gICAgICAgIFRyYW5zZmVyYWJsZSB0cmFuc2ZlcmFibGUgPSBuZXcgU3RyaW5nU2VsZWN0aW9uKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICBjbGlwYm9hcmQuc2V0Q29udGVudHModHJhbnNmZXJhYmxlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVIdG1sKFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZyBzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChjID09ICc8JykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmx0OyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc8JykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmx0OyIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICciJykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJnF1b3Q7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1wnJykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiJmFwb3M7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPiAxMjcpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiYjIiArIChpbnQpIGMgKyAiOyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0Q1NWVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgcmV0dXJuIGdldERhdGVTdHJpbmcoKEdyZWdvcmlhbkNhbGVuZGFyKSB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gdmFsdWUudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ1wiJyk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgIGlmIChjID09ICdcIicpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcIicpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2IuYXBwZW5kKCdcIicpOwotCi0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHYgOiAoQ29sbGVjdGlvbjw/PikgdmFsdWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZm9ybWF0Q1NWVmFsdWUodikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLQotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RJZCkgewotICAgICAgICAgICAgcmV0dXJuIGZvcm1hdENTVlZhbHVlKCgoT2JqZWN0SWQpIHZhbHVlKS5nZXRJZCgpKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEltYWdlSWNvbikgewotICAgICAgICAgICAgcmV0dXJuICI8aWNvbj4iOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBVUkkgZ2V0Q2xhc3NwYXRoVVJJKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xpZW50SGVscGVyLmNsYXNzLmdldFJlc291cmNlKHBhdGgpLnRvVVJJKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBub3QgdmVyeSBsaWtlbHkKLSAgICAgICAgICAgIExPRy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRGaWxlQW5kUmVtb3ZlSGVhZGVyKGZpbmFsIFVSSSBmaWxlKSB7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmVhbSA9IGZpbGUudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcmVhZFN0cmVhbUFuZFJlbW92ZUhlYWRlcihzdHJlYW0pOwotCi0gICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHN0cmVhbSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU3RyZWFtQW5kUmVtb3ZlSGVhZGVyKGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSkgewotICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gSU9VdGlscy5yZWFkQWxsTGluZXNBbmRSZW1vdmVIZWFkZXIoc3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxGaWxlRW50cnk+IHJlYWRGaWxlUHJvcGVydGllcyhVUkkgcHJvcGVydGllc0ZpbGUpIHsKLQotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJlYW0gPSBwcm9wZXJ0aWVzRmlsZS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJDYW5ub3Qgb3BlbiBsaWJyYXJ5IGZpbGU6ICIgKyBwcm9wZXJ0aWVzRmlsZSwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjbGFzc3BhdGhQYXJlbnQgPSBudWxsOwotICAgICAgICBpZiAoImNsYXNzcGF0aCIuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0aWVzRmlsZS5nZXRTY2hlbWUoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcHJvcGVydGllc0ZpbGUuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCk7Ci0gICAgICAgICAgICBpbnQgeCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGhQYXJlbnQgPSBwYXRoLnN1YnN0cmluZygwLCB4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnRpZXNGaWxlLmdldFNjaGVtZSgpKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBwcm9wZXJ0aWVzRmlsZS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKTsKLSAgICAgICAgICAgIGludCB4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgaWYgKHggPiAtMSkgewotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCB4KTsKLSAgICAgICAgICAgICAgICB4ID0gcGF0aC5pbmRleE9mKCIhLyIpOwotICAgICAgICAgICAgICAgIGlmICh4ID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoUGFyZW50ID0gcGF0aC5zdWJzdHJpbmcoeCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlUGFyZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKCJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnRpZXNGaWxlLmdldFNjaGVtZSgpKSkgewotICAgICAgICAgICAgZmlsZVBhcmVudCA9IChuZXcgRmlsZShwcm9wZXJ0aWVzRmlsZSkpLmdldFBhcmVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICBmaW5hbCBMaXN0PEZpbGVFbnRyeT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGaWxlRW50cnk+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogcHJvcGVydGllcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSB1cmkgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGhQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IENsaWVudEhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZShjbGFzc3BhdGhQYXJlbnQgKyAiLyIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSA9IHVybC50b1VSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gKG5ldyBGaWxlKGZpbGVQYXJlbnQsIGZpbGUpKS50b1VSSSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBGaWxlRW50cnkocHJvcGVydGllcy5nZXRQcm9wZXJ0eShmaWxlKSwgdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkNhbm5vdCBmaW5kIGxpYnJhcnkgZW50cnk6ICIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlbnRyeQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0KTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKCJDYW5ub3QgcmVhZCBsaWJyYXJ5IGZpbGU6ICIgKyBwcm9wZXJ0aWVzRmlsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbnNvbGUgb3BlbkNvbnNvbGUoZmluYWwgQ29tcG9uZW50IHBhcmVudCwgZmluYWwgQ2xpZW50TW9kZWwgbW9kZWwsIGZpbmFsIFVSSSBmaWxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJlbnQuc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOwotCi0gICAgICAgICAgICBmaW5hbCBTZXNzaW9uIGdyb292eVNlc3Npb24gPSBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVzZXIgPSBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKS5nZXQoU2Vzc2lvblBhcmFtZXRlci5VU0VSKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZSA9ICJHcm9vdnlDb25zb2xlIC0gUmVwc29zaXRvcnk6ICIgKyBncm9vdnlTZXNzaW9uLmdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0SWQoKTsKLQotICAgICAgICAgICAgZmluYWwgQ29uc29sZSBjb25zb2xlID0gbmV3IENvbnNvbGUocGFyZW50LmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlKCkgewotICAgICAgICAgICAgICAgICAgICBKRnJhbWUgZnJhbWUgPSAoSkZyYW1lKSBnZXRGcmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRTY3JpcHRGaWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuc2V0VGl0bGUoKChGaWxlKSBnZXRTY3JpcHRGaWxlKCkpLmdldE5hbWUoKSArIChnZXREaXJ0eSgpID8gIiAqICIgOiAiIikgKyAiIC0gIiArIHRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGNvbnNvbGUuc2V0VmFyaWFibGUoInNlc3Npb24iLCBncm9vdnlTZXNzaW9uKTsKLSAgICAgICAgICAgIGNvbnNvbGUuc2V0VmFyaWFibGUoImJpbmRpbmciLCBncm9vdnlTZXNzaW9uLmdldEJpbmRpbmcoKSk7Ci0KLSAgICAgICAgICAgIGNvbnNvbGUucnVuKCk7Ci0KLSAgICAgICAgICAgIEpNZW51IGNtaXNNZW51ID0gbmV3IEpNZW51KCJDTUlTIik7Ci0gICAgICAgICAgICBjb25zb2xlLmdldEZyYW1lKCkuZ2V0Um9vdFBhbmUoKS5nZXRKTWVudUJhcigpLmFkZChjbWlzTWVudSk7Ci0KLSAgICAgICAgICAgIGFkZENvbnNvbGVNZW51KGNtaXNNZW51LCAiQ01JUyAxLjAgU3BlY2lmaWNhdGlvbiIsIG5ldyBVUkkoCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy9jbWlzL0NNSVMvdjEuMC9vcy9jbWlzLXNwZWMtdjEuMC5odG1sIikpOwotICAgICAgICAgICAgYWRkQ29uc29sZU1lbnUoY21pc01lbnUsICJDTUlTIDEuMSBTcGVjaWZpY2F0aW9uIiwgbmV3IFVSSSgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL2NtaXMvQ01JUy92MS4xL0NNSVMtdjEuMS5odG1sIikpOwotICAgICAgICAgICAgYWRkQ29uc29sZU1lbnUoY21pc01lbnUsICJPcGVuQ01JUyBEb2N1bWVudGF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVSSSgiaHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnL2phdmEvb3BlbmNtaXMuaHRtbCIpKTsKLSAgICAgICAgICAgIGFkZENvbnNvbGVNZW51KGNtaXNNZW51LCAiT3BlbkNNSVMgQ2xpZW50IEFQSSBKYXZhRG9jIiwgbmV3IFVSSSgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9qYXZhLzAuMTIuMC9tYXZlbi9hcGlkb2NzLyIpKTsKLSAgICAgICAgICAgIGNtaXNNZW51LmFkZFNlcGFyYXRvcigpOwotICAgICAgICAgICAgSk1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiQ01JUyBTZXNzaW9uIERldGFpbHMiKTsKLSAgICAgICAgICAgIG1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgc3R5bGUgPSBjb25zb2xlLmdldE91dHB1dFN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuY2xlYXJPdXRwdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc29sZS5hcHBlbmRPdXRwdXRObCgiU2Vzc2lvbiBJRDogICAgICAiICsgZ3Jvb3Z5U2Vzc2lvbi5nZXRCaW5kaW5nKCkuZ2V0U2Vzc2lvbklkKCksIHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc29sZS5hcHBlbmRPdXRwdXRObCgiUmVwb3NpdG9yeSBJRDogICAiICsgZ3Jvb3Z5U2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldElkKCksIHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc29sZS5hcHBlbmRPdXRwdXRObCgiUmVwb3NpdG9yeSBuYW1lOiAiICsgZ3Jvb3Z5U2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldE5hbWUoKSwgc3R5bGUpOwotICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmFwcGVuZE91dHB1dE5sKCJCaW5kaW5nOiAgICAgICAgICIgKyBncm9vdnlTZXNzaW9uLmdldEJpbmRpbmcoKS5nZXRCaW5kaW5nVHlwZSgpLCBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuYXBwZW5kT3V0cHV0TmwoIlVzZXI6ICAgICAgICAgICAgIiArIHVzZXIsIHN0eWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGNtaXNNZW51LmFkZChtZW51SXRlbSk7Ci0KLSAgICAgICAgICAgIGNvbnNvbGUuZ2V0SW5wdXRBcmVhKCkuc2V0VGV4dChyZWFkRmlsZUFuZFJlbW92ZUhlYWRlcihmaWxlKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjb25zb2xlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBhcmVudC5zZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENvbnNvbGVNZW51KEpNZW51IG1lbnUsIFN0cmluZyB0aXRsZSwgZmluYWwgVVJJIHVybCkgewotICAgICAgICBpZiAoIURlc2t0b3AuaXNEZXNrdG9wU3VwcG9ydGVkKCkgfHwgIURlc2t0b3AuZ2V0RGVza3RvcCgpLmlzU3VwcG9ydGVkKEFjdGlvbi5CUk9XU0UpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBKTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKHRpdGxlKTsKLSAgICAgICAgbWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIERlc2t0b3AuZ2V0RGVza3RvcCgpLmJyb3dzZSh1cmwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtZW51LmFkZChtZW51SXRlbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkdyb292eVNjcmlwdChmaW5hbCBDb21wb25lbnQgcGFyZW50LCBmaW5hbCBDbGllbnRNb2RlbCBtb2RlbCwgZmluYWwgRmlsZSBmaWxlLAotICAgICAgICAgICAgZmluYWwgV3JpdGVyIG91dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyZW50LnNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gcm9vdHMgPSBuZXcgU3RyaW5nW10geyBmaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSB9OwotICAgICAgICAgICAgR3Jvb3Z5U2NyaXB0RW5naW5lIGdzZSA9IG5ldyBHcm9vdnlTY3JpcHRFbmdpbmUocm9vdHMsIHBhcmVudC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gbmV3IEJpbmRpbmcoKTsKLSAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoInNlc3Npb24iLCBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpKTsKLSAgICAgICAgICAgIGJpbmRpbmcuc2V0VmFyaWFibGUoImJpbmRpbmciLCBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmdldEJpbmRpbmcoKSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFZhcmlhYmxlKCJvdXQiLCBvdXQpOwotICAgICAgICAgICAgZ3NlLnJ1bihmaWxlLmdldE5hbWUoKSwgYmluZGluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwYXJlbnQuc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkpTUjIyM1NjcmlwdChmaW5hbCBDb21wb25lbnQgcGFyZW50LCBmaW5hbCBDbGllbnRNb2RlbCBtb2RlbCwgZmluYWwgRmlsZSBmaWxlLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4dCwgZmluYWwgV3JpdGVyIG91dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyZW50LnNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgU2NyaXB0RW5naW5lTWFuYWdlciBtZ3IgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpOwotICAgICAgICAgICAgU2NyaXB0RW5naW5lIGVuZ2luZSA9IG1nci5nZXRFbmdpbmVCeUV4dGVuc2lvbihleHQpOwotICAgICAgICAgICAgZW5naW5lLmdldENvbnRleHQoKS5zZXRXcml0ZXIob3V0KTsKLSAgICAgICAgICAgIGVuZ2luZS5nZXRDb250ZXh0KCkuc2V0RXJyb3JXcml0ZXIob3V0KTsKLSAgICAgICAgICAgIGVuZ2luZS5wdXQoInNlc3Npb24iLCBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpKTsKLSAgICAgICAgICAgIGVuZ2luZS5wdXQoImJpbmRpbmciLCBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmdldEJpbmRpbmcoKSk7Ci0gICAgICAgICAgICBlbmdpbmUucHV0KCJvdXQiLCBuZXcgUHJpbnRXcml0ZXIob3V0KSk7Ci0gICAgICAgICAgICBlbmdpbmUuZXZhbChuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgSU9VdGlscy5VVEY4KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwYXJlbnQuc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlRW50cnkgaW1wbGVtZW50cyBDb21wYXJhYmxlPEZpbGVFbnRyeT4gewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIFVSSSBmaWxlOwotCi0gICAgICAgIHB1YmxpYyBGaWxlRW50cnkoU3RyaW5nIG5hbWUsIFVSSSBmaWxlKSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVSSSBnZXRGaWxlKCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEZpbGVFbnRyeSBvKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKG8uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEZpbGVFbnRyeSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuYW1lLmVxdWFscygoKEZpbGVFbnRyeSkgb2JqKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NsaWVudFdyaXRlckFwcGVuZGVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQ2xpZW50V3JpdGVyQXBwZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1ZTJmNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQ2xpZW50V3JpdGVyQXBwZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEFyZWE7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLldyaXRlckFwcGVuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLkxvZ2dpbmdFdmVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFdyaXRlckFwcGVuZGVyIGV4dGVuZHMgV3JpdGVyQXBwZW5kZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSlRleHRBcmVhIGxvZ1RleHRBcmVhID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUZXh0QXJlYShKVGV4dEFyZWEgdGV4dEFyZWEpIHsKLSAgICAgICAgbG9nVGV4dEFyZWEgPSB0ZXh0QXJlYTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhcHBlbmQoTG9nZ2luZ0V2ZW50IGxvZ2dpbmdFdmVudCkgewotICAgICAgICBpZiAobG9nVGV4dEFyZWEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBsYXlvdXQuZm9ybWF0KGxvZ2dpbmdFdmVudCk7Ci0KLSAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGxvZ1RleHRBcmVhLmFwcGVuZChtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0Nvbm5lY3Rpb25FcnJvckRpYWxvZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0Nvbm5lY3Rpb25FcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNmZThhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Db25uZWN0aW9uRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkVkaXRvclBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzQ29ubmVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc09iamVjdE5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZXhjZXB0aW9ucy5DbWlzVW5hdXRob3JpemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5qc29uLnBhcnNlci5KU09OUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uRXJyb3JEaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9IT1NUID0gImh0dHAucHJveHlIb3N0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZX1BPUlQgPSAiaHR0cC5wcm94eVBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1BST1hZX0hPU1QgPSAiaHR0cHMucHJveHlIb3N0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQU19QUk9YWV9QT1JUID0gImh0dHBzLnByb3h5UG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9OT05fUFJPWFlfSE9TVFMgPSAiaHR0cC5ub25Qcm94eUhvc3RzIjsKLQotICAgIHByaXZhdGUgZmluYWwgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBDb25uZWN0aW9uRXJyb3JEaWFsb2coSkRpYWxvZyBvd25lciwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICBzdXBlcihvd25lciwgIkNvbm5lY3Rpb24gRXJyb3IiLCB0cnVlKTsKLSAgICAgICAgdGhpcy5leGNlcHRpb24gPSBleGNlcHRpb247Ci0KLSAgICAgICAgQ2xpZW50SGVscGVyLmxvZ0Vycm9yKGV4Y2VwdGlvbik7Ci0KLSAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbig2MDAsIDQwMCkpOwotICAgICAgICBzZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oNjAwLCA0NTApKTsKLQotICAgICAgICBzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICBTdHJpbmdCdWlsZGVyIGhpbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBoaW50LmFwcGVuZCgiPGgyPjxmb250IGNvbG9yPVwicmVkXCI+RXhjZXB0aW9uOiA8ZW0+IiArIGV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKQotICAgICAgICAgICAgICAgICsgIjwvZW0+PC9mb250Pjxicj4iICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSArICI8L2gyPiIpOwotICAgICAgICBpZiAoZXhjZXB0aW9uLmdldENhdXNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaGludC5hcHBlbmQoIjxoMz48Zm9udCBjb2xvcj1cInJlZFwiPkNhdXNlOiA8ZW0+IiArIGV4Y2VwdGlvbi5nZXRDYXVzZSgpLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIjwvZW0+PC9mb250Pjxicj4iICsgZXhjZXB0aW9uLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpICsgIjwvaDM+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaGludC5hcHBlbmQoIjxocj48YnI+Iik7Ci0gICAgICAgIGhpbnQuYXBwZW5kKGdldEhpbnQoKSk7Ci0KLSAgICAgICAgLy8gaGludCBhcmVhCi0gICAgICAgIEpQYW5lbCBoaW50c1BhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBoaW50c1BhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGhpbnRzUGFuZWwsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLSAgICAgICAgaGludHNQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7Ci0gICAgICAgIGFkZChoaW50c1BhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBKRWRpdG9yUGFuZSBoaW50cyA9IG5ldyBKRWRpdG9yUGFuZSgidGV4dC9odG1sIiwgaGludC50b1N0cmluZygpKTsKLSAgICAgICAgaGludHMuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgICAgIGhpbnRzUGFuZWwuYWRkKG5ldyBKU2Nyb2xsUGFuZShoaW50cywgSlNjcm9sbFBhbmUuVkVSVElDQUxfU0NST0xMQkFSX0FTX05FRURFRCwKLSAgICAgICAgICAgICAgICBKU2Nyb2xsUGFuZS5IT1JJWk9OVEFMX1NDUk9MTEJBUl9ORVZFUikpOwotCi0gICAgICAgIC8vIGNsb3NlIGJ1dHRvbgotICAgICAgICBKUGFuZWwgYnV0dG9uUGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIGJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuUEFHRV9BWElTKSk7Ci0gICAgICAgIGJ1dHRvblBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDUsIDUsIDUpKTsKLSAgICAgICAgYWRkKGJ1dHRvblBhbmVsLCBCb3JkZXJMYXlvdXQuUEFHRV9FTkQpOwotCi0gICAgICAgIEpCdXR0b24gY2xvc2VCdXR0b24gPSBuZXcgSkJ1dHRvbigiQ2xvc2UiKTsKLSAgICAgICAgY2xvc2VCdXR0b24uc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKFNob3J0Lk1BWF9WQUxVRSwgMzApKTsKLSAgICAgICAgY2xvc2VCdXR0b24uc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSkpOwotICAgICAgICBjbG9zZUJ1dHRvbi5zZXRBbGlnbm1lbnRYKENvbXBvbmVudC5DRU5URVJfQUxJR05NRU5UKTsKLQotICAgICAgICBjbG9zZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIENvbm5lY3Rpb25FcnJvckRpYWxvZy50aGlzLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYnV0dG9uUGFuZWwuYWRkKGNsb3NlQnV0dG9uKTsKLQotICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY2xvc2VCdXR0b24pOwotCi0gICAgICAgIENsaWVudEhlbHBlci5pbnN0YWxsRXNjYXBlQmluZGluZyh0aGlzLCBnZXRSb290UGFuZSgpLCB0cnVlKTsKLQotICAgICAgICBzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkRJU1BPU0VfT05fQ0xPU0UpOwotICAgICAgICBwYWNrKCk7Ci0gICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhnZXRPd25lcigpKTsKLQotICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEhpbnQoKSB7Ci0gICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBDbWlzT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gfHwgZXhjZXB0aW9uIGluc3RhbmNlb2YgQ21pc05vdFN1cHBvcnRlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICJUaGUgQ01JUyBXb3JrYmVuY2ggY291bGQgY29ubmVjdCB0byB0aGUgc2VydmVyIGJ1dCB0aGUgcHJvdmlkZWQgVVJMIGlzIG5vdCBhIENNSVMgZW5kcG9pbnQgVVJMLiIKLSAgICAgICAgICAgICAgICAgICAgKyAiPGJyPkNoZWNrIHlvdXIgVVJMIGFuZCBwcm94eSBzZXR0aW5ncy4iICsgZ2V0UHJveHlDb25maWcoKTsKLSAgICAgICAgfSBlbHNlIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBDbWlzVW5hdXRob3JpemVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRoZSBwcm92aWRlIGNyZWRlbnRpYWxzIGFyZSBpbnZhbGlkLjxicj5DaGVjayB5b3VyIGNyZWRlbnRpYWxzLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ21pc1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAiVGhlIHByb3ZpZGUgY3JlZGVudGlhbHMgYXJlIGludmFsaWQgb3IgdGhlIHVzZXIgaGFzIG5vIHBlcm1pc3Npb24gdG8gY29ubmVjdC4iCi0gICAgICAgICAgICAgICAgICAgICsgIjxicj5DaGVjayB5b3VyIGNyZWRlbnRpYWxzLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ21pc1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAiVGhlIHByb3h5IHNlcnZlciByZXF1aXJlcyB2YWxpZCBjcmVkZW50aWFscy48YnI+Q2hlY2sgdGhlIHNlc3Npb24gcGFyYW1ldGVycyAiCi0gICAgICAgICAgICAgICAgICAgICsgIidvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnByb3h5dXNlcicgYW5kICIKLSAgICAgICAgICAgICAgICAgICAgKyAiJ29yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcucHJveHlwYXNzd29yZCcuIiArIGdldFByb3h5Q29uZmlnKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ21pc1J1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAiU29tZXRoaW5nIGZhdGFsIGhhcHBlbmQgb24gdGhlIGNsaWVudCBvciBzZXJ2ZXIgc2lkZS4iCi0gICAgICAgICAgICAgICAgICAgICsgIjxicj5DaGVjayB5b3VyIFVSTCwgdGhlIGJpbmRpbmcsIGFuZCB5b3VyIHByb3h5IHNldHRpbmdzLiIKLSAgICAgICAgICAgICAgICAgICAgKyAiPGJyPjxicj5BbHNvIHNlZSB0aGUgQ01JUyBXb3JrYmVuY2ggbG9nIGZvciBtb3JlIGRldGFpbHMuIiArIGdldFByb3h5Q29uZmlnKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24pIHsKLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGV4Y2VwdGlvbi5nZXRDYXVzZSgpOwotICAgICAgICAgICAgd2hpbGUgKGNhdXNlIGluc3RhbmNlb2YgQ21pc0Nvbm5lY3Rpb25FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBjYXVzZSA9IGNhdXNlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB8fCBjYXVzZSBpbnN0YW5jZW9mIFVSSVN5bnRheEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiAiVGhlIHByb3ZpZGVkIFVSTCBpcyBub3QgYSB2YWxpZCBVUkwuPGJyPkNoZWNrIHlvdXIgVVJMLiI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlRoZSBDTUlTIFdvcmtiZW5jaCBjb3VsZCBub3QgY29ubmVjdCB0byB0aGUgc2VydmVyLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjxicj5DaGVjayB5b3VyIFVSTCBhbmQgeW91ciBuZXR3b3JrIGFuZCBwcm94eSBzZXR0aW5ncy4iICsgZ2V0UHJveHlDb25maWcoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBTU0xFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlRoZSBDTUlTIFdvcmtiZW5jaCBjb3VsZCBub3QgZXN0YWJsaXNoIGEgU1NMIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlci4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8YnI+Q2hlY2sgeW91ciBuZXR3b3JrIGFuZCBwcm94eSBzZXR0aW5ncy4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8YnI+PGJyPklmIHlvdSB3YW50IHRvIGNvbm5lY3QgdG8gYSBzZXJ2ZXIgd2l0aCBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJhZGQgdGhlIHBhcmFtZXRlciA8Y29kZT4tRGNtaXMud29ya2JlbmNoLmFjY2VwdFNlbGZTaWduZWRDZXJ0aWZpY2F0ZXM9dHJ1ZTwvY29kZT4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAidG8gdGhlIEpBVkFfT1BUUyBpbiB0aGUgQ01JUyBXb3JrYmVuY2ggc3RhcnQgc2NyaXB0IGFuZCByZXN0YXJ0LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjxicj48Yj5XQVJOSU5HOjwvYj4gSXQgZGlzYWJsZXMgPGVtPmFsbDwvZW0+IFNTTCBjZXJ0aWZpY2F0ZSBjaGVja3MhIiArIGdldFByb3h5Q29uZmlnKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgSlNPTlBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJUaGUgcHJvdmlkZWQgVVJMIGRvZXMgbm90IHJldHVybiBhIEpTT04gcmVzcG9uc2UuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJyPkNoZWNrIHlvdXIgVVJMLCB0aGUgYmluZGluZywgYW5kIHlvdXIgcHJveHkgc2V0dGluZ3MuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJyPjxicj5Tb21lIHNlcnZlcnMgcmV0dXJuIGEgSFRNTCBsb2dpbiBwYWdlIGlmIHRoZSBjcmVkZW50aWFscyBhcmUgaW5jb3JyZWN0LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjxicj5DaGVjayB5b3VyIGNyZWRlbnRpYWxzLiIgKyBnZXRQcm94eUNvbmZpZygpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjYXVzZSBpbnN0YW5jZW9mIFhNTFN0cmVhbUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiAiVGhlIHByb3ZpZGVkIFVSTCBkb2VzIG5vdCByZXR1cm4gYW4gQXRvbVB1YiByZXNwb25zZS4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8YnI+Q2hlY2sgeW91ciBVUkwsIHRoZSBiaW5kaW5nLCBhbmQgeW91ciBwcm94eSBzZXR0aW5ncy4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8YnI+PGJyPlNvbWUgc2VydmVycyByZXR1cm4gYSBIVE1MIGxvZ2luIHBhZ2UgaWYgdGhlIGNyZWRlbnRpYWxzIGFyZSBpbmNvcnJlY3QuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJyPkNoZWNrIHlvdXIgY3JlZGVudGlhbHMuIiArIGdldFByb3h5Q29uZmlnKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlRoZSBwcm92aWRlZCBVUkwgZG9lcyBub3QgcmV0dXJuIGEgV1NETC4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8YnI+Q2hlY2sgeW91ciBVUkwsIHRoZSBiaW5kaW5nLCBhbmQgeW91ciBwcm94eSBzZXR0aW5ncy4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8YnI+PGJyPlNvbWUgc2VydmVycyByZXR1cm4gYSBIVE1MIGxvZ2luIHBhZ2UgaWYgdGhlIGNyZWRlbnRpYWxzIGFyZSBpbmNvcnJlY3QuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJyPkNoZWNrIHlvdXIgY3JlZGVudGlhbHMuIiArIGdldFByb3h5Q29uZmlnKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIkEgbmV0d29yayBwcm9ibGVtIG9jY3VyZWQuPGJyPkNoZWNrIHlvdXIgVVJMIGFuZCB5b3VyIG5ldHdvcmsgYW5kIHByb3h5IHNldHRpbmdzLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0UHJveHlDb25maWcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLnN0YXJ0c1dpdGgoInVuZXhwZWN0ZWQgZG9jdW1lbnQiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiVGhlIHByb3ZpZGVkIFVSTCBkb2VzIG5vdCByZXR1cm4gYSBBdG9tUHViIHJlc3BvbnNlLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjxicj5DaGVjayB5b3VyIFVSTCwgdGhlIGJpbmRpbmcsIGFuZCB5b3VyIHByb3h5IHNldHRpbmdzLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjxicj48YnI+U29tZSBzZXJ2ZXJzIHJldHVybiBhIEhUTUwgbG9naW4gcGFnZSBpZiB0aGUgY3JlZGVudGlhbHMgYXJlIGluY29ycmVjdC4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICI8YnI+Q2hlY2sgeW91ciBjcmVkZW50aWFscy4iICsgZ2V0UHJveHlDb25maWcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuICJDaGVjayB0aGUgVVJMLCB0aGUgYmluZGluZywgYW5kIHRoZSBjcmVkZW50aWFscy4iOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJveHlDb25maWcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHNiLmFwcGVuZCgiPGJyPjxicj48aHI+PGJyPjxlbT5DdXJyZW50IHByb3h5IHNldHRpbmdzOjwvZW0+PGJyPjxicj4iKTsKLQotICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KEhUVFBfUFJPWFlfSE9TVCkgPT0gbnVsbCAmJiBTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUFNfUFJPWFlfSE9TVCkgPT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI8Yj4tIG5vIHByb3h5IHNldHRpbmdzIC08L2I+Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIjx0YWJsZT4iKTsKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUF9QUk9YWV9IT1NUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPjxiPkhUVFAgcHJveHk6PC9iPjwvdGQ+PHRkPiIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUF9QUk9YWV9IT1NUKSArICI6IiArIFN5c3RlbS5nZXRQcm9wZXJ0eShIVFRQX1BST1hZX1BPUlQpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShIVFRQU19QUk9YWV9IT1NUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8dHI+PHRkPjxiPkhUVFBTIHByb3h5OjwvYj48L3RkPjx0ZD4iKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KEhUVFBTX1BST1hZX0hPU1QpICsgIjoiICsgU3lzdGVtLmdldFByb3BlcnR5KEhUVFBTX1BST1hZX1BPUlQpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShIVFRQX05PTl9QUk9YWV9IT1NUUykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPHRyPjx0ZD48Yj5Ob24gcHJveHkgaG9zdHM6PC9iPjwvdGQ+PHRkPiIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUF9OT05fUFJPWFlfSE9TVFMpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DcmVhdGVEb2N1bWVudERpYWxvZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NyZWF0ZURvY3VtZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OGQ3NTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NyZWF0ZURvY3VtZW50RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5DdXJzb3I7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJveDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uR3JvdXA7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGaWxlQ2hvb3NlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KRm9ybWF0dGVkVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUmFkaW9CdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Eb2N1bWVudFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudFNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkNyZWF0ZURpYWxvZzsKLQotcHVibGljIGNsYXNzIENyZWF0ZURvY3VtZW50RGlhbG9nIGV4dGVuZHMgQ3JlYXRlRGlhbG9nIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gdW5maWxlZEJ1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBjdXJyZW50UGF0aEJ1dHRvbjsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgbmFtZUZpZWxkOwotICAgIHByaXZhdGUgSkNvbWJvQm94IHR5cGVCb3g7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZpbGVuYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBKRm9ybWF0dGVkVGV4dEZpZWxkIGdlbmVyYXRlQ29udGVudFNpemVGaWVsZDsKLSAgICBwcml2YXRlIEpDb21ib0JveCBnZW5lcmF0ZUNvbnRlbnRVbml0RmllbGQ7Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gdmVyc2lvbmluZ1N0YXRlTm9uZUJ1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiB2ZXJzaW9uaW5nU3RhdGVNYWpvckJ1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiB2ZXJzaW9uaW5nU3RhdGVNaW5vckJ1dHRvbjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiB2ZXJzaW9uaW5nU3RhdGVDaGVja2Vkb3V0QnV0dG9uOwotCi0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggdmVyaWZ5QWZ0ZXJVcGxvYWRCdXR0b247Ci0KLSAgICBwdWJsaWMgQ3JlYXRlRG9jdW1lbnREaWFsb2coRnJhbWUgb3duZXIsIENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMob3duZXIsIG1vZGVsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ3JlYXRlRG9jdW1lbnREaWFsb2coRnJhbWUgb3duZXIsIENsaWVudE1vZGVsIG1vZGVsLCBGaWxlIGZpbGUpIHsKLSAgICAgICAgc3VwZXIob3duZXIsICJDcmVhdGUgRG9jdW1lbnQiLCBtb2RlbCk7Ci0gICAgICAgIGNyZWF0ZUdVSShmaWxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKEZpbGUgZmlsZSkgewotICAgICAgICBmaW5hbCBDcmVhdGVEb2N1bWVudERpYWxvZyB0aGlzRGlhbG9nID0gdGhpczsKLQotICAgICAgICB1bmZpbGVkQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigiY3JlYXRlIHVuZmlsZWQiKTsKLSAgICAgICAgdW5maWxlZEJ1dHRvbi5zZXRTZWxlY3RlZChmYWxzZSk7Ci0KLSAgICAgICAgY3VycmVudFBhdGhCdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCJjcmVhdGUgaW4gdGhlIGN1cnJlbnQgZm9sZGVyOiAiCi0gICAgICAgICAgICAgICAgKyBnZXRDbGllbnRNb2RlbCgpLmdldEN1cnJlbnRGb2xkZXIoKS5nZXRQYXRoKCkpOwotICAgICAgICBjdXJyZW50UGF0aEJ1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLQotICAgICAgICBCdXR0b25Hcm91cCBmaWxlZEdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgICAgIGZpbGVkR3JvdXAuYWRkKHVuZmlsZWRCdXR0b24pOwotICAgICAgICBmaWxlZEdyb3VwLmFkZChjdXJyZW50UGF0aEJ1dHRvbik7Ci0KLSAgICAgICAgSlBhbmVsIGJ1dHRvblBhbmVsID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKLSAgICAgICAgYnV0dG9uUGFuZWwuYWRkKHVuZmlsZWRCdXR0b24pOwotICAgICAgICBidXR0b25QYW5lbC5hZGQoY3VycmVudFBhdGhCdXR0b24pOwotCi0gICAgICAgIGNyZWF0ZVJvdygiIiwgYnV0dG9uUGFuZWwsIDApOwotCi0gICAgICAgIG5hbWVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDYwKTsKLSAgICAgICAgY3JlYXRlUm93KCJOYW1lOiIsIG5hbWVGaWVsZCwgMSk7Ci0KLSAgICAgICAgT2JqZWN0W10gdHlwZXMgPSBnZXRUeXBlcyhCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKSk7Ci0gICAgICAgIGlmICh0eXBlcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgIk5vIGNyZWF0YWJsZSB0eXBlISIsICJDcmVhdGFibGUgVHlwZXMiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIHRoaXNEaWFsb2cuZGlzcG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHlwZUJveCA9IG5ldyBKQ29tYm9Cb3godHlwZXMpOwotICAgICAgICB0eXBlQm94LnNldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgIHR5cGVCb3guYWRkSXRlbUxpc3RlbmVyKG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiB0eXBlID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pICgoT2JqZWN0VHlwZUl0ZW0pIHR5cGVCb3guZ2V0U2VsZWN0ZWRJdGVtKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T2JqZWN0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzVmVyc2lvbmFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGVNYWpvckJ1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGVOb25lQnV0dG9uLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVNYW5kYXRvcnlGaWVsZHModHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIE9iamVjdFR5cGVJdGVtIHR5cGUgPSAoT2JqZWN0VHlwZUl0ZW0pIHR5cGVCb3guZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgIHVwZGF0ZU1hbmRhdG9yeUZpZWxkcyh0eXBlLmdldE9iamVjdFR5cGUoKSk7Ci0KLSAgICAgICAgY3JlYXRlUm93KCJUeXBlOiIsIHR5cGVCb3gsIDIpOwotCi0gICAgICAgIEpQYW5lbCBmaWxlUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0KLSAgICAgICAgZmlsZW5hbWVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKLSAgICAgICAgZmlsZW5hbWVGaWVsZC5nZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IERvY3VtZW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBhZGp1c3RHZW5lcmF0ZUNvbnRlbnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGFkanVzdEdlbmVyYXRlQ29udGVudENvbXBvbmVudHMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYWRqdXN0R2VuZXJhdGVDb250ZW50Q29tcG9uZW50cygpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnRlbnRTaXplRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVDb250ZW50VW5pdEZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVDb250ZW50U2l6ZUZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnRlbnRVbml0RmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaWxlUGFuZWwuYWRkKGZpbGVuYW1lRmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgIEpCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEpCdXR0b24oIkJyb3dzZSIpOwotICAgICAgICBicm93c2VCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSkZpbGVDaG9vc2VyIGZpbGVDaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOwotICAgICAgICAgICAgICAgIGludCBjaG9vc2VSZXN1bHQgPSBmaWxlQ2hvb3Nlci5zaG93RGlhbG9nKGZpbGVuYW1lRmllbGQsICJTZWxlY3QiKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hvb3NlUmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpbGUoZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZmlsZVBhbmVsLmFkZChicm93c2VCdXR0b24sIEJvcmRlckxheW91dC5MSU5FX0VORCk7Ci0KLSAgICAgICAgY3JlYXRlUm93KCJGaWxlOiIsIGZpbGVQYW5lbCwgNCk7Ci0KLSAgICAgICAgSlBhbmVsIGdlbmVyYXRlQ29udGVudFBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBnZW5lcmF0ZUNvbnRlbnRQYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dChnZW5lcmF0ZUNvbnRlbnRQYW5lbCwgQm94TGF5b3V0LlhfQVhJUykpOwotCi0gICAgICAgIGdlbmVyYXRlQ29udGVudFNpemVGaWVsZCA9IG5ldyBKRm9ybWF0dGVkVGV4dEZpZWxkKE51bWJlckZvcm1hdC5nZXRJbnRlZ2VySW5zdGFuY2UoKSk7Ci0gICAgICAgIGdlbmVyYXRlQ29udGVudFNpemVGaWVsZC5zZXRWYWx1ZSgwTCk7Ci0gICAgICAgIGdlbmVyYXRlQ29udGVudFNpemVGaWVsZC5zZXRDb2x1bW5zKDgpOwotICAgICAgICBnZW5lcmF0ZUNvbnRlbnRTaXplRmllbGQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChKVGV4dEZpZWxkLlJJR0hUKTsKLSAgICAgICAgZ2VuZXJhdGVDb250ZW50U2l6ZUZpZWxkLnNldE1heGltdW1TaXplKGdlbmVyYXRlQ29udGVudFNpemVGaWVsZC5nZXRQcmVmZXJyZWRTaXplKCkpOwotICAgICAgICBnZW5lcmF0ZUNvbnRlbnRQYW5lbC5hZGQoZ2VuZXJhdGVDb250ZW50U2l6ZUZpZWxkKTsKLQotICAgICAgICBnZW5lcmF0ZUNvbnRlbnRVbml0RmllbGQgPSBuZXcgSkNvbWJvQm94KG5ldyBTdHJpbmdbXSB7ICJCeXRlcyIsICJLaUIiLCAiTWlCIiwgIkdpQiIgfSk7Ci0gICAgICAgIGdlbmVyYXRlQ29udGVudFVuaXRGaWVsZC5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKChpbnQpIGdlbmVyYXRlQ29udGVudFVuaXRGaWVsZC5nZXRQcmVmZXJyZWRTaXplKCkKLSAgICAgICAgICAgICAgICAuZ2V0V2lkdGgoKSArIDIwMCwgKGludCkgZ2VuZXJhdGVDb250ZW50VW5pdEZpZWxkLmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSkpOwotICAgICAgICBnZW5lcmF0ZUNvbnRlbnRQYW5lbC5hZGQoZ2VuZXJhdGVDb250ZW50VW5pdEZpZWxkKTsKLQotICAgICAgICBnZW5lcmF0ZUNvbnRlbnRQYW5lbC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxHbHVlKCkpOwotCi0gICAgICAgIGNyZWF0ZVJvdygiR2VuZXJhdGUgY29udGVudDoiLCBnZW5lcmF0ZUNvbnRlbnRQYW5lbCwgNSk7Ci0KLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlTm9uZUJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIm5vbmUiKTsKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlTWFqb3JCdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCJtYWpvciIpOwotICAgICAgICB2ZXJzaW9uaW5nU3RhdGVNaW5vckJ1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIm1pbm9yIik7Ci0gICAgICAgIHZlcnNpb25pbmdTdGF0ZUNoZWNrZWRvdXRCdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCJjaGVja2VkIG91dCIpOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwIHZlcnNpb25pbmdTdGF0ZUdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgICAgIHZlcnNpb25pbmdTdGF0ZUdyb3VwLmFkZCh2ZXJzaW9uaW5nU3RhdGVOb25lQnV0dG9uKTsKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlR3JvdXAuYWRkKHZlcnNpb25pbmdTdGF0ZU1ham9yQnV0dG9uKTsKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlR3JvdXAuYWRkKHZlcnNpb25pbmdTdGF0ZU1pbm9yQnV0dG9uKTsKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlR3JvdXAuYWRkKHZlcnNpb25pbmdTdGF0ZUNoZWNrZWRvdXRCdXR0b24pOwotCi0gICAgICAgIEpQYW5lbCB2ZXJzaW9uaW5nU3RhdGVQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7Ci0gICAgICAgIHZlcnNpb25pbmdTdGF0ZVBhbmVsLmFkZCh2ZXJzaW9uaW5nU3RhdGVOb25lQnV0dG9uKTsKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlUGFuZWwuYWRkKHZlcnNpb25pbmdTdGF0ZU1ham9yQnV0dG9uKTsKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlUGFuZWwuYWRkKHZlcnNpb25pbmdTdGF0ZU1pbm9yQnV0dG9uKTsKLSAgICAgICAgdmVyc2lvbmluZ1N0YXRlUGFuZWwuYWRkKHZlcnNpb25pbmdTdGF0ZUNoZWNrZWRvdXRCdXR0b24pOwotCi0gICAgICAgIGlmICgoKERvY3VtZW50VHlwZURlZmluaXRpb24pICgoT2JqZWN0VHlwZUl0ZW0pIHR5cGVCb3guZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldE9iamVjdFR5cGUoKSkuaXNWZXJzaW9uYWJsZSgpKSB7Ci0gICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGVNYWpvckJ1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZlcnNpb25pbmdTdGF0ZU5vbmVCdXR0b24uc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlUm93KCJWZXJzaW9uaW5nIFN0YXRlOiIsIHZlcnNpb25pbmdTdGF0ZVBhbmVsLCA2KTsKLQotICAgICAgICB2ZXJpZnlBZnRlclVwbG9hZEJ1dHRvbiA9IG5ldyBKQ2hlY2tCb3goIlZlcmlmeSBjb250ZW50IGFmdGVyIHVwbG9hZCIpOwotICAgICAgICBjcmVhdGVSb3coIiIsIHZlcmlmeUFmdGVyVXBsb2FkQnV0dG9uLCA3KTsKLQotICAgICAgICBKQnV0dG9uIGNyZWF0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJDcmVhdGUgRG9jdW1lbnQiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigibmV3ZG9jdW1lbnQucG5nIikpOwotICAgICAgICBjcmVhdGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gKChPYmplY3RUeXBlSXRlbSkgdHlwZUJveC5nZXRTZWxlY3RlZEl0ZW0oKSkuZ2V0T2JqZWN0VHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZW5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSA9IFZlcnNpb25pbmdTdGF0ZS5OT05FOwotICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbmluZ1N0YXRlTWFqb3JCdXR0b24uaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUgPSBWZXJzaW9uaW5nU3RhdGUuTUFKT1I7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbmluZ1N0YXRlTWlub3JCdXR0b24uaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUgPSBWZXJzaW9uaW5nU3RhdGUuTUlOT1I7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbmluZ1N0YXRlQ2hlY2tlZG91dEJ1dHRvbi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25pbmdTdGF0ZSA9IFZlcnNpb25pbmdTdGF0ZS5DSEVDS0VET1VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0SWQgb2JqZWN0SWQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBkb2N1bWVudCBmcm9tIGEgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0SWQgPSBnZXRDbGllbnRNb2RlbCgpLmNyZWF0ZURvY3VtZW50KG5hbWUsIHR5cGUsIGZpbGVuYW1lLCBnZXRNYW5kYXRvcnlQcm9wZXJ0eVZhbHVlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIHVuZmlsZWRCdXR0b24uaXNTZWxlY3RlZCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmlmeUFmdGVyVXBsb2FkQnV0dG9uLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGdldENsaWVudE1vZGVsKCkuY3JlYXRlQ29udGVudFN0cmVhbShmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5Q29udGVudFN0cmVhbXMoY29udGVudFN0cmVhbSwgb2JqZWN0SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgZG9jdW1lbnQgd2l0aCByYW5kb20gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWVkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCA9ICgoTnVtYmVyKSBnZW5lcmF0ZUNvbnRlbnRTaXplRmllbGQuZ2V0VmFsdWUoKSkubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJhdGVDb250ZW50VW5pdEZpZWxkLmdldFNlbGVjdGVkSW5kZXgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCAqIDEwMjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RJZCA9IGdldENsaWVudE1vZGVsKCkuY3JlYXRlRG9jdW1lbnQobmFtZSwgdHlwZSwgZ2V0TWFuZGF0b3J5UHJvcGVydHlWYWx1ZXMoKSwgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVkLCB2ZXJzaW9uaW5nU3RhdGUsIHVuZmlsZWRCdXR0b24uaXNTZWxlY3RlZCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmlmeUFmdGVyVXBsb2FkQnV0dG9uLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudFN0cmVhbSA9IGdldENsaWVudE1vZGVsKCkuY3JlYXRlQ29udGVudFN0cmVhbSgiIiwgbGVuZ3RoLCBzZWVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlDb250ZW50U3RyZWFtcyhjb250ZW50U3RyZWFtLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0SWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50TW9kZWwoKS5sb2FkT2JqZWN0KG9iamVjdElkLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpc0RpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpc0RpYWxvZy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENsaWVudE1vZGVsKCkucmVsb2FkRm9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKG51bGwsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY3JlYXRlQWN0aW9uUm93KCIiLCBjcmVhdGVCdXR0b24sIDcpOwotCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldEZpbGUoZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY3JlYXRlQnV0dG9uKTsKLQotICAgICAgICBzaG93RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEZpbGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGZpbGVuYW1lRmllbGQuc2V0VGV4dChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgaWYgKG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG5hbWVGaWVsZC5zZXRUZXh0KGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDb250ZW50U3RyZWFtcyhDb250ZW50U3RyZWFtIHNvdXJjZUNvbnRlbnRTdHJlYW0sIE9iamVjdElkIG9iamVjdElkKSB7Ci0gICAgICAgIC8vIGRvd25sb2FkIGNvbnRlbnQgZnJvbSByZXBvc2l0b3J5Ci0gICAgICAgIENsaWVudFNlc3Npb24gY2xpZW50U2Vzc2lvbiA9IGdldENsaWVudE1vZGVsKCkuZ2V0Q2xpZW50U2Vzc2lvbigpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSAoRG9jdW1lbnQpIGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpLmdldE9iamVjdChvYmplY3RJZCwKLSAgICAgICAgICAgICAgICBjbGllbnRTZXNzaW9uLmdldE9iamVjdE9wZXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gZG9jQ29udGVudFN0cmVhbSA9IGRvYy5nZXRDb250ZW50U3RyZWFtKCk7Ci0KLSAgICAgICAgLy8gY29tcGFyZQotICAgICAgICBpZiAoZG9jQ29udGVudFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlQ29udGVudFN0cmVhbS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coZ2V0T3duZXIoKSwgIlNvdXJjZSBmaWxlIGFuZCBkb2N1bWVudCBjb250ZW50IGFyZSBib3RoIGVtcHR5LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwiLCBKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coZ2V0T3duZXIoKSwgIkRvY3VtZW50IGhhcyBubyBjb25lbnQgYnV0IHRoZSBzb3VyY2UgZmlsZSBpcyBub3QgZW1wdHkhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJWZXJpZmljYXRpb24gZmFpbGVkIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBzb3VyY2VDb250ZW50ID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gZG9jQ29udGVudCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb3VyY2VDb250ZW50ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc291cmNlQ29udGVudFN0cmVhbS5nZXRTdHJlYW0oKSwgNjQgKiAxMDI0KTsKLSAgICAgICAgICAgIGRvY0NvbnRlbnQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShkb2NDb250ZW50U3RyZWFtLmdldFN0cmVhbSgpLCA2NCAqIDEwMjQpOwotCi0gICAgICAgICAgICBpbnQgZmIgPSAwOwotICAgICAgICAgICAgaW50IGRiID0gMDsKLSAgICAgICAgICAgIGxvbmcgcG9zID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChmYiA+IC0xICYmIGRiID4gLTEpIHsKLSAgICAgICAgICAgICAgICBmYiA9IHNvdXJjZUNvbnRlbnQucmVhZCgpOwotICAgICAgICAgICAgICAgIGRiID0gZG9jQ29udGVudC5yZWFkKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmIgIT0gZGIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZiID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhnZXRPd25lcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRvY3VtZW50IGNvbnRlbnQgaXMgYmlnZ2VyIHRoYW4gdGhlIHNvdXJjZSBmaWxlISIsICJWZXJpZmljYXRpb24gZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGIgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGdldE93bmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc291cmNlIGZpbGUgaXMgYmlnZ2VyIHRoYW4gdGhlIGRvY3VtZW50IGNvbnRlbnQhIiwgIlZlcmlmaWNhdGlvbiBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGdldE93bmVyKCksICJDb250ZW50cyBkaWZmZXIgYXQgYnl0ZSAiICsgcG9zICsgIiEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIGZhaWxlZCIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhnZXRPd25lcigpLCAiU291cmNlIGZpbGUgYW5kIGRvY3VtZW50IGNvbnRlbnQgYXJlIGlkZW50aWNhbC4iLAotICAgICAgICAgICAgICAgICAgICAiVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwiLCBKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGdldE93bmVyKCksICJDb250ZW50IHRlc3QgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICJWZXJpZmljYXRpb24gZmFpbGVkIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJT1V0aWxzLmNsb3NlUXVpZXRseShzb3VyY2VDb250ZW50KTsKLSAgICAgICAgICAgIElPVXRpbHMuY29uc3VtZUFuZENsb3NlKGRvY0NvbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NyZWF0ZUZvbGRlckRpYWxvZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NyZWF0ZUZvbGRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE4MzQyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DcmVhdGVGb2xkZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkNyZWF0ZURpYWxvZzsKLQotcHVibGljIGNsYXNzIENyZWF0ZUZvbGRlckRpYWxvZyBleHRlbmRzIENyZWF0ZURpYWxvZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgSlRleHRGaWVsZCBuYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggdHlwZUJveDsKLQotICAgIHB1YmxpYyBDcmVhdGVGb2xkZXJEaWFsb2coRnJhbWUgb3duZXIsIENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKG93bmVyLCAiQ3JlYXRlIEZvbGRlciIsIG1vZGVsKTsKLSAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgZmluYWwgQ3JlYXRlRm9sZGVyRGlhbG9nIHRoaXNEaWFsb2cgPSB0aGlzOwotCi0gICAgICAgIG5hbWVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDYwKTsKLSAgICAgICAgY3JlYXRlUm93KCJOYW1lOiIsIG5hbWVGaWVsZCwgMCk7Ci0KLSAgICAgICAgT2JqZWN0W10gdHlwZXMgPSBnZXRUeXBlcyhCYXNlVHlwZUlkLkNNSVNfRk9MREVSLnZhbHVlKCkpOwotICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsICJObyBjcmVhdGFibGUgdHlwZSEiLCAiQ3JlYXRhYmxlIFR5cGVzIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgICAgICAgICB0aGlzRGlhbG9nLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGVCb3ggPSBuZXcgSkNvbWJvQm94KHR5cGVzKTsKLSAgICAgICAgdHlwZUJveC5zZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICB0eXBlQm94LmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoKE9iamVjdFR5cGVJdGVtKSB0eXBlQm94LmdldFNlbGVjdGVkSXRlbSgpKS5nZXRPYmplY3RUeXBlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTWFuZGF0b3J5RmllbGRzKHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBPYmplY3RUeXBlSXRlbSB0eXBlID0gKE9iamVjdFR5cGVJdGVtKSB0eXBlQm94LmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICB1cGRhdGVNYW5kYXRvcnlGaWVsZHModHlwZS5nZXRPYmplY3RUeXBlKCkpOwotCi0gICAgICAgIGNyZWF0ZVJvdygiVHlwZToiLCB0eXBlQm94LCAxKTsKLQotICAgICAgICBKQnV0dG9uIGNyZWF0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJDcmVhdGUgRm9sZGVyIiwgQ2xpZW50SGVscGVyLmdldEljb24oIm5ld2ZvbGRlci5wbmciKSk7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSAoKE9iamVjdFR5cGVJdGVtKSB0eXBlQm94LmdldFNlbGVjdGVkSXRlbSgpKS5nZXRPYmplY3RUeXBlKCkuZ2V0SWQoKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgICAgICAgICBPYmplY3RJZCBvYmplY3RJZCA9IGdldENsaWVudE1vZGVsKCkuY3JlYXRlRm9sZGVyKG5hbWUsIHR5cGUsIGdldE1hbmRhdG9yeVByb3BlcnR5VmFsdWVzKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGllbnRNb2RlbCgpLmxvYWRPYmplY3Qob2JqZWN0SWQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0aGlzRGlhbG9nLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB0aGlzRGlhbG9nLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKG51bGwsIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50TW9kZWwoKS5yZWxvYWRGb2xkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjcmVhdGVBY3Rpb25Sb3coIiIsIGNyZWF0ZUJ1dHRvbiwgMyk7Ci0KLSAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGNyZWF0ZUJ1dHRvbik7Ci0KLSAgICAgICAgc2hvd0RpYWxvZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DcmVhdGVJdGVtRGlhbG9nLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvQ3JlYXRlSXRlbURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTQxMzRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DcmVhdGVJdGVtRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuYXd0LkN1cnNvcjsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5UeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5DcmVhdGVEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVJdGVtRGlhbG9nIGV4dGVuZHMgQ3JlYXRlRGlhbG9nIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIG5hbWVGaWVsZDsKLSAgICBwcml2YXRlIEpDb21ib0JveCB0eXBlQm94OwotCi0gICAgcHVibGljIENyZWF0ZUl0ZW1EaWFsb2coRnJhbWUgb3duZXIsIENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKG93bmVyLCAiQ3JlYXRlIEl0ZW0iLCBtb2RlbCk7Ci0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIGZpbmFsIENyZWF0ZUl0ZW1EaWFsb2cgdGhpc0RpYWxvZyA9IHRoaXM7Ci0KLSAgICAgICAgbmFtZUZpZWxkID0gbmV3IEpUZXh0RmllbGQoNjApOwotICAgICAgICBjcmVhdGVSb3coIk5hbWU6IiwgbmFtZUZpZWxkLCAwKTsKLQotICAgICAgICBPYmplY3RbXSB0eXBlcyA9IGdldFR5cGVzKEJhc2VUeXBlSWQuQ01JU19JVEVNLnZhbHVlKCkpOwotICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsICJObyBjcmVhdGFibGUgdHlwZSEiLCAiQ3JlYXRhYmxlIFR5cGVzIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgICAgICAgICB0aGlzRGlhbG9nLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGVCb3ggPSBuZXcgSkNvbWJvQm94KHR5cGVzKTsKLSAgICAgICAgdHlwZUJveC5zZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICB0eXBlQm94LmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoKE9iamVjdFR5cGVJdGVtKSB0eXBlQm94LmdldFNlbGVjdGVkSXRlbSgpKS5nZXRPYmplY3RUeXBlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTWFuZGF0b3J5RmllbGRzKHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBPYmplY3RUeXBlSXRlbSB0eXBlID0gKE9iamVjdFR5cGVJdGVtKSB0eXBlQm94LmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICB1cGRhdGVNYW5kYXRvcnlGaWVsZHModHlwZS5nZXRPYmplY3RUeXBlKCkpOwotCi0gICAgICAgIGNyZWF0ZVJvdygiVHlwZToiLCB0eXBlQm94LCAxKTsKLQotICAgICAgICBKQnV0dG9uIGNyZWF0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJDcmVhdGUgSXRlbSIsIENsaWVudEhlbHBlci5nZXRJY29uKCJuZXdmb2xkZXIucG5nIikpOwotICAgICAgICBjcmVhdGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gKChPYmplY3RUeXBlSXRlbSkgdHlwZUJveC5nZXRTZWxlY3RlZEl0ZW0oKSkuZ2V0T2JqZWN0VHlwZSgpLmdldElkKCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0SWQgb2JqZWN0SWQgPSBnZXRDbGllbnRNb2RlbCgpLmNyZWF0ZUl0ZW0obmFtZSwgdHlwZSwgZ2V0TWFuZGF0b3J5UHJvcGVydHlWYWx1ZXMoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdElkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENsaWVudE1vZGVsKCkubG9hZE9iamVjdChvYmplY3RJZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRoaXNEaWFsb2cuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNEaWFsb2cuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGllbnRNb2RlbCgpLnJlbG9hZEZvbGRlcigpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGNyZWF0ZUFjdGlvblJvdygiIiwgY3JlYXRlQnV0dG9uLCAzKTsKLQotICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY3JlYXRlQnV0dG9uKTsKLQotICAgICAgICBzaG93RGlhbG9nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NyZWF0ZVJlbGF0aW9uc2hpcERpYWxvZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0NyZWF0ZVJlbGF0aW9uc2hpcERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDNhMmFjLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9DcmVhdGVSZWxhdGlvbnNoaXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkNyZWF0ZURpYWxvZzsKLQotcHVibGljIGNsYXNzIENyZWF0ZVJlbGF0aW9uc2hpcERpYWxvZyBleHRlbmRzIENyZWF0ZURpYWxvZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgSlRleHRGaWVsZCBuYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggdHlwZUJveDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgc291cmNlSWRGaWVsZDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdGFyZ2V0SWRGaWVsZDsKLQotICAgIHB1YmxpYyBDcmVhdGVSZWxhdGlvbnNoaXBEaWFsb2coRnJhbWUgb3duZXIsIENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKG93bmVyLCAiQ3JlYXRlIFJlbGF0aW9uc2hpcCIsIG1vZGVsKTsKLSAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgZmluYWwgQ3JlYXRlUmVsYXRpb25zaGlwRGlhbG9nIHRoaXNEaWFsb2cgPSB0aGlzOwotCi0gICAgICAgIG5hbWVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDYwKTsKLSAgICAgICAgY3JlYXRlUm93KCJOYW1lOiIsIG5hbWVGaWVsZCwgMCk7Ci0KLSAgICAgICAgT2JqZWN0W10gdHlwZXMgPSBnZXRUeXBlcyhCYXNlVHlwZUlkLkNNSVNfUkVMQVRJT05TSElQLnZhbHVlKCkpOwotICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsICJObyBjcmVhdGFibGUgdHlwZSEiLCAiQ3JlYXRhYmxlIFR5cGVzIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgICAgICAgICB0aGlzRGlhbG9nLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGVCb3ggPSBuZXcgSkNvbWJvQm94KHR5cGVzKTsKLSAgICAgICAgdHlwZUJveC5zZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICB0eXBlQm94LmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoKE9iamVjdFR5cGVJdGVtKSB0eXBlQm94LmdldFNlbGVjdGVkSXRlbSgpKS5nZXRPYmplY3RUeXBlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTWFuZGF0b3J5RmllbGRzKHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBPYmplY3RUeXBlSXRlbSB0eXBlID0gKE9iamVjdFR5cGVJdGVtKSB0eXBlQm94LmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICB1cGRhdGVNYW5kYXRvcnlGaWVsZHModHlwZS5nZXRPYmplY3RUeXBlKCkpOwotCi0gICAgICAgIGNyZWF0ZVJvdygiVHlwZToiLCB0eXBlQm94LCAxKTsKLQotICAgICAgICBzb3VyY2VJZEZpZWxkID0gbmV3IEpUZXh0RmllbGQoNjApOwotICAgICAgICBpZiAoZ2V0Q2xpZW50TW9kZWwoKS5nZXRDdXJyZW50T2JqZWN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgc291cmNlSWRGaWVsZC5zZXRUZXh0KGdldENsaWVudE1vZGVsKCkuZ2V0Q3VycmVudE9iamVjdCgpLmdldElkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNyZWF0ZVJvdygiU291cmNlIElkOiIsIHNvdXJjZUlkRmllbGQsIDIpOwotCi0gICAgICAgIHRhcmdldElkRmllbGQgPSBuZXcgSlRleHRGaWVsZCg2MCk7Ci0gICAgICAgIGNyZWF0ZVJvdygiVGFyZ2V0IElkOiIsIHRhcmdldElkRmllbGQsIDMpOwotCi0gICAgICAgIEpCdXR0b24gY3JlYXRlQnV0dG9uID0gbmV3IEpCdXR0b24oIkNyZWF0ZSBSZWxhdGlvbnNoaXAiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigibmV3cmVsYXRpb25zaGlwLnBuZyIpKTsKLSAgICAgICAgY3JlYXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZUZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9ICgoT2JqZWN0VHlwZUl0ZW0pIHR5cGVCb3guZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldE9iamVjdFR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzb3VyY2VJZCA9IHNvdXJjZUlkRmllbGQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRJZCA9IHRhcmdldElkRmllbGQuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOwotCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdElkIG9iamVjdElkID0gZ2V0Q2xpZW50TW9kZWwoKS5jcmVhdGVSZWxhdGlvbnNoaXAobmFtZSwgdHlwZSwgc291cmNlSWQsIHRhcmdldElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hbmRhdG9yeVByb3BlcnR5VmFsdWVzKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGllbnRNb2RlbCgpLmxvYWRPYmplY3Qob2JqZWN0SWQuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0aGlzRGlhbG9nLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB0aGlzRGlhbG9nLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKG51bGwsIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50TW9kZWwoKS5yZWxvYWRGb2xkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjcmVhdGVBY3Rpb25Sb3coIiIsIGNyZWF0ZUJ1dHRvbiwgNCk7Ci0KLSAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGNyZWF0ZUJ1dHRvbik7Ci0KLSAgICAgICAgc2hvd0RpYWxvZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9FeHBlcnRMb2dpblRhYi5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0V4cGVydExvZ2luVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjIxOWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0V4cGVydExvZ2luVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRBcmVhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LlNlc3Npb25QYXJhbWV0ZXJNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLkNsaWVudEhlbHBlci5GaWxlRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudFNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBFeHBlcnRMb2dpblRhYiBleHRlbmRzIEFic3RyYWN0TG9naW5UYWIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNQUk9QX0NPTkZJR1MgPSBDbGllbnRTZXNzaW9uLldPUktCRU5DSF9QUkVGSVggKyAiY29uZmlncyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHU19GT0xERVIgPSAiL2NvbmZpZ3MvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHU19MSUJSQVJZID0gImNvbmZpZy1saWJyYXJ5LnByb3BlcnRpZXMiOwotCi0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY29uZmlnczsKLSAgICBwcml2YXRlIEpUZXh0QXJlYSBzZXNzaW9uUGFyYW1ldGVyVGV4dEFyZWE7Ci0gICAgcHJpdmF0ZSBMaXN0PEZpbGVFbnRyeT4gc2Vzc2lvbkNvbmZpZ3VyYXRpb25zOwotCi0gICAgcHVibGljIEV4cGVydExvZ2luVGFiKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBjcmVhdGVHVUkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICBzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgNSwgMCwgNSkpOwotCi0gICAgICAgIFVSSSBwcm9wRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGV4dGVybmFsQ29uZmlncyA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNQUk9QX0NPTkZJR1MpOwotICAgICAgICBpZiAoZXh0ZXJuYWxDb25maWdzID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BGaWxlID0gQ2xpZW50SGVscGVyLmdldENsYXNzcGF0aFVSSShDT05GSUdTX0ZPTERFUiArIENPTkZJR1NfTElCUkFSWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcm9wRmlsZSA9IChuZXcgRmlsZShleHRlcm5hbENvbmZpZ3MpKS50b1VSSSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2Vzc2lvbkNvbmZpZ3VyYXRpb25zID0gQ2xpZW50SGVscGVyLnJlYWRGaWxlUHJvcGVydGllcyhwcm9wRmlsZSk7Ci0KLSAgICAgICAgY29uZmlncyA9IG5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY29uZmlncy5zZXRNYXhpbXVtUm93Q291bnQoMjApOwotCi0gICAgICAgIGNvbmZpZ3MuYWRkSXRlbShuZXcgRmlsZUVudHJ5KCIiLCBudWxsKSk7Ci0gICAgICAgIGlmIChzZXNzaW9uQ29uZmlndXJhdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChGaWxlRW50cnkgZmUgOiBzZXNzaW9uQ29uZmlndXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBjb25maWdzLmFkZEl0ZW0oZmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uZmlncy5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBGaWxlRW50cnkgZmUgPSAoRmlsZUVudHJ5KSBlLmdldEl0ZW0oKTsKLQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVyVGV4dEFyZWEuc2V0VGV4dChDbGllbnRIZWxwZXIucmVhZEZpbGVBbmRSZW1vdmVIZWFkZXIoZmUuZ2V0RmlsZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJUZXh0QXJlYS5zZXRDYXJldFBvc2l0aW9uKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYWRkKGNvbmZpZ3MsIEJvcmRlckxheW91dC5QQUdFX1NUQVJUKTsKLQotICAgICAgICBzZXNzaW9uUGFyYW1ldGVyVGV4dEFyZWEgPSBuZXcgSlRleHRBcmVhKCk7Ci0gICAgICAgIHNlc3Npb25QYXJhbWV0ZXJUZXh0QXJlYS5zZXRGb250KG5ldyBGb250KEZvbnQuTU9OT1NQQUNFRCwgRm9udC5QTEFJTiwgMTIpKTsKLSAgICAgICAgYWRkKG5ldyBKU2Nyb2xsUGFuZShzZXNzaW9uUGFyYW1ldGVyVGV4dEFyZWEpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uUGFyYW1ldGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgY29uZmlncy5zZXRTZWxlY3RlZEluZGV4KDApOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyIDogcGFyYW1ldGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocGFyYW1ldGVyLmdldEtleSgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlc3Npb25QYXJhbWV0ZXJUZXh0QXJlYS5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotICAgICAgICBzZXNzaW9uUGFyYW1ldGVyVGV4dEFyZWEuc2V0Q2FyZXRQb3NpdGlvbigwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhYlRpdGxlKCkgewotICAgICAgICByZXR1cm4gIkV4cGVydCI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U2Vzc2lvblBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIFNlc3Npb25QYXJhbWV0ZXJNYXAgcmVzdWx0ID0gbmV3IFNlc3Npb25QYXJhbWV0ZXJNYXAoKTsKLSAgICAgICAgcmVzdWx0LnBhcnNlKHNlc3Npb25QYXJhbWV0ZXJUZXh0QXJlYS5nZXRUZXh0KCkpOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdHJhbnNmZXJTZXNzaW9uUGFyYW1ldGVyc1RvRXhwZXJ0VGFiKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0ZvbGRlclBhbmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvRm9sZGVyUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2ZmNkZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvRm9sZGVyUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkN1cnNvcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuRm9sZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLk9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgRm9sZGVyUGFuZWwgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBGb2xkZXJMaXN0ZW5lciwgT2JqZWN0TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50SWQ7Ci0KLSAgICBwcml2YXRlIEpCdXR0b24gdXBCdXR0b247Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHBhdGhGaWVsZDsKLSAgICBwcml2YXRlIEpCdXR0b24gZ29CdXR0b247Ci0gICAgcHJpdmF0ZSBGb2xkZXJUYWJsZSBmb2xkZXJUYWJsZTsKLQotICAgIHB1YmxpYyBGb2xkZXJQYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgbW9kZWwuYWRkRm9sZGVyTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1vZGVsLmFkZE9iamVjdExpc3RlbmVyKHRoaXMpOwotICAgICAgICBjcmVhdGVHVUkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmb2xkZXJMb2FkZWQoZmluYWwgQ2xpZW50TW9kZWxFdmVudCBldmVudCkgewotICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgRm9sZGVyIGN1cnJlbnRGb2xkZXIgPSBldmVudC5nZXRDbGllbnRNb2RlbCgpLmdldEN1cnJlbnRGb2xkZXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Rm9sZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjdXJyZW50Rm9sZGVyLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgcGF0aEZpZWxkLnNldFRleHQocGF0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgRm9sZGVyIHBhcmVudCA9IGN1cnJlbnRGb2xkZXIuZ2V0Rm9sZGVyUGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZCA9IHBhcmVudC5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhGaWVsZC5zZXRUZXh0KCI/Pz8iKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50SWQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdExvYWRlZChDbGllbnRNb2RlbEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGludCBzZWxlY3RlZFJvdyA9IGZvbGRlclRhYmxlLmdldFNlbGVjdGVkUm93KCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFJvdyA+IC0xICYmIGV2ZW50LmdldENsaWVudE1vZGVsKCkuZ2V0Q3VycmVudE9iamVjdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZFJvdyA8IGZvbGRlclRhYmxlLmdldFJvd0NvdW50KCkpIHsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzZWxJZCA9IGZvbGRlclRhYmxlLmdldFZhbHVlQXQoZm9sZGVyVGFibGUuZ2V0U2VsZWN0ZWRSb3coKSwgRm9sZGVyVGFibGUuSURfQ09MVU1OKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjdXJJZCA9IGV2ZW50LmdldENsaWVudE1vZGVsKCkuZ2V0Q3VycmVudE9iamVjdCgpLmdldElkKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWN1cklkLmVxdWFscyhzZWxJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9sZGVyVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvbGRlclRhYmxlLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICBzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIHBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KHBhbmVsLCBCb3hMYXlvdXQuTElORV9BWElTKSk7Ci0gICAgICAgIHBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEsIDAsIDEsIDApKTsKLQotICAgICAgICB1cEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJ1cCIpOwotICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdXBCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdElkIG9iamVjdElkID0gbW9kZWwubG9hZEZvbGRlcihwYXJlbnRJZCwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5sb2FkT2JqZWN0KG9iamVjdElkLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKG51bGwsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBwYW5lbC5hZGQodXBCdXR0b24pOwotCi0gICAgICAgIHBhdGhGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKLSAgICAgICAgcGF0aEZpZWxkLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19FTlRFUikgewotICAgICAgICAgICAgICAgICAgICBsb2FkRm9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHBhbmVsLmFkZChwYXRoRmllbGQpOwotCi0gICAgICAgIGdvQnV0dG9uID0gbmV3IEpCdXR0b24oImdvIik7Ci0gICAgICAgIGdvQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9hZEZvbGRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcGFuZWwuYWRkKGdvQnV0dG9uKTsKLQotICAgICAgICBhZGQocGFuZWwsIEJvcmRlckxheW91dC5QQUdFX1NUQVJUKTsKLQotICAgICAgICBmb2xkZXJUYWJsZSA9IG5ldyBGb2xkZXJUYWJsZShtb2RlbCk7Ci0gICAgICAgIGZvbGRlclRhYmxlLnNldEZpbGxzVmlld3BvcnRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgIG1vZGVsLmFkZEZvbGRlckxpc3RlbmVyKGZvbGRlclRhYmxlKTsKLQotICAgICAgICBhZGQobmV3IEpTY3JvbGxQYW5lKGZvbGRlclRhYmxlKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRGb2xkZXIoKSB7Ci0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IHBhdGhGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSAiLyI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0SWQgb2JqZWN0SWQgPSBtb2RlbC5sb2FkRm9sZGVyKGlkLCBpZC5jaGFyQXQoMCkgPT0gJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwubG9hZE9iamVjdChvYmplY3RJZC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvRm9sZGVyVGFibGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Gb2xkZXJUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFlMDJlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Gb2xkZXJUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmF3dC5DdXJzb3I7Ci1pbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLkRhdGFGbGF2b3I7Ci1pbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLlRyYW5zZmVyYWJsZTsKLWltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuVW5zdXBwb3J0ZWRGbGF2b3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuRHJvcE1vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSW1hZ2VJY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk1lbnVJdGVtOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQb3B1cE1lbnU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRhYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLWltcG9ydCBqYXZheC5zd2luZy5UcmFuc2ZlckhhbmRsZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5BYnN0cmFjdFRhYmxlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDb2x1bW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5Gb2xkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmcuR3JlZ29yaWFuQ2FsZW5kYXJSZW5kZXJlcjsKLQotcHVibGljIGNsYXNzIEZvbGRlclRhYmxlIGV4dGVuZHMgSlRhYmxlIGltcGxlbWVudHMgRm9sZGVyTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5fTkFNRVMgPSB7ICIiLCAiTmFtZSIsICJUeXBlIiwgIkNvbnRlbnQgVHlwZSIsICJTaXplIiwgIkNyZWF0aW9uIERhdGUiLAotICAgICAgICAgICAgIkNyZWF0ZWQgYnkiLCAiTW9kaWZpY2F0aW9uIERhdGUiLCAiTW9kaWZpZWQgYnkiLCAiSWQiIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ09MVU1OX1dJRFRIUyA9IHsgMjQsIDIwMCwgMTUwLCAxNTAsIDgwLCAxODAsIDEwMCwgMTgwLCAxMDAsIDMwMCB9OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTFVNTiA9IDk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBNYXA8QmFzZVR5cGVJZCwgSW1hZ2VJY29uPiBpY29uczsKLSAgICBwcml2YXRlIEltYWdlSWNvbiBjaGVja2VkT3V0SWNvbjsKLSAgICBwcml2YXRlIEltYWdlSWNvbiBwd2NJY29uOwotCi0gICAgcHVibGljIEZvbGRlclRhYmxlKGZpbmFsIENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotCi0gICAgICAgIHNldE1vZGVsKG5ldyBGb2xkZXJUYWJsZU1vZGVsKCkpOwotCi0gICAgICAgIHNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOwotICAgICAgICBzZXRBdXRvUmVzaXplTW9kZShBVVRPX1JFU0laRV9PRkYpOwotICAgICAgICBzZXRBdXRvQ3JlYXRlUm93U29ydGVyKHRydWUpOwotCi0gICAgICAgIHNldERlZmF1bHRSZW5kZXJlcihHcmVnb3JpYW5DYWxlbmRhci5jbGFzcywgbmV3IEdyZWdvcmlhbkNhbGVuZGFyUmVuZGVyZXIoKSk7Ci0gICAgICAgIHNldFRyYW5zZmVySGFuZGxlcihuZXcgRm9sZGVyVHJhbnNmZXJIYW5kbGVyKCkpOwotICAgICAgICBzZXREcmFnRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0RHJvcE1vZGUoRHJvcE1vZGUuSU5TRVJUKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPTFVNTl9XSURUSFMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IGdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKGkpOwotICAgICAgICAgICAgY29sdW1uLnNldFByZWZlcnJlZFdpZHRoKENPTFVNTl9XSURUSFNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSlBvcHVwTWVudSBwb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0gICAgICAgIEpNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIkNvcHkgdG8gY2xpcGJvYXJkIik7Ci0gICAgICAgIHBvcHVwLmFkZChtZW51SXRlbSk7Ci0KLSAgICAgICAgbWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuY29weVRhYmxlVG9DbGlwYm9hcmQoRm9sZGVyVGFibGUudGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGdldFNlbGVjdGlvbk1vZGVsKCkuYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRWYWx1ZUlzQWRqdXN0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCByb3cgPSBnZXRTZWxlY3RlZFJvdygpOwotICAgICAgICAgICAgICAgIGlmIChyb3cgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRNb2RlbCgpLmdldFZhbHVlQXQoZ2V0Um93U29ydGVyKCkuY29udmVydFJvd0luZGV4VG9Nb2RlbChyb3cpLCBJRF9DT0xVTU4pLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmxvYWRPYmplY3QoaWQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0Q2xpY2tDb3VudCgpID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9BY3Rpb24oZS5pc1NoaWZ0RG93bigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtYXliZVNob3dQb3B1cChlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtYXliZVNob3dQb3B1cChlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG1heWJlU2hvd1BvcHVwKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmlzUG9wdXBUcmlnZ2VyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9wdXAuc2hvdyhlLmdldENvbXBvbmVudCgpLCBlLmdldFgoKSwgZS5nZXRZKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5VHlwZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX1NQQUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvQWN0aW9uKGUuaXNTaGlmdERvd24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbG9hZEljb25zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRJY29ucygpIHsKLSAgICAgICAgaWNvbnMgPSBuZXcgSGFzaE1hcDxCYXNlVHlwZUlkLCBJbWFnZUljb24+KCk7Ci0gICAgICAgIGljb25zLnB1dChCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQsIENsaWVudEhlbHBlci5nZXRJY29uKCJkb2N1bWVudC5wbmciKSk7Ci0gICAgICAgIGljb25zLnB1dChCYXNlVHlwZUlkLkNNSVNfRk9MREVSLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigiZm9sZGVyLnBuZyIpKTsKLSAgICAgICAgaWNvbnMucHV0KEJhc2VUeXBlSWQuQ01JU19SRUxBVElPTlNISVAsIENsaWVudEhlbHBlci5nZXRJY29uKCJyZWxhdGlvbnNoaXAucG5nIikpOwotICAgICAgICBpY29ucy5wdXQoQmFzZVR5cGVJZC5DTUlTX1BPTElDWSwgQ2xpZW50SGVscGVyLmdldEljb24oInBvbGljeS5wbmciKSk7Ci0gICAgICAgIGljb25zLnB1dChCYXNlVHlwZUlkLkNNSVNfSVRFTSwgQ2xpZW50SGVscGVyLmdldEljb24oIml0ZW0ucG5nIikpOwotCi0gICAgICAgIGNoZWNrZWRPdXRJY29uID0gQ2xpZW50SGVscGVyLmdldEljb24oImNoZWNrZWRvdXQucG5nIik7Ci0gICAgICAgIHB3Y0ljb24gPSBDbGllbnRIZWxwZXIuZ2V0SWNvbigicHdjLnBuZyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZvbGRlckxvYWRlZChmaW5hbCBDbGllbnRNb2RlbEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBldmVudC5nZXRDbGllbnRNb2RlbCgpLmdldEN1cnJlbnRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgICgoRm9sZGVyVGFibGVNb2RlbCkgZ2V0TW9kZWwoKSkuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvQWN0aW9uKGJvb2xlYW4gYWx0ZXJuYXRlKSB7Ci0gICAgICAgIGludCByb3cgPSBnZXRTZWxlY3RlZFJvdygpOwotICAgICAgICBpZiAoKHJvdyA+IC0xKSAmJiAocm93IDwgbW9kZWwuZ2V0Q3VycmVudENoaWxkcmVuKCkuc2l6ZSgpKSkgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gZ2V0TW9kZWwoKS5nZXRWYWx1ZUF0KGdldFJvd1NvcnRlcigpLmNvbnZlcnRSb3dJbmRleFRvTW9kZWwocm93KSwgSURfQ09MVU1OKS50b1N0cmluZygpOwotICAgICAgICAgICAgQ21pc09iamVjdCBvYmplY3QgPSBtb2RlbC5nZXRGcm9tQ3VycmVudENoaWxkcmVuKGlkKTsKLQotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFsdGVybmF0ZSkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuZG93bmxvYWQodGhpcy5nZXRQYXJlbnQoKSwgKERvY3VtZW50KSBvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5vcGVuKHRoaXMuZ2V0UGFyZW50KCksIChEb2N1bWVudCkgb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZvbGRlcikgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwubG9hZEZvbGRlcihvYmplY3QuZ2V0SWQoKSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKG51bGwsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBGb2xkZXJUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gQ09MVU1OX05BTUVTW2NvbHVtbkluZGV4XTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ09MVU1OX05BTUVTLmxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWwuZ2V0Q3VycmVudENoaWxkcmVuKCkuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICBDbWlzT2JqZWN0IG9iaiA9IG1vZGVsLmdldEN1cnJlbnRDaGlsZHJlbigpLmdldChyb3dJbmRleCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KSBvYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGRvYy5pc1ZlcnNpb25TZXJpZXNDaGVja2VkT3V0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jLmdldElkKCkuZXF1YWxzKGRvYy5nZXRWZXJzaW9uU2VyaWVzQ2hlY2tlZE91dElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB3Y0ljb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja2VkT3V0SWNvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpY29ucy5nZXQoQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gaWNvbnMuZ2V0KG9iai5nZXRCYXNlVHlwZUlkKCkpOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJldHVybiBvYmouZ2V0TmFtZSgpOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHJldHVybiBvYmouZ2V0VHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKERvY3VtZW50KSBvYmopLmdldENvbnRlbnRTdHJlYW1NaW1lVHlwZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoRG9jdW1lbnQpIG9iaikuZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqLmdldENyZWF0aW9uRGF0ZSgpOwotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHJldHVybiBvYmouZ2V0Q3JlYXRlZEJ5KCk7Ci0gICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRMYXN0TW9kaWZpY2F0aW9uRGF0ZSgpOwotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgIHJldHVybiBvYmouZ2V0TGFzdE1vZGlmaWVkQnkoKTsKLSAgICAgICAgICAgIGNhc2UgSURfQ09MVU1OOgotICAgICAgICAgICAgICAgIHJldHVybiBvYmouZ2V0SWQoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q29sdW1uQ2xhc3MoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEltYWdlSWNvbi5jbGFzczsKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5jbGFzczsKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICByZXR1cm4gR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3M7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgRm9sZGVyVHJhbnNmZXJIYW5kbGVyIGV4dGVuZHMgVHJhbnNmZXJIYW5kbGVyIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgRm9sZGVyVHJhbnNmZXJIYW5kbGVyKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoVHJhbnNmZXJTdXBwb3J0IHN1cHBvcnQpIHsKLSAgICAgICAgICAgIGlmICghc3VwcG9ydC5pc0RhdGFGbGF2b3JTdXBwb3J0ZWQoRGF0YUZsYXZvci5qYXZhRmlsZUxpc3RGbGF2b3IpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXN1cHBvcnQuaXNEcm9wKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbXBvcnREYXRhKFRyYW5zZmVyU3VwcG9ydCBzdXBwb3J0KSB7Ci0gICAgICAgICAgICBpZiAoIWNhbkltcG9ydChzdXBwb3J0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxGaWxlPiBmaWxlTGlzdCA9IChMaXN0PEZpbGU+KSBzdXBwb3J0LmdldFRyYW5zZmVyYWJsZSgpLmdldFRyYW5zZmVyRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFGbGF2b3IuamF2YUZpbGVMaXN0Rmxhdm9yKTsKLQotICAgICAgICAgICAgICAgIGlmICgoZmlsZUxpc3QgPT0gbnVsbCkgfHwgKGZpbGVMaXN0LnNpemUoKSAhPSAxKSB8fCAoZmlsZUxpc3QuZ2V0KDApID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAhZmlsZUxpc3QuZ2V0KDApLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaWxlID0gZmlsZUxpc3QuZ2V0KDApOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuZXcgQ3JlYXRlRG9jdW1lbnREaWFsb2cobnVsbCwgbW9kZWwsIGZpbGUpOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFNvdXJjZUFjdGlvbnMoSkNvbXBvbmVudCBjKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ09QWTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgVHJhbnNmZXJhYmxlIGNyZWF0ZVRyYW5zZmVyYWJsZShKQ29tcG9uZW50IGMpIHsKLSAgICAgICAgICAgIGludCByb3cgPSBnZXRTZWxlY3RlZFJvdygpOwotICAgICAgICAgICAgaWYgKChyb3cgPiAtMSkgJiYgKHJvdyA8IG1vZGVsLmdldEN1cnJlbnRDaGlsZHJlbigpLnNpemUoKSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBnZXRWYWx1ZUF0KHJvdywgSURfQ09MVU1OKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIENtaXNPYmplY3Qgb2JqZWN0ID0gbW9kZWwuZ2V0RnJvbUN1cnJlbnRDaGlsZHJlbihpZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZSA9IENsaWVudEhlbHBlci5jcmVhdGVUZW1wRmlsZUZyb21Eb2N1bWVudChkb2MsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdGVtcFRyYW5zRmlsZSA9IHRlbXBGaWxlOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHJhbnNmZXJhYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhRmxhdm9yU3VwcG9ydGVkKERhdGFGbGF2b3IgZmxhdm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYXZvciA9PSBEYXRhRmxhdm9yLmphdmFGaWxlTGlzdEZsYXZvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIERhdGFGbGF2b3JbXSBnZXRUcmFuc2ZlckRhdGFGbGF2b3JzKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YUZsYXZvcltdIHsgRGF0YUZsYXZvci5qYXZhRmlsZUxpc3RGbGF2b3IgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRUcmFuc2ZlckRhdGEoRGF0YUZsYXZvciBmbGF2b3IpIHRocm93cyBVbnN1cHBvcnRlZEZsYXZvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRlbXBUcmFuc0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvSW5mb0RpYWxvZy5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0luZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2YjRiNC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvSW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRBcmVhOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgSW5mb0RpYWxvZyBleHRlbmRzIEpEaWFsb2cgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgSW5mb0RpYWxvZyhGcmFtZSBvd25lcikgewotICAgICAgICBzdXBlcihvd25lciwgIkluZm8iLCB0cnVlKTsKLSAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDgwMCwgNTAwKSk7Ci0gICAgICAgIHNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oNjAwLCA0MDApKTsKLQotICAgICAgICBzZXRMYXlvdXQobmV3IEJveExheW91dChnZXRDb250ZW50UGFuZSgpLCBCb3hMYXlvdXQuUEFHRV9BWElTKSk7Ci0KLSAgICAgICAgSlBhbmVsIHRvcFBhbmVsID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dCgpKTsKLQotICAgICAgICBKTGFiZWwgY21pc0xvZ28gPSBuZXcgSkxhYmVsKENsaWVudEhlbHBlci5nZXRJY29uKCJpY29uLnBuZyIpKTsKLSAgICAgICAgdG9wUGFuZWwuYWRkKGNtaXNMb2dvKTsKLQotICAgICAgICBGb250IGxhYmVsRm9udCA9IFVJTWFuYWdlci5nZXRGb250KCJMYWJlbC5mb250Iik7Ci0gICAgICAgIEZvbnQgdGl0bGVGb250ID0gbGFiZWxGb250LmRlcml2ZUZvbnQoRm9udC5CT0xELCBsYWJlbEZvbnQuZ2V0U2l6ZTJEKCkgKiAyZik7Ci0KLSAgICAgICAgSkxhYmVsIHRpdGxlTGFiZWwgPSBuZXcgSkxhYmVsKCJDTUlTIFdvcmtiZW5jaCIpOwotICAgICAgICB0aXRsZUxhYmVsLnNldEZvbnQodGl0bGVGb250KTsKLSAgICAgICAgdG9wUGFuZWwuYWRkKHRpdGxlTGFiZWwpOwotCi0gICAgICAgIGFkZCh0b3BQYW5lbCk7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciByZWFkbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIHJlYWRtZS5hcHBlbmQobG9hZFRleHQoIi9NRVRBLUlORi9SRUFETUUtY21pcy13b3JrYmVuY2gudHh0IiwgIkNNSVMgV29ya2JlbmNoIikpOwotICAgICAgICByZWFkbWUuYXBwZW5kKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0KLSAgICAgICAgcmVhZG1lLmFwcGVuZCgiXG5DdXJyZW50IFN5c3RlbSBQcm9wZXJ0aWVzOlxuXG4iKTsKLQotICAgICAgICBQcm9wZXJ0aWVzIHN5c1Byb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgZm9yIChPYmplY3Qga2V5IDogbmV3IFRyZWVTZXQ8T2JqZWN0PihzeXNQcm9wcy5rZXlTZXQoKSkpIHsKLSAgICAgICAgICAgIHJlYWRtZS5hcHBlbmQoa2V5KS5hcHBlbmQoIiA9ICIpLmFwcGVuZChzeXNQcm9wcy5nZXQoa2V5KSkuYXBwZW5kKCdcbicpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZG1lLmFwcGVuZCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgICAgICByZWFkbWUuYXBwZW5kKGxvYWRUZXh0KCIvTUVUQS1JTkYvYnVpbGQtdGltZXN0YW1wLnR4dCIsICIiKSk7Ci0KLSAgICAgICAgSlRleHRBcmVhIHRhID0gbmV3IEpUZXh0QXJlYShyZWFkbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHRhLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgdGEuc2V0Rm9udChuZXcgRm9udChGb250Lk1PTk9TUEFDRUQsIEZvbnQuUExBSU4sIDEyKSk7Ci0gICAgICAgIEpTY3JvbGxQYW5lIHJlYWRtZVBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGEpOwotICAgICAgICByZWFkbWVQYW5lLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDUsIDUsIDUpKTsKLQotICAgICAgICBhZGQocmVhZG1lUGFuZSk7Ci0KLSAgICAgICAgQ2xpZW50SGVscGVyLmluc3RhbGxFc2NhcGVCaW5kaW5nKHRoaXMsIGdldFJvb3RQYW5lKCksIGZhbHNlKTsKLQotICAgICAgICBzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkhJREVfT05fQ0xPU0UpOwotICAgICAgICBwYWNrKCk7Ci0gICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93RGlhbG9nKCkgewotICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhpZGVEaWFsb2coKSB7Ci0gICAgICAgIHNldFZpc2libGUoZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGxvYWRUZXh0KFN0cmluZyBmaWxlLCBTdHJpbmcgZGVmYXVsdFRleHQpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGUpOwotICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElPVXRpbHMucmVhZEFsbExpbmVzKHN0cmVhbSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRUZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRUZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Mb2dGcmFtZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0xvZ0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzE0OTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0xvZ0ZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEFyZWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOwotaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgTG9nRnJhbWUgZXh0ZW5kcyBKRnJhbWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX1RJVExFID0gIkNNSVMgQ2xpZW50IExvZ2dpbmciOwotCi0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgbG9nVGV4dEFyZWE7Ci0KLSAgICBwdWJsaWMgTG9nRnJhbWUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIHNldFRpdGxlKFdJTkRPV19USVRMRSk7Ci0gICAgICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig4MDAsIDYwMCkpOwotICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDIwMCwgNjApKTsKLQotICAgICAgICBzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICBsb2dUZXh0QXJlYSA9IG5ldyBKVGV4dEFyZWEoKTsKLSAgICAgICAgbG9nVGV4dEFyZWEuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBsb2dUZXh0QXJlYS5zZXRGb250KG5ldyBGb250KCJNb25vc3BhY2VkIiwgRm9udC5QTEFJTiwgMTIpKTsKLSAgICAgICAgbG9nVGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0gICAgICAgIGxvZ1RleHRBcmVhLnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIGFkZChuZXcgSlNjcm9sbFBhbmUobG9nVGV4dEFyZWEpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBKUGFuZWwgaW5wdXRQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoKSk7Ci0gICAgICAgIGFkZChpbnB1dFBhbmVsLCBCb3JkZXJMYXlvdXQuUEFHRV9FTkQpOwotCi0gICAgICAgIEpCdXR0b24gY2xlYXJCdXR0b24gPSBuZXcgSkJ1dHRvbigiQ2xlYXIiKTsKLSAgICAgICAgY2xlYXJCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBsb2dUZXh0QXJlYS5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGlucHV0UGFuZWwuYWRkKGNsZWFyQnV0dG9uKTsKLQotICAgICAgICBTdHJpbmdbXSBsZXZlbHMgPSBuZXcgU3RyaW5nW10geyBMZXZlbC5BTEwudG9TdHJpbmcoKSwgTGV2ZWwuVFJBQ0UudG9TdHJpbmcoKSwgTGV2ZWwuREVCVUcudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBMZXZlbC5JTkZPLnRvU3RyaW5nKCksIExldmVsLldBUk4udG9TdHJpbmcoKSwgTGV2ZWwuRVJST1IudG9TdHJpbmcoKSwgTGV2ZWwuRkFUQUwudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBMZXZlbC5PRkYudG9TdHJpbmcoKSB9OwotCi0gICAgICAgIGZpbmFsIEpDb21ib0JveCBsZXZlbEJveCA9IG5ldyBKQ29tYm9Cb3gobGV2ZWxzKTsKLSAgICAgICAgbGV2ZWxCb3guc2V0U2VsZWN0ZWRJdGVtKExvZ2dlci5nZXRSb290TG9nZ2VyKCkuZ2V0TGV2ZWwoKS50b1N0cmluZygpKTsKLSAgICAgICAgbGV2ZWxCb3guYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0Um9vdExvZ2dlcigpLnNldExldmVsKExldmVsLnRvTGV2ZWwobGV2ZWxCb3guZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW5wdXRQYW5lbC5hZGQobGV2ZWxCb3gpOwotCi0gICAgICAgIENsaWVudEhlbHBlci5pbnN0YWxsRXNjYXBlQmluZGluZyh0aGlzLCBnZXRSb290UGFuZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5ISURFX09OX0NMT1NFKTsKLSAgICAgICAgcGFjaygpOwotCi0gICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0KLSAgICAgICAgQ2xpZW50V3JpdGVyQXBwZW5kZXIuc2V0VGV4dEFyZWEobG9nVGV4dEFyZWEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3dGcmFtZSgpIHsKLSAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvTG9nZ2luZ0lucHV0U3RyZWFtLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvTG9nZ2luZ0lucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTQwYzMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL0xvZ2dpbmdJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBMb2dnaW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTG9nZ2luZ0lucHV0U3RyZWFtLmNsYXNzKTsKLQotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2M7Ci0gICAgcHJpdmF0ZSBsb25nIG1hcmtlZDsKLSAgICBwcml2YXRlIGxvbmcgY291bnQgPSAwOwotICAgIHByaXZhdGUgbG9uZyBzdGFydFRpbWVzdGFtcCA9IC0xOwotICAgIHByaXZhdGUgbG9uZyBlbmRUaW1lc3RhbXAgPSAtMTsKLQotICAgIHB1YmxpYyBMb2dnaW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZGVzYykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0uYXZhaWxhYmxlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotICAgICAgICBzdHJlYW0ubWFyayhyZWFkbGltaXQpOwotICAgICAgICBtYXJrZWQgPSBjb3VudDsKLQotICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy50cmFjZSgie306IG1hcmsiLCBkZXNjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0ubWFya1N1cHBvcnRlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN0cmVhbS5yZXNldCgpOwotICAgICAgICBjb3VudCA9IG1hcmtlZDsKLQotICAgICAgICBpZiAoTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy50cmFjZSgie306IHJlc2V0IiwgZGVzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3VudChsb25nIGxlbikgewotICAgICAgICBpZiAoc3RhcnRUaW1lc3RhbXAgPCAwKSB7Ci0gICAgICAgICAgICBzdGFydFRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgTE9HLmluZm8oInt9OiBzdGFydGVkIHN0cmVhbWluZyIsIGRlc2MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW4gPT0gLTEgJiYgZW5kVGltZXN0YW1wID09IC0xKSB7Ci0gICAgICAgICAgICBlbmRUaW1lc3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGxvbmcgdGltZSA9IChlbmRUaW1lc3RhbXAgLSBzdGFydFRpbWVzdGFtcCk7Ci0gICAgICAgICAgICBsb25nIGtpYlBlclNlYyA9ICh0aW1lIDwgMSA/IC0xTCA6IChsb25nKSAoKChkb3VibGUpIGNvdW50IC8gMTAyNCkgLyAoKGRvdWJsZSkgdGltZSAvIDEwMDApKSk7Ci0KLSAgICAgICAgICAgIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgTE9HLmluZm8oInt9OiBzdHJlYW1lZCB7fSBieXRlcyBpbiB7fSBtcywge30gS2lCL3NlYyIsIGRlc2MsIG5mLmZvcm1hdChjb3VudCksIG5mLmZvcm1hdCh0aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgbmYuZm9ybWF0KGtpYlBlclNlYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291bnQgKz0gbGVuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGIgPSBzdHJlYW0ucmVhZCgpOwotICAgICAgICBjb3VudChiID09IC0xID8gLTEgOiAxKTsKLQotICAgICAgICBpZiAoYiAhPSAtMSAmJiBMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLnRyYWNlKCJ7fTogcmVhZCB7fSBieXRlcyIsIGRlc2MsIGNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJiID0gc3RyZWFtLnJlYWQoYiwgb2ZmLCBsZW4pOwotICAgICAgICBjb3VudChyYik7Ci0KLSAgICAgICAgaWYgKHJiICE9IC0xICYmIExPRy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cudHJhY2UoInt9OiByZWFkIHt9IGJ5dGVzIiwgZGVzYywgY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJiID0gc3RyZWFtLnJlYWQoYik7Ci0gICAgICAgIGNvdW50KHJiKTsKLQotICAgICAgICBpZiAocmIgIT0gLTEgJiYgTE9HLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIExPRy50cmFjZSgie306IHJlYWQge30gYnl0ZXMiLCBkZXNjLCBjb3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgbGVuID0gc3VwZXIuc2tpcChuKTsKLSAgICAgICAgY291bnQobGVuKTsKLQotICAgICAgICBpZiAobGVuID4gMCAmJiBMT0cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLnRyYWNlKCJ7fTogcmVhZCB7fSBieXRlcyIsIGRlc2MsIGNvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlci5jbG9zZSgpOwotCi0gICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgTE9HLmluZm8oInt9OiBzdHJlYW0gY2xvc2VkIiwgZGVzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvTG9naW5EaWFsb2cuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Mb2dpbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDAxNzgxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Mb2dpbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkNvbnRhaW5lcjsKLWltcG9ydCBqYXZhLmF3dC5DdXJzb3I7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXJ2aWNlTG9hZGVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkRpYWxvZzsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFiYmVkUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50U2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIExvZ2luRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1BST1BfTE9HSU5fVEFCID0gQ2xpZW50U2Vzc2lvbi5XT1JLQkVOQ0hfUFJFRklYICsgImxvZ2ludGFiIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNlcnZpY2VMb2FkZXI8QWJzdHJhY3RMb2dpblRhYj4gVEFCX1NFUlZJQ0VfTE9BREVSID0gU2VydmljZUxvYWRlcgotICAgICAgICAgICAgLmxvYWQoQWJzdHJhY3RMb2dpblRhYi5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEpUYWJiZWRQYW5lIGxvZ2luVGFiczsKLSAgICBwcml2YXRlIEJhc2ljTG9naW5UYWIgYmFzaWNMb2dpblRhYjsKLSAgICBwcml2YXRlIEV4cGVydExvZ2luVGFiIGV4cGVydExvZ2luVGFiOwotICAgIHByaXZhdGUgSkJ1dHRvbiBsb2FkUmVwb3NpdG9yeUJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gbG9naW5CdXR0b247Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggcmVwb3NpdG9yeUJveDsKLSAgICBwcml2YXRlIEFic3RyYWN0TG9naW5UYWIgY3VycmVudFRhYjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5jZWxlZCA9IHRydWU7Ci0KLSAgICBwcml2YXRlIENsaWVudFNlc3Npb24gY2xpZW50U2Vzc2lvbjsKLQotICAgIHB1YmxpYyBMb2dpbkRpYWxvZyhGcmFtZSBvd25lcikgewotICAgICAgICBzdXBlcihvd25lciwgIkxvZ2luIiwgdHJ1ZSk7Ci0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIHNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oNzAwLCA1MDApKTsKLSAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDcwMCwgNTAwKSk7Ci0KLSAgICAgICAgQ29udGFpbmVyIHBhbmUgPSBnZXRDb250ZW50UGFuZSgpOwotICAgICAgICBwYW5lLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCi0gICAgICAgIGxvZ2luVGFicyA9IG5ldyBKVGFiYmVkUGFuZSgpOwotICAgICAgICBhZGQobG9naW5UYWJzLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICAvLyBhZGQgdGFicwotICAgICAgICBhZGRMb2dpblRhYnMobG9naW5UYWJzKTsKLQotICAgICAgICAvLyByZXBvc2l0b3J5Ci0gICAgICAgIEpQYW5lbCBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgYnV0dG9uUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoYnV0dG9uUGFuZWwsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLSAgICAgICAgYnV0dG9uUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgNSwgNSwgNSkpOwotICAgICAgICBhZGQoYnV0dG9uUGFuZWwsIEJvcmRlckxheW91dC5QQUdFX0VORCk7Ci0KLSAgICAgICAgbG9hZFJlcG9zaXRvcnlCdXR0b24gPSBjcmVhdGVCdXR0b24oIkxvYWQgUmVwb3NpdG9yaWVzIik7Ci0gICAgICAgIGJ1dHRvblBhbmVsLmFkZChsb2FkUmVwb3NpdG9yeUJ1dHRvbik7Ci0gICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihsb2FkUmVwb3NpdG9yeUJ1dHRvbik7Ci0KLSAgICAgICAgY3JlYXRlUmVwb3NpdG9yeUJveChidXR0b25QYW5lbCk7Ci0KLSAgICAgICAgbG9naW5CdXR0b24gPSBjcmVhdGVCdXR0b24oIkxvZ2luIik7Ci0gICAgICAgIGJ1dHRvblBhbmVsLmFkZChsb2dpbkJ1dHRvbik7Ci0gICAgICAgIGxvZ2luQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIGxpc3RlbmVycwotICAgICAgICBsb2FkUmVwb3NpdG9yeUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlCb3gucmVtb3ZlQWxsSXRlbXMoKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFiLmJlZm9yZUxvYWRSZXBvc2l0b3JpZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICBjcmVhdGVDbGllbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXBvc2l0b3J5PiByZXBvc2l0b3JpZXMgPSBjbGllbnRTZXNzaW9uLmdldFJlcG9zaXRvcmllcygpOwotCi0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVwb3NpdG9yaWVzLCBuZXcgQ29tcGFyYXRvcjxSZXBvc2l0b3J5PigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFJlcG9zaXRvcnkgcjEsIFJlcG9zaXRvcnkgcjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjEgPT0gbnVsbCB8fCByMS5nZXROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIgPT0gbnVsbCB8fCByMi5nZXROYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIxLmdldE5hbWUoKS5jb21wYXJlVG8ocjIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlCb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihsb2FkUmVwb3NpdG9yeUJ1dHRvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGdldE93bmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgQ01JUyBlbmRwb2ludCByZXRydW5lZCBhbiBlbXB0eSBsaXN0IG9mIHJlcG9zaXRvcmllcy4iLCAiTm8gcmVwb3NpdG9yaWVzISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA6IHJlcG9zaXRvcmllcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlCb3guYWRkSXRlbShyZXBvc2l0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeUJveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9naW5CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihsb2dpbkJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFiLmFmdGVyTG9hZFJlcG9zaXRvcmllcyhyZXBvc2l0b3JpZXMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5Qm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBsb2dpbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGxvYWRSZXBvc2l0b3J5QnV0dG9uKTsKLQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29ubmVjdGlvbkVycm9yRGlhbG9nKExvZ2luRGlhbG9nLnRoaXMsIGV4KTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBsb2dpbkJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFiLmJlZm9yZUxvZ2luKGNsaWVudFNlc3Npb24uZ2V0UmVwb3NpdG9yaWVzKCkuZ2V0KHJlcG9zaXRvcnlCb3guZ2V0U2VsZWN0ZWRJbmRleCgpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50U2Vzc2lvbi5jcmVhdGVTZXNzaW9uKHJlcG9zaXRvcnlCb3guZ2V0U2VsZWN0ZWRJbmRleCgpKTsKLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFiLmFmdGVyTG9naW4oY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGVEaWFsb2coKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeUJveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbG9naW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihsb2FkUmVwb3NpdG9yeUJ1dHRvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbm5lY3Rpb25FcnJvckRpYWxvZyhMb2dpbkRpYWxvZy50aGlzLCBleCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24obG9hZFJlcG9zaXRvcnlCdXR0b24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ2xpZW50SGVscGVyLmluc3RhbGxFc2NhcGVCaW5kaW5nKHRoaXMsIGdldFJvb3RQYW5lKCksIGZhbHNlKTsKLQotICAgICAgICBzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkhJREVfT05fQ0xPU0UpOwotICAgICAgICBwYWNrKCk7Ci0gICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTG9naW5UYWJzKGZpbmFsIEpUYWJiZWRQYW5lIGxvZ2luVGFicykgewotCi0gICAgICAgIGZvciAoQWJzdHJhY3RMb2dpblRhYiB0YWIgOiBUQUJfU0VSVklDRV9MT0FERVIpIHsKLSAgICAgICAgICAgIGxvZ2luVGFicy5hZGQodGFiLmdldFRhYlRpdGxlKCksIHRhYik7Ci0gICAgICAgIH0KLQotICAgICAgICBiYXNpY0xvZ2luVGFiID0gbmV3IEJhc2ljTG9naW5UYWIoKTsKLSAgICAgICAgbG9naW5UYWJzLmFkZFRhYihiYXNpY0xvZ2luVGFiLmdldFRhYlRpdGxlKCksIGJhc2ljTG9naW5UYWIpOwotCi0gICAgICAgIGV4cGVydExvZ2luVGFiID0gbmV3IEV4cGVydExvZ2luVGFiKCk7Ci0gICAgICAgIGxvZ2luVGFicy5hZGRUYWIoZXhwZXJ0TG9naW5UYWIuZ2V0VGFiVGl0bGUoKSwgZXhwZXJ0TG9naW5UYWIpOwotCi0gICAgICAgIGxvZ2luVGFicy5zZXRTZWxlY3RlZEluZGV4KDApOwotCi0gICAgICAgIFN0cmluZyBzdGFydFRhYiA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNQUk9QX0xPR0lOX1RBQiwgIjAiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCB0YWIgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXJ0VGFiKTsKLSAgICAgICAgICAgIGlmICh0YWIgPj0gMCAmJiB0YWIgPCBsb2dpblRhYnMuZ2V0VGFiQ291bnQoKSkgewotICAgICAgICAgICAgICAgIGxvZ2luVGFicy5zZXRTZWxlY3RlZEluZGV4KHRhYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgfQotCi0gICAgICAgIGN1cnJlbnRUYWIgPSAoQWJzdHJhY3RMb2dpblRhYikgbG9naW5UYWJzLmdldFNlbGVjdGVkQ29tcG9uZW50KCk7Ci0KLSAgICAgICAgbG9naW5UYWJzLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZ2luVGFicy5nZXRTZWxlY3RlZENvbXBvbmVudCgpID09IGV4cGVydExvZ2luVGFiKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGFiLnRyYW5zZmVyU2Vzc2lvblBhcmFtZXRlcnNUb0V4cGVydFRhYigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRMb2dpblRhYi5zZXRTZXNzaW9uUGFyYW1ldGVycyhjdXJyZW50VGFiLmdldFNlc3Npb25QYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY3VycmVudFRhYiA9IChBYnN0cmFjdExvZ2luVGFiKSBsb2dpblRhYnMuZ2V0U2VsZWN0ZWRDb21wb25lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKQnV0dG9uIGNyZWF0ZUJ1dHRvbihTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgSkJ1dHRvbiBidXR0b24gPSBuZXcgSkJ1dHRvbih0aXRsZSk7Ci0gICAgICAgIGJ1dHRvbi5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oU2hvcnQuTUFYX1ZBTFVFLCAzMCkpOwotICAgICAgICBidXR0b24uc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSkpOwotICAgICAgICBidXR0b24uc2V0QWxpZ25tZW50WChDb21wb25lbnQuQ0VOVEVSX0FMSUdOTUVOVCk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUmVwb3NpdG9yeUJveChDb250YWluZXIgcGFuZSkgewotICAgICAgICByZXBvc2l0b3J5Qm94ID0gbmV3IEpDb21ib0JveCgpOwotICAgICAgICByZXBvc2l0b3J5Qm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICByZXBvc2l0b3J5Qm94LnNldFJlbmRlcmVyKG5ldyBSZXBvc2l0b3J5UmVuZGVyZXIoKSk7Ci0gICAgICAgIHJlcG9zaXRvcnlCb3guc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKFNob3J0Lk1BWF9WQUxVRSwgNjApKTsKLSAgICAgICAgcmVwb3NpdG9yeUJveC5zZXRBbGlnbm1lbnRYKENvbXBvbmVudC5DRU5URVJfQUxJR05NRU5UKTsKLQotICAgICAgICBwYW5lLmFkZChyZXBvc2l0b3J5Qm94KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDbGllbnRTZXNzaW9uKENsaWVudFNlc3Npb24gY2xpZW50U2Vzc2lvbikgewotICAgICAgICB0aGlzLmNsaWVudFNlc3Npb24gPSBjbGllbnRTZXNzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNsaWVudFNlc3Npb24oKSB7Ci0gICAgICAgIHNldENsaWVudFNlc3Npb24obmV3IENsaWVudFNlc3Npb24oY3VycmVudFRhYi5nZXRTZXNzaW9uUGFyYW1ldGVycygpLCBjdXJyZW50VGFiLmdldE9iamVjdEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBjdXJyZW50VGFiLmdldEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIoKSwgY3VycmVudFRhYi5nZXRDYWNoZSgpLCBjdXJyZW50VGFiLmdldFR5cGVEZWZpbml0aW9uQ2FjaGUoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3dEaWFsb2coKSB7Ci0gICAgICAgIGNsaWVudFNlc3Npb24gPSBudWxsOwotICAgICAgICBjYW5jZWxlZCA9IHRydWU7Ci0KLSAgICAgICAgcmVwb3NpdG9yeUJveC5yZW1vdmVBbGxJdGVtcygpOwotICAgICAgICByZXBvc2l0b3J5Qm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBsb2dpbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGxvYWRSZXBvc2l0b3J5QnV0dG9uKTsKLQotICAgICAgICBzZXRMb2NhdGlvblJlbGF0aXZlVG8oZ2V0T3duZXIoKSk7Ci0gICAgICAgIHNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGlkZURpYWxvZygpIHsKLSAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENsaWVudFNlc3Npb24gZ2V0Q2xpZW50U2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudFNlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNhbmNlbGVkOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBSZXBvc2l0b3J5UmVuZGVyZXIgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBMaXN0Q2VsbFJlbmRlcmVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKTGFiZWwgbmFtZUxhYmVsOwotICAgICAgICBwcml2YXRlIGZpbmFsIEpMYWJlbCBpZExhYmVsOwotICAgICAgICBwcml2YXRlIGZpbmFsIEpMYWJlbCBkZXNjcmlwdGlvbkxhYmVsOwotCi0gICAgICAgIHB1YmxpYyBSZXBvc2l0b3J5UmVuZGVyZXIoKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodGhpcywgQm94TGF5b3V0LlBBR0VfQVhJUykpOwotICAgICAgICAgICAgc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMywgMywgMywgMykpOwotCi0gICAgICAgICAgICBGb250IGxhYmVsRm9udCA9IFVJTWFuYWdlci5nZXRGb250KCJMYWJlbC5mb250Iik7Ci0KLSAgICAgICAgICAgIG5hbWVMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgICAgIG5hbWVMYWJlbC5zZXRGb250KGxhYmVsRm9udC5kZXJpdmVGb250KEZvbnQuQk9MRCkpOwotICAgICAgICAgICAgYWRkKG5hbWVMYWJlbCk7Ci0KLSAgICAgICAgICAgIGlkTGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0gICAgICAgICAgICBhZGQoaWRMYWJlbCk7Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uTGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0gICAgICAgICAgICBhZGQoZGVzY3JpcHRpb25MYWJlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLSAgICAgICAgICAgIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChSZXBvc2l0b3J5KSB2YWx1ZTsKLQotICAgICAgICAgICAgaWYgKGlzU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKGxpc3QuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpKTsKLSAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKGxpc3QuZ2V0U2VsZWN0aW9uRm9yZWdyb3VuZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0QmFja2dyb3VuZChsaXN0LmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0Rm9yZWdyb3VuZChsaXN0LmdldEZvcmVncm91bmQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuYW1lTGFiZWwuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgaWRMYWJlbC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkxhYmVsLnNldFRleHQoIiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuYW1lTGFiZWwuc2V0VGV4dChyZXBvc2l0b3J5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWRMYWJlbC5zZXRUZXh0KHJlcG9zaXRvcnkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1Byb3BlcnR5RWRpdG9yRnJhbWUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Qcm9wZXJ0eUVkaXRvckZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjA1MjMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1Byb3BlcnR5RWRpdG9yRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkN1cnNvcjsKLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUxpc3RlbmVyOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5Gb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKLWltcG9ydCBqYXZheC5zd2luZy5JbWFnZUljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5KRm9ybWF0dGVkVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lckxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuUHJvcGVydHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FyZGluYWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5VcGRhdGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLlByb3BlcnR5RWRpdG9yRnJhbWUuVXBkYXRlU3RhdHVzLlN0YXR1c0ZsYWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotCi0vKioKLSAqIFNpbXBsZSBwcm9wZXJ0eSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUVkaXRvckZyYW1lIGV4dGVuZHMgSkZyYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19USVRMRSA9ICJQcm9wZXJ0eSBFZGl0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlSWNvbiBJQ09OX0FERCA9IENsaWVudEhlbHBlci5nZXRJY29uKCJhZGQucG5nIik7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgZmluYWwgQ21pc09iamVjdCBvYmplY3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5SW5wdXRQYW5lbD4gcHJvcGVydHlQYW5lbHM7Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlFZGl0b3JGcmFtZShmaW5hbCBDbGllbnRNb2RlbCBtb2RlbCwgZmluYWwgQ21pc09iamVjdCBvYmplY3QpIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotCi0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIHNldFRpdGxlKFdJTkRPV19USVRMRSk7Ci0gICAgICAgIHNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig4MDAsIDYwMCkpOwotICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDMwMCwgMTIwKSk7Ci0KLSAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0KLSAgICAgICAgZmluYWwgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBwYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dChwYW5lbCwgQm94TGF5b3V0LlBBR0VfQVhJUykpOwotCi0gICAgICAgIGZpbmFsIEZvbnQgbGFiZWxGb250ID0gVUlNYW5hZ2VyLmdldEZvbnQoIkxhYmVsLmZvbnQiKTsKLSAgICAgICAgZmluYWwgRm9udCBib2xkRm9udCA9IGxhYmVsRm9udC5kZXJpdmVGb250KEZvbnQuQk9MRCwgbGFiZWxGb250LmdldFNpemUyRCgpICogMS4yZik7Ci0KLSAgICAgICAgZmluYWwgSlBhbmVsIHRvcFBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICB0b3BQYW5lbC5zZXRMYXlvdXQobmV3IEJveExheW91dCh0b3BQYW5lbCwgQm94TGF5b3V0LllfQVhJUykpOwotICAgICAgICB0b3BQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7Ci0gICAgICAgIGZpbmFsIEpMYWJlbCBuYW1lTGFiZWwgPSBuZXcgSkxhYmVsKG9iamVjdC5nZXROYW1lKCkpOwotICAgICAgICBuYW1lTGFiZWwuc2V0Rm9udChib2xkRm9udCk7Ci0gICAgICAgIHRvcFBhbmVsLmFkZChuYW1lTGFiZWwpOwotICAgICAgICB0b3BQYW5lbC5hZGQobmV3IEpMYWJlbChvYmplY3QuZ2V0SWQoKSkpOwotICAgICAgICBhZGQodG9wUGFuZWwsIEJvcmRlckxheW91dC5QQUdFX1NUQVJUKTsKLQotICAgICAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHBhbmVsKTsKLSAgICAgICAgYWRkKHNjcm9sbFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgIHByb3BlcnR5UGFuZWxzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUVkaXRvckZyYW1lLlByb3BlcnR5SW5wdXRQYW5lbD4oKTsKLQotICAgICAgICBpbnQgcG9zaXRpb24gPSAwOwotCi0gICAgICAgIC8vIHByaW1hcnkgdHlwZQotICAgICAgICBmb3IgKFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmIDogb2JqZWN0LmdldFR5cGUoKS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNVcGRhdGFibGUgPSAocHJvcERlZi5nZXRVcGRhdGFiaWxpdHkoKSA9PSBVcGRhdGFiaWxpdHkuUkVBRFdSSVRFKQotICAgICAgICAgICAgICAgICAgICB8fCAocHJvcERlZi5nZXRVcGRhdGFiaWxpdHkoKSA9PSBVcGRhdGFiaWxpdHkuV0hFTkNIRUNLRURPVVQgJiYgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX0NIRUNLX0lOKSk7Ci0KLSAgICAgICAgICAgIGlmIChpc1VwZGF0YWJsZSkgewotICAgICAgICAgICAgICAgIFByb3BlcnR5SW5wdXRQYW5lbCBwcm9wZXJ0eVBhbmVsID0gbmV3IFByb3BlcnR5SW5wdXRQYW5lbChwcm9wRGVmLCBvYmplY3QuZ2V0UHJvcGVydHlWYWx1ZShwcm9wRGVmCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSksIHBvc2l0aW9uKyspOwotCi0gICAgICAgICAgICAgICAgcHJvcGVydHlQYW5lbHMuYWRkKHByb3BlcnR5UGFuZWwpOwotICAgICAgICAgICAgICAgIHBhbmVsLmFkZChwcm9wZXJ0eVBhbmVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNlY29uZGFyeSB0eXBlcwotICAgICAgICBpZiAob2JqZWN0LmdldFNlY29uZGFyeVR5cGVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3RUeXBlIHNlY1R5cGUgOiBvYmplY3QuZ2V0U2Vjb25kYXJ5VHlwZXMoKSkgewotICAgICAgICAgICAgICAgIGlmIChzZWNUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiBzZWNUeXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1VwZGF0YWJsZSA9IChwcm9wRGVmLmdldFVwZGF0YWJpbGl0eSgpID09IFVwZGF0YWJpbGl0eS5SRUFEV1JJVEUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwcm9wRGVmLmdldFVwZGF0YWJpbGl0eSgpID09IFVwZGF0YWJpbGl0eS5XSEVOQ0hFQ0tFRE9VVCAmJiBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzQWxsb3dhYmxlQWN0aW9uKEFjdGlvbi5DQU5fQ0hFQ0tfSU4pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVXBkYXRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlJbnB1dFBhbmVsIHByb3BlcnR5UGFuZWwgPSBuZXcgUHJvcGVydHlJbnB1dFBhbmVsKHByb3BEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuZ2V0UHJvcGVydHlWYWx1ZShwcm9wRGVmLmdldElkKCkpLCBwb3NpdGlvbisrKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGFuZWxzLmFkZChwcm9wZXJ0eVBhbmVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5hZGQocHJvcGVydHlQYW5lbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBKQnV0dG9uIHVwZGF0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJVcGRhdGUiKTsKLSAgICAgICAgdXBkYXRlQnV0dG9uLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUsIDUsIDUsIDUpKTsKLSAgICAgICAgdXBkYXRlQnV0dG9uLnNldERlZmF1bHRDYXBhYmxlKHRydWUpOwotICAgICAgICB1cGRhdGVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRvVXBkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYWRkKHVwZGF0ZUJ1dHRvbiwgQm9yZGVyTGF5b3V0LlBBR0VfRU5EKTsKLQotICAgICAgICBzZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkRJU1BPU0VfT05fQ0xPU0UpOwotICAgICAgICBwYWNrKCk7Ci0gICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgdXBkYXRlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkb1VwZGF0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5SW5wdXRQYW5lbCBwcm9wZXJ0eVBhbmVsIDogcHJvcGVydHlQYW5lbHMpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlQYW5lbC5pbmNsdWRlSW5VcGRhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eVBhbmVsLmdldElkKCksIHByb3BlcnR5UGFuZWwuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdElkIG5ld0lkID0gb2JqZWN0LnVwZGF0ZVByb3BlcnRpZXMocHJvcGVydGllcywgZmFsc2UpOwotCi0gICAgICAgICAgICBpZiAoKG5ld0lkICE9IG51bGwpICYmIG5ld0lkLmdldElkKCkuZXF1YWxzKG1vZGVsLmdldEN1cnJlbnRPYmplY3QoKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnJlbG9hZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5yZWxvYWRGb2xkZXIoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKHRoaXMsIGV4KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludGVyZmFjZSBVcGRhdGVTdGF0dXMgewotICAgICAgICBlbnVtIFN0YXR1c0ZsYWcgewotICAgICAgICAgICAgRE9OVF9DSEFOR0UsIFVQREFURSwgVU5TRVQKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0U3RhdHVzKFN0YXR1c0ZsYWcgc3RhdHVzKTsKLQotICAgICAgICBTdGF0dXNGbGFnIGdldFN0YXR1cygpOwotICAgIH0KLQotICAgIGludGVyZmFjZSBNdWx0aXZhbHVlTWFuYWdlciB7Ci0gICAgICAgIHZvaWQgYWRkTmV3VmFsdWUoKTsKLQotICAgICAgICB2b2lkIHJlbW92ZVZhbHVlKGludCBwb3MpOwotCi0gICAgICAgIHZvaWQgbW92ZVVwKGludCBwb3MpOwotCi0gICAgICAgIHZvaWQgbW92ZURvd24oaW50IHBvcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgaW5wdXQgcGFuZWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9wZXJ0eUlucHV0UGFuZWwgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBVcGRhdGVTdGF0dXMsIE11bHRpdmFsdWVNYW5hZ2VyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkFDS0dST1VORDEgPSBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlOlwiVGFibGUuY2VsbFJlbmRlcmVyXCIuYmFja2dyb3VuZCIpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCQUNLR1JPVU5EMiA9IFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuYWx0ZXJuYXRlUm93Q29sb3IiKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgTElORSA9IG5ldyBDb2xvcigweEI4LCAweEI4LCAweEI4KTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBiZ0NvbG9yOwotICAgICAgICBwcml2YXRlIEpDb21ib0JveCBjaGFuZ2VCb3g7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxKQ29tcG9uZW50PiB2YWx1ZUNvbXBvbmVudHM7Ci0KLSAgICAgICAgcHVibGljIFByb3BlcnR5SW5wdXRQYW5lbChQcm9wZXJ0eURlZmluaXRpb248Pz4gcHJvcERlZiwgT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLnByb3BEZWYgPSBwcm9wRGVmOwotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgYmdDb2xvciA9IChwb3NpdGlvbiAlIDIgPT0gMCA/IEJBQ0tHUk9VTkQxIDogQkFDS0dST1VORDIpOwotICAgICAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQodGhpcywgQm94TGF5b3V0LlBBR0VfQVhJUykpOwotCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKGJnQ29sb3IpOwotICAgICAgICAgICAgc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlQ29tcG91bmRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVNYXR0ZUJvcmRlcigwLCAwLCAxLCAwLCBMSU5FKSwKLSAgICAgICAgICAgICAgICAgICAgQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigxMCwgNSwgMTAsIDUpKSk7Ci0KLSAgICAgICAgICAgIEZvbnQgbGFiZWxGb250ID0gVUlNYW5hZ2VyLmdldEZvbnQoIkxhYmVsLmZvbnQiKTsKLSAgICAgICAgICAgIEZvbnQgYm9sZEZvbnQgPSBsYWJlbEZvbnQuZGVyaXZlRm9udChGb250LkJPTEQsIGxhYmVsRm9udC5nZXRTaXplMkQoKSAqIDEuMmYpOwotCi0gICAgICAgICAgICBKUGFuZWwgdGl0bGVQYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHRpdGxlUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgICAgICB0aXRsZVBhbmVsLnNldEJhY2tncm91bmQoYmdDb2xvcik7Ci0gICAgICAgICAgICB0aXRsZVBhbmVsLnNldFRvb2xUaXBUZXh0KCI8aHRtbD48Yj4iCi0gICAgICAgICAgICAgICAgICAgICsgcHJvcERlZi5nZXRQcm9wZXJ0eVR5cGUoKS52YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIjwvYj4gKCIKLSAgICAgICAgICAgICAgICAgICAgKyBwcm9wRGVmLmdldENhcmRpbmFsaXR5KCkudmFsdWUoKQotICAgICAgICAgICAgICAgICAgICArICIgdmFsdWUpIgotICAgICAgICAgICAgICAgICAgICArIChwcm9wRGVmLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCA/ICI8YnI+IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ2xpZW50SGVscGVyLmVuY29kZUh0bWwobmV3IFN0cmluZ0J1aWxkZXIoKSwgcHJvcERlZi5nZXREZXNjcmlwdGlvbigpKSA6ICIiKSk7Ci0gICAgICAgICAgICBhZGQodGl0bGVQYW5lbCk7Ci0KLSAgICAgICAgICAgIEpQYW5lbCBuYW1lUGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBuYW1lUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQobmFtZVBhbmVsLCBCb3hMYXlvdXQuWV9BWElTKSk7Ci0gICAgICAgICAgICBuYW1lUGFuZWwuc2V0QmFja2dyb3VuZChiZ0NvbG9yKTsKLSAgICAgICAgICAgIEpMYWJlbCBkaXNwbGF5TmFtZUxhYmVsID0gbmV3IEpMYWJlbChwcm9wRGVmLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgICAgICAgZGlzcGxheU5hbWVMYWJlbC5zZXRGb250KGJvbGRGb250KTsKLSAgICAgICAgICAgIG5hbWVQYW5lbC5hZGQoZGlzcGxheU5hbWVMYWJlbCk7Ci0gICAgICAgICAgICBKTGFiZWwgaWRMYWJlbCA9IG5ldyBKTGFiZWwocHJvcERlZi5nZXRJZCgpKTsKLSAgICAgICAgICAgIG5hbWVQYW5lbC5hZGQoaWRMYWJlbCk7Ci0KLSAgICAgICAgICAgIHRpdGxlUGFuZWwuYWRkKG5hbWVQYW5lbCwgQm9yZGVyTGF5b3V0LkxJTkVfU1RBUlQpOwotCi0gICAgICAgICAgICBjaGFuZ2VCb3ggPSBuZXcgSkNvbWJvQm94KG5ldyBPYmplY3RbXSB7ICJEb24ndCBjaGFuZ2UgICAgICIsICJVcGRhdGUgICAgIiwgIlVuc2V0ICAgICAiIH0pOwotICAgICAgICAgICAgdGl0bGVQYW5lbC5hZGQoY2hhbmdlQm94LCBCb3JkZXJMYXlvdXQuTElORV9FTkQpOwotCi0gICAgICAgICAgICB2YWx1ZUNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PEpDb21wb25lbnQ+KCk7Ci0gICAgICAgICAgICBpZiAocHJvcERlZi5nZXRDYXJkaW5hbGl0eSgpID09IENhcmRpbmFsaXR5LlNJTkdMRSkgewotICAgICAgICAgICAgICAgIEpDb21wb25lbnQgdmFsdWVGaWVsZCA9IGNyZWF0ZUlucHV0RmllbGQodmFsdWUpOwotICAgICAgICAgICAgICAgIHZhbHVlQ29tcG9uZW50cy5hZGQodmFsdWVGaWVsZCk7Ci0gICAgICAgICAgICAgICAgYWRkKHZhbHVlRmllbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0PD8+KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHYgOiAoTGlzdDw/PikgdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpDb21wb25lbnQgdmFsdWVGaWVsZCA9IG5ldyBNdWx0aVZhbHVlUHJvcGVydHlJbnB1dEZpZWxkKGNyZWF0ZUlucHV0RmllbGQodiksIHRoaXMsIGJnQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDb21wb25lbnRzLmFkZCh2YWx1ZUZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZCh2YWx1ZUZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEpQYW5lbCBhZGRQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgICAgICBhZGRQYW5lbC5zZXRCYWNrZ3JvdW5kKGJnQ29sb3IpOwotICAgICAgICAgICAgICAgIEpCdXR0b24gYWRkQnV0dG9uID0gbmV3IEpCdXR0b24oSUNPTl9BREQpOwotICAgICAgICAgICAgICAgIGFkZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkTmV3VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXR1cyhTdGF0dXNGbGFnLlVQREFURSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBhZGRQYW5lbC5hZGQoYWRkQnV0dG9uLCBCb3JkZXJMYXlvdXQuTElORV9FTkQpOwotICAgICAgICAgICAgICAgIGFkZChhZGRQYW5lbCk7Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQb3NpdGlvbnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsIGdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSkNvbXBvbmVudCBjcmVhdGVJbnB1dEZpZWxkKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgc3dpdGNoIChwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIElOVEVHRVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyUHJvcGVydHlJbnB1dEZpZWxkKHZhbHVlLCB0aGlzLCBiZ0NvbG9yKTsKLSAgICAgICAgICAgIGNhc2UgREVDSU1BTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlY2ltYWxQcm9wZXJ0eUlucHV0RmllbGQodmFsdWUsIHRoaXMsIGJnQ29sb3IpOwotICAgICAgICAgICAgY2FzZSBEQVRFVElNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lUHJvcGVydHlJbnB1dEZpZWxkKHZhbHVlLCB0aGlzLCBiZ0NvbG9yKTsKLSAgICAgICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW5Qcm9wZXJ0eUlucHV0RmllbGQodmFsdWUsIHRoaXMsIGJnQ29sb3IpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1Byb3BlcnR5SW5wdXRGaWVsZCh2YWx1ZSwgdGhpcywgYmdDb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUG9zaXRpb25zKCkgewotICAgICAgICAgICAgaW50IG4gPSB2YWx1ZUNvbXBvbmVudHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNdWx0aVZhbHVlUHJvcGVydHlJbnB1dEZpZWxkIGNvbXAgPSAoTXVsdGlWYWx1ZVByb3BlcnR5SW5wdXRGaWVsZCkgdmFsdWVDb21wb25lbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBjb21wLnVwZGF0ZVBvc2l0aW9uKGksIGkgKyAxID09IG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkTmV3VmFsdWUoKSB7Ci0gICAgICAgICAgICBKQ29tcG9uZW50IHZhbHVlRmllbGQgPSBuZXcgTXVsdGlWYWx1ZVByb3BlcnR5SW5wdXRGaWVsZChjcmVhdGVJbnB1dEZpZWxkKG51bGwpLCB0aGlzLCBiZ0NvbG9yKTsKLSAgICAgICAgICAgIHZhbHVlQ29tcG9uZW50cy5hZGQodmFsdWVGaWVsZCk7Ci0gICAgICAgICAgICBhZGQodmFsdWVGaWVsZCwgZ2V0Q29tcG9uZW50Q291bnQoKSAtIDEpOwotCi0gICAgICAgICAgICB1cGRhdGVQb3NpdGlvbnMoKTsKLSAgICAgICAgICAgIHNldFN0YXR1cyhTdGF0dXNGbGFnLlVQREFURSk7Ci0KLSAgICAgICAgICAgIHJldmFsaWRhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhbHVlKGludCBwb3MpIHsKLSAgICAgICAgICAgIHJlbW92ZSh2YWx1ZUNvbXBvbmVudHMucmVtb3ZlKHBvcykpOwotCi0gICAgICAgICAgICB1cGRhdGVQb3NpdGlvbnMoKTsKLSAgICAgICAgICAgIHNldFN0YXR1cyhTdGF0dXNGbGFnLlVQREFURSk7Ci0KLSAgICAgICAgICAgIHJldmFsaWRhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdmVVcChpbnQgcG9zKSB7Ci0gICAgICAgICAgICBKQ29tcG9uZW50IGNvbXAgPSB2YWx1ZUNvbXBvbmVudHMuZ2V0KHBvcyk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKHZhbHVlQ29tcG9uZW50cywgcG9zLCBwb3MgLSAxKTsKLQotICAgICAgICAgICAgcmVtb3ZlKGNvbXApOwotICAgICAgICAgICAgYWRkKGNvbXAsIHBvcyk7Ci0KLSAgICAgICAgICAgIHVwZGF0ZVBvc2l0aW9ucygpOwotICAgICAgICAgICAgc2V0U3RhdHVzKFN0YXR1c0ZsYWcuVVBEQVRFKTsKLQotICAgICAgICAgICAgcmV2YWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbW92ZURvd24oaW50IHBvcykgewotICAgICAgICAgICAgSkNvbXBvbmVudCBjb21wID0gdmFsdWVDb21wb25lbnRzLmdldChwb3MpOwotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcCh2YWx1ZUNvbXBvbmVudHMsIHBvcywgcG9zICsgMSk7Ci0KLSAgICAgICAgICAgIHJlbW92ZShjb21wKTsKLSAgICAgICAgICAgIGFkZChjb21wLCBwb3MgKyAyKTsKLQotICAgICAgICAgICAgdXBkYXRlUG9zaXRpb25zKCk7Ci0gICAgICAgICAgICBzZXRTdGF0dXMoU3RhdHVzRmxhZy5VUERBVEUpOwotCi0gICAgICAgICAgICByZXZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3BEZWYuZ2V0SWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKGdldFN0YXR1cygpID09IFN0YXR1c0ZsYWcuVVBEQVRFKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BEZWYuZ2V0Q2FyZGluYWxpdHkoKSA9PSBDYXJkaW5hbGl0eS5TSU5HTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgoUHJvcGVydHlWYWx1ZSkgdmFsdWVDb21wb25lbnRzLmdldCgwKSkuZ2V0UHJvcGVydHlWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSkNvbXBvbmVudCBjb21wIDogdmFsdWVDb21wb25lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoKChQcm9wZXJ0eVZhbHVlKSBjb21wKS5nZXRQcm9wZXJ0eVZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKHRoaXMsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlSW5VcGRhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U3RhdHVzKCkgIT0gU3RhdHVzRmxhZy5ET05UX0NIQU5HRTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdGF0dXNGbGFnIHN0YXR1cykgewotICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgVVBEQVRFOgotICAgICAgICAgICAgICAgIGNoYW5nZUJveC5zZXRTZWxlY3RlZEluZGV4KDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBVTlNFVDoKLSAgICAgICAgICAgICAgICBjaGFuZ2VCb3guc2V0U2VsZWN0ZWRJbmRleCgyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgY2hhbmdlQm94LnNldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RhdHVzRmxhZyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZUJveC5nZXRTZWxlY3RlZEluZGV4KCkpIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzRmxhZy5VUERBVEU7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1c0ZsYWcuVU5TRVQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXNGbGFnLkRPTlRfQ0hBTkdFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpbWVuc2lvbiBnZXRNYXhpbXVtU2l6ZSgpIHsKLSAgICAgICAgICAgIERpbWVuc2lvbiBzaXplID0gZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgICAgICAgc2l6ZS53aWR0aCA9IFNob3J0Lk1BWF9WQUxVRTsKLSAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgdmFsdWUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWx1ZSB7Ci0gICAgICAgIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdQcm9wZXJ0eUlucHV0RmllbGQgZXh0ZW5kcyBKVGV4dEZpZWxkIGltcGxlbWVudHMgUHJvcGVydHlWYWx1ZSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdQcm9wZXJ0eUlucHV0RmllbGQoZmluYWwgT2JqZWN0IHZhbHVlLCBmaW5hbCBVcGRhdGVTdGF0dXMgc3RhdHVzLCBmaW5hbCBDb2xvciBiZ0NvbG9yKSB7Ci0gICAgICAgICAgICBzdXBlcih2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRTdGF0dXMoU3RhdHVzRmxhZy5VUERBVEUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcm1hdHRlZCBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFic3RyYWN0Rm9ybWF0dGVkUHJvcGVydHlJbnB1dEZpZWxkIGV4dGVuZHMgSkZvcm1hdHRlZFRleHRGaWVsZCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWUgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgQWJzdHJhY3RGb3JtYXR0ZWRQcm9wZXJ0eUlucHV0RmllbGQoZmluYWwgT2JqZWN0IHZhbHVlLCBmaW5hbCBGb3JtYXQgZm9ybWF0LCBmaW5hbCBVcGRhdGVTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgIGZpbmFsIENvbG9yIGJnQ29sb3IpIHsKLSAgICAgICAgICAgIHN1cGVyKGZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRTdGF0dXMoU3RhdHVzRmxhZy5VUERBVEUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGNvbW1pdEVkaXQoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVnZXJQcm9wZXJ0eUlucHV0RmllbGQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1hdHRlZFByb3BlcnR5SW5wdXRGaWVsZCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHB1YmxpYyBJbnRlZ2VyUHJvcGVydHlJbnB1dEZpZWxkKGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgVXBkYXRlU3RhdHVzIHN0YXR1cywgZmluYWwgQ29sb3IgYmdDb2xvcikgewotICAgICAgICAgICAgc3VwZXIodmFsdWUsIGNyZWF0ZUZvcm1hdCgpLCBzdGF0dXMsIGJnQ29sb3IpOwotICAgICAgICAgICAgc2V0SG9yaXpvbnRhbEFsaWdubWVudChKVGV4dEZpZWxkLlJJR0hUKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIERlY2ltYWxGb3JtYXQgY3JlYXRlRm9ybWF0KCkgewotICAgICAgICAgICAgRGVjaW1hbEZvcm1hdCByZXN1bHQgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIywjIzAiKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRQYXJzZUJpZ0RlY2ltYWwodHJ1ZSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0UGFyc2VJbnRlZ2VyT25seSh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChCaWdEZWNpbWFsKSBzdXBlci5nZXRWYWx1ZSgpKS50b0JpZ0ludGVnZXJFeGFjdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVjaW1hbCBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlY2ltYWxQcm9wZXJ0eUlucHV0RmllbGQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1hdHRlZFByb3BlcnR5SW5wdXRGaWVsZCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHB1YmxpYyBEZWNpbWFsUHJvcGVydHlJbnB1dEZpZWxkKGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgVXBkYXRlU3RhdHVzIHN0YXR1cywgZmluYWwgQ29sb3IgYmdDb2xvcikgewotICAgICAgICAgICAgc3VwZXIodmFsdWUsIGNyZWF0ZUZvcm1hdCgpLCBzdGF0dXMsIGJnQ29sb3IpOwotICAgICAgICAgICAgc2V0SG9yaXpvbnRhbEFsaWdubWVudChKVGV4dEZpZWxkLlJJR0hUKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIERlY2ltYWxGb3JtYXQgY3JlYXRlRm9ybWF0KCkgewotICAgICAgICAgICAgRGVjaW1hbEZvcm1hdCByZXN1bHQgPSBuZXcgRGVjaW1hbEZvcm1hdCgiIywjIzAuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXRQYXJzZUJpZ0RlY2ltYWwodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQm9vbGVhbiBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJvb2xlYW5Qcm9wZXJ0eUlucHV0RmllbGQgZXh0ZW5kcyBKQ29tYm9Cb3ggaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHVibGljIEJvb2xlYW5Qcm9wZXJ0eUlucHV0RmllbGQoZmluYWwgT2JqZWN0IHZhbHVlLCBmaW5hbCBVcGRhdGVTdGF0dXMgc3RhdHVzLCBmaW5hbCBDb2xvciBiZ0NvbG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihuZXcgT2JqZWN0W10geyB0cnVlLCBmYWxzZSB9KTsKLSAgICAgICAgICAgIHNldFNlbGVjdGVkSXRlbSh2YWx1ZSA9PSBudWxsID8gdHJ1ZSA6IHZhbHVlKTsKLQotICAgICAgICAgICAgYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXRTdGF0dXMoU3RhdHVzRmxhZy5VUERBVEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGF0ZVRpbWUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBEYXRlVGltZVByb3BlcnR5SW5wdXRGaWVsZCBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWUgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNT05USF9TVFJJTkdTOwotCi0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBtb250aHMgPSBuZXcgamF2YS50ZXh0LkRhdGVGb3JtYXRTeW1ib2xzKCkuZ2V0TW9udGhzKCk7Ci0gICAgICAgICAgICBpbnQgbGFzdEluZGV4ID0gbW9udGhzLmxlbmd0aCAtIDE7Ci0KLSAgICAgICAgICAgIGlmIChtb250aHNbbGFzdEluZGV4XSA9PSBudWxsIHx8IG1vbnRoc1tsYXN0SW5kZXhdLmxlbmd0aCgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBtb250aFN0cmluZ3MgPSBuZXcgU3RyaW5nW2xhc3RJbmRleF07Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtb250aHMsIDAsIG1vbnRoU3RyaW5ncywgMCwgbGFzdEluZGV4KTsKLSAgICAgICAgICAgICAgICBNT05USF9TVFJJTkdTID0gbW9udGhTdHJpbmdzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBNT05USF9TVFJJTkdTID0gbW9udGhzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGlubmVyTnVtYmVyTW9kZWwgZGF5OwotICAgICAgICBwcml2YXRlIGZpbmFsIFNwaW5uZXJMaXN0TW9kZWwgbW9udGg7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3Bpbm5lck51bWJlck1vZGVsIHllYXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3Bpbm5lck51bWJlck1vZGVsIGhvdXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3Bpbm5lck51bWJlck1vZGVsIG1pbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGlubmVyTnVtYmVyTW9kZWwgc2VjOwotICAgICAgICBwcml2YXRlIGZpbmFsIFRpbWVab25lIHRpbWV6b25lOwotCi0gICAgICAgIHB1YmxpYyBEYXRlVGltZVByb3BlcnR5SW5wdXRGaWVsZChmaW5hbCBPYmplY3QgdmFsdWUsIGZpbmFsIFVwZGF0ZVN0YXR1cyBzdGF0dXMsIGZpbmFsIENvbG9yIGJnQ29sb3IpIHsKLSAgICAgICAgICAgIHNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQsIDAsIDApKTsKLSAgICAgICAgICAgIHNldEJhY2tncm91bmQoYmdDb2xvcik7Ci0KLSAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbCA9ICh2YWx1ZSA9PSBudWxsID8gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCkgOiAoR3JlZ29yaWFuQ2FsZW5kYXIpIHZhbHVlKTsKLSAgICAgICAgICAgIHRpbWV6b25lID0gY2FsLmdldFRpbWVab25lKCk7Ci0KLSAgICAgICAgICAgIGRheSA9IG5ldyBTcGlubmVyTnVtYmVyTW9kZWwoY2FsLmdldChDYWxlbmRhci5EQVRFKSwgMSwgMzEsIDEpOwotICAgICAgICAgICAgYWRkU3Bpbm5lcihuZXcgSlNwaW5uZXIoZGF5KSwgc3RhdHVzKTsKLQotICAgICAgICAgICAgbW9udGggPSBuZXcgU3Bpbm5lckxpc3RNb2RlbChNT05USF9TVFJJTkdTKTsKLSAgICAgICAgICAgIG1vbnRoLnNldFZhbHVlKE1PTlRIX1NUUklOR1NbY2FsLmdldChDYWxlbmRhci5NT05USCldKTsKLSAgICAgICAgICAgIEpTcGlubmVyIG1vbnRoU3Bpbm5lciA9IG5ldyBKU3Bpbm5lcihtb250aCk7Ci0gICAgICAgICAgICBKQ29tcG9uZW50IGVkaXRvciA9IG1vbnRoU3Bpbm5lci5nZXRFZGl0b3IoKTsKLSAgICAgICAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSB7Ci0gICAgICAgICAgICAgICAgSkZvcm1hdHRlZFRleHRGaWVsZCB0ZiA9ICgoSlNwaW5uZXIuRGVmYXVsdEVkaXRvcikgZWRpdG9yKS5nZXRUZXh0RmllbGQoKTsKLSAgICAgICAgICAgICAgICB0Zi5zZXRDb2x1bW5zKDYpOwotICAgICAgICAgICAgICAgIHRmLnNldEhvcml6b250YWxBbGlnbm1lbnQoSlRleHRGaWVsZC5SSUdIVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRTcGlubmVyKG1vbnRoU3Bpbm5lciwgc3RhdHVzKTsKLQotICAgICAgICAgICAgeWVhciA9IG5ldyBTcGlubmVyTnVtYmVyTW9kZWwoY2FsLmdldChDYWxlbmRhci5ZRUFSKSwgMCwgOTk5OSwgMSk7Ci0gICAgICAgICAgICBKU3Bpbm5lciB5ZWFyU3Bpbm5lciA9IG5ldyBKU3Bpbm5lcih5ZWFyKTsKLSAgICAgICAgICAgIHllYXJTcGlubmVyLnNldEVkaXRvcihuZXcgSlNwaW5uZXIuTnVtYmVyRWRpdG9yKHllYXJTcGlubmVyLCAiIyIpKTsKLSAgICAgICAgICAgIHllYXJTcGlubmVyLmdldEVkaXRvcigpLnNldEJhY2tncm91bmQoYmdDb2xvcik7Ci0gICAgICAgICAgICBhZGRTcGlubmVyKHllYXJTcGlubmVyLCBzdGF0dXMpOwotCi0gICAgICAgICAgICBhZGQobmV3IEpMYWJlbCgiICAiKSk7Ci0KLSAgICAgICAgICAgIGhvdXIgPSBuZXcgU3Bpbm5lck51bWJlck1vZGVsKGNhbC5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpLCAwLCAyMywgMSk7Ci0gICAgICAgICAgICBKU3Bpbm5lciBob3VyU3Bpbm5lciA9IG5ldyBKU3Bpbm5lcihob3VyKTsKLSAgICAgICAgICAgIGFkZFNwaW5uZXIoaG91clNwaW5uZXIsIHN0YXR1cyk7Ci0KLSAgICAgICAgICAgIGFkZChuZXcgSkxhYmVsKCI6IikpOwotCi0gICAgICAgICAgICBtaW4gPSBuZXcgU3Bpbm5lck51bWJlck1vZGVsKGNhbC5nZXQoQ2FsZW5kYXIuTUlOVVRFKSwgMCwgNTksIDEpOwotICAgICAgICAgICAgSlNwaW5uZXIgbWluU3Bpbm5lciA9IG5ldyBKU3Bpbm5lcihtaW4pOwotICAgICAgICAgICAgYWRkU3Bpbm5lcihtaW5TcGlubmVyLCBzdGF0dXMpOwotCi0gICAgICAgICAgICBhZGQobmV3IEpMYWJlbCgiOiIpKTsKLQotICAgICAgICAgICAgc2VjID0gbmV3IFNwaW5uZXJOdW1iZXJNb2RlbChjYWwuZ2V0KENhbGVuZGFyLlNFQ09ORCksIDAsIDU5LCAxKTsKLSAgICAgICAgICAgIEpTcGlubmVyIHNlY1NwaW5uZXIgPSBuZXcgSlNwaW5uZXIoc2VjKTsKLSAgICAgICAgICAgIGFkZFNwaW5uZXIoc2VjU3Bpbm5lciwgc3RhdHVzKTsKLQotICAgICAgICAgICAgYWRkKG5ldyBKTGFiZWwoIiAiICsgdGltZXpvbmUuZ2V0RGlzcGxheU5hbWUodHJ1ZSwgVGltZVpvbmUuU0hPUlQpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkU3Bpbm5lcihmaW5hbCBKU3Bpbm5lciBzcGlubmVyLCBmaW5hbCBVcGRhdGVTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBzcGlubmVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0U3RhdHVzKFN0YXR1c0ZsYWcuVVBEQVRFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgYWRkKHNwaW5uZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKCkgewotICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgcmVzdWx0ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXRUaW1lWm9uZSh0aW1lem9uZSk7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5zZXQoQ2FsZW5kYXIuWUVBUiwgeWVhci5nZXROdW1iZXIoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIGludCBtaSA9IDA7Ci0gICAgICAgICAgICBTdHJpbmcgbXMgPSBtb250aC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1PTlRIX1NUUklOR1MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoTU9OVEhfU1RSSU5HU1tpXS5lcXVhbHMobXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1pID0gaTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LnNldChDYWxlbmRhci5NT05USCwgbWkpOwotICAgICAgICAgICAgcmVzdWx0LnNldChDYWxlbmRhci5EQVRFLCBkYXkuZ2V0TnVtYmVyKCkuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICByZXN1bHQuc2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZLCBob3VyLmdldE51bWJlcigpLmludFZhbHVlKCkpOwotICAgICAgICAgICAgcmVzdWx0LnNldChDYWxlbmRhci5NSU5VVEUsIG1pbi5nZXROdW1iZXIoKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXQoQ2FsZW5kYXIuU0VDT05ELCBzZWMuZ2V0TnVtYmVyKCkuaW50VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdWx0aSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE11bHRpVmFsdWVQcm9wZXJ0eUlucHV0RmllbGQgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VJY29uIElDT05fVVAgPSBDbGllbnRIZWxwZXIuZ2V0SWNvbigidXAucG5nIik7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlSWNvbiBJQ09OX0RPV04gPSBDbGllbnRIZWxwZXIuZ2V0SWNvbigiZG93bi5wbmciKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VJY29uIElDT05fUkVNT1ZFID0gQ2xpZW50SGVscGVyLmdldEljb24oInJlbW92ZS5wbmciKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEpDb21wb25lbnQgY29tcG9uZW50OwotICAgICAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKLQotICAgICAgICBwcml2YXRlIEpCdXR0b24gdXBCdXR0b247Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiBkb3duQnV0dG9uOwotCi0gICAgICAgIHB1YmxpYyBNdWx0aVZhbHVlUHJvcGVydHlJbnB1dEZpZWxkKGZpbmFsIEpDb21wb25lbnQgY29tcG9uZW50LCBmaW5hbCBNdWx0aXZhbHVlTWFuYWdlciBtdXRsaXZhbHVlTWFuYWdlciwKLSAgICAgICAgICAgICAgICBmaW5hbCBDb2xvciBiZ0NvbG9yKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0KLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgc2V0QmFja2dyb3VuZChiZ0NvbG9yKTsKLQotICAgICAgICAgICAgYWRkKGNvbXBvbmVudCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgICAgIEpQYW5lbCBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5SSUdIVCwgMCwgMCkpOwotICAgICAgICAgICAgYnV0dG9uUGFuZWwuc2V0QmFja2dyb3VuZChiZ0NvbG9yKTsKLQotICAgICAgICAgICAgdXBCdXR0b24gPSBuZXcgSkJ1dHRvbihJQ09OX1VQKTsKLSAgICAgICAgICAgIHVwQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBtdXRsaXZhbHVlTWFuYWdlci5tb3ZlVXAoTXVsdGlWYWx1ZVByb3BlcnR5SW5wdXRGaWVsZC50aGlzLnBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJ1dHRvblBhbmVsLmFkZCh1cEJ1dHRvbik7Ci0KLSAgICAgICAgICAgIGRvd25CdXR0b24gPSBuZXcgSkJ1dHRvbihJQ09OX0RPV04pOwotICAgICAgICAgICAgZG93bkJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbXV0bGl2YWx1ZU1hbmFnZXIubW92ZURvd24oTXVsdGlWYWx1ZVByb3BlcnR5SW5wdXRGaWVsZC50aGlzLnBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGJ1dHRvblBhbmVsLmFkZChkb3duQnV0dG9uKTsKLQotICAgICAgICAgICAgSkJ1dHRvbiByZW1vdmVCdXR0b24gPSBuZXcgSkJ1dHRvbihJQ09OX1JFTU9WRSk7Ci0gICAgICAgICAgICByZW1vdmVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG11dGxpdmFsdWVNYW5hZ2VyLnJlbW92ZVZhbHVlKE11bHRpVmFsdWVQcm9wZXJ0eUlucHV0RmllbGQudGhpcy5wb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBidXR0b25QYW5lbC5hZGQocmVtb3ZlQnV0dG9uKTsKLQotICAgICAgICAgICAgYWRkKGJ1dHRvblBhbmVsLCBCb3JkZXJMYXlvdXQuTElORV9FTkQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBpc0xhc3QpIHsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgICAgIHVwQnV0dG9uLnNldEVuYWJsZWQocG9zaXRpb24gPiAwKTsKLSAgICAgICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZCghaXNMYXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuICgoUHJvcGVydHlWYWx1ZSkgY29tcG9uZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvUHJveHlEZXRlY3Rvci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1Byb3h5RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjMzE3Yy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvUHJveHlEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotCi0vKioKLSAqIFRyaWVzIHRvIGRldGVjdCB0aGUgT1MgcHJveHkgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3h5RGV0ZWN0b3IgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9IT1NUID0gImh0dHAucHJveHlIb3N0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZX1BPUlQgPSAiaHR0cC5wcm94eVBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPWFlfVVNFUiA9ICJodHRwLnByb3h5VXNlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9QQVNTV09SRCA9ICJodHRwLnByb3h5UGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1BST1hZX0hPU1QgPSAiaHR0cHMucHJveHlIb3N0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQU19QUk9YWV9QT1JUID0gImh0dHBzLnByb3h5UG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfUFJPWFlfVVNFUiA9ICJodHRwcy5wcm94eVVzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1BST1hZX1BBU1NXT1JEID0gImh0dHBzLnByb3h5UGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTk9OX1BST1hZX0hPU1RTID0gImh0dHAubm9uUHJveHlIb3N0cyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gUFJPWFlfRU5WX1ZBUjEgPSBQYXR0ZXJuLmNvbXBpbGUoImh0dHAuPzpcXC9cXC8oLispOihcXGQrKS4qIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBST1hZX0VOVl9WQVIyID0gUGF0dGVybi5jb21waWxlKCIoLispOihcXGQrKSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBQUk9YWV9XSU5fUkVHID0gUGF0dGVybi5jb21waWxlKCJcXHMrUHJveHkoLispXFxzK1JFRy4rXFxzKyguKykiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEdldHMgcHJveHkgc2V0dGluZ3MgZnJvbSBzeXN0ZW0gcHJvcGVydGllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb3h5U2V0dGluZ3MgZ2V0SmF2YVByb3h5U2V0dGluZ3MoKSB7Ci0gICAgICAgIFByb3h5U2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgUHJveHlTZXR0aW5ncygpOwotCi0gICAgICAgIHNldHRpbmdzLnNldEh0dHBQcm94eUhvc3QoU3lzdGVtLmdldFByb3BlcnR5KEhUVFBfUFJPWFlfSE9TVCkpOwotICAgICAgICBzZXR0aW5ncy5zZXRIdHRwUHJveHlQb3J0KHBhcnNlUG9ydChTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUF9QUk9YWV9QT1JUKSkpOwotICAgICAgICBzZXR0aW5ncy5zZXRIdHRwUHJveHlVc2VyKFN5c3RlbS5nZXRQcm9wZXJ0eShIVFRQX1BST1hZX1VTRVIpKTsKLSAgICAgICAgc2V0dGluZ3Muc2V0SHR0cFByb3h5UGFzc3dvcmQoU3lzdGVtLmdldFByb3BlcnR5KEhUVFBfUFJPWFlfUEFTU1dPUkQpKTsKLSAgICAgICAgc2V0dGluZ3Muc2V0SHR0cHNQcm94eUhvc3QoU3lzdGVtLmdldFByb3BlcnR5KEhUVFBTX1BST1hZX0hPU1QpKTsKLSAgICAgICAgc2V0dGluZ3Muc2V0SHR0cHNQcm94eVBvcnQocGFyc2VQb3J0KFN5c3RlbS5nZXRQcm9wZXJ0eShIVFRQU19QUk9YWV9QT1JUKSkpOwotICAgICAgICBzZXR0aW5ncy5zZXRIdHRwc1Byb3h5VXNlcihTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUFNfUFJPWFlfVVNFUikpOwotICAgICAgICBzZXR0aW5ncy5zZXRIdHRwc1Byb3h5UGFzc3dvcmQoU3lzdGVtLmdldFByb3BlcnR5KEhUVFBTX1BST1hZX1BBU1NXT1JEKSk7Ci0KLSAgICAgICAgU3RyaW5nIG5vblByb3h5SG9zdHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSFRUUF9OT05fUFJPWFlfSE9TVFMpOwotICAgICAgICBpZiAobm9uUHJveHlIb3N0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbm9Ib3N0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBTdHJpbmcgbnBoID0gbm9uUHJveHlIb3N0czsKLSAgICAgICAgICAgIGludCBwcCA9IG5waC5pbmRleE9mKCd8Jyk7Ci0gICAgICAgICAgICB3aGlsZSAocHAgPiAtMSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBub0hvc3QgPSBucGguc3Vic3RyaW5nKDAsIHBwKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5vSG9zdC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbm9Ib3N0cy5hZGQobm9Ib3N0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBucGggPSBucGguc3Vic3RyaW5nKHBwICsgMSk7Ci0gICAgICAgICAgICAgICAgcHAgPSBucGguaW5kZXhPZignfCcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBucGggPSBucGgudHJpbSgpOwotICAgICAgICAgICAgaWYgKG5waC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBub0hvc3RzLmFkZChucGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXR0aW5ncy5zZXROb25Qcm94eUhvc3RzKG5vSG9zdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRpbmdzLmdldEh0dHBQcm94eUhvc3QoKSAhPSBudWxsIHx8IHNldHRpbmdzLmdldEh0dHBzUHJveHlIb3N0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNldHRpbmdzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBwcm94eSBzZXR0aW5ncyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb3h5U2V0dGluZ3MgZ2V0RW52UHJveHlTZXR0aW5ncygpIHsKLSAgICAgICAgUHJveHlTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBQcm94eVNldHRpbmdzKCk7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYgPSBTeXN0ZW0uZ2V0ZW52KCk7Ci0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBlbnYuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGUuZ2V0S2V5KCkudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQotICAgICAgICAgICAgaWYgKCJodHRwX3Byb3h5Ii5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBST1hZX0VOVl9WQVIxLm1hdGNoZXIoZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cFByb3h5SG9zdChwYXJzZUhvc3QobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwUHJveHlQb3J0KHBhcnNlUG9ydChtLmdyb3VwKDIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldEh0dHBQcm94eVVzZXIocGFyc2VQcm94eVVzZXIobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwUHJveHlQYXNzd29yZChwYXJzZVByb3h5UGFzc3dvcmQobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG0gPSBQUk9YWV9FTlZfVkFSMi5tYXRjaGVyKGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cFByb3h5SG9zdChwYXJzZUhvc3QobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cFByb3h5UG9ydChwYXJzZVBvcnQobS5ncm91cCgyKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cFByb3h5VXNlcihwYXJzZVByb3h5VXNlcihtLmdyb3VwKDEpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwUHJveHlQYXNzd29yZChwYXJzZVByb3h5UGFzc3dvcmQobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgiaHR0cHNfcHJveHkiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gUFJPWFlfRU5WX1ZBUjEubWF0Y2hlcihlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwc1Byb3h5SG9zdChwYXJzZUhvc3QobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwc1Byb3h5UG9ydChwYXJzZVBvcnQobS5ncm91cCgyKSkpOwotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwc1Byb3h5VXNlcihwYXJzZVByb3h5VXNlcihtLmdyb3VwKDEpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNldEh0dHBzUHJveHlQYXNzd29yZChwYXJzZVByb3h5UGFzc3dvcmQobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG0gPSBQUk9YWV9FTlZfVkFSMi5tYXRjaGVyKGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cFByb3h5SG9zdChwYXJzZUhvc3QobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cFByb3h5UG9ydChwYXJzZVBvcnQobS5ncm91cCgyKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cHNQcm94eVVzZXIocGFyc2VQcm94eVVzZXIobS5ncm91cCgxKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cHNQcm94eVBhc3N3b3JkKHBhcnNlUHJveHlQYXNzd29yZChtLmdyb3VwKDEpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJub19wcm94eSIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gbm9Ib3N0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG5vSG9zdCA6IGUuZ2V0VmFsdWUoKS5zcGxpdCgiLCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vSG9zdCA9IG5vSG9zdC50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChub0hvc3QubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobm9Ib3N0LmNoYXJBdCgwKSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vSG9zdCA9ICIqIiArIG5vSG9zdDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChub0hvc3QuY2hhckF0KG5vSG9zdC5sZW5ndGgoKSAtIDEpID09ICcuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9Ib3N0ID0gbm9Ib3N0ICsgIioiOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbm9Ib3N0cy5hZGQobm9Ib3N0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXROb25Qcm94eUhvc3RzKG5vSG9zdHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRpbmdzLmdldEh0dHBQcm94eUhvc3QoKSAhPSBudWxsIHx8IHNldHRpbmdzLmdldEh0dHBzUHJveHlIb3N0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHNldHRpbmdzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBwcm94eSBzZXR0aW5ncyBmcm9tIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJveHlTZXR0aW5ncyBnZXRSZWdpc3RyeVByb3h5U2V0dGluZ3MoKSB7Ci0gICAgICAgIGlmICghaXNXaW5kb3dzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb3h5U2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgUHJveHlTZXR0aW5ncygpOwotCi0gICAgICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSdW50aW1lKCkKLSAgICAgICAgICAgICAgICAgICAgLmV4ZWMoInJlZyBxdWVyeSBcIkhLRVlfQ1VSUkVOVF9VU0VSXFxTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3NcIiAvdiBQcm94eSoiKTsKLQotICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCkpKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hdGNoZXIgbSA9IFBST1hZX1dJTl9SRUcubWF0Y2hlcihsaW5lKTsKLSAgICAgICAgICAgICAgICBpZiAoIW0ubWF0Y2hlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBtLmdyb3VwKDEpLnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbS5ncm91cCgyKS50cmltKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoImVuYWJsZSIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5lcXVhbHMoIjB4MSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm94aWVzIGRpc2FibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNlcnZlciIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gODA7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IHggPSB2YWx1ZS5pbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IHZhbHVlLnN1YnN0cmluZygwLCB4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBwYXJzZVBvcnQodmFsdWUuc3Vic3RyaW5nKHggKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwUHJveHlIb3N0KGhvc3QpOwotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwUHJveHlQb3J0KHBvcnQpOwotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXRIdHRwc1Byb3h5SG9zdChob3N0KTsKLSAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0SHR0cHNQcm94eVBvcnQocG9ydCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgib3ZlcnJpZGUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vIHByb3h5Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBub0hvc3RzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG5vSG9zdCA6IHZhbHVlLnNwbGl0KCI7IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vSG9zdCA9IG5vSG9zdC50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9Ib3N0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vSG9zdHMuYWRkKG5vSG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5zZXROb25Qcm94eUhvc3RzKG5vSG9zdHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNldHRpbmdzLmdldEh0dHBQcm94eUhvc3QoKSAhPSBudWxsIHx8IHNldHRpbmdzLmdldEh0dHBzUHJveHlIb3N0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXR0aW5nczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkocmVhZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZUhvc3QoU3RyaW5nIGhvc3QpIHsKLSAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgYXQgPSBob3N0Lmxhc3RJbmRleE9mKCdAJyk7Ci0gICAgICAgIGlmIChhdCA+IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoYXQgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBob3N0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZVBvcnQoU3RyaW5nIHBvcnQpIHsKLSAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDgwOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHBvcnQpOwotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgcG9ydDogIiArIHBvcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhcnNlUHJveHlVc2VyKFN0cmluZyBob3N0KSB7Ci0gICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGF0ID0gaG9zdC5sYXN0SW5kZXhPZignQCcpOwotICAgICAgICBpZiAoYXQgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvbG9uID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmIChjb2xvbiA9PSAtMSB8fCBjb2xvbiA+IGF0KSB7Ci0gICAgICAgICAgICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgYXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhvc3Quc3Vic3RyaW5nKDAsIGNvbG9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyc2VQcm94eVBhc3N3b3JkKFN0cmluZyBob3N0KSB7Ci0gICAgICAgIGlmIChob3N0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGF0ID0gaG9zdC5sYXN0SW5kZXhPZignQCcpOwotICAgICAgICBpZiAoYXQgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNvbG9uID0gaG9zdC5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmIChjb2xvbiA9PSAtMSB8fCBjb2xvbiA+IGF0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBob3N0LnN1YnN0cmluZyhjb2xvbiArIDEsIGF0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93cygpIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnN0YXJ0c1dpdGgoIldpbmRvd3MiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWluLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgYm9vbGVhbiBqYXZhUGFyYW1zID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdXNlU3lzdGVtUHJveHkgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKSB7Ci0gICAgICAgICAgICBpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1qIikpIHsKLSAgICAgICAgICAgICAgICBqYXZhUGFyYW1zID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1zIikpIHsKLSAgICAgICAgICAgICAgICB1c2VTeXN0ZW1Qcm94eSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItZCIpKSB7Ci0gICAgICAgICAgICAgICAgZGVidWcgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWgiKSB8fCBhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLT8iKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW1ldGVyczoiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi1qICBwcmludCBKYXZhIHN5c3RlbSBwcm9wZXJ0aWVzIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItcyAgYWRkIGphdmEubmV0LnVzZVN5c3RlbVByb3hpZXMgcHJvcGVydHkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQcm94eVNldHRpbmdzIHNldHRpbmdzID0gbnVsbDsKLQotICAgICAgICBzZXR0aW5ncyA9IGdldEphdmFQcm94eVNldHRpbmdzKCk7Ci0KLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRyeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAgICAgICAgICAgIHNldHRpbmdzID0gZ2V0RW52UHJveHlTZXR0aW5ncygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNldHRpbmdzID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRyeSB0aGUgV2luZG93cyByZWdpc3RyeQotICAgICAgICAgICAgc2V0dGluZ3MgPSBnZXRSZWdpc3RyeVByb3h5U2V0dGluZ3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByaW50IHByb3h5IHNldHRpbmdzCi0gICAgICAgIGlmIChqYXZhUGFyYW1zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJveHlTdHIgPSAiIjsKLQotICAgICAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm94eVN0ciA9IHNldHRpbmdzLnRvSmF2YUNvbmZpZ1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodXNlU3lzdGVtUHJveHkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJveHlTdHIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3h5U3RyID0gcHJveHlTdHIgKyAiICI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByb3h5U3RyID0gcHJveHlTdHIgKyAiLURqYXZhLm5ldC51c2VTeXN0ZW1Qcm94aWVzPXRydWUiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJveHlTdHIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2V0dGluZ3MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRElSRUNUIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm94eSBzZXR0aW5ncyBob2xkZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm94eVNldHRpbmdzIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaHR0cFByb3h5SG9zdDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgaHR0cFByb3h5UG9ydDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaHR0cFByb3h5VXNlcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaHR0cFByb3h5UGFzc3dvcmQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaHR0cHNQcm94eUhvc3Q7Ci0gICAgICAgIHByaXZhdGUgaW50IGh0dHBzUHJveHlQb3J0OwotICAgICAgICBwcml2YXRlIFN0cmluZyBodHRwc1Byb3h5VXNlcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaHR0cHNQcm94eVBhc3N3b3JkOwotCi0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG5vblByb3h5SG9zdHM7Ci0KLSAgICAgICAgcHVibGljIFByb3h5U2V0dGluZ3MoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBQcm94eUhvc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaHR0cFByb3h5SG9zdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEh0dHBQcm94eUhvc3QoU3RyaW5nIGh0dHBQcm94eUhvc3QpIHsKLSAgICAgICAgICAgIHRoaXMuaHR0cFByb3h5SG9zdCA9IGh0dHBQcm94eUhvc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEh0dHBQcm94eVBvcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaHR0cFByb3h5UG9ydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEh0dHBQcm94eVBvcnQoaW50IGh0dHBQcm94eVBvcnQpIHsKLSAgICAgICAgICAgIHRoaXMuaHR0cFByb3h5UG9ydCA9IGh0dHBQcm94eVBvcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBQcm94eVVzZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaHR0cFByb3h5VXNlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEh0dHBQcm94eVVzZXIoU3RyaW5nIGh0dHBQcm94eVVzZXIpIHsKLSAgICAgICAgICAgIHRoaXMuaHR0cFByb3h5VXNlciA9IGh0dHBQcm94eVVzZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBQcm94eVBhc3N3b3JkKCkgewotICAgICAgICAgICAgcmV0dXJuIGh0dHBQcm94eVBhc3N3b3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SHR0cFByb3h5UGFzc3dvcmQoU3RyaW5nIGh0dHBQcm94eVBhc3N3b3JkKSB7Ci0gICAgICAgICAgICB0aGlzLmh0dHBQcm94eVBhc3N3b3JkID0gaHR0cFByb3h5UGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBzUHJveHlIb3N0KCkgewotICAgICAgICAgICAgcmV0dXJuIGh0dHBzUHJveHlIb3N0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SHR0cHNQcm94eUhvc3QoU3RyaW5nIGh0dHBzUHJveHlIb3N0KSB7Ci0gICAgICAgICAgICB0aGlzLmh0dHBzUHJveHlIb3N0ID0gaHR0cHNQcm94eUhvc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEh0dHBzUHJveHlQb3J0KCkgewotICAgICAgICAgICAgcmV0dXJuIGh0dHBzUHJveHlQb3J0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SHR0cHNQcm94eVBvcnQoaW50IGh0dHBzUHJveHlQb3J0KSB7Ci0gICAgICAgICAgICB0aGlzLmh0dHBzUHJveHlQb3J0ID0gaHR0cHNQcm94eVBvcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBzUHJveHlVc2VyKCkgewotICAgICAgICAgICAgcmV0dXJuIGh0dHBzUHJveHlVc2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SHR0cHNQcm94eVVzZXIoU3RyaW5nIGh0dHBzUHJveHlVc2VyKSB7Ci0gICAgICAgICAgICB0aGlzLmh0dHBzUHJveHlVc2VyID0gaHR0cHNQcm94eVVzZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBzUHJveHlQYXNzd29yZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBodHRwc1Byb3h5UGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRIdHRwc1Byb3h5UGFzc3dvcmQoU3RyaW5nIGh0dHBzUHJveHlQYXNzd29yZCkgewotICAgICAgICAgICAgdGhpcy5odHRwc1Byb3h5UGFzc3dvcmQgPSBodHRwc1Byb3h5UGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5vblByb3h5SG9zdHMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9uUHJveHlIb3N0czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5vblByb3h5SG9zdHMoTGlzdDxTdHJpbmc+IG5vblByb3h5SG9zdHMpIHsKLSAgICAgICAgICAgIHRoaXMubm9uUHJveHlIb3N0cyA9IG5vblByb3h5SG9zdHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvSmF2YUNvbmZpZ1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgICAgICBpZiAoaHR0cFByb3h5SG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCItRCIgKyBIVFRQX1BST1hZX0hPU1QgKyAiPSIgKyBodHRwUHJveHlIb3N0ICsgIiAtRCIgKyBIVFRQX1BST1hZX1BPUlQgKyAiPSIgKyBodHRwUHJveHlQb3J0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBQcm94eVVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCItRCIgKyBIVFRQX1BST1hZX1VTRVIgKyAiPSIgKyBodHRwUHJveHlVc2VyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBQcm94eVBhc3N3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLUQiICsgSFRUUF9QUk9YWV9QQVNTV09SRCArICI9IiArIGh0dHBQcm94eVBhc3N3b3JkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBzUHJveHlIb3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLUQiICsgSFRUUFNfUFJPWFlfSE9TVCArICI9IiArIGh0dHBzUHJveHlIb3N0ICsgIiAtRCIgKyBIVFRQU19QUk9YWV9QT1JUICsgIj0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGh0dHBzUHJveHlQb3J0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBzUHJveHlVc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLUQiICsgSFRUUFNfUFJPWFlfVVNFUiArICI9IiArIGh0dHBzUHJveHlVc2VyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBzUHJveHlQYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi1EIiArIEhUVFBTX1BST1hZX1BBU1NXT1JEICsgIj0iICsgaHR0cHNQcm94eVBhc3N3b3JkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5vblByb3h5SG9zdHMgIT0gbnVsbCAmJiAhbm9uUHJveHlIb3N0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1dpbmRvd3MoKSkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1wiJyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCItRCIgKyBIVFRQX05PTl9QUk9YWV9IT1NUUyArICI9Iik7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBob3N0IDogbm9uUHJveHlIb3N0cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ3wnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaG9zdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzV2luZG93cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXCInKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgaWYgKGh0dHBQcm94eUhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiSFRUUCBwcm94eTogIiArIGh0dHBQcm94eUhvc3QgKyAiOiIgKyBodHRwUHJveHlQb3J0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBQcm94eVVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiSFRUUCBwcm94eSB1c2VyOiAiICsgaHR0cFByb3h5VXNlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChodHRwUHJveHlQYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJIVFRQIHByb3h5IHBhc3N3b3JkOiAiICsgaHR0cFByb3h5UGFzc3dvcmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaHR0cHNQcm94eUhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiSFRUUFMgcHJveHk6ICIgKyBodHRwc1Byb3h5SG9zdCArICI6IiArIGh0dHBzUHJveHlQb3J0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBzUHJveHlVc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkhUVFBTIHByb3h5IHVzZXI6ICIgKyBodHRwc1Byb3h5VXNlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChodHRwc1Byb3h5UGFzc3dvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiSFRUUFMgcHJveHkgcGFzc3dvcmQ6ICIgKyBodHRwc1Byb3h5UGFzc3dvcmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobm9uUHJveHlIb3N0cyAhPSBudWxsICYmICFub25Qcm94eUhvc3RzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiTm9uIHByb3h5IGhvc3RzOiAiKTsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGhvc3QgOiBub25Qcm94eUhvc3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChob3N0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1F1ZXJ5RnJhbWUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9RdWVyeUZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDRiNmUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1F1ZXJ5RnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5DdXJzb3I7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlQWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlTW90aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZvcm1hdHRlZFRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBvcHVwTWVudTsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEFyZWE7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuTnVtYmVyRm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5JdGVtSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLk9iamVjdElkSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLlByb3BlcnR5SWRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5Qcm9wZXJ0eURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5JZFJlbmRlcmVyOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlGcmFtZSBleHRlbmRzIEpGcmFtZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEN1cnNvciBIQU5EX0NVUlNPUiA9IEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5IQU5EX0NVUlNPUik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3Vyc29yIERFRkFVTFRfQ1VSU09SID0gQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfVElUTEUgPSAiQ01JUyBRdWVyeSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUVVFUlkgPSAiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFFVRVJZX1NOSVBQRVRTID0gbmV3IFN0cmluZ1tdIHsgLy8KLSAgICAiU0VMRUNUICogRlJPTSBjbWlzOmRvY3VtZW50IiwgLy8KLSAgICAgICAgICAgICJTRUxFQ1QgKiBGUk9NIGNtaXM6Zm9sZGVyIiwgLy8KLSAgICAgICAgICAgICJTRUxFQ1QgY21pczpvYmplY3RJZCwgY21pczpuYW1lLCBTQ09SRSgpIEFTIHNjb3JlIEZST00gY21pczpkb2N1bWVudCBXSEVSRSBDT05UQUlOUygnPycpIiwgLy8KLSAgICAgICAgICAgICJXSEVSRSBjbWlzOm5hbWUgTElLRSAnJSciLCAvLwotICAgICAgICAgICAgIldIRVJFID8gSU4gKD8sID8sID8pIiwgLy8KLSAgICAgICAgICAgICJXSEVSRSBJTl9GT0xERVIoJz8nKSIsIC8vCi0gICAgICAgICAgICAiV0hFUkUgSU5fVFJFRSgnPycpIiwgLy8KLSAgICAgICAgICAgICJXSEVSRSA/ID0gVElNRVNUQU1QICdZWVlZLU1NLUREVGhoOm1tOnNzLnNzc1tafCtoaDptbXwtaGg6bW1dJyIsIC8vCi0gICAgICAgICAgICAiV0hFUkUgJz8nID0gQU5ZID8iLCAvLwotICAgICAgICAgICAgIk9SREVSIEJZIGNtaXM6bmFtZSIsIC8vCi0gICAgICAgICAgICAiT1JERVIgQlkgY21pczpjcmVhdGlvbkRhdGUiIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgcXVlcnlUZXh0OwotICAgIHByaXZhdGUgSkZvcm1hdHRlZFRleHRGaWVsZCBtYXhIaXRzRmllbGQ7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggc2VhcmNoQWxsVmVyc2lvbnNDaGVja0JveDsKLSAgICBwcml2YXRlIFJlc3VsdFRhYmxlIHJlc3VsdHNUYWJsZTsKLSAgICBwcml2YXRlIEpMYWJlbCBxdWVyeVRpbWVMYWJlbDsKLQotICAgIHB1YmxpYyBRdWVyeUZyYW1lKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICBjcmVhdGVHVUkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICBzZXRUaXRsZShXSU5ET1dfVElUTEUgKyAiIC0gIiArIG1vZGVsLmdldFJlcG9zaXRvcnlOYW1lKCkpOwotICAgICAgICBzZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oODAwLCA3MDApKTsKLSAgICAgICAgc2V0TWluaW11bVNpemUobmV3IERpbWVuc2lvbigyMDAsIDYwKSk7Ci0KLSAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoZ2V0Q29udGVudFBhbmUoKSwgQm94TGF5b3V0LlBBR0VfQVhJUykpOwotCi0gICAgICAgIC8vIGlucHV0Ci0gICAgICAgIEpQYW5lbCBpbnB1dFBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBpbnB1dFBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGlucHV0UGFuZWwsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLQotICAgICAgICAvLyBxdWVyeSB0ZXh0IGFyZWEKLSAgICAgICAgcXVlcnlUZXh0ID0gbmV3IEpUZXh0QXJlYShERUZBVUxUX1FVRVJZLCA1LCA2MCk7Ci0gICAgICAgIHF1ZXJ5VGV4dC5zZXRMaW5lV3JhcCh0cnVlKTsKLSAgICAgICAgcXVlcnlUZXh0LnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsIHF1ZXJ5VGV4dC5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0gICAgICAgIGlucHV0UGFuZWwuYWRkKHF1ZXJ5VGV4dCk7Ci0KLSAgICAgICAgSlBhbmVsIGlucHV0UGFuZWwyID0gbmV3IEpQYW5lbCgpOwotICAgICAgICBpbnB1dFBhbmVsMi5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICAvLyBidXR0b25zCi0gICAgICAgIEpQYW5lbCBidXR0b25QYW5lbCA9IG5ldyBKUGFuZWwoKTsKLQotICAgICAgICBtYXhIaXRzRmllbGQgPSBuZXcgSkZvcm1hdHRlZFRleHRGaWVsZChuZXcgTnVtYmVyRm9ybWF0dGVyKCkpOwotICAgICAgICBtYXhIaXRzRmllbGQuc2V0VmFsdWUoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotICAgICAgICBtYXhIaXRzRmllbGQuc2V0Q29sdW1ucyg1KTsKLQotICAgICAgICBKTGFiZWwgbWF4SGl0c0xhYmVsID0gbmV3IEpMYWJlbCgiTWF4IGhpdHM6Iik7Ci0gICAgICAgIG1heEhpdHNMYWJlbC5zZXRMYWJlbEZvcihtYXhIaXRzRmllbGQpOwotCi0gICAgICAgIGJ1dHRvblBhbmVsLmFkZChtYXhIaXRzTGFiZWwpOwotICAgICAgICBidXR0b25QYW5lbC5hZGQobWF4SGl0c0ZpZWxkKTsKLQotICAgICAgICBzZWFyY2hBbGxWZXJzaW9uc0NoZWNrQm94ID0gbmV3IEpDaGVja0JveCgic2VhcmNoIGFsbCB2ZXJzaW9ucyIsIGZhbHNlKTsKLSAgICAgICAgYnV0dG9uUGFuZWwuYWRkKHNlYXJjaEFsbFZlcnNpb25zQ2hlY2tCb3gpOwotCi0gICAgICAgIEpCdXR0b24gcXVlcnlCdXR0b24gPSBuZXcgSkJ1dHRvbigiUXVlcnkiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigicXVlcnkucG5nIikpOwotICAgICAgICBxdWVyeUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGRvUXVlcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYnV0dG9uUGFuZWwuYWRkKHF1ZXJ5QnV0dG9uKTsKLQotICAgICAgICBpbnB1dFBhbmVsMi5hZGQoYnV0dG9uUGFuZWwsIEJvcmRlckxheW91dC5MSU5FX0VORCk7Ci0KLSAgICAgICAgLy8gc25pcHBldHMKLSAgICAgICAgZmluYWwgSlBvcHVwTWVudSBzbmlwcGV0c1BvcHVwID0gbmV3IEpQb3B1cE1lbnUoKTsKLSAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcyA6IFFVRVJZX1NOSVBQRVRTKSB7Ci0gICAgICAgICAgICBKTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKHMpOwotICAgICAgICAgICAgbWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1ZXJ5VGV4dC5pbnNlcnQocywgcXVlcnlUZXh0LmdldENhcmV0UG9zaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBzbmlwcGV0c1BvcHVwLmFkZChtZW51SXRlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBKQnV0dG9uIHNuaXBwZXRCdXR0b24gPSBuZXcgSkJ1dHRvbigiUXVlcnkgU25pcHBldHMiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigicGFzdGUucG5nIikpOwotICAgICAgICBzbmlwcGV0QnV0dG9uLnNldEZvY3VzUGFpbnRlZCh0cnVlKTsKLSAgICAgICAgc25pcHBldEJ1dHRvbi5zZXRCb3JkZXJQYWludGVkKGZhbHNlKTsKLSAgICAgICAgc25pcHBldEJ1dHRvbi5zZXRDb250ZW50QXJlYUZpbGxlZChmYWxzZSk7Ci0gICAgICAgIHNuaXBwZXRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNuaXBwZXRzUG9wdXAuc2hvdyhzbmlwcGV0QnV0dG9uLCAwLCBzbmlwcGV0QnV0dG9uLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaW5wdXRQYW5lbDIuYWRkKHNuaXBwZXRCdXR0b24sIEJvcmRlckxheW91dC5MSU5FX1NUQVJUKTsKLQotICAgICAgICAvLyBxdWVyeSB0aW1lIGxhYmVsCi0gICAgICAgIHF1ZXJ5VGltZUxhYmVsID0gbmV3IEpMYWJlbCgiIik7Ci0gICAgICAgIHF1ZXJ5VGltZUxhYmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoU3dpbmdDb25zdGFudHMuQ0VOVEVSKTsKLSAgICAgICAgaW5wdXRQYW5lbDIuYWRkKHF1ZXJ5VGltZUxhYmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBpbnB1dFBhbmVsMi5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKFNob3J0Lk1BWF9WQUxVRSwgaW5wdXRQYW5lbDIuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotICAgICAgICBpbnB1dFBhbmVsLmFkZChpbnB1dFBhbmVsMik7Ci0KLSAgICAgICAgLy8gdGFibGUKLSAgICAgICAgcmVzdWx0c1RhYmxlID0gbmV3IFJlc3VsdFRhYmxlKCk7Ci0KLSAgICAgICAgZmluYWwgSlBvcHVwTWVudSBwb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0gICAgICAgIEpNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIkNvcHkgdG8gY2xpcGJvYXJkIik7Ci0gICAgICAgIHBvcHVwLmFkZChtZW51SXRlbSk7Ci0KLSAgICAgICAgbWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuY29weVRhYmxlVG9DbGlwYm9hcmQocmVzdWx0c1RhYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmVzdWx0c1RhYmxlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgcm93ID0gcmVzdWx0c1RhYmxlLnJvd0F0UG9pbnQoZS5nZXRQb2ludCgpKTsKLSAgICAgICAgICAgICAgICBpbnQgY29sdW1uID0gcmVzdWx0c1RhYmxlLmNvbHVtbkF0UG9pbnQoZS5nZXRQb2ludCgpKTsKLSAgICAgICAgICAgICAgICBpZiAocm93ID4gLTEgJiYgcmVzdWx0c1RhYmxlLmdldENvbHVtbkNsYXNzKGNvbHVtbikgPT0gT2JqZWN0SWRJbXBsLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5sb2FkT2JqZWN0KCgoT2JqZWN0SWQpIHJlc3VsdHNUYWJsZS5nZXRWYWx1ZUF0KHJvdywgY29sdW1uKSkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihRdWVyeUZyYW1lLnRoaXMsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1heWJlU2hvd1BvcHVwKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1heWJlU2hvd1BvcHVwKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgbWF5YmVTaG93UG9wdXAoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuaXNQb3B1cFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBwb3B1cC5zaG93KGUuZ2V0Q29tcG9uZW50KCksIGUuZ2V0WCgpLCBlLmdldFkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXN1bHRzVGFibGUuYWRkTW91c2VNb3Rpb25MaXN0ZW5lcihuZXcgTW91c2VNb3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZWQoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJvdyA9IHJlc3VsdHNUYWJsZS5yb3dBdFBvaW50KGUuZ2V0UG9pbnQoKSk7Ci0gICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IHJlc3VsdHNUYWJsZS5jb2x1bW5BdFBvaW50KGUuZ2V0UG9pbnQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdyA+IC0xICYmIHJlc3VsdHNUYWJsZS5nZXRDb2x1bW5DbGFzcyhjb2x1bW4pID09IE9iamVjdElkSW1wbC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRzVGFibGUuc2V0Q3Vyc29yKEhBTkRfQ1VSU09SKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRzVGFibGUuc2V0Q3Vyc29yKERFRkFVTFRfQ1VSU09SKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRHJhZ2dlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYWRkKG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuVkVSVElDQUxfU1BMSVQsIGlucHV0UGFuZWwsIG5ldyBKU2Nyb2xsUGFuZShyZXN1bHRzVGFibGUpKSk7Ci0KLSAgICAgICAgZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKHF1ZXJ5QnV0dG9uKTsKLQotICAgICAgICBDbGllbnRIZWxwZXIuaW5zdGFsbEVzY2FwZUJpbmRpbmcodGhpcywgZ2V0Um9vdFBhbmUoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5ESVNQT1NFX09OX0NMT1NFKTsKLSAgICAgICAgcGFjaygpOwotCi0gICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGRvUXVlcnkoKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gcXVlcnlUZXh0LmdldFRleHQoKTsKLSAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgnXG4nLCAnICcpOwotCi0gICAgICAgIEl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcmVzdWx0cyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLQotICAgICAgICAgICAgaW50IG1heEhpdHMgPSAxMDAwOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtYXhIaXRzRmllbGQuY29tbWl0RWRpdCgpOwotICAgICAgICAgICAgICAgIG1heEhpdHMgPSAoKE51bWJlcikgbWF4SGl0c0ZpZWxkLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1heEhpdHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEhpdHMgPSAwOwotICAgICAgICAgICAgICAgICAgICBtYXhIaXRzRmllbGQuc2V0VmFsdWUoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKHRoaXMsIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXN1bHRzID0gbW9kZWwucXVlcnkodGV4dCwgc2VhcmNoQWxsVmVyc2lvbnNDaGVja0JveC5pc1NlbGVjdGVkKCksIG1heEhpdHMpOwotCi0gICAgICAgICAgICBSZXN1bHRUYWJsZU1vZGVsIHJ0bSA9IG5ldyBSZXN1bHRUYWJsZU1vZGVsKCk7Ci0KLSAgICAgICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLSAgICAgICAgICAgIGludCByb3cgPSAwOwotICAgICAgICAgICAgSXRlbUl0ZXJhYmxlPFF1ZXJ5UmVzdWx0PiBwYWdlID0gcmVzdWx0cy5nZXRQYWdlKG1heEhpdHMpOwotICAgICAgICAgICAgZm9yIChRdWVyeVJlc3VsdCBxciA6IHBhZ2UpIHsKLSAgICAgICAgICAgICAgICBydG0uc2V0Q29sdW1uQ291bnQoTWF0aC5tYXgocnRtLmdldENvbHVtbkNvdW50KCksIHFyLmdldFByb3BlcnRpZXMoKS5zaXplKCkpKTsKLQotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEYXRhPD8+IHByb3AgOiBxci5nZXRQcm9wZXJ0aWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFByb3BlcnR5SWRzLk9CSkVDVF9JRC5lcXVhbHMocHJvcC5nZXRJZCgpKSAmJiAocHJvcC5nZXRGaXJzdFZhbHVlKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ0bS5zZXRWYWx1ZShyb3csIHByb3AuZ2V0UXVlcnlOYW1lKCksIG5ldyBPYmplY3RJZEltcGwocHJvcC5nZXRGaXJzdFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcnRtLnNldFZhbHVlKHJvdywgcHJvcC5nZXRRdWVyeU5hbWUoKSwgcHJvcC5nZXRWYWx1ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ0bS5zZXRSb3dDb3VudChyb3cpOwotCi0gICAgICAgICAgICBsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBmbG9hdCB0aW1lID0gKChmbG9hdCkgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSkgLyAxMDAwZjsKLSAgICAgICAgICAgIFN0cmluZyB0b3RhbCA9ICI8dW5rbm93bj4iOwotICAgICAgICAgICAgaWYgKHBhZ2UuZ2V0VG90YWxOdW1JdGVtcygpID49IDApIHsKLSAgICAgICAgICAgICAgICB0b3RhbCA9IFN0cmluZy52YWx1ZU9mKHBhZ2UuZ2V0VG90YWxOdW1JdGVtcygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcXVlcnlUaW1lTGFiZWwuc2V0VGV4dCgiICIgKyByb3cgKyAiIGhpdHMsICIgKyB0b3RhbCArICIgdG90YWwgKCIgKyB0aW1lICsgIiBzZWMpIik7Ci0KLSAgICAgICAgICAgIHJlc3VsdHNUYWJsZS5zZXRNb2RlbChydG0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZXgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFJlc3VsdFRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgaW50IGNvbHVtbkNvdW50ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgcm93Q291bnQgPSAwOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IGNvbHVtbk1hcHBpbmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIE1hcDxJbnRlZ2VyLCBPYmplY3Q+PiBkYXRhID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTWFwPEludGVnZXIsIE9iamVjdD4+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIE1hcDxJbnRlZ2VyLCBMaXN0PD8+Pj4gbXVsdGl2YWx1ZSA9IG5ldyBIYXNoTWFwPEludGVnZXIsIE1hcDxJbnRlZ2VyLCBMaXN0PD8+Pj4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8SW50ZWdlciwgQ2xhc3M8Pz4+IGNvbHVtbkNsYXNzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgQ2xhc3M8Pz4+KCk7Ci0KLSAgICAgICAgcHVibGljIFJlc3VsdFRhYmxlTW9kZWwoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5Db3VudChpbnQgY29sdW1uQ291bnQpIHsKLSAgICAgICAgICAgIHRoaXMuY29sdW1uQ291bnQgPSBjb2x1bW5Db3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29sdW1uQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSb3dDb3VudChpbnQgcm93Q291bnQpIHsKLSAgICAgICAgICAgIHRoaXMucm93Q291bnQgPSByb3dDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm93Q291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBpbnQgcm93SW5kZXgsIGZpbmFsIFN0cmluZyBxdWVyeU5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgSW50ZWdlciBjb2wgPSBjb2x1bW5NYXBwaW5nLmdldChxdWVyeU5hbWUpOwotICAgICAgICAgICAgaWYgKGNvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29sID0gY29sdW1uTWFwcGluZy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgY29sdW1uTWFwcGluZy5wdXQocXVlcnlOYW1lLCBjb2x1bW5NYXBwaW5nLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0PD8+KSB7Ci0gICAgICAgICAgICAgICAgTGlzdDw/PiB2YWx1ZXMgPSAoTGlzdDw/PikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmdldCgwKTsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgTGlzdDw/Pj4gbXZyb3cgPSBtdWx0aXZhbHVlLmdldChyb3dJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtdnJvdyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdnJvdyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExpc3Q8Pz4+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXZhbHVlLnB1dChyb3dJbmRleCwgbXZyb3cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG12cm93LnB1dChjb2wsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgICAgIHZhbHVlID0gQ2xpZW50SGVscGVyLmdldERhdGVTdHJpbmcoKEdyZWdvcmlhbkNhbGVuZGFyKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbHVtbkNsYXNzLnB1dChjb2wsIHZhbHVlLmdldENsYXNzKCkpOwotCi0gICAgICAgICAgICBNYXA8SW50ZWdlciwgT2JqZWN0PiByb3cgPSBkYXRhLmdldChyb3dJbmRleCk7Ci0gICAgICAgICAgICBpZiAocm93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5wdXQocm93SW5kZXgsIHJvdyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJvdy5wdXQoY29sLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBPYmplY3Q+IHJvdyA9IGRhdGEuZ2V0KHJvd0luZGV4KTsKLSAgICAgICAgICAgIGlmIChyb3cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcm93LmdldChjb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDw/PiBnZXRNdWx0aVZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBMaXN0PD8+PiByb3cgPSBtdWx0aXZhbHVlLmdldChyb3dJbmRleCk7Ci0gICAgICAgICAgICBpZiAocm93ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXQoY29sdW1uSW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uKSB7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IGUgOiBjb2x1bW5NYXBwaW5nLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRWYWx1ZSgpLmVxdWFscyhjb2x1bW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEtleSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuICI/IjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q29sdW1uQ2xhc3MoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IGNvbHVtbkNsYXNzLmdldChjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbGF6ejsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBSZXN1bHRUYWJsZSBleHRlbmRzIEpUYWJsZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHVibGljIFJlc3VsdFRhYmxlKCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICAgICAgc2V0RGVmYXVsdFJlbmRlcmVyKE9iamVjdElkSW1wbC5jbGFzcywgbmV3IElkUmVuZGVyZXIoKSk7Ci0gICAgICAgICAgICBzZXRGaWxsc1ZpZXdwb3J0SGVpZ2h0KHRydWUpOwotICAgICAgICAgICAgc2V0QXV0b1Jlc2l6ZU1vZGUoSlRhYmxlLkFVVE9fUkVTSVpFX09GRik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dChmaW5hbCBNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgICAgICBQb2ludCBwID0gZS5nZXRQb2ludCgpOwotICAgICAgICAgICAgaW50IHJvd0luZGV4ID0gcm93QXRQb2ludChwKTsKLSAgICAgICAgICAgIGludCBjb2x1bW5JbmRleCA9IGNvbnZlcnRDb2x1bW5JbmRleFRvTW9kZWwoY29sdW1uQXRQb2ludChwKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFJlc3VsdFRhYmxlTW9kZWwgbW9kZWwgPSAoUmVzdWx0VGFibGVNb2RlbCkgZ2V0TW9kZWwoKTsKLQotICAgICAgICAgICAgZmluYWwgTGlzdDw/PiB2YWx1ZXMgPSBtb2RlbC5nZXRNdWx0aVZhbHVlQXQocm93SW5kZXgsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGh0bWw+Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxicj4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8aT5udWxsPC9pPiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLmVuY29kZUh0bWwoc2IsIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gbW9kZWwuZ2V0VmFsdWVBdChyb3dJbmRleCwgY29sdW1uSW5kZXgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnQgcHJlcGFyZVJlbmRlcmVyKGZpbmFsIFRhYmxlQ2VsbFJlbmRlcmVyIHJlbmRlcmVyLCBmaW5hbCBpbnQgcm93SW5kZXgsIGZpbmFsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50IHByZXBhcmVSZW5kZXJlciA9IHN1cGVyLnByZXBhcmVSZW5kZXJlcihyZW5kZXJlciwgcm93SW5kZXgsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbiA9IGdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKGNvbHVtbkluZGV4KTsKLQotICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnRXaWR0aCA9IGNvbHVtbi5nZXRQcmVmZXJyZWRXaWR0aCgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA8IDIwMCkgewotICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IHByZXBhcmVSZW5kZXJlci5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCA8IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDUwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDUwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpZHRoID4gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDIwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCAhPSBjdXJyZW50V2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRQcmVmZXJyZWRXaWR0aCh3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwcmVwYXJlUmVuZGVyZXI7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvUmFuZG9tSW5wdXRTdHJlYW0uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9SYW5kb21JbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmYxOTAxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9SYW5kb21JbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1wdWJsaWMgY2xhc3MgUmFuZG9tSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJhbmRvbSByYW5kb207Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIGxlbmd0aDsKLSAgICBwcml2YXRlIGxvbmcgcG9zOwotCi0gICAgcHVibGljIFJhbmRvbUlucHV0U3RyZWFtKGxvbmcgbGVuZ3RoKSB7Ci0gICAgICAgIHRoaXMobGVuZ3RoLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFJhbmRvbUlucHV0U3RyZWFtKGxvbmcgbGVuZ3RoLCBsb25nIHNlZWQpIHsKLSAgICAgICAgcmFuZG9tID0gbmV3IFJhbmRvbShzZWVkKTsKLSAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgIHBvcyA9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKGludCkgTWF0aC5taW4oSW50ZWdlci5NQVhfVkFMVUUsIGxlbmd0aCAtIHBvcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChsb25nIGwgPSAwOyBsIDwgbjsgbCsrKSB7Ci0gICAgICAgICAgICBpZiAocmVhZCgpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocG9zID09IGxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9zKys7Ci0KLSAgICAgICAgcmV0dXJuIHJhbmRvbS5uZXh0SW50KDI1Nik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZChiLCAwLCBiLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoYiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmICgob2ZmIDwgMCkgfHwgKGxlbiA8IDApIHx8IChsZW4gPiBiLmxlbmd0aCAtIG9mZikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgciA9IHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChyID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChpID09IDAgPyAtMSA6IGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYltvZmYgKyBpXSA9IChieXRlKSByOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1JlcG9zaXRvcnlJbmZvRnJhbWUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9SZXBvc2l0b3J5SW5mb0ZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTRmYWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1JlcG9zaXRvcnlJbmZvRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db2xsZWN0aW9uc0hlbHBlci5pc05vdEVtcHR5OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOdWxsT3JFbXB0eTsKLQotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVNlbGVjdGlvbk1vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFjbENhcGFiaWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkV4dGVuc2lvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLlBlcm1pc3Npb25NYXBwaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5Q2FwYWJpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlBlcm1pc3Npb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlByb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkluZm9QYW5lbDsKLQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlJbmZvRnJhbWUgZXh0ZW5kcyBKRnJhbWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lORE9XX1RJVExFID0gIkNNSVMgUmVwb3NpdG9yeSBJbmZvIjsKLQotICAgIHByaXZhdGUgZmluYWwgQ2xpZW50TW9kZWwgbW9kZWw7Ci0KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUluZm9GcmFtZShDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgc2V0VGl0bGUoV0lORE9XX1RJVExFICsgIiAtICIgKyBtb2RlbC5nZXRSZXBvc2l0b3J5TmFtZSgpKTsKLSAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDcwMCwgNzAwKSk7Ci0gICAgICAgIHNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oMjAwLCA2MCkpOwotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcEluZm8gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVwSW5mbyA9IG1vZGVsLmdldFJlcG9zaXRvcnlJbmZvKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKHRoaXMsIGUpOwotICAgICAgICAgICAgZGlzcG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkKG5ldyBKU2Nyb2xsUGFuZShuZXcgUmVwb3NpdG9yeUluZm9QYW5lbChtb2RlbCwgcmVwSW5mbykpKTsKLQotICAgICAgICBDbGllbnRIZWxwZXIuaW5zdGFsbEVzY2FwZUJpbmRpbmcodGhpcywgZ2V0Um9vdFBhbmUoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5ESVNQT1NFX09OX0NMT1NFKTsKLSAgICAgICAgcGFjaygpOwotCi0gICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUmVwb3NpdG9yeUluZm9QYW5lbCBleHRlbmRzIEluZm9QYW5lbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5SW5mbyByZXBJbmZvOwotCi0gICAgICAgIHB1YmxpYyBSZXBvc2l0b3J5SW5mb1BhbmVsKENsaWVudE1vZGVsIG1vZGVsLCBSZXBvc2l0b3J5SW5mbyByZXBJbmZvKSB7Ci0gICAgICAgICAgICBzdXBlcihtb2RlbCk7Ci0KLSAgICAgICAgICAgIHRoaXMucmVwSW5mbyA9IHJlcEluZm87Ci0gICAgICAgICAgICBjcmVhdGVHVUkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgICAgICBzZXR1cEdVSSgpOwotCi0gICAgICAgICAgICBhZGRMaW5lKCJOYW1lOiIsIHRydWUpLnNldFRleHQocmVwSW5mby5nZXROYW1lKCkpOwotICAgICAgICAgICAgYWRkTGluZSgiSWQ6Iikuc2V0VGV4dChyZXBJbmZvLmdldElkKCkpOwotICAgICAgICAgICAgYWRkTGluZSgiRGVzY3JpcHRpb246Iikuc2V0VGV4dChyZXBJbmZvLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgYWRkTGluZSgiVmVuZG9yOiIpLnNldFRleHQocmVwSW5mby5nZXRWZW5kb3JOYW1lKCkpOwotICAgICAgICAgICAgYWRkTGluZSgiUHJvZHVjdDoiKS5zZXRUZXh0KHJlcEluZm8uZ2V0UHJvZHVjdE5hbWUoKSArICIgIiArIHJlcEluZm8uZ2V0UHJvZHVjdFZlcnNpb24oKSk7Ci0gICAgICAgICAgICBhZGRMaW5lKCJDTUlTIFZlcnNpb246Iikuc2V0VGV4dChyZXBJbmZvLmdldENtaXNWZXJzaW9uU3VwcG9ydGVkKCkpOwotICAgICAgICAgICAgYWRkSWQoIlJvb3QgZm9sZGVyIElkOiIpLnNldFRleHQocmVwSW5mby5nZXRSb290Rm9sZGVySWQoKSk7Ci0gICAgICAgICAgICBhZGRMaW5lKCJMYXRlc3QgY2hhbmdlIHRva2VuOiIpLnNldFRleHQocmVwSW5mby5nZXRMYXRlc3RDaGFuZ2VMb2dUb2tlbigpKTsKLSAgICAgICAgICAgIGFkZExpbmsoIlRoaW4gY2xpZW50IFVSSToiKS5zZXRUZXh0KHJlcEluZm8uZ2V0VGhpbkNsaWVudFVyaSgpKTsKLSAgICAgICAgICAgIGFkZExpbmUoIlByaW5jaXBhbCBpZCBhbm9ueW1vdXM6Iikuc2V0VGV4dChyZXBJbmZvLmdldFByaW5jaXBhbElkQW5vbnltb3VzKCkpOwotICAgICAgICAgICAgYWRkTGluZSgiUHJpbmNpcGFsIGlkIGFueW9uZToiKS5zZXRUZXh0KHJlcEluZm8uZ2V0UHJpbmNpcGFsSWRBbnlvbmUoKSk7Ci0gICAgICAgICAgICBhZGRZZXNOb0xhYmVsKCJDaGFuZ2VzIGluY29tcGxldGU6Iikuc2V0VmFsdWUoaXMocmVwSW5mby5nZXRDaGFuZ2VzSW5jb21wbGV0ZSgpKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaWYgKHJlcEluZm8uZ2V0Q2hhbmdlc09uVHlwZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEJhc2VUeXBlSWQgYnQgOiByZXBJbmZvLmdldENoYW5nZXNPblR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1N0cmluZyhzYiwgYnQudmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkTGluZSgiQ2hhbmdlcyBvbiB0eXBlOiIpLnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXBJbmZvLmdldENhcGFiaWxpdGllcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSZXBvc2l0b3J5Q2FwYWJpbGl0aWVzIGNhcCA9IHJlcEluZm8uZ2V0Q2FwYWJpbGl0aWVzKCk7Ci0KLSAgICAgICAgICAgICAgICBhZGRMaW5lKCJDYXBhYmlsaXRpZXM6IiwgdHJ1ZSkuc2V0VGV4dCgiIik7Ci0KLSAgICAgICAgICAgICAgICBhZGRZZXNOb0xhYmVsKCJHZXQgZGVzY2VuZGFudHMgc3VwcG9ydGVkOiIpLnNldFZhbHVlKGlzKGNhcC5pc0dldERlc2NlbmRhbnRzU3VwcG9ydGVkKCkpKTsKLSAgICAgICAgICAgICAgICBhZGRZZXNOb0xhYmVsKCJHZXQgZm9sZGVyIHRyZWUgc3VwcG9ydGVkOiIpLnNldFZhbHVlKGlzKGNhcC5pc0dldEZvbGRlclRyZWVTdXBwb3J0ZWQoKSkpOwotICAgICAgICAgICAgICAgIGFkZFllc05vTGFiZWwoIlVuZmlsaW5nIHN1cHBvcnRlZDoiKS5zZXRWYWx1ZShpcyhjYXAuaXNVbmZpbGluZ1N1cHBvcnRlZCgpKSk7Ci0gICAgICAgICAgICAgICAgYWRkWWVzTm9MYWJlbCgiTXVsdGlmaWxpbmcgc3VwcG9ydGVkOiIpLnNldFZhbHVlKGlzKGNhcC5pc011bHRpZmlsaW5nU3VwcG9ydGVkKCkpKTsKLSAgICAgICAgICAgICAgICBhZGRZZXNOb0xhYmVsKCJWZXJzaW9uIHNwZWNpZmljIGZpbGluZyBzdXBwb3J0ZWQ6IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShpcyhjYXAuaXNWZXJzaW9uU3BlY2lmaWNGaWxpbmdTdXBwb3J0ZWQoKSkpOwotICAgICAgICAgICAgICAgIGFkZExpbmUoIk9yZGVyIGJ5OiIpLnNldFRleHQoc3RyKGNhcC5nZXRPcmRlckJ5Q2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgICAgICAgICAgYWRkTGluZSgiUXVlcnk6Iikuc2V0VGV4dChzdHIoY2FwLmdldFF1ZXJ5Q2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgICAgICAgICAgYWRkTGluZSgiSm9pbnM6Iikuc2V0VGV4dChzdHIoY2FwLmdldEpvaW5DYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgICAgICAgICBhZGRZZXNOb0xhYmVsKCJBbGwgdmVyc2lvbnMgc2VhcmNoYWJsZToiKS5zZXRWYWx1ZShpcyhjYXAuaXNBbGxWZXJzaW9uc1NlYXJjaGFibGVTdXBwb3J0ZWQoKSkpOwotICAgICAgICAgICAgICAgIGFkZFllc05vTGFiZWwoIlBXQyBzZWFyY2hhYmxlOiIpLnNldFZhbHVlKGlzKGNhcC5pc1B3Y1NlYXJjaGFibGVTdXBwb3J0ZWQoKSkpOwotICAgICAgICAgICAgICAgIGFkZFllc05vTGFiZWwoIlBXQyB1cGRhdGFibGU6Iikuc2V0VmFsdWUoaXMoY2FwLmlzUHdjVXBkYXRhYmxlU3VwcG9ydGVkKCkpKTsKLSAgICAgICAgICAgICAgICBhZGRMaW5lKCJDb250ZW50IHN0cmVhbSB1cGRhdGVzOiIpLnNldFRleHQoc3RyKGNhcC5nZXRDb250ZW50U3RyZWFtVXBkYXRlc0NhcGFiaWxpdHkoKSkpOwotICAgICAgICAgICAgICAgIGFkZExpbmUoIlJlbmRpdGlvbnM6Iikuc2V0VGV4dChzdHIoY2FwLmdldFJlbmRpdGlvbnNDYXBhYmlsaXR5KCkpKTsKLSAgICAgICAgICAgICAgICBhZGRMaW5lKCJDaGFuZ2VzOiIpLnNldFRleHQoc3RyKGNhcC5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpKSk7Ci0gICAgICAgICAgICAgICAgYWRkTGluZSgiQUNMczoiKS5zZXRUZXh0KHN0cihjYXAuZ2V0QWNsQ2FwYWJpbGl0eSgpKSk7Ci0KLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNhcC5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjYXAuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpLmNhblNldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1N0cmluZyhzYiwgImlkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjYXAuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpLmNhblNldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9TdHJpbmcoc2IsICJsb2NhbE5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNhcC5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkuY2FuU2V0TG9jYWxOYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvU3RyaW5nKHNiLCAibG9jYWxOYW1lc3BhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNhcC5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkuY2FuU2V0RGlzcGxheU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvU3RyaW5nKHNiLCAiZGlzcGxheU5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNhcC5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkuY2FuU2V0UXVlcnlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1N0cmluZyhzYiwgInF1ZXJ5TmFtZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoY2FwLmdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKS5jYW5TZXREZXNjcmlwdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9TdHJpbmcoc2IsICJkZXNjcmlwdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoY2FwLmdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKS5jYW5TZXRDcmVhdGFibGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvU3RyaW5nKHNiLCAiY3JlYXRhYmxlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjYXAuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpLmNhblNldEZpbGVhYmxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1N0cmluZyhzYiwgImZpbGVhYmxlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjYXAuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpLmNhblNldFF1ZXJ5YWJsZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9TdHJpbmcoc2IsICJxdWVyeWFibGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNhcC5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkuY2FuU2V0RnVsbHRleHRJbmRleGVkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1N0cmluZyhzYiwgImZ1bGx0ZXh0SW5kZXhlZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoY2FwLmdldE5ld1R5cGVTZXR0YWJsZUF0dHJpYnV0ZXMoKS5jYW5TZXRJbmNsdWRlZEluU3VwZXJ0eXBlUXVlcnkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvU3RyaW5nKHNiLCAiaW5jbHVkZWRJblN1cGVydHlwZVF1ZXJ5Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhjYXAuZ2V0TmV3VHlwZVNldHRhYmxlQXR0cmlidXRlcygpLmNhblNldENvbnRyb2xsYWJsZVBvbGljeSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9TdHJpbmcoc2IsICJjb250cm9sbGFibGVQb2xpY3kiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGNhcC5nZXROZXdUeXBlU2V0dGFibGVBdHRyaWJ1dGVzKCkuY2FuU2V0Q29udHJvbGxhYmxlQWNsKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1N0cmluZyhzYiwgImNvbnRyb2xsYWJsZUFDTCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYWRkTGluZSgiTmV3IHR5cGUgc2V0dGFibGUgYXR0cmlidXRlczoiKS5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGlmIChjYXAuZ2V0Q3JlYXRhYmxlUHJvcGVydHlUeXBlcygpICE9IG51bGwgJiYgY2FwLmdldENyZWF0YWJsZVByb3BlcnR5VHlwZXMoKS5jYW5DcmVhdGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlUeXBlIHB0IDogY2FwLmdldENyZWF0YWJsZVByb3BlcnR5VHlwZXMoKS5jYW5DcmVhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9TdHJpbmcoc2IsIHB0LnZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYWRkTGluZSgiQ3JlYXRhYmxlIHByb3BlcnR5IHR5cGVzOiIpLnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXBJbmZvLmdldEFjbENhcGFiaWxpdGllcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBY2xDYXBhYmlsaXRpZXMgY2FwID0gcmVwSW5mby5nZXRBY2xDYXBhYmlsaXRpZXMoKTsKLQotICAgICAgICAgICAgICAgIGFkZExpbmUoIkFDTCBDYXBhYmlsaXRpZXM6IiwgdHJ1ZSkuc2V0VGV4dCgiIik7Ci0KLSAgICAgICAgICAgICAgICBhZGRMaW5lKCJTdXBwb3J0ZWQgcGVybWlzc2lvbnM6Iikuc2V0VGV4dChzdHIoY2FwLmdldFN1cHBvcnRlZFBlcm1pc3Npb25zKCkpKTsKLSAgICAgICAgICAgICAgICBhZGRMaW5lKCJBQ0wgcHJvcGFnYXRpb246Iikuc2V0VGV4dChzdHIoY2FwLmdldEFjbFByb3BhZ2F0aW9uKCkpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjYXAuZ2V0UGVybWlzc2lvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdW10gZGF0YSA9IG5ldyBTdHJpbmdbY2FwLmdldFBlcm1pc3Npb25zKCkuc2l6ZSgpXVsyXTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbkRlZmluaXRpb24gcGQgOiBjYXAuZ2V0UGVybWlzc2lvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXVswXSA9IHBkLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2ldWzFdID0gcGQuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEpUYWJsZSBwZXJtVGFibGUgPSBuZXcgSlRhYmxlKGRhdGEsIG5ldyBTdHJpbmdbXSB7ICJQZXJtaXNzaW9uIiwgIkRlc2NyaXB0aW9uIiB9KTsKLSAgICAgICAgICAgICAgICAgICAgcGVybVRhYmxlLnNldEZpbGxzVmlld3BvcnRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudCgiUGVybWlzc2lvbnM6IiwgbmV3IEpTY3JvbGxQYW5lKHBlcm1UYWJsZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjYXAuZ2V0UGVybWlzc2lvbk1hcHBpbmcoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdW10gZGF0YSA9IG5ldyBTdHJpbmdbY2FwLmdldFBlcm1pc3Npb25NYXBwaW5nKCkuc2l6ZSgpXVsyXTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUGVybWlzc2lvbk1hcHBpbmcgcG0gOiBjYXAuZ2V0UGVybWlzc2lvbk1hcHBpbmcoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXVswXSA9IHBtLmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXVsxXSA9IChwbS5nZXRQZXJtaXNzaW9ucygpID09IG51bGwgPyAiIiA6IHBtLmdldFBlcm1pc3Npb25zKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBKVGFibGUgcGVybU1hcFRhYmxlID0gbmV3IEpUYWJsZShkYXRhLCBuZXcgU3RyaW5nW10geyAiS2V5IiwgIlBlcm1pc3Npb25zIiB9KTsKLSAgICAgICAgICAgICAgICAgICAgcGVybU1hcFRhYmxlLnNldEZpbGxzVmlld3BvcnRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudCgiUGVybWlzc2lvbiBtYXBwaW5nOiIsIG5ldyBKU2Nyb2xsUGFuZShwZXJtTWFwVGFibGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KHJlcEluZm8uZ2V0RXh0ZW5zaW9uRmVhdHVyZXMoKSkpIHsKLSAgICAgICAgICAgICAgICBKVHJlZSBleHRlbnNpb25GZWF0dXJlc1RyZWUgPSBuZXcgSlRyZWUoKTsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25GZWF0dXJlc1RyZWUuc2V0Um9vdFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvbkZlYXR1cmVzVHJlZS5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGlvbk1vZGUoVHJlZVNlbGVjdGlvbk1vZGVsLlNJTkdMRV9UUkVFX1NFTEVDVElPTik7Ci0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGV4dEZlYXRSb290Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJFeHRlbnNpb25zIik7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEV4dGVuc2lvbkZlYXR1cmUgZWYgOiByZXBJbmZvLmdldEV4dGVuc2lvbkZlYXR1cmVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVmSWQgPSBlZi5nZXRJZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWZJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlZklkID0gIj8/PyI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGVmTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGVmSWQpOwotICAgICAgICAgICAgICAgICAgICBleHRGZWF0Um9vdE5vZGUuYWRkKGVmTm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVmLmdldENvbW1vbk5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlZk5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJDb21tb24gTmFtZTogIiArIGVmLmdldENvbW1vbk5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVmLmdldFZlcnNpb25MYWJlbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVmTm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlZlcnNpb24gTGFiZWw6ICIgKyBlZi5nZXRWZXJzaW9uTGFiZWwoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVmLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZWZOb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiRGVzY3JpcHRpb246ICIgKyBlZi5nZXREZXNjcmlwdGlvbigpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZWYuZ2V0VXJsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZWZOb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiVVJMOiAiICsgZWYuZ2V0VXJsKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KGVmLmdldEZlYXR1cmVEYXRhKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGRhdGFOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIkZlYXR1cmUgRGF0YSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWZOb2RlLmFkZChkYXRhTm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogZWYuZ2V0RmVhdHVyZURhdGEoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGUuZ2V0S2V5KCkgKyAiOiAiICsgZS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBleHRlbnNpb25GZWF0dXJlc1RyZWUuc2V0TW9kZWwobmV3IERlZmF1bHRUcmVlTW9kZWwoZXh0RmVhdFJvb3ROb2RlKSk7Ci0KLSAgICAgICAgICAgICAgICBhZGRDb21wb25lbnQoIkV4dGVuc2lvbiBGZWF0dXJlczoiLCBuZXcgSlNjcm9sbFBhbmUoZXh0ZW5zaW9uRmVhdHVyZXNUcmVlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KHJlcEluZm8uZ2V0RXh0ZW5zaW9ucygpKSkgewotICAgICAgICAgICAgICAgIEpUcmVlIGV4dGVuc2lvbnNUcmVlID0gbmV3IEpUcmVlKCk7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1RyZWUuc2V0Um9vdFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNUcmVlLmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0aW9uTW9kZShUcmVlU2VsZWN0aW9uTW9kZWwuU0lOR0xFX1RSRUVfU0VMRUNUSU9OKTsKLQotICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgZXh0Um9vdE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiRXh0ZW5zaW9ucyIpOwotICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbihleHRSb290Tm9kZSwgcmVwSW5mby5nZXRFeHRlbnNpb25zKCkpOwotCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc1RyZWUuc2V0TW9kZWwobmV3IERlZmF1bHRUcmVlTW9kZWwoZXh0Um9vdE5vZGUpKTsKLQotICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudCgiRXh0ZW5zaW9uczoiLCBuZXcgSlNjcm9sbFBhbmUoZXh0ZW5zaW9uc1RyZWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRFeHRlbnNpb24oRGVmYXVsdE11dGFibGVUcmVlTm9kZSBwYXJlbnQsIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KGV4dGVuc2lvbnMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKENtaXNFeHRlbnNpb25FbGVtZW50IGV4dCA6IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShuZXcgRXh0ZW5zaW9uTm9kZShleHQpKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQuYWRkKG5vZGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoZXh0LmdldENoaWxkcmVuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbihub2RlLCBleHQuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZyBzdHIpIHsKLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZChzdHIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzKEJvb2xlYW4gYikgewotICAgICAgICAgICAgaWYgKGIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBzdHIoT2JqZWN0IG8pIHsKLSAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIj8iOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGNsYXNzIEV4dGVuc2lvbk5vZGUgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbWlzRXh0ZW5zaW9uRWxlbWVudCBleHRlbnNpb247Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFeHRlbnNpb25Ob2RlKENtaXNFeHRlbnNpb25FbGVtZW50IGV4dGVuc2lvbikgewotICAgICAgICAgICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChleHRlbnNpb24uZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCA/ICIiIDogInsiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIn0iKQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleHRlbnNpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICghZXh0ZW5zaW9uLmdldEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCkgPyAiICIgKyBleHRlbnNpb24uZ2V0QXR0cmlidXRlcygpIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICAgICArIChleHRlbnNpb24uZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCkgPyAiOiAiICsgZXh0ZW5zaW9uLmdldFZhbHVlKCkgOiAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvVGNrRGlhbG9nLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvVGNrRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTM5ZDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1Rja0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0Q2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkJveDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQb3B1cE1lbnU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlByb2dyZXNzQmFyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdXb3JrZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuVG9vbFRpcE1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZUNlbGxFZGl0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU5vZGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQmFzZVR5cGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0R3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RSZXN1bHRTdGF0dXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuVGVzdFBhcmFtZXRlcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJ1bm5lci5BYnN0cmFjdFJ1bm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guY2hlY2tzLlN3aW5nUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLQotLyoqCi0gKiBUQ0sgZGlhbG9nIGFuZCBydW5uZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUY2tEaWFsb2cgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBGcmFtZSBvd25lcjsKLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgZmluYWwgVGNrRGlhbG9nUnVubmVyIHJ1bm5lcjsKLQotICAgIHByaXZhdGUgTWFwPENtaXNUZXN0UmVzdWx0U3RhdHVzLCBJbnRlZ2VyPiBzdGF0dXM7Ci0KLSAgICBwcml2YXRlIEpQcm9ncmVzc0JhciBncm91cHNQcm9ncmVzc0JhcjsKLSAgICBwcml2YXRlIEpQcm9ncmVzc0JhciB0ZXN0c1Byb2dyZXNzQmFyOwotICAgIHByaXZhdGUgSkxhYmVsIHN0YXR1c0xhYmVsOwotCi0gICAgcHVibGljIFRja0RpYWxvZyhGcmFtZSBvd25lciwgQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMucnVubmVyID0gbmV3IFRja0RpYWxvZ1J1bm5lcihtb2RlbCwgdGhpcyk7Ci0KLSAgICAgICAgc3RhdHVzID0gbmV3IEhhc2hNYXA8Q21pc1Rlc3RSZXN1bHRTdGF0dXMsIEludGVnZXI+KCk7Ci0gICAgICAgIHN0YXR1cy5wdXQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuSU5GTywgMCk7Ci0gICAgICAgIHN0YXR1cy5wdXQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRCwgMCk7Ci0gICAgICAgIHN0YXR1cy5wdXQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuT0ssIDApOwotICAgICAgICBzdGF0dXMucHV0KENtaXNUZXN0UmVzdWx0U3RhdHVzLldBUk5JTkcsIDApOwotICAgICAgICBzdGF0dXMucHV0KENtaXNUZXN0UmVzdWx0U3RhdHVzLkZBSUxVUkUsIDApOwotICAgICAgICBzdGF0dXMucHV0KENtaXNUZXN0UmVzdWx0U3RhdHVzLlVORVhQRUNURURfRVhDRVBUSU9OLCAwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVubmVyLmxvYWREZWZhdWx0VGNrR3JvdXBzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhvd25lciwgIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksICJUQ0sgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG5ldyBUY2tTZWxlY3REaWFsb2coKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRja1NlbGVjdERpYWxvZyBleHRlbmRzIEpEaWFsb2cgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgVGNrU2VsZWN0RGlhbG9nKCkgewotICAgICAgICAgICAgc3VwZXIob3duZXIsICJUQ0siLCB0cnVlKTsKLQotICAgICAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDYwMCwgNTAwKSk7Ci0gICAgICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDYwMCwgNTAwKSk7Ci0KLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCi0gICAgICAgICAgICAvLyB0cmVlCi0gICAgICAgICAgICBmaW5hbCBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJvb3ROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIkdyb3VwcyIpOwotICAgICAgICAgICAgZmluYWwgSlRyZWUgZ3JvdXBUcmVlID0gbmV3IEpUcmVlKHJvb3ROb2RlKTsKLQotICAgICAgICAgICAgZm9yIChDbWlzVGVzdEdyb3VwIGdyb3VwIDogcnVubmVyLmdldEdyb3VwcygpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVGVzdFRyZWVOb2RlIGdyb3VwTm9kZSA9IG5ldyBUZXN0VHJlZU5vZGUoZ3JvdXBUcmVlLCBncm91cCk7Ci0gICAgICAgICAgICAgICAgcm9vdE5vZGUuYWRkKGdyb3VwTm9kZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChDbWlzVGVzdCB0ZXN0IDogZ3JvdXAuZ2V0VGVzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXN0VHJlZU5vZGUgdGVzdE5vZGUgPSBuZXcgVGVzdFRyZWVOb2RlKGdyb3VwVHJlZSwgdGVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwTm9kZS5hZGQodGVzdE5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKChEZWZhdWx0VHJlZU1vZGVsKSBncm91cFRyZWUuZ2V0TW9kZWwoKSkucmVsb2FkKCk7Ci0KLSAgICAgICAgICAgIGdyb3VwVHJlZS5zZXRSb290VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICBncm91cFRyZWUuc2V0Q2VsbFJlbmRlcmVyKG5ldyBUZXN0VHJlZU5vZGVSZW5kZXIoKSk7Ci0gICAgICAgICAgICBncm91cFRyZWUuc2V0Q2VsbEVkaXRvcihuZXcgVGVzdFRyZWVOb2RlRWRpdG9yKCkpOwotICAgICAgICAgICAgZ3JvdXBUcmVlLnNldEVkaXRhYmxlKHRydWUpOwotICAgICAgICAgICAgVG9vbFRpcE1hbmFnZXIuc2hhcmVkSW5zdGFuY2UoKS5yZWdpc3RlckNvbXBvbmVudChncm91cFRyZWUpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwVHJlZS5nZXRSb3dDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBncm91cFRyZWUuZXhwYW5kUm93KGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBKUG9wdXBNZW51IHRyZWVQb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEpNZW51SXRlbSBzZWxlY3RJdGVtID0gbmV3IEpNZW51SXRlbSgiU2VsZWN0IGFsbCIpOwotICAgICAgICAgICAgc2VsZWN0SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0QWxsKGdyb3VwVHJlZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB0cmVlUG9wdXAuYWRkKHNlbGVjdEl0ZW0pOwotCi0gICAgICAgICAgICBmaW5hbCBKTWVudUl0ZW0gZGVzZWxlY3RJdGVtID0gbmV3IEpNZW51SXRlbSgiRGVzZWxlY3QgYWxsIik7Ci0gICAgICAgICAgICBkZXNlbGVjdEl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbChncm91cFRyZWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHRyZWVQb3B1cC5hZGQoZGVzZWxlY3RJdGVtKTsKLQotICAgICAgICAgICAgZ3JvdXBUcmVlLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heWJlU2hvd1BvcHVwKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heWJlU2hvd1BvcHVwKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBtYXliZVNob3dQb3B1cChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXNQb3B1cFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVBvcHVwLnNob3coZS5nZXRDb21wb25lbnQoKSwgZS5nZXRYKCksIGUuZ2V0WSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICAvLyBjb25maWcgcGFuZWwKLSAgICAgICAgICAgIGZpbmFsIEpQYW5lbCBjb25maWdQYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIGNvbmZpZ1BhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGNvbmZpZ1BhbmVsLCBCb3hMYXlvdXQuUEFHRV9BWElTKSk7Ci0gICAgICAgICAgICBjb25maWdQYW5lbC5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oZ2V0V2lkdGgoKSAvIDIsIDUwMCkpOwotICAgICAgICAgICAgY29uZmlnUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgNSwgMCwgMCkpOwotCi0gICAgICAgICAgICBmaW5hbCBKQ29tYm9Cb3ggZm9sZGVyQ29tYm9Cb3ggPSBhZGRDb21ib0JveChjb25maWdQYW5lbCwgIlRlc3QgZm9sZGVyIHR5cGU6IiwKLSAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVJZC5DTUlTX0ZPTERFUi52YWx1ZSgpLCBUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0ZPTERFUl9UWVBFX1ZBTFVFLCB0cnVlKTsKLSAgICAgICAgICAgIGNvbmZpZ1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMSwgMTApKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEpDb21ib0JveCBkb2N1bWVudENvbWJvQm94ID0gYWRkQ29tYm9Cb3goY29uZmlnUGFuZWwsICJUZXN0IGRvY3VtZW50IHR5cGU6IiwKLSAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVJZC5DTUlTX0RPQ1VNRU5ULnZhbHVlKCksIFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfRE9DVU1FTlRfVFlQRV9WQUxVRSwgdHJ1ZSk7Ci0gICAgICAgICAgICBjb25maWdQYW5lbC5hZGQoQm94LmNyZWF0ZVJpZ2lkQXJlYShuZXcgRGltZW5zaW9uKDEsIDEwKSkpOwotCi0gICAgICAgICAgICBmaW5hbCBKQ29tYm9Cb3ggcmVsYXRpb25zaGlwQ29tYm9Cb3ggPSBhZGRDb21ib0JveChjb25maWdQYW5lbCwgIlRlc3QgcmVsYXRpb25zaGlwIHR5cGU6IiwKLSAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUC52YWx1ZSgpLCBUZXN0UGFyYW1ldGVycy5ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFX1ZBTFVFLCB0cnVlKTsKLSAgICAgICAgICAgIGNvbmZpZ1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMSwgMTApKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEpDb21ib0JveCBpdGVtQ29tYm9Cb3ggPSBhZGRDb21ib0JveChjb25maWdQYW5lbCwgIlRlc3QgaXRlbSB0eXBlOiIsIEJhc2VUeXBlSWQuQ01JU19JVEVNLnZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgIFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfSVRFTV9UWVBFX1ZBTFVFLCB0cnVlKTsKLSAgICAgICAgICAgIGNvbmZpZ1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMSwgMTApKSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEpDb21ib0JveCBzZWNvbmRhcnlDb21ib0JveCA9IGFkZENvbWJvQm94KGNvbmZpZ1BhbmVsLCAiVGVzdCBzZWNvbmRhcnkgdHlwZToiLAotICAgICAgICAgICAgICAgICAgICBCYXNlVHlwZUlkLkNNSVNfU0VDT05EQVJZLnZhbHVlKCksIFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfU0VDT05EQVJZX1RZUEVfVkFMVUUsIGZhbHNlKTsKLSAgICAgICAgICAgIGNvbmZpZ1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMSwgMTApKSk7Ci0KLSAgICAgICAgICAgIGNvbmZpZ1BhbmVsLmFkZChuZXcgSkxhYmVsKCJUZXN0IGZvbGRlciBwYXRoOiIpKTsKLSAgICAgICAgICAgIGZpbmFsIEpUZXh0RmllbGQgdGVzdFBhcmVudEZvbGRlckZpZWxkID0gbmV3IEpUZXh0RmllbGQoVGVzdFBhcmFtZXRlcnMuREVGQVVMVF9URVNUX0ZPTERFUl9QQVJFTlRfVkFMVUUpOwotICAgICAgICAgICAgdGVzdFBhcmVudEZvbGRlckZpZWxkLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oU2hvcnQuTUFYX1ZBTFVFLCAxMCkpOwotICAgICAgICAgICAgdGVzdFBhcmVudEZvbGRlckZpZWxkLnNldEFsaWdubWVudFgoQ29tcG9uZW50LkxFRlRfQUxJR05NRU5UKTsKLSAgICAgICAgICAgIGNvbmZpZ1BhbmVsLmFkZCh0ZXN0UGFyZW50Rm9sZGVyRmllbGQpOwotCi0gICAgICAgICAgICBjb25maWdQYW5lbC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsR2x1ZSgpKTsKLQotICAgICAgICAgICAgYWRkKGNvbmZpZ1BhbmVsKTsKLQotICAgICAgICAgICAgZmluYWwgSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIG1haW5QYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7Ci0gICAgICAgICAgICBtYWluUGFuZWwuYWRkKG5ldyBKU2Nyb2xsUGFuZShncm91cFRyZWUpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIG1haW5QYW5lbC5hZGQoY29uZmlnUGFuZWwsIEJvcmRlckxheW91dC5MSU5FX0VORCk7Ci0gICAgICAgICAgICBhZGQobWFpblBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICAgICAgZmluYWwgSkJ1dHRvbiBydW5CdXR0b24gPSBuZXcgSkJ1dHRvbigiUnVuIFRDSyIsIENsaWVudEhlbHBlci5nZXRJY29uKCJ0Y2sucG5nIikpOwotICAgICAgICAgICAgcnVuQnV0dG9uLnNldERlZmF1bHRDYXBhYmxlKHRydWUpOwotICAgICAgICAgICAgcnVuQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFuc3dlciA9IEpPcHRpb25QYW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNob3dDb25maXJtRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVubmluZyB0aGUgVENLIG1heSB0YWtlIGEgbG9uZyB0aW1lIGFuZCBtYXkgYWRkLCByZW1vdmUgYW5kIGFsdGVyIGRhdGEgaW4gdGhlIHJlcG9zaXRvcnkhXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkl0IGFsc28gcHV0cyBhdCBhIHN0cmFpbiBvbiB0aGUgcmVwb3NpdG9yeSwgcGVyZm9ybWluZyBzZXZlcmFsIHRob3VzYW5kIGNhbGxzIVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPyIsICJUQ0siLCBKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYW5zd2VyID09IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IHJ1bm5lci5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0ZPTERFUl9UWVBFLCAoU3RyaW5nKSBmb2xkZXJDb21ib0JveC5nZXRTZWxlY3RlZEl0ZW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0RPQ1VNRU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGRvY3VtZW50Q29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uc2hpcENvbWJvQm94LmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoVGVzdFBhcmFtZXRlcnMuREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIHJlbGF0aW9uc2hpcENvbWJvQm94LmdldFNlbGVjdGVkSXRlbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQ29tYm9Cb3guaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX0lURU1fVFlQRSwgKFN0cmluZykgaXRlbUNvbWJvQm94LmdldFNlbGVjdGVkSXRlbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmRhcnlDb21ib0JveC5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KFRlc3RQYXJhbWV0ZXJzLkRFRkFVTFRfU0VDT05EQVJZX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBzZWNvbmRhcnlDb21ib0JveC5nZXRTZWxlY3RlZEl0ZW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChUZXN0UGFyYW1ldGVycy5ERUZBVUxUX1RFU1RfRk9MREVSX1BBUkVOVCwgdGVzdFBhcmVudEZvbGRlckZpZWxkLmdldFRleHQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5lci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGNrUnVuRGlhbG9nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgZmluYWwgSlBhbmVsIHJ1bkJ1dHRvblBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgcnVuQnV0dG9uUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQocnVuQnV0dG9uUGFuZWwsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLSAgICAgICAgICAgIHJ1bkJ1dHRvblBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDMsIDMsIDMpKTsKLSAgICAgICAgICAgIHJ1bkJ1dHRvbi5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKFNob3J0Lk1BWF9WQUxVRSwgMzApKTsKLSAgICAgICAgICAgIHJ1bkJ1dHRvblBhbmVsLmFkZChydW5CdXR0b24pOwotCi0gICAgICAgICAgICBhZGQocnVuQnV0dG9uUGFuZWwsIEJvcmRlckxheW91dC5QQUdFX0VORCk7Ci0KLSAgICAgICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihydW5CdXR0b24pOwotCi0gICAgICAgICAgICBDbGllbnRIZWxwZXIuaW5zdGFsbEVzY2FwZUJpbmRpbmcodGhpcywgZ2V0Um9vdFBhbmUoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRElTUE9TRV9PTl9DTE9TRSk7Ci0gICAgICAgICAgICBwYWNrKCk7Ci0gICAgICAgICAgICBzZXRMb2NhdGlvblJlbGF0aXZlVG8obnVsbCk7Ci0gICAgICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNlbGVjdEFsbChmaW5hbCBKVHJlZSB0cmVlLCBib29sZWFuIHNlbGVjdCkgewotICAgICAgICAgICAgZm9yIChDbWlzVGVzdEdyb3VwIGdyb3VwIDogcnVubmVyLmdldEdyb3VwcygpKSB7Ci0gICAgICAgICAgICAgICAgZ3JvdXAuc2V0RW5hYmxlZChzZWxlY3QpOwotICAgICAgICAgICAgICAgIGZvciAoQ21pc1Rlc3QgdGVzdCA6IGdyb3VwLmdldFRlc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdC5zZXRFbmFibGVkKHNlbGVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEZWZhdWx0VHJlZU1vZGVsIHRyZWVNb2RlbCA9ICgoRGVmYXVsdFRyZWVNb2RlbCkgdHJlZS5nZXRNb2RlbCgpKTsKLSAgICAgICAgICAgIHRyZWVNb2RlbC5ub2RlQ2hhbmdlZCgoVHJlZU5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBKQ29tYm9Cb3ggYWRkQ29tYm9Cb3goSlBhbmVsIHBhbmVsLCBTdHJpbmcgdGl0bGUsIFN0cmluZyByb290VHlwZUlkLCBTdHJpbmcgZGVmYXVsdFR5cGVJZCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGNyZWF0YWJsZU9ubHkpIHsKLSAgICAgICAgICAgIGZpbmFsIEpMYWJlbCBsYWJlbCA9IG5ldyBKTGFiZWwodGl0bGUpOwotICAgICAgICAgICAgbGFiZWwuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOwotICAgICAgICAgICAgcGFuZWwuYWRkKGxhYmVsKTsKLQotICAgICAgICAgICAgTGlzdDxPYmplY3RUeXBlPiB0eXBlcyA9IG1vZGVsLmdldFR5cGVzQXNMaXN0KHJvb3RUeXBlSWQsIGNyZWF0YWJsZU9ubHkpOwotICAgICAgICAgICAgU3RyaW5nW10gdHlwZUlkcyA9IG5ldyBTdHJpbmdbdHlwZXMuc2l6ZSgpXTsKLQotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChPYmplY3RUeXBlIHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgICAgIHR5cGVJZHNbaSsrXSA9IHR5cGUuZ2V0SWQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgSkNvbWJvQm94IGNvbWJvQm94ID0gbmV3IEpDb21ib0JveCh0eXBlSWRzKTsKLSAgICAgICAgICAgIGNvbWJvQm94LnNldFNlbGVjdGVkSXRlbShkZWZhdWx0VHlwZUlkKTsKLSAgICAgICAgICAgIGNvbWJvQm94LnNldEFsaWdubWVudFgoQ29tcG9uZW50LkxFRlRfQUxJR05NRU5UKTsKLSAgICAgICAgICAgIGNvbWJvQm94LnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oU2hvcnQuTUFYX1ZBTFVFLCAxMCkpOwotICAgICAgICAgICAgY29tYm9Cb3guc2V0RW5hYmxlZCh0eXBlSWRzLmxlbmd0aCA+IDApOwotICAgICAgICAgICAgcGFuZWwuYWRkKGNvbWJvQm94KTsKLQotICAgICAgICAgICAgcmV0dXJuIGNvbWJvQm94OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFRyZWVOb2RlIGV4dGVuZHMgRGVmYXVsdE11dGFibGVUcmVlTm9kZSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgSlRyZWUgdHJlZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbWlzVGVzdEdyb3VwIGdyb3VwOwotICAgICAgICBwcml2YXRlIGZpbmFsIENtaXNUZXN0IHRlc3Q7Ci0KLSAgICAgICAgcHVibGljIFRlc3RUcmVlTm9kZShKVHJlZSB0cmVlLCBDbWlzVGVzdEdyb3VwIGdyb3VwKSB7Ci0gICAgICAgICAgICB0aGlzLnRyZWUgPSB0cmVlOwotICAgICAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwotICAgICAgICAgICAgdGhpcy50ZXN0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUZXN0VHJlZU5vZGUoSlRyZWUgdHJlZSwgQ21pc1Rlc3QgdGVzdCkgewotICAgICAgICAgICAgdGhpcy50cmVlID0gdHJlZTsKLSAgICAgICAgICAgIHRoaXMudGVzdCA9IHRlc3Q7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDbWlzVGVzdEdyb3VwIGdldEdyb3VwKCkgewotICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGVzdC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRlc3QuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdGVzdC5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBEZWZhdWx0VHJlZU1vZGVsIHRyZWVNb2RlbCA9ICgoRGVmYXVsdFRyZWVNb2RlbCkgdHJlZS5nZXRNb2RlbCgpKTsKLQotICAgICAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBncm91cC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBUZXN0VHJlZU5vZGUgbm9kZSA9IChUZXN0VHJlZU5vZGUpIGdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgICAgICAgICAgICAgdHJlZU1vZGVsLm5vZGVDaGFuZ2VkKG5vZGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGVzdC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIFRlc3RUcmVlTm9kZSBub2RlID0gKFRlc3RUcmVlTm9kZSkgZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgbm9kZS5nZXRHcm91cCgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdHJlZU1vZGVsLm5vZGVDaGFuZ2VkKG5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFRyZWVOb2RlUmVuZGVyIGV4dGVuZHMgSkNoZWNrQm94IGltcGxlbWVudHMgVHJlZUNlbGxSZW5kZXJlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sb3IgdGV4dFNlbGVjdGlvbkNvbG9yOwotICAgICAgICBwcml2YXRlIGZpbmFsIENvbG9yIHRleHROb25TZWxlY3Rpb25Db2xvcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBiYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3I7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29sb3IgYmFja2dyb3VuZE5vblNlbGVjdGlvbkNvbG9yOwotCi0gICAgICAgIHB1YmxpYyBUZXN0VHJlZU5vZGVSZW5kZXIoKSB7Ci0gICAgICAgICAgICB0ZXh0U2VsZWN0aW9uQ29sb3IgPSBVSU1hbmFnZXIuZ2V0RGVmYXVsdHMoKS5nZXRDb2xvcigiVHJlZS5zZWxlY3Rpb25Gb3JlZ3JvdW5kIik7Ci0gICAgICAgICAgICB0ZXh0Tm9uU2VsZWN0aW9uQ29sb3IgPSBVSU1hbmFnZXIuZ2V0RGVmYXVsdHMoKS5nZXRDb2xvcigiVHJlZS50ZXh0Rm9yZWdyb3VuZCIpOwotICAgICAgICAgICAgYmFja2dyb3VuZFNlbGVjdGlvbkNvbG9yID0gVUlNYW5hZ2VyLmdldERlZmF1bHRzKCkuZ2V0Q29sb3IoIlRyZWUuc2VsZWN0aW9uQmFja2dyb3VuZCIpOwotICAgICAgICAgICAgYmFja2dyb3VuZE5vblNlbGVjdGlvbkNvbG9yID0gVUlNYW5hZ2VyLmdldERlZmF1bHRzKCkuZ2V0Q29sb3IoIlRyZWUudGV4dEJhY2tncm91bmQiKTsKLQotICAgICAgICAgICAgSW5zZXRzIG1hcmdpbnMgPSBVSU1hbmFnZXIuZ2V0RGVmYXVsdHMoKS5nZXRJbnNldHMoIlRyZWUucmVuZGVyZXJNYXJnaW5zIik7Ci0gICAgICAgICAgICBpZiAobWFyZ2lucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcihtYXJnaW5zLnRvcCwgbWFyZ2lucy5sZWZ0LCBtYXJnaW5zLmJvdHRvbSwgbWFyZ2lucy5yaWdodCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUcmVlIHRyZWUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWwsIGJvb2xlYW4gZXhwYW5kZWQsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsZWFmLCBpbnQgcm93LCBib29sZWFuIGhhc0ZvY3VzKSB7Ci0KLSAgICAgICAgICAgIGlmIChzZWwpIHsKLSAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKHRleHRTZWxlY3Rpb25Db2xvcik7Ci0gICAgICAgICAgICAgICAgc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kU2VsZWN0aW9uQ29sb3IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKHRleHROb25TZWxlY3Rpb25Db2xvcik7Ci0gICAgICAgICAgICAgICAgc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kTm9uU2VsZWN0aW9uQ29sb3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUZXN0VHJlZU5vZGUpIHsKLSAgICAgICAgICAgICAgICBUZXN0VHJlZU5vZGUgbm9kZSA9IChUZXN0VHJlZU5vZGUpIHZhbHVlOwotICAgICAgICAgICAgICAgIHNldFRleHQobm9kZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkKG5vZGUuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIHNldFRvb2xUaXBUZXh0KG5vZGUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFRleHQodmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgc2V0VG9vbFRpcFRleHQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmV2YWxpZGF0ZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcGFpbnQobG9uZyB0bSwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcGFpbnQoUmVjdGFuZ2xlIHIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcGFpbnQoKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0VHJlZU5vZGVFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdENlbGxFZGl0b3IgaW1wbGVtZW50cyBUcmVlQ2VsbEVkaXRvciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgVGVzdFRyZWVOb2RlUmVuZGVyIGxhc3RPYmplY3Q7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2VsbEVkaXRvclZhbHVlKCkgewotICAgICAgICAgICAgcmV0dXJuIGxhc3RPYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbXBvbmVudCBnZXRUcmVlQ2VsbEVkaXRvckNvbXBvbmVudChKVHJlZSB0cmVlLCBmaW5hbCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gaXNTZWxlY3RlZCwKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4cGFuZGVkLCBib29sZWFuIGxlYWYsIGludCByb3cpIHsKLQotICAgICAgICAgICAgbGFzdE9iamVjdCA9IG5ldyBUZXN0VHJlZU5vZGVSZW5kZXIoKTsKLSAgICAgICAgICAgIGxhc3RPYmplY3QuZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudCh0cmVlLCB2YWx1ZSwgdHJ1ZSwgZXhwYW5kZWQsIGxlYWYsIHJvdywgZmFsc2UpOwotICAgICAgICAgICAgbGFzdE9iamVjdC5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBpdGVtRXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgKChUZXN0VHJlZU5vZGUpIHZhbHVlKS5zZXRFbmFibGVkKCgoSkNoZWNrQm94KSBpdGVtRXZlbnQuZ2V0SXRlbSgpKS5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgICAgICAgICBmaXJlRWRpdGluZ1N0b3BwZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgcmV0dXJuIGxhc3RPYmplY3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRja1J1bkRpYWxvZyBleHRlbmRzIEpEaWFsb2cgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFRja1Rhc2sgdGFzazsKLQotICAgICAgICBwdWJsaWMgVGNrUnVuRGlhbG9nKCkgewotICAgICAgICAgICAgc3VwZXIob3duZXIsICJUQ0siKTsKLQotICAgICAgICAgICAgY3JlYXRlR1VJKCk7Ci0KLSAgICAgICAgICAgIHRhc2sgPSBuZXcgVGNrVGFzayh0aGlzLCBydW5uZXIpOwotICAgICAgICAgICAgdGFzay5leGVjdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDUwMCwgMjAwKSk7Ci0gICAgICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDUwMCwgMjAwKSk7Ci0KLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCi0gICAgICAgICAgICBKUGFuZWwgcHJvZ3Jlc3NQYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHByb2dyZXNzUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQocHJvZ3Jlc3NQYW5lbCwgQm94TGF5b3V0LllfQVhJUykpOwotICAgICAgICAgICAgcHJvZ3Jlc3NQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7Ci0KLSAgICAgICAgICAgIHByb2dyZXNzUGFuZWwuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigwLCAxMCkpKTsKLQotICAgICAgICAgICAgSkxhYmVsIGdyb3Vwc0xhYmVsID0gbmV3IEpMYWJlbCgiR3JvdXBzOiIpOwotICAgICAgICAgICAgZ3JvdXBzTGFiZWwuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOwotICAgICAgICAgICAgcHJvZ3Jlc3NQYW5lbC5hZGQoZ3JvdXBzTGFiZWwpOwotCi0gICAgICAgICAgICBncm91cHNQcm9ncmVzc0JhciA9IG5ldyBKUHJvZ3Jlc3NCYXIoKTsKLSAgICAgICAgICAgIGdyb3Vwc1Byb2dyZXNzQmFyLnNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oNTAwLCAzMCkpOwotICAgICAgICAgICAgZ3JvdXBzUHJvZ3Jlc3NCYXIuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDUwMCwgMzApKTsKLSAgICAgICAgICAgIGdyb3Vwc1Byb2dyZXNzQmFyLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oU2hvcnQuTUFYX1ZBTFVFLCAzMCkpOwotICAgICAgICAgICAgZ3JvdXBzUHJvZ3Jlc3NCYXIuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOwotICAgICAgICAgICAgZ3JvdXBzUHJvZ3Jlc3NCYXIuc2V0QWxpZ25tZW50WShDb21wb25lbnQuQ0VOVEVSX0FMSUdOTUVOVCk7Ci0gICAgICAgICAgICBwcm9ncmVzc1BhbmVsLmFkZChncm91cHNQcm9ncmVzc0Jhcik7Ci0KLSAgICAgICAgICAgIHByb2dyZXNzUGFuZWwuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigwLCAxMCkpKTsKLQotICAgICAgICAgICAgSkxhYmVsIHRlc3RzTGFiZWwgPSBuZXcgSkxhYmVsKCJUZXN0czoiKTsKLSAgICAgICAgICAgIHRlc3RzTGFiZWwuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOwotICAgICAgICAgICAgcHJvZ3Jlc3NQYW5lbC5hZGQodGVzdHNMYWJlbCk7Ci0KLSAgICAgICAgICAgIHRlc3RzUHJvZ3Jlc3NCYXIgPSBuZXcgSlByb2dyZXNzQmFyKCk7Ci0gICAgICAgICAgICB0ZXN0c1Byb2dyZXNzQmFyLnNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24oNTAwLCAzMCkpOwotICAgICAgICAgICAgdGVzdHNQcm9ncmVzc0Jhci5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oNTAwLCAzMCkpOwotICAgICAgICAgICAgdGVzdHNQcm9ncmVzc0Jhci5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKFNob3J0Lk1BWF9WQUxVRSwgMzApKTsKLSAgICAgICAgICAgIHRlc3RzUHJvZ3Jlc3NCYXIuc2V0QWxpZ25tZW50WChDb21wb25lbnQuTEVGVF9BTElHTk1FTlQpOwotICAgICAgICAgICAgdGVzdHNQcm9ncmVzc0Jhci5zZXRBbGlnbm1lbnRZKENvbXBvbmVudC5DRU5URVJfQUxJR05NRU5UKTsKLSAgICAgICAgICAgIHByb2dyZXNzUGFuZWwuYWRkKHRlc3RzUHJvZ3Jlc3NCYXIpOwotCi0gICAgICAgICAgICBwcm9ncmVzc1BhbmVsLmFkZChCb3guY3JlYXRlUmlnaWRBcmVhKG5ldyBEaW1lbnNpb24oMCwgMTApKSk7Ci0KLSAgICAgICAgICAgIHN0YXR1c0xhYmVsID0gbmV3IEpMYWJlbCgpOwotICAgICAgICAgICAgcHJvZ3Jlc3NQYW5lbC5hZGQoc3RhdHVzTGFiZWwpOwotCi0gICAgICAgICAgICBhZGQocHJvZ3Jlc3NQYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgICAgIEpCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oIkNhbmNlbCIpOwotICAgICAgICAgICAgY2FuY2VsQnV0dG9uLnNldERlZmF1bHRDYXBhYmxlKHRydWUpOwotICAgICAgICAgICAgY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEpQYW5lbCBjYW5jZWxCdXR0b25QYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIGNhbmNlbEJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGNhbmNlbEJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuUEFHRV9BWElTKSk7Ci0gICAgICAgICAgICBjYW5jZWxCdXR0b25QYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigwLCAzLCAzLCAzKSk7Ci0gICAgICAgICAgICBjYW5jZWxCdXR0b24uc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsIDMwKSk7Ci0gICAgICAgICAgICBjYW5jZWxCdXR0b25QYW5lbC5hZGQoY2FuY2VsQnV0dG9uKTsKLQotICAgICAgICAgICAgYWRkKGNhbmNlbEJ1dHRvblBhbmVsLCBCb3JkZXJMYXlvdXQuUEFHRV9FTkQpOwotCi0gICAgICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY2FuY2VsQnV0dG9uKTsKLQotICAgICAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5ESVNQT1NFX09OX0NMT1NFKTsKLSAgICAgICAgICAgIHBhY2soKTsKLSAgICAgICAgICAgIHNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICAgICAgICAgIHNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUY2tEaWFsb2dSdW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFJ1bm5lciB7Ci0gICAgICAgIHB1YmxpYyBUY2tEaWFsb2dSdW5uZXIoQ2xpZW50TW9kZWwgbW9kZWwsIFRja0RpYWxvZyB0Y2tEaWFsb2cpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPihtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb25QYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoU2Vzc2lvblBhcmFtZXRlci5SRVBPU0lUT1JZX0lELCBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmdldFJlcG9zaXRvcnlJbmZvKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldElkKCkpOwotCi0gICAgICAgICAgICBzZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBEaWFsb2dQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBDbWlzVGVzdFByb2dyZXNzTW9uaXRvciB7Ci0KLSAgICAgICAgcHVibGljIERpYWxvZ1Byb2dyZXNzTW9uaXRvcihpbnQgbnVtYmVyT2ZHcm91cHMpIHsKLSAgICAgICAgICAgIGdyb3Vwc1Byb2dyZXNzQmFyLnNldFN0cmluZ1BhaW50ZWQodHJ1ZSk7Ci0gICAgICAgICAgICBncm91cHNQcm9ncmVzc0Jhci5zZXRNaW5pbXVtKDApOwotICAgICAgICAgICAgZ3JvdXBzUHJvZ3Jlc3NCYXIuc2V0TWF4aW11bShudW1iZXJPZkdyb3Vwcyk7Ci0gICAgICAgICAgICBncm91cHNQcm9ncmVzc0Jhci5zZXRWYWx1ZSgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0R3JvdXAoQ21pc1Rlc3RHcm91cCBncm91cCkgewotICAgICAgICAgICAgZ3JvdXBzUHJvZ3Jlc3NCYXIuc2V0U3RyaW5nKGdyb3VwLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIHRlc3RzUHJvZ3Jlc3NCYXIuc2V0U3RyaW5nUGFpbnRlZCh0cnVlKTsKLSAgICAgICAgICAgIHRlc3RzUHJvZ3Jlc3NCYXIuc2V0TWluaW11bSgwKTsKLSAgICAgICAgICAgIHRlc3RzUHJvZ3Jlc3NCYXIuc2V0TWF4aW11bShncm91cC5nZXRUZXN0cygpLnNpemUoKSk7Ci0gICAgICAgICAgICB0ZXN0c1Byb2dyZXNzQmFyLnNldFZhbHVlKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZW5kR3JvdXAoQ21pc1Rlc3RHcm91cCBncm91cCkgewotICAgICAgICAgICAgZ3JvdXBzUHJvZ3Jlc3NCYXIuc2V0U3RyaW5nKCIiKTsKLSAgICAgICAgICAgIGdyb3Vwc1Byb2dyZXNzQmFyLnNldFZhbHVlKGdyb3Vwc1Byb2dyZXNzQmFyLmdldFZhbHVlKCkgKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChDbWlzVGVzdCB0ZXN0KSB7Ci0gICAgICAgICAgICB0ZXN0c1Byb2dyZXNzQmFyLnNldFN0cmluZyh0ZXN0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KENtaXNUZXN0IHRlc3QpIHsKLSAgICAgICAgICAgIHRlc3RzUHJvZ3Jlc3NCYXIuc2V0U3RyaW5nKCIiKTsKLSAgICAgICAgICAgIHRlc3RzUHJvZ3Jlc3NCYXIuc2V0VmFsdWUodGVzdHNQcm9ncmVzc0Jhci5nZXRWYWx1ZSgpICsgMSk7Ci0KLSAgICAgICAgICAgIGZvciAoQ21pc1Rlc3RSZXN1bHQgdHIgOiB0ZXN0LmdldFJlc3VsdHMoKSkgewotICAgICAgICAgICAgICAgIGludCB4ID0gc3RhdHVzLmdldCh0ci5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLnB1dCh0ci5nZXRTdGF0dXMoKSwgeCArIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIjxodG1sPiIpOwotICAgICAgICAgICAgaW50IHg7Ci0KLSAgICAgICAgICAgIHggPSBzdGF0dXMuZ2V0KENtaXNUZXN0UmVzdWx0U3RhdHVzLklORk8pOwotICAgICAgICAgICAgaWYgKHggPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI8Zm9udCBjb2xvcj0nIzAwMDAwMCc+W0luZm86ICIgKyB4ICsgIl08L2ZvbnQ+ICAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeCA9IHN0YXR1cy5nZXQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuU0tJUFBFRCk7Ci0gICAgICAgICAgICBpZiAoeCA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxmb250IGNvbG9yPScjNDQ0NDQ0Jz5bU2tpcHBlZDogIiArIHggKyAiXTwvZm9udD4gICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4ID0gc3RhdHVzLmdldChDbWlzVGVzdFJlc3VsdFN0YXR1cy5PSyk7Ci0gICAgICAgICAgICBpZiAoeCA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxmb250IGNvbG9yPScjMDA5OTAwJz5bT2s6ICIgKyB4ICsgIl08L2ZvbnQ+ICAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeCA9IHN0YXR1cy5nZXQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuV0FSTklORyk7Ci0gICAgICAgICAgICBpZiAoeCA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxmb250IGNvbG9yPScjOTk5OTAwJz5bV2FybmluZzogIiArIHggKyAiXTwvZm9udD4gICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4ID0gc3RhdHVzLmdldChDbWlzVGVzdFJlc3VsdFN0YXR1cy5GQUlMVVJFKTsKLSAgICAgICAgICAgIGlmICh4ID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGZvbnQgY29sb3I9JyM5OTYwMDAnPltGYWlsdXJlOiAiICsgeCArICJdPC9mb250PiAgIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHggPSBzdGF0dXMuZ2V0KENtaXNUZXN0UmVzdWx0U3RhdHVzLlVORVhQRUNURURfRVhDRVBUSU9OKTsKLSAgICAgICAgICAgIGlmICh4ID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGZvbnQgY29sb3I9JyM5OTAwMDAnPltFeGNlcHRpb246ICIgKyB4ICsgIl08L2ZvbnQ+ICAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2IuYXBwZW5kKCI8L2h0bWw+Iik7Ci0KLSAgICAgICAgICAgIHN0YXR1c0xhYmVsLnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlKFN0cmluZyBtc2cpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIFRja1Rhc2sgZXh0ZW5kcyBTd2luZ1dvcmtlcjxWb2lkLCBWb2lkPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSkRpYWxvZyBkaWFsb2c7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVGNrRGlhbG9nUnVubmVyIHJ1bm5lcjsKLQotICAgICAgICBwdWJsaWMgVGNrVGFzayhKRGlhbG9nIGRpYWxvZywgVGNrRGlhbG9nUnVubmVyIHJ1bm5lcikgewotICAgICAgICAgICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7Ci0gICAgICAgICAgICB0aGlzLnJ1bm5lciA9IHJ1bm5lcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVm9pZCBkb0luQmFja2dyb3VuZCgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcnVubmVyLnJ1bihuZXcgRGlhbG9nUHJvZ3Jlc3NNb25pdG9yKHJ1bm5lci5nZXRHcm91cHMoKS5zaXplKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICAgICAgcnVubmVyLmNhbmNlbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3dNZXNzYWdlRGlhbG9nKG93bmVyLCAiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSwgIlRDSyBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBkb25lKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTd2luZ1JlcG9ydCByZXBvcnQgPSBuZXcgU3dpbmdSZXBvcnQobnVsbCwgNzAwLCA1MDApOwotICAgICAgICAgICAgICAgIHJlcG9ydC5jcmVhdGVSZXBvcnQocnVubmVyLmdldFBhcmFtZXRlcnMoKSwgcnVubmVyLmdldEdyb3VwcygpLCAoV3JpdGVyKSBudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cob3duZXIsICJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCAiUmVwb3J0IEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1R5cGVTcGxpdFBhbmUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9UeXBlU3BsaXRQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZTQ4M2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1R5cGVTcGxpdFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBvcHVwTWVudTsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3BsaXRQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5UYWJsZUNvbHVtbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLkRvY3VtZW50VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5Qcm9wZXJ0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kZWZpbml0aW9ucy5SZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkNvbGxlY3Rpb25SZW5kZXJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmcuSW5mb1BhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5ZZXNOb0xhYmVsOwotCi1wdWJsaWMgY2xhc3MgVHlwZVNwbGl0UGFuZSBleHRlbmRzIEpTcGxpdFBhbmUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBUeXBlSW5mb1BhbmVsIHR5cGVQYW5lbDsKLQotICAgIHByaXZhdGUgUHJvcGVydHlEZWZpbml0aW9uVGFibGUgcHJvcGVydHlEZWZpbml0aW9uVGFibGU7Ci0KLSAgICBwdWJsaWMgVHlwZVNwbGl0UGFuZShDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcihKU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElUKTsKLQotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0KLSAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsaWVudE1vZGVsIGdldENsaWVudE1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgdHlwZVBhbmVsID0gbmV3IFR5cGVJbmZvUGFuZWwobW9kZWwpOwotCi0gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvblRhYmxlID0gbmV3IFByb3BlcnR5RGVmaW5pdGlvblRhYmxlKCk7Ci0KLSAgICAgICAgYWRkKHR5cGVQYW5lbCk7Ci0KLSAgICAgICAgc2V0TGVmdENvbXBvbmVudChuZXcgSlNjcm9sbFBhbmUodHlwZVBhbmVsKSk7Ci0gICAgICAgIHNldFJpZ2h0Q29tcG9uZW50KG5ldyBKU2Nyb2xsUGFuZShwcm9wZXJ0eURlZmluaXRpb25UYWJsZSkpOwotCi0gICAgICAgIHNldERpdmlkZXJMb2NhdGlvbigzMDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoT2JqZWN0VHlwZSB0eXBlKSB7Ci0gICAgICAgIHR5cGVQYW5lbC5zZXRUeXBlKHR5cGUpOwotICAgICAgICBwcm9wZXJ0eURlZmluaXRpb25UYWJsZS5zZXRUeXBlKHR5cGUpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBUeXBlSW5mb1BhbmVsIGV4dGVuZHMgSW5mb1BhbmVsIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwcml2YXRlIEpUZXh0RmllbGQgbmFtZUZpZWxkOwotICAgICAgICBwcml2YXRlIEpUZXh0RmllbGQgZGVzY3JpcHRpb25GaWVsZDsKLSAgICAgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGlkRmllbGQ7Ci0gICAgICAgIHByaXZhdGUgSlRleHRGaWVsZCBsb2NhbE5hbWVzcGFjZUZpZWxkOwotICAgICAgICBwcml2YXRlIEpUZXh0RmllbGQgbG9jYWxOYW1lRmllbGQ7Ci0gICAgICAgIHByaXZhdGUgSlRleHRGaWVsZCBxdWVyeU5hbWVGaWVsZDsKLSAgICAgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGJhc2VUeXBlRmllbGQ7Ci0gICAgICAgIHByaXZhdGUgWWVzTm9MYWJlbCBjcmVhdGFibGVMYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBZZXNOb0xhYmVsIGZpbGVhYmxlTGFiZWw7Ci0gICAgICAgIHByaXZhdGUgWWVzTm9MYWJlbCBxdWVyeWFibGVMYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBZZXNOb0xhYmVsIGluY2x1ZGVJblN1cGVyVHlwZUxhYmVsOwotICAgICAgICBwcml2YXRlIFllc05vTGFiZWwgZnVsbHRleHRJbmRleGVkTGFiZWw7Ci0gICAgICAgIHByaXZhdGUgWWVzTm9MYWJlbCBhY2xMYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBZZXNOb0xhYmVsIHBvbGljeUxhYmVsOwotICAgICAgICBwcml2YXRlIFllc05vTGFiZWwgdmVyc2lvbmFibGVMYWJlbDsKLSAgICAgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGNvbnRlbnRTdHJlYW1BbGxvd2VkRmllbGQ7Ci0gICAgICAgIHByaXZhdGUgSlRleHRGaWVsZCBhbGxvd2VkU291cmNlVHlwZXNGaWVsZDsKLSAgICAgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGFsbG93ZWRUYXJnZXRUeXBlc0ZpZWxkOwotICAgICAgICBwcml2YXRlIEpUZXh0RmllbGQgdHlwZU11dGFiaWxpdHlGaWVsZDsKLQotICAgICAgICBwdWJsaWMgVHlwZUluZm9QYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICAgICAgc3VwZXIobW9kZWwpOwotICAgICAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKE9iamVjdFR5cGUgdHlwZSkgewotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5hbWVGaWVsZC5zZXRUZXh0KHR5cGUuZ2V0RGlzcGxheU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25GaWVsZC5zZXRUZXh0KHR5cGUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgaWRGaWVsZC5zZXRUZXh0KHR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgbG9jYWxOYW1lc3BhY2VGaWVsZC5zZXRUZXh0KHR5cGUuZ2V0TG9jYWxOYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgbG9jYWxOYW1lRmllbGQuc2V0VGV4dCh0eXBlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBxdWVyeU5hbWVGaWVsZC5zZXRUZXh0KHR5cGUuZ2V0UXVlcnlOYW1lKCkpOwotICAgICAgICAgICAgICAgIGJhc2VUeXBlRmllbGQuc2V0VGV4dCh0eXBlLmdldEJhc2VUeXBlSWQoKS52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBjcmVhdGFibGVMYWJlbC5zZXRWYWx1ZShpcyh0eXBlLmlzQ3JlYXRhYmxlKCkpKTsKLSAgICAgICAgICAgICAgICBmaWxlYWJsZUxhYmVsLnNldFZhbHVlKGlzKHR5cGUuaXNGaWxlYWJsZSgpKSk7Ci0gICAgICAgICAgICAgICAgcXVlcnlhYmxlTGFiZWwuc2V0VmFsdWUoaXModHlwZS5pc1F1ZXJ5YWJsZSgpKSk7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZUluU3VwZXJUeXBlTGFiZWwuc2V0VmFsdWUoaXModHlwZS5pc0luY2x1ZGVkSW5TdXBlcnR5cGVRdWVyeSgpKSk7Ci0gICAgICAgICAgICAgICAgZnVsbHRleHRJbmRleGVkTGFiZWwuc2V0VmFsdWUoaXModHlwZS5pc0Z1bGx0ZXh0SW5kZXhlZCgpKSk7Ci0gICAgICAgICAgICAgICAgYWNsTGFiZWwuc2V0VmFsdWUoaXModHlwZS5pc0NvbnRyb2xsYWJsZUFjbCgpKSk7Ci0gICAgICAgICAgICAgICAgcG9saWN5TGFiZWwuc2V0VmFsdWUoaXModHlwZS5pc0NvbnRyb2xsYWJsZVBvbGljeSgpKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZS5nZXRUeXBlTXV0YWJpbGl0eSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHModHlwZS5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhbkNyZWF0ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJjcmVhdGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKHR5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKS5jYW5VcGRhdGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInVwZGF0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHModHlwZS5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhbkRlbGV0ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiZGVsZXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0eXBlTXV0YWJpbGl0eUZpZWxkLnNldFRleHQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZU11dGFiaWxpdHlGaWVsZC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIERvY3VtZW50VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlRGVmaW5pdGlvbiBkb2NUeXBlID0gKERvY3VtZW50VHlwZURlZmluaXRpb24pIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25hYmxlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmFibGVMYWJlbC5zZXRWYWx1ZShpcyhkb2NUeXBlLmlzVmVyc2lvbmFibGUoKSkpOwotICAgICAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtQWxsb3dlZEZpZWxkLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW1BbGxvd2VkRmllbGQuc2V0VGV4dChkb2NUeXBlLmdldENvbnRlbnRTdHJlYW1BbGxvd2VkKCkgPT0gbnVsbCA/ICI/Pz8iIDogZG9jVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb250ZW50U3RyZWFtQWxsb3dlZCgpLnZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25hYmxlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRTdHJlYW1BbGxvd2VkRmllbGQuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICBSZWxhdGlvbnNoaXBUeXBlRGVmaW5pdGlvbiByZWxhdGlvbnNoaXBUeXBlID0gKFJlbGF0aW9uc2hpcFR5cGVEZWZpbml0aW9uKSB0eXBlOwotICAgICAgICAgICAgICAgICAgICBhbGxvd2VkU291cmNlVHlwZXNGaWVsZC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBhbGxvd2VkU291cmNlVHlwZXNGaWVsZC5zZXRUZXh0KHJlbGF0aW9uc2hpcFR5cGUuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKSA9PSBudWxsID8gIj8/PyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlbGF0aW9uc2hpcFR5cGUuZ2V0QWxsb3dlZFNvdXJjZVR5cGVJZHMoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFRhcmdldFR5cGVzRmllbGQuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFRhcmdldFR5cGVzRmllbGQuc2V0VGV4dChyZWxhdGlvbnNoaXBUeXBlLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkgPT0gbnVsbCA/ICI/Pz8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWxhdGlvbnNoaXBUeXBlLmdldEFsbG93ZWRUYXJnZXRUeXBlSWRzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFNvdXJjZVR5cGVzRmllbGQuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRUYXJnZXRUeXBlc0ZpZWxkLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmFtZUZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgaWRGaWVsZC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICBsb2NhbE5hbWVzcGFjZUZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIGxvY2FsTmFtZUZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIHF1ZXJ5TmFtZUZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIGJhc2VUeXBlRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgY3JlYXRhYmxlTGFiZWwuc2V0VmFsdWUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGZpbGVhYmxlTGFiZWwuc2V0VmFsdWUoZmFsc2UpOwotICAgICAgICAgICAgICAgIHF1ZXJ5YWJsZUxhYmVsLnNldFZhbHVlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlSW5TdXBlclR5cGVMYWJlbC5zZXRWYWx1ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZnVsbHRleHRJbmRleGVkTGFiZWwuc2V0VmFsdWUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGFjbExhYmVsLnNldFZhbHVlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBwb2xpY3lMYWJlbC5zZXRWYWx1ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbmFibGVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjb250ZW50U3RyZWFtQWxsb3dlZEZpZWxkLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGFsbG93ZWRTb3VyY2VUeXBlc0ZpZWxkLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGFsbG93ZWRUYXJnZXRUeXBlc0ZpZWxkLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIHR5cGVNdXRhYmlsaXR5RmllbGQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldmFsaWRhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgICAgICBzZXR1cEdVSSgpOwotCi0gICAgICAgICAgICBuYW1lRmllbGQgPSBhZGRMaW5lKCJOYW1lOiIsIHRydWUpOwotICAgICAgICAgICAgZGVzY3JpcHRpb25GaWVsZCA9IGFkZExpbmUoIkRlc2NyaXB0aW9uOiIpOwotICAgICAgICAgICAgaWRGaWVsZCA9IGFkZExpbmUoIklkOiIpOwotICAgICAgICAgICAgbG9jYWxOYW1lc3BhY2VGaWVsZCA9IGFkZExpbmUoIkxvY2FsIE5hbWVzcGFjZToiKTsKLSAgICAgICAgICAgIGxvY2FsTmFtZUZpZWxkID0gYWRkTGluZSgiTG9jYWwgTmFtZToiKTsKLSAgICAgICAgICAgIHF1ZXJ5TmFtZUZpZWxkID0gYWRkTGluZSgiUXVlcnkgTmFtZToiKTsKLSAgICAgICAgICAgIGJhc2VUeXBlRmllbGQgPSBhZGRMaW5lKCJCYXNlIFR5cGU6Iik7Ci0gICAgICAgICAgICBjcmVhdGFibGVMYWJlbCA9IGFkZFllc05vTGFiZWwoIkNyZWF0YWJsZToiKTsKLSAgICAgICAgICAgIGZpbGVhYmxlTGFiZWwgPSBhZGRZZXNOb0xhYmVsKCJGaWxlYWJsZToiKTsKLSAgICAgICAgICAgIHF1ZXJ5YWJsZUxhYmVsID0gYWRkWWVzTm9MYWJlbCgiUXVlcnlhYmxlOiIpOwotICAgICAgICAgICAgaW5jbHVkZUluU3VwZXJUeXBlTGFiZWwgPSBhZGRZZXNOb0xhYmVsKCJJbmNsdWRlZCBpbiBzdXBlciB0eXBlIHF1ZXJpZXM6Iik7Ci0gICAgICAgICAgICBmdWxsdGV4dEluZGV4ZWRMYWJlbCA9IGFkZFllc05vTGFiZWwoIkZ1bGwgdGV4dCBpbmRleGVkOiIpOwotICAgICAgICAgICAgYWNsTGFiZWwgPSBhZGRZZXNOb0xhYmVsKCJBQ0wgY29udHJvbGFibGU6Iik7Ci0gICAgICAgICAgICBwb2xpY3lMYWJlbCA9IGFkZFllc05vTGFiZWwoIlBvbGljeSBjb250cm9sYWJsZToiKTsKLSAgICAgICAgICAgIHR5cGVNdXRhYmlsaXR5RmllbGQgPSBhZGRMaW5lKCJUeXBlIG11dGFiaWxpdHk6Iik7Ci0gICAgICAgICAgICB2ZXJzaW9uYWJsZUxhYmVsID0gYWRkWWVzTm9MYWJlbCgiVmVyc2lvbmFibGU6Iik7Ci0gICAgICAgICAgICBjb250ZW50U3RyZWFtQWxsb3dlZEZpZWxkID0gYWRkTGluZSgiQ29udGVudCBzdHJlYW0gYWxsb3dlZDoiKTsKLSAgICAgICAgICAgIGFsbG93ZWRTb3VyY2VUeXBlc0ZpZWxkID0gYWRkTGluZSgiQWxsb3dlZCBzb3VyY2UgdHlwZXM6Iik7Ci0gICAgICAgICAgICBhbGxvd2VkVGFyZ2V0VHlwZXNGaWVsZCA9IGFkZExpbmUoIkFsbG93ZWQgdGFyZ2V0IHR5cGVzOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzKEJvb2xlYW4gYikgewotICAgICAgICAgICAgaWYgKGIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUHJvcGVydHlEZWZpbml0aW9uVGFibGUgZXh0ZW5kcyBKVGFibGUgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTl9OQU1FUyA9IHsgIk5hbWUiLCAiSWQiLCAiRGVzY3JpcHRpb24iLCAiTG9jYWwgTmFtZXNwYWNlIiwgIkxvY2FsIE5hbWUiLAotICAgICAgICAgICAgICAgICJRdWVyeSBOYW1lIiwgIlR5cGUiLCAiQ2FyZGluYWxpdHkiLCAiVXBkYXRhYmlsaXR5IiwgIlF1ZXJ5YWJsZSIsICJPcmRlcmFibGUiLCAiUmVxdWlyZWQiLCAiSW5oZXJpdGVkIiwKLSAgICAgICAgICAgICAgICAiRGVmYXVsdCBWYWx1ZSIsICJPcGVuIENob2ljZSIsICJDaG9pY2VzIiB9OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDT0xVTU5fV0lEVEhTID0geyAyMDAsIDIwMCwgMjAwLCAyMDAsIDIwMCwgMjAwLCA4MCwgODAsIDgwLCA1MCwgNTAsIDUwLCA1MCwgMjAwLCA1MCwKLSAgICAgICAgICAgICAgICAyMDAgfTsKLQotICAgICAgICBwcml2YXRlIE9iamVjdFR5cGUgdHlwZTsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5RGVmaW5pdGlvbjw/Pj4gcHJvcGVydHlEZWZpbnRpb25zOwotCi0gICAgICAgIHB1YmxpYyBQcm9wZXJ0eURlZmluaXRpb25UYWJsZSgpIHsKLSAgICAgICAgICAgIHNldERlZmF1bHRSZW5kZXJlcihDb2xsZWN0aW9uLmNsYXNzLCBuZXcgQ29sbGVjdGlvblJlbmRlcmVyKCkpOwotICAgICAgICAgICAgc2V0TW9kZWwobmV3IFByb3BlcnR5RGVmaW5pdGlvblRhYmxlTW9kZWwodGhpcykpOwotCi0gICAgICAgICAgICBzZXRBdXRvUmVzaXplTW9kZShBVVRPX1JFU0laRV9PRkYpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPTFVNTl9XSURUSFMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihpKTsKLSAgICAgICAgICAgICAgICBjb2x1bW4uc2V0UHJlZmVycmVkV2lkdGgoQ09MVU1OX1dJRFRIU1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIEpQb3B1cE1lbnUgcG9wdXAgPSBuZXcgSlBvcHVwTWVudSgpOwotICAgICAgICAgICAgSk1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiQ29weSB0byBjbGlwYm9hcmQiKTsKLSAgICAgICAgICAgIHBvcHVwLmFkZChtZW51SXRlbSk7Ci0KLSAgICAgICAgICAgIG1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuY29weVRhYmxlVG9DbGlwYm9hcmQoUHJvcGVydHlEZWZpbml0aW9uVGFibGUudGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heWJlU2hvd1BvcHVwKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heWJlU2hvd1BvcHVwKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBtYXliZVNob3dQb3B1cChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXNQb3B1cFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXAuc2hvdyhlLmdldENvbXBvbmVudCgpLCBlLmdldFgoKSwgZS5nZXRZKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHNldEZpbGxzVmlld3BvcnRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKE9iamVjdFR5cGUgdHlwZSkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLQotICAgICAgICAgICAgaWYgKCh0eXBlICE9IG51bGwpICYmICh0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHByb3BlcnR5RGVmaW50aW9ucyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEZWZpbml0aW9uPD8+PigpOwotICAgICAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eURlZmludGlvbnMuYWRkKHByb3BEZWYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvcGVydHlEZWZpbnRpb25zLCBuZXcgQ29tcGFyYXRvcjxQcm9wZXJ0eURlZmluaXRpb248Pz4+KCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkMSwgUHJvcGVydHlEZWZpbml0aW9uPD8+IHBkMikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkMS5nZXRJZCgpLmNvbXBhcmVUbyhwZDIuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlEZWZpbnRpb25zID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKChBYnN0cmFjdFRhYmxlTW9kZWwpIGdldE1vZGVsKCkpLmZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0VHlwZSBnZXRUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxQcm9wZXJ0eURlZmluaXRpb248Pz4+IGdldFByb3BlcnR5RGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlEZWZpbnRpb25zOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIGNsYXNzIFByb3BlcnR5RGVmaW5pdGlvblRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eURlZmluaXRpb25UYWJsZSB0YWJsZTsKLQotICAgICAgICAgICAgcHVibGljIFByb3BlcnR5RGVmaW5pdGlvblRhYmxlTW9kZWwoUHJvcGVydHlEZWZpbml0aW9uVGFibGUgdGFibGUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRhYmxlID0gdGFibGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ09MVU1OX05BTUVTW2NvbHVtbkluZGV4XTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ09MVU1OX05BTUVTLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFibGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmID0gdGFibGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpLmdldChyb3dJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcERlZi5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BEZWYuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGVmLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcERlZi5nZXRMb2NhbE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BEZWYuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcERlZi5nZXRRdWVyeU5hbWUoKTsKLSAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGVmLmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BEZWYuZ2V0Q2FyZGluYWxpdHkoKTsKLSAgICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGVmLmdldFVwZGF0YWJpbGl0eSgpOwotICAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BEZWYuaXNRdWVyeWFibGUoKTsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcERlZi5pc09yZGVyYWJsZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGVmLmlzUmVxdWlyZWQoKTsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcERlZi5pc0luaGVyaXRlZCgpOwotICAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGVmLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGVmLmlzT3BlbkNob2ljZSgpOwotICAgICAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wRGVmLmdldENob2ljZXMoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRDb2x1bW5DbGFzcyhpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGNvbHVtbkluZGV4ID09IDEzKSB8fCAoY29sdW1uSW5kZXggPT0gMTUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uLmNsYXNzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDb2x1bW5DbGFzcyhjb2x1bW5JbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvVHlwZXNGcmFtZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL1R5cGVzRnJhbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjNWNmZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvVHlwZXNGcmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2g7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTm90RW1wdHk7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JbWFnZUljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRmlsZUNob29zZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUG9wdXBNZW51OwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGxpdFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRvb2xCYXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdE11dGFibGVUcmVlTm9kZTsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlU2VsZWN0aW9uTW9kZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5UcmVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC51dGlsLlR5cGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQudXRpbC5UeXBlVXRpbHMuVmFsaWRhdGlvbkVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgVHlwZXNGcmFtZSBleHRlbmRzIEpGcmFtZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU5ET1dfVElUTEUgPSAiQ01JUyBUeXBlcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX1NBVkUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fVVBEQVRFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0RFTEVURSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9DUkVBVEUgPSAzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFJlcG9zaXRvcnlJbmZvIHJlcEluZm87Ci0gICAgcHJpdmF0ZSBPYmplY3RUeXBlIGN1cnJlbnRUeXBlOwotCi0gICAgcHJpdmF0ZSBKVG9vbEJhciB0b29sQmFyOwotICAgIHByaXZhdGUgSkJ1dHRvbltdIHRvb2xiYXJCdXR0b247Ci0gICAgcHJpdmF0ZSBKVHJlZSB0eXBlc1RyZWU7Ci0gICAgcHJpdmF0ZSBUeXBlU3BsaXRQYW5lIHR5cGVQYW5lbDsKLQotICAgIHB1YmxpYyBUeXBlc0ZyYW1lKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICByZXBJbmZvID0gbW9kZWwuZ2V0UmVwb3NpdG9yeUluZm8oKTsKLQotICAgICAgICBjcmVhdGVHVUkoKTsKLSAgICAgICAgbG9hZERhdGEoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICBzZXRUaXRsZShXSU5ET1dfVElUTEUgKyAiIC0gIiArIG1vZGVsLmdldFJlcG9zaXRvcnlOYW1lKCkpOwotCi0gICAgICAgIEltYWdlSWNvbiBpY29uID0gQ2xpZW50SGVscGVyLmdldEljb24oImljb24ucG5nIik7Ci0gICAgICAgIGlmIChpY29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldEljb25JbWFnZShpY29uLmdldEltYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDEwMDAsIDcwMCkpOwotICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDIwMCwgNjApKTsKLSAgICAgICAgc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0KLSAgICAgICAgdG9vbEJhciA9IG5ldyBKVG9vbEJhcigiQ01JUyBUeXBlcyBUb29sYmFyIiwgSlRvb2xCYXIuSE9SSVpPTlRBTCk7Ci0KLSAgICAgICAgdG9vbGJhckJ1dHRvbiA9IG5ldyBKQnV0dG9uWzRdOwotCi0gICAgICAgIEpNZW51SXRlbSBtZW51SXRlbTsKLQotICAgICAgICAvLyAtLSBzYXZlIC0tLQotICAgICAgICBmaW5hbCBKUG9wdXBNZW51IHNhdmVQb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0KLSAgICAgICAgbWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJTYXZlIFR5cGUgRGVmaW5pdGlvbiB0byBYTUwiKTsKLSAgICAgICAgc2F2ZVBvcHVwLmFkZChtZW51SXRlbSk7Ci0gICAgICAgIG1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSkZpbGVDaG9vc2VyIGZpbGVDaG9vc2VyID0gY3JlYXRlWG1sRmlsZUNob29zZXIoKTsKLSAgICAgICAgICAgICAgICBmaWxlQ2hvb3Nlci5zZXRTZWxlY3RlZEZpbGUobmV3IEZpbGUoZ2V0RmlsZW5hbWUoKSArICIueG1sIikpOwotCi0gICAgICAgICAgICAgICAgaW50IGNob29zZVJlc3VsdCA9IGZpbGVDaG9vc2VyLnNob3dEaWFsb2coZ2V0Um9vdFBhbmUoKSwgIlNhdmUgWE1MIik7Ci0gICAgICAgICAgICAgICAgaWYgKGNob29zZVJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVVdGlscy53cml0ZVRvWE1MKGN1cnJlbnRUeXBlLCBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IoZ2V0Um9vdFBhbmUoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiU2F2ZSBUeXBlIERlZmluaXRpb24gdG8gSlNPTiIpOwotICAgICAgICBzYXZlUG9wdXAuYWRkKG1lbnVJdGVtKTsKLSAgICAgICAgbWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBKRmlsZUNob29zZXIgZmlsZUNob29zZXIgPSBjcmVhdGVKc29uRmlsZUNob29zZXIoKTsKLSAgICAgICAgICAgICAgICBmaWxlQ2hvb3Nlci5zZXRTZWxlY3RlZEZpbGUobmV3IEZpbGUoZ2V0RmlsZW5hbWUoKSArICIuanNvbiIpKTsKLQotICAgICAgICAgICAgICAgIGludCBjaG9vc2VSZXN1bHQgPSBmaWxlQ2hvb3Nlci5zaG93RGlhbG9nKGdldFJvb3RQYW5lKCksICJTYXZlIEpTT04iKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hvb3NlUmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVV0aWxzLndyaXRlVG9KU09OKGN1cnJlbnRUeXBlLCBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IoZ2V0Um9vdFBhbmUoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1NBVkVdID0gbmV3IEpCdXR0b24oIlNhdmUgVHlwZSBEZWZpbml0aW9uIiwgQ2xpZW50SGVscGVyLmdldEljb24oInNhdmV0eXBlLnBuZyIpKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fU0FWRV0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBzYXZlUG9wdXAuc2hvdyh0b29sYmFyQnV0dG9uW0JVVFRPTl9TQVZFXSwgMCwgdG9vbGJhckJ1dHRvbltCVVRUT05fU0FWRV0uZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdG9vbEJhci5hZGQodG9vbGJhckJ1dHRvbltCVVRUT05fU0FWRV0pOwotCi0gICAgICAgIHRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0KLSAgICAgICAgLy8gLS0gdXBkYXRlIC0tCi0gICAgICAgIGZpbmFsIEpQb3B1cE1lbnUgdXBkYXRlUG9wdXAgPSBuZXcgSlBvcHVwTWVudSgpOwotICAgICAgICBtZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIkxvYWQgVHlwZSBEZWZpbml0aW9uIGZyb20gWE1MIik7Ci0gICAgICAgIHVwZGF0ZVBvcHVwLmFkZChtZW51SXRlbSk7Ci0gICAgICAgIG1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSkZpbGVDaG9vc2VyIGZpbGVDaG9vc2VyID0gY3JlYXRlWG1sRmlsZUNob29zZXIoKTsKLQotICAgICAgICAgICAgICAgIGludCBjaG9vc2VSZXN1bHQgPSBmaWxlQ2hvb3Nlci5zaG93RGlhbG9nKGdldFJvb3RQYW5lKCksICJMb2FkIFhNTCIpOwotICAgICAgICAgICAgICAgIGlmIChjaG9vc2VSZXN1bHQgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCAqIDEwMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IFR5cGVVdGlscy5yZWFkRnJvbVhNTChpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tUeXBlRGVmaW5pdGlvbih0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldENsaWVudFNlc3Npb24oKS5nZXRTZXNzaW9uKCkudXBkYXRlVHlwZSh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbG9hZERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IoZ2V0Um9vdFBhbmUoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiTG9hZCBUeXBlIERlZmluaXRpb24gZnJvbSBKU09OIik7Ci0gICAgICAgIHVwZGF0ZVBvcHVwLmFkZChtZW51SXRlbSk7Ci0gICAgICAgIG1lbnVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSkZpbGVDaG9vc2VyIGZpbGVDaG9vc2VyID0gY3JlYXRlSnNvbkZpbGVDaG9vc2VyKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgY2hvb3NlUmVzdWx0ID0gZmlsZUNob29zZXIuc2hvd0RpYWxvZyhnZXRSb290UGFuZSgpLCAiTG9hZCBKU09OIik7Ci0gICAgICAgICAgICAgICAgaWYgKGNob29zZVJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogMTAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUeXBlRGVmaW5pdGlvbiB0eXBlID0gVHlwZVV0aWxzLnJlYWRGcm9tSlNPTihpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tUeXBlRGVmaW5pdGlvbih0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldENsaWVudFNlc3Npb24oKS5nZXRTZXNzaW9uKCkudXBkYXRlVHlwZSh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbG9hZERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IoZ2V0Um9vdFBhbmUoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1VQREFURV0gPSBuZXcgSkJ1dHRvbigiVXBkYXRlIFR5cGUiLCBDbGllbnRIZWxwZXIuZ2V0SWNvbigidXBkYXRldHlwZS5wbmciKSk7Ci0gICAgICAgIHRvb2xiYXJCdXR0b25bQlVUVE9OX1VQREFURV0uc2V0RW5hYmxlZChyZXBJbmZvLmdldENtaXNWZXJzaW9uKCkgIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9VUERBVEVdLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUG9wdXAuc2hvdyh0b29sYmFyQnV0dG9uW0JVVFRPTl9VUERBVEVdLCAwLCB0b29sYmFyQnV0dG9uW0JVVFRPTl9VUERBVEVdLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRvb2xCYXIuYWRkKHRvb2xiYXJCdXR0b25bQlVUVE9OX1VQREFURV0pOwotCi0gICAgICAgIC8vIC0tIGRlbGV0ZSAtLQotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9ERUxFVEVdID0gbmV3IEpCdXR0b24oIkRlbGV0ZSBUeXBlIiwgQ2xpZW50SGVscGVyLmdldEljb24oImRlbGV0ZXR5cGUucG5nIikpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9ERUxFVEVdLnNldEVuYWJsZWQocmVwSW5mby5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fREVMRVRFXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGludCBhbnN3ZXIgPSBKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyhnZXRPd25lcigpLCAiRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGUgdHlwZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRUeXBlLmdldElkKCkgKyAiPyIsICJEZWxldGUgVHlwZSIsIEpPcHRpb25QYW5lLllFU19OT19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5XQVJOSU5HX01FU1NBR0UpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFuc3dlciA9PSBKT3B0aW9uUGFuZS5ZRVNfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmRlbGV0ZVR5cGUoY3VycmVudFR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKGdldFJvb3RQYW5lKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9hZERhdGEoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0b29sQmFyLmFkZCh0b29sYmFyQnV0dG9uW0JVVFRPTl9ERUxFVEVdKTsKLQotICAgICAgICB0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCi0gICAgICAgIC8vIC0tIGNyZWF0ZSAtLQotICAgICAgICBmaW5hbCBKUG9wdXBNZW51IGNyZWF0ZVBvcHVwID0gbmV3IEpQb3B1cE1lbnUoKTsKLSAgICAgICAgbWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJMb2FkIFR5cGUgRGVmaW5pdGlvbiBmcm9tIFhNTCIpOwotICAgICAgICBjcmVhdGVQb3B1cC5hZGQobWVudUl0ZW0pOwotICAgICAgICBtZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3NlciA9IGNyZWF0ZVhtbEZpbGVDaG9vc2VyKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgY2hvb3NlUmVzdWx0ID0gZmlsZUNob29zZXIuc2hvd0RpYWxvZyhnZXRSb290UGFuZSgpLCAiTG9hZCBYTUwiKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hvb3NlUmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQgKiAxMDI0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVEZWZpbml0aW9uIHR5cGUgPSBUeXBlVXRpbHMucmVhZEZyb21YTUwoaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrVHlwZURlZmluaXRpb24odHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmNyZWF0ZVR5cGUodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKGdldFJvb3RQYW5lKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBtZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIkxvYWQgVHlwZSBEZWZpbml0aW9uIGZyb20gSlNPTiIpOwotICAgICAgICBjcmVhdGVQb3B1cC5hZGQobWVudUl0ZW0pOwotICAgICAgICBtZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3NlciA9IGNyZWF0ZUpzb25GaWxlQ2hvb3NlcigpOwotCi0gICAgICAgICAgICAgICAgaW50IGNob29zZVJlc3VsdCA9IGZpbGVDaG9vc2VyLnNob3dEaWFsb2coZ2V0Um9vdFBhbmUoKSwgIkxvYWQgSlNPTiIpOwotICAgICAgICAgICAgICAgIGlmIChjaG9vc2VSZXN1bHQgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCAqIDEwMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZURlZmluaXRpb24gdHlwZSA9IFR5cGVVdGlscy5yZWFkRnJvbUpTT04oaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrVHlwZURlZmluaXRpb24odHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmNyZWF0ZVR5cGUodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKGdldFJvb3RQYW5lKCksIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DUkVBVEVdID0gbmV3IEpCdXR0b24oIkNyZWF0ZSBUeXBlIiwgQ2xpZW50SGVscGVyLmdldEljb24oIm5ld3R5cGUucG5nIikpOwotICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9DUkVBVEVdLnNldEVuYWJsZWQocmVwSW5mby5nZXRDbWlzVmVyc2lvbigpICE9IENtaXNWZXJzaW9uLkNNSVNfMV8wKTsKLSAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGNyZWF0ZVBvcHVwLnNob3codG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXSwgMCwgdG9vbGJhckJ1dHRvbltCVVRUT05fQ1JFQVRFXS5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0b29sQmFyLmFkZCh0b29sYmFyQnV0dG9uW0JVVFRPTl9DUkVBVEVdKTsKLQotICAgICAgICBhZGQodG9vbEJhciwgQm9yZGVyTGF5b3V0LlBBR0VfU1RBUlQpOwotCi0gICAgICAgIHR5cGVzVHJlZSA9IG5ldyBKVHJlZSgpOwotICAgICAgICB0eXBlc1RyZWUuc2V0Um9vdFZpc2libGUoZmFsc2UpOwotICAgICAgICB0eXBlc1RyZWUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3Rpb25Nb2RlKFRyZWVTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfVFJFRV9TRUxFQ1RJT04pOwotCi0gICAgICAgIHR5cGVzVHJlZS5hZGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIobmV3IFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChUcmVlU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSAoKEpUcmVlKSBlLmdldFNvdXJjZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldExhc3RTZWxlY3RlZFBhdGhDb21wb25lbnQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGN1cnJlbnRUeXBlID0gKChUeXBlTm9kZSkgbm9kZS5nZXRVc2VyT2JqZWN0KCkpLmdldFR5cGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXBJbmZvLmdldENtaXNWZXJzaW9uKCkgIT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgICAgICAgICAgdG9vbGJhckJ1dHRvbltCVVRUT05fVVBEQVRFXS5zZXRFbmFibGVkKGN1cnJlbnRUeXBlLmdldFR5cGVNdXRhYmlsaXR5KCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMoY3VycmVudFR5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKS5jYW5VcGRhdGUoKSkpOwotICAgICAgICAgICAgICAgICAgICB0b29sYmFyQnV0dG9uW0JVVFRPTl9ERUxFVEVdLnNldEVuYWJsZWQoY3VycmVudFR5cGUuZ2V0VHlwZU11dGFiaWxpdHkoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQm9vbGVhbi5UUlVFLmVxdWFscyhjdXJyZW50VHlwZS5nZXRUeXBlTXV0YWJpbGl0eSgpLmNhbkRlbGV0ZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdHlwZVBhbmVsLnNldFR5cGUoY3VycmVudFR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0eXBlUGFuZWwgPSBuZXcgVHlwZVNwbGl0UGFuZShtb2RlbCk7Ci0KLSAgICAgICAgSlNwbGl0UGFuZSBzcGxpdFBhbmUgPSBuZXcgSlNwbGl0UGFuZShKU3BsaXRQYW5lLkhPUklaT05UQUxfU1BMSVQsIG5ldyBKU2Nyb2xsUGFuZSh0eXBlc1RyZWUpLCB0eXBlUGFuZWwpOwotICAgICAgICBzcGxpdFBhbmUuc2V0RGl2aWRlckxvY2F0aW9uKDMwMCk7Ci0KLSAgICAgICAgYWRkKHNwbGl0UGFuZSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgQ2xpZW50SGVscGVyLmluc3RhbGxFc2NhcGVCaW5kaW5nKHRoaXMsIGdldFJvb3RQYW5lKCksIHRydWUpOwotCi0gICAgICAgIHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRElTUE9TRV9PTl9DTE9TRSk7Ci0gICAgICAgIHBhY2soKTsKLQotICAgICAgICBzZXRMb2NhdGlvblJlbGF0aXZlVG8obnVsbCk7Ci0gICAgICAgIHNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBKRmlsZUNob29zZXIgY3JlYXRlWG1sRmlsZUNob29zZXIoKSB7Ci0gICAgICAgIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKLSAgICAgICAgZmlsZUNob29zZXIuYWRkQ2hvb3NhYmxlRmlsZUZpbHRlcihuZXcgRmlsZUZpbHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiWE1MIENNSVMgVHlwZSBEZWZpbml0aW9uIEZpbGUiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZi5pc0RpcmVjdG9yeSgpIHx8IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueG1sIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBmaWxlQ2hvb3NlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpGaWxlQ2hvb3NlciBjcmVhdGVKc29uRmlsZUNob29zZXIoKSB7Ci0gICAgICAgIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKLSAgICAgICAgZmlsZUNob29zZXIuYWRkQ2hvb3NhYmxlRmlsZUZpbHRlcihuZXcgRmlsZUZpbHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiSlNPTiBDTUlTIFR5cGUgRGVmaW5pdGlvbiBGaWxlIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGYuaXNEaXJlY3RvcnkoKSB8fCBmLmdldE5hbWUoKS5lbmRzV2l0aCgiLmpzb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIGZpbGVDaG9vc2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotICAgICAgICBpZiAoY3VycmVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gY3VycmVudFR5cGUuZ2V0SWQoKTsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUucmVwbGFjZSgnOicsICdfJyk7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2UoJy8nLCAnXycpOwotICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCdcXCcsICdfJyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAidHlwZSI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrVHlwZURlZmluaXRpb24oVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICBMaXN0PFZhbGlkYXRpb25FcnJvcj4gdHlwZVJlc3VsdCA9IFR5cGVVdGlscy52YWxpZGF0ZVR5cGVEZWZpbml0aW9uKHR5cGUpOwotCi0gICAgICAgIGlmIChpc05vdEVtcHR5KHR5cGVSZXN1bHQpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlxuVHlwZSBEZWZpbml0aW9uOlxuIik7Ci0KLSAgICAgICAgICAgIGZvciAoVmFsaWRhdGlvbkVycm9yIGVycm9yIDogdHlwZVJlc3VsdCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLSAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZXJyb3IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUuZ2V0UHJvcGVydHlEZWZpbml0aW9ucygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgOiB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIExpc3Q8VmFsaWRhdGlvbkVycm9yPiBwcm9wUmVzdWx0ID0gVHlwZVV0aWxzLnZhbGlkYXRlUHJvcGVydHlEZWZpbml0aW9uKHByb3BEZWYpOwotCi0gICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkocHJvcFJlc3VsdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcblByb3BlcnR5IERlZmluaXRpb24gJyIgKyBwcm9wRGVmLmdldElkKCkgKyAiJzpcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoVmFsaWRhdGlvbkVycm9yIGVycm9yIDogcHJvcFJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCItICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVycm9yLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNiLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGFuc3dlciA9IEpPcHRpb25QYW5lCi0gICAgICAgICAgICAgICAgLnNob3dDb25maXJtRGlhbG9nKHRoaXMsICJUaGUgdHlwZSBkZWZpbnRpb24gaGFzIHRoZSBmb2xsb3dpbmcgaXNzdWVzLlxuIiArIHNiLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuXG5EbyB5b3Ugd2FudCB0byBwcm9jZWVkIGFueXdheT8iLCAiVHlwZSBEZWZpbml0aW9uIFZhbGlkYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuWUVTX05PX09QVElPTiwgSk9wdGlvblBhbmUuV0FSTklOR19NRVNTQUdFKTsKLQotICAgICAgICByZXR1cm4gYW5zd2VyID09IEpPcHRpb25QYW5lLllFU19PUFRJT047Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOwotCi0gICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJvb3ROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoKTsKLQotICAgICAgICAgICAgTGlzdDxUcmVlPE9iamVjdFR5cGU+PiB0eXBlcyA9IG1vZGVsLmdldFR5cGVEZXNjZW5kYW50cygpOwotICAgICAgICAgICAgZm9yIChUcmVlPE9iamVjdFR5cGU+IHR0IDogdHlwZXMpIHsKLSAgICAgICAgICAgICAgICBhZGRMZXZlbChyb290Tm9kZSwgdHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEZWZhdWx0VHJlZU1vZGVsIHRyZWVNb2RlbCA9IG5ldyBEZWZhdWx0VHJlZU1vZGVsKHJvb3ROb2RlKTsKLSAgICAgICAgICAgIHR5cGVzVHJlZS5zZXRNb2RlbCh0cmVlTW9kZWwpOwotCi0gICAgICAgICAgICB0eXBlc1RyZWUuc2V0U2VsZWN0aW9uUm93KDApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZXgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExldmVsKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcGFyZW50LCBUcmVlPE9iamVjdFR5cGU+IHRyZWUpIHsKLSAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUobmV3IFR5cGVOb2RlKHRyZWUuZ2V0SXRlbSgpKSk7Ci0gICAgICAgIHBhcmVudC5hZGQobm9kZSk7Ci0KLSAgICAgICAgaWYgKHRyZWUuZ2V0Q2hpbGRyZW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFRyZWU8T2JqZWN0VHlwZT4gdHQgOiB0cmVlLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRMZXZlbChub2RlLCB0dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVHlwZU5vZGUgewotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdFR5cGUgdHlwZTsKLQotICAgICAgICBwdWJsaWMgVHlwZU5vZGUoT2JqZWN0VHlwZSB0eXBlKSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdFR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZS5nZXREaXNwbGF5TmFtZSgpICsgIiAoIiArIHR5cGUuZ2V0SWQoKSArICIpIjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Xb3JrYmVuY2guamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9Xb3JrYmVuY2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3YzRjYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvV29ya2JlbmNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoOwotCi1pbXBvcnQgamF2YS5uZXQuQXV0aGVudGljYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXIuTG9va0FuZEZlZWxJbmZvOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFdvcmtiZW5jaCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoV29ya2JlbmNoLmNsYXNzKTsKLQotICAgIHB1YmxpYyBXb3JrYmVuY2goKSB7Ci0gICAgICAgIC8vIHNldCBNYWMgT1MgWCBuYW1lCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY29tLmFwcGxlLm1yai5hcHBsaWNhdGlvbi5hcHBsZS5tZW51LmFib3V0Lm5hbWUiLCAiQ01JUyBXb3JrYmVuY2giKTsKLQotICAgICAgICAvLyB0dXJuIG9mZiBleGlzdGluZyBBdXRoZW50aWNhdG9ycyAoLT4gV2ViIFN0YXJ0KQotICAgICAgICBBdXRoZW50aWNhdG9yLnNldERlZmF1bHQobnVsbCk7Ci0KLSAgICAgICAgLy8gc2V0IHVwIFN3aW5nCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5pbWJ1cyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKExvb2tBbmRGZWVsSW5mbyBpbmZvIDogVUlNYW5hZ2VyLmdldEluc3RhbGxlZExvb2tBbmRGZWVscygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJOaW1idXMiLmVxdWFscyhpbmZvLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKGluZm8uZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaW1idXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmltYnVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJOaW1idXMgbm90IGF2YWlsYWJsZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLndhcm4oIk5pbWJ1cyBub3QgYXZhaWxhYmxlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgSkZyYW1lLnNldERlZmF1bHRMb29rQW5kRmVlbERlY29yYXRlZCh0cnVlKTsKLSAgICAgICAgSkRpYWxvZy5zZXREZWZhdWx0TG9va0FuZEZlZWxEZWNvcmF0ZWQodHJ1ZSk7Ci0gICAgICAgIENsaWVudEhlbHBlci5pbnN0YWxsS2V5QmluZGluZ3MoKTsKLQotICAgICAgICAvLyBzaG93IGNsaWVudCBmcmFtZQotICAgICAgICBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbmV3IENsaWVudEZyYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgbmV3IFdvcmtiZW5jaCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0FjbFVwZGF0ZVBhbmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9BY2xVcGRhdGVQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmJlMGY2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0FjbFVwZGF0ZVBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guQWNsRWRpdG9yRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIEFjbFVwZGF0ZVBhbmVsIGV4dGVuZHMgQWN0aW9uUGFuZWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgQWNsVXBkYXRlUGFuZWwoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoIkNoYW5nZSBBQ0wiLCAiT3BlbiBBQ0wgRWRpdG9yIiwgbW9kZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbkNvbXBvbmVudHMoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxvd2VkKCkgewotICAgICAgICBpZiAoZ2V0T2JqZWN0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCAoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0KCkuaGFzQWxsb3dhYmxlQWN0aW9uKEFjdGlvbi5DQU5fQVBQTFlfQUNMKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbigpIHsKLSAgICAgICAgbmV3IEFjbEVkaXRvckZyYW1lKGdldENsaWVudE1vZGVsKCksIGdldE9iamVjdCgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0FkZE9iamVjdFRvRm9sZGVyUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0FkZE9iamVjdFRvRm9sZGVyUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4NDdkOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9BZGRPYmplY3RUb0ZvbGRlclBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5GaWxlYWJsZUNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkFjdGlvblBhbmVsOwotCi1wdWJsaWMgY2xhc3MgQWRkT2JqZWN0VG9Gb2xkZXJQYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZvbGRlckZpZWxkOwotICAgIHByaXZhdGUgSkNoZWNrQm94IGFsbFZlcnNpb25zQm94OwotCi0gICAgcHVibGljIEFkZE9iamVjdFRvRm9sZGVyUGFuZWwoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoIkFkZCBPYmplY3QgVG8gRm9sZGVyIiwgIkFkZCIsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25Db21wb25lbnRzKCkgewotICAgICAgICBKUGFuZWwgZm9sZGVyUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgIGZvbGRlclBhbmVsLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOwotCi0gICAgICAgIGZvbGRlclBhbmVsLmFkZChuZXcgSkxhYmVsKCJGb2xkZXIgSWQ6IiksIEJvcmRlckxheW91dC5MSU5FX1NUQVJUKTsKLQotICAgICAgICBmb2xkZXJGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKLSAgICAgICAgZm9sZGVyUGFuZWwuYWRkKGZvbGRlckZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQoZm9sZGVyUGFuZWwpOwotCi0gICAgICAgIGFsbFZlcnNpb25zQm94ID0gbmV3IEpDaGVja0JveCgiYWRkIGFsbCB2ZXJzaW9ucyIsIHRydWUpOwotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQoYWxsVmVyc2lvbnNCb3gpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKCEoZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBGaWxlYWJsZUNtaXNPYmplY3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3QoKS5oYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uLkNBTl9BRERfT0JKRUNUX1RPX0ZPTERFUik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oKSB7Ci0gICAgICAgIE9iamVjdElkIGZvbGRlcklkID0gZ2V0Q2xpZW50TW9kZWwoKS5nZXRDbGllbnRTZXNzaW9uKCkuZ2V0U2Vzc2lvbigpLmNyZWF0ZU9iamVjdElkKGZvbGRlckZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgICgoRmlsZWFibGVDbWlzT2JqZWN0KSBnZXRPYmplY3QoKSkuYWRkVG9Gb2xkZXIoZm9sZGVySWQsIGFsbFZlcnNpb25zQm94LmlzU2VsZWN0ZWQoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0FwcGVuZENvbnRlbnRTdHJlYW1QYW5lbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvQXBwZW5kQ29udGVudFN0cmVhbVBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTJjNWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvQXBwZW5kQ29udGVudFN0cmVhbVBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNtaXNWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmcuQWN0aW9uUGFuZWw7Ci0KLXB1YmxpYyBjbGFzcyBBcHBlbmRDb250ZW50U3RyZWFtUGFuZWwgZXh0ZW5kcyBBY3Rpb25QYW5lbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgSlRleHRGaWVsZCBmaWxlbmFtZUZpZWxkOwotICAgIHByaXZhdGUgSkNoZWNrQm94IGlzTGFzdENodW5rQm94OwotCi0gICAgcHVibGljIEFwcGVuZENvbnRlbnRTdHJlYW1QYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigiQXBwZW5kIENvbnRlbnQgU3RyZWFtIiwgIkFwcGVuZCBDb250ZW50IFN0cmVhbSIsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25Db21wb25lbnRzKCkgewotICAgICAgICBmaWxlbmFtZUZpZWxkID0gbmV3IEpUZXh0RmllbGQoMzApOwotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQoY3JlYXRlRmlsZW5hbWVQYW5lbChmaWxlbmFtZUZpZWxkKSk7Ci0KLSAgICAgICAgaXNMYXN0Q2h1bmtCb3ggPSBuZXcgSkNoZWNrQm94KCJpcyBsYXN0IGNodW5rIiwgZmFsc2UpOwotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQoaXNMYXN0Q2h1bmtCb3gpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKGdldENtaXNWZXJzaW9uKCkgPT0gQ21pc1ZlcnNpb24uQ01JU18xXzApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkgPT0gbnVsbCkgfHwgIShnZXRPYmplY3QoKSBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCAoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0KCkuaGFzQWxsb3dhYmxlQWN0aW9uKEFjdGlvbi5DQU5fU0VUX0NPTlRFTlRfU1RSRUFNKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbigpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQgPSBnZXRDbGllbnRNb2RlbCgpLmNyZWF0ZUNvbnRlbnRTdHJlYW0oZmlsZW5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAoKERvY3VtZW50KSBnZXRPYmplY3QoKSkuYXBwZW5kQ29udGVudFN0cmVhbShjb250ZW50LCBpc0xhc3RDaHVua0JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0FwcGx5UG9saWN5UGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0FwcGx5UG9saWN5UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4NGY5Ny4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9BcHBseVBvbGljeVBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5PYmplY3RJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIEFwcGx5UG9saWN5UGFuZWwgZXh0ZW5kcyBBY3Rpb25QYW5lbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgSlRleHRGaWVsZCBwb2xpY3lGaWVsZDsKLQotICAgIHB1YmxpYyBBcHBseVBvbGljeVBhbmVsKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCJBcHBseSBQb2xpY3kiLCAiQXBwbHkgUG9saWN5IiwgbW9kZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbkNvbXBvbmVudHMoKSB7Ci0gICAgICAgIEpQYW5lbCBwb2xpY3lJZFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICBwb2xpY3lJZFBhbmVsLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOwotCi0gICAgICAgIHBvbGljeUlkUGFuZWwuYWRkKG5ldyBKTGFiZWwoIlBvbGljeSBJZDoiKSwgQm9yZGVyTGF5b3V0LkxJTkVfU1RBUlQpOwotCi0gICAgICAgIHBvbGljeUZpZWxkID0gbmV3IEpUZXh0RmllbGQoMzApOwotICAgICAgICBwb2xpY3lJZFBhbmVsLmFkZChwb2xpY3lGaWVsZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgYWRkQWN0aW9uQ29tcG9uZW50KHBvbGljeUlkUGFuZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKGdldE9iamVjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX0FQUExZX1BPTElDWSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oKSB7Ci0gICAgICAgIGdldE9iamVjdCgpLmFwcGx5UG9saWN5KG5ldyBPYmplY3RJZEltcGwocG9saWN5RmllbGQuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0NhbmNlbENoZWNrT3V0UGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0NhbmNlbENoZWNrT3V0UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiMjAyMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9DYW5jZWxDaGVja091dFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmcuQWN0aW9uUGFuZWw7Ci0KLXB1YmxpYyBjbGFzcyBDYW5jZWxDaGVja091dFBhbmVsIGV4dGVuZHMgQWN0aW9uUGFuZWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgQ2FuY2VsQ2hlY2tPdXRQYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigiQ2FuY2VsIENoZWNrLW91dCBPYmplY3QiLCAiQ2FuY2VsIENoZWNrLW91dCIsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25Db21wb25lbnRzKCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKChnZXRPYmplY3QoKSA9PSBudWxsKSB8fCAhKGdldE9iamVjdCgpIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3QoKS5oYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uLkNBTl9DQU5DRUxfQ0hFQ0tfT1VUKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbigpIHsKLSAgICAgICAgKChEb2N1bWVudCkgZ2V0T2JqZWN0KCkpLmNhbmNlbENoZWNrT3V0KCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9DaGVja0luUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0NoZWNrSW5QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjFjZGI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0NoZWNrSW5QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIENoZWNrSW5QYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggbWFqb3JCb3g7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZpbGVuYW1lRmllbGQ7Ci0KLSAgICBwdWJsaWMgQ2hlY2tJblBhbmVsKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCJDaGVjay1pbiBPYmplY3QiLCAiQ2hlY2staW4iLCBtb2RlbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9uQ29tcG9uZW50cygpIHsKLSAgICAgICAgbWFqb3JCb3ggPSBuZXcgSkNoZWNrQm94KCJtYWpvciB2ZXJzaW9uIiwgdHJ1ZSk7Ci0gICAgICAgIGFkZEFjdGlvbkNvbXBvbmVudChtYWpvckJveCk7Ci0KLSAgICAgICAgZmlsZW5hbWVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKLSAgICAgICAgYWRkQWN0aW9uQ29tcG9uZW50KGNyZWF0ZUZpbGVuYW1lUGFuZWwoZmlsZW5hbWVGaWVsZCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKChnZXRPYmplY3QoKSA9PSBudWxsKSB8fCAhKGdldE9iamVjdCgpIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3QoKS5oYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uLkNBTl9DSEVDS19JTik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50ID0gZ2V0Q2xpZW50TW9kZWwoKS5jcmVhdGVDb250ZW50U3RyZWFtKGZpbGVuYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgKChEb2N1bWVudCkgZ2V0T2JqZWN0KCkpLmNoZWNrSW4obWFqb3JCb3guaXNTZWxlY3RlZCgpLCBudWxsLCBjb250ZW50LCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGNvbnRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9DaGVja091dFBhbmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9DaGVja091dFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTU0ZjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvQ2hlY2tPdXRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkFjdGlvblBhbmVsOwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tPdXRQYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIENoZWNrT3V0UGFuZWwoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoIkNoZWNrLW91dCBPYmplY3QiLCAiQ2hlY2stb3V0IiwgbW9kZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbkNvbXBvbmVudHMoKSB7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxvd2VkKCkgewotICAgICAgICBpZiAoKGdldE9iamVjdCgpID09IG51bGwpIHx8ICEoZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX0NIRUNLX09VVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oKSB7Ci0gICAgICAgICgoRG9jdW1lbnQpIGdldE9iamVjdCgpKS5jaGVja091dCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9Db3B5UGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0NvcHlQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTliOGJkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0NvcHlQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLk9iamVjdElkSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkFjdGlvblBhbmVsOwotCi1wdWJsaWMgY2xhc3MgQ29weVBhbmVsIGV4dGVuZHMgQWN0aW9uUGFuZWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdGFyZ2V0Rm9sZGVyRmllbGQ7Ci0KLSAgICBwdWJsaWMgQ29weVBhbmVsKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCJDb3B5IE9iamVjdCIsICJDb3B5IiwgbW9kZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbkNvbXBvbmVudHMoKSB7Ci0gICAgICAgIEpQYW5lbCB0YXJnZXRGb2xkZXJQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgdGFyZ2V0Rm9sZGVyUGFuZWwuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0KLSAgICAgICAgdGFyZ2V0Rm9sZGVyUGFuZWwuYWRkKG5ldyBKTGFiZWwoIlRhcmdldCBGb2xkZXIgSWQ6IiksIEJvcmRlckxheW91dC5MSU5FX1NUQVJUKTsKLQotICAgICAgICB0YXJnZXRGb2xkZXJGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKDMwKTsKLSAgICAgICAgdGFyZ2V0Rm9sZGVyUGFuZWwuYWRkKHRhcmdldEZvbGRlckZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQodGFyZ2V0Rm9sZGVyUGFuZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKChnZXRPYmplY3QoKSA9PSBudWxsKSB8fCAhKGdldE9iamVjdCgpIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbigpIHsKLSAgICAgICAgT2JqZWN0SWQgdGFyZ2V0Rm9sZGVySWQgPSBuZXcgT2JqZWN0SWRJbXBsKHRhcmdldEZvbGRlckZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgICgoRG9jdW1lbnQpIGdldE9iamVjdCgpKS5jb3B5KHRhcmdldEZvbGRlcklkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvRGVsZXRlQ29udGVudFN0cmVhbVBhbmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9EZWxldGVDb250ZW50U3RyZWFtUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4MGNiMS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9EZWxldGVDb250ZW50U3RyZWFtUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9uczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIERlbGV0ZUNvbnRlbnRTdHJlYW1QYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIERlbGV0ZUNvbnRlbnRTdHJlYW1QYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigiRGVsZXRlIENvbnRlbnQgU3RyZWFtIiwgIkRlbGV0ZSBDb250ZW50IFN0cmVhbSIsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25Db21wb25lbnRzKCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKChnZXRPYmplY3QoKSA9PSBudWxsKSB8fCAhKGdldE9iamVjdCgpIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3QoKS5oYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uLkNBTl9ERUxFVEVfQ09OVEVOVF9TVFJFQU0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRvQWN0aW9uKCkgewotICAgICAgICAoKERvY3VtZW50KSBnZXRPYmplY3QoKSkuZGVsZXRlQ29udGVudFN0cmVhbSgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvRGVsZXRlUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0RlbGV0ZVBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNmRiMDEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvRGVsZXRlUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmcuQWN0aW9uUGFuZWw7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVQYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggYWxsVmVyc2lvbnNCb3g7Ci0KLSAgICBwdWJsaWMgRGVsZXRlUGFuZWwoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoIkRlbGV0ZSBPYmplY3QiLCAiRGVsZXRlIiwgbW9kZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbkNvbXBvbmVudHMoKSB7Ci0gICAgICAgIGFsbFZlcnNpb25zQm94ID0gbmV3IEpDaGVja0JveCgiZGVsZXRlIGFsbCB2ZXJzaW9ucyIsIHRydWUpOwotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQoYWxsVmVyc2lvbnNCb3gpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKGdldE9iamVjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX0RFTEVURV9PQkpFQ1QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRvQWN0aW9uKCkgewotICAgICAgICBnZXRPYmplY3QoKS5kZWxldGUoYWxsVmVyc2lvbnNCb3guaXNTZWxlY3RlZCgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL0RlbGV0ZVRyZWVQYW5lbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvRGVsZXRlVHJlZVBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYTA3ZjIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvRGVsZXRlVHJlZVBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkZvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlVuZmlsZU9iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkFjdGlvblBhbmVsOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlVHJlZVBhbmVsIGV4dGVuZHMgQWN0aW9uUGFuZWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIEpDaGVja0JveCBhbGxWZXJzaW9uc0JveDsKLSAgICBwcml2YXRlIEpDb21ib0JveCB1bmZpbGVPYmplY3RzQm94OwotICAgIHByaXZhdGUgSkNoZWNrQm94IGNvbnRpbnVlT25GYWlsdXJlQm94OwotCi0gICAgcHVibGljIERlbGV0ZVRyZWVQYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigiRGVsZXRlIFRyZWUiLCAiRGVsZXRlIiwgbW9kZWwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbkNvbXBvbmVudHMoKSB7Ci0gICAgICAgIGFsbFZlcnNpb25zQm94ID0gbmV3IEpDaGVja0JveCgiZGVsZXRlIGFsbCB2ZXJzaW9ucyIsIHRydWUpOwotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQoYWxsVmVyc2lvbnNCb3gpOwotCi0gICAgICAgIHVuZmlsZU9iamVjdHNCb3ggPSBuZXcgSkNvbWJvQm94KG5ldyBPYmplY3RbXSB7IFVuZmlsZU9iamVjdC5ERUxFVEUsIFVuZmlsZU9iamVjdC5ERUxFVEVTSU5HTEVGSUxFRCwKLSAgICAgICAgICAgICAgICBVbmZpbGVPYmplY3QuVU5GSUxFIH0pOwotICAgICAgICB1bmZpbGVPYmplY3RzQm94LnNldFNlbGVjdGVkSW5kZXgoMCk7Ci0gICAgICAgIGFkZEFjdGlvbkNvbXBvbmVudCh1bmZpbGVPYmplY3RzQm94KTsKLQotICAgICAgICBjb250aW51ZU9uRmFpbHVyZUJveCA9IG5ldyBKQ2hlY2tCb3goImNvbnRpbnVlIG9uIGZhaWx1cmUiLCB0cnVlKTsKLSAgICAgICAgYWRkQWN0aW9uQ29tcG9uZW50KGFsbFZlcnNpb25zQm94KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbG93ZWQoKSB7Ci0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkgPT0gbnVsbCkgfHwgIShnZXRPYmplY3QoKSBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX0RFTEVURV9UUkVFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbigpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGlkcyA9ICgoRm9sZGVyKSBnZXRPYmplY3QoKSkuZGVsZXRlVHJlZShhbGxWZXJzaW9uc0JveC5pc1NlbGVjdGVkKCksCi0gICAgICAgICAgICAgICAgKFVuZmlsZU9iamVjdCkgdW5maWxlT2JqZWN0c0JveC5nZXRTZWxlY3RlZEl0ZW0oKSwgY29udGludWVPbkZhaWx1cmVCb3guaXNTZWxlY3RlZCgpKTsKLQotICAgICAgICBpZiAoaWRzICE9IG51bGwgJiYgIWlkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgIkRlbGV0ZSB0cmVlIGZhaWxlZCEgQXQgbGVhc3QgdGhlIGZvbGxvd2luZyBvYmplY3RzIGNvdWxkIG5vdCBiZSBkZWxldGVkOlxuIik7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGlkIDogaWRzKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIHNiLnRvU3RyaW5nKCksICJEZWxldGUgVHJlZSIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9Nb3ZlUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL01vdmVQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U1YjQxLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL01vdmVQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5GaWxlYWJsZUNtaXNPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5PYmplY3RJZEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIE1vdmVQYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHRhcmdldEZvbGRlckZpZWxkOwotCi0gICAgcHVibGljIE1vdmVQYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigiTW92ZSBPYmplY3QiLCAiTW92ZSIsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25Db21wb25lbnRzKCkgewotICAgICAgICBKUGFuZWwgdGFyZ2V0Rm9sZGVyUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgIHRhcmdldEZvbGRlclBhbmVsLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOwotCi0gICAgICAgIHRhcmdldEZvbGRlclBhbmVsLmFkZChuZXcgSkxhYmVsKCJUYXJnZXQgRm9sZGVyIElkOiIpLCBCb3JkZXJMYXlvdXQuTElORV9TVEFSVCk7Ci0KLSAgICAgICAgdGFyZ2V0Rm9sZGVyRmllbGQgPSBuZXcgSlRleHRGaWVsZCgzMCk7Ci0gICAgICAgIHRhcmdldEZvbGRlclBhbmVsLmFkZCh0YXJnZXRGb2xkZXJGaWVsZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgYWRkQWN0aW9uQ29tcG9uZW50KHRhcmdldEZvbGRlclBhbmVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbG93ZWQoKSB7Ci0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkgPT0gbnVsbCkgfHwgIShnZXRPYmplY3QoKSBpbnN0YW5jZW9mIEZpbGVhYmxlQ21pc09iamVjdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX01PVkVfT0JKRUNUKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbigpIHsKLSAgICAgICAgT2JqZWN0SWQgdGFyZ2V0Rm9sZGVySWQgPSBuZXcgT2JqZWN0SWRJbXBsKHRhcmdldEZvbGRlckZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgIEZpbGVhYmxlQ21pc09iamVjdCBiZWZvcmUgPSAoRmlsZWFibGVDbWlzT2JqZWN0KSBnZXRPYmplY3QoKTsKLSAgICAgICAgRmlsZWFibGVDbWlzT2JqZWN0IGFmdGVyID0gYmVmb3JlLm1vdmUoZ2V0Q2xpZW50TW9kZWwoKS5nZXRDdXJyZW50Rm9sZGVyKCksIHRhcmdldEZvbGRlcklkKTsKLSAgICAgICAgcmV0dXJuIGJlZm9yZS5nZXRJZCgpLmVxdWFscyhhZnRlci5nZXRJZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9Qcm9wZXJ0eVVwZGF0ZVBhbmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9Qcm9wZXJ0eVVwZGF0ZVBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMWMyZmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvUHJvcGVydHlVcGRhdGVQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLlByb3BlcnR5RWRpdG9yRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5VXBkYXRlUGFuZWwgZXh0ZW5kcyBBY3Rpb25QYW5lbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eVVwZGF0ZVBhbmVsKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCJVcGRhdGUgUHJvcGVydGllcyIsICJPcGVuIFByb3BlcnR5IEVkaXRvciIsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25Db21wb25lbnRzKCkgewotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKGdldE9iamVjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX1VQREFURV9QUk9QRVJUSUVTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbigpIHsKLSAgICAgICAgbmV3IFByb3BlcnR5RWRpdG9yRnJhbWUoZ2V0Q2xpZW50TW9kZWwoKSwgZ2V0T2JqZWN0KCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvUmVtb3ZlT2JqZWN0RnJvbUZvbGRlclBhbmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9SZW1vdmVPYmplY3RGcm9tRm9sZGVyUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkMWI1Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9SZW1vdmVPYmplY3RGcm9tRm9sZGVyUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9uczsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRmlsZWFibGVDbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIFJlbW92ZU9iamVjdEZyb21Gb2xkZXJQYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZvbGRlckZpZWxkOwotCi0gICAgcHVibGljIFJlbW92ZU9iamVjdEZyb21Gb2xkZXJQYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigiUmVtb3ZlIE9iamVjdCBGcm9tIEZvbGRlciIsICJSZW1vdmUiLCBtb2RlbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIGlmIChnZXRDbGllbnRNb2RlbCgpLmdldEN1cnJlbnRGb2xkZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9sZGVyRmllbGQuc2V0VGV4dChnZXRDbGllbnRNb2RlbCgpLmdldEN1cnJlbnRGb2xkZXIoKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9sZGVyRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbkNvbXBvbmVudHMoKSB7Ci0gICAgICAgIEpQYW5lbCBmb2xkZXJQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgZm9sZGVyUGFuZWwuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0KLSAgICAgICAgZm9sZGVyUGFuZWwuYWRkKG5ldyBKTGFiZWwoIkZvbGRlciBJZDoiKSwgQm9yZGVyTGF5b3V0LkxJTkVfU1RBUlQpOwotCi0gICAgICAgIGZvbGRlckZpZWxkID0gbmV3IEpUZXh0RmllbGQoMzApOwotICAgICAgICBmb2xkZXJQYW5lbC5hZGQoZm9sZGVyRmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgIGFkZEFjdGlvbkNvbXBvbmVudChmb2xkZXJQYW5lbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxvd2VkKCkgewotICAgICAgICBpZiAoIShnZXRPYmplY3QoKSBpbnN0YW5jZW9mIEZpbGVhYmxlQ21pc09iamVjdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmhhc0FsbG93YWJsZUFjdGlvbihBY3Rpb24uQ0FOX1JFTU9WRV9PQkpFQ1RfRlJPTV9GT0xERVIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRvQWN0aW9uKCkgewotICAgICAgICBPYmplY3RJZCBmb2xkZXJJZCA9IGdldENsaWVudE1vZGVsKCkuZ2V0Q2xpZW50U2Vzc2lvbigpLmdldFNlc3Npb24oKS5jcmVhdGVPYmplY3RJZChmb2xkZXJGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAoKEZpbGVhYmxlQ21pc09iamVjdCkgZ2V0T2JqZWN0KCkpLnJlbW92ZUZyb21Gb2xkZXIoZm9sZGVySWQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9SZW1vdmVQb2xpY3lQYW5lbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2FjdGlvbnMvUmVtb3ZlUG9saWN5UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNmI1MC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9SZW1vdmVQb2xpY3lQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuT2JqZWN0SWRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmcuQWN0aW9uUGFuZWw7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQb2xpY3lQYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHBvbGljeUZpZWxkOwotCi0gICAgcHVibGljIFJlbW92ZVBvbGljeVBhbmVsKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCJSZW1vdmUgUG9saWN5IiwgIlJlbW92ZSBQb2xpY3kiLCBtb2RlbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9uQ29tcG9uZW50cygpIHsKLSAgICAgICAgSlBhbmVsIHBvbGljeUlkUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgIHBvbGljeUlkUGFuZWwuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0KLSAgICAgICAgcG9saWN5SWRQYW5lbC5hZGQobmV3IEpMYWJlbCgiUG9saWN5IElkOiIpLCBCb3JkZXJMYXlvdXQuTElORV9TVEFSVCk7Ci0KLSAgICAgICAgcG9saWN5RmllbGQgPSBuZXcgSlRleHRGaWVsZCgzMCk7Ci0gICAgICAgIHBvbGljeUlkUGFuZWwuYWRkKHBvbGljeUZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQocG9saWN5SWRQYW5lbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxvd2VkKCkgewotICAgICAgICBpZiAoZ2V0T2JqZWN0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCAoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0KCkuaGFzQWxsb3dhYmxlQWN0aW9uKEFjdGlvbi5DQU5fUkVNT1ZFX1BPTElDWSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oKSB7Ci0gICAgICAgIGdldE9iamVjdCgpLnJlbW92ZVBvbGljeShuZXcgT2JqZWN0SWRJbXBsKHBvbGljeUZpZWxkLmdldFRleHQoKSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvYWN0aW9ucy9TZXRDb250ZW50U3RyZWFtUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL1NldENvbnRlbnRTdHJlYW1QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFmYzI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9hY3Rpb25zL1NldENvbnRlbnRTdHJlYW1QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkNvbnRlbnRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5BY3Rpb25QYW5lbDsKLQotcHVibGljIGNsYXNzIFNldENvbnRlbnRTdHJlYW1QYW5lbCBleHRlbmRzIEFjdGlvblBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZpbGVuYW1lRmllbGQ7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggb3ZlcndyaXRlQm94OwotCi0gICAgcHVibGljIFNldENvbnRlbnRTdHJlYW1QYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigiU2V0IENvbnRlbnQgU3RyZWFtIiwgIlNldCBDb250ZW50IFN0cmVhbSIsIG1vZGVsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25Db21wb25lbnRzKCkgewotICAgICAgICBmaWxlbmFtZUZpZWxkID0gbmV3IEpUZXh0RmllbGQoMzApOwotICAgICAgICBhZGRBY3Rpb25Db21wb25lbnQoY3JlYXRlRmlsZW5hbWVQYW5lbChmaWxlbmFtZUZpZWxkKSk7Ci0KLSAgICAgICAgb3ZlcndyaXRlQm94ID0gbmV3IEpDaGVja0JveCgib3ZlcndyaXRlIiwgdHJ1ZSk7Ci0gICAgICAgIGFkZEFjdGlvbkNvbXBvbmVudChvdmVyd3JpdGVCb3gpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKChnZXRPYmplY3QoKSA9PSBudWxsKSB8fCAhKGdldE9iamVjdCgpIGluc3RhbmNlb2YgRG9jdW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChnZXRPYmplY3QoKS5nZXRBbGxvd2FibGVBY3Rpb25zKCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBnZXRPYmplY3QoKS5oYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uLkNBTl9TRVRfQ09OVEVOVF9TVFJFQU0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRvQWN0aW9uKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudCA9IGdldENsaWVudE1vZGVsKCkuY3JlYXRlQ29udGVudFN0cmVhbShmaWxlbmFtZUZpZWxkLmdldFRleHQoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICgoRG9jdW1lbnQpIGdldE9iamVjdCgpKS5zZXRDb250ZW50U3RyZWFtKGNvbnRlbnQsIG92ZXJ3cml0ZUJveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGNvbnRlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvY2hlY2tzL09iamVjdENvbXBsaWFuY2VDaGVjay5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2NoZWNrcy9PYmplY3RDb21wbGlhbmNlQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5ZmM4NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvY2hlY2tzL09iamVjdENvbXBsaWFuY2VDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5jaGVja3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5Gb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdFN0YXR1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suaW1wbC5BYnN0cmFjdFNlc3Npb25UZXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIGFuIG9iamVjdCBmb3IgQ01JUyBzcGVjaWZpY2F0aW9uIGNvbXBsaWFuY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RDb21wbGlhbmNlQ2hlY2sgZXh0ZW5kcyBBYnN0cmFjdFNlc3Npb25UZXN0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG9iamVjdElkOwotCi0gICAgcHVibGljIE9iamVjdENvbXBsaWFuY2VDaGVjayhTdHJpbmcgb2JqZWN0SWQpIHsKLSAgICAgICAgdGhpcy5vYmplY3RJZCA9IG9iamVjdElkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHN1cGVyLmluaXQocGFyYW1ldGVycyk7Ci0gICAgICAgIHNldE5hbWUoIk9iamVjdCBDb21wbGlhbmNlIENoZWNrIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IHNlc3Npb24uZ2V0T2JqZWN0KG9iamVjdElkLCBTRUxFQ1RfQUxMX05PX0NBQ0hFX09DKTsKLSAgICAgICAgU3RyaW5nW10gcHJvcGVydGllc1RvQ2hlY2sgPSBnZXRBbGxQcm9wZXJ0aWVzKG9iamVjdCk7Ci0KLSAgICAgICAgYWRkUmVzdWx0KGNoZWNrT2JqZWN0KHNlc3Npb24sIG9iamVjdCwgcHJvcGVydGllc1RvQ2hlY2ssICJPYmplY3QgY2hlY2s6ICIgKyBvYmplY3QuZ2V0SWQoKSkpOwotCi0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgYWRkUmVzdWx0KGNoZWNrVmVyc2lvbkhpc3Rvcnkoc2Vzc2lvbiwgb2JqZWN0LCBwcm9wZXJ0aWVzVG9DaGVjaywKLSAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gaGlzdG9yeSBjaGVjazogIiArIG9iamVjdC5nZXRJZCgpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICBhZGRSZXN1bHQoY2hlY2tDaGlsZHJlbihzZXNzaW9uLCAoRm9sZGVyKSBvYmplY3QsICJGb2xkZXIgY2hpbGRyZW4gY2hlY2s6ICIgKyBvYmplY3QuZ2V0SWQoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldFJlc3VsdHMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGFkZFJlc3VsdChjcmVhdGVSZXN1bHQoQ21pc1Rlc3RSZXN1bHRTdGF0dXMuT0ssICJPYmplY3Qgc2VlbXMgdG8gYmUgY29tcGxpYW50ISBJZDogIiArIG9iamVjdC5nZXRJZCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvY2hlY2tzL09iamVjdENvbXBsaWFuY2VUZXN0R3JvdXAuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9jaGVja3MvT2JqZWN0Q29tcGxpYW5jZVRlc3RHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk1YTAyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9jaGVja3MvT2JqZWN0Q29tcGxpYW5jZVRlc3RHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5jaGVja3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLmltcGwuQWJzdHJhY3RDbWlzVGVzdEdyb3VwOwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0Q29tcGxpYW5jZVRlc3RHcm91cCBleHRlbmRzIEFic3RyYWN0Q21pc1Rlc3RHcm91cCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvYmplY3RJZDsKLQotICAgIHB1YmxpYyBPYmplY3RDb21wbGlhbmNlVGVzdEdyb3VwKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgU3RyaW5nIG9iamVjdElkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5vYmplY3RJZCA9IG9iamVjdElkOwotICAgICAgICBpbml0KHBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuaW5pdChwYXJhbWV0ZXJzKTsKLQotICAgICAgICBzZXROYW1lKCJPYmplY3QgQ29tcGxpYW5jZSBUZXN0IEdyb3VwIik7Ci0KLSAgICAgICAgYWRkVGVzdChuZXcgT2JqZWN0Q29tcGxpYW5jZUNoZWNrKG9iamVjdElkKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2NoZWNrcy9Td2luZ1JlcG9ydC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2NoZWNrcy9Td2luZ1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDg3ZjgwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9jaGVja3MvU3dpbmdSZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmNoZWNrczsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuRGVza3RvcDsKLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuRnJhbWU7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3M7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpEaWFsb2c7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVDZWxsUmVuZGVyZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0R3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLkNtaXNUZXN0UmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5DbWlzVGVzdFJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sucmVwb3J0LkFic3RyYWN0Q21pc1Rlc3RSZXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudGNrLnJlcG9ydC5IdG1sUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnRjay5yZXBvcnQuVGV4dFJlcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sucmVwb3J0LlhtbFJlcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guQ2xpZW50SGVscGVyOwotCi0vKioKLSAqIFN3aW5nIFJlcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIFN3aW5nUmVwb3J0IGV4dGVuZHMgQWJzdHJhY3RDbWlzVGVzdFJlcG9ydCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJY29uIEdST1VQX0lDT04gPSBuZXcgQ29sb3JJY29uKENvbG9yLkdSQVkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEljb24gVEVTVF9JQ09OID0gbmV3IENvbG9ySWNvbihDb2xvci5CTFVFKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJY29uIFNUQVRVU19PS19JQ09OID0gbmV3IENvbG9ySWNvbihDb2xvci5HUkVFTik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSWNvbiBTVEFUVVNfV0FSTklOR19JQ09OID0gbmV3IENvbG9ySWNvbihDb2xvci5ZRUxMT1cpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEljb24gU1RBVFVTX0ZBSUxVUkVfSUNPTiA9IG5ldyBDb2xvckljb24oQ29sb3IuUkVEKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJY29uIE9USEVSX0lDT04gPSBuZXcgQ29sb3JJY29uKENvbG9yLkxJR0hUX0dSQVkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBGcmFtZSBvd25lcjsKLSAgICBwcml2YXRlIGZpbmFsIGludCB3aWR0aDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBoZWlnaHQ7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7Ci0gICAgcHJpdmF0ZSBMaXN0PENtaXNUZXN0R3JvdXA+IGdyb3VwczsKLQotICAgIHB1YmxpYyBTd2luZ1JlcG9ydChGcmFtZSBvd25lciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKLSAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoOwotICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVSZXBvcnQoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBMaXN0PENtaXNUZXN0R3JvdXA+IGdyb3VwcywgV3JpdGVyIHdyaXRlcikgewotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgICAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsKLSAgICAgICAgbmV3IFN3aW5nUmVwb3J0RGlhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0IGRpYWxvZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFN3aW5nUmVwb3J0RGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHVibGljIFN3aW5nUmVwb3J0RGlhbG9nKCkgewotICAgICAgICAgICAgc3VwZXIob3duZXIsICJUZXN0IFJlcG9ydCIpOwotICAgICAgICAgICAgY3JlYXRlR1VJKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICAgICAgc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpKTsKLSAgICAgICAgICAgIHNldE1pbmltdW1TaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCkpOwotCi0gICAgICAgICAgICBzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLQotICAgICAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSByb290Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJHcm91cHMiKTsKLQotICAgICAgICAgICAgZm9yIChDbWlzVGVzdEdyb3VwIGdyb3VwIDogZ3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFncm91cC5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGdyb3VwTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGdyb3VwKTsKLSAgICAgICAgICAgICAgICByb290Tm9kZS5hZGQoZ3JvdXBOb2RlKTsKLSAgICAgICAgICAgICAgICBmb3IgKENtaXNUZXN0IHRlc3QgOiBncm91cC5nZXRUZXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGVzdC5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHRlc3ROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUodGVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwTm9kZS5hZGQodGVzdE5vZGUpOwotICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZVJlc3VsdEJyYW5jaCh0ZXN0Tm9kZSwgdGVzdC5nZXRSZXN1bHRzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSlRyZWUgZ3JvdXBUcmVlID0gbmV3IEpUcmVlKHJvb3ROb2RlKTsKLSAgICAgICAgICAgIGdyb3VwVHJlZS5zZXRSb290VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICBncm91cFRyZWUuc2V0Q2VsbFJlbmRlcmVyKG5ldyBSZXBvcnRUcmVlQ2VsbFJlbmRlcmVyKCkpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwVHJlZS5nZXRSb3dDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBncm91cFRyZWUuZXhwYW5kUm93KGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGQobmV3IEpTY3JvbGxQYW5lKGdyb3VwVHJlZSksIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0gICAgICAgICAgICBmaW5hbCBKUGFuZWwgcmVwb3J0UGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICByZXBvcnRQYW5lbC5hZGQobmV3IEpMYWJlbCgiT3BlbiByZXBvcnQgYXMgIikpOwotICAgICAgICAgICAgZmluYWwgSkNvbWJvQm94IHJlcG9ydFR5cGUgPSBuZXcgSkNvbWJvQm94KG5ldyBPYmplY3RbXSB7ICJIVE1MIiwgIlRleHQiLCAiWE1MIiB9KTsKLSAgICAgICAgICAgIHJlcG9ydFBhbmVsLmFkZChyZXBvcnRUeXBlKTsKLSAgICAgICAgICAgIGZpbmFsIEpCdXR0b24gcmVwb3J0QnV0dG9uID0gbmV3IEpCdXR0b24oImdvIik7Ci0gICAgICAgICAgICByZXBvcnRQYW5lbC5hZGQocmVwb3J0QnV0dG9uKTsKLQotICAgICAgICAgICAgcmVwb3J0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSByZXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdGVtcFJlcG9ydEZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgQ21pc1Rlc3RSZXBvcnQgcmVwb3J0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyZXBvcnRUeXBlLmdldFNlbGVjdGVkSW5kZXgoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZXBvcnRGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiY21pc3RjayIsICIudHh0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ID0gbmV3IFRleHRSZXBvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVwb3J0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImNtaXN0Y2siLCAiLnhtbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCA9IG5ldyBYbWxSZXBvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlcG9ydEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJjbWlzdGNrIiwgIi5odG1sIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ID0gbmV3IEh0bWxSZXBvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlcG9ydEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuY3JlYXRlUmVwb3J0KHBhcmFtZXRlcnMsIGdyb3VwcywgdGVtcFJlcG9ydEZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHJlcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgRGVza3RvcCBkZXNrdG9wID0gRGVza3RvcC5nZXREZXNrdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2t0b3AuaXNTdXBwb3J0ZWQoRGVza3RvcC5BY3Rpb24uT1BFTikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhvd25lciwgIlJlcG9ydDogIiArIHRlbXBSZXBvcnRGaWxlLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcG9ydCIsIEpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNrdG9wLm9wZW4odGVtcFJlcG9ydEZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cob3duZXIsICJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpLCAiUmVwb3J0IEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgYWRkKHJlcG9ydFBhbmVsLCBCb3JkZXJMYXlvdXQuUEFHRV9FTkQpOwotCi0gICAgICAgICAgICBDbGllbnRIZWxwZXIuaW5zdGFsbEVzY2FwZUJpbmRpbmcodGhpcywgZ2V0Um9vdFBhbmUoKSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRElTUE9TRV9PTl9DTE9TRSk7Ci0gICAgICAgICAgICBwYWNrKCk7Ci0gICAgICAgICAgICBzZXRMb2NhdGlvblJlbGF0aXZlVG8obnVsbCk7Ci0gICAgICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUmVzdWx0QnJhbmNoKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcGFyZW50LCBMaXN0PENtaXNUZXN0UmVzdWx0PiByZXN1bHRzKSB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKENtaXNUZXN0UmVzdWx0IHJlc3VsdCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHJlc3VsdE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShyZXN1bHQpOwotICAgICAgICAgICAgICAgIHBhcmVudC5hZGQocmVzdWx0Tm9kZSk7Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGVSZXN1bHRCcmFuY2gocmVzdWx0Tm9kZSwgcmVzdWx0LmdldENoaWxkcmVuKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBSZXBvcnRUcmVlQ2VsbFJlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdFRyZWVDZWxsUmVuZGVyZXIgewotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICAgICAgcHVibGljIFJlcG9ydFRyZWVDZWxsUmVuZGVyZXIoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVHJlZSB0cmVlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsLCBib29sZWFuIGV4cGFuZGVkLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGxlYWYsIGludCByb3csIGJvb2xlYW4gaGFzRm9jdXMpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5nZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRyZWUsICIiLCBzZWwsIGV4cGFuZGVkLCBsZWFmLCByb3csIGhhc0ZvY3VzKTsKLQotICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSB2YWx1ZTsKLQotICAgICAgICAgICAgICAgIGlmIChub2RlLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIENtaXNUZXN0R3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0VGV4dCgoKENtaXNUZXN0R3JvdXApIG5vZGUuZ2V0VXNlck9iamVjdCgpKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRJY29uKEdST1VQX0lDT04pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRVc2VyT2JqZWN0KCkgaW5zdGFuY2VvZiBDbWlzVGVzdCkgewotICAgICAgICAgICAgICAgICAgICBzZXRUZXh0KCgoQ21pc1Rlc3QpIG5vZGUuZ2V0VXNlck9iamVjdCgpKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRJY29uKFRFU1RfSUNPTik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldFVzZXJPYmplY3QoKSBpbnN0YW5jZW9mIENtaXNUZXN0UmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIENtaXNUZXN0UmVzdWx0IHJlc3VsdCA9IChDbWlzVGVzdFJlc3VsdCkgbm9kZS5nZXRVc2VyT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSAiPGh0bWw+PGI+IiArIHJlc3VsdC5nZXRTdGF0dXMoKSArICI6ICIgKyByZXN1bHQuZ2V0TWVzc2FnZSgpICsgIjwvYj4iOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc3VsdC5nZXRTdGFja1RyYWNlKCkgIT0gbnVsbCkgJiYgKHJlc3VsdC5nZXRTdGFja1RyYWNlKCkubGVuZ3RoID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiAoIiArIHJlc3VsdC5nZXRTdGFja1RyYWNlKClbMF0uZ2V0RmlsZU5hbWUoKSArICI6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc3VsdC5nZXRTdGFja1RyYWNlKClbMF0uZ2V0TGluZU51bWJlcigpICsgIikiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNldFRleHQodGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEljb24oU1RBVFVTX09LX0lDT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgV0FSTklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEljb24oU1RBVFVTX1dBUk5JTkdfSUNPTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGQUlMVVJFOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFVORVhQRUNURURfRVhDRVBUSU9OOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihTVEFUVVNfRkFJTFVSRV9JQ09OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihPVEhFUl9JQ09OKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFRleHQodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEljb24oT1RIRVJfSUNPTik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2V0VmVydGljYWxUZXh0UG9zaXRpb24oU3dpbmdDb25zdGFudHMuVE9QKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sb3JJY29uIGltcGxlbWVudHMgSWNvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBjb2xvcjsKLQotICAgICAgICBwdWJsaWMgQ29sb3JJY29uKENvbG9yIGNvbG9yKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwYWludEljb24oQ29tcG9uZW50IGMsIEdyYXBoaWNzIGcsIGludCB4LCBpbnQgeSkgewotICAgICAgICAgICAgZy5zZXRDb2xvcihjb2xvcik7Ci0gICAgICAgICAgICBnLmZpbGxSZWN0KDAsIDAsIGdldEljb25XaWR0aCgpLCBnZXRJY29uSGVpZ2h0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRJY29uV2lkdGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gODsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvbkhlaWdodCgpIHsKLSAgICAgICAgICAgIHJldHVybiAxODsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL0FDTFRhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9BQ0xUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDQ0ZmM4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL0FDTFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLmF3dC5DdXJzb3I7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5BY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLkFsbG93YWJsZUFjdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLkFjbEVkaXRvckZyYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5DbGllbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQUNMVGFibGUgZXh0ZW5kcyBBYnN0cmFjdERldGFpbHNUYWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTl9OQU1FUyA9IHsgIlByaW5jaXBhbCIsICJQZXJtaXNzaW9ucyIsICJEaXJlY3QiIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ09MVU1OX1dJRFRIUyA9IHsgMjAwLCA0MDAsIDUwIH07Ci0KLSAgICBwdWJsaWMgQUNMVGFibGUoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaW5pdChtb2RlbCwgQ09MVU1OX05BTUVTLCBDT0xVTU5fV0lEVEhTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkb3VibGVDbGlja0FjdGlvbihNb3VzZUV2ZW50IGUsIGludCByb3dJbmRleCkgewotICAgICAgICBBbGxvd2FibGVBY3Rpb25zIGFhID0gZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpOwotCi0gICAgICAgIGlmICgoYWEgPT0gbnVsbCkgfHwgKGFhLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IGFhLmdldEFsbG93YWJsZUFjdGlvbnMoKS5jb250YWlucyhBY3Rpb24uQ0FOX0FQUExZX0FDTCkpIHsKLSAgICAgICAgICAgIG5ldyBBY2xFZGl0b3JGcmFtZShnZXRDbGllbnRNb2RlbCgpLCBnZXRPYmplY3QoKSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgIGdldENsaWVudE1vZGVsKCkucmVsb2FkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgZ2V0Q2xpZW50TW9kZWwoKS5yZWxvYWRGb2xkZXIoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZXgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERldGFpbFJvd0NvdW50KCkgewotICAgICAgICBpZiAoKGdldE9iamVjdCgpLmdldEFjbCgpID09IG51bGwpIHx8IChnZXRPYmplY3QoKS5nZXRBY2woKS5nZXRBY2VzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmdldEFjbCgpLmdldEFjZXMoKS5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXREZXRhaWxWYWx1ZUF0KGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIEFjZSBhY2UgPSBnZXRPYmplY3QoKS5nZXRBY2woKS5nZXRBY2VzKCkuZ2V0KHJvd0luZGV4KTsKLQotICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiBhY2UuZ2V0UHJpbmNpcGFsSWQoKTsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmV0dXJuIGFjZS5nZXRQZXJtaXNzaW9ucygpOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZXR1cm4gYWNlLmlzRGlyZWN0KCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RGV0YWlsQ29sdW1DbGFzcyhpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uLmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDIpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbENvbHVtQ2xhc3MoY29sdW1uSW5kZXgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL0Fic3RyYWN0RGV0YWlsc1RhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9BYnN0cmFjdERldGFpbHNUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzc2ODc0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL0Fic3RyYWN0RGV0YWlsc1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlQWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlTW90aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBvcHVwTWVudTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFiYmVkUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLkNsaWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLk9iamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZy5Db2xsZWN0aW9uUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLklkUmVuZGVyZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERldGFpbHNUYWJsZSBleHRlbmRzIEpUYWJsZSBpbXBsZW1lbnRzIE9iamVjdExpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3Vyc29yIEhBTkRfQ1VSU09SID0gQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkhBTkRfQ1VSU09SKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDdXJzb3IgREVGQVVMVF9DVVJTT1IgPSBDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuREVGQVVMVF9DVVJTT1IpOwotCi0gICAgcHJpdmF0ZSBDbGllbnRNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGNvbHVtbk5hbWVzOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoIlBNRC5BcnJheUlzU3RvcmVkRGlyZWN0bHkiKQotICAgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgQ2xpZW50TW9kZWwgbW9kZWwsIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzLCBmaW5hbCBpbnRbXSBjb2x1bW1uV2lkdGhzKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgbW9kZWwuYWRkT2JqZWN0TGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgdGhpcy5jb2x1bW5OYW1lcyA9IGNvbHVtbk5hbWVzOwotCi0gICAgICAgIHNldE1vZGVsKG5ldyBEZXRhaWxzVGFibGVNb2RlbCh0aGlzKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdFJlbmRlcmVyKENvbGxlY3Rpb24uY2xhc3MsIG5ldyBDb2xsZWN0aW9uUmVuZGVyZXIoKSk7Ci0gICAgICAgIHNldERlZmF1bHRSZW5kZXJlcihPYmplY3RJZC5jbGFzcywgbmV3IElkUmVuZGVyZXIoKSk7Ci0gICAgICAgIHNldEF1dG9SZXNpemVNb2RlKEFVVE9fUkVTSVpFX09GRik7Ci0gICAgICAgIHNldEF1dG9DcmVhdGVSb3dTb3J0ZXIodHJ1ZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW1uV2lkdGhzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBnZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihpKTsKLSAgICAgICAgICAgIGNvbHVtbi5zZXRQcmVmZXJyZWRXaWR0aChjb2x1bW1uV2lkdGhzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEZpbGxzVmlld3BvcnRIZWlnaHQodHJ1ZSk7Ci0KLSAgICAgICAgZmluYWwgSlBvcHVwTWVudSBwb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0gICAgICAgIGZpbmFsIEpNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIkNvcHkgdG8gY2xpcGJvYXJkIik7Ci0gICAgICAgIHBvcHVwLmFkZChtZW51SXRlbSk7Ci0KLSAgICAgICAgbWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuY29weVRhYmxlVG9DbGlwYm9hcmQoQWJzdHJhY3REZXRhaWxzVGFibGUudGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoU3dpbmdVdGlsaXRpZXMuaXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJvdyA9IHJvd0F0UG9pbnQoZS5nZXRQb2ludCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IGNvbHVtbkF0UG9pbnQoZS5nZXRQb2ludCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA+IC0xICYmIGNvbHVtbiA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRDbGlja0NvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUNsaWNrQWN0aW9uKGUsIHJvdywgY29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRDbGlja0NvdW50KCkgPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZUNsaWNrQWN0aW9uKGUsIHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtYXliZVNob3dQb3B1cChlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtYXliZVNob3dQb3B1cChlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG1heWJlU2hvd1BvcHVwKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmlzUG9wdXBUcmlnZ2VyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9wdXAuc2hvdyhlLmdldENvbXBvbmVudCgpLCBlLmdldFgoKSwgZS5nZXRZKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYWRkTW91c2VNb3Rpb25MaXN0ZW5lcihuZXcgTW91c2VNb3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZWQoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJvdyA9IHJvd0F0UG9pbnQoZS5nZXRQb2ludCgpKTsKLSAgICAgICAgICAgICAgICBpbnQgY29sdW1uID0gY29sdW1uQXRQb2ludChlLmdldFBvaW50KCkpOwotICAgICAgICAgICAgICAgIGlmIChyb3cgPiAtMSAmJiBnZXRDb2x1bW5DbGFzcyhjb2x1bW4pID09IE9iamVjdElkLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihIQU5EX0NVUlNPUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKERFRkFVTFRfQ1VSU09SKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEcmFnZ2VkKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvYmplY3RMb2FkZWQoQ2xpZW50TW9kZWxFdmVudCBldmVudCkgewotICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgKChEZXRhaWxzVGFibGVNb2RlbCkgZ2V0TW9kZWwoKSkuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIENtaXNPYmplY3QgZ2V0T2JqZWN0KCkgewotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0Q3VycmVudE9iamVjdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGllbnRNb2RlbCBnZXRDbGllbnRNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDb2x1bW5OYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RGV0YWlsUm93Q291bnQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0RGV0YWlsVmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCk7Ci0KLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RGV0YWlsQ29sdW1DbGFzcyhpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaW5nbGVDbGlja0FjdGlvbihNb3VzZUV2ZW50IGUsIGludCByb3dJbmRleCwgaW50IGNvbEluZGV4KSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2tBY3Rpb24oTW91c2VFdmVudCBlLCBpbnQgcm93SW5kZXgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWIoaW50IHRhYikgewotICAgICAgICAoKEpUYWJiZWRQYW5lKSBnZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSkuc2V0U2VsZWN0ZWRJbmRleCh0YWIpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBEZXRhaWxzVGFibGVNb2RlbCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdERldGFpbHNUYWJsZSB0YWJsZTsKLQotICAgICAgICBwdWJsaWMgRGV0YWlsc1RhYmxlTW9kZWwoQWJzdHJhY3REZXRhaWxzVGFibGUgdGFibGUpIHsKLSAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXRDb2x1bW5OYW1lcygpW2NvbHVtbkluZGV4XTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0Q29sdW1uTmFtZXMoKS5sZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgewotICAgICAgICAgICAgaWYgKHRhYmxlLmdldE9iamVjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldERldGFpbFJvd0NvdW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgICAgIGlmICh0YWJsZS5nZXRPYmplY3QoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXREZXRhaWxWYWx1ZUF0KHJvd0luZGV4LCBjb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q29sdW1uQ2xhc3MoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0RGV0YWlsQ29sdW1DbGFzcyhjb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9BY3Rpb25zUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL0FjdGlvbnNQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2E5NDdkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL0FjdGlvbnNQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guZGV0YWlsczsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9ucy5BY2xVcGRhdGVQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9ucy5BZGRPYmplY3RUb0ZvbGRlclBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zLkFwcGVuZENvbnRlbnRTdHJlYW1QYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9ucy5BcHBseVBvbGljeVBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zLkNhbmNlbENoZWNrT3V0UGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnMuQ2hlY2tJblBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zLkNoZWNrT3V0UGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnMuQ29weVBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zLkRlbGV0ZUNvbnRlbnRTdHJlYW1QYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9ucy5EZWxldGVQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guYWN0aW9ucy5EZWxldGVUcmVlUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnMuTW92ZVBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zLlByb3BlcnR5VXBkYXRlUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmFjdGlvbnMuUmVtb3ZlT2JqZWN0RnJvbUZvbGRlclBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zLlJlbW92ZVBvbGljeVBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5hY3Rpb25zLlNldENvbnRlbnRTdHJlYW1QYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLk9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uc1BhbmVsIGV4dGVuZHMgSlBhbmVsIGltcGxlbWVudHMgT2JqZWN0TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBQcm9wZXJ0eVVwZGF0ZVBhbmVsIHByb3BlcnR5VXBkYXRlUGFuZWw7Ci0gICAgcHJpdmF0ZSBEZWxldGVQYW5lbCBkZWxldGVQYW5lbDsKLSAgICBwcml2YXRlIERlbGV0ZVRyZWVQYW5lbCBkZWxldGVUcmVlUGFuZWw7Ci0gICAgcHJpdmF0ZSBDb3B5UGFuZWwgY29weVBhbmVsOwotICAgIHByaXZhdGUgTW92ZVBhbmVsIG1vdmVQYW5lbDsKLSAgICBwcml2YXRlIENoZWNrT3V0UGFuZWwgY2hlY2tPdXRQYW5lbDsKLSAgICBwcml2YXRlIENhbmNlbENoZWNrT3V0UGFuZWwgY2FuY2VsQ2hlY2tPdXRQYW5lbDsKLSAgICBwcml2YXRlIENoZWNrSW5QYW5lbCBjaGVja0luUGFuZWw7Ci0gICAgcHJpdmF0ZSBTZXRDb250ZW50U3RyZWFtUGFuZWwgc2V0Q29udGVudFN0cmVhbVBhbmVsOwotICAgIHByaXZhdGUgQXBwZW5kQ29udGVudFN0cmVhbVBhbmVsIGFwcGVuZENvbnRlbnRTdHJlYW1QYW5lbDsKLSAgICBwcml2YXRlIERlbGV0ZUNvbnRlbnRTdHJlYW1QYW5lbCBkZWxldGVDb250ZW50U3RyZWFtUGFuZWw7Ci0gICAgcHJpdmF0ZSBBZGRPYmplY3RUb0ZvbGRlclBhbmVsIGFkZE9iamVjdFRvRm9sZGVyUGFuZWw7Ci0gICAgcHJpdmF0ZSBSZW1vdmVPYmplY3RGcm9tRm9sZGVyUGFuZWwgcmVtb3ZlT2JqZWN0RnJvbUZvbGRlclBhbmVsOwotICAgIHByaXZhdGUgQWNsVXBkYXRlUGFuZWwgYWNsVXBkYXRlUGFuZWw7Ci0gICAgcHJpdmF0ZSBBcHBseVBvbGljeVBhbmVsIGFwcGx5UG9saWN5UGFuZWw7Ci0gICAgcHJpdmF0ZSBSZW1vdmVQb2xpY3lQYW5lbCByZW1vdmVQb2xpY3lQYW5lbDsKLQotICAgIHB1YmxpYyBBY3Rpb25zUGFuZWwoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIG1vZGVsLmFkZE9iamVjdExpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdExvYWRlZChDbGllbnRNb2RlbEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IG1vZGVsLmdldEN1cnJlbnRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgIHByb3BlcnR5VXBkYXRlUGFuZWwuc2V0T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlVcGRhdGVQYW5lbC5zZXRWaXNpYmxlKHByb3BlcnR5VXBkYXRlUGFuZWwuaXNBbGxvd2VkKCkpOwotCi0gICAgICAgICAgICAgICAgZGVsZXRlUGFuZWwuc2V0T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlUGFuZWwuc2V0VmlzaWJsZShkZWxldGVQYW5lbC5pc0FsbG93ZWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBkZWxldGVUcmVlUGFuZWwuc2V0T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlVHJlZVBhbmVsLnNldFZpc2libGUoZGVsZXRlVHJlZVBhbmVsLmlzQWxsb3dlZCgpKTsKLQotICAgICAgICAgICAgICAgIGNvcHlQYW5lbC5zZXRPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgICAgICAgICBjb3B5UGFuZWwuc2V0VmlzaWJsZShjb3B5UGFuZWwuaXNBbGxvd2VkKCkpOwotCi0gICAgICAgICAgICAgICAgbW92ZVBhbmVsLnNldE9iamVjdChvYmplY3QpOwotICAgICAgICAgICAgICAgIG1vdmVQYW5lbC5zZXRWaXNpYmxlKG1vdmVQYW5lbC5pc0FsbG93ZWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBjaGVja091dFBhbmVsLnNldE9iamVjdChvYmplY3QpOwotICAgICAgICAgICAgICAgIGNoZWNrT3V0UGFuZWwuc2V0VmlzaWJsZShjaGVja091dFBhbmVsLmlzQWxsb3dlZCgpKTsKLQotICAgICAgICAgICAgICAgIGNhbmNlbENoZWNrT3V0UGFuZWwuc2V0T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgY2FuY2VsQ2hlY2tPdXRQYW5lbC5zZXRWaXNpYmxlKGNhbmNlbENoZWNrT3V0UGFuZWwuaXNBbGxvd2VkKCkpOwotCi0gICAgICAgICAgICAgICAgY2hlY2tJblBhbmVsLnNldE9iamVjdChvYmplY3QpOwotICAgICAgICAgICAgICAgIGNoZWNrSW5QYW5lbC5zZXRWaXNpYmxlKGNoZWNrSW5QYW5lbC5pc0FsbG93ZWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBzZXRDb250ZW50U3RyZWFtUGFuZWwuc2V0T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgc2V0Q29udGVudFN0cmVhbVBhbmVsLnNldFZpc2libGUoc2V0Q29udGVudFN0cmVhbVBhbmVsLmlzQWxsb3dlZCgpKTsKLQotICAgICAgICAgICAgICAgIGFwcGVuZENvbnRlbnRTdHJlYW1QYW5lbC5zZXRPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgICAgICAgICBhcHBlbmRDb250ZW50U3RyZWFtUGFuZWwuc2V0VmlzaWJsZShhcHBlbmRDb250ZW50U3RyZWFtUGFuZWwuaXNBbGxvd2VkKCkpOwotCi0gICAgICAgICAgICAgICAgZGVsZXRlQ29udGVudFN0cmVhbVBhbmVsLnNldE9iamVjdChvYmplY3QpOwotICAgICAgICAgICAgICAgIGRlbGV0ZUNvbnRlbnRTdHJlYW1QYW5lbC5zZXRWaXNpYmxlKGRlbGV0ZUNvbnRlbnRTdHJlYW1QYW5lbC5pc0FsbG93ZWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBhZGRPYmplY3RUb0ZvbGRlclBhbmVsLnNldE9iamVjdChvYmplY3QpOwotICAgICAgICAgICAgICAgIGFkZE9iamVjdFRvRm9sZGVyUGFuZWwuc2V0VmlzaWJsZShhZGRPYmplY3RUb0ZvbGRlclBhbmVsLmlzQWxsb3dlZCgpKTsKLQotICAgICAgICAgICAgICAgIHJlbW92ZU9iamVjdEZyb21Gb2xkZXJQYW5lbC5zZXRPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZW1vdmVPYmplY3RGcm9tRm9sZGVyUGFuZWwuc2V0VmlzaWJsZShyZW1vdmVPYmplY3RGcm9tRm9sZGVyUGFuZWwuaXNBbGxvd2VkKCkpOwotCi0gICAgICAgICAgICAgICAgYWNsVXBkYXRlUGFuZWwuc2V0T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgYWNsVXBkYXRlUGFuZWwuc2V0VmlzaWJsZShhY2xVcGRhdGVQYW5lbC5pc0FsbG93ZWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBhcHBseVBvbGljeVBhbmVsLnNldE9iamVjdChvYmplY3QpOwotICAgICAgICAgICAgICAgIGFwcGx5UG9saWN5UGFuZWwuc2V0VmlzaWJsZShhcHBseVBvbGljeVBhbmVsLmlzQWxsb3dlZCgpKTsKLQotICAgICAgICAgICAgICAgIHJlbW92ZVBvbGljeVBhbmVsLnNldE9iamVjdChvYmplY3QpOwotICAgICAgICAgICAgICAgIHJlbW92ZVBvbGljeVBhbmVsLnNldFZpc2libGUocmVtb3ZlUG9saWN5UGFuZWwuaXNBbGxvd2VkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICBzZXRMYXlvdXQobmV3IEJveExheW91dCh0aGlzLCBCb3hMYXlvdXQuUEFHRV9BWElTKSk7Ci0gICAgICAgIHNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUsIDUsIDUsIDUpKTsKLQotICAgICAgICBwcm9wZXJ0eVVwZGF0ZVBhbmVsID0gbmV3IFByb3BlcnR5VXBkYXRlUGFuZWwobW9kZWwpOwotICAgICAgICBhZGQocHJvcGVydHlVcGRhdGVQYW5lbCk7Ci0KLSAgICAgICAgZGVsZXRlUGFuZWwgPSBuZXcgRGVsZXRlUGFuZWwobW9kZWwpOwotICAgICAgICBhZGQoZGVsZXRlUGFuZWwpOwotCi0gICAgICAgIGRlbGV0ZVRyZWVQYW5lbCA9IG5ldyBEZWxldGVUcmVlUGFuZWwobW9kZWwpOwotICAgICAgICBhZGQoZGVsZXRlVHJlZVBhbmVsKTsKLQotICAgICAgICBjb3B5UGFuZWwgPSBuZXcgQ29weVBhbmVsKG1vZGVsKTsKLSAgICAgICAgYWRkKGNvcHlQYW5lbCk7Ci0KLSAgICAgICAgbW92ZVBhbmVsID0gbmV3IE1vdmVQYW5lbChtb2RlbCk7Ci0gICAgICAgIGFkZChtb3ZlUGFuZWwpOwotCi0gICAgICAgIGNoZWNrT3V0UGFuZWwgPSBuZXcgQ2hlY2tPdXRQYW5lbChtb2RlbCk7Ci0gICAgICAgIGFkZChjaGVja091dFBhbmVsKTsKLQotICAgICAgICBjYW5jZWxDaGVja091dFBhbmVsID0gbmV3IENhbmNlbENoZWNrT3V0UGFuZWwobW9kZWwpOwotICAgICAgICBhZGQoY2FuY2VsQ2hlY2tPdXRQYW5lbCk7Ci0KLSAgICAgICAgY2hlY2tJblBhbmVsID0gbmV3IENoZWNrSW5QYW5lbChtb2RlbCk7Ci0gICAgICAgIGFkZChjaGVja0luUGFuZWwpOwotCi0gICAgICAgIHNldENvbnRlbnRTdHJlYW1QYW5lbCA9IG5ldyBTZXRDb250ZW50U3RyZWFtUGFuZWwobW9kZWwpOwotICAgICAgICBhZGQoc2V0Q29udGVudFN0cmVhbVBhbmVsKTsKLQotICAgICAgICBhcHBlbmRDb250ZW50U3RyZWFtUGFuZWwgPSBuZXcgQXBwZW5kQ29udGVudFN0cmVhbVBhbmVsKG1vZGVsKTsKLSAgICAgICAgYWRkKGFwcGVuZENvbnRlbnRTdHJlYW1QYW5lbCk7Ci0KLSAgICAgICAgZGVsZXRlQ29udGVudFN0cmVhbVBhbmVsID0gbmV3IERlbGV0ZUNvbnRlbnRTdHJlYW1QYW5lbChtb2RlbCk7Ci0gICAgICAgIGFkZChkZWxldGVDb250ZW50U3RyZWFtUGFuZWwpOwotCi0gICAgICAgIGFkZE9iamVjdFRvRm9sZGVyUGFuZWwgPSBuZXcgQWRkT2JqZWN0VG9Gb2xkZXJQYW5lbChtb2RlbCk7Ci0gICAgICAgIGFkZChhZGRPYmplY3RUb0ZvbGRlclBhbmVsKTsKLQotICAgICAgICByZW1vdmVPYmplY3RGcm9tRm9sZGVyUGFuZWwgPSBuZXcgUmVtb3ZlT2JqZWN0RnJvbUZvbGRlclBhbmVsKG1vZGVsKTsKLSAgICAgICAgYWRkKHJlbW92ZU9iamVjdEZyb21Gb2xkZXJQYW5lbCk7Ci0KLSAgICAgICAgYXBwbHlQb2xpY3lQYW5lbCA9IG5ldyBBcHBseVBvbGljeVBhbmVsKG1vZGVsKTsKLSAgICAgICAgYWRkKGFwcGx5UG9saWN5UGFuZWwpOwotCi0gICAgICAgIGFjbFVwZGF0ZVBhbmVsID0gbmV3IEFjbFVwZGF0ZVBhbmVsKG1vZGVsKTsKLSAgICAgICAgYWRkKGFjbFVwZGF0ZVBhbmVsKTsKLQotICAgICAgICByZW1vdmVQb2xpY3lQYW5lbCA9IG5ldyBSZW1vdmVQb2xpY3lQYW5lbChtb2RlbCk7Ci0gICAgICAgIGFkZChyZW1vdmVQb2xpY3lQYW5lbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvRGV0YWlsc1RhYnMuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL0RldGFpbHNUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODYyMjAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvRGV0YWlsc1RhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guZGV0YWlsczsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJiZWRQYW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRGV0YWlsc1RhYnMgZXh0ZW5kcyBKVGFiYmVkUGFuZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgQ2xpZW50TW9kZWwgbW9kZWw7Ci0KLSAgICBwcml2YXRlIE9iamVjdFBhbmVsIG9iamVjdFBhbmVsOwotICAgIHByaXZhdGUgQWN0aW9uc1BhbmVsIGFjdGlvbnNQYW5lbDsKLSAgICBwcml2YXRlIFByb3BlcnR5VGFibGUgcHJvcGVydHlUYWJsZTsKLSAgICBwcml2YXRlIFJlbGF0aW9uc2hpcFRhYmxlIHJlbGF0aW9uc2hpcFRhYmxlOwotICAgIHByaXZhdGUgUmVuZGl0aW9uVGFibGUgcmVuZGl0aW9uVGFibGU7Ci0gICAgcHJpdmF0ZSBBQ0xUYWJsZSBhY2xUYWJsZTsKLSAgICBwcml2YXRlIFBvbGljeVRhYmxlIHBvbGljeVRhYmxlOwotICAgIHByaXZhdGUgVmVyc2lvblRhYmxlIHZlcnNpb25UYWJsZTsKLSAgICBwcml2YXRlIFR5cGVzUGFuZWwgdHlwZXNQYW5lbDsKLSAgICBwcml2YXRlIEV4dGVuc2lvbnNQYW5lbCBleHRlbnNpb25zUGFuZWw7Ci0KLSAgICBwdWJsaWMgRGV0YWlsc1RhYnMoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoSlRhYmJlZFBhbmUuVE9QLCBKVGFiYmVkUGFuZS5TQ1JPTExfVEFCX0xBWU9VVCk7Ci0KLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICBjcmVhdGVHVUkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlR1VJKCkgewotICAgICAgICBvYmplY3RQYW5lbCA9IG5ldyBPYmplY3RQYW5lbChtb2RlbCk7Ci0gICAgICAgIGFjdGlvbnNQYW5lbCA9IG5ldyBBY3Rpb25zUGFuZWwobW9kZWwpOwotICAgICAgICBwcm9wZXJ0eVRhYmxlID0gbmV3IFByb3BlcnR5VGFibGUobW9kZWwpOwotICAgICAgICByZWxhdGlvbnNoaXBUYWJsZSA9IG5ldyBSZWxhdGlvbnNoaXBUYWJsZShtb2RlbCk7Ci0gICAgICAgIHJlbmRpdGlvblRhYmxlID0gbmV3IFJlbmRpdGlvblRhYmxlKG1vZGVsKTsKLSAgICAgICAgYWNsVGFibGUgPSBuZXcgQUNMVGFibGUobW9kZWwpOwotICAgICAgICBwb2xpY3lUYWJsZSA9IG5ldyBQb2xpY3lUYWJsZShtb2RlbCk7Ci0gICAgICAgIHZlcnNpb25UYWJsZSA9IG5ldyBWZXJzaW9uVGFibGUobW9kZWwpOwotICAgICAgICB0eXBlc1BhbmVsID0gbmV3IFR5cGVzUGFuZWwobW9kZWwpOwotICAgICAgICBleHRlbnNpb25zUGFuZWwgPSBuZXcgRXh0ZW5zaW9uc1BhbmVsKG1vZGVsKTsKLQotICAgICAgICBhZGRUYWIoIk9iamVjdCIsIG5ldyBKU2Nyb2xsUGFuZShvYmplY3RQYW5lbCkpOwotICAgICAgICBhZGRUYWIoIkFjdGlvbnMiLCBuZXcgSlNjcm9sbFBhbmUoYWN0aW9uc1BhbmVsKSk7Ci0gICAgICAgIGFkZFRhYigiUHJvcGVydGllcyIsIG5ldyBKU2Nyb2xsUGFuZShwcm9wZXJ0eVRhYmxlKSk7Ci0gICAgICAgIGFkZFRhYigiUmVsYXRpb25zaGlwcyIsIG5ldyBKU2Nyb2xsUGFuZShyZWxhdGlvbnNoaXBUYWJsZSkpOwotICAgICAgICBhZGRUYWIoIlJlbmRpdGlvbnMiLCBuZXcgSlNjcm9sbFBhbmUocmVuZGl0aW9uVGFibGUpKTsKLSAgICAgICAgYWRkVGFiKCJBQ0wiLCBuZXcgSlNjcm9sbFBhbmUoYWNsVGFibGUpKTsKLSAgICAgICAgYWRkVGFiKCJQb2xpY2llcyIsIG5ldyBKU2Nyb2xsUGFuZShwb2xpY3lUYWJsZSkpOwotICAgICAgICBhZGRUYWIoIlZlcnNpb25zIiwgbmV3IEpTY3JvbGxQYW5lKHZlcnNpb25UYWJsZSkpOwotICAgICAgICBhZGRUYWIoIlR5cGUiLCBuZXcgSlNjcm9sbFBhbmUodHlwZXNQYW5lbCkpOwotICAgICAgICBhZGRUYWIoIkV4dGVuc2lvbnMiLCBuZXcgSlNjcm9sbFBhbmUoZXh0ZW5zaW9uc1BhbmVsKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvRXh0ZW5zaW9uc1BhbmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9FeHRlbnNpb25zUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2ZjJlZC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9FeHRlbnNpb25zUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmRldGFpbHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTm90RW1wdHk7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5Db2xsZWN0aW9uc0hlbHBlci5pc051bGxPckVtcHR5OwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVTZWxlY3Rpb25Nb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ21pc0V4dGVuc2lvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5FeHRlbnNpb25MZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLk9iamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uc1BhbmVsIGV4dGVuZHMgSlBhbmVsIGltcGxlbWVudHMgT2JqZWN0TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENsaWVudE1vZGVsIG1vZGVsOwotCi0gICAgcHJpdmF0ZSBKVHJlZSBleHRlbnNpb25zVHJlZTsKLQotICAgIHB1YmxpYyBFeHRlbnNpb25zUGFuZWwoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIG1vZGVsLmFkZE9iamVjdExpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9iamVjdExvYWRlZChDbGllbnRNb2RlbEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IG1vZGVsLmdldEN1cnJlbnRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcm9vdE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Q21pc0V4dGVuc2lvbkVsZW1lbnQ+IGV4dGVuc2lvbnM7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0IGV4dGVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IG9iamVjdC5nZXRFeHRlbnNpb25zKEV4dGVuc2lvbkxldmVsLk9CSkVDVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KGV4dGVuc2lvbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG9iamVjdFJvb3ROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIk9iamVjdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9uKG9iamVjdFJvb3ROb2RlLCBleHRlbnNpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlLmFkZChvYmplY3RSb290Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBleHRlbnNpb25zCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBvYmplY3QuZ2V0RXh0ZW5zaW9ucyhFeHRlbnNpb25MZXZlbC5QUk9QRVJUSUVTKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoZXh0ZW5zaW9ucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcHJvcGVydGllc1Jvb3ROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoIlByb3BlcnRpZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbihwcm9wZXJ0aWVzUm9vdE5vZGUsIGV4dGVuc2lvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE5vZGUuYWRkKHByb3BlcnRpZXNSb290Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBhbGxvd2FibGUgYWN0aW9ucyBleHRlbnNpb25zCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSBvYmplY3QuZ2V0RXh0ZW5zaW9ucyhFeHRlbnNpb25MZXZlbC5BTExPV0FCTEVfQUNUSU9OUyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KGV4dGVuc2lvbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGFsbG93YWJsZUFjdGlvbnNSb290Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWxsb3dhYmxlIEFjdGlvbnMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4dGVuc2lvbihhbGxvd2FibGVBY3Rpb25zUm9vdE5vZGUsIGV4dGVuc2lvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE5vZGUuYWRkKGFsbG93YWJsZUFjdGlvbnNSb290Tm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBBQ0wgZXh0ZW5zaW9ucwotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zID0gb2JqZWN0LmdldEV4dGVuc2lvbnMoRXh0ZW5zaW9uTGV2ZWwuQUNMKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoZXh0ZW5zaW9ucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgYWNsUm9vdE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgiQUNMIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb24oYWNsUm9vdE5vZGUsIGV4dGVuc2lvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE5vZGUuYWRkKGFjbFJvb3ROb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHBvbGljaWVzIGV4dGVuc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IG9iamVjdC5nZXRFeHRlbnNpb25zKEV4dGVuc2lvbkxldmVsLlBPTElDSUVTKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoZXh0ZW5zaW9ucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcG9saWNpZXNSb290Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKCJQb2xpY2llcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9uKHBvbGljaWVzUm9vdE5vZGUsIGV4dGVuc2lvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE5vZGUuYWRkKHBvbGljaWVzUm9vdE5vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRGVmYXVsdFRyZWVNb2RlbCB0cmVlTW9kZWwgPSBuZXcgRGVmYXVsdFRyZWVNb2RlbChyb290Tm9kZSk7Ci0KLSAgICAgICAgICAgICAgICBleHRlbnNpb25zVHJlZS5zZXRNb2RlbCh0cmVlTW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkRXh0ZW5zaW9uKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcGFyZW50LCBMaXN0PENtaXNFeHRlbnNpb25FbGVtZW50PiBleHRlbnNpb25zKSB7Ci0gICAgICAgIGlmIChpc051bGxPckVtcHR5KGV4dGVuc2lvbnMpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENtaXNFeHRlbnNpb25FbGVtZW50IGV4dCA6IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKG5ldyBFeHRlbnNpb25Ob2RlKGV4dCkpOwotICAgICAgICAgICAgcGFyZW50LmFkZChub2RlKTsKLQotICAgICAgICAgICAgaWYgKGlzTm90RW1wdHkoZXh0LmdldENoaWxkcmVuKCkpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9uKG5vZGUsIGV4dC5nZXRDaGlsZHJlbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVHVUkoKSB7Ci0gICAgICAgIHNldExheW91dChuZXcgQm94TGF5b3V0KHRoaXMsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLSAgICAgICAgc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSk7Ci0gICAgICAgIHNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOwotCi0gICAgICAgIGV4dGVuc2lvbnNUcmVlID0gbmV3IEpUcmVlKCk7Ci0gICAgICAgIGV4dGVuc2lvbnNUcmVlLnNldFJvb3RWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgZXh0ZW5zaW9uc1RyZWUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3Rpb25Nb2RlKFRyZWVTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfVFJFRV9TRUxFQ1RJT04pOwotICAgICAgICBleHRlbnNpb25zVHJlZS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcig1LCA1LCA1LCA1KSk7Ci0KLSAgICAgICAgZXh0ZW5zaW9uc1RyZWUuc2V0TW9kZWwobmV3IERlZmF1bHRUcmVlTW9kZWwobnVsbCkpOwotCi0gICAgICAgIEpTY3JvbGxQYW5lIHBhbmUgPSBuZXcgSlNjcm9sbFBhbmUoZXh0ZW5zaW9uc1RyZWUpOwotICAgICAgICBwYW5lLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkpOwotCi0gICAgICAgIGFkZChwYW5lKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgRXh0ZW5zaW9uTm9kZSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ21pc0V4dGVuc2lvbkVsZW1lbnQgZXh0ZW5zaW9uOwotCi0gICAgICAgIHB1YmxpYyBFeHRlbnNpb25Ob2RlKENtaXNFeHRlbnNpb25FbGVtZW50IGV4dGVuc2lvbikgewotICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBleHRlbnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAoZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpID09IG51bGwgPyAiIiA6ICJ7IiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICJ9IikgKyBleHRlbnNpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgKCFleHRlbnNpb24uZ2V0QXR0cmlidXRlcygpLmlzRW1wdHkoKSA/ICIgIiArIGV4dGVuc2lvbi5nZXRBdHRyaWJ1dGVzKCkgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoZXh0ZW5zaW9uLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpID8gIjogIiArIGV4dGVuc2lvbi5nZXRWYWx1ZSgpIDogIiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvT2JqZWN0UGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL09iamVjdFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjM1ODMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvT2JqZWN0UGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmRldGFpbHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLio7Ci1pbXBvcnQgZ3Jvb3Z5LnVpLkNvbnNvbGU7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkJveExheW91dDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEFyZWE7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuQ21pc09iamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRmlsZWFibGVDbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vjb25kYXJ5VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaS5MaW5rQWNjZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuU2Vzc2lvblBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2suQ21pc1Rlc3RHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guQ2xpZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5jaGVja3MuT2JqZWN0Q29tcGxpYW5jZVRlc3RHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guY2hlY2tzLlN3aW5nUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nLkluZm9QYW5lbDsKLQotcHVibGljIGNsYXNzIE9iamVjdFBhbmVsIGV4dGVuZHMgSW5mb1BhbmVsIGltcGxlbWVudHMgT2JqZWN0TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHNjcmlwdEV4dGVuc2lvbnM7Ci0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgbmFtZUZpZWxkOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCBpZEZpZWxkOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eXBlRmllbGQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGJhc2V0eXBlRmllbGQ7Ci0gICAgcHJpdmF0ZSBJbmZvTGlzdCBzZWNvbmRhcnlUeXBlc0xpc3Q7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHZlcnNpb25MYWJlbEZpZWxkOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCBwd2NGaWVsZDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgY29udGVudFVybEZpZWxkOwotICAgIHByaXZhdGUgSW5mb0xpc3QgcGF0aHNMaXN0OwotICAgIHByaXZhdGUgSW5mb0xpc3QgYWxsb3dhYmxlQWN0aW9uc0xpc3Q7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGFjbEV4YWN0RmllbGQ7Ci0gICAgcHJpdmF0ZSBKUGFuZWwgYnV0dG9uUGFuZWw7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIHJlZnJlc2hCdXR0b247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGNoZWNrQnV0dG9uOwotICAgIHByaXZhdGUgSlBhbmVsIHNjcmlwdFBhbmVsOwotICAgIHByaXZhdGUgSkJ1dHRvbiBzY3JpcHRPcGVuQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBzY3JpcHRSdW5CdXR0b247Ci0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgc2NyaXB0T3V0cHV0OwotICAgIHByaXZhdGUgSlRleHRBcmVhV3JpdGVyIHNjcmlwdE91dHB1dFdyaXRlcjsKLQotICAgIHB1YmxpYyBPYmplY3RQYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcihtb2RlbCk7Ci0KLSAgICAgICAgbW9kZWwuYWRkT2JqZWN0TGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgLy8gZ2V0IGFsbCBpbnN0YWxsZWQgc2NyaXB0IGVuZ2luZXMKLSAgICAgICAgc2NyaXB0RXh0ZW5zaW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgU2NyaXB0RW5naW5lTWFuYWdlciBtZ3IgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpOwotICAgICAgICBmb3IgKFNjcmlwdEVuZ2luZUZhY3Rvcnkgc2VmIDogbWdyLmdldEVuZ2luZUZhY3RvcmllcygpKSB7Ci0gICAgICAgICAgICBzY3JpcHRFeHRlbnNpb25zLmFkZEFsbChzZWYuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNyZWF0ZUdVSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9iamVjdExvYWRlZChDbGllbnRNb2RlbEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IGdldENsaWVudE1vZGVsKCkuZ2V0Q3VycmVudE9iamVjdCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVGaWVsZC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgaWRGaWVsZC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBiYXNldHlwZUZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlUeXBlc0xpc3QucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb25MYWJlbEZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBwd2NGaWVsZC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgcGF0aHNMaXN0LnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICBjb250ZW50VXJsRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGFsbG93YWJsZUFjdGlvbnNMaXN0LnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICBhY2xFeGFjdEZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICByZWZyZXNoQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBjaGVja0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2NyaXB0UGFuZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGaWVsZC5zZXRUZXh0KG9iamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWRGaWVsZC5zZXRUZXh0KG9iamVjdC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVGaWVsZC5zZXRUZXh0KG9iamVjdC5nZXRUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiYXNldHlwZUZpZWxkLnNldFRleHQob2JqZWN0LmdldEJhc2VUeXBlSWQoKS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRTZWNvbmRhcnlUeXBlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc2VjVHlwZUlkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU2Vjb25kYXJ5VHlwZSB0eXBlIDogb2JqZWN0LmdldFNlY29uZGFyeVR5cGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjVHlwZUlkcy5hZGQodHlwZS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VHlwZXNMaXN0LnNldExpc3Qoc2VjVHlwZUlkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVR5cGVzTGlzdC5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KSBvYmplY3Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uTGFiZWxGaWVsZC5zZXRUZXh0KGRvYy5nZXRWZXJzaW9uTGFiZWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkxhYmVsRmllbGQuc2V0VGV4dCgiPz8/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvYy5pc1ZlcnNpb25TZXJpZXNDaGVja2VkT3V0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2NGaWVsZC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRvYy5pc1ZlcnNpb25TZXJpZXNDaGVja2VkT3V0KCkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdjRmllbGQuc2V0VGV4dChkb2MuZ2V0VmVyc2lvblNlcmllc0NoZWNrZWRPdXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd2NGaWVsZC5zZXRUZXh0KCIobm90IGNoZWNrZWQgb3V0KSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdjRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbkxhYmVsRmllbGQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBGaWxlYWJsZUNtaXNPYmplY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzTGlzdC5zZXRMaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoKChGb2xkZXIpIG9iamVjdCkuZ2V0UGF0aCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHNMaXN0LnNldExpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlYWJsZUNtaXNPYmplY3QgcGF0aE9iamVjdCA9IChGaWxlYWJsZUNtaXNPYmplY3QpIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhzID0gcGF0aE9iamVjdC5nZXRQYXRocygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eShwYXRocykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzTGlzdC5zZXRMaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIih1bmZpbGVkKSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzTGlzdC5zZXRMaXN0KHBhdGhzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzTGlzdC5zZXRMaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIig/Pz8pIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKG51bGwsIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYW5lbC50aGlzLnJldmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoc0xpc3Quc2V0TGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCIobm90IGZpbGFibGUpIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZG9jVXJsID0gZ2V0RG9jdW1lbnRVUkwob2JqZWN0LCBnZXRDbGllbnRNb2RlbCgpLmdldENsaWVudFNlc3Npb24oKS5nZXRTZXNzaW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY1VybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFVybEZpZWxkLnNldFRleHQoZG9jVXJsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFVybEZpZWxkLnNldFRleHQoIihub3QgYXZhaWxhYmxlKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0LmdldEFsbG93YWJsZUFjdGlvbnMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhYmxlQWN0aW9uc0xpc3Quc2V0TGlzdChvYmplY3QuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YWJsZUFjdGlvbnNMaXN0LnNldExpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiKG1pc3NpbmcpIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0LmdldEFjbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2xFeGFjdEZpZWxkLnNldFRleHQoIihubyBBQ0wpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0QWNsKCkuaXNFeGFjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNsRXhhY3RGaWVsZC5zZXRUZXh0KCJleGFjdCBmbGFnIG5vdCBzZXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5nZXRBY2woKS5pc0V4YWN0KCkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNsRXhhY3RGaWVsZC5zZXRUZXh0KCJpcyBleGFjdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjbEV4YWN0RmllbGQuc2V0VGV4dCgiaXMgbm90IGV4YWN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9iamVjdC5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeCA+IC0xKSAmJiAoc2NyaXB0RXh0ZW5zaW9ucy5jb250YWlucyhuYW1lLnN1YnN0cmluZyh4ICsgMSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRQYW5lbC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRPdXRwdXQuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0UGFuZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihPYmplY3RQYW5lbC50aGlzLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSSgpIHsKLSAgICAgICAgc2V0dXBHVUkoKTsKLQotICAgICAgICBuYW1lRmllbGQgPSBhZGRMaW5lKCJOYW1lOiIsIHRydWUpOwotICAgICAgICBpZEZpZWxkID0gYWRkSWQoIklkOiIpOwotICAgICAgICB0eXBlRmllbGQgPSBhZGRMaW5lKCJUeXBlOiIpOwotICAgICAgICBiYXNldHlwZUZpZWxkID0gYWRkTGluZSgiQmFzZSBUeXBlOiIpOwotICAgICAgICBzZWNvbmRhcnlUeXBlc0xpc3QgPSBhZGRDb21wb25lbnQoIlNlY29uZGFyeSBUeXBlczoiLCBuZXcgSW5mb0xpc3QoKSk7Ci0gICAgICAgIHBhdGhzTGlzdCA9IGFkZENvbXBvbmVudCgiUGF0aHM6IiwgbmV3IEluZm9MaXN0KCkpOwotICAgICAgICB2ZXJzaW9uTGFiZWxGaWVsZCA9IGFkZExpbmUoIlZlcnNpb24gTGFiZWw6Iik7Ci0gICAgICAgIHB3Y0ZpZWxkID0gYWRkSWQoIlBXQzoiKTsKLSAgICAgICAgY29udGVudFVybEZpZWxkID0gYWRkTGluaygiQ29udGVudCBVUkw6Iik7Ci0gICAgICAgIGFsbG93YWJsZUFjdGlvbnNMaXN0ID0gYWRkQ29tcG9uZW50KCJBbGxvd2FibGUgQWN0aW9uczoiLCBuZXcgSW5mb0xpc3QoKSk7Ci0gICAgICAgIGFjbEV4YWN0RmllbGQgPSBhZGRMaW5lKCJBQ0w6Iik7Ci0KLSAgICAgICAgYnV0dG9uUGFuZWwgPSBhZGRDb21wb25lbnQoIiIsIG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKSk7Ci0gICAgICAgIGJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KGJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuTElORV9BWElTKSk7Ci0gICAgICAgIGJ1dHRvblBhbmVsLnNldE9wYXF1ZShmYWxzZSk7Ci0KLSAgICAgICAgcmVmcmVzaEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJSZWZyZXNoIik7Ci0gICAgICAgIHJlZnJlc2hCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGJ1dHRvblBhbmVsLmFkZChyZWZyZXNoQnV0dG9uKTsKLSAgICAgICAgY2hlY2tCdXR0b24gPSBuZXcgSkJ1dHRvbigiQ2hlY2sgc3BlY2lmaWNhdGlvbiBjb21wbGlhbmNlIik7Ci0gICAgICAgIGNoZWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBidXR0b25QYW5lbC5hZGQoY2hlY2tCdXR0b24pOwotCi0gICAgICAgIHNjcmlwdFBhbmVsID0gYWRkQ29tcG9uZW50KCIiLCBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSkpOwotICAgICAgICBzY3JpcHRQYW5lbC5zZXRPcGFxdWUoZmFsc2UpOwotICAgICAgICBzY3JpcHRQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotICAgICAgICBKUGFuZWwgc2NyaXB0QnV0dG9uUGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIHNjcmlwdEJ1dHRvblBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KHNjcmlwdEJ1dHRvblBhbmVsLCBCb3hMYXlvdXQuTElORV9BWElTKSk7Ci0gICAgICAgIHNjcmlwdEJ1dHRvblBhbmVsLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIHNjcmlwdFBhbmVsLmFkZChzY3JpcHRCdXR0b25QYW5lbCwgQm9yZGVyTGF5b3V0LlBBR0VfU1RBUlQpOwotICAgICAgICBzY3JpcHRPcGVuQnV0dG9uID0gbmV3IEpCdXR0b24oIk9wZW4gU2NyaXB0Iik7Ci0gICAgICAgIHNjcmlwdEJ1dHRvblBhbmVsLmFkZChzY3JpcHRPcGVuQnV0dG9uKTsKLSAgICAgICAgc2NyaXB0UnVuQnV0dG9uID0gbmV3IEpCdXR0b24oIlJ1biBTY3JpcHQiKTsKLSAgICAgICAgc2NyaXB0QnV0dG9uUGFuZWwuYWRkKHNjcmlwdFJ1bkJ1dHRvbik7Ci0KLSAgICAgICAgc2NyaXB0T3V0cHV0ID0gbmV3IEpUZXh0QXJlYShudWxsLCAxLCA4MCk7Ci0gICAgICAgIHNjcmlwdE91dHB1dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIHNjcmlwdE91dHB1dC5zZXRGb250KEZvbnQuZGVjb2RlKCJNb25vc3BhY2VkIikpOwotICAgICAgICBzY3JpcHRPdXRwdXQuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKCIiKSk7Ci0gICAgICAgIHNjcmlwdE91dHB1dFdyaXRlciA9IG5ldyBKVGV4dEFyZWFXcml0ZXIoc2NyaXB0T3V0cHV0KTsKLSAgICAgICAgc2NyaXB0UGFuZWwuYWRkKHNjcmlwdE91dHB1dCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgcmVmcmVzaEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2xpZW50TW9kZWwoKS5yZWxvYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY2hlY2tCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGdldENsaWVudE1vZGVsKCkuZ2V0Q2xpZW50U2Vzc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb25QYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLlJFUE9TSVRPUllfSUQsIGdldENsaWVudE1vZGVsKCkuZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdElkID0gZ2V0Q2xpZW50TW9kZWwoKS5nZXRDdXJyZW50T2JqZWN0KCkuZ2V0SWQoKTsKLQotICAgICAgICAgICAgICAgICAgICBPYmplY3RDb21wbGlhbmNlVGVzdEdyb3VwIG9jdGcgPSBuZXcgT2JqZWN0Q29tcGxpYW5jZVRlc3RHcm91cChwYXJhbWV0ZXJzLCBvYmplY3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG9jdGcucnVuKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTGlzdDxDbWlzVGVzdEdyb3VwPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PENtaXNUZXN0R3JvdXA+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3Vwcy5hZGQob2N0Zyk7Ci0gICAgICAgICAgICAgICAgICAgIFN3aW5nUmVwb3J0IHJlcG9ydCA9IG5ldyBTd2luZ1JlcG9ydChudWxsLCA3MDAsIDUwMCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydC5jcmVhdGVSZXBvcnQocGFyYW1ldGVycywgZ3JvdXBzLCAoV3JpdGVyKSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2NyaXB0T3BlbkJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEN1cnNvcihDdXJzb3IuZ2V0UHJlZGVmaW5lZEN1cnNvcihDdXJzb3IuV0FJVF9DVVJTT1IpKTsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KSBnZXRDbGllbnRNb2RlbCgpLmdldEN1cnJlbnRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRvYy5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmdyb292eSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBDbGllbnRIZWxwZXIuY3JlYXRlVGVtcEZpbGVGcm9tRG9jdW1lbnQoZG9jLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUgY29uc29sZSA9IENsaWVudEhlbHBlci5vcGVuQ29uc29sZShPYmplY3RQYW5lbC50aGlzLCBnZXRDbGllbnRNb2RlbCgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvYWRTY3JpcHRGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLm9wZW4oT2JqZWN0UGFuZWwudGhpcywgZG9jLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKG51bGwsIGV4KTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLkRFRkFVTFRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzY3JpcHRSdW5CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IChEb2N1bWVudCkgZ2V0Q2xpZW50TW9kZWwoKS5nZXRDdXJyZW50T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IENsaWVudEhlbHBlci5jcmVhdGVUZW1wRmlsZUZyb21Eb2N1bWVudChkb2MsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRvYy5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0ID0gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2NyaXB0T3V0cHV0LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBzY3JpcHRPdXRwdXQuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2NyaXB0T3V0cHV0LmludmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIucnVuSlNSMjIzU2NyaXB0KE9iamVjdFBhbmVsLnRoaXMsIGdldENsaWVudE1vZGVsKCksIGZpbGUsIGV4dCwgc2NyaXB0T3V0cHV0V3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihudWxsLCBleCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREb2N1bWVudFVSTChmaW5hbCBDbWlzT2JqZWN0IGRvY3VtZW50LCBmaW5hbCBTZXNzaW9uIHNlc3Npb24pIHsKLSAgICAgICAgaWYgKCEoZG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlc3Npb24uZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKSBpbnN0YW5jZW9mIExpbmtBY2Nlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKExpbmtBY2Nlc3MpIHNlc3Npb24uZ2V0QmluZGluZygpLmdldE9iamVjdFNlcnZpY2UoKSkubG9hZENvbnRlbnRMaW5rKHNlc3Npb24uZ2V0UmVwb3NpdG9yeUluZm8oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSwgZG9jdW1lbnQuZ2V0SWQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKVGV4dEFyZWFXcml0ZXIgZXh0ZW5kcyBXcml0ZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEpUZXh0QXJlYSB0ZXh0QXJlYTsKLQotICAgICAgICBwdWJsaWMgSlRleHRBcmVhV3JpdGVyKEpUZXh0QXJlYSB0ZXh0QXJlYSkgewotICAgICAgICAgICAgdGhpcy50ZXh0QXJlYSA9IHRleHRBcmVhOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGNoYXJbXSBjYnVmLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGNidWYsIG9mZiwgbGVuKTsKLSAgICAgICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHRBcmVhLmFwcGVuZChzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL1BvbGljeVRhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9Qb2xpY3lUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTM5ZTVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL1BvbGljeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guQ2xpZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLQotcHVibGljIGNsYXNzIFBvbGljeVRhYmxlIGV4dGVuZHMgQWJzdHJhY3REZXRhaWxzVGFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5fTkFNRVMgPSB7ICJOYW1lIiwgIklkIiB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENPTFVNTl9XSURUSFMgPSB7IDIwMCwgNDAwIH07Ci0KLSAgICBwdWJsaWMgUG9saWN5VGFibGUoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaW5pdChtb2RlbCwgQ09MVU1OX05BTUVTLCBDT0xVTU5fV0lEVEhTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzaW5nbGVDbGlja0FjdGlvbihNb3VzZUV2ZW50IGUsIGludCByb3dJbmRleCwgaW50IGNvbEluZGV4KSB7Ci0gICAgICAgIGlmIChnZXRDb2x1bW5DbGFzcyhjb2xJbmRleCkgIT0gT2JqZWN0SWQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRDbGllbnRNb2RlbCgpLmxvYWRPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgIGdldE9iamVjdCgpLmdldFBvbGljaWVzKCkuZ2V0KGdldFJvd1NvcnRlcigpLmNvbnZlcnRSb3dJbmRleFRvTW9kZWwocm93SW5kZXgpKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIHNldFRhYigwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKHRoaXMsIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGV0YWlsUm93Q291bnQoKSB7Ci0gICAgICAgIGlmIChnZXRPYmplY3QoKS5nZXRQb2xpY2llcygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmdldFBvbGljaWVzKCkuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGV0YWlsVmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0T2JqZWN0KCkuZ2V0UG9saWNpZXMoKS5nZXQocm93SW5kZXgpOwotCi0gICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIHBvbGljeS5nZXROYW1lKCk7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RGV0YWlsQ29sdW1DbGFzcyhpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBPYmplY3RJZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWxDb2x1bUNsYXNzKGNvbHVtbkluZGV4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9Qcm9wZXJ0eVRhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9Qcm9wZXJ0eVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjQzOGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvUHJvcGVydHlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLlByb3BlcnR5RWRpdG9yRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlUYWJsZSBleHRlbmRzIEFic3RyYWN0RGV0YWlsc1RhYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OX05BTUVTID0geyAiTmFtZSIsICJJZCIsICJUeXBlIiwgIlZhbHVlIiB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENPTFVNTl9XSURUSFMgPSB7IDIwMCwgMjAwLCA4MCwgMzAwIH07Ci0KLSAgICBwdWJsaWMgUHJvcGVydHlUYWJsZShDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0KG1vZGVsLCBDT0xVTU5fTkFNRVMsIENPTFVNTl9XSURUSFMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrQWN0aW9uKE1vdXNlRXZlbnQgZSwgaW50IHJvd0luZGV4KSB7Ci0gICAgICAgIGlmIChnZXRPYmplY3QoKS5oYXNBbGxvd2FibGVBY3Rpb24oQWN0aW9uLkNBTl9VUERBVEVfUFJPUEVSVElFUykpIHsKLSAgICAgICAgICAgIG5ldyBQcm9wZXJ0eUVkaXRvckZyYW1lKGdldENsaWVudE1vZGVsKCksIGdldE9iamVjdCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGV0YWlsUm93Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRPYmplY3QoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGV0YWlsVmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBQcm9wZXJ0eTw/PiBwcm9wZXJ0eSA9IGdldE9iamVjdCgpLmdldFByb3BlcnRpZXMoKS5nZXQocm93SW5kZXgpOwotCi0gICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldERlZmluaXRpb24oKS5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHkuZ2V0SWQoKTsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldERlZmluaXRpb24oKS5nZXRQcm9wZXJ0eVR5cGUoKS52YWx1ZSgpOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHkuZ2V0VmFsdWVzKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RGV0YWlsQ29sdW1DbGFzcyhpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgaWYgKGNvbHVtbkluZGV4ID09IDMpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbENvbHVtQ2xhc3MoY29sdW1uSW5kZXgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL1JlbGF0aW9uc2hpcFRhYmxlLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9SZWxhdGlvbnNoaXBUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQ0OGZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL1JlbGF0aW9uc2hpcFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guQ2xpZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLQotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcFRhYmxlIGV4dGVuZHMgQWJzdHJhY3REZXRhaWxzVGFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5fTkFNRVMgPSB7ICJOYW1lIiwgIlR5cGUiLCAiUmVsYXRpb25zaGlwIElkIiwgIlNvdXJjZSIsICJUYXJnZXQiIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ09MVU1OX1dJRFRIUyA9IHsgMjAwLCAyMDAsIDIwMCwgMjAwLCAyMDAgfTsKLQotICAgIHB1YmxpYyBSZWxhdGlvbnNoaXBUYWJsZShDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpbml0KG1vZGVsLCBDT0xVTU5fTkFNRVMsIENPTFVNTl9XSURUSFMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNpbmdsZUNsaWNrQWN0aW9uKE1vdXNlRXZlbnQgZSwgaW50IHJvd0luZGV4LCBpbnQgY29sSW5kZXgpIHsKLSAgICAgICAgaWYgKGdldENvbHVtbkNsYXNzKGNvbEluZGV4KSAhPSBPYmplY3RJZC5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0SWQgaWQgPSAoT2JqZWN0SWQpIGdldFZhbHVlQXQocm93SW5kZXgsIGNvbEluZGV4KTsKLSAgICAgICAgaWYgKChpZCA9PSBudWxsKSB8fCAoaWQuZ2V0SWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldENsaWVudE1vZGVsKCkubG9hZE9iamVjdChpZC5nZXRJZCgpKTsKLSAgICAgICAgICAgIHNldFRhYigwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKHRoaXMsIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0RGV0YWlsUm93Q291bnQoKSB7Ci0gICAgICAgIGlmIChnZXRPYmplY3QoKS5nZXRSZWxhdGlvbnNoaXBzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0KCkuZ2V0UmVsYXRpb25zaGlwcygpLnNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldERldGFpbFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA9IGdldE9iamVjdCgpLmdldFJlbGF0aW9uc2hpcHMoKS5nZXQocm93SW5kZXgpOwotCi0gICAgICAgIHN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcC5nZXROYW1lKCk7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpLmdldElkKCk7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJldHVybiByZWxhdGlvbnNoaXA7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJldHVybiByZWxhdGlvbnNoaXAuZ2V0U291cmNlSWQoKTsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcC5nZXRUYXJnZXQoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzczw/PiBnZXREZXRhaWxDb2x1bUNsYXNzKGludCBjb2x1bW5JbmRleCkgewotICAgICAgICBpZiAoKGNvbHVtbkluZGV4ID09IDIpIHx8IChjb2x1bW5JbmRleCA9PSAzKSB8fCAoY29sdW1uSW5kZXggPT0gNCkpIHsKLSAgICAgICAgICAgIHJldHVybiBPYmplY3RJZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5nZXREZXRhaWxDb2x1bUNsYXNzKGNvbHVtbkluZGV4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9SZW5kaXRpb25UYWJsZS5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvUmVuZGl0aW9uVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhY2M0OC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9SZW5kaXRpb25UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVuZGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5DbGllbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotCi1wdWJsaWMgY2xhc3MgUmVuZGl0aW9uVGFibGUgZXh0ZW5kcyBBYnN0cmFjdERldGFpbHNUYWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTl9OQU1FUyA9IHsgIlRpdGxlIiwgIktpbmQiLCAiTUlNRSBUeXBlIiwgIlNpemUiLCAiU3RyZWFtIElkIiB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIENPTFVNTl9XSURUSFMgPSB7IDIwMCwgMjAwLCA4MCwgODAsIDIwMCB9OwotCi0gICAgcHVibGljIFJlbmRpdGlvblRhYmxlKENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGluaXQobW9kZWwsIENPTFVNTl9OQU1FUywgQ09MVU1OX1dJRFRIUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2tBY3Rpb24oTW91c2VFdmVudCBlLCBpbnQgcm93SW5kZXgpIHsKLSAgICAgICAgU3RyaW5nIHN0cmVhbUlkID0gZ2V0T2JqZWN0KCkuZ2V0UmVuZGl0aW9ucygpLmdldChnZXRSb3dTb3J0ZXIoKS5jb252ZXJ0Um93SW5kZXhUb01vZGVsKHJvd0luZGV4KSkKLSAgICAgICAgICAgICAgICAuZ2V0U3RyZWFtSWQoKTsKLQotICAgICAgICBpZiAoZS5pc1NoaWZ0RG93bigpKSB7Ci0gICAgICAgICAgICBDbGllbnRIZWxwZXIuZG93bmxvYWQodGhpcy5nZXRQYXJlbnQoKSwgZ2V0T2JqZWN0KCksIHN0cmVhbUlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENsaWVudEhlbHBlci5vcGVuKHRoaXMuZ2V0UGFyZW50KCksIGdldE9iamVjdCgpLCBzdHJlYW1JZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldERldGFpbFJvd0NvdW50KCkgewotICAgICAgICBpZiAoZ2V0T2JqZWN0KCkuZ2V0UmVuZGl0aW9ucygpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdldE9iamVjdCgpLmdldFJlbmRpdGlvbnMoKS5zaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXREZXRhaWxWYWx1ZUF0KGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIFJlbmRpdGlvbiByZW5kaXRpb24gPSBnZXRPYmplY3QoKS5nZXRSZW5kaXRpb25zKCkuZ2V0KHJvd0luZGV4KTsKLQotICAgICAgICBzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiByZW5kaXRpb24uZ2V0VGl0bGUoKTsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmV0dXJuIHJlbmRpdGlvbi5nZXRLaW5kKCk7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJldHVybiByZW5kaXRpb24uZ2V0TWltZVR5cGUoKTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmV0dXJuIHJlbmRpdGlvbi5nZXRMZW5ndGgoKTsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmV0dXJuIHJlbmRpdGlvbi5nZXRTdHJlYW1JZCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvVHlwZXNQYW5lbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL2RldGFpbHMvVHlwZXNQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVhMzc5Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL1R5cGVzUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guZGV0YWlsczsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5UeXBlU3BsaXRQYW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuT2JqZWN0TGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlc1BhbmVsIGV4dGVuZHMgVHlwZVNwbGl0UGFuZSBpbXBsZW1lbnRzIE9iamVjdExpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIFR5cGVzUGFuZWwoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIobW9kZWwpOwotICAgICAgICBtb2RlbC5hZGRPYmplY3RMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvYmplY3RMb2FkZWQoQ2xpZW50TW9kZWxFdmVudCBldmVudCkgewotICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgQ21pc09iamVjdCBvYmplY3QgPSBnZXRDbGllbnRNb2RlbCgpLmdldEN1cnJlbnRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXRUeXBlKG51bGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFR5cGUob2JqZWN0LmdldFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvZGV0YWlscy9WZXJzaW9uVGFibGUuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL1ZlcnNpb25UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWUyZTg0Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9kZXRhaWxzL1ZlcnNpb25UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guZGV0YWlsczsKLQotaW1wb3J0IGphdmEuYXd0LkN1cnNvcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5BY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5leGNlcHRpb25zLkNtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLkNsaWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uVGFibGUgZXh0ZW5kcyBBYnN0cmFjdERldGFpbHNUYWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTl9OQU1FUyA9IHsgIk5hbWUiLCAiTGFiZWwiLCAiTGF0ZXN0IiwgIk1ham9yIiwgIkxhdGVzdCBNYWpvciIsICJJZCIsCi0gICAgICAgICAgICAiRmlsZW5hbWUiLCAiTUlNRSBUeXBlIiwgIkxlbmd0aCIgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDT0xVTU5fV0lEVEhTID0geyAyMDAsIDIwMCwgNTAsIDUwLCA1MCwgNDAwLCAyMDAsIDEwMCwgMTAwIH07Ci0KLSAgICBwcml2YXRlIExpc3Q8RG9jdW1lbnQ+IHZlcnNpb25zOwotICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBsb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKLQotICAgIHB1YmxpYyBWZXJzaW9uVGFibGUoQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgICAgICB2ZXJzaW9ucyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICBpbml0KG1vZGVsLCBDT0xVTU5fTkFNRVMsIENPTFVNTl9XSURUSFMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9iamVjdExvYWRlZChDbGllbnRNb2RlbEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmVyc2lvbnMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZG9jID0gKERvY3VtZW50KSBnZXRPYmplY3QoKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmZXRjaFZlcnNpb25zID0gKGdldE9iamVjdCgpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB8fCAoZ2V0T2JqZWN0KCkuZ2V0QWxsb3dhYmxlQWN0aW9ucygpLmdldEFsbG93YWJsZUFjdGlvbnMoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB8fCBkb2MuaGFzQWxsb3dhYmxlQWN0aW9uKEFjdGlvbi5DQU5fR0VUX0FMTF9WRVJTSU9OUyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChmZXRjaFZlcnNpb25zKSB7Ci0gICAgICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJzb3IoQ3Vyc29yLmdldFByZWRlZmluZWRDdXJzb3IoQ3Vyc29yLldBSVRfQ1VSU09SKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxEb2N1bWVudD4gbmV3VmVyc2lvbnMgPSBkb2MuZ2V0QWxsVmVyc2lvbnMoZ2V0Q2xpZW50TW9kZWwoKS5nZXRDbGllbnRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWZXJzaW9uT3BlcmF0aW9uQ29udGV4dCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkubG9jaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zID0gbmV3VmVyc2lvbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShleCBpbnN0YW5jZW9mIENtaXNOb3RTdXBwb3J0ZWRFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKChEZXRhaWxzVGFibGVNb2RlbCkgZ2V0TW9kZWwoKSkuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub2JqZWN0TG9hZGVkKGV2ZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzaW5nbGVDbGlja0FjdGlvbihNb3VzZUV2ZW50IGUsIGludCByb3dJbmRleCwgaW50IGNvbEluZGV4KSB7Ci0gICAgICAgIGlmIChnZXRDb2x1bW5DbGFzcyhjb2xJbmRleCkgIT0gT2JqZWN0SWQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uSWQgPSBudWxsOwotICAgICAgICBsb2NrLnJlYWRMb2NrKCkubG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmVyc2lvbklkID0gdmVyc2lvbnMuZ2V0KGdldFJvd1NvcnRlcigpLmNvbnZlcnRSb3dJbmRleFRvTW9kZWwocm93SW5kZXgpKS5nZXRJZCgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldENsaWVudE1vZGVsKCkubG9hZE9iamVjdCh2ZXJzaW9uSWQpOwotICAgICAgICAgICAgc2V0VGFiKDApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IodGhpcywgZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2tBY3Rpb24oTW91c2VFdmVudCBlLCBpbnQgcm93SW5kZXgpIHsKLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlLmlzU2hpZnREb3duKCkpIHsKLSAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuZG93bmxvYWQodGhpcy5nZXRQYXJlbnQoKSwgdmVyc2lvbnMuZ2V0KGdldFJvd1NvcnRlcigpLmNvbnZlcnRSb3dJbmRleFRvTW9kZWwocm93SW5kZXgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5vcGVuKHRoaXMuZ2V0UGFyZW50KCksIHZlcnNpb25zLmdldChnZXRSb3dTb3J0ZXIoKS5jb252ZXJ0Um93SW5kZXhUb01vZGVsKHJvd0luZGV4KSksIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXREZXRhaWxSb3dDb3VudCgpIHsKLSAgICAgICAgaWYgKCEoZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBEb2N1bWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB2ZXJzaW9ucy5zaXplKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldERldGFpbFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgICAgRG9jdW1lbnQgdmVyc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9ucy5nZXQocm93SW5kZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChjb2x1bW5JbmRleCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gdmVyc2lvbi5nZXROYW1lKCk7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uLmdldFZlcnNpb25MYWJlbCgpOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICByZXR1cm4gdmVyc2lvbi5pc0xhdGVzdFZlcnNpb24oKTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24uaXNNYWpvclZlcnNpb24oKTsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24uaXNMYXRlc3RNYWpvclZlcnNpb24oKTsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uLmdldENvbnRlbnRTdHJlYW1GaWxlTmFtZSgpOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICByZXR1cm4gdmVyc2lvbi5nZXRDb250ZW50U3RyZWFtTWltZVR5cGUoKTsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24uZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpID09IC0xID8gbnVsbCA6IHZlcnNpb24uZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsYXNzPD8+IGdldERldGFpbENvbHVtQ2xhc3MoaW50IGNvbHVtbkluZGV4KSB7Ci0gICAgICAgIGlmICgoY29sdW1uSW5kZXggPT0gMikgfHwgKGNvbHVtbkluZGV4ID09IDMpIHx8IChjb2x1bW5JbmRleCA9PSA0KSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gNSkgewotICAgICAgICAgICAgcmV0dXJuIE9iamVjdElkLmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDgpIHsKLSAgICAgICAgICAgIHJldHVybiBMb25nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERldGFpbENvbHVtQ2xhc3MoY29sdW1uSW5kZXgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9tb2RlbC9DbGllbnRNb2RlbC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0NsaWVudE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNWM0MWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0NsaWVudE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuaXNOb3RFbXB0eTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLkNvbGxlY3Rpb25zSGVscGVyLmlzTnVsbE9yRW1wdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRmlsZWFibGVDbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuRm9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuSXRlbUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PYmplY3RUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlF1ZXJ5UmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuT3BlcmF0aW9uQ29udGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuQ29udGVudFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUNhcGFiaWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CYXNlVHlwZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ2FwYWJpbGl0eUNoYW5nZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLlZlcnNpb25pbmdTdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmV4Y2VwdGlvbnMuQ21pc0Jhc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5pbXBsLk1pbWVUeXBlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guTG9nZ2luZ0lucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5SYW5kb21JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENsaWVudE1vZGVsIHsKLQotICAgIC8vIG9iamVjdCBkZXRhaWxzIG11c3Qgbm90IGJlIG9sZGVyIHRoYW4gNjAgc2Vjb25kcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgT0xEID0gNjAgKiAxMDAwOwotCi0gICAgcHJpdmF0ZSBDbGllbnRTZXNzaW9uIGNsaWVudFNlc3Npb247Ci0KLSAgICBwcml2YXRlIEZvbGRlciBjdXJyZW50Rm9sZGVyID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8Q21pc09iamVjdD4gY3VycmVudENoaWxkcmVuID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBDbWlzT2JqZWN0IGN1cnJlbnRPYmplY3QgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgRXZlbnRMaXN0ZW5lckxpc3QoKTsKLQotICAgIHB1YmxpYyBDbGllbnRNb2RlbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGb2xkZXJMaXN0ZW5lcihGb2xkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lckxpc3QuYWRkKEZvbGRlckxpc3RlbmVyLmNsYXNzLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlRm9sZGVyTGlzdGVuZXIoRm9sZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbGlzdGVuZXJMaXN0LnJlbW92ZShGb2xkZXJMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9iamVjdExpc3RlbmVyKE9iamVjdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIGxpc3RlbmVyTGlzdC5hZGQoT2JqZWN0TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RMaXN0ZW5lcihPYmplY3RMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKE9iamVjdExpc3RlbmVyLmNsYXNzLCBsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENsaWVudFNlc3Npb24oQ2xpZW50U2Vzc2lvbiBjbGllbnRTZXNzaW9uKSB7Ci0gICAgICAgIHRoaXMuY2xpZW50U2Vzc2lvbiA9IGNsaWVudFNlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBDbGllbnRTZXNzaW9uIGdldENsaWVudFNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRTZXNzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUmVwb3NpdG9yeUluZm8gZ2V0UmVwb3NpdG9yeUluZm8oKSB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpOwotICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldFJlcG9zaXRvcnlOYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldFJlcG9zaXRvcnlJbmZvKCkuZ2V0TmFtZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuICI/IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdXBwb3J0c1F1ZXJ5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBjYXAgPSBnZXRSZXBvc2l0b3J5SW5mbygpLmdldENhcGFiaWxpdGllcygpOwotICAgICAgICAgICAgaWYgKGNhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAoY2FwLmdldFF1ZXJ5Q2FwYWJpbGl0eSgpICE9IG51bGwpICYmIChjYXAuZ2V0UXVlcnlDYXBhYmlsaXR5KCkgIT0gQ2FwYWJpbGl0eVF1ZXJ5Lk5PTkUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN1cHBvcnRzQ2hhbmdlTG9nKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVwb3NpdG9yeUNhcGFiaWxpdGllcyBjYXAgPSBnZXRSZXBvc2l0b3J5SW5mbygpLmdldENhcGFiaWxpdGllcygpOwotICAgICAgICAgICAgaWYgKGNhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAoY2FwLmdldENoYW5nZXNDYXBhYmlsaXR5KCkgIT0gbnVsbCkgJiYgKGNhcC5nZXRDaGFuZ2VzQ2FwYWJpbGl0eSgpICE9IENhcGFiaWxpdHlDaGFuZ2VzLk5PTkUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN1cHBvcnRzSXRlbXMoKSB7Ci0gICAgICAgIGZvciAoT2JqZWN0VHlwZSB0eXBlIDogY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCkuZ2V0VHlwZUNoaWxkcmVuKG51bGwsIGZhbHNlKSkgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0QmFzZVR5cGVJZCgpID09IEJhc2VUeXBlSWQuQ01JU19JVEVNKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHN1cHBvcnRzUmVsYXRpb25zaGlwcygpIHsKLSAgICAgICAgZm9yIChPYmplY3RUeXBlIHR5cGUgOiBjbGllbnRTZXNzaW9uLmdldFNlc3Npb24oKS5nZXRUeXBlQ2hpbGRyZW4obnVsbCwgZmFsc2UpKSB7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRCYXNlVHlwZUlkKCkgPT0gQmFzZVR5cGVJZC5DTUlTX1JFTEFUSU9OU0hJUCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0SWQgbG9hZEZvbGRlcihTdHJpbmcgZm9sZGVySWQsIGJvb2xlYW4gYnlQYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBjbGllbnRTZXNzaW9uLmdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIENtaXNPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBudWxsOwotICAgICAgICAgICAgQ21pc09iamVjdCBmb2xkZXJPYmplY3QgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoYnlQYXRoKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRPYmplY3QgPSBzZXNzaW9uLmdldE9iamVjdEJ5UGF0aChmb2xkZXJJZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkT2JqZWN0ID0gc2Vzc2lvbi5nZXRPYmplY3QoZm9sZGVySWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICBmb2xkZXJPYmplY3QgPSBzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRmlsZWFibGVDbWlzT2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Rm9sZGVyPiBwYXJlbnRzID0gKChGaWxlYWJsZUNtaXNPYmplY3QpIHNlbGVjdGVkT2JqZWN0KS5nZXRQYXJlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc05vdEVtcHR5KHBhcmVudHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJPYmplY3QgPSBwYXJlbnRzLmdldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRGb2xkZXIobnVsbCwgbmV3IEFycmF5TGlzdDxDbWlzT2JqZWN0PigwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50Rm9sZGVyKG51bGwsIG5ldyBBcnJheUxpc3Q8Q21pc09iamVjdD4oMCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PENtaXNPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxDbWlzT2JqZWN0PigpOwotCi0gICAgICAgICAgICBpZiAoY2xpZW50U2Vzc2lvbi5nZXRNYXhDaGlsZHJlbigpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBtYXhDaGlsZHJlbiA9PSAwIGRvbid0IGNhbGwgZ2V0Q2hpbGRyZW4oKQotICAgICAgICAgICAgICAgIEl0ZW1JdGVyYWJsZTxDbWlzT2JqZWN0PiBpdGVyID0gKChGb2xkZXIpIGZvbGRlck9iamVjdCkuZ2V0Q2hpbGRyZW4oY2xpZW50U2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZvbGRlck9wZXJhdGlvbkNvbnRleHQoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50U2Vzc2lvbi5nZXRNYXhDaGlsZHJlbigpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBtYXhDaGlsZHJlbiA+IDAgcmVzdHJpY3QgbnVtYmVyIG9mIGNoaWxkcmVuCi0gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBsb2FkIGFsbAotICAgICAgICAgICAgICAgICAgICBpdGVyID0gaXRlci5nZXRQYWdlKGNsaWVudFNlc3Npb24uZ2V0TWF4Q2hpbGRyZW4oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChDbWlzT2JqZWN0IGNoaWxkIDogaXRlcikgewotICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0Q3VycmVudEZvbGRlcigoRm9sZGVyKSBmb2xkZXJPYmplY3QsIGNoaWxkcmVuKTsKLQotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkT2JqZWN0OwotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgc2V0Q3VycmVudEZvbGRlcihudWxsLCBuZXcgQXJyYXlMaXN0PENtaXNPYmplY3Q+KDApKTsKLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbG9hZEZvbGRlcigpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9hZEZvbGRlcihjdXJyZW50Rm9sZGVyLmdldElkKCksIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBsb2FkT2JqZWN0KFN0cmluZyBvYmplY3RJZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IHNlc3Npb24uZ2V0T2JqZWN0KG9iamVjdElkLCBjbGllbnRTZXNzaW9uLmdldE9iamVjdE9wZXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgICAgICBvYmplY3QucmVmcmVzaElmT2xkKE9MRCk7Ci0KLSAgICAgICAgICAgIHNldEN1cnJlbnRPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoQ21pc0Jhc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHNldEN1cnJlbnRPYmplY3QobnVsbCk7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxvYWRPYmplY3QoKSB7Ci0gICAgICAgIGlmIChjdXJyZW50T2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBjbGllbnRTZXNzaW9uLmdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIENtaXNPYmplY3Qgb2JqZWN0ID0gc2Vzc2lvbi5nZXRPYmplY3QoY3VycmVudE9iamVjdCwgY2xpZW50U2Vzc2lvbi5nZXRPYmplY3RPcGVyYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgb2JqZWN0LnJlZnJlc2goKTsKLQotICAgICAgICAgICAgc2V0Q3VycmVudE9iamVjdChvYmplY3QpOwotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgc2V0Q3VycmVudE9iamVjdChudWxsKTsKLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBJdGVtSXRlcmFibGU8UXVlcnlSZXN1bHQ+IHF1ZXJ5KFN0cmluZyBxLCBib29sZWFuIHNlYXJjaEFsbFZlcnNpb25zLCBpbnQgbWF4SGl0cykgewotICAgICAgICBPcGVyYXRpb25Db250ZXh0IHF1ZXJ5Q29udGV4dCA9IG5ldyBPcGVyYXRpb25Db250ZXh0SW1wbChudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLAotICAgICAgICAgICAgICAgIG51bGwsIGZhbHNlLCBudWxsLCBmYWxzZSwgbWF4SGl0cyA+IDAgPyBtYXhIaXRzIDogMSk7Ci0KLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCk7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uLnF1ZXJ5KHEsIHNlYXJjaEFsbFZlcnNpb25zLCBxdWVyeUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxUcmVlPE9iamVjdFR5cGU+PiBnZXRUeXBlRGVzY2VuZGFudHMoKSB7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpOwotICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRUeXBlRGVzY2VuZGFudHMobnVsbCwgLTEsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZW50U3RyZWFtIGNyZWF0ZUNvbnRlbnRTdHJlYW0oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ29udGVudFN0cmVhbSBjb250ZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKChmaWxlbmFtZSAhPSBudWxsKSAmJiAoZmlsZW5hbWUubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IExvZ2dpbmdJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCA1MTIgKiAxMDI0KSwKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICBjb250ZW50ID0gY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCkuZ2V0T2JqZWN0RmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb250ZW50U3RyZWFtKGZpbGUuZ2V0TmFtZSgpLCBmaWxlLmxlbmd0aCgpLCBNaW1lVHlwZXMuZ2V0TUlNRVR5cGUoZmlsZSksIHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdElkIGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGZpbGVuYW1lLAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBhZGRpdGlvbmFsUHJvcGVydGllcywgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSwgYm9vbGVhbiB1bmZpbGVkKQotICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHR5cGUpOwotCi0gICAgICAgIGlmIChhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dEFsbChhZGRpdGlvbmFsUHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250ZW50U3RyZWFtIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50U3RyZWFtKGZpbGVuYW1lKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpLmNyZWF0ZURvY3VtZW50KHByb3BlcnRpZXMsICh1bmZpbGVkID8gbnVsbCA6IGN1cnJlbnRGb2xkZXIpLCBjb250ZW50LAotICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uaW5nU3RhdGUsIG51bGwsIG51bGwsIG51bGwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29udGVudFN0cmVhbSBjcmVhdGVDb250ZW50U3RyZWFtKFN0cmluZyBuYW1lLCBsb25nIGxlbmd0aCwgbG9uZyBzZWVkKSB7Ci0gICAgICAgIHJldHVybiBjbGllbnRTZXNzaW9uCi0gICAgICAgICAgICAgICAgLmdldFNlc3Npb24oKQotICAgICAgICAgICAgICAgIC5nZXRPYmplY3RGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29udGVudFN0cmVhbShuYW1lLCBsZW5ndGgsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvZ2dpbmdJbnB1dFN0cmVhbShuZXcgUmFuZG9tSW5wdXRTdHJlYW0obGVuZ3RoLCBzZWVkKSwgbmFtZSArICIgKHJhbmRvbSkiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3RJZCBjcmVhdGVEb2N1bWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIE1hcDxTdHJpbmcsIE9iamVjdD4gYWRkaXRpb25hbFByb3BlcnRpZXMsCi0gICAgICAgICAgICBsb25nIGxlbmd0aCwgbG9uZyBzZWVkLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlLCBib29sZWFuIHVuZmlsZWQpIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk5BTUUsIG5hbWUpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCwgdHlwZSk7Ci0KLSAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0QWxsKGFkZGl0aW9uYWxQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbnRlbnRTdHJlYW0gY29udGVudCA9IGNyZWF0ZUNvbnRlbnRTdHJlYW0obmFtZSwgbGVuZ3RoLCBzZWVkKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjbGllbnRTZXNzaW9uLmdldFNlc3Npb24oKS5jcmVhdGVEb2N1bWVudChwcm9wZXJ0aWVzLCAodW5maWxlZCA/IG51bGwgOiBjdXJyZW50Rm9sZGVyKSwgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmluZ1N0YXRlLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIElPVXRpbHMuY2xvc2VRdWlldGx5KGNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3RJZCBjcmVhdGVJdGVtKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgTWFwPFN0cmluZywgT2JqZWN0PiBhZGRpdGlvbmFsUHJvcGVydGllcykgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuTkFNRSwgbmFtZSk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnR5SWRzLk9CSkVDVF9UWVBFX0lELCB0eXBlKTsKLQotICAgICAgICBpZiAoYWRkaXRpb25hbFByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydGllcy5wdXRBbGwoYWRkaXRpb25hbFByb3BlcnRpZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpLmNyZWF0ZUl0ZW0ocHJvcGVydGllcywgY3VycmVudEZvbGRlciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3RJZCBjcmVhdGVGb2xkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHR5cGUpOwotCi0gICAgICAgIGlmIChhZGRpdGlvbmFsUHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dEFsbChhZGRpdGlvbmFsUHJvcGVydGllcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2xpZW50U2Vzc2lvbi5nZXRTZXNzaW9uKCkuY3JlYXRlRm9sZGVyKHByb3BlcnRpZXMsIGN1cnJlbnRGb2xkZXIsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0SWQgY3JlYXRlUmVsYXRpb25zaGlwKFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHNvdXJjZUlkLCBTdHJpbmcgdGFyZ2V0SWQsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFkZGl0aW9uYWxQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5OQU1FLCBuYW1lKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQsIHR5cGUpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQsIHNvdXJjZUlkKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydHlJZHMuVEFSR0VUX0lELCB0YXJnZXRJZCk7Ci0KLSAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0QWxsKGFkZGl0aW9uYWxQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbGllbnRTZXNzaW9uLmdldFNlc3Npb24oKS5jcmVhdGVSZWxhdGlvbnNoaXAocHJvcGVydGllcywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PE9iamVjdFR5cGU+IGdldFR5cGVzQXNMaXN0KFN0cmluZyByb290VHlwZUlkLCBib29sZWFuIGNyZWF0YWJsZU9ubHkpIHsKLSAgICAgICAgTGlzdDxPYmplY3RUeXBlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFR5cGU+KCk7Ci0KLSAgICAgICAgT2JqZWN0VHlwZSByb290VHlwZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByb290VHlwZSA9IGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpLmdldFR5cGVEZWZpbml0aW9uKHJvb3RUeXBlSWQpOwotICAgICAgICB9IGNhdGNoIChDbWlzQmFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxUcmVlPE9iamVjdFR5cGU+PiB0eXBlcyA9IGNsaWVudFNlc3Npb24uZ2V0U2Vzc2lvbigpLmdldFR5cGVEZXNjZW5kYW50cyhyb290VHlwZUlkLCAtMSwgdHJ1ZSk7Ci0gICAgICAgIGFkZFR5cGUodHlwZXMsIHJlc3VsdCwgY3JlYXRhYmxlT25seSk7Ci0KLSAgICAgICAgaWYgKGNyZWF0YWJsZU9ubHkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDcmVhdGFibGUgPSAocm9vdFR5cGUuaXNDcmVhdGFibGUoKSA9PSBudWxsID8gdHJ1ZSA6IHJvb3RUeXBlLmlzQ3JlYXRhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKGlzQ3JlYXRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChyb290VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHJvb3RUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBuZXcgQ29tcGFyYXRvcjxPYmplY3RUeXBlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3RUeXBlIG90MSwgT2JqZWN0VHlwZSBvdDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3QxLmdldERpc3BsYXlOYW1lKCkuY29tcGFyZVRvKG90Mi5nZXREaXNwbGF5TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVHlwZShMaXN0PFRyZWU8T2JqZWN0VHlwZT4+IHR5cGVzLCBMaXN0PE9iamVjdFR5cGU+IHJlc3VsdExpc3QsIGJvb2xlYW4gY3JlYXRhYmxlT25seSkgewotICAgICAgICBhc3NlcnQgdHlwZXMgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IHJlc3VsdExpc3QgIT0gbnVsbDsKLQotICAgICAgICBmb3IgKFRyZWU8T2JqZWN0VHlwZT4gdHQgOiB0eXBlcykgewotICAgICAgICAgICAgaWYgKHR0LmdldEl0ZW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNyZWF0YWJsZU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NyZWF0YWJsZSA9ICh0dC5nZXRJdGVtKCkuaXNDcmVhdGFibGUoKSA9PSBudWxsID8gdHJ1ZSA6IHR0LmdldEl0ZW0oKS5pc0NyZWF0YWJsZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ3JlYXRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRMaXN0LmFkZCh0dC5nZXRJdGVtKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGlzdC5hZGQodHQuZ2V0SXRlbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhZGRUeXBlKHR0LmdldENoaWxkcmVuKCksIHJlc3VsdExpc3QsIGNyZWF0YWJsZU9ubHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBGb2xkZXIgZ2V0Q3VycmVudEZvbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRGb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PENtaXNPYmplY3Q+IGdldEN1cnJlbnRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRDaGlsZHJlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIENtaXNPYmplY3QgZ2V0RnJvbUN1cnJlbnRDaGlsZHJlbihTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoY3VycmVudENoaWxkcmVuKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENtaXNPYmplY3QgbyA6IGN1cnJlbnRDaGlsZHJlbikgewotICAgICAgICAgICAgaWYgKG8uZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNldEN1cnJlbnRGb2xkZXIoRm9sZGVyIGZvbGRlciwgTGlzdDxDbWlzT2JqZWN0PiBjaGlsZHJlbikgewotICAgICAgICBjdXJyZW50Rm9sZGVyID0gZm9sZGVyOwotICAgICAgICBjdXJyZW50Q2hpbGRyZW4gPSBjaGlsZHJlbjsKLQotICAgICAgICBmb3IgKEZvbGRlckxpc3RlbmVyIGZsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhGb2xkZXJMaXN0ZW5lci5jbGFzcykpIHsKLSAgICAgICAgICAgIGZsLmZvbGRlckxvYWRlZChuZXcgQ2xpZW50TW9kZWxFdmVudCh0aGlzKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIENtaXNPYmplY3QgZ2V0Q3VycmVudE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRPYmplY3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDdXJyZW50T2JqZWN0KENtaXNPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIGN1cnJlbnRPYmplY3QgPSBvYmplY3Q7Ci0KLSAgICAgICAgZm9yIChPYmplY3RMaXN0ZW5lciBvbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoT2JqZWN0TGlzdGVuZXIuY2xhc3MpKSB7Ci0gICAgICAgICAgICBvbC5vYmplY3RMb2FkZWQobmV3IENsaWVudE1vZGVsRXZlbnQodGhpcykpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0NsaWVudE1vZGVsRXZlbnQuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9tb2RlbC9DbGllbnRNb2RlbEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZGFkYzguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0NsaWVudE1vZGVsRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRNb2RlbEV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgQ2xpZW50TW9kZWxFdmVudChPYmplY3Qgc291cmNlKSB7Ci0gICAgICAgIHN1cGVyKHNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENsaWVudE1vZGVsIGdldENsaWVudE1vZGVsKCkgewotICAgICAgICBpZiAoZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDbGllbnRNb2RlbCkgewotICAgICAgICAgICAgcmV0dXJuIChDbGllbnRNb2RlbCkgZ2V0U291cmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvbW9kZWwvQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0NsaWVudE9wZXJhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliMjE3Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvbW9kZWwvQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQucnVudGltZS5PcGVyYXRpb25Db250ZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkluY2x1ZGVSZWxhdGlvbnNoaXBzOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50T3BlcmF0aW9uQ29udGV4dCBleHRlbmRzIE9wZXJhdGlvbkNvbnRleHRJbXBsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSID0gImZpbHRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9BQ0xTID0gImluY2x1ZGVBY2xzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0FMTE9XQUJMRV9BQ1RJT05TID0gImluY2x1ZGVBbGxvd2FibGVBY3Rpb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1BPTElDSUVTID0gImluY2x1ZGVQb2xpY2llcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9SRUxBVElPTlNISVBTID0gImluY2x1ZGVSZWxhdGlvbnNoaXBzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU5ESVRJT05fRklMVEVSID0gInJlbmRpdGlvbkZpbHRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQlkgPSAib3JkZXJCeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0lURU1TX1BFUl9QQUdFID0gIm1heEl0ZW1zUGVyUGFnZSI7Ci0KLSAgICBwdWJsaWMgQ2xpZW50T3BlcmF0aW9uQ29udGV4dChTdHJpbmcgcHJlZml4LCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCkgewotICAgICAgICBsb2FkQ29udGV4dChwcmVmaXgsIG1hcCk7Ci0gICAgICAgIHNldEluY2x1ZGVQYXRoU2VnbWVudHMoZmFsc2UpOwotICAgICAgICBzZXRDYWNoZUVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZENvbnRleHQoU3RyaW5nIHByZWZpeCwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXApIHsKLSAgICAgICAgc2V0RmlsdGVyU3RyaW5nKG1hcC5nZXQocHJlZml4ICsgRklMVEVSKSk7Ci0gICAgICAgIHNldEluY2x1ZGVBY2xzKHBhcnNlQm9vbGVhbihtYXAuZ2V0KHByZWZpeCArIElOQ0xVREVfQUNMUyksIGZhbHNlKSk7Ci0gICAgICAgIHNldEluY2x1ZGVBbGxvd2FibGVBY3Rpb25zKHBhcnNlQm9vbGVhbihtYXAuZ2V0KHByZWZpeCArIElOQ0xVREVfQUxMT1dBQkxFX0FDVElPTlMpLCBmYWxzZSkpOwotICAgICAgICBzZXRJbmNsdWRlUG9saWNpZXMocGFyc2VCb29sZWFuKG1hcC5nZXQocHJlZml4ICsgSU5DTFVERV9QT0xJQ0lFUyksIGZhbHNlKSk7Ci0gICAgICAgIHNldEluY2x1ZGVSZWxhdGlvbnNoaXBzKHBhcnNlSW5jbHVkZVJlbGF0aW9uc2hpcHMobWFwLmdldChwcmVmaXggKyBJTkNMVURFX1JFTEFUSU9OU0hJUFMpLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUpKTsKLSAgICAgICAgc2V0UmVuZGl0aW9uRmlsdGVyU3RyaW5nKG1hcC5nZXQocHJlZml4ICsgUkVORElUSU9OX0ZJTFRFUikpOwotICAgICAgICBzZXRPcmRlckJ5KG1hcC5nZXQocHJlZml4ICsgT1JERVJfQlkpKTsKLSAgICAgICAgc2V0TWF4SXRlbXNQZXJQYWdlKHBhcnNlSW50ZWdlcihtYXAuZ2V0KHByZWZpeCArIE1BWF9JVEVNU19QRVJfUEFHRSksIDEwMDApKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VCb29sZWFuKFN0cmluZyBzLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICByZXR1cm4gKHMgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZSA6IEJvb2xlYW4ucGFyc2VCb29sZWFuKHMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluY2x1ZGVSZWxhdGlvbnNoaXBzIHBhcnNlSW5jbHVkZVJlbGF0aW9uc2hpcHMoU3RyaW5nIHMsIEluY2x1ZGVSZWxhdGlvbnNoaXBzIGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBpZiAocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBJbmNsdWRlUmVsYXRpb25zaGlwcy5mcm9tVmFsdWUocyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcGFyc2VJbnRlZ2VyKFN0cmluZyBzLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0gICAgICAgIGlmIChzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocyk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0NsaWVudFNlc3Npb24uamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9tb2RlbC9DbGllbnRTZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2ZmMmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0NsaWVudFNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuQXV0aGVudGljYXRvcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuWDUwOVRydXN0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5TZXNzaW9uUGFyYW1ldGVyTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLlNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLmNhY2hlLlR5cGVEZWZpbml0aW9uQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuU2Vzc2lvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5ydW50aW1lLmNhY2hlLkNhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuUHJvcGVydHlJZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5TZXNzaW9uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkJhc2VUeXBlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5CaW5kaW5nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLkNhcGFiaWxpdHlBY2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy5JbmNsdWRlUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLnNwaS5BdXRoZW50aWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRTZXNzaW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDbGllbnRTZXNzaW9uLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktCRU5DSF9QUkVGSVggPSAiY21pcy53b3JrYmVuY2guIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfUFJFRklYID0gV09SS0JFTkNIX1BSRUZJWCArICJvYmplY3QuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xERVJfUFJFRklYID0gV09SS0JFTkNIX1BSRUZJWCArICJmb2xkZXIuIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1BSRUZJWCA9IFdPUktCRU5DSF9QUkVGSVggKyAidmVyc2lvbi4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9TRUxGX1NJR05FRF9DRVJUSUZJQ0FURVMgPSBXT1JLQkVOQ0hfUFJFRklYICsgImFjY2VwdFNlbGZTaWduZWRDZXJ0aWZpY2F0ZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9GT0xERVJfQ0hJTERSRU4gPSBGT0xERVJfUFJFRklYICsgIm1heENoaWxkcmVuIjsKLQotICAgIHB1YmxpYyBlbnVtIEF1dGhlbnRpY2F0aW9uIHsKLSAgICAgICAgTk9ORSwgU1RBTkRBUkQsIE5UTE0sIE9BVVRIX0JFQVJFUgotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEZPTERFUl9QUk9QRVJUWV9TRVQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuT0JKRUNUX0lEKTsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICBGT0xERVJfUFJPUEVSVFlfU0VULmFkZChQcm9wZXJ0eUlkcy5OQU1FKTsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFKTsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTEVOR1RIKTsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fRklMRV9OQU1FKTsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuQ1JFQVRFRF9CWSk7Ci0gICAgICAgIEZPTERFUl9QUk9QRVJUWV9TRVQuYWRkKFByb3BlcnR5SWRzLkNSRUFUSU9OX0RBVEUpOwotICAgICAgICBGT0xERVJfUFJPUEVSVFlfU0VULmFkZChQcm9wZXJ0eUlkcy5MQVNUX01PRElGSUVEX0JZKTsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuTEFTVF9NT0RJRklDQVRJT05fREFURSk7Ci0gICAgICAgIEZPTERFUl9QUk9QRVJUWV9TRVQuYWRkKFByb3BlcnR5SWRzLklTX1ZFUlNJT05fU0VSSUVTX0NIRUNLRURfT1VUKTsKLSAgICAgICAgRk9MREVSX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuVkVSU0lPTl9TRVJJRVNfQ0hFQ0tFRF9PVVRfSUQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFZFUlNJT05fUFJPUEVSVFlfU0VUID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFZFUlNJT05fUFJPUEVSVFlfU0VULmFkZChQcm9wZXJ0eUlkcy5PQkpFQ1RfSUQpOwotICAgICAgICBWRVJTSU9OX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOwotICAgICAgICBWRVJTSU9OX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuTkFNRSk7Ci0gICAgICAgIFZFUlNJT05fUFJPUEVSVFlfU0VULmFkZChQcm9wZXJ0eUlkcy5WRVJTSU9OX0xBQkVMKTsKLSAgICAgICAgVkVSU0lPTl9QUk9QRVJUWV9TRVQuYWRkKFByb3BlcnR5SWRzLklTX0xBVEVTVF9WRVJTSU9OKTsKLSAgICAgICAgVkVSU0lPTl9QUk9QRVJUWV9TRVQuYWRkKFByb3BlcnR5SWRzLklTX01BSk9SX1ZFUlNJT04pOwotICAgICAgICBWRVJTSU9OX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuSVNfTEFURVNUX01BSk9SX1ZFUlNJT04pOwotICAgICAgICBWRVJTSU9OX1BST1BFUlRZX1NFVC5hZGQoUHJvcGVydHlJZHMuQ09OVEVOVF9TVFJFQU1fTUlNRV9UWVBFKTsKLSAgICAgICAgVkVSU0lPTl9QUk9QRVJUWV9TRVQuYWRkKFByb3BlcnR5SWRzLkNPTlRFTlRfU1RSRUFNX0xFTkdUSCk7Ci0gICAgICAgIFZFUlNJT05fUFJPUEVSVFlfU0VULmFkZChQcm9wZXJ0eUlkcy5DT05URU5UX1NUUkVBTV9GSUxFX05BTUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBzZXNzaW9uUGFyYW1ldGVyczsKLSAgICBwcml2YXRlIExpc3Q8UmVwb3NpdG9yeT4gcmVwb3NpdG9yaWVzOwotICAgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvYmplY3RPcGVyYXRpb25Db250ZXh0OwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBmb2xkZXJPcGVyYXRpb25Db250ZXh0OwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCB2ZXJzaW9uT3BlcmF0aW9uQ29udGV4dDsKLSAgICBwcml2YXRlIGludCBtYXhDaGlsZHJlbjsKLQotICAgIHB1YmxpYyBDbGllbnRTZXNzaW9uKE1hcDxTdHJpbmcsIFN0cmluZz4gc2Vzc2lvblBhcmFtZXRlcnMsIE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSwKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aGVudGljYXRpb25Qcm92aWRlciwgQ2FjaGUgY2FjaGUsIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uUGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25uZWN0KHNlc3Npb25QYXJhbWV0ZXJzLCBvYmplY3RGYWN0b3J5LCBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBjYWNoZSwgdHlwZURlZkNhY2hlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlc3Npb25QYXJhbWV0ZXJNYXAgY3JlYXRlU2Vzc2lvblBhcmFtZXRlcnMoU3RyaW5nIHVybCwgQmluZGluZ1R5cGUgYmluZGluZywgU3RyaW5nIHVzZXJuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkLCBBdXRoZW50aWNhdGlvbiBhdXRoZW50aWNhdGlvbiwgYm9vbGVhbiBjb21wcmVzc2lvbiwgYm9vbGVhbiBjbGllbnRDb21wcmVzc2lvbiwKLSAgICAgICAgICAgIGJvb2xlYW4gY29va2llcykgewotICAgICAgICBTZXNzaW9uUGFyYW1ldGVyTWFwIHBhcmFtZXRlcnMgPSBuZXcgU2Vzc2lvblBhcmFtZXRlck1hcCgpOwotCi0gICAgICAgIHN3aXRjaCAoYmluZGluZykgewotICAgICAgICBjYXNlIFdFQlNFUlZJQ0VTOgotICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRXZWJTZXJ2aWNlc0JpbmRpbmdVcmwodXJsKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFUT01QVUI6Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnNldEF0b21QdWJCaW5kaW5nVXJsKHVybCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUk9XU0VSOgotICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRCcm93c2VyQmluZGluZ1VybCh1cmwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChTZXNzaW9uUGFyYW1ldGVyLkJJTkRJTkdfVFlQRSwgQmluZGluZ1R5cGUuQ1VTVE9NLnZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChhdXRoZW50aWNhdGlvbikgewotICAgICAgICBjYXNlIFNUQU5EQVJEOgotICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRVc2VybmFtZVRva2VuQXV0aGVudGljYXRpb24odXNlcm5hbWUsIHBhc3N3b3JkLCB0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5UTE06Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnNldE50bG1BdXRoZW50aWNhdGlvbih1c2VybmFtZSwgcGFzc3dvcmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT0FVVEhfQkVBUkVSOgotICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRPQXV0aEJlYXJlclRva2VuQXV0aGVudGljYXRpb24odXNlcm5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLnNldE5vQXV0aGVudGljYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmFtZXRlcnMuc2V0Q29tcHJlc3Npb24oY29tcHJlc3Npb24pOwotICAgICAgICBwYXJhbWV0ZXJzLnNldENsaWVudENvbXByZXNzaW9uKGNsaWVudENvbXByZXNzaW9uKTsKLQotICAgICAgICBwYXJhbWV0ZXJzLnNldENvb2tpZXMoY29va2llcyk7Ci0KLSAgICAgICAgLy8gZ2V0IGFkZGl0aW9uYWwgd29ya2JlbmNoIHByb3BlcnRpZXMgZnJvbSBzeXN0ZW0gcHJvcGVydGllcwotICAgICAgICBQcm9wZXJ0aWVzIHN5c1Byb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogc3lzUHJvcHMuc3RyaW5nUHJvcGVydHlOYW1lcygpKSB7Ci0gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoV09SS0JFTkNIX1BSRUZJWCkpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChrZXksIHN5c1Byb3BzLmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHByb3h5IGF1dGhlbnRpY2F0aW9uCi0gICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHVybExvd2VyID0gdXJsLnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0KLSAgICAgICAgICAgIGlmICh1cmxMb3dlci5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlVc2VyID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5VXNlciIpOwotICAgICAgICAgICAgICAgIGlmIChwcm94eVVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlQYXNzd29yZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBhc3N3b3JkIik7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2V0UHJveHlVc2VyQW5kUGFzc3dvcmQocHJveHlVc2VyLCBwcm94eVBhc3N3b3JkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHVybExvd2VyLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlVc2VyID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwcy5wcm94eVVzZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAocHJveHlVc2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5UGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHBzLnByb3h5UGFzc3dvcmQiKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zZXRQcm94eVVzZXJBbmRQYXNzd29yZChwcm94eVVzZXIsIHByb3h5UGFzc3dvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25uZWN0KE1hcDxTdHJpbmcsIFN0cmluZz4gc2Vzc2lvblBhcmFtZXRlcnMsIE9iamVjdEZhY3Rvcnkgb2JqZWN0RmFjdG9yeSwKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIgYXV0aGVudGljYXRpb25Qcm92aWRlciwgQ2FjaGUgY2FjaGUsIFR5cGVEZWZpbml0aW9uQ2FjaGUgdHlwZURlZkNhY2hlKSB7Ci0gICAgICAgIHRoaXMuc2Vzc2lvblBhcmFtZXRlcnMgPSBzZXNzaW9uUGFyYW1ldGVyczsKLQotICAgICAgICAvLyBzZXQgYSBuZXcgZHVtbXkgYXV0aGVudGljYXRvcgotICAgICAgICAvLyBkb24ndCBzZW5kIHByZXZpb3VzIGNyZWRlbnRpYWxzIHRvIGFub3RoZXIgc2VydmVyCi0gICAgICAgIEF1dGhlbnRpY2F0b3Iuc2V0RGVmYXVsdChuZXcgQXV0aGVudGljYXRvcigpIHsKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKHNlc3Npb25QYXJhbWV0ZXJzLmdldChBQ0NFUFRfU0VMRl9TSUdORURfQ0VSVElGSUNBVEVTKSkpIHsKLSAgICAgICAgICAgIGFjY2VwdFNlbGZTaWduZWRDZXJ0aWZpY2F0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1heENoaWxkcmVuID0gLTE7Ci0gICAgICAgIFN0cmluZyBtYXhDaGlsZHJlblN0ciA9IHNlc3Npb25QYXJhbWV0ZXJzLmdldChNQVhfRk9MREVSX0NISUxEUkVOKTsKLSAgICAgICAgaWYgKG1heENoaWxkcmVuU3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWF4Q2hpbGRyZW4gPSBJbnRlZ2VyLnZhbHVlT2YobWF4Q2hpbGRyZW5TdHIudHJpbSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oIkludmFsaWQgIiArIE1BWF9GT0xERVJfQ0hJTERSRU4gKyAiIHBhcmFtZXRlciEiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJlcG9zaXRvcmllcyA9IFNlc3Npb25GYWN0b3J5SW1wbC5uZXdJbnN0YW5jZSgpLmdldFJlcG9zaXRvcmllcyhzZXNzaW9uUGFyYW1ldGVycywgb2JqZWN0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvblByb3ZpZGVyLCBjYWNoZSwgdHlwZURlZkNhY2hlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxSZXBvc2l0b3J5PiBnZXRSZXBvc2l0b3JpZXMoKSB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3JpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTZXNzaW9uIGNyZWF0ZVNlc3Npb24oaW50IGluZGV4KSB7Ci0gICAgICAgIHNlc3Npb24gPSByZXBvc2l0b3JpZXMuZ2V0KGluZGV4KS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iamVjdE9wZXJhdGlvbkNvbnRleHQgPSBudWxsOwotICAgICAgICBmb2xkZXJPcGVyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICAgICAgdmVyc2lvbk9wZXJhdGlvbkNvbnRleHQgPSBudWxsOwotICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFNlc3Npb25QYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHNlc3Npb25QYXJhbWV0ZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1heENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gbWF4Q2hpbGRyZW47Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPcGVyYXRpb25Db250ZXh0IGdldE9iamVjdE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChvYmplY3RPcGVyYXRpb25Db250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNyZWF0ZU9wZXJhdGlvbkNvbnRleHRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iamVjdE9wZXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPcGVyYXRpb25Db250ZXh0IGdldEZvbGRlck9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChmb2xkZXJPcGVyYXRpb25Db250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNyZWF0ZU9wZXJhdGlvbkNvbnRleHRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvbGRlck9wZXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPcGVyYXRpb25Db250ZXh0IGdldFZlcnNpb25PcGVyYXRpb25Db250ZXh0KCkgewotICAgICAgICBpZiAodmVyc2lvbk9wZXJhdGlvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgY3JlYXRlT3BlcmF0aW9uQ29udGV4dHMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmVyc2lvbk9wZXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU9wZXJhdGlvbkNvbnRleHRzKCkgewotCi0gICAgICAgIFJlcG9zaXRvcnlJbmZvIHJlcG9zaXRvcnlJbmZvID0gZ2V0U2Vzc2lvbigpLmdldFJlcG9zaXRvcnlJbmZvKCk7Ci0KLSAgICAgICAgU3RyaW5nIHN1cHBvcnRzQWNsID0gInRydWUiOwotICAgICAgICBpZiAocmVwb3NpdG9yeUluZm8gIT0gbnVsbCAmJiByZXBvc2l0b3J5SW5mby5nZXRDYXBhYmlsaXRpZXMoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgcmVwb3NpdG9yeUluZm8uZ2V0Q2FwYWJpbGl0aWVzKCkuZ2V0QWNsQ2FwYWJpbGl0eSgpID09IENhcGFiaWxpdHlBY2wuTk9ORSkgewotICAgICAgICAgICAgc3VwcG9ydHNBY2wgPSAiZmFsc2UiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gb2JqZWN0IG9wZXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIHNldERlZmF1bHQoT0JKRUNUX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMsIENsaWVudE9wZXJhdGlvbkNvbnRleHQuRklMVEVSLCAiKiIpOwotICAgICAgICBzZXREZWZhdWx0KE9CSkVDVF9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzLCBDbGllbnRPcGVyYXRpb25Db250ZXh0LklOQ0xVREVfQUNMUywgc3VwcG9ydHNBY2wpOwotICAgICAgICBzZXREZWZhdWx0KE9CSkVDVF9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzLCBDbGllbnRPcGVyYXRpb25Db250ZXh0LklOQ0xVREVfQUxMT1dBQkxFX0FDVElPTlMsICJ0cnVlIik7Ci0gICAgICAgIHNldERlZmF1bHQoT0JKRUNUX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMsIENsaWVudE9wZXJhdGlvbkNvbnRleHQuSU5DTFVERV9QT0xJQ0lFUywgInRydWUiKTsKLSAgICAgICAgc2V0RGVmYXVsdChPQkpFQ1RfUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycywgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5JTkNMVURFX1JFTEFUSU9OU0hJUFMsCi0gICAgICAgICAgICAgICAgSW5jbHVkZVJlbGF0aW9uc2hpcHMuQk9USC52YWx1ZSgpKTsKLSAgICAgICAgc2V0RGVmYXVsdChPQkpFQ1RfUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycywgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5SRU5ESVRJT05fRklMVEVSLCAiKiIpOwotICAgICAgICBzZXREZWZhdWx0KE9CSkVDVF9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzLCBDbGllbnRPcGVyYXRpb25Db250ZXh0Lk9SREVSX0JZLCBudWxsKTsKLSAgICAgICAgc2V0RGVmYXVsdChPQkpFQ1RfUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycywgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5NQVhfSVRFTVNfUEVSX1BBR0UsICIxMDAwIik7Ci0KLSAgICAgICAgb2JqZWN0T3BlcmF0aW9uQ29udGV4dCA9IG5ldyBDbGllbnRPcGVyYXRpb25Db250ZXh0KE9CSkVDVF9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzKTsKLQotICAgICAgICAvLyBmb2xkZXIgb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShGT0xERVJfUFJFRklYICsgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5GSUxURVIpKSB7Ci0gICAgICAgICAgICBPYmplY3RUeXBlIHR5cGUgPSBzZXNzaW9uLmdldFR5cGVEZWZpbml0aW9uKEJhc2VUeXBlSWQuQ01JU19ET0NVTUVOVC52YWx1ZSgpKTsKLQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBmaWx0ZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvcElkIDogRk9MREVSX1BST1BFUlRZX1NFVCkgewotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVmaW5pdGlvbjw/PiBwcm9wRGVmID0gdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCkuZ2V0KHByb3BJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmFwcGVuZCgnLCcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlci5hcHBlbmQocHJvcERlZi5nZXRRdWVyeU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXNzaW9uUGFyYW1ldGVycy5wdXQoRk9MREVSX1BSRUZJWCArIENsaWVudE9wZXJhdGlvbkNvbnRleHQuRklMVEVSLCBmaWx0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXREZWZhdWx0KEZPTERFUl9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzLCBDbGllbnRPcGVyYXRpb25Db250ZXh0LklOQ0xVREVfQUNMUywgImZhbHNlIik7Ci0gICAgICAgIHNldERlZmF1bHQoRk9MREVSX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMsIENsaWVudE9wZXJhdGlvbkNvbnRleHQuSU5DTFVERV9BTExPV0FCTEVfQUNUSU9OUywgImZhbHNlIik7Ci0gICAgICAgIHNldERlZmF1bHQoRk9MREVSX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMsIENsaWVudE9wZXJhdGlvbkNvbnRleHQuSU5DTFVERV9QT0xJQ0lFUywgImZhbHNlIik7Ci0gICAgICAgIHNldERlZmF1bHQoRk9MREVSX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMsIENsaWVudE9wZXJhdGlvbkNvbnRleHQuSU5DTFVERV9SRUxBVElPTlNISVBTLAotICAgICAgICAgICAgICAgIEluY2x1ZGVSZWxhdGlvbnNoaXBzLk5PTkUudmFsdWUoKSk7Ci0gICAgICAgIHNldERlZmF1bHQoRk9MREVSX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMsIENsaWVudE9wZXJhdGlvbkNvbnRleHQuUkVORElUSU9OX0ZJTFRFUiwgImNtaXM6bm9uZSIpOwotICAgICAgICBzZXREZWZhdWx0KEZPTERFUl9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzLCBDbGllbnRPcGVyYXRpb25Db250ZXh0Lk9SREVSX0JZLCBudWxsKTsKLSAgICAgICAgc2V0RGVmYXVsdChGT0xERVJfUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycywgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5NQVhfSVRFTVNfUEVSX1BBR0UsICIxMDAwMCIpOwotCi0gICAgICAgIGZvbGRlck9wZXJhdGlvbkNvbnRleHQgPSBuZXcgQ2xpZW50T3BlcmF0aW9uQ29udGV4dChGT0xERVJfUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycyk7Ci0KLSAgICAgICAgaWYgKCFzZXNzaW9uUGFyYW1ldGVycy5jb250YWluc0tleShWRVJTSU9OX1BSRUZJWCArIENsaWVudE9wZXJhdGlvbkNvbnRleHQuRklMVEVSKSkgewotICAgICAgICAgICAgT2JqZWN0VHlwZSB0eXBlID0gc2Vzc2lvbi5nZXRUeXBlRGVmaW5pdGlvbihCYXNlVHlwZUlkLkNNSVNfRE9DVU1FTlQudmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZmlsdGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHByb3BJZCA6IFZFUlNJT05fUFJPUEVSVFlfU0VUKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlEZWZpbml0aW9uPD8+IHByb3BEZWYgPSB0eXBlLmdldFByb3BlcnR5RGVmaW5pdGlvbnMoKS5nZXQocHJvcElkKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmFwcGVuZChwcm9wRGVmLmdldFF1ZXJ5TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlc3Npb25QYXJhbWV0ZXJzLnB1dChWRVJTSU9OX1BSRUZJWCArIENsaWVudE9wZXJhdGlvbkNvbnRleHQuRklMVEVSLCBmaWx0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXREZWZhdWx0KFZFUlNJT05fUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycywgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5JTkNMVURFX0FDTFMsICJmYWxzZSIpOwotICAgICAgICBzZXREZWZhdWx0KFZFUlNJT05fUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycywgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5JTkNMVURFX0FMTE9XQUJMRV9BQ1RJT05TLCAiZmFsc2UiKTsKLSAgICAgICAgc2V0RGVmYXVsdChWRVJTSU9OX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMsIENsaWVudE9wZXJhdGlvbkNvbnRleHQuSU5DTFVERV9QT0xJQ0lFUywgImZhbHNlIik7Ci0gICAgICAgIHNldERlZmF1bHQoVkVSU0lPTl9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzLCBDbGllbnRPcGVyYXRpb25Db250ZXh0LklOQ0xVREVfUkVMQVRJT05TSElQUywKLSAgICAgICAgICAgICAgICBJbmNsdWRlUmVsYXRpb25zaGlwcy5OT05FLnZhbHVlKCkpOwotICAgICAgICBzZXREZWZhdWx0KFZFUlNJT05fUFJFRklYLCBzZXNzaW9uUGFyYW1ldGVycywgQ2xpZW50T3BlcmF0aW9uQ29udGV4dC5SRU5ESVRJT05fRklMVEVSLCAiY21pczpub25lIik7Ci0gICAgICAgIHNldERlZmF1bHQoVkVSU0lPTl9QUkVGSVgsIHNlc3Npb25QYXJhbWV0ZXJzLCBDbGllbnRPcGVyYXRpb25Db250ZXh0Lk1BWF9JVEVNU19QRVJfUEFHRSwgIjEwMDAwIik7Ci0KLSAgICAgICAgdmVyc2lvbk9wZXJhdGlvbkNvbnRleHQgPSBuZXcgQ2xpZW50T3BlcmF0aW9uQ29udGV4dChWRVJTSU9OX1BSRUZJWCwgc2Vzc2lvblBhcmFtZXRlcnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBwcmVmaXgsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkocHJlZml4ICsga2V5KSkgewotICAgICAgICAgICAgbWFwLnB1dChwcmVmaXggKyBrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhY2NlcHRTZWxmU2lnbmVkQ2VydGlmaWNhdGVzKCkgewotICAgICAgICBUcnVzdE1hbmFnZXJbXSB0cnVzdEFsbENlcnRzID0gbmV3IFRydXN0TWFuYWdlcltdIHsgbmV3IFg1MDlUcnVzdE1hbmFnZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlW10gZ2V0QWNjZXB0ZWRJc3N1ZXJzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRpZmljYXRlWzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0NsaWVudFRydXN0ZWQoWDUwOUNlcnRpZmljYXRlW10gY2VydHMsIFN0cmluZyBhdXRoVHlwZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1NlcnZlclRydXN0ZWQoWDUwOUNlcnRpZmljYXRlW10gY2VydHMsIFN0cmluZyBhdXRoVHlwZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9IH07Ci0KLSAgICAgICAgSG9zdG5hbWVWZXJpZmllciBhY2NlcGN0QWxsSG9zdG5hbWVzID0gbmV3IEhvc3RuYW1lVmVyaWZpZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShTdHJpbmcgaG9zdG5hbWUsIFNTTFNlc3Npb24gc2Vzc2lvbikgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTU0xDb250ZXh0IHNjID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZSgiU1NMIik7Ci0gICAgICAgICAgICBzYy5pbml0KG51bGwsIHRydXN0QWxsQ2VydHMsIG5ldyBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbSgpKTsKLSAgICAgICAgICAgIEh0dHBzVVJMQ29ubmVjdGlvbi5zZXREZWZhdWx0U1NMU29ja2V0RmFjdG9yeShzYy5nZXRTb2NrZXRGYWN0b3J5KCkpOwotICAgICAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uLnNldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKGFjY2VwY3RBbGxIb3N0bmFtZXMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTE9HLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9tb2RlbC9Gb2xkZXJMaXN0ZW5lci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0ZvbGRlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZTE2ODUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL0ZvbGRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRm9sZGVyTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotICAgIHZvaWQgZm9sZGVyTG9hZGVkKENsaWVudE1vZGVsRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL21vZGVsL09iamVjdExpc3RlbmVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvbW9kZWwvT2JqZWN0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5YTRhNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvbW9kZWwvT2JqZWN0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotcHVibGljIGludGVyZmFjZSBPYmplY3RMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0gICAgdm9pZCBvYmplY3RMb2FkZWQoQ2xpZW50TW9kZWxFdmVudCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvQWN0aW9uUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9BY3Rpb25QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWExMTEwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9BY3Rpb25QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ3Vyc29yOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGaWxlQ2hvb3NlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS5DbWlzT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuQ21pc1ZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLkNsaWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2gubW9kZWwuQ2xpZW50TW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25QYW5lbCBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIENtaXNPYmplY3Qgb2JqZWN0OwotCi0gICAgcHJpdmF0ZSBKUGFuZWwgY2VudGVyUGFuZWw7Ci0KLSAgICBwdWJsaWMgQWN0aW9uUGFuZWwoU3RyaW5nIHRpdGxlLCBTdHJpbmcgYnV0dG9uTGFiZWwsIENsaWVudE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgY3JlYXRlR1VJKHRpdGxlLCBidXR0b25MYWJlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsaWVudE1vZGVsIGdldENsaWVudE1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KENtaXNPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBDbWlzT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ21pc1ZlcnNpb24gZ2V0Q21pc1ZlcnNpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kZWwuZ2V0UmVwb3NpdG9yeUluZm8oKS5nZXRDbWlzVmVyc2lvbigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIENtaXNWZXJzaW9uLkNNSVNfMV8wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdVSShTdHJpbmcgdGl0bGUsIFN0cmluZyBidXR0b25MYWJlbCkgewotICAgICAgICBCb3JkZXJMYXlvdXQgYm9yZGVyTGF5b3V0ID0gbmV3IEJvcmRlckxheW91dCgpOwotICAgICAgICBib3JkZXJMYXlvdXQuc2V0VmdhcCgzKTsKLSAgICAgICAgc2V0TGF5b3V0KGJvcmRlckxheW91dCk7Ci0KLSAgICAgICAgc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIHNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUNvbXBvdW5kQm9yZGVyKAotICAgICAgICAgICAgICAgIEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoNSwgNSwgNSwgNSksCi0gICAgICAgICAgICAgICAgQm9yZGVyRmFjdG9yeS5jcmVhdGVDb21wb3VuZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoQ29sb3IuR1JBWSwgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUsIDUsIDUsIDUpKSkpOwotCi0gICAgICAgIEZvbnQgbGFiZWxGb250ID0gVUlNYW5hZ2VyLmdldEZvbnQoIkxhYmVsLmZvbnQiKTsKLSAgICAgICAgRm9udCBib2xkRm9udCA9IGxhYmVsRm9udC5kZXJpdmVGb250KEZvbnQuQk9MRCwgbGFiZWxGb250LmdldFNpemUyRCgpICogMS4yZik7Ci0KLSAgICAgICAgSkxhYmVsIHRpdGxlTGFiZWwgPSBuZXcgSkxhYmVsKHRpdGxlKTsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRGb250KGJvbGRGb250KTsKLSAgICAgICAgYWRkKHRpdGxlTGFiZWwsIEJvcmRlckxheW91dC5QQUdFX1NUQVJUKTsKLQotICAgICAgICBjZW50ZXJQYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgY2VudGVyUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQoY2VudGVyUGFuZWwsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLSAgICAgICAgY2VudGVyUGFuZWwuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIGFkZChjZW50ZXJQYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgY3JlYXRlQWN0aW9uQ29tcG9uZW50cygpOwotCi0gICAgICAgIEpCdXR0b24gYWN0aW9uQnV0dG9uID0gbmV3IEpCdXR0b24oYnV0dG9uTGFiZWwpOwotICAgICAgICBhY3Rpb25CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIGFkZChhY3Rpb25CdXR0b24sIEJvcmRlckxheW91dC5QQUdFX0VORCk7Ci0KLSAgICAgICAgc2V0TWF4aW11bVNpemUobmV3IERpbWVuc2lvbihTaG9ydC5NQVhfVkFMVUUsIGdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25Db21wb25lbnQoSkNvbXBvbmVudCBjb21wKSB7Ci0gICAgICAgIGNvbXAuc2V0QWxpZ25tZW50WChMRUZUX0FMSUdOTUVOVCk7Ci0gICAgICAgIGNlbnRlclBhbmVsLmFkZChjb21wKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5XQUlUX0NVUlNPUikpOwotICAgICAgICAgICAgKChKQnV0dG9uKSBlLmdldFNvdXJjZSgpKS5yZXF1ZXN0Rm9jdXNJbldpbmRvdygpOwotICAgICAgICAgICAgaWYgKGRvQWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5yZWxvYWRPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1vZGVsLnJlbG9hZEZvbGRlcigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIENsaWVudEhlbHBlci5zaG93RXJyb3IobnVsbCwgZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQWN0aW9uQ29tcG9uZW50cygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBbGxvd2VkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9iamVjdCBzaG91bGQgYmUgcmVsb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZG9BY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgcHJvdGVjdGVkIEpQYW5lbCBjcmVhdGVGaWxlbmFtZVBhbmVsKGZpbmFsIEpUZXh0RmllbGQgZmlsZW5hbWVGaWVsZCkgewotICAgICAgICBKUGFuZWwgZmlsZVBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICBmaWxlUGFuZWwuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0KLSAgICAgICAgZmlsZVBhbmVsLmFkZChuZXcgSkxhYmVsKCJGaWxlOiIpLCBCb3JkZXJMYXlvdXQuTElORV9TVEFSVCk7Ci0KLSAgICAgICAgZmlsZVBhbmVsLmFkZChmaWxlbmFtZUZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQotICAgICAgICBKQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJCcm93c2UiKTsKLSAgICAgICAgYnJvd3NlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSkZpbGVDaG9vc2VyIGZpbGVDaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOwotICAgICAgICAgICAgICAgIGludCBjaG9vc2VSZXN1bHQgPSBmaWxlQ2hvb3Nlci5zaG93RGlhbG9nKGZpbGVuYW1lRmllbGQsICJTZWxlY3QiKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hvb3NlUmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCkuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lRmllbGQuc2V0VGV4dChmaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBmaWxlUGFuZWwuYWRkKGJyb3dzZUJ1dHRvbiwgQm9yZGVyTGF5b3V0LkxJTkVfRU5EKTsKLQotICAgICAgICByZXR1cm4gZmlsZVBhbmVsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9Db2xsZWN0aW9uUmVuZGVyZXIuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9Db2xsZWN0aW9uUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjZWU4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvQ29sbGVjdGlvblJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkRlZmF1bHRUYWJsZUNlbGxSZW5kZXJlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGVmaW5pdGlvbnMuQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5DbGllbnRIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TRVRfQ09MT1I7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBDb2xvciBub3RTZXRDb2xvciA9IFVJTWFuYWdlci5nZXRDb2xvcigiTGFiZWwuZGlzYWJsZWRUZXh0Iik7Ci0gICAgICAgIGlmIChub3RTZXRDb2xvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBOT1RfU0VUX0NPTE9SID0gU3RyaW5nLmZvcm1hdCgiIyUxJDAyeCUyJDAyeCUzJDAyeCIsIG5vdFNldENvbG9yLmdldFJlZCgpLCBub3RTZXRDb2xvci5nZXRHcmVlbigpLAotICAgICAgICAgICAgICAgICAgICBub3RTZXRDb2xvci5nZXRCbHVlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTk9UX1NFVF9DT0xPUiA9ICIjOGU4ZjkxIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uUmVuZGVyZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVGFibGUgdGFibGUsIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBpc1NlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLAotICAgICAgICAgICAgaW50IHJvdywgaW50IGNvbHVtbikgewotICAgICAgICBDb21wb25lbnQgY29tcCA9IHN1cGVyLmdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRhYmxlLCB2YWx1ZSwgaXNTZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKTsKLQotICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgZ2V0UHJlZmVycmVkU2l6ZSgpLmdldEhlaWdodCgpOwotICAgICAgICBpZiAoaGVpZ2h0ID4gKGdldEZvbnRNZXRyaWNzKGdldEZvbnQoKSkuZ2V0SGVpZ2h0KCkgKyBnZXRJbnNldHMoKS5ib3R0b20gKyBnZXRJbnNldHMoKS50b3ApKSB7Ci0gICAgICAgICAgICBpZiAodGFibGUuZ2V0Um93SGVpZ2h0KHJvdykgIT0gaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgdGFibGUuc2V0Um93SGVpZ2h0KHJvdywgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb21wOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBDb2xsZWN0aW9uPD8+IGNvbCA9IChDb2xsZWN0aW9uPD8+KSB2YWx1ZTsKLQotICAgICAgICBpZiAoY29sID09IG51bGwgfHwgY29sLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3VwZXIuc2V0VmFsdWUoIjxodG1sPjxzcGFuPjxmb250IGNvbG9yPSIgKyBOT1RfU0VUX0NPTE9SICsgIj48aT5ub3Qgc2V0PC9pPjwvZm9udD48L3NwYW4+Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWlsZCBzdHJpbmcKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCI8aHRtbD4iKTsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IGNvbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI8c3Bhbj4iKTsgLy8gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gU3dpbmcKLSAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjxpPm51bGw8L2k+Iik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChDbGllbnRIZWxwZXIuZ2V0RGF0ZVN0cmluZygoR3JlZ29yaWFuQ2FsZW5kYXIpIG8pKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENob2ljZTw/PikgewotICAgICAgICAgICAgICAgIE9iamVjdCBjaG9pY2VWYWx1ZSA9ICgoQ2hvaWNlPD8+KSBvKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjaG9pY2VWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPGk+bnVsbDwvaT4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBHcmVnb3JpYW5DYWxlbmRhcikgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoQ2xpZW50SGVscGVyLmdldERhdGVTdHJpbmcoKEdyZWdvcmlhbkNhbGVuZGFyKSBvKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLmVuY29kZUh0bWwoc2IsIGNob2ljZVZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLmVuY29kZUh0bWwoc2IsIG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIjwvc3Bhbj48YnIvPiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHNiLmFwcGVuZCgiPC9odG1sPiIpOwotCi0gICAgICAgIHN1cGVyLnNldFZhbHVlKHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9DcmVhdGVEaWFsb2cuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9DcmVhdGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0YWRmMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvQ3JlYXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHM7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0xheW91dDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5KRGlhbG9nOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0RmllbGQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5Qcm9wZXJ0eUlkczsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlByb3BlcnR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLlR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5DbGllbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLm1vZGVsLkNsaWVudE1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ3JlYXRlRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgQ2xpZW50TW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKUGFuZWwgcGFuZWw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKUGFuZWwgbWFuZGF0b3J5UHJvcGVydGllc1BhbmVsOwotICAgIHByaXZhdGUgZmluYWwgSlBhbmVsIGFjdGlvblBhbmVsOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSkNvbXBvbmVudD4gbWFuZGF0b3J5UHJvcGVydGllczsKLQotICAgIHB1YmxpYyBDcmVhdGVEaWFsb2coRnJhbWUgb3duZXIsIFN0cmluZyB0aXRsZSwgQ2xpZW50TW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc3VwZXIob3duZXIsIHRpdGxlLCB0cnVlKTsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotCi0gICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICBwYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0gICAgICAgIHBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEwLCAxMCwgMTAsIDEwKSk7Ci0gICAgICAgIGFkZChwYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLSAgICAgICAgbWFuZGF0b3J5UHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSkNvbXBvbmVudD4oKTsKLSAgICAgICAgbWFuZGF0b3J5UHJvcGVydGllc1BhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgbWFuZGF0b3J5UHJvcGVydGllc1BhbmVsCi0gICAgICAgICAgICAgICAgLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUNvbXBvdW5kQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMTAsIDAsIDAsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoIk1hbmRhdG9yeSBwcm9wZXJ0aWVzIikpKTsKLQotICAgICAgICBhY3Rpb25QYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgY3JlYXRlUm93KGFjdGlvblBhbmVsLCAxMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsaWVudE1vZGVsIGdldENsaWVudE1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlUm93KFN0cmluZyBsYWJlbCwgSkNvbXBvbmVudCBjb21wLCBpbnQgcm93KSB7Ci0gICAgICAgIGNyZWF0ZVJvdyhwYW5lbCwgbGFiZWwsIGNvbXAsIHJvdyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlQWN0aW9uUm93KFN0cmluZyBsYWJlbCwgSkNvbXBvbmVudCBjb21wLCBpbnQgcm93KSB7Ci0gICAgICAgIGNyZWF0ZVJvdyhhY3Rpb25QYW5lbCwgbGFiZWwsIGNvbXAsIHJvdyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlUm93KEpQYW5lbCBwYW5lbCwgU3RyaW5nIGxhYmVsLCBKQ29tcG9uZW50IGNvbXAsIGludCByb3cpIHsKLSAgICAgICAgSkxhYmVsIHRleHRMYWJlbCA9IG5ldyBKTGFiZWwobGFiZWwpOwotICAgICAgICB0ZXh0TGFiZWwuc2V0TGFiZWxGb3IoY29tcCk7Ci0KLSAgICAgICAgR3JpZEJhZ0NvbnN0cmFpbnRzIGMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0gICAgICAgIGMuYW5jaG9yID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkxJTkVfU1RBUlQ7Ci0gICAgICAgIGMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOwotICAgICAgICBjLmdyaWR4ID0gMDsKLSAgICAgICAgYy5ncmlkeSA9IHJvdzsKLSAgICAgICAgcGFuZWwuYWRkKHRleHRMYWJlbCwgYyk7Ci0gICAgICAgIGMuZ3JpZHggPSAxOwotICAgICAgICBwYW5lbC5hZGQoY29tcCwgYyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlUm93KEpDb21wb25lbnQgY29tcCwgaW50IHJvdykgewotICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgYyA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLSAgICAgICAgYy5hbmNob3IgPSBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVDsKLSAgICAgICAgYy5maWxsID0gR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUw7Ci0gICAgICAgIGMuZ3JpZHggPSAwOwotICAgICAgICBjLmdyaWR5ID0gcm93OwotICAgICAgICBjLmdyaWR3aWR0aCA9IDI7Ci0gICAgICAgIHBhbmVsLmFkZChjb21wLCBjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzaG93RGlhbG9nKCkgewotICAgICAgICBwYW5lbC5pbnZhbGlkYXRlKCk7Ci0KLSAgICAgICAgQ2xpZW50SGVscGVyLmluc3RhbGxFc2NhcGVCaW5kaW5nKHRoaXMsIGdldFJvb3RQYW5lKCksIHRydWUpOwotCi0gICAgICAgIHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRElTUE9TRV9PTl9DTE9TRSk7Ci0gICAgICAgIHBhY2soKTsKLSAgICAgICAgc2V0TG9jYXRpb25SZWxhdGl2ZVRvKG51bGwpOwotICAgICAgICBzZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBnZXRUeXBlcyhTdHJpbmcgcm9vdFR5cGVJZCkgewotICAgICAgICBMaXN0PE9iamVjdFR5cGU+IHR5cGVzID0gbW9kZWwuZ2V0VHlwZXNBc0xpc3Qocm9vdFR5cGVJZCwgdHJ1ZSk7Ci0KLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFt0eXBlcy5zaXplKCldOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChmaW5hbCBPYmplY3RUeXBlIHR5cGUgOiB0eXBlcykgewotICAgICAgICAgICAgcmVzdWx0W2ldID0gbmV3IE9iamVjdFR5cGVJdGVtKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3RUeXBlIGdldE9iamVjdFR5cGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmdldERpc3BsYXlOYW1lKCkgKyAiICgiICsgdHlwZS5nZXRJZCgpICsgIikiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgdXBkYXRlTWFuZGF0b3J5RmllbGRzKFR5cGVEZWZpbml0aW9uIHR5cGUpIHsKLSAgICAgICAgbWFuZGF0b3J5UHJvcGVydGllcy5jbGVhcigpOwotICAgICAgICBtYW5kYXRvcnlQcm9wZXJ0aWVzUGFuZWwucmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgUHJvcGVydHlEZWZpbml0aW9uPD8+PiBwcm9wZXJ0eURlZmluaXRpb25zID0gdHlwZS5nZXRQcm9wZXJ0eURlZmluaXRpb25zKCk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eURlZmluaXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCByb3cgPSAwOwotICAgICAgICAgICAgZm9yIChQcm9wZXJ0eURlZmluaXRpb248Pz4gZGVmaW5pdGlvbiA6IHByb3BlcnR5RGVmaW5pdGlvbnMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5pc1JlcXVpcmVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICEoUHJvcGVydHlJZHMuTkFNRS5lcXVhbHMoZGVmaW5pdGlvbi5nZXRJZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRC5lcXVhbHMoZGVmaW5pdGlvbi5nZXRJZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBQcm9wZXJ0eUlkcy5TT1VSQ0VfSUQuZXF1YWxzKGRlZmluaXRpb24uZ2V0SWQoKSkgfHwgUHJvcGVydHlJZHMuVEFSR0VUX0lECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGRlZmluaXRpb24uZ2V0SWQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEpDb21wb25lbnQgY2hpbGQgPSBjcmVhdGVQcm9wZXJ0eUNvbXBvbmVudChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5UHJvcGVydGllcy5wdXQoZGVmaW5pdGlvbi5nZXRJZCgpLCBjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVJvdyhtYW5kYXRvcnlQcm9wZXJ0aWVzUGFuZWwsIGRlZmluaXRpb24uZ2V0RGlzcGxheU5hbWUoKSArICI6IiwgY2hpbGQsIHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYW5kYXRvcnlQcm9wZXJ0aWVzUGFuZWwuZ2V0Q29tcG9uZW50cygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGNyZWF0ZVJvdyhtYW5kYXRvcnlQcm9wZXJ0aWVzUGFuZWwsIDkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFuZWwucmVtb3ZlKG1hbmRhdG9yeVByb3BlcnRpZXNQYW5lbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYWNrKCk7Ci0gICAgICAgIHJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSkNvbXBvbmVudCBjcmVhdGVQcm9wZXJ0eUNvbXBvbmVudChQcm9wZXJ0eURlZmluaXRpb248Pz4gZGVmaW5pdGlvbikgewotICAgICAgICBmaW5hbCBQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlID0gZGVmaW5pdGlvbi5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgSkNvbXBvbmVudCByZXN1bHQ7Ci0gICAgICAgIHN3aXRjaCAocHJvcGVydHlUeXBlKSB7Ci0gICAgICAgIGNhc2UgQk9PTEVBTjoKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBKQ2hlY2tCb3goKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEpUZXh0RmllbGQoIiIsIDUwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRNYW5kYXRvcnlQcm9wZXJ0eVZhbHVlcygpIHsKLSAgICAgICAgaWYgKG1hbmRhdG9yeVByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBKQ29tcG9uZW50PiBjb21wb25lbnQgOiBtYW5kYXRvcnlQcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBKVGV4dEZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAoKEpUZXh0RmllbGQpIGNvbXBvbmVudC5nZXRWYWx1ZSgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgSkNoZWNrQm94KSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSAoKEpDaGVja0JveCkgY29tcG9uZW50LmdldFZhbHVlKCkpLmlzU2VsZWN0ZWQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LnB1dChjb21wb25lbnQuZ2V0S2V5KCksIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBPYmplY3RUeXBlSXRlbSB7Ci0gICAgICAgIE9iamVjdFR5cGUgZ2V0T2JqZWN0VHlwZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9HcmVnb3JpYW5DYWxlbmRhclJlbmRlcmVyLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvR3JlZ29yaWFuQ2FsZW5kYXJSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzBmMzU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9HcmVnb3JpYW5DYWxlbmRhclJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotCi1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlQ2VsbFJlbmRlcmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLkNsaWVudEhlbHBlcjsKLQotcHVibGljIGNsYXNzIEdyZWdvcmlhbkNhbGVuZGFyUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVDZWxsUmVuZGVyZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHVibGljIEdyZWdvcmlhbkNhbGVuZGFyUmVuZGVyZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHNldFRleHQoQ2xpZW50SGVscGVyLmdldERhdGVTdHJpbmcoKEdyZWdvcmlhbkNhbGVuZGFyKSB2YWx1ZSkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvSWRSZW5kZXJlci5qYXZhIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvd29ya2JlbmNoL3N3aW5nL0lkUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlMzdmMy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvSWRSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy50YWJsZS5EZWZhdWx0VGFibGVDZWxsUmVuZGVyZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLk9iamVjdElkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5DbGllbnRIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBJZFJlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdFRhYmxlQ2VsbFJlbmRlcmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBJZFJlbmRlcmVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywKLSAgICAgICAgICAgIGludCByb3csIGludCBjb2x1bW4pIHsKLSAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBzdXBlci5nZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudCh0YWJsZSwgdmFsdWUsIGlzU2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbik7Ci0gICAgICAgIGNvbXAuc2V0Rm9yZWdyb3VuZChpc1NlbGVjdGVkID8gQ2xpZW50SGVscGVyLkxJTktfU0VMRUNURURfQ09MT1IgOiBDbGllbnRIZWxwZXIuTElOS19DT0xPUik7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gIiI7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdElkKSB7Ci0gICAgICAgICAgICBpZiAoKChPYmplY3RJZCkgdmFsdWUpLmdldElkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiPGh0bWw+PHU+Iik7Ci0gICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLmVuY29kZUh0bWwoc2IsICgoT2JqZWN0SWQpIHZhbHVlKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjwvdT48L2h0bWw+Iik7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRUZXh0KHRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9JbmZvUGFuZWwuamF2YSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9JbmZvUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2MmY5Ni4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvSW5mb1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5zd2luZzsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuQ29sbGVjdGlvbnNIZWxwZXIuKjsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkN1cnNvcjsKLWltcG9ydCBqYXZhLmF3dC5EZXNrdG9wOwotaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZhLmF3dC5Gb250TWV0cmljczsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHM7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5JbnNldHM7Ci1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7Ci1pbXBvcnQgamF2YS5hd3QuZGF0YXRyYW5zZmVyLkNsaXBib2FyZDsKLWltcG9ydCBqYXZhLmF3dC5kYXRhdHJhbnNmZXIuU3RyaW5nU2VsZWN0aW9uOwotaW1wb3J0IGphdmEuYXd0LmRhdGF0cmFuc2Zlci5UcmFuc2ZlcmFibGU7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkltYWdlSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTWVudUl0ZW07Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQb3B1cE1lbnU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guQ2xpZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5tb2RlbC5DbGllbnRNb2RlbDsKLQotaW1wb3J0IGNvbS5nb29nbGUuenhpbmcuQmFyY29kZUZvcm1hdDsKLWltcG9ydCBjb20uZ29vZ2xlLnp4aW5nLkVuY29kZUhpbnRUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuenhpbmcuV3JpdGVyRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuenhpbmcuY2xpZW50Lmoyc2UuTWF0cml4VG9JbWFnZVdyaXRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLnp4aW5nLmNvbW1vbi5CaXRNYXRyaXg7Ci1pbXBvcnQgY29tLmdvb2dsZS56eGluZy5xcmNvZGUuUVJDb2RlV3JpdGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5mb1BhbmVsIGV4dGVuZHMgSlBhbmVsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgSlBhbmVsIGdyaWRQYW5lbDsKLSAgICBwcml2YXRlIEdyaWRCYWdDb25zdHJhaW50cyBnYmM7Ci0gICAgcHJpdmF0ZSBGb250IGJvbGRGb250OwotCi0gICAgcHVibGljIEluZm9QYW5lbChDbGllbnRNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsaWVudE1vZGVsIGdldENsaWVudE1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBHVUkoKSB7Ci0gICAgICAgIHNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKLSAgICAgICAgc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0KLSAgICAgICAgZ3JpZFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgZ3JpZFBhbmVsLnNldEJhY2tncm91bmQoQ29sb3IuV0hJVEUpOwotICAgICAgICBhZGQoZ3JpZFBhbmVsKTsKLQotICAgICAgICBnYmMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0KLSAgICAgICAgZ2JjLmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuQk9USDsKLSAgICAgICAgZ2JjLmdyaWR5ID0gMDsKLSAgICAgICAgZ2JjLmluc2V0cyA9IG5ldyBJbnNldHMoMywgMywgMywgMyk7Ci0KLSAgICAgICAgRm9udCBsYWJlbEZvbnQgPSBVSU1hbmFnZXIuZ2V0Rm9udCgiTGFiZWwuZm9udCIpOwotICAgICAgICBib2xkRm9udCA9IGxhYmVsRm9udC5kZXJpdmVGb250KEZvbnQuQk9MRCwgbGFiZWxGb250LmdldFNpemUyRCgpICogMS4yZik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEpUZXh0RmllbGQgYWRkTGluZShmaW5hbCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgcmV0dXJuIGFkZExpbmUobGFiZWwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSlRleHRGaWVsZCBhZGRMaW5lKGZpbmFsIFN0cmluZyBsYWJlbCwgZmluYWwgYm9vbGVhbiBib2xkKSB7Ci0gICAgICAgIHJldHVybiBhZGRMaW5lKGxhYmVsLCBib2xkLCBuZXcgSlRleHRGaWVsZCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSlRleHRGaWVsZCBhZGRMaW5lKGZpbmFsIFN0cmluZyBsYWJlbCwgZmluYWwgYm9vbGVhbiBib2xkLCBKVGV4dEZpZWxkIHRleHRGaWVsZCkgewotICAgICAgICB0ZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICB0ZXh0RmllbGQuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSk7Ci0gICAgICAgIGlmIChib2xkKSB7Ci0gICAgICAgICAgICB0ZXh0RmllbGQuc2V0Rm9udChib2xkRm9udCk7Ci0gICAgICAgIH0KLQotICAgICAgICBKTGFiZWwgdGV4dExhYmxlID0gbmV3IEpMYWJlbChsYWJlbCk7Ci0gICAgICAgIHRleHRMYWJsZS5zZXRMYWJlbEZvcih0ZXh0RmllbGQpOwotICAgICAgICBpZiAoYm9sZCkgewotICAgICAgICAgICAgdGV4dExhYmxlLnNldEZvbnQoYm9sZEZvbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2JjLmdyaWR5Kys7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMDsKLSAgICAgICAgZ2JjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5CQVNFTElORV9UUkFJTElORzsKLSAgICAgICAgZ3JpZFBhbmVsLmFkZCh0ZXh0TGFibGUsIGdiYyk7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMTsKLSAgICAgICAgZ2JjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5CQVNFTElORV9MRUFESU5HOwotICAgICAgICBncmlkUGFuZWwuYWRkKHRleHRGaWVsZCwgZ2JjKTsKLQotICAgICAgICByZXR1cm4gdGV4dEZpZWxkOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBKVGV4dEZpZWxkIGFkZElkKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gYWRkTGluZShsYWJlbCwgZmFsc2UsIG5ldyBJZFRleHRGaWVsZCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSlRleHRGaWVsZCBhZGRMaW5rKGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgICByZXR1cm4gYWRkTGluZShsYWJlbCwgZmFsc2UsIG5ldyBVcmxUZXh0RmllbGQoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFllc05vTGFiZWwgYWRkWWVzTm9MYWJlbChTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgWWVzTm9MYWJlbCB5bmwgPSBuZXcgWWVzTm9MYWJlbCgpOwotCi0gICAgICAgIEpMYWJlbCB0ZXh0TGFibGUgPSBuZXcgSkxhYmVsKGxhYmVsKTsKLSAgICAgICAgdGV4dExhYmxlLnNldExhYmVsRm9yKHlubCk7Ci0KLSAgICAgICAgZ2JjLmdyaWR5Kys7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMDsKLSAgICAgICAgZ2JjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5CQVNFTElORV9UUkFJTElORzsKLSAgICAgICAgZ3JpZFBhbmVsLmFkZCh0ZXh0TGFibGUsIGdiYyk7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMTsKLSAgICAgICAgZ2JjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5CQVNFTElORV9MRUFESU5HOwotICAgICAgICBncmlkUGFuZWwuYWRkKHlubCwgZ2JjKTsKLQotICAgICAgICByZXR1cm4geW5sOwotICAgIH0KLQotICAgIHByb3RlY3RlZCA8VCBleHRlbmRzIEpDb21wb25lbnQ+IFQgYWRkQ29tcG9uZW50KFN0cmluZyBsYWJlbCwgVCBjb21wKSB7Ci0gICAgICAgIEpMYWJlbCB0ZXh0TGFibGUgPSBuZXcgSkxhYmVsKGxhYmVsKTsKLQotICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgIHBhbmVsLnNldExheW91dChuZXcgQm94TGF5b3V0KHBhbmVsLCBCb3hMYXlvdXQuTElORV9BWElTKSk7Ci0gICAgICAgIHBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCkpOwotICAgICAgICBwYW5lbC5zZXRPcGFxdWUoZmFsc2UpOwotICAgICAgICBwYW5lbC5hZGQoY29tcCk7Ci0gICAgICAgIHRleHRMYWJsZS5zZXRMYWJlbEZvcihwYW5lbCk7Ci0KLSAgICAgICAgZ2JjLmdyaWR5Kys7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMDsKLSAgICAgICAgZ2JjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5CQVNFTElORV9UUkFJTElORzsKLSAgICAgICAgZ3JpZFBhbmVsLmFkZCh0ZXh0TGFibGUsIGdiYyk7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMTsKLSAgICAgICAgZ2JjLmFuY2hvciA9IEdyaWRCYWdDb25zdHJhaW50cy5CQVNFTElORV9MRUFESU5HOwotICAgICAgICBncmlkUGFuZWwuYWRkKHBhbmVsLCBnYmMpOwotCi0gICAgICAgIHJldHVybiBjb21wOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5mb0xpc3QgZXh0ZW5kcyBKUGFuZWwgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgSW5mb0xpc3QoKSB7Ci0gICAgICAgICAgICBzZXRMYXlvdXQobmV3IEJveExheW91dCh0aGlzLCBCb3hMYXlvdXQuWV9BWElTKSk7Ci0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kKENvbG9yLldISVRFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgcmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0KENvbGxlY3Rpb248Pz4gbGlzdCkgewotICAgICAgICAgICAgY2xlYXIoKTsKLQotICAgICAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkobGlzdCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgSlRleHRGaWVsZCB0ZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZChvID09IG51bGwgPyAiIiA6IG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgdGV4dEZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB0ZXh0RmllbGQuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgMCwgMiwgMCkpOwotICAgICAgICAgICAgICAgIGFkZCh0ZXh0RmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDbGlja2FibGVUZXh0RmllbGQgZXh0ZW5kcyBKVGV4dEZpZWxkIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGluazsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZWQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBKUG9wdXBNZW51IHBvcHVwOwotCi0gICAgICAgIHB1YmxpYyBDbGlja2FibGVUZXh0RmllbGQoKSB7Ci0gICAgICAgICAgICBwb3B1cCA9IG5ldyBKUG9wdXBNZW51KCk7Ci0gICAgICAgICAgICBmaW5hbCBKTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJDb3B5IHRvIGNsaXBib2FyZCIpOwotICAgICAgICAgICAgcG9wdXAuYWRkKG1lbnVJdGVtKTsKLQotICAgICAgICAgICAgbWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsaXBib2FyZCBjbGlwYm9hcmQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U3lzdGVtQ2xpcGJvYXJkKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyYWJsZSB0cmFuc2ZlcmFibGUgPSBuZXcgU3RyaW5nU2VsZWN0aW9uKGxpbmspOwotICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0Q29udGVudHModHJhbnNmZXJhYmxlLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN3aW5nVXRpbGl0aWVzLmlzTGVmdE1vdXNlQnV0dG9uKGUpICYmIGUuZ2V0Q2xpY2tDb3VudCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rQWN0aW9uKGxpbmspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKEluZm9QYW5lbC50aGlzLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VQcmVzc2VkKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBtYXliZVNob3dQb3B1cChlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBtYXliZVNob3dQb3B1cChlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgbWF5YmVTaG93UG9wdXAoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlLmlzUG9wdXBUcmlnZ2VyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwLnNob3coZS5nZXRDb21wb25lbnQoKSwgZS5nZXRYKCksIGUuZ2V0WSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEpQb3B1cE1lbnUgZ2V0UG9wdXBNZW51KCkgewotICAgICAgICAgICAgcmV0dXJuIHBvcHVwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMaW5rKFN0cmluZyBsaW5rKTsKLQotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ29sb3IgZ2V0TGlua0NvbG9yKFN0cmluZyBsaW5rKTsKLQotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsaW5rQWN0aW9uKFN0cmluZyBsaW5rKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgaWYgKCFpc0xpbmsodGV4dCkpIHsKLSAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKFVJTWFuYWdlci5nZXRDb2xvcigidGV4dEZvcmVncm91bmQiKSk7Ci0gICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5ERUZBVUxUX0NVUlNPUikpOwotICAgICAgICAgICAgICAgIHBvcHVwLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGxpbmsgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRGb3JlZ3JvdW5kKGdldExpbmtDb2xvcih0ZXh0KSk7Ci0gICAgICAgICAgICAgICAgc2V0Q3Vyc29yKEN1cnNvci5nZXRQcmVkZWZpbmVkQ3Vyc29yKEN1cnNvci5IQU5EX0NVUlNPUikpOwotICAgICAgICAgICAgICAgIHBvcHVwLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbGluayA9IHRleHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOwotCi0gICAgICAgICAgICBzdXBlci5zZXRUZXh0KHRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJldmFsaWRhdGUoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVwYWludChsb25nIHRtLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5yZXBhaW50KHRtLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVwYWludChSZWN0YW5nbGUgcikgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsKLSAgICAgICAgICAgIHN1cGVyLnBhaW50Q29tcG9uZW50KGcpOwotCi0gICAgICAgICAgICBpZiAobGluayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRm9udE1ldHJpY3MgZm0gPSBnZXRGb250TWV0cmljcyhnZXRGb250KCkpOwotCi0gICAgICAgICAgICAgICAgaW50IHkxID0gZm0uZ2V0SGVpZ2h0KCkgLSAyOwotICAgICAgICAgICAgICAgIGludCB4MiA9IGZtLnN0cmluZ1dpZHRoKGxpbmspOwotICAgICAgICAgICAgICAgIGcuc2V0Q29sb3IoZ2V0TGlua0NvbG9yKGxpbmspKTsKLSAgICAgICAgICAgICAgICBnLmRyYXdMaW5lKDAsIHkxLCB4MiwgeTEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBJZFRleHRGaWVsZCBleHRlbmRzIENsaWNrYWJsZVRleHRGaWVsZCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHB1YmxpYyBJZFRleHRGaWVsZCgpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMaW5rKFN0cmluZyBsaW5rKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGluayAhPSBudWxsICYmIGxpbmsubGVuZ3RoKCkgPiAwICYmIGxpbmsuY2hhckF0KDApICE9ICcoJzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29sb3IgZ2V0TGlua0NvbG9yKFN0cmluZyBsaW5rKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xpZW50SGVscGVyLkxJTktfQ09MT1I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbGlua0FjdGlvbihTdHJpbmcgbGluaykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBnZXRDbGllbnRNb2RlbCgpLmxvYWRPYmplY3QobGluayk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBDbGllbnRIZWxwZXIuc2hvd0Vycm9yKEluZm9QYW5lbC50aGlzLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFVybFRleHRGaWVsZCBleHRlbmRzIENsaWNrYWJsZVRleHRGaWVsZCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHByaXZhdGUgSk1lbnVJdGVtIHFyQ29kZUl0ZW07Ci0KLSAgICAgICAgcHVibGljIFVybFRleHRGaWVsZCgpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgICAgIHFyQ29kZUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7Ci0gICAgICAgICAgICBxckNvZGVJdGVtLnNldFZlcnRpY2FsVGV4dFBvc2l0aW9uKEFic3RyYWN0QnV0dG9uLkJPVFRPTSk7Ci0gICAgICAgICAgICBxckNvZGVJdGVtLnNldEhvcml6b250YWxUZXh0UG9zaXRpb24oQWJzdHJhY3RCdXR0b24uQ0VOVEVSKTsKLQotICAgICAgICAgICAgZ2V0UG9wdXBNZW51KCkuYWRkU2VwYXJhdG9yKCk7Ci0gICAgICAgICAgICBnZXRQb3B1cE1lbnUoKS5hZGQocXJDb2RlSXRlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgaWYgKGlzTGluayh0ZXh0KSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxFbmNvZGVIaW50VHlwZSwgT2JqZWN0PiBoaW50cyA9IG5ldyBFbnVtTWFwPEVuY29kZUhpbnRUeXBlLCBPYmplY3Q+KEVuY29kZUhpbnRUeXBlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaGludHMucHV0KEVuY29kZUhpbnRUeXBlLk1BUkdJTiwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQml0TWF0cml4IGJpdE1hdHJpeCA9IG5ldyBRUkNvZGVXcml0ZXIoKS5lbmNvZGUodGV4dCwgQmFyY29kZUZvcm1hdC5RUl9DT0RFLCAyMDAsIDIwMCwgaGludHMpOwotICAgICAgICAgICAgICAgICAgICBxckNvZGVJdGVtLnNldEljb24obmV3IEltYWdlSWNvbihNYXRyaXhUb0ltYWdlV3JpdGVyLnRvQnVmZmVyZWRJbWFnZShiaXRNYXRyaXgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHFyQ29kZUl0ZW0uc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChXcml0ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBxckNvZGVJdGVtLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcXJDb2RlSXRlbS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBnZXRQb3B1cE1lbnUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3VwZXIuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xpbmsoU3RyaW5nIGxpbmspIHsKLSAgICAgICAgICAgIGlmIChsaW5rID09IG51bGwgfHwgbGluay5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbG93ZXIgPSBsaW5rLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgIHJldHVybiBsb3dlci5zdGFydHNXaXRoKCJodHRwOi8vIikgfHwgbG93ZXIuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29sb3IgZ2V0TGlua0NvbG9yKFN0cmluZyBsaW5rKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sb3IuQkxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBsaW5rQWN0aW9uKFN0cmluZyBsaW5rKSB7Ci0gICAgICAgICAgICBpZiAoRGVza3RvcC5pc0Rlc2t0b3BTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIERlc2t0b3AuZ2V0RGVza3RvcCgpLmJyb3dzZShuZXcgVVJJKGxpbmspKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVscGVyLnNob3dFcnJvcihJbmZvUGFuZWwudGhpcywgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9ZZXNOb0xhYmVsLmphdmEgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy93b3JrYmVuY2gvc3dpbmcvWWVzTm9MYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTFlNzNmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC9zd2luZy9ZZXNOb0xhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guQ2xpZW50SGVscGVyOwotCi1wdWJsaWMgY2xhc3MgWWVzTm9MYWJlbCBleHRlbmRzIEpMYWJlbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSWNvbiBUUlVFX0lDT04gPSBDbGllbnRIZWxwZXIuZ2V0SWNvbigieWVzLnBuZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSWNvbiBGQUxTRV9JQ09OID0gQ2xpZW50SGVscGVyLmdldEljb24oIm5vLnBuZyIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1RFWFQgPSAiWWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19URVhUID0gIk5vIjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWx1ZSA9IHRydWU7Ci0KLSAgICBwdWJsaWMgWWVzTm9MYWJlbCgpIHsKLSAgICAgICAgc3VwZXIoWUVTX1RFWFQsIFRSVUVfSUNPTiwgTEVGVCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGlmICh0aGlzLnZhbHVlICE9IHZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICBzZXRJY29uKHZhbHVlID8gVFJVRV9JQ09OIDogRkFMU0VfSUNPTik7Ci0gICAgICAgICAgICBzZXRUZXh0KHZhbHVlID8gWUVTX1RFWFQgOiBOT19URVhUKTsKLSAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9qbmxwL3RlbXBsYXRlLnZtIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2pubHAvdGVtcGxhdGUudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNWFhZDAuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL2pubHAvdGVtcGxhdGUudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGpubHAgc3BlYz0iMS41KyIgY29kZWJhc2U9IiFzZXJ2ZXIhIj4KLSAgPGluZm9ybWF0aW9uPgotICAgIDx0aXRsZT4kcHJvamVjdC5OYW1lPC90aXRsZT4KLSAgICA8dmVuZG9yPiRwcm9qZWN0Lk9yZ2FuaXphdGlvbi5OYW1lPC92ZW5kb3I+Ci0gICAgPGhvbWVwYWdlIGhyZWY9Imh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9qYXZhL29wZW5jbWlzLmh0bWwiLz4KLSAgICA8ZGVzY3JpcHRpb24+JHByb2plY3QuRGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxvZmZsaW5lLWFsbG93ZWQvPgotICAgIDx1cGRhdGUgY2hlY2s9InRpbWVvdXQiIHBvbGljeT0icHJvbXB0LXVwZGF0ZSIvPgotICA8L2luZm9ybWF0aW9uPgotICA8c2VjdXJpdHk+Ci0gICAgIDxhbGwtcGVybWlzc2lvbnMvPgotICA8L3NlY3VyaXR5PgotICA8cmVzb3VyY2VzPgotICAgIDxqMnNlIHZlcnNpb249IjEuNisiIGluaXRpYWwtaGVhcC1zaXplPSI2NG0iIG1heC1oZWFwLXNpemU9IjI1Nm0iLz4KLSAgICAgJGRlcGVuZGVuY2llcwotICAgIDxwcm9wZXJ0eSBuYW1lPSJjbWlzLndvcmtiZW5jaC51cmwiIHZhbHVlPSIhcmVwb3NpdG9yeSEiLz4gIAotICAgIDxwcm9wZXJ0eSBuYW1lPSJjbWlzLndvcmtiZW5jaC51c2VyIiB2YWx1ZT0iIXVzZXIhIi8+ICAKLSAgICA8cHJvcGVydHkgbmFtZT0iY21pcy53b3JrYmVuY2gucGFzc3dvcmQiIHZhbHVlPSIhcGFzc3dvcmQhIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNtaXMud29ya2JlbmNoLmJpbmRpbmciIHZhbHVlPSIhYmluZGluZyEiLz4KLSAgPC9yZXNvdXJjZXM+Ci0gIDxhcHBsaWNhdGlvbi1kZXNjIG1haW4tY2xhc3M9IiRtYWluQ2xhc3MiLz4KLTwvam5scD4KLQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9SRUFETUUtY21pcy13b3JrYmVuY2gudHh0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9SRUFETUUtY21pcy13b3JrYmVuY2gudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTgyZTE4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvUkVBRE1FLWNtaXMtd29ya2JlbmNoLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLUNNSVMgV29ya2JlbmNoCi0KLVRoaXMgaXMgYSBzaW1wbGUgQ29udGVudCBNYW5hZ2VtZW50IEludGVyb3BlcmFiaWxpdHkgU2VydmljZXMgKENNSVMpIGNsaWVudCBiYXNlZCBvbiBTd2luZyBhbmQgCi1BcGFjaGUgQ2hlbWlzdHJ5IE9wZW5DTUlTIChodHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmcvamF2YS9vcGVuY21pcy5odG1sKS4KLQotVGhpcyBDTUlTIGNsaWVudCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIHZlcnNpb24gMi4wLgotUGxlYXNlIHNlZSB0aGUgTk9USUNFIGFuZCBMSUNFTlNFIGZpbGVzIGZvciBkZXRhaWxzLgotCi0KLUdldCB0aGUgbGF0ZXN0IHJlbGVhc2VkIENNSVMgV29ya2JlbmNoIGZyb20gaGVyZToKLWh0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9qYXZhL2Rvd25sb2FkLmh0bWwKLQotCi0KLVN5c3RlbSBwcm9wZXJ0aWVzIHJlZmVyZW5jZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvZ2luIGRpYWxvZzoKLQotY21pcy53b3JrYmVuY2gudXJsICAgICAgICAgICAgICAgLSBwcmVzZXQgVVJMCi1jbWlzLndvcmtiZW5jaC51c2VyICAgICAgICAgICAgICAtIHByZXNldCB1c2VyIG5hbWUKLWNtaXMud29ya2JlbmNoLnBhc3N3b3JkICAgICAgICAgIC0gcHJlc2V0IHBhc3N3b3JkCi1jbWlzLndvcmtiZW5jaC5iaW5kaW5nICAgICAgICAgICAtIHByZXNldCBiaW5kaW5nIChhdG9tcHViL3dlYnNlcnZpY2VzL2Jyb3dzZXIpCi1jbWlzLndvcmtiZW5jaC5hdXRoZW50aWNhdGlvbiAgICAtIHByZXNldCBhdXRoZW50aWNhdGlvbiBtZXRob2QgKG5vbmUvc3RhbmRhcmQvbnRsbSkKLWNtaXMud29ya2JlbmNoLmNvbXByZXNzaW9uICAgICAgIC0gcHJlc2V0IGNvbXByZXNzaW9uIChvbi9vZmYpCi1jbWlzLndvcmtiZW5jaC5jbGllbnRjb21wcmVzc2lvbiAtIHByZXNldCBjbGllbnQgY29tcHJlc3Npb24gKG9uL29mZikKLWNtaXMud29ya2JlbmNoLmNvb2tpZXMgICAgICAgICAgIC0gcHJlc2V0IGNvb2tpZXMgKG9uL29mZikKLQotCi1Gb2xkZXIgb3BlcmF0aW9uIGNvbnRleHQ6Ci0KLWNtaXMud29ya2JlbmNoLmZvbGRlci5maWx0ZXIKLWNtaXMud29ya2JlbmNoLmZvbGRlci5pbmNsdWRlQWNscwotY21pcy53b3JrYmVuY2guZm9sZGVyLmluY2x1ZGVBbGxvd2FibGVBY3Rpb25zCi1jbWlzLndvcmtiZW5jaC5mb2xkZXIuaW5jbHVkZVBvbGljaWVzCi1jbWlzLndvcmtiZW5jaC5mb2xkZXIuaW5jbHVkZVJlbGF0aW9uc2hpcHMKLWNtaXMud29ya2JlbmNoLmZvbGRlci5yZW5kaXRpb25GaWx0ZXIKLWNtaXMud29ya2JlbmNoLmZvbGRlci5vcmRlckJ5Ci1jbWlzLndvcmtiZW5jaC5mb2xkZXIubWF4SXRlbXNQZXJQYWdlCi1jbWlzLndvcmtiZW5jaC5mb2xkZXIubWF4Q2hpbGRyZW4KLQotCi1PYmplY3Qgb3BlcmF0aW9uIGNvbnRleHQ6Ci0KLWNtaXMud29ya2JlbmNoLm9iamVjdC5maWx0ZXIKLWNtaXMud29ya2JlbmNoLm9iamVjdC5pbmNsdWRlQWNscwotY21pcy53b3JrYmVuY2gub2JqZWN0LmluY2x1ZGVBbGxvd2FibGVBY3Rpb25zCi1jbWlzLndvcmtiZW5jaC5vYmplY3QuaW5jbHVkZVBvbGljaWVzCi1jbWlzLndvcmtiZW5jaC5vYmplY3QuaW5jbHVkZVJlbGF0aW9uc2hpcHMKLWNtaXMud29ya2JlbmNoLm9iamVjdC5yZW5kaXRpb25GaWx0ZXIKLQotCi1WZXJzaW9uIG9wZXJhdGlvbiBjb250ZXh0OgotCi1jbWlzLndvcmtiZW5jaC52ZXJzaW9uLmZpbHRlcgotY21pcy53b3JrYmVuY2gudmVyc2lvbi5pbmNsdWRlQWNscwotY21pcy53b3JrYmVuY2gudmVyc2lvbi5pbmNsdWRlQWxsb3dhYmxlQWN0aW9ucwotY21pcy53b3JrYmVuY2gudmVyc2lvbi5pbmNsdWRlUG9saWNpZXMKLWNtaXMud29ya2JlbmNoLnZlcnNpb24uaW5jbHVkZVJlbGF0aW9uc2hpcHMKLWNtaXMud29ya2JlbmNoLnZlcnNpb24ucmVuZGl0aW9uRmlsdGVyCi1jbWlzLndvcmtiZW5jaC52ZXJzaW9uLm1heEl0ZW1zUGVyUGFnZQotCi1PdGhlcnM6Ci0KLWNtaXMud29ya2JlbmNoLmFjY2VwdFNlbGZTaWduZWRDZXJ0aWZpY2F0ZXMgLSBkaXNhYmxlIFNTTCBjZXJ0aWZpY2F0ZSBjaGVjayAodHJ1ZS9mYWxzZSkKLQotY21pcy53b3JrYmVuY2guY29uZmlncyAtIHBhdGggdG8gYSByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gbGlicmFyeSBwcm9wZXJ0aWVzIGZpbGUKLWNtaXMud29ya2JlbmNoLnNjcmlwdHMgLSBwYXRoIHRvIEdyb292eSBzY3JpcHRzIGxpYnJhcnkgcHJvcGVydGllcyBmaWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2FsZnJlc2NvLTMuNC1hdG9tcHViLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tMy40LWF0b21wdWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5ZjhmMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tMy40LWF0b21wdWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBBbGZyZXNjbyAzLjQgQXRvbVB1YgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnNwaS50eXBlPWF0b21wdWIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXRvbXB1Yi51cmw9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9zZXJ2aWNlL2NtaXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2FsZnJlc2NvLTMuNC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2FsZnJlc2NvLTMuNC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWVhNzVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby0zLjQtd2Vic2VydmljZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBBbGZyZXNjbyAzLjQgV2ViIFNlcnZpY2VzCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9d2Vic2VydmljZXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVwb3NpdG9yeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9jbWlzL1JlcG9zaXRvcnlTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2U9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9jbWlzL05hdmlnYXRpb25TZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuT2JqZWN0U2VydmljZT1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXMvT2JqZWN0U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlZlcnNpb25pbmdTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vYWxmcmVzY28vY21pcy9WZXJzaW9uaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9jbWlzL0Rpc2NvdmVyeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5NdWx0aUZpbGluZ1NlcnZpY2U9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9jbWlzL011bHRpRmlsaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlbGF0aW9uc2hpcFNlcnZpY2U9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9jbWlzL1JlbGF0aW9uc2hpcFNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5BQ0xTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vYWxmcmVzY28vY21pcy9BQ0xTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUG9saWN5U2VydmljZT1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXMvUG9saWN5U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgotCi1jbWlzLndvcmtiZW5jaC5mb2xkZXIuZmlsdGVyPSoKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby00LWF0b21wdWIucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby00LWF0b21wdWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1ZjRlZi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC1hdG9tcHViLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgQWxmcmVzY28gNCBBdG9tUHViCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1Ygotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXNhdG9tCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby00LXdlYnNlcnZpY2VzLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU1ODljLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby00LXdlYnNlcnZpY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgQWxmcmVzY28gNCBXZWIgU2VydmljZXMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT13ZWJzZXJ2aWNlcwotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZXBvc2l0b3J5U2VydmljZT1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXN3cy9SZXBvc2l0b3J5U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk5hdmlnYXRpb25TZXJ2aWNlPWh0dHA6Ly88aG9zdD4vYWxmcmVzY28vY21pc3dzL05hdmlnYXRpb25TZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuT2JqZWN0U2VydmljZT1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXN3cy9PYmplY3RTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuVmVyc2lvbmluZ1NlcnZpY2U9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9jbWlzd3MvVmVyc2lvbmluZ1NlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5EaXNjb3ZlcnlTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vYWxmcmVzY28vY21pc3dzL0Rpc2NvdmVyeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5NdWx0aUZpbGluZ1NlcnZpY2U9aHR0cDovLzxob3N0Pi9hbGZyZXNjby9jbWlzd3MvTXVsdGlGaWxpbmdTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVsYXRpb25zaGlwU2VydmljZT1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXN3cy9SZWxhdGlvbnNoaXBTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuQUNMU2VydmljZT1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXN3cy9BQ0xTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUG9saWN5U2VydmljZT1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2NtaXN3cy9Qb2xpY3lTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC4yLTEuMC1hdG9tcHViLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC4yLTEuMC1hdG9tcHViLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZGNmNmIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2FsZnJlc2NvLTQuMi0xLjAtYXRvbXB1Yi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIEFsZnJlc2NvIDQuMiBDTUlTIDEuMCBBdG9tUHViCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1Ygotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2FwaS8tZGVmYXVsdC0vcHVibGljL2NtaXMvdmVyc2lvbnMvMS4wL2F0b20KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC4yLTEuMS1hdG9tcHViLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC4yLTEuMS1hdG9tcHViLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmI4YWIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2FsZnJlc2NvLTQuMi0xLjEtYXRvbXB1Yi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIEFsZnJlc2NvIDQuMiBDTUlTIDEuMSBBdG9tUHViCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1Ygotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2FwaS8tZGVmYXVsdC0vcHVibGljL2NtaXMvdmVyc2lvbnMvMS4xL2F0b20KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC4yLTEuMS1icm93c2VyLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tNC4yLTEuMS1icm93c2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDQwMGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2FsZnJlc2NvLTQuMi0xLjEtYnJvd3Nlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIEFsZnJlc2NvIDQuMiBCcm93c2VyCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YnJvd3Nlcgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5icm93c2VyLnVybD1odHRwOi8vPGhvc3Q+L2FsZnJlc2NvL2FwaS8tZGVmYXVsdC0vcHVibGljL2NtaXMvdmVyc2lvbnMvMS4xL2Jyb3dzZXIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tY2xvdWQtMS4wLWF0b21wdWIucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby1jbG91ZC0xLjAtYXRvbXB1Yi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTM3YTkzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby1jbG91ZC0xLjAtYXRvbXB1Yi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIEFsZnJlc2NvIENsb3VkIENNSVMgMS4wIEF0b21QdWIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1Ygotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwczovL2FwaS5hbGZyZXNjby5jb20vY21pcy92ZXJzaW9ucy8xLjAvYXRvbQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdXRoLmh0dHAuYmFzaWM9ZmFsc2UKLQotIyBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIE9BdXRoIGFjY2VzcyB0b2tlbiBpbiB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0jIE5vdGUgdGhhdCBBbGZyZXNjbyBDbG91ZCBhY2Nlc3MgdG9rZW5zIGhhdmUgYSBsaW1pdGVkIGxpZmV0aW1lIChjdXJyZW50bHkgMSBob3VyKSBhbmQgdGhlIE9wZW5DTUlTIFdvcmtiZW5jaCBkb2VzIG5vdCBhdXRvLXJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiB3aGVuIGl0IGV4cGlyZXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuaGVhZGVyLjA9QXV0aG9yaXphdGlvbjpCZWFyZXIgIyMjI0FDQ0VTU19UT0tFTiMjIyMKLQotIyBPdGhlciBvcHRpb25hbCBvcHRpb25zIC0gY29tcHJlc3Npb24gZXRjLiAtIG1heSBiZSBwcm92aWRlZCBoZXJlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tY2xvdWQtMS4xLWF0b21wdWIucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby1jbG91ZC0xLjEtYXRvbXB1Yi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDM1MTU1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby1jbG91ZC0xLjEtYXRvbXB1Yi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIEFsZnJlc2NvIENsb3VkIENNSVMgMS4xIEF0b21QdWIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YXRvbXB1Ygotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwczovL2FwaS5hbGZyZXNjby5jb20vY21pcy92ZXJzaW9ucy8xLjEvYXRvbQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdXRoLmh0dHAuYmFzaWM9ZmFsc2UKLQotIyBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIE9BdXRoIGFjY2VzcyB0b2tlbiBpbiB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0jIE5vdGUgdGhhdCBBbGZyZXNjbyBDbG91ZCBhY2Nlc3MgdG9rZW5zIGhhdmUgYSBsaW1pdGVkIGxpZmV0aW1lIChjdXJyZW50bHkgMSBob3VyKSBhbmQgdGhlIE9wZW5DTUlTIFdvcmtiZW5jaCBkb2VzIG5vdCBhdXRvLXJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiB3aGVuIGl0IGV4cGlyZXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuaGVhZGVyLjA9QXV0aG9yaXphdGlvbjpCZWFyZXIgIyMjI0FDQ0VTU19UT0tFTiMjIyMKLQotIyBPdGhlciBvcHRpb25hbCBvcHRpb25zIC0gY29tcHJlc3Npb24gZXRjLiAtIG1heSBiZSBwcm92aWRlZCBoZXJlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvYWxmcmVzY28tY2xvdWQtMS4xLWJyb3dzZXIucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby1jbG91ZC0xLjEtYnJvd3Nlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGNhZmRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9hbGZyZXNjby1jbG91ZC0xLjEtYnJvd3Nlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIEFsZnJlc2NvIENsb3VkIENNSVMgMS4xIEJyb3dzZXIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YnJvd3Nlcgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5icm93c2VyLnVybD1odHRwczovL2FwaS5hbGZyZXNjby5jb20vY21pcy92ZXJzaW9ucy8xLjEvYnJvd3Nlcgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdXRoLmh0dHAuYmFzaWM9ZmFsc2UKLQotIyBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIE9BdXRoIGFjY2VzcyB0b2tlbiBpbiB0aGUgZm9sbG93aW5nIHByb3BlcnR5Ci0jIE5vdGUgdGhhdCBBbGZyZXNjbyBDbG91ZCBhY2Nlc3MgdG9rZW5zIGhhdmUgYSBsaW1pdGVkIGxpZmV0aW1lIChjdXJyZW50bHkgMSBob3VyKSBhbmQgdGhlIE9wZW5DTUlTIFdvcmtiZW5jaCBkb2VzIG5vdCBhdXRvLXJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiB3aGVuIGl0IGV4cGlyZXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuaGVhZGVyLjA9QXV0aG9yaXphdGlvbjpCZWFyZXIgIyMjI0FDQ0VTU19UT0tFTiMjIyMKLQotIyBPdGhlciBvcHRpb25hbCBvcHRpb25zIC0gY29tcHJlc3Npb24gZXRjLiAtIG1heSBiZSBwcm92aWRlZCBoZXJlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvY29uZmlnLWxpYnJhcnkucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9jb25maWctbGlicmFyeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODMyOWZmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9jb25maWctbGlicmFyeS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jCi0jIEFkZCBtb3JlIGNvbmZpZ3VyYXRpb25zIGhlcmUuCi0jIGtleSA9IGNvbmZpZyBmaWxlLCB2YWx1ZSA9IHRpdGxlCi0jCi0KLWFsZnJlc2NvLTMuNC1hdG9tcHViLnByb3BlcnRpZXM9QWxmcmVzY28gMy40IEF0b21QdWIKLWFsZnJlc2NvLTMuNC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzPUFsZnJlc2NvIDMuNCBXZWIgU2VydmljZXMKLWFsZnJlc2NvLTQtYXRvbXB1Yi5wcm9wZXJ0aWVzPUFsZnJlc2NvIDQuMCBBdG9tUHViCi1hbGZyZXNjby00LXdlYnNlcnZpY2VzLnByb3BlcnRpZXM9QWxmcmVzY28gNC4wIFdlYiBTZXJ2aWNlcwotYWxmcmVzY28tNC4yLTEuMC1hdG9tcHViLnByb3BlcnRpZXM9QWxmcmVzY28gNC4yIEF0b21QdWIgKDEuMCkKLWFsZnJlc2NvLTQuMi0xLjEtYXRvbXB1Yi5wcm9wZXJ0aWVzPUFsZnJlc2NvIDQuMiBBdG9tUHViICgxLjEpCi1hbGZyZXNjby00LjItMS4xLWJyb3dzZXIucHJvcGVydGllcz1BbGZyZXNjbyA0LjIgQnJvd3NlciAoMS4xKQotYWxmcmVzY28tY2xvdWQtMS4wLWF0b21wdWIucHJvcGVydGllcz1BbGZyZXNjbyBpbiB0aGUgY2xvdWQgQXRvbVB1YiAoMS4wKQotYWxmcmVzY28tY2xvdWQtMS4xLWF0b21wdWIucHJvcGVydGllcz1BbGZyZXNjbyBpbiB0aGUgY2xvdWQgQXRvbVB1YiAoMS4xKQotYWxmcmVzY28tY2xvdWQtMS4xLWJyb3dzZXIucHJvcGVydGllcz1BbGZyZXNjbyBpbiB0aGUgY2xvdWQgQnJvd3NlciAoMS4xKQotCi1zaGFyZXBvaW50LTIwMTAtYXRvbXB1Yi5wcm9wZXJ0aWVzPVNoYXJlUG9pbnQgMjAxMCBBdG9tUHViCi1zaGFyZXBvaW50LTIwMTAtd2Vic2VydmljZXMucHJvcGVydGllcz1TaGFyZVBvaW50IDIwMTAgV2ViIFNlcnZpY2VzCi1zaGFyZXBvaW50LTIwMTMtYXRvbXB1Yi5wcm9wZXJ0aWVzPVNoYXJlUG9pbnQgMjAxMyBBdG9tUHViCi1zaGFyZXBvaW50LTIwMTMtd2Vic2VydmljZXMucHJvcGVydGllcz1TaGFyZVBvaW50IDIwMTMgV2ViIFNlcnZpY2VzCi0KLW9wZW50ZXh0LWVscy0xMC4yLjAtYXRvbXB1Yi5wcm9wZXJ0aWVzPU9wZW4gVGV4dCBFTFMgMTAuMi4wIEF0b21QdWIKLW9wZW50ZXh0LWVscy0xMC4yLjAtd2Vic2VydmljZXMucHJvcGVydGllcz1PcGVuIFRleHQgRUxTIDEwLjIuMCBXZWIgU2VydmljZXMKLQotbnV4ZW8tNS40LWF0b21wdWIucHJvcGVydGllcz1OdXhlbyA1LjQgQXRvbVB1YgotbnV4ZW8tNS40LXdlYnNlcnZpY2VzLnByb3BlcnRpZXM9TnV4ZW8gNS40IFdlYiBTZXJ2aWNlcwotCi1pYm0tZmlsZW5ldC1wOC1hdG9tcHViLnByb3BlcnRpZXM9SUJNIEZpbGVOZXQgUDggQXRvbVB1YgotaWJtLWZpbGVuZXQtcDgtd2Vic2VydmljZXMucHJvcGVydGllcz1JQk0gRmlsZU5ldCBQOCBXZWIgU2VydmljZXMKLQotbG90dXMtbGl2ZS1maWxlcy1hdG9tcHViLnByb3BlcnRpZXM9TG90dXMgTGl2ZSBGaWxlcyBBdG9tUHViCi1sb3R1cy1xdWlja3ItZG9taW5vLWF0b21wdWIucHJvcGVydGllcz1Mb3R1cyBRdWlja3IgRG9taW5vIEF0b21QdWIKLQotb3BlbmNtaXMtdGVzdC1zZXJ2ZXItYXRvbXB1Yi5wcm9wZXJ0aWVzPU9wZW5DTUlTIFRlc3QgU2VydmVyIEF0b21QdWIKLW9wZW5jbWlzLXRlc3Qtc2VydmVyLXdlYnNlcnZpY2VzLnByb3BlcnRpZXM9T3BlbkNNSVMgVGVzdCBTZXJ2ZXIgV2ViIFNlcnZpY2VzCi0KLW9wZW5jbWlzLWZpbGVzaGFyZS1hdG9tcHViLnByb3BlcnRpZXM9T3BlbkNNSVMgRmlsZVNoYXJlIEF0b21QdWIKLW9wZW5jbWlzLWZpbGVzaGFyZS13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzPU9wZW5DTUlTIEZpbGVTaGFyZSBXZWIgU2VydmljZXMKLQotc2FwLWhhbmEtY2xvdWQtYXRvbXB1Yi5wcm9wZXJ0aWVzPVNBUCBIQU5BIENsb3VkIERvY3VtZW50IFNlcnZpY2UgQXRvbVB1Ygotc2FwLWhhbmEtY2xvdWQtd2Vic2VydmljZXMucHJvcGVydGllcz1TQVAgSEFOQSBDbG91ZCBEb2N1bWVudCBTZXJ2aWNlIFdlYiBTZXJ2aWNlcwotc2FwLWhhbmEtY2xvdWQtYnJvd3Nlci5wcm9wZXJ0aWVzPVNBUCBIQU5BIENsb3VkIERvY3VtZW50IFNlcnZpY2UgQnJvd3NlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9pYm0tZmlsZW5ldC1wOC1hdG9tcHViLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvaWJtLWZpbGVuZXQtcDgtYXRvbXB1Yi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmIwODFlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9pYm0tZmlsZW5ldC1wOC1hdG9tcHViLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgSUJNIFA4IENNSVMgQXRvbVB1YiAtIG5vdGUgdGhlIC9wOGNtaXMvIHJvb3QgcG9ydGlvbiBvZiB0aGUgdXJsIG1heSB2YXJ5IGluIHNvbWUgaW5zdGFsbGF0aW9ucwotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnNwaS50eXBlPWF0b21wdWIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXRvbXB1Yi51cmw9aHR0cDovLzxob3N0Pi9wOGNtaXMvcmVzb3VyY2VzL1NlcnZpY2UKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3MvaWJtLWZpbGVuZXQtcDgtd2Vic2VydmljZXMucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9pYm0tZmlsZW5ldC1wOC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTlmMzBmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9pYm0tZmlsZW5ldC1wOC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIElCTSBQOCBXZWIgU2VydmljZXMgLSBub3RlIHRoZSAvcDhjbWlzLyByb290IHBvcnRpb24gb2YgdGhlIHVybCBtYXkgdmFyeSBpbiBzb21lIGluc3RhbGxhdGlvbnMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT13ZWJzZXJ2aWNlcwotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZXBvc2l0b3J5U2VydmljZT1odHRwOi8vPGhvc3Q+L3A4Y21pcy93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk5hdmlnYXRpb25TZXJ2aWNlPWh0dHA6Ly88aG9zdD4vcDhjbWlzL3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuT2JqZWN0U2VydmljZT1odHRwOi8vPGhvc3Q+L3A4Y21pcy93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlZlcnNpb25pbmdTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vcDhjbWlzL3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuRGlzY292ZXJ5U2VydmljZT1odHRwOi8vPGhvc3Q+L3A4Y21pcy93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk11bHRpRmlsaW5nU2VydmljZT1odHRwOi8vPGhvc3Q+L3A4Y21pcy93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlbGF0aW9uc2hpcFNlcnZpY2U9aHR0cDovLzxob3N0Pi9wOGNtaXMvd3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5BQ0xTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vcDhjbWlzL3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUG9saWN5U2VydmljZT1odHRwOi8vPGhvc3Q+L3A4Y21pcy93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2xvdHVzLWxpdmUtZmlsZXMtYXRvbXB1Yi5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2xvdHVzLWxpdmUtZmlsZXMtYXRvbXB1Yi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NhNjI2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9sb3R1cy1saXZlLWZpbGVzLWF0b21wdWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBMb3R1cyBMaXZlIEZpbGVzIEF0b21QdWIKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHBzOi8vYXBwcy5sb3R1c2xpdmUuY29tL2ZpbGVzL2Jhc2ljL2NtaXMvbXkvc2VydmljZWRvYwotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj08ZW1haWw+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+Ci0KLWNtaXMud29ya2JlbmNoLmZvbGRlci5tYXhJdGVtc1BlclBhZ2U9NTAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2xvdHVzLXF1aWNrci1kb21pbm8tYXRvbXB1Yi5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL2xvdHVzLXF1aWNrci1kb21pbm8tYXRvbXB1Yi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdiNjMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9sb3R1cy1xdWlja3ItZG9taW5vLWF0b21wdWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBMb3R1cyBRdWlja3IgRG9taW5vIEF0b21QdWIKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly88aG9zdD4vc2VydmxldC9jbWlzL3JlcG9zaXRvcnkvX1A8UXVpY2tyIHBsYWNlIG5hbWU+X1JNYWluLm5zZi9zZXJ2aWNlZG9jCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9udXhlby01LjQtYXRvbXB1Yi5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL251eGVvLTUuNC1hdG9tcHViLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzVhOTIuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL251eGVvLTUuNC1hdG9tcHViLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgTnV4ZW8gNS40IEF0b21QdWIKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly88aG9zdD4vbnV4ZW8vYXRvbS9jbWlzCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL251eGVvLTUuNC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL251eGVvLTUuNC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzlmNjBhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9udXhlby01LjQtd2Vic2VydmljZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBOdXhlbyA1LjQgV2ViIFNlcnZpY2VzCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9d2Vic2VydmljZXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVwb3NpdG9yeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9udXhlby93ZWJzZXJ2aWNlcy9jbWlzL1JlcG9zaXRvcnlTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2U9aHR0cDovLzxob3N0Pi9udXhlby93ZWJzZXJ2aWNlcy9jbWlzL05hdmlnYXRpb25TZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuT2JqZWN0U2VydmljZT1odHRwOi8vPGhvc3Q+L251eGVvL3dlYnNlcnZpY2VzL2NtaXMvT2JqZWN0U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlZlcnNpb25pbmdTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vbnV4ZW8vd2Vic2VydmljZXMvY21pcy9WZXJzaW9uaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9udXhlby93ZWJzZXJ2aWNlcy9jbWlzL0Rpc2NvdmVyeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5NdWx0aUZpbGluZ1NlcnZpY2U9aHR0cDovLzxob3N0Pi9udXhlby93ZWJzZXJ2aWNlcy9jbWlzL011bHRpRmlsaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlbGF0aW9uc2hpcFNlcnZpY2U9aHR0cDovLzxob3N0Pi9udXhlby93ZWJzZXJ2aWNlcy9jbWlzL1JlbGF0aW9uc2hpcFNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5BQ0xTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vbnV4ZW8vd2Vic2VydmljZXMvY21pcy9BQ0xTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUG9saWN5U2VydmljZT1odHRwOi8vPGhvc3Q+L251eGVvL3dlYnNlcnZpY2VzL2NtaXMvUG9saWN5U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW5jbWlzLWZpbGVzaGFyZS1hdG9tcHViLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbmNtaXMtZmlsZXNoYXJlLWF0b21wdWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5YWE3OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbmNtaXMtZmlsZXNoYXJlLWF0b21wdWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBPcGVuQ01JUyBGaWxlU2hhcmUgQXRvbVB1YgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnNwaS50eXBlPWF0b21wdWIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXRvbXB1Yi51cmw9aHR0cDovLzxob3N0Pi9maWxlc2hhcmUvYXRvbQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj10ZXN0Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD10ZXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW5jbWlzLWZpbGVzaGFyZS13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW5jbWlzLWZpbGVzaGFyZS13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU4ZmVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9vcGVuY21pcy1maWxlc2hhcmUtd2Vic2VydmljZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBPcGVuQ01JUyBGaWxlU2hhcmUgV2ViIFNlcnZpY2VzCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9d2Vic2VydmljZXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVwb3NpdG9yeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9maWxlc2hhcmUvc2VydmljZXMvUmVwb3NpdG9yeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZT1odHRwOi8vPGhvc3Q+L2ZpbGVzaGFyZS9zZXJ2aWNlcy9OYXZpZ2F0aW9uU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk9iamVjdFNlcnZpY2U9aHR0cDovLzxob3N0Pi9maWxlc2hhcmUvc2VydmljZXMvT2JqZWN0U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlZlcnNpb25pbmdTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vZmlsZXNoYXJlL3NlcnZpY2VzL1ZlcnNpb25pbmdTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuRGlzY292ZXJ5U2VydmljZT1odHRwOi8vPGhvc3Q+L2ZpbGVzaGFyZS9zZXJ2aWNlcy9EaXNjb3ZlcnlTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTXVsdGlGaWxpbmdTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vZmlsZXNoYXJlL3NlcnZpY2VzL011bHRpRmlsaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlbGF0aW9uc2hpcFNlcnZpY2U9aHR0cDovLzxob3N0Pi9maWxlc2hhcmUvc2VydmljZXMvUmVsYXRpb25zaGlwU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkFDTFNlcnZpY2U9aHR0cDovLzxob3N0Pi9maWxlc2hhcmUvc2VydmljZXNzL0FDTFNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5Qb2xpY3lTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vZmlsZXNoYXJlL3NlcnZpY2VzL1BvbGljeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj10ZXN0Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD10ZXN0CmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbmNtaXMtdGVzdC1zZXJ2ZXItYXRvbXB1Yi5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW5jbWlzLXRlc3Qtc2VydmVyLWF0b21wdWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YjUyMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbmNtaXMtdGVzdC1zZXJ2ZXItYXRvbXB1Yi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIE9wZW5DTUlTIHRlc3Qgc2VydmVyIEF0b21QdWIKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly9yZXBvLm9wZW5jbWlzLm9yZy9pbm1lbW9yeS9hdG9tCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmNvbXByZXNzaW9uPXRydWUKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9dGVzdAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9dGVzdApkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW5jbWlzLXRlc3Qtc2VydmVyLXdlYnNlcnZpY2VzLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbmNtaXMtdGVzdC1zZXJ2ZXItd2Vic2VydmljZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0ZjI4NS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbmNtaXMtdGVzdC1zZXJ2ZXItd2Vic2VydmljZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBPcGVuQ01JUyB0ZXN0IHNlcnZlciBXZWIgU2VydmljZXMKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT13ZWJzZXJ2aWNlcwotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZXBvc2l0b3J5U2VydmljZT1odHRwOi8vcmVwby5vcGVuY21pcy5vcmcvaW5tZW1vcnkvc2VydmljZXMvUmVwb3NpdG9yeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZT1odHRwOi8vcmVwby5vcGVuY21pcy5vcmcvaW5tZW1vcnkvc2VydmljZXMvTmF2aWdhdGlvblNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5PYmplY3RTZXJ2aWNlPWh0dHA6Ly9yZXBvLm9wZW5jbWlzLm9yZy9pbm1lbW9yeS9zZXJ2aWNlcy9PYmplY3RTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuVmVyc2lvbmluZ1NlcnZpY2U9aHR0cDovL3JlcG8ub3BlbmNtaXMub3JnL2lubWVtb3J5L3NlcnZpY2VzL1ZlcnNpb25pbmdTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuRGlzY292ZXJ5U2VydmljZT1odHRwOi8vcmVwby5vcGVuY21pcy5vcmcvaW5tZW1vcnkvc2VydmljZXMvRGlzY292ZXJ5U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk11bHRpRmlsaW5nU2VydmljZT1odHRwOi8vcmVwby5vcGVuY21pcy5vcmcvaW5tZW1vcnkvc2VydmljZXMvTXVsdGlGaWxpbmdTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVsYXRpb25zaGlwU2VydmljZT1odHRwOi8vcmVwby5vcGVuY21pcy5vcmcvaW5tZW1vcnkvc2VydmljZXMvUmVsYXRpb25zaGlwU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkFDTFNlcnZpY2U9aHR0cDovL3JlcG8ub3BlbmNtaXMub3JnL2lubWVtb3J5L3NlcnZpY2Vzcy9BQ0xTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUG9saWN5U2VydmljZT1odHRwOi8vcmVwby5vcGVuY21pcy5vcmcvaW5tZW1vcnkvc2VydmljZXMvUG9saWN5U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmNvbXByZXNzaW9uPXRydWUKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9dGVzdAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9dGVzdApkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW50ZXh0LWVscy0xMC4yLjAtYXRvbXB1Yi5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW50ZXh0LWVscy0xMC4yLjAtYXRvbXB1Yi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDZmZmZhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9vcGVudGV4dC1lbHMtMTAuMi4wLWF0b21wdWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMNCi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0jDQotDQotIyBPcGVuIFRleHQgRUxTIDEwLjIuMCBBdG9tUHViDQotDQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViDQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdG9tcHViLnVybD1odHRwOi8vPGhvc3Q+L290LWNtaXNhdG9tL2F0b20NCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPg0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnBhc3N3b3JkPTxwYXNzd29yZD4NCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbnRleHQtZWxzLTEwLjIuMC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL29wZW50ZXh0LWVscy0xMC4yLjAtd2Vic2VydmljZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNTg4Yi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvb3BlbnRleHQtZWxzLTEwLjIuMC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIw0KLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLSMNCi0NCi0jIE9wZW4gVGV4dCBFTFMgMTAuMi4wIFdlYiBTZXJ2aWNlcw0KLQ0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9d2Vic2VydmljZXMNCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlcG9zaXRvcnlTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vb3QtY21pcy9zZXJ2aWNlcy9SZXBvc2l0b3J5U2VydmljZT93c2RsDQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZT1odHRwOi8vPGhvc3Q+L290LWNtaXMvc2VydmljZXMvTmF2aWdhdGlvblNlcnZpY2U/d3NkbA0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuT2JqZWN0U2VydmljZT1odHRwOi8vPGhvc3Q+L290LWNtaXMvc2VydmljZXMvT2JqZWN0U2VydmljZT93c2RsDQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5WZXJzaW9uaW5nU2VydmljZT1odHRwOi8vPGhvc3Q+L290LWNtaXMvc2VydmljZXMvVmVyc2lvbmluZ1NlcnZpY2U/d3NkbA0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuRGlzY292ZXJ5U2VydmljZT1odHRwOi8vPGhvc3Q+L290LWNtaXMvc2VydmljZXMvRGlzY292ZXJ5U2VydmljZT93c2RsDQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5NdWx0aUZpbGluZ1NlcnZpY2U9aHR0cDovLzxob3N0Pi9vdC1jbWlzL3NlcnZpY2VzL011bHRpRmlsaW5nU2VydmljZT93c2RsDQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZWxhdGlvbnNoaXBTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vb3QtY21pcy9zZXJ2aWNlcy9SZWxhdGlvbnNoaXBTZXJ2aWNlP3dzZGwNCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkFDTFNlcnZpY2U9aHR0cDovLzxob3N0Pi9vdC1jbWlzL3NlcnZpY2VzL0FDTFNlcnZpY2U/d3NkbA0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUG9saWN5U2VydmljZT1odHRwOi8vPGhvc3Q+L290LWNtaXMvc2VydmljZXMvUG9saWN5U2VydmljZT93c2RsDQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj08dXNlcj4NCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+DQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NhcC1oYW5hLWNsb3VkLWF0b21wdWIucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9zYXAtaGFuYS1jbG91ZC1hdG9tcHViLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjhmOTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NhcC1oYW5hLWNsb3VkLWF0b21wdWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBTQVAgSEFOQSBDbG91ZCBEb2N1bWVudCBTZXJ2aWNlIC0gQXRvbVB1YgotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnNwaS50eXBlPWF0b21wdWIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuYXRvbXB1Yi51cmw9aHR0cDovLzxob3N0Pi88Y29udGV4dD4vYXRvbQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj08dXNlcj4KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnBhc3N3b3JkPTxwYXNzd29yZD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvc2FwLWhhbmEtY2xvdWQtYnJvd3Nlci5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NhcC1oYW5hLWNsb3VkLWJyb3dzZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyNjM0OS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvc2FwLWhhbmEtY2xvdWQtYnJvd3Nlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jIFNBUCBIQU5BIENsb3VkIERvY3VtZW50IFNlcnZpY2UgLSBCcm93c2VyCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9YnJvd3Nlcgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5icm93c2VyLnVybD1odHRwOi8vPGhvc3Q+Lzxjb250ZXh0Pi9qc29uCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9zYXAtaGFuYS1jbG91ZC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NhcC1oYW5hLWNsb3VkLXdlYnNlcnZpY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZWVhM2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NhcC1oYW5hLWNsb3VkLXdlYnNlcnZpY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgU0FQIEhBTkEgQ2xvdWQgRG9jdW1lbnQgU2VydmljZSAtIFdlYiBTZXJ2aWNlcwotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnNwaS50eXBlPXdlYnNlcnZpY2VzCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlcG9zaXRvcnlTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vPGNvbnRleHQ+L3NlcnZpY2VzL1JlcG9zaXRvcnlTZXJ2aWNlP3dzZGwKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2U9aHR0cDovLzxob3N0Pi88Y29udGV4dD4vc2VydmljZXMvTmF2aWdhdGlvblNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5PYmplY3RTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vPGNvbnRleHQ+L3NlcnZpY2VzL09iamVjdFNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5WZXJzaW9uaW5nU2VydmljZT1odHRwOi8vPGhvc3Q+Lzxjb250ZXh0Pi9zZXJ2aWNlcy9WZXJzaW9uaW5nU2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2U9aHR0cDovLzxob3N0Pi88Y29udGV4dD4vc2VydmljZXMvRGlzY292ZXJ5U2VydmljZT93c2RsCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk11bHRpRmlsaW5nU2VydmljZT1odHRwOi8vPGhvc3Q+Lzxjb250ZXh0Pi9zZXJ2aWNlcy9NdWx0aUZpbGluZ1NlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZWxhdGlvbnNoaXBTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vPGNvbnRleHQ+L3NlcnZpY2VzL1JlbGF0aW9uc2hpcFNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5BQ0xTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vPGNvbnRleHQ+L3NlcnZpY2VzL0FDTFNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5Qb2xpY3lTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vPGNvbnRleHQ+L3NlcnZpY2VzL1BvbGljeVNlcnZpY2U/d3NkbAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj08dXNlcj4KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnBhc3N3b3JkPTxwYXNzd29yZD4KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9zaGFyZXBvaW50LTIwMTAtYXRvbXB1Yi5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NoYXJlcG9pbnQtMjAxMC1hdG9tcHViLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmUwMWEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NoYXJlcG9pbnQtMjAxMC1hdG9tcHViLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgU2hhcmVQb2ludCAyMDEwIEF0b21QdWIKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pcy9yZXN0LzxTUExpc3Q+P2dldHJlcG9zaXRvcnlpbmZvCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF1dGguY2xhc3NuYW1lPW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5iaW5kaW5ncy5zcGkuTlRMTUF1dGhlbnRpY2F0aW9uUHJvdmlkZXIKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PGRvbWFpbj5cPHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+Ci0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmthcm91bmQuaW5jbHVkZU9iamVjdElkT25DaGVja291dD10cnVlCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYXJvdW5kLmluY2x1ZGVPYmplY3RJZE9uTW92ZT10cnVlCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYXJvdW5kLm9taXRDaGFuZ2VUb2tlbnM9dHJ1ZQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2Fyb3VuZC5hZGROYW1lT25DaGVja0luPXRydWUKLQotY21pcy53b3JrYmVuY2guZm9sZGVyLmZpbHRlcj0qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NoYXJlcG9pbnQtMjAxMC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NoYXJlcG9pbnQtMjAxMC13ZWJzZXJ2aWNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjUwNGRmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9zaGFyZXBvaW50LTIwMTAtd2Vic2VydmljZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLSMKLQotIyBTaGFyZVBvaW50IDIwMTAgV2ViIFNlcnZpY2VzCi0KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcuc3BpLnR5cGU9d2Vic2VydmljZXMKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVwb3NpdG9yeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5OYXZpZ2F0aW9uU2VydmljZT1odHRwOi8vPGhvc3Q+L192dGlfYmluL2NtaXNzb2Fwd3NkbC5hc3B4Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLk9iamVjdFNlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5WZXJzaW9uaW5nU2VydmljZT1odHRwOi8vPGhvc3Q+L192dGlfYmluL2NtaXNzb2Fwd3NkbC5hc3B4Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkRpc2NvdmVyeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5NdWx0aUZpbGluZ1NlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5SZWxhdGlvbnNoaXBTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pc3NvYXB3c2RsLmFzcHgKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuQUNMU2VydmljZT1odHRwOi8vPGhvc3Q+L192dGlfYmluL2NtaXNzb2Fwd3NkbC5hc3B4Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlBvbGljeVNlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5hdXRoLmNsYXNzbmFtZT1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3Muc3BpLk5UTE1BdXRoZW50aWNhdGlvblByb3ZpZGVyCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy51c2VyPTxkb21haW4+XDx1c2VyPgotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMucGFzc3dvcmQ9PHBhc3N3b3JkPgotCi1jbWlzLndvcmtiZW5jaC5mb2xkZXIuZmlsdGVyPSoKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9zaGFyZXBvaW50LTIwMTMtYXRvbXB1Yi5wcm9wZXJ0aWVzIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NoYXJlcG9pbnQtMjAxMy1hdG9tcHViLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NTZkZGMuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9jb25maWdzL3NoYXJlcG9pbnQtMjAxMy1hdG9tcHViLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgU2hhcmVQb2ludCAyMDEzIEF0b21QdWIKLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy5zcGkudHlwZT1hdG9tcHViCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLmF0b21wdWIudXJsPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pcy9yZXN0P2dldFJlcG9zaXRvcmllcwotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXNlcj08ZG9tYWluPlw8dXNlcj4KLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnBhc3N3b3JkPTxwYXNzd29yZD4KLQotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2Fyb3VuZC5vbWl0Q2hhbmdlVG9rZW5zPXRydWUKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmthcm91bmQuYWRkTmFtZU9uQ2hlY2tJbj10cnVlCi0KLWNtaXMud29ya2JlbmNoLmZvbGRlci5maWx0ZXI9KgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9zaGFyZXBvaW50LTIwMTMtd2Vic2VydmljZXMucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvY29uZmlncy9zaGFyZXBvaW50LTIwMTMtd2Vic2VydmljZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0ZGRjMC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2NvbmZpZ3Mvc2hhcmVwb2ludC0yMDEzLXdlYnNlcnZpY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jCi0KLSMgU2hhcmVQb2ludCAyMDEzIFdlYiBTZXJ2aWNlcwotCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLnNwaS50eXBlPXdlYnNlcnZpY2VzCi1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLlJlcG9zaXRvcnlTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pc3NvYXB3c2RsLmFzcHgKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTmF2aWdhdGlvblNlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5PYmplY3RTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pc3NvYXB3c2RsLmFzcHgKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuVmVyc2lvbmluZ1NlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5EaXNjb3ZlcnlTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pc3NvYXB3c2RsLmFzcHgKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuTXVsdGlGaWxpbmdTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pc3NvYXB3c2RsLmFzcHgKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuUmVsYXRpb25zaGlwU2VydmljZT1odHRwOi8vPGhvc3Q+L192dGlfYmluL2NtaXNzb2Fwd3NkbC5hc3B4Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLkFDTFNlcnZpY2U9aHR0cDovLzxob3N0Pi9fdnRpX2Jpbi9jbWlzc29hcHdzZGwuYXNweAotb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5Qb2xpY3lTZXJ2aWNlPWh0dHA6Ly88aG9zdD4vX3Z0aV9iaW4vY21pc3NvYXB3c2RsLmFzcHgKLW9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLnVzZXI9PGRvbWFpbj5cPHVzZXI+Ci1vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5wYXNzd29yZD08cGFzc3dvcmQ+Ci0KLWNtaXMud29ya2JlbmNoLmZvbGRlci5maWx0ZXI9KgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvYWRkLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2FkZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTdmMDkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvYWRkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NoYW5nZWxvZy5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9jaGFuZ2Vsb2cucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2QyNDVkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NoYW5nZWxvZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9jaGVja2Vkb3V0LnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NoZWNrZWRvdXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y3NGMzLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NoZWNrZWRvdXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvY29ubmVjdC5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9jb25uZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkNzExOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9jb25uZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2NvbnNvbGUucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvY29uc29sZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjBmYjkuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvY29uc29sZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9kZWxldGV0eXBlLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2RlbGV0ZXR5cGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWZmMDM2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2RlbGV0ZXR5cGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZG9jdW1lbnQucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZG9jdW1lbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdmMmQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2RvY3VtZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2Rvd24ucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDdmY2MuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZG93bi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9mb2xkZXIucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViZDBiYi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9mb2xkZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvaWNvbi5pY25zIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvaWNvbi5pY25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg5ZmI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2ljb24uaWNucworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2ljb24ucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvaWNvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzgzOWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvaWNvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9pbmZvLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2luZm8ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDM3YTBkLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2luZm8ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvaXRlbS5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9pdGVtLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY5OWE3Zi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9pdGVtLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2xvZy5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9sb2cucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNhY2NmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL2xvZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9uZXdkb2N1bWVudC5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9uZXdkb2N1bWVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzODA4YTEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvbmV3ZG9jdW1lbnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvbmV3Zm9sZGVyLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL25ld2ZvbGRlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2RjOTQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvbmV3Zm9sZGVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL25ld3JlbGF0aW9uc2hpcC5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9uZXdyZWxhdGlvbnNoaXAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjVlNDBiLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL25ld3JlbGF0aW9uc2hpcC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9uZXd0eXBlLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL25ld3R5cGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWMwMzAwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL25ld3R5cGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvbm8ucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvbm8ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNkNTE1Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL25vLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3Bhc3RlLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3Bhc3RlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhNjI1Yy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9wYXN0ZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9wb2xpY3kucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvcG9saWN5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2NjYxOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9wb2xpY3kucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvcHdjLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3B3Yy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMjFiYmEuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvcHdjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3F1ZXJ5LnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3F1ZXJ5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1MjJiMi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9xdWVyeS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9yZWxhdGlvbnNoaXAucG5nIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvcmVsYXRpb25zaGlwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwYjllOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9yZWxhdGlvbnNoaXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvcmVtb3ZlLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3JlbW92ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjY1NGUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvcmVtb3ZlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3JlcG9zaXRvcnktaW5mby5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9yZXBvc2l0b3J5LWluZm8ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFkNzI4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3JlcG9zaXRvcnktaW5mby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9zYXZldHlwZS5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy9zYXZldHlwZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MGE4N2UuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvc2F2ZXR5cGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvdGNrLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3Rjay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYjJhZGYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvdGNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3R5cGVzLnBuZyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3R5cGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1MTljZS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy90eXBlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy91cC5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy91cC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWE3ZDcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvdXAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9pbWFnZXMvdXBkYXRldHlwZS5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy91cGRhdGV0eXBlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkNGZlNi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy91cGRhdGV0eXBlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3llcy5wbmcgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2ltYWdlcy95ZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjNkOWRhLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvaW1hZ2VzL3llcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OGQ0ZjYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1sb2c0ai5yb290TG9nZ2VyPWluZm8sIGxvZ2ZyYW1lCi0KLWxvZzRqLmFwcGVuZGVyLmxvZ2ZyYW1lID0gb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLkNsaWVudFdyaXRlckFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5sb2dmcmFtZS5sYXlvdXQgPSBvcmcuYXBhY2hlLmxvZzRqLkVuaGFuY2VkUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIubG9nZnJhbWUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuID0gPiAlZHtISDptbTpzc30gJTUuNXAgJTQwLjQwYzogJW0lbiV0aHJvd2FibGV7NTB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL0NNSVMuZ3Jvb3Z5IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL0NNSVMuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc3ZmMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9DTUlTLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2NyaXB0cwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRlZmluaXRpb25zLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLioKLQotY2xhc3MgQ01JUyB7Ci0KLSAgICBTZXNzaW9uIHNlc3Npb24KLQotICAgIENNSVMoU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb24KLSAgICB9Ci0KLSAgICBDbWlzT2JqZWN0IGdldE9iamVjdChpZCkgewotICAgICAgICBDbWlzT2JqZWN0IHJlc3VsdCA9IG51bGwKLQotICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBDbWlzT2JqZWN0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBpZAotICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgT2JqZWN0SWQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNlc3Npb24uZ2V0T2JqZWN0KGlkKQotICAgICAgICB9IGVsc2UgaWYgKGlkIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2Vzc2lvbi5nZXRPYmplY3RCeVBhdGgoaWQpCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlc3Npb24uZ2V0T2JqZWN0KGlkKQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJPYmplY3Qgbm90IGZvdW5kISIpCi0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQKLSAgICB9Ci0KLSAgICBGb2xkZXIgZ2V0Rm9sZGVyKGlkKSB7Ci0gICAgICAgIENtaXNPYmplY3QgZm9sZGVyID0gZ2V0T2JqZWN0KGlkKQotICAgICAgICBpZighKGZvbGRlciBpbnN0YW5jZW9mIEZvbGRlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk9iamVjdCBpcyBub3QgYSBmb2xkZXIhIikKLSAgICAgICAgfQotCi0gICAgICAgIGZvbGRlcgotICAgIH0KLQotICAgIERvY3VtZW50IGdldERvY3VtZW50KGlkKSB7Ci0gICAgICAgIENtaXNPYmplY3QgZG9jID0gZ2V0T2JqZWN0KGlkKQotICAgICAgICBpZighKGRvYyBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiT2JqZWN0IGlzIG5vdCBhIGRvY3VtZW50ISIpCi0gICAgICAgIH0KLQotICAgICAgICBkb2MKLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UHJvcGVydGllcyhpZCkgewotICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChpZCkKLQotICAgICAgICBpZighb2JqZWN0LnByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIHByaW50bG4gIi0gbm8gcHJvcGVydGllcyAoPz8/KSAtIgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2JqZWN0LnByb3BlcnRpZXMuZWFjaCB7IHByb3AgLT4gcHJpbnRQcm9wZXJ0eShwcm9wKSB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UHJvcGVydHkoUHJvcGVydHkgcHJvcCkgewotICAgICAgICBwcmludGxuICIke3Byb3AuaWR9OiAke3Byb3AudmFsdWVzQXNTdHJpbmd9IgotICAgIH0KLQotICAgIHZvaWQgcHJpbnRBbGxvd2FibGVBY3Rpb25zKGlkKSB7Ci0gICAgICAgIENtaXNPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0KGlkKQotCi0gICAgICAgIGlmICghb2JqZWN0LmFsbG93YWJsZUFjdGlvbnMgfHwgIW9iamVjdC5hbGxvd2FibGVBY3Rpb25zLmFsbG93YWJsZUFjdGlvbnMpIHsKLSAgICAgICAgICAgIHByaW50bG4gIi0gbm8gYWxsb3dhYmxlIGFjdGlvbnMgLSIKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iamVjdC5hbGxvd2FibGVBY3Rpb25zLmFsbG93YWJsZUFjdGlvbnMuZWFjaCB7IGFjdGlvbiAtPgotICAgICAgICAgICAgICAgIHByaW50bG4gYWN0aW9uLnZhbHVlKCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRWZXJzaW9ucyhpZCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChpZCkKLQotICAgICAgICBpZiAoISgoRG9jdW1lbnRUeXBlKSBkb2MudHlwZSkuaXNWZXJzaW9uYWJsZSgpKSB7Ci0gICAgICAgICAgICBwcmludGxuICItIG5vdCB2ZXJzaW9uc2FibGUgLSIKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxEb2N1bWVudD4gdmVyc2lvbnMgPSBkb2MuYWxsVmVyc2lvbnMKLQotICAgICAgICBpZiAoIXZlcnNpb25zKSB7Ci0gICAgICAgICAgICBwcmludGxuICItIG5vIHZlcnNpb25zIC0iCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJzaW9ucy5lYWNoIHsgdmVyc2lvbiAtPiBwcmludGxuICIke3ZlcnNpb24udmVyc2lvbkxhYmVsfSAoJHt2ZXJzaW9uLmlkfSkgWyR7dmVyc2lvbi50eXBlLmlkfV0iIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRDaGlsZHJlbihpZCkgewotICAgICAgICBGb2xkZXIgZm9sZGVyID0gZ2V0Rm9sZGVyKGlkKQotCi0gICAgICAgIGJvb2xlYW4gaGFzQ2hpbGRyZW4gPSBmYWxzZQotICAgICAgICBmb2xkZXIuY2hpbGRyZW4uZWFjaCB7IGNoaWxkIC0+Ci0gICAgICAgICAgICBwcmludGxuICIke2NoaWxkLm5hbWV9ICgke2NoaWxkLmlkfSkgWyR7Y2hpbGQudHlwZS5pZH1dIgotICAgICAgICAgICAgaGFzQ2hpbGRyZW4gPSB0cnVlCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWhhc0NoaWxkcmVuKSB7Ci0gICAgICAgICAgICBwcmludGxuICItIG5vIGNoaWxkcmVuIC0iCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UmVsYXRpb25zaGlwcyhpZCkgewotICAgICAgICBDbWlzT2JqZWN0IG9iamVjdCA9IGdldE9iamVjdChpZCkKLQotICAgICAgICBib29sZWFuIGhhc1JlbGF0aW9uc2hpcHMgPSBmYWxzZQotICAgICAgICBvYmplY3QucmVsYXRpb25zaGlwcy5lYWNoIHsgcmVsIC0+Ci0gICAgICAgICAgICBwcmludGxuICIke3JlbC5uYW1lfSAoJHtyZWwuaWR9KSBbJHtyZWwudHlwZS5pZH1dIgotICAgICAgICAgICAgaGFzUmVsYXRpb25zaGlwcyA9IHRydWUKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaGFzUmVsYXRpb25zaGlwcykgewotICAgICAgICAgICAgcHJpbnRsbiAiLSBubyByZWxhdGlvbnNoaXBzIC0iCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHByaW50UmVuZGl0aW9ucyhpZCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChpZCkKLQotICAgICAgICBMaXN0PFJlbmRpdGlvbj4gcmVuZGl0b25zID0gZG9jLnJlbmRpdGlvbnMKLQotICAgICAgICBpZighcmVuZGl0b25zKSB7Ci0gICAgICAgICAgICBwcmludGxuICItIG5vIHJlbmRpdGlvbnMgLSIKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlbmRpdG9ucy5lYWNoIHsgcmVuZGl0aW9uIC0+IHByaW50bG4gIiR7cmVuZGl0aW9uLnRpdGxlfSAoTUlNRSB0eXBlOiAke3JlbmRpdGlvbi5taW1lVHlwZX0sIGxlbmd0aDogJHtyZW5kaXRpb24ubGVuZ3RofSBieXRlcyIgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBwcmludE9iamVjdFN1bW1hcnkoaWQpIHsKLSAgICAgICAgQ21pc09iamVjdCBvYmplY3QgPSBnZXRPYmplY3QoaWQpCi0KLSAgICAgICAgcHJpbnRsbiAiTmFtZTogICAgICAgICR7b2JqZWN0Lm5hbWV9IgotICAgICAgICBwcmludGxuICJPYmplY3QgSWQ6ICAgJHtvYmplY3QuaWR9IgotICAgICAgICBwcmludGxuICJPYmplY3QgVHlwZTogJHtvYmplY3QudHlwZS5pZH0iCi0gICAgICAgIHByaW50bG4gIiIKLSAgICAgICAgcHJpbnRsbiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgICAgIHByaW50bG4gIlByb3BlcnRpZXM6IgotICAgICAgICBwcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgcHJpbnRQcm9wZXJ0aWVzKG9iamVjdCkKLSAgICAgICAgcHJpbnRsbiAiIgotICAgICAgICBwcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgcHJpbnRsbiAiQWxsb3dhYmxlIEFjdGlvbnM6IgotICAgICAgICBwcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgcHJpbnRBbGxvd2FibGVBY3Rpb25zKG9iamVjdCkKLSAgICAgICAgcHJpbnRsbiAiIgotICAgICAgICBwcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgcHJpbnRsbiAiUmVsYXRpb25zaGlwczoiCi0gICAgICAgIHByaW50bG4gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgICAgICBwcmludFJlbGF0aW9uc2hpcHMob2JqZWN0KQotCi0gICAgICAgIGlmKG9iamVjdCBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0gICAgICAgICAgICBwcmludGxuICIiCi0gICAgICAgICAgICBwcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgICAgIHByaW50bG4gIlZlcnNpb25zOiIKLSAgICAgICAgICAgIHByaW50bG4gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgICAgICAgICAgcHJpbnRWZXJzaW9ucyhvYmplY3QpCi0gICAgICAgICAgICBwcmludGxuICIiCi0gICAgICAgICAgICBwcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgICAgIHByaW50bG4gIlJlbmRpdGlvbnM6IgotICAgICAgICAgICAgcHJpbnRsbiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgICAgICAgICBwcmludFJlbmRpdGlvbnMob2JqZWN0KQotICAgICAgICB9Ci0KLSAgICAgICAgaWYob2JqZWN0IGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICBwcmludGxuICIiCi0gICAgICAgICAgICBwcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLSAgICAgICAgICAgIHByaW50bG4gIkNoaWxkcmVuOiIKLSAgICAgICAgICAgIHByaW50bG4gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgICAgICAgICAgcHJpbnRDaGlsZHJlbihpZCkKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZG93bmxvYWQoaWQsIGRlc3RpbmF0aW9uKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KGlkKQotCi0gICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pCi0gICAgICAgIGRlZiBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZmlsZSkKLSAgICAgICAgb3V0IDw8IGRvYy5jb250ZW50U3RyZWFtLnN0cmVhbQotICAgICAgICBvdXQuY2xvc2UoKQotICAgIH0KLQotICAgIEZvbGRlciBjcmVhdGVGb2xkZXIocGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUgPSAiY21pczpmb2xkZXIiKSB7Ci0gICAgICAgIENtaXNPYmplY3QgcGFyZW50Rm9sZGVyID0gZ2V0Rm9sZGVyKHBhcmVudCkKLQotICAgICAgICBkZWYgcHJvcGVydGllcyA9IFsKLSAgICAgICAgICAgIChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk6IHR5cGUsCi0gICAgICAgICAgICAoUHJvcGVydHlJZHMuTkFNRSk6IG5hbWUKLSAgICAgICAgXQotCi0gICAgICAgIHBhcmVudEZvbGRlci5jcmVhdGVGb2xkZXIocHJvcGVydGllcykKLSAgICB9Ci0KLSAgICBEb2N1bWVudCBjcmVhdGVUZXh0RG9jdW1lbnQocGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnQsIFN0cmluZyB0eXBlID0gImNtaXM6ZG9jdW1lbnQiLAotICAgICAgICAgICAgVmVyc2lvbmluZ1N0YXRlIHZlcnNpb25pbmdTdGF0ZSA9IFZlcnNpb25pbmdTdGF0ZS5NQUpPUikgewotICAgICAgICBDbWlzT2JqZWN0IHBhcmVudEZvbGRlciA9IGdldEZvbGRlcihwYXJlbnQpCi0KLSAgICAgICAgZGVmIHByb3BlcnRpZXMgPSBbCi0gICAgICAgICAgICAoUHJvcGVydHlJZHMuT0JKRUNUX1RZUEVfSUQpOiB0eXBlLAotICAgICAgICAgICAgKFByb3BlcnR5SWRzLk5BTUUpOiBuYW1lCi0gICAgICAgIF0KLQotICAgICAgICBkZWYgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQuYnl0ZXMpCi0KLSAgICAgICAgZGVmIGNvbnRlbnRTdHJlYW0gPSBzZXNzaW9uLm9iamVjdEZhY3RvcnkuY3JlYXRlQ29udGVudFN0cmVhbShuYW1lLCBjb250ZW50LmJ5dGVzLmxlbmd0aCwgInRleHQvcGxhaW4iLCBzdHJlYW0pCi0KLSAgICAgICAgcGFyZW50Rm9sZGVyLmNyZWF0ZURvY3VtZW50KHByb3BlcnRpZXMsIGNvbnRlbnRTdHJlYW0sIHZlcnNpb25pbmdTdGF0ZSkKLSAgICB9Ci0KLSAgICBEb2N1bWVudCBjcmVhdGVEb2N1bWVudEZyb21GaWxlKHBhcmVudCwgRmlsZSBmaWxlLCBTdHJpbmcgdHlwZSA9ICJjbWlzOmRvY3VtZW50IiwKLSAgICAgICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSBWZXJzaW9uaW5nU3RhdGUuTUFKT1IpIHsKLSAgICAgICAgQ21pc09iamVjdCBwYXJlbnRGb2xkZXIgPSBnZXRGb2xkZXIocGFyZW50KQotCi0gICAgICAgIGRlZiBuYW1lID0gZmlsZS5uYW1lCi0gICAgICAgIGRlZiBtaW1ldHlwZSA9IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5NaW1lVHlwZXMuZ2V0TUlNRVR5cGUoZmlsZSkKLQotICAgICAgICBkZWYgcHJvcGVydGllcyA9IFsKLSAgICAgICAgICAgIChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk6IHR5cGUsCi0gICAgICAgICAgICAoUHJvcGVydHlJZHMuTkFNRSk6IG5hbWUKLSAgICAgICAgXQotCi0gICAgICAgIGRlZiBjb250ZW50U3RyZWFtID0gc2Vzc2lvbi5vYmplY3RGYWN0b3J5LmNyZWF0ZUNvbnRlbnRTdHJlYW0obmFtZSwgZmlsZS5zaXplKCksIG1pbWV0eXBlLCBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKQotCi0gICAgICAgIHBhcmVudEZvbGRlci5jcmVhdGVEb2N1bWVudChwcm9wZXJ0aWVzLCBjb250ZW50U3RyZWFtLCB2ZXJzaW9uaW5nU3RhdGUpCi0gICAgfQotCi0gICAgUmVsYXRpb25zaGlwIGNyZWF0ZVJlbGF0aW9uc2hpcChzb3VyY2UsIHRhcmdldCwgbmFtZSwgdHlwZSkgewotICAgICAgICBDbWlzT2JqZWN0IHNvdXJjZU9iamVjdCA9IGdldE9iamVjdChzb3VyY2UpCi0gICAgICAgIENtaXNPYmplY3QgdGFyZ2V0T2JqZWN0ID0gZ2V0T2JqZWN0KHRhcmdldCkKLQotICAgICAgICBkZWYgcHJvcGVydGllcyA9IFsKLSAgICAgICAgICAgIChQcm9wZXJ0eUlkcy5PQkpFQ1RfVFlQRV9JRCk6IHR5cGUsCi0gICAgICAgICAgICAoUHJvcGVydHlJZHMuTkFNRSk6IG5hbWUsCi0gICAgICAgICAgICAoUHJvcGVydHlJZHMuU09VUkNFX0lEKTogc291cmNlT2JqZWN0LmlkLAotICAgICAgICAgICAgKFByb3BlcnR5SWRzLlRBUkdFVF9JRCk6IHRhcmdldE9iamVjdC5pZAotICAgICAgICBdCi0KLSAgICAgICAgZ2V0T2JqZWN0KHNlc3Npb24uY3JlYXRlUmVsYXRpb25zaGlwKHByb3BlcnRpZXMpKQotICAgIH0KLQotICAgIHZvaWQgZGVsZXRlKGlkKSB7Ci0gICAgICAgIGlmIChpZCBpbnN0YW5jZW9mIE9iamVjdElkKSB7Ci0gICAgICAgICAgICBzZXNzaW9uLmRlbGV0ZShpZCkKLSAgICAgICAgfSBlbHNlewotICAgICAgICAgICAgc2Vzc2lvbi5kZWxldGUoc2Vzc2lvbi5jcmVhdGVPYmplY3RJZChpZCkpCi0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2NvdW50dHlwZXMuZ3Jvb3Z5IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2NvdW50dHlwZXMuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ZkYzU4Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9jb3VudHR5cGVzLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLioKLQotcHJpbnRsbiAiJ2NtaXM6ZG9jdW1lbnQnIGFuZCBzdWJ0eXBlczogICAgICR7Y291bnRUeXBlcygnY21pczpkb2N1bWVudCcpfSIKLXByaW50bG4gIidjbWlzOml0ZW0nIGFuZCBzdWJ0eXBlczogICAgICAgICAke2NvdW50VHlwZXMoJ2NtaXM6aXRlbScpfSIKLXByaW50bG4gIidjbWlzOmZvbGRlcicgYW5kIHN1YnR5cGVzOiAgICAgICAke2NvdW50VHlwZXMoJ2NtaXM6Zm9sZGVyJyl9IgotcHJpbnRsbiAiJ2NtaXM6cmVsYXRpb25zaGlwJyBhbmQgc3VidHlwZXM6ICR7Y291bnRUeXBlcygnY21pczpyZWxhdGlvbnNoaXAnKX0iCi1wcmludGxuICInY21pczpwb2xpY3knIGFuZCBzdWJ0eXBlczogICAgICAgJHtjb3VudFR5cGVzKCdjbWlzOnBvbGljeScpfSIKLQotCi0KLWludCBjb3VudFR5cGVzKFN0cmluZyB0eXBlSWQpIHsKLSAgICBkZWYgY291bnRlciA9IDAKLQotICAgIHRyeSB7Ci0gICAgICAgIHNlc3Npb24uZ2V0VHlwZURlc2NlbmRhbnRzKHR5cGVJZCwgLTEsIGZhbHNlKS5lYWNoIHsgY291bnRlciArPSAxICsgY291bnQoaXQpIH0KLSAgICAgICAgY291bnRlcisrCi0gICAgfQotICAgIGNhdGNoIChhbnkpIHsKLSAgICB9Ci0KLSAgICBjb3VudGVyCi19Ci0KLWludCBjb3VudChUcmVlIHRyZWUpIHsKLSAgICBkZWYgY291bnRlciA9IDAKLSAgICB0cmVlLmNoaWxkcmVuLmVhY2ggeyBjb3VudGVyICs9IDEgKyBjb3VudChpdCkgfQotCi0gICAgY291bnRlcgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kb3dubG9hZC5ncm9vdnkgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZG93bmxvYWQuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFiZTExLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9kb3dubG9hZC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS4qCi0KLWNtaXMgPSBuZXcgc2NyaXB0cy5DTUlTKHNlc3Npb24pCi0KLS8vIGRlc3RpbmF0aW9uIGZvbGRlcgotRmlsZSBsb2NhbEZvbGRlciA9IG5ldyBGaWxlKCIvc29tZS9sb2NhbC9mb2xkZXIiKQotCi0vLyBzb3VyY2UgZm9sZGVyCi1Gb2xkZXIgc291cmNlRm9sZGVyID0gY21pcy5nZXRGb2xkZXIoIi9mb2xkZXIvdG8vZG93bmxvYWQiKQotCi0vLyBkb3dubG9hZCBmb2xkZXIgdHJlZQotZG93bmxvYWQobG9jYWxGb2xkZXIsIHNvdXJjZUZvbGRlcikKLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWRlZiBkb3dubG9hZChGaWxlIGxvY2FsRm9sZGVyLCBGb2xkZXIgc291cmNlRm9sZGVyKSB7Ci0gICAgcHJpbnRsbiAiXG5Eb3dubG9hZGluZyAke3NvdXJjZUZvbGRlci5uYW1lfSB0byAke2xvY2FsRm9sZGVyLmFic29sdXRlUGF0aH1cbiIKLQotICAgIHNvdXJjZUZvbGRlci5jaGlsZHJlbi5lYWNoIHsgY2hpbGQgLT4KLSAgICAgICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUobG9jYWxGb2xkZXIsIGNoaWxkLm5hbWUpCi0KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICBwcmludGxuICJbRm9sZGVyXSAke25ld0ZpbGUubmFtZX0iCi0gICAgICAgICAgICBuZXdGaWxlLm1rZGlyKCkKLQotICAgICAgICAgICAgZG93bmxvYWQobmV3RmlsZSwgY2hpbGQpCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotICAgICAgICAgICAgcHJpbnRsbiAiW0ZpbGVdICAgJHtuZXdGaWxlLm5hbWV9IgotICAgICAgICAgICAgY21pcy5kb3dubG9hZChjaGlsZCwgbmV3RmlsZSkKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZ2V0ZGVzY2VuZGFudHMuZ3Jvb3Z5IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL2dldGRlc2NlbmRhbnRzLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3N2Y2YS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvZ2V0ZGVzY2VuZGFudHMuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLioKLQotc2Vzc2lvbi5yb290Rm9sZGVyLmdldERlc2NlbmRhbnRzKC0xKS5lYWNoIHsgcHJpbnRUcmVlKGl0LCAwKSB9Ci0KLWRlZiBwcmludFRyZWUoVHJlZSB0cmVlLCBpbnQgZGVwdGgpIHsKLSAgICBkZXB0aC50aW1lcyB7IHByaW50ICIgICIgfQotCi0gICAgcHJpbnRsbiB0cmVlLml0ZW0ubmFtZQotCi0gICAgdHJlZS5jaGlsZHJlbi5lYWNoIHsgcHJpbnRUcmVlKGl0LCBkZXB0aCArIDEpIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvbWltZXR5cGUuZ3Jvb3Z5IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL21pbWV0eXBlLmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyZTJiOC4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvbWltZXR5cGUuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuKgotCi1Eb2N1bWVudCBkb2MgPSBzZXNzaW9uLmdldE9iamVjdCgiLi4uIik7Ci0KLU11dGFibGVDb250ZW50U3RyZWFtIGNvbnRlbnRTdHJlYW0gPSBkb2MuZ2V0Q29udGVudFN0cmVhbSgpOwotY29udGVudFN0cmVhbS5zZXRNaW1lVHlwZSgiYXBwbGljYXRpb24vb3RoZXIiKTsKLQotZG9jLnNldENvbnRlbnRTdHJlYW0oY29udGVudFN0cmVhbSwgdHJ1ZSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3BpbmcuZ3Jvb3Z5IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3BpbmcuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzhhMWFmLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9waW5nLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLioKLQotQ21pc09iamVjdCByb290ID0gc2Vzc2lvbi5nZXRSb290Rm9sZGVyKCkKLQotcGluZyh7IHJvb3QucmVmcmVzaCgpIH0pCi0KLQotCi0KLWRlZiBwaW5nKGZ1bmMsIGludCBzbGVlcFNlY29uZHMgPSAyLCBpbnQgdHVybnMgPSAxMDApIHsKLSAgICBmdW5jKCkKLQotICAgIGxvbmcgdG90YWwgPSAwCi0gICAgbG9uZyBtYXggPSAwCi0gICAgbG9uZyBtaW4gPSBMb25nLk1BWF9WQUxVRQotCi0gICAgZm9yIChpIGluIDEuLnR1cm5zKSB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQotICAgICAgICBmdW5jKCkKLSAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQotCi0gICAgICAgIGxvbmcgdGltZSA9IGVuZCAtIHN0YXJ0Ci0gICAgICAgIHRvdGFsICs9IHRpbWUKLSAgICAgICAgbWF4ID0gbWF4IDwgdGltZSA/IHRpbWUgOiBtYXgKLSAgICAgICAgbWluID0gbWluID4gdGltZSA/IHRpbWUgOiBtaW4KLQotICAgICAgICBwcmludGxuIFN0cmluZy5mb3JtYXQoJ1slMXNdICUyJDVkOiAlMyQ1ZCBtcyAgIChtaW46ICU0JDVkIG1zLCBtYXg6ICU1JDVkIG1zLCBhdmc6ICU2JDcuMWYgbXMpJywKLSAgICAgICAgICAgICAgICAobmV3IERhdGUoc3RhcnQpKS5mb3JtYXQoJ3l5eXktTU0tZGQgaGg6bW06c3MnKSwKLSAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgIHRpbWUsCi0gICAgICAgICAgICAgICAgbWluLAotICAgICAgICAgICAgICAgIG1heCwKLSAgICAgICAgICAgICAgICB0b3RhbCAvIGkpCi0KLSAgICAgICAgc2xlZXAgc2xlZXBTZWNvbmRzICogMTAwMAotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcXVlcnkuZ3Jvb3Z5IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3F1ZXJ5Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjZTU0Mi4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvcXVlcnkuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuKgotCi1TdHJpbmcgY3FsID0gIlNFTEVDVCBjbWlzOm9iamVjdElkLCBjbWlzOm5hbWUsIGNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCBGUk9NIGNtaXM6ZG9jdW1lbnQiCi0KLUl0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcmVzdWx0cyA9IHNlc3Npb24ucXVlcnkoY3FsLCBmYWxzZSkKLQotLy9JdGVtSXRlcmFibGU8UXVlcnlSZXN1bHQ+IHJlc3VsdHMgPSBzZXNzaW9uLnF1ZXJ5KGNxbCwgZmFsc2UpLmdldFBhZ2UoMTApCi0vL0l0ZW1JdGVyYWJsZTxRdWVyeVJlc3VsdD4gcmVzdWx0cyA9IHNlc3Npb24ucXVlcnkoY3FsLCBmYWxzZSkuc2tpcFRvKDEwKS5nZXRQYWdlKDEwKQotCi1yZXN1bHRzLmVhY2ggeyBoaXQgLT4KLSAgICBoaXQucHJvcGVydGllcy5lYWNoIHsgcHJpbnRsbiAiJHtpdC5xdWVyeU5hbWV9OiAke2l0LmZpcnN0VmFsdWV9IiB9Ci0gICAgcHJpbnRsbiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi19Ci0KLXByaW50bG4gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotcHJpbnRsbiAiVG90YWwgbnVtYmVyOiAke3Jlc3VsdHMudG90YWxOdW1JdGVtc30iCi1wcmludGxuICJIYXMgbW9yZTogJHtyZXN1bHRzLmhhc01vcmVJdGVtc30iCi1wcmludGxuICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvc2NyaXB0LWxpYnJhcnkucHJvcGVydGllcyBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9zY3JpcHQtbGlicmFyeS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDEzMGY3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9zY3JpcHQtbGlicmFyeS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIwotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIwotCi0jCi0jIEFkZCBtb3JlIHNjcmlwdHMgaGVyZS4KLSMga2V5ID0gc2NyaXB0IGZpbGUsIHZhbHVlID0gdGl0bGUKLSMKLQotc3RhcnR1cC5ncm9vdnkgPSAtIERlbW8gLQotdGVtcGxhdGUuZ3Jvb3Z5ID0gLSBCYXNpYyB0ZW1wbGF0ZSAtCi0KLWdldGRlc2NlbmRhbnRzLmdyb292eSA9IFByaW50IGRlc2NlbmRhbnRzIHRyZWUKLXF1ZXJ5Lmdyb292eSA9IEV4ZWN1dGUgYSBxdWVyeQotY291bnR0eXBlcy5ncm9vdnkgPSBDb3VudCB0eXBlcyBhbmQgc3ViIHR5cGVzCi11cGxvYWQuZ3Jvb3Z5ID0gVXBsb2FkIGEgbG9jYWwgZm9sZGVyIHRvIHRoZSByZXBvc2l0b3J5Ci1kb3dubG9hZC5ncm9vdnkgPSBEb3dubG9hZCBhIHJlcG9zaXRvcnkgZm9sZGVyIHRvIHRoZSBsb2NhbCBkaXNrCi1waW5nLmdyb292eSA9IFBpbmcgdGhlIHJlcG9zaXRvcnkKLXN0YXRzLmdyb292eSA9IENvdW50IG9iamVjdHMgYW5kIGJ5dGVzCi1taW1ldHlwZS5ncm9vdnkgPSBDaGFuZ2UgZG9jdW1lbnQgTUlNRSB0eXBlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvc3RhcnR1cC5ncm9vdnkgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvc3RhcnR1cC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzUyMTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3N0YXJ0dXAuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmRhdGEuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZW51bXMuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC5hcGkuKgotCi0vLyB2YXJpYWJsZSAnc2Vzc2lvbicgaXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgT3BlbkNNSVMgc2Vzc2lvbgotCi0KLS8vIHByaW50IHRoZSByZXBvc2l0b3J5IG5hbWUgLSBKYXZhIHN0eWxlCi1wcmludGxuICJSZXBvc2l0b3J5OiAiICsgc2Vzc2lvbi5nZXRSZXBvc2l0b3J5SW5mbygpLmdldE5hbWUoKQotCi0vLyBwcmludCB0aGUgcmVwb3NpdG9yeSBuYW1lIC0gR3Jvb3Z5IHN0eWxlCi1wcmludGxuICJSZXBvc2l0b3J5OiAke3Nlc3Npb24ucmVwb3NpdG9yeUluZm8ubmFtZX0iCi0KLQotLy8gZ2V0IHJvb3QgZm9sZGVyCi1Gb2xkZXIgcm9vdCA9IHNlc3Npb24uZ2V0Um9vdEZvbGRlcigpCi1wcmludGxuICItLS0gUm9vdCBGb2xkZXI6ICIgKyByb290LmdldE5hbWUoKSArICIgLS0tIgotCi0vLyBwcmludCByb290IGZvbGRlciBjaGlsZHJlbgotZm9yKENtaXNPYmplY3Qgb2JqZWN0OiByb290LmdldENoaWxkcmVuKCkpIHsKLSAgICBwcmludGxuIG9iamVjdC5nZXROYW1lKCkgKyAiIFx0KCIgKyBvYmplY3QuZ2V0VHlwZSgpLmdldElkKCkgKyAiKSIKLX0KLQotLy8gcnVuIGEgcXVpY2sgcXVlcnkKLWZvcihRdWVyeVJlc3VsdCBoaXQ6IHNlc3Npb24ucXVlcnkoIlNFTEVDVCAqIEZST00gY21pczpkb2N1bWVudCIsIGZhbHNlKSkgewotICAgIGhpdC5wcm9wZXJ0aWVzLmVhY2h7IHByaW50bG4gIiR7aXQucXVlcnlOYW1lfTogJHtpdC5maXJzdFZhbHVlfSIgfQotICAgIHByaW50bG4gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi19Ci0KLS8vIENNSVMgaGVscGVyIHNjcmlwdAotZGVmIGNtaXMgPSBuZXcgc2NyaXB0cy5DTUlTKHNlc3Npb24pCi0KLWNtaXMucHJpbnRQcm9wZXJ0aWVzICIvIiAgICAgICAgICAgICAgICAgICAgLy8gYWNjZXNzIGJ5IHBhdGgKLWNtaXMucHJpbnRQcm9wZXJ0aWVzIHNlc3Npb24ucm9vdEZvbGRlci5pZCAgLy8gYWNjZXNzIGJ5IGlkCi1jbWlzLnByaW50UHJvcGVydGllcyBzZXNzaW9uLnJvb3RGb2xkZXIgICAgIC8vIGFjY2VzcyBieSBvYmplY3QKLQotLy8gRm9sZGVyIGZvbGRlciA9IGNtaXMuY3JlYXRlRm9sZGVyKCIvIiwgInRlc3QtZm9sZGVyIiwgImNtaXM6Zm9sZGVyIikKLQotLy8gRG9jdW1lbnQgZG9jID0gY21pcy5jcmVhdGVUZXh0RG9jdW1lbnQoZm9sZGVyLCAidGVzdC50eHQiLCAiSGVsbG8gV29ybGQhIiwgImNtaXM6ZG9jdW1lbnQiKQotLy8gY21pcy5wcmludFByb3BlcnRpZXMgZG9jCi0vLyBjbWlzLmRvd25sb2FkKGRvYywgIi9zb21lL3BhdGgvaGVsbG9Xb3JsZC50eHQiKQotLy8gY21pcy5kZWxldGUgZG9jLmlkCi0KLS8vIGNtaXMuZGVsZXRlIGZvbGRlcgotCi0KLS8vIHNlZSAvc2NyaXB0cy9DTUlTLmdyb292eSBmb3IgbW9yZSBtZXRob2RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3N0YXRzLmdyb292eSBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy9zdGF0cy5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTAzZTcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3N0YXRzLmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5kYXRhLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmVudW1zLioKLWltcG9ydCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpLioKLQotRm9sZGVyIGZvbGRlciA9IChGb2xkZXIpIHNlc3Npb24uZ2V0T2JqZWN0QnlQYXRoKCIvIikKLQotCi1kZWYgc3RhdHMgPSBjb3VudChmb2xkZXIsIHRydWUpCi0KLXByaW50bG4gIkZvbGRlciAke2ZvbGRlci5uYW1lfSIKLXByaW50bG4gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi1wcmludGxuICJGb2xkZXJzOiAgICR7c3RhdHNbJ2ZvbGRlcnMnXX0iCi1wcmludGxuICJEb2N1bWVudHM6ICR7c3RhdHNbJ2RvY3VtZW50cyddfSIKLXByaW50bG4gIkl0ZW1zOiAgICAgJHtzdGF0c1snaXRlbXMnXX0iCi1wcmludGxuICJQb2xpY2llczogICR7c3RhdHNbJ3BvbGljaWVzJ119IgotcHJpbnRsbiAiQ29udGVudDogICAke3N0YXRzWydieXRlcyddfSBieXRlcyIKLQotCi0KLWRlZiBjb3VudChGb2xkZXIgZm9sZGVyLCBib29sZWFuIHRyZWUgPSBmYWxzZSkgewotICAgIGRlZiBzdGF0cyA9IFs6XQotICAgIHN0YXRzWyJmb2xkZXJzIl0gPSAwCi0gICAgc3RhdHNbImRvY3VtZW50cyJdID0gMAotICAgIHN0YXRzWyJpdGVtcyJdID0gMAotICAgIHN0YXRzWyJwb2xpY2llcyJdID0gMAotICAgIHN0YXRzWyJieXRlcyJdID0gMAotCi0gICAgT3BlcmF0aW9uQ29udGV4dCBvYyA9IHNlc3Npb24uY3JlYXRlT3BlcmF0aW9uQ29udGV4dCgpCi0gICAgb2Muc2V0RmlsdGVyU3RyaW5nKCJjbWlzOm9iamVjdElkLGNtaXM6Y29udGVudFN0cmVhbUxlbmd0aCIpCi0gICAgb2Muc2V0SW5jbHVkZUFsbG93YWJsZUFjdGlvbnMoZmFsc2UpCi0gICAgb2Muc2V0TWF4SXRlbXNQZXJQYWdlKDEwMDAwKQotCi0gICAgY291bnRJbnRlcm5hbChmb2xkZXIsIHRyZWUsIG9jLCBzdGF0cykKLQotICAgIHN0YXRzCi19Ci0KLWRlZiBjb3VudEludGVybmFsKEZvbGRlciBmb2xkZXIsIGJvb2xlYW4gdHJlZSwgT3BlcmF0aW9uQ29udGV4dCBvYywgZGVmIHN0YXRzKSB7Ci0gICAgZm9sZGVyLmdldENoaWxkcmVuKG9jKS5lYWNoIHsgY2hpbGQgLT4KLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRm9sZGVyKSB7Ci0gICAgICAgICAgICBzdGF0c1siZm9sZGVycyJdKysKLSAgICAgICAgICAgIGlmICh0cmVlKSB7Ci0gICAgICAgICAgICAgICAgY291bnRJbnRlcm5hbChjaGlsZCwgdHJ1ZSwgb2MsIHN0YXRzKQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIHN0YXRzWyJkb2N1bWVudHMiXSsrCi0gICAgICAgICAgICBsb25nIHNpemUgPSAoKERvY3VtZW50KSBjaGlsZCkuZ2V0Q29udGVudFN0cmVhbUxlbmd0aCgpCi0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0c1siYnl0ZXMiXSArPSBzaXplCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0gICAgICAgICAgICBzdGF0c1siaXRlbSJdKysKLSAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFBvbGljeSkgewotICAgICAgICAgICAgc3RhdHNbInBvbGljaWVzIl0rKwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy90ZW1wbGF0ZS5ncm9vdnkgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vcmVzb3VyY2VzL3NjcmlwdHMvdGVtcGxhdGUuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQzYWVlLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy90ZW1wbGF0ZS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS4qCi0KLS8vIGRlZiBjbWlzID0gbmV3IHNjcmlwdHMuQ01JUyhzZXNzaW9uKQotLy8gcHJpbnRsbiBzZXNzaW9uLnJlcG9zaXRvcnlJbmZvLm5hbWUKLS8vIGNtaXMucHJpbnRPYmplY3RTdW1tYXJ5ICIvIgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9yZXNvdXJjZXMvc2NyaXB0cy91cGxvYWQuZ3Jvb3Z5IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3VwbG9hZC5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWI3NjguLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3Jlc291cmNlcy9zY3JpcHRzL3VwbG9hZC5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuKgotaW1wb3J0IG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuZGF0YS4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy5lbnVtcy4qCi1pbXBvcnQgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmFwaS4qCi0KLWNtaXMgPSBuZXcgc2NyaXB0cy5DTUlTKHNlc3Npb24pCi0KLS8vIGRlc3RpbmF0aW9uIGZvbGRlcgotRm9sZGVyIGRlc3RGb2xkZXIgPSBjbWlzLmdldEZvbGRlcigiLyIpCi0KLS8vIHNvdXJjZSBmb2xkZXIKLVN0cmluZyBsb2NhbFBhdGggPSAiL3NvbWUvbG9jYWwvZm9sZGVyIgotCi0vLyB1cGxvYWQgZm9sZGVyIHRyZWUKLXVwbG9hZChkZXN0Rm9sZGVyLCBsb2NhbFBhdGgpCi0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1kZWYgdXBsb2FkKGRlc3RpbmF0aW9uLCBTdHJpbmcgbG9jYWxQYXRoLAotICAgICAgICBTdHJpbmcgZm9sZGVyVHlwZSA9ICJjbWlzOmZvbGRlciIsCi0gICAgICAgIFN0cmluZyBkb2N1bWVudFR5cGUgPSAiY21pczpkb2N1bWVudCIsCi0gICAgICAgIFZlcnNpb25pbmdTdGF0ZSB2ZXJzaW9uaW5nU3RhdGUgPSBWZXJzaW9uaW5nU3RhdGUuTUFKT1IpIHsKLQotICAgIHByaW50bG4gIlVwbG9hZGluZy4uLlxuIgotICAgIGRvVXBsb2FkKGRlc3RpbmF0aW9uLCBuZXcgRmlsZShsb2NhbFBhdGgpLCBmb2xkZXJUeXBlLCBkb2N1bWVudFR5cGUsIHZlcnNpb25pbmdTdGF0ZSkKLSAgICBwcmludGxuICJcbi4uLmRvbmUuIgotfQotCi1kZWYgZG9VcGxvYWQoRm9sZGVyIHBhcmVudCwgRmlsZSBmb2xkZXIsIFN0cmluZyBmb2xkZXJUeXBlLCBTdHJpbmcgZG9jdW1lbnRUeXBlLCBWZXJzaW9uaW5nU3RhdGUgdmVyc2lvbmluZ1N0YXRlKSB7Ci0gICAgZm9sZGVyLmVhY2hGaWxlIHsKLSAgICAgICAgaWYgKGl0Lm5hbWUuc3RhcnRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICBwcmludGxuICJTa2lwcGluZyAke2l0Lm5hbWV9IgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIH0KLQotICAgICAgICBwcmludGxuIGl0Lm5hbWUKLQotICAgICAgICBpZiAoaXQuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIGNtaXMuY3JlYXRlRG9jdW1lbnRGcm9tRmlsZShwYXJlbnQsIGl0LCBkb2N1bWVudFR5cGUsIHZlcnNpb25pbmdTdGF0ZSkKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGl0LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZvbGRlciBuZXdGb2xkZXIgPSBjbWlzLmNyZWF0ZUZvbGRlcihwYXJlbnQsIGl0Lm5hbWUsIGZvbGRlclR5cGUpCi0gICAgICAgICAgICBkb1VwbG9hZChuZXdGb2xkZXIsIGl0LCBmb2xkZXJUeXBlLCBkb2N1bWVudFR5cGUsIHZlcnNpb25pbmdTdGF0ZSkKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC9pbmZvLnBsaXN0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L2luZm8ucGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTU1NjQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L2luZm8ucGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Ci08cGxpc3QgdmVyc2lvbj0iMS4wIj4KLTxkaWN0PgotICAgIDxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+Ci0gICAgPHN0cmluZz5DTUlTIFdvcmtiZW5jaCBAdmVyc2lvbm51bWJlckA8L3N0cmluZz4KLSAgICA8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgotICAgIDxzdHJpbmc+b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoPC9zdHJpbmc+Ci0gICAgPGtleT5DRkJ1bmRsZUV4ZWN1dGFibGU8L2tleT4KLSAgICA8c3RyaW5nPnJ1bi5zaDwvc3RyaW5nPgotICAgIDxrZXk+Q0ZCdW5kbGVJY29uRmlsZTwva2V5PgotICAgIDxzdHJpbmc+aWNvbi5pY25zPC9zdHJpbmc+Ci0gICAgPGtleT5DRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbjwva2V5PgotICAgIDxzdHJpbmc+MS4wPC9zdHJpbmc+Ci0gICAgPGtleT5DRkJ1bmRsZVBhY2thZ2VUeXBlPC9rZXk+Ci0gICAgPHN0cmluZz5BUFBMPC9zdHJpbmc+Ci0gICAgPGtleT5DRkJ1bmRsZVNpZ25hdHVyZTwva2V5PgotICAgIDxzdHJpbmc+Pz8/Pzwvc3RyaW5nPgotICAgIDxrZXk+Q0ZCdW5kbGVWZXJzaW9uPC9rZXk+Ci0gICAgPHN0cmluZz5AdmVyc2lvbm51bWJlckA8L3N0cmluZz4KLTwvZGljdD4KLTwvcGxpc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3J1bi5zaCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC9ydW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjQwODQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3J1bi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyEvYmluL3NoCi0iJChkaXJuYW1lICIkMCIpLy4uL1Jlc291cmNlcy93b3JrYmVuY2guc2giClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1heGlzMi5iYXQgYi90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLWF4aXMyLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyOWQwNy4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLWF4aXMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotcmVtIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotcmVtIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotcmVtIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLXJlbSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotcmVtICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi1yZW0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLXJlbQotcmVtICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLXJlbQotcmVtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLXJlbSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotcmVtIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotcmVtIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLXJlbSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIEB2ZXJzaW9uQAotCi1jZCAlfmRwMFxsaWIKLQotcmVtIHVzZSB2YXJpYWJsZSBDVVNUT01fSkFWQV9PUFRTIHRvIHNldCBhZGRpdGlvbmFsIEpBVkEgb3B0aW9ucwotCi1yZW0gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gY29uZmlndXJlIEhUVFAgcHJveHkKLQotcmVtIHNldCBodHRwX3Byb3h5PWh0dHA6Ly88cHJveHk+Ojxwb3J0PgotcmVtIHNldCBodHRwc19wcm94eT1odHRwczovLzxwcm94eT46PHBvcnQ+Ci1yZW0gc2V0IG5vX3Byb3h5PWxvY2FsaG9zdCwxMjcuMC4wLjAsLmxvY2FsCi0KLQotZm9yIC9GICJkZWxpbXM9LyIgJSV4IGluICgnImphdmEgLWNsYXNzcGF0aCAuOyogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLlByb3h5RGV0ZWN0b3IgLWogLXMiJykgZG8gc2V0ICJKQVZBX1BST1hZX0NPTkY9JSV4Igotc2V0IEpBVkFfT1BUUz0lSkFWQV9QUk9YWV9DT05GJSAtRG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuamF4d3MuaW1wbD1heGlzMgotCi1zdGFydCAvQiBqYXZhdyAlSkFWQV9PUFRTJSAlQ1VTVE9NX0pBVkFfT1BUUyUgLWNsYXNzcGF0aCAiLjsqIiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guV29ya2JlbmNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1heGlzMi5zaCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC93b3JrYmVuY2gtYXhpczIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODA0ZTUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1heGlzMi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgQHZlcnNpb25ACi0KLWlmIFsgLXogIiRKQVZBX0hPTUUiIF07IHRoZW4KLSAgaj0kKHdoaWNoIGphdmEgMj4vZGV2L251bGwpCi0gIGlmIFsgLXogIiRqIiBdOyB0aGVuCi0gCWVjaG8gIlVuYWJsZSB0byBsb2NhdGUgSmF2YSEiCi0gICAgZXhpdCAxCi0gIGVsc2UKLSAgICBKQVZBPSIkaiIKLSAgZmkKLWVsc2UKLSAgSkFWQT0iJEpBVkFfSE9NRS9iaW4vamF2YSIKLWZpCi0KLQotU0NSSVBUX0RJUj0kKGRpcm5hbWUgIiQwIikKLWNkICIkU0NSSVBUX0RJUi9saWIiCi0KLVdDUD0iLiIKLWZvciBpIGluICouamFyOyBkbwotICBXQ1A9IiRpOiR7V0NQfSIKLWRvbmUKLQotIyB1c2UgdmFyaWFibGUgQ1VTVE9NX0pBVkFfT1BUUyB0byBzZXQgYWRkaXRpb25hbCBKQVZBIG9wdGlvbnMKLQotIyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBjb25maWd1cmUgSFRUUCBwcm94eQotCi0jIGV4cG9ydCBodHRwX3Byb3h5PWh0dHA6Ly88cHJveHk+Ojxwb3J0PgotIyBleHBvcnQgaHR0cHNfcHJveHk9aHR0cHM6Ly88cHJveHk+Ojxwb3J0PgotIyBleHBvcnQgbm9fcHJveHk9bG9jYWxob3N0LDEyNy4wLjAuMCwubG9jYWwKLQotCi1KQVZBX1BST1hZX0NPTkY9JCgkSkFWQSAtY2xhc3NwYXRoICRXQ1Agb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLlByb3h5RGV0ZWN0b3IgLWogLXMpCi1KQVZBX09QVFM9IiRKQVZBX1BST1hZX0NPTkYgLURvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5iaW5kaW5nLndlYnNlcnZpY2VzLmpheHdzLmltcGw9YXhpczIiCi0KLWV4ZWMgJEpBVkEgJEpBVkFfT1BUUyAkQ1VTVE9NX0pBVkFfT1BUUyAtY2xhc3NwYXRoICRXQ1Agb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLldvcmtiZW5jaCAmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1jeGYuYmF0IGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1jeGYuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2I3ODkyLi4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC93b3JrYmVuY2gtY3hmLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUBlY2hvIG9mZgotcmVtIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotcmVtIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotcmVtIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLXJlbSBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotcmVtICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi1yZW0gdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLXJlbQotcmVtICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLXJlbQotcmVtIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLXJlbSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotcmVtIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotcmVtIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLXJlbSBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIEB2ZXJzaW9uQAotCi1jZCAlfmRwMFxsaWIKLQotcmVtIHVzZSB2YXJpYWJsZSBDVVNUT01fSkFWQV9PUFRTIHRvIHNldCBhZGRpdGlvbmFsIEpBVkEgb3B0aW9ucwotCi1yZW0gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gY29uZmlndXJlIEhUVFAgcHJveHkKLQotcmVtIHNldCBodHRwX3Byb3h5PWh0dHA6Ly88cHJveHk+Ojxwb3J0PgotcmVtIHNldCBodHRwc19wcm94eT1odHRwczovLzxwcm94eT46PHBvcnQ+Ci1yZW0gc2V0IG5vX3Byb3h5PWxvY2FsaG9zdCwxMjcuMC4wLjAsLmxvY2FsCi0KLQotZm9yIC9GICJkZWxpbXM9LyIgJSV4IGluICgnImphdmEgLWNsYXNzcGF0aCAuOyogb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLlByb3h5RGV0ZWN0b3IgLWogLXMiJykgZG8gc2V0ICJKQVZBX1BST1hZX0NPTkY9JSV4Igotc2V0IEpBVkFfT1BUUz0lSkFWQV9QUk9YWV9DT05GJSAtRG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuamF4d3MuaW1wbD1jeGYKLQotc3RhcnQgL0IgamF2YXcgJUpBVkFfT1BUUyUgJUNVU1RPTV9KQVZBX09QVFMlIC1jbGFzc3BhdGggIi47KiIgb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMud29ya2JlbmNoLldvcmtiZW5jaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC93b3JrYmVuY2gtY3hmLnNoIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1jeGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjA1NzUuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1jeGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIEB2ZXJzaW9uQAotCi1pZiBbIC16ICIkSkFWQV9IT01FIiBdOyB0aGVuCi0gIGo9JCh3aGljaCBqYXZhIDI+L2Rldi9udWxsKQotICBpZiBbIC16ICIkaiIgXTsgdGhlbgotIAllY2hvICJVbmFibGUgdG8gbG9jYXRlIEphdmEhIgotICAgIGV4aXQgMQotICBlbHNlCi0gICAgSkFWQT0iJGoiCi0gIGZpCi1lbHNlCi0gIEpBVkE9IiRKQVZBX0hPTUUvYmluL2phdmEiCi1maQotCi0KLVNDUklQVF9ESVI9JChkaXJuYW1lICIkMCIpCi1jZCAiJFNDUklQVF9ESVIvbGliIgotCi1XQ1A9Ii4iCi1mb3IgaSBpbiAqLmphcjsgZG8KLSAgV0NQPSIkaToke1dDUH0iCi1kb25lCi0KLSMgdXNlIHZhcmlhYmxlIENVU1RPTV9KQVZBX09QVFMgdG8gc2V0IGFkZGl0aW9uYWwgSkFWQSBvcHRpb25zCi0KLSMgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gY29uZmlndXJlIEhUVFAgcHJveHkKLQotIyBleHBvcnQgaHR0cF9wcm94eT1odHRwOi8vPHByb3h5Pjo8cG9ydD4KLSMgZXhwb3J0IGh0dHBzX3Byb3h5PWh0dHBzOi8vPHByb3h5Pjo8cG9ydD4KLSMgZXhwb3J0IG5vX3Byb3h5PWxvY2FsaG9zdCwxMjcuMC4wLjAsLmxvY2FsCi0KLQotSkFWQV9QUk9YWV9DT05GPSQoJEpBVkEgLWNsYXNzcGF0aCAkV0NQIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5Qcm94eURldGVjdG9yIC1qIC1zKQotSkFWQV9PUFRTPSIkSkFWQV9QUk9YWV9DT05GIC1Eb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5qYXh3cy5pbXBsPWN4ZiIKLQotZXhlYyAkSkFWQSAkSkFWQV9PUFRTICRDVVNUT01fSkFWQV9PUFRTIC1jbGFzc3BhdGggJFdDUCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guV29ya2JlbmNoICYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLXJpLmJhdCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC93b3JrYmVuY2gtcmkuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA0Mzc3Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC93b3JrYmVuY2gtcmkuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi1yZW0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi1yZW0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotcmVtIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi1yZW0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXJlbSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotcmVtCi1yZW0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotcmVtCi1yZW0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotcmVtIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1yZW0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1yZW0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotcmVtIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1yZW0gQHZlcnNpb25ACi0KLWNkICV+ZHAwXGxpYgotCi1yZW0gdXNlIHZhcmlhYmxlIENVU1RPTV9KQVZBX09QVFMgdG8gc2V0IGFkZGl0aW9uYWwgSkFWQSBvcHRpb25zCi0KLXJlbSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBjb25maWd1cmUgSFRUUCBwcm94eQotCi1yZW0gc2V0IGh0dHBfcHJveHk9aHR0cDovLzxwcm94eT46PHBvcnQ+Ci1yZW0gc2V0IGh0dHBzX3Byb3h5PWh0dHBzOi8vPHByb3h5Pjo8cG9ydD4KLXJlbSBzZXQgbm9fcHJveHk9bG9jYWxob3N0LDEyNy4wLjAuMCwubG9jYWwKLQotCi1mb3IgL0YgImRlbGltcz0vIiAlJXggaW4gKCciamF2YSAtY2xhc3NwYXRoIC47KiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guUHJveHlEZXRlY3RvciAtaiAtcyInKSBkbyBzZXQgIkpBVkFfUFJPWFlfQ09ORj0lJXgiCi1zZXQgSkFWQV9PUFRTPSVKQVZBX1BST1hZX0NPTkYlIC1Eb3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuYmluZGluZy53ZWJzZXJ2aWNlcy5qYXh3cy5pbXBsPXN1bnJpCi0KLXN0YXJ0IC9CIGphdmF3ICVKQVZBX09QVFMlICVDVVNUT01fSkFWQV9PUFRTJSAtY2xhc3NwYXRoICIuOyoiIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5Xb3JrYmVuY2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLXJpLnNoIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC1yaS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlN2Y4My4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLXJpLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBAdmVyc2lvbkAKLQotaWYgWyAteiAiJEpBVkFfSE9NRSIgXTsgdGhlbgotICBqPSQod2hpY2ggamF2YSAyPi9kZXYvbnVsbCkKLSAgaWYgWyAteiAiJGoiIF07IHRoZW4KLSAJZWNobyAiVW5hYmxlIHRvIGxvY2F0ZSBKYXZhISIKLSAgICBleGl0IDEKLSAgZWxzZQotICAgIEpBVkE9IiRqIgotICBmaQotZWxzZQotICBKQVZBPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgotZmkKLQotCi1TQ1JJUFRfRElSPSQoZGlybmFtZSAiJDAiKQotY2QgIiRTQ1JJUFRfRElSL2xpYiIKLQotV0NQPSIuIgotZm9yIGkgaW4gKi5qYXI7IGRvCi0gIFdDUD0iJGk6JHtXQ1B9IgotZG9uZQotCi0jIHVzZSB2YXJpYWJsZSBDVVNUT01fSkFWQV9PUFRTIHRvIHNldCBhZGRpdGlvbmFsIEpBVkEgb3B0aW9ucwotCi0jIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIGNvbmZpZ3VyZSBIVFRQIHByb3h5Ci0KLSMgZXhwb3J0IGh0dHBfcHJveHk9aHR0cDovLzxwcm94eT46PHBvcnQ+Ci0jIGV4cG9ydCBodHRwc19wcm94eT1odHRwczovLzxwcm94eT46PHBvcnQ+Ci0jIGV4cG9ydCBub19wcm94eT1sb2NhbGhvc3QsMTI3LjAuMC4wLC5sb2NhbAotCi0KLUpBVkFfUFJPWFlfQ09ORj0kKCRKQVZBIC1jbGFzc3BhdGggJFdDUCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guUHJveHlEZXRlY3RvciAtaiAtcykKLUpBVkFfT1BUUz0iJEpBVkFfUFJPWFlfQ09ORiAtRG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmJpbmRpbmcud2Vic2VydmljZXMuamF4d3MuaW1wbD1zdW5yaSIKLQotZXhlYyAkSkFWQSAkSkFWQV9PUFRTICRDVVNUT01fSkFWQV9PUFRTIC1jbGFzc3BhdGggJFdDUCBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guV29ya2JlbmNoICYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLmJhdCBiL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC93b3JrYmVuY2guYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDQ2ODQ2Li4wMDAwMDAwCi0tLSBhL3RydW5rL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9zcmMvbWFpbi9zdGFydC93b3JrYmVuY2guYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotQGVjaG8gb2ZmCi1yZW0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi1yZW0gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi1yZW0gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotcmVtIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi1yZW0gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLXJlbSB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotcmVtCi1yZW0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotcmVtCi1yZW0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotcmVtIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1yZW0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1yZW0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotcmVtIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1yZW0gQHZlcnNpb25ACi0KLWNkICV+ZHAwXGxpYgotCi1yZW0gdXNlIHZhcmlhYmxlIENVU1RPTV9KQVZBX09QVFMgdG8gc2V0IGFkZGl0aW9uYWwgSkFWQSBvcHRpb25zCi0KLXJlbSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byBjb25maWd1cmUgSFRUUCBwcm94eQotCi1yZW0gc2V0IGh0dHBfcHJveHk9aHR0cDovLzxwcm94eT46PHBvcnQ+Ci1yZW0gc2V0IGh0dHBzX3Byb3h5PWh0dHBzOi8vPHByb3h5Pjo8cG9ydD4KLXJlbSBzZXQgbm9fcHJveHk9bG9jYWxob3N0LDEyNy4wLjAuMCwubG9jYWwKLQotCi1mb3IgL0YgImRlbGltcz0vIiAlJXggaW4gKCciamF2YSAtY2xhc3NwYXRoIC47KiBvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy53b3JrYmVuY2guUHJveHlEZXRlY3RvciAtaiAtcyInKSBkbyBzZXQgIkpBVkFfUFJPWFlfQ09ORj0lJXgiCi1zZXQgSkFWQV9PUFRTPSVKQVZBX1BST1hZX0NPTkYlCi0KLXN0YXJ0IC9CIGphdmF3ICVKQVZBX09QVFMlICVDVVNUT01fSkFWQV9PUFRTJSAtY2xhc3NwYXRoICIuOyoiIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5Xb3JrYmVuY2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLnNoIGIvdHJ1bmsvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaC9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL3NyYy9tYWluL3N0YXJ0L3dvcmtiZW5jaC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5NzJkOS4uMDAwMDAwMAotLS0gYS90cnVuay9jaGVtaXN0cnktb3BlbmNtaXMtd29ya2JlbmNoL2NoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvc3JjL21haW4vc3RhcnQvd29ya2JlbmNoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyAjIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIEB2ZXJzaW9uQAotCi1pZiBbIC16ICIkSkFWQV9IT01FIiBdOyB0aGVuCi0gIGo9JCh3aGljaCBqYXZhIDI+L2Rldi9udWxsKQotICBpZiBbIC16ICIkaiIgXTsgdGhlbgotIAllY2hvICJVbmFibGUgdG8gbG9jYXRlIEphdmEhIgotICAgIGV4aXQgMQotICBlbHNlCi0gICAgSkFWQT0iJGoiCi0gIGZpCi1lbHNlCi0gIEpBVkE9IiRKQVZBX0hPTUUvYmluL2phdmEiCi1maQotCi0KLVNDUklQVF9ESVI9JChkaXJuYW1lICIkMCIpCi1jZCAiJFNDUklQVF9ESVIvbGliIgotCi1XQ1A9Ii4iCi1mb3IgaSBpbiAqLmphcjsgZG8KLSAgV0NQPSIkaToke1dDUH0iCi1kb25lCi0KLSMgdXNlIHZhcmlhYmxlIENVU1RPTV9KQVZBX09QVFMgdG8gc2V0IGFkZGl0aW9uYWwgSkFWQSBvcHRpb25zCi0KLSMgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8gY29uZmlndXJlIEhUVFAgcHJveHkKLQotIyBleHBvcnQgaHR0cF9wcm94eT1odHRwOi8vPHByb3h5Pjo8cG9ydD4KLSMgZXhwb3J0IGh0dHBzX3Byb3h5PWh0dHBzOi8vPHByb3h5Pjo8cG9ydD4KLSMgZXhwb3J0IG5vX3Byb3h5PWxvY2FsaG9zdCwxMjcuMC4wLjAsLmxvY2FsCi0KLQotSkFWQV9QUk9YWV9DT05GPSQoJEpBVkEgLWNsYXNzcGF0aCAkV0NQIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5Qcm94eURldGVjdG9yIC1qIC1zKQotSkFWQV9PUFRTPSIkSkFWQV9QUk9YWV9DT05GIgotCi1leGVjICRKQVZBICRKQVZBX09QVFMgJENVU1RPTV9KQVZBX09QVFMgLWNsYXNzcGF0aCAkV0NQIG9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaC5Xb3JrYmVuY2ggJgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3BvbS54bWwgYi90cnVuay9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzYzZGFiLi4wMDAwMDAwCi0tLSBhL3RydW5rL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPjxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZTwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xNjwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDwhLS0gUHJvamVjdCBJbmZvcm1hdGlvbiAtLT4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmNoZW1pc3RyeS1vcGVuY21pczwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQ2hlbWlzdHJ5IE9wZW5DTUlTPC9uYW1lPgotICAgIDx2ZXJzaW9uPjAuMTMuMDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgotICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KLSAgICA8L29yZ2FuaXphdGlvbj4KLQotICAgIDx1cmw+aHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnL2phdmEvPC91cmw+Ci0gICAgCi0gICAgPGNpTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5IdWRzb24gWm9uZXMgQXBhY2hlPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2h1ZHNvbi56b25lcy5hcGFjaGUub3JnL2h1ZHNvbi92aWV3L0NoZW1pc3RyeS88L3VybD4KLSAgICA8L2NpTWFuYWdlbWVudD4KLSAgICA8aW5jZXB0aW9uWWVhcj4yMDA5PC9pbmNlcHRpb25ZZWFyPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUyBpcyBhbiBvcGVuIHNvdXJjZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT0FTSVMgQ01JUyBzcGVjaWZpY2F0aW9uLgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8bGljZW5zZXM+Ci0gICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIDI8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQ8L3VybD4KLSAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgotICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgPC9saWNlbnNlcz4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9jaGVtaXN0cnkvb3BlbmNtaXMvdGFncy9jaGVtaXN0cnktb3BlbmNtaXMtMC4xMy4wLVJDMTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9jaGVtaXN0cnkvb3BlbmNtaXMvdGFncy9jaGVtaXN0cnktb3BlbmNtaXMtMC4xMy4wLVJDMTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2NoZW1pc3RyeS9vcGVuY21pcy90YWdzL2NoZW1pc3RyeS1vcGVuY21pcy0wLjEzLjAtUkMxPC91cmw+Ci0gICAgPC9zY20+Ci0KLSAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNpdGU+Ci0gICAgICAgICAgICA8aWQ+JHtzaXRlLnN0YWdpbmcuaWR9PC9pZD4KLSAgICAgICAgICAgIDx1cmw+JHtzaXRlLnN0YWdpbmcudXJsfTwvdXJsPgotICAgICAgICA8L3NpdGU+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5KaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DTUlTPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0KLSAgICA8bWFpbGluZ0xpc3RzPgotICAgICAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICAgICAgICA8bmFtZT5DaGVtaXN0cnkgRGV2ZWxvcG1lbnQgTGlzdDwvbmFtZT4KLSAgICAgICAgICAgIDxzdWJzY3JpYmU+ZGV2LXN1YnNjcmliZUBjaGVtaXN0cnkuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgICAgICAgPHVuc3Vic2NyaWJlPmRldi11bnN1YnNjcmliZUBjaGVtaXN0cnkuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8cG9zdD5kZXZAY2hlbWlzdHJ5LmFwYWNoZS5vcmc8L3Bvc3Q+Ci0gICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICBodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2NoZW1pc3RyeS1kZXYvCi0gICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgICAgICAgIDxuYW1lPkNoZW1pc3RyeSBTb3VyY2UgQ29udHJvbCBMaXN0PC9uYW1lPgotICAgICAgICAgICAgPHN1YnNjcmliZT5jb21taXRzLXN1YnNjcmliZUBjaGVtaXN0cnkuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgICAgICAgPHVuc3Vic2NyaWJlPmNvbW1pdHMtdW5zdWJzY3JpYmVAY2hlbWlzdHJ5LmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgICAgICAgPHBvc3Q+Y29tbWl0c0BjaGVtaXN0cnkuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvY2hlbWlzdHJ5LWNvbW1pdHMvCi0gICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgPC9tYWlsaW5nTGlzdHM+Ci0KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkZsb3JpYW4gTcO8bGxlcjwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5mbXVpPC9pZD4KLSAgICAgICAgICAgIDxyb2xlcz4KLSAgICAgICAgICAgICAgICA8cm9sZT5jb21taXR0ZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkplbnMgSMO8YmVsPC9uYW1lPgotICAgICAgICAgICAgPGlkPmplbnNodWViZWw8L2lkPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+RGF2aWQgV2FyZDwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5kd2FyZDwvaWQ+Ci0gICAgICAgICAgICA8cm9sZXM+Ci0gICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgotICAgICAgICAgICAgPC9yb2xlcz4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5NYXJ0aW4gSGVybWVzPC9uYW1lPgotICAgICAgICAgICAgPGlkPmhlcm1lc208L2lkPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+UGF1bCBHb2V0ejwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5wYXVsZ29ldHo8L2lkPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+RGF2aWQgQ2FydWFuYTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5kY2FydWFuYTwvaWQ+Ci0gICAgICAgICAgICA8cm9sZXM+Ci0gICAgICAgICAgICAgICAgPHJvbGU+Y29tbWl0dGVyPC9yb2xlPgotICAgICAgICAgICAgPC9yb2xlcz4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5HYWJyaWVsZSBDb2x1bWJybzwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5nYWJyaWVsZTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+Z2FicmllbGVAYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8cm9sZXM+Ci0gICAgICAgICAgICAgICAgPHJvbGU+cmVsZWFzZSBtYW5hZ2VyPC9yb2xlPgotICAgICAgICAgICAgPC9yb2xlcz4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5GbG9yZW50IEd1aWxsYXVtZTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5mZ3VpbGxhdW1lPC9pZD4KLSAgICAgICAgICAgIDxyb2xlcz4KLSAgICAgICAgICAgICAgICA8cm9sZT5jb21taXR0ZXI8L3JvbGU+Ci0gICAgICAgICAgICA8L3JvbGVzPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPlN0ZWZhbmUgRmVybWlnaWVyPC9uYW1lPgotICAgICAgICAgICAgPGlkPnNmZXJtaWdpZXI8L2lkPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+SmVhbiBNYXJpZSBQYXNjYWw8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+am1wYXNjYWw8L2lkPgotICAgICAgICAgICAgPHJvbGVzPgotICAgICAgICAgICAgICAgIDxyb2xlPmNvbW1pdHRlcjwvcm9sZT4KLSAgICAgICAgICAgIDwvcm9sZXM+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgIDwvZGV2ZWxvcGVycz4KLQotCi0gICAgPCEtLSBQcm9qZWN0IEVudmlyb25tZW50IC0tPgotICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWFwaTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zL2NoZW1pc3RyeS1vcGVuY21pcy1jb21tb25zLWltcGw8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYXBpPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y2hlbWlzdHJ5LW9wZW5jbWlzLWNsaWVudC9jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50LWltcGw8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtY2xpZW50L2NoZW1pc3RyeS1vcGVuY21pcy1jbGllbnQtYmluZGluZ3M8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItc3VwcG9ydDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5nczwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1iaW5kaW5ncy13YXI8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItaW5tZW1vcnk8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZmlsZXNoYXJlPC9tb2R1bGU+Ci0gICAgICAgIDwhLS0gPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItamNyPC9tb2R1bGU+IC0tPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXIvY2hlbWlzdHJ5LW9wZW5jbWlzLXNlcnZlci1hcmNoZXR5cGU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtc2VydmVyL2NoZW1pc3RyeS1vcGVuY21pcy1zZXJ2ZXItZXh0ZW5zaW9uLWFyY2hldHlwZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1icmlkZ2UvY2hlbWlzdHJ5LW9wZW5jbWlzLWJyaWRnZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWZpdDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRjazwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LXRvb2xzPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Y2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QvY2hlbWlzdHJ5LW9wZW5jbWlzLXRlc3QtdXRpbDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy10ZXN0L2NoZW1pc3RyeS1vcGVuY21pcy10ZXN0LWJyb3dzZXI8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC9jaGVtaXN0cnktb3BlbmNtaXMtdGVzdC1icm93c2VyLWFwcDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy13b3JrYmVuY2gvY2hlbWlzdHJ5LW9wZW5jbWlzLXdvcmtiZW5jaDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1vc2dpL2NoZW1pc3RyeS1vcGVuY21pcy1vc2dpLWNsaWVudDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkL2NoZW1pc3RyeS1vcGVuY21pcy1hbmRyb2lkLWNsaWVudDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmNoZW1pc3RyeS1vcGVuY21pcy1kaXN0PC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgotICAgICAgICA8bWF2ZW4uY29tcGlsZS5zb3VyY2U+MS42PC9tYXZlbi5jb21waWxlLnNvdXJjZT4KLSAgICAgICAgPG1hdmVuLmNvbXBpbGUudGFyZ2V0PjEuNjwvbWF2ZW4uY29tcGlsZS50YXJnZXQ+Ci0gICAgICAgIDxkb2NzLnN0YXJ0LnVybD5odHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmcvamF2YS9vcGVuY21pcy5odG1sPC9kb2NzLnN0YXJ0LnVybD4KLSAgICAgICAgPGRvY3MuZG93bmxvYWQuZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2Rvd25sb2FkZWQtc2l0ZTwvZG9jcy5kb3dubG9hZC5kaXJlY3Rvcnk+Ci0gICAgICAgIDwhLS0gIAotICAgICAgICAgICAgfCBIZXJlIHdlIGNvbmZpZ3VyZSBNYXZlbiBkb2N1bWVudGF0aW9uIHNpdGUgKGluY2wuIEphdmFkb2NzKSBkZXBsb3ltZW50IAotICAgICAgICAgICAgfAotICAgICAgICAgICAgfCBCeSBkZWZhdWx0IHNpdGUgaXMgZGVwbG95ZWQgdG86Ci0gICAgICAgICAgICB8IGh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2NoZW1pc3RyeS9zaXRlL3RydW5rL2NvbnRlbnQvamF2YS8ke3NpdGUubGFiZWx9L21hdmVuLyAKLSAgICAgICAgICAgIHwgd2hlcmUgc2l0ZS5sYWJlbCA9IHByb2plY3QudmVyc2lvbiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgfCBGb3IgZGV0YWlscy9jaGFuZ2VzIHNlZSBodHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmcvamF2YS9kb2N1bWVudGF0aW9uLWxpZmVjeWNsZS5odG1sCi0gICAgICAgICAgICB8Ci0gICAgICAgICAgICB8IE5vdGU6IFNpdGUgbGFiZWwgKG9yIGFueSBvdGhlciBwcm9wZXJ0eSBsaWtlIHNpdGUuc3RhZ2luZy51cmwpIGNhbiBiZSBvdmVycmlkZW4gb24gdGhlIGNvbW1hbmQgbGluZSB0byBkZXBsb3kgdG8gZGlzdGluY3QgbG9jYXRpb24gZHVyaW5nIHNpdGUgZGV2ZWxvcG1lbnQKLSAgICAgICAgICAgIC0tPgotICAgICAgICA8c2l0ZS5sYWJlbD4ke3Byb2plY3QudmVyc2lvbn08L3NpdGUubGFiZWw+Ci0gICAgICAgIDxzaXRlLnN0YWdpbmcuaWQ+YXBhY2hlLXNpdGUtc3RhZ2luZzwvc2l0ZS5zdGFnaW5nLmlkPgotICAgICAgICA8IS0tIFdlJ3JlIHVzaW5nIHdhZ29uLXN2biB0byBkZXBsb3kgZGlyZWN0bHkgdG8gc3ZuLmFwYWNoZS5vcmcgdG8gZmVlZCBDTVMgd2l0aCBnZW5lcmF0ZWQgZG9jcyAtLT4KLSAgICAgICAgPHNpdGUuc3RhZ2luZy5wcm90b2NvbD5zdm46aHR0cHM8L3NpdGUuc3RhZ2luZy5wcm90b2NvbD4KLSAgICAgICAgPHNpdGUuc3RhZ2luZy5ob3N0PnN2bi5hcGFjaGUub3JnPC9zaXRlLnN0YWdpbmcuaG9zdD4KLSAgICAgICAgPHNpdGUuc3RhZ2luZy5mb2xkZXI+L3JlcG9zL2FzZi9jaGVtaXN0cnkvc2l0ZS90cnVuay9jb250ZW50L2phdmEvJHtzaXRlLmxhYmVsfS9tYXZlbjwvc2l0ZS5zdGFnaW5nLmZvbGRlcj4KLSAgICAgICAgPHNpdGUuc3RhZ2luZy51cmw+JHtzaXRlLnN0YWdpbmcucHJvdG9jb2x9Oi8vJHtzaXRlLnN0YWdpbmcuaG9zdH0ke3NpdGUuc3RhZ2luZy5mb2xkZXJ9PC9zaXRlLnN0YWdpbmcudXJsPgotICAgICAgICA8cGFyZW50QmFzZWRpcj4ke3Byb2plY3QuYmFzZWRpcn08L3BhcmVudEJhc2VkaXI+Ci0KLSAgICAgICAgPHdvb2RzdG94LnZlcnNpb24+NC40LjA8L3dvb2RzdG94LnZlcnNpb24+Ci0gICAgICAgIDxvc2dpLnZlcnNpb24+NS4wLjA8L29zZ2kudmVyc2lvbj4KLSAgICAgICAgPGZlbGl4LnBsdWdpbi52ZXJzaW9uPjIuMy43PC9mZWxpeC5wbHVnaW4udmVyc2lvbj4KLSAgICAgICAgPGp1bml0LnZlcnNpb24+NC4xMTwvanVuaXQudmVyc2lvbj4KLSAgICAgICAgPHNsZjRqLnZlcnNpb24+MS43LjU8L3NsZjRqLnZlcnNpb24+Ci0gICAgICAgIDxsb2c0ai52ZXJzaW9uPjEuMi4xNzwvbG9nNGoudmVyc2lvbj4KLSAgICAgICAgPGFwYWNoZWNsaWVudC52ZXJzaW9uPjQuMi42PC9hcGFjaGVjbGllbnQudmVyc2lvbj4KLSAgICAgICAgPGpheHdzLXJ0LnZlcnNpb24+Mi4xLjc8L2pheHdzLXJ0LnZlcnNpb24+Ci0gICAgICAgIDxjeGYudmVyc2lvbj4yLjcuMTE8L2N4Zi52ZXJzaW9uPgotICAgICAgICA8YXhpczIudmVyc2lvbj4xLjYuMjwvYXhpczIudmVyc2lvbj4KLSAgICAgICAgPG1pbWVwdWxsLnZlcnNpb24+MS45LjQ8L21pbWVwdWxsLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50bHIzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3VuaXQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEaXNhYmxlSUJNSkFYV1NFbmdpbmU+dHJ1ZTwvRGlzYWJsZUlCTUpBWFdTRW5naW5lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFyY2hldHlwZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkbnVtYmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dmFsaWRhdGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNyZWF0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGRvQ2hlY2s+ZmFsc2U8L2RvQ2hlY2s+Ci0gICAgICAgICAgICAgICAgICAgIDxkb1VwZGF0ZT5mYWxzZTwvZG9VcGRhdGU+Ci0gICAgICAgICAgICAgICAgICAgIDxnZXRSZXZpc2lvbk9ubHlPbmNlPnRydWU8L2dldFJldmlzaW9uT25seU9uY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXZpc2lvbk9uU2NtRmFpbHVyZT4/PC9yZXZpc2lvbk9uU2NtRmFpbHVyZT4KLSAgICAgICAgICAgICAgICAgICAgPHRpbWVzdGFtcEZvcm1hdD57MCxkYXRlLHl5eXktTU0tZGQnVCdISDptbTpzc1p9PC90aW1lc3RhbXBGb3JtYXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8IS0tIFdvcmtpbmcsIGJ1dCBub3QgYXR0YWNoZWQgdG8gdGhlIGRlcGxveW1lbnQuIAotICAgICAgICAgICAgQmxvY2tlZCBvbiBodHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL01JTlNUQUxMLTgyCi0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm5ldC5qdS1uLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hlY2tzdW0tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hcnRpZmFjdHM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhbGdvcml0aG1zPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFsZ29yaXRobT5TSEEtMjU2PC9hbGdvcml0aG0+Ci0gICAgICAgICAgICAgICAgICAgIDwvYWxnb3JpdGhtcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlQ2xhc3Nlcz50cnVlPC9hcmNoaXZlQ2xhc3Nlcz4KLSAgICAgICAgICAgICAgICAgICAgPGF0dGFjaENsYXNzZXM+dHJ1ZTwvYXR0YWNoQ2xhc3Nlcz4KLSAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxYLUNvbXBpbGUtU291cmNlLUpESz4ke21hdmVuLmNvbXBpbGUuc291cmNlfTwvWC1Db21waWxlLVNvdXJjZS1KREs+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFgtQ29tcGlsZS1UYXJnZXQtSkRLPiR7bWF2ZW4uY29tcGlsZS50YXJnZXR9PC9YLUNvbXBpbGUtVGFyZ2V0LUpESz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WC1BcGFjaGUtU1ZOLVJldmlzaW9uPiR7YnVpbGROdW1iZXJ9PC9YLUFwYWNoZS1TVk4tUmV2aXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVRpdGxlPiR7cHJvamVjdC5uYW1lfTwvSW1wbGVtZW50YXRpb24tVGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9JbXBsZW1lbnRhdGlvbi1WZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9JbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlbmRvcj4ke3Byb2plY3Qub3JnYW5pemF0aW9uLm5hbWV9PC9JbXBsZW1lbnRhdGlvbi1WZW5kb3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8dXNlUmVsZWFzZVByb2ZpbGU+ZmFsc2U8L3VzZVJlbGVhc2VQcm9maWxlPgotICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE86IEFkZCBhdXRvZ2VuZXJhdGVkIEpJUkEgcmVsZWFzZSBub3RlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHByZXBhcmF0aW9uR29hbHM+Y2xlYW4gaW5zdGFsbDwvcHJlcGFyYXRpb25Hb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPGdvYWxzPmRlcGxveSBzaXRlPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50cz4tUGFwYWNoZS1yZWxlYXNlPC9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIHRoaXMgcHJvZmlsZSB0byBhbHNvIGRlcGxveSB0aGUgc2l0ZSB1cG9uIHJlbGVhc2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gPGFyZ3VtZW50cz4tUGFwYWNoZS1yZWxlYXNlLHNpdGUtZGVwbG95PC9hcmd1bWVudHM+IC0tPgotICAgICAgICAgICAgICAgICAgICA8YXV0b1ZlcnNpb25TdWJtb2R1bGVzPnRydWU8L2F1dG9WZXJzaW9uU3VibW9kdWxlcz4KLSAgICAgICAgICAgICAgICAgICAgPHVzZXJuYW1lPiR7YXBhY2hlLnVzZXJuYW1lfTwvdXNlcm5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXNzd29yZD4ke2FwYWNoZS5wYXNzd29yZH08L3Bhc3N3b3JkPgotICAgICAgICAgICAgICAgICAgICA8IS0tIFRvIGxvY2sgZmlsZXMgZHVyaW5nIHJlbGVhc2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx1c2VFZGl0TW9kZT50cnVlPC91c2VFZGl0TW9kZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7bWF2ZW4uY29tcGlsZS50YXJnZXR9PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHttYXZlbi5jb21waWxlLnNvdXJjZX08L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KLSAgICAgICAgICAgICAgICAgICAgPGZvcmNlSmF2YWNDb21waWxlclVzZT50cnVlPC9mb3JjZUphdmFjQ29tcGlsZXJVc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50Pi1YRGlnbm9yZS5zeW1ib2wuZmlsZTwvY29tcGlsZXJBcmd1bWVudD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyLW5vLWZvcms8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlUG9tPnRydWU8L2luY2x1ZGVQb20+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcHBlbmRlZFJlc291cmNlc0RpcmVjdG9yeT4ke3BhcmVudEJhc2VkaXJ9L3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlczwvYXBwZW5kZWRSZXNvdXJjZXNEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVjbGlwc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGRvd25sb2FkU291cmNlcz50cnVlPC9kb3dubG9hZFNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkb3dubG9hZEphdmFkb2NzPnRydWU8L2Rvd25sb2FkSmF2YWRvY3M+Ci0gICAgICAgICAgICAgICAgICAgIDx3b3Jrc3BhY2U+Ljwvd29ya3NwYWNlPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc29uYXR5cGUucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi12ZXJzaW9uLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5zcmMvbWFpbi9yZXNvdXJjZXMvY2hlY2tzdHlsZS54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c3VwcHJlc3Npb25zTG9jYXRpb24+c3JjL21haW4vcmVzb3VyY2VzL3N1cHByZXNzaW9ucy54bWw8L3N1cHByZXNzaW9uc0xvY2F0aW9uPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTQuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+My4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFgtQ29tcGlsZS1Tb3VyY2UtSkRLPiR7bWF2ZW4uY29tcGlsZS5zb3VyY2V9PC9YLUNvbXBpbGUtU291cmNlLUpESz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WC1Db21waWxlLVRhcmdldC1KREs+JHttYXZlbi5jb21waWxlLnRhcmdldH08L1gtQ29tcGlsZS1UYXJnZXQtSkRLPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxYLUFwYWNoZS1TVk4tUmV2aXNpb24+JHtidWlsZE51bWJlcn08L1gtQXBhY2hlLVNWTi1SZXZpc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVGl0bGU+JHtwcm9qZWN0Lm5hbWV9PC9JbXBsZW1lbnRhdGlvbi1UaXRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L0ltcGxlbWVudGF0aW9uLVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlbmRvci1JZD4ke3Byb2plY3QuZ3JvdXBJZH08L0ltcGxlbWVudGF0aW9uLVZlbmRvci1JZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVuZG9yPiR7cHJvamVjdC5vcmdhbml6YXRpb24ubmFtZX08L0ltcGxlbWVudGF0aW9uLVZlbmRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUubWF2ZW4tc3ZuLXdhZ29uPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3ZuLXdhZ29uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXBsb3lBdEVuZD5mYWxzZTwvZGVwbG95QXRFbmQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPGV4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLm1hdmVuLXN2bi13YWdvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3ZuLXdhZ29uPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvZXh0ZW5zaW9ucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amJvc3MucHVibGljPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkpCb3NzIHJlcG9zaXRvcnkgKGZvciBKQVgtV1MgMi4xLjcpPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcmVwb3NpdG9yeS5qYm9zcy5vcmcvbmV4dXMvY29udGVudC9ncm91cHMvcHVibGljLzwvdXJsPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMi1yZXBvc2l0b3J5LmRldi5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5KYXZhLm5ldCBSZXBvc2l0b3J5IGZvciBNYXZlbiAyPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMi88L3VybD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgPHBsdWdpblJlcG9zaXRvcmllcz4KLSAgICAgICAgPHBsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzIvPC91cmw+Ci0gICAgICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgPHBsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amJvc3MtcHVibGljPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkpib3NzIFJlcG9zaXRvcnkgZm9yIE1hdmVuIDI8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5Lmpib3NzLm9yZy9uZXh1cy9jb250ZW50L2dyb3Vwcy9wdWJsaWMvPC91cmw+Ci0gICAgICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KLSAgICA8L3BsdWdpblJlcG9zaXRvcmllcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtzbGY0ai52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2p1bml0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xNC4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8YWdncmVnYXRlPnRydWU8L2FnZ3JlZ2F0ZT4KLSAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHNEaXJlY3Rvcmllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRzRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3N1cmVmaXJlLXJlcG9ydHMvPC9yZXBvcnRzRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHNEaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZmFpbHNhZmUtcmVwb3J0cy88L3JlcG9ydHNEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVwb3J0c0RpcmVjdG9yaWVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjc8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICA8cmVwb3J0U2V0cz4KLSAgICAgICAgICAgICAgICA8cmVwb3J0U2V0PgotICAgICAgICAgICAgICAgICAgPGlkPmFnZ3JlZ2F0ZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICA8cmVwb3J0cz4KLSAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5hZ2dyZWdhdGU8L3JlcG9ydD4KLSAgICAgICAgICAgICAgICAgIDwvcmVwb3J0cz4KLSAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KLSAgICAgICAgICAgICAgPC9yZXBvcnRTZXRzPgotICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxkb2N0aXRsZT5BcGFjaGUgQ2hlbWlzdHJ5IE9wZW5DTUlTICR7cHJvamVjdC52ZXJzaW9ufTwvZG9jdGl0bGU+Ci0gICAgICAgICAgICAgICAgICA8d2luZG93dGl0bGU+QXBhY2hlIENoZW1pc3RyeSBPcGVuQ01JUyAke3Byb2plY3QudmVyc2lvbn08L3dpbmRvd3RpdGxlPgotICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBVcGRhdGUgdGhpcyBmb3IgbmV3IHBhY2thZ2VzIC0tPgotICAgICAgICAgICAgICAgICAgPGdyb3Vwcz4KLSAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5PcGVuQ01JUyBDbGllbnQgQVBJPC90aXRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudDpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYXBpOm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNsaWVudC51dGlsPC9wYWNrYWdlcz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgICAgICAgICAgIDxncm91cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9wZW5DTUlTIENvbW1vbnMgQVBJPC90aXRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnM6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY29tbW9ucy4qPC9wYWNrYWdlcz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgICAgICAgICAgIDxncm91cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9wZW5DTUlTIEJpbmRpbmdzIFNQSTwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3M8L3BhY2thZ2VzPgotICAgICAgICAgICAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdyb3VwPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+T3BlbkNNSVMgU2VydmVyPC90aXRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuc2VydmVyOm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbC5zZXJ2ZXI6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQ6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLnN1cHBvcnQucXVlcnk6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuc2VydmVyLmZpbHRlcjpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuc2hhcmVkPC9wYWNrYWdlcz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgICAgICAgICAgIDxncm91cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9wZW5DTUlTIEJyaWRnZTwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icmlkZ2UqPC9wYWNrYWdlcz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgICAgICAgICAgIDxncm91cD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9wZW5DTUlTIFRDSzwvdGl0bGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlcz5vcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy50Y2sqPC9wYWNrYWdlcz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgICAgICAgICA8L2dyb3Vwcz4KLSAgICAgICAgICAgICAgICAgICAgPCEtLTxleGNsdWRlUGFja2FnZU5hbWVzPm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmNvbW1vbnMuaW1wbDpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuZGF0YW9iamVjdHM6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWU6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LnJ1bnRpbWUuKjpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tb25zLmltcGwuamF4YjpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuaW1wbDpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jbGllbnQuYmluZGluZ3MuY2FjaGU6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50LmJpbmRpbmdzLnNwaTpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5zZXJ2ZXIuaW1wbDpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maXQ6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMudXRpbC5yZXBvc2l0b3J5Om9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmZpbGVzaGFyZTpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5maWxlc2hhcmU6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuaW5tZW1vcnk6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuZmlsZXNoYXJlOm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLmpjcjpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5icm93c2VyOm9yZy5hcGFjaGUuY2hlbWlzdHJ5Lm9wZW5jbWlzLndvcmtiZW5jaDpvcmcuYXBhY2hlLmNoZW1pc3RyeS5vcGVuY21pcy5jb21tYW5kZXI6b3JnLmFwYWNoZS5jaGVtaXN0cnkub3BlbmNtaXMuY2xpZW50Lm9zZ2k8L2V4Y2x1ZGVQYWNrYWdlTmFtZXM+LS0+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2VGaWxlRXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQ21pc1FsKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9DbWlzUXVlcnlXYWxrKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXh0U2VhcmNoKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tb25zL2ltcGwvZGF0YW9iamVjdHMvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pzb24vKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3R1YmUvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL2pheGIvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3NlcnZlci9PYmplY3RJbmZvSW1wbCo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy9pbXBsL3NlcnZlci9SZW5kaXRpb25JbmZvSW1wbCo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L3J1bnRpbWUvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2ltcGwvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2JpbmRpbmdzL2NhY2hlLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC9iaW5kaW5ncy9zcGkvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL2ltcGwvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3NoYXJlZC8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9zZXJ2ZXIvc3VwcG9ydC9maWx0ZXIvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZml0LyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3V0aWwvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvZmlsZXNoYXJlLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2lubWVtb3J5LyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2pjci8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9icm93c2VyLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL3dvcmtiZW5jaC8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL2NoZW1pc3RyeS9vcGVuY21pcy9jb21tYW5kZXIvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L29zZ2kvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvdG9vbHMvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvc291cmNlRmlsZUV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8dGFncz4KLSAgICAgICAgICAgICAgICAgICAgICA8dGFnPgotICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+Y21pczwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwbGFjZW1lbnQ+YTwvcGxhY2VtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+Q01JUzo8L2hlYWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90YWc+Ci0gICAgICAgICAgICAgICAgICAgIDwvdGFncz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8IS0tCi0gICAgICAgICAgICBFeHRlbmRpbmcgdGhlIGRlZmF1bHQgLVBhcGFjaGUtcmVsZWFzZSBwcm9maWxlIHVzZWQgKm9ubHkqCi0gICAgICAgICAgICBkdXJpbmcgcmVsZWFzZXMKLSAgICAgICAgLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmFwYWNoZS1yZWxlYXNlPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBHZW5lcmF0ZXMgYWdncmVnYXRlZCBqYXZhZG9jcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtZG9jczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFnZ3JlZ2F0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgICAgICAgICBXZSB3YW50IHRvIHBhY2thZ2UgdXAgbGljZW5zZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBpbiB0aGUgSkFScyBwcm9kdWNlZAotICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZGVkUmVzb3VyY2VzRGlyZWN0b3J5PiR7cGFyZW50QmFzZWRpcn0vc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzPC9hcHBlbmRlZFJlc291cmNlc0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdlYlJlc291cmNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGlzIGlzIHJlbGF0aXZlIHRvIHRoZSBwb20ueG1sIGRpcmVjdG9yeSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TUVUQS1JTkYvKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93ZWJSZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+c2l0ZS1kZXBsb3k8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2l0ZS1kZXBsb3ktdG9wbGV2ZWw8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5kZXBsb3k8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5zaXRlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UgYi90cnVuay9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlNzIzNy4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCi1FWFRFUk5BTCBERVBFTkRFTkNJRVMKLQotVGhpcyBzb2Z0d2FyZSBkZXBlbmRzIG9uIGxpYnJhcmllcyB3aXRoIHNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZAotbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlc2UgZGVwZW5kZW5jaWVzIGlzIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2VzCi1yZWZlcnJlZCB0byBpbiB0aGUgc2VwYXJhdGUgREVQRU5ERU5DSUVTIGZpbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRSBiL3RydW5rL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTcyMzcuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCi1FWFRFUk5BTCBERVBFTkRFTkNJRVMKLQotVGhpcyBzb2Z0d2FyZSBkZXBlbmRzIG9uIGxpYnJhcmllcyB3aXRoIHNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZAotbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlc2UgZGVwZW5kZW5jaWVzIGlzIHN1YmplY3QgdG8gdGhlIGxpY2Vuc2VzCi1yZWZlcnJlZCB0byBpbiB0aGUgc2VwYXJhdGUgREVQRU5ERU5DSUVTIGZpbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sIGIvdHJ1bmsvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM1ZTMwLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9tYWluL2FwcGVuZGVkLXJlc291cmNlcy9zdXBwbGVtZW50YWwtbW9kZWxzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHN1cHBsZW1lbnRhbERhdGFNb2RlbHM+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLndzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4d3MtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPG5hbWU+SkFYLVdTIChKU1ItMjI0KSBBUEk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHBzOi8vamF4LXdzLmRldi5qYXZhLm5ldC88L3VybD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgICAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtcywgSW5jPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8bGljZW5zZXM+Ci0gICAgICAgICAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPkR1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MjwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWw8L3VybD4KLSAgICAgICAgICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICAgICAgICA8L2xpY2Vuc2VzPgotICAgICAgICA8L3Byb2plY3Q+Ci0gICAgPC9zdXBwbGVtZW50PgotICAgIDxzdXBwbGVtZW50PgotICAgICAgICA8cHJvamVjdD4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjEuMTE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8bmFtZT5TdW4gSkFYQiBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gUnVudGltZTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9qYXhiLmRldi5qYXZhLm5ldC88L3VybD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgICAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtcywgSW5jPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8bGljZW5zZXM+Ci0gICAgICAgICAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPkR1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MjwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWw8L3VybD4KLSAgICAgICAgICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICAgICAgICA8L2xpY2Vuc2VzPgotICAgICAgICA8L3Byb2plY3Q+Ci0gICAgPC9zdXBwbGVtZW50PgotICAgIDxzdXBwbGVtZW50PgotICAgICAgICA8cHJvamVjdD4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLm1lc3NhZ2luZy5zYWFqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2Fhai1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4zLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8bmFtZT5TdW4gU0FBSiBTdGFuZGFyZCBJbXBsZW1lbnRhdGlvbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9zYWFqLmRldi5qYXZhLm5ldC88L3VybD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgICAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtcywgSW5jPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8bGljZW5zZXM+Ci0gICAgICAgICAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPkR1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MjwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWw8L3VybD4KLSAgICAgICAgICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICAgICAgICA8L2xpY2Vuc2VzPgotICAgICAgICA8L3Byb2plY3Q+Ci0gICAgPC9zdXBwbGVtZW50PgotICAgIDxzdXBwbGVtZW50PgotICAgICAgICA8cHJvamVjdD4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5zb2FwPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2Fhai1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8bmFtZT5TQUFKIEFQSTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9zYWFqLmRldi5qYXZhLm5ldC88L3VybD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgICAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtcywgSW5jPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8bGljZW5zZXM+Ci0gICAgICAgICAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPkR1YWwgbGljZW5zZSBjb25zaXN0aW5nIG9mIHRoZSBDRERMIHYxLjAgYW5kIEdQTCB2MjwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREwrR1BMLmh0bWw8L3VybD4KLSAgICAgICAgICAgICAgICA8L2xpY2Vuc2U+Ci0gICAgICAgICAgICA8L2xpY2Vuc2VzPgotICAgICAgICA8L3Byb2plY3Q+Ci0gICAgPC9zdXBwbGVtZW50PgotICAgIDxzdXBwbGVtZW50PgotICAgICAgICA8cHJvamVjdD4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLnN0cmVhbS5idWZmZXI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdHJlYW1idWZmZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4wLjk8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8bmFtZT5YTUwgU3RyZWFtIEJ1ZmZlciBQcm9qZWN0PC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwczovL3htbHN0cmVhbWJ1ZmZlci5kZXYuamF2YS5uZXQvPC91cmw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICAgICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXMsIEluYzwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KLSAgICAgICAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPGxpY2Vuc2VzPgotICAgICAgICAgICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5EdWFsIGxpY2Vuc2UgY29uc2lzdGluZyBvZiB0aGUgQ0RETCB2MS4wIGFuZCBHUEwgdjI8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sPC91cmw+Ci0gICAgICAgICAgICAgICAgPC9saWNlbnNlPgotICAgICAgICAgICAgPC9saWNlbnNlcz4KLSAgICAgICAgPC9wcm9qZWN0PgotICAgIDwvc3VwcGxlbWVudD4KLSAgICA8c3VwcGxlbWVudD4KLSAgICAgICAgPHByb2plY3Q+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPG5hbWU+SmF2YSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwczovL2pheGIuZGV2LmphdmEubmV0LzwvdXJsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zLCBJbmM8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+Ci0gICAgICAgICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+Q29tbW9uIERldmVsb3BtZW50IEFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjA8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+Ci0gICAgICAgICAgICAgICAgPC9saWNlbnNlPgotICAgICAgICAgICAgPC9saWNlbnNlcz4KLSAgICAgICAgPC9wcm9qZWN0PgotICAgIDwvc3VwcGxlbWVudD4KLSAgICA8c3VwcGxlbWVudD4KLSAgICAgICAgPHByb2plY3Q+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hY3RpdmF0aW9uPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxuYW1lPkphdmFCZWFucyhUTSkgQWN0aXZhdGlvbiBGcmFtZXdvcmsgU3BlY2lmaWNhdGlvbjwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamFmMTEtMTM5ODE1Lmh0bWw8L3VybD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgICAgICAgICAgPG5hbWU+U3VuIE1pY3Jvc3lzdGVtcywgSW5jPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tLzwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8bGljZW5zZXM+Ci0gICAgICAgICAgICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPkNvbW1vbiBEZXZlbG9wbWVudCBBbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbDwvdXJsPgotICAgICAgICAgICAgICAgIDwvbGljZW5zZT4KLSAgICAgICAgICAgIDwvbGljZW5zZXM+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjI1MC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8bmFtZT5KU1ItMjUwIENvbW1vbiBBbm5vdGF0aW9ucyBmb3IgdGhlIEphdmEoVE0pIFBsYXRmb3JtPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vamNwLm9yZy9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9maW5hbC9qc3IyNTAvaW5kZXguaHRtbDwvdXJsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zLCBJbmM8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+Ci0gICAgICAgICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+Q29tbW9uIERldmVsb3BtZW50IEFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjA8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sPC91cmw+Ci0gICAgICAgICAgICAgICAgPC9saWNlbnNlPgotICAgICAgICAgICAgPC9saWNlbnNlcz4KLSAgICAgICAgPC9wcm9qZWN0PgotICAgIDwvc3VwcGxlbWVudD4KLSAgICA8c3VwcGxlbWVudD4KLSAgICAgICAgPHByb2plY3Q+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5qd3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxODEtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLU1SMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxuYW1lPldlYiBTZXJ2aWNlcyBNZXRhZGF0YSBmb3IgSmF2YTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2pjcC5vcmcvZW4vanNyL3N1bW1hcnk/aWQ9MTgxPC91cmw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICAgICAgICAgIDxuYW1lPlN1biBNaWNyb3N5c3RlbXMsIEluYzwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuc3VuLmNvbS88L3VybD4KLSAgICAgICAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPGxpY2Vuc2VzPgotICAgICAgICAgICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5EdWFsIGxpY2Vuc2UgY29uc2lzdGluZyBvZiB0aGUgQ0RETCB2MS4wIGFuZCBHUEwgdjI8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMK0dQTC5odG1sPC91cmw+Ci0gICAgICAgICAgICAgICAgPC9saWNlbnNlPgotICAgICAgICAgICAgPC9saWNlbnNlcz4KLSAgICAgICAgPC9wcm9qZWN0PgotICAgIDwvc3VwcGxlbWVudD4KLSAgICA8c3VwcGxlbWVudD4KLSAgICAgICAgPHByb2plY3Q+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLm9yZy5hcGFjaGUueG1sLmludGVybmFsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmVzb2x2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yMDA1MDkyNzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxuYW1lPlhNTCBSZXNvbHZlciBsaWJyYXJ5PC9uYW1lPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgICAgICA8bmFtZT5TdW4gTWljcm9zeXN0ZW1zLCBJbmM8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LnN1bi5jb20vPC91cmw+Ci0gICAgICAgICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+QXBhY2hlIDI8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgotICAgICAgICAgICAgICAgIDwvbGljZW5zZT4KLSAgICAgICAgICAgIDwvbGljZW5zZXM+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLnN0cmVhbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPG5hbWU+U3RyZWFtaW5nIEFQSSBmb3IgWE1MPC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vc3RheC5jb2RlaGF1cy5vcmc8L3VybD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgICAgICAgICAgPG5hbWU+QkVBIFN5c3RlbXM8L25hbWU+Ci0gICAgICAgICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDxsaWNlbnNlcz4KLSAgICAgICAgICAgICAgICA8bGljZW5zZT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+RHVhbCBsaWNlbnNlIGNvbnNpc3Rpbmcgb2YgdGhlIENEREwgdjEuMCBhbmQgR1BMIHYyPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETCtHUEwuaHRtbDwvdXJsPgotICAgICAgICAgICAgICAgIDwvbGljZW5zZT4KLSAgICAgICAgICAgIDwvbGljZW5zZXM+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp2bmV0LnN0YXhleDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtZXg8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8bmFtZT5TdEFYLUV4IFByb2plY3Q8L25hbWU+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICAgICAgICAgIDxuYW1lPkphdmEubmV0PC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rldi5qYXZhLm5ldDwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp2bmV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWltZXB1bGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHBzOi8vbWltZXB1bGwuZGV2LmphdmEubmV0PC91cmw+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICAgICAgICAgIDxuYW1lPkNvZGVoYXVzPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL2NvZGVoYXVzLm9yZzwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+YW50bHI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNy43PC92ZXJzaW9uPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgICAgICA8bmFtZT5BTlRMUjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYW50bHIub3JnLzwvdXJsPgotICAgICAgICAgICAgPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50bHItcnVudGltZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Ci0gICAgICAgICAgICAgICAgPG5hbWU+QU5UTFI8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFudGxyLm9yZy88L3VybD4KLSAgICAgICAgICAgIDwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPGxpY2Vuc2VzPgotICAgICAgICAgICAgICAgIDxsaWNlbnNlPgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5CU0QgbGljZW5jZTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwOi8vYW50bHIub3JnL2xpY2Vuc2UuaHRtbDwvdXJsPgotICAgICAgICAgICAgICAgIDwvbGljZW5zZT4KLSAgICAgICAgICAgIDwvbGljZW5zZXM+Ci0gICAgICAgIDwvcHJvamVjdD4KLSAgICA8L3N1cHBsZW1lbnQ+Ci0gICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RyaW5ndGVtcGxhdGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICAgICAgICAgIDxuYW1lPkFOVExSPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hbnRsci5vcmcvPC91cmw+Ci0gICAgICAgICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9wcm9qZWN0PgotICAgIDwvc3VwcGxlbWVudD4KLSAgICAgPHN1cHBsZW1lbnQ+Ci0gICAgICAgIDxwcm9qZWN0PgotICAgICAgICAgICAgPGdyb3VwSWQ+bmV0LnNmLmpvcHQtc2ltcGxlPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+am9wdC1zaW1wbGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPgotICAgICAgICAgICAgICAgIDxuYW1lPlNvdXJjZWZvcmdlPC9uYW1lPgotICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5zb3VyY2Vmb3JnZS5uZXQvPC91cmw+Ci0gICAgICAgICAgICA8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9wcm9qZWN0PgotICAgIDwvc3VwcGxlbWVudD4KLTwvc3VwcGxlbWVudGFsRGF0YU1vZGVscz4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL3Jlc291cmNlcy9jaGVja3N0eWxlLnhtbCBiL3RydW5rL3NyYy9tYWluL3Jlc291cmNlcy9jaGVja3N0eWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMWVmOC4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvbWFpbi9yZXNvdXJjZXMvY2hlY2tzdHlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgbW9kdWxlIFBVQkxJQwotICAgICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4yLy9FTiIKLSAgICAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL2NvbmZpZ3VyYXRpb25fMV8yLmR0ZCI+Ci0gICAgCi08bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFyc2V0IiB2YWx1ZT0iVVRGLTgiLz4KLQotICAgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3Npb25GaWx0ZXIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5zdXBwcmVzc2lvbnMuZmlsZX0iLz4KLSAgICA8L21vZHVsZT4KLQotICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1BhY2thZ2UiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93TGVnYWN5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0id2FybmluZyIvPgotICAgIDwvbW9kdWxlPgotICAgIDwhLS08bW9kdWxlIG5hbWU9Ik5ld2xpbmVBdEVuZE9mRmlsZSIvPi0tPgotICAgIDwhLS08bW9kdWxlIG5hbWU9IlRyYW5zbGF0aW9uIi8+LS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjQwMDAiLz4KLSAgICA8L21vZHVsZT4KLSAgICA8bW9kdWxlIG5hbWU9IkZpbGVUYWJDaGFyYWN0ZXIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWFjaExpbmUiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPCEtLQotICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJccyskIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iTGluZSBoYXMgdHJhaWxpbmcgc3BhY2VzLiIvPgotICAgIDwvbW9kdWxlPgotICAgIC0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWJXaWR0aCIgdmFsdWU9IjQiLz4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NvcGUiIHZhbHVlPSJwdWJsaWMiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd1Vua25vd25UYWdzIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVmFyaWFibGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jU3R5bGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nRGVwcmVjYXRlZCIvPgotICAgICAgICA8IS0tCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iV3JpdGVUYWciPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZyIgdmFsdWU9IkBjbWlzIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnRm9ybWF0IiB2YWx1ZT0iXGRcLlxkIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJpZ25vcmUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdTZXZlcml0eSIgdmFsdWU9ImluZm8iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIC0tPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ29uc3RhbnROYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWVtYmVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdGF0aWNWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSIvPgotCi0gICAgICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJIZWFkZXIiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gVGhlIGZvbGxvdyBwcm9wZXJ0eSB2YWx1ZSBkZW1vbnN0cmF0ZXMgdGhlIGFiaWxpdHkgICAgIC0tPgotICAgICAgICAgICAgPCEtLSB0byBoYXZlIGFjY2VzcyB0byBBTlQgcHJvcGVydGllcy4gSW4gdGhpcyBjYXNlIGl0IHVzZXMgLS0+Ci0gICAgICAgICAgICA8IS0tIHRoZSAke2Jhc2VkaXJ9IHByb3BlcnR5IHRvIGFsbG93IENoZWNrc3R5bGUgdG8gYmUgcnVuICAtLT4KLSAgICAgICAgICAgIDwhLS0gZnJvbSBhbnkgZGlyZWN0b3J5IHdpdGhpbiBhIHByb2plY3QuIFNlZSBwcm9wZXJ0eSAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSBleHBhbnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWcuaHRtbCNwcm9wZXJ0aWVzICAgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gPHByb3BlcnR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSAgICAgbmFtZT0iaGVhZGVyRmlsZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9qYXZhLmhlYWRlciIvPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8L21vZHVsZT4gLS0+Ci0KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4gPCEtLSBkZWZhdWx0cyB0byBzdW4uKiBwYWNrYWdlcyAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVbnVzZWRJbXBvcnRzIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9jZXNzSmF2YWRvYyIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgPC9tb2R1bGU+ICAgIAotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICAgICAgICA8IS0tIHRoZSBFY2xpcHNlIGZvcm1hdHRlciBzb21ldGltZXMgYWRkcyBhIGZldyBtb3JlIGNoYXJhY3RlcnM6IDEyMCAtPiAxMjUgLS0+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTI1Ii8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZExlbmd0aCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMzAwIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck51bWJlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTIiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eUZvckl0ZXJhdG9yUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlGb3JJbml0aWFsaXplclBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQWZ0ZXIiPgotICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iQk5PVCwgREVDLCBET1QsIElOQywgTE5PVCwgVU5BUllfTUlOVVMsIFVOQVJZX1BMVVMiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQmVmb3JlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iT3BlcmF0b3JXcmFwIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyZW5QYWQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlY2FzdFBhcmVuUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFmdGVyIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFyb3VuZCIvPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBdm9pZE5lc3RlZEJsb2NrcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9InRleHQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJlb2wiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9InNhbWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxUaHJvd3MiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0id2FybmluZyIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdHJpbmdMaXRlcmFsRXF1YWxpdHkiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNldmVyaXR5IiB2YWx1ZT0iaW5mbyIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFcXVhbHNIYXNoQ29kZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkNvdmFyaWFudEVxdWFscyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb25zdHJ1Y3RvclBhcmFtZXRlciIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVTZXR0ZXIiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNYWdpY051bWJlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2V2ZXJpdHkiIHZhbHVlPSJpbmZvIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRlZmF1bHRDb21lc0xhc3QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRUaHJvd3MiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+Ci0KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iRGVzaWduRm9yRXh0ZW5zaW9uIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmluYWxDbGFzcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlZpc2liaWxpdHlNb2RpZmllciIvPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLz4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVG9kb0NvbW1lbnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotCi0gICAgPC9tb2R1bGU+Ci0gICAgCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9tYWluL3Jlc291cmNlcy9zdXBwcmVzc2lvbnMueG1sIGIvdHJ1bmsvc3JjL21haW4vcmVzb3VyY2VzL3N1cHByZXNzaW9ucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjN2Y2ZWQuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL21haW4vcmVzb3VyY2VzL3N1cHByZXNzaW9ucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBzdXBwcmVzc2lvbnMgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgU3VwcHJlc3Npb25zIDEuMS8vRU4iCi0gICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9zdXBwcmVzc2lvbnNfMV8xLmR0ZCI+Ci0KLTxzdXBwcmVzc2lvbnM+Ci0gICAgPHN1cHByZXNzIGNoZWNrcz0iSmF2YWRvYy4qIgotICAgICAgICAgICAgICBmaWxlcz0iXig/IS4qKG9yZy9hcGFjaGUvY2hlbWlzdHJ5L29wZW5jbWlzL2NsaWVudC98b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY2xpZW50L2FwaS98b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvY29tbW9ucy98b3JnL2FwYWNoZS9jaGVtaXN0cnkvb3BlbmNtaXMvc2VydmVyL3N1cHBvcnQpLiokKSIvPgotICAgIDxzdXBwcmVzcyBjaGVja3M9IkphdmFkb2MuKiIKLSAgICAgICAgICAgICAgZmlsZXM9Ii4qKC9pbXBsLy4qfEltcGxcLmphdmF8L3NwaS8uKnwvcnVudGltZS8uKikiLz4KLTwvc3VwcHJlc3Npb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi90cnVuay9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NjMTRkLi4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1+fgotfn4KLX5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLX5+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotfn4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLX5+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLX5+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLX5+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLX5+IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLX5+Ci1+fiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotfn4KLX5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLX5+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1+fiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLX5+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotfn4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotfn4gdW5kZXIgdGhlIExpY2Vuc2UuCi1+fgotfn4KLQotICAtLS0tLQotICBDaGVtaXN0cnkgT3BlbkNNSVMKLSAgLS0tLS0KLQotQ2hlbWlzdHJ5IE9wZW5DTUlTCi0gIAotICBPcGVuQ01JUyBpcyBhbiBvcGVuIHNvdXJjZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgIHt7e2h0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9wcm9qZWN0L2NtaXMuaHRtbH1PQVNJUyBDTUlTIHNwZWNpZmljYXRpb259fQotICBmb3IgSmF2YS4KLQotICBVc2VyIGFuZCBkZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiBmb3IgT3BlbkNNSVMgaXMgYXZhaWxhYmxlIGluIHRoZSBtYWluIHt7e2h0dHA6Ly9jaGVtaXN0cnkuYXBhY2hlLm9yZy9qYXZhL29wZW5jbWlzLmh0bWx9Q2hlbWlzdHJ5IHdlYnNpdGV9fQotCi0gIEluIHRoaXMgc2l0ZSB5b3UgY2FuIGZpbmQgaW5zdGVhZCBPcGVuQ01JUyBkZXZlbG9wZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgdmVyc2lvbiAoc2VlIHRvcCByaWdodCBjb3JuZXIpIGxpa2U6Ci0KLSAgKiBJbmZvIGZvciBhbGwgT3BlbkNNSVMgbW9kdWxlcyBhdmFpbGFibGUgaW4gdGhpcyByZWxlYXNlIChzZWUgbWVudSBvbiB0aGUgbGVmdCkKLQotICAqIHt7ey4vYXBpZG9jcy9pbmRleC5odG1sfSBGdWxsIEphdmFEb2NzfX0KLQotICAqIHt7ey4vc3VyZWZpcmUtcmVwb3J0Lmh0bWx9IEFnZ3JlZ2F0ZWQgdW5pdCArIGludGVncmF0aW9uIHRlc3QgcmVwb3J0c319IGZvciB0aGUgZnVsbCBPcGVuQ01JUyBmcmFtZXdvcmsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90cnVuay9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2FwYWNoZS1sb2dvLmdpZiBiL3RydW5rL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYXBhY2hlLWxvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmViOWQ3Li4wMDAwMDAwCi0tLSBhL3RydW5rL3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvYXBhY2hlLWxvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHJ1bmsvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9jaGVtaXN0cnktbG9nby5wbmcgYi90cnVuay9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NoZW1pc3RyeS1sb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3ZWZhZi4uMDAwMDAwMAotLS0gYS90cnVuay9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2NoZW1pc3RyeS1sb2dvLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RydW5rL3NyYy9zaXRlL3NpdGUueG1sIGIvdHJ1bmsvc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmUxZWYuLjAwMDAwMDAKLS0tIGEvdHJ1bmsvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4gCi0tLT4KLTxwcm9qZWN0IG5hbWU9Ik9wZW5DTUlTIj4KLQotICAgIDxwdWJsaXNoRGF0ZSBwb3NpdGlvbj0ibGVmdCIgLz4KLSAgICA8dmVyc2lvbiBwb3NpdGlvbj0icmlnaHQiIC8+Ci0KLSAgICA8YmFubmVyTGVmdD4KLSAgICAgICAgPG5hbWU+JHtwcm9qZWN0Lm5hbWV9PC9uYW1lPgotICAgICAgICA8c3JjPmltYWdlcy9jaGVtaXN0cnktbG9nby5wbmc8L3NyYz4KLSAgICAgICAgPGhyZWY+aHR0cDovL2NoZW1pc3RyeS5hcGFjaGUub3JnL2phdmE8L2hyZWY+Ci0gICAgPC9iYW5uZXJMZWZ0PgotCi0gICAgPGJhbm5lclJpZ2h0PgotICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+Ci0gICAgICAgIDxzcmM+aW1hZ2VzL2FwYWNoZS1sb2dvLmdpZjwvc3JjPgotICAgICAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9ocmVmPgotCTwvYmFubmVyUmlnaHQ+Ci0KLQotICAgIDxwb3dlcmVkQnk+Ci0gICAgICA8bG9nbyBuYW1lPSJNYXZlbiIgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvIgotICAgICAgICAgICAgaW1nPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9pbWFnZXMvbG9nb3MvbWF2ZW4tZmVhdGhlci5wbmciLz4KLSAgICA8L3Bvd2VyZWRCeT4KLQotCi0gICAgPHNraW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2tpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlZmF1bHQtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvc2tpbj4KLQotICAgIDxib2R5PgotICAgICAgICA8bWVudSByZWY9InBhcmVudCIgaW5oZXJpdD0idG9wIiAvPgotICAgICAgICA8IS0tIFN1YiBtb2R1bGVzIGhhdmUgbm8gaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gKGFsbCByZXBvcnRzIGFyZSBhZ2dyZWdhdGVkIGF0IHRvcCBsZXZlbCkgc28gd2UgY29tbWVudCB0aGVtIG91dCBmb3Igbm93IC0tPgotICAgICAgICA8IS0tIDxtZW51IHJlZj0ibW9kdWxlcyIgaW5oZXJpdD0idG9wIiAvPiAtLT4KLSAgICAgICAgPG1lbnUgcmVmPSJyZXBvcnRzIiBpbmhlcml0PSJ0b3AiIC8+Ci0KLSAgICAgICAgPG1lbnUgbmFtZT0iQ2hlbWlzdHJ5IiBpbmhlcml0PSJ0b3AiPgotICAgICAgICAgICAgPGl0ZW0gbmFtZT0iTWFpbiBXZWJzaXRlIiBocmVmPSJodHRwOi8vY2hlbWlzdHJ5LmFwYWNoZS5vcmciIC8+Ci0gICAgICAgIDwvbWVudT4KLSAgICA8L2JvZHk+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=